505 字
3 分钟
给WSL2配置运行CUDA的Docker

注意,本文使用WSL2+Docker,而不是安装Docker Desktop for Windows,因为后者占用的资源非常多,而且还有很多bug,比如,GPU无法运行

安装WSL#

运行一下命令将安装WSL并安装Ubuntu发行版,如果需要安装其他Linux发行版(如Arch Linux),请参考此链接

Terminal window
wsl --install

常用WSL命令#

  • 列出WSL子系统: wsl --list
  • 关闭WSL:wsl --shutdown
  • WSL配置文件:C:/users/YOUR_NAME/.wslconfig

Notes

让WSL使用本机的代理,编写.wslconfig如下:

[wsl2]
networkingMode=mirrored
dnsTunneling=true
autoProxy=true

安装Docker#

配置Docker的repo#

Terminal window
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update

安装Docker#

Terminal window
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo usermod $USER -aG docker # 添加本用户到docker的组中
sudo service docker start

要确认Docker成功安装,进入WSL的Ubuntu(使用命令wsl),并输入命令docker --version查看输出,还可以通过尝试运行docker run hello-world运行简单的内置Docker映像,测试安装是否正常工作。

给Docker配置CUDA#

安装NVIDIA Container Toolkit#

首先配置repo:

Terminal window
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

然后更新reposudo apt-get update,再运行sudo apt-get install -y nvidia-container-toolkit来安装NVIDIA Container Toolkit。

配置Docker#

使用nvidia-ctk命令配置容器运行时:

Terminal window
sudo nvidia-ctk runtime configure --runtime=docker

重新启动Docker进程:

Terminal window
sudo systemctl restart docker

测试#

Terminal window
docker run --gpus all nvcr.io/nvidia/k8s/cuda-sample:nbody nbody -gpu -benchmark

配置Docker#

配置iptable#

让WSL中的Ubuntu使用iptable(option 1),否则Docker的NAT会有问题。

Terminal window
update-alternatives --config iptables

Ref: https://nickjanetakis.com/blog/install-docker-in-wsl-2-without-docker-desktop

配置proxy#

  1. 给daemon配置proxy
  2. 给client配置proxy

Docker build使用本机proxy#

Terminal window
docker build --network=host --build-arg http_proxy=$http_proxy --build-arg https_proxy=$https_proxy ...

Docker部分命令#

Terminal window
docker builder prune -a

参考链接

给Docker瘦身#

迁移WSL至其他盘#

把Ubuntu的虚拟磁盘复制到其他盘符,然后创建符号链接

Terminal window
New-Item -ItemType SymbolicLink -Path "C:\Users\36477\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu_79rhkp1fndgsc\LocalState\ext4.vhdx" -Target "D:\wsl\ubuntu\ext4.vhdx"

Reference

停止WSL#

Terminal window
wsl --shutdown

使用Diskpart来瘦身#

Terminal window
diskpart
select vdisk file="C:\PATH\TO\ext4.vhd"
attach vdisk readonly
compact vdisk
detach vdisk
exit

Reference

给WSL2配置运行CUDA的Docker
https://blog.xiaobaizhang.top/posts/wsl-docker/
作者
张小白
发布于
2024-06-03
许可协议
CC BY-NC-SA 4.0