# การจัดการ VRAM สำหรับ MoE ขนาดใหญ่บน Multi-GPU Cluster

https://llm-cal.p7z.pw/th/guides/moe/

โมเดล Mixture-of-Experts (MoE) อย่าง DeepSeek-V3/R1 (671B Total / 37B Active) เปรียบเหมือน ห้องประชุมที่มีผู้เชี่ยวชาญ 256 คน และมีพนักงานต้อนรับคอยส่งงานให้ผู้เชี่ยวชาญ 8 คนที่ตรงกับคำถาม แม้คำนวณจริงใช้สมองเพียง 37B แต่ VRAM ทั้งหมดบน Cluster จำเป็นต้องมีเก้าอี้ให้ผู้เชี่ยวชาญทั้ง 671B นั่งค้างไว้เสมอ การใช้ Expert Parallelism (EP), Tensor Parallelism (TP) และ Multi-Head Latent Attention (MLA) จึงเป็นกุญแจสำคัญ

## Active vs Total Parameters ในงบ VRAM

โมเดล MoE อย่าง DeepSeek-V3 มีพารามิเตอร์รวมสูงถึง 671B (Total Parameters) แต่ในแต่ละ Step คำนวณจะเลือกใช้ Expert เพียง 8 ตัวบวก 1 Shared Expert ทำให้มี Active Parameters เพียง 37B

สิ่งที่ต้องระวังคือ: คำว่า 37B Active Parameters ไม่ได้แปลว่าคุณจะใช้การ์ดจอที่ VRAM พอเก็บแค่ 37B แล้วรันได้! เพราะตัวเซิร์ฟเวอร์ต้องโหลดโครงสร้างสมองและ Expert ทั้งหมด 256 ตัว (671B) ค้างไว้บนแรมตลอดเวลา ดังนั้นงบ VRAM สำหรับ Model Weights ยังคงยึดตามขนาด 671B เต็มๆ (ที่ FP8 ใช้แรม ~670 GB) ส่วนความเร็ว Compute Speed (TFLOPS) จะวิ่งเร็วเหมือนโมเดลขนาด 37B

## Multi-GPU Parallelism: EP, TP และ PP

การรัน MoE ขนาดหลายร้อยพันล้านพารามิเตอร์ ต้องอาศัยการกระจายภาระข้าม GPUs หลายใบ (Multi-GPU Cluster) ผ่าน 3 เทคนิคหลัก:
- Expert Parallelism (EP): กระจาย Expert ย่อยๆ ไปไว้คนละ GPU (เช่น GPU#1 เก็บ Expert 1-32, GPU#2 เก็บ Expert 33-64) วิธีนี้ช่วยประหยัด VRAM ต่อการ์ดได้มหาศาล แต่สร้างคอขวดที่การสื่อสารข้ามการ์ด All-to-All Communication (Token Routing) จึงต้องมีสาย NVLink ความเร็วสูง
- Tensor Parallelism (TP): หั่น Matrix เดียวกันไปคำนวณพร้อมกัน เหมาะสำหรับ Shared Experts และ Attention Layers เพื่อเพิ่มสปีด
- Pipeline Parallelism (PP): สับชั้นของโมเดลตามความลึก (Layer Stack) เหมาะสำหรับการข้ามโหนด (Multi-Node Cluster) ที่เชื่อมผ่าน InfiniBand หรือ RoCE

## MLA (Multi-Head Latent Attention) ช่วยชีวิต KV Cache

ข้อได้เปรียบอันโดดเด่นของ DeepSeek-V3 / R1 คือการนำสถาปัตยกรรม MLA มาใช้ แทนที่จะเก็บ Key-Value states ของทุก Head แยกกันเต็มๆ (MHA) MLA จะบีบอัด (Compress) Key และ Value ให้อยู่ในรูปแบบ Latent Vector ความยาวเพียง 576-dim

ผลลัพธ์คือ VRAM ฝั่ง KV Cache ถูกตัดขนาดลงเกิน 90%! ช่วยให้ Multi-GPU Cluster สามารถเปิดรับ Context ความยาว 64K-128K หรือรองรับ Concurrency ผู้ใช้พร้อมกันหลายร้อยคนได้โดย VRAM ฝั่ง KV Cache ไม่เต็ม OOM

## MoE Expert Quantization Caveats

การทำ Quantization บนโมเดล MoE มีความคล้ายและแตกต่างจาก Dense Model:
- FP8 (E4M3 / E5M2): เป็นเกรดมาตรฐานทองคำสำหรับ DeepSeek-V3/R1 ให้คุณภาพแทบจะ 100% และรันตรงบน Tensor Core ของ H100 / B200 / RTX 4090
- 4-bit (AWQ / GGUF IQ4_XS): บีบอัดลงมาเหลือ ~350 GB VRAM ทำให้ยัดลงการ์ด 8x RTX 3090/4090 (192GB-256GB VRAM) ร่วมกับ Offloading ได้ แต่ต้องระวังอาการ Expert Routing Drift เพราะหาก Router หั่นบิตต่ำเกินไป Token อาจถูกส่งไปผิด Expert ส่งผลให้โมเดลตอบหลุดกรอบ

## แนวทางการจัด Cluster ฮาร์ดแวร์

1. Enterprise Production Cluster (8x H100 / 8x H200 80GB-141GB): รัน FP8 Native โดยใช้ EP=8 บน High-Speed NVLink Network ให้ Throughput สูงสุดระดับ Production 24/7
2. Workstation / Local Budget Cluster (8x RTX 4090 24GB หรือ Mac Cluster): ใช้ 4-bit Quantization (IQ4 / AWQ) ร่วมกับ CPU / NVMe Expert Offloading บน vLLM หรือ SGLang เหมาะสำหรับการทดลองหรือใช้งานภายในองค์กรขนาดเล็ก

## วางแผน VRAM และ Multi-GPU สำหรับ MoE โมเดล

เริ่มจาก Total Parameters (671B) เพื่อจอง VRAM และใช้ Active Parameters (37B) เพื่อประมาณการความเร็ว

ใช้ Expert Parallelism (EP) กระจาย Expert ข้ามการ์ดบน NVLink และใช้ FP8 KV เพื่อลดขนาดแรม

| ปัจจัย | คำแนะนำ | สิ่งที่ต้องระวัง |
| --- | --- | --- |
| Model Weights (671B) | คิดแรมจาก 671B ไม่ใช่ 37B (FP8 ใช้ ~670 GB) | VRAM ไม่พอโหลดโมเดลไม่ขึ้นตั้งแต่เริ่ม |
| Multi-GPU Interconnect | ใช้ NVLink สำหรับ Expert Parallelism (EP) | การ์ด PCIe แบบไม่มี NVLink จะติด All-to-All Bottleneck |
| KV Cache Architecture | DeepSeek MLA ช่วยลด KV Cache ลง >90% | ยังมีงบ KV รวมเมื่อรับ Concurrency สูง |
| Expert Offloading | Offload บาง Expert ไป CPU/NVMe แรม | ช่วยให้รันบนการ์ดจอเล็กได้ แต่ลด Decode Speed |

### เช็กริสต์ก่อน Deploy MoE Cluster

- รวม VRAM ของทุก GPU บน Cluster ให้เกินขนาด Total Weights + KV Overhead

- ตรวจไดรเวอร์ NVLink / NVSwitch หรือ InfiniBand ระหว่างการ์ด

- เลือก runtime ที่มี EP และ MLA support เช่น vLLM หรือ SGLang

- ทดสอบ FP8 E4M3 Weights กับ FP8 KV Cache ก่อนปรับเป็น 4-bit

### ตัวอย่าง vLLM serve command สำหรับ DeepSeek-V3 MoE (8x H100)

```

vllm serve deepseek-ai/DeepSeek-V3 \
  --tensor-parallel-size 1 \
  --pipeline-parallel-size 1 \
  --expert-parallel-size 8 \
  --kv-cache-dtype fp8 \
  --max-model-len 32768

```

## แหล่งอ้างอิง

- [vLLM distributed serving](https://docs.vllm.ai/en/latest/features/speculative_decoding/)

- [vLLM capabilities](https://docs.vllm.ai/en/stable/)
