内网环境下ubuntu 20.04搭建深度学习环境总结

2025年9月更新,随着人工智能的发展,现在深度学习环境配置越来越简单了,常用的pytorch、paddle(3.x)等深度学习库安装的时候自带了cuda和cudnn的python包,不需要在操作系统层面自己安装,配置环境方便快捷。

2024年1月9日更新,如果当服务器用,不建议安装图形界面,稳定性堪忧,每次操作系统卡死后本人需要到另一栋楼手动重启,如果用作桌面系统倒是无所谓。

后来本人禁用了图形界面。

bash 复制代码
# 多用户模式
systemctl set-default multi-user.target
# 图形界面
systemctl set-default graphical.target

2023年8月16日更新,经历环境配置、维护的痛苦才知道docker有多香,建议测试开发使用docker完成,在深度学习这一块,docker可以打包任意版本的cuda和cudnn镜像,各种包版本都可以在容器中操作。宿主机上只需要安装nvidia驱动和nvidia-container-toolkit。

Windows子系统WSL2也支持CUDA了,可以看我的另一篇文章

图形界面安装

本人内网环境PC工作站用于跑模型

图形界面安装一般不需要额外安装网卡等驱动,gcc版本默认9.4,网络可使用图形界面配置。

安装系统

本人使用的UltraSO制作系统盘,网上教程很多。

配置root用户登录

配置root用户方便操作,但是最高权限也可能导致一些问题,按需配置。

  • 最小化安装下,创建系统时的用户登录后,直接为root设置密码后root可正常登录。
  • 图形界面下,需要以下几步
    1. 为root设置密码

      sudo passwd root

    2. 修改/etc/gdm3/custom.conf,在[daemon]配置项下添加

      AllowRoot=true

    3. 修改/etc/pam.d/gdm-password,注释掉该行

      auth required pam_succeed_if.so user != root quiet_success

    4. 重启

参考ubuntu20.04图形界面允许root登录

更换apt源

相比以前,最近安装ubuntu默认的源已经不慢了,按需替换apt源,如果是在内网,则必做此步。

shell 复制代码
cp /etc/apt/sources.list /etc/apt/sources.list.bak
# 按照sources.list内容和目标源更改即可
sed -i 's/cn.archive.ubuntu.com\/ubuntu/10.160.8.81:8081\/repository\/ubuntu-aliyun/g' /etc/apt/sources.list

更新软件

默认情况下,ubuntu20.04 Linux内核是5.15.0-76,截至2023年8月15日,更新后内核为5.15.0-79

shell 复制代码
apt-get update
apt-get upgrade

安装Nvidia-driver、CUDA、CUDNN

本人首次配置踩了各种坑,包括系统、驱动等,个人踩过太多的坑,网上许多博客只能参考,每个人的情况都不一样,最靠谱的还是官方文档,这里贴出官方的安装教程。

Nvidia-driver和CUDA官方安装教程
cuDNN官方安装教程

有两种两种方式,特定发行的软件包(deb和rpm)和独立的软件包(runfile),rufile方式自带了各种依赖,可在各种Linux发行版工作,但是容易与本地依赖包产生冲突,不太建议使用这种方式。推荐使用deb包方式,快捷简单。

注意,安装driver和安装驱动最好使用同一种方式,即都用deb包或者都是用runfile方式!

注意,安装完之后请不要随意升级或降级内核版本!

nvidia驱动程序需要内核头文件和开发包,并且一旦内核版本改变,驱动程序也需要重新编译安装。Runfile安装方式不对内核相关包做任何检验,但是RPM和DEB包则会检验,如果没有内核相关包,安装程序将自动安装这些包的最新版本,可能不匹配当前内核。因此,最好在安装驱动程序和CUDA之前,安装内核相关包的正确版本,否则可能出现各种各样的问题。

安装前准备

  1. lspci | grep -i nvidia查看显卡设备,查看是否支持cuda
  2. gcc、linux内核版本等,ubuntu20.04不存在此问题
  3. 如果之前安装过,请卸载干净并重启,如何卸载请看下文。

deb包安装方式

下载自己需要的 CUDAdeb包,local或者network(内网的话下载local),然后参考下载页面的安装指示完成安装,更详细的步骤可以参考官网的安装指示

本人下载的是cuda11.8-ubuntu20.04-local,复制粘贴执行命令后cuda和driver都成功安装,driver版本是520。开发过程中更关注的是cuda版本,driver只要能驱动显卡即可,本人对驱动版本没有要求。

如果需要安装指定版本驱动

python 复制代码
# sudo apt-get install cuda-drivers-<branch>
# 安装418版本的驱动
sudo apt-get install cuda-drivers-418

需要确认本地apt添加了这个软件包,这种安装指定驱动的方式本人没有尝试过,网上也几乎没有见到过,不确定能否成功 ,更详细的指示可以参考官网
安装完记得重启,然后就可以开始添加环境变量了。

runfile安装方式

首先贴上官网链接,本人安装过程中碰到的很多问题多源于自己没有认真看官网文档,或者说懒得看英文,碰到问题没法解决了才去认真读官方文档。官网runfile安装方式,前几段话就说明了RunFile安装是通过基于交互式NCURSES的接口安装NVIDIA驱动程序和CUDA工具包,安装步骤指引、禁用Nouveau驱动、安装后的附加操作、如何卸载以及CUDA跨平台等内容,直接看官网文档可以少走很多弯路。

安装前准备

准备工作同上,默认的cuda runfile安装包带了驱动程序,能用但不是最新的。
英伟达cuda下载
英伟达显卡驱动下载,最新版驱动。

禁用Nouveau驱动

创建/etc/modprobe.d/blacklist-nouveau.conf并再末尾加入以下内容

shell 复制代码
blacklist nouveau
options nouveau modeset=0

执行命令

shell 复制代码
sudo update-initramfs -u

这样就禁用ubuntu默认的开源驱动程序了。

禁用开源Nouvea驱动后还需要一些设置并重启才能生效,本人在没看文档之前,是直接重启的,也没碰到问题。

但是按照官网的指示,禁用开源驱动Nouvea后,修改linux内核启动参数,设置runlevel为3(多用户字符界面),不加载任何图形驱动重启系统,修改/etc/default/grub,找到下面这行,末尾添加nomodeset(不加载任何图像驱动)和3(runlevel为3)。

GRUB_CMDLINE_LINUX_DEFAULT="quiet nomodeset 3"

执行

shell 复制代码
update-grub
reboot

在安装驱动的过程中如果碰到图形界面无法正常显示,开机一直黑屏的情况下,可以进入ubuntu的安全恢复模式(重启ubuntu,电脑品牌logo出现后随即长按shirft菜单,选择第二个选项 Advanced options for Ubuntu,然后进入下一个界面,选recovery mode),修改这个文件如上所示,然后update-grub并重启,即可正常开机进入字符界面,重新安装驱动。

安装驱动
shell 复制代码
sudo sh NVIDIA-Linux-x86_64-xxxxx.run

安装驱动时会有警告和几个选项

  • 如果之前安装过,会确认是否继续安装,确认
  • 是否向 kernel 注册 dkms 模块,是,防止内核更新导致驱动的重新安装
  • 是否安装32位兼容库,一般选否
  • 是否安装opengl文件,一般选否
  • xconfig,本人选的是
安装cuda

执行

shell 复制代码
sudo sh cuda_<version>_linux.run

然后弹出几个选项,可选择连带driver一起安装,也可以单独安装driver,如果在这里不选择安装驱动,请确保在这之前驱动已经安装。安装完驱动和cuda之后,还原/etc/default/grub文件,然后重启

添加环境变量

vim ~/.bashrc

shell 复制代码
export CUDA_HOME=/usr/local/cuda-11.8
export LD_LIBARAY_PATH=$CUDA_HOME/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
export PATH=$CUDA_HOME/bin${PATH:+:${PATH}}

执行source ~/.bashrc

cudnn安装

官方安装教程

下载需要的CUDNN版本,执行

shell 复制代码
apt-get install zlib1g
apt-get install ./下载的cudnn.deb文件
cp /var/cudnn-local-repo-*/cudnn-local-*-keyring.gpg /usr/share/keyrings/
apt-get update
apt search libcudnn*

会看到libcudnn,libcudnn-dev,libcudnn-samples三个包,分别是运行时库,开发库,示例和测试代码,正常情况下安装libcudnn即可。

shell 复制代码
sudo apt-get install libcudnn8=${cudnn_version}-1+${cuda_version}
sudo apt-get install libcudnn8-dev=${cudnn_version}-1+${cuda_version}
sudo apt-get install libcudnn8-samples=${cudnn_version}-1+${cuda_version}

测试安装是否成功

  • nvidia-smi查看驱动是否安装成功,显示的cuda版本表示最高支持的cuda。
  • nvcc -V查看cuda版本,下载适配版本的pytorch验证是否可调用cuda库。
  • 安装libcudnn-samples测试cudnn是否成功,如何测试请参考文档。

驱动和CUDA卸载

  • runfile安装方式
shell 复制代码
sudo /usr/local/cuda-X.Y/bin/cuda-uninstaller
sudo /usr/bin/nvidia-uninstall
  • deb包安装方式
shell 复制代码
sudo apt-get --purge remove "*cuda*" "*cublas*" "*cufft*" "*cufile*" "*curand*" \
 "*cusolver*" "*cusparse*" "*gds-tools*" "*npp*" "*nvjpeg*" "nsight*" "*nvvm*"

sudo apt-get --purge remove "*nvidia*" "libxnvctrl*"

sudo apt-get autoremove

其他

非必要,本人在此一起记录下

SSH服务,远程需要

  1. 安装ssh

    shell 复制代码
    apt-get install ssh
  2. 配置root允许登录

    shell 复制代码
    vim /etc/ssh/sshd_config
    # PermitRootLogin yes
    # 修改后重启sshd服务
  3. 设置开机自启

    shell 复制代码
    systemctl enable ssh
  4. 启动ssh服务

    powershell 复制代码
    systemctl start ssh

cuda容器运行环境,docker需要

官方安装教程

nvidia-container-toolkit用于在容器中使用NVIDIA GPU,包括一个容器运行时库和实用程序。

容器中有应用程序和cuda,通过docker和nvidia-container-toolkit与宿主机的nvidia driver联系,然后使用显卡。

这里以docker运行环境为例,安装nvidia-container-toolkit。

  1. 安装docker
  2. 安装软件源和CPG Key
shell 复制代码
distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
      && curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
      && curl -s -L https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.list | \
            sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
            sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
  1. 更新并安装
shell 复制代码
apt-get update
apt-get install -y nvidia-container-toolkit

如果是内网环境下,需要下载nvidia-container-toolkit的所有依赖拷贝到内网并apt-get install *.deb,下面是下载某包及其依赖的命令。

shell 复制代码
apt-get download $(apt-cache depends --recurse --no-recommends --no-suggests --no-conflicts --no-breaks --no-replaces --no-enhances --no-pre-depends nvidia-container-toolkit | grep -v i386 | grep "^\w")
  1. 设置docker nvidia运行时环境
  • 命令行配置
shell 复制代码
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker
  • 配置文件
    vim /etc/docker/daemon.json,添加如下内容
json 复制代码
"runtimes": {
        "nvidia": {
            "path": "/usr/bin/nvidia-container-runtime",
            "runtimeArgs": []
        }
    }

重新加载配置,重启docker

shell 复制代码
systemctl daemon-reload
systemctl restart docker
  1. 测试
shell 复制代码
# --gpus all 所有显卡可用
# --gpus device=1 第二块显卡可用
# --gpus device=0,1 第一块和第二块显卡可用
docker run --rm --runtime=nvidia --gpus all nvidia/cuda:11.8.0-runtime-ubuntu20.04 nvidia-smi

出现nvidia-smi命令的执行结果表示安装成功

  1. nvidia/cuda docker仓库
    nvidia/cuda仓库地址
    里面有各版本的已经打好的cuda和cudnn镜像,每个cuda版本对应有三种镜像
  • base
    cuda运行时环境
  • runtime
    从base打包而来,包括cuda数学库、NCCL和cudnn。一般我们拉runtime镜像即可。
  • devel
    从runtime打包而来,包括一些头文件和cuda开发工具,需要依赖做额外的开发,可以拉取这个镜像。
  1. 自己打包nvidia/cuda镜像
    克隆官方的git仓库
    到docker hub创建账户,并新建一个存储库
shell 复制代码
# 登录docker
docker login -u windcf

cd cuda
# 打包windcf/cuda:11.8.0-ubuntu20.04镜像,x86_64
# --push推送到docker hub
# --load保存为本地镜像
./build.sh -d --image-name windcf/cuda --cuda-version 11.8.0 --os ubuntu --os-version 20.04 --arch x86_64 --push

docker hub结果

编译安装指定Python版本

ubuntu20.04默认安装的python是3.8.10,如需安装其他版本,可自行下载源码编译。

如果需要安装多版本Python,可以看这里

以安装python3.10.12为例

shell 复制代码
# 安装依赖
apt update
apt install wget build-essential libreadline-dev libncursesw5-dev libssl-dev libsqlite3-dev tk-dev libgdbm-dev libc6-dev libbz2-dev libffi-dev zlib1g-dev

# python源码
wget https://www.python.org/ftp/python/3.10.12/Python-3.10.12.tgz
# 解压
tar -xzvf Python3.10.12.tgz
# 编译
cd Python-3.10.12/
./configure --prefix=/usr/local/python310 --enable-optimizations
make -j$(nproc)
# 安装
make altinstall

安装完之后python、pip等可执行程序在/usr/local/python310/bin目录下,本人没有覆盖默认的python,使用时注意路径即可。

如果需要设置为默认的python,执行

shell 复制代码
sudo update-alternatives --install /usr/bin/python3 python3 /usr/local/python310/bin/python3.10 110

sudo update-alternatives --config python3

卸载新安装的python

shell 复制代码
# 卸载
# 如果没有删除源代码目录
sudo make uninstall
# 已删除源代码目录
cd /usr/local/python310/bin && rm -f sudo rm -f 2to3 2to3-3.11 idle3 idle3.11 pip pip3 pip3.10 pip3.11 pydoc3 pydoc3.11 python3 python3.11 python3.11-config python3-config

防火墙配置

ubuntu下iptables配置的规则重启后失效,系统自带了ufw命令配置防火墙,配置命令简单易懂。

使用ufw配置后都会在iptables上体现,重启后有效。

一些心得总结

安装驱动和cuda其实挺简单的,内网可能稍微麻烦点,但本人还是碰到了各种各样的问题,安装完后PC工作站使用一段时间又会卡死,工作站又放在机房,每次重启很麻烦。找不到卡死的原因,推测是驱动的问题,又卸载重装,来来回回遇到很多问题,在这里统一记录下。

  • 关闭系统休眠
  • 关闭自动更新
  • 包冲突错误解决
    在安装各种包的过程中多次遇到版本冲突,apt install --fix-broken无法解决,所有的apt install都不执行,解决办法是使用apt下载需要的包,使用dpkg -i --force-overwrite deb_name强制覆盖安装。
  • 内网安装外网包
    有些包不在ubuntu软件源中,必须要联网下载,本人在外网电脑创建一个和内网软件环境一样的虚拟机,需要连接外网下载的包现在虚拟机中下载后拷贝到内网,主要有两种包。
    • deb包,使用上面提到的下载包及其依赖的命令在外网虚拟机下载后拷贝到内网,apt-get install *.deb
    • python包,有些包也不再pypi源,比如pytorch某些版本,某些包必须从源码编译等,外网使用pip download,拷贝到内网pip install *.whl,也可以将文件上传到内网Nexus Pypi源。
  • 官方文档

最小化安装

ubuntu server识别不到网卡

安装系统后,使用ip a命令发现只有lo本地回环,识别不到网卡,网上搜了挺久并不能解决问题。

猜测应该是缺了网卡驱动,毕竟网卡较新而操作系统较老且是最小化安装,可能并没有带驱动,需要自己下载安装。

lspci查看自己的网卡,结合主板等信息去外网下载对应驱动,拷贝到内网中。本人下载的是RTL8125,安装驱动需要gcc、make等依赖,最小化安装这些都是没有的,需要手动离线安装。

ubuntu server离线安装gcc等依赖

手动下载了ubuntu server离线gcc、make等及其依赖,链接如下

链接:https://pan.baidu.com/s/1sK73grxfqokv0hADUS0DWg?pwd=dqz8

提取码:dqz8

解压后直接dpkg -i *.deb即可,默认ubuntu上好像没unzip命令。

记录一下直接下载某包及其依赖的命令

shell 复制代码
apt-get download $(apt-cache depends --recurse --no-recommends --no-suggests --no-conflicts --no-breaks --no-replaces --no-enhances --no-pre-depends libasan5:amd64 | grep -v i386 | grep "^\w")

ubuntu server配置网络

如果安装的是桌面版,可以选择图形化界面配置。

20.04最小化版本配置网络已不再/etc/network/interface中,而在/etc/netplan/xxxx.yaml中,以下是一个配置示例,ipv6相关配置改4为6即可。

yaml 复制代码
# This is the network config written by 'subiquity'
network:
  ethernets:
    ens32:
      dhcp4: no
      addresses: [192.168.8.6/24]
      optional: true
      gateway4: 192.168.8.2
      nameservers:
        addresses: [192.168.8.2]
  version: 2
  renderer: networkd

参考

Ubuntu20.04下CUDA、cuDNN的详细安装与配置过程

相关推荐
独断万古他化20 小时前
Docker 入门前置:容器虚拟化基础之 cgroups 资源控制与 LXC 容器
linux·docker·容器
Trouvaille ~20 小时前
【Linux】进程间通信(三):共享内存深度剖析与System V IPC机制
linux·c++·操作系统·管道·进程间通信·信号量·system v
llilian_1620 小时前
NTP时间同步服务器 卫星时钟同步服务器在气象监测方向的深度应用 授时服务器
服务器·功能测试·单片机·嵌入式硬件·测试工具
不怕犯错,就怕不做20 小时前
Linux内核默认允许多个进程打开同一字符设备
linux·驱动开发·嵌入式硬件
龙域集团21 小时前
使用最新宝塔面板安装青龙面板(Docker 版)
服务器·docker·容器
va学弟21 小时前
网络编程核心基础
运维·服务器·网络
热心市民R先生21 小时前
对象字典(OD)、服务数据对象(SDO)、过程数据对象(PDO)(三)
服务器·信息与通信
Source.Liu21 小时前
【Ubuntu】关机重启命令
linux·运维·ubuntu
iCode50421 小时前
CentOS Stream 9修改静态IP
linux·tcp/ip·centos
不怕犯错,就怕不做21 小时前
RK3562+RK817在关机状态下提升充电电流至2A解决方案
linux·驱动开发·嵌入式硬件