2024 WIN11+WSL2 深度學(xué)習(xí)開發(fā)環(huán)境
Windows系統(tǒng)開發(fā)偶爾會(huì)出現(xiàn)一些系統(tǒng)底層的bug導(dǎo)致程序無法運(yùn)行,開發(fā)很難受。
Linux系統(tǒng)開發(fā),娛樂軟件少,不盡興。
雙系統(tǒng)切換太麻煩,不能同時(shí)使用,難受!
如何結(jié)合Windows和Linux,既能暢爽娛樂,又不會(huì)被底層BUG影響開發(fā),來試試Windows的子系統(tǒng)WSL2吧!!
本次思路為:在WIN11系統(tǒng)安裝WSL2子系統(tǒng),在WSL2子系統(tǒng)中安裝docker engine,通過docker隔離不同的開發(fā)環(huán)境。
docker容器中無需再通過conda進(jìn)行環(huán)境隔離,雖然可以但沒必要,PyPI是Python的包管理工具,conda是多種語言的包管理工具,conda的包沒有pypi全面,所以推薦使用pypi包管理工具。pypi的環(huán)境隔離確實(shí)一般,所以使用docker容器進(jìn)行隔離。如果容器內(nèi)部以及安裝了conda,可以使用conda新建虛擬環(huán)境,再虛擬環(huán)境中的包使用pypi進(jìn)行安裝。pypi和conda的區(qū)別。
前置任務(wù)
默認(rèn)讀者已經(jīng)安裝WIN11,因?yàn)镹VIDIA GPU加速需要WIN11和WSL2。
默認(rèn)讀者的電腦硬件有英偉達(dá)的顯卡,且已經(jīng)安裝了英偉達(dá)的顯卡驅(qū)動(dòng)。
可以用過右鍵Win11徽標(biāo),選擇“終端管理員”,啟動(dòng)powershell,輸入nvidia-smi,如果輸出如下,那么英偉達(dá)顯卡驅(qū)動(dòng)安裝無誤。
關(guān)于WSL2使用NVIDIA進(jìn)行并行計(jì)算的介紹 https://docs.nvidia.cn/cuda/wsl-user-guide/index.html
安裝軟件
WIN11安裝WSL2
關(guān)于WSL的介紹 https://learn.microsoft.com/en-us/windows/wsl/
Windows Subsystem for Linux (WSL) 是 Windows 的一項(xiàng)功能, 使用戶能夠在win11和linux兩種環(huán)境之間無縫過渡,而無需資源密集型的傳統(tǒng)虛擬機(jī),并提高生產(chǎn)力、使用工具進(jìn)行開發(fā)并集成其工作流程。 更重要的是,WSL 2 使迄今為止只能在 Linux 上使用的應(yīng)用程序可以在 Windows 上使用。 WSL 2 對(duì) GPU 的支持使這些應(yīng)用程序能夠從 GPU 加速計(jì)算中受益,并擴(kuò)展了可在 WSL 2 上開發(fā)的應(yīng)用程序領(lǐng)域。
借助 NVIDIA CUDA 對(duì) WSL 2 的支持,開發(fā)人員可以通過 WSL 在 Windows 上利用 NVIDIA GPU 加速計(jì)算技術(shù)進(jìn)行數(shù)據(jù)科學(xué)、機(jī)器學(xué)習(xí)和推理。 GPU 加速還可以通過在 GPU 上以更少的 CPU 干預(yù)來處理更多并行工作,從而降低在接近本機(jī)的類似 WSL 的環(huán)境中運(yùn)行應(yīng)用程序的性能開銷。
# 可以使用 wsl --help 查看wsl的使用方法,以下為wsl常用命令
# --status 顯示W(wǎng)SL狀態(tài)
# --update 更新WSL
# --version, -v 顯示W(wǎng)SL版本
# --set-default-version 2 設(shè)置默認(rèn)WSL版本為WSL2
# --list, -l [選項(xiàng)] 列出linux分發(fā)版
# 選項(xiàng):
# --all 列出所有分發(fā)版,包括分發(fā)版當(dāng)前正在安裝或卸載
# --running 僅列出當(dāng)前正在運(yùn)行的分發(fā)版
# --quiet,-q 僅顯示分發(fā)版名稱
# --verbose, -v 顯示有關(guān)所版的詳細(xì)信息
# --online,-o 顯示適合通過“wsl --install”安裝的可用分發(fā)版列表
# --install 安裝linux分發(fā)版
# --set-default,-s <Distro> 將分布版設(shè)置為默認(rèn)值
# --shutdown 立即終止正在運(yùn)行的linux分發(fā)版
# --distribution, -d 運(yùn)行指定的linux分發(fā)版
# --unregister 刪除某個(gè)linux分發(fā)版
# 更新wsl版本
wsl --update
配置WSL2代理
此步驟非必須?。?!后續(xù)NVIDIA的APT下載會(huì)比較緩慢,可以選擇設(shè)置WSL2代理。
如果更改,記得在ssh連接容器前把代理改回networkingMode=NAT!?。?/p>
# 按照官方說明進(jìn)行設(shè)置
# https://learn.microsoft.com/zh-cn/windows/wsl/wsl-config#wslconfig
# 創(chuàng)建C:\Users\<UserName>\.wslconfig文件
# 將以下內(nèi)容寫入文件
# 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
WSL2安裝linux
# 查看可安裝的linux分發(fā)版本
wsl --list --online
# 安裝Ubuntu-22.04
wsl --install Ubuntu-22.04
# 然后在username輸入用戶名,在password輸入用戶密碼
# 查看是否安裝完成(如果已經(jīng)在子系統(tǒng)中,紅框的提示符不同,輸入exit可以退出)
# 我安裝的是Ubuntu-20.04,所以這里顯示不是Ubuntu-22.04
wsl --list -v
# 運(yùn)行Ubuntu-22.04
wsl --distribution Ubuntu-22.04
提示符為PS(PowerShell)則在win11環(huán)境中,提示符為UserName@MachineName則在WSL2的Ubuntu22.04中。
安裝網(wǎng)速慢怎么辦
我們常用的有apt軟件源、pypi軟件源、conda軟件源,軟件源可以理解為下載安裝包的網(wǎng)址,后續(xù)的安裝中,可能會(huì)有小伙伴們覺得下載速度慢的問題,這里統(tǒng)一做一下網(wǎng)速慢的解決方案,這個(gè)方案是通用的。
軟件源國內(nèi)有很多,比如華為、阿里、清華、中科大等等,大家自行選擇,這里以清華鏡像源為例。
# apt配置文件位置/etc/apt/sources.list
# 更換apt源
# 對(duì)配置文件進(jìn)行備份
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
# 修改配置文件
sudo vim /etc/apt/sources.list
# 刪除配置文件原有內(nèi)容,將以下連接內(nèi)容拷貝至配置文件中,注意Ubuntu版本要正確
# https://mirrors.tuna.tsinghua.edu.cn/help/ubuntu/
更換pypi軟件源
# pypi配置文件位置/etc/pip.conf
# https://mirrors.tuna.tsinghua.edu.cn/help/pypi/
# 臨時(shí)使用
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple some-package
# 默認(rèn)使用
# 更新pip
python -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple --upgrade pip
# 設(shè)置全局變量
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
# 刪除已有內(nèi)容,將紅框內(nèi)的內(nèi)容復(fù)制到文件中
# 清楚舊的索引緩存
conda clean -i -y
Linux安裝docker engine
# 更新apt索引
sudo apt update
# 更新apt包
sudo apt upgrade -y
# 根據(jù)官網(wǎng)提示安裝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
# 設(shè)置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
# 測(cè)試docker,輸入如下則表示安裝成功
sudo docker run hello-world
Linux安裝NVIDIA CONTAINER TOOLKIT
# 根據(jù)官方提示安裝nvidia container toolkit,為docker提供nvidia底層支持
# https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html
# 設(shè)置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對(duì)docker的底層支持
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker
# 測(cè)試nvidia container toolkit,輸出如下則成功
sudo docker run --rm --runtime=nvidia --gpus all ubuntu nvidia-smi
docker下載pytorch鏡像,并創(chuàng)建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
# 下載最新的即可,圖片中的版本號(hào)不同
# 利用docker鏡像創(chuàng)建docker容器
# 可以在官網(wǎng)查看具體參數(shù)含義
# https://docs.docker.com/engine/reference/commandline/container_run/
# 利用docker hub提供的鏡像創(chuàng)建容器,利用NVIDIA提供的鏡像創(chuàng)建命令類似
# --gpus "all" 配置容器可以調(diào)用的GPU
# --name "container name" 容器名稱,利用一個(gè)鏡像可以創(chuàng)建多個(gè)容器
# --ipc "host" 設(shè)置容器的IPC模式,解除載入數(shù)據(jù)線程之間共享數(shù)據(jù)內(nèi)存限制
# --restart "always" 容器被關(guān)閉時(shí)重新啟動(dòng)
# --volume, -v 掛在容器外的目錄,ubuntu下的路徑:容器中的路徑
# --publish,-p 將容器端口映射到linux宿主機(jī)上,linux端口:容器端口
# --detach,-d 容器后臺(tái)運(yùn)行
# --interactive,-i 進(jìn)入容器交互式命令行
# --tty,-t 進(jìn)入容器偽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
# 查看創(chuàng)建的容器
sudo docker ps -a
# 進(jìn)入容器,注意提示符,從linux中切換到了容器內(nèi)
sudo docker exec -it torch /bin/bash
pytorch容器安裝ssh
# 可以更換apt源,一定要注意ubuntu的版本
# 由于以root用戶登錄容器,所以以下命令無需sudo切換到root權(quán)限
# 更新apt索引
apt update
# 更新apt包
apt upgrade -y
# 安裝vim文本編輯器
apt install vim -y
# 安裝ssh,用于遠(yuǎn)程連接
apt install openssh-server -y
pytorch容器安裝jupyterlab
# 查看是否已經(jīng)安裝conda
# 如果報(bào)錯(cuò),則沒有安裝conda,或者conda沒有安裝在/opt/文件夾下,可以使用conda info進(jìn)一步驗(yàn)證
# 如果沒有報(bào)錯(cuò),則conda已經(jīng)安裝,可以使用conda info進(jìn)一步驗(yàn)證,如果conda info報(bào)錯(cuò),則是bash環(huán)境變量問題,這里提供一個(gè)解決思路,就不展開講了
cd /opt/conda
# 若沒有安裝conda,則通過pip安裝jupyterlab
pip install jupyterlab -y
# 若已經(jīng)安裝conda,則需要先看base環(huán)境中是否已經(jīng)安裝jupyterlab,如果沒有輸出,則沒有安裝
conda list | grep jupyter
# 初始化conda環(huán)境
conda init
# 在base環(huán)境中安裝jupyterlab,這樣其他conda虛擬環(huán)境可以共用jupyterlab,而無需在每個(gè)虛擬環(huán)境安裝
conda install -c conda-forge jupyterlab -y
# 可能會(huì)報(bào)http網(wǎng)絡(luò)連接錯(cuò)誤,多試幾次就好了
至此,需要安裝的基礎(chǔ)軟件就裝完了,有其他安裝需求的可以自行安裝。
接下來講講怎么配置軟件,才可以在WIN11上的IDE使用容器,這里以pycharm professional為例,vscode連接的原理是一樣的。至于怎么安裝軟件和破解,這里就不展開了,閱讀量大的話,單開一期講。
配置軟件
目前需要的軟件雖然安裝好了,但是pycharm還是無法訪問容器中的解釋器,這里我們采用ssh方式進(jìn)行連接。
配置ssh
# 生成ssh密鑰,用于驗(yàn)證登錄身份。直接使用密碼不太安全
ssh-keygen -m PEM -t rsa -b 4096 -C "AnyInformation"
# 將私鑰拷貝到項(xiàng)目文件夾中
cp /root/id_rsa /workspace
# 此時(shí),你可以在win11的項(xiàng)目文件夾看到該私鑰
# 編輯配置文件/etc/ssh/sshd_config
PermitRootLogin yes
PubkeyAuthentication yes
PasswordAuthentication no
PermitEmptyPasswords no
AuthorizedKeysFile .ssh/id_rsa.pub
# 重啟ssh服務(wù)
service ssh restart
然后就可以在Pycharm的 文件 >> 設(shè)置 >> 工具 >> SSH配置,設(shè)置主機(jī)IP為127.0.0.1,端口為設(shè)置的容器22端口映射的宿主機(jī)端口10001,私鑰文件為項(xiàng)目文件夾下的ssh私鑰。點(diǎn)擊測(cè)試連接即可成功。別忘了點(diǎn)右下角的應(yīng)用哦?。?!
然后可以在Pycharm的 文件 >> 設(shè)置 >> 項(xiàng)目 >> Python解釋器 >> 添加ssh
然后可以添加conda或者python的解釋器,但是不建議conda解釋器創(chuàng)建新環(huán)境,自己命令行創(chuàng)建的conda環(huán)境,可以控制純粹的pip安裝。
conda使用現(xiàn)有環(huán)境:
同步文件夾其實(shí)并不需要,因?yàn)槲覀冊(cè)赿ocker容器的創(chuàng)建過程中已經(jīng)設(shè)置了映射關(guān)系,所以取消勾選自動(dòng)上傳。由于以root身份登錄,所以取消勾選sudo權(quán)限。然后就可以愉快的使用啦?。?/p>
conda創(chuàng)建新環(huán)境:
設(shè)置環(huán)境名稱、Python的版本號(hào)。同步文件夾其實(shí)并不需要,因?yàn)槲覀冊(cè)赿ocker容器的創(chuàng)建過程中已經(jīng)設(shè)置了映射關(guān)系,所以取消勾選自動(dòng)上傳。由于以root身份登錄,所以取消勾選sudo權(quán)限。然后就可以愉快的使用啦?。?!
配置開機(jī)啟動(dòng)
為了達(dá)到開機(jī)打開Pycharm即可連接容器內(nèi)的解釋器 進(jìn)行開發(fā)的流暢使用體驗(yàn)。需要以下幾項(xiàng)功能:
- ssh隨容器啟動(dòng)而啟動(dòng)
- 容器隨wsl子系統(tǒng)啟動(dòng)而啟動(dòng)
- wsl子系統(tǒng)隨win11開機(jī)啟動(dòng)而啟動(dòng)
# 將ssh啟動(dòng)與bash關(guān)聯(lián)啟動(dòng),達(dá)到ssh隨容器啟動(dòng)而啟動(dòng)的效果
# 容器內(nèi)創(chuàng)建ssh啟動(dòng)腳本
touch /root/start_ssh.sh
# 編輯ssh啟動(dòng)腳本
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腳本添加執(zhí)行權(quán)限
chmod +x /root/start_ssh.sh
# 將ssh啟動(dòng)腳本添加到容器啟動(dòng)文件中
vim /root/.bashrc
# startup run
if [ -f /root/start_ssh.sh ]; then
/root/start_ssh.sh
fi
# 容器隨wsl子系統(tǒng)啟動(dòng)而啟動(dòng)
# 在創(chuàng)建容器時(shí),已經(jīng)通過 --restart "always" 參數(shù)指定
# 如果沒有在容器創(chuàng)建時(shí)指定,可以使用以下命令,記得把containername替換為你的容器名稱!?。?/span>
sudo docker update --restart "always" containername
# wsl隨win11啟動(dòng)而啟動(dòng)
# win+r,輸入 shell:startup,轉(zhuǎn)到啟動(dòng)目錄
# 新建 wsl.vbs 文件,名稱可以更改,后綴為vbs就行
# 在wsl.vbs中寫入
rem Msgbox "WSL開機(jī)啟動(dòng)"
Set ws = CreateObject("Wscript.Shell")
ws.run "wsl -d Ubuntu-22.04 -u tao", vbhide
配置jupyterlab
# 安裝jupyter notebook
conda install -c conda-forge notebook
# 設(shè)置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擴(kuò)展插件
conda install -c conda-forge nodejs
conda install -c conda-forge jupyterlab_widgets
conda install -c conda-forge ipympl
docker容器啟動(dòng)時(shí),自動(dòng)啟動(dòng)jupyter notebook文章來源:http://www.zghlxwxcb.cn/news/detail-832316.html
# 編輯ssh啟動(dòng)腳本
vim /root/start_ssh.sh
# 在最后添加
nohup jupyter notebook > jupyternotebook.log 2>&1 &
# 如果想關(guān)閉jupyter notebook
# 找出包含jupyter的進(jìn)程
ps -aux | grep jupyter
# 會(huì)列出很多,然后找到 jupyter notebook相關(guān)的進(jìn)程, 一般情況下第二列就是pid, 如,我的進(jìn)程是 9608,然后再用如下命令即可殺掉進(jìn)程
kill -9 9608
解釋器問題
pycharm添加WSL下docker中的conda解釋器,報(bào)錯(cuò)ttyname failed: Inappropriate ioctl for device文章來源地址http://www.zghlxwxcb.cn/news/detail-832316.html
# 打開/root/.profile
vim /root/.profile
# 將mesg n || true 改為如下
tty -s && mesg n || true
# 使profile生效
source /root/.profile
到了這里,關(guān)于WIN11+WSL2+Docker 深度學(xué)習(xí)環(huán)境部署的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!