GPU 完整运行过程:驱动、CUDA Toolkit、Conda、Python PyTorch 与 R torch

/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.1nvidia.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.kolibcuda.so.1nvidia-smi
系统 CUDA Toolkit 管理员/module nvcclibcudart.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 负责"最终执行计算"
相关推荐
孙启超6 分钟前
【AI应用开发】Agent 无限 loop(反复调用同一个工具)如何规避?
人工智能·python·算法·llm·agent·loop·ai应用开发
银-豆豆10 分钟前
Python爬虫
开发语言·爬虫·python
香吧香33 分钟前
Python 基础语法总结
python
IT小盘35 分钟前
10-使用Reranker提升RAG回答准确率
人工智能·python
卷无止境41 分钟前
Python 装饰器:给函数穿件"外套",到底难在哪?
后端·python
大地之灯1 小时前
从零做一个自己的 CLI
python·agent
gugucoding1 小时前
34.【Java】I/O流(下):NIO与文件操作
java·python·nio
cui_ruicheng1 小时前
Python数据分析(十三):Seaborn 统计可视化
开发语言·python·信息可视化·数据分析
如此这般英俊1 小时前
手搓Claude Code-第十章 system_prompt
数据结构·人工智能·python·语言模型·自然语言处理·prompt
高洁011 小时前
VLA:驱动具身智能迈向通用的关键引擎
人工智能·python·深度学习·transformer·知识图谱