據(jù)到接口:ModelArts上跑通圖像分類訓(xùn)練與部署全流程)
上周接了一個(gè)圖像分類的小活兒目標(biāo)是把生產(chǎn)線上相機(jī)采集的零件照片按缺陷分成“OK”“劃痕”“凹陷”三類。數(shù)據(jù)量不大大概四千來(lái)張圖但我本地那臺(tái)機(jī)器的顯卡剛好被其他任務(wù)占滿排期直接排到了下個(gè)月。當(dāng)時(shí)正好在調(diào)研云上的AI開發(fā)平臺(tái)索性就把“基于 ModelArts 完成模型訓(xùn)練與部署”這條路完整走了一遍。整個(gè)過(guò)程從數(shù)據(jù)整理到訓(xùn)練作業(yè)跑通再到把模型發(fā)布成線上接口中間踩了不少坑也理順了不少思路。這篇文章不打算復(fù)讀官方文檔就把我實(shí)際操作過(guò)的流程、參數(shù)、報(bào)錯(cuò)和解決辦法整理出來(lái)給想用這類云上平臺(tái)做訓(xùn)練和部署的朋友一個(gè)參考。1. 整體流程與設(shè)計(jì)思路從本地到云端的遷移邏輯1.1 一次模型上云的完整鏈路很多人剛開始接觸這類平臺(tái)時(shí)會(huì)有點(diǎn)懵我本地明明有 Python 環(huán)境、有 PyTorch、有自己的訓(xùn)練腳本為什么還要跑到云端折騰一遍其實(shí)完整鏈路并不復(fù)雜拆開看就是五步數(shù)據(jù)準(zhǔn)備 → 數(shù)據(jù)上傳 → 訓(xùn)練作業(yè) → 模型管理 → 部署上線第一步把訓(xùn)練集、驗(yàn)證集按格式整理好同時(shí)把標(biāo)注信息梳理成平臺(tái)認(rèn)識(shí)的格式。第二步把數(shù)據(jù)集上傳到對(duì)象存儲(chǔ)服務(wù)也就是 OBS 桶里。第三步在訓(xùn)練作業(yè)里指定算法、數(shù)據(jù)路徑、輸出路徑和計(jì)算規(guī)格提交后等待訓(xùn)練。第四步訓(xùn)練完成后生成的模型文件會(huì)保存到 OBS 指定目錄平臺(tái)會(huì)自動(dòng)將其注冊(cè)為模型版本。第五步部署成在線服務(wù)平臺(tái)會(huì)給一個(gè)可調(diào)用的推理接口之后業(yè)務(wù)系統(tǒng)直接發(fā)請(qǐng)求就行。鏈路本身不復(fù)雜復(fù)雜的是每一步里隱藏的細(xì)節(jié)。比如 OBS 路徑怎么填、數(shù)據(jù)集目錄結(jié)構(gòu)怎么設(shè)計(jì)、訓(xùn)練腳本要不要改造、推理代碼要按什么規(guī)范寫、端口該暴露哪個(gè)這些都會(huì)直接影響能否順利跑通。1.2 為什么我選擇 ModelArts 來(lái)跑訓(xùn)練任務(wù)選擇這個(gè)平臺(tái)的原因核心就兩個(gè)字省事。本地訓(xùn)練一個(gè)模型先得有個(gè)像樣的顯卡環(huán)境裝驅(qū)動(dòng)、裝 CUDA、裝框架版本這些就能折騰半天。更麻煩的是多人共用機(jī)器時(shí)的資源分配排期不可控環(huán)境隔離也不好做。而 ModelArts 這類平臺(tái)把算力包裝成“提交作業(yè)即可使用”的形式我只需要選好規(guī)格尺寸點(diǎn)提交平臺(tái)自動(dòng)分配資源訓(xùn)練完自動(dòng)回收按用量計(jì)費(fèi)。不需要維護(hù)任何物理機(jī)器也不擔(dān)心別人把我環(huán)境搞壞。還有一點(diǎn)是它的幾步流程是打通的。數(shù)據(jù)存在 OBS訓(xùn)練作業(yè)直接引用 OBS 路徑輸出模型再傳回 OBS部署時(shí)也通過(guò) OBS 路徑讀取模型。不需要自己寫復(fù)雜的下載、上傳腳本。這一點(diǎn)對(duì)我來(lái)說(shuō)特別順手因?yàn)閳F(tuán)隊(duì)里有人之前把時(shí)間花在折騰各個(gè)環(huán)境銜接上用這種平臺(tái)后這部分基本為零。當(dāng)然事務(wù)都有另一面。平臺(tái)雖然封裝了流程但也要求按它的規(guī)范來(lái)組織代碼和數(shù)據(jù)。如果你完全不管規(guī)范用本地習(xí)慣隨便扔個(gè)目錄上去訓(xùn)練作業(yè)很容易報(bào)“數(shù)據(jù)集路徑不存在”或者“模型文件找不到”這類問(wèn)題。所以這套思路本質(zhì)上是用一部分自定義自由度換來(lái)了環(huán)境管理和算力編排的便利。1.3 前期規(guī)劃算力需求評(píng)估與成本控制別上來(lái)就選最大規(guī)格的機(jī)器跑。我自己吃過(guò)這個(gè)虧第一次跑一個(gè)很小的模型選了高性能 GPU 規(guī)格結(jié)果不到一個(gè)小時(shí)就訓(xùn)練完了費(fèi)用卻花了不少。建議先根據(jù)數(shù)據(jù)量、模型復(fù)雜度、訓(xùn)練輪數(shù)估算一下再選規(guī)格。簡(jiǎn)單的經(jīng)驗(yàn)圖片數(shù)據(jù)量在萬(wàn)張以內(nèi)、模型是 ResNet 這種常規(guī)分類網(wǎng)絡(luò)、訓(xùn)練幾十輪的話選入門級(jí) GPU 規(guī)格基本夠用數(shù)據(jù)量超過(guò)幾萬(wàn)張或者模型比較大再考慮更高檔的規(guī)格。另外訓(xùn)練作業(yè)一般支持設(shè)置最大運(yùn)行時(shí)長(zhǎng)建議填一個(gè)合理上限比如 2 小時(shí)防止因?yàn)楫惓?ㄗ《掷m(xù)計(jì)費(fèi)。費(fèi)用方面也可以提前開好預(yù)算提醒超出閾值自動(dòng)告警。這些配置看起來(lái)不起眼但對(duì)成本控制幫助很大。2. 數(shù)據(jù)準(zhǔn)備把數(shù)據(jù)集搬進(jìn)云端要先過(guò)這幾關(guān)2.1 數(shù)據(jù)集組織與 OBS 目錄設(shè)計(jì)很多人在本地訓(xùn)練時(shí)習(xí)慣把所有圖片放在一個(gè)大文件夾里然后在代碼里寫死路徑隨機(jī)切分訓(xùn)練驗(yàn)證。這套邏輯在云上并不合適。平臺(tái)層面更希望看到清晰的數(shù)據(jù)集目錄因?yàn)楹罄m(xù)的模型版本、數(shù)據(jù)集版本管理都依賴結(jié)構(gòu)化的路徑。我這次采用的結(jié)構(gòu)是obs://my-demo-bucket/dataset/ ├── train/ │ ├── ok/ │ ├── scratch/ │ └── dent/ ├── val/ │ ├── ok/ │ ├── scratch/ │ └── dent/ └── labels.txttrain 和 val 分別放訓(xùn)練集、驗(yàn)證集子目錄名稱就是類別名。labels.txt 里按順序?qū)戭悇e名稱一行一個(gè)。這么組織的邏輯在于不管是用平臺(tái)自帶的圖像分類算法還是自己寫 PyTorch 腳本用 ImageFolder 讀取都能直接被識(shí)別。驗(yàn)證集單獨(dú)搞出來(lái)可以避免訓(xùn)練腳本里做隨機(jī)切分帶來(lái)的不確定性也讓每次實(shí)驗(yàn)的可比性更強(qiáng)。OBS 桶名是我的踩坑點(diǎn)之一。有些字符平臺(tái)不支持筒名必須全小寫而且不能有下劃線。我一開始建了一個(gè)帶下劃線的桶名創(chuàng)建時(shí)提示不合法換了好幾個(gè)名字才了解規(guī)則。建議桶名盡量用“短橫線數(shù)字”的格式比如 my-demo-bucket 就很穩(wěn)。2.2 數(shù)據(jù)上傳與校驗(yàn)數(shù)據(jù)上傳方式有兩種控制臺(tái)點(diǎn)擊上傳和命令行工具。數(shù)據(jù)量小、幾百?gòu)垐D的話控制臺(tái)直接傳問(wèn)題不大到了幾千張以上我還是推薦 obsutil 工具支持批量、斷點(diǎn)續(xù)傳速度穩(wěn)定很多。我用的命令是obsutil cp ./dataset obs://my-demo-bucket/dataset -r -f-r 表示遞歸上傳目錄-f 表示強(qiáng)制覆蓋同名文件。上傳完成后盡量做一次校驗(yàn)我通常是再把目錄列表拉出來(lái)看看obsutil ls obs://my-demo-bucket/dataset/ -r這一步別看簡(jiǎn)單真能發(fā)現(xiàn)不少問(wèn)題。比如本地某個(gè)子目錄是空的同步過(guò)程中被忽略或者某些文件傳一半失敗。做過(guò)一次校驗(yàn)之后后面訓(xùn)練作業(yè)報(bào)“圖片解碼失敗”的概率會(huì)低很多。還有一個(gè)容易被忽視的細(xì)節(jié)上傳前先把文件命名統(tǒng)一好不要有中文名、空格和特殊符號(hào)否則后期加載圖片時(shí)很容易出現(xiàn)奇奇怪怪的編碼報(bào)錯(cuò)。2.3 標(biāo)注策略自動(dòng)標(biāo)注與人工修正如果數(shù)據(jù)集沒(méi)有現(xiàn)成標(biāo)簽平臺(tái)自帶的數(shù)據(jù)標(biāo)注功能可以把標(biāo)注環(huán)節(jié)放在云端來(lái)做。先按類別創(chuàng)建標(biāo)簽然后借助預(yù)置模型做自動(dòng)標(biāo)注它會(huì)先跑一輪預(yù)測(cè)把“疑似”標(biāo)簽打上再人工過(guò)一遍修正。我實(shí)測(cè)下來(lái)對(duì)缺陷檢測(cè)這類場(chǎng)景自動(dòng)標(biāo)注的準(zhǔn)確率大約七成左右剩下的主要靠人工檢查邊緣樣本。不要完全相信自動(dòng)標(biāo)注的結(jié)果尤其是類別之間邊界模糊的樣本比如“輕微劃痕”和“OK”之間必須人工把關(guān)。我第一次圖省事直接用了自動(dòng)標(biāo)注結(jié)果訓(xùn)練驗(yàn)證集精度慘不忍睹回頭檢查是大量標(biāo)簽標(biāo)錯(cuò)了。后來(lái)重新標(biāo)注了一次同樣的訓(xùn)練參數(shù)精度直接提升了好幾個(gè)百分點(diǎn)。3. 訓(xùn)練作業(yè)配置從創(chuàng)建到跑通的關(guān)鍵參數(shù)3.1 三種訓(xùn)練方式怎么選ModelArts 里訓(xùn)練方式大概分三類自動(dòng)學(xué)習(xí)、預(yù)置算法、自定義訓(xùn)練。它們適合不同背景的人。自動(dòng)學(xué)習(xí)適合對(duì)算法不熟、只想快速驗(yàn)證效果的用戶平臺(tái)會(huì)自動(dòng)調(diào)參、自動(dòng)訓(xùn)練幾乎不用寫代碼。缺點(diǎn)是靈活性低想改網(wǎng)絡(luò)結(jié)構(gòu)或損失函數(shù)基本沒(méi)門。預(yù)置算法適合熟悉常規(guī)流程但懶得寫完整代碼的人平臺(tái)已經(jīng)準(zhǔn)備好訓(xùn)練腳本填好數(shù)據(jù)路徑和超參數(shù)就能跑。自定義訓(xùn)練自由度最高可以帶上自己的訓(xùn)練腳本、指定鏡像、完全控制訓(xùn)練邏輯適合想把已有本地訓(xùn)練項(xiàng)目遷移上云的人。我自己這次選的是自定義訓(xùn)練原因很簡(jiǎn)單預(yù)置算法不一定完全匹配我的數(shù)據(jù)處理邏輯我本地已經(jīng)有一套成熟的 PyTorch 訓(xùn)練腳本遷移成本更低。如果你沒(méi)有特殊需求只是想快速出一個(gè)模型先看看效果建議直接從自動(dòng)學(xué)習(xí)或預(yù)置算法開始沒(méi)必要上來(lái)就啃自定義流程。3.2 創(chuàng)建自定義訓(xùn)練作業(yè)的關(guān)鍵參數(shù)創(chuàng)建訓(xùn)練作業(yè)時(shí)核心要配置這么幾塊內(nèi)容數(shù)據(jù)來(lái)源、訓(xùn)練輸出路徑、算法來(lái)源、計(jì)算規(guī)格、超參數(shù)。數(shù)據(jù)來(lái)源填 OBS 路徑注意要定位到數(shù)據(jù)集根目錄。訓(xùn)練輸出路徑是模型文件的保存目錄平臺(tái)會(huì)把訓(xùn)練任務(wù)產(chǎn)生的文件自動(dòng)上傳到這里。算法來(lái)源如果選自定義需要指定代碼包所在的 OBS 路徑或者使用平臺(tái)提供的公共鏡像加自己的訓(xùn)練腳本。我這次使用的是 PyTorch 環(huán)境訓(xùn)練腳本入口文件是 train.py。代碼里有一點(diǎn)必須處理到位數(shù)據(jù)加載路徑。本地訓(xùn)練時(shí)我寫的是相對(duì)路徑 ./data到云端后數(shù)據(jù)其實(shí)在 OBS平臺(tái)不會(huì)自動(dòng)把它下載到訓(xùn)練容器的本地目錄需要在腳本里通過(guò)工具把數(shù)據(jù)從 OBS 拷貝到容器的 /cache 目錄。常規(guī)寫法是import os import moxing as mox mox.file.copy_parallel(obs://my-demo-bucket/dataset, /cache/dataset)然后在訓(xùn)練腳本里把數(shù)據(jù)集路徑指向 /cache/dataset。這個(gè)步驟很多人都漏了結(jié)果一提交訓(xùn)練作業(yè)就報(bào)找不到文件。超參數(shù)的設(shè)置同樣有講究。我初始用學(xué)習(xí)率 0.001、batch size 64、訓(xùn)練 50 輪。訓(xùn)練幾輪后發(fā)現(xiàn)驗(yàn)證集 loss 下降很慢就把學(xué)習(xí)率調(diào)成 0.0001配合一個(gè)簡(jiǎn)單的余弦退火策略效果立刻好轉(zhuǎn)。這里建議先把 batch size 設(shè)小一點(diǎn)跑通流程確認(rèn)數(shù)據(jù)加載、標(biāo)簽讀取都沒(méi)問(wèn)題再調(diào)大 batch size 和訓(xùn)練輪數(shù)。3.3 日志監(jiān)控與訓(xùn)練調(diào)優(yōu)訓(xùn)練作業(yè)提交后控制臺(tái)可以看到實(shí)時(shí)日志。這個(gè)日志是排查問(wèn)題的第一現(xiàn)場(chǎng)建議先確認(rèn)幾件事日志是否正常打印了數(shù)據(jù)集加載信息、每個(gè) epoch 是否按預(yù)期輸出 loss、驗(yàn)證集指標(biāo)是否在合理區(qū)間。我在訓(xùn)練過(guò)程中遇到過(guò)一個(gè)問(wèn)題前兩個(gè) epoch loss 在降到第三個(gè) epoch 突然變成 nan。排查下來(lái)是數(shù)據(jù)集里有個(gè)別圖片的像素值異常導(dǎo)致計(jì)算出現(xiàn)數(shù)值溢出。解決方式是在數(shù)據(jù)加載時(shí)做歸一化并把異常像素值截?cái)嗟胶侠矸秶_@個(gè)坑如果沒(méi)有看日志根本不會(huì)想到。訓(xùn)練調(diào)優(yōu)層面我最常用的是“先小后大”策略先用小數(shù)據(jù)集、小模型、少輪數(shù)快速驗(yàn)證流程是否通暢再逐步擴(kuò)大數(shù)據(jù)規(guī)模和訓(xùn)練輪數(shù)。用平臺(tái)訓(xùn)練有一個(gè)好處是每次實(shí)驗(yàn)都會(huì)生成一條記錄日志和指標(biāo)可以翻回去對(duì)比這點(diǎn)比本地訓(xùn)練零散記錄方便很多。但要注意平臺(tái)日志有保留期限關(guān)鍵實(shí)驗(yàn)最好自己下載日志到本地存檔免得過(guò)了一段時(shí)間想對(duì)比就找不到了。4. 模型部署上線把訓(xùn)練成果變成一個(gè)可調(diào)用的接口4.1 模型注冊(cè)與版本管理訓(xùn)練完成后模型文件會(huì)輸出到指定的 OBS 路徑。此時(shí)需要在模型管理模塊注冊(cè)一個(gè)“模型”把 OBS 路徑和推理腳本綁定起來(lái)。平臺(tái)支持一個(gè)模型下創(chuàng)建多個(gè)版本每次重新訓(xùn)練生成的新模型都可以存為新的版本號(hào)這對(duì)線上迭代非常友好。我建議從一開始就養(yǎng)成給每個(gè)版本打標(biāo)簽的習(xí)慣。版本號(hào)寫清楚是第幾版、訓(xùn)練數(shù)據(jù)范圍、精度指標(biāo)。平臺(tái)雖然支持模型描述字段但很多人不填等到線上服務(wù)出問(wèn)題時(shí)才發(fā)現(xiàn)不知道當(dāng)前跑的是哪個(gè)版本排查起來(lái)非常痛苦。模型注冊(cè)時(shí)要上傳推理代碼。這里特別注意推理代碼不是獨(dú)立的 Python 腳本隨便放就行平臺(tái)對(duì)推理代碼的組織結(jié)構(gòu)有約定。常規(guī)做法是把模型文件和推理代碼打包成一個(gè)目錄上傳到 OBS 后注冊(cè)時(shí)指定到目錄路徑。推理代碼里需要實(shí)現(xiàn)模型加載和預(yù)測(cè)兩個(gè)核心函數(shù)平臺(tái)在調(diào)用時(shí)會(huì)加載你指定的模型文件把請(qǐng)求數(shù)據(jù)傳進(jìn)來(lái)拿到結(jié)果后再返回。4.2 創(chuàng)建在線推理服務(wù)模型注冊(cè)完成后進(jìn)入部署環(huán)節(jié)。這里要?jiǎng)?chuàng)建“在線服務(wù)”選擇一個(gè)運(yùn)行規(guī)格CPU 或 GPU、實(shí)例數(shù)然后關(guān)聯(lián)已注冊(cè)的模型。平臺(tái)會(huì)自動(dòng)拉起一個(gè) HTTP 服務(wù)提供一個(gè)推理請(qǐng)求地址。我記得第一次部署時(shí)創(chuàng)建服務(wù)倒是很快但服務(wù)狀態(tài)一直顯示“異?!薄|c(diǎn)擊查看日志發(fā)現(xiàn)是推理代碼里缺少一個(gè)依賴庫(kù)。平臺(tái)不是默認(rèn)帶上所有 Python 第三方庫(kù)的需要在模型包中附帶 requirements.txt 文件說(shuō)明依賴。加上文件后重新部署服務(wù)才穩(wěn)定運(yùn)行起來(lái)。另一個(gè)關(guān)鍵點(diǎn)是端口配置。平臺(tái)在線服務(wù)默認(rèn)對(duì)外暴露的端口是 8080如果你的推理框架用的是其他端口比如 8000要么改代碼綁定到 8080要么在部署配置里把端口映射調(diào)整過(guò)來(lái)。我一開始選的模型服務(wù)框架默認(rèn)監(jiān)聽(tīng)端口不是 8080導(dǎo)致健康檢查不過(guò)花了不少時(shí)間才定位到原因。4.3 服務(wù)測(cè)試與安全加固部署完成后先用控制臺(tái)自帶的測(cè)試功能發(fā)一條請(qǐng)求驗(yàn)證基礎(chǔ)流程。我一般的做法是準(zhǔn)備一張典型的測(cè)試圖片轉(zhuǎn)成 base64 字符串或直接上傳文件看返回的預(yù)測(cè)結(jié)果是否準(zhǔn)確。請(qǐng)求格式一般是 JSON{ images: base64編碼的圖片數(shù)據(jù) }返回結(jié)果是類別和置信度{ result: [ { category: scratch, confidence: 0.97 } ] }測(cè)試通過(guò)后建議再看一下服務(wù)日志確認(rèn)沒(méi)有異常。同時(shí)對(duì)正式環(huán)境做以下幾件事開啟訪問(wèn)鑒權(quán)給推理接口加上認(rèn)證信息防止未授權(quán)調(diào)用配置最小實(shí)例數(shù)如果業(yè)務(wù)量波動(dòng)大可以結(jié)合自動(dòng)伸縮策略調(diào)整實(shí)例數(shù)但要清楚自動(dòng)伸縮有延遲核心場(chǎng)景還是建議保底一個(gè)實(shí)例。我這次部署時(shí)開了鑒權(quán)但初期測(cè)試沒(méi)帶上認(rèn)證信息結(jié)果一直收到 401 錯(cuò)誤。我當(dāng)時(shí)還以為是服務(wù)地址填錯(cuò)了排查半天才發(fā)現(xiàn)是認(rèn)證沒(méi)通過(guò)。因此測(cè)試階段就要把認(rèn)證信息準(zhǔn)備好放到請(qǐng)求頭里避免反復(fù)返工。5. 高頻報(bào)錯(cuò)排查我踩過(guò)的坑和解決方法5.1 訓(xùn)練階段高頻報(bào)錯(cuò)報(bào)錯(cuò)現(xiàn)象可能原因解決思路數(shù)據(jù)集路徑不存在OBS 路徑填錯(cuò)或者數(shù)據(jù)沒(méi)有傳到指定目錄先通過(guò) OBS 工具確認(rèn)路徑再檢查桶名和目錄層級(jí)圖片解碼失敗數(shù)據(jù)集中混入損壞圖片預(yù)處理腳本掃描全部圖片剔除損壞文件CUDA 內(nèi)存不足batch size 偏大或規(guī)格類型資源不足調(diào)小 batch size或增大計(jì)算資源規(guī)格loss 為 nan輸入數(shù)據(jù)含異常值或?qū)W習(xí)率過(guò)大檢查數(shù)據(jù)歸一化調(diào)低學(xué)習(xí)率打印輸入統(tǒng)計(jì)信息模型無(wú)法保存輸出目錄不存在或沒(méi)有寫權(quán)限確認(rèn)訓(xùn)練輸出路徑已創(chuàng)建檢查權(quán)限設(shè)置最讓我頭疼的是“圖片解碼失敗”因?yàn)閳?bào)錯(cuò)不會(huì)直接指出是哪一張圖片。后來(lái)我在數(shù)據(jù)準(zhǔn)備腳本里加了一個(gè)校驗(yàn)邏輯用圖像處理庫(kù)逐張檢查把所有無(wú)法正常打開的圖片輸出到單獨(dú)列表并移除之后訓(xùn)練就暢通了。這個(gè)過(guò)程建議放到上線前的數(shù)據(jù)校驗(yàn)環(huán)節(jié)別等訓(xùn)練起來(lái)再處理。5.2 部署階段高頻報(bào)錯(cuò)部署階段的問(wèn)題和訓(xùn)練階段完全不同大多數(shù)集中在模型加載、端口、依賴這三個(gè)層面。模型加載失敗是最常見(jiàn)的。原因往往是推理代碼里模型路徑寫錯(cuò)或者模型文件的文件名和代碼里寫的不一致。平臺(tái)會(huì)把模型文件掛載到容器內(nèi)的指定目錄并會(huì)通過(guò)環(huán)境變量注入模型路徑我在代碼里優(yōu)先讀取該環(huán)境變量而不是硬編碼路徑。這樣既不會(huì)漏文件也便于后續(xù)更新模型版本。依賴庫(kù)缺失是第二個(gè)高發(fā)問(wèn)題。尤其用到特殊的圖像處理庫(kù)或版本比較新的框架時(shí)基礎(chǔ)鏡像不會(huì)內(nèi)置對(duì)應(yīng)依賴。解決辦法是把依賴清單寫到 requirements.txt 里部署時(shí)會(huì)自動(dòng)安裝。有一點(diǎn)值得提醒依賴清單里盡量鎖定版本號(hào)避免“裝了個(gè)新版本接口行為變了模型推理結(jié)果不對(duì)”這種問(wèn)題。服務(wù)端口配置不對(duì)是第三個(gè)坑。平臺(tái)健康檢查會(huì)去探測(cè)你指定的端口如果服務(wù)實(shí)際監(jiān)聽(tīng)的端口不一致服務(wù)會(huì)被判定為異常并反復(fù)重啟。部署前先確認(rèn)推理服務(wù)的監(jiān)聽(tīng)端口部署配置里保持兩者一致。5.3 避坑清單匯總說(shuō)了這么多最后把經(jīng)驗(yàn)濃縮成一條可直接對(duì)照的清單。第一數(shù)據(jù)目錄在 OBS 里保持“訓(xùn)練集/驗(yàn)證集/類別子目錄”的層級(jí)標(biāo)簽順序提前固定下來(lái)。第二上傳完數(shù)據(jù)后做一次目錄列表校驗(yàn)并在訓(xùn)練腳本里增加數(shù)據(jù)加載后的形狀打印。第三自定義訓(xùn)練腳本必須處理 OBS 數(shù)據(jù)到本地緩存的拷貝別指望平臺(tái)自動(dòng)完成。第四首次訓(xùn)練用小數(shù)據(jù)集、少輪數(shù)跑通流程再逐步增加數(shù)據(jù)規(guī)模。第五模型注冊(cè)時(shí)確定好推理代碼的目錄結(jié)構(gòu)和文件命名模型路徑建議通過(guò)環(huán)境變量讀取。第六部署前檢查端口、依賴清單、認(rèn)證信息三個(gè)最容易出問(wèn)題的點(diǎn)。第七每次訓(xùn)練記錄的日志和指標(biāo)文件及時(shí)下載備份方便后續(xù)對(duì)比和回溯。這套清單是我反復(fù)踩坑之后的總結(jié)現(xiàn)在每次做遷移訓(xùn)練或部署新模型我都會(huì)照著過(guò)一遍確實(shí)能省下不少排查時(shí)間。我個(gè)人在實(shí)際操作中的體會(huì)是這類云上平臺(tái)真正降低的是運(yùn)維和資源管理的門檻但它并沒(méi)有降低“理解模型訓(xùn)練流程”的要求。數(shù)據(jù)組織、超參數(shù)調(diào)整、模型與推理代碼的約定這些底層邏輯依然和本地訓(xùn)練一模一樣。如果你之前沒(méi)有本地訓(xùn)練的經(jīng)驗(yàn)直接上云可能會(huì)被報(bào)錯(cuò)牽著走反過(guò)來(lái)如果你已經(jīng)有一套完整的本地訓(xùn)練流程遷到這類平臺(tái)其實(shí)很快核心就是把數(shù)據(jù)路徑、代碼入口、模型輸出這幾個(gè)約定對(duì)齊。最后再分享一個(gè)小技巧首次部署時(shí)先用最小的規(guī)格和最小的模型跑通端到端流程確認(rèn)請(qǐng)求、返回、日志都正常后再切換到大規(guī)格模型你會(huì)省掉很多等待時(shí)間。