vLLM บน DGX Spark: คู่มือการตั้งค่าและใช้งาน Docker สำหรับ Multi-Node Inference
สำหรับผู้ใช้งาน DGX Spark ที่ต้องการยกระดับประสิทธิภาพการประมวลผลโมเดลภาษาขนาดใหญ่ (Large Language Models - LLMs) ให้ทำงานได้อย่างเต็มศักยภาพบนคลัสเตอร์ หรือแม้แต่บนเครื่องเดี่ยว การใช้ vLLM ร่วมกับ Docker เป็นโซลูชันที่น่าสนใจ
บทความนี้จะนำเสนอข้อมูลเชิงลึกเกี่ยวกับการตั้งค่าและใช้งาน Docker สำหรับ vLLM บน DGX Spark โดยเฉพาะอย่างยิ่งในสภาวะแบบ Multi-Node ซึ่งจะช่วยให้คุณสามารถรันโมเดลได้อย่างมีประสิทธิภาพสูงสุด
vLLM คืออะไร และทำไมถึงต้องใช้กับ DGX Spark?
vLLM เป็นไลบรารีโอเพนซอร์สที่ออกแบบมาเพื่อเร่งความเร็วในการอนุมาน (inference) ของ LLMs โดยเฉพาะ มีการจัดการหน่วยความจำและการประมวลผลที่มีประสิทธิภาพสูง ทำให้สามารถรองรับโมเดลขนาดใหญ่และจำนวนผู้ใช้งานพร้อมกันได้มากขึ้น
DGX Spark ซึ่งเป็นฮาร์ดแวร์ที่ทรงพลังจาก NVIDIA เหมาะอย่างยิ่งสำหรับการประมวลผล AI และ Machine Learning การผนวก vLLM เข้ากับ DGX Spark ผ่าน Docker ช่วยให้:
- การจัดการสภาพแวดล้อมที่ง่ายขึ้น: Docker ช่วยสร้างสภาพแวดล้อมที่แยกออกเป็นอิสระ ทำให้การติดตั้งและจัดการ Dependency ต่าง ๆ เป็นไปอย่างราบรื่น
- การปรับขนาด (Scalability): รองรับการทำงานทั้งบนเครื่องเดี่ยว (Single Node) และคลัสเตอร์หลายเครื่อง (Multi-Node) ได้อย่างมีประสิทธิภาพ
- ประสิทธิภาพสูงสุด: ใช้ประโยชน์จากฮาร์ดแวร์ DGX Spark ได้อย่างเต็มที่ ด้วยการรองรับเทคโนโลยีขั้นสูง เช่น InfiniBand/RDMA (NCCL) และการโหลดโมเดลความเร็วสูง
การเตรียมความพร้อม: การสร้าง Docker Image
การเริ่มต้นคือการสร้าง Docker Image ที่จะใช้สำหรับรัน vLLM บน DGX Spark สคริปต์ build-and-copy.sh จะเป็นเครื่องมือหลักในการจัดการขั้นตอนนี้
- การดึง Image พื้นฐาน: โดยปกติ สคริปต์จะดึง Image ล่าสุดที่ผ่านการทดสอบแล้วจาก DockerHub (
eugr/spark-vllm:latest) ซึ่งมีการทดสอบกับโมเดลหลากหลายทั้งในโหมดคลัสเตอร์และโหมดเดี่ยว - การปรับแต่งการ Build:
--use-wheels: ใช้ Image ที่สร้างจาก Precompiled vLLM และ FlashInfer wheels ซึ่งเร็วกว่าการคอมไพล์จาก Source Code--rebuild-vllm: บังคับให้คอมไพล์ vLLM เวอร์ชันล่าสุดจาก Branch หลัก--vllm-ref: กำหนดเวอร์ชันหรือ Commit ID ของ vLLM ที่ต้องการ--rebuild-flashinfer,--flashinfer-ref: การปรับแต่งสำหรับการ Build FlashInfer- ระยะเวลาในการ Build: การ Build จาก Precompiled wheels จะใช้เวลาสั้นกว่า (ประมาณ 2-3 นาที หลังจากการดึง Base Image) ในขณะที่การคอมไพล์จาก Source Code ทั้งหมดอาจใช้เวลา 20-40 นาที แต่การ Build ครั้งถัดไปจะเร็วกว่า
การตั้งค่าคลัสเตอร์ (Multi-Node)
สำหรับการใช้งานบนคลัสเตอร์ DGX Spark การตั้งค่าการเชื่อมต่อระหว่างเครื่อง (Sparks) เป็นสิ่งสำคัญ
- การเชื่อมต่อระหว่าง Sparks: ตรวจสอบให้แน่ใจว่าได้เชื่อมต่อ Sparks เข้าด้วยกันและตั้งค่า Passwordless SSH แล้ว
- การกระจาย Image: ใช้สคริปต์
launch-cluster.shเพื่อดึง Tag Image ที่ต้องการและกระจายไปยังทุกโหนดในคลัสเตอร์
การใช้งานบนเครื่องเดี่ยว (Single Node)
แม้ว่าเครื่องมือจะถูกพัฒนามาเพื่อรองรับ Multi-Node เป็นหลัก แต่ก็สามารถใช้งานได้ดีเยี่ยมบนเครื่องเดี่ยวเช่นกัน
- โหมด Solo: สคริปต์
launch-cluster.shรองรับ "Solo Mode" ซึ่งเป็นวิธีที่แนะนำสำหรับการรันบน DGX Spark เครื่องเดียว - การ Publish Port: หากต้องการ Publish Port ของ Server แทนการใช้ Host Networking ให้ระบุ Docker Port Mapping ก่อนการรัน
การดาวน์โหลดและกระจายโมเดล
เพื่อหลีกเลี่ยงการดาวน์โหลดโมเดลซ้ำซ้อนในแต่ละโหนด ควรดาวน์โหลดโมเดลบนโหนดใดโหนดหนึ่งก่อน แล้วจึงกระจายไปยังโหนดอื่น ๆ ในคลัสเตอร์
- สคริปต์
hf-download.sh: สคริปต์นี้ช่วยอำนวยความสะดวกในการดาวน์โหลดโมเดลและกระจายไปยังคลัสเตอร์โดยอัตโนมัติ
การรัน Inference
เมื่อตั้งค่าทุกอย่างเรียบร้อยแล้ว การรันโมเดลเพื่อทำการ Inference สามารถทำได้ผ่านสคริปต์ Launcher
- การกำหนดจำนวนโหนด: สคริปต์จะใช้จำนวนโหนดที่ระบุผ่าน Flags ต่างๆ เช่น
--num-nodes - ข้อควรระวังเกี่ยวกับหน่วยความจำ: หลีกเลี่ยงการใช้
--load-format fastsafetensorsหากโมเดลมีขนาดใหญ่มาก (เกิน 0.85 ของ RAM ที่มีอยู่) เนื่องจากอาจเกิดปัญหา Out of Memory ได้
การจัดการ Docker Build Cache
เมื่อใช้งานไปสักระยะหนึ่ง Build Cache อาจมีขนาดใหญ่ขึ้น ซึ่งสามารถจัดการได้ดังนี้:
- ตรวจสอบขนาด Cache: ใช้คำสั่ง
docker builder prune --filter "until=72h"เพื่อลบ Cache ที่เก่ากว่า 72 ชั่วโมง - การลบ Cache ทั้งหมด: หากต้องการลบ Cache ทั้งหมด (ควรทำอย่างระมัดระวัง)
คุณสมบัติและอัปเดตที่น่าสนใจ
- Earlyoom: Image Runner ปัจจุบันมี
earlyoomติดตั้งมาด้วย ซึ่งช่วยในการตรวจสอบหน่วยความจำของ Host อย่างต่อเนื่อง - NCCL และ NVCC Gencode: การรองรับ NCCL Main Branch และการกำหนด
gpu-archที่ขับเคลื่อนการ Build NVCC Gencode - KV Cache Preallocation Cleanup: การปรับปรุงการจัดการหน่วยความจำ KV Cache โดยการเคลียร์ Cache CUDA ก่อนการคำนวณขนาด KV Cache
- การรองรับโมเดลใหม่: เพิ่ม Recipes สำหรับโมเดลต่าง ๆ เช่น Gemma, Qwen, Deepseek V4 Flash และ DiffusionGemma
- การปรับปรุงประสิทธิภาพ: การเพิ่ม
gpumemoryutilizationเป็น 0.8 และการเปลี่ยน Base Image CUDA - การแก้ไขปัญหา: มีการแก้ไขปัญหาเฉพาะสำหรับ vLLM เช่น การจัดการ MoE weight_shape metadata หรือการทำงานร่วมกับ Tensor Parallelism ข้ามโหนด
สรุป
การใช้ vLLM ร่วมกับ Docker บน DGX Spark เป็นแนวทางที่มีประสิทธิภาพสูงสำหรับการรัน LLMs โดยเฉพาะอย่างยิ่งในสถาปัตยกรรมแบบ Multi-Node การทำความเข้าใจขั้นตอนการ Build Image, การตั้งค่าคลัสเตอร์, การจัดการโมเดล และการรัน Inference จะช่วยให้คุณสามารถปลดล็อกศักยภาพสูงสุดของฮาร์ดแวร์และซอฟต์แวร์ได้อย่างเต็มที่
#vLLM #DGXSpark #Docker #LLM #AI #MachineLearning
ขอบคุณ แหล่งข้อมูล
https://github.com/eugr/spark-vllm-docker