Tutorial MergeKit: Menggabungkan Model LLM untuk Membuat Model AI Kustom

# 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...

By Ruby Abdullah · · tutorial
MergeKitLLMModel MergingHugging FacePython

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:

  • Tanpa Training: Model merging tidak membutuhkan GPU atau dataset training. Prosesnya murni manipulasi weight tensor.
  • Kombinasi Kemampuan: Model yang di-fine-tune untuk coding bisa digabung dengan model yang bagus di reasoning, menghasilkan model yang mampu keduanya.
  • Efisien: Proses merge bisa dilakukan di CPU dengan RAM yang cukup, tanpa perlu cluster GPU mahal.
  • Eksperimen Cepat: Bisa mencoba berbagai kombinasi model dan metode merge dalam hitungan menit.
  • Komunitas Aktif: Banyak model top di Open LLM Leaderboard adalah hasil merge.
  • 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 pertama
    • t: 0.5 = campuran seimbang
    • t: 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
    layer
    range: [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

    tokenizersource: union

    models:

    • model: modelA
    parameters:

    weight: 0.5

    • model: modelB
    parameters:

    weight: 0.5

    Opsi tokenizersource:

    • union: Gabungkan vocabulary dari semua model
    • base: Gunakan tokenizer dari base model
    • model:: 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 besar
    • Q80: 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.5 sebagai 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-unpickle untuk mengurangi penggunaan memori
    • Gunakan --low-cpu-memory jika 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!

    Artikel Terkait

    Tutorial Semantic Router: Routing Cerdas untuk Aplikasi LLM

    Tutorial Semantic Router: Routing Cerdas untuk Aplikasi LLM Semantic Router adalah library Python yang memungkinkan Anda...

    Tutorial Lengkap Unstructured: Preprocessing Dokumen untuk RAG dan Aplikasi LLM

    Tutorial Lengkap Unstructured: Preprocessing Dokumen untuk RAG dan Aplikasi LLM Dalam membangun aplikasi Retrieval-Augme...

    Tutorial Lengkap Llama Stack: Framework Resmi Meta untuk Membangun Aplikasi AI dengan Model Llama

    Tutorial Lengkap Llama Stack: Framework Resmi Meta untuk Membangun Aplikasi AI dengan Model Llama Llama Stack adalah fra...

    Tutorial CAMEL-AI: Framework Multi-Agent Communication untuk Membangun Sistem AI Kolaboratif

    Tutorial Lengkap CAMEL-AI: Framework Multi-Agent Communication untuk Membangun Sistem AI Kolaboratif Penulis: Ruby Abdul...