Přeskočit na obsah
U sebe doma 3 min čtení

llama-quantize si na velký tenzor bere nejvýš osm gigabajtů operační paměti

Kvantizační nástroj z llama.cpp si na každý tenzor alokoval dva pomocné bloky po čtyřech bajtech na parametr, takže u opravdu velké vkládací tabulky šly nároky do stovek gigabajtů. Od 27. srpna 2026 zpracovává tenzor po dávkách řádků a pracovní paměť drží pod 8 GiB. Nový přepínač ten strop posune nahoru i dolů.

Hromada starších paměťových modulů SIMM a DIMM
Hromada starších paměťových modulů. Foto: Blake Patterson, Wikimedia Commons (CC BY 2.0)

Nástroj llama-quantize z projektu llama.cpp převádí váhy modelu do úspornějšího formátu, aby se model vešel na kartu nebo aspoň do paměti. Do 27. srpna 2026 si přitom na každý tenzor, který kvantizoval, alokoval dva pomocné bloky, každý o velikosti čtyř bajtů na jeden parametr. U běžné vrstvy jsou to megabajty. U jedné vyhledávací tabulky z čerstvého modelu Qwenu z toho vyšly stovky gigabajtů, a právě ta oprava vyvolala.

Čtyři bajty na parametr, a to dvakrát

Staré znění souboru src/llama-quant.cpp mělo dvě místa, na kterých se to lámalo. První si připravilo výstupní blok příkazem work.resize(nelements * 4), tedy čtyři bajty na každé číslo tenzoru; komentář vedle něj to označuje za horní odhad. Druhé poslalo tenzor rozbalit do desetinných čísel a převodní funkce si na to zvětšila pole typu float na počet prvků tenzoru, tedy znovu čtyři bajty na číslo. Oba bloky žily vedle sebe, dokud nebyl celý tenzor hotový.

Zdrojová data se do paměti nahrávat nemusela. Když je zapnuté mapování souboru do paměti, ukazuje se rovnou do mapy a stránky si uklízí systém sám; bez mapování se ale načetl celý tenzor do třetího bloku. Nároky na paměť tedy neurčovala velikost modelu, ale velikost jeho největšího tenzoru.

Tenzor, který to vyvolal

Popis opravy jmenuje spouštěč přímo: vyhledávací tabulku n-gramů z modelu Qwen3.8-Flash-Next, o jejímž obsahu jsme psali samostatně. Ve zveřejněných vahách je rozsekaná na 128 dílů, převodní skript llama.cpp z nich ale skládá jeden tenzor a komentář nad tím kusem kódu o něm mluví jako o tenzoru „dobře přes 100 GB“. Z hlaviček vah vychází 51 200 245 760 parametrů.

Na takovém tenzoru si stará cesta musela vzít 204,8 GB na jeden pomocný blok, a bloky byly dva. To číslo je náš výpočet z kódu, nikoli údaj ze zdroje: čtyři bajty krát 51,2 miliardy parametrů.

Nově se jede po dávkách řádků

Změna, kterou návrh 27795 zavedl 27. srpna 2026, tenhle postup rozseká na dávky celých řádků. Na jeden řádek připadne místo ve zdrojovém formátu, místo v cílovém formátu a čtyři bajty na každé číslo pro mezikrok s desetinnými čísly; kolik řádků se vejde do jedné dávky, vyjde z podílu stropu a téhle hodnoty. Hotová dávka jde rovnou do výstupního souboru. Tenzory, které se nekvantizují, se opisují po celých řádcích taky – podle komentáře v kódu proto, aby se dala každá dávka ověřit.

Strop je nový přepínač --max-buffer-size, zadává se v mebibajtech a bez něj platí 8 192, tedy 8 GiB. Autor změny Xuan-Son Nguyen v popisu uvádí, že s nižším stropem vyšel výstup bajt po bajtu shodný. Do sestavení se změna dostala týž den: první, které ji obsahuje, je b10656, vydané v 17.40 UTC.

Co z toho má počítač doma

Strop se týká pomocných bloků, ne celého převodu. Vstupní soubor se dál mapuje do paměti a výstupní se dál zapisuje na disk, takže na místo v úložišti to nároky nesnižuje ani o bajt. Podle našeho propočtu se dávkování projeví teprve u tenzoru zhruba nad miliardu čísel; menší modely se kvantizovaly stejně jako dřív a po opravě to tak zůstane.

A jestli se dá Qwen3.8-Flash-Next po kvantizaci provozovat doma, je jiná otázka. Rozhraní Hugging Face hlásí u jedné z veřejných sad GGUF velikost 354 GB pro BF16, 188,2 GB pro Q8_0 a 72,5 GB i u nejmenšího balíku, který je označený jako jednobitový. Za to může právě ta tabulka: llama-quantize ji řadí mezi vkládací tabulky, takže se řídí přepínačem --token-embedding-type, a kdo jí chce dát vlastní formát, musí ji pojmenovat přes --tensor-type.

Ubyla tedy jedna překážka ze dvou. Kvantizovat velký model jde nově i na stroji s běžnou pamětí; vejít se s tím výsledkem někam je pořád na čtenáři.

Zdroje

Diskuse

Zatím tu nikdo nediskutuje. Můžete být první.

Napsat příspěvek

Diskutovat můžete i bez účtu. S registrací se ale příspěvek zveřejní hned a nemusíte pokaždé vyplňovat jméno. Účet už máte? Přihlaste se.

Nezveřejňujeme ho, slouží jen redakci.

Podporuje zápis Texy: **tučně**, *kurzíva*, odrážky, odkazy.

Dál k tématu

  1. U sebe doma

    llama.cpp počítal u sedmi architektur normalizaci jinak než jejich referenční kód

    Vektory dotazů a klíčů v hybridní vrstvě Gated DeltaNet dělil llama.cpp odmocninou ořezanou zdola, kdežto knihovna, ke které se jejich referenční kód hlásí, k té…

  2. U sebe doma

    llama.cpp nechá některé velké vkládací tabulky na disku místo v operační paměti

    Projekt llama.cpp vydal 4. září 2026 verzi 0.4.0 s volbou --lazy-mode: vybraná vkládací tabulka zůstane v souboru na disku a program z ní čte řádky až ve chvíli, kdy je…

  3. U sebe doma

    Ollama 0.33.3 čte doporučené hodnoty vzorkování přímo ze souboru modelu

    Ollama do teď používala vlastní výchozí teplotu a top_p vždycky, když je nepřepsal Modelfile nebo požadavek. Verze 0.33.3 z 2. září 2026 se nejdřív podívá, co si o sobě…

  4. U sebe doma

    Hugging Face zveřejnil 207 WebGPU kernelů pro prohlížeč, loader k nim vyšel jako náhled

    Organizace webgpu-kernels na Hubu nese 207 výpočetních programů pro grafický čip pod licencí Apache 2.0 a balíček @huggingface/kernels je z prohlížeče stáhne a spustí.…