Każde wywołanie hostowanego API LLM wysyła Twój prompt na cudzy serwer i obciąża Cię opłatą za token. Zerwij połączenie z siecią, a przestanie odpowiadać. Ollama usuwa oba te problemy: pobiera model o otwartych wagach na Twoją maszynę i udostępnia go przez API REST na localhost:11434. Jeden plik binarny pełni rolę menedżera modeli, klienta czatu i serwera.

Co Ollama robi naprawdę

Ollama opakowuje llama.cpp i podobne silniki wnioskowania, więc nigdy nie musisz dotykać flagi kompilatora ani ścieżki do biblioteki CUDA. ollama pull llama3.2 pobiera skwantyzowany plik modelu (format GGUF) z własnego rejestru Ollama, a nie z Hugging Face, choć potrafi też importować pliki GGUF stamtąd. Uruchomienie modelu przekazuje te wagi do serwera działającego w tle, który ładuje je do RAM-u (lub VRAM-u, jeśli znajdzie kompatybilną GPU), trzyma je w pamięci przez kilka minut po ostatnim zapytaniu, żeby kolejne było szybkie, i zwalnia pamięć, kiedy zapytania przestają napływać.

CLI, API i Modelfile robią w gruncie rzeczy jedno: wczytują wagi do pamięci i kierują do nich zapytania.

Jak zainstalować Ollama i uruchomić pierwszy model

Na Linuksie lub macOS:

1
curl -fsSL https://ollama.com/install.sh | sh

Na Windowsie uruchom instalator z ollama.com albo użyj:

1
irm https://ollama.com/install.ps1 | iex

W obu przypadkach otrzymujesz CLI ollama i działający w tle serwer nasłuchujący na porcie 11434. Pobierz mały model i porozmawiaj z nim:

1
2
ollama pull llama3.2
ollama run llama3.2

ollama run przenosi Cię do interaktywnego promptu. Zadaj pytanie, przeczytaj odpowiedź, /bye, żeby wyjść. Trzy inne polecenia, których będziesz używać bez przerwy:

1
2
3
ollama list   # pobrane modele, z ich rozmiarem na dysku
ollama ps     # modele aktualnie załadowane do pamięci
ollama rm llama3.2   # zwalnia miejsce na dysku

llama3.2 to dobry pierwszy wybór: około 2 GB, wystarczająco szybki, żeby działać na CPU laptopa. Nie jest to najsilniejszy model w swojej klasie rozmiaru. gemma4 prowadzi teraz w małym segmencie i radzi sobie też z obrazami, a qwen3-coder to lepszy wybór, jeśli chcesz sprawdzić, jak model radzi sobie z pisaniem kodu. Zacznij mimo to od llama3.2, bo dowodzi, że Twoja konfiguracja działa, zanim zaczniesz ściągać 20 GB.

Jak rozmawiać z Ollama przez jej API REST

Interaktywny prompt służy do sprawdzenia, czy wszystko działa. Wszystko, co zbudujesz, wywołuje API. Natywny format Ollama wygląda tak:

1
2
3
4
5
curl http://localhost:11434/api/generate -d '{
  "model": "llama3.2",
  "prompt": "Write a one-line commit message for a typo fix in README.md",
  "stream": false
}'

Przy "stream": false dostajesz jeden obiekt JSON, zawierający eval_count i eval_duration — wystarczająco, żeby zmierzyć tokeny na sekundę na Twoim sprzęcie. Ustaw true, a zamiast tego dostaniesz serię obiektów częściowej odpowiedzi, dokładnie to, czego potrzebuje interfejs czatu.

Do rozmów wieloetapowych /api/chat przyjmuje tablicę messages w tym samym formacie, którego używa API OpenAI:

1
2
3
4
5
6
7
curl http://localhost:11434/api/chat -d '{
  "model": "llama3.2",
  "messages": [
    {"role": "user", "content": "What port does Ollama listen on by default?"}
  ],
  "stream": false
}'

Ollama obsługuje też natywnie format API OpenAI pod /v1, więc oficjalne SDK OpenAI działają z nią bez modyfikacji:

1
2
3
4
5
6
7
8
9
from openai import OpenAI

client = OpenAI(base_url="http://localhost:11434/v1", api_key="ollama")

response = client.chat.completions.create(
    model="llama3.2",
    messages=[{"role": "user", "content": "Summarize this changelog in two sentences."}],
)
print(response.choices[0].message.content)

Ollama ignoruje api_key, ale konstruktor SDK go wymaga, więc wystarczy dowolny niepusty ciąg znaków. Dzięki temu to najszybszy sposób, żeby skierować narzędzie oparte już na OpenAI na model lokalny: zmieniasz base_url i zostawiasz resztę kodu bez zmian.

Kolejny endpoint ma znaczenie, jeśli składasz lokalny pipeline retrieval-augmented generation. POST /api/embed zamienia tekst na wektory za pomocą modelu embeddingowego (nomic-embed-text to zwykły wybór) — czegoś, czego sam model czatu nie zapewni.

Jak uruchomić Ollama w Dockerze

Jeśli wszystko inne na maszynie jest już kontenerem, Ollama dostarcza oficjalny obraz zamiast wymagać instalacji czegokolwiek na hoście:

1
2
3
4
5
docker run -d \
  -v ollama:/root/.ollama \
  -p 11434:11434 \
  --name ollama \
  ollama/ollama

Nazwany wolumin w praktyce nie jest opcjonalny: bez niego każdy pobrany model znika w chwili usunięcia kontenera. Żeby pobrać i uruchomić model wewnątrz działającego kontenera:

1
docker exec -it ollama ollama run llama3.2

Na maszynie z GPU NVIDIA najpierw zainstaluj NVIDIA Container Toolkit na hoście, potem dodaj jedną flagę:

1
2
3
4
5
docker run -d --gpus=all \
  -v ollama:/root/.ollama \
  -p 11434:11434 \
  --name ollama \
  ollama/ollama

GPU AMD używają osobnego tagu obrazu i montowania urządzeń zamiast --gpus:

1
2
3
4
5
docker run -d --device /dev/kfd --device /dev/dri \
  -v ollama:/root/.ollama \
  -p 11434:11434 \
  --name ollama \
  ollama/ollama:rocm

To samo jako usługa Docker Compose zachowuje port i wolumin, nic ponadto:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
services:
  ollama:
    image: ollama/ollama
    ports:
      - "11434:11434"
    volumes:
      - ollama:/root/.ollama

volumes:
  ollama:

Wystawienie tego kontenera poza localhost to zadanie dla reverse proxy, który dokłada TLS — tak samo jak przy każdej innej usłudze backendowej. Ollama nie ma własnego uwierzytelniania, więc port 11434 dostępny z sieci to serwer modeli, z którego może skorzystać każdy.

Jak dostosować model za pomocą Modelfile

Modelfile ustala system prompt, temperaturę i sekwencję zatrzymania na istniejącym modelu bez jego ponownego trenowania. Utwórz plik o nazwie Modelfile:

1
2
3
4
5
6
7
8
FROM llama3.2

PARAMETER temperature 0.3

SYSTEM """
You are a terse code reviewer. Reply with the diff and one sentence of
rationale. Never restate the code you were not asked to change.
"""

Potem zbuduj go i uruchom:

1
2
ollama create code-reviewer -f Modelfile
ollama run code-reviewer

code-reviewer pojawia się teraz jako osobny wpis w ollama list, mimo że wagi są dokładnie tymi, których używa llama3.2. Wbudowane są tylko system prompt i parametry samplingu. Dzięki temu każdy klient, który wywołuje tę nazwę, dziedziczy konfigurację, bez konieczności wysyłania jej za każdym razem.

Jaki rozmiar modelu pasuje do Twojego RAM-u

Liczba w nazwie modelu to liczba jego parametrów i całkiem dobrze przewiduje, ile RAM-u (lub VRAM-u, przy wnioskowaniu na GPU) potrzebujesz:

Rozmiar modeluMinimalny RAM/VRAMRealistyczne na
1-3B4-8 GBKażdym nowszym laptopie, samo CPU
7-9B8-16 GBLaptopie z 16 GB RAM, wolno na samym CPU
13-14B16-24 GBDedykowanej GPU z 12+ GB VRAM
30B+24-48 GB+GPU z 24+ GB VRAM lub instancji chmurowej z GPU

Te liczby zakładają 4-bitową kwantyzację, którą Ollama stosuje domyślnie — kosztuje to niewielką część jakości wyniku, w zamian za rozmiar pobierania i zużycie pamięci mniej więcej czterokrotnie mniejsze niż przy wagach w pełnej precyzji. Przy streszczaniu tekstu albo pisaniu commit message kwantyzacji raczej nie zauważysz. Braku RAM-u — owszem. Gdy tylko model zacznie korzystać ze swapu na dysku, zmienia się z wolnego w bezużyteczny, a to o wiele większa różnica niż utrata jakości przez kwantyzację.

Kiedy Ollama nie jest dobrym narzędziem

Ollama jest zbudowana dla jednego użytkownika rozmawiającego z jednym modelem na jednej maszynie. Nie robi batchowania zapytań ani żadnego planowania, które pozwoliłoby GPU efektywnie obsługiwać dziesiątki równoczesnych użytkowników — od tego są vLLM, TGI albo hostowane API. Jeśli zamierzasz postawić lokalny model przed prawdziwym ruchem, zmierz przepustowość Ollama pod równoczesnym obciążeniem, zanim się zdecydujesz: pojedyncza instancja padnie dużo wcześniej niż zrobiłby to serwer z prawdziwym batchowaniem.

To też nie jest narzędzie do fine-tuningu. Modelfile zmienia system prompt i parametry samplingu, nigdy wagi. Nauczenie modelu nowego zachowania na podstawie Twoich przykładów to osobny pipeline.

Żadne z tych dwóch ograniczeń nie dotyczy pojedynczego dewelopera na laptopie. Pobierz model, który wygodnie mieści się pod Twoim limitem RAM-u, uruchom go raz z CLI, a potem wywołaj curl-em na /api/generate. Jeśli odpowiedź wraca w kilka sekund i mówi to, czego oczekiwałeś, masz lokalny serwer wnioskowania, z którym może połączyć się każde narzędzie kompatybilne z OpenAI.

Powiązane artykuły