写文章
点击打开尼玛的主页
2022最新 Docker 和 WSL2 ,炼丹环境配置指南

2022最新 Docker 和 WSL2 ,炼丹环境配置指南

192 人赞同了该文章
目录
收起
2023.7.27更新:此内容有许多变化,已更新最新文章:
零、写在正文前,炼丹环境选择指南
一、为什么使用 Docker 配置炼丹环境
二、Docker 深度学习环境搭建
在 Linux 上搭建
在 Windows 上搭建
在 Pycharm 使用 Docker 环境
在 WSL2 中 Docker 调用 Nvidia GPU 使用 CUDA 训练模型

2023.7.27更新:此内容有许多变化,已更新最新文章:


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

写者之前的工作是 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 系统为例:首先使用命令行安装 Dockerdocker_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 容器配置
项目 设置

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

编辑于 2023-07-27 15:34 ・IP 属地湖南
Docker
WSL (Windows Subsystem for Linux)
机器学习
赞同 192​ 65 条评论
分享
喜欢 ​ 收藏
欢迎参与讨论

65 条评论
默认
最新
我没有开挂
在win10下使用wsl2炼丹一年了,感觉挺好
2022-07-25 · IP 属地湖南
回复 ​ 4
睡前思想家
答主 你炼丹怎么处理数据穿透的呢 我现在wsl2 读Windows数据好慢啊
2022-07-26 · IP 属地安徽
回复 ​ 1
Necromancer
Win11支持挂载ext4的硬盘,不是的话就把数据放wsl里吧,1t的ssd cv基本够了
2022-08-18 · IP 属地江苏
回复 ​ 1
无人知晓
作者
这几天训练8G,8w张的数据集,瓶颈都在显卡上,我是机械硬盘,训练数据集都是一个batchsize传输的,没有说必须全部传输才能开始。你是怎么操作的,用途是什么?
2022-07-26 · IP 属地河南
回复 ​ 喜欢
展开其他 2 条回复 ​
无人知晓
作者
注意nvidia-docker2 已被废弃。新方案采用--gpus参数支持GPU调用。同时需要设置环境变量NVIDIA-DRIVER即可
2023-07-29 · IP 属地湖南
回复 ​ 2
林一二

参考这篇搞了个跑 MOSS 的 Dockerfile
WSL2能跑深度学习吗?性能如何? - 林一二的回答 - 知乎
zhihu.com/question/4420

2023-04-26 · IP 属地上海
回复 ​ 1
无人知晓
作者
也可以换到pytorch2.0试试,速度提升
2023-04-26 · IP 属地湖南
回复 ​ 喜欢
林一二

主要是各 LLM 例如 MOSS ChatGLM 等等,都还在用 pytorch v1,不升级,不知道为啥

2023-04-27 · IP 属地上海
回复 ​ 喜欢
渺啊渺

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中的会好一些吗?)

2022-10-31 · IP 属地江苏
回复 ​ 1
无人知晓
作者
这个docker是用了wsl2内核,所以powershell里面用docker,就是调用wsl2里面的docker,没区别。在wsl2中使用cuda和docker里面使用cuda没性能差异。
2022-10-31 · IP 属地湖南
回复 ​ 3
渺啊渺
明白了,底层都是同一个内核,谢谢 [大笑]
2022-10-31 · IP 属地江苏
回复 ​ 1
Leslie Tung

请问开启Hyper-V的作用是什么?

2023-08-10 · IP 属地上海
回复 ​ 喜欢
无人知晓
作者
Wsl基于hyper-v,hyper-v是windows的官方虚拟机
2023-08-10 · IP 属地湖南
回复 ​ 喜欢
随和的Cruiselin
写的很好,现在网上的教程都过时了
2023-08-01 · IP 属地辽宁
回复 ​ 喜欢
无人知晓
作者
你看2023版的。这个也不对了
2023-08-01 · IP 属地湖南
回复 ​ 喜欢
探索

mac转win,问个问题,普通后端开发是不是也是通过wsl2建立一个docker代替命令行工具和linux环境,然后ide远程连接开发?

2023-06-03 · IP 属地上海
回复 ​ 喜欢
无人知晓
作者
可以啊,我就是这么搞的
2023-06-03 · IP 属地湖南
回复 ​ 喜欢
山竹

现在wsl2搭环境更简单了 ubuntu22.04镜像+nvidia-docker2+tensorflow镜像就行了[大笑]

2023-05-07 · IP 属地北京
回复 ​ 喜欢
无人知晓
作者
注意:nvidia-docker2已被废弃。新方案添加运行参数--gpus 即可
2023-07-29 · IP 属地湖南
回复 ​ 喜欢
山竹

这样有了docker镜像之后 docker save导出这个镜像,wsl --import导入这个镜像,wsl2可以直接使用这个镜像了,没有docker这一层[大笑]

2023-05-08 · IP 属地北京
回复 ​ 喜欢
牛啤
栏主的意思我没懂,是先用WSL2子系统安Linux,然后在Linux子系统中用Docker吗?
2023-04-29 · IP 属地上海
回复 ​ 喜欢
无人知晓
2023-06-23 · IP 属地湖南
回复 ​ 喜欢
漂泊的风

我的理解是:现在最新版本的docker-desktop用的就是wsl2,在安装docker-desktop后,就相当于安装了一个docker公司专用的linux。当然,你也可以自己利用wsl2安装liunx,然后再在里面安装对应系统的docker环境,但是不知道这种情况下,gpu是否还可以透传,只知道gpu肯定能透传到wsl2 linux,不知道的是还是否可以继续头传到docker中。

2023-06-23 · IP 属地四川
回复 ​ 喜欢
展开其他 1 条回复 ​
点击查看全部评论
欢迎参与讨论

推荐阅读

  • 搭建 WSL2 下的 Kali 环境(含GUI及空间优化)

    搭建 WSL2 下的 Kali 环境(含GUI及空间优化)

    在wsl2中使用GPU

    在wsl2中使用GPU

    从零开始的WSL深度学习环境配置

    前言本教程适用于想要在Window环境下跑Linux环境下的深度学习代码,又不想用虚拟机的同学。 安装WSLWSL1与WSL2WSL是适用于Linux的Windows子系统,可让开发人员按原样运行 GNU/Linux 环境。 …

    WSL2 Ubuntu配置桌面

    WSL2 Ubuntu配置桌面