在 Google Cloud Platform 上使用 GPU 和安裝深度學習相關套件

最近 GCP (Google Cloud Platform) 動作頻頻,也因此想嘗試在 GCP 上開 GPU 機器跑深度學習 (deep learning),雖然網路上文件已經不少,不過在途中還是遇到一些小插曲,所以就還是紀錄一下。

Create Project

首先你要有 Google 帳號,並且登錄信用卡以方便被收錢(?接著進入到 GCP 的首頁(如下圖)。因為是第一次進入,所以在主頁的部分,沒有任何專案。因此就「建立」一個專案,並為該專案命名。

GCP home page

接著進入到「Computer Engine」,就可以讓使用者選擇規格,並啟動一個 Instance,就像是啟動一台電腦。

Create GPU Instance

因為想嘗試的是深度學習,因此就在「VM 執行個體」選擇建立一台有 GPU 的 Instance。

接著是設定這台電腦的規格。我設定的規格如下。區域選擇 us-west1-bCPU 兩顆,記憶體 13 GB,NVIDIA Telsa K80 GPU 一顆。

接著略往下滑,會看到開機磁碟。我選擇 Ubuntu 16.04 LTS,開機磁碟大小 256 GB。

接著就可以選擇建立該 Instance了。看起來蠻直覺的!

但可惜根本沒那麼順利。像是下圖右上角的通知框一樣(請先忽略圖片中的綠底白勾,我是成功之後才截了這張圖)。他的錯誤訊息是「Quota ‘NVIDIA_K80_GPUS’ exceeded. Limit: 0.0 region us-west1b」。

而原因是「配額」,簡單來說,有些選項(API…),Google 有規定你使用的量,而有些(GPU)甚至預設是不能使用,皆需要透過申請調整使用的配額。所以這個錯誤訊息是指「在所指定的 us-west1 中,預設的 NVIDIA K80 GPU 最多只能使用 0 個」。換言之,預設的狀況下,Google 是不讓你使用 GPU 的 Instance。

這時候點選通知內的「要求增加」,便可以申請提高「配額」。會進入到以下頁面。然後在標頭列的「指標」選擇要提高的選項,這裡我選「NVIDIA K80 GPUs」(因為我要開的 Instance 是使用這個 GPU),然後要記得和自己 Instance 開的 region 一致,因為不同的地區的配額是要另外申請的。(以下圖為例,在未申請前,所有區域的 NVIDIA K80 GPUs 都會是 -/0,而因為這張圖是在我申請成功後才截的,所以可以看到在第一列他是顯示 1/1,代表配額是一個,然後我正在使用)

在勾選區域跟要配額的指標後,選擇標頭列上方的「編輯配額」,便會出現下圖右半邊的視窗,接著就將「目前的上限」調整為要需要的數量(我是填 1),然後寫個理由,接著就可以提交了。

事情還沒結束。

這時候 Google 會寄一封信,要你提交一些「證明」,代表你付得出錢。我簡單描述信中的內容。他有兩個選項來證明你付得出錢。

  1. 是直接先付訂金的概念,舉我所開的 Instance 的例子,他要求我先付 $35 美金的訂金(更高的配額,要付的訂金就更高),並 Google 保證這筆訂金,在之後 GCP 上的所有服務都可以扣款(門票抵院內消費)。
  2. 另一個方式是要使用者提供「之前沒欠錢」的專案,來證明自己的信用。

因為我是第一次使用 GCP,並沒有其他專案,所以我是選擇第一個選項。

付訂金的方式非常容易(? 在進到 GCP 的「帳單頁面」(見下圖),點選「提前付款」並輸入對應的金額。過一些時間(客服說 2 ~ 3 個工作天,但我大概只等了幾十分鐘),Google 便會再寄一封信通知你已經通過審核,接著在原先的錯誤通知中,點選「重試」,應該就可以成功建立了。

make a manual payment

(這邊想稱讚一下客服,回信的速度非常快,服務我也覺得很好。)

SSH to Instance

我習慣的使用方式,是進到那台開好的機器做事情。在 GCP 的網頁中,有入口提供直接進入那台電腦的終端機,不過我還是習慣透過自己的終端機連進去,因此就需要安裝 gcloud 來完成。

該文章「使用 gcloud 連線到 Google Cloud Platform 上的 VM」解釋得非常詳細,我照著做然後就成功了。以下簡單敘述步驟,詳細的部分再請去那個連結。官方的安裝文件跟步驟請參考此連結

  1. 安裝 Google Cloud SDK:下載對應的檔案,解壓縮後並安裝。
  2. 初始化 gcloud:讓 gcloud 知道並綁定對應的 Google 帳號。
  3. SSH 連線至 Instance
# 初始化
$ gcloud init
# 連線
$ gcloud compute ssh {instance_Name}

現在應該就可以順利進入剛剛開好的 Instance了。

接著在開好的 Instance 內,就是一台有 GPU 的機器。因此接下來的目標是安裝 Tensorflow 的 GPU 版本。

除了 CUDA cuDNN 之外,我習慣上還會安裝 Anaconda,Anaconda 是一個 python 做統計或機器學習很方便的環境,最後就是 Tensorflow-GPU

Install CUDA

先要安裝顯卡的驅動程式(driver)。

因為希望安裝最新版的 Tensorflow(version 1.7),所以 CUDA 的版本至少要 9.0 以上。我因為之前沒意識到這件事,所以先安裝了 CUDA 8.0,後來才利用順帶裝好 cuda command line tool 安裝到 9.0。因此以下的步驟,會先安裝 cuda 8.0,然後才利用因為安裝 CUDA 8.0 而「順便裝好」的 cuda command line tool 安裝 CUDA 9.0。事後也沒有再去研究怎麼直接裝 cuda command line tool。所以應該可以在順序上,做更好的修改。可以再歡迎指教。

  • 安裝 CUDA 8.0
$ curl -O https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/cuda-repo-ubuntu1604_8.0.61-1_amd64.deb
$ sudo dpkg -i cuda-repo-ubuntu1604_8.0.61-1_amd64.deb
  • 利用安裝好的 cuda command line tool 安裝 CUDA 9.0
$ sudo apt-get update
$ sudo apt-get install cuda-9-0
$ sudo nvidia-smi -pm 1
$ sudo nvidia-smi -ac 2505,875 # Optimizing GPU performance
$ echo 'export CUDA_HOME=/usr/local/cuda' >> ~/.bashrc
$ echo 'export PATH=$PATH:$CUDA_HOME/bin' >> ~/.bashrc
$ echo 'export LD_LIBRARY_PATH=$CUDA_HOME/lib64' >> ~/.bashrc
$ source ~/.bashrc

順利的話,上面的步驟跑完,應該就裝好了。這時候可以透過在終端機輸入 nvidia-smi 來確認,若能跑出下圖,代表成功。

$ nvidia-smi

Install cuDNN

NVIDIA 有提供套件 cuDNN 來幫助優化神經網路的運算。要安裝的話要先去 NVIDIA Developer Program 申請帳號(很快就申請完畢),便可以下載各種版本的 cuDNN。

我是安裝 cuDNN v7.1.2 (Mar 21, 2018), for CUDA 8.0 中的cuDNN v7.1.2 Library for Linux (事後想想應該是要安裝 ‘for CUDA 9.0’ 的版本,但 ‘for CUDA 8.0’ 這個版本也能成功)。在本機下載完該檔案後,便把這個檔案利用 gcloud 也自身的 scp 語法,複製到那台機器上(instance-1)。

$ gcloud compute scp cudnn-8.0-linux-x64-v7.1.tgz instance-1:/home/davidtseng

接著就是解壓縮,並複製跟取代到特定的資料夾底下。

$ tar xzvf cudnn-8.0-linux-x64-v5.1.tgz
$ sudo cp cuda/lib64/* /usr/local/cuda/lib64/
$ sudo cp cuda/include/cudnn.h /usr/local/cuda/include/
$ rm -rf ~/cuda
$ rm cudnn-8.0-linux-x64-v5.1.tgz

經過上述的步驟,終於把前置作業完成。包含在 GCP 上的啟動 Instance、驅動程式跟套件安裝以及環境準備。接下來就進入安裝 Tensorflow。

Install Anaconda

在真正開始裝 Tensorflow 前,我會習慣安裝 Anaconda。這個環境包裡面有預先安裝許多在做機器學習或統計會用到的套件,我覺得頗方便。安裝步驟也十分簡單,就是下載一個 .sh 檔並安裝,最後再把路徑加到環境變數。

$ curl -O https://repo.continuum.io/archive/Anaconda3-5.0.1-Linux-x86_64.sh
$ sha256sum Anaconda3-5.0.1-Linux-x86_64.sh
$ bash Anaconda3-5.0.1-Linux-x86_64.sh
$ source ~/.bashrc
$ conda list

事實上我在安裝到最後一行時,程式報錯。錯誤訊息是「conda: command not found」,原因是並未正確地把安裝好的 Anaconda 加到環境變數中。既然在執行 bash 的過程他沒有加,那就手動加吧。

$ vim ~/.bashrc # 利用 Vim 編輯 .bashrc 檔

並把「export PATH=/home/davidtseng/anaconda3/bin:$PATH」加到該檔案的最後一行 (路徑要記得修改成自己安裝 anaconda3 的位置)。

接著再執行

$ source ~/.bashrc

應該就可以順利成功。可以再試試看執行「conda list」,若能跑出下面類似的結果,就沒問題了。

$ conda list 

Create Virtual Environment

在裝好 Anaconda 後,建議可以建立虛擬環境。目的是希望若之後有多個專案的產生,彼此對套件的相依可以獨立。這邊我是建立一個 python 3.6 的環境。並且將該環境命名為 py36。

$ conda create --name py36 python=3.6 anaconda

上面執行完後就建立好虛擬環境,但還沒進入到該環境內,還需要執行

$ source activate py36

這時候會發現你的 terminal 前面會出現 (your_name_of_venv):

(py36) davidtseng@instance-1:~$

就代表已經進入該環境。

Install Tensorflow

透過官方的文件,在虛擬環境中安裝只需要一行指令,

(py36) davidtseng@instance-1:~$ pip install --upgrade tensorflow-gpu

等安裝完畢後,可以在 python 的互動模式中確認。

(py36) davidtseng@instance-1:~$ python
>>> import tensorflow as tf
>>> from tensorflow.python.client import device_lib
>>> print(device_lib.list_local_devices())

若能順利產生類似以下的結果,就代表成功了。

接著就可以開始你的深度學習了。

以我的經驗,在熟悉這樣的流程後,其實從開一台 GPU Instance,到安裝所有需要的套件,其實大概幾十分鐘就可以結束(大部分都在等套件的安裝),其實我覺得算蠻方便的。想提醒一件很重要的事,在暫時用不到機器的時後,也請記得在「Computer Engine」主控台,「停止」你的 Instance,這樣 Google 就只會收 Storage 的費用,在概念上是類似於 aws 的 terminate。等下次需要時時再「啟動」機器,並且之前裝好的套件跟檔案也都會存在。

收工。

Source: Deep Learning on Medium