写点什么

开启中文智能之旅:探秘超乎想象的 Llama2-Chinese 大模型世界

  • 2023-10-11
    浙江
  • 本文字数:7076 字

    阅读完需:约 23 分钟

开启中文智能之旅:探秘超乎想象的 Llama2-Chinese 大模型世界

“开启中文智能之旅:探秘超乎想象的 Llama2-Chinese 大模型世界”

1.国内 Llama2 最新下载地址

本仓库中的代码示例主要是基于 Hugging Face 版本参数进行调用,我们提供了脚本将 Meta 官网发布的模型参数转换为 Hugging Face 支持的格式,可以直接通过 transformers 库进行加载:参数格式转化


  • Llama2-7B 官网版本:https://pan.xunlei.com/s/VN_kR2fwuJdG1F3CoF33rwpIA1?pwd=z9kf

  • Llama2-7B-Chat 官网版本:https://pan.xunlei.com/s/VN_kQa1_HBvV-X9QVI6jV2kOA1?pwd=xmra

  • Llama2-13B 官网版本:https://pan.xunlei.com/s/VN_izibaMDoptluWodzJw4cRA1?pwd=2qqb

  • Llama2-13B-Chat 官网版本:https://pan.xunlei.com/s/VN_iyyponyapjIDLXJCNfqy7A1?pwd=t3xw

  • Llama2-7B Hugging Face 版本:https://pan.xunlei.com/s/VN_t0dUikZqOwt-5DZWHuMvqA1?pwd=66ep

  • Llama2-7B-Chat Hugging Face 版本:https://pan.xunlei.com/s/VN_oaV4BpKFgKLto4KgOhBcaA1?pwd=ufir

  • Llama2-13B Hugging Face 版本:https://pan.xunlei.com/s/VN_yT_9G8xNOz0SDWQ7Mb_GZA1?pwd=yvgf

  • Llama2-13B-Chat Hugging Face 版本:https://pan.xunlei.com/s/VN_yA-9G34NGL9B79b3OQZZGA1?pwd=xqrg

  • Llama2-70B-Chat Hugging Face 版本:https://pan.xunlei.com/s/VNa_vCGzCy3h3N7oeFXs2W1hA1?pwd=uhxh#

  • CodeLlama-7b 官网版本:https://pan.baidu.com/s/1cIPzdNywWLvQI7_2QanOEQ?pwd=zfwi

  • CodeLlama-7b-Python 官网版本:https://pan.baidu.com/s/1liY8klGoDagYbpw-g-oFag?pwd=i952

  • CodeLlama-7b-Instruct 官网版本:https://pan.baidu.com/s/108o9_DT2E_vfSGtOnDCQVw?pwd=zkt9

  • CodeLlama-13b 官网版本:https://pan.baidu.com/s/1lLaeHv0XEBv0iiZzI1dpnw?pwd=qn99

  • CodeLlama-13b-Python 官网版本:https://pan.baidu.com/s/1OLVfvZS_oqL3oqMKwsI87w?pwd=a78k

  • CodeLlama-13b-Instruct 官网版本:https://pan.baidu.com/s/1HyxJl4w8wElgkZRh2ATrXQ?pwd=seg6

  • CodeLlama-34b 官网版本:https://pan.baidu.com/s/1vEw0pFgIkctPUN4_5_6pIQ?pwd=q8eu

2.Atom 大模型

原子大模型 Atom 由 Llama 中文社区和原子回声联合打造,在中文大模型评测榜单 C-Eval 中位居前十(8 月 21 日评测提交时间)。



Atom 系列模型包含 Atom-7B 和 Atom-13B,基于 Llama2 做了中文能力的持续优化。Atom-7B 和 Atom-7B-Chat 目前已完全开源,支持商用,可在Hugging Face仓库获取模型,详情见Atom-7B下载。Atom 大模型针对中文做了以下优化:


  • 大规模的中文数据预训练


原子大模型 Atom 在 Llama2 的基础上,采用大规模的中文数据进行持续预训练,包含百科、书籍、博客、新闻、公告、小说、金融数据、法律数据、医疗数据、代码数据、专业论文数据、中文自然语言处理竞赛数据集等,详见📝 数据来源


同时对庞大的数据进行了过滤、打分、去重,筛选出超过 1T token 的高质量中文数据,持续不断加入训练迭代中。


  • 更高效的中文词表为了提高中文文本处理的效率,我们针对 Llama2 模型的词表进行了深度优化。首先,我们基于数百 G 的中文文本,在该模型词表的基础上扩展词库至 65,000 个单词。经过测试,我们的改进使得中文编码/解码速度提高了约 350%。此外,我们还扩大了中文字符集的覆盖范围,包括所有 emoji 符号😊。这使得生成带有表情符号的文章更加高效。

  • 自适应上下文扩展 Atom 大模型默认支持 4K 上下文,利用位置插值 PI 和 Neural Tangent Kernel (NTK)方法,经过微调可以将上下文长度扩增到 32K。

2.1 中文数据

我们通过以下数据来优化 Llama2 的中文能力:


2.2 模型部署

Meta 在🤗Hugging Face 上提供了所有模型的下载链接:https://huggingface.co/meta-llama


Llama 中文社区的中文模型下载链接:https://huggingface.co/FlagAlpha

2.2.1 模型下载

Meta 官方 Llama2 模型

Llama2 预训练模型包含 7B、13B 和 70B 三个版本。Llama2-Chat 模型基于预训练模型进行了监督微调,具备更强的对话能力。


基于 Llama2 的中文微调模型

我们基于中文指令数据集对 Llama2-Chat 模型进行了微调,使得 Llama2 模型有着更强的中文对话能力。LoRA 参数以及与基础模型合并的参数均已上传至Hugging Face,目前包含 7B 和 13B 的模型。


基于 Llama2 的中文预训练模型 Atom

社区提供预训练版本 Atom-7B 和基于 Atom-7B 进行对话微调的模型参数供开放下载,模型参数会持续不断更新,关于模型的进展详见社区官网llama.family


2.2.2 模型调用代码示例

import torchfrom transformers import AutoTokenizer, AutoModelForCausalLMmodel = AutoModelForCausalLM.from_pretrained('FlagAlpha/Atom-7B',device_map='auto',torch_dtype=torch.float16,load_in_8bit=True)model =model.eval()tokenizer = AutoTokenizer.from_pretrained('FlagAlpha/Atom-7B',use_fast=False)tokenizer.pad_token = tokenizer.eos_tokeninput_ids = tokenizer(['<s>Human: 介绍一下中国\n</s><s>Assistant: '], return_tensors="pt",add_special_tokens=False).input_ids.to('cuda')        generate_input = {    "input_ids":input_ids,    "max_new_tokens":512,    "do_sample":True,    "top_k":50,    "top_p":0.95,    "temperature":0.3,    "repetition_penalty":1.3,    "eos_token_id":tokenizer.eos_token_id,    "bos_token_id":tokenizer.bos_token_id,    "pad_token_id":tokenizer.pad_token_id}generate_ids  = model.generate(**generate_input)text = tokenizer.decode(generate_ids[0])print(text)
复制代码

2.2.3 FastAPI 接口搭建

为了方便通过 API 方式调用模型,我们提供了脚本用来快速搭建FastAPI接口,相关测试代码与 API 参数设置见API 调用

2.2.4 Gradio 快速搭建问答平台

基于 gradio 搭建的问答界面,实现了流式的输出,将下面代码复制到控制台运行,以下代码以 Atom-7B 模型为例,<font color="#006600">不同模型只需修改一下代码里的模型名称就好了😊</font><br/>


python examples/chat_gradio.py --model_name_or_path FlagAlpha/Atom-7B
复制代码


2.2.5 Docker 部署问答接口

详情参见:Docker部署


第一步:准备 docker 镜像,通过 docker 容器启动chat_gradio.py


git clone https://github.com/FlagAlpha/Llama2-Chinese.git
cd Llama2-Chinese
docker build -f docker/Dockerfile -t flagalpha/llama2-chinese-7b:gradio .
复制代码


第二步:通过 docker-compose 启动 chat_gradio


cd Llama2-Chinese/dockerdoker-compose up -d --build
复制代码

2.3 模型预训练

虽然 Llama2 的预训练数据相对于第一代 LLaMA 扩大了一倍,但是中文预训练数据的比例依然非常少,仅占 0.13%,这也导致了原始 Llama2 的中文能力较弱。为了能够提升模型的中文能力,可以采用微调和预训练两种路径,其中:


  • 微调需要的算力资源少,能够快速实现一个中文 Llama 的雏形。但缺点也显而易见,只能激发基座模型已有的中文能力,由于 Llama2 的中文训练数据本身较少,所以能够激发的能力也有限,治标不治本。

  • 基于大规模中文语料进行预训练,成本高,不仅需要大规模高质量的中文数据,也需要大规模的算力资源。但是优点也显而易见,就是能从模型底层优化中文能力,真正达到治本的效果,从内核为大模型注入强大的中文能力。


我们为社区提供了 Llama 模型的预训练代码,以及中文测试语料,更多数据可以参考中文语料。具体代码和配置如下:


2.4 模型微调

本仓库中同时提供了 LoRA 微调和全量参数微调代码,关于 LoRA 的详细介绍可以参考论文“LoRA: Low-Rank Adaptation of Large Language Models”以及微软 Github 仓库LoRA

Step1: 环境准备

根据requirements.txt安装对应的环境依赖。

Step2: 数据准备

在 data 目录下提供了一份用于模型 sft 的数据样例:



每个 csv 文件中包含一列“text”,每一行为一个训练样例,每个训练样例按照以下格式将问题和答案组织为模型输入,您可以按照以下格式自定义训练和验证数据集:


"<s>Human: "+问题+"\n</s><s>Assistant: "+答案
复制代码


例如,


<s>Human: 用一句话描述地球为什么是独一无二的。</s><s>Assistant: 因为地球是目前为止唯一已知存在生命的行星。</s>
复制代码

Step3: 微调脚本

LoRA 微调

LoRA 微调脚本见:train/sft/finetune_lora.sh,关于 LoRA 微调的具体实现代码见train/sft/finetune_clm_lora.py,单机多卡的微调可以通过修改脚本中的--include localhost:0来实现。

全量参数微调

全量参数微调脚本见:train/sft/finetune.sh,关于全量参数微调的具体实现代码见train/sft/finetune_clm.py

Step4: 加载微调模型

LoRA 微调

基于 LoRA 微调的模型参数见:基于Llama2的中文微调模型,LoRA 参数需要和基础模型参数结合使用。


通过PEFT加载预训练模型参数和微调模型参数,以下示例代码中,base_model_name_or_path 为预训练模型参数保存路径,finetune_model_path 为微调模型参数保存路径。


import torchfrom transformers import AutoTokenizer, AutoModelForCausalLMfrom peft import PeftModel,PeftConfig#例如: finetune_model_path='FlagAlpha/Llama2-Chinese-7b-Chat-LoRA'finetune_model_path=''  config = PeftConfig.from_pretrained(finetune_model_path)#例如: base_model_name_or_path='meta-llama/Llama-2-7b-chat'tokenizer = AutoTokenizer.from_pretrained(config.base_model_name_or_path,use_fast=False)tokenizer.pad_token = tokenizer.eos_tokenmodel = AutoModelForCausalLM.from_pretrained(config.base_model_name_or_path,device_map='auto',torch_dtype=torch.float16,load_in_8bit=True)model = PeftModel.from_pretrained(model, finetune_model_path, device_map={"": 0})model =model.eval()input_ids = tokenizer(['<s>Human: 介绍一下北京\n</s><s>Assistant: '], return_tensors="pt",add_special_tokens=False).input_ids.to('cuda')        generate_input = {    "input_ids":input_ids,    "max_new_tokens":512,    "do_sample":True,    "top_k":50,    "top_p":0.95,    "temperature":0.3,    "repetition_penalty":1.3,    "eos_token_id":tokenizer.eos_token_id,    "bos_token_id":tokenizer.bos_token_id,    "pad_token_id":tokenizer.pad_token_id}generate_ids  = model.generate(**generate_input)text = tokenizer.decode(generate_ids[0])print(text)
复制代码

全量参数微调

对于全量参数微调的模型,调用方式同模型调用代码示例,只需要修改其中的模型名称或者保存路径即可。


2.5 模型量化

我们对中文微调的模型参数进行了量化,方便以更少的计算资源运行。目前已经在Hugging Face上传了 13B 中文微调模型FlagAlpha/Llama2-Chinese-13b-Chat的 4bit 压缩版本FlagAlpha/Llama2-Chinese-13b-Chat-4bit,具体调用方式如下:


from transformers import AutoTokenizerfrom auto_gptq import AutoGPTQForCausalLMmodel = AutoGPTQForCausalLM.from_quantized('FlagAlpha/Llama2-Chinese-13b-Chat-4bit', device="cuda:0")tokenizer = AutoTokenizer.from_pretrained('FlagAlpha/Llama2-Chinese-13b-Chat-4bit',use_fast=False)input_ids = tokenizer(['<s>Human: 怎么登上火星\n</s><s>Assistant: '], return_tensors="pt",add_special_tokens=False).input_ids.to('cuda')        generate_input = {    "input_ids":input_ids,    "max_new_tokens":512,    "do_sample":True,    "top_k":50,    "top_p":0.95,    "temperature":0.3,    "repetition_penalty":1.3,    "eos_token_id":tokenizer.eos_token_id,    "bos_token_id":tokenizer.bos_token_id,    "pad_token_id":tokenizer.pad_token_id}generate_ids  = model.generate(**generate_input)text = tokenizer.decode(generate_ids[0])print(text)
复制代码

2.6 推理加速

随着大模型参数规模的不断增长,在有限的算力资源下,提升模型的推理速度逐渐变为一个重要的研究方向。常用的推理加速框架包含 lmdeploy、FasterTransformer、vLLM 和 JittorLLMs 等。

FasterTransformer

FasterTransformer由 NVIDIA 开发,采用 C++/CUDA 编写,支持分布式推理,transformer 编码器和解码器均可进行加速。通过 FasterTransformer 和Triton加速 LLama2 模型推理,目前支持 FP16 或者 Int8 推理,Int4 目前还不支持。


详细的推理文档见:inference-speed/GPU/FasterTransformer_example

vLLM

vLLM由加州大学伯克利分校开发,核心技术是 PageAttention,吞吐量比 HuggingFace Transformers 高出 24 倍。相较与 FasterTrainsformer,vLLM 更加的简单易用,不需要额外进行模型的转换,支持 fp16 推理。


详细的推理文档见:inference-speed/GPU/vllm_example

JittorLLMs

JittorLLMs由非十科技领衔,与清华大学可视媒体研究中心合作研发,通过动态 swap 机制大幅降低硬件配置要求(减少 80%),并且 Jittor 框架通过零拷贝技术,大模型加载相比 Pytorch 开销降低 40%,同时,通过元算子自动编译优化,计算性能提升 20%以上。


详细的推理文档见:inference-speed/GPU/JittorLLMs

lmdeploy

lmdeploy 由上海人工智能实验室开发,推理使用 C++/CUDA,对外提供 python/gRPC/http 接口和 WebUI 界面,支持 tensor parallel 分布式推理、支持 fp16/weight int4/kv cache int8 量化。


详细的推理文档见:inference-speed/GPU/lmdeploy_example

2.7 模型评测

为了能够更加清晰地了解 Llama2 模型的中文问答能力,我们筛选了一些具有代表性的中文问题,对 Llama2 模型进行提问。我们测试的模型包含 Meta 公开的 Llama2-7B-Chat 和 Llama2-13B-Chat 两个版本,没有做任何微调和训练。测试问题筛选自AtomBulb,共 95 个测试问题,包含:通用知识、语言理解、创作能力、逻辑推理、代码编程、工作技能、使用工具、人格特征八个大的类别。


测试中使用的 Prompt 如下,例如对于问题“列出 5 种可以改善睡眠质量的方法”:


[INST] <<SYS>>You are a helpful, respectful and honest assistant. Always answer as helpfully as possible, while being safe.  Your answers should not include any harmful, unethical, racist, sexist, toxic, dangerous, or illegal content. Please ensure that your responses are socially unbiased and positive in nature. The answer always been translate into Chinese language.
If a question does not make any sense, or is not factually coherent, explain why instead of answering something not correct. If you don't know the answer to a question, please don't share false information.
The answer always been translate into Chinese language.<</SYS>>
列出5种可以改善睡眠质量的方法[/INST]
复制代码


Llama2-7B-Chat 的测试结果见meta_eval_7B.md,Llama2-13B-Chat 的测试结果见meta_eval_13B.md


通过测试我们发现,Meta 原始的 Llama2 Chat 模型对于中文问答的对齐效果一般,大部分情况下都不能给出中文回答,或者是中英文混杂的形式。因此,基于中文数据对 Llama2 模型进行训练和微调十分必要,我们的中文版 Llama2 模型也已经在训练中,近期将对社区开放。

2.8 外延能力

除了持续增强大模型内在的知识储备、通用理解、逻辑推理和想象能力等,未来,我们也会不断丰富大模型的外延能力,例如知识库检索、计算工具、WolframAlpha、操作软件等。我们首先集成了 LangChain 框架,可以更方便地基于 Llama2 开发文档检索、问答机器人和智能体应用等,关于 LangChain 的更多介绍参见LangChain

LangChain

针对 LangChain 框架封装的 Llama2 LLM 类见examples/llama2_for_langchain.py,简单的调用代码示例如下:


from llama2_for_langchain import Llama2
#这里以调用4bit量化压缩的Llama2-Chinese参数FlagAlpha/Llama2-Chinese-13b-Chat-4bit为例llm = Llama2(model_name_or_path='FlagAlpha/Llama2-Chinese-13b-Chat-4bit', bit4=True)
while True: human_input = input("Human: ") response = llm(human_input) print(f"Llama2: {response}")
复制代码

2.9 代码模型

Meta 官方在 2023 年 8 月 24 日发布了 Code Llama,基于代码数据对 Llama2 进行了微调,提供三个不同功能的版本:基础模型(Code Llama)、Python 专用模型(Code Llama - Python)和指令跟随模型(Code Llama - Instruct),包含 7B、13B、34B 三种不同参数规模。不同模型能力区别如下表所示:



我们提供了 Code Llama 的国内下载链接以及在线体验地址llama.family,关于 Code Llama 的详细信息可以参考官方 Github 仓库codellama

3.学习资料



更多优质内容请关注公号:汀丶人工智能;会提供一些相关的资源和优质文章,免费获取阅读。



发布于: 刚刚阅读数: 5
用户头像

本博客将不定期更新关于NLP等领域相关知识 2022-01-06 加入

本博客将不定期更新关于机器学习、强化学习、数据挖掘以及NLP等领域相关知识,以及分享自己学习到的知识技能,感谢大家关注!

评论

发布
暂无评论
开启中文智能之旅:探秘超乎想象的 Llama2-Chinese 大模型世界_人工智能_汀丶人工智能_InfoQ写作社区