homeyang's picture
Update README.md
ee3c242 verified
metadata
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可用性更高,模型生成速度均有显著提升。