<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://lms.onnocenter.or.id/wiki/index.php?action=history&amp;feed=atom&amp;title=LLM%3A_Fine_Tuning_Ollama_gemma3%3A1b</id>
	<title>LLM: Fine Tuning Ollama gemma3:1b - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://lms.onnocenter.or.id/wiki/index.php?action=history&amp;feed=atom&amp;title=LLM%3A_Fine_Tuning_Ollama_gemma3%3A1b"/>
	<link rel="alternate" type="text/html" href="https://lms.onnocenter.or.id/wiki/index.php?title=LLM:_Fine_Tuning_Ollama_gemma3:1b&amp;action=history"/>
	<updated>2026-04-19T22:10:05Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.45.1</generator>
	<entry>
		<id>https://lms.onnocenter.or.id/wiki/index.php?title=LLM:_Fine_Tuning_Ollama_gemma3:1b&amp;diff=72940&amp;oldid=prev</id>
		<title>Unknown user: Created page with &quot;Siap! Berikut **paket lengkap** untuk *fine-tuning* **Ollama `gemma3:1b`** dengan *open-source stack* (Python + Unsloth/PEFT) lalu **dipakai di Ollama** via LoRA *adapter*. Al...&quot;</title>
		<link rel="alternate" type="text/html" href="https://lms.onnocenter.or.id/wiki/index.php?title=LLM:_Fine_Tuning_Ollama_gemma3:1b&amp;diff=72940&amp;oldid=prev"/>
		<updated>2025-10-02T22:04:45Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;Siap! Berikut **paket lengkap** untuk *fine-tuning* **Ollama `gemma3:1b`** dengan *open-source stack* (Python + Unsloth/PEFT) lalu **dipakai di Ollama** via LoRA *adapter*. Al...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Siap! Berikut **paket lengkap** untuk *fine-tuning* **Ollama `gemma3:1b`** dengan *open-source stack* (Python + Unsloth/PEFT) lalu **dipakai di Ollama** via LoRA *adapter*. Alurnya:&lt;br /&gt;
&lt;br /&gt;
1. **Siapkan data** (JSON/JSONL).&lt;br /&gt;
2. **Fine-tune di Python** → hasilkan **LoRA adapter**.&lt;br /&gt;
3. **Bungkus ke Ollama** dengan **Modelfile** (`FROM gemma3:1b` + `ADAPTER …`). ([Ollama][1])&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
# 0) Persiapan lingkungan (ringkas)&lt;br /&gt;
&lt;br /&gt;
```bash&lt;br /&gt;
# Python env (opsional)&lt;br /&gt;
python -m venv .venv &amp;amp;&amp;amp; source .venv/bin/activate&lt;br /&gt;
&lt;br /&gt;
# Lib open-source&lt;br /&gt;
pip install -U transformers datasets accelerate peft bitsandbytes unsloth&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
&amp;gt; Catatan: `gemma3:1b` tersedia di pustaka Ollama dan butuh Ollama ≥ 0.6. ([Ollama][1])&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
# 1) Contoh **dataset** (JSONL) untuk FAQ sekolah&lt;br /&gt;
&lt;br /&gt;
Format **instruksi–jawaban** sederhana (tiap baris = 1 contoh). Simpan sebagai `data_faq.jsonl`.&lt;br /&gt;
&lt;br /&gt;
```json&lt;br /&gt;
{&amp;quot;instruction&amp;quot;: &amp;quot;Kapan jadwal UKK tahun ini?&amp;quot;, &amp;quot;input&amp;quot;: &amp;quot;&amp;quot;, &amp;quot;output&amp;quot;: &amp;quot;UKK dilaksanakan pada minggu ke-3 bulan Mei. Cek papan informasi atau web sekolah untuk tanggal pasti.&amp;quot;}&lt;br /&gt;
{&amp;quot;instruction&amp;quot;: &amp;quot;Bagaimana cara mendaftar ekstrakurikuler?&amp;quot;, &amp;quot;input&amp;quot;: &amp;quot;&amp;quot;, &amp;quot;output&amp;quot;: &amp;quot;Isi formulir di ruang BK atau lewat portal siswa. Pendaftaran buka tiap awal semester.&amp;quot;}&lt;br /&gt;
{&amp;quot;instruction&amp;quot;: &amp;quot;Apa saja jurusan di SMK ini?&amp;quot;, &amp;quot;input&amp;quot;: &amp;quot;&amp;quot;, &amp;quot;output&amp;quot;: &amp;quot;RPL, TKJ, DKV, Akuntansi, dan Bisnis Daring. Lihat brosur atau situs sekolah untuk detail kurikulum.&amp;quot;}&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
&amp;gt; Boleh juga pakai **JSON** (array) kalau nyaman, tapi **JSONL** umum dipakai untuk *fine-tuning*. ([Arsturn][2])&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
# 2) **Script Python**: *fine-tune* Gemma 3 1B (QLoRA via Unsloth/PEFT)&lt;br /&gt;
&lt;br /&gt;
&amp;gt; Script ini:&lt;br /&gt;
&amp;gt; – Membaca `data_faq.jsonl`&lt;br /&gt;
&amp;gt; – Mengubah ke *prompt template* sederhana&lt;br /&gt;
&amp;gt; – *Fine-tune* model 1B pakai **QLoRA** (hemat VRAM)&lt;br /&gt;
&amp;gt; – Menyimpan **LoRA adapter** ke folder `lora_out/`&lt;br /&gt;
&lt;br /&gt;
&amp;gt; Catatan: Nama model HF untuk Gemma 3 1B bisa bervariasi (contoh: `google/gemma-3-1b-it` / `google/gemma-3-1b`). Gantilah `BASE_MODEL_ID` sesuai model yang tersedia di HF Anda. (Tujuan kita: hasilkan **adapter** yang nanti dipakai di Ollama). Petunjuk penggunaan **ADAPTER** di Modelfile ada di dokumentasi resmi. ([Ollama][3])&lt;br /&gt;
&lt;br /&gt;
```python&lt;br /&gt;
# fine_tune_gemma3_1b_lora.py&lt;br /&gt;
import json, os&lt;br /&gt;
from datasets import load_dataset&lt;br /&gt;
from transformers import AutoTokenizer, AutoModelForCausalLM&lt;br /&gt;
from peft import LoraConfig, get_peft_model, prepare_model_for_kbit_training&lt;br /&gt;
from transformers import TrainingArguments, Trainer, DataCollatorForLanguageModeling&lt;br /&gt;
&lt;br /&gt;
BASE_MODEL_ID = &amp;quot;google/gemma-3-1b-it&amp;quot;  # ganti sesuai HF model yang tersedia&lt;br /&gt;
OUTPUT_DIR = &amp;quot;lora_out&amp;quot;&lt;br /&gt;
os.makedirs(OUTPUT_DIR, exist_ok=True)&lt;br /&gt;
&lt;br /&gt;
# 1) Load tokenizer &amp;amp; model (8-bit/4-bit QLoRA hemat VRAM)&lt;br /&gt;
tokenizer = AutoTokenizer.from_pretrained(BASE_MODEL_ID, use_fast=True)&lt;br /&gt;
model = AutoModelForCausalLM.from_pretrained(&lt;br /&gt;
    BASE_MODEL_ID,&lt;br /&gt;
    load_in_4bit=True,&lt;br /&gt;
    device_map=&amp;quot;auto&amp;quot;&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
# 2) Siapkan PEFT LoRA&lt;br /&gt;
lora_config = LoraConfig(&lt;br /&gt;
    r=16,&lt;br /&gt;
    lora_alpha=32,&lt;br /&gt;
    target_modules=[&amp;quot;q_proj&amp;quot;,&amp;quot;k_proj&amp;quot;,&amp;quot;v_proj&amp;quot;,&amp;quot;o_proj&amp;quot;,&amp;quot;gate_proj&amp;quot;,&amp;quot;up_proj&amp;quot;,&amp;quot;down_proj&amp;quot;],&lt;br /&gt;
    lora_dropout=0.05,&lt;br /&gt;
    bias=&amp;quot;none&amp;quot;,&lt;br /&gt;
    task_type=&amp;quot;CAUSAL_LM&amp;quot;&lt;br /&gt;
)&lt;br /&gt;
model = prepare_model_for_kbit_training(model)&lt;br /&gt;
model = get_peft_model(model, lora_config)&lt;br /&gt;
&lt;br /&gt;
# 3) Dataset JSONL → prompt&lt;br /&gt;
#   Template simpel: &amp;quot;&amp;lt;s&amp;gt;### Instruction:\n{instruction}\n### Response:\n{output}&amp;lt;/s&amp;gt;&amp;quot;&lt;br /&gt;
def format_example(ex):&lt;br /&gt;
    instruction = ex.get(&amp;quot;instruction&amp;quot;,&amp;quot;&amp;quot;).strip()&lt;br /&gt;
    user_input = ex.get(&amp;quot;input&amp;quot;,&amp;quot;&amp;quot;).strip()&lt;br /&gt;
    output = ex.get(&amp;quot;output&amp;quot;,&amp;quot;&amp;quot;).strip()&lt;br /&gt;
    if user_input:&lt;br /&gt;
        prompt = f&amp;quot;### Instruction:\n{instruction}\n### Input:\n{user_input}\n### Response:\n{output}&amp;quot;&lt;br /&gt;
    else:&lt;br /&gt;
        prompt = f&amp;quot;### Instruction:\n{instruction}\n### Response:\n{output}&amp;quot;&lt;br /&gt;
    return {&amp;quot;text&amp;quot;: prompt}&lt;br /&gt;
&lt;br /&gt;
dataset = load_dataset(&amp;quot;json&amp;quot;, data_files=&amp;quot;data_faq.jsonl&amp;quot;, split=&amp;quot;train&amp;quot;)&lt;br /&gt;
dataset = dataset.map(format_example)&lt;br /&gt;
&lt;br /&gt;
# 4) Tokenisasi&lt;br /&gt;
def tokenize_fn(batch):&lt;br /&gt;
    return tokenizer(batch[&amp;quot;text&amp;quot;], truncation=True, max_length=1024)&lt;br /&gt;
&lt;br /&gt;
tokenized = dataset.map(tokenize_fn, batched=True, remove_columns=dataset.column_names)&lt;br /&gt;
&lt;br /&gt;
# 5) Data collator (LM)&lt;br /&gt;
collator = DataCollatorForLanguageModeling(tokenizer=tokenizer, mlm=False)&lt;br /&gt;
&lt;br /&gt;
# 6) Training args (ringan; sesuaikan dengan GPU)&lt;br /&gt;
args = TrainingArguments(&lt;br /&gt;
    output_dir=OUTPUT_DIR,&lt;br /&gt;
    per_device_train_batch_size=2,&lt;br /&gt;
    gradient_accumulation_steps=8,&lt;br /&gt;
    learning_rate=2e-4,&lt;br /&gt;
    num_train_epochs=2,&lt;br /&gt;
    logging_steps=20,&lt;br /&gt;
    save_steps=200,&lt;br /&gt;
    save_total_limit=2,&lt;br /&gt;
    bf16=True,&lt;br /&gt;
    optim=&amp;quot;paged_adamw_8bit&amp;quot;,&lt;br /&gt;
    report_to=&amp;quot;none&amp;quot;&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
trainer = Trainer(&lt;br /&gt;
    model=model,&lt;br /&gt;
    args=args,&lt;br /&gt;
    train_dataset=tokenized,&lt;br /&gt;
    data_collator=collator,&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
trainer.train()&lt;br /&gt;
&lt;br /&gt;
# 7) Simpan LoRA adapter (PEFT)&lt;br /&gt;
model.save_pretrained(OUTPUT_DIR)&lt;br /&gt;
tokenizer.save_pretrained(OUTPUT_DIR)&lt;br /&gt;
&lt;br /&gt;
print(f&amp;quot;LoRA adapter saved to: {OUTPUT_DIR}&amp;quot;)&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
**Hasil:** folder `lora_out/` berisi file **adapter** (mis. `adapter_config.json`, `adapter_model.safetensors`). Panduan menyimpan/menjalankan LoRA dan memakai di Ollama (Modelfile `ADAPTER`) banyak dibahas juga oleh Unsloth &amp;amp; komunitas. ([docs.unsloth.ai][4])&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
# 3) **Integrasi ke Ollama** lewat **Modelfile**&lt;br /&gt;
&lt;br /&gt;
Buat file bernama `Modelfile`:&lt;br /&gt;
&lt;br /&gt;
```Dockerfile&lt;br /&gt;
# Modelfile: gemma3-1b-faq.modelfile&lt;br /&gt;
FROM gemma3:1b&lt;br /&gt;
# Terapkan LoRA adapter hasil training (path relatif/absolut ke folder adapter)&lt;br /&gt;
ADAPTER ./lora_out/&lt;br /&gt;
&lt;br /&gt;
# (opsional) Prompt sistem agar gaya konsisten&lt;br /&gt;
SYSTEM &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
Kamu adalah chatbot FAQ sekolah. Jawab singkat, jelas, dan sopan.&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# (opsional) Atur parameter inferensi&lt;br /&gt;
PARAMETER temperature 0.2&lt;br /&gt;
PARAMETER top_p 0.9&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
Lalu **buat model** kustom di Ollama dan jalankan:&lt;br /&gt;
&lt;br /&gt;
```bash&lt;br /&gt;
ollama create gemma3-1b-faq -f gemma3-1b-faq.modelfile&lt;br /&gt;
ollama run gemma3-1b-faq&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
&amp;gt; **Kunci:** `FROM gemma3:1b` memastikan basis cocok, dan `ADAPTER …` menerapkan LoRA hasil *fine-tune*. Ini adalah cara resmi menerapkan **LoRA adapter** di Ollama via **Modelfile**. ([Ollama][3])&lt;br /&gt;
&lt;br /&gt;
**Tes cepat di sesi Ollama:**&lt;br /&gt;
&lt;br /&gt;
```&lt;br /&gt;
&amp;gt; Kapan UKK dilaksanakan?&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
(Seharusnya merujuk ke pola jawaban yang kamu latih dari dataset FAQ.)&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
## Tips Praktik Baik (ringkas)&lt;br /&gt;
&lt;br /&gt;
* **Konsistensi format**: pastikan semua contoh punya `instruction` dan `output` yang jelas.&lt;br /&gt;
* **Variasi pertanyaan**: untuk topik sama, latih beberapa cara tanya yang beda.&lt;br /&gt;
* **Split data**: sisakan sebagian untuk **uji manual** di akhir (jangan semua dilatih).&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
## FAQ singkat&lt;br /&gt;
&lt;br /&gt;
* **Bisa tanpa Unsloth?** Bisa, pakai *Transformers + PEFT* saja (script di atas sudah begitu). Unsloth membantu percepatan &amp;amp; hemat memori. ([docs.unsloth.ai][4])&lt;br /&gt;
* **Harus konversi ke GGUF?** Tidak wajib. Dengan Modelfile `ADAPTER` banyak alur langsung memakai **folder safetensors**. Jika perlu *merge/export* tertentu (mis. via `llama.cpp` tools), ada panduan komunitas. ([GitHub][5])&lt;br /&gt;
* **Nama model Ollama benar?** Ya, `gemma3:1b` tersedia di library Ollama. ([Ollama][1])&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
Kalau mau, saya bisa siapkan **template Colab** + **dataset CSV→JSONL converter** dan **ukur akurasi sederhana** (tes sebelum/ sesudah fine-tune) — tinggal bilang ya.&lt;br /&gt;
&lt;br /&gt;
[1]: https://ollama.com/library/gemma3%3A1b?utm_source=chatgpt.com &amp;quot;gemma3:1b&amp;quot;&lt;br /&gt;
[2]: https://www.arsturn.com/blog/deep-dive-fine-tuning-models-ollama?utm_source=chatgpt.com &amp;quot;Fine-Tuning Models with Ollama: A Comprehensive Guide - Arsturn&amp;quot;&lt;br /&gt;
[3]: https://docs.ollama.com/modelfile?utm_source=chatgpt.com &amp;quot;Modelfile reference&amp;quot;&lt;br /&gt;
[4]: https://docs.unsloth.ai/basics/running-and-saving-models/saving-to-ollama?utm_source=chatgpt.com &amp;quot;Saving to Ollama | Unsloth Documentation&amp;quot;&lt;br /&gt;
[5]: https://github.com/dkarunakaran/deploy_to_ollama?utm_source=chatgpt.com &amp;quot;Deploying to Ollama - dkarunakaran ...&amp;quot;&lt;/div&gt;</summary>
		<author><name>Unknown user</name></author>
	</entry>
</feed>