Win10下配置WSL2后nvidia-smi不正常显示问题
环境准备
操作系统:Windows 10 专业版 22H2(保系统版本高于windows10 21H2或Windows11)
显卡:2080TI 22G
参考内容:CUDA on WSL (nvidia.com)、Install WSL | Microsoft Learn、Windows安装WSL2并配置nVidia GPU - 知乎 (zhihu.com)
现在已经是2024年,网上许多安装WSL2和WSL2中配置GPU的资料已经过时,因此在这里记录一下整个安装流程。
安装WSL2
在控制面版安装必要组件
分别为Hyper-V、适用于Linux的Windwos子系统、虚拟机平台,安装完成后重启计算机即可开启WSL功能。注:开启Hyper-V会与Vmware等虚拟化软件造成冲突,可使用基于Hyper-V版本的Vmware。
安装必要组件
升级WSL版本
然后我们要把wsl程序的版本更新到最新版本,打开系统终端(cmd或者powershell都行),输入wsl --update
,即可升级到最新版的wsl程序,我这里已经升级过了,所以显示已是最新版。
代码语言:txt
AI代码解释
正在检查更新。
已安装最新版本的适用于 Linux 的 Windows 子系统。
输入wsl --version
如果有结果显示那就证明wsl程序版本达到要求了,没有对应结果那就是wsl程序还不是最新版。
代码语言:txt
AI代码解释
WSL 版本: 2.1.5.0
内核版本: 5.15.146.1-2
WSLg 版本: 1.0.60
MSRDC 版本: 1.2.5105
Direct3D 版本: 1.611.1-81528511
DXCore 版本: 10.0.25131.1002-220531-1700.rs-onecore-base2-hyp
Windows 版本: 10.0.19045.4474
安装 Linux 内核更新包
WSL使用CUDA要求Linux内核版本大于4.19.121+,输入wsl cat /proc/version
即可查看wsl linux内核版本。
代码语言:txt
AI代码解释
Linux version 5.15.146.1-microsoft-standard-WSL2 (root@65c757a075e2) (gcc (GCC) 11.2.0, GNU ld (GNU Binutils) 2.37) #1 SMP Thu Jan 11 04:09:03 UTC 2024
如果你的内核版本不符合要求,请下载wsl的内核更新包,直接运行安装即可,这样WSL2的安装算是完成了。
安装wsl的ubuntu
首先设置WSL2为默认WSL版本,如果不是,可以通过下面命令切换默认为WSL2
代码语言:txt
AI代码解释
wsl --set-default-version 2
然后通过命令安装ubuntu,选择自己想要的版本,这里我选择20.04
代码语言:javascript
代码运行次数:0
运行
AI代码解释
wsl --install ubuntu20.04
启动ubuntu
直接在系统终端输入wsl,即可进入到unbuntu系统。
为了方便使用,我们顺便开启wsl系统的systemd支持,
输入nano /etc/wsl.conf
,在wsl.conf
文件中添加以下行,你现在已打开此文件来更改用于 systemd 的 init:
代码语言:txt
AI代码解释
[boot]
systemd=true
然后重启wsl就可以了,输入wsl --shutdown
关闭系统,在输入wsl
启动即可。
windows安装nvidia GPU驱动
网上有许多资料写道需要安装针对WSL特别驱动,但是新版驱动直接继承了WSL的驱动现在只需要到nVidia官网将驱动升级到最新版本即可。
驱动下载地址:NVIDIA GeForce 驱动程序 - N 卡驱动 | NVIDIA
根据自己的显卡型号以及操作系统选择对应驱动,我这里是RTX 2080TI,操作系统是Win 10 64位。
选择显卡驱动
一般来说,会得到两种类型的驱动程序,一个是GeForce Game Ready 驱动程序,另外一个是NVIDIA Studio 驱动程序 ,我们要选择GeForce Game Ready 驱动程序,注意不要选错了。
选择GeForce Game Ready
确认 NVIDIA 驱动支持的 CUDA 版本
安装完驱动后,在终端输入nvidia-smi,可以看到驱动支持的最高CUDA版本(向下兼容),我这里是12.5
代码语言:txt
AI代码解释
PS C:\Users> nvidia-smi
Tue Jun 4 15:53:37 2024
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 555.85 Driver Version: 555.85 CUDA Version: 12.5 |
|-----------------------------------------+------------------------+----------------------+
| GPU Name Driver-Model | Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|=========================================+========================+======================|
| 0 NVIDIA GeForce RTX 2080 Ti WDDM | 00000000:02:00.0 On | N/A |
| 27% 34C P8 26W / 250W | 2092MiB / 22528MiB | 3% Default |
| | | N/A |
+-----------------------------------------+------------------------+----------------------++-----------------------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=========================================================================================|
+-----------------------------------------------------------------------------------------+
在WSL2中安装CUDA
进入英伟达官网,找到CUDA Tookit下载页面,按下图选择对应的版本:
根据提示,进入到WSL里面进行安装
我这里安装的是12.5版本,请根据自己要安装的版本操作,确保自己的网络可靠(科学上网什么的):
代码语言:javascript
代码运行次数:0
运行
AI代码解释
wget https://developer.download.nvidia.com/compute/cuda/repos/wsl-ubuntu/x86_64/cuda-wsl-ubuntu.pin
sudo mv cuda-wsl-ubuntu.pin /etc/apt/preferences.d/cuda-repository-pin-600
wget https://developer.download.nvidia.com/compute/cuda/12.5.0/local_installers/cuda-repo-wsl-ubuntu-12-5-local_12.5.0-1_amd64.deb
sudo dpkg -i cuda-repo-wsl-ubuntu-12-5-local_12.5.0-1_amd64.deb
sudo cp /var/cuda-repo-wsl-ubuntu-12-5-local/cuda-*-keyring.gpg /usr/share/keyrings/sudo apt-get update
sudo apt-get -y install cuda-toolkit-12-5
安装完成后,配置对应的环境变量,默认是修改.bashrc
文件,如果你使用的是其他shell,请修改对应shll的环境变量。我这里使用的是zsh,故在.zshrc
中添加,注意:cuda-12.5中的12.5要根据你安装的CUDA版本确定。
代码语言:txt
AI代码解释
export CUDA_HOME=/usr/local/cuda-12.5
export LD_LIBRARY_PATH=$CUDA_HOME/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
export PATH=$CUDA_HOME/bin:$PATH
编辑完.zshrc
文件,输入source .zshrc
来应用环境变量,之后输入nvcc -V
得到类似下面的信息就证明CUDA安装成功了。
代码语言:txt
AI代码解释
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2024 NVIDIA Corporation
Built on Wed_Apr_17_19:19:55_PDT_2024
Cuda compilation tools, release 12.5, V12.5.40
Build cuda_12.5.r12.5/compiler.34177558_0
关联nvidia-smi
在上文我们在windwos下输入nvidia-smi
是可以运行的,同样其实在WSL中也可以使用nvidia-smi
命令,不过WSL的nvidia-smi
在 /usr/lib/wsl/lib/
目录,故我们只需要对/usr/lib/wsl/lib/nvidia-smi
进行软链接到/usr/bin/
:
代码语言:txt
AI代码解释
ln -s /usr/lib/wsl/lib/nvidia-smi /usr/bin/nvidia-smi
回显
代码语言:txt
AI代码解释
Thu Oct 31 16:14:44 2024
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 560.35.02 Driver Version: 560.94 CUDA Version: 12.6 |
|-----------------------------------------+------------------------+----------------------+
| GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|=========================================+========================+======================|
| 0 NVIDIA GeForce RTX 2080 Ti On | 00000000:02:00.0 On | N/A |
| 27% 38C P8 28W / 250W | 1327MiB / 22528MiB | 9% Default |
| | | N/A |
+-----------------------------------------+------------------------+----------------------++-----------------------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=========================================================================================|
| 0 N/A N/A 26 G /Xwayland N/A |
| 0 N/A N/A 24237 C /ollama N/A |
+-----------------------------------------------------------------------------------------+
配置Docker访问GPU
上一步中我们已经在裸机上安装了 GPU Driver,CUDA Toolkit 等工具,实现了在宿主机上使用 GPU。
现在希望在 Docker 容器中使用 GPU,需要怎么处理呢?
为了让 Docker 容器中也能使用 GPU,大致步骤如下:
- 1)安装
nvidia-container-toolkit
组件 - 2)
docker
配置使用nvidia-runtime
- 3)启动容器时增加
--gpu
参数
安装 nvidia-container-toolkit
NVIDIA Container Toolkit 的主要作用是将 NVIDIA GPU 设备挂载到容器中。
兼容生态系统中的任意容器运行时,docker、containerd、cri-o 等。
NVIDIA 官方安装文档:nvidia-container-toolkit-install-guide
对于 Ubuntu 系统,安装命令如下:
首先设置依赖库:
代码语言:bash
AI代码解释
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \&& curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
可选,设置使用实验性包:
代码语言:bash
AI代码解释
sed -i -e '/experimental/ s/^#//g' /etc/apt/sources.list.d/nvidia-container-toolkit.list
然后更新apt列表
代码语言:bash
AI代码解释
sudo apt-get update
安装nvidia-container-toolkit
代码语言:bash
AI代码解释
sudo apt-get install -y nvidia-container-toolkit
配置使用该 runtime
支持 Docker, Containerd, CRI-O, Podman 等 CRI。
具体见官方文档 container-toolkit#install-guide
这里以 Docker 为例进行配置:
旧版本需要手动在 /etc/docker/daemon.json
中增加配置,指定使用 nvidia 的 runtime。
代码语言:json
AI代码解释
"runtimes": {"nvidia": {"args": [],"path": "nvidia-container-runtime"}
}
新版 toolkit 带了一个nvidia-ctk
工具,执行以下命令即可一键配置:
代码语言:bash
AI代码解释
sudo nvidia-ctk runtime configure --runtime=docker
然后重启 Docker 即可
代码语言:bash
AI代码解释
sudo systemctl restart docker
至此整个教程结束。