Home

Awesome

羽人-百川 7B

Code style: black Lint License: Apache-2.0 huggingface badge

羽人是基于 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.

主要亮点

💡 推理效果的演示可以参考这里

使用 WebUI 进行推理

Docker

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

局限性

训练数据

遗憾的是, 由于羽人的训练数据集建立在我们的商业数据集的子集之上, 因此我们现阶段没有将其完整开源的计划。目前我们只能提供一个包含 300 条训练数据的样例数据集, 该数据集的格式和我们的完整数据集完全一致, 但是由于数据量太少, 无法训练出一个完整的模型, 仅供大家参考。该样例数据集以CC BY-SA 4.0 (署名且以相同方式共享) 协议开源, 详见文件内的__comment__字段。

评测结果

评测环境: OpenCompass 20230706, 使用 zero-shot CoT (Chain-of-Thought) 方法测试

作为多模态模型羽人7b在一部分参数量被VQA(视觉问答)任务占用的情况下,依然在纯文本模态领域取得了较好的评测成绩,目前在主流的7B LLM中占第三名。值得注意的是这还是在羽人7b仅进行了SFT,没有进行进一步的RLHF对齐的情况下取得的成绩。

MMLU 英文评测

ModelHumanitiesSocial SciencesSTEMOtherAverage
LLaMA-7B<sup>2</sup>34.038.330.538.135.1
Falcon-7B<sup>1</sup>----35.0
mpt-7B<sup>1</sup>----35.6
ChatGLM-6B<sup>0</sup>35.441.031.340.536.9
BLOOM 7B<sup>0</sup>25.024.426.526.425.5
BLOOMZ 7B<sup>0</sup>31.342.134.439.036.1
moss-moon-003-base (16B)<sup>0</sup>24.222.822.424.423.6
moss-moon-003-sft (16B)<sup>0</sup>30.533.829.334.431.9
Baichuan-7B<sup>0</sup>38.448.935.648.142.3
羽人-baichuan-7b-多模态41.7753.9739.9041.3344.24
chatglm2-6b41.2351.6140.0651.2445.46
InternLM-Chat-7b----50.8

C-Eval 中文评测

ModelAverageAvg(Hard)STEMSocial SciencesHumanitiesOthers
GPT-468.754.967.177.664.567.8
ChatGPT54.441.452.961.850.953.6
Claude-v1.354.239.051.961.752.153.7
Claude-instant-v1.045.935.543.153.844.245.4
BLOOMZ-7B35.725.831.343.536.635.6
ChatGLM-6B34.523.130.439.637.434.5
Ziya-LLaMA-13B-pretrain30.222.727.734.432.028.9
moss-moon-003-base (16B)27.424.527.029.127.226.9
LLaMA-7B-hf27.125.927.126.827.926.3
Falcon-7B25.824.325.826.025.825.6
TigerBot-7B-base25.727.027.324.723.426.1
Aquila-7B<sup>*</sup>25.525.225.624.625.226.6
Open-LLaMA-v2-pretrain (7B)24.022.523.125.325.223.2
BLOOM-7B22.820.221.823.323.923.3
Baichuan-7B42.831.538.252.046.239.3
羽人-baichuan-7b-多模态44.9731.747.0452.043.0845.31
chatglm2-6b50.1-46.460.450.646.9
InternLM-Chat-7b53.2-----

复现训练

准备基座模型

为了兼容 ChatML 格式以及支持图像模态, 我们需要在基座模型中添加几个 Special Token:

rye sync
rye run prepare-base-model

(注:词表大小会被扩充至最接近的 128 的倍数以改善并行训练时的性能)

同时为了便于直接复用 LLaMA 的生态, 我们使用了 LLaMA 兼容的 BaiChuan 权重而非原始权重.

SFT - Stage 1

不同于纯文本 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"

QLora

:warning: 即便是参考的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"

SFT - Stage 2

:warning: 现阶段的 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 连接所用的线性投影层。

SFT - Stage 3

本阶段将使用多模态数据集进行 2 个 epoch 的 FineTuning, 同时训练线性投影层和 LLM 本身。 多模态数据集即包括了图片模态的数据集, 也包括了 Stage 1 中使用的纯文本数据集。