背景
官方 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 小时,含一次重启)
-
装 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应能看到显卡。 -
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 -
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 -
装官方预编译 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 -
验证
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 模式)。
踩到的坑(重点)
- 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(含最小复现与代码级分析)。
- 规避:GRU 类模型用
- 启动时的版本告警可以忽略
MindSpore version 2.2.14 and cuda version 11.8.89 does not match ... officially—— 实测功能完全正常(就是上面说的 PTX JIT)。 - WSL 默认只给一半内存(32G → 15G),训练/编译容易 OOM,务必写
.wslconfig。 - GRU/RNN 这类模型在 PYNATIVE 下比 GRAPH 慢很多,迁移时建议直接切 GRAPH(注意 GRAPH 下
value_and_grad不能传 lambda)。 - 数据不要从
/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。)