目錄
- 1 CUDA驅動更新
- 1.1 原有版本CUDA驅動卸載
- 1.2 CUDA驅動下載與安裝
- 1.3 環境變量配置
- 1.4 nvcc -V驗證
- 1.5 重啟電腦
- 1.6 安裝nvidia-container-toolkit
- 2 docker創建
- 2.1 docker安裝
- 2.2docker鏡像
- 2.3 docker命令
- 2.4docker創建鏡像
- 2.5docker創建與運行示例
- 3 CUDA安裝與驗證
- 3.1 容器內基本環境安裝
- 3.2 CUDA驅動下載與安裝
- 3.3 環境變量配置
- 3.4 CUDA安裝驗證
- 4 CUDNN安裝與驗證
- 4.1 cuDNN下載
- 4.2 cuDNN安裝
- 4.3 cuDNN安裝驗證
- 5 conda Python環境安裝
- 5.1 Python Miniconda安裝
- 5.2 conda使用
- 5.3 jupyter notebook 安裝
- 6 ssh服務安裝與配置
- 7 全部命令
本文是《Python從零開始進行AIGC大模型訓練與推理》(參考資料)專欄的一部分,所述方法和步驟基本上是通用的,不局限于AIGC大模型深度學習環境。
Docker AIGC等大模型深度學習環境搭建步驟主要包含如下步驟:
CUDA驅動更新Docker創建CUDA安裝與驗證CUDNN安裝與驗證conda Python環境安裝ssh服務安裝與配置全部命令
1 CUDA驅動更新
ChatGPT、Stable Diffusion等大模型屬于相對較新的模型,所以依賴的Pytorch經常為torch1.12以上版本。相應的CUDA版本則至少為CUDA 11.3,并且顯卡驅動對應的CUDA版本號不能小于CUDA庫的版本號。下面將以CUDA 11.8驅動安裝為例。
1.1 原有版本CUDA驅動卸載
如果系統已安裝低版本CUDA驅動,那么可通過如下命令進行卸載。
sudo /usr/bin/nvidia-uninstall sudo apt-get purge nvidia* sudo apt-get purge cuda* sudo apt-get autoremove sudo modprobe -r nvidia-drm#這一步不一定需要
1.2 CUDA驅動下載與安裝
CUDA下載地址為“https://developer.nvidia.com/cuda-toolkit-archive”,頁面如下所示,選擇“CUDA Toolkit 11.8.0 (October 2022), Versioned Online Documentation”。
選擇CUDA 11.8之后繼續選擇系統類型和下載文件,如下圖所示。選擇完成之后會顯示出runfile下載地址和安裝方式,即“wget https://developer.download.nvidia.com/compute/cuda/11.8.0/local_installers/cuda_11.8.0_520.61.05_linux.run”和“sudo sh cuda_11.8.0_520.61.05_linux.run”。
輸入sudo sh cuda_11.8.0_520.61.05_linux.run安裝時,在安裝選項頁面用回車和上下鍵僅選擇安裝驅動,不安裝其他CUDA套件,如下圖所示。其中,前面的“X”表示已選擇的將要安裝內容。
1.3 環境變量配置
待安裝完成之后,采用如下命令進行環境變量設置。
export CUDA_HOME=/usr/local/cuda export PATH=/usr/local/cuda-11.8/bin:$PATH export LD_LIBRARY_PATH=/usr/lcoal/cuda-11.8/lib64:$LD_LIBRARY_PATH source ~/.bashrc nvcc -V
1.4 nvcc -V驗證
運行nvcc -V命令時系統會輸出如下結果,顯示相應驅動版本號。如果提示“Command 'nvcc' not found, but can be installed with”,那么使用“apt install nvidia-cuda-toolkit”安裝nvidia-cuda-toolkit即可。如果nvcc -V輸出的版本號不對,那么請按照上一節重新設置并更新環境變量。
1.5 重啟電腦
重啟電腦后,運行“nvidia-smi”,如果提示“NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver. Make sure that the latest NVIDIA driver is installed and running.”
解決方法如下:
(1)先通過“ls -l /usr/src/”查看驅動版本號,如下圖最后一行“nvidia -v 520.61.05”。
(2)sudo dkms install -m nvidia -v 520.61.05
完成之后,輸入nvidia-smi可查看cuda版本和GPU顯存使用情況,如下圖所示。
1.6 安裝nvidia-container-toolkit
如果不安裝nvidia-container-toolkit,那么創建docker時可能會報錯“docker: Error response from daemon: could not select device driver "" with capabilities: [[gpu]].”。安裝方法請參考“https://www.cnblogs.com/dan-baishucaizi/p/15102419.html”,即:
distribution=$(. /etc/os-release;echo $ID$VERSION_ID) curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - 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 && sudo apt-get install -y nvidia-container-toolkit sudo systemctl restart docker
2 docker創建
docker容器是Linux下的虛擬機,并且在虛擬機下擁有root權限。這樣既可以獲取較高的權限,又可以避免對主機文件帶來誤操作。同一臺主機上可以創建多個docker,并且每個docker中可安裝不同版本CUDA,但是版本號不能高于主機CUDA驅動版本,否則可能會報錯“CUDA driver version is insufficient for CUDA runtime version”。
2.1 docker安裝
Docker命令一般需要sudo權限,即“sudo docker 命令內容”。如果系統提示沒有docker命令,那么需要按照下面步驟安裝docker。
# 更新 $ sudo apt-get update # 安裝最新的Docker sudo apt-get install docker.io # 啟動 sudo systemctl enable docker sudo systemctl start docker
2.2docker鏡像
Docker查看系統鏡像的方法為“docker images”,運行后會有如下頁面,頁面中含有鏡像ID,即IMAGE ID。
我們可以通過docker pull來下載鏡像,比如通過“docker pull ubuntu:18.04”下載基礎的ubuntu 18.04鏡像。下載完成后,可通過“docker images”命令進行查看,如上所述。
刪除已有鏡像的命令為“docker rmi IMAGE ID”。IMAGE ID不需要完整內容,只需輸入前幾個字符就可以了,例如“docker rmi 394”
2.3 docker命令
容器Container相當于是根據鏡像安裝的虛擬機。
(1) 我們可以使用docker images來列出本地主機上的鏡像。
(2) 創建并運行docker容器:docker run -d -it -p 1088:8888 -p 1022:22 -p 1059:5900 -v /server/data:/docker/data –gpus all –shm-size="32g" ubuntu:18.04/bin/bash
-p:docker端口映射,冒號前為主機端口號,冒號后為docker容器端口號。 -v:docker共享文件夾,冒號前為主機文件夾,冒號后為docker容器文件夾。 --gpus all:docker中可使用GPU。 --shm-size="32g":docker默認的最大內存較小,這里修改為32G內存,可根據修改自行替換為其他值。 ubuntu:18.04:鏡像名稱,為docker images返回中的一個,根據需要進行替換。
(3) 查看docker狀態:docker ps -a,可查看docker狀態,以及容器ID(countainerID)。
(4) 進入docker:docker exec -it countainerID /bin/bash,countainerID一般較長,只需前幾個數字就可以了,系統會自動識別,與上面刪除鏡像的方法類似。
(5)停止docker,docker stop countainerID。
(6)啟動docker,docker start countainerID,然后運行第(4)步進入docker。
(7)刪除docker,docker rm countainerID,運行前先通過第(5)步停止docker。
(8) 清除全部已停止運行的docker,docker system prune。
2.4docker創建鏡像
創建鏡像是指將本地的docker環境打包成鏡像,便于環境復制或部署。提交鏡像的命令如下所示。
docker commit OPTIONS countainerID 自定義鏡像名稱:TAG說明
OPTIONS說明:
(1)-a :提交的鏡像作者;
(2)-c :使用Dockerfile指令來創建鏡像;
(3)-m :提交時的說明文字;
(4)-p :在commit時,將容器暫停。
鏡像提交示例如下:
docker commit -a "rdfast" -m "aigc base" 2c5 aigc:v1
2.5docker創建與運行示例
根據前文描述,我們主要運行下面三條命令進行docker創建與運行。
docker pull ubuntu:18.04 docker run -d -it -p 1088:8888 -p 1022:22 -p 1059:5900 -v /server/data:/docker/data --gpus all --shm-size="32g" ubuntu:18.04 /bin/bash docker exec -it countainerID /bin/bash
下文各種環境的安裝可以在主機上運行,也可以在docker中進行,安裝步驟和方法完全一致。
3 CUDA安裝與驗證
ChatGPT、Stable Diffusion等大模型屬于相對較新的模型,所以依賴的Pytorch經常為torch1.12以上版本。相應的CUDA版本則至少為CUDA 11.3,并且顯卡驅動對應的CUDA版本號不能小于CUDA庫的版本號。由于上述主機已安裝CUDA 11.8驅動,docker內安裝不大于11.8版本的CUDA都是可以的。下面以CUDA 11.3安裝為例。
3.1 容器內基本環境安裝
以上docker的容器安裝了一個基礎的ubuntu 18.04系統,現在需要安裝一些基本環境,命令如下所示。
apt-get update apt-get install ssh vim gcc cmake build-essential -y
3.2 CUDA驅動下載與安裝
CUDA下載地址為“https://developer.nvidia.com/cuda-toolkit-archive”,頁面如下所示,選擇“CUDA Toolkit 11.3.0 (April 2021), Versioned Online Documentation”。
選擇CUDA 11.3之后繼續選擇系統類型和下載文件,如下圖所示。選擇完成之后會顯示出runfile下載地址和安裝方式,即“wget https://developer.download.nvidia.com/compute/cuda/11.3.0/local_installers/cuda_11.3.0_465.19.01_linux.run”和“sudo sh cuda_11.3.0_465.19.01_linux.run”。
輸入sh cuda_11.3.0_465.19.01_linux.run安裝時,在安裝選項頁面用回車和上下鍵選擇安裝內容,注意不要選擇驅動(驅動已經在此之前安裝過了),如下圖所示。其中,前面的“X”表示已選擇的將要安裝內容。
3.3 環境變量配置
待安裝完成之后,采用如下命令進行環境變量設置。
export CUDA_HOME=/usr/local/cuda export PATH=/usr/local/cuda-11.3/bin:$PATH export LD_LIBRARY_PATH=/usr/lcoal/cuda-11.3/lib64:$LD_LIBRARY_PATH source ~/.bashrc nvcc -V
運行“nvcc -V”后輸出如下內容。
3.4 CUDA安裝驗證
在命令行分別輸入如下內容驗證CUDA是否安裝成功。
(1)cd /usr/local/cuda/samples/1_Utilities/deviceQuery
(2)make
(3)./deviceQuery
運行上述命令后,終端界面會有如下輸出。如果終端界面最后輸出“PASS”,則表示CUDA套件已經成功安裝。
如果CUDA套件版本號大于驅動版本號,則有可能提示如下錯誤。
cudaGetDeviceCount returned 35
-> CUDA driver version is insufficient for CUDA runtime version
Result = FAIL
4 CUDNN安裝與驗證
4.1 cuDNN下載
cuDNN安裝文件下載官網地址為“https://developer.nvidia.com/rdp/cudnn-archive”,需要注冊后才能下載。cuDNN版本依賴于CUDA架構版本,即需要與上一步安裝的CUDA組件相對應。這里我們下載適合CUDA 11.3的cuDNN,即Download cuDNN v8.2.0 (April 23rd, 2021), for CUDA 11.x,并且系統版本為ubuntu 18.04(根據實際情況選擇相應系統版本),如下圖所示。
由于cuDNN需要注冊登錄賬號才能下載,所以無法通過wget指令直接進行下載,需要通過瀏覽器頁面下載對應安裝文件。其中,cuDNN安裝文件包括以下4個部分:
- cuDNN Library for Linux (x86_64)
- cuDNN Runtime Library for Ubuntu18.04 (Deb)
- cuDNN Developer Library for Ubuntu18.04 (Deb)
- cuDNN Code Samples and User Guide for Ubuntu18.04 (Deb)
4.2 cuDNN安裝
Linux cuDNN庫(cuDNN Library for Linux)是一個壓縮文件,通過終端指令“tar -zxvf cudnn-11.3-linux-x64-v8.2.0.53.tgz”進行解壓。cuDNN Library解壓結果需要復制到CUDA安裝目錄,相應指令為“cp cuda/include/cudnn.h /usr/local/cuda/include/”、“cp cuda/lib64/libcudnn* /usr/local/cuda/lib64/”。復制后的庫文件需進一步增加權限,其指令為“chmod a+r /usr/local/cuda/include/cudnn.h /usr/local/cuda/lib64/libcudnn*”。
剩下三個Deb文件(cuDNN Runtime Library for Ubuntu18.04(Deb)、cuDNN Developer Library for Ubuntu18.04(Deb)、cuDNN Code Samples and User Guide for Ubuntu18.04(Deb))采用dpkg命令進行安裝,分別輸入指令“dpkg -i libcudnn8_8.2.0.53-1+cuda11.3_amd64.deb”、“dpkg -i libcudnn8-dev_8.2.0.53-1+cuda11.3_amd64.deb ”和“dpkg -i libcudnn8-samples_8.2.0.53-1+cuda11.3_amd64.deb”。
如果報如下不是軟連接(not a symbolic link)的錯,那么通過ln -sf命令逐一創建軟連接即可。
/sbin/ldconfig.real: /usr/local/cuda-11.3/targets/x86_64-linux/lib/libcudnn_adv_train.so.8 is not a symbolic link /sbin/ldconfig.real: /usr/local/cuda-11.3/targets/x86_64-linux/lib/libcudnn_cnn_infer.so.8 is not a symbolic link /sbin/ldconfig.real: /usr/local/cuda-11.3/targets/x86_64-linux/lib/libcudnn.so.8 is not a symbolic link /sbin/ldconfig.real: /usr/local/cuda-11.3/targets/x86_64-linux/lib/libcudnn_ops_train.so.8 is not a symbolic link /sbin/ldconfig.real: /usr/local/cuda-11.3/targets/x86_64-linux/lib/libcudnn_ops_infer.so.8 is not a symbolic link /sbin/ldconfig.real: /usr/local/cuda-11.3/targets/x86_64-linux/lib/libcudnn_cnn_train.so.8 is not a symbolic link /sbin/ldconfig.real: /usr/local/cuda-11.3/targets/x86_64-linux/lib/libcudnn_adv_infer.so.8 is not a symbolic link
解決方案如下:
ln -sf /usr/local/cuda-11.3/targets/x86_64-linux/lib/libcudnn_adv_train.so.8.2.0 /usr/local/cuda-11.3/targets/x86_64-linux/lib/libcudnn_adv_train.so.8 ln -sf /usr/local/cuda-11.3/targets/x86_64-linux/lib/libcudnn_cnn_infer.so.8.2.0 /usr/local/cuda-11.3/targets/x86_64-linux/lib/libcudnn_cnn_infer.so.8 ln -sf /usr/local/cuda-11.3/targets/x86_64-linux/lib/libcudnn.so.8.2.0 /usr/local/cuda-11.3/targets/x86_64-linux/lib/libcudnn.so.8 ln -sf /usr/local/cuda-11.3/targets/x86_64-linux/lib/libcudnn_ops_train.so.8.2.0 /usr/local/cuda-11.3/targets/x86_64-linux/lib/libcudnn_ops_train.so.8 ln -sf /usr/local/cuda-11.3/targets/x86_64-linux/lib/libcudnn_ops_infer.so.8.2.0 /usr/local/cuda-11.3/targets/x86_64-linux/lib/libcudnn_ops_infer.so.8 ln -sf /usr/local/cuda-11.3/targets/x86_64-linux/lib/libcudnn_cnn_train.so.8.2.0 /usr/local/cuda-11.3/targets/x86_64-linux/lib/libcudnn_cnn_train.so.8 ln -sf /usr/local/cuda-11.3/targets/x86_64-linux/lib/libcudnn_adv_infer.so.8.2.0 /usr/local/cuda-11.3/targets/x86_64-linux/lib/libcudnn_adv_infer.so.8
4.3 cuDNN安裝驗證
經過以上步驟,cuDNN相關文件已經全部完成安裝,在命令行分別輸入如下內容驗證cuDNN是否安裝成功。
(1)cd /usr/src/cudnn_samples_v8/mnistCUDNN/
(2)make clean && make
(3)./mnistCUDNN
運行上述命令后,終端界面會有如下輸出。如果終端界面最后輸出“Test passed”,則表示cuDNN套件已經成功安裝。
如果提示如下錯誤,那么解決方法為“apt-get install libfreeimage3 libfreeimage-dev -y”。
rm -rf *orm -rf *o rm -rf mnistCUDNN CUDA_VERSION is 11030 Linking agains cublasLt = true CUDA VERSION: 11030 TARGET ARCH: x86_64 HOST_ARCH: x86_64 TARGET OS: linux SMS: 35 50 53 60 61 62 70 72 75 80 86 test.c:1:10: fatal error: FreeImage.h: No such file or directory #include "FreeImage.h" ^~~~~~~~~~~~~ compilation terminated. >>> WARNING - FreeImage is not set up correctly. Please ensure FreeImage is set up correctly.
5 conda Python環境安裝
5.1 Python Miniconda安裝
Python環境可以通過conda進行管理,相應的安裝軟件有Anaconda和Miniconda。相比之下,Miniconda是一款小巧的Python環境管理工具,安裝包大約只有50MB。就管理Python環境而言,Miniconda和Anaconda的使用方式幾乎沒有任何區別。Miniconda安裝文件的下載地址為“https://docs.conda.io/en/latest/miniconda.html”。
這里選擇python 3.8版本,wget下載方式為“wget https://repo.anaconda.com/miniconda/Miniconda3-py38_23.1.0-1-Linux-x86_64.sh”。安裝步驟如下,安裝過程需要選擇“yes or no”的地方均輸入“yes”。
bash Miniconda3-py38_23.1.0-1-Linux-x86_64.sh source ~/.bashrc
5.2 conda使用
(1)查看安裝包:conda list
(2)查看虛擬環境:conda env list
(3)創建虛擬環境:conda create -n env_name python=3.9
(4)安裝包:conda install -n env_name [package]
(5)激活環境:conda activate env_name
5.3 jupyter notebook 安裝
jupyter notebook是一種基于web的Python開發環境,可通過默認可“IP:8888”或“127.0.0.1:8888”或“localhost:8888”。如果docker創建時指定了主機端口映射,如“-p 1088:8888”,那么可將端口號替換成1088進行訪問。主機允許端口號防火墻的命令為“sudo ufw allow端口號”。安裝步驟及配置過程如下:
(1) 安裝命令為“conda install jupyter notebook”。
(2) 生成配置文件,jupyter notebook –generate-config,運行該命令后會在根目錄下生成配置文件,如“/root/.jupyter/jupyter_notebook_config.py”。修改配置文件中如下內容。端口號也可以在配置文件中進行修改。
c.NotebookApp.allow_remote_access = True c.NotebookApp.allow_root = True c.NotebookApp.ip = '0.0.0.0'
(3)設置登錄密碼,jupyter notebook password。
(4)運行命令為“jupyter notebook”,但是關閉終端時會中斷運行,可以采用nohup命令來保持運行,即“nohup jupyter notebook &”。
6 ssh服務安裝與配置
以上docker 容器是通過命令“docker exec -it containerID /bin/bash”進入的,配置ssh服務后,docker也可以通過ssh直接遠程訪問。
- 安裝ssh服務:apt-get update,apt-get install ssh -y。
- 啟動服務:service ssh start。
- 關閉服務:service ssh stop。
- 注意事項:將/etc/ssh/sshd_config文件中PermitRootLogin 設為yes,否則有可能出現權限問題。
- 重啟服務:service ssh restart。
- 查看服務是否正常運行:service ssh status。
- 為系統設置密碼,命令為“passwd”。
這樣就可以通過ssh訪問docker了,如果docker創建時設置了1022端口映射,那么即可通過該端口進行ssh連接。
7 全部命令
docker pull ubuntu:18.04 docker run -d -it -p 1088:8888 -p 1022:22 -p 1059:5900 -v /server/data:/docker/data --gpus all --shm-size="32g" ubuntu:18.04 /bin/bash docker exec -it containerID /bin/bash apt-get update apt-get install ssh vim gcc cmake build-essential -y wget https://developer.download.nvidia.com/compute/cuda/11.3.0/local_installers/cuda_11.3.0_465.19.01_linux.run sh cuda_11.3.0_465.19.01_linux.run export CUDA_HOME=/usr/local/cuda export PATH=/usr/local/cuda-11.3/bin:$PATH export LD_LIBRARY_PATH=/usr/lcoal/cuda-11.3/lib64:$LD_LIBRARY_PATH source ~/.bashrc nvcc -V cd /usr/local/cuda/samples/1_Utilities/deviceQuery make ./deviceQuery tar -zxvf cudnn-11.3-linux-x64-v8.2.0.53.tgz cp cuda/include/cudnn.h /usr/local/cuda/include/ cp cuda/lib64/libcudnn* /usr/local/cuda/lib64/ chmod a+r /usr/local/cuda/include/cudnn.h /usr/local/cuda/lib64/libcudnn* ln -sf /usr/local/cuda-11.3/targets/x86_64-linux/lib/libcudnn_adv_train.so.8.2.0 /usr/local/cuda-11.3/targets/x86_64-linux/lib/libcudnn_adv_train.so.8 ln -sf /usr/local/cuda-11.3/targets/x86_64-linux/lib/libcudnn_cnn_infer.so.8.2.0 /usr/local/cuda-11.3/targets/x86_64-linux/lib/libcudnn_cnn_infer.so.8 ln -sf /usr/local/cuda-11.3/targets/x86_64-linux/lib/libcudnn.so.8.2.0 /usr/local/cuda-11.3/targets/x86_64-linux/lib/libcudnn.so.8 ln -sf /usr/local/cuda-11.3/targets/x86_64-linux/lib/libcudnn_ops_train.so.8.2.0 /usr/local/cuda-11.3/targets/x86_64-linux/lib/libcudnn_ops_train.so.8 ln -sf /usr/local/cuda-11.3/targets/x86_64-linux/lib/libcudnn_ops_infer.so.8.2.0 /usr/local/cuda-11.3/targets/x86_64-linux/lib/libcudnn_ops_infer.so.8 ln -sf /usr/local/cuda-11.3/targets/x86_64-linux/lib/libcudnn_cnn_train.so.8.2.0 /usr/local/cuda-11.3/targets/x86_64-linux/lib/libcudnn_cnn_train.so.8 ln -sf /usr/local/cuda-11.3/targets/x86_64-linux/lib/libcudnn_adv_infer.so.8.2.0 /usr/local/cuda-11.3/targets/x86_64-linux/lib/libcudnn_adv_infer.so.8 dpkg -i libcudnn8_8.2.0.53-1+cuda11.3_amd64.deb dpkg -i libcudnn8-dev_8.2.0.53-1+cuda11.3_amd64.deb dpkg -i libcudnn8-samples_8.2.0.53-1+cuda11.3_amd64.deb apt-get install libfreeimage3 libfreeimage-dev -y cd /usr/src/cudnn_samples_v8/mnistCUDNN/ make clean && make ./mnistCUDNN wget https://repo.anaconda.com/miniconda/Miniconda3-py38_23.1.0-1-Linux-x86_64.sh bash Miniconda3-py38_23.1.0-1-Linux-x86_64.sh source ~/.bashrc conda install jupyter notebook jupyter notebook --generate-config vi /root/.jupyter/jupyter_notebook_config.py c.NotebookApp.allow_remote_access = True c.NotebookApp.allow_root = True c.NotebookApp.ip = '0.0.0.0' jupyter notebook password nohup jupyter notebook & apt-get update apt-get install ssh -y service ssh start service ssh stop vi /etc/ssh/sshd_config PermitRootLogin yes service ssh restart service ssh status passwd