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) เป็นสิ่งสำคัญ

  1. การเชื่อมต่อระหว่าง Sparks: ตรวจสอบให้แน่ใจว่าได้เชื่อมต่อ Sparks เข้าด้วยกันและตั้งค่า Passwordless SSH แล้ว
  2. การกระจาย 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

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 GencodeKV 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 #MachineLearninghttps://github.com/eugr/spark-vllm-docker
Shared content
GITHUB.COM
GitHub - eugr/spark-vllm-docker: Docker configuration for running VLLM on dual DGX Sparks
Docker configuration for running VLLM on dual DGX Sparks - eugr/spark-vllm-docker
5 Yorumlar 0 hisse senetleri 605 Views 0 önizleme