在支持[CUDA / EC2 / AWS] GPU的EC2上运行带有CUDA的Docker镜像

1. 设备设置

1-1. 要安装在主机(EC2)上的东西。

    • docker – 公式インストール手順

nvidia-driver – 公式インストール手順

nvidia-docker – 公式インストール手順

如果在Docker上有这样的东西就好了。

    • CUDA

 

    • (cuDNN)

 

    (python3)

2. 环境

InformationEC2 instance typep2GPUTesla K80docker20.10.17docker imagenvidia/cuda:11.4.1-cudnn8-devel-ubuntu20.04nvidia-driver470.141.03nvidia-docker2.11.0

3. 安装方式

3-1. 主机端

3-1-1. Docker:

3-1-1. Docker:

我按照Docker官方文档进行了安装。由于还有很多其他文章,所以省略不列举。

请确认nvidia驱动程序的版本为3-1-2。

接下来,我们要在以下网站上确认应该安装哪个版本的nvidia驱动程序。

 

根据所使用的GPU类型,才能确定应该使用哪个版本的nvidia驱动程序。
例如,我使用的是EC2的p2机器,通过以下命令确认GPU类型后发现,它装载的是tesla K80。

$ lspci | grep -i nvidia
00:1e.0 3D controller: NVIDIA Corporation GK210GL [Tesla K80] (rev a1)

在这种情况下,选择下拉菜单并点击搜索按钮。

image.png

然后,显示推荐使用版本为470.141.03的Nvidia驱动程序。

2022-09-08_13h02_28.png

由于nvidia-driver需要通过命令行进行安装,因此您无需在此处点击下载按钮。

3-1-3. 安装Nvidia驱动程序。

我按照公式文档中所写的“2. Runfile安装程序”进行操作。

事前准备

    1. 如果您尚未执行上述公式文件中的“1.1. Pre-Installation Requirements”,建议您先执行此步骤。

如果您的机器已经安装了nouveau驱动程序,您可以按照本文档或本文档中提到的方法来禁用nouveau。您可以使用以下命令检查nouveau是否正在运行,如果有任何输出,则先禁用它。

$ lsmod | grep -i nouveau

开始安装

根据公式文档的第二步“运行文件安装程序”,依次执行命令。

在安装nvidia驱动程序时,会在Shell上出现类似UI的东西,并通过交互方式进行安装。
类似下面这样的感觉。

$ sudo sh ./NVIDIA-Linux-x86_64-470.141.03.run ..............
Verifying archive integrity... OK
Uncompressing NVIDIA Accelerated Graphics Driver for Linux-x86_64 470.141.03..................................................

再等一会儿,将会出现以下的用户界面。
※ 如果在teraterm上执行上述命令。

image.png

在这里,使用键盘进行交互式安装的感觉会被带来。

3-1-4. 安装Nvidia-Docker

我按照官方安装步骤安装了nvidia-docker。
只需要逐个输入命令。我即使全部复制和粘贴也能成功安装。

请在主机中(EC2)安装,而不是在Docker容器内安装。o(。>∆<)o

3-2. 对于Docker的准备工作

对于CUDA和cuDNN,由于有预先安装的专用Docker镜像,因此我们使用了它们。

3-2-1. 选择CUDA版本

在之前的NVIDIA驱动程序版本确认界面上,如果选择了Tesla K80,则只能选择CUDA版本11.4。

特斯拉K80可能有点过时吧。
至少,在那个屏幕上选择可用的CUDA版本之一似乎是一个不错的选择。

由于这样的背景,我们选择了CUDA 11.4版本。

选择Docker镜像的3-2-2方案。

我在这里找到了可供选择的Docker镜像。

 

我选择了nvidia/cuda:11.4.1-cudnn8-devel-ubuntu20.04,因为我想在我的情况下使用CUDA 11.4版本并且使用cuDNN,同时也想使用尽可能新的Ubuntu系统。

3-2-3. 创建Dockerfile

然后,按照这种方式创建Dockerfile就可以了。

FROM nvidia/cuda:11.4.1-cudnn8-devel-ubuntu20.04

...

如果不需要cuDNN,似乎也有不带cuDNN的镜像可供使用,可以利用它。
然后按照平常一样构建Docker即可。

4. 检查安装结果

4-1. 检查 nvidia-driver 的版本。

这将在主机端(EC2)执行。
你确保在EC2端安装了nvidia-driver对吧?|・ω・`)コソッ

$ cat /proc/driver/nvidia/version
NVRM version: NVIDIA UNIX x86_64 Kernel Module  470.141.03  Thu Jun 30 18:45:31 UTC 2022
GCC version:  gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.1)

4-1. 确认 nvidia-docker 的版本

这个也是在主机上(EC2)执行的。
nvidia-docker也安装在EC2上了,对吧?|・`ω・´)チラリッ

$ nvidia-docker version
NVIDIA Docker: 2.11.0  # <----- ここに1行追加されてる
Client: Docker Engine - Community
 Version:           20.10.17
 API version:       1.41
 Go version:        go1.17.11
 Git commit:        100c701
 Built:             Mon Jun  6 23:02:57 2022
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      true

Server: Docker Engine - Community
 Engine:
  Version:          20.10.17
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.17.11
  Git commit:       a89b842
  Built:            Mon Jun  6 23:01:03 2022
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.6.8
  GitCommit:        9cd3357b7fd7218e4aec3eae239db1f68a5a6ec6
 runc:
  Version:          1.1.4
  GitCommit:        v1.1.4-0-g5fd4c4d
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

4-3. 验证所有操作

由于先前安装的内容相互关联,因此需要确认整体是否正常运行。
在执行以下命令之前,建议先进行docker构建。

由于需要执行nvidia-docker,所以以下命令也需要在主机上(EC2)执行!|电线杆|∀゜`)ジー

# docker image名は各自で変更してね
$ nvidia-docker run --rm --gpus all nvidia/cuda:11.4.2-cudnn8-devel-ubuntu20.04 nvidia-smi
Thu Sep  8 04:39:31 2022
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 470.141.03   Driver Version: 470.141.03   CUDA Version: 11.4     |
|-------------------------------+----------------------+----------------------+
| 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  Tesla K80           Off  | 00000000:00:1E.0 Off |                    0 |
| N/A   46C    P0    60W / 149W |      0MiB / 11441MiB |    100%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+

如果显示出像上述的表格,那就表示一切顺利运作着。

5. 启动命令的注意事项

# ダメだった...
$ docker run -it ....

# こうすればOK
$ nvidia-docker run -it ....

根据以上情况,我发现使用常规的docker命令时,我的GPU无法被识别。这需要注意。似乎最好使用nvidia-docker run …的方式。

我认为大家都没问题,但是在安装了nvidia-docker之后,执行sudo systemctl restart docker是需要的,还要考虑重新启动docker守护进程。

6. 我的想法

这样的话,和docker-compose配合使用就很难了呢…

嗯,最近由于Docker更新,命令输入方式发生了变化,变成了类似于Docker Compose的输入方式,所以或许可以使用nvidia-docker compose up这样的命令……?

虽然还没有确定,但我们期待它能向好的方向发展。

广告
将在 10 秒后关闭
bannerAds