- Đây là một engine suy luận dựa trên Docker để chạy mô hình ngôn ngữ lớn trên GPU AMD, nhắm tới các mô hình trên Hugging Face và tập trung vào họ LLaMA
- Môi trường chạy yêu cầu GPU AMD hỗ trợ ROCm, Docker và driver ROCm 5.4.2 hoặc phiên bản tương thích được cài trên máy host
run-docker-amd.sh tự động build image Docker và chạy container với các thiết lập cần thiết để truy cập GPU AMD như /dev/kfd, /dev/dri, nhóm video, SYS_PTRACE, seccomp=unconfined
- Người dùng có thể thay đổi mô hình bằng cách truyền tên kho lưu trữ Hugging Face và prompt làm tham số; ví dụ gồm
meta-llama/Llama-2-7b-chat-hf và facebook/opt-1.3b
- Muốn thay đổi cách suy luận thì cần sửa
run_inference.py rồi build lại image Docker; nếu thiếu bộ nhớ thì nên dùng mô hình nhỏ hơn hoặc rút ngắn độ dài đầu vào/đầu ra
Mục tiêu dự án và các mô hình nhắm tới
- Dự án này là một engine suy luận dựa trên Docker để chạy LLM trên GPU AMD
- Nó được thiết kế để sử dụng các mô hình của Hugging Face, đặc biệt tập trung vào họ mô hình LLaMA
- Sử dụng thư viện Hugging Face Transformers
Môi trường yêu cầu
- Các điều kiện cần có trước khi chạy như sau
- GPU AMD hỗ trợ ROCm
- Docker đã được cài trên hệ thống
- Driver ROCm đã được cài trên hệ thống host
- Cần phiên bản 5.4.2 hoặc phiên bản tương thích
Cấu trúc dự án
- Cấu trúc kho lưu trữ gồm thư mục
src/ cùng các tệp chạy và build
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
Luồng chạy nhanh
- Clone kho lưu trữ rồi di chuyển vào thư mục dự án
git clone https://github.com/slashml/amd-gpu-inference.git
cd amd-gpu-inference
- Cấp quyền thực thi cho script chạy
chmod +x run-docker-amd.sh
- Chạy engine suy luận bằng cách truyền tên mô hình và prompt
./run-docker-amd.sh "meta-llama/Llama-2-7b-chat-hf" "Translate the following English text to French: 'Hello, how are you?'"
- Có thể thay
"meta-llama/Llama-2-7b-chat-hf" bằng mô hình Hugging Face bạn muốn dùng, và cũng có thể tự chỉ định prompt
Cách chạy với Docker và ROCm
Aptfile liệt kê các gói ROCm sẽ được cài bên trong container Docker
- Đây là cấu hình để có thể sử dụng các driver và thư viện ROCm cần thiết trong container
run-docker-amd.sh tự động build image Docker
- Có thể build thủ công bằng lệnh sau
docker build -t amd-gpu-inference .
- Khi chạy container thủ công, cần chỉ định các thiết bị và tùy chọn quyền để truy cập GPU AMD
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"
- Đặt tên mô hình Hugging Face vào
"model_name" và văn bản đầu vào vào "your prompt here"
Tùy biến và xử lý sự cố
- Việc đổi mô hình được thực hiện bằng cách chỉ định tên kho lưu trữ Hugging Face khi chạy
./run-docker-amd.sh "facebook/opt-1.3b" "Your prompt here"
- Muốn thay đổi logic suy luận thì sửa tệp
run_inference.py
- Sau khi thay đổi, cần build lại image Docker
- Các mục xử lý sự cố như sau
- Cần kiểm tra driver GPU AMD và ROCm đã được cài đặt, cấu hình đúng trên hệ thống host hay chưa
- Nếu gặp lỗi
"out of memory" thì nên dùng mô hình nhỏ hơn hoặc giảm độ dài đầu vào/đầu ra
- Với các vấn đề riêng theo từng mô hình, hãy tham khảo tài liệu của mô hình đó trên Hugging Face
Giấy phép và tham khảo
- Dự án nhận đóng góp thông qua Pull Request
- ROCm do AMD phát triển và được cung cấp theo MIT License
- Có thể mở câu hỏi hoặc issue trong phần issue của kho lưu trữ GitHub
1 bình luận
Ý kiến trên Hacker News
Nếu dùng cho mục đích suy luận, miễn là đó là card được hỗ trợ hoặc là kiến trúc có thể dùng
HSA_OVERRIDE_GFX_VERSIONtrên Linux, thì gần như có thể chạy được mọi thứ với PyTorch upstream vàtransformersllama.cppcũng đã biên dịch khá suôn sẻ trong ít nhất khoảng 1 năm qua, còn trên Windows thì thường trong bản phát hành có binarywin-hip, hoặc nếu không được thì có thể đi đường vòng bằng bản build Vulkan dù hiệu năng thấp hơnTuy nhiên ROCm 5.4.2 trong bài này là phiên bản gần 2 năm trước và trong thời gian đó đã có nhiều thay đổi, nên tôi tò mò vì sao đến tháng 10/2024 mới được công bố
Gần đây tôi đã cập nhật tài liệu tương thích tập trung vào RDNA3 theo ROCm 6.2, và chỉ trong vài tháng cũng đã có rất nhiều thay đổi như
bitsandbytesupstream,xformersupstream, Flash Attention dựa trên Triton: https://llm-tracker.info/howto/AMD-GPUsNếu dùng thứ như
a1111, đừng tinrequirements.txt; cứ cài torch phiên bản ROCm theo hướng dẫn trên trang chủ PyTorch là đượcObsidian cũng tương tự, còn HIP thì ít nhất trên Arch và Ubuntu khá đơn giản, Fedora thì hiện vẫn cần chỉnh sửa đôi chút
Tôi không biết
xformerscũng hoạt động, đây là tin tốtThứ chạy được ngay chỉ có Ollama, vì có ví dụ: https://github.com/ollama/ollama/blob/main/docs/docker.md
llama.cppvàkoboldcppcó image Docker nhưng thiếu ví dụ chạy, còntext-generation-webui-dockerthì bị lỗi trên 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-dockerTóm lại, họ chạy suy luận Llama 405B ở độ chính xác đầy đủ trên một node đơn với 8× GPU AMD MI300X bằng ROCm 6.2 mới nhất
Tôi tò mò mọi người đánh giá ROCm 6.2 và stack AMD đã trưởng thành đến mức nào so với Nvidia
Mức độ tràn lan của các thư viện machine learning được tạo qua loa bằng generative AI thật đáng ngạc nhiên
Một nửa thư viện này là các câu lệnh
print, và những chỗ rẽ nhánh thực ra cũng không cần rẽ nhánhChỉ là định nghĩa hai biến môi trường và đặt hai flag cho
torchTrong đội nhóm hoặc tổ chức, tôi nghĩ quản lý kỳ vọng thật sự là một phần rất lớn
Thực sự gần như chẳng có gì trong đó
Có vẻ họ đang dùng ROCm 5.4.2 cũ, phiên bản từ 2 năm trước, nên tôi nghi ngờ liệu nó có hỗ trợ RX 7900 XTX của tôi không
Cá nhân tôi thấy cách dễ nhất là dùng image
rocm/pytorchmới nhất rồi chạy những thứ cần thiết trong đógfx1100) lần đầu được bật trong các thư viện toán học nhưrocBLASở ROCm 5.4, nhưng có vẻ các thư viện AI nhưMIOpenchưa được bật cho đến ROCm 5.5Tôi nghĩ hiệu năng cũng đã cải thiện khá đáng kể ở các bản phát hành sau đó
Trên Ubuntu 24.04 và Debian Unstable, chỉ với các gói do hệ điều hành cung cấp là có thể chạy
llama.cppbằng ROCm trên gần như mọi GPU AMD rời từ Vega trở về sauKhông cần Docker hay
HSA_OVERRIDE_GFX_VERSION; chỉ cần càihipcc,libhipblas-dev,librocblas-dev,cmakev.v., cấp quyền cho các nhómvideo,render, rồi build vớiGGML_HIPBLAS=ONNgười dùng RDNA 3, MI200, MI300 nên dùng các gói ROCm do AMD cung cấp để có hiệu năng tốt hơn, và nếu cần PyTorch thì cũng nên dùng gói do AMD cung cấp vì có các dependency không có trong gói hệ thống
Dù vậy, về độ tiện cài đặt và tương thích với phần cứng cũ, các gói hệ điều hành rất khó bị đánh bại; liên kết tham khảo là https://lists.debian.org/debian-ai/2024/07/msg00002.html
Tôi mua Ryzen 8700G khoảng 8 tháng trước để suy luận mạng nơ-ron bằng NPU, nhưng đến giờ phần tăng tốc tôi có được chỉ là qua Vulkan của iGPU chứ không phải NPU
Tôi chỉ dùng Linux, và điểm hay là nhờ RAM 64GB nên có thể thử cả các model hơn 32GB mà không gặp vấn đề
llama.cppcó hỗ trợ backend Vulkan đáng được khenllama.cppcó thể thử thêm cờLLAMA_HIP_UMA=1Nhìn https://github.com/amd/RyzenAI-SW thì có khá nhiều phần mềm để vọc với NPU, nhưng Phoenix chỉ 16 TOPS nên tôi không có hứng tự kiểm thử
Trên workstation NixOS, chỉ cần thêm chừng này là được
Bật
hardware.graphics.enable = true;và trongservices.ollamađặtacceleration = "rocm";,ROC_ENABLE_PRE_VEGA = "1";,HSA_OVERRIDE_GFX_VERSION = "11.0.0";Trước đây, thấy
llamafileđơn giản quá nên tôi suýt thử cài AMD ROCmNhưng kết quả
sudo apt install rocmlà 203 gói cài đặt, tải về khoảng 2,37GB, dung lượng cần 35,7GBTôi không hiểu làm sao có thể biện minh cho 36GB đối với thứ về cơ bản gần như là driver GPU
Nó bao gồm nhiều công cụ và thư viện
CUDA toolkit nếu tải dưới dạng một file duy nhất thì riêng phần tải về cũng hơn 4GB, nên bên nào cũng cho ra kết quả trông lớn đến vô lý
Cái này trông như một wrapper do AI tạo ra, nằm trên wrapper của wrapper của wrapper
Có các comment như
# Other AMD-specific optimizations can be added here,# For example, you might want to set specific flags or use AMD-optimized libraries, vậy thì tôi không rõ rốt cuộc ở đây đang làm gìrequirementslớn và Dockerfile, phần còn lại hầu hết là script trợ giúpDạo này GPU AMD nào có hiệu năng/giá tốt?
Tôi vừa mua hai chiếc 3090 cũ dạng refurbished trên eBay, mỗi chiếc khoảng 750 USD, và tò mò không biết những người khác dùng gì để chạy LLM local
Nó có 32GB HBM2 và trong benchmark Flash Attention 2 mặc định thì nhanh hơn 3090 khoảng 0~5%, nhưng hiệu năng ứng dụng thực tế thì rất thất thường
Nhiều dự án không tối ưu cho matrix core của CDNA, và dù có phần việc dành cho RDNA thì nhiều khi cũng không chuyển thẳng sang CDNA được
Việc
llama.cppđóng PR Flash Attention cho AMD với lý do thư viện header-only thêm dependency không cần thiết cũng khá bực: https://github.com/ggerganov/llama.cpp/pull/7011Nếu dùng
xformersvới mặc định của SDXL thì khoảng 4,5~5it/s, nằm đâu đó giữa 3090 và 4090; còn trongexllamav2, Qwen 72B 3bpw đạt khoảng 7t/s, chậm hơn 3090, nhưng 3090 muốn nhét vừa thì phải dùng độ chính xác thấp hơnTôi không rõ dự án này mang lại thêm gì cho người dùng AMD so với các lựa chọn sẵn có như
llama.cpp,exllamav2,mlc-ai; dạo này đa số dự án cũng chạy tương đối dễxformers, Ollama cập nhật là lại hỏngVới Nvidia thì ngủ ban đêm yên tâm hơn
Nó có HBM2 và băng thông bộ nhớ 1TB/s ngang 4090
Tuy vậy VRAM chỉ 16GB
24GB RAM với giá 1.000 USD
Mọi người hay nói “dựa trên Docker”, nhưng ý nghĩa thực sự là phân phối
$SOFTWAREdưới dạng image DockerNói “dựa trên Docker” nghe như thể dùng Docker để suy luận trên card AMD, tôi thấy đó là cách diễn đạt không hợp lý
OpenAI cũng vận hành cluster K8s theo kiểu này, và AMD cũng có tài liệu
Có điều phía AMD AI cần đúng card, đúng phiên bản ROCm, và cả may mắn thuần túy
AMD cung cấp image Docker hỗ trợ ROCm, nên nếu dùng nó làm layer nền, ghép ứng dụng vào và chuyển GPU vào container thì có thể chạy được
Rốt cuộc nó giảm bớt một biến số cần bận tâm khi triển khai, nên đúng nghĩa là suy luận trên AMD bằng Docker
Nhìn script thì thấy đang mount GPU: https://github.com/slashml/amd_inference/blob/main/run-docke...