2023最新WSL搭建深度學(xué)習(xí)平臺(tái)教程(適用于Docker-gpu、tensorflow-gpu、pytorch-gpu)

2023-4-11
對(duì)于機(jī)器學(xué)習(xí)er配置環(huán)境一直是個(gè)頭疼的事,尤其是在windows系統(tǒng)中。WSL可以實(shí)現(xiàn)在windows電腦上運(yùn)行l(wèi)inux系統(tǒng)。
利用wsl 部署深度學(xué)習(xí)訓(xùn)練環(huán)境,無(wú)論是從便捷性上還是性能上均有優(yōu)勢(shì)。
博主瀏覽目前wsl配置深度學(xué)習(xí)環(huán)境的各種文章,采坑無(wú)數(shù),終于完成了最詳細(xì)的教程。
目前現(xiàn)在很多網(wǎng)上的教程都是老版本的,由于現(xiàn)在很多環(huán)境和軟件的升級(jí),很多不必要的操作就能直接省去!
這個(gè)教程就一個(gè)字:新!相比以往的老教程,無(wú)需走很多彎路!下面開(kāi)始吧!
需要在WSL上玩深度學(xué)習(xí),需要以下幾個(gè)條件
win11,最好更新到最新版本
電腦上有顯卡,Nvdia
安裝顯卡驅(qū)動(dòng)及CUDA和CuDNN(第一章)
WSL 安裝及 WLS2安裝好Ubuntu20.04(本人之前試過(guò)22.04,有些版本不兼容的問(wèn)題,無(wú)法跑通,時(shí)間多的同學(xué)可以嘗試)(第二章)
在做好準(zhǔn)備工作后,本文將介紹兩種方法在WSL部署深度學(xué)習(xí)環(huán)境
Docker法(光速部署,不需要在WSL內(nèi)安裝任何驅(qū)動(dòng),方便遷移)(第三章)
wls2本地法(在WSL2直接安裝CUDA)(第四章)
1、windows顯卡環(huán)境及CUDA安裝
安裝顯卡驅(qū)動(dòng)
截止2023年,4月,全系顯卡驅(qū)動(dòng)已經(jīng)指出
查看顯卡驅(qū)動(dòng)版本,及最大支持cuda版本,例如,如下圖,本人最大支持12.1cuda
nvidia-smi

安裝合適的cuda版本和Cudnn
安裝教程網(wǎng)上很多,推薦
2、WSL 安裝Ubuntu
2.1 wsl安裝
如果你的windows為11版本,那么安裝wsl會(huì)非常方便,這里教程可以參考微軟官方wsl。wsl有兩個(gè)版本,wsl1和wsl2,具體安裝過(guò)程見(jiàn)下。一般我們默認(rèn)使用wsl2版本。
wsl的安裝這里不介紹了,圖太多。百度教程很多,這里就主要介紹下WSL安裝Ubuntu。
以下步驟均在WSL2安裝好的背景下鏡像。
2.2 安裝Ubuntu
查看發(fā)行版本,
wsl.exe --list --online
如果遇到以下錯(cuò)誤
無(wú)法從“https://raw.githubusercontent.com/microsoft/WSL/master/distributions/DistributionInfo.json”中提取列表分發(fā)。無(wú)法解析服務(wù)器的名稱或地址

修改dns服務(wù)器
網(wǎng)絡(luò)和internet設(shè)置
-高級(jí)網(wǎng)絡(luò)設(shè)置
--
-更多適配器選項(xiàng)
,選擇你連接的網(wǎng)絡(luò),右鍵屬性,將ipv4 DNS設(shè)置為8.8.8.8
。
然后即可顯示分裝版本。


安裝合適版本
建議選擇20.04。22.04版本我試過(guò),有不少坑點(diǎn)。
wsl --install -d Ubuntu-20.04
2.3 遷移至非系統(tǒng)盤
這一步主要是為了減少C盤的占用空間,默認(rèn)WSL裝 的linux子系統(tǒng)在C盤
docker-data默認(rèn)安裝在c盤,且設(shè)置中難以更改,因此采用如下操作。
1、shutdown 子系統(tǒng)
wsl --shutdown
2、導(dǎo)出Ubuntu
wsl --export Ubuntu-20.04 F:\Ubuntu\ubuntu.tar
3、注銷docker-desktop和docker-desktop-data
wsl --unregister Ubuntu-20.04
4、導(dǎo)入
wsl --import Ubuntu-20.04 F:\Ubuntu\ F:\Ubuntu\ubuntu.tar --version 2
5、刪除壓縮包
del D:\docker-desktop-data\docker-desktop-data.tar
del D:\docker-desktop-data\docker-desktop-data.tar
重新啟動(dòng)docker
2.4 更改鏡像源
這一步主要是為了加速linux各種包的下載速度。
首先做一個(gè)備份,這里就把Ubuntu默認(rèn)安裝的鏡像源備份,接著更改源
sudo cp ?/etc/apt/sources.list /etc/apt/sources.list.bak
sudo vim /etc/apt/sources.list
##進(jìn)入vim ggdG
清空所有文本,復(fù)制清華源進(jìn)vim編輯器中
打開(kāi)如下源進(jìn)行更新。注意Ubuntu版本選擇20.04

更新一下
sudo apt-get update
sudo apt-get upgrade
一般情況下:
在win11版本wsl和最新版(2023.4)的NVIDIA驅(qū)動(dòng)場(chǎng)景下,在WSL2內(nèi),通過(guò)nvidia-smi
已經(jīng)可以穿透顯示顯卡信息。

3、wls-Docker運(yùn)行深度學(xué)習(xí)環(huán)境
適用Linux Docker配置深度學(xué)習(xí)環(huán)境。該方法使用Docker直接部署深度學(xué)習(xí)環(huán)境,方便快捷,并且不影響子系統(tǒng)本地
3.1 docker desktop安裝
在windows上安裝docker-Desktop
別選4.17.1版本?。。?!該版本無(wú)法調(diào)用gpus all
目前4.18.0已結(jié)修復(fù)該bug
設(shè)置
1、鏡像源
將如下代碼加入Docker Engine中

"registry-mirrors": [
? ? ?"https://registry.docker-cn.com",
? ? ?"http://hub-mirror.c.163.com",
? ? ?"https://docker.mirrors.ustc.edu.cn"
?],
2- 系統(tǒng)設(shè)置
打開(kāi)兩個(gè)按鈕
Settings
---->General
--->Use the WSL 2 based engine
Settings
---->Resources
--->Enable integration with additional distros

測(cè)試是否安裝成功,在wsl Ubuntu系統(tǒng)下輸入,
docker run hello-world
3.2 wsl 切換docker數(shù)據(jù)存儲(chǔ)位置
docker-data默認(rèn)安裝在c盤,占用很大空間,且設(shè)置中難以更改,因此采用如下操作。
1、shutdown docker
wsl --shutdown
2、導(dǎo)出docker-desktop和docker-desktop-data
wsl --export docker-desktop-data F:\wsl2\docker-desktop-data.tar
wsl --export docker-desktop ?F:\wsl2\docker-desktop.tar
3、注銷docker-desktop和docker-desktop-data
wsl --unregister docker-desktop-data
wsl --unregister docker-desktop
4、導(dǎo)入
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
5、刪除壓縮包
del F:\wsl2\docker-desktop-data.tar
del F:\wsl2\docker-desktop-data.tar
重新啟動(dòng)docker
3.4 調(diào)用docker gpu
dock 官網(wǎng)給的條件已結(jié)滿足,由于目前版本已結(jié)最新,可直接調(diào)用,無(wú)需安裝其他內(nèi)容。
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:
A machine with an NVIDIA GPU(有英偉達(dá)顯卡)
The latest Windows Insider version from the Dev Preview ring(windows版本更細(xì))
from NVIDIA supporting WSL 2 GPU Paravirtualization(最新顯卡驅(qū)動(dòng)即可)
Update WSL 2 Linux kernel to the latest version using
wsl --update
from an elevated command prompt(最新WSL版本)Make sure the WSL 2 backend is enabled in Docker Desktop (Docker中設(shè)置WSL 2 backend勾選上)
運(yùn)行如下代碼測(cè)試
docker run --rm -it --gpus=all nvcr.io/nvidia/k8s/cuda-sample:nbody nbody -gpu -benchmark
如果得到,則說(shuō)明安裝成功。
Run "nbody -benchmark [-numbodies=<numBodies>]" to measure performance.
? ? ? ?-fullscreen ? ? ? (run n-body simulation in fullscreen mode)
? ? ? ?-fp64 ? ? ? ? ? ? (use double precision floating point values for simulation)
? ? ? ?-hostmem ? ? ? ? ?(stores simulation data in host memory)
? ? ? ?-benchmark ? ? ? ?(run benchmark to measure performance)
? ? ? ?-numbodies=<N> ? ?(number of bodies (>= 1) to run in simulation)
? ? ? ?-device=<d> ? ? ? (where d=0,1,2.... for the CUDA device to use)
? ? ? ?-numdevices=<i> ? (where i=(number of CUDA devices > 0) to use for simulation)
? ? ? ?-compare ? ? ? ? ?(compares simulation results running once on the default GPU and once on the CPU)
? ? ? ?-cpu ? ? ? ? ? ? ?(run n-body simulation on the CPU)
? ? ? ?-tipsy=<file.bin> (load a tipsy model file for simulation)
> NOTE: The CUDA Samples are not meant for performance measurements. Results may vary when GPU Boost is enabled.
> Windowed mode
> Simulation data stored in video memory
> Single precision floating point simulation
> 1 Devices used for simulation
MapSMtoCores for SM 7.5 is undefined. ?Default to use 64 Cores/SM
GPU Device 0: "GeForce RTX 2060 with Max-Q Design" with compute capability 7.5
> Compute 7.5 CUDA device: [GeForce RTX 2060 with Max-Q Design]
30720 bodies, total time for 10 iterations: 69.280 ms
= 136.219 billion interactions per second
= 2724.379 single-precision GFLOP/s at 20 flops per interaction
設(shè)置支持 GPU 的映像可能需要一段時(shí)間。如果重復(fù)運(yùn)行基于 GPU 的腳本,您可以使用 docker exec
重復(fù)使用容器。
使用最新的 TensorFlow GPU 映像在容器中啟動(dòng) bash
shell 會(huì)話:
docker run --gpus all -it tensorflow/tensorflow:latest-gpu bash
測(cè)試是否gpu可用
>>> tf.config.list_physical_devices()
[PhysicalDevice(name='/physical_device:CPU:0', device_type='CPU'), PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]
3.5 自定義自己docker
出發(fā)點(diǎn):
考慮到目前官方docker-hub中提供的imag并不能滿足日常的開(kāi)發(fā)包的需要,且如果容器丟失或刪除,所有包的數(shù)據(jù)和項(xiàng)目文件均會(huì)丟失。因此,我們可以定制自己的image。并將container的項(xiàng)目文件映射到自己的本地文件目錄中。
進(jìn)入vscode,安裝wsl 插件,連接wls,打開(kāi)終端,如下圖,當(dāng)左下角綠色顯式WSL:Ubutun...為連接成功

創(chuàng)建一個(gè)以后存docker鏡像的目錄
mkdir docker-deeplearning-project
cd docker-deeplearning-project
3.5.1 自定義所需要安裝的包
我們想要在 tensorflow/tensorflow:latest-gpu
的基礎(chǔ)上增加一些別的包,以滿足日常需求,可以使用如下方法。
創(chuàng)建額外的requirments.txt
code ?requirments.txt
安裝以下包,這些包可以隨各位去配
torch那可以指定版本,在torch官網(wǎng)可以挑選
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
3.5.2 建立Dockerfile
code Dockerfile
Dockerfile輸入一下代碼:
FROM:拉取現(xiàn)有base image
WORKDIR:定制工作目錄
COPY 拷貝本地目錄的requirements.txt到當(dāng)前dockerfile中,通過(guò)此去安裝額外的requirments包,
RUN 運(yùn)行安裝程序,-i 指定鏡像源
EXPOSE 開(kāi)辟一定端口
ENTRYPOINT 定義入口點(diǎn),通過(guò)列表構(gòu)建命令
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 8881
ENTRYPOINT ["jupyter","lab","--ip=0.0.0.0","--allow-root","--no-browser"]

3.5.3建立docker-compose.yaml
code docker-compose.yaml
解析:
version:版本
services:定義服務(wù)
jupyter-lab:image名稱
build: . 在當(dāng)前目錄
ports:映射端口
volumes:保存訪問(wèn)文件的部分。將其映射到本地文件中
deploy:share GPU
version: '1.0'
services:
?jupyter-lab:
? ?build: .
? ?ports:
? ? ?- "8881:8881"
? ?volumes:
? ? ?- /tf-jinqiu:/tf-jinqiu
? ?deploy:
? ? ?resources:
? ? ? ?reservations:
? ? ? ? ?devices:
? ? ? ? ? ?- driver: nvidia
? ? ? ? ? ? ?count: 1
? ? ? ? ? ? ?capabilities: [gpu]
3.5.4 運(yùn)行并測(cè)試
docker-compose up
出現(xiàn)如下輸出,則證明安裝成功。

復(fù)制底下的:http://127.0.0.1:8888/lab?token=d6e406efda3edf086b2baf4296a9400d53bee0d4221e1b9e
即可jupyter -lab
測(cè)試pytorch和TensorFlow ,gpu版本均能運(yùn)行?。?!
注意文件映射位置:
因此我們項(xiàng)目地址可以存在container中/tf-jinqiu
中。
開(kāi)發(fā)項(xiàng)目的地址為docker-compose.yaml
中設(shè)置的/tf-jinqiu
。因此在container中/tf-jinqiu
和wls ubuntu /tf-jinqiu
目錄下均有映射的文件。

進(jìn)入vscode docker中,在容器中右鍵 Attach Visual Studio Code即可進(jìn)入容器內(nèi),進(jìn)行相關(guān)project的開(kāi)發(fā)。

3.5.6上傳dockerhub
保存自己docker的方式,可以采用docker-file配合docker-compose.yaml的方式,也可采用將整個(gè)鏡像上傳至Docker-hub中,一勞永逸。
保存dockerhub中,每次換機(jī)器只需要從docker中拉取鏡像,即可快速部署相關(guān)環(huán)境。
登錄docker
docker login -u zhujinqiu ? # zhujinqiu為自己的賬號(hào)
docker容器變成鏡像
// 找到運(yùn)行中的容器 (復(fù)制你要打包的容器的id)
docker ps
// 打包為鏡像 (86d78d59b104:容器的id 、 ?my_centos:我們要打包成的鏡像的名字)
docker commit zhujinqiu my_centos
// 找到打包的鏡像
docker images
將鏡像打?yàn)闃?biāo)簽
// my_centos:鏡像的名字 ? 、 zhujinqiu:我們docker倉(cāng)庫(kù)的用戶名 、 my_centos:我們剛才新建的倉(cāng)庫(kù)名 、 v1:版本號(hào),可以不設(shè)置
docker tag my_centos zhujinqiu/my_centos:v1
將鏡像上傳到鏡像倉(cāng)庫(kù)
docker push zhujinqiu/my_centos:v1
下載自己的鏡像
// 記得先登錄
docker login
// 根據(jù)版本號(hào)拉取
docker pull zhujinqiu/my_centos:v1
修改鏡像名字
// d583c3ac45fd ?ID ? 后者是需要修改的名字
docker tag d583c3ac45fd myname:latest
4、wsl本地運(yùn)行深度學(xué)習(xí)環(huán)境
該方法不借助Docker,直接在本地配置好WSL-Cuda,并安裝各類深度學(xué)習(xí)框架,類似于把Windows上跑的模型搬到WSL跑。
該方法只需要安裝Cuda。并不要裝顯卡驅(qū)動(dòng)和Cudnn(已經(jīng)支持本地Windows映射)。
4.1 安裝wsl Cuda
根據(jù)驅(qū)動(dòng)情況、pytorch、Tensorflow情況選擇合適的wsl——cuda版本。需要更改如下適應(yīng)“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
安裝完需要,設(shè)置環(huán)境變量
vim ~/.bashrc
在最后加入,配置環(huán)境變量
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驗(yàn)證安裝成功與否
nvcc -V
4.2 安裝pytorch環(huán)境
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
安裝完需要,設(shè)置環(huán)境變量
vim ~/.bashrc
更新下source
source ~/.bashrc
配置miniconda環(huán)境變量
export PATH=~/miniconda3/bin:$PATH
4.3 創(chuàng)建虛擬環(huán)境與pytorch安裝、tensorflow安裝
conda create -n env_pytorch python=3.8
# conda env list 查看虛擬環(huán)境list
# 激活
conda activate env_pytorch
1、安裝pytorch
根據(jù)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:新版本直接安裝即可
# Requires the latest pip
pip install --upgrade pip
# Current stable release for CPU and GPU
pip install tensorflow
4.4 測(cè)試gpu
## torch
import torch
torch.cuda.is_available()
## tensorflow
import tensorflow as tf
tf.config.list_physical_devices()