
Для смешивания моделей используем 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
Отправить ответ
Для отправки комментария вам необходимо авторизоваться.