Docker Desktop 中使用GPU

Docker Desktop 中使用GPU

2021-06-12

端午放假,没有回家,配置了一下环境,实现了在Windows 系统下 Docker Desktop 容器中使用GPU。记录一下过程。
据说在docker 容器内使用GPU属于显卡透传。

环境需求和软件版本

我的环境如下:

  • win10 版本21390
  • WSL2 5.4.72
  • Docker Desktop 20.10.7
  • CUDA driver for WSL2 470.76,同时 CUDA Version: 11.4
  • 显卡:NVIDIA GeForce 1060

说明

一开始,在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 就能用了。
注:

  • 只需要在宿主机上安装 CUDA for WSL2 驱动,不用其它cuda驱动
  • 不需要在 WSL2 中安装任何 CUDA 驱动,win10安装 CUDA for WSL2 驱动之后,wsl2 内会自动有对应的驱动。
  • 不需要在 WSL2中安装dockerd,因为最新的 Docker Desktop 支持使用 WSL2 backend,用 WSL2 backend,启动的容器不需要额外配置就能
    直接访问到GPU。

安装过程

安装之前,我电脑已经启用了WSL2,并安装了 Docker Desktop 20.10.7,Window是版本是专业版 19043。以此为起点,我的环境还差两步:

  1. 安装 CUDA for WSL2 驱动
  2. 把 Windows 10 升级到 21390
    这两步不分先后,先执行哪个都一样。

安装 CUDA for WSL2 驱动

从CUDA for WSL2下载驱动,根据显卡类型(GEFORCE 或者 QUADRO )选择对应的下载链接。
这个驱动还不是正式发行版。下载这个驱动需要注册账号。下载完成后点击执行,安装完成后重启系统。

升级win10到 21390

按微软官网的操作步骤进行Windows Insider。
当前(2021-06-12)windows 最新的稳定发布版是 19043,而显卡透传需要升级到 windows 21332,这是个测试版。
当前最新的测试版是 21390。
基本步骤是:

  1. 在微软官网注册 Windows Insider Program 账号,注册地址:
    Windows Insider,注册完成后登录。注册的时候可以使用已有的
    windows账号。
  2. 在windows系统打开
    菜单路径:Settings > Update & Security > Windows Insider Program,点击 Get Started 按钮,点击 +,接下来选择 dev 通道。
    重启电脑,使配置生效。
  3. 更新系统。
    选择dev通道后,就能更新到最新版本了。
    菜单路径 Settings > Update & Security > Windows Update,然后点击 Check for updates,接着就是等待了。
    windows 会下载更新并自动安装,安装完成后需要重启电脑。
    这一步更新需要一点时间。

注:第二步,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

验证容器中是否可以使用 GPU

打开 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.

查看

查看windows内部版本号

有多种方法。

  1. 方法一:cmd 窗口,执行 winver 命令,在弹出的对话框中,有一段文字内部版本xxxx,就是内部版本号了。
  2. 方法二:我的电脑,右键,属性,在弹出的对话框中,有一段文字操作系统版本 xxxx
  3. 方法三:设置 -> 更新和安全 -> windows 更新,右边栏,相关链接,点击“OS内部版本信息”,有一段文字操作系统版本 xxxx

查看电脑是否有独立显卡

  1. 方法一:买的什么型号的电脑,买的时候一般会告诉,或者到网上搜索电脑型号,查询。
  2. 使用菜单“此电脑,右键,管理”,打开计算机管理对话框,左侧连点击“设备管理器”,右侧面板,下拉,展开“显示适配器”,每个物理显卡
    对于一个条目。
  3. cmd 执行 dxdiag,在弹出的对话框中,如果有两个显卡,会出现“显示1”,“显示2”两个标签页。
    注:dxdiag并不是百分之百准确,独立显卡驱动安装不正确的情况下,有可能检测不到独立显卡。

查看nvidia显卡信息

安装好 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      |
+-----------------------------------------------------------------------------+

查看docker desktop 的版本

  1. 命令 docker version
Client:
 Cloud integration: 1.0.17
 Version:           20.10.7

Server: Docker Engine - Community
 Engine:
  Version:          20.10.7

查看 WSL2 内核版本

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

CUDA on WSL

【转载】Windows 预览体验计划 空白 不显示内容 - 简书

你可能感兴趣的:(总结,记录,docker,windows,linux)