Tech カテゴリのイメージ

MIGとは?1枚のGPUを分割してLLM推論を動かす前に知ること

小さなembedding modelや分類modelへGPUを1枚ずつ割り当てると、memoryとcomputeの多くが余ることがある。反対に、一つのGPUへ複数processを載せるだけでは、memory不足や性能干渉の影響範囲が読みにくい。

NVIDIA Multi-Instance GPU、MIGは、対応GPUを複数のGPU Instanceへ分割する仕組みである。各instanceへcomputeとmemory系統の一部を割り当て、CUDA applicationから小さなGPUのように利用できる。

ただし、MIGは「GPU台数を増やす設定」ではない。LLMが必要とするweight、KV Cache、workspaceを収め、requestごとのlatencyを守れるprofileを選び、再構成時の停止まで運用へ含める必要がある。

MIGが分けるもの

MIG対応GPUでは、Streaming Multiprocessorなどのcompute resourceと、L2 cache bank、memory controller、DRAM busなどのmemory pathをinstanceへ割り当てる。NVIDIAのMIG User Guideは、各instanceがmemory systemへの分離されたpathを持ち、異なるclient間のQoSとfault isolationを提供すると説明している。

CUDA applicationからは各MIG deviceが独立したdeviceとして見える。containerやprocessへinstance単位で割り当てられるため、次のような用途に向く。

  • 小型modelをtenantごとに分離する
  • embedding、reranker、分類などのserviceを分ける
  • 開発・検証環境へ上限の明確なGPU resourceを渡す
  • 低trafficの複数endpointを一枚へ集約する

対応GPU、driver、profile名、instance上限は製品世代で異なる。A100の古い例を、別世代のGPUへそのまま当てはめない。

profile名は容量だけを表さない

MIG profileは、割り当てるcompute slice、memory容量、利用できるengineなどの組み合わせを表す。たとえば同じmemory容量に見えても、GPU世代やprofileによってcompute量とmedia engineの有無が異なる場合がある。

LLM推論では、profileをmemory容量だけで選ばない。次を実modelで測る。

  • weight、KV Cache、CUDA graph、workspaceが収まるか
  • 最大contextと同時request数でOOMにならないか
  • PrefillのTTFTとDecodeのITLを守れるか
  • memory bandwidthが律速にならないか
  • tokenizerやCPU処理を含むend-to-end throughput

modelが起動したことはcapacity確認にならない。最長promptと最大batchで必要なheadroomを残す。

MIG instance数とLLM replica数は同じではない

一枚を七つに分けられるGPUがあっても、七つのLLM replicaが効率的とは限らない。instanceを小さくするほど一つのrequestが使えるcomputeとmemory bandwidthは減る。

trafficが少ない小型modelでは、複数の小さなinstanceがidle時間を減らせる。一方、長文Prefillや大きなbatchでは、分割しないGPUの方がrequestをまとめて高速に処理できる場合がある。

比較するときはGPU当たりの総throughputだけでなく、TTFT、ITL、p99、OOM率、消費電力、待ちqueueを見る。小さなinstanceを増やして総throughputが上がっても、各requestのdeadlineを超えれば目的を達成していない。

MIGとtime-slicingは違う

KubernetesのGPU time-slicingは、一つのGPUを複数workloadへ時間分割して共有させる。NVIDIAの公式資料では、time-slicingにはMIGが提供するmemory isolationとfault isolationがない。

観点MIGtime-slicing
computeprofileごとにpartition同じGPUを時間共有
GPU memoryinstanceごとに分離process間で共有
fault isolationhardware levelの分離を提供MIG相当の分離なし
resource形状定義済みprofilereplica数としてoversubscribe
対応hardwareMIG対応GPUより広いGPUで利用可能

time-sliced resourceを二つ要求しても、compute powerが二倍保証されるわけではない。NVIDIAの資料は、一つのPodが複数のtime-sliced GPU resourceを要求しても比例したcompute量は保証されないと説明している。

tenant分離やmemory上限を重視するならMIG、軽い開発jobをより多く載せるためbest-effort共有を許容するならtime-slicingが候補になる。両者を名前だけで同じGPU共有機能として扱わない。

MPSとも役割が違う

CUDA Multi-Process Serviceは、複数CUDA processのkernel実行を一つのGPU上で効率化する仕組みである。MIGのようにmemory pathをhardware partitionへ分けるものではない。

MIG instanceの内側で複数processを動かす構成もありうるが、分離境界とscheduling境界が二重になる。まずMIG profile単位のcapacityを測り、その上でprocess共有が必要か判断する。

大きなLLMでは分割が不利になる

model weightだけで一つのMIG instanceに収まらない場合、MIGは単純な解決にならない。複数instanceを物理GPUのように束ねればよいとも限らず、P2Pやcollectiveの対応・制約はGPU世代、driver、構成で確認が必要である。

Tensor Parallelismを使う大きなmodelでは、分割前のGPUやNVLink domainを占有した方が自然な場合が多い。MIGは主に、一枚では大きすぎるGPUを小型workloadへ適切に配分する選択肢として考える。

一方、embedding model、reranker、guardrail、音声・画像の前処理など、LLM周辺の小型serviceには適合しやすい。大model本体と周辺serviceを同じfailure domainへ詰め込みすぎない点には注意する。

Kubernetesではresource名とstrategyを理解する

NVIDIA GPU OperatorはMIG Managerを使い、node labelの変更に応じてMIG modeとgeometryを構成する。MIG strategyにはsingleとmixedがある。

  • single: node上のGPUを同じMIG方針で扱いやすい
  • mixed: 複数profileやMIG有効・無効の混在を扱う

実際にPodが要求するresource名はstrategyとprofileによって変わる。schedulerが「GPU 1個」としか理解していない構成では、full GPUと小さなMIG instanceを取り違える危険がある。

node label、advertiseされたextended resource、profile名をinventoryへ残す。autoscalerもinstance数だけでなく、各profileで起動可能なmodelと同時request数を理解する必要がある。

MIG geometryの変更は無停止ではない

GPU OperatorのMIG Managerはgeometry変更時にGPUを使うoperator Podを停止し、構成を適用して再起動する。環境によってはMIG modeの変更にnode rebootが必要になる。

そのため、trafficが流れているnodeのlabelを気軽に変更しない。基本手順は次の通りである。

  1. 対象nodeへの新規配置を止める
  2. serving requestを別replicaへ逃がす
  3. GPU workloadをdrainする
  4. 希望するgeometryへ変更する
  5. device plugin、監視、resource advertiseを確認する
  6. canary modelを起動してmemoryとlatencyを測る
  7. 少量trafficから復帰する

profile変更を日中のautoscaling手段として使うより、需要のまとまりに合わせたnode poolを事前に用意する方が扱いやすい場合が多い。

fragmentationはGPU memory以外にもある

MIGでは定義済みprofileをGPU上へ配置する。空きmemory量の合計が足りているように見えても、希望profileを追加できない場合がある。profileの組み合わせとplacement制約があるためである。

scheduler側でも、使いにくい小さなinstanceだけが残るresource fragmentationが起きる。たとえば大profile待ちのjobがあるのに、小profileへ分割したnodeしか残っていれば起動できない。

利用率だけでなく、profile別のpending Pod、空きinstanceの形、再構成回数を監視する。需要分布に合わないgeometryは、空きcapacityがあるのにqueueが増える状態を作る。

healthとfailure domainを追跡する

MIG instanceは分離を提供するが、同じphysical GPU、board、power、PCIe pathを共有する。physical GPUの重大障害は複数instanceへ影響しうる。

監視ではMIG device UUIDだけでなく、親GPU UUID、node、PCI bus IDを関連付ける。instance単位のOOMと、親GPUのXid・ECC・温度異常を区別する。

DCGMや監視stackがMIG modeでどの単位のmetricを出すかも確認する。time-slicingではcontainerへのmetric関連付けに制約があるため、MIGと同じdashboard前提にしない。

監視するmetric

  • profile別の割当数、空き数、pending Pod数
  • 親GPUとMIG deviceのUUID mapping
  • instance別のmemory使用量、SM利用率、throughput
  • model別のTTFT、ITL、error率、OOM率
  • profile別の最大context、同時request数
  • 親GPUのECC、Xid、temperature、power、clock
  • geometry変更の回数、所要時間、失敗率
  • node cordonからservice復帰までの時間
  • full GPU、MIG、time-slicingの費用とSLO比較

負荷試験

  1. 最長promptと最大batchでmemory headroomを確認する
  2. instanceごとに同じmodelを動かし性能差を見る
  3. 隣接instanceへ高負荷をかけ、latency干渉を測る
  4. 一つのinstanceでOOMを起こし、他instanceへの影響を確認する
  5. 親GPU障害を想定し、全instanceの退避を確認する
  6. geometry変更前のdrainと変更後のresource再認識を確認する
  7. canary失敗時にnodeがtrafficへ戻らないことを確認する
  8. 同じworkloadをfull GPU、MIG、time-slicingで比較する
  9. mixed strategyで正しいresource名を要求できるか確認する
  10. profile別のqueueを使い、capacity不足時の拒否・待機を確認する

小さく分ける前にworkloadの形を測る

MIGは、対応GPUのcomputeとmemory系統を定義済みprofileへ分け、複数workloadへ分離されたresourceを渡す仕組みである。単なるtime-slicingよりmemoryとfaultの分離が強い一方、自由な容量分割ではなく、geometry変更にはdrainや再起動が伴う場合がある。

LLM推論では、weightが収まるだけでprofileを選ばない。KV Cache、最大context、batch、TTFT、ITLを含めて測り、親GPUのfailure domainも残す。MIGが効くのは、GPUを小さくできるからではなく、workloadの形に合った分離単位を作れる場合である。

参考資料