ผมลองคิดหาวิธีรันโมเดลใหญ่ ๆ แบบประหยัด แล้วก็ไปเจอ CMP 100-210 เลยลองซื้อมา 4 ใบครับ
ดูเหมือนจะดีทีเดียวเพราะมี HBM2 ขนาด 16GB ต่อใบ

แต่ NVIDIA ล็อกไว้แน่นมากจริง ๆ

  • Tensor Core ช้าลง 64 เท่า (HMMA latency 8→512 cycle)
  • เป็น PCIe Gen1 x1 และไม่มี P2P
  • บล็อก CUPTI ด้วย เลยใช้ torch.profiler ไม่ได้
  • เป็น e-fuse ที่ฝังอยู่บนได จึงปลดด้วยเฟิร์มแวร์ไม่ได้ (ลองมาหมดแล้ว)

เพราะงั้นทั้ง vLLM, เส้นทางปกติของ llama.cpp, FA และ bnb ใช้งานไม่ได้ทั้งหมด
ทุกอย่างที่ไปแตะ cuBLAS Tensor Core จะวิ่งที่ความเร็ว 1/64 หรือไม่ก็พังไปเลย

เสียดายที่ GPU มูลค่า 640,000 วอนวางกลิ้งอยู่บนโต๊ะเฉย ๆ เลยเขียนเอนจินอนุมานขึ้นมาเองครับ

เลือกใช้เฉพาะเส้นทางที่ไม่โดน throttle:

  • GEMM ใช้เคอร์เนลที่เขียนเองแบบ DP4A (int8, 17 TFLOP)
  • attention ใช้ FlashAttention ที่เขียนเอง + block-sparse สไตล์ MInference
  • ระหว่าง GPU ใช้ hidden state bridge ผ่าน pinned-host (เพราะไม่มี P2P)
  • context 256K ใช้ 3-bit KV cache (WHT + Lloyd-Max) ลดจาก 17GB → 3.5GB

ตอนนี้ถ้าเป็นโมเดล Qwen3.5/3.6 hybrid (GDN + Attention) ก็รันได้ทั้ง 27B และ 9B
รองรับ OpenAI-compatible API, streaming, tool calls, vision (mmproj) และ /no_think ทั้งหมด

ผลทดสอบ (เทียบกับ llama.cpp build 8462, Q8_0 GGUF เดียวกัน, ฮาร์ดแวร์เดียวกัน):

  • 9B GPU เดี่ยว prefill: 1.22 ~ 2.99x
  • 27B แบบ 3GPU prefill: 1.45 ~ 2.86x
  • gen: +30 ~ 50%

ข้อจำกัดแบบตรงไปตรงมา:

  • ใช้กับ MoE ไม่ได้ (รองรับเฉพาะ dense hybrid)
  • ถ้ามี A100 / H100 ให้ใช้ vLLM ไปเลย เร็วกว่ามาก
  • ของอย่าง DFlash มีแค่โค้ด แต่ยังรันไม่ได้ (drafter mismatch)
  • รองรับอย่างเป็นทางการเฉพาะ Q8_0

หวังว่าจะเป็นประโยชน์กับคนที่ติดอยู่ในสภาพแวดล้อมแบบเดียวกันครับ
เอนจินนี้เป็นงานที่นักเรียน ม.4 สร้างขึ้นโดยใช้ Claude จึงอาจมีบั๊กหรือสปาเกตตีโค้ดอยู่มาก
ยินดีรับ issue และ PR!

ยังไม่มีความคิดเห็น

ยังไม่มีความคิดเห็น