環(huán)境:GPU直通與CUDA實戰(zhàn)全指南)
1. 為什么我最終把 AI 開發(fā)環(huán)境切到了 WSL2先說明一下背景。我主力機(jī)器是 Windows 11 RTX 4090平時既要寫論文跑 PyTorch又要用 Office、微信、剪映之類的日常軟件。過去幾年我在雙系統(tǒng)和虛擬機(jī)之間反復(fù)橫跳直到 WSL2 的 GPU 直通方案成熟之后我才算真正穩(wěn)定下來。先說結(jié)論WSL2 不是又一個Windows 下的 Linux 模擬器它是微軟用 Hyper-V 虛擬化技術(shù)跑起來的一個真實 Linux 內(nèi)核。這就意味著你在 WSL2 里跑的 Ubuntu 不是仿真的而是貨真價實的 Linux。內(nèi)核級這個詞說的就是這件事。加上微軟和英偉達(dá)合作推的 GPU 直通方案WSL2 里的 Linux 可以直接調(diào)用宿主機(jī)顯卡做 CUDA 計算性能損耗非常低。對搞 AI 的人來說這基本就是既要 Windows 的生態(tài)又要 Linux 的開發(fā)環(huán)境的最優(yōu)解。這篇文章我打算把自己從零搭建的完整過程、每一步的取舍原因、踩過的坑全部寫出來。不管是剛接觸 AI 開發(fā)的新手還是準(zhǔn)備把環(huán)境遷移到 WSL2 的熟手按著下面的內(nèi)容走一遍基本都能落地。我不寫官方文檔翻譯我只寫實際怎么操作最穩(wěn)。1.1 內(nèi)核級 Linux到底意味著什么很多人第一次接觸 WSL2 會有一個困惑WSL1 不是也能跑 Linux 命令嗎為什么非要用 WSL2區(qū)別其實非常本質(zhì)。WSL1 的架構(gòu)是系統(tǒng)調(diào)用翻譯層——Windows 內(nèi)核把 Linux 程序的系統(tǒng)調(diào)用一個個接住再翻譯成 Windows 的系統(tǒng)調(diào)用。這種方案啟動快、文件 IO 快但兼容性有天花板很多 Linux 內(nèi)核特性沒法支持比如 Docker、FUSE、iptables、eBPF 這種依賴內(nèi)核能力的東西在 WSL1 里基本是殘廢狀態(tài)。WSL2 則是直接在上面跑一個真正的 Linux 內(nèi)核通過輕量級虛擬機(jī)承載。你用uname -a看到的輸出是一個真實的、由微軟維護(hù)的 Linux 內(nèi)核版本。Docker 可以直接跑內(nèi)核模塊可以加載系統(tǒng)調(diào)用完整兼容。這就是內(nèi)核級 Linux的含義——它不是翻譯它是原生的。代價是什么代價是 WSL2 的 VM 本質(zhì)上是運(yùn)行在 Hyper-V 虛擬化層上的所以文件 IO 跨系統(tǒng)訪問會變慢后面我會講怎么規(guī)避。另外WSL2 默認(rèn)會吃一部分宿主機(jī)內(nèi)存需要合理配置。1.2 GPU 直通的本質(zhì)和顯卡直通不是一回事這里必須先澄清一個高頻誤區(qū)。網(wǎng)上搜WSL2 GPU 直通會搜到很多混淆信息。大家熟悉的顯卡直通指的是把物理顯卡直接分配給虛擬機(jī)宿主機(jī)不再使用這塊顯卡——典型場景是 PVE/Unraid 里給 Windows 虛擬機(jī)直通顯卡打游戲直通之后宿主機(jī)就看不見顯卡了。WSL2 的 GPU 方案不是這種獨(dú)占式直通。WSL2 使用的是微軟的 GPU-PVGPU 半虛擬化架構(gòu)宿主機(jī)保留完整的顯卡驅(qū)動棧Linux 側(cè)通過/usr/lib/wsl/lib里的libcuda.so庫把 CUDA 調(diào)用轉(zhuǎn)發(fā)到 Windows 的 GPU 驅(qū)動上。也就是說Windows 和 WSL2 Linux 是共享同一塊 GPU 的。你可以同時在 Windows 上開著剪映在 WSL2 里跑 PyTorch 訓(xùn)練兩者互不干擾。這種方案對 AI 開發(fā)反而是好事你不用為了跑訓(xùn)練就放棄 Windows 的全部圖形能力。從性能來說NVIDIA 官方給出的數(shù)據(jù)是 WSL2 里 CUDA 性能接近原生 Linux 的 97%-100%計算密集型任務(wù)。這個數(shù)字我實測下來不是吹的跑 ResNet 訓(xùn)練差距基本在誤差范圍內(nèi)。所以性能損耗這項完全不用擔(dān)心。1.3 WSL2、VM、雙系統(tǒng)、Docker Desktop 四選一該怎么選既然要部署 AI 開發(fā)環(huán)境我先把我對四種主流方案的理解擺出來這樣后面你再遇到為什么不用 XXX的疑問心里就有底了。方案CPU/內(nèi)存性能GPU 支持開發(fā)體驗適用場景WSL2損耗低5%極好共享模式CUDA 直用與 Windows 無縫切換AI 開發(fā)、Docker、日常辦公兼顧傳統(tǒng) VMVirtualBox/VMware損耗較低一般VGA 模擬為主CUDA 難交互割裂測試、兼容性驗證雙系統(tǒng)100%100%切換要重啟長時間訓(xùn)練、追求極致環(huán)境Docker Desktop WSL2 后端同 WSL2同 WSL2容器化環(huán)境隔離好項目分發(fā)、復(fù)現(xiàn)實驗我的建議很明確如果你的機(jī)器是 NVIDIA 顯卡且你需要在 Windows 上處理日常事務(wù)WSL2 就是目前綜合成本最低的選擇。雙系統(tǒng)的優(yōu)勢在于純 Linux 環(huán)境的絕對兼容性但重啟切換的痛感太強(qiáng)了我現(xiàn)在只有在 WSL2 里搞不定的場景比如某些 Nsight 工具鏈的問題才會重啟進(jìn) Linux 單系統(tǒng)。2. 部署前的環(huán)境準(zhǔn)備版本、驅(qū)動、鏡像三件事開始裝之前先把基礎(chǔ)條件過一遍。WSL2 對 Windows 版本有硬性要求顯卡驅(qū)動更是整個 GPU 直通能否成功的關(guān)鍵環(huán)節(jié)。2.1 確認(rèn) Windows 版本與 WSL2 啟用WSL2 需要 64 位 Windows 10 版本 2004 及以上Build 19041或者 Windows 11強(qiáng)烈推薦WSL 的新特性基本都在 Win11 上優(yōu)先更新。我已經(jīng)是 Win11 最新版所以直接走下面的流程。用管理員身份打開 PowerShell# 啟用 WSL 功能會自動啟用 VirtualMachinePlatform 和 Hyper-V 相關(guān)組件 wsl --install # 查看當(dāng)前 WSL 版本 wsl --statuswsl --install這個命令在較新的 Windows 版本里是一條龍服務(wù)安裝 WSL2 內(nèi)核、啟用虛擬化平臺、默認(rèn)安裝 Ubuntu。裝完重啟一次系統(tǒng)就具備 WSL2 環(huán)境了。如果執(zhí)行wsl --status提示的是 WSL1不要慌顯式指定一下wsl --set-default-version 2提示如果是 Windows 10 且wsl --install不可用就手動開啟適用于 Linux 的 Windows 子系統(tǒng)和虛擬機(jī)平臺兩個可選功能重啟后再安裝 WSL2 內(nèi)核更新包微軟官網(wǎng)搜索wsl_update_x64.msi。2.2 顯卡驅(qū)動真相是只需裝 Windows 驅(qū)動這是 WSL2 GPU 方案最容易踩坑的地方。很多人習(xí)慣性地跑到 Linux 里執(zhí)行apt install nvidia-driver-xxx結(jié)果要么裝不上要么裝完重啟之后nvidia-smi反而掛了。核心原則在 WSL2 里不需要、也不應(yīng)該單獨(dú)安裝 NVIDIA 驅(qū)動。WSL2 的 GPU 半虛擬化架構(gòu)決定了Linux 用戶態(tài)通過/usr/lib/wsl/lib/libcuda.so調(diào)用 CUDA而真正的驅(qū)動由 Windows 側(cè)接管。所以你只需要在 Windows 宿主機(jī)上安裝一個支持 WSL2 的 NVIDIA 驅(qū)動——從 470.76 版本開始NVIDIA 已經(jīng)把所有新驅(qū)動默認(rèn)加上 WSL 支持了下載驅(qū)動時只要認(rèn)準(zhǔn)官網(wǎng)的 Game Ready 或 Studio Driver2021 年之后的版本都行裝好即可。裝完驅(qū)動的判斷標(biāo)準(zhǔn)很直接在 Windows PowerShell 里跑nvidia-smi能顯示顯卡信息。如果 Windows 側(cè)沒問題WSL2 側(cè)基本就成功了一半。那 Linux 側(cè)需要裝什么只需要裝 CUDA Toolkit不需要裝驅(qū)動。CUDA Toolkit 里包含nvcc編譯器和運(yùn)行時庫這才是真正干活的東西。2.3 鏡像選擇為什么不推薦默認(rèn) Ubuntu 之外的折騰WSL2 官方支持的發(fā)行版很多Ubuntu、Debian、Kali、openSUSE、Alpine 都有。但我的建議是第一臺機(jī)器老老實實裝 Ubuntu 22.04 LTS。原因不復(fù)雜。AI 開發(fā)的大多數(shù)第三方庫PyTorch、TensorRT、DeepStream都會優(yōu)先適配 Ubuntu LTS 版本。你在 Ubuntu 上踩到坑網(wǎng)上十條搜索結(jié)果九條能救你你要是選了 arch 或者 Fedora出了問題搜到的解決方案可能還要先折騰一輪依賴。安裝發(fā)行版的命令PowerShellwsl --install -d Ubuntu-22.04裝完第一次啟動會讓你設(shè)置 Linux 用戶名和密碼。這一步設(shè)置的密碼就是 sudo 密碼別用太隨便的忘了很麻煩。注意WSL 登錄用戶名可以和 Windows 用戶名不同。我自己習(xí)慣用同一個名字跨系統(tǒng)傳文件時的權(quán)限心智負(fù)擔(dān)小一些。2.4 解決下載慢的硬核操作換源換鏡像WSL2 的 Ubuntu 從微軟服務(wù)器拉取國內(nèi)網(wǎng)絡(luò)環(huán)境下經(jīng)常出現(xiàn)龜速。新裝的系統(tǒng)第一步永遠(yuǎn)是替換 apt 源。在 WSL2 Ubuntu 里執(zhí)行# 備份原始源 sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak # 用清華源替換先確認(rèn) Ubuntu 版本是 22.04jammy sudo sed -i s/archive.ubuntu.com/mirrors.tuna.tsinghua.edu.cn/g /etc/apt/sources.list sudo sed -i s/security.ubuntu.com/mirrors.tuna.tsinghua.edu.cn/g /etc/apt/sources.list sudo sed -i s|//.*ubuntu.com|//mirrors.tuna.tsinghua.edu.cn|g /etc/apt/sources.list sudo apt update順便一提如果你不想用清華源中科大源mirrors.ustc.edu.cn和阿里源mirrors.aliyun.com也都穩(wěn)。挑一個順手的就是。3. 把 WSL2 裝到 D 盤擺脫 C 盤爆滿焦慮這一步是我個人極其推薦的。WSL2 的虛擬磁盤.vhdx文件默認(rèn)放在 C 盤用戶目錄下AI 開發(fā)裝個 PyTorch、CUDA、Docker 鏡像隨便就是幾十個 GB。C 盤是系統(tǒng)盤一旦滿了哭都來不及。WSL2 實際上是可以用導(dǎo)出-導(dǎo)入的方式遷移到任意分區(qū)的操作非常簡單3.1 導(dǎo)出當(dāng)前發(fā)行版先關(guān)閉 WSLwsl --shutdown然后把 Ubuntu 導(dǎo)出為 tar 文件放到 D 盤wsl --export Ubuntu-22.04 D:\wsl\ubuntu.tar第一次導(dǎo)出可能要等幾分鐘因為整個虛擬磁盤都被打包了。3.2 注銷原始發(fā)行版并導(dǎo)入新位置# 注銷默認(rèn)位置的發(fā)行版 wsl --unregister Ubuntu-22.04 # 導(dǎo)入到 D 盤指定目錄 wsl --import Ubuntu-22.04 D:\wsl\ubuntu D:\wsl\ubuntu.tar --version 2導(dǎo)入之后默認(rèn)會以 root 用戶進(jìn)入。先設(shè)置默認(rèn)用戶為之前創(chuàng)建的用戶名避免一直在 root 下干活# 進(jìn)入 WSL wsl -d Ubuntu-22.04 # 在 WSL 里修改默認(rèn)用戶 echo -e [user]\ndefault你的用戶名 | sudo tee /etc/wsl.conf exit # 重啟 WSL 生效 wsl --shutdown wsl -d Ubuntu-22.04之后wsl進(jìn)入的就是你的普通用戶了。D:\wsl\ubuntu.tar這個中間包可以刪掉D:\wsl\ubuntu目錄下會有ext4.vhdx那才是真正的虛擬磁盤。我的實操心得在C:\Users下也可以配置.wslconfig把虛擬磁盤位置固定到 D 盤但那是老黃歷了?,F(xiàn)在用導(dǎo)出-導(dǎo)入是最干凈的方案不受用戶目錄結(jié)構(gòu)影響。3.3 用 .wslconfig 限制內(nèi)存和 CPUWSL2 默認(rèn)會分配最多 50% 宿主機(jī)內(nèi)存給虛擬機(jī)。32GB 內(nèi)存的機(jī)器WSL2 可能吃 16GBWindows 這邊就容易卡。需要在用戶目錄下創(chuàng)建.wslconfig文件來約束資源在C:\Users\你的用戶名目錄下新建.wslconfig寫入[wsl2] memory16GB processors8 swap2GB localhostForwardingtrue關(guān)鍵參數(shù)解釋memory限制 WSL2 最多使用 16GB 內(nèi)存避免擠爆 Windows。processors限制邏輯處理器數(shù)量防止 WSL2 全核搶占。swap虛擬內(nèi)存上限跑大模型時如果內(nèi)存不夠會使用 swap盤夠就多給點(diǎn)。改完.wslconfig需要wsl --shutdown再重啟 WSL2 才能生效。查看生效情況在 WSL 里執(zhí)行free -h能看到分配的內(nèi)存。我自己訓(xùn)練 7B 參數(shù)量級的模型時把memory調(diào)到 24GBWindows 這邊還有 8GB 富余整體體驗很穩(wěn)。4. GPU 直通與 CUDA 環(huán)境實操從零到能跑 PyTorch現(xiàn)在進(jìn)入正題。前面都是基礎(chǔ)設(shè)施這一章是真正讓 GPU 轉(zhuǎn)起來的關(guān)鍵。4.1 在 WSL2 里驗證 GPU 可見性打開 WSL2 Ubuntu 終端先檢查最關(guān)鍵的路徑ls /usr/lib/wsl/lib/正常輸出里必須能看到libcuda.so、libcuda.so.1這一系列庫文件。這是 WSL2 與 Windows 圖形驅(qū)動通信的橋接庫。然后直接跑nvidia-sminvidia-smi如果輸出和 Windows 側(cè)一樣顯示出顯卡型號、驅(qū)動版本、顯存容量恭喜你GPU 直通這一關(guān)已經(jīng)過了。我第一次在 WSL2 里看到nvidia-smi輸出 RTX 4090 的時候確實有點(diǎn)激動。這意味著 CUDA 運(yùn)行時可以直接操作這塊物理顯卡。如果這步報錯絕大多數(shù)原因就是 Windows 側(cè)驅(qū)動沒裝新版本先回去看看第 2.2 節(jié)。4.2 安裝 CUDA Toolkit為什么我推薦容器方案替代原生安裝到了這一步你面前有兩條路路徑 A原生安裝 CUDA Toolkit傳統(tǒng)方案去 NVIDIA 官網(wǎng)下載 WSL2-Ubuntu 版的 runfile 或者通過 apt 安裝。命令不復(fù)雜wget https://developer.download.nvidia.com/compute/cuda/12.4.1/local_installers/cuda_12.4.1_550.54.14_linux.run sudo sh cuda_12.4.1_550.54.14_linux.run --toolkit --silent --override但這套方案有個老大難問題CUDA 版本和 PyTorch 編譯版本的匹配。你裝 CUDA 12.4但 PyTorch 官方編譯的 wheel 只對應(yīng) CUDA 12.1就得額外裝cudatoolkit兼容層。翻車率不低。路徑 B用 Conda/PyTorch 官方輪子推薦方案現(xiàn)代 AI 開發(fā)其實不需要單獨(dú)裝完整 CUDA Toolkit。PyTorch 官方 wheel 自帶了 CUDA 運(yùn)行時版式如cu121、cu124只要你裝上對應(yīng)版本的 PyTorchCUDA 運(yùn)行時庫就隨之而來。我現(xiàn)在的實踐是只在 WSL2 里裝一個 Miniconda然后用 conda 管理 PyTorch 環(huán)境不單獨(dú)裝 CUDA Toolkit除非用到 nvcc 編譯自定義算子。對于 90% 的 AI 開發(fā)場景訓(xùn)練、推理、跑實驗這個方案最省心。4.3 Miniconda PyTorch GPU 版安裝實錄在 WSL2 Ubuntu 里執(zhí)行# 下載 Miniconda國內(nèi)用清華鏡像加速 wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-latest-Linux-x86_64.sh # 安裝 bash Miniconda3-latest-Linux-x86_64.sh -b -p $HOME/miniconda3 # 初始化 shell eval $($HOME/miniconda3/bin/conda shell.bash hook) conda init # 創(chuàng)建 AI 環(huán)境 conda create -n ai python3.10 -y conda activate ai # 安裝 PyTorchCUDA 12.1 版本對應(yīng) pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121裝完驗證 GPU 是否可用python -c import torch; print(torch.cuda.is_available()); print(torch.cuda.get_device_name(0))輸出True NVIDIA GeForce RTX 4090看到True的時候整個 WSL2 的 GPU 開發(fā)環(huán)境就算徹底通了。提示如果網(wǎng)速慢PyTorch wheel 可以從清華 PyPI 鏡像下載但那上面默認(rèn)的是 CPU 版需要先從 PyTorch 官方 index 下。我的經(jīng)驗是直接用官方 index-url配好代理或錯峰下載比找第三方鏡像穩(wěn)定。4.4 容器方案Docker Desktop WSL2 后端如果你需要跑別人給的 Docker 鏡像比如 NVIDIA 官方 NGC 的 PyTorch 容器WSL2 后端是標(biāo)配。安裝配置流程Windows 側(cè)裝 Docker DesktopSettings 里確保使用 WSL2 后端然后勾選支持你已安裝的發(fā)行版。之后在 WSL2 里可以直接執(zhí)行docker命令本質(zhì)上是復(fù)用同一個 Docker 引擎。跑一個 GPU 容器docker run --gpus all -it --rm nvcr.io/nvidia/pytorch:24.02-py3 nvidia-smi--gpus all這個參數(shù)在 Windows Docker Desktop WSL2 下是直接可用的因為 Docker 會自動感知 WSL2 的 GPU 轉(zhuǎn)發(fā)能力。我日常的工作流是原型代碼在 conda 環(huán)境里跑跑通了就打鏡像進(jìn) Docker 固定環(huán)境。這樣實驗復(fù)現(xiàn)性可控?fù)Q機(jī)器也方便。5. 性能調(diào)優(yōu)與緩存讓 GPU 跑得更穩(wěn)更快環(huán)境通了之后想榨干性能還有幾個關(guān)鍵點(diǎn)值得調(diào)。5.1 Linux 側(cè) CUDA 緩存的正確配置AI 訓(xùn)練和推理會有大量 CUDA kernel 緩存類似 GPU 端的預(yù)編譯緩存。默認(rèn)情況下緩存寫在~/.nv/ComputeCache這個目錄在虛擬磁盤里IO 慢。我建議把緩存挪到共享內(nèi)存tmpfs# 創(chuàng)建緩存目錄 mkdir -p /tmp/nv-compute-cache # 設(shè)置環(huán)境變量 echo export CUDA_CACHE_PATH/tmp/nv-compute-cache ~/.bashrc source ~/.bashrc這樣做的好處是 kernel 緩存讀寫走內(nèi)存速度提升感知明顯尤其是反復(fù)切換模型時。缺點(diǎn)是重啟后緩存清空第一次加載模型會重新編譯。對訓(xùn)練流程來說這個犧牲完全值得。5.2 跨系統(tǒng)文件 IO不要把數(shù)據(jù)放在 /mnt/c這是 WSL2 老用戶最深刻的痛。/mnt/c、/mnt/d這種路徑本質(zhì)上是 Windows 文件系統(tǒng)掛載WSL2 里訪問它們的速度比訪問原生 Linux 文件系統(tǒng)慢 5-10 倍。訓(xùn)練腳本讀寫數(shù)據(jù)集時如果把數(shù)據(jù)放在D:\datasets然后從/mnt/d/datasets讀取數(shù)據(jù) IO 會成為瓶頸。我的方案數(shù)據(jù)文件放在 WSL2 原生文件系統(tǒng)~目錄或/dataWindows 側(cè)需要訪問訓(xùn)練結(jié)果時通過資源管理器輸入\\wsl$\Ubuntu-22.04\home\用戶名查看小文件頻繁讀寫絕不走/mnt/c實測顯存帶寬不變的情況下數(shù)據(jù)讀取從/mnt/d遷移到~之后小 batch 的訓(xùn)練速度能提升一截。5.3 Windows 側(cè) GPU 優(yōu)先級調(diào)整有一個從 Windows 注冊表調(diào)整 GPU 調(diào)度優(yōu)先級的技巧適合在 WSL2 訓(xùn)練時避免 Windows 圖形界面搶占 GPU 資源reg add HKLM\SYSTEM\CurrentControlSet\Control\GraphicsDrivers\Scheduler /v LatencyToleranceEnabled /t REG_DWORD /d 1 /f這個命令啟用 GPU 調(diào)度器的延遲容忍模式。效果是讓 WSL2 里長時間的計算任務(wù)不容易被桌面應(yīng)用的突發(fā) GPU 請求打斷。副作用不明顯但如果 Windows 側(cè)也在用 GPU比如直播推流反而可能讓桌面應(yīng)用變卡。用不用看個人取舍。6. 常見問題與排查WSL2 GPU 的坑我都替你踩過最后一部分我把實際工作中碰到的高頻問題整理成速查表。這里的每個問題都是我或同事真實遇到過、排查過的。6.1 WSL2 尚未準(zhǔn)備就緒 / 服務(wù)無法啟動現(xiàn)象執(zhí)行wsl報錯說系統(tǒng)尚未啟用虛擬化或 WSL2 尚未準(zhǔn)備就緒。排查順序BIOS 里確認(rèn) CPU 虛擬化Intel VT-x / AMD-V已開啟Windows 功能里確認(rèn)虛擬機(jī)平臺已啟用確認(rèn) Hyper-V 沒有被殺毒軟件或內(nèi)核隔離策略干擾執(zhí)行bcdedit /set hypervisorlaunchtype auto管理員權(quán)限重啟。注意如果開了第三方沙箱軟件或舊版 VMware可能和 Hyper-V 沖突。Win11 下一般不會Win10 上遇到過。6.2nvidia-smi報錯找不到 libcuda現(xiàn)象在 WSL2 里執(zhí)行nvidia-smi提示無法加載libcuda.so.1。原因 90% 是 Windows 驅(qū)動版本過老。WSL2 需要 470.76 以上的驅(qū)動從 2021 年年中之后的驅(qū)動都沒問題。升級 Windows 側(cè)驅(qū)動即可解決。如果驅(qū)動已經(jīng)新但仍然報錯檢查/usr/lib/wsl/lib是否存在。如果目錄不存在多半是wsl --update更新內(nèi)核版本。執(zhí)行wsl --update wsl --shutdown6.3 PyTorch 顯示 CUDA 可用但運(yùn)算極慢現(xiàn)象torch.cuda.is_available()是 True但跑訓(xùn)練速度只有預(yù)期的三分之一。原因排查確認(rèn)環(huán)境變量有沒有把 CUDA 設(shè)備限制到某個低端設(shè)備echo $CUDA_VISIBLE_DEVICES確認(rèn)數(shù)據(jù)讀取沒走/mnt/c見 5.2確認(rèn) PyTorch 版本和 CUDA 版本匹配。用torch.version.cuda查看 PyTorch 內(nèi)置的 CUDA 版本和nvidia-smi顯示的驅(qū)動版本不一定一致但 PyTorch 內(nèi)置 CUDA 運(yùn)行時要求驅(qū)動的兼容性只要驅(qū)動別太老就行。如果都排除了嘗試增加 batch size 觀察吞吐量是否線性增長排除小 batch 導(dǎo)致的調(diào)度開銷。6.4 WSL2 下載慢apt 和 pip 都慢處理方法前面已經(jīng)寫過。apt 換清華/中科大源pip 用清華 PyPI 鏡像conda 用清華 anaconda 鏡像。如果鏡像源速度仍不理想檢查 DNS 配置或給 WSL2 配置 Windows 側(cè)代理。對于代理WSL2 訪問 Windows 主機(jī)地址可以用特殊 IP# 查看 Windows 主機(jī)的 IP從 WSL2 內(nèi) cat /etc/resolv.conf | grep nameserver拿到 Windows 主機(jī) IP 之后在 WSL2 里配置http_proxy環(huán)境變量指向那個 IP 加端口。但這一步我就點(diǎn)到為止——因為絕大多數(shù)場景下?lián)Q國內(nèi)鏡像就夠了Windows 內(nèi)網(wǎng)代理轉(zhuǎn)發(fā)的問題是另一個話題。6.5 Docker 里無法使用 GPU現(xiàn)象在 WSL2 里跑docker run --gpus all報錯說找不到 GPU。排查思路先在 WSL2 里跑nvidia-smi如果報錯說明 GPU 通路沒建立先解決主機(jī)側(cè)問題Docker Desktop 的 WSL2 后端設(shè)置里確認(rèn)Enable GPU相關(guān)選項較新版本默認(rèn)開啟檢查 Docker 版本老版本可能不支持--gpus參數(shù)。升級 Docker Desktop 通用如果使用容器內(nèi)自定義鏡像確認(rèn)鏡像里帶nvidia-smi工具或 NVML 庫部分鏡像為了體積精簡沒有裝這些工具報錯可能來自容器內(nèi)部而不是 Docker 引擎。6.6 虛擬磁盤越來越大如何瘦身WSL2 的.vhdx文件只增不減。刪了 Linux 里的文件虛擬磁盤空間不會自動釋放。定期需要手動壓縮wsl --shutdown diskpart在 diskpart 里執(zhí)行select vdisk fileD:\wsl\ubuntu\ext4.vhdx attach vdisk readonly compact vdisk detach vdisk exit操作后虛擬磁盤會物理縮小。我一般每跑完一個大型實驗就壓縮一次能回收好幾個 GB。7. 最后這個環(huán)境我現(xiàn)在怎么用寫到這里基本配置和排坑都說完了。說說我現(xiàn)在的日常狀態(tài)Windows 11 開機(jī)即用WSL2 里跑著 Ubuntu 22.04conda 環(huán)境里常駐 PyTorch。寫代碼用 VS Code Remote-WSL 插件直接連進(jìn) WSL2 里的文件系統(tǒng)不用切窗口。訓(xùn)練腳本跑在~/projects里結(jié)果是原生 Linux 文件系統(tǒng)速度隨時切回 Windows 剪視頻、寫文檔。Docker 容器里跑別人給的模型推理--gpus all一把梭。要說這一個方案讓我最滿意的地方其實是“不用選”。不需要在工作系統(tǒng)和日常系統(tǒng)之間做任何妥協(xié)。如果你也受夠了雙系統(tǒng)重啟和虛擬機(jī) GPU 無能的折磨照著這篇文章跑一遍大概率直接入坑?,F(xiàn)在唯一后悔的就是沒早點(diǎn)從純雙系統(tǒng)遷過來。