30 คะแนน โดย GN⁺ 2025-08-13 | 6 ความคิดเห็น | แชร์ทาง WhatsApp
  • ใช้ตัวเลือก --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"  
    

6 ความคิดเห็น

 
kaydash 2025-08-14

ผมลองจริงแล้ว แต่มันช้ามาก
แทบไม่ได้ใช้ GPU clock เลย
ใช้หน่วยความจำเฉพาะของ GPU 8GB และหน่วยความจำระบบ 64GB จนเต็ม
ส่วน 16 vCore ใช้แค่ครึ่งเดียว
ต้องมองว่าความหมายคือมันแค่รันได้เท่านั้น ไม่ได้อยู่ในลักษณะที่ใช้ทรัพยากรทั้งหมด
หนึ่งคำถามใช้เวลา 6~8 นาทีครับ

 
cronex 2025-08-13

คล้ายกันเลย ผมก็คงต้องลองทำดูเหมือนกันครับ

 
crawler 2025-08-13

คิดว่า 32GB ก็น่าจะพอแล้วซะอีก...

 
cnaa97 2025-08-13

อย่างแรกเลย รันบน lm studio M4 max 64gb ไม่ได้อะ T_T

 
jinucho 2025-08-13

ขนาด 65GB เลย... น่าเสียดายจัง ฮือฮือ

 
GN⁺ 2025-08-13
ความคิดเห็นจาก Hacker News
  • สงสัยว่าถ้ารันโมเดลบนฮาร์ดแวร์ของตัวเองโดยตรง จะสามารถปิด guardrails ได้หรือไม่
    • ถ้าจะหลบเลี่ยง guardrails น่าจะต้องหา ‘abliterated finetune’ ที่ตามรอยแล้วลบ เส้นทางนิวรอน ที่ทำให้เกิดการปฏิเสธ
    • จากบทความที่เพิ่งอ่านมา GPT-OSS ฝึกด้วยข้อมูลสังเคราะห์/ข้อมูลที่สร้างขึ้นเท่านั้น จึงอาจไม่มี ‘ความรู้ต้องห้าม’ มากนักตั้งแต่แรก
      บทความที่เกี่ยวข้อง
    • สามารถหลบเลี่ยงได้ด้วยพรอมป์ต์ jailbreak และถึงจะยุ่งยากเล็กน้อยแต่ก็ได้ผลดี
    • เวอร์ชันที่ถอด guardrails ออกบางส่วนทำให้ประสิทธิภาพตกลงมาก จึงมองว่าสำหรับตัวเองไม่คุ้ม
    • โดยพื้นฐานแล้วมันฝังมาในตัวโมเดล แต่ก็มีชุมชนที่คอยแคร็กและดัดแปลงสิ่งนี้อยู่
  • บนสภาพแวดล้อม 5950x + RAM 128GB + GPU 3060 12GB ความเร็วการสร้างโทเค็นนั้นเร็ว แต่พอ context ใหญ่ขึ้นเพียงเล็กน้อยความเร็วประมวลผลก็ช้าลงมาก
    จึงใช้งานโมเดลอื่นอย่าง qwen, mistral, gemma เป็นหลักอยู่ตอนนี้
    • มากกว่าคำบรรยายเชิงอัตวิสัยอย่าง ‘เร็ว’ หรือ ‘ช้า’ อยากรู้ตัวเลขโทเค็นที่ชัดเจนมากกว่า
    • นอกจากแชตธรรมดา/การจัดการข้อความแล้ว ก็สงสัยว่าอยากใช้โมเดลนี้ทำอะไร
  • ในสภาพแวดล้อม RAM 32GB + VRAM 16GB โมเดล 20B สามารถโหลดขึ้น VRAM ได้ทั้งหมด แต่ถ้าขยายหน้าต่างคอนเท็กซ์เกิน 8k โทเค็น ก็จะ VRAM ไม่พอ
    ขณะที่คนอื่นรันโมเดล 120B ได้ด้วย VRAM ที่น้อยกว่า ซึ่งอาจเป็นเพราะไม่รองรับ ROCm และใช้ Vulkan
    ถึงอย่างนั้น การรีดฮาร์ดแวร์ไปจนสุดขีดก็สนุกดี
    • ยิ่งขนาดคอนเท็กซ์ใหญ่ขึ้น ก็ยิ่งต้อง offload เลเยอร์ไปยังระบบ RAM มากขึ้น
      llama.cpp สามารถตั้งจำนวนเลเยอร์ที่ให้ GPU คำนวณได้เอง แต่ ollama จะปรับให้อัตโนมัติ
      ถ้าปรับสัดส่วน RAM/VRAM แบบไดนามิกตามความยาวเซสชันได้ก็คงดี
  • การเรียก RAM 64GB + VRAM 8GB ว่า ‘แค่พอไหว’ นี่ชวนขำ เพราะสำหรับฉันมันคือชุดที่ราคาเป็นพันดอลลาร์
    • RAM ราว 300 CAD, GPU ราว 400 CAD ดังนั้นถ้าเป็นเดสก์ท็อปก็ประกอบได้ในราคาถูก
    • อยู่ระดับใกล้เคียงพีซีเกมมิงช่วงล่างถึงกลาง จึงอัปเกรดเพิ่มอีกไม่กี่ร้อยดอลลาร์แล้วรันที่บ้านได้เลย
    • มีสินค้า pre-order ที่ราคาไม่แพงมากอยู่ราว $1599~$1999
    • สามารถประกอบด้วยชิ้นส่วนใหม่ในงบต่ำกว่า 1000 ดอลลาร์สหรัฐ และถ้าเป็นมือสองก็จะถูกลงอีกพร้อมประสิทธิภาพ GPU ที่อาจดีกว่า
    • DDR5 64GB อยู่ที่ประมาณ $150, 3060 12GB อยู่ที่ประมาณ $300 และใน eBay อาจหาได้ถูกกว่านี้
  • สงสัยว่ามีใครเคยลองรันโมเดล 20B บน MacBook Air M4 หรือ RTX 3060 บ้างไหม
  • แม้จะใช้โมเดลใหญ่ไม่ได้เพราะ RAM ไม่พอ แต่โมเดล 20B บน MacBook นั้นเร็วและเพียงพอกับการใช้งานของฉัน
    เพียงแต่ function calling ใน llama.cpp ยังพังอยู่
    • บั๊กนั้นถูกแก้แล้วใน PR นี้
    • โชคดีที่เป็นบั๊กไม่ใช่ข้อจำกัดของ RAM และแม้แต่ MacBook Air RAM 16GB ก็รันหลายโมเดลได้ดี
      มีแผนจะโฮสต์ AI chatbot ด้วยมินิพีซีราคา $149 ในห้องนอน และโมเดล Qwen3 4B ก็ดูน่าสนใจ
      แผนที่เกี่ยวข้อง
  • สงสัยว่าใน OpenWebUI หรือ GUI อื่น ๆ จะสามารถปรับตั้งค่าให้เหมาะกับสเปกนี้ได้หรือไม่ และคิดว่าโมเดล 20B น่าจะดีกว่า
  • เป็นมือใหม่ด้าน LLM เลยสงสัยว่าการปรับแต่งนี้ใช้ได้กับโมเดล MoE ทุกตัวหรือไม่
    • มันเป็นวิธีใช้ regex กับชื่อเลเยอร์ ดังนั้นถ้าการตั้งชื่อคล้ายกันก็สามารถใช้กับโมเดลอื่นได้ด้วย
      ตัวอย่างเช่น ใช้งานกับ Qwen 3 ได้ และยังสามารถกำหนด regex เองเพื่อย้ายเลเยอร์บางตัวไปยังอุปกรณ์ที่ต้องการได้
  • สงสัยว่าเวอร์ชันที่ปรับแต่งสำหรับ mlx จะรันบน Mac 64GB ได้หรือไม่
    • จากค่าประเมินของ LM Studio ถ้าเป็นการควอนไทซ์ 3-bit (~50GB) ก็น่าจะรันได้ไม่มีปัญหา