Hugging Face CLI — preuzimanje modela i organizacija na disku

Ollama ima svoju biblioteku modela, i dok ti je dovoljna, sve je jednostavno. Van nje počinje Hugging Face — mesto gde modeli zapravo žive, uključujući sve varijante kvantizacije koje u Ollaminoj biblioteci ne postoje.

Ovaj tekst pokazuje kako se odatle preuzima iz komandne linije, kako se ne preuzme šezdeset gigabajta kad ti treba pet, i gde sve to završi na disku.

Kako je repozitorijum organizovan

Svaki model je git repozitorijum sa oznakom u obliku organizacija/naziv:

Qwen/Qwen3-8B                  originalni model, safetensors
bartowski/Qwen3-8B-GGUF        kvantizovane GGUF varijante
Qwen/Qwen3-8B-AWQ              AWQ varijanta za vLLM

Originalni objavljivač retko izdaje GGUF fajlove — to rade pojedinci i grupe koje se time bave. Zato ćeš isti model naći pod više naziva, i zato je važno da razlikuješ šta ti treba.

Šta pokrećeš Šta preuzimaš Koliko fajlova
llama.cpp, Ollama GGUF Jedan
vLLM, Transformers safetensors, AWQ, GPTQ Ceo direktorijum

Podela je razrađena u tekstu o kvantizaciji. Preuzimanje pogrešnog formata je najčešća greška ovde i košta sate čekanja.

Instalacija alata

$ pip install -U "huggingface_hub[cli]"

Na novijim distribucijama sistemski Python odbija instalaciju paketa, i s pravom. Koristi virtuelno okruženje:

$ python3 -m venv ~/.venv/hf
$ source ~/.venv/hf/bin/activate
$ pip install -U "huggingface_hub[cli]"

Ili preko pipx, ako hoćeš da alat bude dostupan svuda bez aktiviranja okruženja:

$ sudo apt install -y pipx
$ pipx install "huggingface_hub[cli]"
$ pipx ensurepath
$ hf version
huggingface_hub version: 0.35.0

Komanda se zove hf. Stariji naziv huggingface-cli i dalje radi, ali je u fazi napuštanja — u uputstvima po internetu ćeš ga još dugo viđati.

Brže preuzimanje, sa više paralelnih veza:

$ pip install -U hf_transfer
$ export HF_HUB_ENABLE_HF_TRANSFER=1

Na dobroj vezi razlika je značajna. Mana je što nema prikaz napretka ni nastavak prekinutog preuzimanja.

Preuzimanje jednog fajla

Za GGUF ti treba tačno jedan fajl, ne ceo repozitorijum:

$ hf download bartowski/Qwen3-8B-GGUF Qwen3-8B-Q4_K_M.gguf

Kako da znaš kako se fajl zove:

$ hf download bartowski/Qwen3-8B-GGUF --repo-type model --quiet
$ hf repo files bartowski/Qwen3-8B-GGUF

Jednostavnije je otvoriti stranicu modela u pregledaču i pogledati karticu sa fajlovima — tu su i veličine, što odmah kaže da li ti varijanta staje.

Preuzimanje na tačno određeno mesto, umesto u keš:

$ hf download bartowski/Qwen3-8B-GGUF Qwen3-8B-Q4_K_M.gguf \
    --local-dir ~/models
$ ls -lh ~/models
-rw-r--r-- 1 alen alen 4.9G Qwen3-8B-Q4_K_M.gguf
$ llama-server -m ~/models/Qwen3-8B-Q4_K_M.gguf -ngl 99

Podeljeni fajlovi

Veći modeli su isečeni na delove:

Qwen3-235B-Q4_K_M-00001-of-00005.gguf
Qwen3-235B-Q4_K_M-00002-of-00005.gguf
...

Preuzimaju se svi odjednom po obrascu:

$ hf download bartowski/Qwen3-235B-GGUF \
    --include "*Q4_K_M*" --local-dir ~/models

llama.cpp im sam prepoznaje nastavak — daš mu prvi deo, ostale nađe:

$ llama-server -m ~/models/Qwen3-235B-Q4_K_M-00001-of-00005.gguf -ngl 99

Preuzimanje celog modela

Za vLLM i slične alate treba ceo direktorijum:

$ hf download Qwen/Qwen3-8B-AWQ --local-dir ~/models/qwen3-8b-awq
$ ls ~/models/qwen3-8b-awq
config.json
generation_config.json
model-00001-of-00002.safetensors
model-00002-of-00002.safetensors
model.safetensors.index.json
tokenizer.json
tokenizer_config.json
LICENSE
README.md

Bez izuzimanja preuzimaš i ono što ti ne treba — dokumentaciju, slike, ponekad i duplikate u zastarelim formatima:

$ hf download Qwen/Qwen3-8B \
    --exclude "*.pth" "*.msgpack" "*.h5" \
    --local-dir ~/models/qwen3-8b

Fajl LICENSE pročitaj pre nego što model pustiš u upotrebu, iz razloga navedenih u tekstu o otvorenim i zatvorenim modelima.

Keš

Bez oznake --local-dir sve ide u zajednički keš:

$ echo $HF_HOME
$ ls ~/.cache/huggingface/hub
models--Qwen--Qwen3-8B
models--bartowski--Qwen3-8B-GGUF

Struktura koristi tvrde veze, pa isti fajl u više modela zauzima prostor jednom. Zato zbir prikazanih veličina ume da bude veći od stvarnog zauzeća.

Premeštanje keša na veći disk:

$ export HF_HOME=/data/huggingface

Trajno, za sve korisnike:

$ echo 'export HF_HOME=/data/huggingface' | sudo tee /etc/profile.d/hf.sh

Više o promenljivama okruženja i njihovom postavljanju ima u tekstu o .bashrc fajlu.

Keš ili sopstveni direktorijum

Keš --local-dir
Deljenje fajlova među modelima Jasna putanja koju sam biraš
Alati ga sami nalaze Lako za pravljenje rezervne kopije
Nečitljiva imena direktorijuma Isti fajl se preuzima dvaput ako treba na dva mesta
Alat za čišćenje postoji Brisanje ručno

Praktično pravilo: GGUF fajlove u sopstveni direktorijum, safetensors u keš. GGUF je jedan fajl koji zadaješ po putanji, dok safetensors direktorijume alati ionako traže po oznaci modela.

Zatvoreni modeli i token

Pojedini modeli traže prihvatanje uslova pre preuzimanja:

Cannot access gated repo for url ...
Access to model X is restricted. You must have access to it and be authenticated.

Postupak: otvori stranicu modela u pregledaču, prihvati uslove, pa napravi token pod Settings → Access Tokens sa pravom čitanja.

$ hf auth login

Token se čuva u ~/.cache/huggingface/token. Za servere i skripte bolje je kroz promenljivu:

$ export HF_TOKEN=hf_xxxxxxxxxxxxx
$ hf auth whoami

Token ne stavljaj u fajl koji ide u git i ne piši ga u komandu koja završi u istoriji ljuske. Za systemd servise koristi EnvironmentFile= sa fajlom kome samo taj korisnik ima pristup.

Provera pre preuzimanja

Ovo je korak koji štedi najviše vremena. Pre nego što pokreneš preuzimanje od pedeset gigabajta, proveri da li ti uopšte staje:

$ df -h /data

Za GGUF je pravilo palca da model klase NB u Q4_K_M zauzima oko 0.6 × N gigabajta — računica iz teksta o proceni VRAM-a. Na disku ti treba toliko, a u memoriji nešto više.

Kod safetensors direktorijuma dodaj i to da veličina repozitorijuma često premašuje veličinu modela, jer stoje i varijante u drugim formatima.

Čišćenje

Modeli se nagomilavaju neprimetno. Pregled zauzeća keša:

$ hf cache scan
REPO ID                      SIZE ON DISK    LAST ACCESSED
Qwen/Qwen3-8B                    16.2G       3 weeks ago
bartowski/Qwen3-8B-GGUF           4.9G       2 hours ago
Qwen/Qwen3-8B-AWQ                 5.8G       2 months ago

Done in 0.4s. Found 3 repo(s) for a total of 26.9G.

Interaktivno brisanje, sa izborom šta ide:

$ hf cache delete

Kolona LAST ACCESSED je ovde najkorisnija — ono što nisi dodirnuo dva meseca verovatno ti i ne treba.

Za sopstvene direktorijume nema alata, pa ide ručno:

$ du -sh ~/models/* | sort -h

Uvoz u Ollamu

GGUF preuzet ovim putem koristi se u Ollami preko Modelfile opisa, kako je pokazano u tekstu o instalaciji Ollame:

FROM /home/alen/models/Qwen3-8B-Q4_K_M.gguf

PARAMETER temperature 0.2
PARAMETER num_ctx 8192
$ ollama create qwen3-moj -f Modelfile
$ ollama run qwen3-moj

Ollama pravi sopstvenu kopiju u svom direktorijumu, pa isti model postoji dvaput na disku. Originalni fajl posle uspešnog uvoza možeš obrisati.

Novije verzije Ollame umeju i direktno:

$ ollama pull hf.co/bartowski/Qwen3-8B-GGUF:Q4_K_M

Kada radi, ovo je najkraći put. Za starije ili neuobičajene repozitorijume ume da zakaže, pa je uvoz kroz Modelfile pouzdanija varijanta.

Ostale komande

Komanda Šta radi
hf download Preuzimanje fajla ili repozitorijuma
hf upload Slanje sopstvenih fajlova
hf cache scan Pregled zauzeća keša
hf cache delete Interaktivno brisanje
hf auth login Prijava tokenom
hf auth whoami Provera prijave
hf repo files Spisak fajlova u repozitorijumu

Korisne promenljive okruženja:

  • HF_HOME — koren za keš i token
  • HF_TOKEN — token za zatvorene modele
  • HF_HUB_ENABLE_HF_TRANSFER=1 — brže preuzimanje
  • HF_HUB_OFFLINE=1 — rad isključivo iz keša, bez mreže

Praktični scenariji

Scenario 1: preuzeto šezdeset gigabajta umesto pet

Izostavljeno je ime fajla, pa je preuzet ceo repozitorijum sa svim varijantama. Za GGUF uvek navedi tačan fajl ili obrazac kroz --include.

Scenario 2: preuzimanje se prekida na pola

Ponovi istu komandu — alat nastavlja odakle je stao. Ako je uključen hf_transfer, nastavljanja nema; isključi ga za nestabilne veze.

Scenario 3: llama.cpp ne prepoznaje preuzeti fajl

Verovatno je safetensors umesto GGUF. Proveri nastavak i potraži repozitorijum sa -GGUF u nazivu.

Scenario 4: nema mesta na disku

$ hf cache scan
$ hf cache delete

Ako je keš na korenskoj particiji, premesti ga postavljanjem HF_HOME.

Scenario 5: pristup odbijen iako je token postavljen

Prihvatanje uslova je zaseban korak od pravljenja tokena, i radi se u pregledaču. Proveri i da token ima pravo čitanja — postoje i tokeni sa užim opsegom.

Scenario 6: model preuzet dvaput

Jednom u keš, jednom kroz --local-dir. Odluči gde ti model živi i drži se toga; obriši drugi primerak.

Kratka referenca

  • pipx install "huggingface_hub[cli]" — instalacija alata
  • hf download repo fajl.gguf --local-dir ~/models — jedan GGUF fajl
  • hf download repo --local-dir ~/models — ceo repozitorijum
  • --include "*Q4_K_M*" — obrazac za podeljene fajlove
  • --exclude "*.pth" "*.h5" — izuzimanje nepotrebnog
  • hf cache scan — šta je preuzeto i koliko zauzima
  • hf cache delete — interaktivno brisanje
  • hf auth login — prijava za zatvorene modele
  • HF_HOME — putanja keša
  • HF_TOKEN — token kroz okruženje, ne kroz komandu
  • HF_HUB_ENABLE_HF_TRANSFER=1 — brže, bez nastavljanja
  • ollama pull hf.co/repo:Q4_K_M — direktan uvoz kad radi
  • GGUF za llama.cpp i Ollamu, safetensors za vLLM
  • Proveri disk pre preuzimanja, ne posle

Vežba

  1. Instaliraj alat i potvrdi verziju komandom hf version.
  2. Preuzmi jedan GGUF fajl u sopstveni direktorijum i pokreni ga kroz llama-server.
  3. Uporedi veličinu preuzetog fajla sa procenom po pravilu 0.6 × N.
  4. Pokreni hf cache scan i pronađi šta najduže nisi koristio.
  5. Premesti keš na drugu putanju kroz HF_HOME i potvrdi da alat i dalje vidi preuzeto.
  6. Uvezi preuzeti GGUF u Ollamu kroz Modelfile, pa uporedi zauzeće diska pre i posle.

Sledeći tekst u serijalu: vLLM — produkciona inferencija sa više paralelnih zahteva

Povezano:

Comments

Popular posts from this blog

Početak u Linuxu — šta je i zašto se uči

Konverzija tipova podataka u Pythonu

groupadd