- 7.16 支持vllm推理
- 5.16 开源52B版本chat模型
- 星辰大模型(52B)是一款开源多语言大模型,其模型基座使用高质量中英文数据、更优数据配比,采用课程学习方式进行训练。
- 我们开源了使用星辰语义大模型52B基座微调的对话模型,以及基于Deepspeed的微调代码和huggingface推理代码。
- 星辰大模型(52B)在模型评测中取得了领先的效果,在榜单评测上超过LLaMA-2-70B-Chat,与Qwen-72B-chat可比;通用对话性能已经超过GPT-3.5-Turbo。
我们采用标准的 Decoder-only
结构设计了 TeleChat 模型,并在模型维度做了如下的一些改进:
- 位置编码:我们使用 Rotary Embedding 的位置编码方法,该方法将相对位置信息依赖集成到 self-attention 中,并且具有较好的位置外推性。Rotary Embedding还可以较好地与Flash-Attention v2 配合使用,将模型的训练速度提升约20%。
- 激活函数:我们使用 SwiGLU 激活函数来替代GELU激活函数。
- 层标准化: 基于 RMSNorm 的 Pre-Normalization。
- 词嵌入层与输出层解耦:我们将星辰52B的词嵌入层和输出lm head层参数分开,有助于增强训练稳定性和收敛性。
layer_num | hidden_size | ffn_hidden_size | head_num | tie_word_embeddings | |
---|---|---|---|---|---|
星辰52B | 64 | 8192 | 21824 | 64 | 否 |
我们开源的星辰52B模型:
- 支持deepspeed微调,开源了基于deepspeed的训练代码,支持Zero并行显存优化,同时集成了FlashAttention2
- 多轮能力支持。开源了多轮数据构建方式,针对多轮模型训练集成了针对多轮的mask loss训练方式,更好的聚焦多轮答案,提升问答效果。
本次发布版本和下载链接见下表:
模型版本 | 下载链接 |
---|---|
52B-FP16 | TeleChat-52B-FP16 |
镜像下载(需修改) 为了便于大家快速上手,我们提供了可运行的环境镜像,下载地址:镜像下载 (访问码:ona6)
星辰52B模型相比同规模模型在评测效果方面也有较好的表现,我们的评测集涵盖了包括MMLU、AGIEval、CMMLU、 GSM8K、MATH、HumanEval 等数据集,评测能力包括了自然语言理解、知识、数学计算和推理、代码生成等
- MMLU 数据集是一个全面的英文评测数据集,涵盖了 57 个学科,包括人文学科、社会科学、自然科学、初等数学、美国历史、计算机科学、法律等等。
- CMMLU 数据集同样是一个全面的中文评估测试集,涵盖了从基础学科到高级专业水平的67个主题。
- AGIEval 数据集是一个专门为评估基础模型在难度较高的标准化考试(如大学入学考试、法学院入学考试、数学竞赛和律师资格考试)的语境中而设计的基准测试,包括中文试题和英文试题。
-
GSM8K 数据集包含了8.5K高质量的小学数学题,能够评估语言模型在数学推理能力上的表现,我们利用官方的评测方案在test集上进行了4-shot测试。
-
MATH 数据集包含了12.5K具有挑战性的高中数学竞赛题,难度较大,对语言模型的推理能力要求较高,基于官方的评测方案,我们在test集上进行了4-shot测试。
-
HumanEval 数据集是一个由openai提供的代码能力测试数据集,它由 164 个编程问题组成,要求根据给定的问题和代码模板,生成正确的代码片段,我们利用官方评测方案在test集上进行了zero-shot测试。
Model | MMLU | CMMLU | AGIEval | GSM8K | MATH | HumanEval | BBH | HellaSwag |
---|---|---|---|---|---|---|---|---|
5-shot | 5-shot | zero-shot | 4-shot | 4-shot | zero-shot | 3-shot | zero-shot | |
LLaMA-2-70B-Chat | 63.8 | 43.3 | 37.9 | 59.3 | 10.4 | 32.3 | 60.8 | 80.6 |
Qwen-72B-chat | 74 | 81.4 | 58.5 | 67.4 | 31.8 | 49.4 | 68 | 84.7 |
星辰7B-chat | 60.5 | 64.3 | 46.8 | 36.7 | 10.3 | 20.1 | 19.5 | 36.7 |
星辰12B-chat | 73.3 | 74.2 | 51.7 | 57.2 | 16.0 | 22.0 | 52.2 | 71.5 |
星辰52B-chat | 76.6 | 73.79 | 61.1 | 63.5 | 13.5 | 36.6 | 60.3 | 86.3 |
说明:榜单均基于OpenCompass平台提供的评测方法进行评估,而对于对比模型,我们同时参考了官方汇报结果和OpenCompass结果。
为了评价模型的对话能力,研发团队建立了包含2500+单轮、多轮对话交互的内部评测系统,涵盖闲聊问答、专业知识、翻译、逻辑思维、长文写作、幻觉测试、安全测试、角色扮演、任务执行、数学能力等多个维度,并使用Judge模型基于详细的评价指标文档进行自动打分。在当前评测数据上,星辰52B模型的综合平均得分为83.8,高于GPT-3.5-Turbo的82.3。这一结果表明,星辰52B模型能较好地支持下游任务应用。
当前模型支持fp16精度推理,适配4卡40G A100进行推理。具体推理操作请参考infer.py
文件,该文件中有单轮和多轮的推理示例。
模型推理方法示范
import os
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
from transformers import GenerationConfig
PATH = "/path/to/TeleChat-52B-chat"
tokenizer = AutoTokenizer.from_pretrained(PATH, use_fast=False, trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(PATH,torch_dtype=torch.bfloat16,device_map='auto',trust_remote_code=True)
question = "你作为一名气候保护协会的会员,你准备写一篇全球气候变化的新闻报告,要求体现出全球气候变化以前与现在情况的对比,字数要求1000字。"
generate_config = GenerationConfig.from_pretrained(PATH)
answer = model.chat(tokenizer,question, history_input_list = [], history_output_list = [],generation_config = generate_config)
print("machine:",answer)
以下是一些性能测试供参考。
全参微调deepspeed版本,8机64卡A100-40G,训练速度参考( samples/s)
模型大小 | NVIDIA卡型号 | 最长训练长度 | 参数设置 |
---|---|---|---|
52B | 8机64卡A100-40G | 4096 | 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/train_data_{i}.pt保存处理后的文件,i的范围是0~num_workers。训练时会加载路径下所有train_data_{i}.pt文件
- 数据通过data_path读取,最终拼接生成num_samples个max_seq_len长度的sample进行训练。如样例所示,假设datas/single_turn_example.jsonl和datas/multi_turn_example.jsonl各有1000条samples,配比过后数据池中则总共包含3000条samples。在数据拼接过程中,程序会不断遍历数据池,尽可能将数据拼接到4096长度(不够就左padding),直至生成到num_samples的个数。因此,每个sample中会包含多条拼接而成的数据。
- process_method选择single或multiple单进程或多进程处理数据。
python -u process_data.py \
--data_path data.json \ # 数据配比文件路径
--tokenizer_path $MODEL_PATH \ # 模型/tokenzier路径
--data_output_path $DATA_OUTPUT_PATH \ # 处理后数据保存地址
--max_seq_len $MAX_LEN \ # 数据长度
--num_samples $NUM_SAMPLES \ # 最终生成拼接后的数据数量
--num_workers 10 \ # 多进程个数
--process_method multiple \ # 多进程&单进程处理
--seed 42
可运行run_telechat_52b.sh脚本
多机训练需要给出免密互连hostfile,如下所示,node1、node2、node3、node4是节点名称,slots代表每个节点的卡数
node1 slots=8
node2 slots=8
node3 slots=8
node4 slots=8
bash run_telechat_52b.sh
可运行run_telechat_52b_lora.sh脚本
bash run_telechat_52b_lora.sh