發(fā)環(huán)境搭建:GPU直通與CUDA配置實(shí)戰(zhàn)指南)
1. 為什么要在 WSL2 里折騰 AI 開(kāi)發(fā)環(huán)境1.1 一個(gè)真實(shí)的兩難處境做 AI 開(kāi)發(fā)的人大概率都遇到過(guò)這個(gè)場(chǎng)景主力機(jī)是 Windows平時(shí)寫(xiě)代碼、跑實(shí)驗(yàn)、調(diào)模型都挺順手但一旦涉及某些深度學(xué)習(xí)框架的特定版本、CUDA 工具鏈、或者需要編譯一些 Linux 專(zhuān)屬的依賴(lài)庫(kù)Windows 原生環(huán)境就開(kāi)始各種報(bào)錯(cuò)。于是很多人被迫裝雙系統(tǒng)或者干脆再買(mǎi)一臺(tái) Linux 機(jī)器切換來(lái)切換去效率低得讓人抓狂。我最早也是這么干的一臺(tái) Windows 臺(tái)式機(jī)跑日常一臺(tái)裝了 Linux 的舊筆記本專(zhuān)門(mén)跑訓(xùn)練。結(jié)果就是文件同步麻煩、遠(yuǎn)程調(diào)試卡頓、GPU 資源還分散在兩臺(tái)機(jī)器上。后來(lái) WSL2 出來(lái)之后我花了大概兩周時(shí)間把整套 AI 開(kāi)發(fā)環(huán)境遷移過(guò)去實(shí)測(cè)下來(lái)穩(wěn)定性完全夠用而且 GPU 直通之后訓(xùn)練速度跟原生 Linux 幾乎沒(méi)有差別。這篇文章就是把我這兩周踩過(guò)的坑、驗(yàn)證過(guò)的配置、以及一些官方文檔里不會(huì)寫(xiě)的細(xì)節(jié)完整地整理出來(lái)。不管你是剛接觸 WSL2 的新手還是已經(jīng)用了一段時(shí)間但 GPU 一直沒(méi)跑通的老用戶(hù)應(yīng)該都能從里面找到能直接抄作業(yè)的部分。1.2 WSL2 到底解決了什么問(wèn)題先說(shuō)清楚 WSL2 的本質(zhì)。它不是虛擬機(jī)也不是簡(jiǎn)單的兼容層而是微軟在 Windows 內(nèi)核里內(nèi)置的一個(gè)輕量級(jí)虛擬化方案跑的是一個(gè)真正的 Linux 內(nèi)核。這一點(diǎn)非常關(guān)鍵因?yàn)?WSL1 時(shí)代最大的痛點(diǎn)就是系統(tǒng)調(diào)用翻譯不完整很多依賴(lài)特定內(nèi)核行為的工具根本跑不起來(lái)。WSL2 直接給你一個(gè)完整內(nèi)核Docker、systemd、各種編譯工具鏈都能正常工作。對(duì)于 AI 開(kāi)發(fā)來(lái)說(shuō)WSL2 的核心價(jià)值有三個(gè)。第一是內(nèi)核級(jí)兼容你可以在里面裝 Ubuntu、裝 CUDA、裝 PyTorch跟在一臺(tái)原生 Linux 機(jī)器上操作沒(méi)有區(qū)別。第二是文件系統(tǒng)互通Windows 的盤(pán)符可以直接在 WSL2 里訪問(wèn)反過(guò)來(lái)也一樣不用再折騰 Samba 或者共享文件夾。第三是GPU 直通這是最近兩年才成熟的能力NVIDIA 和微軟合作把 GPU 驅(qū)動(dòng)直接透?jìng)鬟M(jìn) WSL2讓里面的 CUDA 程序能直接調(diào)用物理顯卡。注意GPU 直通需要 Windows 11 或者 Windows 10 的特定版本21H2 及以上而且必須是 WDDM 2.9 以上的驅(qū)動(dòng)模型。老版本 Windows 10 可能能裝 WSL2但 GPU 直通會(huì)失敗。1.3 適合哪些人參考這套方案最適合三類(lèi)人。第一類(lèi)是Windows 主力機(jī)用戶(hù)不想換系統(tǒng)但需要 Linux 環(huán)境跑 AI 實(shí)驗(yàn)。第二類(lèi)是學(xué)生或者個(gè)人開(kāi)發(fā)者只有一臺(tái)機(jī)器既要日常使用又要跑訓(xùn)練。第三類(lèi)是需要頻繁切換環(huán)境的工程師比如同時(shí)維護(hù) Windows 端的工具鏈和 Linux 端的訓(xùn)練腳本。如果你已經(jīng)有成熟的 Linux 服務(wù)器或者云平臺(tái)那這套方案對(duì)你來(lái)說(shuō)可能只是多了一個(gè)本地調(diào)試的選擇不是必須的。但如果你經(jīng)常在沒(méi)有網(wǎng)絡(luò)的環(huán)境下工作或者對(duì)數(shù)據(jù)隱私比較敏感本地 WSL2 環(huán)境的價(jià)值就體現(xiàn)出來(lái)了。2. 環(huán)境準(zhǔn)備與核心組件選型2.1 系統(tǒng)版本與硬件門(mén)檻在開(kāi)始之前先確認(rèn)你的機(jī)器滿(mǎn)足基本條件。操作系統(tǒng)方面Windows 11 任意版本都可以Windows 10 需要 21H2 或更高版本。查看方法很簡(jiǎn)單按 WinR 輸入winver就能看到具體版本號(hào)。硬件方面CPU 需要支持虛擬化Intel VT-x 或者 AMD-V這個(gè)在 BIOS 里默認(rèn)一般是開(kāi)啟的但有些品牌機(jī)出廠會(huì)關(guān)掉需要手動(dòng)進(jìn) BIOS 打開(kāi)。內(nèi)存建議至少 16GB因?yàn)?WSL2 默認(rèn)會(huì)占用宿主機(jī)一半的內(nèi)存如果你只有 8GB跑模型的時(shí)候會(huì)非常吃力。硬盤(pán)建議留出至少 100GB 的可用空間AI 開(kāi)發(fā)環(huán)境加上數(shù)據(jù)集和模型文件很容易就吃掉幾十個(gè) G。GPU 方面NVIDIA 顯卡需要是 GTX 10 系列及以上驅(qū)動(dòng)版本要求 470 以上。AMD 顯卡目前 WSL2 的支持還不完善如果你用的是 AMD建議還是走原生 Linux 或者云平臺(tái)。Intel 核顯可以用來(lái)跑一些輕量級(jí)的推理但訓(xùn)練基本不用考慮。項(xiàng)目最低要求推薦配置操作系統(tǒng)Windows 10 21H2Windows 11 22H2內(nèi)存8GB32GB 及以上硬盤(pán)可用空間50GB200GB SSDGPUGTX 1060 6GBRTX 3060 12GB 及以上顯卡驅(qū)動(dòng)470.x535.x 及以上2.2 WSL2 安裝的兩種路徑安裝 WSL2 現(xiàn)在有兩種方式。第一種是命令行一鍵安裝打開(kāi) PowerShell管理員權(quán)限輸入wsl --install系統(tǒng)會(huì)自動(dòng)幫你啟用所需組件、下載內(nèi)核、安裝默認(rèn)的 Ubuntu 發(fā)行版。這種方式適合全新環(huán)境省事。第二種是手動(dòng)分步安裝適合已經(jīng)裝過(guò) WSL 但版本混亂的情況。步驟是先啟用“適用于 Linux 的 Windows 子系統(tǒng)”和“虛擬機(jī)平臺(tái)”兩個(gè)功能然后下載 WSL2 內(nèi)核更新包手動(dòng)安裝最后通過(guò) Microsoft Store 或者命令行指定發(fā)行版。我個(gè)人的建議是如果你之前從來(lái)沒(méi)裝過(guò) WSL直接用一鍵安裝。如果已經(jīng)裝過(guò) WSL1 或者裝過(guò)又卸載了建議先執(zhí)行wsl --unregister把所有舊發(fā)行版清掉再重新走一遍流程避免殘留配置導(dǎo)致 GPU 直通失敗。# 查看當(dāng)前 WSL 狀態(tài) wsl --status # 列出已安裝的發(fā)行版 wsl --list --verbose # 卸載指定發(fā)行版謹(jǐn)慎操作會(huì)刪除數(shù)據(jù) wsl --unregister Ubuntu-22.04 # 設(shè)置默認(rèn)版本為 WSL2 wsl --set-default-version 22.3 發(fā)行版選擇Ubuntu 還是別的WSL2 支持的發(fā)行版不少Ubuntu、Debian、Fedora、openSUSE 都有。做 AI 開(kāi)發(fā)我強(qiáng)烈建議選 Ubuntu具體版本選 22.04 LTS 或者 24.04 LTS。原因很簡(jiǎn)單NVIDIA 的 CUDA 工具鏈、PyTorch 的官方 wheel、以及絕大多數(shù) AI 開(kāi)源項(xiàng)目都是優(yōu)先適配 Ubuntu 的。你用 Debian 或者 Fedora 也能跑但遇到依賴(lài)問(wèn)題的時(shí)候能搜到的解決方案會(huì)少很多。安裝指定版本的方法是在 PowerShell 里執(zhí)行wsl --install -d Ubuntu-22.04。裝完之后第一次啟動(dòng)會(huì)讓你設(shè)置用戶(hù)名和密碼這個(gè)用戶(hù)名建議用全小寫(xiě)不要帶特殊字符因?yàn)楹竺媾渲?SSH、Docker 的時(shí)候會(huì)用到。提示W(wǎng)SL2 的發(fā)行版默認(rèn)安裝在 C 盤(pán)如果你 C 盤(pán)空間緊張可以在安裝前通過(guò)--location參數(shù)指定安裝路徑或者裝完之后用wsl --export和wsl --import遷移到其他盤(pán)。2.4 GPU 驅(qū)動(dòng)與 CUDA 工具鏈的安裝邏輯這里有一個(gè)很多人會(huì)搞混的點(diǎn)WSL2 里的 GPU 驅(qū)動(dòng)不需要在 Linux 里單獨(dú)安裝。你只需要在 Windows 宿主機(jī)上裝好 NVIDIA 的顯卡驅(qū)動(dòng)WSL2 會(huì)自動(dòng)通過(guò)/usr/lib/wsl/lib這個(gè)路徑把驅(qū)動(dòng)透?jìng)鬟M(jìn)去。如果你在 WSL2 里又裝了一遍 Linux 版的 NVIDIA 驅(qū)動(dòng)反而會(huì)沖突導(dǎo)致 GPU 不可用。正確的做法是Windows 端裝好最新驅(qū)動(dòng)然后在 WSL2 里只裝 CUDA Toolkit。CUDA Toolkit 的版本要根據(jù)你用的深度學(xué)習(xí)框架來(lái)定。比如 PyTorch 2.x 一般對(duì)應(yīng) CUDA 11.8 或者 12.1TensorFlow 2.15 對(duì)應(yīng) CUDA 12.2。裝之前先去框架官網(wǎng)查一下版本對(duì)應(yīng)關(guān)系別裝錯(cuò)了再重裝很浪費(fèi)時(shí)間。# 在 WSL2 里驗(yàn)證 GPU 是否可見(jiàn) nvidia-smi # 如果輸出顯示 GPU 信息說(shuō)明直通成功 # 如果報(bào)錯(cuò) command not found說(shuō)明驅(qū)動(dòng)沒(méi)透?jìng)鬟M(jìn)來(lái)3. 核心細(xì)節(jié)解析與實(shí)操要點(diǎn)3.1 內(nèi)存與 CPU 資源的精細(xì)化配置WSL2 默認(rèn)會(huì)占用宿主機(jī) 50% 的內(nèi)存和全部 CPU 核心這個(gè)默認(rèn)值在跑大模型的時(shí)候會(huì)出問(wèn)題。比如你宿主機(jī) 32GB 內(nèi)存WSL2 默認(rèn)拿 16GB但訓(xùn)練一個(gè) 7B 參數(shù)的模型光模型權(quán)重加優(yōu)化器狀態(tài)就要 20GB 以上直接 OOM。解決辦法是在 Windows 用戶(hù)目錄下創(chuàng)建一個(gè).wslconfig文件手動(dòng)指定資源上限。這個(gè)文件的位置是C:\Users\你的用戶(hù)名\.wslconfig注意是 Windows 路徑不是 WSL2 里面的路徑。# .wslconfig 示例配置 [wsl2] memory24GB processors12 swap8GB localhostForwardingtrue # 如果用的是 NVIDIA GPU加上這一行確保驅(qū)動(dòng)透?jìng)?gpuSupporttrue這里解釋一下幾個(gè)參數(shù)的選擇邏輯。memory設(shè)成 24GB 是因?yàn)槲宜拗鳈C(jī)有 32GB留 8GB 給 Windows 本身和日常軟件。processors設(shè)成 12 是因?yàn)槲业?CPU 是 16 核留 4 核給宿主機(jī)。swap設(shè)成 8GB 是防止內(nèi)存突然不夠的時(shí)候直接崩潰但要注意 swap 用的是硬盤(pán)速度比內(nèi)存慢很多只能當(dāng)保險(xiǎn)用不能當(dāng)常規(guī)內(nèi)存使。改完.wslconfig之后需要執(zhí)行wsl --shutdown重啟 WSL2 才生效。重啟之后可以在 WSL2 里用free -h和nproc驗(yàn)證配置是否生效。3.2 文件系統(tǒng)性能的關(guān)鍵取舍WSL2 的文件系統(tǒng)性能有一個(gè)非常重要的特性跨系統(tǒng)訪問(wèn)文件的速度差異巨大。具體來(lái)說(shuō)在 WSL2 里訪問(wèn) Linux 原生文件系統(tǒng)比如/home/user/project速度很快但訪問(wèn) Windows 掛載盤(pán)比如/mnt/c/Users/...速度會(huì)慢好幾倍。反過(guò)來(lái)也一樣在 Windows 里訪問(wèn) WSL2 的文件通過(guò)\\wsl$\路徑也不快。這個(gè)特性對(duì) AI 開(kāi)發(fā)的影響很大。如果你把數(shù)據(jù)集放在 Windows 的 D 盤(pán)然后在 WSL2 里讀取訓(xùn)練IO 會(huì)成為瓶頸GPU 利用率可能只有 30% 到 40%。正確的做法是把數(shù)據(jù)集和代碼都放在 WSL2 的原生文件系統(tǒng)里需要跟 Windows 交換文件的時(shí)候再用/mnt/c或者\(yùn)\wsl$\臨時(shí)拷貝。我實(shí)測(cè)過(guò)一個(gè)對(duì)比同樣一個(gè) 10GB 的數(shù)據(jù)集放在/mnt/d/data和放在/home/user/data用 PyTorch DataLoader 加載前者每個(gè) epoch 要 180 秒后者只要 45 秒。差距非常明顯。注意WSL2 的原生文件系統(tǒng)在 Windows 里是通過(guò)\\wsl$\Ubuntu-22.04\home\user這樣的路徑訪問(wèn)的但不要在里面直接跑訓(xùn)練腳本性能同樣很差。只在需要拷貝文件的時(shí)候用。3.3 CUDA Toolkit 的安裝與版本管理CUDA Toolkit 的安裝方式有好幾種我推薦用 NVIDIA 官方提供的 apt 源來(lái)裝比手動(dòng)下載 runfile 更干凈卸載也方便。具體步驟是先添加源然后apt install指定版本。# 添加 NVIDIA CUDA 源以 Ubuntu 22.04 為例 wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-keyring_1.1-1_all.deb sudo dpkg -i cuda-keyring_1.1-1_all.deb sudo apt update # 安裝指定版本的 CUDA Toolkit sudo apt install cuda-toolkit-12-1 # 配置環(huán)境變量 echo export PATH/usr/local/cuda-12.1/bin:$PATH ~/.bashrc echo export LD_LIBRARY_PATH/usr/local/cuda-12.1/lib64:$LD_LIBRARY_PATH ~/.bashrc source ~/.bashrc這里有個(gè)細(xì)節(jié)要注意cuda-toolkit-12-1這個(gè)包只裝工具鏈不裝驅(qū)動(dòng)。如果你直接裝cuda這個(gè)元包它會(huì)嘗試裝 Linux 版驅(qū)動(dòng)在 WSL2 里會(huì)出問(wèn)題。所以一定要裝帶-toolkit-后綴的包。版本管理方面如果你需要同時(shí)用多個(gè) CUDA 版本可以用update-alternatives來(lái)切換或者直接在腳本里臨時(shí)改PATH。我一般是在項(xiàng)目目錄下放一個(gè)env.sh里面寫(xiě)清楚這個(gè)項(xiàng)目需要的 CUDA 版本跑之前 source 一下。3.4 Python 環(huán)境與深度學(xué)習(xí)框架的安裝策略Python 環(huán)境我強(qiáng)烈建議用 conda 或者 miniconda 來(lái)管理不要用系統(tǒng)自帶的 Python。原因是 AI 開(kāi)發(fā)經(jīng)常需要切換不同版本的框架conda 的環(huán)境隔離做得最干凈而且能自動(dòng)處理 CUDA 相關(guān)的依賴(lài)。# 安裝 miniconda wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh bash Miniconda3-latest-Linux-x86_64.sh # 創(chuàng)建專(zhuān)用環(huán)境 conda create -n ai python3.10 conda activate ai # 安裝 PyTorch以 CUDA 12.1 為例 pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121裝完之后一定要驗(yàn)證 GPU 是否可用import torch print(torch.cuda.is_available()) print(torch.cuda.get_device_name(0)) print(torch.cuda.get_device_capability(0))如果is_available()返回 False先檢查nvidia-smi在 WSL2 里能不能正常輸出。如果nvidia-smi正常但 PyTorch 檢測(cè)不到大概率是 PyTorch 版本和 CUDA 版本不匹配重新裝對(duì)應(yīng)版本的 wheel 就行。4. 完整實(shí)操流程與關(guān)鍵環(huán)節(jié)實(shí)現(xiàn)4.1 從零開(kāi)始的完整部署步驟假設(shè)你現(xiàn)在是一臺(tái)全新的 Windows 11 機(jī)器什么都沒(méi)裝下面是完整的部署流程。我按順序列出來(lái)每一步都說(shuō)明為什么這么做。第一步更新 Windows 到最新版本然后裝好 NVIDIA 顯卡驅(qū)動(dòng)。驅(qū)動(dòng)去 NVIDIA 官網(wǎng)下載選 Studio 驅(qū)動(dòng)而不是 Game Ready 驅(qū)動(dòng)因?yàn)?Studio 驅(qū)動(dòng)對(duì) CUDA 的兼容性更穩(wěn)定。第二步以管理員身份打開(kāi) PowerShell執(zhí)行wsl --install -d Ubuntu-22.04。這一步會(huì)自動(dòng)啟用虛擬化組件、下載 WSL2 內(nèi)核、安裝 Ubuntu。裝完之后重啟電腦。第三步重啟后 Ubuntu 會(huì)自動(dòng)啟動(dòng)讓你設(shè)置用戶(hù)名和密碼。設(shè)置完成后先執(zhí)行sudo apt update sudo apt upgrade -y把系統(tǒng)更新到最新。第四步在 Windows 用戶(hù)目錄下創(chuàng)建.wslconfig文件按前面說(shuō)的配置內(nèi)存和 CPU。然后wsl --shutdown重啟。第五步重新進(jìn)入 WSL2執(zhí)行nvidia-smi驗(yàn)證 GPU 直通。如果能看到顯卡信息說(shuō)明最關(guān)鍵的這一步成功了。第六步安裝 CUDA Toolkit 和 cuDNN。cuDNN 現(xiàn)在可以通過(guò) apt 直接裝不需要手動(dòng)下載。sudo apt install cudnn9-cuda-12第七步安裝 miniconda創(chuàng)建 Python 環(huán)境裝 PyTorch 或 TensorFlow。第八步驗(yàn)證整個(gè)鏈路nvidia-smi能看到 GPUPython 里torch.cuda.is_available()返回 True跑一個(gè)小訓(xùn)練腳本看 GPU 利用率能不能上去。4.2 GPU 直通失敗的排查路徑GPU 直通是這套方案里最容易出問(wèn)題的環(huán)節(jié)。我遇到過(guò)好幾次nvidia-smi報(bào)錯(cuò)的情況總結(jié)下來(lái)排查路徑是這樣的。先看 Windows 端的驅(qū)動(dòng)版本。打開(kāi) NVIDIA 控制面板看驅(qū)動(dòng)版本是不是 470 以上。如果低于這個(gè)版本先去官網(wǎng)更新。更新完之后一定要重啟電腦不重啟的話 WSL2 里可能還是舊驅(qū)動(dòng)。再看 WSL2 內(nèi)核版本。執(zhí)行wsl --status看內(nèi)核版本如果太老去微軟官網(wǎng)下載最新的 WSL2 內(nèi)核更新包手動(dòng)安裝。然后檢查/usr/lib/wsl/lib這個(gè)目錄存不存在。如果不存在說(shuō)明驅(qū)動(dòng)透?jìng)鳑](méi)生效可能是 Windows 版本太低或者虛擬化沒(méi)開(kāi)。# 檢查驅(qū)動(dòng)透?jìng)髂夸?ls -la /usr/lib/wsl/lib # 檢查 nvidia-smi 的實(shí)際路徑 which nvidia-smi # 如果 nvidia-smi 不在 PATH 里手動(dòng)加進(jìn)去 export PATH/usr/lib/wsl/lib:$PATH還有一個(gè)坑是 Windows 的“虛擬機(jī)平臺(tái)”功能沒(méi)啟用。這個(gè)功能在“啟用或關(guān)閉 Windows 功能”里勾選之后要重啟。有些優(yōu)化軟件會(huì)把這個(gè)功能關(guān)掉導(dǎo)致 WSL2 雖然能跑但 GPU 不可用。4.3 訓(xùn)練性能調(diào)優(yōu)的幾個(gè)關(guān)鍵參數(shù)環(huán)境跑通之后下一步是讓訓(xùn)練跑得快。WSL2 環(huán)境下有幾個(gè)參數(shù)對(duì)性能影響很大。第一個(gè)是 DataLoader 的num_workers。在 WSL2 里這個(gè)值設(shè)成 CPU 核心數(shù)的 2 到 4 倍比較合適。比如你給 WSL2 分配了 12 核num_workers可以設(shè)成 24 到 48。但要注意設(shè)太大反而會(huì)因?yàn)檫M(jìn)程切換開(kāi)銷(xiāo)導(dǎo)致變慢需要實(shí)測(cè)找最優(yōu)值。第二個(gè)是pin_memory。在 WSL2 里這個(gè)參數(shù)建議設(shè)成 True能加快 CPU 到 GPU 的數(shù)據(jù)傳輸。但如果你發(fā)現(xiàn)內(nèi)存占用異常高可以關(guān)掉試試。第三個(gè)是混合精度訓(xùn)練。WSL2 的 GPU 直通對(duì) FP16 和 BF16 的支持是完整的用torch.cuda.amp能明顯提升訓(xùn)練速度顯存占用也能降下來(lái)。from torch.cuda.amp import autocast, GradScaler scaler GradScaler() for data, target in dataloader: optimizer.zero_grad() with autocast(): output model(data) loss criterion(output, target) scaler.scale(loss).backward() scaler.step(optimizer) scaler.update()我實(shí)測(cè)過(guò)一個(gè) ResNet50 的訓(xùn)練任務(wù)開(kāi)啟混合精度之后每個(gè) epoch 從 95 秒降到 62 秒提升大概 35%。顯存占用從 8.2GB 降到 5.6GB效果很直觀。4.4 日常開(kāi)發(fā)工作流的搭建環(huán)境配好之后日常怎么用也很重要。我目前的工作流是這樣的代碼編輯器用 Windows 端的 VS Code通過(guò) Remote-WSL 插件直接連到 WSL2 里編輯代碼。這樣既有 Windows 的圖形界面便利又能用 Linux 的運(yùn)行環(huán)境。VS Code 的 Remote-WSL 插件裝好之后在 WSL2 里執(zhí)行code .就能直接打開(kāi)當(dāng)前目錄。終端、調(diào)試、Git 操作全都在 WSL2 環(huán)境里執(zhí)行跟原生 Linux 體驗(yàn)一致。Jupyter Notebook 的話我是在 WSL2 里啟動(dòng) Jupyter Lab然后 Windows 瀏覽器通過(guò)localhost:8888訪問(wèn)。WSL2 的 localhost 轉(zhuǎn)發(fā)是自動(dòng)的不需要額外配置。# 在 WSL2 里啟動(dòng) Jupyter Lab jupyter lab --no-browser --port8888 # Windows 瀏覽器直接訪問(wèn) # http://localhost:8888文件傳輸方面小文件直接拖拽大文件用cp命令在/mnt/c和/home之間拷貝。但記住前面說(shuō)的訓(xùn)練用的數(shù)據(jù)集一定要放在 WSL2 原生文件系統(tǒng)里。5. 常見(jiàn)問(wèn)題與排查技巧實(shí)錄5.1 高頻問(wèn)題速查表下面這張表是我在實(shí)際使用中整理出來(lái)的高頻問(wèn)題基本上覆蓋了 90% 的報(bào)錯(cuò)場(chǎng)景。問(wèn)題現(xiàn)象可能原因解決方法nvidia-smi報(bào) command not found驅(qū)動(dòng)透?jìng)魑瓷z查 Windows 驅(qū)動(dòng)版本重啟 WSL2torch.cuda.is_available()返回 FalsePyTorch 與 CUDA 版本不匹配重裝對(duì)應(yīng) CUDA 版本的 PyTorch訓(xùn)練時(shí) GPU 利用率低于 50%數(shù)據(jù)加載瓶頸數(shù)據(jù)集移到 WSL2 原生文件系統(tǒng)調(diào)大 num_workersWSL2 內(nèi)存占用持續(xù)增長(zhǎng)不釋放緩存未回收在 .wslconfig 里設(shè)置 swap定期重啟 WSL2wsl --shutdown后配置不生效.wslconfig 路徑或格式錯(cuò)誤確認(rèn)文件在 Windows 用戶(hù)目錄格式為 INIapt 安裝 CUDA 時(shí)報(bào)依賴(lài)沖突源配置混亂清理舊源重新添加官方源訓(xùn)練中途突然 OOM內(nèi)存或顯存不足減小 batch size開(kāi)啟梯度累積5.2 幾個(gè)官方文檔不會(huì)寫(xiě)的坑第一個(gè)坑是 WSL2 的時(shí)鐘漂移。長(zhǎng)時(shí)間運(yùn)行之后WSL2 里的系統(tǒng)時(shí)間可能會(huì)跟宿主機(jī)不一致導(dǎo)致一些依賴(lài)時(shí)間戳的操作出錯(cuò)。解決辦法是定期執(zhí)行sudo hwclock -s同步時(shí)間或者干脆重啟 WSL2。第二個(gè)坑是 Docker 在 WSL2 里的存儲(chǔ)位置。如果你在 WSL2 里裝 Docker鏡像和容器默認(rèn)存在 WSL2 的虛擬硬盤(pán)里這個(gè)硬盤(pán)會(huì)隨著使用不斷膨脹而且不會(huì)自動(dòng)收縮。我遇到過(guò)虛擬硬盤(pán)漲到 80GB 的情況明明里面只有 20GB 的數(shù)據(jù)。解決辦法是定期執(zhí)行wsl --shutdown然后用diskpart壓縮虛擬硬盤(pán)。第三個(gè)坑是多個(gè) WSL2 發(fā)行版同時(shí)運(yùn)行時(shí)的資源競(jìng)爭(zhēng)。如果你裝了 Ubuntu 又裝了 Debian兩個(gè)同時(shí)跑的時(shí)候會(huì)搶內(nèi)存和 GPU。建議只保留一個(gè)常用的發(fā)行版其他的用完就關(guān)掉。提示W(wǎng)SL2 的虛擬硬盤(pán)文件默認(rèn)在C:\Users\你的用戶(hù)名\AppData\Local\Packages\下面文件名是ext4.vhdx。這個(gè)文件會(huì)越來(lái)越大建議定期檢查大小。5.3 性能監(jiān)控與日常維護(hù)環(huán)境跑起來(lái)之后日常監(jiān)控也很重要。我一般用nvidia-smi -l 1實(shí)時(shí)看 GPU 利用率用htop看 CPU 和內(nèi)存用iotop看磁盤(pán) IO。這三個(gè)工具配合起來(lái)基本能定位大部分性能問(wèn)題。# 安裝監(jiān)控工具 sudo apt install htop iotop # 實(shí)時(shí)監(jiān)控 GPU nvidia-smi -l 1 # 查看 WSL2 資源占用 free -h df -h維護(hù)方面我每周會(huì)做一次清理sudo apt autoremove清理無(wú)用包c(diǎn)onda clean -a清理 conda 緩存pip cache purge清理 pip 緩存。這些緩存加起來(lái)經(jīng)常能占十幾個(gè) G清理完能省不少空間。還有一個(gè)經(jīng)驗(yàn)是WSL2 跑久了之后性能會(huì)下降尤其是內(nèi)存碎片化之后。我一般每周執(zhí)行一次wsl --shutdown讓它徹底重啟重啟之后性能能恢復(fù)到剛裝好的水平。這個(gè)操作不會(huì)丟數(shù)據(jù)但會(huì)關(guān)閉所有正在運(yùn)行的任務(wù)所以要在不跑訓(xùn)練的時(shí)候做。5.4 什么情況下不該用 WSL2雖然我一直在推薦 WSL2但也要說(shuō)清楚它的邊界。如果你需要跑多卡訓(xùn)練WSL2 目前對(duì)多 GPU 的支持還不完善建議還是用原生 Linux。如果你需要特定的內(nèi)核模塊或者硬件直通比如某些采集卡、FPGAWSL2 也做不了。另外如果你的工作流嚴(yán)重依賴(lài) Windows 端的某些專(zhuān)業(yè)軟件而且這些軟件跟 WSL2 的資源競(jìng)爭(zhēng)很?chē)?yán)重那可能雙系統(tǒng)或者兩臺(tái)機(jī)器更合適。WSL2 的優(yōu)勢(shì)在于輕量和便捷不是萬(wàn)能的。我個(gè)人在實(shí)際操作中的體會(huì)是WSL2 最適合單卡、中小規(guī)模模型的開(kāi)發(fā)調(diào)試和訓(xùn)練。超過(guò)這個(gè)范圍還是老老實(shí)實(shí)上 Linux 服務(wù)器或者云平臺(tái)。但就日常開(kāi)發(fā)來(lái)說(shuō)WSL2 已經(jīng)能覆蓋我 90% 的需求剩下的 10% 再用遠(yuǎn)程服務(wù)器補(bǔ)上整體效率比之前雙系統(tǒng)切換高太多了。最后再分享一個(gè)小技巧如果你經(jīng)常需要重建環(huán)境可以把整個(gè)配置過(guò)程寫(xiě)成一個(gè) shell 腳本從裝 CUDA 到裝 PyTorch 全部自動(dòng)化。這樣換機(jī)器或者環(huán)境搞壞了的時(shí)候幾分鐘就能重新跑起來(lái)不用再一步步手動(dòng)操作。