AI算法工程師的筆記本環(huán)境配置
前一陣子買了個新的筆記本電腦,幻13-3050TI-1T版本,全能本,CPU是8核心16線程的標(biāo)壓版AMD銳龍9-5900HS,顯卡是NVIDIA-3050TI,重量和macbook差不多,都是1.4kg,便攜、可以改變形態(tài)。
大概長這樣:

可以變換3種形態(tài)(莫名有種興奮感),可能也有人問我為啥不買macbook,沒買的原因有兩點:
macbook不支持nvidia顯卡,這個無解,沒辦法本地跑AI代碼,只能遠程服務(wù)器 macbook用膩了,有一點審美疲勞,新版的macbook pro也太厚了,感覺不方便攜帶,主要也貴...
于是有了一臺和macbook接近大小、差不多重量的帶獨顯的全能筆記本,日常簡單開發(fā)、調(diào)試調(diào)試足夠用了。CPU是R9-5900HS、顯卡是3050TI-4G,CPU的編譯速度也還可以,GPU的話除了顯存有點小,30系列的特性都有了,可以盡情嘗試。

畢竟搞AI的,當(dāng)然對GPU比較敏感,這個3050TI是基于GA107核心,有2560個CUDA Core,80個Tensor Core,基本是夠玩了。計算能力8.6,目前(這句話寫的時候還是最新,但是立馬老黃3月份推出了H100)最新的特性該有的都有:
FP32、FP16、BF16和INT8精度的支持 第三代Tensor Core等等
附一個GA102的白皮書[1],感興趣的可以翻翻。
有了筆記本,接下來就是配置開發(fā)環(huán)境了。
之前不想用Windows本主要是習(xí)慣了Linux的操作環(huán)境,而Mac和Linux操作起來相差不大,而用windows就會種種不習(xí)慣。
所以一開始的方案就是win10+ubuntu雙系統(tǒng):
Ubuntu + win10/win11 雙系統(tǒng)方案
這也是大部分程序員的配置,開發(fā)當(dāng)然必須是ubuntu了,windows娛樂,ubuntu工作。

這里我先是在win10下安裝了ubuntu,之后在win10+ubuntu雙系統(tǒng)的前提下,將win10升級成了win11。整個升級過程很順滑,升級后沒有任何改動(引導(dǎo)沒有被破壞、ubuntu系統(tǒng)未被破壞)升級完重啟后,可以正常使用ubuntu,此時雙系統(tǒng)升級為win11+ubuntu。
而裝Ubuntu也是老生常談的話題了,基本都是:
下載好Ubuntu鏡像,拿個U盤制作U盤鏡像 Win10系統(tǒng)內(nèi)劃分出一部分磁盤給Ubuntu使用 重啟bios設(shè)置啟動方式為U盤然后安裝
我安裝的是20.04版本的Ubuntu。
大概就是這么個流程,網(wǎng)上的資料很多很多,隨便一搜就有了,有一點和之前安裝16.04不一樣,NVIDIA的驅(qū)動安裝比想象中要順利很多,四年前那會也在一個筆記本上裝Ubuntu吃了不少苦頭:ubuntu16.04下安裝NVIDIA(cuda)-gtx965m相關(guān)步驟以及問題[2],這次的NVIDIA驅(qū)動沒有很多坑,安裝正常邏輯安裝就行,也不需要禁用什么什么的。
進入新的Ubuntu系統(tǒng),基本步驟大體也都一樣:
先切換源,注意源的版本一定和你的ubuntu版本一致(不一致會導(dǎo)致你的各種軟件不兼容,也就是unmet會很多,這個我一開始沒有注意,折騰了很久),去找清華或者阿里源:
https://mirrors.tuna.tsinghua.edu.cn/help/ubuntu/ https://developer.aliyun.com/mirror/ubuntu?spm=a2c6h.13651102.0.0.3d151b117MRP65
然后把/etc/apt中的source.list替換成國內(nèi)源之后:
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install build-essential
安裝Ubuntu的必要組件之后,接下來就是要升級內(nèi)核(Ubuntu-20.04默認(rèn)是5.10的內(nèi)核)。至于為啥要升級內(nèi)核,是因為我這個是幻13是比較新的筆記本,有些功能舊版的內(nèi)核不支持(比如翻轉(zhuǎn)屏幕、比如鍵盤燈、指紋解鎖啥的),于是乎先升級內(nèi)核。
升級內(nèi)核有一些坑,我參照了ROG幻13安裝ubuntu20.04,解決各種驅(qū)動問題[3]這篇文章,也確實幫了我大忙,大概就是,如果你從官方kernel[4]中去下載更新,可能會因為官方kernel中的libc6版本不兼容導(dǎo)致sudo apt-get update有時候會出錯,會報各種問題,需要下載合適版本的kernel才行。
對內(nèi)核有疑問的可以看看這篇文章,總之升級內(nèi)核需要謹(jǐn)慎一些,另外使用最新版本的Ubuntu系統(tǒng),會自帶最新的內(nèi)核。
接下來說說WSL2。
win11+wsl2+docker
WSL(Windows Subsystem for Linux)是我在調(diào)研win11相關(guān)資料時候看到的新名詞,之前只是聽說過,但沒有實際使用過,現(xiàn)在有windows跑Ubuntu的需求,突然想到可以試試看。
wsl的功能就是可以讓你在windows上使用linux系統(tǒng)。可以讓我這種習(xí)慣命令行的人在windows下開發(fā)也不難受。畢竟如果直接在ubuntu下開發(fā),摸魚和聊天確實比較折騰,我還是想實現(xiàn)類似于macos上開發(fā)的效果,娛樂工作兩不誤,開發(fā)體驗也不割裂。
因為mac和nvidia水火不容,對于我這種搞深度學(xué)習(xí)極度依賴nvidia顯卡的人來說用mac只能遠程連接服務(wù)器來開發(fā),在網(wǎng)絡(luò)不好的情況下就比較難受了。
貌似WSL2也比VMware虛擬機性能強一些(懂得小伙伴可以說下),也可以直接在windows中運行Ubuntu鏡像,然后vscode連接開發(fā),效率直接翻倍,這點直接抓住了我的心。
目前wsl的最新版是wsl2,wsl和wsl2的區(qū)別挺大,男人的第六感讓我用新不用舊,于是選擇使用wsl2,其實還有一個原因是wsl2下的linux內(nèi)核可以調(diào)用cuda。
首先升級win11,再裝一個WSL專用驅(qū)動510.06_gameready_win11_win10-dch_64bit_international,然后直接在win終端輸入:
wsl --set-default-version 2
此時就默認(rèn)使用WSl2了。
如果著急看WSL2能不能用可以直接在WIN跑下這個:
docker run --gpus all nvcr.io/nvidia/k8s/cuda-sample:nbody nbody -gpu -benchmark
---
result:
---
GPU Device 0: "Ampere" with compute capability 8.6
> Compute 8.6 CUDA device: [NVIDIA GeForce RTX 3050 Ti Laptop GPU]
20480 bodies, total time for 10 iterations: 40.139 ms
= 104.495 billion interactions per second
= 2089.903 single-precision GFLOP/s at 20 flops per interaction
輸出正常的話,就證明WSL-NVIDIA驅(qū)動和你的顯卡都能正確檢測到。
安裝Ubuntu
接下來安裝Ubuntu試試,一般網(wǎng)上都是建議在Microsoft Store中搜索安裝,不過如果直接在WIN11的商店中搜索Ubuntu,會給你直接安裝到C盤,這點很煩,我也是一不小心就將Ubuntu鏡像搞到了C盤,無奈只能先刪掉,然后將WSL2中的docker綁定解綁,然后移到其他盤中(這里我移動到了D盤):
wsl --export docker-desktop-data D:\Docker\wsl\docker-desktop-data\docker-desktop-data.tar
wsl --unregister docker-desktop-data
wsl --import docker-desktop-data D:\Docker\wsl\docker-desktop-data\ D:\Docker\wsl\docker-desktop-data\docker-desktop-data.tar --version 2
docker鏡像地址移到其他盤后,就可以放開手搞鏡像了!
基于wsl2的docker鏡像
既然都是鏡像,為啥不直接找一個帶有cuda環(huán)境的鏡像呢,直接在docker官網(wǎng)或者NVIDIA-docker[5]就可以搜到:nvidia/cuda:11.4.3-cudnn8-devel-ubuntu20.04,然后docker拉一下就行
于是,我在wsl2中注銷掉了之前的Ubuntu鏡像,wsl --unregister Ubuntu,并且刪除之前的鏡像。然后docker pull nvidia/cuda:11.4.3-cudnn8-devel-ubuntu20.04拉取新的鏡像。
運行一下試試,執(zhí)行docker run -it --gpus all 42a32a65aa9d /usr/bin/bash,注意要把--gpus all加上,不然會檢測不到顯卡。
進入容器內(nèi)部執(zhí)行nvidia-smi:
root@304af4811a38:/# nvidia-smi
Sun Jan 30 10:37:28 2022
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 510.39.01 Driver Version: 511.23 CUDA Version: 11.6 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|===============================+======================+======================|
| 0 NVIDIA GeForce ... On | 00000000:01:00.0 Off | N/A |
| N/A 51C P8 8W / N/A | 0MiB / 4096MiB | 0% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=============================================================================|
| No running processes found |
+-----------------------------------------------------------------------------+
嗯,沒毛病。
測試CUDA
編譯https://github.com/NVIDIA/cuda-samples中的代碼,然后跑個deviceQuery:
root@0b09ee5e9284:~/code/cuda-samples/bin/x86_64/linux/release# ./deviceQuery
./deviceQuery Starting...
CUDA Device Query (Runtime API) version (CUDART static linking)
Detected 1 CUDA Capable device(s)
Device 0: "NVIDIA GeForce RTX 3050 Ti Laptop GPU"
CUDA Driver Version / Runtime Version 11.6 / 11.4
CUDA Capability Major/Minor version number: 8.6
Total amount of global memory: 4096 MBytes (4294443008 bytes)
(020) Multiprocessors, (128) CUDA Cores/MP: 2560 CUDA Cores
GPU Max Clock rate: 1035 MHz (1.03 GHz)
Memory Clock rate: 5501 Mhz
Memory Bus Width: 128-bit
L2 Cache Size: 2097152 bytes
Maximum Texture Dimension Size (x,y,z) 1D=(131072), 2D=(131072, 65536), 3D=(16384, 16384, 16384)
Maximum Layered 1D Texture Size, (num) layers 1D=(32768), 2048 layers
Maximum Layered 2D Texture Size, (num) layers 2D=(32768, 32768), 2048 layers
Total amount of constant memory: 65536 bytes
Total amount of shared memory per block: 49152 bytes
Total shared memory per multiprocessor: 102400 bytes
Total number of registers available per block: 65536
Warp size: 32
Maximum number of threads per multiprocessor: 1536
Maximum number of threads per block: 1024
Max dimension size of a thread block (x,y,z): (1024, 1024, 64)
Max dimension size of a grid size (x,y,z): (2147483647, 65535, 65535)
Maximum memory pitch: 2147483647 bytes
Texture alignment: 512 bytes
Concurrent copy and kernel execution: Yes with 1 copy engine(s)
Run time limit on kernels: Yes
Integrated GPU sharing Host Memory: No
Support host page-locked memory mapping: Yes
Alignment requirement for Surfaces: Yes
Device has ECC support: Disabled
Device supports Unified Addressing (UVA): Yes
Device supports Managed Memory: Yes
Device supports Compute Preemption: Yes
Supports Cooperative Kernel Launch: Yes
Supports MultiDevice Co-op Kernel Launch: No
Device PCI Domain ID / Bus ID / location ID: 0 / 1 / 0
Compute Mode:
< Default (multiple host threads can use ::cudaSetDevice() with device simultaneously) >
deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 11.6, CUDA Runtime Version = 11.4, NumDevs = 1
Result = PASS
可以正常檢測出卡,也可以正常運行。
再跑一個簡單的矩陣乘法:
root@0b09ee5e9284:~/code/cuda-samples/bin/x86_64/linux/release# ./matrixMul
[Matrix Multiply Using CUDA] - Starting...
GPU Device 0: "Ampere" with compute capability 8.6
MatrixA(320,320), MatrixB(640,320)
Computing result using CUDA Kernel...
done
Performance= 294.72 GFlop/s, Time= 0.445 msec, Size= 131072000 Ops, WorkgroupSize= 1024 threads/block
Checking computed result for correctness: Result = PASS
NOTE: The CUDA Samples are not meant for performance measurements. Results may vary when GPU Boost is enabled.
嗯,也沒毛病。
編譯tvm測試
簡單在WSL2下和在雙系統(tǒng)Ubuntu下進行編譯TVM測試,tvm版本用GITHUB上779dc51e1332f417fa4c304b595ce76891dfc33a這個commit進行測試,win端調(diào)整到rog的性能模式,Ubuntu系統(tǒng)沒有額外設(shè)置,cmake的設(shè)置相同,都使用ninja j8命令進行編譯。
WSL2和Ubuntu編譯TVM差30s,將近2%吧,相差不是很大。其實這個對比不是很標(biāo)準(zhǔn)哈,兩個系統(tǒng)的CPU最高頻率沒有統(tǒng)一,只是簡單測測吧~
搭配VSCODE
使用VSCODE開發(fā)已經(jīng)是很稀松平常的事兒了,VSCODE有個remote-SSH插件可以讓我們很方便地連接遠程服務(wù)器進行開發(fā),就和本地服務(wù)一樣。
同樣的,VSCODE中也有一個插件直接可以連接WSL2下的docker,在windows下docekr run之后,就可以在win下的vscode中找到這個docker容器:

執(zhí)行Attach Vscode之后就可以進入VSCODE的docker環(huán)境:

開發(fā)就和在Ubuntu下的VSCODE一模一樣,有root權(quán)限,可以裝插件,可以調(diào)試代碼,想干啥就干啥。
到目前為止WSL2在WIN11上的開發(fā)一切順利~
WIN11到底好不好用
剛拿到這個筆記本時是WIN10,也沒有升級WIN11的想法,不過因為在win10中使用WSL2比較麻煩,而WIN11自帶wsl2。于是乎就升級了一波WIN11。
整個升級過程比想象中順滑,在設(shè)置里頭點點點就可以直接升級,下載更新、重啟一氣呵成,重啟后就是新系統(tǒng)了,之前的所有軟件都能用。
據(jù)說WIN11相比WIN10在CPU調(diào)度會差一點,打游戲會比較影響。不過我感覺不出來,使用上比WIN10界面好看些,其他核心操作和WIN10相差不大,對于觸屏用戶更友好些。
令我比較驚喜的是WIN11自帶了類似MAC端付費應(yīng)用Paste的核心功能,Win+V可以直接展示最近的剪切板隨便選擇粘貼,圖片也是可以的。

遇到的問題
有一個比較坑的問題,本來win11+Ubuntu20.04雙系統(tǒng)用的好好的,突然有一天華碩讓升級bios(從407->408),當(dāng)時沒有什么想法就直接升級了。升級完直接傻眼,發(fā)現(xiàn)進不去ubuntu系統(tǒng)了,而win11系統(tǒng)沒啥問題。
以為是引導(dǎo)的問題,修改了半天grub引導(dǎo),通過u盤ubuntu安裝器fix-boot后也不行,試了種種方式都進不去,差點就要重裝了。
最后偶然在reddit上查了下貌似是408版本不兼容ubuntu-20.04,直接降級bios就好了。
相關(guān)問題鏈接:
https://www.reddit.com/r/FlowX13/comments/sskb3q/updating_bios_seems_to_have_broken_my_ubuntu/
華碩bios下載官網(wǎng):
https://www.asus.com/supportonly/ROG%20Flow%20X13%20GV301/HelpDesk_BIOS/!
使用lldb
用clang編譯后的文件想要在VSCODE中debug,需要下一個codeLLDB,然后json中配置:
{
"type": "lldb",
"request": "launch",
"name": "lldb launch",
"program": "/path/to/a.out",
},
就可以了~
3080拓展塢
因為幻13可以通過專用的PCIE拓展口連接自己的拓展塢顯卡,傳輸速率比雷電4要快不少,外接顯卡幾乎可以無損。于是在日亞上淘了個3080的顯卡塢,7300+800的稅,等了一個月終于到了。

首先這不是真正的桌面版RTX3080。這是rtx3070桌面版ga104核心的滿血版。多了一些cuda核心而已。因為功耗限制,實際上比桌面版3070還要慢,也就是略弱于桌面端3070。不過我買這個主要是看重其16G的顯存,真的很適合煉丹啊~

看大石頭的評測,這個3080顯卡塢在和幻13極限雙烤開增強模式,GPU可以跑到150w溫度82度,CPU可以跑到45W溫度95度,說實話這溫度有點高,如果自己平時使用的話還是建議調(diào)低點,畢竟這玩意兒比較嬌貴。

有一點肯定要清楚,這顯卡的性能和功耗是成正比的,不管是桌面級、筆記本還是嵌入式的顯卡,都是功耗越強性能越強。
另外,在WIN11端切換3080顯卡之后,重啟成Ubuntu直接就識別為3080了,爽。

桌面配置
借著這次嘮叨,順便說下咱們不常見的屏幕掛燈,一開始想到用掛燈的場景是墨水屏,因為墨水屏不會發(fā)光,在白天還好,但是晚上就沒法用了,雖然可以使用臺燈照著,但是光不均勻或者說照不全,比如這樣:

上面就是僅使用臺燈的樣子,上面的屏幕掛燈還沒有開,這樣辦公太難受了。
如果開了屏幕掛燈的話:

可以看到墨水屏被照亮了很多...另外桌面也照亮了,臺燈關(guān)了也無所謂,只有掛燈,看書沒有任何問題。
這個燈是明基的Screenbar Halo,話說都配這么貴的墨水屏顯示器了,不差一個掛燈了,之前用的小米的,感覺亮度有點不夠,索性就配了個比較好的掛燈了。相比小米肯定高級很多哈,亮度提升了不少,最高亮度需要大電流的輸出才行(1A有點勉強,1.5A-2A差不多),之前的小米就不用(因為沒有那么亮),我掛了個充電寶就沒任何問題了。
不過說實話貌似屏幕掛燈不是這么用的,人家是為了給你個環(huán)境光,照亮桌面,可以看書又不占地方,關(guān)鍵的是這個燈是非對稱的(咱也不懂),就是不會照到普通的屏幕上給你反光(普通的屏幕是會發(fā)光的,和我這個墨水屏還不一樣),但其實我是想讓這個掛燈照到我的屏幕上的(因為墨水屏不發(fā)光嘛),但是我正常使用掛燈(明基這個)就照不到屏幕,這個確實不錯,畢竟屏幕掛燈本應(yīng)該不照屏幕以防反光。然后我只能強行調(diào)整一下掛燈的方向,讓它盡量照我的屏幕,感覺有點為難人家。
我也拿普通屏幕試了試:

無論是上面的還是下面的屏幕都不反光,看的很清楚,簡直太棒了~看代碼打游戲啥的沒有任何問題,感覺普通屏幕,使用掛燈,讓周圍環(huán)境光充足起來,這樣眼睛就不會太容易疲勞了。
畢竟算是生產(chǎn)力了,屏幕掛燈用了就不會回去了。
這篇就講這么多吧,下一篇就還是大家熟悉的技術(shù)文了~
參考資料
https://docs.nvidia.com/cuda/wsl-user-guide/index.html https://zhuanlan.zhihu.com/p/455979556 https://www.codetd.com/fr/article/13628610 https://developer.nvidia.com/blog/leveling-up-cuda-performance-on-wsl2-with-new-enhancements/ https://l-zb.com/?id=49#
參考資料
白皮書: https://images.nvidia.cn/aem-dam/en-zz/Solutions/geforce/ampere/pdf/NVIDIA-ampere-GA102-GPU-Architecture-Whitepaper-V1.pdf
[2]ubuntu16.04下安裝NVIDIA(cuda)-gtx965m相關(guān)步驟以及問題: https://oldpan.me/archives/ubuntu16-04-nvidia-cuda-gtx965m
[3]ROG幻13安裝ubuntu20.04,解決各種驅(qū)動問題: https://zhuanlan.zhihu.com/p/455979556
[4]官方kernel: https://www.kernel.org/
[5]NVIDIA-docker: https://github.com/NVIDIA/nvidia-docker
整理不易,點贊三連↓
