Tại sao phải merge model thay vì cắm đầu vào training?
Nếu bạn đang làm việc với các dòng mô hình như Llama 3 hay Qwen, chắc chắn bạn đã từng gặp tình trạng: Model A viết code cực đỉnh, nhưng Model B lại nói tiếng Việt tự nhiên hơn. Bạn khao khát một “đứa con lai” sở hữu cả hai thế mạnh này.
Lối mòn cũ là mang đi Fine-tuning. Tuy nhiên, thực tế là việc này cực kỳ tốn kém. Thuê một cụm GPU H100 hiện nay tiêu tốn khoảng $4-$5 mỗi giờ. Chưa kể, bạn có thể đối mặt với hiện tượng “catastrophic forgetting” – model học được kỹ năng mới nhưng lại quên sạch kiến thức cũ.
Model Merging xuất hiện như một lối đi tắt đầy thông minh. Thay vì dạy lại từ đầu, chúng ta trộn “trọng số” của các model đã có bằng thuật toán. Quá trình này gần như không tốn chi phí GPU. Bạn hoàn toàn có thể thực hiện ngay trên RAM hoặc CPU thông thường.
Lên bàn cân: Merging vs Fine-tuning
Dựa trên kinh nghiệm triển khai dự án chatbot thực tế, mình tóm tắt sự khác biệt để anh em dễ chọn lựa:
- Fine-tuning: Giống như gửi nhân viên đi học khóa chuyên sâu. Tốn học phí (GPU), mất thời gian và có rủi ro “học vẹt” cao.
- Model Merging: Giống như việc kết hợp kinh nghiệm của hai chuyên gia. Thực hiện siêu tốc trong 10-30 phút, giữ nguyên độ thông minh nguyên bản và chi phí gần như bằng 0.
Mình từng áp dụng cách này cho một hệ thống RAG (truy xuất dữ liệu). Thay vì fine-tune tốn kém, mình merge một bản chuyên hội thoại với một bản chuyên trích xuất thông tin. Kết quả là model phản hồi chính xác, không bị lặp từ hay mất ngữ cảnh.
3 thuật toán “nấu lẩu” model phổ biến nhất
MergeKit hỗ trợ rất nhiều phương pháp, nhưng đây là 3 cái tên bạn cần nằm lòng:
1. SLERP (Spherical Linear Interpolation)
Đây là lựa chọn quốc dân để trộn 2 model cùng cấu trúc. Thay vì lấy trung bình cộng thô sơ, SLERP tính toán dựa trên góc giữa các vector. Cách này giúp giữ lại đặc tính riêng biệt của từng model mà không làm nhiễu loạn trọng số.
2. TIES (Trimming, Electing, and Merging)
Khi bạn muốn trộn từ 3 model trở lên, hãy gọi tên TIES. Thuật toán này thông minh ở chỗ nó tự loại bỏ các thay đổi nhỏ (nhiễu) và chỉ giữ lại những tinh túy nhất, giúp giải quyết triệt để xung đột giữa các model thành phần.
3. DARE (Drop and Rescale)
DARE có cách tiếp cận táo bạo hơn bằng cách loại bỏ các trọng số dư thừa. Model sau khi merge thường rất gọn và cho hiệu năng tiệm cận với việc fine-tune đa nhiệm (multi-task).
Triển khai MergeKit trên môi trường Linux
Bạn cần một server Linux, lý tưởng nhất là Ubuntu 22.04. Về phần cứng, GPU không quá quan trọng nhưng RAM phải lớn. Theo kinh nghiệm của mình, RAM nên lớn hơn tổng dung lượng các model đầu vào. Để merge hai model 7B (khoảng 15GB mỗi cái), bạn nên chuẩn bị ít nhất 32GB đến 64GB RAM.
Bước 1: Thiết lập môi trường
Đừng bao giờ cài trực tiếp vào hệ thống. Hãy luôn dùng môi trường ảo để tránh xung đột thư viện.
# Cập nhật hệ thống
sudo apt update && sudo apt upgrade -y
# Cài đặt python venv
sudo apt install python3-venv -y
# Tạo và kích hoạt môi trường ảo
python3 -m venv mergekit_env
source mergekit_env/bin/activate
# Cài đặt MergeKit từ source
git clone https://github.com/arcee-ai/mergekit.git
cd mergekit
pip install -e .
Bước 2: Viết công thức (file YAML)
File YAML là nơi bạn định nghĩa “cuộc hôn nhân” này. Giả sử chúng ta merge hai model cùng dòng Llama-3-8B để tối ưu khả năng tiếng Việt và suy luận.
slices:
- sources:
- model: meta-llama/Meta-Llama-3-8B-Instruct
layer_range: [0, 32]
- model: NousResearch/Hermes-2-Theta-Llama-3-8B
layer_range: [0, 32]
merge_method: slerp
base_model: meta-llama/Meta-Llama-3-8B-Instruct
parameters:
t:
- filter: self_attn
value: [0, 0.5, 0.3, 0.7, 1]
- filter: mlp
value: [1, 0.5, 0.7, 0.3, 0]
- value: 0.5
dtype: bfloat16
Mẹo nhỏ: Các model bắt buộc phải có cùng cấu trúc layer và hidden size. Bạn không thể trộn một model 7B với một model 70B theo cách này đâu nhé.
Bước 3: Tiến hành Merge
Mọi thứ đã sẵn sàng. Chạy lệnh sau để MergeKit bắt đầu thực hiện phép thuật:
mergekit-yaml config.yaml ./my-merged-model --copy-tokenizer --allow-crimes
Giải thích nhanh các flag:
./my-merged-model: Nơi lưu thành phẩm.--copy-tokenizer: Giữ lại bộ giải mã ngôn ngữ từ model gốc.--allow-crimes: Cho phép xử lý nếu có sai lệch nhỏ về cấu trúc (dùng cẩn thận).
Bước 4: Kiểm chứng thành quả
Sau khi xong, thư mục đầu ra sẽ chứa các file .safetensors. Bạn có thể dùng thư viện transformers để test nhanh khả năng phản hồi của mô hình mới.
from transformers import AutoModelForCausalLM, AutoTokenizer
model_path = "./my-merged-model"
tokenizer = AutoTokenizer.from_pretrained(model_path)
model = AutoModelForCausalLM.from_pretrained(model_path, device_map="auto")
# Test thử một câu hỏi hóc búa
inputs = tokenizer("Giải thích thuyết tương đối bằng tiếng Việt đơn giản", return_tensors="pt").to("cuda")
outputs = model.generate(**inputs, max_new_tokens=150)
print(tokenizer.decode(outputs[0], skip_special_tokens=True))
Bài học xương máu khi merge model
Dù lợi hại, Model Merging không phải là “chìa khóa vạn năng”. Sau nhiều lần thử sai, mình rút ra vài điểm cần lưu ý:
Điểm cộng:
- Tạo model mới cực nhanh trên VPS cấu hình RAM cao.
- Tận dụng tối đa sức mạnh từ cộng đồng Hugging Face.
- Tùy biến linh hoạt qua cấu hình YAML.
Điểm trừ:
- Kết quả đôi khi hên xui. Model có thể bị “ngáo” nếu các thành phần xung đột quá mạnh.
- Mất thời gian tinh chỉnh tham số (tỷ lệ t) để đạt hiệu năng đỉnh nhất.
- Lỗi Chat Template thường xuyên xảy ra nếu tokenizer không đồng nhất.
Lời nhắn cho anh em Dev
MergeKit là công cụ thay đổi cuộc chơi cho những ai muốn làm AI bài bản nhưng ngân sách eo hẹp. Thay vì chạy đua vũ trang GPU, hãy tập trung vào việc chọn lọc và kết hợp các model một cách thông minh.
Hãy bắt đầu với 2 model nhỏ 7B hoặc 8B bằng phương pháp SLERP. Khi đã quen tay, bạn có thể tiến tới các phương pháp phức tạp như TIES để tạo ra những “quái vật” thực thụ trên bảng xếp hạng Open LLM Leaderboard.

