1. 程式人生 > >TensorFlow + CUDA 開發環境配置的坑與丘

TensorFlow + CUDA 開發環境配置的坑與丘

作者:沈晟
連結:https://zhuanlan.zhihu.com/p/23042536
來源:知乎
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。

GPU計算能力的快速發展,讓海量矩陣乘法運算更容易被實現,終於也讓多年積累下來的神經網路研究與機器學習成果得以噴發。TensorFlow的出現,更讓「舊時王謝堂前燕,飛入尋常百姓家」。甚至組合一些家用發燒的裝置,就可以開始像模像樣的進行深度學習訓練。AI for Everybody 的時代開始了。

這裡整理了一下部署TensorFlow開發環境的心得,希望對同好有所幫助。

硬體

  • 只有英偉達nvidia的顯示卡支援CUDA和有效幫助TensorFlow。
  • Titan X,或者雙路Titan X,或者四路都是常見的選擇。

系統環境

  • 目前社群推薦 Ubuntu 14.04 作為。這也是因為 TensorFlow 還是基於 Python 2。而更高版本的 Ubuntu 16 預設的是 Python 3。

安裝驅動

  • 顯示卡驅動務必去官方下載最新的Local版(.run file)驅動和CUDA Toolkit。這是因為無論是 apt-get 或 官網的網路安裝方式,都不能保證最新版的驅動。
  • 下載Local版,更方便出現故障時重新安裝。
  • CUDA Toolkit本身包括了顯示卡驅動,所以可以不用另外重複安裝。
  • 同時需要根據指示安裝 cudnn

安裝TensorFlow

  • 只有自行編譯的TensorFlow才能利用CUDA。
  • 參考編譯命令
    bazel build -c opt --config=cuda //tensorflow/tools/pip_package:build_pip_package
    
  • 在執行 ./configure 時,會提示一個叫做 「Cuda compute capabilities」的引數。這時一定要記得到 developer.nvidia.com/cu 查詢下自己顯示卡的 「compute capability」,例如 Titan X 就應該是61,而不是很多文件或預設提到的52。
    # ./configure 過程中留心下面的問題,否則可能浪費大量計算效能
    Please specify a list of comma-separated Cuda compute capabilities you want to build with
    
  • 安裝後,在使用TensorFlow之前,還必須需要配置兩個環境變數。
    export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/cuda/lib64:/usr/local/cuda/extras/CUPTI/lib64"
    export CUDA_HOME=/usr/local/cuda
    
    也可以放到 /etc/environment 中固化到系統中,方便後續開發。
    LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/cuda/lib64:/usr/local/cuda/extras/CUPTI/lib64"
    CUDA_HOME=/usr/local/cuda
    

測試

  • 最合適測試CUDA的程式碼是使用 log_device_placement 引數:
# python
import tensorflow as tf
a = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[2, 3], name='a')
b = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[3, 2], name='b')
c = tf.matmul(a, b)
sess = tf.Session(config=tf.ConfigProto(log_device_placement=True))
print sess.run(c)
注意:不要在 tensorflow 所在的目錄下執行本程式碼
  • 觀察輸出的日誌是否顯示了 gpu0 , gpu1 等,即可確認TensorFlow是否已經利用到CUDA。例如

I tensorflow/core/common_runtime/gpu/gpu_device.cc:951] Found device 0 with properties:
name: TITAN X (Pascal)
......
I tensorflow/core/common_runtime/direct_session.cc:252] Device mapping:
/job:localhost/replica:0/task:0/gpu:0 -> device: 0, name: TITAN X (Pascal), pci bus id: 0000:02:00.0
/job:localhost/replica:0/task:0/gpu:1 -> device: 1, name: TITAN X (Pascal), pci bus id: 0000:01:00.0

範例專案

檢測 GPU 的使用率

想檢視 GPU 的 top 怎麼辦? 怎麼知道 GPU 有沒有被充分利用起來。 nVidia 提供了監控 GPU 的工具 「nvidia-smi」,GPU使用率,視訊記憶體使用率都一目瞭然。

nvidia-smi -q -g 0 -d UTILIZATION -l

讓你的 Docker 容器支援GPU

容器的好處很多。英偉達在這個領域也做了一件大好事,就是提供了讓 Docker 也能支援GPU計算的plugin(或者說mod?)。這樣可以讓專案之間更好的與系統環境隔離,方便管理。換句話說,開發環境的作業系統中只要有 nvidia-docker 即可,而不用安裝 TensorFlow 。而每個專案如果有各自不同的版本依賴,也不會在同一個作業系統中產生衝突。

例如啟動 TensorFlow 官方映象。官方映象會執行一個 jupyter 可以通過 http://<ip>:<8888>/ 來訪問,進入互動式的 Python 筆記本。
nvidia-docker run -it -p 8888:8888 tensorflow/tensorflow:0.11.0rc0-gpu