Strona główna / Rozdział 7 · Model na produkcji
    Ostatnia zmiana · 5 min czytania

    Użyj z AI

    Czemu GPU się nudzi

    Przy generowaniu tekstu karta graficzna przez większość kroku czeka, aż wagi i KV cache przyjadą z pamięci, a liczy tylko przez ułamek tego czasu. To jedno zjawisko tłumaczy batching, kwantyzację, dekodowanie spekulacyjne i to, czemu tokeny wyjściowe są droższe od wejściowych.

    Po ludzkuKucharz jest błyskawiczny, ale po każdy składnik biega do magazynu na drugim końcu budynku. Gotując dla jednej osoby, głównie biega. Gotując dla stu naraz, biega tyle samo, a gotuje sto razy więcej.

    Zwiększaj batch i patrz, kiedy liczenie dogoni czekanie na pamięć. Potem przełącz na prefill

    Jeden krok modelu

    czekanie na wagi z pamięciliczenie
    czasu kroku karta liczy
    tokenów na sekundę dla jednej rozmowy
    tokenów na sekundę łącznie

    Model poglądowy: 8 mld parametrów w BF16 (16 GB wag), jedna H100 SXM z pamięcią 3,35 TB/s i ok. 400 TFLOPS realnie osiąganej mocy (katalogowo ok. 990 TFLOPS dense BF16). Czytanie i liczenie nakładają się w czasie, więc krok trwa tyle, ile dłuższe z nich. Pasek pomija KV cache i narzuty, więc liczby pokazują najlepszy przypadek; komunikat dolicza cache przy 4000 tokenów kontekstu na rozmowę.

    Dlaczego decode jest memory-bound

    Gdzie batch przestaje być darmowy

    Co z tego wynika dla serwowania

    Sprawdź się

    Dlaczego decode jest memory-bound i co z tego wynika dla serwowania?

    Każdy krok decode czyta z pamięci wszystkie wagi i KV cache, a liczy tylko jeden token na rozmowę: w BF16 to ok. 1 operacja na bajt, a H100 potrzebuje ok. 300, żeby wąskim gardłem stało się liczenie. Sufit prędkości jednej rozmowy to przepustowość pamięci podzielona przez bajty na token. Wagi przeczytane raz obsługują cały batch, więc batching podnosi przepustowość prawie za darmo, dopóki nie skończy się pamięć na KV cache albo budżet opóźnienia. Kwantyzacja i dekodowanie spekulacyjne przyspieszają decode. Z prefillem jest odwrotnie: ogranicza go moc obliczeniowa.

    In English

    Every decode step reads all the weights and the KV cache from memory but computes only one token per conversation: in BF16 that is about 1 operation per byte, while an H100 needs about 300 before compute becomes the bottleneck. The speed ceiling for one conversation is memory bandwidth divided by bytes read per token. Weights read once serve the whole batch, so batching raises throughput almost for free until KV cache memory or the latency budget runs out. Quantisation and speculative decoding speed up decode. Prefill is the opposite: it is compute-bound.

    Pytania pogłębiające (4)
    Oszacuj maksymalną prędkość modelu 70B w FP8 na jednej H100.
    70 GB wag przy 3,35 TB/s to ok. 21 ms na krok, czyli najwyżej ok. 48 tokenów na sekundę na rozmowę, zanim doliczysz KV cache. Na cache zostaje ok. 10 GB z 80, więc batch będzie mały. W praktyce taki model dzieli się na 2–4 karty (tensor parallelism), co sumuje przepustowość i pamięć.
    Masz SLO 50 ms między tokenami. Jak dobierasz rozmiar batcha?
    Czas kroku to w przybliżeniu (wagi + KV cache całego batcha) / przepustowość pamięci, dopóki liczenie się w nim mieści. Zwiększasz batch, aż czas kroku zbliży się do 50 ms, z zapasem na p99, albo zabraknie pamięci na cache. Dalej przepustowość rośnie już kosztem opóźnienia wszystkich.
    Po co rozdzielać prefill i decode na osobne maszyny?
    Prefill jest ograniczony mocą i przychodzi falami, decode jest ograniczony pamięcią i trwa ciągle. Na wspólnej karcie długi prefill zatrzymuje cudze generowanie, a osobne pule można skalować i dzielić na karty niezależnie. Ceną jest przesyłanie KV cache’u z puli prefill do puli decode.
    Wykorzystanie mocy obliczeniowej w decode wynosi kilka procent. To problem?
    Niekoniecznie. Przy małym batchu właściwą miarą jest wykorzystanie przepustowości pamięci (MBU): bajty wag i cache’u na krok podzielone przez czas kroku i szczytową przepustowość. Wykorzystanie mocy (MFU) optymalizujesz w prefillu i treningu.

    Źródła

    Zgłoś błąd · Zaproponuj poprawkę