transformers safetensors llama text-generation license:llama2 autotrain_compatible endpoints_compatible text-generation-inference 4-bit gptq region:us
---
license: llama2
---

## 介绍

XuanYuan2-70B系列模型是在[XuanYuan-70B](https://huggingface.co/Duxiaoman-DI/XuanYuan-70B)基座模型基础上，使用更多高质量的语料进行继续预训练和指令微调，并进行基于人类反馈的强化训练而得到。相比第一代XuanYuan-70B系列模型，第二代模型在通用性、安全性和金融能力上都得到了明显提高，模型输出更加符合人类偏好。同时，第二代模型支持的上下文长度达到16k，能够更好处理长文本输入，适用范围更为广泛。模型细节请参考文档：[Report](https://github.com/Duxiaoman-DI/XuanYuan/blob/main/xuanyuan2_70b_report.md)

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](https://huggingface.co/Duxiaoman-DI/XuanYuan2-70B) | 🤗 [XuanYuan2-70B-Chat](https://huggingface.co/Duxiaoman-DI/XuanYuan2-70B-Chat) | 🤗 [XuanYuan2-70B-Chat-8bit](https://huggingface.co/Duxiaoman-DI/XuanYuan2-70B-Chat-8bit ) | 🤗  [XuanYuan2-70B-Chat-4bit](https://huggingface.co/Duxiaoman-DI/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](https://github.com/Duxiaoman-DI/XuanYuan/tree/main/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](https://huggingface.co/Duxiaoman-DI/XuanYuan-70B)系列模型的介绍内容。

为降低硬件需求，我们也提供了XuanYuan2-70B-Chat模型的8bit和4bit量化版本。

### 8bit模型
在8bit量化算法上，我们使用目前社区广泛使用的bitsandbytes库。经测试，8bit量化对模型的性能损失很低。8bit模型的使用方式如下所示（需注意promopt格式，我们在训练时设置了system message）：

```python
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](https://github.com/PanQiWei/AutoGPTQ)工具。4bit模型使用方式如下所示，同样，需要对齐我们的prompt格式：

```python
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量化模型：
```python
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可用性更高，模型生成速度均有显著提升。