🧬
모델 머징 — 진짜로 두 모델을 \"합치는\" 유일한 방법
한국어 모델 + 코딩 모델 = 한국어로 코딩하는 모델? 가중치 평균으로 합친다
AI에서 유일한 "합치기"
파인튜닝, LoRA, RAG — 전부 합치기가 아니라고 했다. 근데 모델 머징은 진짜로 합치는 것이다.
모델A의 가중치: [0.50, -0.30, 0.80, ...]
모델B의 가중치: [0.40, -0.10, 0.60, ...]
합친 모델: [0.45, -0.20, 0.70, ...] ← 평균
두 모델의 66M개 숫자를 하나하나 평균내서 새 모델을 만든다. 훈련이 필요 없다. 그냥 숫자를 더해서 2로 나누는 것이다.
왜 이게 되나?
같은 베이스 모델(예: LLaMA 7B)에서 파인튜닝된 두 모델은 가중치가 비슷하다. 출발점이 같으니까.
LLaMA 7B (베이스)
├→ 한국어 파인튜닝 → 한국어 모델 (가중치가 살짝 다름)
└→ 코딩 파인튜닝 → 코딩 모델 (가중치가 살짝 다름)
두 모델을 평균 → 한국어 + 코딩 둘 다 가능한 모델 (이론상)
파인튜닝이 "숫자를 살짝 조정"하는 거니까, 두 조정 결과를 평균내면 두 능력이 합쳐질 수 있다.
가장 간단한 머징 코드
pip install mergekit
# merge_config.yaml
slices:
- sources:
- model: "모델A" # 한국어 특화 모델
layer_range: [0, 32]
- model: "모델B" # 코딩 특화 모델
layer_range: [0, 32]
merge_method: linear # 단순 평균
base_model: "모델A"
parameters:
weight: 0.5 # A:B = 50:50
dtype: float16
mergekit-yaml merge_config.yaml ./merged-model
# → GPU 없이 CPU에서 실행 가능
# → ./merged-model/ 에 합쳐진 모델이 저장됨
Python으로 직접 하면 이게 전부:
import torch
# 1. 두 모델의 가중치 로드
weights_a = torch.load("model_a/model.safetensors")
weights_b = torch.load("model_b/model.safetensors")
# 2. 평균
merged = {}
for key in weights_a:
merged[key] = (weights_a[key] + weights_b[key]) / 2
# 3. 저장
torch.save(merged, "merged_model/model.safetensors")
# 끝. 훈련 없음. GPU 없음. 그냥 산술.
진짜 숫자를 더해서 2로 나누는 것이다. 이보다 더 단순한 "합치기"는 없다.
머징 방법들
단순 평균 외에도 여러 방법이 있다:
| 방법 | 설명 | 비유 |
|---|---|---|
| Linear (평균) | 두 모델의 가중치를 50:50 평균 | 두 물감을 섞기 |
| SLERP | 구면 보간 (방향을 유지하며 합침) | 두 벡터 사이를 호를 그리며 이동 |
| TIES | 중요한 가중치만 골라서 합침 | 두 팀의 에이스만 모아 드림팀 |
| DARE | 불필요한 가중치를 0으로 만들고 합침 | 정리 후 합치기 |
한계 — 보장되지 않는다
모델 머징은 실험적이다. 되는 경우도 있고 안 되는 경우도 있다.
✅ 잘 되는 경우:
- 같은 베이스 모델에서 파인튜닝된 모델끼리
- 비슷한 도메인 (한국어 + 일본어)
- 보완적 능력 (언어 + 코딩)
❌ 안 되는 경우:
- 다른 아키텍처의 모델끼리 (BERT + GPT-2)
- 너무 다른 도메인 (의료 + 음악)
- 가중치가 너무 많이 달라진 경우
파인튜닝 vs LoRA vs RAG vs 머징
| 파인튜닝 | LoRA | RAG | 모델 머징 | |
|---|---|---|---|---|
| 가중치 변경 | 전부 조정 | 일부 (어댑터) | 안 바꿈 | 두 모델을 평균 |
| 훈련 | 필요 | 필요 | 불필요 | 불필요 |
| GPU | 필요 | 필요 | 불필요 | 불필요 |
| 결과 보장 | 높음 | 높음 | 높음 | 낮음 (실험적) |
| 비유 | 교육 | 플러그인 | 참고자료 | 합체 |
핵심
모델 머징은 AI에서 유일하게 "더하기"에 해당한다. 숫자를 더해서 나누는 것. 훈련도 필요 없고 GPU도 필요 없다. 근데 결과가 보장되지 않는다 — 잘 되면 두 능력이 합쳐지고, 안 되면 둘 다 망가진다.
핵심 개념
1
같은 베이스에서 파인튜닝된 모델 2개를 준비한다 (예: 한국어 모델 + 코딩 모델)
2
두 모델의 가중치를 로드한다
3
66M개 숫자를 하나하나 평균낸다 — (A + B) / 2
4
합쳐진 가중치를 저장한다 — 훈련 없음, GPU 없음
5
테스트해본다 — 두 능력이 합쳐졌는지 확인 (보장 안 됨)
사용 사례
다국어 + 전문 도메인 합치기 — 한국어 모델 + 의료 모델 = 한국어 의료 모델
GPU 없이 모델 개선 — 훈련 없이 가중치 산술만으로 새 모델 생성
커뮤니티 모델 조합 — HuggingFace의 여러 파인튜닝 모델을 합쳐서 실험