# Слияние моделей Mergekit

**Mergekit** это окончательный набор инструментов для слияния предварительно обученных больших языковых моделей. С более чем 5 тыс. звёзд на GitHub он реализует все основные алгоритмы слияния моделей — SLERP, TIES, DARE, DARE-TIES, слияние MoE и другие — позволяя создавать мощные новые модели без каких-либо обучающих данных или времени обучения на GPU.

{% hint style="success" %}
Все примеры можно запускать на GPU-серверах, арендуемых через [CLORE.AI Маркетплейс](https://clore.ai/marketplace).
{% endhint %}

***

## Что такое Mergekit?

Слияние моделей — это мощная техника, которая объединяет сильные стороны нескольких LLM в одну модель:

* **Обучение не требуется** — слияние происходит в пространстве весов, а не через обратное распространение ошибки
* **Комбинирование возможностей** — смешайте модель для кодирования с моделью, выполняющей инструкции
* **Снижение слабостей** — усредняйте индивидуальные сбои моделей в ансамбле
* **Создание Mixture of Experts** — объединяйте модели в разреженную архитектуру MoE
* **Адаптация к домену** — объединение базовой модели со специализированными доменными моделями

Mergekit реализует все современные алгоритмы:

| Алгоритм            | Описание                                               | Лучше всего для                                            |
| ------------------- | ------------------------------------------------------ | ---------------------------------------------------------- |
| **SLERP**           | Сферическая линейная интерполяция между двумя моделями | Плавное смешение двух похожих моделей                      |
| **TIES**            | Обрезка избыточных параметров, выбор знаков, слияние   | Комбинирование нескольких моделей с минимальными помехами  |
| **DARE**            | Отбрасывание и пересcaling случайных параметров        | Снижение взаимного влияния параметров при больших слияниях |
| **DARE-TIES**       | Комбинация DARE + TIES                                 | Лучшее универсальное решение для слияний множества моделей |
| **Linear**          | Простое взвешенное усреднение                          | Быстрые базовые слияния                                    |
| **Task Arithmetic** | Сложение/вычитание векторов задач                      | Добавление/удаление конкретных возможностей                |
| **Passthrough**     | Копирование слоёв напрямую                             | Конструкция MoE                                            |

{% hint style="info" %}
Слияние моделей оказывается удивительно эффективным. Слитыe модели часто превосходят родительские на бенчмарках, комбинируя дополняющие знания. Сообщество MergeKit на HuggingFace хранит тысячи слитых моделей.
{% endhint %}

***

## Требования к серверу

| Компонент | Минимум                                | Рекомендуется                     |
| --------- | -------------------------------------- | --------------------------------- |
| GPU       | Не требуется (возможно слияние на CPU) | A100 40 ГБ для больших моделей    |
| VRAM      | —                                      | 80 ГБ для слияния моделей 70B     |
| ОЗУ       | 32 ГБ                                  | 64 ГБ+ (модели загружаются в ОЗУ) |
| CPU       | 8 ядер                                 | 16+ ядер                          |
| Хранилище | 100 ГБ                                 | 500 ГБ+                           |
| ОС        | Ubuntu 20.04+                          | Ubuntu 22.04                      |
| Python    | 3.10+                                  | 3.11                              |

{% hint style="warning" %}
Для слияния только на CPU (наиболее распространённый режим) узким местом является ОЗУ. Для слияния двух 7B моделей в bf16 требуется минимум \~28 ГБ ОЗУ. Используйте `--lazy-unpickle` для уменьшения использования памяти.
{% endhint %}

***

## Порты

| Порт | Сервис | Примечания                           |
| ---- | ------ | ------------------------------------ |
| 22   | SSH    | Доступ к терминалу и передача файлов |

Mergekit запускается как инструмент командной строки — веб-сервер не нужен.

***

## Установка на Clore.ai

### Шаг 1 — Аренда сервера

1. Перейдите на [Clore.ai Marketplace](https://clore.ai/marketplace)
2. Отфильтруйте по **ОЗУ ≥ 64 ГБ** (критично для слияния больших моделей)
3. Выберите **Хранилище ≥ 500 ГБ** (слитые модели требуют места для 2–4 входных моделей + выходной)
4. GPU не обязателен, но полезен, если вы хотите протестировать слитую модель после слияния
5. Откройте порт **22** только

### Шаг 2 — Подключение по SSH

```bash
ssh root@<server-ip> -p <ssh-port>
```

### Шаг 3 — Установите окружение Python

```bash
# Установить Python 3.11
apt-get update
apt-get install -y python3.11 python3.11-venv python3.11-pip git

# Создать виртуальное окружение
python3.11 -m venv /opt/mergekit
source /opt/mergekit/bin/activate
```

### Шаг 4 — Установите Mergekit

```bash
# Установка из PyPI
pip install mergekit

# Или установка из исходников (рекомендуется для последних функций)
git clone https://github.com/arcee-ai/mergekit.git
cd mergekit
pip install -e '.[everything]'
```

### Шаг 5 — Установите HuggingFace CLI

```bash
pip install huggingface_hub
huggingface-cli login  # Введите ваш HF токен
```

### Шаг 6 — Проверьте установку

```bash
mergekit --help
mergekit-yaml --help
```

***

## Загрузка моделей для слияния

```bash
# Скачайте модели, которые хотите слить
# Используя huggingface_hub

python3 << 'EOF'
from huggingface_hub import snapshot_download

# Скачивание модели 1
snapshot_download(
    repo_id="mistralai/Mistral-7B-Instruct-v0.3",
    local_dir="models/Mistral-7B-Instruct-v0.3"
)

# Скачивание модели 2
snapshot_download(
    repo_id="meta-llama/Llama-3.2-8B-Instruct",
    local_dir="models/Llama-3.2-8B-Instruct",
    token="hf_your-token"  # Требуется для закрытых моделей
)
EOF

# Или используйте CLI huggingface_hub
huggingface-cli download mistralai/Mistral-7B-Instruct-v0.3 \
  --local-dir models/Mistral-7B-Instruct-v0.3
```

***

## Конфигурации слияния

Mergekit использует YAML файлы конфигурации для определения слияний.

### Пример 1: SLERP слияние (две модели)

SLERP смешивает две модели вдоль сферической дуги — лучше всего для моделей одной архитектуры:

```yaml
# slerp_merge.yaml
models:
  - model: models/Mistral-7B-Instruct-v0.3
  - model: models/OpenHermes-2.5-Mistral-7B

merge_method: slerp
base_model: models/Mistral-7B-Instruct-v0.3

slices:
  - sources:
    - model: models/Mistral-7B-Instruct-v0.3
      layer_range: [0, 32]
    - model: models/OpenHermes-2.5-Mistral-7B
      layer_range: [0, 32]

parameters:
  t:
    - filter: self_attn
      value: 0.5  # 50/50 смешение для слоёв внимания
    - filter: mlp
      value: 0.3  # 30% от модели 2 для MLP слоёв
    - value: 0.5  # значение по умолчанию для всего остального

dtype: bfloat16
```

```bash
mergekit-yaml slerp_merge.yaml merged-model/ --lazy-unpickle
```

### Пример 2: TIES слияние (несколько моделей)

TIES решает проблемы интерференции между множеством слитых моделей:

```yaml
# ties_merge.yaml
models:
  - model: models/Mistral-7B-v0.3
    parameters:
      weight: 1.0    # Базовая модель, полный вес
      density: 1.0

  - model: models/Mistral-7B-coding
    parameters:
      weight: 0.7    # Возможность кодирования
      density: 0.5   # Сохранять 50% изменённых параметров

  - model: models/Mistral-7B-math
    parameters:
      weight: 0.5    # Математическая способность
      density: 0.3   # Сохранять 30% изменённых параметров

merge_method: ties
base_model: models/Mistral-7B-v0.3

parameters:
  normalize: true
  int8_mask: true

dtype: bfloat16
```

```bash
mergekit-yaml ties_merge.yaml merged-ties/ --lazy-unpickle
```

### Пример 3: DARE-TIES слияние (лучшее универсальное)

```yaml
# dare_ties_merge.yaml
models:
  - model: models/Llama-3.2-8B-Instruct
    parameters:
      weight: 1.0
      density: 0.7
      dare_linear: true

  - model: models/Llama-3.2-8B-code
    parameters:
      weight: 0.8
      density: 0.5
      dare_linear: true

  - model: models/Llama-3.2-8B-math
    parameters:
      weight: 0.6
      density: 0.4
      dare_linear: true

merge_method: dare_ties
base_model: models/Llama-3.2-8B-Instruct

parameters:
  normalize: true
  dare_density: 0.5
  dare_epsilon: 0.08

dtype: bfloat16
```

```bash
mergekit-yaml dare_ties_merge.yaml merged-dare-ties/ --lazy-unpickle
```

### Пример 4: Task Arithmetic (добавление возможностей)

Добавьте «дельту навыка» к базовой модели:

```yaml
# task_arithmetic.yaml
# Добавляет математический навык из модели, настроенной на математику, к общей базовой модели
models:
  - model: models/Llama-3.2-8B-Instruct
    parameters:
      weight: 1.0
  
  - model: models/Llama-3.2-8B-math
    parameters:
      weight: 0.7   # Положительное = добавляет эту способность
  
  # Для УДАЛЕНИЯ способности используйте отрицательный вес:
  # - model: models/Llama-3.2-8B-harmful
  #   parameters:
  #     weight: -0.5

merge_method: task_arithmetic
base_model: models/Llama-3.2-8B-Instruct

dtype: bfloat16
```

### Пример 5: MoE (Mixture of Experts)

Объединение моделей в разреженную архитектуру MoE:

```yaml
# moe_merge.yaml
base_model: models/Llama-3.2-8B-Instruct

gate_mode: hidden  # Использовать скрытые состояния для маршрутизации к экспертам
dtype: bfloat16
experts:
  - source_model: models/Llama-3.2-8B-coding
    positive_prompts:
      - "Write code"
      - "Debug this function"
      - "Implement an algorithm"
    negative_prompts:
      - "Tell me a story"
      - "Explain history"
  
  - source_model: models/Llama-3.2-8B-creative
    positive_prompts:
      - "Write a story"
      - "Be creative"
      - "Imagine"
    negative_prompts:
      - "Write code"
      - "Calculate"
```

```bash
mergekit-moe moe_merge.yaml merged-moe/ --lazy-unpickle
```

***

## Запуск слияния

### Базовая команда

```bash
# Активировать окружение
source /opt/mergekit/bin/activate

# Запуск слияния с ленивой распаковкой (экономит ОЗУ)
mergekit-yaml your_config.yaml output_model/ --lazy-unpickle

# С ускорением через CUDA (если доступен GPU)
mergekit-yaml your_config.yaml output_model/ \
  --lazy-unpickle \
  --cuda \
  --copy-tokenizer

# Режим низкого потребления памяти (медленнее, но работает на небольших серверах)
mergekit-yaml your_config.yaml output_model/ \
  --lazy-unpickle \
  --low-cpu-memory
```

### Мониторинг прогресса

```bash
# Mergekit показывает прогресс для каждого слоя
# Типичный вывод:
# Загрузка модели 1...
# Загрузка модели 2...
# Слияние слоя 0/32: embed_tokens
# Слияние слоя 1/32: layers.0.self_attn
# ...
# Сохранение слитой модели...
# Готово! Сохранено в output_model/
```

***

## Тестирование слитой модели

```bash
# Быстрый тест с transformers
python3 << 'EOF'
from transformers import AutoTokenizer, AutoModelForCausalLM
import torch

model_path = "output_model"
tokenizer = AutoTokenizer.from_pretrained(model_path)
model = AutoModelForCausalLM.from_pretrained(
    model_path,
    torch_dtype=torch.bfloat16,
    device_map="auto"
)

prompt = "Объясните разницу между LoRA и полным дообучением:"
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)

with torch.no_grad():
    outputs = model.generate(**inputs, max_new_tokens=200, temperature=0.7)

print(tokenizer.decode(outputs[0], skip_special_tokens=True))
EOF
```

***

## Публикация на HuggingFace

```bash
# Вход в систему
huggingface-cli login

# Создать и запушить репозиторий
python3 << 'EOF'
from huggingface_hub import HfApi
api = HfApi()

# Создать репозиторий
api.create_repo("my-merged-model-7b", private=False)

# Загрузить слитую модель
api.upload_folder(
    folder_path="output_model/",
    repo_id="your-username/my-merged-model-7b",
    repo_type="model"
)
print("Uploaded!")
EOF
```

***

## Продвинуто: эволюционное слияние

Используйте эволюционный оптимизатор Mergekit для поиска оптимальных весов слияния:

```bash
# Установите эволюционный оптимизатор
pip install 'mergekit[evo]'

# Запустите эволюционный поиск
mergekit-evolve evolve_config.yaml \
  --storage-path ./evolve-workspace \
  --n-iterations 100 \
  --task mmlu  # Оптимизация для бенчмарка MMLU
```

***

## Устранение неполадок

### Недостаточно памяти (OOM) во время слияния

```bash
# Всегда используйте --lazy-unpickle для больших моделей
mergekit-yaml config.yaml out/ --lazy-unpickle

# Добавьте флаг --low-cpu-memory
mergekit-yaml config.yaml out/ --lazy-unpickle --low-cpu-memory

# Проверьте доступную ОЗУ перед слиянием
free -h

# Для моделей 7B требуется минимум ~30 ГБ ОЗУ
# Для моделей 13B: ~60 ГБ ОЗУ
# Для моделей 70B: ~280 ГБ ОЗУ (или используйте сервер с большим объёмом ОЗУ для CPU)
```

### `ValueError: модели несовместимы`

```bash
# Модели должны иметь одинаковую архитектуру
# Нельзя прямо слить Llama-3 с Mistral
# Проверьте конфигурации моделей
python3 -c "
import json
for path in ['models/model1/config.json', 'models/model2/config.json']:
    with open(path) as f:
        cfg = json.load(f)
    print(path, ':', cfg.get('model_type'), cfg.get('hidden_size'), cfg.get('num_hidden_layers'))
"
```

### Слияние очень медленное

```bash
# Используйте GPU для ускорения операций с тензорами
mergekit-yaml config.yaml out/ --lazy-unpickle --cuda

# Убедитесь, что установлен PyTorch с поддержкой CUDA
python3 -c "import torch; print(torch.cuda.is_available())"

# Если CUDA недоступна, установите её:
pip install torch --index-url https://download.pytorch.org/whl/cu121
```

### Слитая модель даёт бессмыслицу

```bash
# Частые причины:
# 1. Слияние несопоставимых семейств моделей (например, Llama + Mistral)
# 2. Слишком экстремальные веса (t=0 или t=1 вместо 0.3–0.7 для SLERP)
# 3. Слишком высокая плотность в TIES (попробуйте density: 0.3–0.5)

# Диагностика: сначала протестируйте каждую родительскую модель
# Затем попробуйте SLERP 50/50 как базу

# Проверьте конфиг слитой модели
cat output_model/config.json | python3 -m json.tool
```

### `FileNotFoundError` для файлов модели

```bash
# Перечислите, что было скачано
ls -la models/your-model/

# Требуемые файлы:
# config.json, tokenizer.json, *.safetensors (или *.bin)

# Перекачайте с принудительным режимом
huggingface-cli download <repo_id> --local-dir models/<name> --force-download
```

***

## Популярные рецепты слияния

### General Assistant + Coding

```yaml
# Отлично подходит для разработчиков, которые также хотят общие возможности
models:
  - model: mistralai/Mistral-7B-Instruct-v0.3
    parameters: {weight: 1.0, density: 0.7}
  - model: mistralai/Codestral-7B  
    parameters: {weight: 0.8, density: 0.5}

merge_method: dare_ties
base_model: mistralai/Mistral-7B-Instruct-v0.3
dtype: bfloat16
```

### Multilingual Boost

```yaml
# Добавьте многоязычные возможности к англоязычной модели
models:
  - model: meta-llama/Llama-3.2-8B-Instruct
    parameters: {weight: 1.0, density: 0.8}
  - model: utter-project/EuroLLM-9B-Instruct
    parameters: {weight: 0.6, density: 0.4}

merge_method: ties
base_model: meta-llama/Llama-3.2-8B-Instruct
dtype: bfloat16
```

***

## Полезные ссылки

* **GitHub**: <https://github.com/arcee-ai/mergekit> ⭐ 5K+
* **Документация**: <https://github.com/arcee-ai/mergekit/wiki>
* **Модели MergeKit на HuggingFace**: <https://huggingface.co/models?other=mergekit>
* **Arcee.ai Discord**: <https://discord.gg/arcee>
* **Статья TIES**: <https://arxiv.org/abs/2306.01708>
* **Статья DARE**: <https://arxiv.org/abs/2311.03099>
* **Clore.ai Marketplace**: <https://clore.ai/marketplace>

***

## Рекомендации Clore.ai по GPU

| Сценарий использования   | Рекомендуемый GPU | Примерная стоимость на Clore.ai |
| ------------------------ | ----------------- | ------------------------------- |
| Разработка/Тестирование  | RTX 3090 (24GB)   | \~$0.12/gpu/hr                  |
| Слияние моделей (7B–13B) | RTX 4090 (24GB)   | \~$0.70/gpu/hr                  |
| Крупные модели (70B+)    | A100 80GB         | \~$1.20/gpu/hr                  |
| Мульти-GPU слияние       | 2-4x A100 80GB    | \~$2.40–$4.80/hr                |

> 💡 Все примеры в этом руководстве можно развернуть на [Clore.ai](https://clore.ai/marketplace) GPU-серверах. Просматривайте доступные GPU и арендуйте по часам — без обязательств, с полным root-доступом.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.clore.ai/guides/guides_v2-ru/obuchenie/mergekit.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
