之前给大家介绍了主机安装方式——如何在 Ubuntu 操作系统下安装部署 AI 环境,但随着容器化技术的普及,越来越多的程序以容器的形式进行部署,通过容器的方式不仅可以简化部署流程,还可以随时切换不同的环境。
实际上很多云服务厂商也是这么干的,用一台带有 NVIDIA 显卡的机器来部署多个容器,然后通过容器的方式来提供给用户使用,这样就可以充分利用显卡资源了。今天给大家介绍一下如何使用 Docker 的方式来部署我们之前部署过的 AI 环境。
目标
我们可以跟之前一样制定一个小目标:
-
在 Docker 容器中可以正常执行
nvidia-smi
命令 -
在 Docker 容器中可以正常执行
python -c "import torch; print(torch.cuda.is_available())"
命令
好奇的同学可能会问,为什么不在 Docker 容器中执行nvcc --version
命令呢?这个问题留到后面再解释。
通俗易懂讲解大模型系列
- 用通俗易懂的方式讲解大模型:在 Ubuntu 22 上安装 CUDA、Nvidia 显卡驱动、PyTorch等大模型基础环境
- 用通俗易懂的方式讲解大模型:Llama2 部署讲解及试用方式
- 用通俗易懂的方式讲解大模型:LangChain 知识库检索常见问题及解决方案
- 用通俗易懂的方式讲解大模型:基于 LangChain 和 ChatGLM2 打造自有知识库问答系统
- 用通俗易懂的方式讲解大模型:代码大模型盘点及优劣分析
- 用通俗易懂的方式讲解大模型:Prompt 提示词在开发中的使用
技术交流
建了大模型技术交流群! 想要学习、技术交流、获取如下原版资料的同学,可以直接加微信号:mlc2060。加的时候备注一下:研究方向 +学校/公司+CSDN,即可。然后就可以拉你进群了。
方式①、微信搜索公众号:机器学习社区,后台回复:加群
方式②、添加微信号:mlc2060,备注:来自CSDN + 技术交流
预安装工作
我们还是以 Ubuntu 22.04 操作系统为例,首先我们要安装 Docker,这里就不再赘述了,可以参考官方文档[2]进行安装。
Docker 安装完成后,如果你想以非 root 用户执行docker
命令的话,还需要将当前用户添加到docker
用户组中,命令如下:
# 先确保 docker 用户组已存在
sudo usermod -aG docker <user-name>
安装 NVIDIA 驱动
安装 NVIDIA 驱动的步骤可以参考之前的文章,这里就不再赘述了。
安装 NVIDIA Container Toolkit
NVIDIA Container Toolkit 允许开发者和用户将 NVIDIA GPU 的能力无缝地加入到 Docker 容器中。通过简单地安装一个插件,用户就可以运行为 GPU 优化的容器,无需进行任何修改。该工具集包括 NVIDIA 驱动、CUDA 等必要组件,确保 GPU 在容器环境中的高性能执行,对 AI、数据分析和高性能计算场景特别有用。
我们可以通过以下命令来安装 NVIDIA Container Toolkit:
# 先切换到 root 用户
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | apt-key add -
# 添加源
curl -s -L https://nvidia.github.io/nvidia-docker/ubuntu22.04/nvidia-docker.list > /etc/apt/sources.list.d/nvidia-docker.list
# 更新源
apt update
# 安装 NVIDIA Container Toolkit
apt -y install nvidia-container-toolkit
# 重启 Docker 服务
systemctl restart docker
安装完成后,系统会一并安装 NVIDIA Container Toolkit 的 CLI 命令(nvidia-ctk),我们可以运行该命令确认安装是否成功:
$ nvidia-ctk --version
NVIDIA Container Toolkit CLI version 1.13.5
commit: 6b8589dcb4dead72ab64f14a5912886e6165c079
然后我们就可以在 Docker 容器中运行nvidia-smi
命令,验证是否可以在 Docker 容器中正常使用 NVIDIA 显卡了,我们下载一个简单的镜像来进行验证:
$ docker run --rm --gpus all nvidia/cuda:11.7.1-base-ubuntu22.04 nvidia-smiWed Aug 16 03:04:19 2023
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 470.199.02 Driver Version: 470.199.02 CUDA Version: 11.7 |
|-------------------------------+----------------------+----------------------+
| 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 Quadro M6000 Off | 00000000:03:00.0 Off | Off |
| 28% 38C P8 13W / 250W | 15MiB / 12210MiB | 0% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------++-----------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=============================================================================|
+-----------------------------------------------------------------------------+
可以看到,我们在 Docker 容器中可以正常使用 NVIDIA 显卡了。
下载 Docker 镜像
要运行 AI 环境,一般需要安装 CUDA 和 PyTorch,之前我们是在主机上安装这 2 个程序,但使用 Docker 的方式,我们可以直接下载已经安装好 CUDA 和 PyTorch 的镜像,这里推荐使用这个镜像:anibali/pytorch
[4]
,这个镜像中包含了 CUDA 和 PyTorch,我们可以通过以下命令来运行镜像:
$ docker run --rm --gpus all anibali/pytorch:1.13.0-cuda11.8-ubuntu22.04 nvidia-smiWed Aug 16 03:09:33 2023
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 470.199.02 Driver Version: 470.199.02 CUDA Version: 11.8 |
|-------------------------------+----------------------+----------------------+
| 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 Quadro M6000 Off | 00000000:03:00.0 Off | Off |
| 28% 38C P8 13W / 250W | 15MiB / 12210MiB | 0% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------++-----------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=============================================================================|
+-----------------------------------------------------------------------------+
可以看到 CUDA 版本显示的是 11.8,跟 Docker 镜像中的 CUDA 版本是一致的。
我们再来看在 Docker 容器中是否可以正常执行python -c "import torch; print(torch.cuda.is_available())"
命令:
# 进入 Docker 容器
$ docker run -it --rm --gpus all anibali/pytorch:1.13.0-cuda11.8-ubuntu22.04 bash
$ user@32e8c83f88c3:/app$ python -c "import torch; print(torch.cuda.is_available())"
True
通过结果可以证明,容器中的 CUDA 和 PyTorch 程序可以正常使用。
为什么不在 Docker 容器中执行 nvcc 命令
回到原先那个问题,为什么不在 Docker 容器中执行**nvcc --version
命令呢?我们可以在 Docker 容器中执行nvcc --version
**命令,看看会发生什么:
user@32e8c83f88c3:/app$ nvcc --version
bash: nvcc: command not found
发现容器中找不到nvcc
命令,但是 CUDA 又是可以正常访问,再看 CUDA 的安装目录:
user@32e8c83f88c3:/app$ ls /usr/local/cuda*
/usr/local/cuda:
compat lib64 targets/usr/local/cuda-11:
compat lib64 targets/usr/local/cuda-11.8:
compat lib64 targets
可以看到在 CUDA 安装目录中并没有bin
文件夹(一般nvcc
命令会放到这个文件夹里面),这是因为有些 Docker 镜像为了节省资源,会将一些不需要的文件去掉,只保留最核心的文件,已达到减小 Docker 镜像大小的目的。
总结
Docker 安装与主机安装的方式相比,我们少安装了 CUDA 和 PyTorch 程序,多安装了NVIDIA Container Toolkit
和下载 Docker 镜像,但整体花费的时间其实是减少了的(因为 CUDA 和 PyToch 安装时间比较长)。Docker 安装最大的好处就是可以随时切换不同的环境,而且不会影响到主机的环境。比如我们今天安装了 CUDA 11.x 的版本,后面程序升级了可能需要安装 CUDA 12.x 的版本,如果是主机安装的话,就要卸载老的 CUDA 再重新安装新的 CUDA,这样就比较麻烦了,但是如果是 Docker 安装的话,我们只需要下载新的 Docker 镜像就可以了,非常方便。希望今天的分享可以帮助大家更好的使用 Docker 来部署 AI 环境,如果有任何疑问,欢迎在评论区沟通讨论。
关注我,一起学习各种人工智能和 AIGC 新技术,欢迎交流,如果你有什么想问想说的,欢迎在评论区留言。
参考资料
-
How to Use the NVIDIA GPU in Docker Containers on Ubuntu 22.04 LTS[5]
-
NVIDIA Container Toolkit Installation Guide[6]
参考:
[2]
官方文档: https://docs.docker.com/engine/install/ubuntu/
[4]
anibali/pytorch: https://hub.docker.com/r/anibali/pytorch
[5]
How to Use the NVIDIA GPU in Docker Containers on Ubuntu 22.04 LTS: https://linuxhint.com/use-nvidia-gpu-docker-containers-ubuntu-22-04-lts/
[6]
NVIDIA Container Toolkit Installation Guide: https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html