如何在 VPS 上部署深度學習環境

ft. CNTUG Infra Labs

呂顥天 Ted Lu
11 min readDec 31, 2022

Sponsor

非常感謝 Cloud Native Taiwan User Group 贊助 Infra Labs,讓我能夠利用 VPS 執行 inference,並且完成這篇文章。

Cloud Native Taiwan User Group 希望整合台灣雲端相關社群如 OpenStack, Kubernetes, Ceph, SDN 等,並利用 Meetup 定期在各台灣地區舉辦技術與推廣分享活動。目的是藉此群策群力來使該社團快速成長,以對台灣在雲端開源平台的貢獻,另外我們更希望該社群持有 Cloud Native 概念,並將此推廣至台灣企業、學校、政府單位等。

文章內容說明

在這篇文章中,我們會在裝有 Nvidia Tesla P4,運行 Ubuntu 20.04 的 VPS 上部署以下深度學習環境:

  • Nvidia driver: 450.80.02
  • CUDA: 11.7
  • PyTorch: 1.13.1+cu117
  • Jupyter Lab

若已有更新後版本,歡迎留言在底下分享。這篇文章會以 PyTorch 目前的要求,CUDA 11.7 為主進行安裝。

身為一個買不起顯卡的窮鬼,只能乖乖用實驗室的 GPU server,或是用 AWS(Amazon Web Service)GCP(Google Cloud Platform)等 cloud service 來做訓練。我以往都是使用 AWS 跑訓練和 inference,然而,很多人在 AWS 跑 deep learning 都會用 SageMaker,但我個人認為沒有到非常方便,而且價格偏高,所以都使用 EC2(Elastic Compute Cloud)的 g4dn 系列,自己架 Jupyter Lab。

AWS EC2 instance 種類。Source: GeeksforGeeks

然而,在 EC2 上,Nvidia 有提供已經準備好的映象檔,包含 Nvidia driver、CUDA、cuDNN 等,所以也不太需要自己準備環境,裝一下 Python、PyTorch 之類的就可以了。然而,當自己真的要部署環境時,經常被 Nvidia 的驅動搞到發瘋。(倒是也蠻奇怪的,PyTorch AMI 沒有裝好 PyTorch。)

Nvidia GPU-Optimized PyTorch AMI。Source: AWS Marketplace

在和 CNTUG 的郭靖前輩申請後,取得 CNTUG Infra Labs 的使用資格(以往在 CourseAPI 專案就有以開源社群身分申請),並包含 GPU 的使用資格。

CNTUG Infra Labs 是用 OpenStack 進行管理,有關 OpenStack 操作的部分內容可以參考我的偶像 Jerry Yang 部落格的相關文章。

安裝 Nvidia driver

剛開始裝的時候,我不斷嘗試用 PPA repository 和 APT 安裝,然而 PPA 和 GPG Key 一直搞不定,所以最後直接抓 .run 檔案來跑了。檔案連結是直接從 Nvidia download 抓來的,再用 wget 抓上去。

# 在開始安裝之前,先把 nouveau 停用,不然等下會一直跳 warning,最後失敗
sudo bash -c "echo blacklist nouveau > /etc/modprobe.d/blacklist-nvidia-nouveau.conf"
sudo bash -c "echo options nouveau modeset=0 >> /etc/modprobe.d/blacklist-nvidia-nouveau.conf"
cat /etc/modprobe.d/blacklist-nvidia-nouveau.conf
sudo update-initramfs -u
# 先重開機一遍,確保 nouveau 停用
sudo reboot now

# 會出現 Please specify linux-headers location,所以我們直接先裝上去
sudo apt install linux-headers-5.4.0-91-generic
# 抓下 .run 檔,執行後重開機就可以了
wget https://us.download.nvidia.com/tesla/450.80.02/NVIDIA-Linux-x86_64-450.80.02.run
chmod +x NVIDIA-Linux-x86_64-450.80.02.run
sudo ./NVIDIA-Linux-x86_64-450.80.02.run
sudo reboot now

這邊建議安裝前可以先安裝 ubuntu-drivers-common 來看看 GPU 可以裝哪幾個版本(參考以下),也要到這個網站確定一下 CUDA 相容的版本。

CUDA 與 Nvidia 驅動相容版本。Source: Nvidia docs
# 安裝 ubuntu-drivers-common
sudo apt install ubuntu-drivers-common
# 檢視 GPU 及可用的 driver
ubuntu-drivers devices

接下來重新開機後,就可以用 nvidia-smi 確認一下有沒有安裝成功囉!

nvidia-smi 執行結果

安裝 CUDA

如果根據安裝 driver 的步驟,應該也已經決定好要安裝哪個版本的 CUDA 了。這邊依照 PyTorch 最新版本(2022/12)要求的 CUDA 版本,安裝 11.7。其實各版本的安裝指令 Nvidia 都有放在這個網頁上,可以看著需求參考安裝。

wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin
sudo mv cuda-ubuntu2004.pin /etc/apt/preferences.d/cuda-repository-pin-600
sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/3bf863cc.pub
sudo add-apt-repository "deb https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/ /"
sudo apt update
sudo apt install cuda
sudo apt install nvidia-cuda-toolkit

理論上,安裝完之後跑 nvcc -V 一定會被結果嚇到,因為版本好像不太對,所以版本建議裝完 PyTorch 再檢查,會比較準。

$ nvcc --version
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2019 NVIDIA Corporation
Built on Sun_Jul_28_19:07:16_PDT_2019
Cuda compilation tools, release 10.1, V10.1.243

安裝 PyTorch

安裝教學的操作。Source: PyTorch 網站

其實安裝 PyTorch 相對簡單很多,因為網站上就有提供安裝教學。只要跟著操作就可以了。

# 如果習慣打 python3 的朋友,這裡可以略過
sudo apt install python-is-python3
# 安裝 pip3
sudo apt install python3-pip

# 安裝 PyTorch
pip install torch torchvision torchaudio

安裝完成後,就可以測試一下了。

>>> import torch

>>> print(torch.version.cuda)
11.7
>>> print(torch.cuda.is_available())
True

到這邊,環境就大概完成了(我是 PyTorch 派的,Tensorflow 安裝就不寫了 XD)。剩下 Jupyter Lab 要準備了。

安裝 Jupyter Lab

在開始安裝之前,要先調整安全性群組,開一個 IPv4 TCP 在 port 8888 的 0.0.0.0/0 inbound rule,讓我們的 Jupyter Lab 可以在其他地方連接。

# pip 安裝常常會跳出 PATH 警告,這裡先調整
export PATH="/usr/local/bin:$PATH"
# 安裝 Jupyter Lab
pip install --user jupyter jupyterlab
# markupsafe 在新版本中把 soft_unicode 拿掉了,所以要安裝舊版本
pip install markupsafe==2.0.1

為了讓我們能夠遠端 access,要先調整一些設定。

# 建立設定檔
jupyter notebook --generate-config
# 設定密碼,這裡用 jupyter notebook password 的話設定會跑掉,不建議使用
jupyter server password
# 使用 nano 修改設定檔,如果要用其他 text editor 也可以
nano ~/.jupyter/jupyter_notebook_config.py

調整 ~/.jupyter/jupyter_notebook_config.py 內容,因為檔案本身是滿滿的註解,只有一行 c = get_config() ,直接在這行之後貼上以下內容就可以了。

c.NotebookApp.allow_password_change = False
c.NotebookApp.allow_root = True
c.NotebookApp.base_url = '/'
c.NotebookApp.default_url = '/lab'
c.NotebookApp.disable_check_xsrf = False
c.NotebookApp.ip = '*'
c.NotebookApp.nbserver_extensions = { 'jupyterlab' : True }
c.NotebookApp.notebook_dir = '~/' # 調整 Notebook 的路徑
c.NotebookApp.open_browser = False
c.NotebookApp.password_required = True # 要求密碼
c.NotebookApp.port = 8888 # 開放的 port

儲存後,先設定 serverextension

jupyter serverextension enable --py jupyterlab

為了讓 jupyter 在我們關閉 terminal 後持續執行,要建立 screen,如果要用 container 也可以。

screen -S jupyterlab
jupyter lab

完成之後,就可以看到 Jupyter Lab 開始執行了,可以從 public IP 連進去看看,記得 port 是在 8888(或是自己調整的其他 port)。如果要離開 screen,可以按 Ctrl+A 再按 Ctrl+D ,就可以退出了。重新進入 screen,可以執行 screen -r <ID>

連入後的登入畫面
登入後的畫面

到這邊,基本上就完成了 VPS 的深度學習環境部署。當然還有 OpenCV、scikit-learn 等沒有安裝,但因為相較之下比較好安裝,就沒有另外說明。

再次感謝 CNTUGInfra Labs 贊助,也歡迎大家去多加了解他們,參與活動如 meetup 等。也感謝我的偶像 Jerry Yang 幫我看這篇文章,第一次寫技術文,歡迎大家去看看他的部落格,超級電。

這篇如果沒有 delay 到,剛剛好在年底 12/31 發佈,祝大家新年快樂,新的一年沒有解不開的 bug!

--

--

呂顥天 Ted Lu

Ted Lu 呂顥天,15 歲、開源社群參與者、台灣開放教育推動團隊發起人兼資料工程師、醫學影像研究者。不是正在被神經科學揍爛,就是在被揍爛的路上。