• ใช้ตัวเลือก --cpu-moe ของ llama-cpp เพื่อให้ เลเยอร์ผู้เชี่ยวชาญของ MOE ทำงานบน CPU และออฟโหลดเฉพาะเลเยอร์ attention ไปยัง GPU ทำให้ได้ประสิทธิภาพ prefill ที่รวดเร็วด้วย VRAM เพียง 5~8GB
  • บน GPU จะเก็บไว้เฉพาะ KV cache, ค่าน้ำหนักและค่ากระตุ้นของ Attention, ตาราง routing, LayerNorm ฯลฯ ซึ่งเป็นพารามิเตอร์ที่ไม่ใช่ expert จึงใช้หน่วยความจำน้อย
  • แม้ใช้ GPU ระดับ RTX 3060Ti และ RAM ระบบ 64GB~96GB ก็ยังรันโมเดล 120B ได้สบาย และจะได้ประสิทธิภาพดีที่สุดบน GPU ที่รองรับ BF16 (RTX 3000 ขึ้นไป)
  • เมื่อใช้ VRAM 5GB ทำได้ 8.15ms ต่อโทเค็น (122.66 โทเค็น/วินาที) และเมื่อใช้ VRAM 8GB ปรับดีขึ้นเป็น 7.44ms ต่อโทเค็น (134.44 โทเค็น/วินาที)
  • โครงสร้าง 120B นี้ถูกออกแบบมาให้เหมาะกับฮาร์ดแวร์ผู้บริโภค จึงรันได้เร็วแม้ในสภาพแวดล้อมที่ทรัพยากร GPU จำกัด

โครงสร้าง CPU-MOE และการออฟโหลดไป GPU

  • ใช้ตัวเลือก --cpu-moe เพื่อให้เลเยอร์ expert (MOE) ทั้งหมดประมวลผลบน CPU
    • ตัวอย่าง: --n-cpu-moe 36 → ให้ MOE ทั้ง 36 บล็อกทำงานบน CPU ทั้งหมด
    • หากต้องการก็สามารถย้าย MOE บางส่วนไปยัง GPU เพื่อปรับจูนประสิทธิภาพได้
  • บน GPU จะเก็บไว้เฉพาะสิ่งต่อไปนี้เพื่อประหยัด VRAM
    • KV cache (sequence)
    • ค่าน้ำหนักและค่ากระตุ้นของ Attention
    • ตาราง routing
    • LayerNorm และพารามิเตอร์อื่นที่ไม่ใช่ expert
  • เนื่องจากค่าน้ำหนักของ MOE ไม่ได้อยู่บน GPU จึงไม่มีภาระจากพารามิเตอร์ MLP ขนาดใหญ่

หน่วยความจำและความต้องการด้านฮาร์ดแวร์

  • GPU: VRAM 5~8GB ก็เพียงพอ (เช่น RTX 3060Ti)
  • หาก GPU รองรับ BF16 จะดีที่สุด (RTX 3000 series ขึ้นไป)
  • RAM ระบบ: ขั้นต่ำ 64GB และ 96GB จะเหมาะที่สุด
    • ใช้ Linux mmap เพื่อให้แม้โมเดลทั้งหมดจะไม่อยู่ในหน่วยความจำ ก็ยังคงเก็บเลเยอร์ expert ที่ “ฮอต” ไว้ในหน่วยความจำได้

ตัวเลขประสิทธิภาพ

สภาพแวดล้อม VRAM 5GB

  • การประมวลผลพรอมป์ต์: 8.15ms/โทเค็น (122.66 โทเค็น/วินาที)
  • การอนุมาน: 55.44ms/โทเค็น (18.04 โทเค็น/วินาที)

สภาพแวดล้อม VRAM 8GB (--n-cpu-moe 36, ที่เหลือบน GPU)

  • การประมวลผลพรอมป์ต์: 7.44ms/โทเค็น (134.44 โทเค็น/วินาที)
  • การอนุมาน: 39.03ms/โทเค็น (25.62 โทเค็น/วินาที)

สภาพแวดล้อม VRAM 22GB (ย้าย MOE บางส่วนไป GPU)

  • การประมวลผลพรอมป์ต์: 6.13ms/โทเค็น (163.01 โทเค็น/วินาที)
  • การอนุมาน: 32.45ms/โทเค็น (30.82 โทเค็น/วินาที)

บทสรุป

  • การออกแบบของ GPT-OSS-120B ถูกปรับให้เหมาะกับการ รันโมเดลขนาดใหญ่ด้วยความเร็วสูงบนฮาร์ดแวร์ผู้บริโภค
  • ด้วยโครงสร้าง CPU-MOE ที่ลดการใช้ VRAM แต่ยังคงความเร็วไว้ได้ จึงเหมาะอย่างยิ่งกับสภาพแวดล้อมที่ทรัพยากร GPU มีจำกัด

คำถามสำคัญและคำตอบ

Q1. ในการตั้งค่านี้ ใช้ VRAM จริงเท่าไร?

  • ผู้เขียนต้นฉบับ: ถ้าให้ MOE ทั้งหมดรันบน CPU จะใช้ VRAM ราว 5GB และย้ายขึ้น GPU เฉพาะเลเยอร์ attention
  • คำอธิบายเพิ่มเติม: บน GPU จะมีเพียง KV cache, ค่าน้ำหนักและค่ากระตุ้นของ Attention, ตาราง routing และ LayerNorm

Q2. อย่างน้อยต้องมี RAM เท่าไร?

  • ผู้เขียนต้นฉบับ: ขั้นต่ำ 64GB และแนะนำ 96GB จะดีที่สุด
  • เหตุผล: Linux mmap จะเก็บเลเยอร์ expert ที่ “ฮอต” ไว้ในหน่วยความจำ ทำให้เข้าถึงได้เร็วแม้ไม่ต้องโหลดโมเดลทั้งหมด

Q3. ถ้าย้ายเลเยอร์ MOE บางส่วนไป GPU จะเร็วขึ้นมากไหม?

  • ผู้เขียนต้นฉบับ: เร็วขึ้นได้เล็กน้อย แต่ไม่ได้ต่างมาก
  • ตัวอย่าง:
    • MOE ทั้งหมดบน CPU: พรอมป์ต์ 134 โทเค็น/วินาที, อนุมาน 25 โทเค็น/วินาที
    • MOE 8 ตัวบน GPU: พรอมป์ต์ 163 โทเค็น/วินาที, อนุมาน 30 โทเค็น/วินาที
    • การใช้ VRAM เพิ่มเป็น 22GB

Q4. GPU แบบไหนเหมาะสม?

  • ผู้เขียนต้นฉบับ: RTX 3060Ti ขึ้นไปก็เพียงพอ และแนะนำให้รองรับ BF16 (RTX 3000+)
  • เหตุผล: ทุกเลเยอร์นอกเหนือจาก MOE ทำงานด้วย BF16

Q5. ต้องตั้งค่าคำสั่งอย่างไร?

  • ผู้เขียนต้นฉบับ: มีตัวอย่างอ้างอิงจาก PR #15157
    ~/build/llama.cpp/build-cuda/bin/llama-server \  
        -m $LLAMA_MODEL_DIR/gpt-oss-120b-mxfp4-00001-of-00003.gguf \  
        --n-cpu-moe 36 \  
        --n-gpu-layers 999 \  
        -c 0 -fa \  
        --jinja --reasoning-format none \  
        --host 0.0.0.0 --port 8502 --api-key "dummy"  
    

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

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