2023-4-11
对于机器学习er配置环境一直是个头疼的事,尤其是在windows系统中。尤其像博主这样的懒人,又不喜欢创建虚拟环境,过段时间又忘了环境和包的人,经常会让自己电脑里装了各种深度学习环境和python包。长时间会导致自己的项目文件和环境弄的很乱。且各个项目间的兼容性又会出现问题。
不仅如此,windows系统独特的“尿性”真的让开发者苦不堪言!
好在微软爸爸推出了WSL,WSL可以实现在windows电脑上运行linux系统。目前已经是越来越接近原生linux系统。
利用wsl 部署深度学习训练环境,无论是从便捷性上还是性能上均有优势。
博主浏览目前wsl配置深度学习环境的各种文章,采坑无数,终于完成了最详细的教程。
目前现在很多网上的教程都是老版本的**,真的有很多坑**!
由于现在很多环境和软件的升级,很多老教程不必要的操作就能直接省去!
这个教程就一个字:新!相比以往的老教程,无需走很多弯路!下面开始吧!
需要在WSL上玩深度学习,需要以下几个条件
win11,最好更新到最新版本
电脑上有显卡,Nvdia
windows上安装显卡驱动及CUDA和CuDNN(第一章)
安装WSL2 (2版本更好)
WLS2安装好Ubuntu20.04(本人之前试过22.04,有些版本不兼容的问题,无法跑通,时间多的同学可以尝试)(第二章)
在做好准备工作后,本文将介绍两种方法在WSL部署深度学习环境
安装显卡驱动
截止2023年,4月,全系显卡驱动已经指出
GPU in Windows Subsystem for Linux (WSL) | NVIDIA Developer
查看显卡驱动版本,及最大支持cuda版本,例如,如下图,本人最大支持12.1cuda
nvidia-smi
安装合适的cuda版本和Cudnn
CUDA Toolkit Archive | NVIDIA Developer
cuDNN Download | NVIDIA Developer
安装教程网上很多,推荐
CUDA与cuDNN安装教程(超详细)_kylinmin的博客-CSDN博客
如果你的windows为11版本,那么安装wsl会非常方便,这里教程可以参考微软官方wsl。wsl有两个版本,wsl1和wsl2,具体安装过程见下。一般我们默认使用wsl2版本。
安装 WSL | Microsoft Learn
wsl的安装这里不介绍了,图太多。百度教程很多,这里就主要介绍下WSL安装Ubuntu。
以下步骤均在WSL2安装好的背景下镜像。
查看发行版本,
wsl.exe --list --online
如果遇到以下错误
无法从“https://raw.githubusercontent.com/microsoft/WSL/master/distributions/DistributionInfo.json”中提取列表分发。无法解析服务器的名称或地址
网络和internet设置
-高级网络设置
--
-更多适配器选项
,选择你连接的网络,右键属性,将ipv4 DNS设置为8.8.8.8
。
然后即可显示分装版本。
安装合适版本
建议选择20.04。22.04版本我试过,有不少坑点。
wsl --install -d Ubuntu-20.04
这一步主要是为了减少C盘的占用空间,默认WSL装 的linux子系统在C盘
docker-data默认安装在c盘,且设置中难以更改,因此采用如下操作。
wsl --shutdown
wsl --export Ubuntu-20.04 F:\Ubuntu\ubuntu.tar
wsl --unregister Ubuntu-20.04
wsl --import Ubuntu-20.04 F:\Ubuntu\ F:\Ubuntu\ubuntu.tar --version 2
del D:\docker-desktop-data\docker-desktop-data.tar
del D:\docker-desktop-data\docker-desktop-data.tar
重新启动docker
这一步主要是为了加速linux各种包的下载速度。
首先做一个备份,这里就把Ubuntu默认安装的镜像源备份,接着更改源
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
sudo vim /etc/apt/sources.list
##进入vim ggdG
清空所有文本,复制清华源进vim编辑器中
打开如下源进行更新。注意Ubuntu版本选择20.04
ubuntu | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror
更新一下
sudo apt-get update
sudo apt-get upgrade
一般情况下:
在win11版本wsl和最新版(2023.4)的NVIDIA驱动场景下,在WSL2内,通过 nvidia-smi
已经可以穿透显示显卡信息。
适用Linux Docker配置深度学习环境。该方法使用Docker直接部署深度学习环境,方便快捷,并且不影响子系统本地。
Docker的部署方式分为两种,一种是使用desktop。即windows下载软件去部署docker;一种是使用linux版本的docker-engine。这就有点类似,一个使用图形化界面,一个使用小黑盒子。
这种desktop部署方式有优缺点:
优点:部署方便,可视化,适合小白
缺点:极大地占用宿主(windows)的空间!
1、Docker Data文件为ext4.vhdx动态磁盘形式,该磁盘特点是,占用容量只会增大,即使删除其内部镜像文件,占用空间也不会减少。
2、即使使用3.2节方法,虽然docker-data可以迁移至别的盘,但对镜像进行操作(如push),windows会产生临时文件夹,同样会占用C盘空间!
留下贫穷的泪水!o(╥﹏╥)o
3、性能问题,docker-desktop目前还有些bug未修复。
对于不喜欢折腾的选3.1即可。
3.1与3.2方式二选一即可,但博主建议使用3.2节linux 原生docker-Engine进行配置!!!!
3.1与3.2方式二选一即可,但博主建议使用3.2节linux 原生docker-Engine进行配置!!!!
3.1与3.2方式二选一即可,但博主建议使用3.2节linux 原生docker-Engine进行配置!!!!
Install Docker Desktop on Windows
在windows上安装docker-Desktop
别选4.17.1版本!!!!该版本无法调用gpus all
目前4.18.0已结修复该bug
设置
1、镜像源
将如下代码加入Docker Engine中
"registry-mirrors": [
"https://registry.docker-cn.com",
"http://hub-mirror.c.163.com",
"https://docker.mirrors.ustc.edu.cn"
],
2- 系统设置
打开两个按钮
Settings
---->General
—>Use the WSL 2 based engine
Settings
---->Resources
—>Enable integration with additional distros
测试是否安装成功,在wsl Ubuntu系统下输入,
docker run hello-world
docker-data默认安装在c盘,占用很大空间,且设置中难以更改,因此采用如下操作。
wsl --shutdown
wsl --export docker-desktop-data F:\wsl2\docker-desktop-data.tar
wsl --export docker-desktop F:\wsl2\docker-desktop.tar
wsl --unregister docker-desktop-data
wsl --unregister docker-desktop
wsl --import docker-desktop-data F:\wsl2\docker-desktop-data F:\wsl2\docker-desktop-data.tar --version
wsl --import docker-desktop F:\wsl2\docker-desktop F:\wsl2\docker-desktop.tar --version 2
del F:\wsl2\docker-desktop-data.tar
del F:\wsl2\docker-desktop-data.tar
重新启动docker
dock 官网给的条件已结满足,由于目前版本已结最新,可直接调用,无需安装其他内容。
Starting with Docker Desktop 3.1.0, Docker Desktop supports WSL 2 GPU Paravirtualization (GPU-PV) on NVIDIA GPUs. To enable WSL 2 GPU Paravirtualization, you need:
wsl --update
from an elevated command prompt(最新WSL版本)运行如下代码测试
docker run --rm -it --gpus=all nvcr.io/nvidia/k8s/cuda-sample:nbody nbody -gpu -benchmark
如果得到,则说明安装成功。
Compute 7.5 CUDA device: [NVIDIA GeForce RTX 2070 SUPER]
40960 bodies, total time for 10 iterations: 56.638 ms
= 296.218 billion interactions per second
= 5924.356 single-precision GFLOP/s at 20 flops per interaction
docker engine装在wsl内部,相比于docker-desktop,能极大节省windows宿主空间!!!!
且运行效率更高
wsl原生docker安装方式和docker doc安装方法一致
Install Docker Engine on Ubuntu
首先卸载老版本
sudo apt-get remove docker docker-engine docker.io containerd runc
建立储存库
sudo apt-get update
sudo apt-get install \
ca-certificates \
curl \
gnupg
添加官方的gpgkey
sudo mkdir -m 0755 -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
设置版本库
echo \
"deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
更新apt
sudo apt-get update
安装Docker Engine, containerd, and Docker Compose.
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
验证helloword
sudo docker run hello-world
配置镜像源
和docker desktop一样配置镜像源,建议使用阿里云
登录->控制台
->搜索容器镜像服务
->‘镜像加速器’
通过修改daemon配置文件/etc/docker/daemon.json来使用加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://你自己的.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
ps:在上述流程中如果碰到 Temporary failure resolving ‘gb.archive.ubuntu.com’
Temporary resolve问题,加入dns服务器
如果这能解决你的临时解析信息,那么要么等待24小时,看看你的ISP是否为你解决了问题(或者直接联系你的ISP)–或者你可以永久性地在你的系统中添加一个DNS服务器:
echo "nameserver 8.8.8.8" | sudo tee /etc/resolvconf/resolv.conf.d/base > /dev/null
在单独的linux系统中,systemctl 可以对docker进行自启动,但是wsl初始系统并不支持systemctl ,每次重新启动wsl,都需要sudo service docker start
现在WSL2有了systemd的支持,我们可以在没有Docker桌面的情况下在WSL中运行Docker!!
教程:
**step1 启动systemctl **
启动wsl内部的linux分发版本,运行如下代码
# Enable systemd via /etc/wsl.conf
{
cat <<EOT
[boot]
systemd=true
EOT
} | sudo tee /etc/wsl.conf
exit
或者编辑vim /etc/wsl.conf
使得
[boot]
systemd=true
ps:上述设置, sudo systemctl start docker
有还有问题的小伙伴。,可以换成
[boot]
#systemd=true
command = sudo service docker start
**step2 重启,测试systemctl **
wsl --shutdown
wsl --distribution Ubuntu ##Ubuntu指你的镜像版本,按wsl -l -vs输出的第一列来
测试过systemd 是否在运行
systemctl --no-pager status user.slice > /dev/null 2>&1 && echo 'OK: Systemd is running' || echo 'FAIL: Systemd not running'
step3 docker设置
# Install docker-compose
sudo ln -s /usr/libexec/docker/cli-plugins/docker-compose /usr/bin/docker-compose
# 加入docker组
sudo usermod -aG docker $USER
#退出bash
exit
重新登陆
wsl --distribution Ubuntu
这时你会发现,不用sudo service docker start
,docker也能启动了
而且,也能使用一些列如如下命令。
sudo systemctl restart docker
sudo systemctl start docker
nvidia-container-toolkit是使得linux系统在docker容器中具有调用gpu的能力。
使用条件:
NVIDIA/nvidia-docker: Build and run Docker containers leveraging NVIDIA GPUs (github.com)
已经说明:
Make sure you have installed the NVIDIA driver and Docker engine for your Linux distribution.
Note that you do not need to install the CUDA Toolkit on the host system, but the NVIDIA driver needs to be installed.
因此只用去x显卡装驱动和Docker就完事了!
安装教程Installation Guide — NVIDIA Cloud Native Technologies documentation
建立package repository 和 GPG key:
distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
&& 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/experimental/$distribution/libnvidia-container.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
sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit
设置Docker daemon 守护进程识别Nvidia容器Runtime
sudo nvidia-ctk runtime configure --runtime=docker
##重启一下docker
udo systemctl restart docker
docker run --rm -it --gpus=all nvcr.io/nvidia/k8s/cuda-sample:nbody nbody -gpu -benchmark
Compute 7.5 CUDA device: [NVIDIA GeForce RTX 2070 SUPER]
40960 bodies, total time for 10 iterations: 56.638 ms
= 296.218 billion interactions per second
= 5924.356 single-precision GFLOP/s at 20 flops per interaction
则运行成功
无论是利用3.1Docker-desktop建立的还是Docker-engine建立的环境,均可以进行以下操作。
出发点:
考虑到目前官方docker-hub中提供的imag并不能满足日常的开发包的需要,且如果容器丢失或删除,所有包的数据和项目文件均会丢失。因此,我们可以定制自己的image。并将container的项目文件映射到自己的本地文件目录中。
可以使用vscode完成以下操作,方便编辑一点。
进入vscode,安装wsl 插件,连接wls(或着在wsl linux终端下,输入code .
进入
ps: docker开发ide也可以使用vscode,只需要对安装Docker插件即可。
打开终端,如下图,当左下角绿色显式WSL:Ubutun…为连接成功
创建一个以后存docker镜像的目录
mkdir docker-deeplearning-project
cd docker-deeplearning-project
我们想要在 tensorflow/tensorflow:latest-gpu
的基础上增加一些别的包,以满足日常需求,可以使用如下方法。打开vscode的终端,创建额外的requirments.txt!
code requirments.txt
安装以下包,这些包可以随各位去配
torch那可以指定版本,在torch官网可以挑选
jupyterlab
pandas
matplotlib
torch --index-url https://download.pytorch.org/whl/cu118
torchvision --index-url https://download.pytorch.org/whl/cu118
torchaudio --index-url https://download.pytorch.org/whlcu118
dockfile建立规则
code Dockerfile
Dockerfile输入一下代码:
FROM:拉取现有base image
WORKDIR:定制工作目录
COPY 拷贝本地目录的requirements.txt到当前dockerfile中,通过此去安装额外的requirments包,
RUN 运行安装程序,-i 指定镜像源
EXPOSE 开辟一定端口
ENTRYPOINT 定义入口点,通过列表构建命令
FROM tensorflow/tensorflow:latest-gpu
WORKDIR /tf-jinqiu
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple some-package
EXPOSE 8888
ENTRYPOINT ["jupyter","lab","--ip=0.0.0.0","--allow-root","--no-browser"]
code docker-compose.yaml
解析:
version:版本
services:定义服务
jupyter-lab:image名称
build: . 在当前目录
ports:映射端口
volumes:保存访问文件的部分。将其映射到本地文件中
deploy:share GPU
version: '1.0'
services:
jupyter-lab:
build: .
ports:
- "8888:8888"
volumes:
- /tf-jinqiu:/tf-jinqiu
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: 1
capabilities: [gpu]
docker-compose up
出现如下输出,则证明安装成功。
复制底下的:http://127.0.0.1:8888/lab?token=d6e406efda3edf086b2baf4296a9400d53bee0d4221e1b9e
即可jupyter -lab
测试pytorch和TensorFlow ,gpu版本均能运行!!!
注意文件映射位置:
因此我们项目地址可以存在container中/tf-jinqiu
中。
开发项目的地址为docker-compose.yaml
中设置的/tf-jinqiu
。因此在container中/tf-jinqiu
和wls ubuntu /tf-jinqiu
目录下均有映射的文件。
进入vscode docker中,在容器中右键 Attach Visual Studio Code即可进入容器内,进行相关project的开发。
dockerhub可以上传官网的dockerhub,也可以上传阿里云的。
上传自己建好的docker可以方便以后迁移机器,直接部署。
(1) 官方dockerhub
保存自己docker的方式,可以采用docker-file配合docker-compose.yaml的方式,也可采用将整个镜像上传至Docker-hub中,一劳永逸。
保存dockerhub中,每次换机器只需要从docker中拉取镜像,即可快速部署相关环境。
docker login -u zhujinqiu # zhujinqiu为自己的账号
// 找到运行中的容器 (复制你要打包的容器的id)
docker ps
// 打包为镜像 (86d78d59b104:容器的id 、 my_centos:我们要打包成的镜像的名字)
docker commit zhujinqiu my_centos
// 找到打包的镜像
docker images
// my_centos:镜像的名字 、 zhujinqiu:我们docker仓库的用户名 、 my_centos:我们刚才新建的仓库名 、 v1:版本号,可以不设置
docker tag my_centos zhujinqiu/my_centos:v1
docker push zhujinqiu/my_centos:v1
// 记得先登录
docker login
// 根据版本号拉取
docker pull zhujinqiu/my_centos:v1
// d583c3ac45fd ID 后者是需要修改的名字
docker tag d583c3ac45fd myname:latest
(2)阿里云镜像仓库
容器镜像服务 (aliyun.com)
阿里云有详细的
首先创建镜像仓库仓库创建指南。
$ docker login --username=你的用户名 registry.cn-hangzhou.aliyuncs.com
用于登录的用户名为阿里云账号全名,密码为开通服务时设置的密码。
您可以在访问凭证页面修改凭证密码。
$ docker pull registry.cn-hangzhou.aliyuncs.com/命名空间/仓库名称:[镜像版本号]
$ docker login --username=你的用户名 registry.cn-hangzhou.aliyuncs.com
$ docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/命名空间/仓库名称:[镜像版本号]
$ docker push registry.cn-hangzhou.aliyuncs.com/命名空间/仓库名称:[镜像版本号]
请根据实际镜像信息替换示例中的[ImageId]和[镜像版本号]参数。
从ECS推送镜像时,可以选择使用镜像仓库内网地址。推送速度将得到提升并且将不会损耗您的公网流量。
如果您使用的机器位于VPC网络,请使用 registry-vpc.cn-hangzhou.aliyuncs.com 作为Registry的域名登录。
使用"docker tag"命令重命名镜像,并将它通过专有网络地址推送至Registry。
$ docker imagesREPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZEregistry.aliyuncs.com/acs/agent 0.7-dfb6816 37bb9c63c8b2 7 days ago 37.89 MB$ docker tag 37bb9c63c8b2 registry-vpc.cn-hangzhou.aliyuncs.com/acs/agent:0.7-dfb6816
使用 “docker push” 命令将该镜像推送至远程。
$ docker push registry-vpc.cn-hangzhou.aliyuncs.com/acs/agent:0.7-dfb6816
该方法不借助Docker,因此需要直接在本地配置好WSL-Cuda,并安装各类深度学习框架,类似于把Windows上跑的模型搬到WSL跑。
该方法只需要安装Cuda。并不要装显卡驱动和Cudnn(wsl2已经支持本地Windows映射)。
CUDA Toolkit 12.1 Downloads | NVIDIA Developer
根据驱动情况、pytorch、Tensorflow情况选择合适的wsl——cuda版本。需要更改如下适应“12-1为11-8”
wget https://developer.download.nvidia.com/compute/cuda/repos/wsl-ubuntu/x86_64/cuda-wsl-ubuntu.pin
sudo mv cuda-wsl-ubuntu.pin /etc/apt/preferences.d/cuda-repository-pin-600
wget https://developer.download.nvidia.com/compute/cuda/11.8.0/local_installers/cuda-repo-wsl-ubuntu-11-8-local_11.8.0-1_amd64.deb
sudo dpkg -i cuda-repo-wsl-ubuntu-11-8-local_11.8.0-1_amd64.deb
sudo cp /var/cuda-repo-wsl-ubuntu-11-8-local/cuda-*-keyring.gpg /usr/share/keyrings/
sudo apt-get update
sudo apt-get -y install cuda
安装完需要,设置环境变量
vim ~/.bashrc
在最后加入,配置环境变量
export PATH=/usr/bin:$PATH
export PATH=/usr/local/cuda-11.8/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-11.8/lib64:$LD_LIBRARY_PATH
更新下source
source ~/.bashrc
使用nvcc -V验证安装成功与否
nvcc -V
1、miniconda安装
# 下载安装包
wget -c https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
chmod 777 Miniconda3-latest-Linux-x86_64.sh
# 安装conda
bash Miniconda3-latest-Linux-x86_64.sh
安装完需要,设置环境变量
vim ~/.bashrc
更新下source
source ~/.bashrc
配置miniconda环境变量
export PATH=~/miniconda3/bin:$PATH
conda create -n env_pytorch python=3.8
# conda env list 查看虚拟环境list
# 激活
conda activate env_pytorch
1、安装pytorch
Start Locally | PyTorch
根据cuda版本选择合适的torchgpu版本
## -i 清华镜像加速 安装torchgpu
pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 -i https://pypi.tuna.tsinghua.edu.cn/simple some-package
2、安装tensorflow
ps:新版本直接安装即可
TensorFlow (google.cn)
# Requires the latest pip
pip install --upgrade pip
# Current stable release for CPU and GPU
pip install tensorflow
## torch
import torch
torch.cuda.is_available()
## tensorflow
import tensorflow as tf
tf.config.list_physical_devices()