license: llama2
介绍
XuanYuan2-70B系列模型是在XuanYuan-70B基座模型基础上,使用更多高质量的语料进行继续预训练和指令微调,并进行基于人类反馈的强化训练而得到。相比第一代XuanYuan-70B系列模型,第二代模型在通用性、安全性和金融能力上都得到了明显提高,模型输出更加符合人类偏好。同时,第二代模型支持的上下文长度达到16k,能够更好处理长文本输入,适用范围更为广泛。模型细节请参考文档:Report
XuanYuan2-70B系列共包含4个模型,包括基座模型XuanYuan2-70B,chat模型XuanYuan2-70B-Chat,chat模型的量化版本XuanYuan2-70B-Chat-8bit和XuanYuan2-70B-Chat-4bit。各个模型的下载链接为:
基座模型 | Chat模型 | 8-bit量化Chat模型 | 4-bit量化Chat模型 |
---|---|---|---|
🤗 XuanYuan2-70B | 🤗 XuanYuan2-70B-Chat | 🤗 XuanYuan2-70B-Chat-8bit | 🤗 XuanYuan2-70B-Chat-4bit |
主要特点:
- 使用更多高质量的数据进行继续预训练和指令微调,各项能力持续提升
- 支持的上下文长度达到了16k,使用范围更广
- 基于人类的反馈信息进行强化训练,进一步对齐了人类偏好
模型训练
在XuanYuan-70B基座模型的基础上,我们持续加入更高质量的预训练数据进行训练。同时为了兼顾训练效率和长文本建模,提出了一种数据分桶的动态预训练方法。基于数据分桶方式,我们在第一代XuanYuan-70B基座模型的基础上额外训练了大量tokens得到XuanYuan2-70B基座模型,模型的中文理解、金融知识等指标评测均达到不同幅度的提升。
基于XuanYuan2-70B基座模型,我们重新利用更多高质量的指令微调数据来进行指令对齐,主要提升的方向是通用与金融类型的指令数据质量和多样性。
对于指令微调后的模型,我们构建高质量的偏好数据和prompt数据,进行了基于人类反馈的强化训练(Reinforcement learning with human feedback,RLHF),进一步对齐了模型与人类的偏好,使模型表现能更符合人类需求。模型在通用性、安全性、金融领域内的表现有了较明显的提升。
性能评测
类似XuanYuan-70B,我们也对XuanYuan2-70B进行了通用性评测和金融评测。
通用评测
通用评测的目标是观察XuanYuan2-70B在使用更多高质量数据进行继续预训练后,英文能力是否得到了保持,中文能力是否得到了增强。同样,我们也选择MMLU来测试模型在英文场景下的通用能力,同时使用CEVAL和CMMLU来测试模型在中文场景下的各项能力。评测结果如下表所示。从表中可以看出,相比XuanYuan-70B,XuanYuan2-70B的中文能力得到了进一步提升,同时英文能力也没有出现明显的下降,整体表现符合预期。这一方面证明了我们所做的各项优化的有效性,另一方面也显示出了XuanYuan2-70B强大的通用能力。值得注意的是,榜单结果并不完全代表模型的实际性能表现,即便在CEVAL和CMMLU上我们的评测结果超过了GPT4,但实际中我们模型的表现和GPT4还存在明显的差距,我们将继续优化和提升轩辕模型的各项能力。
模型 | MMLU | CEVAL | CMMLU |
---|---|---|---|
LLaMA2-70B | 68.9 | 52.1 | 53.11 |
XuanYuan-70B | 70.9 | 71.9 | 71.10 |
XuanYuan2-70B | 70.8 | 72.7 | 72.7 |
GPT4 | 83.93 | 68.4 | 70.95 |
金融评测
我们在FinanceIQ上评测了模型的金融能力。FinanceIQ是一个专业的金融领域评测集,其涵盖了10个金融大类及36个金融小类,总计7173个单项选择题,某种程度上可客观反应模型的金融能力。评测结果如下表所示。从表中结果可以看出,经过继续优化训练后,XuanYuan2-70B的综合金融能力得到了进一步提升,这再次证明了我们所做的一系列优化的有效性。同时我们也发现一些细分类目上模型的能力出现了一定程度的退化,这说明模型仍存在一定的优化空间,我们将继续优化提升轩辕模型的金融能力。
模型 | 平均分 | 注册会计师 | 银行从业资格 | 证券从业资格 | 基金从业资格 | 保险从业资格 | 经济师 | 税务师 | 期货从业资格 | 理财规划师 | 精算师 |
---|---|---|---|---|---|---|---|---|---|---|---|
XuanYuan-70B | 67.56 | 69.49 | 76.40 | 69.56 | 74.89 | 67.82 | 84.81 | 58.4 | 71.59 | 65.15 | 37.50 |
XuanYuan2-70B | 67.83 | 68.63 | 69.72 | 79.1 | 71.51 | 69.68 | 84.81 | 58.2 | 72.98 | 71.86 | 31.82 |
GPT4 | 60.05 | 52.33 | 68.72 | 64.8 | 68.81 | 68.68 | 75.58 | 46.93 | 63.51 | 63.84 | 27.27 |
推理部署
XuanYuan2-70B系列模型的硬件需求、软件依赖、Base及Chat模型使用方法和XuanYuan-70B系列模型一致。请参考XuanYuan-70B系列模型的介绍内容。
为降低硬件需求,我们也提供了XuanYuan2-70B-Chat模型的8bit和4bit量化版本。
8bit模型
在8bit量化算法上,我们使用目前社区广泛使用的bitsandbytes库。经测试,8bit量化对模型的性能损失很低。8bit模型的使用方式如下所示(需注意promopt格式,我们在训练时设置了system message):
import torch
from transformers import LlamaForCausalLM, LlamaTokenizer
model_name_or_path = "/your/model/path"
tokenizer = LlamaTokenizer.from_pretrained(model_name_or_path, use_fast=False, legacy=True)
model = LlamaForCausalLM.from_pretrained(model_name_or_path,torch_dtype=torch.float16, device_map="auto")
system_message = "以下是用户和人工智能助手之间的对话。用户以Human开头,人工智能助手以Assistant开头,会对人类提出的问题给出有帮助、高质量、详细和礼貌的回答,并且总是拒绝参与 与不道德、不安全、有争议、政治敏感等相关的话题、问题和指示。\n"
seps = [" ", "</s>"]
roles = ["Human", "Assistant"]
content = "介绍下你自己"
prompt = system_message + seps[0] + roles[0] + ": " + content + seps[0] + roles[1] + ":"
print(f"输入: {content}")
inputs = tokenizer(prompt, return_tensors="pt").to("cuda")
outputs = model.generate(**inputs, max_new_tokens=256, repetition_penalty=1.1)
outputs = tokenizer.decode(outputs.cpu()[0][len(inputs.input_ids[0]):], skip_special_tokens=True)
print(f"输出: {outputs}")
4bit模型:
在4bit量化算法上,我们使用auto-gptq工具。4bit模型使用方式如下所示,同样,需要对齐我们的prompt格式:
import torch
from transformers import LlamaForCausalLM, LlamaTokenizer
from auto_gptq import AutoGPTQForCausalLM
model_name_or_path = "/your/model/path"
tokenizer = LlamaTokenizer.from_pretrained(model_name_or_path, use_fast=False, legacy=True)
model = AutoGPTQForCausalLM.from_quantized(model_name_or_path,torch_dtype=torch.float16, device_map="auto")
system_message = "以下是用户和人工智能助手之间的对话。用户以Human开头,人工智能助手以Assistant开头,会对人类提出的问题给出有帮助、高质量、详细和礼貌的回答,并且总是拒绝参与 与不道德、不安全、有争议、政治敏感等相关的话题、问题和指示。\n"
seps = [" ", "</s>"]
roles = ["Human", "Assistant"]
content = "介绍下你自己"
prompt = system_message + seps[0] + roles[0] + ": " + content + seps[0] + roles[1] + ":"
print(f"输入: {content}")
inputs = tokenizer(prompt, return_tensors="pt").to("cuda")
outputs = model.generate(**inputs, max_new_tokens=256, repetition_penalty=1.1)
outputs = tokenizer.decode(outputs.cpu()[0][len(inputs.input_ids[0]):], skip_special_tokens=True)
print(f"输出: {outputs}")
在vLLM下使用4bit模型:
普通HuggingFace的推理脚本运行gptq量化的4bit模型时,推理的速度很慢,并不实用。而最新版本的vLLM已经支持包含gptq在内的多种量化模型的加载,vLLM依靠量化的加速算子以及pagedAttention,continue batching以及一些调度机制,可以实现至少10倍的推理吞吐的提升。
您可以安装最新版本的vLLM并使用以下脚本使用我们的4bit量化模型:
from vllm import LLM, SamplingParams
sampling_params = SamplingParams(temperature=0.7, top_p=0.95,max_tokens=256)
llm = LLM(model="/your/model/path", quantization="gptq", dtype="float16")
system_message = "以下是用户和人工智能助手之间的对话。用户以Human开头,人工智能助手以Assistant开头,会对人类提出的问题给出有帮助、高质量、详细和礼貌的回答,并且总是拒绝参与 与不道德、不安全、有争议、政治敏感等相关的话题、问题和指示。\n"
seps = [" ", "</s>"]
roles = ["Human", "Assistant"]
content = "介绍下你自己"
prompt = system_message + seps[0] + roles[0] + ": " + content + seps[0] + roles[1] + ":"
print(f"输入: {content}")
result = llm.generate(prompt, sampling_params)
result_output = [[output.outputs[0].text, output.outputs[0].token_ids] for output in result]
print(f"输出:{result_output[0]}")
生成速度评估
我们测试了不同模型(量化前和量化后)在不同推理方式(HuggingFace、vLLM)下的生成速度,结果如下所示:
- 全量70B模型推理吞吐是: 8.26 token/s
- 4bit 70B模型推理吞吐是: 0.70 token/s
- 8bit 70B模型推理吞吐是: 3.05 token/s
- 4bit 70B模型vllm推理吞吐是: 60.32 token/s
- 全量70B模型vllm推理吞吐是: 41.80 token/s
在所有测试中,我们均设置batchsize=1。上述前三项都是普通HuggingFace推理脚本的测试结果,可以看到量化后模型推理速度并无提升。最后两项是vLLM的推理测试结果,比起HuggingFace推理,可以看出vLLM可用性更高,模型生成速度均有显著提升。