V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
AssKicker
V2EX  ›  分享发现

[原创] 如何在 Mac 电脑上面编译 GPU 版本 TensorFlow

  •  
  •   AssKicker · 2016-09-05 19:52:17 +08:00 · 446 次点击
    这是一个创建于 3002 天前的主题,其中的信息可能已经有所发展或是发生改变。

    前段时间学习 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 的公众号。

    3 条回复    2016-09-06 11:59:50 +08:00
    20015jjw
        1
    20015jjw  
       2016-09-06 08:30:35 +08:00
    我比较好奇 为啥这时候的正确姿势不是换电脑...
    AssKicker
        2
    AssKicker  
    OP
       2016-09-06 11:02:42 +08:00
    @20015jjw

    因为用来学习足够了,如果运算量非常大我会选择直接租 HPC 更划算
    bearqq
        3
    bearqq  
       2016-09-06 11:59:50 +08:00
    买了个 1070 在 ubuntu 16.04 下装 tensorflow 也是个深坑。。放个链接吧,感兴趣的人可以看一下。 https://zhuanlan.zhihu.com/p/22281061
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   981 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 19:20 · PVG 03:20 · LAX 11:20 · JFK 14:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.