Life, half is memory, half is to continue.
2022最新 Docker 和 WSL2 ,炼丹环境配置指南
By Vincent. @2022.11.8
2022最新 Docker 和 WSL2 ,炼丹环境配置指南
2022最新 Docker 和 WSL2 ,炼丹环境配置指南

零、写在正文前,炼丹环境选择指南

写者之前的工作是 Linux 相关开发,去年十月毅然辞职考研,准备两个月时间成功上岸中部某 985 计算机专硕。今年4月份联系导师,开启了我的炼丹/搬砖生活。

炼丹前的配置环境的方案,写者查阅了很多博客,知乎专栏,新新旧旧,只言片语之中,慢慢探索出来一条 Windows 炼丹比较稳妥的方案。在此之后写者发现,大多数炼丹师循着前辈的足迹,选择使用 Conda 这种虚拟环境配置方案,可以在不同的要求下,配置不同版本的炼丹环境,这的确是比较容易的,而且相关技术文档比较多的一条路线。如果追求稳定和不操心,Anaconda 是一种相当稳妥的配置环境的方案。

而全网上对于 Docker 炼丹环境的配置,可能这是第一篇完整且细致的文章了。

一、为什么使用 Docker 配置炼丹环境

首先,在 WSL2 的发布之前,Docker 在 Windows 上完全是以虚拟机的形式实现的,这意味着不小的性能损耗,并且不支持 GPU 的调用,想用 Docker 在 Windows 平台炼丹的复杂程度堪比登天。WSL2 作为微软拥抱 Linux 社区的一份贡献,使得 Docker 现在完全可以通过 WSL2 来原生运行。

Docker 和 WSL2 整合

在 Win11 环境中大约有 66% 在 Ubuntu2004 中的机器学习速度,而在 WSL2 中则有 80% 的在Ubuntu2004 中的机器学习速度。使用Docker的炼丹更快!

其次,Docker 是跨平台的,如果 80% 的炼丹速度对你有困扰,完全可以在将你的 Docker 炼丹环境上传到云端,在 Linux 服务器上安装 Docker 之后,再从云端拉取下来,完全可以像 Git 使用代码一样使用深度学习环境。使用 Docker 的跨平台兼容性更好!

Pytorch 提供的 Docker 镜像

最后,使用 Conda 配置 Cuda 炼丹环境,通常情况下除去 Conda 不说,还需要安装 Nvidia 显卡驱动,还有cudatools 包、cudnn 包等等。这些包体积都很大,而且服务器都在国外,下载速度很堪忧。而 Docker 的镜像已经包含了这些包,只需要等待 Docker 镜像下载完成,就能实现开箱即用。使用 Docker 搭建环境速度块!

Conda 和 Docker 环境搭建流程

二、Docker 深度学习环境搭建

在 Linux 上搭建

以 Ubuntu2004 系统为例:首先使用命令行安装 Docker (docker_io是 Ubuntu 官方维护的, Docker Desktop 是 docker 官方维护的,写者测试前者简单且稳定,后者安装 bug 很多,不建议使用)

sudo apt-get update
sudo apt-get install docker.io  
sudo systemctl start docker(如果 D0cker 没有启动,使用这条命令启动)

安装 Nvidia 驱动,这里推荐在官网上下载 官方 GeForce 驱动程序 | NVIDIA 。执行前先给驱动文件执行权限

sudo chmod 777 <driver-name>.run
./<driver-name>.run

然后拉取自己想用的 Docker 镜像。

可选:如果希望能远程链接到 Linux 上的 Docker 容器,那么执行以下命令:

echo 'export DOCKER_HOST=tcp://0.0.0.0:2375' >> /etc/profile
source /etc/profile

在 Windows 上搭建

写者使用的是 Windows11 ,因此默认已经开启了 WSL2 。请确认已经开启了 hyper-v 虚拟化,这包含两部分:一个是 CPU 虚拟化支持,这个需要在 BIOS 中开启(AMD 为 SVM;Intel 为 Intel-vt)。如果已经开启虚拟化支持,在任务管理器中可以看到虚拟化已启用。

CPU 虚拟化支持

另一个是 Windows 的 Hyper-V 功能开启,这个功能默认是关闭的。(注意,台式机主板重置后会默认关闭)

Hyper-V 功能开启

WSL2 安装就比较简单了,直接在 Microsoft Store 中直接搜索 Windows Subsystem for Linux Preview 安装。

WSL2 安装

再安装你喜欢的 Linux 发行版,写者使用的是 Ubuntu20.04 LTS, 与写者在实验室的环境一致,方便后期到服务器运行代码。这里注意,配置完账户和密码后,一般是不需要进 WSL 内部继续设置了。

Ubuntu20.04.4 LTS

安装 Docker Desktop ,这里是官网下载:Docker Desktop release notes | Docker Documentation

注意:写者最近发现最新版的 Docker 使得 Pycharm 无法在开启的容器终端中输入,4.9.1版本没有这个问题。

2022.8.4 更新:写者发现上述bug在 Pycharm 2022.2 版本已经解决,完全可以安装最新版的 Docker 和 Pycharm (bug解决详情)。

如果有其他安装问题,这是官方指导文档:Install Docker Desktop on Windows | Docker Documentation

然后拉取自己想用的 Docker 镜像。这里以写者所用的 Pytorch 镜像为例。你可以使用以下命令拉取:

docker pull mortals/codeenv:pytorch-base-conda

写者使用的镜像相关信息在 DockerHub可以查询到,镜像相应的 DockerFile 在 GitHub 上也可以查到。

可选:如果希望远程链接 Docker 容器,则需要勾选 Docker Desktop 中设置/General/Expose daemon on tcp://localhost:2375 without TLS;

开启 Docker 远程链接

但是写者发现,仅能使用 tcp://localhost:2375 访问,就算是本机局域网 IP 都无法连接到。那么我们可以使用端口转发,并在防火墙中开启这个端口。管理员权限打开 CMD 使用以下指令修改:(注意修改your-public-ip)

netsh interface portproxy add v4tov4 listenport=2375 connectaddress=127.0.0.1 connectport=2375 listenaddress=<your-public-ip> protocol=tcp

如果不用这个 IP ,管理员权限打开 CMD 使用以下指令删除端口转发 :(注意修改your-public-ip)

netsh interface portproxy delete v4tov4 listenaddress=192.168.191.6 listenport=2375

最后如果发现不能访问,打开防火墙端口:

netsh advfirewall firewall add rule name="docker_daemon" dir=in action=allow protocol=TCP localport=2375

在 Pycharm 使用 Docker 环境

在插件中安装 Docker 插件(默认捆绑)。注意,这里需要 Pycharm 专业版,社区版的 Docker 支持不完整。

Docker 插件

添加 Docker 连接。在左下角边栏有“服务”(service)选项,选中该选项中顶部 “+”选项

Docker 连接

添加 Docker 连接,弹出菜单对话框,Windows 默认使用 Docker for WIndows,Linux 可以使用 Unix socket点击确定;如果是远程链接,使用 tcp 套接字,填入自己的ip后,点击确定。

新建 Docker 连接

添加 Docker 注册表 ,这个是为了添加自己的 Docker 账户,拉去和推送镜像更方便。

Docker 注册表

添加 Docker 镜像的 Python 编译器。点击右下角的编译器名字,可以添加解释器。

编译器添加

选择 Docker ,因为之前已经连接过了 Docker ,因此可以在这里选择镜像,之后点击确定就可以完成了。

Docker 编译器添加

到此位置,Docker 深度学习环境已经可以使用了。

在 WSL2 中 Docker 调用 Nvidia GPU 使用 CUDA 训练模型

在很多几年前的博客和教程中,大多数是安装使用 Nvidia-docker 来调用GPU,然后如果是在 WSL 中还需要安装 Nvidia 显卡的 CUDA 驱动。

写者在多日的研究 WSL2 和 Docker 文档中,发现 WSL2 已经可以透传 GPU 使用。也就是在 Windows 安装过Nvidia 驱动之后,直接可以在 WSL2 中使用 GPU,可以测试 nvidia-smi 来查看驱动。由于驱动向后兼容,尽量把驱动升级到最新,这样支持的 CUDA 的相关工具更多,尽量避免使用容器中的 CUDA 工具包不兼容出现的奇奇怪怪的 bug 。

Docker 也支持了 WSL2 GPU 透传,这就不需要再专门下载 Nvidia-docker ,使用方法就是加入运行参数

--gpus all

WSLg 也可以支持,这是 Linux 原生图形化支持。需要将 \\wsl$\Ubuntu-20.04\mnt\wslg\.X11-unix\ 映射到 /tmp/.X11-unix。(这里是路径选择方式)

wslg 路径选择

最后完成之后的配置结果如下图:

Docker 容器配置
项目 设置

至此,就可以愉快的炼丹了!

扫码分享收藏
扫码分享收藏