本文地址:blog.lucien.ink/archives/549
本文將介紹在面向深度學習時,推薦的環境配置以及一些使用 Linux 的習慣。
本文的部分內容與 Debian 下 CUDA 生產環境配置筆記 有所重疊,但也有些許的不一樣,在正文中不額外註明。
前言
本文將主要分 4 部分:
- 配置 SSH 登陸
- 安裝顯示卡驅動
- 安裝 Docker 並配置“Docker 顯示卡驅動”
- 切換至普通使用者並安裝 miniconda
配置 SSH 登陸
在安裝完系統並重啟之後,首先看到的是一個登陸介面,在這裡輸入我們在安裝階段設定好的 root 使用者及密碼即可。請注意,在輸入密碼的時候,是看不見自己輸了什麼、輸了幾個字元的。
配置使用者登陸
登陸進 root 之後,在這裡我們先什麼都不做,先配置 root 使用者的 ssh 登陸許可權。在大部分的教程中都會直接在 /etc/ssh/sshd_config
中新增一行 PermitRootLogin yes
,在這裡筆者是及其不推薦的。
對於 root 使用者來說,推薦的方式是金鑰登陸,在本地用 ssh-keygen
生成一個公私鑰對,將本地生成的 ~/.ssh/id_rsa.pub
複製至伺服器的 ~/.ssh/authorized_keys
中(如果伺服器中提示 ~/.ssh
不存在則執行 mkdir ~/.ssh
建立一個就好)。
在這裡給出簡單的命令:
mkdir -p ~/.ssh
echo 'content of your id_rsa.pub' >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
有些小夥伴會遇到如何把本地的 ~/.ssh/id_rsa.pub
弄到伺服器中的問題,在這裡提供 3 個解決方案:
- 先臨時開啟
PermitRootLogin yes
,用 ssh 拷過去後再關掉 - 本地在
~/.ssh
目錄下用python3 -m http.server 3000
起一個 HTTP 檔案服務,然後去伺服器上執行wget
- 使用 PasteMe 來傳輸,在這裡不贅述
基礎軟體
在這裡使用 TUNA 的 Debian 軟體源 作為 APT mirror:
cat << EOF > /etc/apt/sources.list
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm main contrib non-free non-free-firmware
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm-updates main contrib non-free non-free-firmware
deb https://mirrors.tuna.tsinghua.edu.cn/debian-security bookworm-security main contrib non-free non-free-firmware
EOF
apt update # 更新索引
apt install curl wget screen git -y # 常用軟體
安裝顯示卡驅動
軟體依賴
apt update
apt install linux-headers-`uname -r` build-essential # CUDA 驅動的依賴
禁用 Nouveau
這一步是必要的,因為 Nouveau 也是 NVIDIA GPU 的驅動程式,參考 nouveau - 維基百科。
cat << EOF > /etc/modprobe.d/blacklist-nouveau.conf
blacklist nouveau
options nouveau modeset=0
EOF
update-initramfs -u
reboot
下載驅動
前往 Official Drivers | NVIDIA 下載顯示卡驅動,請注意,CUDA Toolkit 不要選 Any
,否則會獲得一個十分舊的驅動,會影響 nvidia docker (CUDA >= 11.6) 的安裝。
對於大部分伺服器來說,作業系統選 Linux 64-bit
,語言推薦選 English (US)
。CUDA Toolkit 筆者在這裡選擇 12.4
版本,得到的下載連結為:NVIDIA-Linux-x86_64-550.90.07.run,下載到伺服器上即可。
在這裡我額外測試了一下,對於
Linux 64-bit
來說,不論是消費卡(RTX 4090、RTX 3090),還是面向資料中心的卡(H100、A100、V100、P4),驅動是一模一樣的。
wget 'https://us.download.nvidia.com/tesla/550.90.07/NVIDIA-Linux-x86_64-550.90.07.run'
安裝驅動
chmod +x NVIDIA-Linux-x86_64-550.90.07.run
./NVIDIA-Linux-x86_64-550.90.07.run -s --no-questions --accept-license --disable-nouveau --no-drm
在這之後,執行 nvidia-smi -L
應該能看到如下內容:
$ nvidia-smi -L
GPU 0: Tesla P4 (UUID: GPU-***)
GPU 1: Tesla P4 (UUID: GPU-***)
顯示卡常駐
nvidia-persistenced 常駐
預設情況下,nvidia-smi
執行起來會很慢,它的等待時長會隨著顯示卡數量的增加而增加。這是因為常駐模式(Persistence Mode)沒有開啟,對於伺服器來說,強烈建議開啟這一選項。
可以透過新增一個 啟動項來保持常駐模式開啟:
cat <<EOF >> /etc/systemd/system/nvidia-persistenced.service
[Unit]
Description=NVIDIA Persistence Daemon
Before=docker.service
Wants=syslog.target
[Service]
Type=forking
ExecStart=/usr/bin/nvidia-persistenced
ExecStopPost=/bin/rm -rf /var/run/nvidia-persistenced
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl start nvidia-persistenced
systemctl enable nvidia-persistenced
可以透過 nvidia-smi -q -i 0 | grep Persistence
來檢查某張顯示卡該模式的狀態。
安裝 NVSwtich 驅動
如果讀者使用的不是 SXM 的卡,請跳過這一步,如果不明白這裡是在說什麼,也可以先跳過
對於 H100 SXM
、A100 SXM
等擁有 NVSwitch
的整機來說,需要額外安裝 nvidia-fabricmanager
來啟用對 NVSwitch 的支援。
wget https://developer.download.nvidia.com/compute/cuda/repos/debian12/x86_64/nvidia-fabricmanager-550_550.90.07-1_amd64.deb
dpkg -i nvidia-fabricmanager-550_550.90.07-1_amd64.deb
請注意,這裡的 nvidia-fabricmanager
需要與 CUDA Driver 版本匹配。
透過執行 nvidia-smi -q -i 0 | grep -i -A 2 Fabric
來驗證 nvidia-fabricmanager
是否安裝成功,看到 Success
代表成功。(參考資料:fabric-manager-user-guide.pdf,第 11 頁)
$ nvidia-smi -q -i 0 | grep -i -A 2 Fabric
Fabric
State : Completed
Status : Success
特殊情況處理
筆者曾經遇到過下載的 CUDA 驅動版本並未被 APT 中的 nvidia-fabricmanager
支援的情況,比如透過執行 apt-cache madison nvidia-fabricmanager-550
可以發現,nvidia-fabricmanager-550
只支援 550.90.07-1
、550.54.15-1
、550.54.14-1
三個版本,這種時候可透過執行 ./NVIDIA-Linux-x86_64-550.90.07.run --uninstall
來解除安裝 CUDA 驅動,然後重新下載支援的驅動版本。
$ apt-cache madison nvidia-fabricmanager-550
nvidia-fabricmanager-550 | 550.90.07-1 | https://developer.download.nvidia.com/compute/cuda/repos/debian12/x86_64 Packages
nvidia-fabricmanager-550 | 550.54.15-1 | https://developer.download.nvidia.com/compute/cuda/repos/debian12/x86_64 Packages
nvidia-fabricmanager-550 | 550.54.14-1 | https://developer.download.nvidia.com/compute/cuda/repos/debian12/x86_64 Packages
安裝 Docker
Docker CE 軟體倉庫
export DOWNLOAD_URL="https://mirrors.tuna.tsinghua.edu.cn/docker-ce"
wget -O- https://get.docker.com/ | sh
在這裡需要給普通使用者執行 docker 的許可權。
# dockerd-rootless-setuptool.sh install # rootless mode
usermod -aG docker ${your username} # root mode
配置 Docker 可以呼叫顯示卡
Installing the NVIDIA Container Toolkit
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
&& curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
apt update
apt install -y nvidia-container-toolkit
nvidia-ctk runtime configure --runtime=docker # 這一步會修改 /etc/docker/daemon.json
systemctl restart docker
測試:
如果網路不通的話,在映象名前面新增
hub.uuuadc.top
以使用代理:hub.uuuadc.top/nvidia/cuda:11.6.2-base-ubuntu20.04
docker run --rm --gpus all nvidia/cuda:11.6.2-base-ubuntu20.04 nvidia-smi
如果能看到 nvidia-smi
的內容,則代表安裝成功了。
普通使用者安裝 conda 環境
在這裡我們退出 root 使用者的登入,使用密碼直接 SSH 登入普通使用者。
隨後我們從 Miniconda 下載 Miniconda: Miniconda3 Linux 64-bit
wget 'https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh'
bash Miniconda3-latest-Linux-x86_64.sh -b -p ${HOME}/.local/miniconda3
${HOME}/.local/miniconda3/bin/conda init
配置 conda 映象
Anaconda 映象使用幫助
conda config --set show_channel_urls yes
cat << EOF >> ~/.condarc
channels:
- defaults
default_channels:
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2
custom_channels:
conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
msys2: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
bioconda: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
menpo: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
pytorch-lts: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
simpleitk: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
deepmodeling: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/
EOF
配置 pypi 映象
PyPI 映象使用幫助
pip3 config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
pip3 config set global.trusted-host pypi.tuna.tsinghua.edu.cn # 當使用 http 或自簽證書時需要這個配置
驗證 Python 對 CUDA 的呼叫
在這裡筆者也不推薦直接使用 base 環境,我們新建一個環境:
conda create -n python3 python=3.12
conda config --set auto_activate_base false # 預設不啟用 base 環境
echo 'conda activate python3' >> ~/.bashrc # 預設啟用 python3 環境
重新登入後可看到 python3 已經作為預設環境了。
我們簡單下載一個 torch
來驗證環境安裝的正確性:
pip3 install torch numpy
python3 -c 'import torch; print(torch.tensor(0).cuda())'
尾聲
建議
在這裡再多囉嗦幾句,希望能讓後輩們少走些彎路:
- 任何行為,不論是安裝軟體、配環境、寫程式碼還是一些系統操作,都應該將影響降低至 最小範圍。比如將 nvcc、gcc 裝至使用者、環境級別而不是直接用 root 安裝。
- 除了本章節的內容,在任何情況下,都不建議直接使用 root 賬戶進行操作,除非讀者是一位對 Linux 非常熟悉的專家並且明白自己在做什麼,否則會面臨各種潛在的許可權問題、崩潰、挖礦病毒、資料丟失等風險。
- 在任何情況下,都不應該操作 Linux 本身的 Python 環境,請使用 venv 或 conda。
- 在任何情況下,都不應該隨意變更宿主機的 CUDA 版本,請使用 docker。
- 不建議在宿主機中安裝 nvcc、TensoRT 等內容,據筆者觀察,至少 90% 的使用者他們並不明白自己在做什麼,所以 請使用 conda 或 docker。
備忘
-
安裝 cudnn
conda install conda-forge::cudnn
-
安裝 nvcc
conda install nvidia::cuda-nvcc
-
安裝 gcc
conda install conda-forge::gcc
Reference
- Debian 下 CUDA 生產環境配置筆記
- Debian 軟體源 - 清華大學開源軟體映象站
- Debian 下 CUDA 生產環境配置筆記 - Lucien's Blog
- nouveau - 維基百科
- Official Drivers | NVIDIA
- fabric-manager-user-guide.pdf
- Download Installer for Linux Debian 12 x86_64
- nvidia-persistenced 常駐
- Docker CE 軟體倉庫 - 清華大學開源軟體映象站
- Installing the NVIDIA Container Toolkit
- Miniconda - Anaconda document
- Anaconda 映象使用幫助 - 清華大學開源軟體映象站
- PyPI 映象使用幫助 - 清華大學開源軟體映象站