2020年11月22日

Ai學習 - 1_PVE LXC Nvidia GPU Tensorflow環境搭設

最近想學Ai,早在去年從同事買了一張挖礦汰換的顯示卡,
最近才把它裝機,準備開始用。
起手式第一步,環境搭設。

Tensorflow官方有提供Docker,我也的確裝上去了,
但我發現Pycharm對於遠端Docker和遠端Virtualenv的支援不太好,
遠端SSH支援不錯,但Tensorflow Docker在遠端SSH除錯會出錯誤,
嘗試自己建標準版Ubuntu 18.04 Docker,遠端SSH除錯和執行都確定沒問題,
目前把問題歸在官方Docker,於是就土法煉鋼自己做了。
下面就把過程和步驟整理出來。

Tensorflow GPU需要5樣東西(依階層):



















不論是Docker還是LXC,在Host主機上,都只需要安裝NVIDIA顯示卡驅動程式
其他部份(NVIDIA CUDA、NVIDIA cuDNN、Python、Tensorflow-GPU)都在Guest的Docker或LXC內,如下圖:





















而在Container內要跟Host之間聯結,讓Container的程式能存取NVIDIA顯示卡驅動程式,
因此需要一些額外設定。
在Docker中,需要安裝NVIDIA修改過的Docker (nvidia-docker),
並在執行docker時指定runtime=nvidia,指令大致是:
docker run --dns 8.8.8.8 -p 8888:8888 -v tensorflow-data:/tf/data --runtime=nvidia -d --rm tensorflow/tensorflow:latest-gpu-py3-jupyter

細節就不多說了,下面操作步驟在描述。

操作步驟:
1. 安裝NVIDIA驅動程式
在PVE上安裝NVIDIA顯示卡驅動程式,步驟主要3點:
1a. NVIDIA官方網站下載相對應的Linux amd64驅動程式
1b. 新增/修改 /etc/modprobe.d/blacklist.conf 如下:
/etc/modprobe.d/blacklist.conf
================
blacklist nouveau
================

1c. 執行Linux amd64驅動程式進行安裝
# bash /root/NVIDIA-Linux-x86_64-450.80.02.run

1d. 確認安裝完成
# nvidia-smi

如果安裝成功,nvidia-smi會顯示系統顯示卡的資訊。

這邊要記住安裝的驅動程式版本,這裡用450.80.02

2. 建立Ubuntu 18.04 LXC Container
1a. 在PVE上建立Ubuntu 18.04 LXC,這裡用標準的standard。
1b. 接著要修改LXC的設定檔,將NVIDIA顯示卡驅動程式產生的device file映射到Container中,
在PVE LXC的設定檔加入:
/etc/pve/lxc/105.conf
================
..........
lxc.cgroup.devices.allow: c 195:* rwm lxc.cgroup.devices.allow: c 243:* rwm lxc.mount.entry: /dev/nvidia0 dev/nvidia0 none bind,optional,create=file lxc.mount.entry: /dev/nvidiactl dev/nvidiactl none bind,optional,create=file lxc.mount.entry: /dev/nvidia-uvm dev/nvidia-uvm none bind,optional,create=file lxc.mount.entry: /dev/nvidia-modeset dev/nvidia-modeset none bind,optional,create=file lxc.mount.entry: /dev/nvidia-uvm-tools dev/nvidia-uvm-tools none bind,optional,create=file
================

細節參考:

3. 下載NVIDIA CUDA (Container內)
NVIDIA網站下載CUDA:

選擇 Linux -> x86_64 -> Ubuntu -> 18.04 -> Deb(Network)

接著按照網站上描述的步驟,執行前面3點
# dpkg -i cuda-repo-ubuntu1804_10.0.130-1_amd64.deb
# apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/7fa2af80.pub
# apt update

4. 安裝NVIDIA顯示卡工具程式、CUDA (Container內)
我們上個步驟把套件庫新增到系統後,這邊安裝。
這裡安裝要注意幾點:
1. Tensorflow-GPU不同版本相依不同的CUDA版本
2. CUDA安裝會相依nvidia-driver、nvidia-util版本

因為Tensorflow會相對應特定版本的CUDA,版本參考:

原則上,Tensorflow 2.1.0以上都用CUDA-10.1版,這裡安裝CUDA-10.1版。

前面提到我們用的顯示卡驅動程式版本是450.80.02
這裡要安裝cuda-drivers-450.80.02,指令如下:
# apt-get install cuda-drivers=450.80.02-1

比較簡單的方式是,安裝aptitude,用aptitude指定這個版本安裝。

接著才安裝CUDA,這裡我們安裝CUDA-10.1版,指令如下:
# apt-get install cuda-10-1

10-1表示10.1版,要安裝其他版本,例如10.0 (就是cuda-10-0)。
同樣的,比較簡單的方式是用aptitude直接指定版本安裝。
這裡要注意,安裝時,它顯示把cuda-drivers移除,安裝最新的455版,
一樣,用aptitude,直接指定cuda-drivers用450.80.02-1的版本。

完成後,執行(Container內):
# nvidia-smi

應該會出現和PVE主機上一樣的畫面訊息。

5. 安裝NVIDIA cnDNN
NVIDIA網站下載cnDNN

前面Tensorflow網站寫,2.1.0以上版本是7.6版,因此我下載:
cuDNN v7.6.5, for CUDA 10.1

選Ubuntu 18.04版本下載。
只需要安裝runtime即可,dev和doc都不用下載。
直接用
# dpkg -i /root/libcudnn7_7.6.5.32-1+cuda10.0_amd64.deb

6. 安裝Python3.7和pip3 (Container內)
Tensorflow提供pip安裝,但要求要pip 19.0以上版本,
因此我們安裝並升級Ubuntu 18.04的Python3.7和pip3。

6a. 安裝Python3.7
# apt install python3.7 python3.7-dev

6b. 調整預設Python3版本為python3.7
# update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.6 1
# update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.7 2
# update-alternatives --config python3

6c. 安裝升級新版pip3
# apt install python3-pip
# python3.7 ./get-pip.py

7. 安裝Tensorflow-GPU
這裡我看了半天,終於搞懂差異在哪,
首先Tensorflow 1.x 和 Tensorflow 2.x 不相容,程式碼要修改,
再來,Tensorflow 2.0.0、2.1.0、2.2.0、2.3.0穩定性有差異,
支援的演算法有差異,演算法差異參考:

目前我選2.2.1安裝,但之後Raspberry Pi + Tensorflow-Lite,我可能會改用2.3.1。

安裝Tensorflow-2.2.1
# pip3 install tensorflow-gpu==2.2.1

等等等等.......

8. 驗證 & 備份
執行下面這段Python程式碼:
import tensorflow as tf
tf.test.gpu_test_gpu_device_name()

正常會顯示一堆東西,其中出現
GeForce GTX 1060 6GB computeCapability: 6.1

接著最重要的步驟~備份。
Container關機 -> Backup -> 選 gzip -> 備份後,搬移到 templates/cache/ 改名為 tensorflow-gpu-2.2.1。

到這裡,LXC版本的可遷徙容器完成.......
其他地方只需要PVE安裝個Nvidia Driver 450.80.02就可以玩Tensorflow了!