Смешивание разных моделей LLM в новую модель

Для смешивания моделей используем mergekit. 

Его установка — запустим консоль (git должен уже быть установлен):

git clone https://github.com/arcee-ai/mergekit.git

Создадим виртуальное окружение, чтобы небыло несовместимости с версиями модулей уже установленных в ОС.
python -m venv venv

Активируем среду (для Windows):
venv\Scripts\activate.bat
Перейдем в папку mergekit:
cd mergekit

Установим зависисмости (в конце стоит точка - ее тоже вводить):
pip install -e . 

Выйдем на уровень выше из папки
cd ..
Создадим конфигурационный файл для смешивания (не в папке mergekit, а выше, куда уже вышли) - любое название с расширением yaml, 
пусть - mconf.yaml 
Внутри файла:
slices:
- sources:
- model: NousResearch/Hermes-2-Pro-Mistral-7B
layer_range: [0, 7]
- model: Intelligent-Internet/II-Medical-8B
layer_range: [0, 7]
merge_method: slerp

base_model: NousResearch/Nous-Hermes-2-SOLAR-10.7B
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

slices:  - раздел со списком моделей
Далее указываем первую модель NousResearch/Hermes-2-Pro-Mistral-7B - это копипаст с сайта huggigface,
там рядом с названием модели есть кнопочка копировать путь. 
- sources:   
- model: NousResearch/Hermes-2-Pro-Mistral-7B
layer_range: [0, 7]   - укажем какие слои сливать, в данном случае сольются 0 и 7 слой. 

Вторая модель с которой идет слияние:
- model: Intelligent-Internet/II-Medical-8B
Слои такие же смешиваем - 0 и 7 (возможно означает с 0 по 7 - переводчик непонятно переводит)
layer_range: [0, 7]

Метод слияния
merge_method: slerp
Это сферический линейный интерполятор, более точный, чем линейный, обычно его используют.
Из минусов - можно смешать за раз только 2 модели.

Далее указываем, какая модель из смешиваемых будет основной.

base_model: NousResearch/Nous-Hermes-2-SOLAR-10.7B

Далее параметры смешивания

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]

Суть такая — уровень слияния — 1 модель , ниже вторая

[0, 0.5, 0.3, 0.7, 1] 

[1, 0.5, 0.7, 0.3, 0]

В первой — первое число 0, а в нижней 1, т.е. из первой модели не будет взято ничего, а из второй все.

1 = 100%

следующее значение 0,5 и 0,5 — каждая модель смешается пополам — половина от одной ,половина от другой.

Следующее значение 0,3 и 0,7. От первой модели возьмется 0,3 — это 30%, а от второй возьмется 0,7  — 70%. 

И в конце  от первой модели берется 100% (1), а от второй ничего (0).

Далее значение

— value: 0.5

Означает, что все остальные параметры, которые еще есть в моделях будут смешиваться пополам 50 на 50%.

Тип итоговой модели (точность — 16 бит с плавающей запятой )
dtype: bfloat16

Все это сохраняем как файл mconf.yaml:

slices:
- sources:
- model: NousResearch/Hermes-2-Pro-Mistral-7B
layer_range: [0, 7]
- model: Intelligent-Internet/II-Medical-8B
layer_range: [0, 7]
merge_method: slerp

base_model: NousResearch/Nous-Hermes-2-SOLAR-10.7B
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

Создадим папку для помещения смешенной итоговой модели — merged:

mkdir merged

Теперь выполняем команду:
mergekit-yaml mconf.yaml ./merged --allow-crimes --copy-tokenizer --out-shard-size 1B --low-cpu-memory --write-model-card --lazy-unpickle

mconf.yaml - файл конфигурации, что с чем и как смешивать. 
./merged  - путь к папке с итоговым результатом
--allow-crimes и --out-shard-size для разделения моделей на более мелкие фрагменты, 
которые можно обрабатывать на процессоре с небольшим объёмом оперативной памяти
--lazy-unpickle чтобы включить экспериментальный ленивый распаковщик для экономии памяти
Кроме того, для некоторых моделей может потребоваться флаг --trust_remote_code (в случае с Mistral-7B это не так).
--copy-tokenizer чтобы скопировать токенизатор из базовой модели

После выполнения команды mergekit-yaml mconf.yaml ./merged --allow-crimes --copy-tokenizer --out-shard-size 1B --low-cpu-memory --write-model-card --lazy-unpickle
получим смешенную модель, которая может быть лучше прежних. Например в модель с лекарственными 
препаратами подмешаем модель с медицинскими данными по заболеваниям.
Данный метод производит слияние на процессоре, для использования видеокарты нужна другая настройка и команда.
Что-то типа:
mergekit-yaml mconf.yaml merge --copy-tokenizer --cuda --low-cpu-memory


 

Оставьте первый комментарий

Отправить ответ