MODUL 2 - LEKCIJA 4

Hugging Face Ekosistem: Hub, Pipeline i Lokalna Inferencijalnost

Snalaženje u najvećoj globalnoj bazi AI modela i dataseta, te pokretanje modela direktno u Python kodu

⏱️ Trajanje: 1h 30min (15:45 - 17:15) 📚 Nivo: Srednji 🎯 Lab: HuggingFace Transformers Pipeline

🤗 Hugging Face Hub — GitHub za AI Modele

huggingface.co je najveća platforma za dijeljenje AI modela, dataseta i prostora za demonstraciju. Osnovan 2016. originalno kao chatbot kompanija, Hugging Face je 2018. objavio BERT-ovu implementaciju i otvorito-izvorni Transformers Python paket — i od tada postali "npm registry" za AI zajednicu. Danas Host-uju: >900,000 modela, >200,000 dataseta, >300,000 demonstracijskih prostora (Spaces).

🏛️ Šta Nudi Hugging Face Ekosistem?

💡 Analogija: Hugging Face = GitHub + npm + Docker Hub za AI

GitHub čuva source code. npm (Node Package Manager) distribuira biblioteke unutar jedne naredbe. Docker Hub distribuira container images.

Hugging Face Hub radi sve ovo za AI: čuva model weights (model fajlove), distribuira ih jednom naredbom (from_pretrained()), i pruža versioning sličan Git-u za praćenje promjena. Svaki model ima Model Card (dokumentaciju analognu README.md) koja opisuje namjenu, limitacije, trening podatke i performanse.

Hugging Face Ekosistem 🤗 Hugging Face Hub (Cloud) Modeli (1M+) Dataseta Vaš Lokalni Sistem / Server Transformers Python Library Lokalni Cache ~/.cache/huggingface download upload (push)

Ključne Komponente Ekosistema

⚖️ Kritično: Provjera Licenci Modela

Prije nego preuzmete i koristite bilo koji model iz Hugging Face Hub-a za poslovnu namjenu, obavezno provjerite licencu modela u Model Card-u. Pogrešna pretpostavka može dovesti do pravnih problema za firmu.

✅ Slobodna Komercijalna Upotreba

Možete koristiti u komercijalnim projektima bez ograničenja:

  • Apache 2.0 — Najčešća permisivna licenca. Llama 3.1, Mistral 7B, Phi-3.
  • MIT — Ekstremno permisivna. Legit za bilo šta.
  • CC-BY — Creative Commons Attribution. Navodite izvor.
  • BigCode OpenRAIL-M — Permisivna, ali sa ograničenjima za malware.

⚠️ Uvjetna Komercijalna Upotreba

Komercijalna upotreba je moguća ali uz specifične uvjete ili ograničenja:

  • Llama 2 Community Licence — Slobodna za firme < 700M MAU. (Zamjenjena Llama 3.1 Apache 2.0)
  • Gemma Terms of Use — Commerical OK, ali neke restrikcije.
  • OpenRAIL — OK, ali zabranjuje određene harmful upotrebe.

❌ Ograničena / Zabranjena Komercijalna Upotreba

Ne koristiti bez eksplicitne dozvole vlasnika za poslovne svrhe:

  • CC-BY-NC — NonCommercial. Zabranjena komercijalna upotreba.
  • Research Only — Samo akademska istraživanja.
  • Custom restrictive — Npr. "Ne koristiti za konkurenciju."

Primjer: Neki Fine-tunedGPT-J modeli imaju CC-BY-NC.

⚠️ Gdje Provjeriti Licencu na Hugging Face?

Na stranici svakog modela (npr. huggingface.co/meta-llama/Llama-3.1-8B-Instruct), licenca je vidljiva odmah na lijevoj strani pod "Licence" tagom. Kliknite na tag za detalje. U "Model Card" dokumentaciji (README.md na modelu) su i puni detalji uvjeta korištenja.

Automatska provjera u Python kodu: Kada pozovete AutoModel.from_pretrained("model_ime") za restricted modele, Hugging Face zahtijeva da se prijavite na platformu, prihvatite uvjete korištenja (na web), i koristite personal access token za autentikaciju. Ovo je signal da model ima ograničenja.

📦 Transformers Biblioteka i Pipeline API

Zvanični transformers Python paket (koji smo već instalirali u Lekciji 1.1 za BertViz), pruža Pipeline API — apstrakcijski sloj koji sakriva kompleksnost tokenizacije, model formata i post-processinga iza jednog jednostavnog interface-a.

📌 Šta je Pipeline?

pipeline(task_name) je fabrika objekata koja:

  1. Prima naziv zadatka (npr. "sentiment-analysis") ili naziv modela
  2. Automatski preuzima odgovarajući model i tokenizer sa Hub-a (kešira lokalno)
  3. Enkapsulira: tokenizacija → model inferencijalnost → post-processing
  4. Vraća predviđanja u čitljivom Python formatu (lista rječnika)

Zamislite ovo kao: Gotov API koji sami hostujete lokalno. Nema cloud-a, nema API ključa, nema troška po pozivu. Model živi u ~/.cache/huggingface/ i izvršava se offline.

Šta radi pipeline() ispod haube? Raw Tekst pipeline("sentiment-analysis") Tokenizacija Model (Forward Pass) Post-processing [{'label': 'POSITIVE'}]

Pregled Pipeline Taskova

pipeline("text-generation")

Generisanje teksta (chat, autocomplete, kod). Podržava GPT-2, Llama, Mistral...

pipeline("sentiment-analysis")

Klasifikacija sentimenta teksta (pozitivno/negativno). Default: distilbert-base-uncased-finetuned-sst-2-english.

pipeline("zero-shot-classification")

Klasifikacija bez treninga za specifični dataset! Vi dajete labele, model klasificira. Izuzetno moćno za produkciju.

pipeline("translation")

Prevođenje između jezika. Helsinki-NLP/opus-mt modeli za 100+ jezičnih parova (uklj. BOS).

pipeline("summarization")

Automatsko sumariziranje dugačkih dokumenata. facebook/bart-large-cnn za engleski.

pipeline("ner")

Named Entity Recognition — ekstrakcija osobnih imena, organizacija, mjesta iz teksta.

🚀

LAB O8: Hugging Face Pipelines — Lokalna AI Inferencijalnost

Pokrenut ćemo tri različita HuggingFace Pipeline alata: sentiment analizu, zero-shot klasifikaciju, i NER — sve 100% lokalno, bez API ključa. Koristit ćemo manje, CPU-prijazne modele za lab okruženje.

1

Provjera instalacije i kreiranje lab skripte

powershell
# Osvježimo/provjeri instliran transformers
# Transformers je instaliran u Lekciji 1.1 — samo provjera
pip show transformers
# Trebate vidjeti verziju (4.x.x)

# Napravite fajl za ovaj lab
# File → New File → hf_lab.py (u VS Code)
2

Skripta 1: Sentiment Analiza (Klasifikacija Emailova IT Podrške)

Scenario: automatska klasifikacija korisničkih emaila prema sentimentu (hitno vs. zadovoljno) za prioritizaciju IT helpdesk ticketa.

python
"""
hf_lab.py - Hugging Face Pipeline Lab
Modul 2.4: Hugging Face Ekosistem
Zahtjevi: transformers, torch (instalirano u Lekciji 1.1)
"""

from transformers import pipeline
import torch

# ================================================================
# DEMO 1: SENTIMENT ANALIZA — Klasifikacija IT helpdesk ticketa
# ================================================================

print("="*65)
print("  🤗 DEMO 1: Sentiment Analiza (Helpdesk Ticketi)")
print("="*65)

# Kreiranje pipeline objekta
# Ako model nije keširan — automatski skine ~67MB (DistilBERT)
# device=-1 znači CPU, device=0 znači GPU (ako postoji)
print("\n⏳ Učitavanje sentiment modela... (preuzimanje ako prvi put ~67MB)")
sentiment_pipeline = pipeline(
    "sentiment-analysis",
    # Eksplicitno navođimo model (default je dobar, ali praksa je biti eksplicitan)
    model="distilbert-base-uncased-finetuned-sst-2-english",
    device=-1  # -1 = CPU (0 = prva GPU ako ima NVIDIA GPU)
)
print("✅ Model učitan!\n")

# Testni IT helpdesk emailovi/ticketi
helpdesk_ticketi = [
    "The system has been completely down for 3 hours! Critical production failure! Clients cannot access anything!",
    "Could you please update the SSL certificate on our internal server when you have a chance? No rush.",
    "This is absolutely unacceptable! The database migration wiped all our data! I need to speak with a manager NOW!",
    "Everything seems to be working perfectly after the update. Great job, team!",
    "Getting occasional timeout errors on the customer portal. Not urgent but wanted to flag it.",
]

print("📋 Analiza helpdesk ticketa:")
print("-" * 60)

for ticket in helpdesk_ticketi:
    # Pozivamo pipeline kao funkciju
    # Moguće je proslijediti jednu string ili listu stringova
    rezultat = sentiment_pipeline(ticket)[0]  # [0] jer vraća listu (batch support)

    label = rezultat["label"]       # "POSITIVE" ili "NEGATIVE"
    score = rezultat["score"]       # Vjerovatnoća (0.0 - 1.0)
    confidence = score * 100

    # Odredimo prioritet na osnovu sentimenta + sigurnosti
    if label == "NEGATIVE" and score > 0.90:
        prioritet = "🔴 HIGH PRIORITY"
    elif label == "NEGATIVE":
        prioritet = "🟡 MEDIUM"
    else:
        prioritet = "🟢 LOW/Normal"

    # Skraćivanje teksta za čitljiv ispis
    kratki_tekst = ticket[:60] + "..." if len(ticket) > 60 else ticket

    print(f"\nTicket: '{kratki_tekst}'")
    print(f"   Sentiment:  {label} ({confidence:.1f}% confidence)")
    print(f"   Prioritet:  {prioritet}")

print("\n💡 Ovo se može automatizovati za triažu ticketa u helpdesk sistemu!")

# ================================================================
# DEMO 2: ZERO-SHOT KLASIFIKACIJA — Kategorizacija bez treninga
# ================================================================

print("\n" + "="*65)
print("  🤗 DEMO 2: Zero-Shot Klasifikacija (Bez Treninga!)")
print("="*65)

print("\n⏳ Učitavanje zero-shot modela... (~500MB, strpljivo!)")
# facebook/bart-large-mnli je odlično za zero-shot (~1.6GB)
# Za CPU lab koristimo distilbart koji je manji
zero_shot = pipeline(
    "zero-shot-classification",
    model="cross-encoder/nli-distilroberta-base",  # Manji (~300MB)
    device=-1
)
print("✅ Zero-shot model učitan!\n")

# Definirate labele SAMI — model nije treniran za njih posebno!
# Ovo je ključna prednost zero-shot pristupa
KATEGORIJE = [
    "kritična infrastrukturna greška",
    "bezbjednosni incident",
    "hardware problem",
    "software bug",
    "zahtjev za pristupom",
    "generalno IT pitanje"
]

it_tekst = """
Korisnik sa IP adrese 192.168.1.105 pokušao pristupiti admin panelu
koristeći brute-force napad u 02:34h. IDS sistem blokirao 947 neuspjelih
login pokušaja u roku od 8 minuta. Potrebna je istraga i privremena blokada IP rangea.
"""

print(f"Incident opis: {it_tekst.strip()[:120]}...")
print(f"\nMoguće kategorije: {KATEGORIJE}")

rezultat = zero_shot(it_tekst, KATEGORIJE)

print(f"\n🎯 Klasifikacijski rezultati (sortirani po sigurnosti):")
for label, score in zip(rezultat["labels"], rezultat["scores"]):
    bar = "█" * int(score * 30)
    print(f"  {label:40s} | {score:.3f} | {bar}")

print(f"\n✅ Kategorija: {rezultat['labels'][0]} ({rezultat['scores'][0]:.1%})")
print("💡 Zero-shot radi bez IKAKVOG treninga na vašim IT kategorijama!")

# ================================================================
# DEMO 3: NAMED ENTITY RECOGNITION (NER)
# ================================================================

print("\n" + "="*65)
print("  🤗 DEMO 3: Named Entity Recognition (NER)")
print("="*65)

print("\n⏳ Učitavanje NER modela... (~250MB)")
ner_pipeline = pipeline(
    "ner",
    model="dbmdz/bert-large-cased-finetuned-conll03-english",
    aggregation_strategy="simple",
    device=-1
)
print("✅ NER model učitan!\n")

it_izvjestaj = """
Microsoft Azure suffered a major outage affecting Germany North and Germany West regions
on March 15th. AWS reported 99.99% uptime during the same period. 
John Smith from IT Security notified the CTO Sarah Johnson about potential data exposure.
The incident occurred at the Frankfurt data center.
"""

print("Izvještaj za analizu:")
print(it_izvjestaj.strip())
print("\n🔍 Pronađeni entiteti:")

entiteti = ner_pipeline(it_izvjestaj)
for entitet in entiteti:
    entity_type = entitet["entity_group"]
    word = entitet["word"]
    score = entitet["score"]
    print(f"   [{entity_type:15s}] '{word}' ({score:.1%})")

print("\n💡 NER možete koristiti za automatsku anonimizaciju PVJL podataka!")
print("   Pronađena lična imena mogu biti automatski zamedana sa [OSOBA].")
3

Pokretanje i Razumijevanje Outputa

Napomena: Pri prvom pokretanju skripte, huggingface automatski preuzima modele (~1-2 GB ukupno) u ~/.cache/huggingface/. Ovo može trajati 5-10 minuta ovisno o internetu. Nakon toga, skripta radi offline instantno.

powershell
# Pokretanje skripte (first run = download modela, budite strpljivi!)
python hf_lab.py

# HuggingFace prikazuje progress bar za download:
# Downloading (...)model.safetensors: 100%|██████| 268M/268M

# Provjera gdje su keširani modeli (za IT admin - disk cleanup)
ls $env:USERPROFILE\.cache\huggingface\hub\
# Vidite foldere po modelu (svaki ~100-2000MB)
  • Sentiment analiza: Model savršeno detektuje "hitne" tickete (negative + visoka sigurnost) od redovnih zahtjeva. Ovo se može direktno integrirati u ServiceNow, Jira Service Management ili vlastitu helpdesk applikaciju kao ML modul.
  • Zero-shot klasifikacija: Model nije nikad viđao "bezbjednosni incident" kao kategoriju — ali razumije semantiku i ispravno klasificira brute-force napad. Ovo je revolucionarno za izgradnju klasifikatora bez skupljanja trening podataka.
  • NER + Anonimizacija: Automatska detekcija ličnih podataka u IT izvještajima. Za GDPR usklađenost, možete automatski zamjeniti pronađena lična imena s [OSOBA], lokacije s [LOKACIJA] pre nego što logate ili dijeli dokumenta.
  • Lokalno — nema API-ja: Sve tri operacije rade bez interneta (nakon inicijalnog downloada) i bez plaćanja po pozivu. Za 10,000 klasifikacija dnevno — nula dolara API troška.

✅ Checkpoint — Provjera Razumijevanja

  • Hugging Face Hub = najveći repozitorij AI modela i dataseta (900k+ modela, 2025.).
  • UVIJEK provjerite licencu modela (Apache 2.0 / MIT = OK za komercijalnu upotrebu).
  • pipeline() klasa apstrahuje tokenizaciju, inferencijalnost i post-processing u jedan poziv.
  • Zero-shot klasifikacija omogućuje kategorizaciju bez ikakvih trening podataka za vaše kategorije.
  • NER može automatski identificirati lične podatke za GDPR anonimizaciju.
  • from_pretrained() kešira model lokalno — offline rada nakon inicijalnog downloada.

🏁 Kraj Dana 2 — Sumiranje Ključnih Znanja

Prošli smo kroz svu teoriju i praksu potrebnu za odabir i deployment AI sistema u IT okruženju:

Modul 2.1 — Benchmark Analiza

  • MMLU (akademsko), HumanEval (coding), SWE-Bench (real GitHub issues), LMSYS (korisnička preferencija)
  • ROI kalkulacija Cloud vs. On-Premise — break-even tipično 6-12 mjeseci za veće timove
  • GDPR i regulatorne obaveze često diktiraju lokalni deploy za javnu upravu

Modul 2.2 — Ollama Deep Dive

  • Quantizacija (Q4 = 4× manji VRAM, prihvatljiv gubitak za interne alate)
  • Ollama = Docker za AI modele — jedna komanda za download i pokretanje
  • Modelfile za Custom Agent: base model + system prompt + parametri = vaš AI asistent
  • OpenAI-kompatibilan REST API na portu 11434 — lak switch između cloud i lokalne varijante

Modul 2.3 — GPU & VRAM

  • GPU je obavezan za produkcijsku latenciju — NVIDIA CUDA je de-facto standard (2025.)
  • VRAM = Broj_Parametara_B × Bajta/param × 1.1 + KV_Cache × concurrent_users
  • RTX 4060 Ti 16GB = "sweet spot" za lokalni AI server manjeg tima (~450€)

Modul 2.4 — Hugging Face

  • Hub = 900k+ modela, uvijek provjerite licencu (Apache 2.0 = OK, CC-BY-NC = NE za komerciju)
  • pipeline() API: jednom naredbom sentiment analiza, NER, zero-shot klasifikacija... bez API ključa
  • Specijalizirani modeli (BERT Fine-tune) su efikasniji i jeftiniji od GPT-4 za specifične zadatke

🎯 Sutra nas čeka Dan 3: Prompt Engineering — nauka pisanja preciznih instrukcija LLM modelima, Chain-of-Thought tehnike, Few-shot prompting i izgradnja robustnih AI pipelines za produkciju!