羽人是基于 baichuan-inc/baichuan-7B 进行多任务有监督微调的开源多模态大语言模型, 建立在 Pleisto 的以数据为中心(Data-centric AI)的工作上。羽人在多轮对话、开放域问答、角色扮演、文本生成、文本理解、图片理解等多个任务上均拥有优异的表现。
YuRen is a multi-modal large language model based on baichuan-inc/baichuan-7B and trained with multi-task supervised fine-tuning. It is built on top of Pleisto's data-centric AI work. YuRen has excellent performance on multi-turn dialogue, open-domain question answering, role-playing, text generation, text understanding, image understanding and other tasks. For more english information, please refer to model card.
💡 推理效果的演示可以参考这里
- 多模态: 参考LLaVA 和 mPLUG-Owl 的相关工作, 羽人通过建立线性投影层将 LLM 的语言模态和目前最 SOTA 的 CLIP 模型laion/clip-vit-l-14-datacomp.xl-s13b-b90k 的视觉编码器进行融合, 从而实现了卓越的图片理解能力。
- 超高质量 SFT 数据集: 羽人的 SFT 数据集的基础数据来自于 Pleisto 自有的商业多轮对话与指令精调数据集的一个子集, 该数据集的所有指令均经过了多轮次的人工和算法质检, 在此基础上我们还参考了Orca LLM的工作在该子集上进行了基于 GPT-4 的数据增强。图像模态的数据集则由公共数据集 coco2017、ScienceQA 的子集、laion5b 的子集以及 Pleisto 自有的扩散模型训练数据集的中文子集共同构成。
- 商业友好: 羽人的训练和推理代码以 Apache-2.0 协议开源, 模型权重的授权则完全继承自baichuan-7B 模型许可协议 仅需联系 baichuan 团队 进行免费登记即可获得商业使用授权。
- 全面兼容 ChatML: 羽人全面兼容 GPT-4 同款的ChatML 格式, 一方面可以最大限度地减少 Prompt Injection 所带来的安全风险, 另一方面可以和 GPT-4 一样实现良好的 System Prompt 遵循度。(没错, 我们的训练数据集中包含了相当一部分带有 system prompt 的对话数据)
Coming soon
# 使用 rye 进行环境管理, 可访问 https://rye-up.com/guide/installation/#installing-rye 查看详情
curl -sSf https://rye-up.com/get | bash
source "$HOME/.rye/env"
rye sync
rye run webui "pleisto/yuren-baichuan-7b" # --load_8bit True --server_name "0.0.0.0" --share True
- 受限于较小的参数量,羽人-百川 7B 在数值计算、逻辑推理类任务的效果不尽人意,同时在多模态任务上也无法完全发挥出 CLIP 的优势,存在一定的幻觉现象。如果您有业务场景的真实需求,可以与我们联系,我们还有更大参数量的闭源模型可以提供。未来,我们也会考虑开源更大参数量的模型。
- 当前版本的羽人-百川 7B 尚未经过人类偏好对齐,在输出内容上存在一定的随机性,同一问题的多次回答可能在性能上有明显的差异,后续我们将提供经过人类偏好对齐的模型,以提升模型的稳定性。
- 尽管我们已在训练数据和预置的 System Prompt 层面上进行了内容安全的控制,但模型仍然可能会产生偏见、歧视、虚构或不当的内容,我们强烈建议您在使用模型时采取额外的安全措施,例如对模型的输入输出进行过滤、审查或限制,以避免对您的用户造成伤害。
遗憾的是, 由于羽人的训练数据集建立在我们的商业数据集的子集之上, 因此我们现阶段没有将其完整开源的计划。目前我们只能提供一个包含 300 条训练数据的样例数据集, 该数据集的格式和我们的完整数据集完全一致, 但是由于数据量太少, 无法训练出一个完整的模型, 仅供大家参考。该样例数据集以CC BY-SA 4.0 (署名且以相同方式共享) 协议开源, 详见文件内的__comment__
字段。
评测环境: OpenCompass 20230706, 使用 zero-shot CoT (Chain-of-Thought) 方法测试
作为多模态模型羽人 7b 在一部分参数量被 VQA(视觉问答)任务占用的情况下,依然在纯文本模态领域取得了较好的评测成绩,目前在主流的 7B LLM 中占第三名。值得注意的是这还是在羽人 7b 仅进行了 SFT,没有进行进一步的 RLHF 对齐的情况下取得的成绩。
Model | Humanities | Social Sciences | STEM | Other | Average |
---|---|---|---|---|---|
LLaMA-7B2 | 34.0 | 38.3 | 30.5 | 38.1 | 35.1 |
Falcon-7B1 | - | - | - | - | 35.0 |
mpt-7B1 | - | - | - | - | 35.6 |
ChatGLM-6B0 | 35.4 | 41.0 | 31.3 | 40.5 | 36.9 |
BLOOM 7B0 | 25.0 | 24.4 | 26.5 | 26.4 | 25.5 |
BLOOMZ 7B0 | 31.3 | 42.1 | 34.4 | 39.0 | 36.1 |
moss-moon-003-base (16B)0 | 24.2 | 22.8 | 22.4 | 24.4 | 23.6 |
moss-moon-003-sft (16B)0 | 30.5 | 33.8 | 29.3 | 34.4 | 31.9 |
Baichuan-7B0 | 38.4 | 48.9 | 35.6 | 48.1 | 42.3 |
羽人-baichuan-7b-多模态 | 41.77 | 53.97 | 39.90 | 41.33 | 44.24 |
chatglm2-6b | 41.23 | 51.61 | 40.06 | 51.24 | 45.46 |
InternLM-Chat-7b | - | - | - | - | 50.8 |
Model | Average | Avg(Hard) | STEM | Social Sciences | Humanities | Others |
---|---|---|---|---|---|---|
GPT-4 | 68.7 | 54.9 | 67.1 | 77.6 | 64.5 | 67.8 |
ChatGPT | 54.4 | 41.4 | 52.9 | 61.8 | 50.9 | 53.6 |
Claude-v1.3 | 54.2 | 39.0 | 51.9 | 61.7 | 52.1 | 53.7 |
Claude-instant-v1.0 | 45.9 | 35.5 | 43.1 | 53.8 | 44.2 | 45.4 |
BLOOMZ-7B | 35.7 | 25.8 | 31.3 | 43.5 | 36.6 | 35.6 |
ChatGLM-6B | 34.5 | 23.1 | 30.4 | 39.6 | 37.4 | 34.5 |
Ziya-LLaMA-13B-pretrain | 30.2 | 22.7 | 27.7 | 34.4 | 32.0 | 28.9 |
moss-moon-003-base (16B) | 27.4 | 24.5 | 27.0 | 29.1 | 27.2 | 26.9 |
LLaMA-7B-hf | 27.1 | 25.9 | 27.1 | 26.8 | 27.9 | 26.3 |
Falcon-7B | 25.8 | 24.3 | 25.8 | 26.0 | 25.8 | 25.6 |
TigerBot-7B-base | 25.7 | 27.0 | 27.3 | 24.7 | 23.4 | 26.1 |
Aquila-7B* | 25.5 | 25.2 | 25.6 | 24.6 | 25.2 | 26.6 |
Open-LLaMA-v2-pretrain (7B) | 24.0 | 22.5 | 23.1 | 25.3 | 25.2 | 23.2 |
BLOOM-7B | 22.8 | 20.2 | 21.8 | 23.3 | 23.9 | 23.3 |
Baichuan-7B | 42.8 | 31.5 | 38.2 | 52.0 | 46.2 | 39.3 |
羽人-baichuan-7b-多模态 | 44.97 | 31.7 | 47.04 | 52.0 | 43.08 | 45.31 |
chatglm2-6b | 50.1 | - | 46.4 | 60.4 | 50.6 | 46.9 |
InternLM-Chat-7b | 53.2 | - | - | - | - | - |
为了兼容 ChatML 格式以及支持图像模态, 我们需要在基座模型中添加几个 Special Token:
rye sync
rye run prepare-base-model
(注:词表大小会被扩充至最接近的 128 的倍数以改善并行训练时的性能)
同时为了便于直接复用 LLaMA 的生态, 我们使用了 LLaMA 兼容的 BaiChuan 权重而非原始权重.
不同于纯文本 LLM, 为了避免灾难性遗忘, 我们在第一阶段仅进行 1 个 epoch 的 FineTuning, 第三阶段会再和多模态数据一起进行 2 个 epoch 的 FineTuning。
下述脚本均适用于 8 卡 A100 80G 环境, 如需在其他环境下运行请酌情调整相关参数。
初始化环境:
. .venv/bin/activate
wandb login # 登录 wandb 以便于记录训练日志
torchrun --nproc_per_node=8 -m yuren_trainer.text_sft \
--model_name_or_path "dist/yuren-7b-base" --train_file 'train.json' \
--validation_file 'validation.json' --model_max_length 4096 \
--num_train_epochs 1 --per_device_eval_batch_size 4 --per_device_train_batch_size 4 \
--gradient_accumulation_steps 4 --evaluation_strategy "steps" --eval_steps 340 \
--save_strategy "steps" --save_steps 340 --save_total_limit 8 --learning_rate 2e-5 \
--weight_decay 0. --lr_scheduler_type "cosine" --logging_steps 10 \
--run_name yuren-llama-7b-stage1 --warmup_ratio 0.03 \
--dataloader_drop_last True --group_by_length True --tf32 True --bf16 True \
--deepspeed "apps/yuren_trainer/config/deepspeed_config.json" --output_dir "dist/yuren-7b-stage1"
⚠️ 即便是参考的guanaco工作将 rank 设置为64
的情况下, Lora 的性能依然不如全量微调, 因此我们通常仅使用全量微调, QLora 仅作为一个低资源下的备选方案。
torchrun --nproc_per_node=8 -m yuren_trainer.text_sft \
--model_name_or_path "dist/yuren-7b-base" --train_file 'train.json' \
--validation_file 'validation.json' --model_max_length 4096 \
--num_train_epochs 1 --per_device_eval_batch_size 4 --per_device_train_batch_size 4 \
--gradient_accumulation_steps 8 --evaluation_strategy "steps" --eval_steps 340 \
--save_strategy "steps" --save_steps 340 --save_total_limit 8 --learning_rate 5e-5 \
--weight_decay 0 --lr_scheduler_type "cosine" --logging_steps 4 --tf32 True --bf16 True \
--run_name yuren-llama-7b-qlora-stage1 --warmup_ratio 0.03 --gradient_checkpointing True \
--dataloader_drop_last True --group_by_length True --optim "paged_adamw_8bit" --max_grad_norm 0.5 \
--use_lora True --lora_config "apps/yuren_trainer/config/qlora.json" --output_dir "dist/yuren-7b-stage1"
⚠️ 现阶段的 Stage 2 和 Stage 3 的训练使用 Pleisto 内部的 monorepo 中的分布式训练脚本进行, 其底层依赖了一些内部类库, 导致暂时无法直接移植开源, 我们会在后续的版本中将其重构并移入本仓库。如果需要复现 Stage 2 和 Stage 3 的训练, 目前建议直接参考 LLaVA 的相关代码, 由于 LLaVA 支持基于 MPT 模型的多模态训练, 而 MPT 和羽人一样使用了 ChatML 格式, 因此理论上只需将数据集预处理相关的代码强制设置为 MPT 格式同时维持 LLaMA 模型结构不变即可与羽人兼容。需要注意的是, 我们内部的训练脚本尽管也参考了 LLaVA 但并不完全一致(我们的内部实现还参考了一部分 mPLUG-Owl 的工作), 因此我们无法保证直接使用 LLaVA 的代码能够完全复现我们的结果。
本阶段将冻结 LLM 的权重, 单独训练 Clip 模型中 Vision Encoder 和 LLM 连接所用的线性投影层。
本阶段将使用多模态数据集进行 2 个 epoch 的 FineTuning, 同时训练线性投影层和 LLM 本身。 多模态数据集即包括了图片模态的数据集, 也包括了 Stage 1 中使用的纯文本数据集。