Skip to content

paineliu/sclm

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

50 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

中文对话模型 0.2B

中文 | English

一、介绍

SCLM(Small Chat Language Model)是一个从头开始训练的中文对话模型。模型参数只有0.2B(算共享权重约210M),可以在最低4GB显存的机器进行预训练(batch_size=1fp16或者 bf16),float16加载、推理最少只需要512MB显存。

项目实现了生成式语言模型的完整训练流程,包括:数据清洗、tokenizer训练、模型预训练、SFT指令微调、RLHF优化等。

最近更新

2024-01-31 - 项目开源, 开放模型权重供下载。

二、SCLM-0.2B模型训练过程

2.1 数据集

所有数据集均来自互联网公开的单轮对话数据集,经过数据清洗、格式化后保存为parquet文件。

2.1.1 预训练数据集

使用的数据集包括:

  1. 社区问答json版webtext2019zh-大规模高质量数据集,见:nlp_chinese_corpus
  2. baike_qa2019百科类问答,见:baike_qa2019
  3. 中国医药领域问答数据集,见:Chinese-medical-dialogue-data
  4. 知乎问答数据,见:Zhihu-KOL
  5. belle开源的指令训练数据,介绍:BELLE,下载:BelleGroup,选取Belle_open_source_1Mtrain_2M_CN中部分回答较短、不含复杂表格结构、翻译任务的数据。
  6. 维基百科(Wikipedia)词条数据,将词条拼凑为提示语,百科的前N个词为回答,使用202310的百科数据。Wiki下载:zhwiki,将下载的bz2文件转换为wiki.txt参考:WikiExtractor

数据示例:

{
    "prompt": "对于花园街,你有什么了解或看法吗?",
    "response": "花园街(是香港油尖旺区的一条富有特色的街道,位于九龙旺角东部,北至界限街,南至登打士街,与通菜街及洗衣街等街道平行。现时这条街道是香港著名的购物区之一。位于亚皆老街以南的一段花园街,也就是\"波鞋街\"整条街约150米长,有50多间售卖运动鞋和运动用品的店舖。旺角道至太子道西一段则为排档区,售卖成衣、蔬菜和水果等。花园街一共分成三段。明清时代,花园街是芒角村栽种花卉的地方。此外,根据历史专家郑宝鸿的考证:花园街曾是1910年代东方殷琴拿烟厂的花园。纵火案。自2005年起,花园街一带最少发生5宗纵火案,当中4宗涉及排档起火。2010年。2010年12月6日,花园街222号一个卖鞋的排档于凌晨5时许首先起火,浓烟涌往旁边住宅大厦,消防接报4"
}

2.1.2 SFT微调数据集

使用的数据集包括:

  1. belle开源的指令训练数据,介绍:BELLE,下载:BelleGroup,选取generated_chat_0.4Mtrain_0.5M_CN

数据示例:

{
    "prompt": "解释什么是欧洲启示录",
    "response": "欧洲启示录(The Book of Revelation)是新约圣经的最后一卷书,也被称为《启示录》、《默示录》或《约翰默示录》。这本书从宗教的角度描述了世界末日的来临,以及上帝对世界的审判和拯救。 书中的主题包括来临的基督的荣耀,上帝对人性的惩罚和拯救,以及魔鬼和邪恶力量的存在。欧洲启示录是一个充满象征和暗示的文本,对于解读和理解有许多不同的方法和观点。"
}

2.1.3 DPO优化数据集

使用的数据集包括:

  1. 数据集:alpaca-gpt4-data-zh,微调的chosen文本来自数据集,拒绝文本rejected来自SFT微调1个epoch后的模型输出
  2. 数据集:huozi_rlhf_data_json
  3. 数据集:rlhf-reward-single-round-trans_chinese

数据示例:

    {
        "prompt": "为给定的产品创建一个创意标语。,输入:可重复使用的水瓶。",
        "chosen": "\"保护地球,从拥有可重复使用的水瓶开始!\"",
        "rejected": "\"让你的水瓶成为你的生活伴侣,使用可重复使用的水瓶,让你的水瓶成为你的伙伴\""
    }

2.2 模型

T5模型(Text-to-Text Transfer Transformer),详情见论文: Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer

模型源码来自huggingface,见:T5ForConditionalGeneration

官方的T5-baseencoder layerdecoder layer均为为12层。本项目这两个参数修改为10层,模型参数:0.2B。

2.3 训练过程

硬件:

CPU: 28 vCPU Intel(R) Xeon(R) Gold 6330 CPU @ 2.00GHz
内存:128 GB
显卡:NVIDIA GeForce RTX 4090 Ti 24GB * 1

脚本执行步骤:

1、将训练数据放到将./data/raw目录下;

2、执行:tools/make_data_pre.py生成预训练数据;

3、执行:tools/make_token.py生成tonknizer;

4、执行:tools/make_data_sft.py生成SFT微调数据;

5、执行:sclm/train_pre.py进行模型预训练;

6、执行:tools/make_data_dpo.py生成DPO优化数据;

7、执行:sclm/train_sft.py进行SFT微调。

脚本功能说明:

  1. 生成训练数据: 将数据文件按照训练脚本中的目录结构放置,然后执行:tools/make_data_pre.py生成预训练数据;执行tools/make_data_sft.py生成SFT微调数据,在微调模型训练后,执行tools/make_data_dpo.py生成DPO优化数据。

  2. tokenizer 训练: 执行tools/make_token.py生成tonknizer,训练库存在OOM问题,加载1000万条数据,大约需要100GB内存,可以根据硬件情况,选取合适数量的数据进行训练。

  3. Text-to-Text 预训练:执行sclm/train_pre.py进行模型预训练。

    学习率为1e-45e-3的动态学习率,预训练时间为13天。训练损失:

    traing loss

  4. prompt监督微调(SFT):执行sclm/train_sft.py进行SFT微调。

    学习率为1e-75e-5的动态学习率,微调时间2天。微调损失:

    finetune loss

  5. dpo直接偏好优化:执行sclm/train_dpo.py进行模型偏好优化。

    模型偏好优化耗时5h。dpo损失:

    dpo loss

  6. 运行效果展示:执行sclm/infer.py

python sclm/infer.py

2+3等于5吗?
2 + 3 等于 5 。 这是一个基本的数学问题, 其中 2 是加数, 3 是合数 。 在数学中, 加法是一种基本的运算, 用于将两个或多个数字相加以获得它们的总和 。 在这个问题中, 数字 2 和数字 3 是两个加数, 它们相加得到 5 。 因此, 答案是 5 。

2+3等于几?
2 + 3 等于 4 。 这个问题可以用数学符号 “ 表示, 其中 “ 表示加法运算 。 2 + 3 表示将 2 和 3 相加, 得到 4 。 因此, 2 + 3 等于 4 。

苹果能吃吗?
苹果可以生吃, 但不能吃太多 。 苹果含有丰富的维生素 、 矿物质和纤维素, 对人体健康有益 。 但是, 苹果的营养价值和营养价值会受到许多因素的影响, 如品种 、 营养成分 、 食用方法 、 营养成分和营养价值等 。 因此, 苹果不能吃太多 。

中国的首都是哪里?
中国的首都是北京 。

2.4 使用说明

默认使用huggingface transformersTextIteratorStreamer实现流式对话,只支持greedy search,如果需要beam sample等其它生成方式,请将cli_demo.pystream_chat参数修改为False

  1. 控制台运行:
python cli_demo.py
  1. API调用
python api_demo.py

API调用示例:

curl --location '127.0.0.1:8192/api/chat' \
--header 'Content-Type: application/json' \
--data '{
    "input_txt": "感冒了要怎么办"
}'

存在问题:预训练数据集只有1000多万条,模型参数也仅0.2B,会有答非所问、废话生成器的情况。

三、引用

如果你觉得本项目对你有所帮助,欢迎引用。

@misc{paineliu2024,
    author={liu tingchao},
    title={A small chat language model with 0.2B parameters base on T5},
    year={2024},
    publisher = {GitHub},
    journal = {GitHub repository},
    howpublished = {\url{https://github.com/paineliu/sclm}},
}

四、其他事项

本项目不承担开源模型和代码导致的数据安全、舆情风险或发生任何模型被误导、滥用、传播、不当利用而产生的风险和责任。

五、感谢

本项目主要参考了ChatLM-mini-Chinese,并基于该项目修改,在此向作者表达深深的谢意。

@misc{Charent2023,
    author={Charent Chen},
    title={A small chinese chat language model with 0.2B parameters base on T5},
    year={2023},
    publisher = {GitHub},
    journal = {GitHub repository},
    howpublished = {\url{https://github.com/charent/ChatLM-mini-Chinese}},
}

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages