在支持[CUDA / EC2 / AWS] GPU的EC2上运行带有CUDA的Docker镜像
1. 设备设置
1-1. 要安装在主机(EC2)上的东西。
-
- docker – 公式インストール手順
nvidia-driver – 公式インストール手順
nvidia-docker – 公式インストール手順
如果在Docker上有这样的东西就好了。
-
- CUDA
-
- (cuDNN)
- (python3)
2. 环境
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)
在这种情况下,选择下拉菜单并点击搜索按钮。
然后,显示推荐使用版本为470.141.03的Nvidia驱动程序。
由于nvidia-driver需要通过命令行进行安装,因此您无需在此处点击下载按钮。
3-1-3. 安装Nvidia驱动程序。
我按照公式文档中所写的“2. Runfile安装程序”进行操作。
事前准备
-
- 如果您尚未执行上述公式文件中的“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上执行上述命令。
在这里,使用键盘进行交互式安装的感觉会被带来。
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这样的命令……?
虽然还没有确定,但我们期待它能向好的方向发展。