從零開始實踐大模型 - 配置環境

LucienShui發表於2024-07-06

本文地址:blog.lucien.ink/archives/549

本文將介紹在面向深度學習時,推薦的環境配置以及一些使用 Linux 的習慣。

本文的部分內容與 Debian 下 CUDA 生產環境配置筆記 有所重疊,但也有些許的不一樣,在正文中不額外註明。

前言

本文將主要分 4 部分:

  1. 配置 SSH 登陸
  2. 安裝顯示卡驅動
  3. 安裝 Docker 並配置“Docker 顯示卡驅動”
  4. 切換至普通使用者並安裝 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 個解決方案:

  1. 先臨時開啟 PermitRootLogin yes,用 ssh 拷過去後再關掉
  2. 本地在 ~/.ssh 目錄下用 python3 -m http.server 3000 起一個 HTTP 檔案服務,然後去伺服器上執行 wget
  3. 使用 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 SXMA100 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-1550.54.15-1550.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())'

尾聲

建議

在這裡再多囉嗦幾句,希望能讓後輩們少走些彎路:

  1. 任何行為,不論是安裝軟體、配環境、寫程式碼還是一些系統操作,都應該將影響降低至 最小範圍。比如將 nvcc、gcc 裝至使用者、環境級別而不是直接用 root 安裝。
  2. 除了本章節的內容,在任何情況下,都不建議直接使用 root 賬戶進行操作,除非讀者是一位對 Linux 非常熟悉的專家並且明白自己在做什麼,否則會面臨各種潛在的許可權問題、崩潰、挖礦病毒、資料丟失等風險。
  3. 在任何情況下,都不應該操作 Linux 本身的 Python 環境,請使用 venv 或 conda
  4. 在任何情況下,都不應該隨意變更宿主機的 CUDA 版本,請使用 docker
  5. 不建議在宿主機中安裝 nvcc、TensoRT 等內容,據筆者觀察,至少 90% 的使用者他們並不明白自己在做什麼,所以 請使用 conda 或 docker

備忘

  1. 安裝 cudnn

    conda install conda-forge::cudnn
    
  2. 安裝 nvcc

    conda install nvidia::cuda-nvcc
    
  3. 安裝 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 映象使用幫助 - 清華大學開源軟體映象站

相關文章