Tech カテゴリのイメージ

GPU Topologyとは?NVLink・PCIe・NUMAを見てLLM推論を配置する

同じmodel、同じ8 GPU、同じTensor Parallel sizeでも、rankの置き方だけでLLM推論の速度が変わることがある。GPU 0と1がNVLinkで直結している構成と、別CPU socketをまたいでPCIe通信する構成では、All-Reduceの経路が違うからである。

GPU Topologyは、GPU、CPU、memory、PCIe switch、NICがどの経路でつながっているかを表す。GPU型番と台数だけでは分散推論の通信性能を判断できない。Tensor、Context、Expert Parallelismのgroupをどこへ置くかは、Topologyを見て決める必要がある。

node内通信にも複数の経路がある

一つのserverへ8 GPUが入っていても、すべてのGPU pairが同じbandwidthとlatencyで通信できるとは限らない。

  • NVLinkで直接またはNVSwitch経由につながる
  • 同じPCIe switchを共有する
  • 複数のPCIe switchを通る
  • CPUのPCIe Host Bridgeを通る
  • 別NUMA nodeのCPU間linkを通る

近いGPU pairではPeer-to-Peerで直接memoryを読めても、遠いpairではhost memoryを経由する場合がある。collective libraryが同じAPIを提供しても、実際のdata pathは異なる。

nvidia-smi topo -mの記号を読む

NVIDIAのnvidia-smi topo -mは、GPUとNICの接続matrix、CPU affinity、memory affinityを表示する。代表的な記号は次の通りである。

表示経路の意味
NV##本を束ねたNVLink接続
PIX一つのPCIe switchを通る
PXB複数のPCIe switchを通るがHost Bridgeは通らない
PHBPCIe Host Bridgeを通る
NODE同じNUMA node内の複数Host Bridgeを通る
SYSPCIeに加えNUMA node間のCPU interconnectを通る

一般にNV#や近いPCIe経路は、SYSより頻繁なGPU通信へ向く。ただし記号だけで実効bandwidthを断定しない。GPU世代、link本数、PCIe世代、switch構成、同時trafficで変わる。

nvidia-smi topo -p2pではGPU間のP2P read、write、NVLink、PCIeなどのcapabilityを確認できる。Topology matrixと通信benchmarkを組み合わせる。

NVLinkとNVSwitchの役割は違う

NVLinkはGPU間の高速linkである。GPU pairを直接つなぐ構成では、どのpairに何本のlinkがあるかでbandwidthが変わる。

NVSwitchは複数GPUをswitch fabricへ接続し、多くのGPU pairへ高bandwidthな経路を提供する。全GPUが完全に同じ性能になるとは限らないが、pairwise linkだけの構成より大きなcollective groupを作りやすい。

Tensor Parallelismはlayerごとにcollectiveを繰り返すため、NVLink domain内へ収める効果が大きい。GPU数を増やすためTP groupをNVLink domainの外へ広げると、一部stepが遅い経路へ制約される。

PCIe switchとHost Bridgeをまたぐcost

GPU間にNVLinkがない場合、P2PはPCIeを使う。同じPCIe switch配下ならGPU同士のtrafficがCPU Host Bridgeまで上がらずに済む場合がある。

別Host Bridgeや別CPU socketへまたがると、dataはより長い経路を通る。CPU間interconnectやmemory controllerのtrafficと競合する可能性もある。

PCIe bandwidthの公称値だけで判断しない。複数GPUが同じuplinkを共有すれば、同時通信時のaggregate bandwidthが頭打ちになる。All-to-Allでは多数pairが同時に通信するため、単一pair benchmarkより早くbottleneckが出る。

NUMAはCPU処理とhost memoryにも効く

NUMA serverでは、CPU coreとmemoryがsocketごとのnodeに分かれ、local memoryとremote memoryでaccess costが違う。GPUとNICも特定NUMA nodeへ近い。

LLM servingはGPUだけで完結しない。tokenization、request queue、sampling、CPU offload、pinned memory、network処理をCPU側で行う。GPUに近いCPU coreとmemoryを使わないと、host-to-device transferやcontrol pathが遠回りする。

processのCPU affinity、memory allocation、GPU、NICを同じNUMA domainへ寄せる。containerへCPUを割り当てるときも、core数だけでなくsocketとNUMA nodeを見る。

KV Cache OffloadingでCPU DRAMを使う場合は特に重要である。remote NUMA memoryへ退避したKVをGPUへ戻せば、PCIe転送前にCPU socket間を通る可能性がある。

NIC affinityがmulti-node通信を決める

multi-nodeのcollectiveやKV transferでは、GPUからNICへdataを送る。GPUとNICが同じPCIe root complexや近いswitch配下にあるほど、短い経路を使いやすい。

GPU 0に近いNICがあるのに、processが遠いNICから送信すれば、node内で余分なPCIeやCPU interconnectを通る。dual-rail構成では、rankとNIC railの対応も重要になる。

Topology matrixでGPUとNICの関係を確認し、network interface名、RDMA capability、NUMA affinityを記録する。bondingされたinterfaceが表示されても、すべてがRDMAに使えるとは限らない。

GPUDirect RDMAはGPUとNICの直接経路を作る

通常のnetwork transferでは、GPU memoryのdataをhost memoryへcopyし、NICがhost bufferから送る経路がある。GPUDirect RDMAは、対応NICなどのpeer deviceがGPU memoryと直接data交換できる経路を提供する。

CPU bounce bufferを避けることで、CPU負荷、copy回数、latencyを減らせる可能性がある。Prefill・Decode分離のKV transfer、multi-node Tensor Parallelism、Context Parallelismで重要になる。

ただし、software flagを一つ有効にすれば必ず動く機能ではない。GPUとNICのPCIe関係、driver、kernel moduleまたはDMA-BUF、RDMA stack、IOMMU設定、container権限などが関係する。

NVIDIAのGPUDirect RDMA資料は、GPUとpeer deviceが同じupstream PCIe root complexを共有する構成を基本条件として説明し、CPU socket間をまたぐ経路では性能や動作に制約がありうるとしている。

NCCLはTopologyを検出するが、環境が隠すことがある

NCCLは/sysなどからGPU、PCIe、NICのTopologyを検出し、P2P、shared memory、network transportを選ぶ。containerやvirtual machineから不完全な/sysしか見えなければ、実機とは違うTopologyとして認識する可能性がある。

NCCLが自動選択するから配置を考えなくてよいわけではない。schedulerが遠いGPUを一つのTP groupへ割り当てれば、libraryはその中で最善の経路を選ぶだけである。

起動logと通信benchmarkで、意図したP2P、NVLink、RDMAを使っているか確認する。TCP socketへfallbackしてもapplicationは動くため、機能testだけでは見逃しやすい。

parallelismごとに近さの優先度が違う

Tensor ParallelismはDecodeの各layerでcollectiveを行うため、最も近いGPU groupへ置く。可能なら一つのNVLink、NVSwitch domain内へ収める。

Pipeline Parallelismはstage境界でactivationを送る。TPほど頻繁なcollectiveを避けやすいため、node境界へ置く候補になる。ただしstage間trafficとbubbleを測る。

Context Parallelismは長文のKV blockを交換する。大きなmessageをcomputeとoverlapできるか、node間bandwidthが十分かを確認する。

Expert Parallelismはtoken routingによるAll-to-Allを使う。expert loadが偏ると特定linkやNICへtrafficが集中する。rankを均等配置するだけでなく、実際のrouting distributionを見る。

Data Parallelismのreplicaは比較的独立している。通信の強いmodel parallel groupをnode内へ閉じ、replicaをnode単位で増やす構成が扱いやすい場合がある。

KubernetesのGPU数だけでは配置を表せない

Podがnvidia.com/gpu: 4を要求しても、割り当てられた4 GPUが互いに近い保証は、device pluginやschedulerの構成次第である。

GPU UUIDとindex、PCI bus ID、NUMA node、NVLink domain、NIC affinityをnode inventoryとして持つ。Topology-aware schedulingやnode labelを使い、TP 4には同じ高速domainの4 GPUを割り当てる。

MIGでは一つのphysical GPUを複数instanceへ分ける。MIG instance数をphysical GPU数と同じように扱わない。memory、compute、P2P、通信機能の制約を使用構成で確認する。

GPU indexは再起動後も物理位置を表すとは限らない

applicationが見るGPU 0は、必ずしもchassis上の固定slotや最も近いNICを意味しない。CUDA_VISIBLE_DEVICES、container runtime、device pluginによってindexは並べ替えられる。

運用記録にはGPU indexだけでなくUUIDとPCI bus IDを残す。rank、GPU UUID、NIC、NUMA nodeのmappingをdeploymentごとに保存する。

performance regression時に「GPU 0から3を使った」という情報だけでは、以前と同じphysical pathだったか確認できない。

監視するmetric

  • rank、GPU UUID、PCI bus ID、NUMA node、NICのmapping
  • GPU pairごとのP2P capability
  • NVLink、PCIeの送受信量とerror
  • NICごとのthroughput、RDMA counter、retransmit、drop
  • CPU coreとmemoryのNUMA allocation
  • host-to-device、device-to-hostのbandwidthとlatency
  • collective種別ごとのdurationとmessage size
  • rankごとのcollective到着時刻
  • GPUDirect RDMAとfallback transportの利用状況
  • TTFT、ITL、token throughput、KV transfer時間

Topologyはdeployment時に一度記録して終わりにしない。driver、firmware、BIOS、container、scheduler変更後に再取得する。

負荷試験

  1. 全GPU pairのP2P bandwidthとlatencyを測る
  2. NVLink、PIX、PXB、PHB、SYSの経路を分けて比較する
  3. GPUとNICの組み合わせを変えてRDMA性能を測る
  4. CPUとmemoryのNUMA bindingを変える
  5. TP groupを高速domain内とdomain跨ぎで比較する
  6. TP、CP、EPのcollectiveを実message sizeで測る
  7. 複数groupを同時実行しshared uplinkの競合を見る
  8. CPU offloadとnetwork communicationを同時実行する
  9. container内外でTopology認識とtransportを比較する
  10. link、NIC、rankを一つずつ停止しfailure domainを確認する

単体のpeak bandwidthだけでなく、実LLM workloadのTTFT、ITL、throughputと関連付ける。

GPUを数える前に経路を見る

GPU Topologyは、GPU同士、GPUとCPU memory、GPUとNICの距離を表す。同じGPU台数でも、NVLink domain内か、PCIe switchを共有するか、NUMA nodeやNICをまたぐかでcollectiveとKV transferの性能が変わる。

Tensor Parallel groupは近いGPUへ置き、multi-node通信ではNIC affinityとGPUDirect RDMAの実利用を確認する。GPU indexではなくUUID、PCI bus ID、NUMA、NICまで記録し、実message sizeでbenchmarkする必要がある。

参考資料