習(xí)實戰(zhàn):從環(huán)境配置到模型訓(xùn)練全流程指南)
1. 從零開始的云端“煉丹”初體驗最近在折騰一些深度學(xué)習(xí)的項目本地那臺老舊的筆記本顯卡實在是力不從心跑個簡單的模型都得等上半天。相信很多剛開始接觸AI模型訓(xùn)練也就是圈內(nèi)人戲稱“煉丹”的朋友都遇到過類似的窘境。租用云服務(wù)器成了最直接的選擇而在眾多平臺里AutoDL以其相對清晰的界面和針對深度學(xué)習(xí)優(yōu)化的環(huán)境成為了不少入門者和研究者的首選。我第一次接觸AutoDL時感覺就像拿到了一臺超級計算機(jī)的臨時使用權(quán)興奮之余也有些無從下手鏡像怎么選數(shù)據(jù)怎么傳代碼怎么跑今天這篇日記就想把我這段時間在AutoDL上“踩坑”和“填坑”的經(jīng)歷梳理一下目標(biāo)不是面面俱到的官方文檔復(fù)述而是從一個實際使用者的角度分享那些讓云端“煉丹”過程更順暢的關(guān)鍵步驟和避坑心得。無論你是想跑通第一個Demo還是希望更高效地管理自己的云端實驗這些經(jīng)驗或許都能幫到你。2. 實例創(chuàng)建選對“爐灶”是成功的第一步登錄AutoDL控制臺創(chuàng)建實例是第一道關(guān)卡。這里面的門道直接決定了你后續(xù)“煉丹”的效率和成本。2.1 地域與機(jī)型選擇性價比與可用性的平衡AutoDL提供了多個地域和豐富的GPU機(jī)型。對于大多數(shù)實驗我的建議是優(yōu)先考慮顯卡型號其次看價格最后看地域。顯卡型號這是核心。如果你的代碼是基于PyTorch或TensorFlow的常見模型如ResNet, Transformer那么一張RTX 3090或RTX 4090已經(jīng)能應(yīng)對絕大多數(shù)場景。3090擁有24GB顯存對于大batch size或稍大的模型非常友好。4090性能更強(qiáng)但單價也更高。如果預(yù)算有限RTX 308010G/12G也是不錯的選擇。對于需要超大顯存的場景如訓(xùn)練LLaMA-7BA100/A800是終極選擇但價格不菲。一個基本原則選擇顯存略大于你預(yù)估模型峰值顯存占用的卡預(yù)留一些空間給數(shù)據(jù)加載和中間變量。地域不同地域的庫存和價格時有波動。通常華北-北京、華東-上海等區(qū)域機(jī)型較多。如果你的數(shù)據(jù)集存放在某個云存儲如阿里云OSS、騰訊云COS選擇同地域的AutoDL實例在內(nèi)網(wǎng)傳輸數(shù)據(jù)會快很多能省下可觀的數(shù)據(jù)上傳時間。鏡像選擇這是新手最容易踩坑的地方。AutoDL提供了非常豐富的“社區(qū)鏡像”這些是其他用戶配置好環(huán)境的系統(tǒng)快照。重要提示強(qiáng)烈建議新手直接使用AutoDL官方提供的、標(biāo)有“基礎(chǔ)鏡像”或“Pytorch”等明確框架標(biāo)簽的鏡像。例如“Miniconda PyTorch 1.11 CUDA 11.3”就是一個非常干凈、穩(wěn)定的起點。避免直接使用那些名稱花哨、集成了大量未知工具的“一站式”社區(qū)鏡像它們可能包含版本沖突、路徑錯誤等問題增加不必要的排查成本。創(chuàng)建實例時還可以設(shè)置“無卡模式開機(jī)”這樣可以在實例關(guān)閉后保留數(shù)據(jù)和環(huán)境僅系統(tǒng)盤下次開機(jī)時再選擇顯卡適合調(diào)試代碼階段能節(jié)省GPU租用費用。2.2 存儲配置系統(tǒng)盤與數(shù)據(jù)盤的分工實例的存儲分為系統(tǒng)盤和數(shù)據(jù)盤。系統(tǒng)盤默認(rèn)容量較小如50GB存放著你選擇的鏡像和系統(tǒng)環(huán)境。你后續(xù)通過pip或conda安裝的包默認(rèn)都會在這里。不建議在系統(tǒng)盤存放大型數(shù)據(jù)集或訓(xùn)練日志。數(shù)據(jù)盤這是你的“工作區(qū)”。我通常會掛載一個足夠大的數(shù)據(jù)盤如200GB或更多。數(shù)據(jù)盤是持久化存儲實例關(guān)機(jī)后數(shù)據(jù)依然保留。你的項目代碼、數(shù)據(jù)集、模型權(quán)重、輸出日志都應(yīng)該放在這里比如/root/autodl-tmp目錄下。創(chuàng)建實例時記得在“高級選項”中設(shè)置數(shù)據(jù)盤的大小。實例創(chuàng)建成功后你會獲得一個公網(wǎng)IP、登錄密碼或密鑰以及內(nèi)置的JupyterLab訪問地址。我們的“煉丹爐”就準(zhǔn)備就緒了。3. 環(huán)境配置與代碼部署打造專屬“丹房”拿到一臺全新的云服務(wù)器第一步不是直接跑代碼而是做好基礎(chǔ)配置這能讓后續(xù)工作事半功倍。3.1 基礎(chǔ)環(huán)境檢查與包管理通過SSH推薦使用Termius、MobaXterm或系統(tǒng)終端或控制臺提供的“快捷工具”登錄到實例。首先檢查一下基礎(chǔ)環(huán)境# 查看GPU狀態(tài) nvidia-smi # 查看Python和CUDA版本 python --version nvcc --version # 查看conda環(huán)境如果使用conda鏡像 conda info --envs通?;A(chǔ)鏡像已經(jīng)安裝了conda。我的習(xí)慣是為每個項目創(chuàng)建獨立的conda環(huán)境避免包版本沖突。# 創(chuàng)建一個名為my_project的新環(huán)境指定Python版本 conda create -n my_project python3.9 # 激活環(huán)境 conda activate my_project # 安裝項目所需的PyTorch注意與CUDA版本匹配 # 例如CUDA 11.3對應(yīng)的PyTorch安裝命令可以去PyTorch官網(wǎng)查找 pip install torch1.12.1cu113 torchvision0.13.1cu113 torchaudio0.12.1 --extra-index-url https://download.pytorch.org/whl/cu1133.2 數(shù)據(jù)傳輸從本地到云端的“藥材”搬運把本地代碼和數(shù)據(jù)傳到服務(wù)器有幾種常用方法AutoDL網(wǎng)盤推薦給新手和小文件控制臺提供了“AutoDL網(wǎng)盤”功能可以直接在網(wǎng)頁上傳文件有大小限制通常單個文件不超過5GB然后在實例中通過/root/autodl-nas路徑訪問。適合上傳代碼腳本、配置文件。SCP/SFTP命令在本地終端使用scp命令。# 將本地文件傳到服務(wù)器 scp -P 端口號 /本地/路徑/文件.zip root實例公網(wǎng)IP:/root/autodl-tmp/ # 將整個文件夾遞歸傳輸 scp -r -P 端口號 /本地/路徑/項目文件夾 root實例公網(wǎng)IP:/root/autodl-tmp/注意替換端口號通常為22和實例公網(wǎng)IP。Rsync增量同步高效如果數(shù)據(jù)需要多次同步rsync是更好的選擇它只傳輸變化的文件。rsync -avzP -e ssh -p 端口號 /本地/路徑/項目文件夾/ root實例公網(wǎng)IP:/root/autodl-tmp/項目文件夾/云存儲直連如果數(shù)據(jù)集原本就在阿里云OSS或百度網(wǎng)盤AutoDL控制臺也提供了直接拉取的工具速度往往更快。個人心得對于超過10GB的大型數(shù)據(jù)集我強(qiáng)烈建議先將其壓縮如tar.gz格式傳輸后再在服務(wù)器端解壓。這通常比傳輸大量小文件快得多也更穩(wěn)定。解壓命令tar -xzvf dataset.tar.gz -C /目標(biāo)路徑。3.3 集成開發(fā)環(huán)境PyCharm遠(yuǎn)程連接在本地用熟悉的IDE如PyCharm Professional版進(jìn)行遠(yuǎn)程開發(fā)和調(diào)試體驗遠(yuǎn)優(yōu)于在終端里用vim編輯。配置PyCharm遠(yuǎn)程連接AutoDL服務(wù)器并不復(fù)雜在PyCharm中打開File - Settings - Build, Execution, Deployment - Deployment。點擊添加一個SFTP類型的部署配置。在Connection標(biāo)簽頁SFTP host: 填入你的實例公網(wǎng)IP。Port: 22。Root path: 設(shè)置為你的項目在服務(wù)器上的路徑如/root/autodl-tmp/my_project。Auth type: 選擇Password或Key pair如果配置了密鑰。在Mappings標(biāo)簽頁設(shè)置本地項目路徑與服務(wù)器部署路徑的對應(yīng)關(guān)系。更關(guān)鍵的一步是配置遠(yuǎn)程Python解釋器File - Settings - Project - Python Interpreter點擊齒輪圖標(biāo)選擇Add選擇SSH Interpreter服務(wù)器信息同上解釋器路徑填寫你conda環(huán)境中的python路徑例如/root/miniconda3/envs/my_project/bin/python。配置成功后你可以在本地PyCharm中編寫代碼執(zhí)行時會自動在遠(yuǎn)程服務(wù)器運行并能實時看到輸出。調(diào)試Debug功能也可以正常使用這對于排查復(fù)雜Bug至關(guān)重要。4. 模型訓(xùn)練實戰(zhàn)與監(jiān)控掌控“火候”環(huán)境就緒代碼和數(shù)據(jù)到位終于可以開始訓(xùn)練了。這里有幾個關(guān)鍵操作和注意事項。4.1 在后臺運行訓(xùn)練任務(wù)在SSH終端直接運行Python腳本一旦關(guān)閉終端進(jìn)程就會終止。我們需要讓訓(xùn)練任務(wù)在后臺持續(xù)運行。使用nohup最簡單nohup python train.py train.log 21 這條命令的意思是忽略掛斷信號(nohup)運行train.py將標(biāo)準(zhǔn)輸出()和標(biāo)準(zhǔn)錯誤(21)都重定向到train.log文件并在后臺()運行。你可以隨時用tail -f train.log來查看最新的日志輸出。使用tmux或screen更強(qiáng)大它們可以創(chuàng)建獨立的會話即使斷開SSH連接會話仍在服務(wù)器上運行。以后重新連接時可以恢復(fù)會話。# 安裝tmux (如果未安裝) apt-get update apt-get install tmux -y # 新建一個名為“train”的會話 tmux new -s train # 在tmux會話中啟動訓(xùn)練 python train.py # 按下 Ctrlb然后按 d可以脫離(detach)當(dāng)前會話訓(xùn)練在后臺繼續(xù) # 重新連接時使用以下命令恢復(fù)會話 tmux attach -t train4.2 資源監(jiān)控與成本控制訓(xùn)練過程中要時刻關(guān)注資源使用情況避免不必要的浪費。監(jiān)控GPU和顯存除了nvidia-smi可以使用更動態(tài)的工具gpustatpip install gpustat它提供更簡潔的實時信息。監(jiān)控磁盤空間定期使用df -h查看磁盤使用情況特別是數(shù)據(jù)盤防止日志或中間文件撐滿磁盤導(dǎo)致訓(xùn)練崩潰。成本控制技巧無卡調(diào)試代碼邏輯、數(shù)據(jù)加載部分的調(diào)試完全可以開啟“無卡模式”進(jìn)行按小時費用極低。定時關(guān)機(jī)在控制臺可以設(shè)置“定時關(guān)機(jī)”比如預(yù)估訓(xùn)練需要20小時可以設(shè)置24小時后自動關(guān)機(jī)防止忘記關(guān)機(jī)產(chǎn)生額外費用。競價實例對于非緊急、可中斷的任務(wù)如超參數(shù)搜索可以嘗試“競價實例”價格通常是按量計費的1/3到1/2但有被系統(tǒng)回收的風(fēng)險需要做好模型定期保存checkpoint的邏輯。關(guān)注活動AutoDL時常有充值優(yōu)惠、代金券等活動可以適當(dāng)關(guān)注。4.3 模型與日志的保存策略訓(xùn)練過程中的模型檢查點checkpoint和日志文件是寶貴的產(chǎn)出必須妥善保存。保存路徑一定要保存在持久化的數(shù)據(jù)盤如/root/autodl-tmp/checkpoints下而不是系統(tǒng)盤。保存頻率與策略不要每個epoch都保存可以根據(jù)驗證集性能只保存效果更好的模型。同時定期保存最新的幾個檢查點即可舊的可以刪除節(jié)省空間。日志記錄使用TensorBoard或WandB等工具記錄損失、準(zhǔn)確率、學(xué)習(xí)率等曲線比單純看文本日志直觀得多。安裝tensorboard后在代碼中配置好日志目錄在服務(wù)器啟動tensorboard --logdir./runs --port6006然后在本地瀏覽器通過http://實例公網(wǎng)IP:6006即可訪問可視化界面。5. 常見問題排查與性能優(yōu)化在實際操作中總會遇到一些“坑”。這里列舉幾個典型問題及其解決思路。5.1 環(huán)境依賴問題包版本沖突這是最常見的問題。表現(xiàn)為ImportError或運行時出現(xiàn)詭異錯誤。預(yù)防堅持使用conda虛擬環(huán)境并為每個項目維護(hù)一個requirements.txt文件。# 生成當(dāng)前環(huán)境的依賴列表 pip freeze requirements.txt # 在新環(huán)境中安裝 pip install -r requirements.txt排查首先確認(rèn)激活了正確的conda環(huán)境。然后使用conda list或pip list檢查關(guān)鍵包如torch, torchvision, numpy的版本是否與代碼要求一致。AutoDL社區(qū)鏡像的詳情頁有時會寫明預(yù)裝版本可供參考。解決嘗試在干凈的虛擬環(huán)境中嚴(yán)格按照項目文檔或代碼注釋中的版本要求重新安裝。對于復(fù)雜的沖突可以嘗試使用conda而非pip來安裝某些包因為conda能更好地處理依賴關(guān)系。5.2 顯存溢出CUDA Out Of Memory看到這個錯誤意味著GPU顯存不夠用了。診斷運行nvidia-smi觀察是哪個進(jìn)程占用了大量顯存。有時不僅是你的訓(xùn)練腳本殘留的Python進(jìn)程也可能占用顯存。用kill -9 PID結(jié)束無用進(jìn)程。優(yōu)化減小batch size這是最直接有效的方法。使用梯度累積Gradient Accumulation如果受限于顯存無法增大batch size可以通過多次前向傳播累積梯度再一次性更新參數(shù)來模擬大batch size的效果。檢查模型和數(shù)據(jù)是否有不必要的張量被長期引用數(shù)據(jù)加載時是否一次性加載了全部數(shù)據(jù)使用torch.cuda.empty_cache()可以主動清空PyTorch的緩存但治標(biāo)不治本?;旌暇扔?xùn)練使用torch.cuda.amp進(jìn)行自動混合精度訓(xùn)練可以顯著減少顯存占用并加速訓(xùn)練。梯度檢查點Gradient Checkpointing對于極其龐大的模型如Transformer這是一種用計算時間換顯存的技術(shù)。5.3 訓(xùn)練速度慢于預(yù)期如果GPU利用率nvidia-smi中的Volatile GPU-Util長期很低如低于30%說明訓(xùn)練瓶頸可能不在GPU計算上。數(shù)據(jù)加載瓶頸這是最常見的原因。檢查數(shù)據(jù)加載器DataLoader的配置。增加num_workers如設(shè)置為CPU核心數(shù)使用pin_memoryTrue當(dāng)數(shù)據(jù)從CPU到GPU傳輸時加速將數(shù)據(jù)預(yù)處理盡可能放在__getitem__方法中簡化。I/O瓶頸如果數(shù)據(jù)集是大量小文件磁盤讀取可能成為瓶頸??紤]將數(shù)據(jù)集預(yù)處理成更少、更大的文件如TFRecord或HDF5格式。CPU瓶頸復(fù)雜的在線數(shù)據(jù)增強(qiáng)如隨機(jī)裁剪、顏色抖動可能消耗大量CPU資源導(dǎo)致GPU等數(shù)據(jù)。可以嘗試簡化增強(qiáng)邏輯或使用更高效的處理庫如albumentations。5.4 連接中斷與任務(wù)恢復(fù)網(wǎng)絡(luò)不穩(wěn)定導(dǎo)致SSH斷開或者不小心關(guān)閉了終端訓(xùn)練任務(wù)可能中斷。預(yù)防如前所述務(wù)必使用nohup、tmux或screen來運行任務(wù)?;謴?fù)如果任務(wù)意外終止一個好的訓(xùn)練腳本應(yīng)該具備從最近檢查點恢復(fù)訓(xùn)練的能力。這通常通過在代碼中讀取命令行參數(shù)--resume-from checkpoint.pth并正確加載優(yōu)化器狀態(tài)、學(xué)習(xí)率調(diào)度器狀態(tài)等來實現(xiàn)。確保你的訓(xùn)練循環(huán)有這個邏輯。AutoDL實例中斷如果是競價實例被回收或者按量實例因欠費停機(jī)任務(wù)自然終止。此時能依賴的只有你保存在數(shù)據(jù)盤上的檢查點和日志。重新開機(jī)后手動執(zhí)行恢復(fù)訓(xùn)練的命令。云端“煉丹”是一個從陌生到熟悉的過程核心在于理解云服務(wù)的特性按需使用、環(huán)境隔離、遠(yuǎn)程操作并將其與深度學(xué)習(xí)工作流相結(jié)合。AutoDL這樣的平臺降低了硬件門檻但把環(huán)境配置、數(shù)據(jù)管理和任務(wù)運維的復(fù)雜度轉(zhuǎn)移給了使用者。我的體會是花時間建立一套自己熟悉、可復(fù)現(xiàn)的云端工作流模板包括環(huán)境配置腳本、數(shù)據(jù)傳輸方法、訓(xùn)練啟動命令和監(jiān)控手段其長期回報遠(yuǎn)高于每次手動折騰。剛開始可能會覺得步驟繁瑣但一旦流程跑通后續(xù)的實驗迭代就會變得非常高效。最后一個小建議善用AutoDL提供的“自定義鏡像”功能當(dāng)你配好一個完美的環(huán)境后可以將其保存為私有鏡像下次創(chuàng)建實例時直接選用一鍵復(fù)現(xiàn)所有環(huán)境這才是真正的“煉丹”自由。