Mergoo 项目介绍
Mergoo 是一个帮助用户轻松合并多个大语言模型(LLM)专家,并有效地训练合并后的LLM的库。通过使用Mergoo,用户可以便捷地整合不同通用或基于特定领域的LLM专业知识。
🚀 主要特性
- 支持多种合并方法:专家混合(Mixture-of-Experts)、适配器混合(Mixture-of-Adapters)和逐层合并。
- 为每一层提供灵活的合并选项。
- 支持的基础模型包括:Llama、Mistral、Phi3和BERT。
- 支持的训练器包括:🤗 Trainer、SFTrainer 和 PEFT。
- 支持的设备包括:CPU、MPS、GPU。
- 提供两种训练选项:仅MoE层的路由器,或对合并后的LLM进行完全微调。
安装方法
使用pip安装:
pip install mergoo
从GitHub安装最新不稳定版本:
pip install git+https://github.com/Leeroo-AI/mergoo
从源代码安装:
git clone https://github.com/Leeroo-AI/mergoo
cd mergoo
pip install -e .
快速开始
配置设置
指定合并的配置:
model_type
:基础模型类型,可选项包括mistral
、llama
或bert
。num_experts_per_token
:每个MoE令牌的专家数量。experts
:要合并的专家配置,包括expert_name
和Hugging Face 🤗 的model_id
。router_layers
:选择用于应用专家混合的层。
以下是合并完全微调LLM专家时的示例配置:
config = {
"model_type": "mistral",
"num_experts_per_tok": 2,
"experts": [
{"expert_name": "base_expert", "model_id": "mistralai/Mistral-7B-v0.1"},
{"expert_name": "expert_1", "model_id": "meta-math/MetaMath-Mistral-7B"},
{"expert_name": "expert_2", "model_id": "ajibawa-2023/Code-Mistral-7B"}
],
"router_layers": ["gate_proj", "up_proj", "down_proj"]
}
这个配置中合并了以Math和Code为基础的Mistral专家。详情请参考此示例笔记本。
适配器的混合(LoRA上的MoE)
这是合并LoRA微调LLM专家时的示例配置。mergoo
在LoRA之上构建一个路由层,形成一个适配器混合。
config = {
"model_type": "mistral",
"num_experts_per_tok": 2,
"base_model": "mistralai/Mistral-7B-v0.1",
"experts": [
{"expert_name": "adapter_1", "model_id": "predibase/customer_support"},
{"expert_name": "adapter_2", "model_id": "predibase/customer_support_accounts"},
{"expert_name": "adapter_3", "model_id": "predibase/customer_support_orders"},
{"expert_name": "adapter_4", "model_id": "predibase/customer_support_payments"}
],
}
请注意,这里的expert_name
以adapter
开头而不是expert
。更多详情请参阅此示例笔记本。
合并专家
根据配置,mergoo
可以创建合并后的LLM:
import torch
from mergoo.compose_experts import ComposeExperts
# 创建检查点
model_id = "data/mistral_lora_moe"
expertmerger = ComposeExperts(config, torch_dtype=torch.float16)
expertmerger.compose()
expertmerger.save_checkpoint(model_id)
加载 / 微调合并后的专家
现在,用户可以使用Hugging Face Trainer轻松训练合并后的LLM:
from transformers import Trainer
from mergoo.models.modeling_mistral import MistralForCausalLM
model = MistralForCausalLM.from_pretrained("data/mistral_lora_moe")
# 注意:‘gate’ / 路由器层是未训练的,因此加载权重时会出现警告
trainer = Trainer( ... )
trainer.train()
📚 了解更多
完成快速开始指南后,用户可以探索以下教程以进一步熟悉Mergoo:
Mergoo 路线图和贡献
作为一个开放源代码库,Mergoo欢迎各种贡献,包括引入新特性、增强基础设施或改进文档。
目前的Mergoo路线图包括:
- 支持变形器块的MoE
- 与Hugging Face 🤗的兼容性
- 支持Trainer,SFTrainer
- 在BTX中加载统一检查点
- 新特性:可转换的QKV线性层
- 新特性:可转换的FF线性层
- 新特性:仅用于解码层索引列表的路由器
- 分片的Safetensor保存
- 支持基于LLaMa和Mistral的专家
- 支持基于Phi3的专家
- 支持适配器的专家混合(适配器混合)
- 计划中的支持:路由器负载均衡损失、合并时低内存使用的延迟加载、支持其他逐层合并方法、支持基于Gemma和Mamba的专家、支持闪存注意力和深度变换器混合。
欢迎任何新功能建议或对Mergoo路线图的贡献!
加入社区
Mergoo 团队期待您的反馈,您可以通过以下渠道加入Leeroo社区:
如果您有任何未解决的问题,可以在GitHub中创建Issue或发送电子邮件至support@leeroo.com。