非常感謝 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 上部署以下深度學習環境:
若已有更新後版本,歡迎留言在底下分享。這篇文章會以 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。
然而,在 EC2 上,Nvidia 有提供已經準備好的映象檔,包含 Nvidia driver、CUDA、cuDNN 等,所以也不太需要自己準備環境,裝一下 Python、PyTorch 之類的就可以了。然而,當自己真的要部署環境時,經常被 Nvidia 的驅動搞到發瘋。(倒是也蠻奇怪的,PyTorch AMI 沒有裝好 PyTorch。)
在和 CNTUG 的郭靖前輩申請後,取得 CNTUG Infra Labs 的使用資格(以往在 CourseAPI 專案就有以開源社群身分申請),並包含 GPU 的使用資格。
CNTUG Infra Labs 是用 OpenStack 進行管理,有關 OpenStack 操作的部分內容可以參考我的偶像 Jerry Yang 部落格的相關文章。
剛開始裝的時候,我不斷嘗試用 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 相容的版本。
# 安裝 ubuntu-drivers-common
sudo apt install ubuntu-drivers-common
# 檢視 GPU 及可用的 driver
ubuntu-drivers devices
接下來重新開機後,就可以用 nvidia-smi
確認一下有沒有安裝成功囉!
如果根據安裝 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 相對簡單很多,因為網站上就有提供安裝教學。只要跟著操作就可以了。
# 如果習慣打 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 要準備了。
在開始安裝之前,要先調整安全性群組,開一個 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 等沒有安裝,但因為相較之下比較好安裝,就沒有另外說明。
再次感謝 CNTUG 的 Infra Labs 贊助,也歡迎大家去多加了解他們,參與活動如 meetup 等。也感謝我的偶像 Jerry Yang 幫我看這篇文章,第一次寫技術文,歡迎大家去看看他的部落格。
本著作係採用創用 CC 姓名標示 4.0 國際 授權條款授權。