Views
No views yet
batch_size=1,fp16或者 bf16),float16加载、推理最少只需要512MB显存。HuggingfaceNLP框架,包括transformers、accelerate、trl、peft等。trainer,支持单机单卡、单机多卡进行预训练、SFT微调。训练过程中支持在任意位置停止,及在任意位置继续训练。Text-to-Text预训练,非mask掩码预测预训练。
sentencepiece、huggingface tokenizers的tokenizer训练;batch_size=1, max_len=320下,最低支持在16GB内存+4GB显存的机器上进行预训练;trainer支持prompt指令微调, 支持任意断点继续训练;Huggingface trainer的sequence to sequence微调;peft lora进行偏好优化;Lora adapter合并到原始模型中。utils/raw_data_process.py。主要数据集包括:Belle_open_source_1M、train_2M_CN、及train_3.5M_CN中部分回答较短、不含复杂表格结构、翻译任务(没做英文词表)的数据,共370万行,清洗后剩余338万行。N个词为回答,使用202309的百科数据,清洗后剩余119万的词条提示语和回答。Wiki下载:zhwiki,将下载的bz2文件转换为wiki.txt参考:WikiExtractor。1# 预训练阶段:
2CPU: 28 vCPU Intel(R) Xeon(R) Gold 6330 CPU @ 2.00GHz
3内存:60 GB
4显卡:RTX A5000(24GB) * 2
5
6# sft及dpo阶段:
7CPU: Intel(R) i5-13600k @ 5.1GHz
8内存:32 GB
9显卡:NVIDIA GeForce RTX 4060 Ti 16GB * 1tokenizer训练库遇到大语料时存在OOM问题,故全量语料按照类似BPE的方法根据词频合并、构造词库,运行耗时半天。1e-4到5e-3的动态学习率,预训练时间为8天。belle指令训练数据集(指令和回答长度都在512以下),学习率为1e-7到5e-5的动态学习率,微调时间2天。chosen文本,步骤2中SFT模型对数据集中的prompt做批量generate,得到rejected文本,耗时1天,dpo全量偏好优化,学习率le-5,半精度fp16,共2个epoch,耗时3h。huggingface transformers的 TextIteratorStreamer实现流式对话,只支持greedy search,如果需要beam sample等其他生成方式,请将cli_demo.py的stream_chat参数修改为False。1from transformers import AutoTokenizer, AutoModelForSeq2SeqLM
2import torch
3
4model_id = 'charent/ChatLM-mini-Chinese'
5device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
6
7tokenizer = AutoTokenizer.from_pretrained(model_id)
8model = AutoModelForSeq2SeqLM.from_pretrained(model_id, trust_remote_code=True).to(device)
9
10txt = '如何评价Apple这家公司?'
11
12encode_ids = tokenizer([txt])
13input_ids, attention_mask = torch.LongTensor(encode_ids['input_ids']), torch.LongTensor(encode_ids['attention_mask'])
14
15outs = model.my_generate(
16 input_ids=input_ids.to(device),
17 attention_mask=attention_mask.to(device),
18 max_seq_len=256,
19 search_type='beam',
20)
21
22outs_txt = tokenizer.batch_decode(outs.cpu().numpy(), skip_special_tokens=True, clean_up_tokenization_spaces=True)
23print(outs_txt[0])1Apple是一家专注于设计和用户体验的公司,其产品在设计上注重简约、流畅和功能性,而在用户体验方面则注重用户的反馈和使用体验。作为一家领先的科技公司,苹果公司一直致力于为用户提供最优质的产品和服务,不断推陈出新,不断创新和改进,以满足不断变化的市场需求。
2在iPhone、iPad和Mac等产品上,苹果公司一直保持着创新的态度,不断推出新的功能和设计,为用户提供更好的使用体验。在iPad上推出的iPad Pro和iPod touch等产品,也一直保持着优秀的用户体验。
3此外,苹果公司还致力于开发和销售软件和服务,例如iTunes、iCloud和App Store等,这些产品在市场上也获得了广泛的认可和好评。
4总的来说,苹果公司在设计、用户体验和产品创新方面都做得非常出色,为用户带来了许多便利和惊喜。
51git clone --depth 1 https://github.com/charent/ChatLM-mini-Chinese.git
2
3cd ChatLM-mini-Chinesepython 3.10,过老的python版本可能不兼容所依赖的第三方库。pip install -r ./requirements.txt1# pip 安装torch + cu118
2pip3 install torch --index-url https://download.pytorch.org/whl/cu118conda install --yes --file ./requirements.txtHugging Face Hub下载模型权重及配置文件,需要先安装Git LFS,然后运行:1git clone --depth 1 https://huggingface.co/charent/ChatLM-mini-Chinese
2
3mv ChatLM-Chinese-0.2B model_savetokenizer库训练的(如sentencepiece),但是数据集一大就容易OOM。另外预训练数据集各个领域的语料不平衡,会产生很多不必要的合并。最后使用jieba分词对所有的预训练语料切词后统计词频,只保留出现1500次以上的字、词,参照PreTrainedTokenizerFast的BPE model的保存格式,构造tokenzier,最后转换为PreTrainedTokenizerFast。核心代码如下,详细的处理过程见utils/train_tokenizer.py。1# 构造merge数组
2words_merge_list = []
3for word in words_dict.keys():
4 n = len(word)
5 if n >= 2:
6 # a, b切分12345示例: 1 2345, 12 345, 123 45, 1234 5
7 for i in range(1, n):
8 a, b = ''.join(word[0: i]), ''.join(word[i: ])
9
10 if a in words_dict and b in words_dict:
11 words_merge_list.append((a, b))tokenizer根据自己的语料重新训练tokenizer的例子,见train_tokenizer.ipynb。注意,重新训练tokenizer后,预训练模型的权重将无法使用,需要重新训练模型权重,因为token对应的id变了。1{
2 "prompt": "对于花园街,你有什么了解或看法吗?",
3 "response": "花园街(是香港油尖旺区的一条富有特色的街道,位于九龙旺角东部,北至界限街,南至登打士街,与通菜街及洗衣街等街道平行。现时这条街道是香港著名的购物区之一。位于亚皆老街以南的一段花园街,也就是\"波鞋街\"整条街约150米长,有50多间售卖运动鞋和运动用品的店舖。旺角道至太子道西一段则为排档区,售卖成衣、蔬菜和水果等。花园街一共分成三段。明清时代,花园街是芒角村栽种花卉的地方。此外,根据历史专家郑宝鸿的考证:花园街曾是1910年代东方殷琴拿烟厂的花园。纵火案。自2005年起,花园街一带最少发生5宗纵火案,当中4宗涉及排档起火。2010年。2010年12月6日,花园街222号一个卖鞋的排档于凌晨5时许首先起火,浓烟涌往旁边住宅大厦,消防接报4"
4}train.ipynb,推荐使用jupyter-lab,避免考虑与服务器断开后终端进程被杀的情况。Supervisor或者screen建立连接会话。accelerate,执行以下命令, 根据提示选择即可,参考accelerate.yaml,注意:DeepSpeed在Windows安装比较麻烦。accelerate configaccelerate launch后加上参数--config_file ./accelerate.yaml,该配置按照单机2xGPU配置。train.py,huggingface实现的trainer对应pre_train.py,用哪个都可以,效果一致。本项目实现的trainer训练信息展示更美观、更容易修改训练细节(如损失函数,日志记录等),均支持断点继续训练,本项目实现的trainer支持在任意位置断点后继续训练,按ctrl+c退出脚本时会保存断点信息。1# 本项目实现的trainer
2accelerate launch ./train.py train
3
4# 或者使用 huggingface trainer
5python pre_train.py1# 本项目实现的trainer
2accelerate launch --multi_gpu --num_processes 2 ./train.py train
3
4# 或者使用 huggingface trainer
5python pre_train.py# 本项目实现的trainer
accelerate launch --multi_gpu --num_processes 2 ./train.py train --is_keep_training=True
# 或者使用 huggingface trainer
# 需要在`pre_train.py`中的`train`函数添加`resume_from_checkpoint=True`
python pre_train.py1{
2 "prompt": "解释什么是欧洲启示录",
3 "response": "欧洲启示录(The Book of Revelation)是新约圣经的最后一卷书,也被称为《启示录》、《默示录》或《约翰默示录》。这本书从宗教的角度描述了世界末日的来临,以及上帝对世界的审判和拯救。 书中的主题包括来临的基督的荣耀,上帝对人性的惩罚和拯救,以及魔鬼和邪恶力量的存在。欧洲启示录是一个充满象征和暗示的文本,对于解读和理解有许多不同的方法和观点。"
4}data目录下的示例parquet文件制作自己的数据集,数据集格式:parquet文件分两列,一列prompt文本,表示提示语,一列response文本,表示期待的模型输出。
微调细节见model/trainer.py下的train方法, is_finetune设置为True时,将进行微调,微调默认会冻结embedding层和encoder层,只训练decoder层。如需要冻结其他参数,请自行调整代码。1# 本项目实现的trainer, 添加参数`--is_finetune=True`即可, 参数`--is_keep_training=True`可从任意断点处继续训练
2accelerate launch --multi_gpu --num_processes 2 ./train.py --is_finetune=True
3
4# 或者使用 huggingface trainer
5python sft_train.pypeft库快速搭建Lora奖励模型。chosen文本来自原数据集alpaca-gpt4-data-zh,拒绝文本rejected来自SFT微调1个epoch后的模型输出,另外两个数据集:huozi_rlhf_data_json和rlhf-reward-single-round-trans_chinese,合并后共8万条dpo数据。utils/dpo_data_process.py。1 {
2 "prompt": "为给定的产品创建一个创意标语。,输入:可重复使用的水瓶。",
3 "chosen": "\"保护地球,从拥有可重复使用的水瓶开始!\"",
4 "rejected": "\"让你的水瓶成为你的生活伴侣,使用可重复使用的水瓶,让你的水瓶成为你的伙伴\""
5 }python dpo_train.pymodel_save目录下有以下文件:1ChatLM-mini-Chinese
2├─model_save
3| ├─chat_model.py
4| ├─chat_model_config.py
5| ├─config.json
6| ├─generation_config.json
7| ├─model.safetensors
8| ├─special_tokens_map.json
9| ├─tokenizer.json
10| └─tokenizer_config.jsonpython cli_demo.pypython api_demo.py1curl --location '127.0.0.1:8812/api/chat' \
2--header 'Content-Type: application/json' \
3--header 'Authorization: Bearer Bearer' \
4--data '{
5 "input_txt": "感冒了要怎么办"
6}'《写生随笔》是冶金工业2006年出版的图书,作者是张来亮,抽取出三元组(写生随笔,作者,张来亮)和(写生随笔,出版社,冶金工业)。1{
2 "prompt": "请抽取出给定句子中的所有三元组。给定句子:《家乡的月亮》是宋雪莱演唱的一首歌曲,所属专辑是《久违的哥们》",
3 "response": "[(家乡的月亮,歌手,宋雪莱),(家乡的月亮,所属专辑,久违的哥们)]"
4}sft_train.py脚本进行微调,脚本finetune_IE_task.ipynb里面包含详细的解码过程。训练数据集约17000条,学习率5e-5,训练epoch5。微调后其他任务的对话能力也没有消失。| 模型 | F1分数 | 精确率P | 召回率R |
|---|---|---|---|
| ChatLM-Chinese-0.2B微调 | 0.74 | 0.75 | 0.73 |
| ChatLM-Chinese-0.2B无预训练 | 0.51 | 0.53 | 0.49 |
| 传统深度学习方法 | 0.80 | 0.79 | 80.1 |
ChatLM-Chinese-0.2B无预训练指直接初始化随机参数,开始训练,学习率1e-4,其他参数和微调一致。1@misc{Charent2023,
2 author={Charent Chen},
3 title={A small chinese chat language model with 0.2B parameters base on T5},
4 year={2023},
5 publisher = {GitHub},
6 journal = {GitHub repository},
7 howpublished = {\url{https://github.com/charent/ChatLM-mini-Chinese}},
8}