利用 Docker 在 GCP 上架設 Tensorflow + Cuda + Jupyter 開發環境

Chin-yu Chien
6 min readJun 28, 2018

--

在 CNN 的訓練中,GPU 可以大幅的減少訓練的時間,不過對於習慣使用筆電的開發者而言,GPU(和它的轉接盒)無論在售價或是重量、散熱上都是不小的負擔。幸虧 Google Cloud Platform 提供初學者 $300 美金的額度,可以利用平台上的虛擬機執行運算 GPU 運算。加上 Docker 的虛擬化技術,過程中只需要安裝 Docker 和 Cuda,這使得設定上大幅簡化,完成後可以利用瀏覽器,連結到 Jupyter notebook 做開發或是執行。

以下紀錄幾天下來安裝的步驟:

  1. 建立虛擬機、設定防火牆、安裝 Docker。
  2. 申請使用 GPU
  3. 在虛擬機中安裝 Cuda-toolkit
  4. 安裝並設定 nvidia-docker 執行環境
  5. 設定 docker-compose,並執行

建立虛擬機、設定防火牆、安裝 Docker

這部份請參考前一篇文章,重要的是虛擬機的作業系統如果是 Ubuntu 請選擇 16.04 以下的版本,否則無法安裝 Cuda 9.2 以下的版本。這邊也建議安裝 Google Cloud 官方提供的 Command Tool 方便虛擬機的管理和接下來步驟的執行。

申請使用 GPU

  1. 修改 GPU 的個數
  2. 啟動 VM 後,會產生錯誤訊息
  3. 進入 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())

--

--

Chin-yu Chien

站在歷史的肩膀,舉著技術的長矛,騎馬打仗。