金融领域开源大模型-度小满轩辕

金融领域开源大模型-度小满轩辕 轩辕系列大模型积累了大量的高质量数据和模型训练经验,在预训练基础上构建了丰富、高质量的问答数据和人类偏好数据,显著提升了模型在对话场景中的表现。轩辕系列大模型在多个评测榜单和人工评估中均获得了亮眼的结果。

🤗 HuggingFace • 🤖 ModelScope • 💬 WeChat

News

[3/11/2024] 🔥开源XuanYuan-6B、XuanYuan-13B、XuanYuan2-70B 系列模型

[1/19/2023] 🔥开源XuanYuan-13B-Chat 模型

[11/1/2023] 🔥开源XuanYuan-70B-Chat 模型及 8 -bit 和 4bit 量化模型

[9/22/2023] 🔥开源 XuanYuan-70B Base 模型

[9/22/2023] 🔥开源 60G 高质量中文金融数据。Hugging Face

[9/22/2023] 🔥开源中文金融领域知识评估数据集  FinanceIQ。GitHub | HuggingFace

[5/21/2023] 开源度小满轩辕 -176B 大模型,在 BLOOM-176B 的基础上针对中文通用领域和金融领域进行了针对性的预训练与微调。是国内首个开源的千亿级中文对话大模型

目前发布的模型和下载链接 如下:

基座模型Chat 模型8-bit 量化 Chat 模型4-bit 量化 Chat 模型
XuanYuan-6B🤗 🤖🤗 🤖🤗 🤖🤗 🤖
XuanYuan-13B🤗 🤖🤗 🤖🤗 🤖🤗 🤖
XuanYuan2-70B🤗 🤖🤗 🤖🤗 🤖🤗 🤖
XuanYuan-70B🤗 🤖🤗 🤖🤗 🤖🤗 🤖
XuanYuan-176B🤗

技术文档: XuanYuan-6B XuanYuan-13B XuanYuan2-70B XuanYuan-70B

XuanYuan-6B

介绍

在轩辕系列大模型研发过程中,我们积累了大量的高质量数据和模型训练经验,构建了完善的训练平台,搭建了合理的评估流水线。在此基础上,为丰富轩辕系列模型矩阵,降低轩辕大模型使用门槛,我们进一步推出了 XuanYuan-6B 系列大模型。不同于 XuanYuan-13B 和 XuanYuan-70B 系列模型在 LLaMA2 上继续预训练的范式,XuanYuan-6B 是我们从零开始进行预训练的大模型。当然,XuanYuan-6B 仍采用类 LLaMA 的模型架构。在预训练基础上,我们构建了丰富、高质量的问答数据和人类偏好数据,并通过指令微调和强化学习进一步对齐了模型表现和人类偏好,显著提升了模型在对话场景中的表现。XuanYuan6B 系列模型在多个评测榜单和人工评估中均获得了亮眼的结果。模型训练细节请参考我们的技术报告:Report

本次开源的 XuanYuan-6B 系列模型包含基座模型 XuanYuan-6B,经指令微调和强化对齐的 chat 模型 XuanYuan-6B-Chat,以及 chat 模型的量化版本 XuanYuan-6B-Chat-4bit 和 XuanYuan-6B-Chat-8bit。

主要特点:

  • 收集多个领域大量的训练语料,进行了多维度数据清洗和去重,保证数据的量级和质量
  • 从零开始预训练,预训练中动态调整数据配比,模型基座能力较强
  • 结合 Self-QA 方法构建高质量问答数据,采用混合训练方式进行监督微调
  • 构建高质量人类偏好数据训练奖励模型并进行强化训练,对齐模型表现和人类偏好
  • 模型尺寸小并包含量化版本,硬件要求低,适用性更强
  • 在多个榜单和人工评估中均展现出良好的性能,具备领先的金融能力

性能评测

基础评测

金融一直是轩辕大模型重点关注的领域和主要应用目标,因此我们首先在金融场景评测了 XuanYuan-6B 模型。我们使用自己构建并开源的 FinanceIQ 数据集,该数据集是一份专业的大模型金融能力评估数据集,涵盖了 10 个金融大类,36 个金融小类,总计 7173 题。评估结果如下表所示。从表中可以看出,XuanYuan-6B 模型在该评估数据中的性能甚至超越了 GPT4,显示出了其强大的金融能力。

模型平均分注册会计师银行从业资格证券从业资格基金从业资格保险从业资格经济师税务师期货从业资格理财规划师精算师
XuanYuan-13B74.0275.2983.5277.3880.575.8687.3162.0976.4475.2546.59
XuanYuan-6B68.8771.6277.6574.8377.5273.5686.5459.0270.6771.1926.14
GPT460.0552.3368.7264.868.8168.6875.5846.9363.5163.8427.27

除金融外,我们也注重轩辕大模型的通用能力,因此我们也在多个主流评测集上进行了模型评测,观察轩辕大模型在知识、逻辑、代码等通用能力上的表现。评测结果如下表所示。

模型C-EvalCMMLUMMLUGSM8KHumanEval
LLaMA2-70B50.153.669.854.423.7
LLaMA2-13B41.438.45529.618.9
LLaMA2-7B32.531.846.816.712.8
XuanYuan-13B827870.349.329.3
XuanYuan-6B81.275.864.532.922.6

从表中结果可以看出,在五个评测集上,XuanYuan-6B 的表现均超越了类似尺寸的 LLaMA2-7B 和 LLaMA2-13B 模型,展现出了强大的通用能力。在中文相关场景下,XuanYuan-6B 甚至可超越更大尺寸的 LLaMA2-70B 模型。

值得注意的是,在上述所有评测中,XuanYuan-6B 均进行了考试场景增强,具体细节可见我们的技术报告。另外榜单结果也不代表模型在真实场景中的实际能力。为进一步验证模型的实际能力,我们对模型进行了人工评测。

人工评测

除在各榜单进行评测外,我们进一步对 XuanYuan-6B-Chat 模型进行了人工评估,来公正客观地评估 chat 模型在对话场景中的真实能力。评估集包含一定量级的问题且对研发人员完全封闭,每个问题均由三个不同的人员进行评估来减轻偏见。评估对比对象为业界开源的类似尺寸的主流大模型,我们并采用 GSB(Good,Same,Bad)指标来展示评估结果,具体结果如下图所示。从图中可以看出,在通用性(安全性在评估时被纳入了通用性)和金融能力上,XuanYuan-6B-Chat 模型均超过了对比对象,显示出更强的模型能力。

推理部署

XuanYuan-6B 系列模型均已上传到 HuggingFace 和 modelscope 网站,请点击上述链接进行下载。XuanYuan-6B 基座模型、chat 模型及其量化模型的使用方法和 XuanYuan-70B,XuanYuan2-70B 类似,但是 tokenizer 加载方式和在对话场景中使用的 prompt 格式不同(不包含 system message)。下面以 XuanYuan-6B-Chat 模型为例,来展示 XuanYuan-6B 系列模型的使用方法。

import torch
from transformers import LlamaForCausalLM, AutoTokenizer

model_name_or_path = "Duxiaoman-DI/XuanYuan-70B-Chat"

tokenizer = AutoTokenizer.from_pretrained(model_name_or_path)
model = LlamaForCausalLM.from_pretrained(model_name_or_path, device_map="auto")
model.eval()

seps = ["","</s>"]
roles = ["Human", "Assistant"]

content = "介绍下你自己"
prompt = 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, do_sample=True, temperature=0.7, top_p=0.95)
outputs = tokenizer.decode(outputs.cpu()[0][len(inputs.input_ids[0]):], skip_special_tokens=True)
print(f"输出: {outputs}")

XuanYuan-13B

介绍

最懂金融领域的开源大模型“轩辕”系列,继 176B、70B 之后推出更小参数版本——XuanYuan-13B。这一版本在保持强大功能的同时,采用了更小的参数配置,专注于提升在不同场景下的应用效果。同时,我们也开源了 XuanYuan-13B-Chat 模型的 4bit 和 8bit 量化版本,降低了硬件需求,方便在不同的设备上部署。

主要特点:

  • “以小搏大”的对话能力:在知识理解、创造、分析和对话能力上,可与千亿级别的模型相媲美
  • 金融领域专家:在预训练和微调阶段均融入大量金融数据,大幅提升金融领域专业能力。在金融知识理解、金融业务分析、金融内容创作、金融客服对话几大方面展示出远超一般通用模型的优异表现
  • 人类偏好对齐:通过人类反馈的强化学习 (RLHF) 训练,在通用领域和金融领域均与人类偏好进行对齐

模型训练与创新

在模型训练中,团队在模型预训练阶段动态调整不同语种与领域知识的比例,融入了大量的专业金融语料,并在指令微调中灵活运用之前提出的 Self-QA 和混合训练方法,显著提升了模型在对话中的性能表现。此外,本次“轩辕 13B”还通过强化学习训练,与人类偏好进行对齐。相比于原始模型,RLHF 对齐后的模型,在文本创作、内容生成、指令理解与遵循、安全性等方面都有较大的提升。模型细节请参考文档:Report

通用评测

XuanYuan-13B 在各评测集(通用评测、金融评测)上的结果已在 XuanYuan-6B 的评测内容中给出,请参考。从评测结果来看,XuanYuan-13B 具备很强的通用能力和金融能力,其性能甚至可比肩更大尺寸的模型,做到了以小搏大。和 XuanYuan-6B 类似,XuanYuan-13B 在评测中也进行了考试场景优化。此外,由于评测集是固定且有限的,因此相关评测结果并不完全代表模型的真实能力。

除在固定测试集进行评估外,我们非常关注模型在实际对话中的能力,组建专业的人工评测团队将 XuanYuan-13B 与其他开源系列的 70B 左右参数模型进行 GSB 比较,结果显示:在通用评测中的绝大部分指标,XuanYuan-13B 都可以与其他开源系列的 70B 左右参数模型相媲美,主要评测指标如下(轩辕 vs 其他):

金融评测

XuanYuan-13B 在金融评测也表现出极高的水平,以小博大获得了很好的表现。金融的主要评测指标如下(轩辕 vs 其他):

推理部署

XuanYuan-13B 的 Chat 模型已发布在 Hugging Face,请根据上述的链接进行下载。下面我们给出 Chat 模型的推理部署使用方法。

import torch
from transformers import LlamaForCausalLM, LlamaTokenizer
model_name_or_path = "Duxiaoman-DI/XuanYuan-13B-Chat"
tokenizer = LlamaTokenizer.from_pretrained(model_name_or_path, use_fast=False, legacy=True)
model = LlamaForCausalLM.from_pretrained(model_name_or_path, device_map="auto")
model.eval()
seps = ["","</s>"]
roles = ["Human", "Assistant"]
content = "你是谁"
prompt = "Human:" + content + "Assistant:"
print(f"输入: {content}")
inputs = tokenizer(prompt, return_tensors="pt").to("cuda")
outputs = model.generate(**inputs, max_new_tokens=256, do_sample=True, temperature=0.7, top_p=0.95)
outputs = tokenizer.decode(outputs.cpu()[0][len(inputs.input_ids[0]):], skip_special_tokens=True)
print(f"输出: {outputs}")

介绍

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。

主要特点:

  • 使用更多高质量的数据进行继续预训练和指令微调,各项能力持续提升
  • 支持的上下文长度达到了 16k,使用范围更广
  • 基于人类的反馈信息进行强化训练,进一步对齐了人类偏好

性能评测

类似 XuanYuan-70B,我们也对 XuanYuan2-70B 进行了通用性评测和金融评测。

通用评测

通用评测的目标是观察 XuanYuan2-70B 在使用更多高质量数据进行继续预训练后,英文能力是否得到了保持,中文能力是否得到了增强。同样,我们也选择 MMLU 来测试模型在英文场景下的通用能力,同时使用 CEVAL 和 CMMLU 来测试模型在中文场景下的各项能力。评测结果如下表所示。从表中可以看出,相比 XuanYuan-70B,XuanYuan2-70B 的中文能力得到了进一步提升,同时英文能力也没有出现明显的下降,整体表现符合预期。这一方面证明了我们所做的各项优化的有效性,另一方面也显示出了 XuanYuan2-70B 强大的通用能力。值得注意的是,榜单结果并不完全代表模型的实际性能表现,即便在 CEVAL 和 CMMLU 上我们的评测结果超过了 GPT4,但实际中我们模型的表现和 GPT4 还存在明显的差距,我们将继续优化和提升轩辕模型的各项能力。

模型MMLUCEVALCMMLU
LLaMA2-70B68.952.153.11
XuanYuan-70B70.971.971.10
XuanYuan2-70B70.872.772.7
GPT483.9368.470.95

金融评测

我们在 FinanceIQ 上评测了模型的金融能力。FinanceIQ 是一个专业的金融领域评测集,其涵盖了 10 个金融大类及 36 个金融小类,总计 7173 个单项选择题,某种程度上可客观反应模型的金融能力。评测结果如下表所示。从表中结果可以看出,经过继续优化训练后,XuanYuan2-70B 的综合金融能力得到了进一步提升,这再次证明了我们所做的一系列优化的有效性。同时我们也发现一些细分类目上模型的能力出现了一定程度的退化,这说明模型仍存在一定的优化空间,我们将继续优化提升轩辕模型的金融能力。

模型平均分注册会计师银行从业资格证券从业资格基金从业资格保险从业资格经济师税务师期货从业资格理财规划师精算师
XuanYuan-70B67.5669.4976.4069.5674.8967.8284.8158.471.5965.1537.50
XuanYuan2-70B67.8368.6369.7279.171.5169.6884.8158.272.9871.8631.82
GPT460.0552.3368.7264.868.8168.6875.5846.9363.5163.8427.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 可用性更高,模型生成速度均有显著提升。

XuanYuan-70B

介绍

XuanYuan-70B 是基于 Llama2-70B 模型进行中文增强的一系列金融大模型,包含大量中英文语料增量预训练之后的底座模型以及使用高质量指令数据进行对齐的 chat 模型。考虑到金融场景下存在较多长文本的业务,因此基于高效的分布式训练框架,我们将模型的上下文长度在预训练阶段从 4k 扩充到了 8k 和 16k,这也是首个在 70B 参数量级上达到 8k 及以上上下文长度的开源大模型,模型细节请参考文档:Report

主要特点:

  • 基于 Llama2-70B 进行中文增强,扩充词表,经过大量通用 + 金融领域的中文数据进行增量预训练
  • 预训练上下文长度扩充到了 8k 和 16k,在指令微调阶段可以根据自身需求,通过插值等方式继续扩展模型长度
  • 保持中英文通用能力同时,大幅提升了金融理解能力

性能评测

本部分包括通用能力评测和金融领域评测。我们模型训练的目标是通用能力尽可能保持的同时,金融领域能力可以得到明显提升。

需要说明的是,对于客观类评测,我们统一采用基座模型进行测试,而对于主观对话,我们使用 Chat 模型进行测试。

通用评测

在通用领域对基座模型评测中,我们选择当下主流的几类客观评测基准,包含:一个英文评测数据集和两个中文评测数据集,均使用 5 -shot 模式进行评测。

  • MMLU 是一个综合的英文评测基准,涵盖了 STEM,人文学科,社会科学等领域的 57 个主题。它的难度从初级水平到高级专业水平,它考验世界知识和解决问题的能力。
  • C-Eval 是一个全面的中文基础模型评估基准。它包含了 13948 个多项选择题,涵盖了 52 个不同的学科和四个难度级别
  • CMMLU 是一个综合性的中文评估基准,专门用于评估语言模型在中文语境下的知识和推理能力。CMMLU 涵盖了从基础学科到高级专业水平的 67 个主题。

我们选择了几种主流的大模型来进行对比:

模型MMLUCEVALCMMLU
XuanYuan-70B70.971.971.10
Llama2-70B68.952.1053.11
GPT483.9368.4070.95
InternLM-20B62.0558.8*–
Baichun2-13B-base59.1758.1061.97
XVERSE-13B-base55.154.758.4
Qwen-7B56.759.658.66
ChatGLM2-6B45.9051.7048.80
  • XuanYuan-70B 在中英文客观评测集方面均有着出色的表现,
  • XuanYuan-70B 模型相比原始 Llama2-70B,保留了其出色的英文能力,且有一定的提升;在中文能力评测方面,得到了显著的增强。
  • 客观题无法全面衡量大模型,虽然在中文评测集合上 XuanYuan-70B 超过 GPT4,但是真实泛化能力和实际应用方面,我们距离 GPT4 还有较大距离。

附:我们也提供了随着增量预训练的进行,模型在 C -EVAL 上的效果的变化: 

金融评测

为了有效评估模型在金融环境中的表现,我们同时开源了FinanceIQ:中文金融领域知识评估数据集 ,涵盖了 10 个金融大类及 36 个金融小类,总计 7173 个单项选择题,且为了尽可能缓解“数据泄漏”的现象,将所有模型放在“同一起跑线”上进行客观公正地评估,我们对题目都进行了改写和人工校对,从而可以验证模型的泛化能力。

我们选择了当前具备代表性的多个开源和可访问模型进行评测,其中基座模型使用 5 -shot 来测试,Chat 模型使用 0 -shot 来测试,结果如下:

模型平均分注册会计师银行从业资格证券从业资格基金从业资格保险从业资格经济师税务师期货从业资格理财规划师精算师
XuanYuan-70B67.5669.4976.4069.5674.8967.8284.8158.4071.5965.1537.50
XuanYuan-70B-Chat63.7865.4573.8471.0973.9759.7767.3147.7573.6767.4337.50
GPT4 (0-shot)60.0552.3368.7264.868.8168.6875.5846.9363.5163.8427.27
ErnieBot (0-shot)55.4450.864.7256.3860.8959.4874.4244.2656.1256.6830.68
Qwen-14B53.2946.7663.256.3858.8357.7669.2342.6256.5857.6523.86
Baichuan2-13B-Base51.245.4658.8850.9457.854.4564.8142.8350.8153.0932.95
Baichuan2-7B-Base47.3539.3654.5645.5852.6451.0160.5838.5249.4251.1430.68
Baichuan-13B-Base44.4939.7452.843.3752.2948.9958.8533.6143.6553.4218.18
ChatGPT (0-shot)44.234.3253.1244.8155.0549.7155.1931.9745.2749.8422.73
Qwen-7B41.4735.749.9242.3548.3943.157.8830.1242.4944.320.45
ErnieBot-Turbo (0-shot)40.6935.4948.3237.7644.6143.535032.1743.8844.9526.14
Chinese-LLaMA-2-13B38.6532.0443.3640.8242.0945.1150.3831.3540.6539.0921.59
Baichuan-7B37.1430.8941.1239.1241.5141.2445.3828.8939.9541.6921.59
LLaMA-2-13B35.0932.7237.637.5939.6837.9341.1527.0536.0338.4422.73
InternLM-7B33.9127.614035.1233.1434.3436.3529.7134.6437.4630.68
LLaMA-2-7B31.4928.331.634.4432.3434.6335.5825.8230.2526.7135.23
Chinese-LLaMA-2-7B30.8228.7632.6436.0532.832.7638.0822.9535.3328.3420.45

推理部署

XuanYuan-70B 的基座模型、Chat 模型以及 8 -bit 和 4bit 量化模型均已发布在 Hugging Face,请根据上述的链接进行下载。下面我们给出基座模型和 Chat 模型的推理部署使用方法。

依赖安装

CUDA >= 11.8
torch >= 2.0
transformers >= 4.33.1
accelerate
sentencepiece
bitsandbytes(8bit 量化所需)
optimum(4bit 量化所需)
auto-gptq(4bit 量化所需)
vllm(推理加速所需)

资源需求:

  • 对于基座模型和 Chat 模型,部署至少需要 2 张 80G 的显卡进行加载模型
  • 对于 8bit 量化版本,推理部署至少需要 1 张 80G 的显卡进行加载模型
  • 对于 4bit 量化版本,,推理部署至少需要 1 张 40G 的显卡进行加载模型

Base 模型使用方法

因为 XuanYuan-70B 系列模型均是基于 Llama2-70B 进行增量预训练而来,因此基座模型的使用方法与 Llama2 基座模型保持一致。

import torch
from transformers import LlamaForCausalLM, LlamaTokenizer

model_name_or_path = "Duxiaoman-DI/XuanYuan-70B"
tokenizer = LlamaTokenizer.from_pretrained(model_name_or_path, use_fast=False, legacy=True)
model = LlamaForCausalLM.from_pretrained(model_name_or_path, torch_dtype=torch.bfloat16,device_map="auto")
model.eval()
inputs = tokenizer("问题:李时珍是哪一个朝代的人?回答:", return_tensors="pt").to("cuda")
outputs = model.generate(**inputs, max_new_tokens=64, repetition_penalty=1.1)
outputs = tokenizer.decode(outputs.cpu()[0][len(inputs.input_ids[0]):], skip_special_tokens=True)
print(outputs)

Chat 模型使用方法

在指令微调构造 prompt 的时候,我们参考了 FastChat 的对话构造方式,简单代码示例如下:

import torch
from transformers import LlamaForCausalLM, LlamaTokenizer

model_name_or_path = "Duxiaoman-DI/XuanYuan-70B-Chat"

tokenizer = LlamaTokenizer.from_pretrained(model_name_or_path, use_fast=False, legacy=True)
model = LlamaForCausalLM.from_pretrained(model_name_or_path, device_map="auto")
model.eval()
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, do_sample=True, temperature=0.7, top_p=0.95)
outputs = tokenizer.decode(outputs.cpu()[0][len(inputs.input_ids[0]):], skip_special_tokens=True)
print(f"输出: {outputs}")
  • 示例同时支持 8bit 和 4bit 的量化模型
  • 示例仅为最简单的部署代码,没有考虑多轮、推理加速等; 完整 demo 请参考 cli_demo.py

CLI 工具

我们提供一个了基于命令行的 demo,支持多轮对话和基于 vLLM 的推理加速。

vllm 暂时不支持量化模型

python3 cli_demo.py --checkpoint_path <XuanYuan-70B-Chat Path>

举例如下:

########
输入为: EXIT!! 表示退出
输入为: CLEAR!! 表示清空上下文
########
输入: 你好
输出: 你好,很高兴能为你提供帮助。输入: 介绍下你自己
输出: 我是轩辕大模型,一个由度小满数据智能应用部 AI Lab 开发的人工智能助手,我可以回答各种问题,提供实用的建议和帮助,帮助用户完成各种任务。输入: 有 2 块五仁月饼,3 块莲蓉月饼,2 块豆沙月饼,这些月饼的大小形状质量完全相同。从这 7 块月饼中,任意取出 3 块,那么三种月饼都取到 的可能性是几分之几?输出: 这是一个组合数学问题,我们可以通过计算组合数来解答。三种月饼都取到,即取到五仁、莲蓉和豆沙各一块。五仁月饼的选取方法有 2 种,莲蓉月饼的选取方法有 3 种,豆沙月饼的选取方法有 2 种,所以总的取出一种五仁、一种莲蓉、一种豆沙的方法有 2 *3*2=12 种。从 7 块月饼中任意取出 3 块月饼的总的组合数为 C(7,3)=35 种。所以,从这 7 块月饼中,任意取出 3 块,三种月饼都取到 的可能性为 12/35。

量化部署

为了降低用户在本地使用 XuanYuan 的成本,降低显存需求,我们提供量化好的 Xuanyuan-70B-Chat 模型 8bit 和 4bit 模型。

8bit 离线量化模型

在 8bit 量化算法上,我们使用目前社区广泛使用的 bitsandbytes 库。该库包含 LLM.int8()量化算法的实现以及一系列量化的工具,同时该方法已在 transformers 库里做了集成,使用较为容易。经过我们的测试,8bit 量化可以近乎无损。

4bit 离线量化模型

在 4bit 量化算法上,我们使用 auto-gptq 工具。该库实现的 GPTQ 算法是目前 4bit 量化最受欢迎的方法,同时该方法在 transformers 库和 optimum 库里做了集成,使用较为容易。4bit 量化损失很低,基本可以正常使用。

量化效果

下表给出了不同模型所需显存,以及在三个评测基准上 CEVAL,CMMLU 和 MMLU 上效果:

模型显存CEVALCMMLUMMLU
XuanYuan-70B-Chat129G62.1560.4165.3
XuanYuan-70B-Chat-8bit65G62.2559.9965.0
XuanYuan-70B-Chat-4bit35G60.9458.7663.0

可以看出:

  • 8bit 和 4bit 的量化模型相比原始 float16 的模型,空间分别降低为原来的 1 / 2 和 1 /4。能够显著降低硬件需求。
  • 8bit 的量化模型相原始 float16 的模型,效果近乎无损,4bit 的量化模型,大概下降 2 个点左右。
  • Chat 模型相比 Base 模型在指标上有所下降,我们认为是符合预期的,SFT 阶段我们更加重视指令遵循能力和内容生成方面的能力。
  • 我们也对量化版本的 Chat 模型进行对话人工评测,结论与评测基准类似。

使用量化模请参考上面的 Chat 模型使用方法的示例代码。

开源金融数据集

本次开源高质量中文金融数据集 FinCorpus,语料大小约 60G,主要构成如下:

文件名数据类别大小
announcement_data.jsonl上市公司公告20G
fin_news_data.jsonl金融资讯 / 新闻30G
fin_articles_data.jsonl金融资讯 / 新闻10G
fin_exam.jsonl金融试题370M

数据格式:

{"text": < 文本内容>,"meta": {"source": < 数据来源>
  }
}

轩辕 -176B:首个千亿级中文金融对话模型

XuanYuan: A Large Chinese Financial Chat Model with Hundreds of Billions Parameters

1. 模型简介

轩辕是国内首个开源的千亿级中文对话大模型,同时也是首个针对中文金融领域优化的千亿级开源对话大模型。轩辕在 BLOOM-176B 的基础上针对中文通用领域和金融领域进行了针对性的预训练与微调,它不仅可以应对通用领域的问题,也可以解答与金融相关的各类问题,为用户提供准确、全面的金融信息和建议。

2. 模型下载

千亿级的轩辕模型已可以在 Huggingface 中申请下载。

3. 模型评测

3.1. 金融领域效果评测

为了深入评估轩辕对话大模型在金融领域的专业性,我们构建了一套针对金融领域的详细评测体系。该评测体系涉及金融名词理解、金融市场评论、金融数据分析和金融新闻理解等四大领域,从多角度全面考察模型的金融处理能力。评测结果表明,轩辕在主流的四种开源大模型的比较中,赢得了 150 次回答中 63.33% 的胜率,凸显出其在金融领域的显著优势。

f119d2cf76493fc383aef1e45

点击显示轩辕回答示例

3.2. 通用领域效果评测

除了在金融领域的突出表现,轩辕还在通用处理能力方面表现优秀。我们利用由 200 道多元化问题构成的通用评测集,对轩辕在数学计算、场景写作、逻辑推理、文本摘要等 13 个主要维度的表现进行了评估,并将其与 ChatGPT 进行了对比。结果显示,轩辕在这个评测集上,有 71% 的问题表现不亚于 ChatGPT,验证了其全方面能力。

9038f05c34b82b3eae00603f6

4. 相关论文

如果有用到轩辕相关方法和模型,请引用以下论文:

XuanYuan 2.0: A Large Chinese Financial Chat Model with Hundreds of Billions Parameters

Self-QA: Unsupervised Knowledge Guided Language Model Alignment

CGCE: A Chinese Generative Chat Evaluation Benchmark for General and Financial Domains

5. 使用说明

本模型推荐运行在 8 卡 A100 GPU 或同等配置下以获得最佳性能。

可以通过以下代码调用本模型:

from transformers import AutoTokenizer, AutoModel
tokenizer = AutoTokenizer.from_pretrained("MODEL_NAME", trust_remote_code=True)
model = AutoModel.from_pretrained("MODEL_NAME", trust_remote_code=True)

【热门问题】如何调用轩辕模型?

由于本模型较大并不支持线上 API 测试,请下载模型后使用 transformers 库的 AutoTokenizer 和 AutoModel 进行调用。轩辕对话模型的输入示例:

BOS_TOKEN +"Human: "+ query +"\n\nAssistant: "

轩辕对话模型的生成示例:

output = model.generate(**input, do_sample=True, temperature=0.8, top_k=50, top_p=0.9, early_stopping=True, repetition_penalty=1.1, min_new_tokens=1, max_new_tokens=256)

免责声明与许可协议

对于轩辕模型生成的言论,我们不承担任何责任。使用者在将轩辕模型时,需要自行承担潜在的风险,并始终保持审慎。我们建议用户在使用模型输出的信息时,进行独立的验证和判断,并根据个人的需求和情境进行决策。我们希望通过轩辕的开源发布,为学术界和工业界提供一个有益的工具,并推动对话系统和金融技术的发展。我们鼓励大家积极探索和创新,以进一步拓展和应用轩辕的潜力,并共同促进人工智能在金融领域的研究和实践。

总结

我们鼓励使用者在相关工作中引用轩辕,以促进知识的交流和分享,并推动中文金融对话系统的发展。轩辕的发布将为金融领域的应用和研究提供强大的支持,并为中文金融对话系统的发展做出重要贡献。我们期待看到更多的创新和应用,以提升金融服务和用户体验,并进一步推动人工智能技术在金融领域的发展。

使用 Hugo 构建
主题 Stack,作者 Jimmy