欢迎 Llama 3 - Meta 的新开源大语言模型
简介
Meta 的 Llama 3,作为开放获取的 Llama 家族的下一次迭代,现已发布并在 Hugging Face 上提供。很高兴看到 Meta 继续致力于开放人工智能,我们也很激动能通过在 Hugging Face 生态系统中的全面集成来全力支持此次发布。
Llama 3 有两种尺寸:8B 用于在消费级 GPU 上的高效部署和开发,70B 用于大规模 AI 原生应用。这两种尺寸都有基础版和指令调优版。除了这 4 个模型外,还有一个新版本的 Llama Guard,它是在 Llama 3 8B 上进行微调后发布的,名为 Llama Guard 2(安全微调)。
我们与 Meta 合作,以确保 Llama 3 能最好地集成到 Hugging Face 生态系统中。你可以在 Hub 上找到所有 5 个开放获取模型(2 个基础模型,2 个微调模型和 Llama Guard)。在我们发布的特性和集成中,包括:
- Hub 上的模型,附带它们的模型卡和许可证
- 🤗 Transformers 集成
- Meta Llama 3 70B 的 Hugging Chat 集成
- 集成到 Inference Endpoints、Google Cloud 和 Amazon SageMaker 中的推理功能
- 使用 🤗 TRL 在单个 GPU 上微调 Llama 3 8B 的示例
目录
Llama 3 有哪些新功能?
Llama 3 的发布带来了 Meta 基于 Llama 2 架构的 4 个新的开放大语言模型。它们有两种尺寸:8B 和 70B 参数,每种尺寸都有基础(预训练)和指令调优版本。所有变体都可以在各种类型的消费级硬件上运行,并具有 8K tokens 的上下文长度。
- Meta-Llama-3-8b:8B 基础模型
- Meta-Llama-3-8b-instruct:8B 基础模型的指令微调版本
- Meta-Llama-3-70b:70B 基础模型
- Meta-Llama-3-70b-instruct:70B 基础模型的指令微调版本
除了这 4 个基础模型,Llama Guard 2 也已发布。它在 Llama 3 8B 上进行微调,是 Llama Guard 系列的最新迭代。Llama Guard 2 专为生产用例而构建,旨在对大语言模型的输入(提示)和响应进行分类,以检测在风险分类中被认为不安全的内容。
与 Llama 2 相比,Llama 3 的一个重大变化是使用了一个新的分词器,将词汇量扩大到 128,256(上一版本为 32K tokens)。这个更大的词汇量可以更有效地编码文本(包括输入和输出),并可能带来更强的多语言能力。但这也有代价:嵌入输入和输出矩阵更大,这占了小模型参数数量增加的很大一部分:它从 Llama 2 的 7B 增加到 Llama 3 的 8B。此外,8B 版本的模型现在使用分组查询注意力(GQA),这是一种高效的表示方式,应有助于处理更长的上下文。
Llama 3 模型在两个拥有 24,000 个 GPU 的集群上,使用了超过 15 万亿 tokens 的新混合公开可用在线数据进行训练,训练数据量约为 Llama 2 的 8 倍。我们不知道训练数据混合的具体细节,只能猜测更大、更仔细的数据整理是性能提升的一个重要因素。Llama 3 Instruct 针对对话应用进行了优化,在超过 1000 万个人工标注的数据样本上进行了训练,结合了监督微调(SFT)、拒绝采样、近端策略优化(PPO)和直接策略优化(DPO)。
关于许可条款,Llama 3 采用了一个宽松的许可证,允许重新分发、微调和衍生作品。Llama 3 许可证中新增了明确署名的要求,这在 Llama 2 中是没有的。例如,衍生模型需要在其名称开头包含“Llama 3”,并且你还需要在衍生作品或服务中提及“Built with Meta Llama 3”。有关完整细节,请务必阅读官方许可证。
Llama 3 评测
在这里,你可以看到一系列模型及其在 Open LLM Leaderboard 上的得分。这不是一个详尽的列表,我们鼓励你查看完整的排行榜。请注意,LLM Leaderboard 特别适用于评估预训练模型,因为还有其他专门针对对话模型的基准测试。
模型 | 许可证 | 预训练长度 [令牌] | 排行榜得分 |
---|---|---|---|
MPT-7B | Apache 2.0 | 1,000B | 5.98 |
Falcon-7B | Apache 2.0 | 1,500B | 5.1 |
Llama-2-7B | Llama 2 许可证 | 2T | 8.72 |
Qwen 2 7B | Apache 2.0 | ? | 23.66 |
Llama-3-8B | Llama 3 许可证 | 15T | 13.41 |
Llama-2-13B | Llama 2 许可证 | 2T | 10.99 |
Falcon-40B | Apache 2.0 | 1,000B | 11.33 |
Falcon-40B | Apache 2.0 | 1,000B | 11.33 |
Llama-2-70B | Llama 2 许可证 | 2T | 18.25 |
Llama-3-70B | Llama 3 许可证 | 15T | 26.37 |
Mixtral 8x22B | Apache 2 | ? | 25.49 |
如何向 Llama 3 提问
基础模型没有提示格式。像其他基础模型一样,它们可以用来为一个输入序列生成一个合理的续写,或者用于零样本/少样本推理。它们也是微调自己用例的绝佳基础。Instruct 版本使用以下对话结构:
<|begin_of_text|><|start_header_id|>system<|end_header_id|>
{{ system_prompt }}<|eot_id|><|start_header_id|>user<|end_header_id|>
{{ user_msg_1 }}<|eot_id|><|start_header_id|>assistant<|end_header_id|>
{{ model_answer_1 }}<|eot_id|>
必须精确复现这种格式才能有效使用。我们稍后将展示如何使用 transformers
中提供的聊天模板轻松复现 instruct 提示。
演示
你可以在 Hugging Chat 上与 Llama 3 70B instruct 模型聊天!点击这里查看:https://huggingface.co/chat/models/meta-llama/Meta-Llama-3-70B-instruct
使用 🤗 Transformers
通过 Transformers 4.40 版本,你可以使用 Llama 3 并利用 Hugging Face 生态系统中的所有工具,例如:
- 训练和推理脚本以及示例
- 安全文件格式 (
safetensors
) - 与 bitsandbytes (4 位量化)、PEFT (参数高效微调) 和 Flash Attention 2 等工具的集成
- 用于模型生成运行的实用程序和辅助函数
- 导出模型以进行部署的机制
此外,Llama 3 模型与 torch.compile()
和 CUDA graphs 兼容,这使它们在推理时速度提升了约 4 倍!
要使用 Llama 3 模型和 transformers,请确保安装最新版本的 transformers
pip install --upgrade transformers
以下代码片段展示了如何使用 Llama-3-8b-instruct
和 transformers。它需要大约 16 GB 的 RAM,这包括像 3090 或 4090 这样的消费级 GPU。
from transformers import pipeline
import torch
model_id = "meta-llama/Meta-Llama-3-8B-Instruct"
pipe = pipeline(
"text-generation",
model=model_id,
model_kwargs={"torch_dtype": torch.bfloat16},
device="cuda",
)
messages = [
{"role": "system", "content": "You are a pirate chatbot who always responds in pirate speak!"},
{"role": "user", "content": "Who are you?"},
]
terminators = [
pipe.tokenizer.eos_token_id,
pipe.tokenizer.convert_tokens_to_ids("<|eot_id|>")
]
outputs = pipe(
messages,
max_new_tokens=256,
eos_token_id=terminators,
do_sample=True,
temperature=0.6,
top_p=0.9,
)
assistant_response = outputs[0]["generated_text"][-1]["content"]
print(assistant_response)
啊哈,我的伙计!我的名字是 Chat 船长,是七大洋上最狡猾的海盗聊天机器人!我来这里是为了用我可靠的回答来擦洗你思想的甲板,明白吗?我准备好升起骷髅旗,扬帆起航,来一场惊心动魄的好时光,伙计!那么,是什么风把你吹到这片美丽的水域来的?
一些细节
- 我们以
bfloat16
格式加载了模型。这是 Meta 发布的原始检查点所使用的类型,因此是推荐的运行方式,以确保最佳精度或进行评估。对于实际应用,使用float16
也是安全的,根据你的硬件,这可能会更快。 - 助手的回答可能以特殊标记
<|eot_id|>
结束,但如果遇到常规的 EOS 标记,我们也必须停止生成。我们可以通过在eos_token_id
参数中提供一个终止符列表来提前停止生成。 - 我们使用了来自原始 Meta 代码库的默认采样参数(
temperature
和top_p
)。我们还没有时间进行广泛的测试,欢迎你随时探索!
你还可以自动量化模型,以 8 位甚至 4 位模式加载。4 位加载需要大约 7 GB 内存才能运行,这使得它与许多消费级显卡以及 Google Colab 中的所有 GPU 兼容。以下是如何以 4 位加载生成管道:
pipeline = transformers.pipeline(
"text-generation",
model=model_id,
model_kwargs={
"torch_dtype": torch.float16,
"quantization_config": {"load_in_4bit": True},
"low_cpu_mem_usage": True,
},
)
有关使用 transformers 的更多细节,请查看模型卡片。
推理集成
在本节中,我们将介绍运行 Llama 3 模型推理的不同方法。在使用这些模型之前,请确保你已在官方 Meta Llama 3 仓库中申请了对其中一个模型的访问权限。
与 Inference Endpoints 集成
你可以在 Hugging Face 的 Inference Endpoints 上部署 Llama 3,它使用 Text Generation Inference 作为后端。Text Generation Inference 是由 Hugging Face 开发的生产级推理容器,可以轻松部署大型语言模型。它具有连续批处理、令牌流、用于在多个 GPU 上进行快速推理的张量并行以及生产级的日志记录和跟踪等功能。
要部署 Llama 3,请前往模型页面并点击部署 -> Inference Endpoints小部件。你可以在之前的博客文章中了解更多关于使用 Hugging Face Inference Endpoints 部署 LLM的内容。Inference Endpoints 通过 Text Generation Inference 支持 Messages API,这使你只需更改 URL 即可从另一个闭源模型切换到开源模型。
from openai import OpenAI
# initialize the client but point it to TGI
client = OpenAI(
base_url="<ENDPOINT_URL>" + "/v1/", # replace with your endpoint url
api_key="<HF_API_TOKEN>", # replace with your token
)
chat_completion = client.chat.completions.create(
model="tgi",
messages=[
{"role": "user", "content": "Why is open-source software important?"},
],
stream=True,
max_tokens=500
)
# iterate and print stream
for message in chat_completion:
print(message.choices[0].delta.content, end="")
与 Google Cloud 集成
你可以使用文本生成推理,通过 Vertex AI 或 Google Kubernetes Engine (GKE) 在 Google Cloud 上部署 Llama 3。
要从 Hugging Face 部署 Llama 3 模型,请前往模型页面并点击部署 -> Google Cloud。这会将你带到 Google Cloud Console,在那里你可以一键部署 Llama 3 到 Vertex AI 或 GKE。
与 Amazon SageMaker 集成
你可以通过 AWS Jumpstart 或使用 Hugging Face LLM 容器 在 Amazon SageMaker 上部署和训练 Llama 3。
要从 Hugging Face 部署 Llama 3 模型,请前往模型页面并点击部署 -> Amazon SageMaker。这将显示一个代码片段,你可以在你的环境中复制和执行。Amazon SageMaker 现在将创建一个专用的推理端点,你可以用它来发送请求。
使用 🤗 TRL 进行微调
训练大语言模型在技术上和计算上都可能具有挑战性。在本节中,我们将探讨 Hugging Face 生态系统中可用的工具,以便在消费级 GPU 上高效地训练 Llama 3。以下是在 No Robots 数据集上微调 Llama 3 的示例命令。我们使用 4 位量化,QLoRA 和 TRL 的 SFTTrainer 会自动将数据集格式化为 chatml
格式。让我们开始吧!
首先,安装最新版本的 🤗 TRL。
pip install -U transformers trl accelerate
如果你只想在终端中与模型聊天,可以使用 TRL CLI 的 chat
命令(更多信息请参见文档)
trl chat \
--model_name_or_path meta-llama/Meta-Llama-3-8B-Instruct \
--device cuda \
--eos_tokens "<|end_of_text|>,<|eod_id|>"
你还可以使用 TRL CLI 在你自己的自定义数据集上对 Llama 3 进行监督微调(SFT)。使用 trl sft
命令并将你的训练参数作为 CLI 参数传递。确保你已经登录并有权访问 Llama 3 检查点。你可以通过 huggingface-cli login
来实现。
trl sft \
--model_name_or_path meta-llama/Meta-Llama-3-8B \
--dataset_name HuggingFaceH4/no_robots \
--learning_rate 0.0001 \
--per_device_train_batch_size 4 \
--max_seq_length 2048 \
--output_dir ./llama3-sft \
--use_peft \
--load_in_4bit \
--log_with wandb \
--gradient_checkpointing \
--logging_steps 10
这将在你的终端运行微调,在单个 A10G 上大约需要 4 小时,但可以通过调整 --num_processes
为你可用的 GPU 数量来轻松实现并行化。
注意:你也可以用一个 yaml
文件替换 CLI 参数。在此处了解更多关于 TRL CLI 的信息:此处。
其他资源
致谢
在生态系统中发布此类模型并提供支持和评估,离不开许多社区成员的贡献,包括:
- Clémentine Fourrier、Nathan Habib 和 Eleuther Evaluation Harness 团队,感谢他们对 LLM 的评估
- Olivier Dehaene 和 Nicolas Patry,感谢他们对 Text Generation Inference 的支持
- Arthur Zucker 和 Lysandre Debut,感谢他们在 transformers 和 tokenizers 中添加了 Llama 3 支持
- Nathan Sarrazin、Victor Mustar 和 Kevin Cathaly,感谢他们让 Llama 3 在 Hugging Chat 中可用。
- Yuvraj Sharma,感谢他制作的 Gradio 演示。
- Xenova 和 Vaibhav Srivastav,感谢他们在量化和提示模板方面的调试和实验。
- Brigitte Tousignant、Florent Daudens、Morgan Funtowicz 和 Simon Brandeis,感谢他们在发布过程中的各项工作!
- 感谢整个 Meta 团队,包括 Samuel Selvan、Eleonora Presani、Hamid Shojanazeri、Azadeh Yazdan、Aiman Farooq、Ruan Silva、Ashley Gabriel、Eissa Jamil、Binh Tang、Matthias Reso、Lovish Madaan、Joe Spisak 和 Sergey Edunov。
感谢 Meta 团队发布 Llama 3 并将其提供给开源 AI 社区!