4 puan yazan GN⁺ 2024-10-04 | 1 yorum | WhatsApp'ta paylaş
  • AMD GPU üzerinde büyük dil modellerini çalıştırmak için Docker tabanlı bir çıkarım motoru; Hugging Face modellerini hedefler ve LLaMA ailesine odaklanır
  • Çalışma ortamı ROCm destekli AMD GPU, Docker ve ana makinede kurulu ROCm sürücüsü 5.4.2 veya uyumlu bir sürüm gerektirir
  • run-docker-amd.sh, Docker imajını otomatik olarak derler ve AMD GPU erişimi için gereken /dev/kfd, /dev/dri, video grubu, SYS_PTRACE, seccomp=unconfined ayarlarıyla konteyneri çalıştırır
  • Kullanıcılar Hugging Face depo adını ve prompt'u argüman olarak vererek modeli değiştirebilir; örnek olarak meta-llama/Llama-2-7b-chat-hf ve facebook/opt-1.3b sunulmuştur
  • Çıkarım davranışını değiştirmek için run_inference.py düzenlenip Docker imajı yeniden derlenmelidir; bellek yetersizse daha küçük bir model veya daha kısa giriş/çıkış uzunlukları kullanılmalıdır

Projenin amacı ve hedef modeller

  • Bu proje, AMD GPU üzerinde LLM çalıştırmak için Docker tabanlı bir çıkarım motorudur
  • Hugging Face modellerini kullanmak üzere tasarlanmıştır ve özellikle LLaMA model ailesine odaklanır
  • Hugging Face Transformers kütüphanesini kullanır

Gereken ortam

  • Çalıştırmadan önce gereken koşullar şunlardır
    • ROCm destekleyen bir AMD GPU
    • Sistemde kurulu Docker
    • Ana makine sisteminde kurulu ROCm sürücüsü
      • 5.4.2 veya uyumlu bir sürüm gerekir

Proje yapısı

  • Depo yapısı src/ dizini ile çalıştırma ve derleme dosyalarından oluşur
    • 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

Hızlı çalıştırma akışı

  • Depoyu klonladıktan sonra proje dizinine geçin
git clone https://github.com/slashml/amd-gpu-inference.git
cd amd-gpu-inference
  • Çalıştırma betiğine yürütme izni verin
chmod +x run-docker-amd.sh
  • Model adını ve prompt'u vererek çıkarım motorunu çalıştırın
./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", kullanmak istediğiniz Hugging Face modeliyle değiştirilebilir; prompt'u da kendiniz belirleyebilirsiniz

Docker ve ROCm çalıştırma yöntemi

  • Aptfile, Docker konteyneri içine kurulacak ROCm paketlerini listeler
    • Gerekli ROCm sürücülerini ve kütüphanelerini konteyner içinde kullanılabilir hâle getirmeye yönelik bir yapılandırmadır
  • run-docker-amd.sh, Docker imajını otomatik olarak derler
  • Manuel derleme aşağıdaki komutla yapılabilir
docker build -t amd-gpu-inference .
  • Konteyneri manuel çalıştırırken AMD GPU erişimi için cihaz ve yetki seçeneklerini belirtin
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" alanına Hugging Face model adını, "your prompt here" alanına ise giriş metnini yazın

Özelleştirme ve sorun giderme

  • Model değişikliği, çalıştırma sırasında Hugging Face depo adını belirtme yöntemiyle yapılır
./run-docker-amd.sh "facebook/opt-1.3b" "Your prompt here"
  • Çıkarım mantığını değiştirmek için run_inference.py dosyasını düzenleyin
    • Değişiklikten sonra Docker imajı yeniden derlenmelidir
  • Sorun giderme maddeleri şunlardır
    • AMD GPU sürücüsünün ve ROCm'in ana makine sisteminde doğru şekilde kurulup yapılandırıldığını kontrol edin
    • "out of memory" hatası oluşursa daha küçük bir model kullanın veya giriş/çıkış uzunluğunu azaltın
    • Modele özgü sorunlar için Hugging Face'teki ilgili model belgelerine başvurun

Lisans ve referans

  • Proje, katkıları Pull Request olarak kabul edebilir
  • ROCm, AMD tarafından geliştirilmiştir ve MIT License ile sunulur
  • Sorular veya sorunlar GitHub deposunun issue bölümünde açılabilir

1 yorum

 
GN⁺ 2024-10-04
Hacker News yorumları
  • Çıkarım amacıyla kullanılacaksa, desteklenen bir kartsa ya da Linux’ta HSA_OVERRIDE_GFX_VERSION kullanılabilen bir mimariyse, yukarı akış PyTorch ve transformers ile neredeyse her şey çalıştırılabiliyor.
    llama.cpp de en az yaklaşık 1 yıldır oldukça sorunsuz derleniyor; Windows’ta ise genellikle sürümlerde win-hip ikili dosyası bulunuyor, olmazsa performansı daha düşük olsa da Vulkan derlemesiyle etrafından dolaşmak mümkün.
    Ancak bu yazıdaki ROCm 5.4.2 neredeyse 2 yıl önceki bir sürüm ve o zamandan beri çok şey değişti; Ekim 2024’te neden yeni yayımlandığını merak ediyorum.
    Yakın zamanda RDNA3 odaklı uyumluluk dokümanını ROCm 6.2 temelinde güncelledim; birkaç ay içinde bile yukarı akış bitsandbytes, yukarı akış xformers, Triton tabanlı Flash Attention gibi çok sayıda değişiklik oldu: https://llm-tracker.info/howto/AMD-GPUs

  • Üretken yöntemlerle kabaca yapılmış makine öğrenimi kütüphanelerinin çoğalması şaşırtıcı derecede fazla.
    Bu kütüphanenin yarısı print ifadelerinden oluşuyor; dallanma yapılan yerlerde de aslında dallanmaya gerek yok.
    İki ortam değişkeni tanımlayıp iki torch bayrağı ayarlamaktan ibaret.

    • Veri bilimcileri ve makine öğrenimi tarafındaki insanları yazılım mühendisi sanıp aynı çıktıları beklemenin sadece tansiyon yükselttiğini düzeltmek için terapiye bile gitmem gerekti.
      Ekiplerde veya kurumlarda beklenti yönetiminin gerçekten büyük bir konu olduğunu düşünüyorum.
    • Fazla sert mi diye düşündüm ama depoya bakınca öyle olmadığını gördüm.
      Gerçekten de neredeyse hiçbir içerik yok.
    • Ne demek istediğini anlıyorum ama bu tür yorumlar yüzünden insanlar kod paylaşmaktan, açık kaynak katkısı yapmaktan veya programlamaya devam etmekten çekinir hale geliyor.
  • Eski ROCm 5.4.2 kullanıyor gibi görünüyor; 2 yıl önceki bir sürüm olduğu için RX 7900 XTX’imi destekleyip desteklemeyeceğinden şüpheliyim.
    Kişisel olarak en kolayı en güncel rocm/pytorch imajını kullanıp gerekli şeyleri onun içinde çalıştırmak oldu.

    • RX 7900 XTX (gfx1100), ROCm 5.4’te rocBLAS gibi matematik kütüphanelerinde ilk kez etkinleştirildi; ancak MIOpen gibi yapay zeka kütüphaneleri sanırım ROCm 5.5’e kadar etkin değildi.
      Sonraki sürümlerde performansın da epey ciddi biçimde iyileştiğini düşünüyorum.
  • Ubuntu 24.04 ve Debian Unstable’da, işletim sisteminin sağladığı paketlerle Vega sonrası neredeyse tüm ayrık AMD GPU’larda llama.cpp ROCm ile çalıştırılabiliyor.
    Docker’a veya HSA_OVERRIDE_GFX_VERSIONa da gerek yok; hipcc, libhipblas-dev, librocblas-dev, cmake vb. kurduktan sonra video, render grup izinlerini verip GGML_HIPBLAS=ON ile derlemek yeterli.
    RDNA 3, MI200, MI300 kullanıcıları için performans açısından AMD’nin sağladığı ROCm paketleri daha iyi; PyTorch gereken durumlarda da sistem paketlerinde olmayan bağımlılıklar olduğu için AMD’nin sağladığı paketleri kullanmak daha iyi.
    Yine de kurulum kolaylığı ve eski donanım uyumluluğu açısından işletim sistemi paketlerini geçmek zor; referans bağlantı da https://lists.debian.org/debian-ai/2024/07/msg00002.html.

    • Ubuntu 22.04.5’te RX 7900 XTX ile AMD’nin sağladığı ROCm ve Ollama’yı büyük bir sorun yaşamadan kurdum; Ollama ile ROCm tabanlı LLM çalıştırmak da gayet iyi işliyor.
    • Şu anda piyasada tüketici dostu bir fiyata 24 GB’tan fazla VRAM sunan AMD kart var mı?
  • Ryzen 8700G’yi NPU ile sinir ağı çıkarımı yapmak için alalı yaklaşık 8 ay oldu, ama şimdiye kadar hızlandırmayı NPU’dan değil, yalnızca iGPU’nun Vulkan’ı üzerinden elde ediyorum
    Sadece Linux kullanıyorum; iyi tarafı, 64 GB RAM sayesinde 32 GB’ı aşan modelleri de sorunsuzca deneyebilmiş olmam
    Vulkan arka ucunu destekleyen llama.cpp takdiri hak ediyor

    • iGPU’da da ROCm/HIP desteği almak mümkün olabilir; llama.cpp derlenirken LLAMA_HIP_UMA=1 bayrağı denenebilir
      https://github.com/amd/RyzenAI-SW’ye bakınca NPU ile kurcalanabilecek epey yazılım var, ama Phoenix 16 TOPS olduğu için doğrudan test etmeye heveslenmedim
  • NixOS iş istasyonuna şunları eklemek yeterli oldu
    hardware.graphics.enable = true;’yu açıp services.ollama içinde acceleration = "rocm";, ROC_ENABLE_PRE_VEGA = "1";, HSA_OVERRIDE_GFX_VERSION = "11.0.0"; ayarlarını yaptım

  • Eskiden llamafile’ın sadeliğini görünce AMD ROCm kurmayı neredeyse deneyecektim
    Ama sudo apt install rocm sonucunda 203 kurulum paketi, yaklaşık 2,37 GB indirme ve 35,7 GB gerekli alan çıktı
    Esasen GPU sürücüsüne yakın bir şey için 36 GB’ın nasıl gerekçelendirilebildiğini anlamıyorum

    • Günümüz yazılımlarının saçma derecede şiştiği doğru, ama ROCm basit bir GPU sürücüsü değil
      Birçok araç ve kütüphane içeriyor
      CUDA toolkit de tek dosya olarak indirildiğinde yalnızca indirme boyutu 4 GB’ı aşıyor; yani hangi tarafta olursa olsun sonuç akıl almaz derecede büyük görünüyor
    • https://github.com/zml/zml bu sorunu çözüyor
    • Artık GPU’da çalışan CPU sürücüsü neredeyse başlı başına eksiksiz bir işletim sistemi
    • AMD, sürücüleriyle Linux çekirdeğini tamamen kirletecek düzeyde: https://www.phoronix.com/news/AMD-5-Million-Lines
  • Bu, sarmalayıcının sarmalayıcısının sarmalayıcısı üstüne yapay zekanın yazdığı bir sarmalayıcı gibi görünüyor
    # Other AMD-specific optimizations can be added here, # For example, you might want to set specific flags or use AMD-optimized libraries gibi yorumlar var; öyleyse burada ne yapıldığını anlamıyorum

    • Pratikte büyük bir requirements dosyası ve Dockerfile; geri kalanın çoğu da yardımcı betikler
  • Şu sıralar fiyat/performans açısından iyi AMD GPU’lar hangileri?
    Az önce eBay yenilenmiş ürün olarak ikinci el iki 3090’ı tanesi yaklaşık 750 dolara aldım; yerelde LLM çalıştırırken başkalarının ne kullandığını merak ediyorum

    • Yakın zamanda MI100’ü 650 dolara aldım
      32 GB HBM2 var ve temel Flash Attention 2 benchmark’ında 3090’dan yaklaşık %0–5 daha hızlı, ama gerçek uygulama performansı dalgalı
      CDNA’nın matris çekirdekleri için optimize edilmemiş çok proje var; RDNA için yapılmış çalışma olsa bile çoğu zaman CDNA’ya aynen taşınmıyor
      llama.cpp’nin AMD için Flash Attention PR’ını, yalnızca header’dan oluşan bir kütüphanenin gereksiz bağımlılık eklediği gerekçesiyle kapatması da sinir bozucu: https://github.com/ggerganov/llama.cpp/pull/7011
      SDXL varsayılanlarında xformers kullanınca 4,5–5 it/s civarında, yani 3090 ile 4090 arasında bir yerde; exllamav2’de Qwen 72B 3bpw yaklaşık 7 t/s ile 3090’dan yavaş, ama 3090’a sığdırmak için daha düşük hassasiyet kullanmak gerekiyor
      Bu projenin AMD kullanıcılarına llama.cpp, exllamav2, mlc-ai gibi mevcut seçeneklerden daha fazla ne sunduğundan pek emin değilim; bugünlerde çoğu proje görece kolay çalışıyor
    • Kişisel olarak AMD iGPU/GPU’lar PyTorch, ROCm, xformers, Ollama güncellemelerinde sürekli bozulduğu için pek değerli olmadı
      Nvidia tarafında geceleri daha rahat uyunuyor
    • Radeon Pro VII’yi sıfır olarak 300 avroya aldım; fena bir alışveriş değildi
      HBM2 var ve bellek bant genişliği 4090 ile aynı: 1 TB/s
      Ancak VRAM sadece 16 GB
    • Muhtemelen cevap 7900 XTX gibi görünüyor
      1.000 dolara 24 GB RAM
  • İnsanlar sık sık “Docker tabanlı” diyor, ama bunun gerçekte anlamı $SOFTWARE’ın Docker imajı olarak dağıtılması
    “Docker tabanlı” denince sanki AMD kartta çıkarımı Docker yapıyormuş gibi okunuyor; bu bana anlamsız bir ifade gibi geliyor

    • Nvidia’da olduğu gibi Docker konteyneri içinde çıkarım yapabilirsiniz
      OpenAI de K8s kümelerini bu şekilde çalıştırıyor, AMD’nin de dokümantasyonu var
      Ancak AMD yapay zeka tarafında doğru kart, doğru ROCm sürümü ve saf şans gerekiyor
      AMD, ROCm destekli Docker imajları sağlıyor; bunu temel katman olarak uygulamayla birleştirip GPU’yu konteynere aktarırsanız çalışabilir
      Sonuçta dağıtım sırasında dikkat etmeniz gereken değişkenlerden birini azalttığı için, kelimenin tam anlamıyla Docker ile AMD üzerinde çıkarım yapmış oluyorsunuz
    • Docker’ın makine öğrenmesinde standart araç haline gelmesinin nedeni, sistem kütüphanelerine bağlanan Python dağıtımının o katmanı da yanında taşımadığı sürece işlerin karmakarışık olması
    • Docker’a belirli cihazları mount edebilirsiniz
      Betiğe bakınca GPU’yu mount ettiğini görüyorsunuz: https://github.com/slashml/amd_inference/blob/main/run-docke...
    • ZML bu sorunu çözüyor: https://github.com/zml/zml
    • Neden anlamsız olsun? Docker konteynerlerinde de cihazlarla iletişim kurulabilir; yalnızca bağlamanız yeterli