Home

Awesome

Chat-嬛嬛

<div align="center"> <img src="./images/logo.png" width="200"/> <div align="center"> <b><font size="5">Chat-嬛嬛</font></b> </div>

license evaluation

🤗HuggingFace | OpenXLab_Model | <img src="./images/modelscope_logo.png" width="20px" /> ModelScope

OpenXLab_App | 🆕Update News | 🤔Reporting Issuesbilibili

English | 简体中文

</div>

📝目录

📖 简介

此仓库主要用于将 Chat嬛嬛 项目部署到 OpenXLab 或 ModelScope 。

  Chat-甄嬛是利用《甄嬛传》剧本中所有关于甄嬛的台词和语句,基于InternLM2进行LoRA微调或全量微调得到的模仿甄嬛语气的聊天语言模型。

甄嬛,小说《后宫·甄嬛传》和电视剧《甄嬛传》中的女一号,核心女主角。原名甄玉嬛,嫌玉字俗气而改名甄嬛,为汉人甄远道之女,后被雍正赐姓钮祜禄氏,抬旗为满洲上三旗,获名“钮祜禄·甄嬛”。同沈眉庄、安陵容参加选秀,因容貌酷似纯元皇后而被选中。入宫后面对华妃的步步紧逼,沈眉庄被冤、安陵容变心,从偏安一隅的青涩少女变成了能引起血雨腥风的宫斗老手。雍正发现年氏一族的野心后令其父甄远道剪除,甄嬛也于后宫中用她的连环巧计帮皇帝解决政敌,故而深得雍正爱待。几经周折,终于斗垮了嚣张跋扈的华妃。甄嬛封妃时遭皇后宜修暗算,被皇上嫌弃,生下女儿胧月后心灰意冷,自请出宫为尼。然得果郡王爱慕,二人相爱,得知果郡王死讯后立刻设计与雍正再遇,风光回宫。此后甄父冤案平反、甄氏复起,她也生下双生子,在滴血验亲等各种阴谋中躲过宜修的暗害,最后以牺牲自己亲生胎儿的方式扳倒了幕后黑手的皇后。但雍正又逼甄嬛毒杀允礼,以测试甄嬛真心,并让已经生产过孩子的甄嬛去准格尔和亲。甄嬛遂视皇帝为最该毁灭的对象,大结局道尽“人类的一切争斗,皆因统治者的不公不义而起”,并毒杀雍正。四阿哥弘历登基为乾隆,甄嬛被尊为圣母皇太后,权倾朝野,在如懿传中安度晚年。

  Chat-甄嬛,实现以《甄嬛传》为切入点,打造一套基于小说、剧本的个性化 AI 微调大模型完整流程,通过提供任一小说、剧本,指定人物角色,运行本项目完整流程,让每一位用户都基于心仪的小说、剧本打造一个属于自己的、契合角色人设、具备高度智能的个性化 AI。

具体如何实现全流程的 Character-AI 微调,可参考主仓库-huanhuan-chat

如何学习大模型部署和微调请参考:开源大模型食用指南 以及 书生·浦语大模型实战营课程

  欢迎大家来给InternLM2,点点star哦~

Chat嬛嬛全流程如图所示:

<p align="center"> <img src="./images/huanhuan_img.png" alt="alt text"> </p>

🔗 模型及体验地址

OpenXLab 体验地址:

https://openxlab.org.cn/apps/detail/BYCJS/Chat_huanhuan

alt text

Chat-嬛嬛 模型下载地址:

7B: https://openxlab.org.cn/models/detail/BYCJS/huanhuan-chat-internlm2

1.8B: https://openxlab.org.cn/models/detail/BYCJS/huanhuan-chat-internlm2-1_8b

alt text

7B: https://www.modelscope.cn/models/kmno4zx/huanhuan-chat-internlm2/summary

1.8B: https://www.modelscope.cn/models/kmno4zx/huanhuan-chat-internlm2-1_8b/summary

Alt text

🚀 News

2月5日,完成 InternLM2-chat-1_8B模型的全量微调 ,模型已上传ModelScop2,大家可以来下载哦~

1月22日,Chat-嬛嬛应用在 OpenXLab,累计聊天次数已达 3.64k 次,感谢大家的支持~

1月22日,Chat-嬛嬛模型 魔搭 累计下载 3107 次!

🧾 数据集

  Chat-嬛嬛 数据集采用《甄嬛传》剧本中所有关于甄嬛的台词和语句,共计 3000 余条,数据集样例:

第15幕
(秀女们在等候殿选。甄嬛看见了眉庄,上前相认)
甄嬛:眉姐姐!
眉庄:嬛儿,早就听说妹妹中选了,可就是一直不得空见你。
甄嬛(凑近):我倒巴不得没选上呢。姐姐远道过来一定很辛苦吧。
眉庄:在京里休息了这些日子,早已经调养过来了。
甄嬛:如今你住在自己京城的宅子里,不比从前住在外祖家,一墙之隔,见面也方便。
眉庄:是啊。可是我总还想着我们一起长大的情分呢。诶?妹妹今日打扮得好生素净,可是细看起来还是个美人坯子,怎么看都是好的。
甄嬛:沈大美人差矣,姐姐出落得这么标致,皇上见过必定会念念不忘。
眉庄(伸手制止,左右看了下):今天秀女佼佼者众多,我未必中选,若教旁人听见了,又要生出是非。

  使用脚本将剧本中关于甄嬛的对话集抽取出来,作为数据集使用。

  也可以使用这个仓库的脚本Extract Dialogue,请GPT老师来帮助我们从小说中抽取对话集。

Alt text

🛠️ 使用方法

快速开始

<!-- ## 微调 -->
  1. 下载模型
<details> <summary> 从 ModelScope </summary>

参考 模型的下载

pip install modelscope
from modelscope.hub.snapshot_download import snapshot_download
model_dir = snapshot_download('kmno4zx/huanhuan-chat-internlm2', cache_dir='./')
</details> <details> <summary> 从 OpenXLab </summary>

参考 下载模型

pip install openxlab
from openxlab.model import download
download(model_repo='BYCJS/huanhuan-chat-internlm2', 
        model_name='huanhuan-chat-internlm2', output='./')
</details>
  1. 本地部署
git clone https://github.com/KMnO4-zx/xlab-huanhuan.git
python start.py

重新训练

环境搭建

  1. clone 本项目
git clone https://github.com/KMnO4-zx/xlab-huanhuan.git
cd xlab-huanhuan
  1. 创建环境
pip install -r requirements.txt

有两种微调方案,我们更推荐使用 XTuner 训练, XTuner 有各个模型的一键训练脚本,相对便捷。且对 InternLM2 的支持度最高。

Transformers微调

  使用 Transformers 的 Trainer 进行微调,具体脚本可参考internlm2-chat-lora,该脚本在train文件夹下。脚本内有较为详细的注释。

XTuner微调

  使用 XTuner 进行微调,具体脚本可参考internlm2_chat_7b_qlora_oasst1_e3_copy.py,该脚本在train文件夹下。脚本内有较为详细的注释。

部署

OpenXLab 部署 Chat-嬛嬛

  仅需要 Fork 本仓库,然后在 OpenXLab 上创建一个新的项目,将 Fork 的仓库与新建的项目关联,即可在 OpenXLab 上部署 Chat-嬛嬛。

  OPenXLab Chat嬛嬛 https://openxlab.org.cn/apps/detail/BYCJS/Chat_huanhuan

Alt text

LmDeploy部署

pip install -U lmdeploy

--dst-path: 可以指定转换后的模型存储位置。

lmdeploy convert internlm2-chat-7b  要转化的模型地址 --dst-path 转换后的模型地址
lmdeploy chat turbomind 转换后的turbomind模型地址

测评与量化

OpneCompass 评测

git clone https://github.com/open-compass/opencompass
cd opencompass
pip install -e .
cp /share/temp/datasets/OpenCompassData-core-20231110.zip /root/opencompass/
unzip OpenCompassData-core-20231110.zip
python run.py \
    --datasets ceval_gen \
    --hf-path /root/model/huanhuan/kmno4zx/huanhuan-chat-internlm2 \
    --tokenizer-path /root/model/huanhuan/kmno4zx/huanhuan-chat-internlm2 \
    --tokenizer-kwargs padding_side='left' truncation='left'     trust_remote_code=True \
    --model-kwargs device_map='auto' trust_remote_code=True \
    --max-seq-len 2048 \
    --max-out-len 16 \
    --batch-size 2  \
    --num-gpus 1 \
    --debug

Lmdeploy&opencompass 量化以及量化评测

W4量化评测
lmdeploy lite auto_awq 要量化的模型地址 --work-dir 量化后的模型地址
lmdeploy convert internlm2-chat-7b 量化后的模型地址  --model-format awq --group-size 128 --dst-path 转换后的模型地址
from mmengine.config import read_base
from opencompass.models.turbomind import TurboMindModel

with read_base():
 # choose a list of datasets   
 from .datasets.ceval.ceval_gen import ceval_datasets 
 # and output the results in a choosen format
#  from .summarizers.medium import summarizer

datasets = [*ceval_datasets]

internlm2_chat_7b = dict(
     type=TurboMindModel,
     abbr='internlm2-chat-7b-turbomind',
     path='转换后的模型地址',
     engine_config=dict(session_len=512,
         max_batch_size=2,
         rope_scaling_factor=1.0),
     gen_config=dict(top_k=1,
         top_p=0.8,
         temperature=1.0,
         max_new_tokens=100),
     max_out_len=100,
     max_seq_len=512,
     batch_size=2,
     concurrency=1,
     #  meta_template=internlm_meta_template,
     run_cfg=dict(num_gpus=1, num_procs=1),
)
models = [internlm2_chat_7b]

python run.py configs/eval_turbomind.py -w 指定结果保存路径
KV Cache量化评测
lmdeploy convert internlm2-chat-7b  模型路径 --dst-path 转换后模型路径
# 计算
lmdeploy lite calibrate 模型路径 --calib-dataset 'ptb' --calib-samples 128 --calib-seqlen 2048 --work-dir 参数保存路径
# 获取量化参数
lmdeploy lite kv_qparams 参数保存路径 转换后模型路径/triton_models/weights/ --num-tp 1
python run.py configs/eval_turbomind.py -w 结果保存路径

结果文件可在同目录文件results中获取

💕 致谢

项目成员

特别感谢

<div align="center">

感谢上海人工智能实验室组织的 书生·浦语实战营 学习活动~

感谢 OpenXLab 对项目部署的算力支持~

感谢 浦语小助手 对项目的支持~

</div>