← Kembali ke Blog

Ollama: Jalankan LLM Open-Source Secara Lokal dengan Satu Perintah

Kebanyakan demo LLM nganggap kamu punya API key OpenAI. Itu oke buat prototype, tapi ada alasan bagus buat jalanin model sendiri: prompt-nya nggak keluar dari mesin kamu, nggak ada tagihan per token, dan kamu bisa fine-tune, kuantisasi, atau ganti bobot tanpa minta izin siapa pun. Dulu kendalanya, inference lokal berarti harus berantem sama CUDA, flag build llama.cpp, dan virtualenv Python.

Ollama ngumpetin semua itu. Satu binary, satu perintah, dan kamu punya model yang jalan di REST API di http://localhost:11434. CLI-nya adalah wrapper tipis di atas llama.cpp dengan default yang masuk akal: pull model, offload GPU otomatis, bobot terkuantisasi (Q4_0, Q4_K_M, Q5, Q8), dan endpoint OpenAI-compatible /v1/chat/completions yang langsung masuk ke tool yang udah ngomong OpenAI.

Panduan ini ngejalanin kamu dari install kosong sampai agen kecil yang manggil fungsi dan balikin JSON terstruktur. Kamu bakal copy-paste, jalanin, dan berakhir dengan model yang kamu kontrol dari ujung ke ujung.

Prerequisites

  • macOS, Linux, atau Windows (WSL2)
  • Minimal 8GB RAM (16GB+ disarankan buat model 7B+)
  • Akselerasi GPU: Apple Silicon built-in, atau NVIDIA GPU dengan driver CUDA di Linux
  • Sekitar 10GB disk kosong per model 7B, lebih buat varian yang lebih besar atau presisi lebih tinggi

Halaman install Ollama bahas macOS (DMG), Linux (skrip satu baris), dan Windows (build preview). Proyeknya open source dengan lisensi MIT.

Step 1: Install

macOS dan Linux pakai satu baris yang sama:

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

Itu naruh binary ollama di /usr/local/bin dan daftarin service systemd (atau launchd) yang auto-start pas boot. Verifikasi:

ollama --version

Kamu harusnya liat sesuatu kayak ollama version 0.5.x. Kalau ollama serve belum jalan, mulai manual:

ollama serve

Pertama kali kamu ngejalanin perintah model, daemon download model dari registry Ollama dan cache di ~/.ollama/models.

Step 2: Pull dan Chat

ollama pull llama3.2

Itu narik model Llama 3.2 3B default (~2GB). Buat kemampuan lebih tanpa nambah banyak berat, coba llama3.1:8b. Buat coding, qwen2.5-coder:7b pilihan populer. Daftar tag lengkap ada di ollama.com/library.

Setelah ke-pull, jalanin interaktif:

ollama run llama3.2

Sekarang kamu chat sama LLM lokal. Ketik /bye buat keluar, atau kirim prompt langsung:

ollama run llama3.2 "Jelasin PagedAttention dalam 2 kalimat."

Step 3: Panggil REST API

Ollama nge-expose dua permukaan HTTP:

  • API native di POST /api/chat dan POST /api/generate
  • OpenAI-compatible di POST /v1/chat/completions, POST /v1/embeddings, GET /v1/models

Endpoint OpenAI-compatible adalah fitur utamanya. Tool apa pun yang udah target OpenAI bisa nunjuk ke Ollama cukup ganti base URL:

curl http://localhost:11434/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "llama3.2",
    "messages": [
      {"role": "user", "content": "Tulis haiku soal caching."}
    ]
  }'

Skema response-nya match OpenAI persis, jadi SDK openai Python dan SDK openai Node jalan tanpa ubah kode:

from openai import OpenAI

client = OpenAI(
    base_url="http://localhost:11434/v1",
    api_key="ollama",  # disyaratin SDK, diabaikan Ollama
)

resp = client.chat.completions.create(
    model="llama3.2",
    messages=[{"role": "user", "content": "Ringkasin README Ollama."}],
)
print(resp.choices[0].message.content)
import OpenAI from "openai";

const client = new OpenAI({
  baseURL: "http://localhost:11434/v1",
  apiKey: "ollama",
});

const resp = await client.chat.completions.create({
  model: "llama3.2",
  messages: [{ role: "user", content: "Sebutin 3 CLI tool yang ningkatin produktivitas." }],
});
console.log(resp.choices[0].message.content);

Step 4: Pake SDK Python Resmi

Buat integrasi yang lebih ketat, Ollama nyediain library Python yang nge-expose streaming, async, dan output terstruktur:

pip install ollama
import ollama

# streaming
stream = ollama.chat(
    model="llama3.2",
    messages=[{"role": "user", "content": "Jelasin kuantisasi pake bahasa sehari-hari."}],
    stream=True,
)
for chunk in stream:
    print(chunk["message"]["content"], end="", flush=True)

Client async cara pakainya sama, pake ollama.AsyncClient. Embeddings satu panggilan:

emb = ollama.embeddings(model="nomic-embed-text", prompt="hello world")
print(len(emb["embedding"]))  # 768

Step 5: Bikin Modelfile Custom

Modelfile itu buat Ollama kayak Dockerfile buat container. Kamu pilih base model, set parameter, dan panggang system prompt.

FROM llama3.2
PARAMETER temperature 0.2
PARAMETER num_ctx 4096
SYSTEM """
Kamu adalah senior DevOps engineer. Jawab ringkas. Lebih suka perintah daripada prosa.
Kalau diminta Dockerfile, balikin contoh yang lengkap dan bisa langsung dijalanin.
"""

Build dan jalanin:

ollama create devops-bot -f ./Modelfile
ollama run devops-bot "Tulis Dockerfile buat Go HTTP server di Alpine."

Key PARAMETER yang berguna: temperature, top_p, top_k, num_ctx (panjang konteks), num_gpu (jumlah layer yang di-offload), stop (string yang ngehentiin generasi), dan seed buat repro.

Kamu juga bisa pull model langsung dari HuggingFace, termasuk file GGUF yang kamu upload sendiri:

FROM hf.co/TheBloke/Mistral-7B-Instruct-v0.2-GGUF:Q4_K_M

Step 6: Use Case Nyata — Agen Function-Calling Lokal

Ollama nambahin tool/function calling native di akhir 2024. Pola di bawah nunjukin agen kecil yang milih antara dua tool palsu berdasarkan request user. Jalan sepenuhnya di laptop kamu.

import json
import ollama

tools = [
    {
        "type": "function",
        "function": {
            "name": "get_weather",
            "description": "Ambil cuaca saat ini buat sebuah kota",
            "parameters": {
                "type": "object",
                "properties": {
                    "city": {"type": "string"},
                },
                "required": ["city"],
            },
        },
    },
    {
        "type": "function",
        "function": {
            "name": "send_email",
            "description": "Kirim email ke seorang penerima",
            "parameters": {
                "type": "object",
                "properties": {
                    "to": {"type": "string"},
                    "subject": {"type": "string"},
                    "body": {"type": "string"},
                },
                "required": ["to", "subject", "body"],
            },
        },
    },
]

def dispatch(name, args):
    if name == "get_weather":
        return f"Cerah, 24C di {args['city']}"
    if name == "send_email":
        return f"Email di-antrikan ke {args['to']}"
    return "tool tidak dikenal"

messages = [{"role": "user", "content": "Cuaca di Jakarta gimana?"}]

resp = ollama.chat(
    model="llama3.1:8b",  # 8B lebih bisa diandelin buat tool call daripada 3B
    messages=messages,
    tools=tools,
)

if resp["message"].get("tool_calls"):
    call = resp["message"]["tool_calls"][0]
    name = call["function"]["name"]
    args = call["function"]["arguments"]
    result = dispatch(name, args)
    print(f"Tool: {name}({args}) -> {result}")
else:
    print(resp["message"]["content"])

Varian 8B lebih sering milih tool yang bener daripada 3B. Buat agen production, kamu bakal mau model yang lebih gede atau model kecil yang di-fine-tune buat tool calling (Qwen2.5, Llama 3.1, dan Mistral Nemo biasanya yang dipilih).

Performa: Cara Ngedapetin Lebih

Beberapa setting beneran ngaruh di Apple Silicon dan Linux.

Paksa CPU off atau on. OLLAMA_NUM_GPU=0 jalanin semuanya di CPU. Berguna buat baseline.

Atur panjang konteks. Konteks panjang makan banyak memori. num_ctx 2048 cukup buat chat; naikin ke 8192+ cuma kalau emang butuh.

Request konkuren. Ollama nge-queue dan paralelisasi request ke satu model. Jumlah slot paralel default-nya jumlah core CPU dibagi 2. Override pake OLLAMA_NUM_PARALLEL.

Pantau ollama ps. Pemakaian memori dan processor per model yang lagi jalan:

ollama ps

Pilihan kuantisasi. Quant lebih kecil = lebih cepet, memori lebih hemat, kualitas sedikit turun. Buat kebanyakan kerja chat dan code, Q4_K_M sweet spot-nya. Baris FROM Modelfile ngontrol quant mana yang di-pull.

Kapan Pake Ollama (dan Kapan Enggak)

Ollama pas kalau kamu mau satu mesin, sedikit model, dan install satu binary. Nggak pas kalau kamu butuh scale ke banyak user konkuren atau fleet GPU.

Pilih Ollama kalau:

  • Kamu develop di laptop dan mau akses offline
  • Kamu butuh model privat buat satu tim atau tool kecil
  • Kamu mau API OpenAI-compatible tanpa jalanin cluster vLLM
  • Kamu lagi evaluasi model open-source dan mau gonta-ganti cepet

Pilih yang lain kalau:

  • vLLM kalau kamu punya box multi-GPU dan butuh throughput maksimum. PagedAttention vLLM masih ngalahin backend llama.cpp Ollama dengan selisih gede di batch besar. Lihat panduan setup vLLM buat trade-off-nya.
  • llama.cpp langsung kalau kamu butuh format quant eksotis atau mau baca source-nya. Ollama ngewrap-nya, tapi kamu ngasih fleksibilitas.
  • LM Studio kalau kamu mau GUI buat chat sama model lokal. Dia juga pake llama.cpp di balik layar dan lebih ramah buat user non-CLI.
  • API OpenAI atau Anthropic kalau kamu nggak bisa jaminin GPU, atau butuh model frontier yang belum ada rilis open-nya.

Jebakan yang Sering Kejadian

Pull model diam-diam gagal di belakang proxy korporat. Set HTTPS_PROXY sebelum jalanin ollama pull. Daemon-nya nggak ngambil env var proxy dari shell kamu.

Ollama bind ke 127.0.0.1 secara default. Kalau kamu mau mesin lain di LAN nge-hit API-nya, set OLLAMA_HOST=0.0.0.0:11434 sebelum mulai service, atau edit unit systemd. Jangan expose port ini ke internet publik tanpa auth.

Out of memory di mesin 16GB. Model 7B di Q4 makan sekitar 5GB. Model 13B makan sekitar 9GB. Tambahin beberapa GB buat KV cache dan OS, dan kamu mentok. Turun ke model yang lebih kecil atau tutup app lain.

/v1/embeddings balikin dimensi yang beda dari OpenAI. text-embedding-3-small OpenAI 1536 dimensi. Model embedding default Ollama (nomic-embed-text) 768 dimensi. Kalau kamu gonta-ganti di vector DB yang udah ada, embed ulang semuanya.

Tool call sering error di model kecil. Apa pun di bawah 7B bakal halusinasi nama fungsi atau kelewat field yang required. Tes pake prompt yang udah dikenal dan model yang udah dikenal sebelum dicolok ke loop agen.

Mau Lanjut ke Mana

Butuh Bantuan Implementasi?

Saya membantu tim mendesain dan membangun infrastruktur cloud scalable, pipeline DevOps, dan sistem production-grade.

Konsultasi Gratis