Vlákno názorů k článku
Greenboost přidává paměť pro GPU Nvidia z RAM a NVMe od fanoush - hmm, to je divne, myslel jsem ze CUDA...

  • 16. 3. 2026 10:43

    fanoush

    hmm, to je divne, myslel jsem ze CUDA shared RAM davno umoznuje (ve widows i v linuxu), jen je to proste pomale kvuli pcie rychlosti. to NVME samozrejme ne ale to uz je dost zoufalost

  • 16. 3. 2026 10:51

    a6b

    to by me taky zajimalo detailneji.
    jestlize uz cuda ma funkci cudaImportExter­nalMemory, tak jsem predpokladal, ze tam pujde hodit pointer na nejakou alokovanou pamet z RAm a je to.

  • 16. 3. 2026 12:04

    Fík
    Zlatý podporovatel

    Autor píše toto:

    Greenboost is not a hack around driver restrictions. The DMA-BUF + external memory import path it uses is a documented CUDA feature.

  • 16. 3. 2026 12:09

    Wasper

    Počkat, to je něco jiného, shared RAM je o tom, že to dynamicky přesouvá mezi RAM a GPU při přístupu z CPU a/nebo kernelu (prostě že se o to člověk nemusí starat, kde ty data jsou), ale ne samotný RAM offloading.

    Ten dělají nějaké další funkce (PyTorch má nějakou, accelerate taky), ale co jsem si (před rokem) hrál, mají pořád své limity, něco jako "transparentní pagging" to má daleko a na OOM to naráží také. (Už si nepamatuju proč, ale tuším to bylo protože to pracovalo s bloky, a ne zcela správně to unloadovalo když to bylo na hraně)

  • 16. 3. 2026 12:31

    fanoush

    to nevypada ze by se neco dynamicky presouvalo

    https://docs.nvidia.com/cuda/cuda-programming-guide/02-basics/understanding-memory.html#page-locked-host-memory
    Page-locked memory can be mapped to the GPU for direct access from GPU kernels.
    ....
    2.4.3.1. Mapped Memory
    On systems with HMM or ATS, all host memory is directly accessible from the GPU using the host pointers.
    ....
    While mapped memory may be useful in some cases where certain data which is not copied to the GPU needs to be accessed from a kernel, accessing mapped memory in a kernel requires transactions across the CPU-GPU interconnect, PCIe, or NVLink C2C. These operations have higher latency and lower bandwidth compared to accessing device memory. Mapped memory should not be considered a performant alternative to unified memory or explicit memory management for the majority of a kernel’s memory needs.

  • 16. 3. 2026 12:40

    Wasper

    Máte naprostou pravdu, popletl jsem to s Unified memory. Mea culpa

    Nicméně mi to moc nepomůže, jestli koukám dobře, tak ani jedna moje grafika to nepodporuje :( Škoda, i tak díky za nasměrování.

    16. 3. 2026, 12:44 editováno autorem komentáře

  • 17. 3. 2026 14:29

    Wasper

    Tak jsem GreenBoost otestoval. Podle toho, jak se chová je to zatím fakt jen hack do ollama.

    Dost věcí je tam zadrátovaných (autorovo 12GB VRAM, nebo 64GB (ten se to snaží spočítat) swap natvrdo v rootu (a instalační script počítá natvrdo s systémovou instalací v Ubuntu, ale nezhroutil se a potřebnou práci (librarku, kernel modul) na Slackwaru udělal na první dobrou). Fajn, je to opensource, s tím se dá žít a upravit si to, beru to jako první zveřejnění ~ alfa.

    Hooknutí funguje hezky, testovací prográmek v pythonu to opravdu naalokuje jak má. Test s ollama dopadl trochu hůř - sice nefailne alokace, ale ollama si vyčetla skutečnou alokaci a co se nevešlo do VRAM, tak sama nacpala offloadnuté do CPU ;-) - ale musím zaklepat, na OOM to nenarazilo, takže asi vše funguje jak má.
    Na pokusy přimět ollamu alokovat co to dá jsem se už nedostal, taky musím spát.

    S druhou grafikou (M40) se to, přesně podle očekávání (sm5_2) nebaví, ale nijak to nic neblokuje, takže spokojenost.

    Ještě rant, /sys/class/gre­enboost/green­boost/pool_in­fo ukazuje v T2 (RAM) 0 allocated, 0 available, i když tam nějaká data jsou.

  • 17. 3. 2026 17:02

    fanoush

    No zajimave by bylo jaky to ma vykon, treba llama.cpp automaticky nacte nejake vrstvy velkeho modelu do GPU RAM co se vejde a zbytek asi zustane na procesoru - tedy nactu jakykoliv model ktery se vejde do RAM jenom to pak jede treba 2t/s na procesoru. tak jestli tohle by jelo rychleji. Mozna ani i ne. Treba na laptopu s RTX A2000 8GB jsem zkousel model Qwen3.5 27B Q4 (cca 15GB model) a neco jelo pres CUDA z GPU (VRAM byla obsazena na 7GB, nvidia-smi psalo ze to bezi na 15W z 35) a delalo to 2t/s. pak jsem zakazal CUDA pro llama.cpp pres nejakou promennou a jelo to cele na procesoru a jelo to cca stejne rychle. podobne na gpt-oss 20b modelu (ten je rychlejsi). takze bud je to hack specialne pro ollama ktera tohle vubec neumi nebo to ma opravdu nejaky vykonovy prinos kdyz to jede cele z gpu ale pro neco/vetsinu si to jde pres pcie.

    17. 3. 2026, 17:06 editováno autorem komentáře

  • 17. 3. 2026 18:51

    Wasper

    Tak to je divný. U mě to prvně defaultní qwen3.5 (tuším 9B) nacpalo celý na CPU, rychlost byla kolem 2t/s, ale na prastaré M40 to jede řádově nízké desítky/s, na RTX 4060Ti pokud je vše v VRAM ještě líp pro stejný prompt.

    Ale souhlasí, jakmile z toho ollama udělala ~50% CPU 50% GPU, tak to šlo na stejně pomalé jako na samotném CPU (to ještě bez Greenboostu). Až/jestli se mi podaří to přesvědčit, aby offloading dělal greenboost, tak to zkusím změřit taky.

  • 17. 3. 2026 23:28

    fanoush

    Hmm, tak jsem jeste vygoglil ze existuje promenna GGML_CUDA_ENAB­LE_UNIFIED_ME­MORY=1 a muzu potvrdit ze s tim to nahraje cely gpt-oss-20b model pres CUDA

    llama_params_fit_im­pl: projected to use 15756 MiB of device memory vs. 28502 MiB of free device memory
    llama_params_fit_im­pl: will leave 12745 >= 1024 MiB of free device memory, no changes needed
    llama_params_fit: successfully fit params to free device memory
    llama_params_fit: fitting params to free memory took 0.41 seconds
    llama_model_lo­ad_from_file_im­pl: using device CUDA0 (NVIDIA RTX A2000 8GB Laptop GPU) (0000:01:00.0) - 28502 MiB free
    ....
    ....
    load_tensors: offloaded 25/25 layers to GPU
    load_tensors: CPU_Mapped model buffer size = 586.82 MiB
    load_tensors: CUDA0 model buffer size = 10949.38 MiB

    narozdil od

    llama_params_fit_im­pl: projected to use 15756 MiB of device memory vs. 7739 MiB of free device memory
    llama_params_fit_im­pl: cannot meet free memory target of 1024 MiB, need to reduce device memory by 9040 MiB
    llama_params_fit_im­pl: user has requested full context size of 131072 -> no change
    llama_params_fit_im­pl: with only dense weights in device memory there is a total surplus of 383 MiB
    llama_params_fit_im­pl: filling dense-only layers back-to-front:
    llama_params_fit_im­pl: - CUDA0 (NVIDIA RTX A2000 8GB Laptop GPU): 25 layers, 6453 MiB used, 1285 MiB free
    llama_params_fit_im­pl: converting dense-only layers to full layers and filling them front-to-back with overflow to next device/system memory:
    llama_params_fit_im­pl: - CUDA0 (NVIDIA RTX A2000 8GB Laptop GPU): 25 layers (24 overflowing), 6588 MiB used, 1151 MiB free
    ...
    load_tensors: offloaded 25/25 layers to GPU
    load_tensors: CPU_Mapped model buffer size = 10949.33 MiB
    load_tensors: CUDA0 model buffer size = 1780.97 MiB

    ale na vykon to ma zajimavy vliv. Pro ggml-org/gpt-oss-20b-GGUF model dela oboji cca 20t/s ale s timhle GPU jede naplno (34W z 35W) a procesor se flaka. Ale treba pro model unsloth/Qwen3.5-27B-GGUF:UD-Q4_K_XL to pise

    llama_params_fit_im­pl: projected to use 19714 MiB of device memory vs. 28845 MiB of free device memory
    llama_params_fit_im­pl: will leave 9130 >= 1024 MiB of free device memory, no changes needed
    llama_params_fit: successfully fit params to free device memory
    llama_params_fit: fitting params to free memory took 0.79 seconds
    llama_model_lo­ad_from_file_im­pl: using device CUDA0 (NVIDIA RTX A2000 8GB Laptop GPU) (0000:01:00.0) - 28845 MiB free
    ...
    load_tensors: loading model tensors, this can take a while... (mmap = true, direct_io = false)
    load_tensors: offloading output layer to GPU
    load_tensors: offloading 63 repeating layers to GPU
    load_tensors: offloaded 65/65 layers to GPU
    load_tensors: CPU_Mapped model buffer size = 682.03 MiB
    load_tensors: CUDA0 model buffer size = 16112.30 MiB

    ale vykon je skoro nulovy - 0.3t/s - naprosto nepouzitelne. Bez te promenne to dela s pomoci procesoru ty cca 2 t/s a s promennou CUDA_VISIBLE_DE­VICES= kdy to pak bezi cele jenom na procesoru priblizne to same (i9-12900H)

    takze mozna kdyz model je jen o malicko vetsi tak to k necemu byt muze ale pro neco vetsiho asi ne.

  • 18. 3. 2026 9:50

    yenone

    @fanoush – presne toto som mal na mysli v mojom komentári "Unified Memory Dome"!

    Je jasné, že natívne CUDA Unified Memory, ako lepšiu alternatívu k Greenboostu, treba natrénovať užívateľsky v aplikácii... O čo ide? Tá premenná (cez GGML_CUDA_ENAB­LE_UNIFIED_ME­MORY=1) zapne CUDA Unified Memory (cudaMallocManaged + automatickú migráciu stránok driverom). Model sa načíta "ako keby celý do GPU", ale všetko, čo sa nezmestí do VRAM, driver sám presunie do systémovej RAM bez kernelu (a neskôr aj späť). Žiadny kernel modul, žiadny LD_PRELOAD – čistý oficiálny CUDA 12+ mechanizmus (presne to, čo som vám písal v "Unified Memory Dome"). Všetko čo ste ukázal v logoch (rýchlosť v tokenoch podľa situácie) je presne ten "druhý koniec mince", o ktorom som písal v komentári…

    (...Na gpt-oss-20b (cca 20 GB model na 8 GB VRAM RTX A2000): s premennou potom plný offload do GPU (10949 MiB CUDA buffer), GPU ide na 34 W, 20 t/s... Bez premennej potom klasický -ngl offload + CPU mapped buffer, celé je pomalšie... Na väčšom Qwen3.5-27B: s premennou potom "všetko do GPU", ale výkon 0,3 t/s (totálne nepoužiteľné, lebo PCIe sa zadusí masívnym swapovaním)... Bez premennej potom hybrid CPU+GPU pre asi 2 t/s (ešte použiteľné)...)

    Ak sa bavíme o Ollame (a starších llama.cpp setupoch), ktorá ignoruje Unified Memory a robí primitívny offload (polovica na CPU = pomalé) – tak je to problém. Zdalo by sa, že bude "env var" ako "riešenie" – lenže treba spomenúť aj nasledovné... Na RTX 40xx (Ada) je Unified Memory oveľa efektívnejší (lepší MMU + page migration engine). Stále však potrebujete tuning (-ngl 99 alebo auto + prefetch hints...cudaMem­PrefetchAsync), inak sa to zadusí ako u vás na Qwen3.5. Greenboost je super hack pre appky, ktoré Unified Memory nepodporujú (staršie Ollama, ExLlama atď.), ale na moderné llama.cpp + RTX 40xx už stačí natívny CUDA stack. No a vLLM / TensorRT-LLM + PagedAttention + GDS je ešte vyššia liga (to ste si zatiaľ vôbec nespomenuli).

    Zdalo by sa, že sú tu "dopletené uvažovacie vlákna"... avšak, ono sa vlastne len ukazuje že čiastočné riešenie (len "env var") je neefektívne, bez videnia celej hierarchie, ktorú som opísal (Unified Memory + PagedAttention + GDS). Je to ako keby niekto ukázal, že "máme kľúč od dverí"(env var), ale v záznamoch budovy je ešte napísané "a ešte máme výťah a eskalátor" (PagedAttention + GDS). Takže vám dávam úplne za pravdu, že env var už existuje a je lepší ako Greenboost. Ja len pridávam pravdu, že na RTX 40xx to ide ešte ďalej a bez kompromisov.

    GGML_CUDA_ENAB­LE_UNIFIED_ME­MORY=1 je natívny spôsob (cudaMallocMa­naged), o ktorom som písal – žiadny kernel, žiadny Greenboost hack. Na gpt-oss-20b vám to pekne funguje (plný GPU load), ale na väčšom modeli (Qwen 27B) vás to zadusí, lebo driver swapuje všetko cez PCIe bez inteligencie. Na RTX 40xx (4080/4090) to ide ešte lepšie, keď pridáte ("vyššia liga"): (A) vLLM s PagedAttention (KV cache ako virtuálna pamäť OS, swapuje stránky bez fragmentácie) / alebo (B) GPU Direct Storage (GDS) pre NVMe vrstvu (GPU priamo do NVMe s priechodom mimo CPU/RAM je potom ako takmer nekonečná pamäť pre KV cache pri long-context modeloch). Výsledok: 14–24× rýchlejšie ako čistý unified memory offload a žiadny pokles na "0,3 t/s" (hlavne varianta A).

    Greenboost je super pre staré appky, ale na moderné llama.cpp/Ollama + RTX 40xx už stačí natívny CUDA stack. Skúšali ste vLLM (alebo GDS) na svojom A2000 alebo 40xx? @Wasper – vy ste spomínal testy s Greenboostom, ako to dopadlo?