模型简介
模型特点
模型能力
使用案例
语言:
- 中文 许可证: apache-2.0 库名称: transformers 标签:
- llama
- open-llama
- mpt
- 模型融合
- fusellm 流水线标签: 文本生成 模型索引:
- 名称: FuseLLM-7B
结果:
- 任务:
类型: 文本生成
名称: 文本生成
数据集:
名称: AI2推理挑战赛 (25样本)
类型: ai2_arc
配置: ARC-挑战
分割: 测试
参数:
少量样本数: 25
指标:
- 类型: 标准化准确率 值: 53.24 名称: 标准化准确率 来源: 网址: https://huggingface.co/spaces/HuggingFaceH4/open_llm_leaderboard?query=Wanfq/FuseLLM-7B 名称: 开放LLM排行榜
- 任务:
类型: 文本生成
名称: 文本生成
数据集:
名称: HellaSwag (10样本)
类型: hellaswag
分割: 验证
参数:
少量样本数: 10
指标:
- 类型: 标准化准确率 值: 78.72 名称: 标准化准确率 来源: 网址: https://huggingface.co/spaces/HuggingFaceH4/open_llm_leaderboard?query=Wanfq/FuseLLM-7B 名称: 开放LLM排行榜
- 任务:
类型: 文本生成
名称: 文本生成
数据集:
名称: MMLU (5样本)
类型: cais/mmlu
配置: 全部
分割: 测试
参数:
少量样本数: 5
指标:
- 类型: 准确率 值: 47.93 名称: 准确率 来源: 网址: https://huggingface.co/spaces/HuggingFaceH4/open_llm_leaderboard?query=Wanfq/FuseLLM-7B 名称: 开放LLM排行榜
- 任务:
类型: 文本生成
名称: 文本生成
数据集:
名称: TruthfulQA (0样本)
类型: truthful_qa
配置: 多项选择
分割: 验证
参数:
少量样本数: 0
指标:
- 类型: mc2 值: 38.17 来源: 网址: https://huggingface.co/spaces/HuggingFaceH4/open_llm_leaderboard?query=Wanfq/FuseLLM-7B 名称: 开放LLM排行榜
- 任务:
类型: 文本生成
名称: 文本生成
数据集:
名称: Winogrande (5样本)
类型: winogrande
配置: winogrande_xl
分割: 验证
参数:
少量样本数: 5
指标:
- 类型: 准确率 值: 74.03 名称: 准确率 来源: 网址: https://huggingface.co/spaces/HuggingFaceH4/open_llm_leaderboard?query=Wanfq/FuseLLM-7B 名称: 开放LLM排行榜
- 任务:
类型: 文本生成
名称: 文本生成
数据集:
名称: GSM8k (5样本)
类型: gsm8k
配置: 主要
分割: 测试
参数:
少量样本数: 5
指标:
- 类型: 准确率 值: 14.33 名称: 准确率 来源: 网址: https://huggingface.co/spaces/HuggingFaceH4/open_llm_leaderboard?query=Wanfq/FuseLLM-7B 名称: 开放LLM排行榜
- 任务:
类型: 文本生成
名称: 文本生成
数据集:
名称: AI2推理挑战赛 (25样本)
类型: ai2_arc
配置: ARC-挑战
分割: 测试
参数:
少量样本数: 25
指标:
大型语言模型的知识融合
| 📑 论文 | 🤗 Huggingface仓库 | 🐱 Github仓库 |
万凡琪†, 黄新婷‡, 蔡登‡, 全小军†, 毕炜‡, 石文明‡
† 中山大学, ‡ 腾讯AI实验室
模型 | BBH | ARC-easy | ARC-challenge | BoolQ | HellaSwag | OpenBookQA |
---|---|---|---|---|---|---|
OpenLLaMA-7B | 33.87 | 69.70 | 41.38 | 72.29 | 74.53 | 41.00 |
MPT-7B | 33.38 | 70.12 | 42.15 | 74.74 | 76.25 | 42.40 |
Llama-2-7B | 39.70 | 74.58 | 46.33 | 77.71 | 76.00 | 44.20 |
Llama-2-CLM-7B | 40.44 | 74.54 | 46.50 | 76.88 | 76.57 | 44.80 |
🤗 FuseLLM-7B | 41.75 | 75.04 | 47.44 | 78.13 | 76.78 | 45.40 |
模型 | MultiPL-E | TrivialQA | DROP | LAMBADA | IWSLT2017 | SciBench |
---|---|---|---|---|---|---|
OpenLLaMA-7B | 18.11 | 39.96 | 22.31 | 70.31 | 5.51 | 0.68 |
MPT-7B | 17.26 | 28.89 | 23.54 | 70.08 | 5.49 | 0.88 |
Llama-2-7B | 14.63 | 52.46 | 27.25 | 73.28 | 6.48 | 0.14 |
Llama-2-CLM-7B | 14.83 | 53.14 | 28.51 | 73.45 | 6.91 | 0.94 |
🤗 FuseLLM-7B | 15.56 | 54.49 | 28.97 | 73.72 | 6.75 | 1.65 |
新闻
- 2024年1月22日: 🔥 我们发布了FuseLLM-7B,这是三个开源基础LLM的融合,包括Llama-2-7B、OpenLLaMA-7B和MPT-7B。
进行中
源LLMs | 目标LLM |
---|---|
Mixtral-8x7B-v0.1, SOLAR-10.7B-v1.0, Mistral-7B-v0.1 | Mistral-7B-v0.1 |
Mixtral-8x7B-v0.1, SOLAR-10.7B-v1.0, Mistral-7B-v0.1 | SOLAR-10.7B-v1.0 |
Mixtral-8x7B-v0.1, SOLAR-10.7B-v1.0, Mistral-7B-v0.1 | Mixtral-8x7B-v0.1 |
目录
概述
在这项研究中,我们探索了LLM知识融合的领域,以创建一个统一模型,结合多个结构多样的LLM的能力和独特优势。为此,我们引入了FuseLLM,它首先利用这些源LLM的生成分布来外化它们的集体知识和个体优势,然后通过轻量级的持续训练将它们转移到目标LLM中。
与需要并行部署多个LLM的模型集成方法不同,或通常限于架构相同的LLM的权重合并技术不同,FuseLLM旨在支持将多个架构不同的LLM融合成一个更强大的LLM。通过明确地将它们的知识和能力转移到单个目标LLM中,FuseLLM为LLM的知识融合提供了一个强大而灵活的解决方案。
模型发布
我们在🤗 Huggingface模型库上发布了FuseLLM-7B,这是三个流行的开源LLM的融合,它们具有不同的架构和功能:Llama-2-7B、OpenLLaMA-7B和MPT-7B。
以下是FuseLLM的评估结果。
通用推理与常识推理
我们首先展示了FuseLLM在Big-Bench Hard和CommonSense基准测试上的表现,分别评估了通用推理和常识推理能力。
代码生成与文本生成
然后,我们在MultiPL-E上评估了FuseLLM,这是一个多语言编程基准,用于评估代码生成性能。我们还在几个文本生成基准上进行了实验,包括TrivialQA(问答)、DROP(阅读理解)、LAMBADA(内容分析)、IWSLT2017(机器翻译)和SCIBench(定理应用)。
指令遵循
FuseLLM也适用于指令调优LLM的融合。我们进一步评估了Vicuna基准,该基准评估了指令遵循能力。
FuseLLM vs. 知识蒸馏
由于知识蒸馏也是一种通过利用表示来增强LLM性能的方法,我们将FuseLLM与从Llama-2 13B蒸馏而来的Llama-2 KD进行了比较。
FuseLLM vs. 模型集成与权重合并
为了将FuseLLM与现有的融合方法(如模型集成和权重合并)进行比较,我们模拟了确保模型融合具有相同结构的场景,其中多个源LLM来自相同的基础模型,但在不同的语料库上持续训练。然后,我们在不同的基准测试上测试了这些融合方法的困惑度。
快速开始
设置
我们在本项目中使用python 3.9
。
然后,我们需要安装requirements.txt
中列出的所有库。
pip install -r requirements.txt
使用
from transformers import AutoTokenizer, AutoModelForCausalLM
tokenizer = AutoTokenizer.from_pretrained("Wanfq/FuseLLM-7B", use_fast=False)
model = AutoModelForCausalLM.from_pretrained("Wanfq/FuseLLM-7B", torch_dtype="auto")
model.cuda()
inputs = tokenizer("<your text here>", return_tensors="pt").to(model.device)
tokens = model.generate(
**inputs,
max_new_tokens=512,
temperature=0.6,
top_p=0.9,
do_sample=True,
)
print(tokenizer.decode(tokens[0], skip_special_tokens=True))
我们还在FuseLLM-7B-exl2上找到了Exllama v2 Quantizations
版本,它使用ExLlamaV2 v0.0.11进行量化。
数据构建
我们使用MiniPile数据集进行持续训练。
这里我们展示了从多个LLM获取表示以进行模型融合的脚本。
- 分割长文本
python ./src/utils/split_long_text.py \
--base_model_name_or_path "<path_to_llama_2_7b>" \
--blending_model_name_or_path "<path_to_open_llama_7b_v2>" \
--another_blending_model_name_or_path "<path_to_mpt_7b>" \
--dataset "<path_to_minipile>" \
--dataset_save_dir "<path_to_minipile_split>" \
--cache_dir "<path_to_cache_dir>" \
--block_size 2048 \
--preprocessing_num_workers 80
- 获取每个LLM的表示
# 我们将数据集分成8个部分,然后在每个GPU上处理一个部分。
# 请为llama_2_7b、open_llama_7b_v2和mpt_7b运行此脚本。
for i in {0..7}; do
export CUDA_VISIBLE_DEVICES=${i}
python ./src/utils/forward_for_logits.py \
--model_name_or_path "<path_to_each_model>" \
--dataset "<path_to_minipile_split>" \
--dataset_save_dir "${i}_8_<path_to_minipile_split_each_model_representation>" \
--dataset_split_num 8 \
--dataset_index ${i} \
--cache_dir "<path_to_cache_dir>" \
--model_max_length 2048 \
--training_mode full \
--load_in_half bf16 \
--batch_size 8 \
--preprocessing_num_workers 80 \
--top_k_logits 10 \
--save_per_token_metric 2>&1 > "${i}_8_<path_to_log_file>" 2>&1 &
unset CUDA_VISIBLE_DEVICES
sleep 30
done
wait
- 对齐不同LLM的表示
# 获取不同LLM之间的词汇映射。
# llama_2_7b <-> open_llama_7b_v2
python ./src/utils/vocab_mapping.py \
--base_model_name_or_path "<path_to_llama_2_7b>" \
--blending_model_name_or_path "<path_to_open_llama_7b_v2>" \
--dataset_dir "<path_to_minipile_split>" \
--vocab_mapping_save_dir "<path_to_llama_2_7b_open_llama_7b_v2_vocab_mapping>" \
--cache_dir "<path_to_cache_dir>" \
--model_max_length 2048 \
--vocab_mapping_type "default" \
--num_process 1
# llama_2_7b <-> mpt_7b
python ./src/utils/vocab_mapping.py \
--base_model_name_or_path "<path_to_llama_2_7b>" \
--blending_model_name_or_path "<path_to_mpt_7b>" \
--dataset_dir "<path_to_minipile_split>" \
--vocab_mapping_save_dir "<path_to_llama_2_7b_mpt_7b_vocab_mapping>" \
--cache_dir "<path_to_cache_dir>" \
--model_max_length 2048 \
--vocab_mapping_type "default" \
--num_process 1
# 对齐不同LLM的表示。
# llama_2_7b <-> open_llama_7b_v2
for i in {0..7}; do
python ./src/utils/token_alignment.py \
--base_model_name_or_path "<path_to_llama_2_7b>" \
--blending_model_name_or_path "<path_to_open_llama_7b_v2>" \
--base_dataset_dir "${i}_8_<path_to_minipile_split_llama_2_7b_representation>" \
--blending_dataset_dir "${i}_8_<path_to_minipile_split_open_llama_7b_v2_representation>" \
--dataset_save_dir "${i}_8_<path_to_minipile_split_llama_2_7b_open_llama_7b_v2_aligned_representation>" \
--cache_dir "<path_to_cache_dir>" \
--model_max_length 2048 \
--preprocessing_num_workers 80 \
--batch_size 100 \
--blending_model_index 0 \
--vocab_align_type "soft" \
--vocab_mapping_save_dir "<path_to_llama_2_7b_open_llama_7b_v2_vocab_mapping>" \
--metric_level "sequence"
done
# llama_2_7b <-> mpt_7b
for i in {0..7}; do
python ./src/utils/token_alignment.py \
--base_model_name_or_path "<path_to_llama_2_7b>" \
--blending_model_name_or_path "<path_to_mpt_7b>" \
--base_dataset_dir "${i}_8_<path_to_minipile_split_llama_2_7b_open_llama_7b_v2_aligned_representation>" \
--blending_dataset_dir "${i}_8_<path_to_minipile_split_mpt_7b_representation>" \
--dataset_save_dir "${i}_8_<path_to_minipile_split_llama_2_7b_open_llama_7b_v2_mpt_7b_aligned_representation>" \
--cache_dir "<path_to_cache_dir>" \
--model_max_length 2048 \
--preprocessing_num_workers 80 \
--batch_size 100 \
--blending_model_index 1 \
--vocab_align_type "soft" \
--vocab_mapping_save_dir "<path_to_llama_2_7b_mpt_7b_vocab_mapping>" \
--metric_level "sequence"
done
- 打包所有特征以加速训练。
for i in {0..7}; do
python3 ./src/utils/packing.py \
--dataset_dir "${i}_8_<path_to_minipile_split_llama_2_7b_open_llama_7b_v2_mpt_7b_aligned_representation>" \
--dataset_save_dir "${i}_8_<path_to_miniplie_fusellm_processed>" \
--cache_dir "<path_to_cache_dir>" \
--model_max_length 2048 \
--preprocessing_num_workers 80 \
--batch_size 1000 \
--metric_level "sequence"
最终处理的数据位于${i}_8_<path_to_miniplie_fusellm_processed>
,其中i in {0..7}
。
训练
这里,我们展示了FuseLLM训练的脚本。
export CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7
deepspeed --master_port=20001 ./src/train.py \
--training_mode full \
--deepspeed ./config/zero_stage2_config.json \
--model_name_or_path "<path_to_llama_2_7b>" \
--output_dir "<path_to_save_fusellm_7b>" \
--model_max_length 2048 \
--logging_steps 1 \
--save_strategy steps \
--save_steps 500 \
--save_total_limit 1 \
--evaluation_strategy steps \
--per_device_eval_batch_size 1 \
--logging_strategy steps \
--do_train \
--do_eval \
--bf16 True \
--tf32 True \
--warmup_ratio 0.008 \
--lr_scheduler_type cosine \
--dataset_name "0_8_<path_to_miniplie_fusellm_processed>,1_8_<path_to_miniplie_fusellm_processed>,2_8_<path_to_miniplie_fusellm_processed>,3_8_<path_to_miniplie_fusellm_processed>,4_8_<path_to_miniplie_fusellm_processed>,5_8_<path_to_miniplie_fusellm_processed>,6_8_<path_to_miniplie_fusellm_processed>,7_8_<path_to_miniplie_fusellm_processed>" \
--per_device_train_batch_size 1 \
--gradient_accumulation_steps 16 \
--num_train_epochs 1 \
--eval_steps 500 \
--optim adamw_torch \
--adam_beta1 0.9 \
--adam_beta2 0.95 \
--learning_rate 1e-5 \
--weight_decay 0.1 \
--max_grad_norm 1.0 \
--seed 42 \
--gradient_checkpointing True \
--use_flash_attn True \
--report_to tensorboard \
--do_distill \
--distill_with_ref_model True \
--distill_with_aligned_model_0 True \
--distill_with_aligned_model_1 True \
--distill_loss_type "ce" \
--distill_teacher_temperature 1.0 \
--lm_loss_weight 0.9 \
--distill_greater_as_gt True \
--distill_greater_as_gt_type "hard" \
--dataloader_num_workers 10 \
--remove_unused_columns False 2>&1 | tee "<path_to_log_file>"
评估
我们在评估中使用的评估代码如下:
- Big-Bench Hard
- CommonSense: ARC-easy, ARC-challenge, BoolQ, HellaSwag, OpenBookQA
- MultiPL-E
- 文本生成: TrivialQA, DROP, LAMBADA, IWSLT2017, SciBench
- Vicuna Bench
引用
如果您发现这项工作与您的研究或应用相关,请随时引用我们的工作!
@inproceedings{wan2024knowledge,
title={Knowledge Fusion of Large Language Models},
author={Fanqi Wan and Xinting Huang and Deng Cai and Xiaojun Quan and Wei Bi and Shuming Shi},
booktitle={The Twelfth International Conference on Learning Representations},
year={2024},
url={https://openreview.net/pdf?id=jiDsk12qcz}
}
开放LLM排行榜评估结果
详细结果可在此处找到这里
指标 | 值 |
---|---|
平均 | 51.07 |
AI2推理挑战赛 (25样本) | 53.24 |
HellaSwag (10样本) | 78.72 |
MMLU (5样本) | 47.93 |
TruthfulQA (0样本) | 38.17 |
Winogrande (5样本) | 74.03 |
GSM8k (5样本) | 14.33 |


