--- 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 = [" ", ""] 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 = [" ", ""] 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 = [" ", ""] 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可用性更高,模型生成速度均有显著提升。