☰
国产系统UOS/Deepin上PaddlePaddle深度学习环境部署实战
2026/10/21 9:45:23 网站建设 项目流程

1. 国产系统上跑深度学习,这件事到底卡在哪

在国产操作系统上折腾深度学习框架,很多人第一反应是"能跑通吗"。我前后在UOS和Deepin上部署过不下十次PaddlePaddle环境,从最开始连驱动都装不上,到后来能稳定跑通训练任务,中间踩的坑足够写一本小册子。这篇内容就是把这套流程完整拆开,讲清楚每一步为什么这么做、哪里容易出问题、怎么绕过去。

UOS和Deepin本质上都基于Debian系,包管理用apt,桌面环境是DDE,整体体验和主流Linux发行版差别不大。但问题出在深度学习这套工具链上——NVIDIA显卡驱动、CUDA、cuDNN、PaddlePaddle,这四个东西版本必须严格对齐,任何一个环节版本错位,轻则报错,重则系统进不去桌面。再加上国产系统默认内核版本和仓库源跟Ubuntu不完全一样,很多网上抄来的命令直接跑会翻车。

这篇内容适合谁看?如果你手头有一台装了UOS或Deepin的机器,显卡是NVIDIA的独立卡(比如RTX 3060、RTX 4090、A100这些),想在上面跑PaddlePaddle做训练或推理,那这篇就是给你写的。如果你只是想在CPU上跑跑推理,那更简单,但独立显卡的加速效果是CPU完全比不了的,能上显卡就上显卡。

我会从系统环境确认开始,一步步讲到驱动安装、CUDA配置、PaddlePaddle安装、环境验证,最后附上我实际遇到过的各种报错和排查方法。整个过程不需要你有多深的Linux功底,但基本的命令行操作得会。

2. 动手之前,先把系统底子摸清楚

2.1 确认系统版本和内核信息

很多人一上来就急着装驱动,结果装到一半发现系统版本对不上,又得回滚。我建议第一步先把系统信息摸清楚,花不了两分钟,但能省掉后面几个小时的折腾。

打开终端,依次执行:

cat /etc/os-release uname -r

第一条命令看系统版本,UOS一般会显示类似"UnionTech OS 20"的信息,Deepin会显示"Deepin 20.9"或"Deepin 23"这样的版本号。第二条命令看内核版本,这个很关键,因为NVIDIA驱动对内核版本有要求,太新的内核可能驱动还没适配,太旧的内核可能缺少某些模块。

我实测下来,Deepin 20.9默认内核是5.15系列,UOS 20默认内核是4.19系列,这两个版本装NVIDIA驱动都没问题。如果你的是Deepin 23,内核可能是6.1或更高,这时候要注意驱动版本的选择,建议用NVIDIA官方最新版驱动,老版本驱动可能编译不过。

提示:如果你不确定自己的系统能不能装NVIDIA驱动,可以先执行lspci | grep -i nvidia看看显卡有没有被系统识别。如果这条命令没有任何输出,说明显卡硬件层面就没被检测到,那得先检查显卡是否插好、BIOS里是否禁用了独显。

2.2 检查显卡型号和当前驱动状态

确认系统版本之后,接下来看显卡的具体型号和当前驱动情况:

lspci | grep -i vga lspci | grep -i 3d

第一条命令列出所有VGA兼容控制器,第二条列出3D控制器。NVIDIA的独立显卡通常会出现在这两条命令的输出里。记下型号,比如"GA106 [GeForce RTX 3060]",后面选驱动版本的时候要用到。

然后检查当前有没有装NVIDIA驱动:

nvidia-smi

如果这条命令报"command not found",说明驱动还没装,或者装了但没配置好。如果输出了一个表格,显示了显卡型号、驱动版本、CUDA版本等信息,那说明驱动已经装好了,你可以跳过驱动安装部分,直接看CUDA和PaddlePaddle的配置。

还有一种情况是nvidia-smi能运行但报错,比如"Failed to initialize NVML: Driver/library version mismatch",这说明驱动版本和内核模块版本不一致,通常是系统更新后内核升级了但驱动没重新编译。这种情况需要重新安装驱动,后面会讲怎么处理。

2.3 确认是否安装了开源驱动nouveau

Debian系系统默认会加载一个叫nouveau的开源NVIDIA驱动。这个驱动日常办公用没问题,但它和NVIDIA官方驱动冲突,装官方驱动之前必须把它禁用掉。

检查nouveau是否在运行:

lsmod | grep nouveau

如果有输出,说明nouveau正在运行,需要禁用它。禁用方法有两种,我推荐用黑名单的方式:

sudo tee /etc/modprobe.d/blacklist-nouveau.conf << EOF blacklist nouveau options nouveau modeset=0 EOF

然后更新initramfs并重启:

sudo update-initramfs -u sudo reboot

重启后再执行lsmod | grep nouveau,如果没有输出,说明禁用成功。

注意:有些UOS版本使用了自定义的内核,nouveau可能被编译进内核而不是作为模块加载,这种情况下lsmod看不到nouveau,但实际仍在运行。可以用dmesg | grep nouveau查看内核日志里有没有nouveau的相关信息。如果确实被编译进内核了,需要在GRUB启动参数里加nouveau.modeset=0,这个操作稍微复杂一些,后面在驱动安装部分会详细讲。

3. NVIDIA驱动安装:三种方案怎么选

3.1 方案对比:apt仓库、官方runfile、系统自带工具

在UOS和Deepin上装NVIDIA驱动,主要有三条路可走,每条路各有优劣,我先把对比列出来,你再根据自己的情况选。

方案操作难度版本可控性稳定性适用场景
apt仓库安装低一般高新手,追求省事
官方runfile中高中需要特定版本驱动
系统自带显卡管理器低低高UOS/Deepin桌面用户

apt仓库安装是最省事的,直接apt install nvidia-driver就行,系统会自动处理依赖。但问题是国产系统的仓库里驱动版本往往比较旧,可能不支持最新的显卡(比如RTX 40系列),而且CUDA版本也会受限制。

官方runfile是从NVIDIA官网下载的安装包,版本最全,从老卡到新卡都能找到对应的驱动。但runfile安装需要先禁用nouveau、关闭X服务,步骤多一些,而且每次内核升级后都需要重新编译驱动模块。

系统自带的显卡管理器是UOS和Deepin特有的,在控制中心里能找到"显卡驱动"或"附加驱动"的选项,点几下就能装好。这个方案最省心,但版本选择有限,通常只有一两个版本可选。

我个人的建议是:如果你的显卡是RTX 30系列或更老的型号,优先用apt仓库或系统自带工具,省事且稳定。如果是RTX 40系列或专业卡,建议用官方runfile,因为仓库里的驱动版本可能太旧。

3.2 apt仓库安装的完整流程

先更新软件源:

sudo apt update

然后搜索可用的NVIDIA驱动版本:

apt search nvidia-driver

你会看到类似nvidia-driver-470、nvidia-driver-515、nvidia-driver-525这样的包名,数字代表驱动版本。选一个适合你显卡的版本,比如RTX 3060用515或525都行,RTX 4090建议用525以上。

安装驱动:

sudo apt install nvidia-driver-525

安装过程中可能会提示你禁用nouveau或更新initramfs,按提示操作就行。安装完成后重启系统:

sudo reboot

重启后执行nvidia-smi,如果能看到显卡信息表格,说明驱动安装成功。

实操心得:apt安装驱动时,有时候会自动安装一堆依赖,包括nvidia-kernel-dkms。这个包的作用是在内核升级后自动重新编译驱动模块,建议保留。如果你手动卸载了它,下次内核升级后驱动可能会失效。

3.3 官方runfile安装的详细步骤

如果你的显卡比较新,或者需要特定版本的驱动,那就得用官方runfile。这个过程稍微复杂一些,但跟着步骤走不会出问题。

第一步,去NVIDIA官网下载对应你显卡的驱动runfile。文件名类似NVIDIA-Linux-x86_64-525.105.17.run。下载完成后放到用户目录下,比如~/Downloads/。

第二步,安装编译依赖:

sudo apt install build-essential gcc make linux-headers-$(uname -r)

这些是编译驱动模块必须的工具和头文件。如果linux-headers-$(uname -r)找不到,可能需要先更新内核或安装对应版本的头文件包。

第三步,禁用nouveau(如果之前没禁用的话),然后重启进入文本模式。可以在GRUB启动菜单里选择"Advanced options"然后选"Recovery mode",或者直接执行:

sudo systemctl isolate multi-user.target

这会关闭图形界面,进入纯命令行模式。

第四步,给runfile添加执行权限并运行:

chmod +x NVIDIA-Linux-x86_64-525.105.17.run sudo ./NVIDIA-Linux-x86_64-525.105.17.run

安装程序会问你几个问题,比如是否安装32位兼容库、是否更新X配置等。一般选默认就行,如果提示"nouveau正在运行",说明没禁用干净,需要回去重新禁用。

第五步,安装完成后重启:

sudo reboot

重启后执行nvidia-smi验证。

注意:runfile安装的驱动在每次内核升级后都需要重新编译。如果升级内核后nvidia-smi报错,重新运行一遍runfile安装程序即可,它会自动检测并重新编译模块。

3.4 驱动安装后的验证与常见报错

驱动装完后,nvidia-smi是最直接的验证工具。正常输出应该包含显卡型号、驱动版本、CUDA版本、显存使用情况等信息。如果报错,常见的几种情况:

报错一:NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver

这说明驱动模块没加载。先检查lsmod | grep nvidia有没有输出,如果没有,尝试手动加载:

sudo modprobe nvidia

如果加载失败,查看dmesg | tail的输出,通常会提示具体原因,比如"module verification failed"或"Unknown symbol"。

报错二:Failed to initialize NVML: Driver/library version mismatch

这是驱动版本和内核模块版本不一致导致的,通常发生在系统更新后。解决方法要么重启系统,要么卸载驱动重新安装。

报错三:No devices were found

这说明驱动加载了但没检测到显卡。检查lspci | grep -i nvidia能不能看到显卡,如果看不到,可能是硬件问题或BIOS设置问题。

4. CUDA和cuDNN:PaddlePaddle的底层依赖

4.1 CUDA版本选择与PaddlePaddle的对应关系

PaddlePaddle对CUDA版本有明确要求,装错了版本框架跑不起来。截至我写这篇内容的时候,PaddlePaddle稳定版支持的CUDA版本主要是11.2、11.6、11.7、11.8和12.0。具体哪个版本对应哪个PaddlePaddle版本,可以去PaddlePaddle官网的安装页面查,那里有个表格列得很清楚。

我一般推荐用CUDA 11.8,因为这个版本比较成熟,支持的显卡范围广,从RTX 20系列到40系列都能用,而且PaddlePaddle对它的支持也很稳定。

选CUDA版本的时候还要注意一点:CUDA版本不能高于驱动支持的版本。nvidia-smi输出右上角会显示"CUDA Version: 12.2"这样的信息,这表示你的驱动最高支持CUDA 12.2。如果你装CUDA 12.3,就会报错。所以选CUDA版本时,先看nvidia-smi里的CUDA Version,然后选一个不高于它的版本。

4.2 CUDA安装:runfile方式最可控

CUDA的安装方式也有几种,我推荐用runfile,因为最可控,不会像apt那样自动更新一堆东西。

去NVIDIA官网下载CUDA Toolkit的runfile,比如cuda_11.8.0_520.61.05_linux.run。注意文件名里的520.61.05是驱动版本,如果你已经装了更高版本的驱动,安装CUDA时可以选择不安装驱动,只装Toolkit。

安装步骤:

chmod +x cuda_11.8.0_520.61.05_linux.run sudo ./cuda_11.8.0_520.61.05_linux.run

安装程序启动后,首先会显示一个协议,输入accept继续。然后会列出可安装的组件,包括Driver、CUDA Toolkit、Samples等。如果你已经装好了驱动,把Driver那一项的勾去掉,只保留CUDA Toolkit和Samples。

安装完成后,需要配置环境变量。编辑~/.bashrc:

export PATH=/usr/local/cuda-11.8/bin:$PATH export LD_LIBRARY_PATH=/usr/local/cuda-11.8/lib64:$LD_LIBRARY_PATH

然后执行source ~/.bashrc让配置生效。验证CUDA是否安装成功:

nvcc -V

如果输出了CUDA版本信息,说明安装成功。

4.3 cuDNN的下载与配置

cuDNN是NVIDIA的深度神经网络库,PaddlePaddle依赖它来加速卷积等操作。cuDNN需要去NVIDIA开发者网站下载,需要注册账号,这里不展开说注册流程。

下载的时候要注意版本匹配:cuDNN版本必须和CUDA版本对应。比如CUDA 11.8对应的cuDNN是8.6或8.7。下载下来是一个tar包,解压后把文件复制到CUDA目录:

tar -xzvf cudnn-linux-x86_64-8.7.0.84_cuda11-archive.tar.xz sudo cp cudnn-*-archive/include/cudnn*.h /usr/local/cuda-11.8/include sudo cp cudnn-*-archive/lib/libcudnn* /usr/local/cuda-11.8/lib64 sudo chmod a+r /usr/local/cuda-11.8/include/cudnn*.h /usr/local/cuda-11.8/lib64/libcudnn*

验证cuDNN是否配置成功:

cat /usr/local/cuda-11.8/include/cudnn_version.h | grep CUDNN_MAJOR -A 2

如果输出了版本号,说明配置成功。

实操心得:cuDNN的版本号在文件名里就能看出来,比如cudnn-linux-x86_64-8.7.0.84_cuda11-archive.tar.xz,其中8.7.0.84是cuDNN版本,cuda11表示适用于CUDA 11.x。下载的时候一定要看清楚,下错了版本后面会报"libcudnn.so not found"之类的错误。

5. PaddlePaddle安装:pip和conda两条路

5.1 pip安装:最直接的方式

PaddlePaddle的安装用pip最直接。先确认Python版本,PaddlePaddle支持Python 3.7到3.11,我一般用3.9或3.10,兼容性最好。

python3 --version

如果版本不对,可以用conda创建一个指定版本的环境,或者用系统自带的Python。然后安装PaddlePaddle的GPU版本:

python3 -m pip install paddlepaddle-gpu==2.5.1 -i https://pypi.tuna.tsinghua.edu.cn/simple

这里的2.5.1是PaddlePaddle版本号,你可以换成最新的稳定版。-i参数指定了清华的镜像源,下载速度会快很多。

安装完成后,验证是否成功:

python3 -c "import paddle; paddle.utils.run_check()"

如果输出"PaddlePaddle is installed successfully!"并且显示了GPU信息,说明安装成功。

5.2 conda安装:环境隔离更干净

如果你习惯用conda管理环境,也可以用conda安装:

conda create -n paddle python=3.9 conda activate paddle conda install paddlepaddle-gpu==2.5.1 cudatoolkit=11.8 -c https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/Paddle/ -c conda-forge

conda的好处是环境隔离,不同项目的依赖不会互相干扰。但conda安装的PaddlePaddle有时候版本更新不及时,而且conda源里的CUDA Toolkit可能和系统里装的不一致,需要注意。

5.3 验证安装:跑通一个简单训练任务

装完之后别急着跑大模型,先用一个小任务验证环境是否正常。我一般用PaddlePaddle官方的一个简单线性回归示例:

import paddle import paddle.nn as nn import numpy as np # 检查GPU是否可用 print("GPU available:", paddle.is_compiled_with_cuda()) print("GPU count:", paddle.device.cuda.device_count()) # 定义一个简单模型 class LinearNet(nn.Layer): def __init__(self): super().__init__() self.fc = nn.Linear(1, 1) def forward(self, x): return self.fc(x) # 准备数据 x = np.random.rand(100, 1).astype('float32') y = 2 * x + 1 + np.random.normal(0, 0.1, (100, 1)).astype('float32') # 训练 model = LinearNet() optimizer = paddle.optimizer.SGD(learning_rate=0.1, parameters=model.parameters()) loss_fn = nn.MSELoss() for epoch in range(100): x_tensor = paddle.to_tensor(x) y_tensor = paddle.to_tensor(y) pred = model(x_tensor) loss = loss_fn(pred, y_tensor) loss.backward() optimizer.step() optimizer.clear_grad() if epoch % 20 == 0: print(f"Epoch {epoch}, Loss: {loss.numpy()[0]:.4f}") print("Training done!")

如果这段代码能跑通并且loss在下降,说明整个环境没问题。如果报错,根据错误信息排查,常见的问题后面会讲。

6. 踩坑实录:那些让我熬夜的报错

6.1 驱动相关报错速查表

报错信息原因解决方法
NVIDIA-SMI has failed驱动模块未加载sudo modprobe nvidia,失败则重装驱动
Driver/library version mismatch内核模块与驱动版本不一致重启或重装驱动
No devices were found显卡未被识别检查硬件和BIOS设置
nouveau冲突开源驱动未禁用黑名单禁用nouveau并重启
Unable to load the kernel module内核头文件缺失安装linux-headers-$(uname -r)

6.2 CUDA和cuDNN常见问题

问题一:nvcc -V报错找不到命令

这说明CUDA的bin目录没加到PATH里。检查~/.bashrc里的配置,确保export PATH=/usr/local/cuda-11.8/bin:$PATH这行存在,然后source ~/.bashrc。

问题二:libcudnn.so not found

cuDNN的库文件没复制到正确位置,或者LD_LIBRARY_PATH没包含CUDA的lib64目录。检查/usr/local/cuda-11.8/lib64/下有没有libcudnn.so文件,如果没有,重新复制一遍。

问题三:CUDA版本和驱动不匹配

nvidia-smi显示的CUDA Version是驱动支持的最高版本,如果你装的CUDA Toolkit版本高于这个,会报错。解决方法要么升级驱动,要么降级CUDA。

6.3 PaddlePaddle运行时的典型错误

错误一:ImportError: libcudart.so.11.0: cannot open shared object file

PaddlePaddle找不到CUDA运行时库。检查LD_LIBRARY_PATH是否包含/usr/local/cuda-11.8/lib64,以及该目录下是否有libcudart.so.11.0文件。

错误二:OSError: libcudnn.so.8: cannot open shared object file

类似上面的问题,cuDNN库没找到。确认cuDNN版本和CUDA版本匹配,并且库文件在正确位置。

错误三:paddle.fluid.core.EnforceNotMet: Cannot load cudnn shared library

这个错误通常是因为cuDNN版本不匹配。PaddlePaddle 2.5.1需要cuDNN 8.6或8.7,如果你装的是8.9,就会报这个错。降级cuDNN到匹配版本即可。

避坑技巧:安装PaddlePaddle之前,先用python3 -c "import paddle; print(paddle.version.cuda())"看看PaddlePaddle编译时用的CUDA版本,然后确保系统里的CUDA版本和这个一致。不一致的话,要么重装PaddlePaddle,要么调整系统CUDA版本。

7. 环境固化与后续维护

7.1 用Docker固化环境

如果你不想每次换机器都重新折腾一遍,强烈建议用Docker把环境固化下来。PaddlePaddle官方提供了Docker镜像,直接拉下来就能用:

docker pull paddlepaddle/paddle:2.5.1-gpu-cuda11.8-cudnn8.6-trt8.5

这个镜像里已经装好了PaddlePaddle、CUDA、cuDNN,你只需要在宿主机上装好NVIDIA驱动和nvidia-docker,就能直接跑。

启动容器的命令:

docker run --gpus all -it -v $(pwd):/workspace paddlepaddle/paddle:2.5.1-gpu-cuda11.8-cudnn8.6-trt8.5 /bin/bash

--gpus all让容器能访问所有GPU,-v $(pwd):/workspace把当前目录挂载到容器的/workspace,方便传数据。

7.2 内核升级后的驱动重编译

UOS和Deepin偶尔会推送内核更新,更新后NVIDIA驱动模块需要重新编译。如果你是用apt装的驱动,nvidia-kernel-dkms包会自动处理。如果是runfile装的,需要手动重新运行安装程序:

sudo ./NVIDIA-Linux-x86_64-525.105.17.run --dkms

加--dkms参数会注册DKMS,以后内核升级时自动重编译。

7.3 多版本CUDA共存的管理

有时候不同项目需要不同版本的CUDA,可以在系统里装多个版本,通过软链接切换:

sudo rm /usr/local/cuda sudo ln -s /usr/local/cuda-11.8 /usr/local/cuda

这样/usr/local/cuda始终指向当前使用的版本,切换的时候只改软链接就行。

8. 一些零散但重要的经验

装完环境只是第一步,实际跑训练的时候还会遇到各种问题。比如显存不够、多卡训练配置、混合精度训练等,这些展开讲又是另一篇内容了。这里先分享几个我觉得最有用的点。

第一,装驱动之前一定要确认显卡型号和系统内核版本,这两个信息决定了你能用哪个版本的驱动。我见过有人拿着RTX 4090去装470版本的驱动,结果根本不支持,白折腾半天。

第二,CUDA和cuDNN的版本匹配比驱动版本更重要。驱动版本高一点低一点通常没事,但CUDA和cuDNN版本错位,PaddlePaddle直接跑不起来。

第三,装完环境后先用小任务验证,别直接上大模型。小任务跑通了说明环境没问题,大模型跑不起来那就是模型或数据的问题,排查方向更明确。

第四,如果条件允许,用Docker。Docker能帮你省掉90%的环境配置时间,而且环境可复现,换机器直接拉镜像就行。

第五,遇到报错先看日志。dmesg、/var/log/syslog、PaddlePaddle的报错信息,这些地方通常有详细的错误原因。别一上来就搜"PaddlePaddle报错怎么办",先看看具体报的什么错。

最后再分享一个小技巧:如果你不确定某个CUDA版本能不能用,可以先在Docker里试。拉一个对应版本的PaddlePaddle镜像,跑一下验证脚本,能跑通再在宿主机上装。这样试错成本最低,不会把宿主机环境搞乱。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询