4 poin oleh GN⁺ 2024-10-04 | 1 komentar | Bagikan ke WhatsApp
  • Mesin inferensi berbasis Docker untuk menjalankan model bahasa besar di GPU AMD, ditujukan untuk model Hugging Face dan berfokus pada keluarga LLaMA
  • Lingkungan eksekusi memerlukan GPU AMD yang mendukung ROCm, Docker, serta driver ROCm 5.4.2 atau versi kompatibel yang terpasang di host
  • run-docker-amd.sh secara otomatis membangun image Docker dan menjalankan container dengan pengaturan /dev/kfd, /dev/dri, grup video, SYS_PTRACE, dan seccomp=unconfined yang diperlukan untuk akses GPU AMD
  • Pengguna dapat mengganti model dengan meneruskan nama repositori Hugging Face dan prompt sebagai argumen; contoh yang diberikan adalah meta-llama/Llama-2-7b-chat-hf dan facebook/opt-1.3b
  • Untuk mengubah perilaku inferensi, perlu memodifikasi run_inference.py lalu membangun ulang image Docker; jika kehabisan memori, gunakan model yang lebih kecil atau panjang input/output yang lebih pendek

Tujuan proyek dan model target

  • Proyek ini adalah mesin inferensi berbasis Docker untuk menjalankan LLM di GPU AMD
  • Dirancang untuk menggunakan model dari Hugging Face, dengan fokus khusus pada keluarga model LLaMA
  • Menggunakan library Hugging Face Transformers

Lingkungan yang dibutuhkan

  • Persyaratan sebelum menjalankan adalah sebagai berikut
    • GPU AMD yang mendukung ROCm
    • Docker yang terpasang di sistem
    • Driver ROCm yang terpasang di sistem host
      • Diperlukan versi 5.4.2 atau versi kompatibel

Struktur proyek

  • Struktur repositori terdiri dari direktori src/ serta file eksekusi dan build
    • src/engine.py
    • src/model.py
    • src/model.py
    • src/utils.py
    • src/amd_setup.py
    • Dockerfile
    • requirements.txt
    • run_inference.py
    • run-docker-amd.sh
    • README.md

Alur eksekusi cepat

  • Clone repositori lalu pindah ke direktori proyek
git clone https://github.com/slashml/amd-gpu-inference.git
cd amd-gpu-inference
  • Berikan izin eksekusi pada skrip
chmod +x run-docker-amd.sh
  • Jalankan mesin inferensi dengan meneruskan nama model dan prompt
./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" dapat diganti dengan model Hugging Face yang ingin digunakan, dan prompt juga dapat ditentukan sendiri

Cara menjalankan Docker dan ROCm

  • Aptfile berisi daftar paket ROCm yang akan dipasang di dalam container Docker
    • Ini adalah konfigurasi agar driver dan library ROCm yang diperlukan dapat digunakan di dalam container
  • run-docker-amd.sh secara otomatis membangun image Docker
  • Build manual dapat dilakukan dengan perintah berikut
docker build -t amd-gpu-inference .
  • Saat menjalankan container secara manual, tentukan perangkat dan opsi izin untuk akses 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"
  • Masukkan nama model Hugging Face pada "model_name", dan teks input pada "your prompt here"

Kustomisasi dan pemecahan masalah

  • Penggantian model ditangani dengan menentukan nama repositori Hugging Face saat eksekusi
./run-docker-amd.sh "facebook/opt-1.3b" "Your prompt here"
  • Untuk mengubah logika inferensi, modifikasi file run_inference.py
    • Setelah perubahan, image Docker harus dibangun ulang
  • Poin pemecahan masalah adalah sebagai berikut
    • Pastikan driver GPU AMD dan ROCm telah terpasang dan dikonfigurasi dengan benar di sistem host
    • Jika terjadi error "out of memory", gunakan model yang lebih kecil atau kurangi panjang input/output
    • Untuk masalah spesifik model, lihat dokumentasi model terkait di Hugging Face

Lisensi dan referensi

  • Proyek ini dapat menerima kontribusi melalui Pull Request
  • ROCm dikembangkan oleh AMD dan disediakan dengan MIT License
  • Pertanyaan atau isu dapat dibuka sebagai issue di repositori GitHub

1 komentar

 
GN⁺ 2024-10-04
Opini Hacker News
  • Untuk keperluan inferensi, selama kartunya didukung atau arsitekturnya bisa memakai HSA_OVERRIDE_GFX_VERSION di Linux, hampir semuanya bisa dijalankan dengan PyTorch upstream dan transformers
    llama.cpp juga sudah setidaknya sekitar 1 tahun dapat dikompilasi tanpa banyak masalah, dan di Windows biasanya rilisnya punya binary win-hip; kalau tidak, bisa beralih ke build Vulkan meski performanya lebih rendah
    Namun ROCm 5.4.2 dalam tulisan ini adalah versi hampir 2 tahun lalu dan banyak hal sudah berubah sejak itu, jadi saya penasaran kenapa baru dipublikasikan pada Oktober 2024
    Saya baru-baru ini memperbarui dokumen kompatibilitas yang berfokus pada RDNA3 berdasarkan ROCm 6.2, dan bahkan dalam beberapa bulan saja ada banyak perubahan seperti bitsandbytes upstream, xformers upstream, Flash Attention berbasis Triton, dll.: https://llm-tracker.info/howto/AMD-GPUs

  • Banyaknya library machine learning yang tampaknya dibuat asal-asalan secara generatif benar-benar mengejutkan
    Library ini separuhnya berisi pernyataan print, dan bagian yang bercabang sebenarnya tidak perlu bercabang
    Intinya hanya mendefinisikan dua variabel lingkungan dan menyetel dua flag torch

    • Saya sampai perlu terapi untuk memperbaiki kebiasaan mengira data scientist dan orang machine learning sebagai software engineer lalu mengharapkan keluaran yang sama
      Menurut saya, di tim atau organisasi, pengelolaan ekspektasi adalah bagian yang sangat besar
    • Saya sempat berpikir itu terlalu keras, tetapi setelah melihat repositorinya ternyata tidak
      Memang hampir tidak ada isinya
    • Saya paham maksudnya, tetapi komentar seperti ini membuat orang enggan berbagi kode, melakukan kontribusi open source, atau terus memprogram
  • Sepertinya memakai ROCm 5.4.2 yang sudah lama; itu versi 2 tahun lalu, jadi saya ragu apakah mendukung RX 7900 XTX saya
    Secara pribadi, yang paling mudah bagi saya adalah memakai image rocm/pytorch terbaru dan menjalankan yang diperlukan di sana

    • RX 7900 XTX(gfx1100) pertama kali diaktifkan di library matematika seperti rocBLAS pada ROCm 5.4, tetapi library AI seperti MIOpen sepertinya belum diaktifkan sampai ROCm 5.5
      Menurut saya performanya juga meningkat cukup besar pada rilis-rilis berikutnya
  • Di Ubuntu 24.04 dan Debian Unstable, hanya dengan paket yang disediakan sistem operasi, llama.cpp bisa dijalankan dengan ROCm pada hampir semua GPU AMD diskret sejak Vega
    Tidak perlu Docker maupun HSA_OVERRIDE_GFX_VERSION; cukup instal hipcc, libhipblas-dev, librocblas-dev, cmake, dll., beri hak grup video dan render, lalu build dengan GGML_HIPBLAS=ON
    Untuk pengguna RDNA 3, MI200, dan MI300, paket ROCm dari AMD lebih baik demi performa, dan jika membutuhkan PyTorch juga sebaiknya memakai paket dari AMD karena ada dependensi yang tidak tersedia di paket sistem
    Meski begitu, dari sisi kemudahan instalasi dan kompatibilitas hardware lama, paket sistem operasi sulit dikalahkan; tautan rujukannya adalah https://lists.debian.org/debian-ai/2024/07/msg00002.html

    • Di Ubuntu 22.04.5 dengan RX 7900 XTX, saya memasang ROCm dan Ollama dari AMD tanpa masalah besar, dan menjalankan LLM berbasis ROCm dengan Ollama juga berjalan baik
    • Apakah saat ini ada kartu AMD dengan VRAM lebih dari 24GB di pasar dengan harga yang ramah konsumen?
  • Sudah sekitar 8 bulan sejak saya membeli Ryzen 8700G untuk melakukan inferensi neural network dengan NPU, tetapi sampai sekarang akselerasi yang saya dapatkan hanya lewat Vulkan di iGPU, bukan NPU
    Saya hanya memakai Linux, dan sisi baiknya, berkat RAM 64GB saya bisa mencoba model yang lebih dari 32GB tanpa masalah
    llama.cpp yang mendukung backend Vulkan layak dipuji

    • Seharusnya iGPU juga bisa mendapat dukungan ROCm/HIP, dan saat mengompilasi llama.cpp bisa dicoba menambahkan flag LLAMA_HIP_UMA=1
      Kalau melihat https://github.com/amd/RyzenAI-SW, ada cukup banyak software untuk bereksperimen dengan NPU, tetapi karena Phoenix hanya 16 TOPS, saya tidak tertarik mengujinya sendiri
  • Di workstation NixOS, cukup menambahkan ini saja
    Aktifkan hardware.graphics.enable = true; dan di services.ollama atur acceleration = "rocm";, ROC_ENABLE_PRE_VEGA = "1";, HSA_OVERRIDE_GFX_VERSION = "11.0.0";

  • Dulu saya hampir memasang AMD ROCm setelah melihat kesederhanaan llamafile
    Tapi hasil sudo apt install rocm adalah 203 paket yang akan diinstal, unduhan sekitar 2,37GB, dan ruang yang dibutuhkan 35,7GB
    Saya tidak paham bagaimana 36GB bisa dibenarkan untuk sesuatu yang pada dasarnya mirip driver GPU

    • Memang software zaman sekarang sudah kelewat bongsor, tetapi ROCm bukan sekadar driver GPU
      Di dalamnya ada berbagai tool dan library
      CUDA toolkit juga, kalau diunduh sebagai satu file, unduhannya saja lebih dari 4GB, jadi dari sisi mana pun hasilnya terlihat tidak masuk akal besarnya
    • Masalah ini sedang diselesaikan di https://github.com/zml/zml
    • Sekarang driver CPU yang berjalan di GPU hampir seperti sistem operasi lengkap
    • AMD sampai benar-benar mengotori kernel Linux dengan drivernya: https://www.phoronix.com/news/AMD-5-Million-Lines
  • Ini terlihat seperti wrapper buatan AI di atas wrapper dari wrapper dari wrapper
    Ada komentar seperti # Other AMD-specific optimizations can be added here, # For example, you might want to set specific flags or use AMD-optimized libraries, jadi saya tidak tahu sebenarnya apa yang dilakukan di sini

    • Pada dasarnya ini file requirements besar dan Dockerfile, sisanya kebanyakan helper script
  • GPU AMD yang value-for-money saat ini apa?
    Saya baru saja membeli dua 3090 bekas refurb di eBay sekitar 750 dolar masing-masing, dan penasaran orang lain memakai apa untuk menjalankan LLM secara lokal

    • Saya baru-baru ini membeli MI100 seharga 650 dolar
      32GB HBM2, dan di benchmark dasar Flash Attention 2 sekitar 0–5% lebih cepat daripada 3090, tetapi performa aplikasi nyata naik-turun
      Banyak proyek belum dioptimalkan untuk matrix core CDNA, dan meskipun ada pekerjaan untuk RDNA, sering kali itu tidak langsung berlanjut ke CDNA
      Menyebalkan juga bahwa llama.cpp menutup PR Flash Attention untuk AMD dengan alasan library header-only menambahkan dependensi yang tidak perlu: https://github.com/ggerganov/llama.cpp/pull/7011
      Dengan xformers pada default SDXL, hasilnya sekitar 4,5–5it/s, kira-kira di antara 3090 dan 4090; di exllamav2, Qwen 72B 3bpw sekitar 7t/s, lebih lambat daripada 3090, tetapi 3090 harus memakai presisi yang lebih rendah agar muat
      Saya kurang tahu proyek ini memberi apa lagi untuk pengguna AMD dibanding pilihan yang sudah ada seperti llama.cpp, exllamav2, mlc-ai, dan belakangan kebanyakan proyek relatif mudah dijalankan
    • Secara pribadi, AMD iGPU/GPU sering rusak setiap kali ada update PyTorch, ROCm, xformers, atau Ollama, jadi nilainya tidak terlalu terasa
      Dengan Nvidia, tidur malam rasanya lebih tenang
    • Saya membeli Radeon Pro VII baru seharga 300 euro, dan itu deal yang lumayan
      Ada HBM2 dan bandwidth memori 1TB/s yang sama seperti 4090
      Namun VRAM-nya hanya 16GB
    • Mungkin jawabannya 7900 XTX
      24GB RAM seharga 1.000 dolar
  • Orang sering mengatakan “berbasis Docker”, tetapi arti sebenarnya adalah mendistribusikan $SOFTWARE sebagai image Docker
    Kalau disebut “berbasis Docker”, kesannya seolah inferensi di kartu AMD dilakukan dengan Docker, dan itu terasa seperti ungkapan yang tidak masuk akal

    • Seperti di Nvidia, Anda bisa melakukan inferensi di dalam container Docker
      OpenAI juga menjalankan cluster K8s seperti ini, dan AMD juga punya dokumentasi
      Namun di sisi AMD AI, Anda butuh kartu yang tepat, versi ROCm yang tepat, dan keberuntungan murni
      AMD menyediakan image Docker dengan dukungan ROCm, jadi jika itu dijadikan base layer, digabungkan dengan aplikasi, lalu GPU diteruskan ke container, itu bisa berjalan
      Pada akhirnya, ini mengurangi satu variabel yang perlu diperhatikan saat deployment, jadi secara harfiah memang melakukan inferensi di AMD dengan Docker
    • Docker menjadi tool standar machine learning karena distribusi Python yang terhubung ke library sistem akan kacau kalau tidak turut membawa lapisan itu juga
    • Perangkat tertentu bisa di-mount ke Docker
      Kalau melihat skripnya, GPU di-mount: https://github.com/slashml/amd_inference/blob/main/run-docke...
    • ZML sedang menyelesaikan masalah ini: https://github.com/zml/zml
    • Kenapa tidak masuk akal? Container Docker juga bisa berkomunikasi dengan perangkat, tinggal dipasangkan saja