Debian 基础环境配置

深度学习的基础环境为显卡驱动CUDAcudnn.
其中显卡驱动是正常调用显卡设备所必须的, CUDA是用来将代码编译成显卡能执行程序的编译器, cudnn是针对深度学习卷积等操作优化的库

显卡驱动安装

显卡驱动最好安装最新版本

停止内核更新

为防止内核升级导致环境全崩, 需要先禁用内核更新

# 查看系统内核版本
sudo dpkg --get-selections | grep linux
## ...
## linux-headers-6.1.0-29-amd64                    hold
## linux-headers-6.1.0-29-common                   hold
## ...
## linux-image-6.1.0-29-amd64                      hold
## ...

# 保持内核版本, 不更新, 需要根据上条结果修改为指定版本
sudo apt-mark hold linux-headers-6.1.0-29-amd64  \
                   linux-headers-6.1.0-29-common \
                   linux-image-6.1.0-29-amd64 

显卡驱动安装程序

前往官网下载显卡驱动安装程序 (需要根据自己的显卡型号及系统和架构选择对应显卡驱动安装程序)

# 我的显卡为 GeForce RTX 3070 Laptop, 下载的驱动名称可能不一样
## 给予安装程序运行权限
chmod u+x NVIDIA-Linux-x86_64-550.144.03.run
## 以管理员身份运行安装程序
sudo NVIDIA-Linux-x86_64-550.144.03.run

# 在解决下述问题安装完毕后重启系统, 再次运行驱动安装程序
sudo NVIDIA-Linux-x86_64-550.144.03.run

安装过程中出现的问题

Check that you have pkg-config and the libglvnd development libraries installed,
# 安装相关包
sudo apt install build-essential libglvnd-dev pkg-config

Unable to find a suitable destination to install 32-bit compatibility
# 添加i386架构进库
sudo dpkg --add-architecture i386
# 更新库
sudo apt update
# 安装libglvnd库
sudo apt install libc6:i386

ERROR: Failed to rebuild the initramfs!
# 我使用的是Debian12, initramfs已安装在/sbin下, 但/sbin未加入PATH中
# 将/sbin加入PATH中即可解决问题
sudo echo 'export PATH="/sbin:$PATH"' >> /etc/bash.bashrc

测试安装是否成功

命令行中进行测试, 能正常输出显卡信息即为成功

nvidia-smi

CUDA与cudnn安装

CUDA类似于编译器一样, 可以视为一个程序, 所以不一定非要用root权限安装在全局下, 完全可以每个用户安装自己对应的CUDA版本, 甚至可以将显卡映射给Docker, 然后直接调用别人安装好一切基础环境的镜像


根据nvidia-smi命令获取到驱动版本, 前往官网根据系统及驱动版本下载CUDA, 如果是非root用户安装需要选择runfile, 我就直接装deb版算了

官方给的我驱动对应命令

# Base Installer    
# Installation Instructions:

wget https://developer.download.nvidia.com/compute/cuda/12.4.0/local_installers/cuda-repo-debian12-12-4-local_12.4.0-550.54.14-1_amd64.deb
sudo dpkg -i cuda-repo-debian12-12-4-local_12.4.0-550.54.14-1_amd64.deb
sudo cp /var/cuda-repo-debian12-12-4-local/cuda-*-keyring.gpg /usr/share/keyrings/
sudo add-apt-repository contrib
sudo apt-get update
sudo apt-get -y install cuda-toolkit-12-4

CUDA安装默认位置在/usr/local/cuda-12.4/下, 同时会创建软链接(类似快捷方式), 将/usr/local/cuda/链接向/usr/local/cuda-12.4/
将下面内容加入~/.bashrc中, 注意, 如果runfile安装的要替换下面路径为对应的安装目录

# cuda env
export CUDA_HOME=$CUDA_HOME:/usr/local/cuda-12.4
export PATH=$PATH:/usr/local/cuda-12.4/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda-12.4/lib64

前往官网, 根据CUDA版本选择对应的cuDNN库下载
选择Local Installer for Linux x86_64 (Tar)

# 解压cuDNN文件
tar -xvf cudnn-linux-x86_64-8.9.7.29_cuda12-archive.tar.xz
# 将cuDNN下的部分文件替换至CUDA安装目录中, 注意, 此处使用的是deb安装, 如果runfile装的要解压到对应的安装目录
cd cudnn-linux-x86_64-8.9.7.29_cuda12-archive
sudo cp lib/* /usr/local/cuda-12.4/lib64/
sudo cp include/* /usr/local/cuda-12.4/include/
sudo chmod a+r /usr/local/cuda-12.4/lib64/*
sudo chmod a+r /usr/local/cuda-12.4/*

测试安装是否成功

# CUDA
nvcc -V
# cuDNN
cat /usr/local/cuda/include/cudnn_version.h | grep CUDNN_MAJOR -A 2
参考:
在 Debian 12 上安装 Nvidia 显卡驱动程序
Debian 12安装Nvidia显卡驱动


英伟达的Docker相关仓库

# ubuntu一键安装, 连arm版的都编译了, 直接狠狠省心
sudo docker pull nvidia/cuda:12.4.1-cudnn-devel-ubuntu20.04
# 调用镜像的时候记得给gpu, 然后就完事了
sudo docker run --gpu=all --name cuda-env

测试安装是否成功

# CUDA
sudo docker exec -it cuda-env nvcc -V
# cudnn不会测, 还得摸摸Docker

Python环境管理

环境管理大多数都用的anacondamamba两种, 当然, 如果是用Docker里边的环境就爱莫能助了, 暂时还没发现能管理镜像里边深度学习环境的

前往官网下载安装包

# 下载文件
wget https://repo.anaconda.com/archive/Anaconda3-2024.10-1-Linux-x86_64.sh
# 给予运行权限
chmod u+x Anaconda3-2024.10-1-Linux-x86_64.sh
# 运行
./Anaconda3-2024.10-1-Linux-x86_64.sh

Anaconda基础命令

# 查询环境
## 查看所有环境
conda info -e 
conda env list 

## 查看环境目录
conda config --show envs_dirs

## 查看环境中包的安装记录
conda list --revision

# 进入&退出 环境
## 进入虚拟环境
conda activate ENV_NAME
## 退出虚拟环境, 返回base
conda deactivate 

# 新建 环境
## 新建虚拟环境
conda create -n ENV_NAME python=版本 -y
## 指定创建环境位置
conda create --prefix=/usr/local/anaconda3/envs/ENV_NAME python=版本 -y

## 复制环境
conda create --clone 被复制环境 --name 新复制环境

## 添加新的环境目录
conda config --append envs_dirs NEW_ENV_PATH

# 删除 环境
## 删除虚拟环境
conda remove -n ENV_NAME --all
## 删除环境中的某个包
conda remove -n ENV_NAME PACKAGE_NAME

## 删除环境路径
conda config --remove envs_dirs OLD_ENV_PATH

## 滚回之前版本?
conda install --revision N
## conda env update -p /home/user/anaconda_envs/myenv --name myenv

前往官网下载
当然, 我使用的是Micromamba, 类似于miniconda

# 一键安装
"${SHELL}" <(curl -L micro.mamba.pm/install.sh)

mambaanaconda支持的命令大多都是相同格式, 所以在~/.bashrc里边直接加上alias conda=micromamba, 记得修改完后source ~/.bashrc!
测试发现conda里边的复制环境貌似在mamba里边不起作用?也可能是命令格式改了

conda基础命令

# 查询环境
## 查看所有环境
conda info -e 
conda env list 

## 查看环境目录
conda config --show envs_dirs

## 查看环境中包的安装记录
conda list --revision

# 进入&退出 环境
## 进入虚拟环境
conda activate ENV_NAME
## 退出虚拟环境, 返回base
conda deactivate 

# 新建 环境
## 新建虚拟环境
conda create -n ENV_NAME python=版本 -y
## 指定创建环境位置
conda create --prefix=/usr/local/anaconda3/envs/ENV_NAME python=版本 -y

## 复制环境
conda create --clone 被复制环境 --name 新复制环境

## 添加新的环境目录
conda config --append envs_dirs NEW_ENV_PATH

# 删除 环境
## 删除虚拟环境
conda remove -n ENV_NAME --all
## 删除环境中的某个包
conda remove -n ENV_NAME PACKAGE_NAME

## 删除环境路径
conda config --remove envs_dirs OLD_ENV_PATH

## 滚回之前版本?
conda install --revision N
## conda env update -p /home/user/anaconda_envs/myenv --name myenv

代码编辑器配置

无非就是写代码的工具, vscode好在能个性化配置但配置麻烦且访问方式较为繁琐, jupyter好在浏览器访问, 无论什么设备只要有浏览器均能快速访问, 但个性化配置较少, 需要自己手动去安装插件
其实还有code-server解决方案, vscode的web版, 一次配置完就能一直到处用了
注意!!!, .ipynb文件不支持子进程创建貌似, 多进程会出问题

jupyterjupyter labjupyter notebook两个项目, 其中lab是对notebook的升级, 兼容了notebook的所有功能, 所以优先推荐lab安装, 至于notebook也会放在下面, 毕竟每一代人都有自己的win7是吧

Jupyter-Lab

Jupyter-Lab安装

pip install jupyterlab

Jupyter-Lab配置

# 生成配置文件, 配置文件默认存放在~/.jupyter/jupyter_server_config.py下
jupyter server --generate-config

# 修改配置文件
vim ~/.jupyter/jupyter_server_config.py
## 向文件末尾添加以下配置
c.ServerApp.ip = '*'     # 允许登录jupyter的ip范围
c.ServerApp.port = 10000 # jupyter监听的端口
c.ServerApp.browser = 'True' # 是否自动打开浏览器
c.ServerApp.password = ''    # 设置jupyter的密码, 不起作用
c.ServerApp.root_dir = ''    # 指定jupyter的工作目录, 
                             # 若不写绝对路径的话, 会将其与当前路径拼接
                          
# 设置jupyter访问密码
jupyter server password

Jupyter-Lab启动

# linux下, 如果不是root用户的话不用加上后面那句
jupyter lab --allow-root

Jupyter-Lab 插件

# 中文支持
pip install jupyterlab-language-pack-zh-CN # -i https://pypi.tuna.tsinghua.edu.cn/simple

# gpu监控, 但貌似没用??? https://github.com/run-ai/jupyterlab_genv
pip install jupyterlab_genv

# drawio
pip install jupyterlab-drawio

# 代码折叠
## 进入 设置 -> 高级设置编辑器 -> 笔记本 -> Code Folding勾选

JupyterNotebook配置

老东西, 爆点金币呗(

Jupyter-Notebook

Jupyter-Notebook安装

# 安装jupyter notebook
conda install jupyter notebook -y
# 更新jupyter notebook(未做尝试)
conda update jupyter notebook

Jupyter-Notebook配置

# 生成jupyter notebook配置文件
jupyter notebook --generate-config
# 导入notebook包来设置密码设置密码
python

from notebook.auth import passwd
passwd()
# input:  jetson_nx_1
# output: 'argon2:$argon2id$v=19$m=10240,t=10,p=8$Qw4Hct7y+9XCaH/YrZ8iWA$dPMdMqB5UDpeLB61a08RqE5TMEbAJX9b6J24DiMp7Cg'

# 设置密码
jupyter notebook password
# 修改文件
vim ~/.jupyter/jupyter_notebook_config.py
    c.NotebookApp.ip='*'
    c.NotebookApp.password='刚刚python中的输入密码返回的argon一长串' 
    c.NotebookApp.open_browser=False
    c.NotebookApp.port=随便写一个能用的端口

Jupyter-Notebook 插件

# 忘了, 好像是官方的插件库
pip install jupyter_contrib_nbextensions -i https://pypi.tuna.tsinghua.edu.cn/simple
jupyter contrib nbextension install --user
pip install jupyter_nbextensions_configurator -i https://pypi.tuna.tsinghua.edu.cn/simple

# Scratchpad: 窗口分面
# Highlighter: Markdown文本高亮
# Highlight selected word: 选中文本高亮
# Codefolding: 代码折叠
# Code Font Size: 字体大小调整
# Code prettify: 代码格式标准化
# Select CodeMirror Keymap: 选择代码编辑模式
# Variable Inspector: 变量可视化
# Toggle all line numbers: 标出行数

Jupyter内核管理

# 查找当前环境是否有jupyter内核包
python -m ipykernel --version
# 安装jupyter内核包
python -m pip install ipykernel #-i https://pypi.tuna.tsinghua.edu.cn/simple
# 添加kernel
python -m ipykernel install --user --name Env-name --display-name "Show-name"
# 查看已有kernel
jupyter kernelspec list
# 删除不想要的kernel:
jupyter kernelspec uninstall unwanted-kernel

vscode用的少, 下个python插件就行了, 要跑啥命令搁命令行敲呗

部分环境安装踩坑

NCCL安装

NCCL(NVIDA Collective Communications Library)是由 NVIDIA 开发的一种高性能的多 GPU 通信库, 用于在多个 NVIDIA GPU 之间实现快速的数据传输和协同计算, 目的是为了实现Multi-GPUMulti-node之间的通信, 说白了就是多机多卡并行, 不支持Windows
有两种安装方式, 一是具有root权限的安装, 二是不具有root权限的安装配置

其实还可以直接拉人家构建好的Docker镜像用, 具体自行去Docker Hub上找吧

非root用户安装配置NCCL

多数情况下都不具有root权限, 最好将NCCL配置在个人账号下, 方法就是从源码进行编译安装

# 拉取NCCL源码, 也可去相关链接查看官方文档
git clone https://github.com/NVIDIA/nccl.git

# 进行编译
cd nccl
make -j12 src.build BUILDDIR=/home/why/.nccl CUDA_HOME=/usr/local/cuda-12.4 NVCC_GENCODE="-gencode=arch=compute_35,code=sm_35"
## -j12表示使用12个核心, nproc查看总核心数
## BUILDDIR表示编译后,文件的存储路径, 默认是nccl/build
## CUDA_HOME表示CUDA的目录, 默认是/usr/local/cuda
## NVCC_GENCODE, 如果不添加该字段, 默认会编译支持所有架构, 为了加速编译以及降低二进制文件大小, 添加该字段
##    具体comute_35,sm_35是应该是和显卡算力相匹配,具体见:https://developer.nvidia.com/cuda-gpus

最后将其添加到环境变量中

vim ~/.bashrc

# 记得替换为自己的安装路径
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/why/.nccl/lib
export PATH=$PATH:/home/why/.nccl/bin

source~/.bashrc

检验是否安装成功

git clone https://github.com/NVIDIA/nccl-tests.git
cd nccl-tests
make -j12 CUDA_HOME=/usr/local/cuda-12.4 NCCL_HOME=/home/why/.nccl
# 需要指定CUDA_HOME和NCCL_HOME, 否则编译中找不到CUDA和NCCL会报错
./build/all_reduce_perf -b 8 -e 256M -f 2 -g <ngpus>
# 需要用机器GPU的个数替换ngpus

Horovod安装

github项目地址

安装Horovod需要安装NCCLOpenMPI, 虽然这两个依赖都装好了, 但Horovod编译死活出问题, 那就
Docker, 启动!

# Horovod提供的镜像, 有点老了, 不建议用这个
sudo docker run -it --gpus all --network=host -v /mnt/share/ssh:/root/.ssh --name horovod-latest horovod/horovod:latest

# 带pytorch的Hovorod镜像, 是的兄弟, 就用这个
sudo docker run -it --gpus all --name horovod-pythorch pytorchignite/hvd-base:latest
## 有个问题, 镜像为了精简甚至没装ssh, 即使下载了deb包离线安装也会发现缺库, apt也不管用
## 所以我的解决方法是映射一个端口, 然后安装Jupyter-Lab, 虽然抽象但能跑, 待我研究明白Hovorod该怎么玩后再补充吧

安装OpenMPI

OpenMPI是用作进程自建通信的库, 前往官网下载安装包

# 也可以wget下载
wget https://download.open-mpi.org/release/open-mpi/v5.0/openmpi-5.0.7.tar.gz

# 解压安装包
gunzip -c openmpi-5.0.7.tar.gz | tar xf -
# 进入目录
cd openmpi-5.0.7
# 配置
./configure --prefix=/usr/local
# 安装
sudo make all install

# 编写环境变量
vim /etc/profile

export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/lib"

# 运行测试
cd examples
make
mpirun -np 4 hello_c

其他问题

Debian KDE + 英伟达闭源驱动 + HDMI外接显示屏无法显示

# 创建文件
/etc/modprobe.d/nvidia.conf

# 将该内容写入文件中,
options nvidia_drm modeset=1 fbdev=1

# 安装内核编译? 重新编译内核?
sudo apt install initramfs-tools
sudo update-initramfs -u

# 重启
sudo reboot

# 若输出Y, 则代表已完成
sudo cat /sys/module/nvidia_drm/parameters/modeset
参考: archlinux KDE6 HDMI外接显示器在Wayland下无法显示
最后修改:2025 年 02 月 28 日
赛博讨口子