iPAS 備考專區 登入

iPAS AI 應用規劃師 中級 科目一 AI 技術應用與規劃・114 年第二次・L21・第 37 題

訓練大型語音模型時,怎麼降低單張 GPU 的記憶體壓力?

原題

某公司正在訓練一個大型語音合成模型,開發團隊使用多台 GPU 進行訓練,但經常出現 GPU 記憶體不足問題。由於模型架構已固定且無法更換硬體,團隊希望在維持模型效能與收斂品質的前提下,下列哪一種方法最有效降低單張 GPU 的記憶體壓力?

白話

一家公司在用多台 GPU 一起訓練一個很大的語音合成 AI 模型,但常常跑到一半 GPU 記憶體就爆掉了。硬體不能換,模型架構也不能改,他們想要在不犧牲訓練品質的前提下,找到一種有效降低單張 GPU 記憶體用量的方法。

問你:下面哪一個方法最能在不傷訓練品質的情況下,減少每張 GPU 要撐的記憶體?

一句話總結

降低單張 GPU 記憶體壓力最有效的組合是:縮小批次大小(Batch Size)讓每次前向傳播需要的暫存空間變小,同時用資料分片(Data Sharding)把整個資料集分散給多台 GPU 各自負責一塊,維持訓練效率。

情境

先感受問題:GPU 記憶體為什麼容易爆

假設「聲音科技公司」的工程師阿明,團隊正在用 4 張 A100(每張 80GB)訓練一個語音合成模型。模型有 5 億個參數,架構已鎖定,不能改。

每次跑訓練,GPU 要同時裝下:

模型權重(參數本身)

梯度(Gradient,反向傳播用)

優化器狀態(Optimizer States,如 Adam 要存 m 和 v)

這個批次的輸入資料(Batch Data)

中間層的啟動值(Activations,前向傳播留著給反向傳播用)

批次大小(Batch Size)越大,「這個批次的輸入資料」和「中間層啟動值」就越大,記憶體就越容易爆。

阿明的問題:每次 Batch Size 開到 64,跑沒多久就 OOM(Out of Memory)。他需要一個方法,讓每張 GPU 少扛一點,但又不能把訓練搞壞。

舊方法

直觀的省記憶體方法,為什麼會傷訓練品質

阿明列出幾個「直覺上好像能省記憶體」的做法,但都有致命問題:

  1. 減少訓練資料量:資料少了,GPU 每次裝載的數量確實變少,但模型看到的樣本不夠多,學習效果變差,模型泛化能力下降。白花了大量前期資料收集的努力。
  2. 加大學習率:學習率跟記憶體沒有直接關係。加大學習率只是讓每次更新幅度變大,不會少用記憶體,反而可能讓訓練發散(梯度爆炸),品質崩潰。
  3. 用測試集跑部分訓練:這是嚴重的資料汙染(Data Leakage)。測試集的功能是評估模型,如果拿去訓練,評估結果就失去可信度,而且實際上並不會省記憶體。
  4. 單純縮小 Batch Size(不搭配分片):縮小 Batch Size 確實省記憶體,但如果沒有分片策略,多台 GPU 還是各自讀同一份完整資料集,資料讀取效率低,訓練變慢。
  5. 換更小的模型:題目說模型架構固定,這條路不通。

新方法

縮小 Batch Size 加上資料分片,怎麼同時解兩個問題

阿明的正確做法分兩步:

第一步:縮小 Batch Size。從 64 降到 16,每次前向傳播需要在 GPU 記憶體裡暫存的啟動值(Activations)立刻縮小為原本的四分之一。GPU 不再 OOM。

第二步:搭配資料分片(Data Sharding)。把整份訓練資料集切成 4 塊(Shard),每台 GPU 只負責讀和處理自己那一塊。

GPU 0 負責 Shard 0(第 1~25% 的資料)

GPU 1 負責 Shard 1(第 26~50% 的資料)

GPU 2 負責 Shard 2(第 51~75% 的資料)

GPU 3 負責 Shard 3(第 76~100% 的資料)

這樣每台 GPU 只要在自己的小 Shard 裡跑小 Batch,記憶體壓力大幅降低。4 台 GPU 同時跑,整體訓練速度也沒有明顯變慢。梯度在更新前同步(Gradient Synchronization),保證所有 GPU 學到的方向一致,模型品質不受影響。

這就是選項 B 講的:採用較小的批次大小(Batch Size)並搭配資料分片(Data Sharding)分散訓練負載。

錯選項

為什麼其他選項是錯的

A減少訓練資料量以降低記憶體使用

字面在說什麼

把訓練集砍掉一部分,GPU 要處理的資料少了,記憶體就不會爆。

為什麼不對

GPU 的記憶體瓶頸在「一次前向傳播要暫存多少啟動值」,而不是「訓練集總量多大」。訓練集有 100 萬筆還是 10 萬筆,每次跑一個 Batch,GPU 裡放的只有這個 Batch 的資料。減少訓練資料量不會減少每個 Batch 的記憶體用量,但會嚴重損害模型學到的語音品質與泛化能力。

誰會選錯

直覺上「資料少 = 記憶體少」的考生,沒有分清楚「資料集大小」和「每次前向傳播的 Batch 大小」的差別。記憶體瓶頸看的是 Batch,不是整個資料集。

C增加學習率(Learning Rate)以加快收斂速度

字面在說什麼

學習率調高,每次梯度更新的幅度更大,模型收斂更快,訓練 Epoch 變少,省了訓練時間?

為什麼不對

學習率是梯度更新的步長,跟 GPU 記憶體用量完全無關。GPU 記憶體裝的是參數、梯度、啟動值,不管學習率是 0.001 還是 0.1,這些結構的大小不會改變。更危險的是,學習率增加太多容易造成梯度爆炸,訓練直接發散,收斂品質反而更差。

誰會選錯

把「訓練快一點」和「記憶體省一點」混為一談的考生。訓練快(更快收斂)和記憶體少(每次前向傳播用更少空間)是兩個獨立維度,學習率只影響前者。

D改用測試資料集(Test Set)進行部分訓練以節省空間

字面在說什麼

既然訓練集很大,拿測試集的一部分來訓練,總資料量少一些,可以省空間。

為什麼不對

這是最嚴重的錯誤:資料汙染(Data Leakage)。測試集的作用是公正評估模型,如果測試集的資料進入訓練,等於模型「看過考題」,評估結果完全失去意義。而且就算這樣做,也不解決記憶體問題,因為每次跑 Batch 用的記憶體量跟資料從哪裡來無關。

誰會選錯

對資料集切分(Train/Val/Test Split)的用途不清楚的考生,誤以為測試集可以「借用一下」。測試集是聖域,一旦用於訓練,整個實驗的可信度就歸零。

變形題

同個考點下次怎麼變形

延伸

想再往下看,這 5 個

答案、題目或解析有問題?回報這題

出處:iPAS 經濟部產業人才能力鑑定 ・ 114 年第二次 iPAS AI 應用規劃師 中級 科目一 第 37 題

看官方原文 PDF

原題 © 經濟部產業發展署,AITerms.tw 僅作教學解析使用,本站解析以 CC BY-NC-SA 4.0 授權。