/usr/local/nvidia/bin/nvidia-smi
/usr/local/nvidia/lib # 系统驱动位置 libnvidia-ml.so libcuda.so
/usr/local/cuda/targets/x86_64-linux/lib # cuda toolkit
/usr/local/cuda/lib64 # cuda toolkit
/opt/app/nvidia/550.54.14/lib # 系统驱动位置 libnvidia-ml.so libcuda.so
/opt/app/cuda/10.1/lib64 # cuda toolkit
/opt/app/cuda/10.1/targets/x86_64-linux/lib # cuda toolkit
cat /proc/driver/nvidia/version # 查看内核驱动
1. 三套东西必须分开理解
GPU 软件环境主要分成三套来源:
第一套:NVIDIA 系统驱动
由服务器管理员安装
提供:
nvidia.ko
nvidia_uvm.ko
libcuda.so.1
libnvidia-ml.so.1
nvidia-smi
第二套:系统 CUDA Toolkit
例如:
/opt/app/cuda/11.8
/opt/app/cuda/12.2
/opt/app/cuda/12.8
提供:
nvcc
CUDA 头文件
libcudart.so
libcublas.so
libnvrtc.so
CUDA 开发工具
stubs/libcuda.so
第三套:Conda/PyTorch 或 R torch 运行环境
例如:
pytorch
pytorch-cuda
cudatoolkit
cuda-cudart
cuda-libraries
cuDNN
LibTorch
Lantern
这三套组件可以包含部分相同类型的 CUDA 运行库,但作用和安装来源不同。
2. GPU 总体运行图
┌──────────────────────────────────────────────────────────────────────────────┐
│ 用户代码 │
├──────────────────────────────────────────────────────────────────────────────┤
│ Python R │
│ import torch library(torch) │
│ x = torch.randn(..., device="cuda") x <- torch_randn(..., device="cuda")│
└──────────────────────────────────────────────────────────────────────────────┘
│ │
▼ ▼
┌──────────────────────────────────┐ ┌──────────────────────────────────────┐
│ Python PyTorch │ │ R torch │
│ │ │ │
│ Python API │ │ R API │
│ torch.nn │ │ Lantern │
│ torch.cuda │ │ LibTorch │
│ Autograd │ │ │
└──────────────────────────────────┘ └──────────────────────────────────────┘
│ │
└──────────────────┬───────────────────┘
▼
┌──────────────────────────────────────────────────────────────────────────────┐
│ PyTorch C++ 后端:LibTorch / ATen / C10 │
├──────────────────────────────────────────────────────────────────────────────┤
│ 张量管理 │
│ CPU/CUDA 算子调度 │
│ 自动微分 │
│ GPU 显存管理 │
│ CUDA Stream / Event 管理 │
└──────────────────────────────────────────────────────────────────────────────┘
│
┌────────────────────────────┼──────────────────────────────┐
│ │ │
▼ ▼ ▼
┌──────────────────────┐ ┌────────────────────────┐ ┌───────────────────────┐
│ CUDA Runtime │ │ cuBLAS │ │ cuDNN │
│ libcudart.so │ │ libcublas.so │ │ libcudnn.so │
├──────────────────────┤ ├────────────────────────┤ ├───────────────────────┤
│ cudaMalloc │ │ 矩阵乘法 │ │ 卷积 │
│ cudaMemcpy │ │ GEMM │ │ 池化 │
│ cudaFree │ │ 向量和矩阵运算 │ │ 激活函数 │
│ 启动 CUDA kernel │ │ │ │ Attention 等算子 │
│ Stream / Event │ │ │ │ │
└──────────────────────┘ └────────────────────────┘ └───────────────────────┘
│ │ │
└────────────────────────────┴───────────────┬──────────────┘
▼
┌──────────────────────────────────────────────────────────────────────────────┐
│ NVIDIA 用户态驱动:libcuda.so.1 │
├──────────────────────────────────────────────────────────────────────────────┤
│ 典型路径: │
│ │
│ /usr/local/nvidia/lib/libcuda.so.1 │
│ ↓ │
│ /usr/local/nvidia/lib/libcuda.so.550.54.14 │
│ │
│ 主要接口: │
│ cuInit │
│ cuDeviceGet │
│ cuCtxCreate │
│ cuMemAlloc │
│ cuLaunchKernel │
│ │
│ 注意:真正的 libcuda.so.1 由 NVIDIA 系统驱动提供,不由 PyTorch 提供。 │
└──────────────────────────────────────────────────────────────────────────────┘
│
用户态与内核态边界
│
▼
┌──────────────────────────────────────────────────────────────────────────────┐
│ NVIDIA 内核态驱动 │
├──────────────────────────────────────────────────────────────────────────────┤
│ nvidia.ko │
│ nvidia_uvm.ko │
│ nvidia_modeset.ko │
│ nvidia_drm.ko │
│ │
│ 当前服务器版本:550.54.14 │
│ │
│ 负责: │
│ GPU 上下文管理 │
│ 显存映射 │
│ DMA 数据传输 │
│ GPU 任务调度 │
│ 中断处理 │
│ 与物理 GPU 通信 │
└──────────────────────────────────────────────────────────────────────────────┘
│
▼
┌──────────────────────────────────────────────────────────────────────────────┐
│ Linux 设备文件 │
├──────────────────────────────────────────────────────────────────────────────┤
│ /dev/nvidia0 │
│ /dev/nvidia1 │
│ /dev/nvidiactl │
│ /dev/nvidia-uvm │
└──────────────────────────────────────────────────────────────────────────────┘
│
▼
┌──────────────────────────────────────────────────────────────────────────────┐
│ 物理 GPU │
│ Tesla V100S / A100 / H100 等 │
└──────────────────────────────────────────────────────────────────────────────┘
3. NVIDIA 系统驱动安装什么
NVIDIA 驱动由服务器管理员在系统层面安装。
NVIDIA Driver
├── 内核态驱动
│ ├── nvidia.ko
│ ├── nvidia_uvm.ko
│ ├── nvidia_modeset.ko
│ └── nvidia_drm.ko
│
└── 用户态驱动
├── libcuda.so
├── libcuda.so.1
├── libcuda.so.550.54.14
├── libnvidia-ml.so.1
└── nvidia-smi
在当前服务器中:
内核驱动版本:
550.54.14
用户态驱动:
/usr/local/nvidia/lib/libcuda.so
-> libcuda.so.1
-> libcuda.so.550.54.14
libcuda.so.1 和 nvidia.ko 属于同一套 NVIDIA 驱动。
它们通常应当保持匹配:
nvidia.ko 550.54.14
libcuda.so.550.54.14
libnvidia-ml.so.550.54.14
4. 系统 CUDA Toolkit 安装什么
系统 CUDA Toolkit 是管理员安装在 /opt/app/cuda/ 中的多套 CUDA 开发环境。
例如:
/opt/app/cuda/10.1
/opt/app/cuda/11.2
/opt/app/cuda/11.8
/opt/app/cuda/12.2
/opt/app/cuda/12.4
/opt/app/cuda/12.8
一套完整 CUDA Toolkit 通常包括:
CUDA Toolkit
├── bin/
│ ├── nvcc
│ ├── cuda-gdb
│ ├── nvprof 或其他分析工具
│ └── 其他命令
│
├── include/
│ ├── cuda.h
│ ├── cuda_runtime.h
│ ├── cublas_v2.h
│ └── 其他头文件
│
├── lib64/
│ ├── libcudart.so
│ ├── libcublas.so
│ ├── libcublasLt.so
│ ├── libnvrtc.so
│ ├── libcupti.so
│ └── 其他 CUDA 库
│
└── targets/x86_64-linux/lib/stubs/
├── libcuda.so
└── libnvidia-ml.so
CUDA Toolkit 各组件作用
nvcc
CUDA C/C++ 编译器
libcudart.so
CUDA Runtime
提供 cudaMalloc、cudaMemcpy、cudaFree、kernel launch 等
libcublas.so
GPU 矩阵运算和线性代数
libcublasLt.so
更灵活和高性能的矩阵乘法接口
libnvrtc.so
CUDA Runtime Compilation
运行过程中动态编译 CUDA 代码
libcupti.so
CUDA 性能分析和跟踪接口
Toolkit 中的 stubs/libcuda.so
下面这个文件:
/opt/app/cuda/12.2/targets/x86_64-linux/lib/stubs/libcuda.so
只是编译链接时使用的占位库。
stubs/libcuda.so
只能用于编译链接
不能真正初始化 GPU
不能替代系统 libcuda.so.1
不应放入运行时 LD_LIBRARY_PATH
真正运行时使用的是:
/usr/local/nvidia/lib/libcuda.so.1
5. module load CUDA 做什么
执行:
source /etc/profile.d/modules.sh
module load app/cuda/12.2
模块配置为:
CUDA_HOME=/opt/app/cuda/12.2
PATH 增加:
/opt/app/cuda/12.2/bin
LD_LIBRARY_PATH 增加:
/opt/app/cuda/12.2/lib64
/usr/local/nvidia/lib
因此,module 同时让程序找到:
/opt/app/cuda/12.2/bin/nvcc
/opt/app/cuda/12.2/lib64/libcudart.so
/usr/local/nvidia/lib/libcuda.so.1
但是,module load 不会:
安装 NVIDIA 驱动
加载 nvidia.ko
改变内核驱动版本
重新安装 GPU
内核驱动一般由管理员在节点启动时加载。
6. Conda 可以安装什么
Conda/Mamba 可以在用户自己的环境中安装二进制运行库,不需要 root。
例如:
$CONDA_PREFIX/
├── bin/
├── include/
├── lib/
└── lib/python3.x/site-packages/
Conda 可以安装:
Python
R
PyTorch
LibTorch
CUDA Runtime
cuBLAS
cuDNN
NVRTC
CUPTI
NumPy
Pandas
Scikit-learn
JupyterLab
R 包及相关动态库
但是 Conda 通常不能替代系统安装:
nvidia.ko
nvidia_uvm.ko
真正的 libcuda.so.1
/dev/nvidia0
系统 NVIDIA 驱动
7. pytorch-cuda 到底是什么
新版本 PyTorch Conda 安装中常见:
mamba install \
pytorch=2.1.1 \
pytorch-cuda=12.1 \
-c pytorch \
-c nvidia
pytorch-cuda 通常是一个元包。
它主要负责:
指定 PyTorch 使用的 CUDA 大版本
解析匹配的 CUDA 运行时依赖
拉取 NVIDIA channel 中对应的 cuda-* 包
防止安装 CPU-only PyTorch
它本身不一定直接保存所有 .so 文件,而是依赖其他包来安装这些文件。
例如可能拉取:
pytorch-cuda=12.1
├── cuda-cudart
├── cuda-cupti
├── cuda-libraries
├── cuda-nvrtc
├── cuda-nvtx
└── 其他匹配组件
当前环境实际已经安装:
cuda-cudart 12.1.105
cuda-cupti 12.1.105
cuda-libraries 12.1.0
cuda-nvrtc 12.1.105
cuda-nvtx 12.1.105
cuda-runtime 12.1.0
pytorch 2.1.1 CUDA 12.1
pytorch-cuda 12.1
因此,当前环境中的:
libcudart.so.12
libcublas.so.12
libnvrtc.so
是通过 Conda CUDA 依赖安装进环境的。
8. pytorch-cuda 会安装哪些库
典型情况下:
pytorch-cuda / CUDA 运行依赖
├── libcudart.so
├── libcublas.so
├── libcublasLt.so
├── libcusparse.so
├── libcusolver.so
├── libcurand.so
├── libnvrtc.so
├── libnvToolsExt.so
├── libcupti.so
└── cuDNN 相关库
不同 PyTorch、Conda channel 和 CUDA 版本的打包方式可能不同。
有些库作为独立 Conda 包安装:
cuda-cudart
cuda-nvrtc
cuda-cupti
cudnn
有些库可能打包在:
$CONDA_PREFIX/lib/
或者:
$CONDA_PREFIX/lib/python3.x/site-packages/torch/lib/
可以检查:
find "$CONDA_PREFIX" \
\( \
-name 'libcudart.so*' \
-o -name 'libcublas.so*' \
-o -name 'libcudnn.so*' \
-o -name 'libnvrtc.so*' \
-o -name 'libtorch_cuda.so*' \
\) \
2>/dev/null
9. pytorch-cuda 不会安装什么
pytorch-cuda 不会给服务器安装:
nvidia.ko
nvidia_uvm.ko
nvidia_modeset.ko
nvidia_drm.ko
真正的 libcuda.so.1
libnvidia-ml.so.1
nvidia-smi
/dev/nvidia0
/dev/nvidiactl
/dev/nvidia-uvm
这些都属于系统 NVIDIA 驱动或系统设备管理。
因此:
安装 pytorch-cuda
不等于
安装 NVIDIA 驱动
10. cudatoolkit 和 pytorch-cuda 的区别
旧版 PyTorch Conda 安装常见:
mamba install \
pytorch=1.8.2 \
cudatoolkit=11.1 \
-c pytorch-lts
这里的:
cudatoolkit=11.1
通常是一个相对集中打包的 CUDA 运行库包。
它可能提供:
libcudart.so
libcublas.so
libcusparse.so
libcusolver.so
libcurand.so
部分 CUDA 运行依赖
新版本安装常见:
mamba install \
pytorch=2.1.1 \
pytorch-cuda=12.1 \
-c pytorch \
-c nvidia
这里:
pytorch-cuda=12.1
主要作为依赖协调包,再拉取多个拆分的:
cuda-cudart
cuda-libraries
cuda-nvrtc
cuda-cupti
cuda-nvtx
可以这样理解:
旧打包方式:
cudatoolkit
↓
一个相对集中的 CUDA 运行库包
新打包方式:
pytorch-cuda
↓
协调多个拆分的 cuda-* 运行库包
两种方式都不会安装真正的 NVIDIA 系统驱动。
11. Conda 的 pytorch-cuda 是否安装 nvcc
通常:
pytorch-cuda
主要满足 PyTorch 运行需求
不一定安装完整 nvcc 编译器
检查:
command -v nvcc
find "$CONDA_PREFIX" -name nvcc 2>/dev/null
如果没有 nvcc,PyTorch仍然可能正常运行 GPU:
import torch
print(torch.cuda.is_available())
x = torch.randn(1000, 1000, device="cuda")
y = x @ x
因为运行预编译 PyTorch 不要求本机存在 nvcc。
如果需要编译 CUDA 扩展,则需要完整 Toolkit,例如:
module load app/cuda/12.2
或者在 Conda 中安装相应 CUDA 开发工具包。
12. Python PyTorch 的两种 CUDA 来源
方式一:使用 Conda 自带 CUDA 运行库
Python
↓
PyTorch
↓
$CONDA_PREFIX/lib/libcudart.so
$CONDA_PREFIX/lib/libcublas.so
PyTorch 自带或 Conda 安装的 libcudnn.so
↓
/usr/local/nvidia/lib/libcuda.so.1
↓
nvidia.ko
↓
GPU
这通常是运行预编译 PyTorch 最干净的方式。
方式二:使用系统 CUDA Toolkit
Python
↓
PyTorch 或自定义 CUDA 扩展
↓
/opt/app/cuda/12.2/lib64/libcudart.so
/opt/app/cuda/12.2/lib64/libcublas.so
↓
/usr/local/nvidia/lib/libcuda.so.1
↓
nvidia.ko
↓
GPU
这种方式通常用于:
从源码编译 PyTorch
编译自定义 CUDA Extension
使用 nvcc
编译 flash-attn 等扩展
不建议无目的地混用:
Conda CUDA 12.1
系统 CUDA 12.2
其他目录 CUDA 11.8
否则可能出现动态库版本冲突。
13. R torch 的安装来源
R 中执行:
install.packages("torch")
library(torch)
install_torch()
通常会涉及:
R torch
↓
Lantern
↓
LibTorch
↓
CUDA Runtime
↓
cuBLAS / cuDNN
↓
系统 libcuda.so.1
↓
NVIDIA 内核驱动
↓
GPU
R torch 不直接使用 Python 环境里的 torch。
也就是说:
Python torch
使用 Python PyTorch / LibTorch
R torch
使用 R torch / Lantern / LibTorch
二者底层最终都依赖:
libcuda.so.1
nvidia.ko
/dev/nvidia*
R torch 是否携带 CUDA Runtime,取决于所安装的 LibTorch/Lantern 构建版本。
14. 四种安装来源对照表
| 来源 | 谁安装 | 典型文件 | 是否运行 GPU 必需 | 是否包含真正驱动 |
|---|---|---|---|---|
| NVIDIA 系统驱动 | 系统管理员 | nvidia.ko、libcuda.so.1、nvidia-smi |
是 | 是 |
| 系统 CUDA Toolkit | 管理员/module | nvcc、libcudart.so、头文件、开发库 |
预编译 PyTorch通常不必需 | 否 |
Conda pytorch-cuda |
用户/Mamba | 拉取 cuda-cudart、CUDA 数学库等 |
对 Conda CUDA PyTorch 是 | 否 |
Conda cudatoolkit |
用户/Mamba | CUDA Runtime 和运行库 | 对相应旧版 PyTorch 是 | 否 |
Python pytorch |
用户/Mamba/Pip | Python API、LibTorch、ATen | 是 | 否 |
R torch |
用户/R | R API、Lantern、LibTorch | 是 | 否 |
15. 当前服务器中的实际路径图
Python/R 用户代码
│
▼
┌─────────────────────────────────────────────────────────────┐
│ Conda / R 环境 │
│ │
│ /home/user_bob/conda_envs/r4.3.1_cluster │
│ │
│ Python PyTorch │
│ R torch / Lantern / LibTorch │
│ libcudart.so │
│ libcublas.so │
│ libcudnn.so │
└─────────────────────────────────────────────────────────────┘
│
│ 最终调用 CUDA Driver API
▼
┌─────────────────────────────────────────────────────────────┐
│ NVIDIA 用户态驱动 │
│ │
│ /usr/local/nvidia/lib/libcuda.so │
│ -> libcuda.so.1 │
│ -> libcuda.so.550.54.14 │
│ │
│ /usr/local/nvidia/lib/libnvidia-ml.so.1 │
└─────────────────────────────────────────────────────────────┘
│
│ 用户态进入内核态
▼
┌─────────────────────────────────────────────────────────────┐
│ NVIDIA 内核态驱动 │
│ │
│ nvidia.ko 550.54.14 │
│ nvidia_uvm.ko │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ /dev/nvidia0 │
│ /dev/nvidiactl │
│ /dev/nvidia-uvm │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ 物理 NVIDIA GPU │
└─────────────────────────────────────────────────────────────┘
系统 CUDA Toolkit 是一条可选的开发路径:
/opt/app/cuda/12.2
├── bin/nvcc
├── include/
├── lib64/libcudart.so
├── lib64/libcublas.so
└── targets/.../stubs/libcuda.so
它主要用于:
编译 CUDA C/C++
编译 PyTorch CUDA Extension
从源码构建程序
提供 nvcc 和开发头文件
16. 一张最终记忆图
┌──────────────────────────────────────────────────────────────┐
│ Python torch / R torch │
│ 负责:用户编程接口 │
└──────────────────────────────────────────────────────────────┘
│
▼
┌──────────────────────────────────────────────────────────────┐
│ LibTorch / ATen / Lantern │
│ 负责:张量、算子、自动微分、CPU/GPU 调度 │
└──────────────────────────────────────────────────────────────┘
│
▼
┌──────────────────────────────────────────────────────────────┐
│ Conda CUDA Runtime 或系统 CUDA Toolkit │
│ │
│ libcudart.so:显存、数据传输、kernel 启动 │
│ libcublas.so:矩阵运算 │
│ libcudnn.so:深度学习算子 │
│ libnvrtc.so:运行时编译 │
└──────────────────────────────────────────────────────────────┘
│
▼
┌──────────────────────────────────────────────────────────────┐
│ libcuda.so.1 │
│ NVIDIA 驱动的用户态接口 │
└──────────────────────────────────────────────────────────────┘
│
▼
┌──────────────────────────────────────────────────────────────┐
│ nvidia.ko / nvidia_uvm.ko │
│ NVIDIA 内核态驱动 │
└──────────────────────────────────────────────────────────────┘
│
▼
┌──────────────────────────────────────────────────────────────┐
│ /dev/nvidia* │
└──────────────────────────────────────────────────────────────┘
│
▼
┌──────────────────────────────────────────────────────────────┐
│ 物理 GPU │
└──────────────────────────────────────────────────────────────┘
17. 最核心结论
NVIDIA 系统驱动安装:
nvidia.ko
libcuda.so.1
nvidia-smi
系统 CUDA Toolkit 安装:
nvcc
CUDA 头文件
libcudart.so
libcublas.so
libnvrtc.so
开发和分析工具
Conda pytorch-cuda 安装或拉取:
PyTorch匹配的 CUDA Runtime
cuda-cudart
CUDA 数学库
NVRTC
CUPTI
cuDNN 等运行依赖
pytorch-cuda 不安装:
nvidia.ko
真正的 libcuda.so.1
系统 GPU 驱动
最终调用关系:
torch
↓
libcudart / cuBLAS / cuDNN
↓
libcuda.so.1
↓
nvidia.ko
↓
GPU
记忆口诀:
torch 决定"算什么"
cuDNN/cuBLAS 决定"具体怎么算"
libcudart 负责"提交 CUDA 任务"
libcuda.so.1 负责"联系 NVIDIA 驱动"
nvidia.ko 负责"真正控制 GPU"
GPU 负责"最终执行计算"