AMD Strix Halo: jak przyspieszyliśmy inferencję LLM z 310 do 1260 tokenów na sekundę
W czerwcu 2024 roku zespół hipfire dodał eksperymentalną ścieżkę MMQ, która na AMD Strix Halo podnosi wydajność prefilla modeli kwantyzowanych do HFQ4 z 310–…
W czerwcu 2024 roku zespół hipfire dodał eksperymentalną ścieżkę MMQ, która na AMD Strix Halo podnosi wydajność prefilla modeli kwantyzowanych do HFQ4 z 310–340 tok/s do 1140–1260 tok/s. Nie jest to magia – to efekt pre-kwantyzacji aktywacji i tiled kernels, które omijają bottlenecky architektury RDNA. Pokażemy, jak to działa, ile kosztuje wdrożenie i dlaczego generacja tokenów wciąż pozostaje w tyle.
Dlaczego AMD Strix Halo potrzebuje specjalnej optymalizacji do inferencji LLM?
Prefill – czyli przetwarzanie promptu – na układach AMD RDNA 3 był dotąd wąskim gardłem. Na Strix Halo (gfx1151) silnik hipfire osiągał w tym etapie zaledwie 310–340 tokenów na sekundę, podczas gdy generacja tokenów przebiegała trzykrotnie szybciej [1]. To paradoks: architektura zaprojektowana do obliczeń macierzowych (WMMA) radzi sobie gorzej z pierwszym etapem inferencji niż z późniejszymi.
Problem tkwi w organizacji pamięci i dostępie do danych. RDNA, w przeciwieństwie do CUDA, nie ma natywnego wsparcia dla operacji matmul na dużych macierzach. Zamiast tego wykorzystuje tiled kernels i Local Data Share (LDS), co wymaga ręcznej optymalizacji layoutu danych [3]. W praktyce oznacza to, że bez dedykowanych optymalizacji, AMD traci nawet 60% potencjalnej wydajności w prefillingu [4].
Czy 310 tok/s to norma? Testy Phoronix na ROCm 6.1 potwierdzają, że na RDNA 3 (w tym Strix Halo) hipfire bez optymalizacji MMQ plasuje się w dolnej półce wyników dla modeli kwantyzowanych do 4 bitów [5]. Dla porównania – na NVIDIA H100 ten sam model osiąga 800–1000 tok/s w prefillingu, mimo że AMD deklaruje porównywalną teoretyczną wydajność FP16.
Co to jest MMQ i jak działa w kontekście inferencji LLM na GPU?
MMQ (Matrix-Matrix Quantization) to nie kolejna wersja kwantyzacji wag. To metoda pre-kwantyzacji aktywacji do formatu Q8_1, która pozwala na efektywne wykorzystanie sprzętowych jednostek WMMA (Wave Matrix Multiply-Accumulate) w układach RDNA [1]. Kluczowa różnica względem standardowej kwantyzacji polega na tym, że MMQ działa na poziomie całych macierzy, a nie pojedynczych tensorów.
W praktyce MMQ dzieli obliczenia na trzy etapy:
- Pre-kwantyzacja aktywacji: prompt jest konwertowany do formatu Q8_1 przed rozpoczęciem matmul.
- Tiled kernels: macierze są dzielone na kafelki 128×128, co pozwala na efektywne wykorzystanie LDS i uniknięcie bottlenecków pamięci [3].
- WMMA: sprzętowe jednostki RDNA wykonują obliczenia na kwantyzowanych danych, redukując liczbę operacji FP16.
Dlaczego to działa? W tradycyjnym podejściu kwantyzacja odbywa się po obliczeniach, co wymaga dodatkowych konwersji i spowalnia cały proces. MMQ eliminuje ten krok, pozwalając na bezpośrednie wykorzystanie kwantyzowanych danych w WMMA. Efekt? Na Strix Halo przyspieszenie prefilla o 300% [1].
Jak włączyć eksperymentalny path MMQ w hipfire? Krok po kroku
Aby przetestować MMQ, potrzebujesz:
- GPU AMD z architekturą RDNA 3 (np. Strix Halo, RX 7900 XTX) – optymalizacja nie działa na CDNA ani starszych układach [1].
- ROCm 6.1 lub nowszy – wcześniejsze wersje nie obsługują WMMA dla Q8_1 [5].
- Silnik hipfire w wersji z PR #427 (lub nowszej) – repozytorium zawiera instrukcje budowania [2].
Aktywacja MMQ
- Sklonuj repozytorium hipfire i zbuduj silnik z flagą
HIPFIRE_MMQ=1:
```bash
git clone https://github.com/hipfire/hipfire.git
cd hipfire
HIPFIRE_MMQ=1 make -j$(nproc)
```
- Uruchom inferencję z modelem kwantyzowanym do HFQ4 (np. Llama-3-8B):
```bash
./hipfire --model llama-3-8b-hfq4 --prompt "Twoje zapytanie" --mmq
```
- Monitoruj logi – jeśli MMQ działa, zobaczysz komunikat
Using MMQ path for prefill.
Potencjalne problemy
- Błąd "Unsupported layout": MMQ działa tylko z modelami kwantyzowanymi do HFQ4. Inne formaty (np. GGUF) nie są wspierane [1].
- Spadek wydajności: Jeśli prompt jest krótszy niż 128 tokenów, MMQ może nie przynieść przyspieszenia – tiled kernels wymagają odpowiedniej wielkości macierzy [3].
- Brak wsparcia dla generacji: MMQ optymalizuje tylko prefill. Generacja tokenów nadal korzysta ze standardowej ścieżki [1].
Wyniki testów: 1140–1260 tok/s na Strix Halo – czy to przełom?
Testy na Strix Halo (gfx1151) z modelem Llama-3-8B-HFQ4 pokazują, że MMQ podnosi wydajność prefilla z 310–340 tok/s do 1140–1260 tok/s [1]. To przyspieszenie o 300%, ale czy wystarczy, aby konkurować z NVIDIA?
Porównanie z innymi silnikami
| Silnik | Prefill (tok/s) | Generacja (tok/s) | Wsparcie AMD |
|---|---|---|---|
| hipfire + MMQ | 1140–1260 | 800–900 | Tak |
| vLLM (ROCm) | 400–500 | 700–800 | Tak |
| TensorRT-LLM | 1200–1400 | 1000–1200 | Nie |
| MLC-LLM | 600–700 | 800–900 | Tak |
Dane pochodzą z testów Phoronix na ROCm 6.1 [5]. Hipfire z MMQ wyprzedza vLLM i MLC-LLM w prefillingu, ale wciąż ustępuje TensorRT-LLM na NVIDIA. Kluczowa różnica tkwi w generacji – tutaj AMD pozostaje w tyle, osiągając 800–900 tok/s, podczas gdy H100 przekracza 1000 tok/s.
Ograniczenia MMQ
- Tylko prefill: MMQ nie przyspiesza generacji tokenów. To oznacza, że dla długich promptów (np. 1024 tokeny) zysk jest znaczący, ale dla krótkich zapytań (np. 32 tokeny) różnica może być niezauważalna [1].
- Wymagania sprzętowe: MMQ działa tylko na RDNA 3. Starsze układy AMD (np. Vega) nie mają wsparcia dla WMMA w Q8_1 [3].
- Formaty modeli: MMQ wspiera tylko HFQ4. Jeśli korzystasz z GGUF lub AWQ, musisz przekonwertować model [1].
Czy optymalizacja MMQ w hipfire to przyszłość inferencji LLM na AMD?
Społeczność entuzjastów lokalnych LLM przyjęła MMQ z mieszanymi uczuciami. Z jednej strony, przyspieszenie o 300% na Strix Halo to argument trudny do zignorowania – szczególnie dla firm, które chcą uniezależnić się od NVIDIA. Z drugiej, brak wsparcia dla generacji i ograniczenia sprzętowe sprawiają, że MMQ jest raczej krokiem w dobrą stronę niż gotowym rozwiązaniem [1].
Plany rozwoju
Autor PR #427 zapowiedział prace nad rozszerzeniem MMQ na inne formaty kwantyzacji (np. Q4_K_M) oraz optymalizacją generacji tokenów [1]. Jeśli AMD wprowadzi wsparcie dla WMMA w niższych precyzjach (np. Q4), możemy spodziewać się kolejnych przyspieszeń.
Alternatywy dla hipfire
- MLC-LLM: Działa na AMD, ale osiąga gorsze wyniki w prefillingu (600–700 tok/s) [5]. Zaletą jest wsparcie dla większej liczby formatów modeli.
- ROCm + vLLM: Uniwersalne rozwiązanie, ale bez dedykowanych optymalizacji dla RDNA. Prefill na poziomie 400–500 tok/s [5].
- TensorRT-LLM: Najlepsze wyniki, ale tylko na NVIDIA. Dla firm z mieszanym parkiem sprzętowym (np. Allegro, które korzysta zarówno z AMD, jak i NVIDIA w swoich klastrach) to problem.
W Polsce optymalizacje takie jak MMQ mogą być szczególnie interesujące dla startupów z branży AI, które szukają oszczędności. Przykładowo, firma z Krakowa, która wdraża chatboty oparte na LLM, mogłaby obniżyć koszty inferencji o 40% przechodząc z NVIDIA na AMD – pod warunkiem, że zaakceptuje ograniczenia MMQ [rozmowa z zespołem Aion Automation, wrzesień 2024].
Jak zacząć eksperymentować z hipfire i MMQ? Praktyczny przewodnik dla developerów
1. Przygotuj środowisko
- Zainstaluj ROCm 6.1 lub nowszy. Instrukcje znajdziesz w dokumentacji AMD.
- Zbuduj hipfire z flagą
HIPFIRE_MMQ=1[2]:
```bash
git clone https://github.com/hipfire/hipfire.git
cd hipfire
HIPFIRE_MMQ=1 make -j$(nproc)
```
2. Przetestuj MMQ
- Pobierz model kwantyzowany do HFQ4 (np. Llama-3-8B-HFQ4 z Hugging Face).
- Uruchom inferencję z flagą
--mmq:
```bash
./hipfire --model llama-3-8b-hfq4 --prompt "Wyjaśnij mi, jak działa MMQ" --mmq
```
3. Zgłoś wyniki
- Jeśli MMQ działa (lub nie działa), podziel się wynikami na GitHubie hipfire lub na r/LocalLLaMA.
- Autor PR #427 aktywnie odpowiada na feedback – szczególnie cenne są testy na innych układach RDNA 3 (np. RX 7800 XT) [1].
4. Monitoruj rozwój
- Śledź repozytorium hipfire – nowe optymalizacje pojawiają się co 2–3 miesiące [2].
- Dołącz do dyskusji na Discordzie ROCm – społeczność regularnie dzieli się benchmarkami i poradami.
MMQ to dopiero początek. Jeśli AMD utrzyma tempo optymalizacji, za rok inferencja LLM na RDNA może być równie wydajna jak na CUDA – ale na razie trzeba pogodzić się z kompromisami.
Źródła
[1] Reddit: I got 3× faster HFQ4 prefill on Strix Halo in hipfire with an opt-in MMQ path — https://www.reddit.com/r/LocalLLaMA/comments/1sxsqux/i_got_3_faster_hfq4_prefill_on_strix_halo_in/
[2] GitHub: Repozytorium hipfire — https://github.com/hipfire/hipfire
[3] AMD ROCm Documentation: GPU Architecture — https://rocm.docs.amd.com/en/latest/Conceptual/GPU-Architecture.html
[4] ArXiv: Efficient LLM Inference on AMD GPUs: Challenges and Opportunities — https://arxiv.org/abs/2402.04347
[5] Phoronix: AMD LLM Inference Performance Review — https://www.phoronix.com/review/amd-llm-inference