利用 Docker 在 GCP 上架設 Tensorflow + Cuda + Jupyter 開發環境
在 CNN 的訓練中,GPU 可以大幅的減少訓練的時間,不過對於習慣使用筆電的開發者而言,GPU(和它的轉接盒)無論在售價或是重量、散熱上都是不小的負擔。幸虧 Google Cloud Platform 提供初學者 $300 美金的額度,可以利用平台上的虛擬機執行運算 GPU 運算。加上 Docker 的虛擬化技術,過程中只需要安裝 Docker 和 Cuda,這使得設定上大幅簡化,完成後可以利用瀏覽器,連結到 Jupyter notebook 做開發或是執行。
以下紀錄幾天下來安裝的步驟:
- 建立虛擬機、設定防火牆、安裝 Docker。
- 申請使用 GPU
- 在虛擬機中安裝 Cuda-toolkit
- 安裝並設定 nvidia-docker 執行環境
- 設定 docker-compose,並執行
建立虛擬機、設定防火牆、安裝 Docker
這部份請參考前一篇文章,重要的是虛擬機的作業系統如果是 Ubuntu 請選擇 16.04 以下的版本,否則無法安裝 Cuda 9.2 以下的版本。這邊也建議安裝 Google Cloud 官方提供的 Command Tool 方便虛擬機的管理和接下來步驟的執行。
申請使用 GPU
- 修改 GPU 的個數
- 啟動 VM 後,會產生錯誤訊息
- 進入 Quato 頁面申請使用 GPU(大約需要幾十分鐘的時間申請)
在虛擬機中安裝 Cuda-toolkit
這部份都按照官方的指示進行,需要從 preinstall 的章節開始。以下是在 ubuntu 上執行的步驟
# check os (ex. Ubuntu 16.04.4 LTS)
cat /etc/lsb-release# install gcc
sudo apt-get update && sudo apt-get install gcc# download deb file
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/cuda-repo-ubuntu1604_9.2.88-1_amd64.deb# install CUDA public key
sudo apt-key adv --fetch-keys http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/amd64/7fa2af80.pub# install repository meta-data
sudo dpkg -i cuda-repo-ubuntu1604_9.2.88-1_amd64.deb# install cuda
sudo apt-get update && sudo apt-get install cuda# add Cuda to path
export PATH=/usr/local/cuda-9.2/bin${PATH:+:${PATH}}# check the installation
nvcc --version
nvidia-smi
最後輸出:
安裝並設定 nvidia-docker 執行環境
可以參考 nvidia-docker 官方的安裝說明,以下是 ubuntu 的步驟
# install repository
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | \
sudo apt-key add -
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | \
sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo apt-get update# install nvidia-docker
sudo apt-get install nvidia-docker2
sudo pkill -SIGHUP dockerd# test
docker run --runtime=nvidia --rm nvidia/cuda nvidia-smi
如果成功,最後應該會得到如同前一步驟的結果。由於 nvidia-docker 是一種 runtime,因此安裝完後需要重新啟動 docker server,執行時也需要指定 runtime
設定 docker-compose,並執行
由於目前 docker-compose 沒有支援 runtime 的設定(未來會加入),因此必須要修改 docker 的 daemon 設定檔,開啟 /etc/docker/daemon.json,如下
{
"runtime": {
"nvidia": {
"path": "/usr/bin/nvidia-container-runtime",
"runtimeArgs": []
}
},
"default-runtime": "nvidia" # add this line
}
修改後記得重新啟動 dockerd,接下來就可以開始設定 docker-compose,如果沒有安裝,請先安裝。
# docker-compose.yml
version: '3'services:
nb-server:
container_name: nb-server
# python 2
# image: tensorflow/tensorflow:latest-gpu
# python 3
image: tensorflow/tensorflow:latest-gpu-py3
ports:
- "8888:8888" # For jupyter
- "6006:6006" # For tensor board
volumes:
- ${PWD}/:/notebooks/nbs/
environment:
- PASSWORD=password # jupyter password
# install package at start
command: bash -c "pip3 install keras && /run_jupyter.sh --allow-root"
接著使用 docker-compose up -d 再連到伺服器位址:8888 就可以開啟 notebook。參考 StackOverflow 的討論串,可以輸入以下指令到 jupyter 來驗證是否使用 GPU 運算
from tensorflow.python.client import device_lib
print(device_lib.list_local_devices())