RTX 40 系显卡跑 MindSpore2.2.14 GPU——不用自编译,WSL2 + 官方预编译包即可(7.9× 实测)

背景

官方 GPU 支持矩阵写的是 CUDA 10.1 / 11.1 / 11.6,而 RTX 40 系(Ada,sm_89)需要 CUDA ≥ 11.8 才能让 nvcc 生成 SASS。 所以社区里常见的结论是「RTX 40 系必须自己编译 MindSpore GPU」。

我这边实测下来不需要自编译:官方预编译包直接能在 4080 上跑,而且比 CPU 快约 8 倍。 下面把完整路径和踩过的坑写清楚,RTX 40 系(4080/4090)+ Windows 的同学可以直接抄。

为什么能跑

官方 wheel 里的 common 架构包含 compute_86 的 PTX(见 cmake/gpu_env_setup.cmake)。 驱动(我这里 551.95)会把 compute_86 PTX JIT 编译成 sm_89 的机器码,于是不需要 sm_89 的 SASS,也能跑。

代价:首次 kernel 启动有约 1–1.5 秒 JIT 冷启动,之后正常。

环境组合(实测可用)

组件 版本
Windows 11 25H2
WSL WSL2(Ubuntu 20.04,kernel 6.18)
GPU RTX 4080 Laptop(sm_89),驱动 551.95(Windows 侧,WSL 透传)
CUDA toolkit 11.8.89(wsl-ubuntu 源,只装 toolkit 不装驱动)
cuDNN 8.9.7(cuda11 redist,免登录 tar.xz)
Python 3.8(Ubuntu 20.04 自带)
MindSpore 2.2.14 官方预编译 Linux wheel(unified 包)

步骤(约 1 小时,含一次重启)

  1. 装 WSL2 + Ubuntu 20.04(管理员 PowerShell)

    powershell

    wsl --install --no-distribution --web-download
    wsl --set-default-version 2
    wsl --install -d Ubuntu-20.04 --no-launch
    

    然后写 C:\Users\<user>\.wslconfig(必做,否则 WSL 只分到一半内存):

    ini

    [wsl2]
    memory=20GB
    processors=24
    swap=8GB
    

    重启后 nvidia-smi 应能看到显卡。

  2. WSL 内装 CUDA 11.8(只装 toolkit)

    bash

    wget https://developer.download.nvidia.cn/compute/cuda/repos/wsl-ubuntu/x86_64/cuda-keyring_1.1-1_all.deb
    sudo dpkg -i cuda-keyring_1.1-1_all.deb
    sudo apt-get update && sudo apt-get install -y cuda-toolkit-11-8
    
  3. cuDNN 8.9.7(免登录)

    bash

    wget https://developer.download.nvidia.cn/compute/cudnn/redist/cudnn/linux-x86_64/cudnn-linux-x86_64-8.9.7.29_cuda11-archive.tar.xz
    tar -xf cudnn-linux-x86_64-8.9.7.29_cuda11-archive.tar.xz
    sudo cp -a cudnn-linux-x86_64-8.9.7.29_cuda11-archive/include/* /usr/local/cuda-11.8/include/
    sudo cp -a cudnn-linux-x86_64-8.9.7.29_cuda11-archive/lib/* /usr/local/cuda-11.8/lib64/
    sudo ldconfig
    
  4. 装官方预编译 wheel(2.2.14 的 unified 包,约 743MB)

    bash

    wget https://ms-release.obs.cn-north-4.myhuaweicloud.com/2.2.14/MindSpore/unified/x86_64/mindspore-2.2.14-cp38-cp38-linux_x86_64.whl
    pip install ./mindspore-2.2.14-cp38-cp38-linux_x86_64.whl
    
  5. 验证

    bash

    python -c "import mindspore as ms; ms.set_context(device_target='GPU'); ms.run_check()"
    

    看到 MindSpore has been installed on platform [GPU] successfully! 就成了。

实测数据(真实北京地铁客流数据)

配置 ms/step 相对 CPU
CPU PYNATIVE 52.3 1.0×
GPU PYNATIVE 10.0 5.2×
GPU GRAPH 6.6 7.9×

数值与 CPU 一致(3 epoch 后 RMSE 618.7406 vs 618.7408)。 另外实测 RTX 4080 下 GRU 训练可达 3.0 ms/step(GRAPH 模式)。

踩到的坑(重点)

  1. PYNATIVE + GPU 下 nn.GRU 训练会崩(约 300–2600 步,ResetResource ... dynamic shape 刷屏 → Launch kernel failed/CUDA 719)。
    • 规避:GRU 类模型用 GRAPH_MODE;如果必须 PYNATIVE,加 pynative_synchronize=True(关掉 PYNATIVE 异步队列,实测 20000 步零报错,代价约 1.6× 慢)。
    • 已提 issue #29728(含最小复现与代码级分析)。
  2. 启动时的版本告警可以忽略 MindSpore version 2.2.14 and cuda version 11.8.89 does not match ... officially —— 实测功能完全正常(就是上面说的 PTX JIT)。
  3. WSL 默认只给一半内存(32G → 15G),训练/编译容易 OOM,务必写 .wslconfig。
  4. GRU/RNN 这类模型在 PYNATIVE 下比 GRAPH 慢很多,迁移时建议直接切 GRAPH(注意 GRAPH 下 value_and_grad 不能传 lambda)。
  5. 数据不要从 /mnt/c、/mnt/d 直接读(DrvFs 慢),先拷进 WSL 家目录。

与 Docker 镜像方案的区别

社区里另一条常见路线是直接用官方 Docker 镜像(mindspore/mindspore-gpu:2.2.x),在 WSL2 里挂 --runtime=nvidia 跑容器。

两种方案跑的是同一套 MindSpore GPU 后端,结论也一致:官方预编译产物(wheel 与镜像)都不含 sm_89 的 SASS,同样靠 compute_86 PTX 由驱动 JIT,所以 RTX 40 系「能跑、但首次 kernel 有 JIT 开销」这一点对两者都成立(本文在 wheel 上实测,镜像未单独复测)。

差别在工程侧:

  • Docker 镜像:环境打包完整、可迁移、交付给他人最省心;代价是要装 Docker Desktop + nvidia-container-runtime,镜像好几 GB,容器内 CUDA/cuDNN 版本跟镜像标签走,换版本=换镜像。
  • 本文的 wheel 方案:不引入 Docker,直接在 WSL 里装 CUDA 11.8 + 官方 wheel,环境更薄、启动更快(实测训练 6.6 ms/step),换 MindSpore/CUDA 版本只要换包——适合「就想在这台笔记本上把活跑起来」的场景。

一句话:要严格可复现/可交付 → Docker 镜像;本机实验调参 → wheel 更轻。 两条路的 sm_89 结论相同,别为了新卡去自编译。

给官方的建议

  • 文档补一节「sm_86 以上的新卡如何使用预编译包(PTX 兼容)」,并补 Windows+WSL2 快速路径;
  • build.sh -G 目前只接受 common|auto|ptx,建议放开任意 arch(至少支持 sm_89);
  • 「版本不匹配」告警建议区分 WARN / ERROR,别让用户以为不能用。

(第 2、3 点已提 issue #29729。)