2021-06-12
端午放假,没有回家,配置了一下环境,实现了在Windows 系统下 Docker Desktop 容器中使用GPU。记录一下过程。
据说在docker 容器内使用GPU属于显卡透传。
我的环境如下:
一开始,在docker容器中使用GPU,需要在宿主机安装nvidia-docker。且在启动容器的时候使用 --runtime=nvidia选项。
nvidia-docker 是英伟达官方的项目,只支持Linux系统,所以windows上不能实现。
到了 19.03 版本,Docker 提供了对GPU的原生支持(同时 nvidia-docker 就过时了)。
这个时候docker 内置的gpu支持,需要安装 nvidia-container-runtime,然后启动容器的时候带上 --gpus all 参数(代替了
旧参数–runtime=nvidia),就像这样 docker run -it --rm --gpus all ubuntu nvidia-smi
。
Q. Linux 下呢?
ps:这两段信息是从别处看到的,仅供参考。
现在(2021-06-12),Win10 + WSL2 + Docker Desktop + CUDA driver for WSL2 就能用了。
注:
安装之前,我电脑已经启用了WSL2,并安装了 Docker Desktop 20.10.7,Window是版本是专业版 19043。以此为起点,我的环境还差两步:
从CUDA for WSL2下载驱动,根据显卡类型(GEFORCE 或者 QUADRO )选择对应的下载链接。
这个驱动还不是正式发行版。下载这个驱动需要注册账号。下载完成后点击执行,安装完成后重启系统。
按微软官网的操作步骤进行Windows Insider。
当前(2021-06-12)windows 最新的稳定发布版是 19043,而显卡透传需要升级到 windows 21332,这是个测试版。
当前最新的测试版是 21390。
基本步骤是:
注:第二步,Windows Insider Program 对应的中文是 Windows 预览体验计划。
注:第二步,可能会发现 Windows Insider Program 面板一片空白,无法选择通道。修复方式如下。
以管理员权限启动 Powershell,执行如下语句后重启电脑即可。
$path = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\DataCollection"
# Telemetry level: 1 - basic, 3 - full
$value = "3"
New-ItemProperty -Path $path -Name AllowTelemetry -Value $value -Type Dword -Force
New-ItemProperty -Path $path -Name MaxTelemetryAllowed -Value $value -Type Dword -Force
命令执行成功的输出
AllowTelemetry : 3
PSPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\DataCollection
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies
PSChildName : DataCollection
PSDrive : HKLM
PSProvider : Microsoft.PowerShell.Core\Registry
MaxTelemetryAllowed : 3
PSPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\DataCollection
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies
PSChildName : DataCollection
PSDrive : HKLM
PSProvider : Microsoft.PowerShell.Core\Registry
打开 WSL2,执行下面这条命令,
docker run --gpus all nvcr.io/nvidia/k8s/cuda-sample:nbody nbody -gpu -benchmark
看到如下输出,说明安装成功
> Windowed mode
> Simulation data stored in video memory
> Single precision floating point simulation
> 1 Devices used for simulation
GPU Device 0: "Pascal" with compute capability 6.1
> Compute 6.1 CUDA device: [NVIDIA GeForce GTX 1060]
10240 bodies, total time for 10 iterations: 9.040 ms
= 115.995 billion interactions per second
= 2319.891 single-precision GFLOP/s at 20 flops per interaction
如果GPU不可用,会出现类似下面的报错:
Running hook #0:: error running hook: exit status 1, stdout: , stderr: nvidia-container-cli: initialization error: driver error: failed to process request: unknown.
有多种方法。
内部版本xxxx
,就是内部版本号了。操作系统版本 xxxx
操作系统版本 xxxx
安装好 Nvidia 显卡驱动之后,cmd命令执行 nvidia-smi 命令,有类似如下的输出:
第一行的 Driver Version: 470.76 CUDA Version: 11.4
就是驱动版本和cuda版本。
C:> nvidia-smi
Sat Jun 12 19:40:31 2021
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 470.76 Driver Version: 470.76 CUDA Version: 11.4 |
|-------------------------------+----------------------+----------------------+
| GPU Name TCC/WDDM | Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|===============================+======================+======================|
| 0 NVIDIA GeForce ... WDDM | 00000000:01:00.0 Off | N/A |
| N/A 41C P8 4W / N/A | 311MiB / 6144MiB | 0% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=============================================================================|
| 0 N/A N/A 1408 C+G Insufficient Permissions N/A |
| 0 N/A N/A 3672 C+G ...8bbwe\WindowsTerminal.exe N/A |
| 0 N/A N/A 6916 C+G ...ekyb3d8bbwe\YourPhone.exe N/A |
| 0 N/A N/A 8208 C+G ...artMenuExperienceHost.exe N/A |
| 0 N/A N/A 9908 C+G ...5n1h2txyewy\SearchApp.exe N/A |
| 0 N/A N/A 11220 C+G ...2txyewy\TextInputHost.exe N/A |
| 0 N/A N/A 12884 C+G ...mesg\WeChat\WeChatApp.exe N/A |
| 0 N/A N/A 13464 C+G ...ms\mesg\WeChat\WeChat.exe N/A |
| 0 N/A N/A 13936 C+G ...cw5n1h2txyewy\LockApp.exe N/A |
| 0 N/A N/A 15880 C+G ...ms\editor\vscode\Code.exe N/A |
| 0 N/A N/A 17288 C+G ...5n1h2txyewy\SearchApp.exe N/A |
+-----------------------------------------------------------------------------+
Client:
Cloud integration: 1.0.17
Version: 20.10.7
Server: Docker Engine - Community
Engine:
Version: 20.10.7
wsl cat /proc/version
Linux version 5.4.72-microsoft-standard-WSL2 (oe-user@oe-host) (gcc version 8.2.0 (GCC)) #1 SMP Wed Oct 28 23:40:43 UTC 2020
如上,版本是 5.4.72。
User Guide — NVIDIA Cloud Native Technologies documentation
CUDA on WSL :: CUDA Toolkit Documentation