การเสิร์ฟโมเดลภาษาขนาดใหญ่ความเร็วสูงบนพีซีที่ติดตั้ง GPU สำหรับผู้บริโภค
(github.com/SJTU-IPADS)- PowerInfer เป็นเอนจินอนุมานแบบไฮบริด CPU/GPU สำหรับเสิร์ฟ LLM แบบโลคัลบนพีซีส่วนบุคคลที่ติดตั้ง GPU สำหรับผู้บริโภค เพียงตัวเดียว
- การออกแบบหลักใช้ประโยชน์จาก locality ของการกระตุ้น ในการอนุมาน LLM โดยนำ hot neuron ที่ถูกกระตุ้นบ่อยขึ้นไปไว้บน GPU ล่วงหน้า และคำนวณ cold neuron ที่เปลี่ยนไปตามอินพุตบน CPU
- ในการประเมิน PowerInfer ระบุว่าสามารถทำได้เฉลี่ย 13.20 tokens/s และสูงสุด 29.08 tokens/s บน RTX 4090 แบบ GPU เดี่ยวกับ LLM หลายตัวรวมถึง OPT-175B ซึ่งต่ำกว่า A100 อยู่ 18%
- เมื่อเทียบกับ llama.cpp พบว่าในเดโม Falcon(ReLU)-40B-FP16 บน RTX 4090 24GB ได้ เร็วขึ้น 11x และในการประเมินได้สูงสุด 11.69x โดยอธิบายว่ายังคงความแม่นยำของโมเดลไว้
- ขอบเขตการรองรับเน้นโมเดลที่ใช้ฟังก์ชันกระตุ้น ReLU/ReGLU/Squared ReLU และมีข้อจำกัดว่ายังไม่รองรับ Mistral, original Llama, Qwen เป็นต้น
ปัญหาที่ PowerInfer พยายามแก้
- PowerInfer เป็นเอนจินอนุมาน CPU/GPU สำหรับรัน LLM บนอุปกรณ์โลคัลอย่างรวดเร็ว
- มุ่งเป้าไปที่พีซีที่ติดตั้ง GPU สำหรับผู้บริโภคเพียงตัวเดียว และมีเป้าหมายเพื่อการอนุมานและการเสิร์ฟ LLM ที่มี latency ต่ำ
- หัวใจของการออกแบบคือการที่การกระตุ้น neuron ในการอนุมาน LLM มีลักษณะเป็น การกระจายแบบกฎกำลัง
- hot neuron บางส่วนจะถูกกระตุ้นอย่างสม่ำเสมอในอินพุตโดยรวม
- cold neuron จำนวนมากจะแตกต่างกันไปตามอินพุตเฉพาะ
วิธีอนุมานแบบไฮบริด CPU/GPU
- PowerInfer จะโหลด hot neuron ไว้บน GPU ล่วงหน้าเพื่อให้เข้าถึงได้รวดเร็ว และคำนวณ cold neuron บน CPU
- วิธีนี้มุ่งลดความต้องการหน่วยความจำ GPU และการรับส่งข้อมูลระหว่าง CPU-GPU
- นอกจากนี้ยังรวม predictor แบบปรับตัวได้ และ sparse operator ที่รับรู้ระดับ neuron เพื่อเพิ่มประสิทธิภาพการกระตุ้น neuron และความกระจัดกระจายของการคำนวณ
- ในการอนุมานแบบไฮบริด CPU-GPU จะ offload dense activation block ทั้งหมดไปยัง GPU โดยอัตโนมัติ แล้วจะแยก FFN เพื่อ offload ไปยัง GPU หากเป็นไปได้
การประเมินประสิทธิภาพและเดโม
- บน RTX 4090 แบบ GPU เดี่ยว สามารถทำได้เฉลี่ย 13.20 tokens/s และสูงสุด 29.08 tokens/s กับ LLM หลายตัวรวมถึง OPT-175B
- อธิบายว่าผลลัพธ์นี้ต่ำกว่า GPU ระดับเซิร์ฟเวอร์ชั้นนำอย่าง A100 อยู่ 18%
- เร็วกว่า llama.cpp สูงสุด 11.69x และระบุว่ายังคงความแม่นยำของโมเดลไว้
- ในเดโม ได้รัน Falcon(ReLU)-40B-FP16 บน RTX 4090 24GB เพียงตัวเดียว และแสดงความเร็วที่สูงกว่า llama.cpp 11x
- ทั้ง PowerInfer และ llama.cpp รันบนฮาร์ดแวร์เดียวกัน และใช้ VRAM ของ RTX 4090 จนเต็ม
- ในการประเมินแยก ภายใต้เงื่อนไข RTX 4090 24GB, โมเดล FP16 ReLU, ความยาวอินพุต 64 พบว่า Falcon 40B เร็วขึ้นสูงสุด 11x และ Llama 2 70B เร็วขึ้นสูงสุด 3x
- บน RTX 2080Ti 11GB กับโมเดล INT4 ReLU และความยาวอินพุต 8 พบว่า Falcon 40B เร็วขึ้นสูงสุด 8x และ Llama 2 70B เร็วขึ้นสูงสุด 3x
โมเดลและแพลตฟอร์มที่รองรับ
- ปัจจุบันโมเดลที่ใช้งานได้กับ PowerInfer คือ Falcon-40B, Llama2 family, ProSparse Llama2 family และ Bamboo-7B
- น้ำหนักโมเดลที่รองรับถูกแจกจ่ายในรูปแบบ PowerInfer GGUF ซึ่งเป็นฐาน GGUF ที่รวมทั้งน้ำหนัก LLM และน้ำหนัก predictor ไว้ด้วยกัน
- โมเดล PowerInfer GGUF ที่มีให้บน Hugging Face ได้แก่
- PowerInfer/ReluLLaMA-7B-PowerInfer-GGUF
- PowerInfer/ReluLLaMA-13B-PowerInfer-GGUF
- PowerInfer/ReluFalcon-40B-PowerInfer-GGUF
- PowerInfer/ReluLLaMA-70B-PowerInfer-GGUF
- PowerInfer/ProSparse-LLaMA-2-7B-GGUF
- PowerInfer/ProSparse-LLaMA-2-13B-GGUF
- PowerInfer/Bamboo-base-v0.1-gguf
- PowerInfer/Bamboo-DPO-v0.1-gguf
- แพลตฟอร์มที่ทดสอบแล้วมีดังนี้
- CPU x86-64 ที่รองรับ AVX2 บน Linux ทั้งกรณีมีและไม่มี NVIDIA GPU
- CPU x86-64 ที่รองรับ AVX2 บน Windows ทั้งกรณีมีและไม่มี NVIDIA GPU
- สภาพแวดล้อม CPU-only ของ Apple M chip บน macOS
- ระบุว่า Mac ไม่ใช่เป้าหมายการเพิ่มประสิทธิภาพในตอนนี้ จึงยังไม่ได้ปรับปรุงประสิทธิภาพมากนัก
- มีแผนเพิ่ม Metal backend สำหรับ sparse inference บน macOS
ขั้นตอนการติดตั้งและการรัน
- dependency สำหรับการ build คือ CMake 3.17 ขึ้นไป, Python 3.8 ขึ้นไป และ pip 19.3 ขึ้นไป
- การ build สำหรับ NVIDIA GPU ใช้ตัวเลือก
-DLLAMA_CUBLAS=ON - การ build สำหรับ AMD GPU ใช้ ROCm/HIP และระบุ
-DLLAMA_HIPBLAS=ONพร้อมAMDGPU_TARGETS - สามารถ build แบบ CPU-only ได้เช่นกัน
- คำสั่งอนุมานพื้นฐานใช้ executable
mainโดยระบุพาธโมเดล จำนวนโทเค็นเอาต์พุต จำนวนเธรด และพรอมป์ต์ - จำกัดการใช้ GPU VRAM ได้ด้วยตัวเลือก
--vram-budget - คำสั่งสำหรับ serving, perplexity evaluation และ batched generation ของ PowerInfer รองรับรูปแบบเดียวกับ llama.cpp แต่อาร์กิวเมนต์
-nglใน PowerInfer ถูกแทนที่ด้วย--vram-budget
การควอนไทซ์และความเข้ากันได้
- PowerInfer รองรับการปรับแต่งประสิทธิภาพสำหรับการควอนไทซ์โมเดล INT4
Q4_0 - สามารถใช้ executable
quantizeเพื่อควอนไทซ์โมเดล PowerInfer GGUF ให้อยู่ในรูปแบบQ4_0 - dense inference mode รองรับแบบจำกัด และใช้งานได้ในลักษณะคล้ายกับ llama.cpp
- dense inference mode ไม่ใช่โหมดเข้ากันได้สำหรับทุกโมเดล
- โมเดล ReluLLaMA และ ProSparse มีการเปลี่ยนฟังก์ชันกระตุ้น
- โมเดล Bamboo มีการเปลี่ยนสถาปัตยกรรมของโมเดล
- สามารถรันด้วยน้ำหนักโมเดลของ llama.cpp เพื่อความเข้ากันได้ในการอนุมานได้เช่นกัน แต่ระบุว่าจะไม่มีประสิทธิภาพเพิ่มขึ้น
ข้อจำกัดและ FAQ
- ปัจจุบันโมเดลที่รองรับถูกจำกัดอยู่ที่โมเดลที่ใช้ฟังก์ชันกระตุ้น ReLU/ReGLU/Squared ReLU
- ขณะนี้ยังไม่รองรับ Mistral, original Llama, Qwen เป็นต้น
- หากเกิด
CUDA_ERROR_OUT_OF_MEMORYสามารถสร้างดัชนี GPU ใหม่ได้ด้วย--reset-gpu-index - ใน implementation ปัจจุบัน การ offload โมเดลอาจไม่แม่นยำอย่างที่คาดไว้ จึงอาจต้องลดค่า
--vram-budgetลงเล็กน้อย หรือปิดการ offload FFN ด้วย--disable-gpu-index - อธิบายว่าการลดลงของตัวชี้วัดประสิทธิภาพในโมเดล ReLU ปัจจุบัน โดยเฉพาะโมเดล 70B เป็นเพราะ fine-tune ด้วยเพียง 5B โทเค็น แทนที่จะเป็นประมาณ 2T โทเค็นที่โดยทั่วไปต้องใช้ในการฝึก LLM
อัปเดตล่าสุดและแผนงาน
- เมื่อวันที่ 5 มกราคม 2026 ได้เปิดตัว Tiiny AI Pocket Lab และระบุว่าสามารถรัน GPT-OSS-120B int4 แบบโลคัลที่ความเร็ว 20 tokens/s
- เมื่อวันที่ 27 กรกฎาคม 2025 ได้เปิดตัว SmallThinker-21BA3B-Instruct และ SmallThinker-4BA0.6B-Instruct
- เมื่อวันที่ 11 มิถุนายน 2024 ได้แนะนำเฟรมเวิร์กอนุมานที่ปรับให้เหมาะกับสมาร์ตโฟน PowerInfer-2 และระบุว่าทำได้ 11.68 tokens/s บน TurboSparse-Mixtral-47B
- ในวันเดียวกัน ได้เผยแพร่ Turbo Sparse และอธิบายว่าสามารถทำให้โมเดล Mistral และ Mixtral มีความกระจัดกระจายประมาณ 90% และเปิดใช้งานเพียง 4B พารามิเตอร์ในโมเดลระดับ Mixtral
- รายการที่เสร็จแล้วประกอบด้วยการเปิดเผยโค้ดหลักของ PowerInfer, รองรับ Llama-2 และ Falcon-40B, รองรับ Bamboo-7B, รองรับ Windows, เปิดเผยโค้ดสำหรับ perplexity evaluation และรองรับการแบ่ง FFN แบบออนไลน์
- รายการที่ยังเหลือประกอบด้วยการรองรับ text-generation-webui, การรองรับ Metal บน Mac, การเปิดเผยโค้ดสำหรับ OPT model, การเปิดเผยโค้ดสำหรับ predictor training และการรองรับ Multi-GPU
เอกสารวิจัยและโครงการฐาน
- รายละเอียดทางเทคนิคเพิ่มเติมสรุปไว้ใน บทความวิจัย PowerInfer
- PowerInfer ใช้ไลบรารี operator ที่ปรับแก้ได้ของ ggml และ runtime execution ของ llama.cpp
- การรองรับ sparse model ที่อิง ReLU มีการกล่าวถึง THUNLP
- PowerInfer ระบุว่าได้รับแรงบันดาลใจจากงานวิจัย Deja Vu
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
ในแมชชีนเลิร์นนิงส่วนใหญ่ไม่มีแนวคิดเรื่อง hot/cold neurons เลยต้องใช้เวลาทำความเข้าใจอยู่บ้าง และดูเหมือนบทความวิจัยก็ไม่ได้ให้นิยามไว้โดยตรง
สำหรับ ReLU ถ้าเอาต์พุตเป็น 0 บ่อย ๆ ก็ถือว่า “cold” ได้ จึงฟังดูสมเหตุสมผล แต่เดิมที LLaMA ไม่ได้ใช้ ReLU พอกลับไปดู GitHub อีกครั้ง วิธีนี้ทำงานจริงเฉพาะกับ โมเดล ReLU เท่านั้น และมีกลุ่มที่ “fine-tune” โมเดลให้เป็น ReLU เพื่อให้ได้ sparsity: https://huggingface.co/SparseLLM
ดังนั้นจึงใช้ไม่ได้กับโมเดลอะไรก็ได้ที่มักหาเจอบนอินเทอร์เน็ต แต่ความคืบหน้านี้เองก็ดูใหญ่ทีเดียว ต่อไปอาจขยับไปสู่การประนีประนอมระหว่างโมเดลที่ใหญ่ขึ้นกับ activation function ที่ไม่เหมาะนัก และก็สงสัยด้วยว่ากฎระเบียบของสหรัฐฯ/สหภาพยุโรปจะนับ sparsity อย่างไรเมื่อใช้ FLOPs หรือจำนวนพารามิเตอร์เป็นเกณฑ์
งานวิจัยในอนาคตดูเป็นไปได้ในทิศทางที่ยังคง activation function เดิมอย่าง SwiGLU ของ LLaMA ไว้ แต่ใช้ quantization เพื่อกำหนดบริเวณอิ่มตัวให้เป็น hot/cold neurons
ถ้ารัน Mixtral แบบปลดการเซ็นเซอร์ด้วยสิ่งนี้ได้คงดีมาก บน RTX 4090 อาจทำ quantization เกิน 3 บิตได้ด้วย
ในเชิงเทคนิค Mixtral ก็มี sparse activation ที่ควบคุมด้วยโครงข่ายประสาทอยู่แล้ว แต่เหมือนมีม Inception คือต้อง “ลงไปลึกกว่านี้”
ทั้งหมดนี้เป็น fork ของ llama.cpp เลยหวังว่าสักวันจะถูก merge กลับเข้า upstream project
เห็นว่ากำลังทำ Mistral-7B อยู่ ส่วน implementation ของ Mistral สำหรับ GPU ของผมใช้ VRAM มากกว่า 5GB นิดหน่อย: https://github.com/Const-me/Cgml
รันได้ค่อนข้างดีบน GPU ระดับผู้บริโภคส่วนใหญ่ แต่ตอนนี้รองรับเฉพาะ Windows
เจ๋งจริง ๆ แม้ llama.cpp จะได้รับความรักมาก แต่แนวทาง offloading ไปยัง GPU แยกของมันค่อนข้างเรียบง่าย คือประมวลผล prompt บน GPU แล้วแบ่งโมเดลตรงกลาง
ที่น่าสนใจคือ activation sparsity มีมากพอให้ใช้ประโยชน์ได้ และจากมุมมองแมชชีนเลิร์นนิงแบบดั้งเดิม มักมองว่าการเข้าถึงหน่วยความจำมีความสุ่มมาก
สักวันหนึ่งคงดีถ้าสามารถ offload cold neurons ไปยัง GPU ในตัวได้ ที่บอกว่ากำลังพิจารณา Metal kernel ก็ชวนสงสัย เพราะคิดว่าข้อได้เปรียบด้านประสิทธิภาพมาจาก memory pool แบบไฮบริด ถ้าไม่ใช่อย่างนั้นก็น่าจะช่วยได้เฉพาะ Mac AMD รุ่นเก่า แต่อาจมีอะไรที่ผมพลาดไปก็ได้
ถ้าไม่มีการคัดลอกระหว่าง GPU กับ CPU และใช้ unified memory อยู่แล้ว ความเร็วที่เพิ่มขึ้นอาจไม่มาก แต่ถ้าใช้ความสามารถของชิปได้มากขึ้นพร้อมกันก็คงดี ถ้าต้องการหลีกเลี่ยงการลดประสิทธิภาพจากความร้อน น่าจะใช้เฉพาะ efficiency cores และ game mode ก็น่าจะทำแบบนั้นเหมือนกัน
ใน implementation นี้ ดูเหมือนต้องมีความรู้เกี่ยวกับตัวโมเดลพอสมควรเพื่อกำหนดว่าส่วนไหนจะอยู่ใน system memory และส่วนไหนจะอยู่ใน GPU memory
ตามอุดมคติ สงสัยว่าจะคำนวณสิ่งนี้โดยอัตโนมัติได้ไหม หรือโมเดลในอนาคตจะมี interface ที่ทำให้ placement algorithm แบบนี้เป็นอัตโนมัติได้หรือไม่ ถ้าต้องปรับอัลกอริทึมให้เข้ากับสถาปัตยกรรมโมเดลแต่ละแบบ การดูแลโปรเจกต์นี้คงเหนื่อยทีเดียว
ความเร็วเพิ่มขึ้น 10 เท่า น่าประทับใจจริง ๆ ถ้าทำซ้ำได้กับโมเดลอื่น กระบวนการระบุ hot/cold neurons เพื่อเพิ่มประสิทธิภาพ inference ก็น่าจะกลายเป็นส่วนหนึ่งตามปกติของการพัฒนาโมเดล
ส่วนสำคัญจาก README สำหรับคนที่จะไม่ทดลองเองมีประมาณนี้ PowerInfer ถูกทดสอบบน CPU x86-64 ของ Linux (AVX2), CPU x86-64 ของ Linux ร่วมกับ NVIDIA GPU และชิป Apple M บน macOS
อย่างไรก็ตาม เขาบอกว่ายังไม่ได้ optimize สำหรับ Mac ดังนั้นตอนนี้ประสิทธิภาพที่เพิ่มขึ้นยังไม่มาก ฟีเจอร์ที่จะเพิ่มเร็ว ๆ นี้มี โมเดล Mistral-7B และ Metal sparse inference backend สำหรับ macOS
convert.pyก็ควรกล่าวถึงด้วยจุดที่ยอดเยี่ยมคือการออกแบบ GPU-CPU hybrid inference engine โดยใช้การกระจายที่ว่า “มี hot neurons จำนวนน้อยที่ activate อย่างสม่ำเสมอในทุกอินพุต และ cold neurons จำนวนมากที่เปลี่ยนไปตามอินพุต”
คำอธิบายคือเอา hot neurons ขึ้น GPU ไว้ล่วงหน้าเพื่อให้เข้าถึงได้เร็ว ส่วน cold neurons คำนวณบน CPU เพื่อลดความต้องการ GPU memory และการถ่ายโอนข้อมูลระหว่าง CPU-GPU ลงอย่างมาก
ที่ทุกคนเอาไปเทียบกับ llama.cpp ก็เพราะเป็นทางที่ง่าย ต้องให้ทุกคนรู้ว่า llama.cpp ช้า ควรเทียบกับ exllamav2 หรืออิมพลีเมนต์อื่นที่ปรับแต่งมาแล้ว
main.cppและโค้ด llama.cpp ทั่วไปตามเดิม จึงเทียบโดยตรงได้https://github.com/ggerganov/llama.cpp/pull/4543 [Review] Merge PowerInfer with llama.cpp mainline #4543
https://github.com/ggerganov/llama.cpp/discussions/4534#disc... ยังมีคำอธิบายว่า “การเร่งความเร็ว 11 เท่าเป็นการเลือกตัวอย่างที่เข้าทางอยู่บ้าง เพราะโค้ด GPU ของ llama.cpp สำหรับ Falcon 40B ยังไม่ได้ปรับแต่งมาดี”
แถม exllama ก็ดูเหมือนจะมีผลข้างเคียงด้านความสม่ำเสมอด้วย: https://www.reddit.com/r/LocalLLaMA/comments/17w57eu/llm_for...
ถ้าสามารถสร้าง ไฟล์ตัวทำนายแบบ sparse สำหรับโมเดลใด ๆ ได้ก็คงเจ๋งมาก ตอนนี้ดูเหมือนจะใช้ได้เฉพาะกับ 4 โมเดลที่พวกเขาประมวลผลไว้เท่านั้น
ดูจากหน้าเว็บและโค้ดแล้ว เหมือนจะไม่ได้รวมเครื่องมือสำหรับทำขั้นตอนนั้นไว้ ตอนนี้คงรอดูไปก่อน และหวังว่าฟีเจอร์เหล่านี้สุดท้ายจะถูกรวมกลับเข้าไปเป็นอ็อปชันของ llama.cpp นี่ไม่ใช่แค่การใช้ไลบรารีเมทริกซ์ ggml แต่เป็นฐานโค้ด llama.cpp ทั่วไป
แค่เห็นคำว่า “GPU ระดับผู้บริโภค” ก็เหมือนจะรันได้บนหลายรุ่น แต่ก็อดสงสัยไม่ได้ว่าเหมือนบทความแนวนี้ทั่วไปหรือเปล่า ที่จริงแล้วเป็น เฉพาะ RTX 4090
เทคนิคนี้เองเป็นแนวทางทั่วไปที่ช่วยให้รันโมเดลใหญ่ขึ้นบน GPU ขนาดเล็กได้ และช่วยปรับปรุงประสิทธิภาพของ CPU offloading ได้มาก นอกจากกรณีที่รันโมเดลใหญ่สุดแบบ fp16 บน 4090 แล้ว การรันโมเดลเดียวกันแบบควอนไทซ์ 4 บิตบน 2080Ti ก็ยังเห็นความเร็วเพิ่มขึ้นประมาณ 3 เท่าตามเกณฑ์ของ LLaMA
ดังนั้นบนเดสก์ท็อป โมเดล 33B น่าจะกลายเป็นค่ามาตรฐานใหม่ และมีความเป็นไปได้สูงว่าแม้มี 3090 หรือ 4090 เพียงใบเดียว ก็จะรัน 70B ได้ที่ความเร็วระดับแชตแบบเรียลไทม์