WSL2和CUDA踩坑

醬_油發表於2020-10-24
WSL2和CUDA踩坑
 
WSL2裡可以直接跑cuda了, 目前(2020年10月) 功能可用, 但bug很多, 不夠完善
 
 
1. 安裝
    主要參考: https://docs.nvidia.com/cuda/wsl-user-guide/index.html
    
    注意:
        1. 目前需要加入windows體驗計劃, 並選dev通道, 更新到開發版的windows
        2. 開啟hyper-v/wsl/虛擬化平臺等windows的功能並安好wsl, 可能需要wsl --update更新核心
        3. 只要在windows上安裝這一個驅動就可以了 https://developer.nvidia.com/cuda/wsl/download 在WSL2裡是不需要安驅動的.
   4. 在wsl裡安cuda的話是用: cuda-toolkit-11-1 
Do not choose the cudacuda-11-0, or cuda-drivers meta-packages under WSL 2 since these packages will result in an attempt to install the Linux NVIDIA driver under WSL 2.
 
2. 常見問題
 
    1. DNS有問題
        在/etc/resolv.conf 里加自已的dns可暫時解決
        永久解決要新建/etc/wsl.conf檔案內容如下:
    [network]
    generateResolvConf = false
   刪掉 原來的 /etc/resolv.conf (這是個連結) 換成好用的dns設定
 
    2. 太佔C盤空間
        最簡單的移動方法, 找到wsl2的ext4.vhdx檔案在哪:  
        一般在類似這種地方:  C:\Users\xxx\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu20.04onWindows_79rhkp1fndgsc\LocalState
        把ext4.vhdx移到其它盤, 再作一個SymbolLink就可以了 New-Item -ItemType SymbolicLink -Path . -Name ext4.vhdx -Target $newLocation
 
    3. wsl讀寫速度慢
        和wsl1不同現在的/mnt/下的碰盤訪問走的是網路, 在讀寫大量小檔案時慢的懷疑人生. 儘量用本地的盤吧
 
    4. wsl擴容
        wsl2預設只有256G的大小, 可以直接用hyper-v中的磁碟工具給ext4.vhdx擴容. 再到wsl裡重新給/劃空間
           sudo resize2fs /dev/sdb <sizeInMegabytes>G
 
    5. wsl2和代理工具Proxifer互相沖突 [ 參考的物件型別不支援嘗試的操作 The attempted operation is not supported for the type of object referenced ].
 

問題:
參考的物件型別不支援嘗試的操作。(The attempted operation is not supported for the type of object referenced.)
解決方法:

1. 臨時解決方案(不推薦):
以管理員身份執行CMD,輸入:

netsh winsock reset (不過這樣Proxifer就廢了)

重啟計算機即可修復。

2. 比較長期解決的方案(推薦):
(使用到目前,仍未出現問題)

(1)下載此軟體:
www.proxifier.com/tmp/Test20200228/NoLsp.exe

(因需要梯子訪問下載,有些朋友不方便,所以我上傳到百度雲分享在這裡:)
(連結:https://pan.baidu.com/s/1bVZ0OXZPxEt8l1IHYaFK3A ,提取碼:vjge)

(2)管理員身份執行CMD輸入:
NoLsp.exe C:\windows\system32\wsl.exe
1
請自行注意NoLsp.exe程式的位置,以及你的wsl.exe位置。
產生原因和解決方法分析:
代理軟體和wsl2的sock埠衝突,使用netsh winsock reset重置修復。
Proxifer開發人員解釋如下:

如果Winsock LSP DLL被載入到其程式中,則wsl.exe將顯示此錯誤。最簡單的解決方案是對wsl.exe使 用WSCSetApplicationCategory
WinAPI呼叫來防止這種情況。在後臺,該呼叫在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WinSock2\Parameters\AppId_Catalog中為wsl.exe建立一個條目。
這將告訴Windows不要將LSP DLL載入到wsl.exe程式中