运维系列:2022最新 Docker 和 WSL2 ,炼丹环境配置指南
2022最新 Docker 和 WSL2 ,炼丹环境配置指南
2023.7.27更新:此内容有许多变化,已更新最新文章:
零、写在正文前,炼丹环境选择指南
写者之前的工作是 Linux 相关开发,去年十月毅然辞职考研,准备两个月时间成功上岸中部某 985 计算机专硕。今年4月份联系导师,开启了我的炼丹/搬砖生活。
炼丹前的配置环境的方案,写者查阅了很多博客,知乎专栏,新新旧旧,只言片语之中,慢慢探索出来一条 Windows 炼丹比较稳妥的方案。在此之后写者发现,大多数炼丹师循着前辈的足迹,选择使用 Conda 这种虚拟环境配置方案,可以在不同的要求下,配置不同版本的炼丹环境,这的确是比较容易的,而且相关技术文档比较多的一条路线。如果追求稳定和不操心,Anaconda 是一种相当稳妥的配置环境的方案。
而全网上对于 Docker 炼丹环境的配置,可能这是第一篇完整且细致的文章了。
一、为什么使用 Docker 配置炼丹环境
首先,在 WSL2 的发布之前,Docker 在 Windows 上完全是以虚拟机的形式实现的,这意味着不小的性能损耗,并且不支持 GPU 的调用,想用 Docker 在 Windows 平台炼丹的复杂程度堪比登天。WSL2 作为微软拥抱 Linux 社区的一份贡献,使得 Docker 现在完全可以通过 WSL2 来原生运行。
在 Win11 环境中大约有 66% 在 Ubuntu2004 中的机器学习速度,而在 WSL2 中则有 80% 的在Ubuntu2004 中的机器学习速度。使用Docker的炼丹更快!
其次,Docker 是跨平台的,如果 80% 的炼丹速度对你有困扰,完全可以在将你的 Docker 炼丹环境上传到云端,在 Linux 服务器上安装 Docker 之后,再从云端拉取下来,完全可以像 Git 使用代码一样使用深度学习环境。使用 Docker 的跨平台兼容性更好!
最后,使用 Conda 配置 Cuda 炼丹环境,通常情况下除去 Conda 不说,还需要安装 Nvidia 显卡驱动,还有cudatools 包、cudnn 包等等。这些包体积都很大,而且服务器都在国外,下载速度很堪忧。而 Docker 的镜像已经包含了这些包,只需要等待 Docker 镜像下载完成,就能实现开箱即用。使用 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)。如果已经开启虚拟化支持,在任务管理器中可以看到虚拟化已启用。
另一个是 Windows 的 Hyper-V 功能开启,这个功能默认是关闭的。(注意,台式机主板重置后会默认关闭)
WSL2 安装就比较简单了,直接在 Microsoft Store 中直接搜索 Windows Subsystem for Linux Preview 安装。
再安装你喜欢的 Linux 发行版,写者使用的是 Ubuntu20.04 LTS, 与写者在实验室的环境一致,方便后期到服务器运行代码。这里注意,配置完账户和密码后,一般是不需要进 WSL 内部继续设置了。
安装 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;
但是写者发现,仅能使用 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 连接。在左下角边栏有“服务”(service)选项,选中该选项中顶部 “+”选项
添加 Docker 连接,弹出菜单对话框,Windows 默认使用 Docker for WIndows,Linux 可以使用 Unix socket点击确定;如果是远程链接,使用 tcp 套接字,填入自己的ip后,点击确定。
添加 Docker 注册表 ,这个是为了添加自己的 Docker 账户,拉去和推送镜像更方便。
添加 Docker 镜像的 Python 编译器。点击右下角的编译器名字,可以添加解释器。
选择 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。(这里是路径选择方式)
最后完成之后的配置结果如下图:
至此,就可以愉快的炼丹了!
参考这篇搞了个跑 MOSS 的 Dockerfile
WSL2能跑深度学习吗?性能如何? - 林一二的回答 - 知乎
https://www.zhihu.com/question/442088876/answer/3002166413
主要是各 LLM 例如 MOSS ChatGLM 等等,都还在用 pytorch v1,不升级,不知道为啥
Windows安装好显卡驱动后,我在WSL2,安装了mini conda,然后配置好清华源,之后使用conda创建一个python环境激活后,通过 conda install pytorch torchvision torchaudio pytorch-cuda=11.7 -c pytorch -c nvidia 安装好的pytorch能够直接访问到GPU, 不过我有一个问题,安装了Docker Desktop For Windows后,Windows和WSL2都能够使用这个docker,那么这时候我在Windows的powershell和wsl2中 的命令行进行docker pull 和docker run有区别吗(镜像应该是一致的?), 这时候使用 nvcr.io/nvidia/pytorch:22.10-py3 这个镜像( 可以Windows拉取也可以wsl2拉取) 和wsl2中cuda安装 的pytorch运行起来有什么差异吗(性能wsl2中的会好一些吗?)
请问开启Hyper-V的作用是什么?
mac转win,问个问题,普通后端开发是不是也是通过wsl2建立一个docker代替命令行工具和linux环境,然后ide远程连接开发?
现在wsl2搭环境更简单了 ubuntu22.04镜像+nvidia-docker2+tensorflow镜像就行了
这样有了docker镜像之后 docker save导出这个镜像,wsl --import导入这个镜像,wsl2可以直接使用这个镜像了,没有docker这一层
我的理解是:现在最新版本的docker-desktop用的就是wsl2,在安装docker-desktop后,就相当于安装了一个docker公司专用的linux。当然,你也可以自己利用wsl2安装liunx,然后再在里面安装对应系统的docker环境,但是不知道这种情况下,gpu是否还可以透传,只知道gpu肯定能透传到wsl2 linux,不知道的是还是否可以继续头传到docker中。