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 负责"最终执行计算"
相关推荐
开源量化GO1 小时前
最新AI量化学习路径,从交易想法走到条件和动作
人工智能·python
香蕉鼠片1 小时前
图像处理经典脚本
图像处理·python·opencv
用户298698530142 小时前
Python 一键导出 Excel 中的图表和形状为图片
后端·python·excel
汤米粥2 小时前
Python爬虫——json解析
爬虫·python·json
武陵悭臾2 小时前
Python应用开发学习:如何让随机数按一定比列出现
python·学习·random·概率·随机数
amongdata2 小时前
MyVoiceTyping:面向中文语音输入的本地优先开源方案
python·开源·音视频·语音识别
薛定猫AI2 小时前
【技术干货】大模型检查点可靠性评测:基于 Python 构建幻觉与指令遵循测试
开发语言·python
Mr__Miss3 小时前
Java 随机数生成器选型指南:Random、ThreadLocalRandom 与 SecureRandom
java·开发语言·python
CTA量化套保3 小时前
2026年下半年Python量化入门,先看API如何接进小流程
人工智能·python