習(xí)環(huán)境全攻略)
折騰過深度學(xué)習(xí)環(huán)境的朋友都知道環(huán)境配置這件事往往是“跑通之前想砸電腦跑通之后一身輕”。這幾年因?yàn)轫?xiàng)目需要我在Windows 11/10 平臺(tái)上反反復(fù)復(fù)裝過不少次深度學(xué)習(xí)環(huán)境最后固定下來的一套組合就是Windows側(cè)只裝顯卡驅(qū)動(dòng)計(jì)算環(huán)境全部丟到WSL2里的Ubuntu 20.04再在虛擬機(jī)內(nèi)部配置CUDA工具鏈和PyTorch。這套方案最大的好處是既保住了Windows日常辦公、玩游戲、剪視頻的便利又拿到了接近原生Linux的開發(fā)體驗(yàn)而且GPU直通調(diào)用CUDA基本無感。這篇文章我會(huì)把完整的配置過程、每一步背后的原理、還有我踩過的坑一次性講清楚。不管你是剛接觸WSL2的新手還是想在Windows上搞深度學(xué)習(xí)又不想裝雙系統(tǒng)的老手照著這套流程走完大概率能把你自己的PyTorch環(huán)境跑起來。注意我講的是Windows 11/10下WSL2 Ubuntu 20.04的組合這是一套經(jīng)過大量用戶驗(yàn)證的穩(wěn)定搭配版本細(xì)節(jié)我會(huì)在文中隨時(shí)點(diǎn)明。1. 為什么要折騰WSL2方案取舍與適用場(chǎng)景1.1 WSL2和雙系統(tǒng)、傳統(tǒng)虛擬機(jī)的恩怨先說說我為什么放著雙系統(tǒng)不用非要繞道WSL2。三年前我第一次在Windows上配深度學(xué)習(xí)環(huán)境老老實(shí)實(shí)裝了虛擬機(jī)軟件里面塞了一個(gè)Ubuntu桌面版。結(jié)果顯卡直通配置折騰了將近一周虛擬機(jī)里跑出來的幀率還不到本機(jī)的三分之一那次經(jīng)歷直接讓我對(duì)傳統(tǒng)虛擬機(jī)方案產(chǎn)生了心理陰影。后來接觸到了WSL2才意識(shí)到虛擬機(jī)方案的問題在于圖形化和硬件模擬的額外開銷太多而WSL2走的是輕量級(jí)虛擬化路線它本質(zhì)上是一個(gè)運(yùn)行在輕量級(jí)虛擬機(jī)里的完整Linux內(nèi)核但和Windows宿主機(jī)共享了整個(gè)生態(tài)。雙系統(tǒng)當(dāng)然也能用但每天來回重啟切換系統(tǒng)實(shí)在太傷了。尤其是寫代碼寫到一半需要去Windows側(cè)查個(gè)資料、回個(gè)微信、用一下Windows下的專用軟件來回切換的成本在真實(shí)開發(fā)節(jié)奏里高到難以忽視。WSL2則把Windows和Linux揉在了同一臺(tái)機(jī)器里文件可以互相訪問網(wǎng)絡(luò)共享天然打通啟動(dòng)一個(gè)Ubuntu終端只需要幾秒鐘這種無縫體驗(yàn)是雙系統(tǒng)給不了的。很多人會(huì)擔(dān)心WSL2是不是“閹割版Linux”怕跑不了GPU任務(wù)。這個(gè)擔(dān)心在早期確實(shí)成立但自從微軟和NVIDIA聯(lián)手做了GPU加速支持之后WSL2里已經(jīng)可以直接訪問宿主機(jī)顯卡CUDA、cuDNN這些深度學(xué)習(xí)底層的庫都能正常工作。我現(xiàn)在跑PyTorch訓(xùn)練、推理、甚至一些輕量級(jí)模型微調(diào)都在WSL2里完成效率上和我以前用過的純Linux服務(wù)器沒有明顯差別。1.2 什么人適合這套方案根據(jù)我的經(jīng)驗(yàn)下面這幾類人是最適合用WSL2 Ubuntu 20.04這套組合的。第一類是學(xué)生和科研人員日常主力是Windows筆記本偶爾需要跑一些課程實(shí)驗(yàn)、論文復(fù)現(xiàn)不想為了一個(gè)實(shí)驗(yàn)去裝雙系統(tǒng)。第二類是在企業(yè)辦公場(chǎng)景下工作的開發(fā)者公司電腦上鎖定了各種Windows辦公軟件沒法隨意更換系統(tǒng)WSL2可以在不違反管理規(guī)定的前提下?lián)碛幸惶譒inux開發(fā)環(huán)境。第三類是游戲開發(fā)、圖形學(xué)相關(guān)從業(yè)者需要在Windows上跑游戲引擎同時(shí)又要用Linux工具鏈做構(gòu)建和調(diào)試。當(dāng)然也有不適合的。比如你手頭的顯卡本身不支持CUDA或者你是Apple Silicon芯片的Mac用戶那這套方案完全不適用。再比如你要做大規(guī)模的分布式訓(xùn)練需要多機(jī)多卡集群調(diào)度那還是老老實(shí)實(shí)用純Linux服務(wù)器更合理WSL2畢竟跑在個(gè)人電腦上資源上限就擺在那里。2. Windows側(cè)環(huán)境準(zhǔn)備與WSL2落地2.1 版本與硬件前置檢查動(dòng)手之前先花五分鐘做個(gè)檢查能省掉后面對(duì)著一堆看不懂報(bào)錯(cuò)的時(shí)間。系統(tǒng)層面Windows 10必須升級(jí)到2004版以上Windows 11則沒有太大的版本限制但最好保持最新補(bǔ)丁狀態(tài)。檢查方法是在“運(yùn)行”窗口輸入“winver”回車彈出來的窗口里能看到具體版本號(hào)如果低于2004就先更新再往后走。CPU要求是支持虛擬化現(xiàn)在市面上絕大多數(shù)處理器都沒問題AMD和Intel都行。關(guān)鍵點(diǎn)是必須確保BIOS里開啟了虛擬化技術(shù)Intel對(duì)應(yīng)的叫VT-xAMD叫SVM一般在BIOS的高級(jí)設(shè)置里能找到。如果沒開啟WSL2安裝后會(huì)提示“請(qǐng)啟用虛擬機(jī)平臺(tái)”。另外虛擬化功能”這一項(xiàng)。顯卡方面NVIDIA顯卡是剛需而且必須是支持CUDA的型號(hào)。怎么判斷去NVIDIA官網(wǎng)對(duì)照一下自己的顯卡型號(hào)是否在CUDA支持列表里。我用過幾款不同的NVIDIA卡從入門級(jí)到中高端都能在WSL2里正常調(diào)用所以只要不是太老的麥克斯韋架構(gòu)之前的卡問題都不大。AMD顯卡理論上也有對(duì)應(yīng)的方案但生態(tài)遠(yuǎn)不如NVIDIA成熟不建議作為主力開發(fā)環(huán)境。內(nèi)存和硬盤也得稍微惦記一下。WSL2的虛擬機(jī)內(nèi)存默認(rèn)會(huì)占到宿主機(jī)內(nèi)存的50%左右如果你只有8GB內(nèi)存跑大模型會(huì)非常吃力建議至少16GB起步。硬盤建議SSD因?yàn)閁buntu的文件系統(tǒng)是放在一個(gè)虛擬磁盤文件里的機(jī)械硬盤的隨機(jī)讀取性能會(huì)明顯拖慢包管理器安裝和數(shù)據(jù)處理的速度。2.2 啟用WSL與虛擬機(jī)平臺(tái)環(huán)境檢查完之后開始正式安裝。最簡(jiǎn)單的方法是直接以管理員身份打開PowerShell執(zhí)行下面的命令wsl --install這條命令在Windows 10 2004以上和Windows 11上都會(huì)自動(dòng)啟用需要的Windows功能組件包括“適用于Linux的Windows子系統(tǒng)”和“虛擬機(jī)平臺(tái)”然后默認(rèn)安裝Ubuntu發(fā)行版。不過這里有個(gè)坑默認(rèn)安裝的Ubuntu往往是最新版本而我這次目標(biāo)是Ubuntu 20.04所以更推薦分步手動(dòng)操作。第一步在PowerShell里手動(dòng)啟用兩個(gè)Windows功能dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart命令執(zhí)行完會(huì)提示重啟電腦這時(shí)候老老實(shí)實(shí)重啟一次別想著省事往下走我就是因?yàn)楫?dāng)時(shí)懶得重啟直接繼續(xù)結(jié)果后面WSL一直起不來排查了半天才發(fā)現(xiàn)是功能沒生效。重啟回來后把WSL2設(shè)置為默認(rèn)版本。這一步非常關(guān)鍵因?yàn)閃SL1和WSL2在系統(tǒng)架構(gòu)上完全是兩回事WSL1通過系統(tǒng)調(diào)用翻譯層兼容Linux程序不支持真正的Linux內(nèi)核也不支持GPU直通。執(zhí)行wsl --set-default-version 2 wsl --version執(zhí)行第二條命令是為了確認(rèn)WSL本身的版本如果你看到的WSL版本號(hào)是類似于1.x或者顯示“WSL 1”說明內(nèi)核組件還有缺失。遇到這種情況直接去微軟官方渠道下載并安裝最新的WSL更新包即可裝完再執(zhí)行一次wsl --version確認(rèn)。2.3 安裝并初始化Ubuntu 20.04基礎(chǔ)組件就緒后開始安裝Ubuntu 20.04。打開微軟商店搜索“Ubuntu 20.04”找到后點(diǎn)擊安裝。沒有商店訪問權(quán)限的話也可以用命令行方式直接拉取wsl --install -d Ubuntu-20.04安裝完成后第一次啟動(dòng)Ubuntu終端系統(tǒng)會(huì)要求設(shè)置一個(gè)Linux用戶名和密碼。注意這個(gè)用戶名和Windows用戶名完全無關(guān)是獨(dú)立的Linux賬戶之后用sudo提權(quán)都是基于這個(gè)賬戶。密碼輸入時(shí)屏幕上不會(huì)顯示任何字符別慌正常輸入然后回車就行。第一次初始化的時(shí)候Ubuntu會(huì)執(zhí)行一些解包和配置的腳本需要等個(gè)幾分鐘。這個(gè)過程中我遇到過網(wǎng)絡(luò)不良導(dǎo)致安裝卡住的情況如果長(zhǎng)時(shí)間沒有反應(yīng)可以關(guān)掉終端重新啟動(dòng)再不行就檢查一下Windows防火墻是否攔截了WSL的網(wǎng)絡(luò)訪問。初始化完成后第一件事就是更新軟件包源和系統(tǒng)組件sudo apt update sudo apt upgrade -y sudo apt install -y build-essentialbuild-essential里面包含了gcc、g、make這些編譯工具鏈雖然安裝PyTorch的時(shí)候通常不需要本地編譯但后面折騰一些自定義算子、編譯CUDA擴(kuò)展時(shí)就會(huì)用到屬于必須自帶的基礎(chǔ)裝備。2.4 用.wslconfig控制資源占用到這里WSL2已經(jīng)能正常使用了但還有一件事我建議你早點(diǎn)做就是創(chuàng)建.wslconfig配置文件。這個(gè)文件放在Windows用戶目錄下例如C:\Users\你的用戶名\.wslconfig用來限制WSL2虛擬機(jī)對(duì)宿主機(jī)資源的占用。為什么需要限制因?yàn)閃SL2默認(rèn)會(huì)使用宿主機(jī)50%的內(nèi)存以及所有CPU核心。如果你跑著內(nèi)存吃緊的開發(fā)工具、瀏覽器開了一堆標(biāo)簽頁WSL2再占掉一半內(nèi)存Windows這邊很容易卡成幻燈片。我的配置文件是這樣寫的[wsl2] memory12GB processors6 swap8GB localhostForwardingtruememory字段限制WSL2最大內(nèi)存processors限制CPU核心數(shù)swap指定交換分區(qū)大小localhostForwarding保持默認(rèn)開啟就好它保證WSL2里的服務(wù)可以通過localhost被Windows側(cè)訪問比如你在Ubuntu里啟動(dòng)了Jupyter NotebookWindows瀏覽器直接訪問http://localhost:8888就能打開。改完.wslconfig后需要徹底重啟WSL2才能生效。在PowerShell里執(zhí)行wsl --shutdown執(zhí)行完等幾秒鐘再重新進(jìn)入U(xiǎn)buntu終端內(nèi)存限制就生效了。資源限制這件事一定要在安裝重型工具之前做不然等你把CUDA、PyTorch都裝完了才發(fā)現(xiàn)內(nèi)存不夠用排查起來特別費(fèi)勁。3. NVIDIA顯卡驅(qū)動(dòng)與CUDA工具鏈3.1 WSL2的GPU驅(qū)動(dòng)機(jī)制很多第一次在WSL2里配CUDA的人會(huì)下意識(shí)地跑到Ubuntu內(nèi)部去下載NVIDIA的Linux版本顯卡驅(qū)動(dòng)。這里我要重點(diǎn)提醒千萬不要在WSL2里安裝Linux版本的NVIDIA驅(qū)動(dòng)這一步踩坑的人太多了。WSL2的GPU驅(qū)動(dòng)機(jī)制和原生Linux不一樣。在WSL2里顯卡驅(qū)動(dòng)安裝在Windows宿主機(jī)一側(cè)WSL2內(nèi)部的Ubuntu是通過微軟提供的GPU直通接口訪問Windows驅(qū)動(dòng)。換句話說NVIDIA顯卡驅(qū)動(dòng)只需要在Windows側(cè)安裝一份WSL2內(nèi)部不需要、也不能再裝一遍L(zhǎng)inux驅(qū)動(dòng)。如果你強(qiáng)行在WSL2里裝了Linux版驅(qū)動(dòng)輕則驅(qū)動(dòng)加載失敗重則直接把WSL2的GPU訪問搞崩畫面就是nvidia-smi要么報(bào)錯(cuò)要么顯示找不到設(shè)備。所以正確的驅(qū)動(dòng)檢查方式是在Windows側(cè)確保已經(jīng)安裝了從NVIDIA官網(wǎng)下載的顯卡驅(qū)動(dòng)版本盡量保持較新。然后在WSL2的終端里執(zhí)行nvidia-smi如果一切正常你會(huì)看到和Windows側(cè)幾乎一模一樣的顯卡信息輸出包括驅(qū)動(dòng)版本和CUDA版本號(hào)。這里有個(gè)關(guān)鍵點(diǎn)WSL2里nvidia-smi顯示的CUDA版本是Windows驅(qū)動(dòng)內(nèi)置支持的CUDA運(yùn)行時(shí)版本并不是你在Ubuntu里安裝的CUDA Toolkit版本兩者不能混淆。很多人看到驅(qū)動(dòng)里的CUDA版本是12.x就以為CUDA Toolkit已經(jīng)裝好了其實(shí)還差得遠(yuǎn)。3.2 安裝CUDA Toolkit的正確打開方式驅(qū)動(dòng)共享機(jī)制搞清楚之后就明白在WSL2里我們只需要安裝CUDA Toolkit。CUDA Toolkit是一整套開發(fā)庫和編譯器工具PyTorch在編譯和運(yùn)行時(shí)依賴的是Toolkit提供的庫文件而不是Windows驅(qū)動(dòng)里自帶的那份CUDA運(yùn)行時(shí)。NVIDIA官方為WSL2提供了專用的CUDA Toolkit安裝包源安裝方式比原生Linux還要簡(jiǎn)單。首先要給apt添加NVIDIA的軟件源。打開Ubuntu終端依次執(zhí)行下面的命令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/repos/wsl-ubuntu/x86_64/cuda-keyring_1.1-1_all.deb sudo dpkg -i cuda-keyring_1.1-1_all.deb sudo apt update這幾步做的事分別是下載一個(gè)固定NVIDIA軟件包優(yōu)先級(jí)的配置文件把它放到apt的preferences目錄里確保NVIDIA的包不會(huì)和Ubuntu默認(rèn)源里的同名包發(fā)生版本沖突然后安裝CUDA的密鑰包讓apt能驗(yàn)證NVIDIA倉庫的簽名最后更新軟件源。之后就可以安裝CUDA Toolkit了。NVIDIA官方倉庫里會(huì)有不同小版本的CUDA比如12.4、12.6等我配置時(shí)用的是12.4因?yàn)樗彤?dāng)時(shí)PyTorch官方預(yù)編譯包的CUDA版本對(duì)應(yīng)得比較舒服sudo apt-get -y install cuda-toolkit-12-4這里想多啰嗦一句不要無腦安裝cuda這個(gè)總包那個(gè)包會(huì)拉取一大堆不必要的組件包括驅(qū)動(dòng)相關(guān)的內(nèi)容白白占掉好幾個(gè)GB的空間。指定小版本號(hào)只裝cuda-toolkit-12-4裝的是編譯和運(yùn)行所需的庫、頭文件和工具干凈得多。安裝完CUDA Toolkit后需要在~/.bashrc文件里配置環(huán)境變量。用vim或nano打開這個(gè)文件export PATH/usr/local/cuda-12.4/bin:$PATH export LD_LIBRARY_PATH/usr/local/cuda-12.4/lib64:$LD_LIBRARY_PATH export CUDA_HOME/usr/local/cuda-12.4保存后執(zhí)行source ~/.bashrc讓變量生效。這里有個(gè)小細(xì)節(jié)/usr/local/cuda通常是指向/usr/local/cuda-12.4的軟鏈接路徑寫/usr/local/cuda更穩(wěn)以后切換CUDA版本不用改環(huán)境變量直接用軟鏈接調(diào)整目標(biāo)就行。我自己實(shí)際也是這么干的。3.3 驗(yàn)證CUDA與驅(qū)動(dòng)對(duì)齊環(huán)境變量配置好之后驗(yàn)證CUDA是否安裝成功nvcc --version輸出信息里應(yīng)該能看到Cuda compilation tools的版本號(hào)說明編譯器已經(jīng)就緒。接著執(zhí)行nvidia-smi再對(duì)比一下之前看到的驅(qū)動(dòng)信息。正常情況下nvcc顯示的CUDA版本是你剛裝的Toolkit版本而nvidia-smi顯示的CUDA版本是Windows驅(qū)動(dòng)自帶的版本。這兩個(gè)版本可以不一致只要滿足一個(gè)條件nvcc的版本不高于nvidia-smi顯示的版本。因?yàn)轵?qū)動(dòng)內(nèi)置的CUDA運(yùn)行時(shí)負(fù)責(zé)和顯卡硬件交互Toolkit版本比驅(qū)動(dòng)版本新可能會(huì)因?yàn)槿鄙賹?duì)應(yīng)的驅(qū)動(dòng)ABI而不兼容。我見過有人死磕一定要讓兩個(gè)版本一致其實(shí)完全沒必要。你只需要確保驅(qū)動(dòng)版本足夠新然后再裝一個(gè)不高于驅(qū)動(dòng)CUDA版本的工具鏈就行。比如驅(qū)動(dòng)顯示CUDA Version 12.4那裝CUDA 12.4或更低的版本都沒問題但如果驅(qū)動(dòng)只支持11.8卻裝了12.4的Toolkit大概率跑起來會(huì)報(bào)版本不匹配的錯(cuò)誤。4. 配置PyTorch環(huán)境并實(shí)測(cè)跑分4.1 Python環(huán)境選型與創(chuàng)建CUDA工具鏈就緒后接下來給Python搭建一個(gè)干凈的環(huán)境。我強(qiáng)烈建議用Miniconda而不是系統(tǒng)自帶的Python來管理環(huán)境和依賴原因很簡(jiǎn)單PyTorch版本更新頻繁不同的項(xiàng)目可能需要不同版本的PyTorch或者不同版本的CUDAconda的虛擬環(huán)境隔離能做到互不干擾。你也不想因?yàn)锳項(xiàng)目把PyTorch升到了2.2B項(xiàng)目就徹底跑不起來吧。安裝Miniconda的方式是老一套wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh bash Miniconda3-latest-Linux-x86_64.sh安裝腳本運(yùn)行過程中會(huì)問幾個(gè)問題一般全選默認(rèn)值就行。腳本結(jié)束時(shí)問是否要自動(dòng)初始化conda選yes這樣終端每次啟動(dòng)都會(huì)自動(dòng)激活conda基礎(chǔ)環(huán)境。裝完重新打開終端會(huì)看到命令行前綴多了(base)字樣。接著創(chuàng)建獨(dú)立的PyTorch環(huán)境conda create -n pytorch python3.10 -y conda activate pytorch為什么選Python 3.10因?yàn)楦鶕?jù)當(dāng)時(shí)的兼容性狀況PyTorch各版本對(duì)Python 3.10的支持很全面而且PyTorch 2.x在3.10上的編譯優(yōu)化做得比較成熟。Python 3.11和3.12的兼容性也越來越好但如果你不想折騰3.10是穩(wěn)妥之選。4.2 安裝PyTorch并匹配CUDA版本PyTorch測(cè)試版和生產(chǎn)版建議通過PyTorch官方源安裝。打開PyTorch官網(wǎng)的安裝頁面選擇對(duì)應(yīng)的操作系統(tǒng)、安裝方式它會(huì)自動(dòng)給出適合你系統(tǒng)的安裝命令強(qiáng)烈建議以此為準(zhǔn)。我這里以當(dāng)時(shí)比較流行的CUDA 12.1版本為例安裝命令大致是pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121這條命令里的--index-url參數(shù)指定了PyTorch專門為不同CUDA版本預(yù)編譯好whl包的源。默認(rèn)的pip源也有一份PyTorch但默認(rèn)源里的是CPU版本裝完才發(fā)現(xiàn)不能用還得卸載重來非常浪費(fèi)時(shí)間。所以一定要用帶CUDA標(biāo)識(shí)的index-url。這里會(huì)引申出一個(gè)選擇困難同樣一份PyTorch有cu118版本、cu121版本、cu124版本到底選哪個(gè)選擇邏輯很簡(jiǎn)單看你剛才安裝的CUDA Toolkit版本和Windows驅(qū)動(dòng)的CUDA版本。取兩者的較低值然后選擇不高于這個(gè)值的PyTorch CUDA版本。比如你驅(qū)動(dòng)顯示CUDA 12.4Toolkit裝的是12.4那可以選cu121或cu124如果你的驅(qū)動(dòng)是老版本只支持11.8那只能選cu118。安裝完成后跑一個(gè)驗(yàn)證腳本確認(rèn)一切就緒python -c import torch; print(PyTorch版本:, torch.__version__); print(CUDA可用:, torch.cuda.is_available()); print(GPU名稱:, torch.cuda.get_device_name(0) if torch.cuda.is_available() else N/A)輸出里如果顯示CUDA可用: True并且GPU名稱正確識(shí)別為你的顯卡型號(hào)恭喜你環(huán)境已經(jīng)打通了。4.3 驗(yàn)證GPU可用性與算力評(píng)估光看CUDA可用還不夠我建議再做一次真實(shí)的張量運(yùn)算驗(yàn)證確保GPU和CPU之間數(shù)據(jù)搬運(yùn)也沒問題。最簡(jiǎn)單的方式是跑一次矩陣乘法和一次梯度計(jì)算import torch x torch.randn(1024, 1024, devicecuda) y torch.randn(1024, 1024, devicecuda) z x y print(GPU矩陣乘法結(jié)果形狀:, z.shape) print(顯存占用:, torch.cuda.memory_allocated() / 1024**2, MB) linear torch.nn.Linear(256, 256).cuda() optimizer torch.optim.SGD(linear.parameters(), lr0.01) loss linear(torch.randn(64, 256, devicecuda)).sum() loss.backward() print(反向傳播完成梯度正常)如果這幾行代碼都順暢跑通說明底層的CUDA庫、cuDNN和GPU通信都正常。我第一次跑這個(gè)驗(yàn)證腳本時(shí)矩陣乘法那一步直接卡死沒反應(yīng)最后排查下來發(fā)現(xiàn)是Windows側(cè)驅(qū)動(dòng)版本太舊。這里想說的是如果遇到卡死或報(bào)錯(cuò)先檢查驅(qū)動(dòng)再檢查Toolkit版本順序不要反過來。到這一步環(huán)境配置部分已經(jīng)全部完成了。整套操作下來大概需要一兩個(gè)小時(shí)其中大部分時(shí)間都花在下載安裝包和網(wǎng)絡(luò)等待上真正需要?jiǎng)幽X子的地方其實(shí)不多。但實(shí)際操作中總有一些意外情況比如倉庫連不上、驅(qū)動(dòng)更新后WSL2里突然不識(shí)別GPU等等我接著把這些年遇到過的高頻問題整理一張排查表。5. 常見問題與排查技巧實(shí)錄5.1 nvidia-smi不可用這是我在各個(gè)技術(shù)社區(qū)里看到最多的問題也是我自己第一次配的時(shí)候遇到的?,F(xiàn)象是在WSL2終端里執(zhí)行nvidia-smi要么提示找不到命令要么報(bào)錯(cuò)說無法訪問NVIDIA設(shè)備。遇到這個(gè)情況先分清是哪一種如果是command not found說明CUDA Toolkit安裝時(shí)沒把nvidia-smi這個(gè)工具放到PATH里或者是沒安裝對(duì)應(yīng)的工具包。解決方式是檢查/usr/lib/wsl/lib目錄下有沒有nvidia-smi如果有手動(dòng)把它鏈接到/usr/local/bin下sudo ln -s /usr/lib/wsl/lib/nvidia-smi /usr/local/bin/nvidia-smi在較新版本的WSL2里/usr/lib/wsl/lib是Windows驅(qū)動(dòng)映射到Linux的文件系統(tǒng)路徑NVIDIA相關(guān)工具都在那里。如果這個(gè)目錄下連nvidia-smi都沒有問題就出在Windows側(cè)驅(qū)動(dòng)沒有正確安裝回Windows檢查一下設(shè)備管理器里顯卡是否正常識(shí)別。另一種情況是nvidia-smi提示NVIDIA-SMI has failed because it couldnt communicate with the NVIDIA driver這說明Linux側(cè)找不到驅(qū)動(dòng)通信接口大概率是你在WSL2內(nèi)部裝了Linux版驅(qū)動(dòng)導(dǎo)致沖突。處理辦法是在WSL2里卸載掉所有nvidia相關(guān)的包然后重啟WSL2sudo apt purge *nvidia* wsl --shutdown重啟后再進(jìn)入一般就能恢復(fù)正常。5.2 libcuda.so.1缺失或符號(hào)鏈接問題有時(shí)PyTorch的torch.cuda.is_available()返回Falsenvidia-smi也正常就非常詭異。打開Python手動(dòng)加載一下CUDA時(shí)會(huì)看到類似于libcuda.so.1: cannot open shared object file的報(bào)錯(cuò)。這個(gè)錯(cuò)誤的核心原因是Python進(jìn)程運(yùn)行時(shí)需要在動(dòng)態(tài)鏈接庫路徑里找到libcuda.so.1而這個(gè)庫是WSL2特有的通常位于/usr/lib/wsl/lib。我用的解決方法是把WSL的庫目錄加到LD_LIBRARY_PATHecho export LD_LIBRARY_PATH/usr/lib/wsl/lib:$LD_LIBRARY_PATH ~/.bashrc source ~/.bashrc另一種情況是libcuda.so.1存在但指向的版本文件缺失比如系統(tǒng)中的libcuda.so.1是一個(gè)懸空的軟鏈接。這時(shí)候去/usr/lib/wsl/lib目錄下看看實(shí)際的so文件名比如libcuda.so.1.1然后手動(dòng)重建軟鏈接sudo ln -sf /usr/lib/wsl/lib/libcuda.so.1.1 /usr/lib/wsl/lib/libcuda.so.1這個(gè)操作有點(diǎn)底層了建議謹(jǐn)慎進(jìn)行確保你備份了原有的鏈接。5.3 內(nèi)存、磁盤與性能類問題WSL2的性能問題大部分和資源上限直接相關(guān)。如果你發(fā)現(xiàn)訓(xùn)練時(shí)顯存占用正常但內(nèi)存跑滿導(dǎo)致系統(tǒng)卡頓優(yōu)先去調(diào).wslconfig里的memory參數(shù)不要讓W(xué)SL2無限吞噬宿主機(jī)內(nèi)存。根據(jù)我的經(jīng)驗(yàn)分配固定大小的內(nèi)存比讓系統(tǒng)自適應(yīng)更穩(wěn)定比如memory8GB跑中小模型完全夠用。磁盤方面有個(gè)容易被忽視的點(diǎn)WSL2的虛擬磁盤文件默認(rèn)只會(huì)增長(zhǎng)不會(huì)縮減。如果你往里裝了又卸載了很多大軟件磁盤空間被占用但不會(huì)自動(dòng)釋放看起來像是“空間謎之消失”??梢杂肳indows側(cè)的工具壓縮虛擬磁盤但更省心的方式是平時(shí)注意不要往WSL2里亂裝大型軟件能用conda管理環(huán)境的就不往系統(tǒng)里塞。還有一個(gè)常見的性能陷阱把訓(xùn)練數(shù)據(jù)放在Windows文件系統(tǒng)路徑下然后在WSL2里跨文件系統(tǒng)讀取。比如直接把數(shù)據(jù)放到/mnt/c/...路徑WSL2通過9P協(xié)議訪問Windows文件系統(tǒng)I/O性能比原生Linux文件系統(tǒng)慢不少。我的建議是訓(xùn)練數(shù)據(jù)一定要拷貝到Linux一側(cè)比如~/data目錄跨文件系統(tǒng)訪問只適合傳輸小文件。5.4 重裝驅(qū)動(dòng)或升級(jí)后的坑Windows顯卡驅(qū)動(dòng)升級(jí)是日常操作但升級(jí)后WSL2里偶爾會(huì)出現(xiàn)GPU訪問失效或者CUDA版本不匹配的問題。原因是驅(qū)動(dòng)版本變了驅(qū)動(dòng)內(nèi)置的CUDA運(yùn)行時(shí)版本也隨之改變?nèi)绻阒鞍惭b的CUDA Toolkit版本比新驅(qū)動(dòng)能支持的最高版本還高就會(huì)出現(xiàn)不兼容。我的習(xí)慣是升級(jí)Windows驅(qū)動(dòng)后第一時(shí)間進(jìn)WSL2跑一下nvidia-smi看一眼驅(qū)動(dòng)顯示支持的CUDA版本有沒有變化。如果發(fā)現(xiàn)WSL2內(nèi)部GPU訪問異常最快的修復(fù)方法是執(zhí)行wsl --shutdown徹底重啟WSL2而不是在Windows里反復(fù)重啟。絕大多數(shù)升級(jí)后的GPU失效問題都能靠這個(gè)操作解決。另外如果Windows大版本更新后WSL2整個(gè)消失了檢查Windows功能面板里“適用于Linux的Windows子系統(tǒng)”和“虛擬機(jī)平臺(tái)”是否被關(guān)閉重新勾選并重啟即可。這種情況在我用Win10期間遇到過兩次Win11上反而穩(wěn)定很多。6. 一些可以再說說的經(jīng)驗(yàn)寫到最后分享一點(diǎn)我個(gè)人用這套環(huán)境跑了快兩年的體會(huì)。第一點(diǎn)是環(huán)境配置這件事最重要的是理清“Windows驅(qū)動(dòng)、CUDA Toolkit、PyTorch”這三層的關(guān)系。很多人配置失敗是因?yàn)榘堰@三層混為一談搞不清楚每一層解決什么問題、應(yīng)該裝在哪個(gè)系統(tǒng)里。只要把這個(gè)邏輯理清了哪怕以后某個(gè)軟件版本更新頻繁你自己也能判斷該怎么調(diào)整。第二點(diǎn)是盡量保持軟件版本“跟隨主流”。我不是說新版本一定好而是PyTorch、CUDA這種生態(tài)里的軟件社區(qū)主流的版本組合往往是踩坑最少、教程最多、兼容性最好的組合。比如我當(dāng)時(shí)選CUDA 12.1加PyTorch 2.1的組合就是因?yàn)樵谏鐓^(qū)里看到大量人在用遇到問題隨便搜都能找到答案。非要追求最新版本出了問題可能連錯(cuò)誤資料都搜不到性價(jià)比很低。最后一個(gè)小技巧把這篇文章里用到的命令和配置模板保存成一個(gè)單獨(dú)的筆記文件下次換電腦或者重裝系統(tǒng)時(shí)直接照著操作五分鐘內(nèi)就能把環(huán)境重新拉起來。配置深度學(xué)習(xí)環(huán)境這個(gè)事第一次做的時(shí)候會(huì)覺得信息量巨大但熟悉了整套流程之后它其實(shí)完全是最簡(jiǎn)單、最不需要?jiǎng)?chuàng)造力的部分真正有價(jià)值的永遠(yuǎn)是你拿著這套環(huán)境之后要做的事情。祝你一次跑通少走彎路。