4P by GN⁺ | ★ favorite | 댓글 1개
  • AMD GPU에서 대규모 언어 모델을 실행하기 위한 Docker 기반 추론 엔진으로, Hugging Face 모델을 대상으로 하며 LLaMA 계열에 초점을 둠
  • 실행 환경은 ROCm 지원 AMD GPU, Docker, 호스트에 설치된 ROCm 드라이버 5.4.2 또는 호환 버전을 필요로 함
  • run-docker-amd.sh가 Docker 이미지를 자동으로 빌드하고, AMD GPU 접근에 필요한 /dev/kfd, /dev/dri, video 그룹, SYS_PTRACE, seccomp=unconfined 설정으로 컨테이너를 실행함
  • 사용자는 Hugging Face 저장소 이름과 프롬프트를 인자로 전달해 모델을 바꿀 수 있으며, 예시로 meta-llama/Llama-2-7b-chat-hffacebook/opt-1.3b가 제시됨
  • 추론 동작을 바꾸려면 run_inference.py를 수정한 뒤 Docker 이미지를 다시 빌드해야 하며, 메모리 부족 시 더 작은 모델이나 짧은 입출력 길이를 사용해야 함

프로젝트 목적과 대상 모델

  • 이 프로젝트는 AMD GPU에서 LLM을 실행하기 위한 Docker 기반 추론 엔진임
  • Hugging Face의 모델을 사용하도록 설계됐으며, 특히 LLaMA 모델 계열에 초점을 둠
  • Hugging Face Transformers 라이브러리를 사용함

요구 환경

  • 실행 전 필요한 조건은 다음과 같음
    • ROCm을 지원하는 AMD GPU
    • 시스템에 설치된 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
  • 모델 이름과 프롬프트를 전달해 추론 엔진을 실행함
./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에는 Docker 컨테이너 안에 설치할 ROCm 패키지가 나열됨
    • 필요한 ROCm 드라이버와 라이브러리를 컨테이너에서 사용할 수 있게 하기 위한 구성임
  • run-docker-amd.sh는 Docker 이미지를 자동으로 빌드함
  • 수동 빌드는 다음 명령으로 가능함
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"
  • 추론 로직을 바꾸려면 run_inference.py 파일을 수정함
    • 변경 후에는 Docker 이미지를 다시 빌드해야 함
  • 문제 해결 항목은 다음과 같음
    • AMD GPU 드라이버와 ROCm이 호스트 시스템에 올바르게 설치·구성됐는지 확인해야 함
    • "out of memory" 오류가 발생하면 더 작은 모델을 사용하거나 입력·출력 길이를 줄여야 함
    • 모델별 문제는 Hugging Face의 해당 모델 문서를 참조해야 함

라이선스와 참고

  • 프로젝트는 기여를 Pull Request로 받을 수 있음
  • ROCm은 AMD가 개발했으며 MIT License로 제공됨
  • 질문이나 이슈는 GitHub 저장소의 이슈로 열 수 있음

댓글과 토론

Hacker News 의견들
  • 추론 용도라면 지원되는 카드이거나 Linux에서 HSA_OVERRIDE_GFX_VERSION을 쓸 수 있는 아키텍처라면, 상류 PyTorchtransformers로 거의 다 돌릴 수 있음
    llama.cpp도 최소 1년 정도는 컴파일이 꽤 문제없이 됐고, Windows에서는 보통 릴리스에 win-hip 바이너리가 있거나 안 되면 성능은 낮지만 Vulkan 빌드로 우회 가능함
    다만 이 글의 ROCm 5.4.2는 거의 2년 전 버전이고 그동안 많이 바뀌었는데, 2024년 10월에 새로 공개된 이유가 궁금함
    최근 RDNA3 중심 호환성 문서를 ROCm 6.2 기준으로 갱신했는데, 몇 달 사이에도 상류 bitsandbytes, 상류 xformers, Triton 기반 Flash Attention 등 변화가 많았음: https://llm-tracker.info/howto/AMD-GPUs

  • 생성형으로 대충 만든 머신러닝 라이브러리 난립이 놀라울 정도임
    이 라이브러리는 절반이 print문이고, 분기하는 곳도 사실 분기할 필요가 없음
    환경 변수 두 개 정의하고 torch 플래그 두 개 설정하는 정도임

    • 데이터 과학자와 머신러닝 쪽 사람들을 소프트웨어 엔지니어로 오해하고 같은 산출물을 기대하면 혈압만 오른다는 걸 고치려고 치료까지 받아야 했음
      팀이나 조직에서는 기대치 관리가 정말 큰 부분이라고 봄
    • 너무 harsh한가 했는데 저장소를 보니 아니었음
      실제로 내용이 거의 없음
    • 무슨 뜻인지는 알겠지만, 이런 댓글 때문에 사람들이 코드를 공유하거나 오픈소스 기여를 하거나 프로그래밍을 계속하는 걸 꺼리게 됨
  • 오래된 ROCm 5.4.2를 쓰는 것 같은데, 2년 전 버전이라 내 RX 7900 XTX를 지원할지 의심스러움
    개인적으로는 최신 rocm/pytorch 이미지를 쓰고 거기서 필요한 걸 실행하는 게 제일 쉬웠음

    • RX 7900 XTX(gfx1100)는 ROCm 5.4에서 rocBLAS 같은 수학 라이브러리에 처음 활성화됐지만, MIOpen 같은 AI 라이브러리는 ROCm 5.5 전까지 활성화되지 않았던 것 같음
      이후 릴리스에서 성능도 꽤 크게 좋아졌다고 봄
  • Ubuntu 24.04와 Debian Unstable에서는 운영체제가 제공하는 패키지만으로 Vega 이후 거의 모든 개별 AMD GPU에서 llama.cpp를 ROCm으로 돌릴 수 있음
    Docker나 HSA_OVERRIDE_GFX_VERSION도 필요 없고, hipcc, libhipblas-dev, librocblas-dev, cmake 등을 설치한 뒤 video, render 그룹 권한을 주고 GGML_HIPBLAS=ON으로 빌드하면 됨
    RDNA 3, MI200, MI300 사용자는 성능을 위해 AMD 제공 ROCm 패키지가 낫고, PyTorch가 필요한 경우도 시스템 패키지에 없는 의존성이 있어 AMD 제공 패키지를 쓰는 편이 좋음
    그래도 설치 편의성과 오래된 하드웨어 호환성은 운영체제 패키지가 이기기 어렵고, 참고 링크는 https://lists.debian.org/debian-ai/2024/07/msg00002.html

    • Ubuntu 22.04.5에서 RX 7900 XTX로 AMD 제공 ROCm과 Ollama를 큰 문제 없이 설치했고, Ollama로 ROCm 기반 LLM 실행도 잘 됨
    • 지금 시장에 소비자 친화적인 가격으로 24GB를 넘는 VRAM을 가진 AMD 카드가 있나?
  • Ryzen 8700G를 NPU로 신경망 추론하려고 산 지 8개월쯤 됐는데, 지금까지 가속은 NPU가 아니라 iGPU의 Vulkan으로만 얻고 있음
    Linux만 쓰는 중이고, 좋은 점은 RAM 64GB 덕분에 32GB 넘는 모델도 문제 없이 시도할 수 있었다는 것임
    Vulkan 백엔드를 지원하는 llama.cpp는 칭찬할 만함

    • iGPU에서도 ROCm/HIP 지원을 받을 수 있을 것이고, llama.cpp를 컴파일할 때 LLAMA_HIP_UMA=1 플래그를 넣어보면 됨
      https://github.com/amd/RyzenAI-SW를 보면 NPU로 가지고 놀 소프트웨어가 꽤 있지만, Phoenix는 16 TOPS라 직접 테스트할 마음은 안 들었음
  • NixOS 워크스테이션에는 이 정도만 추가하면 됐음
    hardware.graphics.enable = true;를 켜고 services.ollama에서 acceleration = "rocm";, ROC_ENABLE_PRE_VEGA = "1";, HSA_OVERRIDE_GFX_VERSION = "11.0.0";를 설정함

  • 예전에 llamafile의 간단함을 보고 AMD ROCm을 설치해볼 뻔했음
    그런데 sudo apt install rocm 결과가 설치 패키지 203개, 다운로드 약 2.37GB, 필요 공간 35.7GB였음
    사실상 GPU 드라이버에 가까운 것에 36GB가 어떻게 정당화되는지 이해가 안 됨

    • 요즘 소프트웨어가 터무니없이 비대해진 건 맞지만, ROCm은 단순 GPU 드라이버가 아님
      여러 도구와 라이브러리가 포함돼 있음
      CUDA toolkit도 단일 파일로 받으면 다운로드만 4GB가 넘으니, 어느 쪽이든 말도 안 되게 커 보이는 결과가 나옴
    • https://github.com/zml/zml에서 이 문제를 해결하고 있음
    • 이제 GPU에서 도는 CPU 드라이버는 거의 완전한 운영체제임
    • AMD는 드라이버로 Linux 커널을 완전히 더럽히는 수준임: https://www.phoronix.com/news/AMD-5-Million-Lines
  • 이건 래퍼의 래퍼의 래퍼 위에 AI가 만든 래퍼처럼 보임
    # Other AMD-specific optimizations can be added here, # For example, you might want to set specific flags or use AMD-optimized libraries 같은 주석이 있는데, 그러면 여기서 뭘 하고 있는 건지 모르겠음

    • 사실상 큰 requirements 파일과 Dockerfile이고, 나머지는 대부분 헬퍼 스크립트
  • 요즘 가성비 좋은 AMD GPU는 뭐가 있나?
    방금 중고 3090 두 장을 eBay 리퍼로 각각 750달러쯤에 샀는데, 로컬에서 LLM 돌릴 때 다른 사람들은 뭘 쓰는지 궁금함

    • 최근 MI100을 650달러에 샀음
      32GB HBM2이고 기본 Flash Attention 2 벤치마크에서는 3090보다 0~5% 정도 빠르지만, 실제 애플리케이션 성능은 들쭉날쭉함
      CDNA의 행렬 코어에 최적화되지 않은 프로젝트가 많고, RDNA용 작업이 있어도 CDNA로 그대로 이어지지 않는 경우가 많음
      llama.cpp가 AMD용 Flash Attention PR을 헤더 전용 라이브러리가 불필요한 의존성을 추가한다며 닫은 것도 답답함: https://github.com/ggerganov/llama.cpp/pull/7011
      SDXL 기본값에 xformers를 쓰면 4.5~5it/s 정도로 3090과 4090 사이쯤이고, exllamav2에서 Qwen 72B 3bpw는 약 7t/s로 3090보다 느리지만 3090은 넣으려면 더 낮은 정밀도를 써야 함
      이 프로젝트가 llama.cpp, exllamav2, mlc-ai 같은 기존 선택지보다 AMD 사용자에게 뭘 더 주는지는 잘 모르겠고, 요즘은 대부분 프로젝트가 비교적 쉽게 동작함
    • 개인적으로는 AMD iGPU/GPU가 PyTorch, ROCm, xformers, Ollama 업데이트 때마다 깨져서 별로 가치가 없었음
      Nvidia 쪽이 밤에 더 편하게 잘 수 있음
    • Radeon Pro VII를 새 제품으로 300유로에 샀는데 나쁘지 않은 거래였음
      HBM2가 있고 메모리 대역폭이 4090과 같은 1TB/s
      다만 VRAM은 16GB뿐임
    • 아마 7900 XTX가 답일 듯함
      1,000달러에 24GB RAM임
  • 사람들이 “Docker 기반”이라고 자주 말하지만, 실제 의미는 $SOFTWARE를 Docker 이미지로 배포한다는 것임
    “Docker 기반”이라고 하면 마치 Docker로 AMD 카드에서 추론을 하는 것처럼 읽히는데, 그건 말이 안 되는 표현처럼 느껴짐

    • Nvidia에서 하듯이 Docker 컨테이너 안에서 추론할 수 있음
      OpenAI도 이런 식으로 K8s 클러스터를 돌리고, AMD도 문서가 있음
      다만 AMD AI 쪽은 맞는 카드, 맞는 ROCm 버전, 그리고 순전한 운이 필요함
      AMD가 ROCm 지원 Docker 이미지를 제공하니 그걸 기반 레이어로 앱과 합치고 GPU를 컨테이너에 넘기면 동작할 수 있음
      결국 배포 중 신경 써야 할 변수를 하나 줄여주기 때문에, 말 그대로 Docker로 AMD에서 추론하는 셈임
    • Docker가 머신러닝 표준 도구가 된 이유는, 시스템 라이브러리에 연결되는 Python 배포가 그 계층까지 같이 실어 나르지 않으면 난장판이 되기 때문임
    • Docker에 특정 장치를 마운트할 수 있음
      스크립트를 보면 GPU를 마운트하고 있음: https://github.com/slashml/amd_inference/blob/main/run-docke...
    • ZML에서 이 문제를 해결하고 있음: https://github.com/zml/zml
    • 왜 말이 안 되나? Docker 컨테이너에서도 장치와 통신할 수 있고, 붙여주기만 하면 됨