当前位置:   article > 正文

WIN11+WSL2+Docker 深度学习环境部署_win11 wsl2 docker

win11 wsl2 docker

2024 WIN11+WSL2 深度学习开发环境

Windows系统开发偶尔会出现一些系统底层的bug导致程序无法运行,开发很难受。

Linux系统开发,娱乐软件少,不尽兴。

双系统切换太麻烦,不能同时使用,难受!

如何结合Windows和Linux,既能畅爽娱乐,又不会被底层BUG影响开发,来试试Windows的子系统WSL2吧!!

本次思路为:在WIN11系统安装WSL2子系统,在WSL2子系统中安装docker engine,通过docker隔离不同的开发环境。

docker容器中无需再通过conda进行环境隔离,虽然可以但没必要,PyPI是Python的包管理工具,conda是多种语言的包管理工具,conda的包没有pypi全面,所以推荐使用pypi包管理工具。pypi的环境隔离确实一般,所以使用docker容器进行隔离。如果容器内部以及安装了conda,可以使用conda新建虚拟环境,再虚拟环境中的包使用pypi进行安装。pypi和conda的区别

前置任务

默认读者已经安装WIN11,因为NVIDIA GPU加速需要WIN11和WSL2。

默认读者的电脑硬件有英伟达的显卡,且已经安装了英伟达的显卡驱动。

可以用过右键Win11徽标,选择“终端管理员”,启动powershell,输入nvidia-smi,如果输出如下,那么英伟达显卡驱动安装无误。
在这里插入图片描述

关于WSL2使用NVIDIA进行并行计算的介绍 https://docs.nvidia.cn/cuda/wsl-user-guide/index.html

安装软件

WIN11安装WSL2

关于WSL的介绍 https://learn.microsoft.com/en-us/windows/wsl/

Windows Subsystem for Linux (WSL) 是 Windows 的一项功能, 使用户能够在win11和linux两种环境之间无缝过渡,而无需资源密集型的传统虚拟机,并提高生产力、使用工具进行开发并集成其工作流程。 更重要的是,WSL 2 使迄今为止只能在 Linux 上使用的应用程序可以在 Windows 上使用。 WSL 2 对 GPU 的支持使这些应用程序能够从 GPU 加速计算中受益,并扩展了可在 WSL 2 上开发的应用程序领域。

借助 NVIDIA CUDA 对 WSL 2 的支持,开发人员可以通过 WSL 在 Windows 上利用 NVIDIA GPU 加速计算技术进行数据科学、机器学习和推理。 GPU 加速还可以通过在 GPU 上以更少的 CPU 干预来处理更多并行工作,从而降低在接近本机的类似 WSL 的环境中运行应用程序的性能开销。

# 可以使用 wsl --help 查看wsl的使用方法,以下为wsl常用命令

# --status 显示WSL状态
# --update 更新WSL
# --version, -v 显示WSL版本
# --set-default-version 2 设置默认WSL版本为WSL2

# --list, -l [选项] 列出linux分发版
# 选项: 
#	--all 列出所有分发版,包括分发版当前正在安装或卸载
# 	--running 仅列出当前正在运行的分发版
# 	--quiet,-q 仅显示分发版名称
# 	--verbose, -v 显示有关所版的详细信息
# 	--online,-o 显示适合通过“wsl --install”安装的可用分发版列表

# --install 安装linux分发版
# --set-default,-s <Distro> 将分布版设置为默认值
# --shutdown 立即终止正在运行的linux分发版
# --distribution, -d 运行指定的linux分发版
# --unregister 删除某个linux分发版
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
# 更新wsl版本
wsl --update
  • 1
  • 2

在这里插入图片描述

配置WSL2代理

此步骤非必须!!!后续NVIDIA的APT下载会比较缓慢,可以选择设置WSL2代理。

如果更改,记得在ssh连接容器前把代理改回networkingMode=NAT!!!

# 按照官方说明进行设置
# https://learn.microsoft.com/zh-cn/windows/wsl/wsl-config#wslconfig
# 创建C:\Users\<UserName>\.wslconfig文件
# 将以下内容写入文件

# Settings apply across all Linux distros running on WSL 2
[wsl2]
networkingMode=mirrored
dnsTunneling=true
firewall=true
autoProxy=true

# Enable experimental features
[experimental]
autoMemoryReclaim=gradual
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

WSL2安装linux

# 查看可安装的linux分发版本
wsl --list --online
  • 1
  • 2

在这里插入图片描述

# 安装Ubuntu-22.04
wsl --install Ubuntu-22.04
# 然后在username输入用户名,在password输入用户密码

# 查看是否安装完成(如果已经在子系统中,红框的提示符不同,输入exit可以退出)
# 我安装的是Ubuntu-20.04,所以这里显示不是Ubuntu-22.04
wsl --list -v
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

在这里插入图片描述

# 运行Ubuntu-22.04
wsl --distribution Ubuntu-22.04
  • 1
  • 2

在这里插入图片描述

提示符为PS(PowerShell)则在win11环境中,提示符为UserName@MachineName则在WSL2的Ubuntu22.04中。

安装网速慢怎么办

我们常用的有apt软件源、pypi软件源、conda软件源,软件源可以理解为下载安装包的网址,后续的安装中,可能会有小伙伴们觉得下载速度慢的问题,这里统一做一下网速慢的解决方案,这个方案是通用的。

软件源国内有很多,比如华为、阿里、清华、中科大等等,大家自行选择,这里以清华镜像源为例。

# apt配置文件位置/etc/apt/sources.list
# 更换apt源
# 对配置文件进行备份
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
# 修改配置文件
sudo vim /etc/apt/sources.list
# 删除配置文件原有内容,将以下连接内容拷贝至配置文件中,注意Ubuntu版本要正确
# https://mirrors.tuna.tsinghua.edu.cn/help/ubuntu/
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

在这里插入图片描述

更换pypi软件源

# pypi配置文件位置/etc/pip.conf
# https://mirrors.tuna.tsinghua.edu.cn/help/pypi/
# 临时使用
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple some-package

# 默认使用
# 更新pip
python -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple --upgrade pip
# 设置全局变量
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

更换conda源

# apt配置文件位置/root/.condarc
# https://mirrors.tuna.tsinghua.edu.cn/help/anaconda/
# 生成配置文件
conda config --set show_channel_urls yes
# 修改配置文件
vim /root/.condarc
# 删除已有内容,将红框内的内容复制到文件中
# 清楚旧的索引缓存
conda clean -i -y
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

在这里插入图片描述

Linux安装docker engine

# 更新apt索引
sudo apt update
# 更新apt包
sudo apt upgrade -y
# 根据官网提示安装docker engine
# https://docs.docker.com/engine/install/ubuntu/

# 删除旧安装包
for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done
# 添加Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
# 设置docker的apt源
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
# 安装docker
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# 测试docker,输入如下则表示安装成功
sudo docker run hello-world
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

在这里插入图片描述

Linux安装NVIDIA CONTAINER TOOLKIT

# 根据官方提示安装nvidia container toolkit,为docker提供nvidia底层支持
# https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html
# 设置nvidia container toolkit的apt源
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
  && curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
    sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
    sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
# 安装nvidia container toolkit
sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit
# 配置nvidia container toolkit对docker的底层支持
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker
# 测试nvidia container toolkit,输出如下则成功
sudo docker run --rm --runtime=nvidia --gpus all ubuntu nvidia-smi
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

在这里插入图片描述

docker下载pytorch镜像,并创建pytorch容器

# 下载pytorch镜像
# 可以通过NVIDIA官方提供的
# https://catalog.ngc.nvidia.com/orgs/nvidia/containers/pytorch/tags
sudo docker pull nvcr.io/nvidia/pytorch:23.12-py3
# 或者使用docker hub提供的
# https://hub.docker.com/r/pytorch/pytorch/tags
sudo docker pull pytorch/pytorch:latest
# 下载最新的即可,图片中的版本号不同
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

在这里插入图片描述

# 利用docker镜像创建docker容器
# 可以在官网查看具体参数含义
# https://docs.docker.com/engine/reference/commandline/container_run/
# 利用docker hub提供的镜像创建容器,利用NVIDIA提供的镜像创建命令类似
# --gpus "all" 配置容器可以调用的GPU
# --name "container name" 容器名称,利用一个镜像可以创建多个容器
# --ipc "host" 设置容器的IPC模式,解除载入数据线程之间共享数据内存限制
# --restart "always" 容器被关闭时重新启动
# --volume, -v 挂在容器外的目录,ubuntu下的路径:容器中的路径
# --publish,-p 将容器端口映射到linux宿主机上,linux端口:容器端口
# --detach,-d 容器后台运行
# --interactive,-i 进入容器交互式命令行
# --tty,-t 进入容器伪tty界面
sudo docker run --gpus "all" --name "torch" --ipc "host" --restart "always" -v /mnt/d/Project:/workspace -v /mnt/d/Dataset:/mnt -p 10001:22 -p 10002:6006 -p 10003:8888 -itd pytorch/pytorch:latest

# 查看创建的容器
sudo docker ps -a
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

在这里插入图片描述

# 进入容器,注意提示符,从linux中切换到了容器内
sudo docker exec -it torch /bin/bash
  • 1
  • 2

在这里插入图片描述

pytorch容器安装ssh

# 可以更换apt源,一定要注意ubuntu的版本
# 由于以root用户登录容器,所以以下命令无需sudo切换到root权限
# 更新apt索引
apt update
# 更新apt包
apt upgrade -y
# 安装vim文本编辑器
apt install vim -y
# 安装ssh,用于远程连接
apt install openssh-server -y
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

pytorch容器安装jupyterlab

# 查看是否已经安装conda
# 如果报错,则没有安装conda,或者conda没有安装在/opt/文件夹下,可以使用conda info进一步验证
# 如果没有报错,则conda已经安装,可以使用conda info进一步验证,如果conda info报错,则是bash环境变量问题,这里提供一个解决思路,就不展开讲了
cd /opt/conda

# 若没有安装conda,则通过pip安装jupyterlab
pip install jupyterlab -y

# 若已经安装conda,则需要先看base环境中是否已经安装jupyterlab,如果没有输出,则没有安装
conda list | grep jupyter
# 初始化conda环境
conda init
# 在base环境中安装jupyterlab,这样其他conda虚拟环境可以共用jupyterlab,而无需在每个虚拟环境安装
conda install -c conda-forge jupyterlab -y
# 可能会报http网络连接错误,多试几次就好了
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

至此,需要安装的基础软件就装完了,有其他安装需求的可以自行安装。

接下来讲讲怎么配置软件,才可以在WIN11上的IDE使用容器,这里以pycharm professional为例,vscode连接的原理是一样的。至于怎么安装软件和破解,这里就不展开了,阅读量大的话,单开一期讲。

配置软件

目前需要的软件虽然安装好了,但是pycharm还是无法访问容器中的解释器,这里我们采用ssh方式进行连接。

配置ssh

# 生成ssh密钥,用于验证登录身份。直接使用密码不太安全
ssh-keygen -m PEM -t rsa -b 4096 -C "AnyInformation"
# 将私钥拷贝到项目文件夹中
cp /root/id_rsa /workspace
# 此时,你可以在win11的项目文件夹看到该私钥

# 编辑配置文件/etc/ssh/sshd_config
PermitRootLogin yes
PubkeyAuthentication yes
PasswordAuthentication no
PermitEmptyPasswords no
AuthorizedKeysFile .ssh/id_rsa.pub

# 重启ssh服务
service ssh restart
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

然后就可以在Pycharm的 文件 >> 设置 >> 工具 >> SSH配置,设置主机IP为127.0.0.1,端口为设置的容器22端口映射的宿主机端口10001,私钥文件为项目文件夹下的ssh私钥。点击测试连接即可成功。别忘了点右下角的应用哦!!!

在这里插入图片描述

然后可以在Pycharm的 文件 >> 设置 >> 项目 >> Python解释器 >> 添加ssh

在这里插入图片描述

然后可以添加conda或者python的解释器,但是不建议conda解释器创建新环境,自己命令行创建的conda环境,可以控制纯粹的pip安装。

conda使用现有环境:

同步文件夹其实并不需要,因为我们在docker容器的创建过程中已经设置了映射关系,所以取消勾选自动上传。由于以root身份登录,所以取消勾选sudo权限。然后就可以愉快的使用啦!!

在这里插入图片描述

conda创建新环境:

设置环境名称、Python的版本号。同步文件夹其实并不需要,因为我们在docker容器的创建过程中已经设置了映射关系,所以取消勾选自动上传。由于以root身份登录,所以取消勾选sudo权限。然后就可以愉快的使用啦!!!

在这里插入图片描述

配置开机启动

为了达到开机打开Pycharm即可连接容器内的解释器 进行开发的流畅使用体验。需要以下几项功能:

  • ssh随容器启动而启动
  • 容器随wsl子系统启动而启动
  • wsl子系统随win11开机启动而启动
# 将ssh启动与bash关联启动,达到ssh随容器启动而启动的效果
# 容器内创建ssh启动脚本
touch /root/start_ssh.sh
# 编辑ssh启动脚本
vim /root/start_ssh.sh
#!/bin/bash
LOGTIME=$(date "+%Y-%m-%d %H:%M:%S")
echo "[$LOGTIME] startup run ..." >> /root/start_ssh.log
service ssh start >> /root/start_ssh.log
# 给ssh脚本添加执行权限
chmod +x /root/start_ssh.sh

# 将ssh启动脚本添加到容器启动文件中
vim /root/.bashrc

# startup run
if [ -f /root/start_ssh.sh ]; then
		/root/start_ssh.sh
fi
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
# 容器随wsl子系统启动而启动
# 在创建容器时,已经通过 --restart "always" 参数指定
# 如果没有在容器创建时指定,可以使用以下命令,记得把containername替换为你的容器名称!!!
sudo docker update --restart "always" containername
  • 1
  • 2
  • 3
  • 4
# wsl随win11启动而启动
# win+r,输入 shell:startup,转到启动目录
# 新建 wsl.vbs 文件,名称可以更改,后缀为vbs就行
# 在wsl.vbs中写入
rem Msgbox "WSL开机启动"
Set ws = CreateObject("Wscript.Shell")
ws.run "wsl -d Ubuntu-22.04 -u tao", vbhide
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

配置jupyterlab

# 安装jupyter notebook
conda install -c conda-forge notebook

# 设置jupyter notebook
jupyter notebook password
jupyter notebook --generate-config

# 修改~/.jupyter/jupyter_lab_config.py
c.ServerApp.ip = '*'
c.ServerApp.allow_remote_access = True
c.ServerApp.open_browser = False
c.ServerApp.allow_root = True


# 安装jupyterlab扩展插件
conda install -c conda-forge nodejs
conda install -c conda-forge jupyterlab_widgets
conda install -c conda-forge ipympl
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

docker容器启动时,自动启动jupyter notebook

# 编辑ssh启动脚本
vim /root/start_ssh.sh

# 在最后添加
nohup jupyter notebook > jupyternotebook.log 2>&1 &

# 如果想关闭jupyter notebook
# 找出包含jupyter的进程
ps -aux | grep jupyter

# 会列出很多,然后找到 jupyter notebook相关的进程, 一般情况下第二列就是pid, 如,我的进程是 9608,然后再用如下命令即可杀掉进程
kill -9 9608
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

解释器问题

pycharm添加WSL下docker中的conda解释器,报错ttyname failed: Inappropriate ioctl for device

# 打开/root/.profile
vim /root/.profile
# 将mesg n || true 改为如下
tty -s && mesg n || true

# 使profile生效
source /root/.profile
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/497489
推荐阅读
相关标签
  

闽ICP备14008679号