機(jī)器學(xué)習(xí)平臺(tái)部署:從環(huán)境搭建到模型上線的完整流程
機(jī)器學(xué)習(xí)平臺(tái)部署:從環(huán)境搭建到模型上線的完整流程
對(duì)于很多團(tuán)隊(duì)來說,將訓(xùn)練好的機(jī)器學(xué)習(xí)模型部署到生產(chǎn)環(huán)境,往往比模型訓(xùn)練本身更讓人頭疼。環(huán)境不一致、依賴沖突、資源利用率低、上線后性能波動(dòng)——這些坑幾乎每個(gè)技術(shù)團(tuán)隊(duì)都踩過。以騰訊云機(jī)器學(xué)習(xí)平臺(tái)為例,它的部署方法并非簡單點(diǎn)擊幾個(gè)按鈕,而是一套從鏡像構(gòu)建、服務(wù)編排到彈性伸縮的完整流程。理解這套流程的內(nèi)在邏輯,才能真正把模型跑穩(wěn)、跑快。
環(huán)境一致性是部署的第一道門檻
許多部署失敗的根本原因,在于開發(fā)環(huán)境與生產(chǎn)環(huán)境的割裂。開發(fā)時(shí)用Python 3.8和TensorFlow 2.4跑得好好的,一上生產(chǎn)環(huán)境卻報(bào)錯(cuò),排查半天發(fā)現(xiàn)是底層CUDA版本不對(duì)。在騰訊云機(jī)器學(xué)習(xí)平臺(tái)上,解決這一問題的標(biāo)準(zhǔn)做法是使用自定義鏡像。平臺(tái)支持基于官方基礎(chǔ)鏡像進(jìn)行二次構(gòu)建,將模型依賴的庫、系統(tǒng)包、環(huán)境變量全部固化到鏡像中。實(shí)際操作時(shí),建議在Dockerfile中明確指定基礎(chǔ)鏡像的標(biāo)簽版本,比如用tensorflow:2.4.0-gpu而不是tensorflow:latest,避免后續(xù)鏡像更新導(dǎo)致環(huán)境漂移。鏡像構(gòu)建完成后,推送到平臺(tái)自帶的鏡像倉庫,部署時(shí)直接引用,這樣從開發(fā)到上線的環(huán)境就完全一致了。
模型服務(wù)的封裝與啟動(dòng)參數(shù)調(diào)優(yōu)
鏡像準(zhǔn)備好之后,下一步是定義模型服務(wù)的啟動(dòng)方式。這里容易犯的一個(gè)錯(cuò)誤是直接把訓(xùn)練腳本當(dāng)作服務(wù)入口。生產(chǎn)環(huán)境需要的不是訓(xùn)練腳本,而是一個(gè)能夠接收HTTP請(qǐng)求、返回推理結(jié)果的Web服務(wù)。在騰訊云機(jī)器學(xué)習(xí)平臺(tái)上,通常的做法是編寫一個(gè)基于Flask或FastAPI的推理服務(wù)腳本,并在鏡像啟動(dòng)命令中指定該腳本。啟動(dòng)參數(shù)的設(shè)置也值得留意:workers數(shù)量一般設(shè)置為CPU核心數(shù)或GPU卡數(shù)的兩倍左右,超時(shí)時(shí)間根據(jù)模型推理耗時(shí)設(shè)定,避免因請(qǐng)求排隊(duì)造成超時(shí)。平臺(tái)支持通過環(huán)境變量動(dòng)態(tài)傳入模型路徑、日志級(jí)別等參數(shù),這樣同一個(gè)鏡像可以適配不同環(huán)境,無需為每個(gè)場景重新構(gòu)建鏡像。
彈性伸縮與資源配額的平衡
模型上線后,流量不會(huì)一直平穩(wěn)。白天高峰期請(qǐng)求量大,深夜可能幾乎沒有流量。如果按峰值配置固定資源,成本會(huì)很高;如果按均值配置,高峰期又容易響應(yīng)超時(shí)。騰訊云機(jī)器學(xué)習(xí)平臺(tái)提供了基于CPU使用率、請(qǐng)求QPS或自定義指標(biāo)的彈性伸縮策略。部署時(shí),建議先設(shè)置一個(gè)最小實(shí)例數(shù)保證基礎(chǔ)服務(wù)能力,再設(shè)定一個(gè)最大實(shí)例數(shù)防止資源失控。伸縮的冷卻時(shí)間也需要根據(jù)模型加載耗時(shí)來調(diào)整——如果模型加載需要幾十秒,冷卻時(shí)間設(shè)置太短會(huì)導(dǎo)致頻繁啟停,反而影響穩(wěn)定性。另外,資源配額方面,不要只關(guān)注CPU和內(nèi)存,還要考慮GPU顯存的分配。如果多個(gè)模型實(shí)例共享一張GPU卡,顯存隔離不到位,一個(gè)實(shí)例的顯存泄漏可能拖垮所有實(shí)例。
監(jiān)控日志與版本回滾的閉環(huán)
部署完成不等于萬事大吉。生產(chǎn)環(huán)境中的模型表現(xiàn)很可能與離線評(píng)測存在差異,數(shù)據(jù)分布漂移、輸入異常、硬件故障都可能引發(fā)問題。在騰訊云機(jī)器學(xué)習(xí)平臺(tái)上,部署時(shí)可以一鍵開啟日志采集和性能監(jiān)控。重點(diǎn)關(guān)注幾個(gè)指標(biāo):請(qǐng)求延遲的P99值、錯(cuò)誤率、模型推理的顯存占用趨勢。一旦發(fā)現(xiàn)異常,平臺(tái)支持快速回滾到上一個(gè)健康版本。這里有一個(gè)容易被忽略的細(xì)節(jié):回滾時(shí)不僅要回滾模型文件,還要同步回滾對(duì)應(yīng)的鏡像版本和啟動(dòng)參數(shù)。建議在每次部署時(shí)都記錄完整的版本快照,包括鏡像ID、模型文件MD5、環(huán)境變量列表,這樣回滾時(shí)才能做到精確復(fù)原。
灰度發(fā)布與流量切分的實(shí)戰(zhàn)技巧
對(duì)于線上服務(wù)的更新,最穩(wěn)妥的方式不是全量替換,而是灰度發(fā)布。騰訊云機(jī)器學(xué)習(xí)平臺(tái)支持將流量按比例分配到不同版本的服務(wù)上。實(shí)際操作時(shí),可以先讓新版本承接5%的流量,觀察幾分鐘內(nèi)的錯(cuò)誤率和延遲變化。如果表現(xiàn)穩(wěn)定,逐步提升比例到30%、50%,最終全量切換。灰度期間,新舊版本的日志和監(jiān)控要分開查看,避免數(shù)據(jù)混淆。如果新版本出現(xiàn)問題,只需將流量切回舊版本即可,影響范圍極小。這種方式特別適合模型迭代頻繁的團(tuán)隊(duì),每次更新都像一次小手術(shù),而不是大換血。另外,灰度發(fā)布時(shí)建議保留至少一個(gè)舊版本的實(shí)例不回收,作為快速回退的保險(xiǎn)。