基于WSL2+Docker+VScode搭建機器學(xué)習(xí)(深度學(xué)習(xí))開發(fā)環(huán)境
內(nèi)容概述:由于最近配發(fā)了新的工作電腦但不想裝雙系統(tǒng),因此通過本博文來記錄基于Windows子系統(tǒng)WSL+Docker搭建機器學(xué)習(xí)與深度學(xué)習(xí)開發(fā)環(huán)境的流程步驟,同時記錄該過程中所遇到的相關(guān)問題及解決方案。期待為同行學(xué)習(xí)者提供參考;
最終效果:在Windows電腦上,無需安裝VMware等虛擬機(顯式)或雙系統(tǒng),即可使用Linux,并基于Linux使用docker或其他依賴于Linux的機器學(xué)習(xí)工具包;
注意:這篇Post分為如下兩個部分:
第一部分:利用WSL2+Vscode實現(xiàn)開發(fā)環(huán)境的搭建。
第二部分:進一步在WSL2中配置Docker與Nvidia docker Toolkit,實現(xiàn)基于Docker的開發(fā)環(huán)境搭建。
其中,第一部分內(nèi)容已經(jīng)可以滿足日常開發(fā)的需要,沒有Docker使用需求的同行可直接跳過第二部分。
但博主本人日常工作需要用到Docker及相關(guān)工具,且本人認為基于Docker容器來管理日常開發(fā)環(huán)境,可以更好地避免日常項目中的包版本間的沖突關(guān)系。同時,利用Docker搭建開發(fā)環(huán)境,其試錯成本低,不會對物理機環(huán)境有任何影響,可充分保持物理機環(huán)境的干凈,即便重裝系統(tǒng),也可快速地恢復(fù)本地開發(fā)環(huán)境(前提是已經(jīng)把自己的Docker開發(fā)環(huán)境打包成鏡像,并上傳pull至docker hub, 以便可隨時拉取至本地)。
第一部分:利用WSL2+Vscode搭建開發(fā)環(huán)境
(1) 開啟系統(tǒng)功能
由于WSL是Windows子系統(tǒng),因此首先需要啟用相關(guān)系統(tǒng)功能:
- 適用于Linux的Windows子系統(tǒng);
- 虛擬機平臺;
具體地,需要在Windows控制面板中開啟如下圖所示的功能選項;同時待系統(tǒng)搜索安裝完成后,重啟系統(tǒng);
(2) 將WSL2設(shè)置為默認版本
在Windows系統(tǒng)中打開 PowerShell, 將 WSL 2 設(shè)置為默認版本,如下圖所示:
出現(xiàn)如圖所示的提示信息,即為設(shè)置成功。
(3) 安裝Ubuntu
在微軟商店,搜索安裝Ubuntu,這里選擇安裝ubuntu22.04:
安裝完成后,在開始菜單即可選中啟動。
可選步驟(可跳過),其中,點擊啟動后可能出現(xiàn)如下錯誤:
對上述錯誤,按照錯誤解決方法即可解決。具體地,下載如下圖所示的Linux內(nèi)核更新包,即可:
問題解決方法鏈接:https://github.com/microsoft/WSL/issues/5393
具體解決步驟鏈接: https://learn.microsoft.com/zh-cn/windows/wsl/install-manual#step-4—download-the-linux-kernel-update-package
上述步驟完成后,即可正常啟動,然后提示設(shè)置用戶名和密碼,設(shè)置完成后 啟動界面如下圖所示:
(4) 安裝Anaconda并配置環(huán)境變量
在上述Linux子系統(tǒng)中,安裝Anaconda3,以提供虛擬環(huán)境管理工具。具體地,命令如下:
# Step one: 下載安裝包.
wget https://repo.anaconda.com/archive/Anaconda3-2021.05-Linux-x86_64.sh
# Step two: 執(zhí)行bash命令,其中會多次輸入yes確認.
# note:需進入到安裝包所在目錄或鍵入絕對路徑.
bash Anaconda3-2021.05-Linux-x86_64.sh
安裝完成,如下圖所示:
然后是配置環(huán)境變量,方便使用conda來進行虛擬環(huán)境創(chuàng)建管理,步驟如下:
# Step three.
# 使用vim編輯器將anaconda安裝路徑的bin目錄添加到配置文件
vim ~/.bashrc
# 按i進入插入模式,如下圖所示,添加安裝路徑到行末
PATH=/home/user/anaconda3/bin:$PATH
# note: 其中,usr需要根據(jù)實際情況修改,對應(yīng)步驟三的用戶名;
# Step four:保存退出vim編輯器
按鍵盤ESC鍵,退出插入模式,然后輸入冒號wq并回車保存編輯內(nèi)容
:wq
# Step five:刷新配置文件,效果如下圖所示.
source .bashrc
這時候,Anaconda及環(huán)境便令均安裝配置完成。后面就可以像在Windowns上一樣,新增管理conda虛擬環(huán)境
(5) 安裝Vscode及相關(guān)擴展
在Windows上的Vscode安裝過程簡單,此處省略。僅說明需要安裝的關(guān)鍵插件,實現(xiàn)Vscode能夠鏈接WSL2里面的開發(fā)環(huán)境。具體如下:
- 安裝WSL插件,用于連接WSL中的Conda虛擬環(huán)境;
- 安裝remote-ssh, 用于連接公司的服務(wù)器;
安裝完成后,點擊左下角的遠程連接,如下圖所示:
此時,即可連接到WSL2 子系統(tǒng)。
打開Linux子系統(tǒng)的某個目錄:這里以home目錄下的用戶目錄(wsl_ubuntu)為例:確定目錄后回車,即可打開對應(yīng)目錄:
在打開的目錄中,創(chuàng)建jupyter notebook文件,命名為Script_test.ipynb。如下圖所示:
(6) 選擇虛擬環(huán)境
- 注意,此實例打開的是/home/wsl_ubuntu/目錄,該文件夾位于Linux子系統(tǒng)的文件目錄中,如下圖:
- 如果此時需要在Windows系統(tǒng)中的盤符進行項目創(chuàng)建,需要在Open Folder的時候,進行切換,選中mnt,如下圖,這里的C、D、E分別代表Windows本地磁盤,C盤,D盤,等;
此時,所創(chuàng)建的Python文件還沒有對應(yīng)的虛擬環(huán)境提供Python解釋器,我們點擊右上角,select kernel,選擇前面安裝anaconda后提供的虛擬環(huán)境,如下圖:
到此,我們實現(xiàn)了基于WSL2+Vscode的開發(fā)環(huán)境搭建。如若沒有docker使用需求,即可結(jié)束配置步驟。上述執(zhí)行效果如下:
第二部分:利用WSL2+Docker+Vscode搭建開發(fā)環(huán)境
考慮到Docker容器的便捷性與隔離性,這里進一步在WSL2安裝docker及Nvidia docker toolkit。實現(xiàn)深度學(xué)習(xí)開發(fā)環(huán)境的容器化管理。具體地,我將通過Docker搭建起TensorFlow及Pytorch開發(fā)環(huán)境,因為不想麻煩地裝cuda、cudnn等。相較之下,使用容器,這些東西都打包好了,直接用。
一個前提,得保證本地Windows物理機已經(jīng)安裝了較高版本的Nvidia Driver,如下圖:
(1) 在WSL中安裝docker及Nvidia docker toolkit
實際上,如果不是為了使用Nvidia官方提供的Pytorch和TensorFlow鏡像,直接安裝Docker就可以了。這里為了使用Nvidia提供的深度學(xué)習(xí)框架鏡像,因此需要安裝Nvidia docker toolkit。
- 安裝Nvidia docker toolkit[可選步驟,可以直接跳過到docker安裝步驟]。實際上就是安裝了一些docker的插件吧。
安裝命令來自官網(wǎng),這里是地址,基于apt安裝的具體過程如下:
# Step one: Configure the repository
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 \
&& \
sudo apt-get update
# Step two: Install the NVIDIA Container Toolkit packages.
sudo apt-get install -y nvidia-container-toolkit
這個過程比較簡單,耐心安裝完即可。
- 在WSL2的Ubuntu22.04中安裝Docker,命令來自于Docker官網(wǎng),注意查看支持的系統(tǒng)版本,具體如下:
# Step one: Uninstall old versions
for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done
# Step two: Set up Docker's official GPG key:
# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
# Add the repository to Apt sources:
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
sudo apt-get update
# Step three: Install the Docker packages.
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# Step four: alternative to verify .
sudo docker run hello-world
到這一步就安裝結(jié)束了。但沒想到是的,出現(xiàn)了如下圖所示“尷尬提示”??梢钥闯?,查看docker 版本的時候,一切正常,然而,執(zhí)行sudo docker run hello-world命令的時候,報錯。
報錯信息為:”“docker: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?.”
看起來像是說,我們的Docker沒有啟動。但是,實際發(fā)現(xiàn)通過service docker status啟動后還是不行。如上圖所示。這種情況在幾個月前的另一臺電腦上,沒有出現(xiàn)。經(jīng)過查找發(fā)現(xiàn)如下信息:
[此處感謝博友1:]: https://juejin.cn/post/7197594278083919932
[感謝博友2:]: https://www.cnblogs.com/towinar/p/17344345.html
因此,通過執(zhí)行如下命令,上述問題得以解決。具體如下:
# Step one:
sudo update-alternatives --set iptables /usr/sbin/iptables-legacy
# Step two:
sudo update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy
"""
該命令將 /usr/sbin/iptables-legacy 和 /usr/sbin/ip6tables-legacy 分別設(shè)置為 iptables 和 ip6tables 的備選方案.
"""
# Step three:
sudo service docker start
至此,Docker已經(jīng)安裝成功。如下圖所示:
實際上,到這一步,我們的Docker和Nvidia Docker Toolkit都已經(jīng)安裝完成了。但是在基于WSL2的實際使用過程中我們發(fā)現(xiàn)一個“BUG”。如下圖所示:
實際上,我們已經(jīng)拉取過很多鏡像到本地,但是通過命令查看結(jié)果顯示,這里只有兩個(對比與上圖的客戶端查看結(jié)果)。深度懷疑這是官方在搞鬼,大概就是強推客戶端吧。
(2) 安裝Docker Desktop[可選]
因此,為了折騰(配合命令行使用),進一步選擇安裝了Docker Desktop,即在Windows上安裝Docker客戶端。實際上我是拒絕的!這個過程簡單,不做贅述!
至此,客戶端安裝完畢。日常的使用,通過命令行足以滿足,但為了避免一些問題,還是配合客戶端一起使用。
(3) 拉取目標Pytorch鏡像文件
這里以Nvidia Pytorch鏡像(網(wǎng)址:https://catalog.ngc.nvidia.com/orgs/nvidia/containers/pytorch)為例,拉取鏡像,并創(chuàng)建容器,如下圖所示:
# 根據(jù)Docker版本,選擇安裝命令。當(dāng)前安裝的Docker版本為24.0.7
# 命令中的xx.xx是容器的版本,例如:22.10
# Docker 19.03 or later, a typical command to launch the container is:
docker run --gpus all -it --rm nvcr.io/nvidia/pytorch:xx.xx-py3
# Docker 19.02 or earlier, a typical command to launch the container is:
nvidia-docker run -it --rm -v nvcr.io/nvidia/pytorch:xx.xx-py3
注意,這里需要考慮自己電腦已經(jīng)安裝的顯卡驅(qū)動(Nvidia driver version)。建議安裝比較新的顯卡驅(qū)動,否則一些容器的功能會受限。當(dāng)然,在選擇容器版本之前,也可以考慮使用舊一點的容器版本。
我這里還是安裝上一個電腦正在使用的版本,23.08。因此,結(jié)合使用端口映射等命令,對該版本的鏡像文件拉取過程如下(簡單起見,可以直接運行,本地沒有找到的話,自動開始網(wǎng)絡(luò)拉取):
# excute commands
sudo docker run --gpus all -it --rm -p 8888:8888 -v ~:/workspace \
--ipc=host --ulimit memlock=-1 --ulimit stack=67108864 \
nvcr.io/nvidia/pytorch:23.08-py3
# 拉取Nvidia Tensorflow鏡像的命令類似
sudo docker run --gpus all -it --rm -p 8888:8888 -v ~:/workspace \
--ipc=host --ulimit memlock=-1 --ulimit stack=67108864 \
nvcr.io/nvidia/tensorflow:23.08-py3
拉取完之后,便基于該鏡像文件創(chuàng)建并啟動了容器,如下圖所示:
此時,我們就可以直接在這里輸入 jupyter notebook,啟動記事本了。對于TensorFlow也是一樣的,無需手動安裝cuda、cudnn等。進一步,查看是否可以獲取到GPU,如下圖:
沒有問題。下面我將關(guān)閉所有打開的命令行,關(guān)閉上述運行的容器,從頭使用Vscode,以及利用Vscode集成的終端,連接容器中的Pytorch開發(fā)環(huán)境,進一步測試安裝是否成功!
(4) 在VScode中連接容器中的開發(fā)環(huán)境
- 啟動Vscode,連接到WSL2并創(chuàng)建jupyter notebook文件。因為我們的容器環(huán)境在WSL2系統(tǒng)中。
# Script_test.
# Print the pytorch version.
import torch
print(torch.__version__)
# # Test the GPU is available or not.
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
print(device)
- 啟動Vscode集成終端,基于上述拉取的Pytorch鏡像創(chuàng)建容器,同時啟動jupyter notebook服務(wù),如下圖:
jupyter notebook服務(wù)已經(jīng)啟動,如下圖所示的訪問地址:
- 更改當(dāng)前jupyter notebook的kernel,并連接到當(dāng)前運行在容器里面的jupyter服務(wù)器,如下圖:
選擇Existing Jupyter Server, 輸入上述所啟動的Jupyter notebook訪問地址,【http://hostname:8888/?token=99e28504c265262e15d096a8d0913256c0ae104787e1d6ef】,并將hostname修改為localhost,回車即可。此時,當(dāng)前記事本的kernel已經(jīng)變更為Python 3(ipykernel):
至此,基于WSL2+Docker+VScode的機器學(xué)習(xí)(深度學(xué)習(xí))環(huán)境配置結(jié)束。
參考鏈接
[1] 關(guān)于ubuntu安裝后,啟動報錯"WslRegisterDistribution failed with error" 的解決方案:參照 https://github.com/microsoft/WSL/issues/5393 和 https://learn.microsoft.com/zh-cn/windows/wsl/install-manual#step-4—download-the-linux-kernel-update-package 。文章來源:http://www.zghlxwxcb.cn/news/detail-765256.html
[2] 關(guān)于啟動Docker后,提示報錯“docker: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?.”,參照 https://stackoverflow.com/questions/57267776/why-is-the-docker-service-stopping 。文章來源地址http://www.zghlxwxcb.cn/news/detail-765256.html
到了這里,關(guān)于基于WSL2+Docker+VScode搭建機器學(xué)習(xí)(深度學(xué)習(xí))開發(fā)環(huán)境的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!