EntroPack 開源:模型壓縮不必只選 4 位元,如何配合顯示記憶體預算?

EntroPack 用彈性位元率壓縮模型權重。說明有損與無損、資料型別和數值差別,以及 GPU 解碼、完整記憶體與任務品質如何一起比較,避免把檔案縮小當成部署完成。

Share
ModelScope 的 EntroPack 模型壓縮官方說明圖
ModelScope 的 EntroPack 模型壓縮官方說明圖。來源:ModelScope。

EntroPack 讓模型權重壓縮多了一種選法:按可用顯示記憶體調整位元預算,而非只在四位元與八位元之間選。模型權重是訓練完成後用來計算的核心參數。

ModelScope 公開這套 PyTorch 工具,提供可調整的有損壓縮,以及可以精確恢復資料的無損方案。

權重壓得更小能省儲存空間,但計算時還需要解碼與其他記憶體。

因此,檔案變小和整個工作能在某張顯示卡完成,仍需要分開驗證。

對記憶體剛好不足的部署者,這類彈性有實用價值。是否值得換,要把品質與解碼時間一起比較。

要看懂它和固定精度量化的差別,先從每個參數用多少位元說起。

EntroPack 的可調位元率解決什麼問題?

可調位元率讓壓縮程度更接近設備實際能承受的儲存預算。

官方程式庫把 EntroPack 定位為 PyTorch 的張量壓縮工具。PyTorch 是建立與執行模型的軟體環境,張量則是用來保存一組數值的資料結構。

模型權重可以放在這些結構裡,而位元是電腦儲存資訊的基本單位。每個參數平均占用多少位元,便會影響一整份權重需要的空間。

非整數位元,指的是整體平均

四位元與八位元是常見選項,但設備可能剛好還有一點空間。若只能跳到下一種固定精度,就可能在品質與容量之間留下太大的空檔。

EntroPack 允許設定非整數的目標位元率。這不代表儲存裝置出現半個位元,而是透過編碼,讓一組參數平均占用接近指定的量。

可以用純假設算例理解:一百萬個參數若平均各用四點五位元,資料部分約需要四百五十萬位元。實際檔案還有說明如何還原的資訊,所以不能只用乘法當成最後大小。

目標大小與實際占用要分開

官方區分設定的目標值與包含額外資訊的實際位元率。因此設定接近記憶體上限時,仍要看實際儲存與執行結果,不能把目標當成保證。

編碼可以理解為用較緊湊的方式記錄數值。例如某些內容較常出現,就有機會用較短的表示保存,但能省多少仍取決於資料分布與所選方案。

若不同層對誤差的敏感程度不同,也未必需要全部用相同設定。這讓部署者有機會把有限空間優先留給影響較大的部分,但仍需用輸出驗證。

彈性是多一個調整範圍,不是免費提升

壓縮越積極,通常越需要觀察資訊損失與使用成本。不能只因某個檔案更小,就認為它同時更準、更快,也不能保證適用所有模型。

因此可先把問題縮成目前差多少空間、可以接受哪種輸出變化。知道這兩項,才容易判斷彈性位元率是否解決了實際限制。

但壓縮方案不同,能保留的原始資訊也不同。

官方原始貼文與素材,保留原平台圖片或影片與發布者署名。 來源:ModelScope。

有損、無損與恢復資料型別有何差別?

恢復成原來的資料型別,不代表有損壓縮後每個數值都相同。

資料型別描述數值採用的表示方式,例如浮點數能表示不同大小的小數。工具解碼後恢復原有形狀與型別,只能說結構相同,不能直接說內容毫無改變。

假設原始數值在有損壓縮時被近似,解碼雖然放回同一種容器,近似造成的差異仍然存在。這和把照片另存回相同格式,不會讓遺失細節自動回來的道理相近。

無損方案追求逐位元恢復

官方使用說明將無損與有損方案分列。無損的目標是恢復每個原始位元,適合需要精確取回的情況,但壓縮比例會受資料影響。

有損則以目標位元率交換重建誤差。重建誤差是解碼後數值與原始數值的差距,數值較小通常代表較接近,但還不能直接當成成品品質。

例如權重只出現細微差異,某些任務仍可接受,另一些精細輸出卻可能改變。這是評估方向,不是聲稱所有層或所有任務都有相同敏感程度。

結構檢查與內容檢查各有用途

載入後確認尺寸與型別,可以排除基本整合錯誤。但若目標是無損,就還要比較解碼結果是否與原始資料完全相同,不能只看程式沒有報錯。

若使用有損方案,則應同時保留數值誤差與任務結果。只看平均誤差,可能漏掉少數重要部分受到較大影響的情況。

可以先固定一組輸入,分別使用原始與壓縮權重,查看差異出現在哪裡。這樣比較的才是壓縮設定,而不是輸入剛好變難。

壓縮檔與未壓縮基準都要留得住

未壓縮版本是後續比較的基準。若只留下壓縮檔,發現輸出異常時,便難以分清原模型本來如此,還是壓縮改變了結果。

也應記下使用哪種方案與設定。相同檔案大小可能來自不同安排,沒有設定紀錄就很難重做,也無法把一次成功轉成可維護部署。

知道誤差從哪裡來,才好評估運算時的交換成本。

GPU 解碼與推論時間應如何一起看?

壓縮權重需要在計算流程裡恢復或使用,因此節省容量可能伴隨額外工作。

GPU 是能同時處理大量運算的晶片,這裡用來執行模型與壓縮相關工作。解碼則把緊湊表示轉成後續計算能使用的內容,因此它本身也需要資源。

如果解碼安排在原本已很吃重的運算旁邊,額外成本可能較容易被吸收。但若任務主要受資料讀取限制,結果就可能不同,不能只看單次核心程式的速度。

官方時間要保留原工作範圍

官方使用說明的一組比較是在 NVIDIA H20 上處理 Z-Image-Turbo,壓縮設定為四位元目標。每個去雜訊步驟從約五百零六毫秒變成五百四十五毫秒,增加約百分之七點七。

去雜訊步驟是生成模型逐步整理畫面的計算。這個數字顯示容量節省伴隨額外時間,但不是整張圖片從按下按鈕到存檔都只慢同樣比例。

同一例子的實際權重占用也高於目標位元率。這再次說明應看完成後的實測值,而不是把設定數字直接當成最後資源使用。

模型整合可能比直接壓縮一份資料更複雜

工具提供壓縮線性層的整合方式。線性層是模型中把輸入數值組合成另一組輸出的計算元件,但一個模型通常還有其他元件,未必全部都由同一方法處理。

因此先讓一個受支援部分工作,再看完整模型是否一致,會比一次替換全部元件更容易找錯。這是測試建議,不代表工具已自動替所有架構完成轉換。

版本與運算環境也應記錄。官方列有 PyTorch、CUDA 與相關套件條件,CUDA 是讓程式使用 NVIDIA GPU 的軟體環境,不能只裝壓縮工具就忽略相容性。

比較完整任務,才能判斷時間是否值得

可以把載入、解碼、模型運算與儲存結果分開計時。若只有其中一段變慢,團隊就知道改善應該放在哪裡,不必把整體等待都算成解碼問題。

偶爾執行一次的任務,載入時間可能很重要。長時間重複運作的服務,則更在意持續吞吐。兩種使用方式應各看自己的時間分布。

權重以外的記憶體需求,也會影響整體是否放得下。

顯示記憶體預算為什麼不能只算權重?

輸入、暫存與模型其他元件,都會占用同一張顯示卡。

顯示記憶體是 GPU 在執行時使用的工作空間。權重占用變小,可能讓模型更接近能載入,但輸入、暫存與其他元件仍會用到剩下的空間。

假設模型可以在短輸入時執行,換成較長文字或較大影像便失敗,就表示問題不能只用權重檔案大小解釋。工作規模也必須放進容量測試。

載入成功與完整跑完是兩個門檻

啟動時能看見模型,只代表前面的步驟通過。真正運算時產生中間結果,可能出現更高的記憶體需求,所以要記錄整段任務的峰值。

峰值是執行期間最高的使用量,而非結束後留下的數字。若只在程式完成後查看,暫存已經釋放,就可能低估實際需要。

對影片或圖片模型,還要固定解析度、批次與步驟。批次是同時處理的工作數量,增加批次可能提高總產量,也可能讓原本足夠的記憶體變得不足。

其他元件不能從計算裡消失

文字編碼器會把提示轉成模型可用的表示,影像編解碼部分則處理畫面與內部資料。即使主體權重壓得很小,這些部分仍可能留在設備上。

官方提供的預壓縮套件有不同元件組合,因此下載前應核對包含哪些部分。不能拿其中一個元件的縮小倍數,當成整個專案也等比例縮小。

也要保留給其他程序的餘裕。若同一張顯示卡還服務其他工作,單獨測試剛好能跑,未必代表日常同時運行也穩定。

容量不足時,先找出哪一段增加

可以先保持模型與壓縮設定相同,只逐步增加輸入或批次。這有助於分清不足來自固定權重,還是隨工作量成長的暫存。

如果每次都同時改模型、位元率與輸出尺寸,就很難知道是哪項設定解決問題。把變數分開,能讓省下的空間形成可重做的部署條件。

完整工作負載固定後,壓縮測試才能公平。

開發者怎麼選一個合理的壓縮設定?

同時記錄最大記憶體、輸出品質與完成時間,能看出設定是否真的划算。

第一輪可以選目前確實放不下、而且工具支援的模型部分。先保留原版本與固定輸入,再設定一組較保守的壓縮,才有清楚的比較起點。

假設團隊要生成產品概念圖,驗收應包含重要文字、輪廓與指定構圖。這是虛構工作情境,不能只用模型權重的數值誤差代替成片檢查。

同一組輸入,分別看品質與資源

記錄是否完成、最高記憶體、整段時間與人工修補。這些數字回答不同問題:放得下不代表做得對,做得對也不代表符合交期。

接著只改位元率,再用同樣輸入重跑。如果品質明顯下降,就能回到前一組設定,而不是把原模型的隨機差異誤認成壓縮效果。

若生成工作本身有隨機性,可以固定可控制的起點並保留多次結果。單張最漂亮的輸出不足以代表整組設定,失敗也應一起算入。

用任務容忍度選設定

概念探索可能容許小差異,精確產品資料或固定流程則需要更嚴格。位元率不是越低越厲害,而是要剛好滿足容量與用途。

如果只差一點空間就能完成工作,彈性調整可能很有價值。但若大部分記憶體花在其他元件,繼續壓同一份權重就未必能解決問題。

留下同事能接手的設定

可以保存模型版本、壓縮方式與測試輸入,並註明採用理由。例如省下足夠空間且重要細節可用,比只記「用了四點幾位元」更方便維護。

更新工具或模型後,再跑原有例子,能確認過去可用的組合是否改變。若差異出現,就先縮小到受影響部分,不必重做全部整合。

最後以完整工作能否穩定完成作選擇。壓縮的價值是讓原本受限的任務有可用安排,而不是只在檔案列表上得到一個更小的數字。

選擇應以任務結果為依據,保留可還原的未壓縮基準。

EntroPack 常見問題

EntroPack 能讓每個參數只占半個位元嗎?

非整數位元率描述整組資料的平均儲存量,不是硬體真的保存半個位元。實際占用還包含還原所需資訊,應回看實際數字。

解碼恢復 BF16,代表原始數值完全一樣嗎?

不代表。BF16 是資料型別。有損壓縮即使恢復相同型別仍有數值差異,只有對應無損方案才以精確恢復為目標。

檔案縮小後一定能在顯示卡執行嗎?

不一定。完整任務還有輸入、暫存與其他模型元件,要沿整段工作記錄最高記憶體,不能只測是否載入。

最低位元率就是最好的設定嗎?

不是。應比較完成時間、輸出品質與容量,只有滿足自己的工作要求,較小的權重才有實際用途。

讓壓縮設定回答眼前的容量問題

EntroPack 多給部署者一個可調範圍,但取捨仍在完整任務裡。先以原始權重作基準,固定工作量比較品質、峰值記憶體與時間,再保留能穩定完成工作的設定。

想持續追蹤 AI 工具與研究的實際用途,歡迎免費訂閱 AI 郵報。

延伸閱讀

延伸閱讀:Runway Baseten 企業部署合作:專屬影片模型,值得哪些團隊評估?

延伸閱讀:TencentDB Agent Memory 是什麼?把 AI 工作記憶分層,本機儲存還要注意哪些事?

資料來源