前段时间学习 DQN ,用 CPU 做 CNN 的 training 慢得像蜗牛。刚好家里 iMac 是 2012 款的带 N 卡 GT640M , compute capabilities 是 3.0 , google 官方提供的 whl 必须是>=3.5 ,所以只能自己重新编译 TensorFlow 。中途踩了非常多的坑,最后一个大 boss 是一个 tensorflow 的 open issue ,我的内心是崩溃的。死马当成活马医的心态最后编译成功了,所以整理出来以供大家参考下;)
补充:如果你是 A 卡 Mac 还是想做加速,建议选择 Theano 或者 Caffe ,通过 OpenCL 实现加速。
TensorFlow 据说已经在尝试加入 OpenCL 的支持: https://github.com/tensorflow/tensorflow/issues/22
###1. 准备工作
确定你的 Mac 是 Nvidia 显卡,且 compute capabilities >= 3.0 ,点这里查看 你的显卡型号是否支持
确保你的显存至少 1GB 以上( Mac 即使是 N 卡,内存都少得可怜,我的 GT640M 只有 512M ,所以后面跑 CNN 基本都会 OOM )
编译 TensorFlow 需要安装 Xcode (如果安装 CUDA 7.5.27 ,可以用 Xcode7.3 ,否者只能用 7.2 版本)
假定大家的 Mac 已经安装了 Homebrew (没安装的人点这里安装)
在后续安装过程中有些包下载会非常慢,甚至被墙,所以你最好有 VPN ,如果不想花钱可以用免费的Lantern
###2. 配置编译环境
补上 google 官方的步骤,可供参考点这里传送
如果以下某些包或者工具你以前已经安装过, brew 会有提示,请务必将版本升级到最新版,尤其 bazel ,升级命令 brew upgrade ...
#####开始 $ brew install bazel swig $ sudo easy_install -U six $ sudo easy_install -U numpy $ sudo easy_install wheel $ sudo easy_install python $ brew install coreutils 下面两步是安装 cud toolkit , 1G 的大小,而 nvidia 的下载速度非常坑,国内用户可以到百度网盘下载,cuda_7.5.27_mac.dmg (md5sum: cfdcbbef8941764e764ecd40dd7a49a8) ,直接安装后可以跳过下面这两步
$ brew tap caskroom/cask
$ brew cask install cuda
好了,现在用文本工具打开~/.bash_profile ,添加环境变量
export CUDA_HOME=/usr/local/cuda
export DYLD_LIBRARY_PATH="$DYLD_LIBRARY_PATH:$CUDA_HOME/lib"
export PATH="$CUDA_HOME/bin:$PATH"
然后去 nvidia 官方下载 cudnn 的包(前面安装的事 cuda toolkit ,别搞混),官方下载地址在这里,需要有 nvidia 账号,如果嫌麻烦,你可以在这里下载 cudnn4.0 或者 cudnn5.0
$ sudo mv include/cudnn.h /Developer/NVIDIA/CUDA-7.5/include/
$ sudo mv lib/libcudnn* /Developer/NVIDIA/CUDA-7.5/lib
$ sudo ln -s /Developer/NVIDIA/CUDA-7.5/lib/libcudnn* /usr/local/cuda/lib/
选择 Xcode
$ sudo xcode-select -s /Applications/Xcode.app
拉取最新代码(笔者已测试 r0.9 , r0.10 和最新 master 2016-09-04 )
git clone https://github.com/tensorflow/tensorflow.git
$ cd tensorflow
$ ./configure
(网上有种说法是 TF_UNOFFICIAL_SETTING=1 ./configure ,前面加了一个参数,然而亲测并没什么卵用,在 r0.10 依然编译错误)
按照提示输入你的配置要求:
Please specify the location of python. [Default is /usr/bin/python]: Do you wish to build TensorFlow with Google Cloud Platform support? [y/N] N No Google Cloud Platform support will be enabled for TensorFlow Do you wish to build TensorFlow with GPU support? [y/N] y GPU support will be enabled for TensorFlow Please specify which gcc nvcc should use as the host compiler. [Default is /usr/bin/gcc]: Please specify the Cuda SDK version you want to use, e.g. 7.0. [Leave empty to use system default]: 7.5 Please specify the location where CUDA 7.5 toolkit is installed. Refer to README.md for more details. [Default is /usr/local/cuda]: Please specify the cuDNN version you want to use. [Leave empty to use system default]: 5 Please specify the location where cuDNN 5 library is installed. Refer to README.md for more details. [Default is /usr/local/cuda]: Please specify a list of comma-separated Cuda compute capabilities you want to build with. 3.0 ...... ......
如果是 r0.9 ,会比较快,如果是 r0.10 会非常慢,要下载很多依赖包具体取决于你的翻墙网速。我的办法就是用迅雷单独下载好,然后通过修改本地 hosts 文件指向到从本地下载包,嫌麻烦的同学还是老实等待吧,如果报错了注意看提示,这步基本都是因为网速不给力导致的,多试几次
###3. 编译安装 TF 完成了上面步骤以后,真正的大 boss 才来。 直接开始 build pip 包吧
$ bazel build -c opt --config=cuda //tensorflow/tools/pip_package:build_pip_package
编译大概会花 50 分钟, r0.10 或者 master 代码 100%会在 40 多分钟的时候报错,注意看错误提示,可以在编译命令行后面加上--verbose_failures 来查看详细出错信息
如果在编译过程报错,又不想重新下载依赖,手动修改 configure 文件,在最后几行找到 bazel clean 的代码
,注释掉。只要你没修改配置参数(记得前面 configure 地方输入的 7.5 , 5 , 3.0 吗?),不需要 clean 。
安装
$ bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg
$ sudo pip install /tmp/tensorflow_pkg/tensorflow-0.10.0rc0-py2-none-any.whl
###4. 测试 请随意,也可以到 tensorflow 的 sample 里面跑教程
$ cd tensorflow/models/image/mnist
$ python convolutional.py
###5. 遇到的各种坑(欢迎大家补充,公众号: TensorData )
编译 r0.90 比较顺利,最多就是提示: terminated by signal SIGSEGV ... 后面是数字,我的错误提示是 11 加 lib 软链接解决
sudo ln -sf /usr/local/cuda/lib/libcuda.dylib /usr/local/cuda/lib/libcuda.1.dylib
在编译 r0.10 时候,需要下载的第三方包和工具特别多,如果编译一旦报错重新下载成本非常高,可以手动修改 configure 文件,在最后几行找到 bazel clean 的代码注释掉,再次运行 configure 的时候不会 clean 。
如果在 configure 阶段,通常只有一个 warning ,如果有多个 warning ,需要留意,看看是不是自己的配置参数有问题或者前面步骤一的配置编译环境中的工具没有升级到最新版
编译 r0.10 时候 100%会遇到的大 Boss 是 dyld: Library not loaded: @rpath/libcudart.7.5.dylib 错误,网上没有找到解决方案,被我运气好给解决了。 详细步骤如下: 先检查提示错误的编译目录是否有 libcudart.7.5.dylib 库,前面安装没问题的话,当然是有的。(问题出在环境变量上面,国外有网友通过添加--linkopt="-L/usr/local/cuda/lib"的方式,然并卵, bazel 的一个 bug ,据说在 mac 上面并没有把参数传过去,我测试过还是不行。) 发现报错前运行过 execroot/tensorflow/external/bazel_tools/tools/genrule 中的 genrule-setup.sh ,在 genrule-setup.sh 中加上环境变量 export DYLD_LIBRARY_PATH=/usr/local/cuda/lib 然后再次编译提示文件被修改,说明编译过程会去检查生成的 shell 时间戳,办法就是先用 stat genrule-setup.sh 查看控制台输出的第二列的时间,记录下来,然后打开 genrule-setup.sh 添加环境变量 export DYLD_LIBRARY_PATH=/usr/local/cuda/lib 修改以后通过 touch -t YYYYMMDDhhmm.SS 把时间修改回来,然后继续编译,接下来顺利通过报错点。
另外,因为 configure 的时候下载的一些工具包都在 tmp 目录,如果重启了电脑又得下载一次,所以最好中途不要重启电脑
好了,到这里就愉快的结束了,如果你想要编译好的 whl 包,我这里有 r0.9 和 r0.10 的。站内联系我吧:)或者搜 tensordata 的公众号。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.