4 điểm bởi GN⁺ 2024-10-04 | 1 bình luận | Chia sẻ qua WhatsApp
  • Đâ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-hffacebook/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

 
GN⁺ 2024-10-04
Ý 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_VERSION trên Linux, thì gần như có thể chạy được mọi thứ với PyTorch upstream và transformers
    llama.cpp cũ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ó binary win-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ơn
    Tuy 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ư bitsandbytes upstream, xformers upstream, Flash Attention dựa trên Triton: https://llm-tracker.info/howto/AMD-GPUs

  • 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ánh
    Chỉ là định nghĩa hai biến môi trường và đặt hai flag cho torch

    • Tôi từng phải đi trị liệu để sửa cái thói nhầm các nhà khoa học dữ liệu và người làm machine learning với kỹ sư phần mềm rồi kỳ vọng họ tạo ra sản phẩm cùng chất lượng, vì như thế chỉ làm tăng huyết áp
      Trong độ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
    • Tôi tưởng nhận xét đó hơi harsh quá, nhưng xem repository thì hóa ra không phải
      Thực sự gần như chẳng có gì trong đó
    • Tôi hiểu ý bạn, nhưng chính những bình luận kiểu này khiến người ta ngại chia sẻ code, ngại đóng góp mã nguồn mở, hoặc ngại tiếp tục lập trình
  • 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/pytorch mới nhất rồi chạy những thứ cần thiết trong đó

    • RX 7900 XTX(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ư MIOpen chưa được bật cho đến ROCm 5.5
      Tô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.cpp bằng ROCm trên gần như mọi GPU AMD rời từ Vega trở về sau
    Không cần Docker hay HSA_OVERRIDE_GFX_VERSION; chỉ cần cài hipcc, libhipblas-dev, librocblas-dev, cmake v.v., cấp quyền cho các nhóm video, render, rồi build với GGML_HIPBLAS=ON
    Ngườ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

    • Trên Ubuntu 22.04.5, tôi đã cài ROCm và Ollama do AMD cung cấp với RX 7900 XTX mà không gặp vấn đề lớn, và chạy LLM dựa trên ROCm bằng Ollama cũng tốt
    • Hiện trên thị trường có card AMD nào có VRAM trên 24GB với mức giá thân thiện với người tiêu dùng không?
  • 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.cpp có hỗ trợ backend Vulkan đáng được khen

    • Có lẽ cũng có thể nhận hỗ trợ ROCm/HIP trên iGPU; khi biên dịch llama.cpp có thể thử thêm cờ LLAMA_HIP_UMA=1
      Nhì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à trong services.ollama đặt acceleration = "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 ROCm
    Nhưng kết quả sudo apt install rocm là 203 gói cài đặt, tải về khoảng 2,37GB, dung lượng cần 35,7GB
    Tô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

    • Đúng là phần mềm ngày nay phình to vô lý, nhưng ROCm không chỉ là một driver GPU đơn thuần
      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ý
    • https://github.com/zml/zml đang giải quyết vấn đề này
    • Giờ đây driver CPU chạy trên GPU gần như đã là một hệ điều hành hoàn chỉnh
    • AMD làm bẩn kernel Linux bằng driver đến mức này: https://www.phoronix.com/news/AMD-5-Million-Lines
  • 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ì

    • Thực chất là một file requirements lớn và Dockerfile, phần còn lại hầu hết là script trợ giúp
  • Dạ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

    • Gần đây tôi mua MI100 với giá 650 USD
      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/7011
      Nếu dùng xformers với mặc định của SDXL thì khoảng 4,5~5it/s, nằm đâu đó giữa 3090 và 4090; còn trong exllamav2, 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ơn
      Tô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ễ
    • Cá nhân tôi thấy AMD iGPU/GPU không đáng lắm vì cứ mỗi lần PyTorch, ROCm, xformers, Ollama cập nhật là lại hỏng
      Với Nvidia thì ngủ ban đêm yên tâm hơn
    • Tôi mua Radeon Pro VII hàng mới với giá 300 euro, cũng là một thương vụ không tệ
      Nó có HBM2 và băng thông bộ nhớ 1TB/s ngang 4090
      Tuy vậy VRAM chỉ 16GB
    • Có lẽ 7900 XTX là câu trả lời
      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 $SOFTWARE dưới dạng image Docker
    Nó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ý

    • Có thể suy luận bên trong container Docker như cách làm với Nvidia
      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
    • Lý do Docker trở thành công cụ tiêu chuẩn trong machine learning là vì bản phân phối Python liên kết với thư viện hệ thống sẽ trở thành một mớ hỗn độn nếu không mang theo cả tầng đó
    • Có thể mount thiết bị cụ thể vào Docker
      Nhìn script thì thấy đang mount GPU: https://github.com/slashml/amd_inference/blob/main/run-docke...
    • ZML đang giải quyết vấn đề này: https://github.com/zml/zml
    • Vì sao lại không hợp lý? Trong container Docker vẫn có thể giao tiếp với thiết bị, chỉ cần gắn nó vào là được