赞
踩
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
关于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分发版
# 更新wsl版本
wsl --update
此步骤非必须!!!后续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
# 查看可安装的linux分发版本
wsl --list --online
# 安装Ubuntu-22.04
wsl --install Ubuntu-22.04
# 然后在username输入用户名,在password输入用户密码
# 查看是否安装完成(如果已经在子系统中,红框的提示符不同,输入exit可以退出)
# 我安装的是Ubuntu-20.04,所以这里显示不是Ubuntu-22.04
wsl --list -v
# 运行Ubuntu-22.04
wsl --distribution Ubuntu-22.04
提示符为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/
更换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
更换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
# 更新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
# 根据官方提示安装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
# 下载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
# 下载最新的即可,图片中的版本号不同
# 利用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
# 进入容器,注意提示符,从linux中切换到了容器内
sudo docker exec -it torch /bin/bash
# 可以更换apt源,一定要注意ubuntu的版本
# 由于以root用户登录容器,所以以下命令无需sudo切换到root权限
# 更新apt索引
apt update
# 更新apt包
apt upgrade -y
# 安装vim文本编辑器
apt install vim -y
# 安装ssh,用于远程连接
apt install openssh-server -y
# 查看是否已经安装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网络连接错误,多试几次就好了
至此,需要安装的基础软件就装完了,有其他安装需求的可以自行安装。
接下来讲讲怎么配置软件,才可以在WIN11上的IDE使用容器,这里以pycharm professional为例,vscode连接的原理是一样的。至于怎么安装软件和破解,这里就不展开了,阅读量大的话,单开一期讲。
目前需要的软件虽然安装好了,但是pycharm还是无法访问容器中的解释器,这里我们采用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
然后就可以在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启动与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
# 容器随wsl子系统启动而启动
# 在创建容器时,已经通过 --restart "always" 参数指定
# 如果没有在容器创建时指定,可以使用以下命令,记得把containername替换为你的容器名称!!!
sudo docker update --restart "always" containername
# 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
# 安装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
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
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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。