在docker中构建深度学习环境
零、安装前的一些说明
在docker中搭建开发环境,具有显著的优势:
- 可以单独配置开发环境,防止不同项目使用的环境配置不同而发生环境冲突问题(PS:环境冲突真的是第一头大、浪费开发时间且有时候很难的debug发现的问题)
- 充分保护主机环境不会因为环境搭建失误而发生系统崩溃
- 便于项目迁移和部署
在docker中搭建深度学习开发环境,需要使用Nvidia提供的工具Nvidia Container Toolikit,根据官网给出的架构图,可以分析出以下内容: - 主机需要正常运行Nvidia GPU,即在主机上要安装好显卡驱动(Nvidia Driver)
- 通过docker来调用Nvidia Driver,在容器中虚拟出了Nvidia Driver
- 在容器中安装CUDA和cuDNN
一、安装Nvidia Driver
[[Ubuntu22.04安装Nvidia驱动、CUDA和cuDNN]]
二、安装docker
参考资料https://docs.docker.com/engine/install/ubuntu/
2.1 卸载旧版本
旧版本的 Docker 称为 docker
或者 docker-engine
,使用以下命令卸载旧版本
1 | sudo apt-get remove docker docker-engine docker.io |
2.2 添加源
由于 apt
源使用 HTTPS 以确保软件下载过程中不被篡改。因此,我们首先需要添加使用 HTTPS 传输的软件包以及 CA 证书。
1 | sudo apt-get update |
为了确认所下载软件包的合法性,需要添加软件源的 GPG
密钥。
1 | curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg |
然后,向 sources.list
中添加 Docker 软件源
1 | echo \ |
2.3 安装 Docker
更新 apt 软件包缓存,并安装 docker-ce
1 | sudo apt-get update |
三、安装NVIDIA Container Toolkit
3.1 安装
3.1.1 配置存储库
1 | curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \ |
3.1.2 更新包列表
1 | sudo apt-get update |
3.1.3 安装包
1 | sudo apt-get install -y nvidia-container-toolkit |
3.2 配置Docker
3.2.1 使用nvidia-ctk命令配置container runtime
nvidia-ctk命令用于修改主机上的/etc/docker/daemon.json文件,该文件的更新使得Docker能够使用NVIDIA Container Runtime
1 | sudo nvidia-ctk runtime configure --runtime=docker |
3.2.2 重启docker服务
1 | sudo systemctl restart docker |
3.3 测试
拉取Nvidia提供的镜像,产看在镜像中是否能够使用nvidia-smi
1 | sudo docker run --rm --gpus all nvidia/cuda:11.6.1-devel-ubuntu20.04 nvidia-smi |
在终端输出以下结果,说明安装成功
四、拉取镜像构建容器
4.1 构建容器
1 | sudo docker run --gpus all -it nvidia/cuda:11.6.1-devel-ubuntu20.04 bash |
关于Nvidia提供的镜像版本的说明:
Dockerhub官网上面,Nvidia官方提供了一些特定CUDA版本的镜像,地址为https://hub.docker.com/r/nvidia/cuda/tags?page=1&ordering=last_updated可以直接拉取相关镜像。
查询CUDA12.2.0的版本,可以发现Nvidia提供的镜像有三个版本,分别是base、runtime和devel,从镜像大小可以发现,base$\textless$runtime$\textless$devel,三种镜像的区别如下:
- base:这个版本从CUDA9.0开始,包含了部署预构建CUDA应用程序的最低限度。如果你想自己安装需要的CUDA包,可以选择使用这个镜像版本,但如果想省事,不建议使用该镜像
- runtime:这个版本通过添加CUDA工具包中的所有共享库来扩展base镜像,如果使用多个CUDA库的预构建应用程序(也就是已经编译好的程序),可使用此镜像。但是如果想借助CUDA中的头文件对自己的工程进行编译,则会出现找不到头文件的错误。
- devel:这个版本通过添加编译器工具链、测试工具、头文件和静态库来扩展runtime镜像,使用此镜像可以从源代码编译CUDA应用程序,如果想用docker镜像做开发环境,建议使用devel版本的镜像。
一般都使用devel镜像。
4.2 在容器中安装常用的包
1 | # 获取最新软件包 |
一条命令
1 | apt-get install vim iputils-ping wget procps git |
五、在容器中安装Pytorch
5.1 确定cuda版本
在容器中输入nvcc -V
确定CUDA版本
5.2 安装miniconda
进入miniconda官网,选择命令行下载,获取命令行下载的指令。
新建终端输入如下指令。
1 | mkdir -p /home/miniconda3 |
安装完成后,初始化miniconda和shell
1 | /home/miniconda3/bin/conda init bash |
(可选)取消每次启动自动激活miniconda的基础环境base
1 | conda config --set auto_activate_base false |
5.3 安装Pytorch
创建Pytorch虚拟环境,这里选择Python3.8,大于等于Python3.8均可。
1 | conda create -n pytorch python=3.8 |
激活Pytorch环境
1 | conda activate pytorch |
在Pytorch官网查看安装指令,这里可以看到最新版的pytorch支持到CUDA12.1,而docker中的的CUDA11.6,安装CUDA11.6对应的pytorch版本
1 | conda install pytorch==1.13.1 torchvision==0.14.1 torchaudio==0.13.1 pytorch-cuda=11.6 -c pytorch -c nvidia |