Tutorial MergeKit: Menggabungkan Model LLM untuk Membuat Model AI Kustom
Model bahasa besar (LLM) open-source terus berkembang pesat. Dengan banyaknya model fine-tuned yang tersedia di Hugging Face, muncul teknik menarik yang memungkinkan kita menggabungkan beberapa model menjadi satu model baru tanpa perlu training ulang. Teknik ini disebut model merging, dan MergeKit adalah toolkit paling populer untuk melakukannya.
MergeKit, yang dikembangkan oleh Arcee AI, memungkinkan kita menggabungkan dua atau lebih model transformer dengan berbagai metode seperti SLERP, TIES, DARE, dan linear merge. Hasilnya adalah model baru yang menggabungkan kemampuan dari model-model sumber tanpa membutuhkan GPU untuk training.
Dalam tutorial ini, kita akan mempelajari cara menggunakan MergeKit dari instalasi hingga membuat model merged yang siap digunakan.
Mengapa Model Merging?
Sebelum masuk ke teknik, penting untuk memahami mengapa model merging menjadi populer:
Instalasi MergeKit
Prasyarat
- Python 3.10 atau lebih baru
- RAM minimal 16 GB (tergantung ukuran model)
- Disk space yang cukup untuk menyimpan model (setiap model 7B membutuhkan sekitar 14 GB dalam fp16)
Instalasi dari PyPI
pip install mergekit
Instalasi dari Source (Rekomendasi)
Untuk mendapatkan fitur terbaru:
git clone https://github.com/arcee-ai/mergekit.git
cd mergekit
pip install -e .
Jika ingin menggunakan fitur evolusi (evolutionary merge):
pip install -e ".[evolve]"
Verifikasi Instalasi
mergekit-yaml --help
Jika command ini menampilkan opsi bantuan, instalasi berhasil.
Konsep Dasar Model Merging
Arsitektur yang Didukung
MergeKit mendukung model-model berbasis transformer, termasuk:
- LLaMA dan turunannya (Mistral, Qwen, dll.)
- GPT-NeoX
- Phi
- Gemma
- StableLM
- Dan arsitektur lain yang kompatibel
Metode Merge yang Tersedia
MergeKit menyediakan beberapa metode merge:
| Metode | Deskripsi | Kapan Digunakan |
|--------|-----------|-----------------|
| Linear | Weighted average sederhana dari weight model | Baseline, cepat, mudah dipahami |
| SLERP | Spherical Linear Interpolation | Merge 2 model dengan transisi halus |
| TIES | TrIm, Elect, and merGe | Mengurangi interferensi antar task |
| DARE | Drop And REscale | Mirip TIES dengan pendekatan berbeda |
| Passthrough | Menggabungkan layer secara berurutan | Membuat model "frankenmerge" yang lebih besar |
| Model Stock | Geometric merge di weight space | Merge yang lebih robust |
Membuat Konfigurasi Merge Pertama
MergeKit menggunakan file YAML untuk mendefinisikan konfigurasi merge. Mari mulai dengan contoh sederhana.
Linear Merge (Weighted Average)
Buat file linear-merge.yml:
mergemethod: linear
dtype: float16
models:
- model: NousResearch/Hermes-2-Pro-Mistral-7B
parameters:
weight: 0.6
- model: teknium/OpenHermes-2.5-Mistral-7B
parameters:
weight: 0.4
Jalankan merge:
mergekit-yaml linear-merge.yml ./output-linear-merge --cuda --lazy-unpickle
Parameter:
--cuda: Gunakan GPU jika tersedia (opsional, mempercepat proses)--lazy-unpickle: Hemat memori dengan lazy loading
SLERP Merge
SLERP adalah metode yang sangat populer untuk menggabungkan dua model. Buat file slerp-merge.yml:
mergemethod: slerp
dtype: float16
basemodel: NousResearch/Hermes-2-Pro-Mistral-7B
parameters:
t: 0.5
models:
- model: NousResearch/Hermes-2-Pro-Mistral-7B
- model: teknium/OpenHermes-2.5-Mistral-7B
Parameter t mengontrol interpolasi:
t: 0.0= 100% model pertamat: 0.5= campuran seimbangt: 1.0= 100% model kedua
Jalankan:
mergekit-yaml slerp-merge.yml ./output-slerp-merge --cuda
TIES Merge
TIES (TrIm, Elect Sign, and merGe) efektif untuk mengurangi interferensi antar task. Buat file ties-merge.yml:
mergemethod: ties
dtype: float16
basemodel: mistralai/Mistral-7B-v0.1
parameters:
density: 0.5
normalize: true
models:
- model: NousResearch/Hermes-2-Pro-Mistral-7B
parameters:
weight: 1.0
density: 0.5
- model: teknium/OpenHermes-2.5-Mistral-7B
parameters:
weight: 0.5
density: 0.5
Parameter penting pada TIES:
density: Proporsi parameter yang dipertahankan (0.0-1.0). Nilai lebih rendah berarti lebih banyak parameter yang di-trim.normalize: Normalisasi weight setelah merge.basemodel: Model referensi untuk menghitung delta weight.
mergekit-yaml ties-merge.yml ./output-ties-merge --cuda
DARE Merge
DARE (Drop And REscale) mirip TIES tetapi menggunakan random dropping. Buat file dare-merge.yml:
mergemethod: dareties
dtype: float16
basemodel: mistralai/Mistral-7B-v0.1
parameters:
normalize: true
models:
- model: NousResearch/Hermes-2-Pro-Mistral-7B
parameters:
weight: 1.0
density: 0.6
- model: teknium/OpenHermes-2.5-Mistral-7B
parameters:
weight: 0.5
density: 0.6
mergekit-yaml dare-merge.yml ./output-dare-merge --cuda
Penggunaan Lanjutan
Frankenmerge (Passthrough)
Frankenmerge memungkinkan kita menggabungkan layer dari model berbeda secara berurutan, membuat model yang lebih besar. Buat file franken-merge.yml:
mergemethod: passthrough
dtype: float16
slices:
- sources:
- model: NousResearch/Hermes-2-Pro-Mistral-7B
layerrange: [0, 16]
- sources:
- model: teknium/OpenHermes-2.5-Mistral-7B
layerrange: [8, 24]
- sources:
- model: NousResearch/Hermes-2-Pro-Mistral-7B
layerrange: [16, 32]
Model di atas mengambil layer 0-15 dari model pertama, layer 8-23 dari model kedua, dan layer 16-31 dari model pertama lagi, menghasilkan model dengan 48 layer (lebih besar dari kedua sumber).
mergekit-yaml franken-merge.yml ./output-franken-merge --cuda
Konfigurasi Per-Layer dengan Gradient
Kita bisa mengatur weight yang berbeda per layer menggunakan gradient:
mergemethod: slerp
dtype: float16
basemodel: NousResearch/Hermes-2-Pro-Mistral-7B
parameters:
t:
- filter: selfattn
value: [0.0, 0.3, 0.5, 0.7, 1.0]
- filter: mlp
value: [1.0, 0.7, 0.5, 0.3, 0.0]
- value: 0.5
models:
- model: NousResearch/Hermes-2-Pro-Mistral-7B
- model: teknium/OpenHermes-2.5-Mistral-7B
Konfigurasi ini menggunakan gradient yang berbeda untuk attention layers dan MLP layers, memberikan kontrol granular atas proses merge.
Merge dengan Tokenizer Kustom
Jika model yang di-merge memiliki tokenizer berbeda:
mergemethod: linear
dtype: float16
tokenizer
source: union
models:
- model: modelA
parameters:
weight: 0.5
- model: modelB
parameters:
weight: 0.5
Opsi tokenizersource:
union: Gabungkan vocabulary dari semua modelbase: Gunakan tokenizer dari base modelmodel:: Gunakan tokenizer dari model tertentu
Menggunakan Model Lokal
Tidak harus mengunduh dari Hugging Face. Model lokal juga bisa digunakan:
mergemethod: slerp
dtype: float16
basemodel: /path/to/local/model-a
parameters:
t: 0.5
models:
- model: /path/to/local/model-a
- model: /path/to/local/model-b
Evaluasi Model Hasil Merge
Setelah merge, penting untuk mengevaluasi hasilnya. Berikut beberapa cara:
Quick Test dengan Transformers
from transformers import AutoModelForCausalLM, AutoTokenizer
modelpath = "./output-slerp-merge"
tokenizer = AutoTokenizer.frompretrained(modelpath)
model = AutoModelForCausalLM.frompretrained(
modelpath,
torchdtype="auto",
devicemap="auto"
)
prompt = "Jelaskan konsep machine learning dalam 3 kalimat:"
inputs = tokenizer(prompt, returntensors="pt").to(model.device)
outputs = model.generate(inputs, maxnewtokens=200, temperature=0.7)
print(tokenizer.decode(outputs[0], skipspecialtokens=True))
Benchmark dengan lm-eval
pip install lm-eval
lmeval --model hf \
--modelargs pretrained=./output-slerp-merge \
--tasks hellaswag,arceasy,mmlu \
--batchsize 8
Perbandingan Output
Script sederhana untuk membandingkan output dari model asli dan model merged:
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch
def generateresponse(modelpath, prompt, maxtokens=200):
tokenizer = AutoTokenizer.frompretrained(modelpath)
model = AutoModelForCausalLM.frompretrained(
modelpath, torchdtype=torch.float16, devicemap="auto"
)
inputs = tokenizer(prompt, returntensors="pt").to(model.device)
outputs = model.generate(inputs, maxnewtokens=maxtokens, temperature=0.7)
return tokenizer.decode(outputs[0], skipspecialtokens=True)
testprompts = [
"Write a Python function to calculate fibonacci numbers:",
"Explain quantum computing to a 5-year-old:",
"What are the best practices for database indexing?",
]
models = {
"Model A": "NousResearch/Hermes-2-Pro-Mistral-7B",
"Merged": "./output-slerp-merge",
}
for prompt in testprompts:
print(f"\nPrompt: {prompt}")
print("=" * 60)
for name, path in models.items():
response = generateresponse(path, prompt)
print(f"\n[{name}]:")
print(response)
Upload ke Hugging Face Hub
Setelah puas dengan hasil merge, upload ke Hugging Face:
from huggingfacehub import HfApi
api = HfApi()
api.createrepo(
repoid="username/my-merged-model",
repotype="model",
private=False
)
api.uploadfolder(
folderpath="./output-slerp-merge",
repoid="username/my-merged-model",
repotype="model",
)
Atau menggunakan CLI:
huggingface-cli upload username/my-merged-model ./output-slerp-merge
Jangan lupa buat Model Card (README.md) yang menjelaskan:
- Model-model sumber yang digunakan
- Metode merge dan parameter
- Hasil evaluasi
- Lisensi yang berlaku
Konversi ke Format GGUF
Untuk menjalankan model merged di llama.cpp atau Ollama, konversi ke GGUF:
git clone https://github.com/ggerganov/llama.cpp.git
cd llama.cpp
python converthftogguf.py ../output-slerp-merge --outfile merged-model.gguf --outtype f16
Untuk quantisasi (mengurangi ukuran file):
./llama-quantize merged-model.gguf merged-model-Q4KM.gguf Q4KM
Level quantisasi populer:
Q4KM: Keseimbangan antara ukuran dan kualitas (rekomendasi)Q5KM: Kualitas lebih tinggi, file lebih besarQ80: Kualitas hampir setara fp16, file besar
Best Practices
1. Pilih Model Sumber yang Tepat
- Gunakan model dengan arsitektur yang sama (misal: semua berbasis Mistral 7B)
- Pastikan model menggunakan tokenizer yang sama atau kompatibel
- Pilih model yang di-fine-tune untuk task berbeda agar saling melengkapi
2. Eksperimen dengan Parameter
- Mulai dengan SLERP
t: 0.5sebagai baseline - Untuk TIES/DARE, coba berbagai nilai
density(0.3, 0.5, 0.7) - Gunakan gradient per-layer untuk kontrol lebih halus
- Catat setiap eksperimen beserta hasilnya
3. Manajemen Resource
- Monitor penggunaan RAM selama proses merge
- Gunakan
--lazy-unpickleuntuk mengurangi penggunaan memori - Gunakan
--low-cpu-memoryjika RAM terbatas - Simpan model dalam format safetensors untuk keamanan dan kecepatan
4. Evaluasi yang Menyeluruh
- Jangan hanya mengandalkan satu benchmark
- Test dengan prompt yang relevan dengan use case Anda
- Bandingkan dengan model sumber untuk memastikan tidak ada regresi
- Periksa coherence dan consistency dari output
5. Dokumentasi
- Buat YAML config yang terdokumentasi dengan baik
- Simpan semua konfigurasi eksperimen
- Catat model sumber, metode, parameter, dan hasil evaluasi
Troubleshooting
Error: Out of Memory
RuntimeError: CUDA out of memory
Solusi:
- Jalankan di CPU (hapus flag
--cuda) - Gunakan
--lazy-unpickle - Gunakan
--low-cpu-memory - Merge dalam dtype yang lebih kecil (bfloat16 atau float16)
Error: Incompatible Architecture
RuntimeError: Incompatible architectures
Solusi:
- Pastikan semua model menggunakan arsitektur yang sama
- Periksa bahwa jumlah layer dan hidden size cocok (kecuali untuk passthrough merge)
Error: Tokenizer Mismatch
Jika model memiliki vocabulary berbeda, gunakan tokenizersource: union atau pilih tokenizer dari salah satu model.
Kesimpulan
MergeKit adalah toolkit yang sangat berguna untuk membuat model LLM kustom tanpa perlu training. Dengan memahami berbagai metode merge dan parameter yang tersedia, kita bisa bereksperimen dan menemukan kombinasi optimal untuk kebutuhan spesifik.
Beberapa poin penting yang perlu diingat:
- Mulai dengan metode sederhana (linear atau SLERP) sebelum mencoba yang lebih kompleks
- Selalu evaluasi model hasil merge secara menyeluruh
- Dokumentasikan setiap eksperimen untuk reproducibility
- Model merged terbaik biasanya menggabungkan model yang memiliki kelebihan di area berbeda
Dengan teknik model merging dan MergeKit, Anda bisa membuat model AI yang disesuaikan dengan kebutuhan tanpa biaya training yang mahal. Selamat bereksperimen!