- เอนจิน inference แบบ Docker สำหรับรันโมเดลภาษาขนาดใหญ่บน AMD GPU โดยใช้โมเดลจาก Hugging Face และเน้นไปที่ตระกูล LLaMA
- สภาพแวดล้อมที่ต้องใช้คือ AMD GPU ที่รองรับ ROCm, Docker และไดรเวอร์ ROCm เวอร์ชัน 5.4.2 หรือเวอร์ชันที่เข้ากันได้ซึ่งติดตั้งอยู่บนโฮสต์
run-docker-amd.sh จะสร้าง Docker image โดยอัตโนมัติ และรันคอนเทนเนอร์ด้วยการตั้งค่า /dev/kfd, /dev/dri, กลุ่ม video, SYS_PTRACE, seccomp=unconfined ที่จำเป็นต่อการเข้าถึง AMD GPU
- ผู้ใช้สามารถเปลี่ยนโมเดลได้โดยส่งชื่อรีโพซิทอรี Hugging Face และพรอมป์ต์เป็นอาร์กิวเมนต์ โดยมีตัวอย่างเช่น
meta-llama/Llama-2-7b-chat-hf และ facebook/opt-1.3b
- หากต้องการเปลี่ยนพฤติกรรมของ inference ต้องแก้ไข
run_inference.py แล้วสร้าง Docker image ใหม่ และหากหน่วยความจำไม่พอควรใช้โมเดลที่เล็กลงหรือความยาวอินพุต/เอาต์พุตที่สั้นลง
วัตถุประสงค์ของโปรเจกต์และโมเดลเป้าหมาย
- โปรเจกต์นี้คือเอนจิน inference แบบ Docker สำหรับรัน LLM บน AMD GPU
- ออกแบบมาให้ใช้กับโมเดลของ Hugging Face โดยเฉพาะ และเน้นที่ ตระกูลโมเดล LLaMA
- ใช้ไลบรารี Hugging Face Transformers
สภาพแวดล้อมที่ต้องใช้
- เงื่อนไขที่ต้องมีล่วงหน้าก่อนรันมีดังนี้
- AMD GPU ที่รองรับ ROCm
- Docker ที่ติดตั้งอยู่ในระบบ
- ไดรเวอร์ ROCm ที่ติดตั้งอยู่บนระบบโฮสต์
- ต้องเป็นเวอร์ชัน 5.4.2 หรือเวอร์ชันที่เข้ากันได้
โครงสร้างโปรเจกต์
- โครงสร้างรีโพซิทอรีประกอบด้วยไดเรกทอรี
src/ และไฟล์สำหรับรันและบิลด์
src/engine.py
src/model.py
src/utils.py
src/amd_setup.py
Dockerfile
requirements.txt
run_inference.py
run-docker-amd.sh
README.md
ขั้นตอนการรันแบบรวดเร็ว
- โคลนรีโพซิทอรีแล้วเข้าไปยังไดเรกทอรีของโปรเจกต์
git clone https://github.com/slashml/amd-gpu-inference.git
cd amd-gpu-inference
- ให้สิทธิ์รันกับสคริปต์สำหรับการรัน
chmod +x run-docker-amd.sh
- รันเอนจิน inference โดยส่งชื่อโมเดลและพรอมป์ต์เข้าไป
./run-docker-amd.sh "meta-llama/Llama-2-7b-chat-hf" "Translate the following English text to French: 'Hello, how are you?'"
"meta-llama/Llama-2-7b-chat-hf" สามารถเปลี่ยนเป็นโมเดล Hugging Face ที่ต้องการใช้ได้ และสามารถกำหนดพรอมป์ต์เองได้เช่นกัน
วิธีการรัน Docker และ ROCm
- ใน
Aptfile จะมีรายการ แพ็กเกจ ROCm ที่จะติดตั้งภายใน Docker container
- เป็นการตั้งค่าเพื่อให้สามารถใช้ไดรเวอร์และไลบรารี ROCm ที่จำเป็นภายในคอนเทนเนอร์ได้
run-docker-amd.sh จะสร้าง Docker image โดยอัตโนมัติ
- หากต้องการบิลด์ด้วยตนเอง สามารถใช้คำสั่งต่อไปนี้ได้
docker build -t amd-gpu-inference .
- เมื่อต้องการรันคอนเทนเนอร์ด้วยตนเอง ให้ระบุอุปกรณ์และตัวเลือกสิทธิ์สำหรับการเข้าถึง AMD GPU
docker run --rm -it \
--device=/dev/kfd \
--device=/dev/dri \
--group-add=video \
--cap-add=SYS_PTRACE \
--security-opt seccomp=unconfined \
amd-gpu-inference "model_name" "your prompt here"
- ใน
"model_name" ให้ใส่ชื่อโมเดลของ Hugging Face และใน "your prompt here" ให้ใส่ข้อความอินพุต
การปรับแต่งและการแก้ปัญหา
- การเปลี่ยนโมเดลทำได้โดยระบุชื่อรีโพซิทอรี Hugging Face ตอนรัน
./run-docker-amd.sh "facebook/opt-1.3b" "Your prompt here"
- หากต้องการเปลี่ยนลอจิกของ inference ให้แก้ไขไฟล์
run_inference.py
- หลังจากแก้ไขแล้ว ต้องสร้าง Docker image ใหม่
- รายการสำหรับการแก้ปัญหามีดังนี้
- ควรตรวจสอบว่าไดรเวอร์ AMD GPU และ ROCm ได้รับการติดตั้งและตั้งค่าอย่างถูกต้องบนระบบโฮสต์
- หากเกิดข้อผิดพลาด
"out of memory" ควรใช้โมเดลที่เล็กลงหรือลดความยาวอินพุตและเอาต์พุต
- ปัญหาเฉพาะของแต่ละโมเดลควรอ้างอิงเอกสารของโมเดลนั้นบน Hugging Face
ไลเซนส์และข้อมูลอ้างอิง
- โปรเจกต์เปิดรับการมีส่วนร่วมผ่าน Pull Request
- ROCm พัฒนาโดย AMD และเผยแพร่ภายใต้ MIT License
- หากมีคำถามหรือพบปัญหา สามารถเปิด issue ใน GitHub repository ได้
1 ความคิดเห็น
ความเห็นจาก Hacker News
ถ้าใช้เพื่อทำ inference และเป็นการ์ดที่รองรับ หรือเป็นสถาปัตยกรรมที่สามารถใช้
HSA_OVERRIDE_GFX_VERSIONบน Linux ได้ ก็แทบจะรันได้เกือบทั้งหมดด้วย PyTorch แบบ upstream และtransformersllama.cppก็แทบไม่มีปัญหาในการคอมไพล์มาอย่างน้อยราว 1 ปีแล้ว และบน Windows ก็มักจะมีไบนารีwin-hipในรีลีส หรือถ้าไม่ได้ก็ยังอ้อมไปใช้ Vulkan build ได้แม้ประสิทธิภาพจะต่ำกว่าแต่ ROCm 5.4.2 ในบทความนี้เป็นเวอร์ชันเก่าเกือบ 2 ปีแล้ว และระหว่างนั้นก็เปลี่ยนไปมาก เลยสงสัยว่าทำไมถึงเพิ่งถูกเผยแพร่อีกครั้งในเดือนตุลาคม 2024
ไม่นานมานี้มีการอัปเดตเอกสารความเข้ากันได้ที่เน้น RDNA3 โดยอิง ROCm 6.2 และแม้ในช่วงไม่กี่เดือนก็มีการเปลี่ยนแปลงมากทั้งใน
bitsandbytesแบบ upstream,xformersแบบ upstream, และ Flash Attention ที่อิง Triton: https://llm-tracker.info/howto/AMD-GPUsถ้าใช้พวก
a1111ก็อย่าเชื่อrequirements.txtให้ติดตั้ง torch เวอร์ชัน ROCm ตามคำแนะนำบนเว็บไซต์ PyTorch ก็พอObsidian ก็คล้ายกัน และอย่างน้อยบน Arch กับ Ubuntu นั้น HIP ค่อนข้างง่าย ส่วน Fedora ยังต้องปรับแต่งอีกนิด
ไม่รู้มาก่อนว่า
xformersใช้งานได้ด้วย ถือเป็นข่าวดีอันเดียวที่ใช้งานได้ทันทีคือ Ollama เพราะมีตัวอย่างให้: https://github.com/ollama/ollama/blob/main/docs/docker.md
llama.cppกับkoboldcppมี Docker image แต่ยังขาดตัวอย่างการรัน ส่วนtext-generation-webui-dockerพังบน 7800 XT ที่รัน RHEL9: https://github.com/ggerganov/llama.cpp/blob/master/docs/dock..., https://github.com/LostRuins/koboldcpp?tab=readme-ov-file#do..., https://github.com/Atinoda/text-generation-webui-dockerสรุปคือใช้ ROCm 6.2 รุ่นล่าสุดรัน Llama 405B แบบ full precision inference บน AMD GPU 8×MI300X ในโหนดเดียว
อยากรู้ว่ามองว่า ROCm 6.2 และสแตกของ AMD นั้นสุกงอมขึ้นแค่ไหนเมื่อเทียบกับ Nvidia
น่าทึ่งที่มี ไลบรารีแมชชีนเลิร์นนิงที่ทำแบบปะๆ ด้วย generative AI กระจัดกระจายอยู่เยอะมาก
ไลบรารีนี้ครึ่งหนึ่งเป็นคำสั่ง
printและจุดที่แยกเงื่อนไขก็จริงๆ ไม่จำเป็นต้องแยกแค่กำหนด environment variable สองตัวและตั้งค่า
torchflag สองตัวเท่านั้นในทีมหรือองค์กร การ บริหารความคาดหวัง เป็นเรื่องใหญ่มากจริงๆ
เนื้อหาข้างในแทบไม่มีอะไรจริงๆ
ดูเหมือนจะใช้ ROCm 5.4.2 รุ่นเก่า ซึ่งเป็นเวอร์ชันเมื่อ 2 ปีก่อน เลยไม่แน่ใจว่าจะรองรับ RX 7900 XTX ของฉันหรือเปล่า
สำหรับผม วิธีที่ง่ายที่สุดคือใช้ image
rocm/pytorchรุ่นล่าสุดแล้วไปรันสิ่งที่ต้องการจากในนั้นgfx1100) ถูกเปิดใช้ครั้งแรกในไลบรารีคณิตศาสตร์อย่างrocBLASตั้งแต่ ROCm 5.4 แต่ไลบรารี ด้าน AI อย่างMIOpenน่าจะยังไม่ถูกเปิดใช้จนถึง ROCm 5.5และคิดว่าในรีลีสหลังจากนั้นประสิทธิภาพก็ดีขึ้นค่อนข้างมากด้วย
บน Ubuntu 24.04 และ Debian Unstable สามารถรัน
llama.cppด้วย ROCm ได้บน AMD GPU แยกแทบทุกตัวตั้งแต่ Vega ขึ้นมา โดยใช้แค่แพ็กเกจที่ระบบปฏิบัติการมีให้ไม่ต้องใช้ Docker หรือ
HSA_OVERRIDE_GFX_VERSIONเลย แค่ติดตั้งhipcc,libhipblas-dev,librocblas-dev,cmakeฯลฯ จากนั้นให้สิทธิ์กลุ่มvideo,renderแล้ว build ด้วยGGML_HIPBLAS=ONก็พอสำหรับผู้ใช้ RDNA 3, MI200, MI300 ถ้าต้องการประสิทธิภาพควรใช้แพ็กเกจ ROCm จาก AMD และถ้าจำเป็นต้องใช้ PyTorch ก็ควรใช้แพ็กเกจจาก AMD เช่นกัน เพราะมี dependency บางตัวที่ไม่มีใน system package
ถึงอย่างนั้น ในแง่ความสะดวกในการติดตั้งและการรองรับฮาร์ดแวร์เก่า แพ็กเกจจากระบบปฏิบัติการก็ยังเอาชนะได้ยาก และลิงก์อ้างอิงคือ https://lists.debian.org/debian-ai/2024/07/msg00002.html
ซื้อ Ryzen 8700G มาได้ราว 8 เดือนแล้วเพราะตั้งใจจะใช้ NPU ทำ neural network inference แต่จนถึงตอนนี้ การเร่งความเร็วที่ได้ยังมาจาก Vulkan บน iGPU ไม่ใช่ NPU
ตอนนี้ใช้แต่ Linux และข้อดีคือด้วย RAM 64GB จึงลองโมเดลที่เกิน 32GB ได้แบบไม่มีปัญหา
llama.cppที่รองรับ Vulkan backend ถือว่าน่าชื่นชมLLAMA_HIP_UMA=1ตอนคอมไพล์llama.cppได้ถ้าดูที่ https://github.com/amd/RyzenAI-SW จะเห็นว่ามีซอฟต์แวร์สำหรับลองเล่นกับ NPU อยู่พอสมควร แต่ Phoenix มีแค่ 16 TOPS เลยไม่ค่อยอยากทดสอบเอง
บนเวิร์กสเตชัน NixOS เพิ่มแค่นี้ก็พอ
เปิด
hardware.graphics.enable = true;แล้วตั้งค่าacceleration = "rocm";,ROC_ENABLE_PRE_VEGA = "1";,HSA_OVERRIDE_GFX_VERSION = "11.0.0";ในservices.ollamaก่อนหน้านี้เกือบจะลองติดตั้ง AMD ROCm เพราะชอบความเรียบง่ายของ
llamafileแต่ผลของ
sudo apt install rocmคือมีแพ็กเกจที่จะติดตั้ง 203 ตัว, ดาวน์โหลดราว 2.37GB และต้องใช้พื้นที่ 35.7GBไม่เข้าใจจริง ๆ ว่าของที่แทบจะเป็น GPU driver จะสมเหตุสมผลได้อย่างไรกับขนาด 36GB
มันรวมเครื่องมือและไลบรารีหลายอย่างไว้ด้วย
แม้แต่ CUDA toolkit ถ้าดาวน์โหลดเป็นไฟล์เดียวก็เกิน 4GB เช่นกัน ดังนั้นไม่ว่าฝั่งไหนผลลัพธ์ก็ดูใหญ่เกินจริงทั้งนั้น
อันนี้ดูเหมือน wrapper ที่ AI สร้างขึ้นมาครอบ wrapper ที่ครอบ wrapper อีกที
มีคอมเมนต์อย่าง
# Other AMD-specific optimizations can be added here,# For example, you might want to set specific flags or use AMD-optimized librariesซึ่งทำให้งงว่าแล้วตรงนี้กำลังทำอะไรกันแน่requirementsขนาดใหญ่กับ Dockerfile และที่เหลือส่วนมากคือ helper scriptช่วงนี้ AMD GPU ตัวไหนคุ้มราคาดี?
เพิ่งซื้อ 3090 มือสองแบบรีเฟอร์บิชจาก eBay มาสองใบในราคาประมาณ 750 ดอลลาร์ต่อใบ เลยสงสัยว่าคนอื่นใช้การ์ดอะไรรัน LLM แบบโลคัลกัน
เป็น 32GB HBM2 และในค่าเริ่มต้นของ Flash Attention 2 benchmark เร็วกว่า 3090 ราว 0~5% แต่ประสิทธิภาพในการใช้งานจริงขึ้น ๆ ลง ๆ
หลายโปรเจกต์ไม่ได้ปรับแต่งให้เข้ากับ matrix core ของ CDNA และถึงจะมีงานสำหรับ RDNA ก็ไม่ได้แปลว่าจะใช้กับ CDNA ได้ตรง ๆ เสมอไป
น่าหงุดหงิดที่
llama.cppปิด Flash Attention PR สำหรับ AMD เพราะมองว่าไลบรารีแบบ header-only เพิ่ม dependency ที่ไม่จำเป็น: https://github.com/ggerganov/llama.cpp/pull/7011ถ้าใช้
xformersกับค่าเริ่มต้นของ SDXL จะได้ราว 4.5~5it/s อยู่ประมาณกึ่งกลางระหว่าง 3090 กับ 4090 และในexllamav2นั้น Qwen 72B 3bpw ได้ราว 7t/s ช้ากว่า 3090 แต่ 3090 ต้องใช้ความละเอียดต่ำกว่านี้ถึงจะยัดเข้าไปได้ยังไม่ค่อยแน่ใจว่าโปรเจกต์นี้ให้อะไรกับผู้ใช้ AMD มากกว่าตัวเลือกที่มีอยู่แล้วอย่าง
llama.cpp,exllamav2,mlc-aiเพราะทุกวันนี้โปรเจกต์ส่วนใหญ่ก็รันได้ค่อนข้างง่ายอยู่แล้วxformers, หรือ Ollamaฝั่ง Nvidia ทำให้นอนหลับสบายตอนกลางคืนได้มากกว่า
มี HBM2 และแบนด์วิดท์หน่วยความจำ 1TB/s เท่ากับ 4090
แต่มี VRAM แค่ 16GB
ได้ RAM 24GB ในราคา 1,000 ดอลลาร์
คนชอบพูดว่า “Docker based” กันบ่อย แต่จริง ๆ ความหมายคือแจกจ่าย
$SOFTWAREเป็น Docker imageพอพูดว่า “Docker based” มันฟังเหมือนกำลังทำ inference บนการ์ด AMD ด้วย Docker ซึ่งรู้สึกว่าเป็นสำนวนที่ประหลาด
OpenAI ก็รันคลัสเตอร์ K8s แบบนี้ และ AMD เองก็มีเอกสาร
เพียงแต่ฝั่ง AMD AI ต้องใช้การ์ดที่ถูกต้อง, เวอร์ชัน ROCm ที่ถูกต้อง และโชคดีพอสมควร
AMD มี Docker image ที่รองรับ ROCm ให้ใช้อยู่แล้ว ดังนั้นถ้าใช้มันเป็น base layer แล้วรวมแอปของคุณเข้าไปพร้อมส่ง GPU ให้คอนเทนเนอร์ ก็มีโอกาสทำงานได้
สุดท้ายมันช่วยลดตัวแปรที่ต้องกังวลตอน deploy ลงไปหนึ่งอย่าง ดังนั้นจะบอกว่าทำ inference บน AMD ด้วย Docker ก็ไม่ผิดนัก
ดูจากสคริปต์ก็จะเห็นว่ามีการ mount GPU อยู่: https://github.com/slashml/amd_inference/blob/main/run-docke...