编译TensorFlow 1.3 SHA256校验错误临时解决方案

09/24/2017

由于通过PIP分发TensorFlow默认没有编译SSE4.1、SSE4.2、AVX三个指令集(以及Intel新的MKL库),今天Kaijia为了发挥芯片组的最佳性能尝试了手动编译TensorFlow。按照谷歌官方的安装文档前面的配置步骤均顺利完成,直到开始利用bazel编译时Kaijia碰到了不应该出现的包括protobufllvm等数个组件下载后SHA256与期望SHA256存在差异的校验问题。

错误举例如下:

ERROR: /opt/tensorflow/tensorflow/tools/pip_package/BUILD:134:1: error loading package ‘tensorflow/python’: Encountered error while reading extension file ‘protobuf.bzl’: no such package ‘@protobuf//’: java.io.IOException: Error downloading [https://github.com/google/protobuf/archive/0b059a3d8a8f8aa40dde7bea55edca4ec5dfea66.tar.gz, http://mirror.bazel.build/github.com/google/protobuf/archive/0b059a3d8a8f8aa40dde7bea55edca4ec5dfea66.tar.gz] to /root/.cache/bazel/_bazel_root/fbc06f9baef46cade6e35d9e4137e37c/external/protobuf/0b059a3d8a8f8aa40dde7bea55edca4ec5dfea66.tar.gz: Checksum was e5fdeee6b28cf6c38d61243adff06628baa434a22b5ebb7432d2a7fbabbdb13d but wanted 6d43b9d223ce09e5d4ce8b0060cb8a7513577a35a64c7e3dad10f0703bf3ad93 and referenced by ‘//tensorflow/tools/pip_package:build_pip_package’

ERROR: /opt/tensorflow/tensorflow/tools/pip_package/BUILD:100:1: no such package ‘@llvm//’: java.io.IOException: Error downloading [http://mirror.bazel.build/github.com/llvm-mirror/llvm/archive/9889fe2290766430b99a2d4fadbc5ba92f8004b6.tar.gz, https://github.com/llvm-mirror/llvm/archive/9889fe2290766430b99a2d4fadbc5ba92f8004b6.tar.gz] to /root/.cache/bazel/_bazel_root/fbc06f9baef46cade6e35d9e4137e37c/external/llvm/9889fe2290766430b99a2d4fadbc5ba92f8004b6.tar.gz: Checksum was a8da6d42ac7419e543a27e405f8b660f7b065e9ba981cc9cdcdcecb81af9cc43 but wanted 00fb4a83a4dd1c046b19730a80e2183acc647715b7a8dcc8e808d49ea5530ca8 and referenced by ‘//tensorflow/tools/pip_package:licenses’

以上错误信息可以概括为:

Error downloading [*.tar.gz, *.tar.gz] to /root/.cache/bazel/_bazel_root/*.tar.gz: Checksum was * but wanted * and referenced by ‘//tensorflow/tools/pip_package:*’

查询问题系统可以发现此问题在最近数天才出现,按照相关的信息连接到Git的问题系统可以发现在最新的libgit2版本v0.26.0更改了生成压缩包的方法,因此出现了校验码的变动。在GitHub更新了libgit2之后,原先在tensorflow/workspace.bzl定义通过GitHub直接下载的protobufllvm等库变出现了因为校验码变化而无法通过验证的问题。

尽管Git官方不推荐通过验证压缩包的SHA确认文件真假,因为并不保证生成压缩包的方式不会发生变化,但这个锅要甩给谁是还是很难说的,例如Git可以小心做修改、GitHub可以等待两个礼拜在更新Git组件、不应该直接从GitHub上下载库文件等等。鉴于谷歌从来没有发布过小补丁版本的TensorFlow,此问题很有可能将会等到1.4版本发布才能解决。

目前有的临时解决方案主要为替换新的SHA256、替换库文件下载地址以及直接禁用SHA256校验,Kaijia采用前两者方案修改了tensorflow/workspace.bzl内的定义后成功继续编译:

Thomas Johansen提到了第三种完全禁用SHA256校验的方法,但禁用验证存在一定风险,Kaijia建议先尝试前两种方案。