🤗 Hugging Face • 🤖 ModelScope • 🏔 MindSpore • 🐾 gitee️ • 💬 WeChat
星辰语义大模型TeleChat是由中电信人工智能科技有限公司研发训练的大语言模型,其中7B模型基座采用1.5万亿 Tokens中英文高质量语料进行训练,12B模型基座采用3万亿 Tokens中英文高质量语料进行训练。
我们开源了对话模型TeleChat-1B、TeleChat-7B与TeleChat-12B,以及其huggingface
格式的权重文件。此外,我们还开源了7B、12B模型的int8和int4量化版本。
TeleChat-12B在模型结构、训练数据、训练方法等方面进行了改进,在通用问答和知识类、代码类、数学类榜单上相比TeleChat-7B均有大幅提升。
TeleChat-12B-V2版本使用动态数据配比和课程学习的方法,针对基座模型进行了持续训练增强。其对话模型在通用能力评测上提升5.5%,其中数学能力提升24.6%、翻译能力提升9%、幻觉测试提升10.3%,安全拒识、知识问答、闲聊问答等方面也有不同程度的提升。
TeleChat-1B版本底座基于2万亿Tokens中英文高质量语料进行训练,其对话模型在能力在同尺寸模型中位列前茅。
我们采用标准的 Decoder-only
结构设计了 TeleChat 模型,并在模型维度做了如下的一些改进:
ffn_hidden_size
设置为小于原始SwiGLU中的4倍隐藏层大小。layer_num | hidden_size | ffn_hidden_size | head_num | tie_word_embeddings | |
---|---|---|---|---|---|
1B | 16 | 2048 | 5460 | 32 | 否 |
7B | 30 | 4096 | 12288 | 32 | 是 |
12B | 38 | 5120 | 12288 | 32 | 否 |
我们开源的TeleChat模型:
本次发布版本和下载链接见下表
模型版本 | 下载链接 |
---|---|
1B-FP16 | TeleChat-1B-FP16 |
7B-FP16 | TeleChat-7B-FP16 |
7B-int8 | TeleChat-7B-int8 |
7B-int4 | TeleChat-7B-int4 |
12B-FP16 | TeleChat-12B-FP16 |
12B-v2-FP16 | TeleChat-12B-v2-FP16 |
12B-int8 | TeleChat-12B-int8 |
12B-int4 | TeleChat-12B-int4 |
12B-V2-FP16 | TeleChat-12B-V2-FP16 |
TeleChat-PTD 是由电信星辰大模型TeleChat预训练语料中抽取出的的综合性大规模中文数据集。数据主要来源于网页、书籍、官方媒体等。 我们使用规则+模型的方式进行了相关的过滤,并对数据进行了相似性去重,尽可能地提取出高质量地数据。
TeleChat-PTD 数据集大约公开了2.7亿条数据,数据由纯中文文本构成,原始大小约1TB,压缩后480G,共189个文件。数据集中已经去除了其它冗余信息。
数据为jsonl格式,仅有一个字段data
data: 单条处理后的预训练数据
数据清洗的工作流程主要是:规则筛选和清洗、去重、高质量数据筛选、数据安全处理这四个步骤。
huggingface下载地址:数据下载
TeleChat模型相比同规模模型在评测效果方面也有较好的表现,我们的评测集涵盖了包括MMLU、C-Eval、GAOKAO、AGIEval、CMMLU、 GSM8K、MATH、HumanEval、CHID等数据集,评测能力包括了自然语言理解、知识、数学计算和推理、代码生成等
MMLU 数据集是一个全面的英文评测数据集,涵盖了 57 个学科,包括人文学科、社会科学、自然科学、初等数学、美国历史、计算机科学、法律等等。
CEVAL 数据集是一个全面的中文评估测试集,包括初中、高中、大学和专业难度级别的多项选择题,涵盖了 52 个不同的学科领域。
CMMLU 数据集同样是一个全面的中文评估测试集,涵盖了从基础学科到高级专业水平的67个主题。
AGIEval 数据集是一个专门为评估基础模型在难度较高的标准化考试(如大学入学考试、法学院入学考试、数学竞赛和律师资格考试)的语境中而设计的基准测试,包括中文试题和英文试题。
GAOKAO 数据集是一个基于中国高考题构建的语言模型能力测试集,包括 1781 道客观题和 1030 道主观题。我们只保留了客观题的评测结果。
GSM8K 数据集包含了8.5K高质量的小学数学题,能够评估语言模型在数学推理能力上的表现,我们利用官方的评测方案在test集上进行了4-shot测试。
MATH 数据集包含了12.5K具有挑战性的高中数学竞赛题,难度较大,对语言模型的推理能力要求较高,基于官方的评测方案,我们在test集上进行了4-shot测试。
HumanEval 数据集是一个由openai提供的代码能力测试数据集,它由 164 个编程问题组成,要求根据给定的问题和代码模板,生成正确的代码片段,我们利用官方评测方案在test集上进行了zero-shot测试。
CSL 是一个中文论文摘要关键词匹配任务,需要模型能够识别中文学术摘要与其关键词之间的匹配情况。
CHID 是一个中文阅读理解任务,要求模型选择出最恰当的成语填补中文片段中的空缺处。
EPRSTMT 是一个基于电子商务平台上的产品评论的二元情感分析任务。
Model | MMLU | C-Eval | CMMLU | AGIEval | GAOKAO | GSM8K | MATH | HumanEval | CSL | CHID | EPRSTMT | BBH | HellaSwag |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
5-shot | 5-shot | 5-shot | zero-shot | zero-shot | 4-shot | 4-shot | zero-shot | zero-shot | zero-shot | zero-shot | 3-shot | zero-shot | |
LLaMA2-7B-chat | 46.2 | 31.9 | 31.5 | 28.5 | 16.1 | 26.3 | 3.9 | 12.2 | 58.8 | 44.1 | 57.5 | 35.6 | 74.1 |
LLaMA2-13B-chat | 54.6 | 36.2 | 38.7 | 32.3 | 18.6 | 29.6 | 5.0 | 18.9 | 61.2 | 48.0 | 59.4 | 40.2 | 78.2 |
ChatGLM2-6B-chat | 45.9 | 52.6 | 49.3 | 39.0 | 46.4 | 28.8 | 6.5 | 11.0 | 61.2 | 57.9 | 71.2 | 32.7 | 57.0 |
ChatGLM3-6B-chat | 51.9 | 53.8 | 54 | 38.9 | 49.3 | 56.7 | 18.7 | 61 | 65.6 | 63.4 | 85 | 44.6 | 62.7 |
Baichuan2-7B-chat | 52.8 | 55.6 | 54.0 | 35.3 | 39.7 | 32.8 | 6 | 13.4 | 60 | 75.2 | 87.5 | 35.8 | 61.6 |
Baichuan2-13B-chat | 57 | 56.7 | 58.4 | 40 | 51.4 | 55.3 | 8.6 | 17.7 | 63.1 | 78.2 | 87.5 | 49.9 | 66.9 |
Qwen-7B-chat | 56.6 | 59.3 | 59.5 | 41.3 | 63.3 | 52.5 | 10.3 | 26.2 | 63.1 | 72.3 | 88.8 | 46.9 | 59.9 |
Qwen-14B-chat | 66.4 | 71.7 | 70.0 | 47.3 | 76.5 | 61.0 | 26.8 | 36.6 | 55.6 | 72.3 | 91.2 | 58.0 | 65.2 |
TeleChat-1B-chat | 36.5 | 53.3 | 42.1 | 32.1 | 34.5 | 36.8 | 7.2 | 12.8 | 45.62 | 69.8 | 87.5 | 37.4 | 29.6 |
TeleChat-7B-chat | 60.5 | 64.6 | 64.3 | 46.8 | 59 | 36.7 | 10.3 | 20.1 | 66.8 | 88.0 | 87.5 | 19.5 | 36.7 |
TeleChat-12B-chat | 73.3 | 66.6 | 74.2 | 51.7 | 53.1 | 57.2 | 16.0 | 22.0 | 60.6 | 83.2 | 86.3 | 52.2 | 71.5 |
说明:CMMLU、AGIEval、GAOKAO、CSL、CHID、EPRSTMT均基于OpenCompass平台提供的评测方法进行评估,而对于对比模型,我们同时参考了官方汇报结果和OpenCompass结果。我们使用了自己的评测脚本评测MMLU与CEVAL榜单,具体方法见evaluation/
文件夹。
当前模型推理兼容了单卡和多卡推理,以及针对长文推理做了部分优化工作。具体推理操作请参考:tutorial
模型推理方法示范
>>> import os
>>> import torch
>>> from transformers import AutoModelForCausalLM, AutoTokenizer, GenerationConfig
>>> os.environ["CUDA_VISIBLE_DEVICES"] = '0'
>>> tokenizer = AutoTokenizer.from_pretrained('../models/12B', trust_remote_code=True)
>>> model = AutoModelForCausalLM.from_pretrained('../models/12B', trust_remote_code=True, device_map="auto", torch_dtype=torch.float16)
>>> generate_config = GenerationConfig.from_pretrained('../models/12B')
>>> question="生抽与老抽的区别?"
>>> answer, history = model.chat(tokenizer = tokenizer, question=question, history=[], generation_config=generate_config, stream=False)
>>> print(answer)
生抽和老抽是两种不同的酱油,它们在风味、色泽和用途上都有所区别。
1. 颜色:生抽的颜色比较淡,而老抽的颜色较深。生抽的颜色呈红褐色或棕红色,而老抽的颜色则呈棕黑色。
2. 味道:生抽具有鲜美的咸味和微甜的味浅,而老抽浓郁,颜色较深。根据个人口味和烹饪需求选择不同的酱油类型可以获得更好的口感和菜肴效果。
TeleChat目前提供了API、Web两种部署方式。目前仅提供简单的单卡单并发场景,用于演示和效果测试。基于参考快速上手手册:tutorial
API: 分为流式接口和json接口,支持传入推理参数
Web: 支持流式生成、多轮对话
以下是一些性能测试供参考。
全参微调deepspeed版本,单机8卡A100,训练速度参考( samples/s)
模型大小 | NVIDIA卡型号 | 最长训练长度 | 训练速度 | 参数设置 |
---|---|---|---|---|
7B | 单机8卡A100-40G | 2048 | 8.86 | flash-attn开启,zero-3,gradient-checkpointing |
7B | 单机8卡A100-40G | 4096 | 4.88 | flash-attn开启,zero-3,gradient-checkpointing |
12B | 单机8卡A100-40G | 2048 | 5.24 | flash-attn开启,zero-3,gradient-checkpointing |
12B | 单机8卡A100-40G | 4096 | 2.90 | flash-attn开启,zero-3,gradient-checkpointing |
为了方便数据配比,解耦了数据处理和模型训练,数据权重配比文件如data.json所示,json字典中key为读取数据的路径,value为训练时数据的权重。单轮、多轮数据格式如样例数据所示
{
"datas/single_turn_example.jsonl": 2.0,
"datas/multi_turn_example.jsonl": 1.0
}
运行process_data.py即可将文件处理成tokens,并保存。其中data_output_path/traindata{i}.pt保存处理后的文件,i的范围是0~num_workers。训练时会加载路径下所有traindata{i}.pt文件
python -u process_data.py \
--data_path data.json \ # 数据配比文件路径
--tokenizer_path ../../models/12B \ # 模型/tokenzier路径
--data_output_path $DATA_OUTPUT_PATH \ # 处理后数据保存地址
--max_seq_len $MAX_LEN \ # 数据长度
--num_samples $NUM_SAMPLES \ # 最终生成拼接后的数据数量
--num_workers 10 \ # 多进程个数
--process_method multiple \ # 多进程&单进程处理
--seed 42
以下是TeleChat-12B单机微调的样例脚本。其中训练数据如data.json所示,为了测试使用,不保证效果。
deepspeed --master_port 29500 main.py \
--data_path $DATA_OUTPUT_PATH \ # tokenzie后的数据文件存放地址
--model_name_or_path ../../models/12B \
--with_loss_mask \
--per_device_train_batch_size 1 \
--max_seq_len 4096 \
--learning_rate 3e-5 \
--weight_decay 0.0001 \
--num_train_epochs 1 \
--gradient_accumulation_steps 4 \
--lr_scheduler_type cosine \
--precision fp16 \ # 训练精度,fp16或bf16
--warmup_proportion 0.1 \
--gradient_checkpointing \
--offload \
--seed 1233 \
--zero_stage $ZERO_STAGE \
--save_steps 10 \
--deepspeed \
--output_dir $OUTPUT # 输出路径
多机训练需要给出hostfile,如deepspeed-telechat/sft/my_hostfile所示。脚本中需指定hostfile的路径
deepspeed --master_port 29500 --hostfile=my_hostfile main.py \
--data_path $DATA_OUTPUT_PATH \ # tokenzie后的数据文件存放地址
--model_name_or_path ../../models/12B \
--with_loss_mask \
--per_device_train_batch_size 1 \
--max_seq_len 4096 \
--learning_rate 3e-5 \
--weight_decay 0.0001 \
--num_train_epochs 1 \
--gradient_accumulation_steps 4 \
--lr_scheduler_type cosine \
--precision fp16 \ # 训练精度,fp16或bf16
--warmup_proportion 0.1 \
--gradient_checkpointing \
--offload \
--seed 1233 \
--zero_stage $ZERO_STAGE \
--save_steps 10 \
--deepspeed \
--output_dir $OUTPUT # 输出路径
具体可以参考:tutorial
TeleChat的分词算法是BBPE算法,该算法是字节级实现的分词算法,任意Unicode字符都可以被表示。
我们使用基于 AutoGPTQ 的量化方案对自研星辰语义大模型TeleChat做量化,提供Int8和Int4的量化模型。
具体量化操作请参考:tutorial,以下是离线量化和量化后推理的样例脚本
>>> from transformers import AutoTokenizer
>>> from auto_gptq import BaseQuantizeConfig
>>> from modeling_telechat_gptq import TelechatGPTQForCausalLM
>>> tokenizer_path = '../models/7B'
>>> pretrained_model_dir = '../models/7B'
>>> quantized_model_dir = '../models/7B_8bit'
>>> tokenizer = AutoTokenizer.from_pretrained(tokenizer_path, use_fast=True)
>>> calibration_text = ["auto-gptq is an easy-to-use model quantization library with user-friendly apis, based on GPTQ algorithm."]
>>> examples = [tokenizer(_) for _ in calibration_text]
>>> quantize_config = BaseQuantizeConfig( bits=8, group_size=128, desc_act=False )
>>> model = TelechatGPTQForCausalLM.from_pretrained(pretrained_model_dir, quantize_config,trust_remote_code=True)
>>> model.quantize(examples)
>>> model.save_quantized(quantized_model_dir)
>>> from transformers import AutoTokenizer, GenerationConfig
>>> from modeling_telechat_gptq import TelechatGPTQForCausalLM
>>> PATH = '../models/7B_8bit'
>>> tokenizer = AutoTokenizer.from_pretrained(PATH, trust_remote_code=True)
>>> model = TelechatGPTQForCausalLM.from_quantized(PATH, device="cuda:0", inject_fused_mlp=False, inject_fused_attention=False, trust_remote_code=True)
>>> generate_config = GenerationConfig.from_pretrained(PATH)
>>> model.eval()
>>> question = "生抽与老抽的区别?"
>>> answer, history = model.chat(tokenizer=tokenizer, question=question, history=[], generation_config=generate_config, stream=False)
>>> print("回答:", answer)
回答: 生抽和老抽是两种不同的酱油,它们的区别如下:
1. 原料不同:生抽是用大豆、面粉等为原料制成的;而老抽则是用豆豉、盐等为原料制成的。
2. 制作工艺不同:生抽是通过将大豆浸泡在水中,然后经过发酵、蒸煮等过程制成的;而老抽则是在生抽的基础上进行进一步的加工和处理,如加入盐、糖、味精等调料。
3. 口感和风味不同:生抽的口感相对较咸,适合用于烹调肉类、海鲜等;而老抽的风味相对较重,适合用于烹调红烧肉、酱爆鸡丁等菜品。
总的来说,生抽和老抽都是常见的酱油品种,它们在原料、制作工艺和口感等方面都有所不同。选择使用哪种酱油,可以根据个人口味和菜品需求来决定。
>>> from transformers import AutoTokenizer
>>> from auto_gptq import BaseQuantizeConfig
>>> from modeling_telechat_gptq import TelechatGPTQForCausalLM
>>> tokenizer_path = '../models/7B'
>>> pretrained_model_dir = '../models/7B'
>>> quantized_model_dir = '../models/7B_4bit'
>>> tokenizer = AutoTokenizer.from_pretrained(tokenizer_path, use_fast=True)
>>> calibration_text = ["auto-gptq is an easy-to-use model quantization library with user-friendly apis, based on GPTQ algorithm."]
>>> examples = [tokenizer(_) for _ in calibration_text]
>>> quantize_config = BaseQuantizeConfig( bits=4, group_size=128, desc_act=False )
>>> model = TelechatGPTQForCausalLM.from_pretrained(pretrained_model_dir, quantize_config,trust_remote_code=True)
>>> model.quantize(examples)
>>> model.save_quantized(quantized_model_dir)
>>> from transformers import AutoTokenizer, GenerationConfig
>>> from modeling_telechat_gptq import TelechatGPTQForCausalLM
>>> PATH = '../models/7B_4bit'
>>> tokenizer = AutoTokenizer.from_pretrained(PATH, trust_remote_code=True)
>>> model = TelechatGPTQForCausalLM.from_quantized(PATH, device="cuda:0", inject_fused_mlp=False, inject_fused_attention=False, trust_remote_code=True)
>>> generate_config = GenerationConfig.from_pretrained(PATH)
>>> model.eval()
>>> question = "生抽与老抽的区别?"
>>> answer, history = model.chat(tokenizer=tokenizer, question=question, history=[], generation_config=generate_config, stream=False)
>>> print("回答:", answer)
回答: 生抽和老抽是两种不同的酱油,它们的区别主要体现在以下几个方面:
1. 原料不同:生抽是用大豆、小麦等制成的,而老抽则是用豆豉、盐等制成的。
2. 发酵方式不同:生抽是通过将大豆或小麦浸泡在水中,然后进行发酵制成的;而老抽则是在制作过程中直接将大豆或小麦炒熟后使用。
3. 味道不同:生抽的口感比较鲜美,有咸味和甜味;老抽的味道相对较重,有咸味和苦味。
4. 用途不同:生抽主要用于调味酱料、腌制肉类等;老抽则主要用于烹调菜肴、焖煮食材等。
当前星辰语义大模型TeleChat已支持昇腾 Atlas 300I Pro 推理卡。具备int8量化能力。
性能方面,具体对比如下:
输入输出信息 | NPU (tokens/s) | GPU (tokens/s) |
---|---|---|
输入100输出100 | 15 | 21 |
输入1000输出100 | 13 | 24 |
输入2000输出100 | 11 | 19 |
25组case平均 | 13 | 18 |
当前星辰语义大模型TeleChat已经支持昇腾Atlas 800T A2训练服务器,可基于昇思MindSpore框架进行模型训练和推理。
效果方面,模型训练效果对齐A100,loss基本吻合;
性能方面,具体对比如下:
NAME | performance(samples/s) | Epochs | AMP_Type |
---|---|---|---|
7B-8p-GPU(A100-40G) | 8.86 | 5 | - |
7B-8p-NPU | 7.98 | 5 | O2 |
说明:BatchSize/per-GPU=1,zero-stage=3, seq_length=2048, gradient_accumulation_steps:4
NAME | performance(samples/s) | Epochs | AMP_Type |
---|---|---|---|
12B-8p-GPU(A100-40G) | 6.85 | 5 | - |
12B-8p-NPU | 8.22 | 5 | O2 |
说明:BatchSize/per-GPU=1,zero-stage=3, seq_length=1024, gradient_accumulation_steps:4
TeleChat支持昇腾Atlas 800T A2训练服务器,可基于昇思MindSpore框架进行模型训练,训练所需的modeling、README、 脚本已发布:TeleChat-MindSpore
当前星辰语义大模型TeleChat已经支持昇腾Atlas 800T A2训练服务器,可基于PyTorch 框架进行模型训练和推理。
效果方面,模型训练效果对齐A100,loss基本吻合;
性能方面,具体对比如下:
NAME | performance(samples/s) | Epochs | AMP_Type |
---|---|---|---|
8p-GPU(A100-40G) | 10 | 5 | - |
8p-NPU | 8.99 | 5 | O2 |
说明:BatchSize/per-GPU=2,zero-stage=3,seq_length=2048, gradient_accumulation_steps:2
TeleChat支持昇腾Atlas 800T A2训练服务器,可基于PyTorch框架进行模型训练,训练所需的modeling、README、脚本已发布:TeleChat-7B-PyTorch
我们在此声明,不要使用TeleChat模型及其衍生模型进行任何危害国家社会安全或违法的活动。同时,我们也要求使用者不要将TeleChat模型用于没有安全审查和备案的互联网服务。我们希望所有使用者遵守上述原则,确保科技发展在合法合规的环境下进行。
我们已经尽我们所能,来确保模型训练过程中使用的数据的合规性。然而,尽管我们已经做出了巨大的努力,但由于模型和数据的复杂性,仍有可能存在一些无法预见的问题。因此,如果由于使用TeleChat开源模型而导致的任何问题,包括但不限于数据安全问题、公共舆论风险,或模型被误导、滥用、传播或不当利用所带来的任何风险和问题,我们将不承担任何责任。
社区使用 TeleChat 模型需要遵循《TeleChat模型社区许可协议》。TeleChat模型支持商业用途,如果您计划将 TeleChat 模型或其衍生品用于商业目的,您需要通过以下联系邮箱 tele_ai@chinatelecom.cn,提交《TeleChat模型社区许可协议》要求的申请材料。审核通过后,将特此授予您一个非排他性、全球性、不可转让、不可再许可、可撤销的商用版权许可。
如需引用我们的工作,请使用如下 reference:
@misc{wang2024telechat,
title={TeleChat Technical Report},
author={Zihan Wang and Xinzhang Liu and Shixuan Liu and Yitong Yao and Yuyao Huang and Zhongjiang He and Xuelong Li and Yongxiang Li and Zhonghao Che and Zhaoxi Zhang and Yan Wang and Xin Wang and Luwen Pu and Huihan Xu and Ruiyu Fang and Yu Zhao and Jie Zhang and Xiaomeng Huang and Zhilong Lu and Jiaxin Peng and Wenjun Zheng and Shiquan Wang and Bingkai Yang and Xuewei he and Zhuoru Jiang and Qiyi Xie and Yanhan Zhang and Zhongqiu Li and Lingling Shi and Weiwei Fu and Yin Zhang and Zilu Huang and Sishi Xiong and Yuxiang Zhang and Chao Wang and Shuangyong Song},
year={2024},
eprint={2401.03804},
archivePrefix={arXiv},
primaryClass={cs.CL}
}