本文地址: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
EOFsystemctl 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 FabricFabricState : CompletedStatus : 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/cloudmsys2: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloudbioconda: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloudmenpo: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloudpytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloudpytorch-lts: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloudsimpleitk: https://mirrors.tuna.tsinghua.edu.cn/anaconda/clouddeepmodeling: 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 鏡像使用幫助 - 清華大學開源軟件鏡像站