Llama 3.1 发布了!今天我们迎来了 Llama 家族的新成员 Llama 3.1 进入 Hugging Face 平台。我们很高兴与 Meta 合作,确保在 Hugging Face 生态系统中实现最佳集成。Hub 上现有八个开源权重模型 (3 个基础模型和 5 个微调模型)。
Llama 3.1 有三种规格: 8B 适合在消费者级 GPU 上进行高效部署和开发,70B 适合大规模 AI 原生应用,而 405B 则适用于合成数据、大语言模型 (LLM) 作为评判者或蒸馏。这三个规格都提供基础版和指令调优版。
除了六个生成模型,Meta 还发布了两个新模型: Llama Guard 3 和 Prompt Guard。Prompt Guard 是一个小型分类器,可以检测提示注入和越狱。Llama Guard 3 是一个保护模型,能够分类 LLM 输入和生成的内容。
此次发布的一些功能和集成包括:
Hub 上的模型:https://hf.co/collections/meta-llama/llama-31-669fc079a0c406a149a5738f
Hugging Face Transformers 和 TGI 集成
Meta Llama 3.1 405B Instruct 的 Hugging Chat 集成:https://hf.co/chat/models/meta-llama/Meta-Llama-3.1-405b-instruct/
使用推理端点、Google Cloud、Amazon SageMaker 和 DELL Enterprise Hub 进行推理和部署集成
FP8、AWQ 和 GPTQ 的量化,便于推理
使用 🤗 TRL 在单个 GPU 上微调 Llama 3.1 8B
使用 Distilabel 生成 Llama 3.1 70B 和 405B 的合成数据
Llama 3.1 为什么令人兴奋?在前代产品的基础上,Llama 3.1 增加了一些关键新功能:
128K token 的长上下文能力 (相较于原来的 8K)
多语言支持
工具使用功能
拥有 4050 亿参数的超大稠密模型
更宽松的许可证
让我们深入了解这些新功能!
Llama 3.1 版本引入了基于 Llama 3 架构的六个新开源 LLM 模型。它们有三种规格: 8B、70B 和 405B 参数,每种都有基础版 (预训练) 和指令调优版。所有版本都支持 128K token 的上下文长度和 8 种语言,包括英语、德语、法语、意大利语、葡萄牙语、印地语、西班牙语和泰语。Llama 3.1 继续使用分组查询注意力 (GQA),这是一种高效的表示方式,有助于处理更长的上下文。
Meta-Llama-3.1-8B: 基础 8B 模型:https://hf.co/meta-llama/Meta-Llama-3.1-8B
Meta-Llama-3.1-8B-Instruct: 基础 8B 模型的指令调优版:https://hf.co/meta-llama/Meta-Llama-3.1-8B-Instruct
Meta-Llama-3.1-70B: 基础 70B 模型:https://hf.co/meta-llama/Meta-Llama-3.1-70B
Meta-Llama-3.1-70B-Instruct: 基础 70B 模型的指令调优版:https://hf.co/meta-llama/Meta-Llama-3.1-70B-Instruct
Meta-Llama-3.1-405B: 基础 405B 模型:https://hf.co/meta-llama/Meta-Llama-3.1-405B
Meta-Llama-3.1-405B-Instruct: 基础 405B 模型的指令调优版:https://hf.co/meta-llama/Meta-Llama-3.1-405B-Instruct
除了这六个语言模型,还发布了 Llama Guard 3 和 Prompt Guard。
Llama Guard 3是 Llama Guard 家族的最新版本,基于 Llama 3.1 8B 进行微调。它为生产用例而设计,具有 128k 的上下文长度和多语言能力。Llama Guard 3 可以分类 LLM 的输入 (提示) 和输出,以检测在风险分类中被认为不安全的内容。https://hf.co/meta-llama/Llama-Guard-3-8B
Prompt Guard,另一方面,是一个小型 279M 参数的基于 BERT 的分类器,可以检测提示注入和越狱。它在大规模攻击语料库上训练,并建议使用特定应用的数据进行进一步微调。https://hf.co/meta-llama/Prompt-Guard-86M
与 Llama 3 相比,Llama 3.1 的新特点是指令模型在工具调用方面进行了微调,适用于智能体用例。内置了两个工具 (搜索,使用 Wolfram Alpha 进行数学推理),可以扩展为自定义 JSON 功能。
Llama 3.1 模型在定制 GPU 集群上训练了超过 15 万亿 token,总计 39.3M GPU 小时 (8B 1.46M,70B 7.0M,405B 30.84M)。我们不知道训练数据集混合的具体细节,但我们猜测它在多语言方面有更广泛的策划。Llama 3.1 Instruct 已优化用于指令跟随,并在公开可用的指令数据集以及超过 2500 万合成生成的示例上进行监督微调 (SFT) 和人类反馈的强化学习 (RLHF)。Meta 开发了基于 LLM 的分类器,以在数据混合创建过程中过滤和策划高质量的提示和响应。
关于许可条款,Llama 3.1 具有非常相似的许可证,但有一个关键区别: 它允许使用模型输出来改进其他 LLM。这意味着合成数据生成和蒸馏是允许的,即使是不同的模型!这对 405B 模型尤其重要,如后面所讨论的。许可证允许再分发、微调和创建衍生作品,仍然要求派生模型在其名称的开头包括 “Llama”,并且任何衍生作品或服务必须提及 “Built with Llama”。有关完整详情,请确保阅读官方许可证。
官方许可证:https://hf.co/meta-llama/Meta-Llama-3.1-8B-Instruct/blob/main/LICENSE
Llama 3.1 带来了令人兴奋的进步。然而,运行它需要仔细考虑硬件资源。我们分解了三种模型规格在训练和推理中的内存需求。
对于推理,内存需求取决于模型规格和权重的精度。以下是不同配置所需的近似内存:
注意: 上面引用的数字表示仅加载模型检查点所需的 GPU VRAM。它们不包括内核或 CUDA 图形的 torch 保留空间。
例如,一个 H100 节点 (8x H100) 有约 640GB 的 VRAM,因此 405B 模型需要在多节点设置中运行或以较低精度 (例如 FP8) 运行,这是推荐的方法。
请记住,较低精度 (例如 INT4) 可能会导致一些精度损失,但可以显著减少内存需求并提高推理速度。除了模型权重外,您还需要将 KV 缓存保持在内存中。它包含模型上下文中所有 token 的键和值,以便在生成新 token 时不需要重新计算。特别是当利用可用的长上下文长度时,它变得至关重要。在 FP16 中,KV 缓存内存需求如下:
特别是对于小规格模型,当接近上下文长度上限时,缓存使用的内存与权重一样多。
以下表格概述了使用不同技术训练 Llama 3.1 模型的大致内存需求:
注意: 这些是估计值,可能会根据具体实现细节和优化情况有所不同。
注意: 我们目前正在新的Open LLM Leaderboard 2上单独评估 Llama 3.1,并将在今天晚些时候更新此部分。以下是 Meta 官方评估的摘录。
Open LLM Leaderboard 2:https://hf.co/spaces/open-llm-leaderboard/open_llm_leaderboard
Llama 3.1 需要进行少量建模更新,以有效处理 RoPE 缩放。使用 Transformers4.43 版,您可以使用新的 Llama 3.1 模型,并利用 Hugging Face 生态系统中的所有工具。确保使用最新的 transformers
版本:
4.43 版:https://github.com/huggingface/transformers/tags
pip install "transformers>=4.43" --upgrade
几个细节:
Transformers 默认以 bfloat16 加载模型。这是 Meta 发布的原始检查点使用的类型,因此这是确保最佳精度或进行评估的推荐方法。
助手响应可能以特殊 token <|eot_id|>
结尾,但我们还必须在找到常规 EOS token 时停止生成。我们可以通过在 eos_token_id
参数中提供终止符列表来提前停止生成。
我们使用了 Meta 代码库中的默认采样参数 (temperature
和 top_p
)。我们还没有时间进行广泛测试,请随意探索!
以下代码段显示了如何使用 meta-llama/Meta-Llama-3.1-8B-Instruct
。它大约需要 16 GB 的 VRAM,适合许多消费者级 GPU。相同的代码段适用于 meta-llama/Meta-Llama-3.1-70B-Instruct
,在 140GB VRAM 和 meta-llama/Meta-Llama-3.1-405B-Instruct
(需要 810GB VRAM),使其成为生产用例的非常有趣的模型。可以通过以 8 位或 4 位模式加载进一步减少内存消耗。
您还可以自动量化模型,以 8 位甚至 4 位模式加载,使用 bitsandbytes。4 位加载大 70B 版本大约需要 34 GB 的内存运行。这是如何以 4 位模式加载生成管道:
有关使用 transformers
模型的更多详细信息,请查看模型卡片。
模型卡片:https://hf.co/meta-llama/Meta-Llama-3.1-8B-Instruct
注意: Transformers 处理所有棘手的提示模板问题,如果您想了解更多关于提示的信息,请查看下一部分。
基础模型没有提示格式。像其他基础模型一样,它们可以用于继续输入序列并进行合理的延续或零样本/少样本推理。它们也是微调您自己用例的绝佳基础。
指令版本支持具有 4 个角色的对话格式:
system: 设置对话的上下文。它允许包括规则、指南或必要的信息,帮助有效响应。它也用于在适当情况下启用工具使用。
user: 用户输入、命令和对模型的问题。
assistant: 助手的响应,基于 system
和 user
提示中提供的上下文。
ipython: Llama 3.1 中引入的新角色。当工具调用返回给 LLM 时作为输出使用。
指令版本使用以下对话结构进行简单对话:
Llama 3.1 指令模型现在支持工具调用,包括三个内置工具 (brave_search、wolfram_alpha 和 code_interpreter) 和通过 JSON 函数调用的自定义工具调用。内置工具使用 Python 语法。生成 Python 代码以进行函数调用是代码解释器工具的一部分,必须在系统提示中使用 Environment
关键字启用,如下所示。
包括 "Environment: ipython" 会打开代码解释器模式,模型可以生成它期望被执行的 Python 代码。助手响应的消息体以特殊标记 <|python_tag|>
开头,以 <|eom_id|>
结尾,而不是标准 <|eot_id|>
。后者表示回合结束,而前者表示继续多步推理。
此时模型的响应将包括调用其中一个支持的工具 (在本例中为 brave_search
) 的 Python 代码:
执行调用的响应然后发送回模型以检索最终响应。为了简洁,以下内容将附加到前面代码段中显示的消息:
LLM 的最终响应将是:
Llama 3.1 指令支持从单个用户消息中调用自定义函数。以下提示提供了如何从模型输出调用自定义函数的示例。在自定义函数调用中,模型输出 <|eot_id|>
而不是 <|eom_id|>
。需要调整系统提示以告知模型如何处理函数调用输出。
当我们从选定的工具检索输出时,我们将其传回模型,使用相同的 <|python_tag|>
分隔符。<|python_tag|>
不意味着使用 Python。它仅用于表示任何工具的输出开始。
这种格式必须精确复制才能有效使用。transformers 中可用的聊天模板使其易于正确格式化提示。
您可以在以下演示中试验三种指令模型:
Llama 3.1 405B 的 Hugging Chat:https://hf.co/chat/models/meta-llama/Meta-Llama-3.1-405b-instruct/
Llama 3.1 70B 的 Hugging Chat:https://hf.co/chat/models/meta-llama/Meta-Llama-3.1-70b-instruct/
Llama 3.1 8B 演示的 Gradio 驱动的 Space:https://hf.co/spaces/ysharma/Chat_with_Meta_llama3_1_8b
整个堆栈都是开源的。Hugging Chat 由chat-ui和text-generation-inference提供支持。
chat-ui:https://github.com/huggingface/chat-ui
text-generation-inference:https://github.com/huggingface/text-generation-inference
Meta 创建了Llama 3.1 405B 的官方 FP8 量化版本,精度损失最小。为实现这一目标,FP8 量化仅应用于模型的主要线性运算符,例如 FFNs 的门和上升及下降投影 (涵盖 75% 的推理 FLOPs)。我们共同努力,确保此 FP8 量化检查点在社区中兼容 (transformers, TGI, VLLM)。
Llama 3.1 405B 的官方 FP8 量化版本:https://hf.co/meta-llama/Meta-Llama-3.1-405B-Instruct-FP8
此外,我们使用 AutoAWQ 和 AutoGPTQ 创建了 INT4 的 AWQ 和 GPTQ 量化变体。对于 AWQ,所有线性层都使用 GEMM 内核进行量化,将零点量化到 4 位,组大小为 128; 对于 GPTQ,相同的设置仅使用 GPTQ 内核。我们确保 INT4 检查点与 transformers 和 TGI 兼容,包括 Marlin 内核支持,以加快 TGI 中 GPTQ 量化的推理速度。
可用的 Llama 3.1 405B 的量化权重:
meta-llama/Meta-Llama-3.1-405B-Base-FP8: 官方 FP8 量化权重,可在 8xH100 上运行:https://hf.co/meta-llama/Meta-Llama-3.1-405B-FP8
meta-llama/Meta-Llama-3.1-405B-Instruct-FP8: 官方 FP8 量化权重,可在 8xH100 上运行:https://hf.co/sllhf/Meta-Llama-3.1-405B-Instruct-FP8
hugging-quants/Meta-Llama-3.1-405B-Instruct-AWQ-INT4: Hugging Face 量化权重,可在 8xA100 80GB, 8xH100 80GB 和 8xA100 40GB (减少 KV 缓存且无 CUDA 图形) 上运行:https://hf.co/hugging-quants/Meta-Llama-3.1-405B-Instruct-AWQ-INT4
hugging-quants/Meta-Llama-3.1-405B-Instruct-GPTQ-INT4:: Hugging Face 量化权重,可在 8xA100 80GB, 8xH100 80GB 和 8xA100 40GB (减少 KV 缓存且无 CUDA 图形) 上运行:https://hf.co/hugging-quants/Meta-Llama-3.1-405B-Instruct-GPTQ-INT4
hugging-quants/Meta-Llama-3.1-405B-BNB-NF4: Hugging Face 量化权重,适用于 QLoRA 微调:https://hf.co/hugging-quants/Meta-Llama-3.1-405B-BNB-NF4
hugging-quants/Meta-Llama-3.1-405B-Instruct-BNB-NF4: Hugging Face 量化权重,适用于在 8xA100 和 4xH100 上推理:https://hf.co/hugging-quants/Meta-Llama-3.1-405B-Instruct-BNB-NF4
Hugging Quants 组织还包含 70B 和 8B 版本的量化检查点。
Hugging Quants 组织:https://hf.co/hugging-quants
Hugging Face PRO 用户现在可以访问独家 API 端点,托管 Llama 3.1 8B Instruct、Llama 3.1 70B Instruct 和 Llama 3.1 405B Instruct AWQ,由text-generation-inference提供支持。所有版本都支持 Messages API,因此与 OpenAI 客户端库兼容,包括 LangChain 和 LlamaIndex。
独家 API 端点:https://hf.co/blog/inference-pro
text-generation-inference:https://github.com/huggingface/text-generation-inference
注意: 使用 pip install "huggingface_hub>=0.24.1"
更新到最新的 huggingface_hub
版本。
有关使用 Messages API 的更多详细信息,请查看此帖子。
From OpenAI to Open LLMs with Messages API on Hugging Face:https://hf.co/blog/tgi-messages-api
您可以在 Hugging Face 的推理端点上部署 Llama 3.1,它使用 Text Generation Inference 作为后端。Text Generation Inference 是 Hugging Face 开发的生产就绪推理容器,支持 FP8、连续批处理、token 流、张量并行,以便在多个 GPU 上快速推理。要部署 Llama 3.1,请转到模型页面并点击部署 -> 推理端点小部件:
推理端点:https://ui.endpoints.huggingface.co/
模型页面:https://hf.co/meta-llama/Meta-Llama-3-70B-instruct
Meta-Llama-3.1-8B-Instruct推荐在 1x NVIDIA A10G 或 L4 GPU 上运行https://hf.co/meta-llama/Meta-Llama-3.1-8B-Instruct
Meta-Llama-3.1-70B-Instruct推荐在 4x NVIDIA A100 或量化为 AWQ/GPTQ 在 2x A100 上运行:https://hf.co/meta-llama/Meta-Llama-3.1-70B-Instruct
Meta-Llama-3.1-405B-Instruct-FP8推荐在 8x NVIDIA H100 上以 FP 运行或量化为AWQ/GPTQ在 8x A100 上运行
https://hf.co/sllhf/Meta-Llama-3.1-405B-Instruct-FP8
https://hf.co/hugging-quants/Meta-Llama-3.1-405B-Instruct-AWQ-INT4
https://hf.co/hugging-quants/Meta-Llama-3.1-405B-Instruct-GPTQ-INT4
注意: 我们目前正在与我们的合作伙伴 AWS、Google Cloud、Microsoft Azure 和 DELL 合作,将 Llama 3.1 8B、70B 和 405B 添加到 Amazon SageMaker、Google Kubernetes Engine、Vertex AI Model Catalog、Azure AI Studio、DELL Enterprise Hub。我们将在容器可用时更新此部分 - 您可以订阅 Hugging Squad 以获取电子邮件更新。
订阅 Hugging Squad 以获取电子邮件更新:https://mailchi.mp/huggingface/squad
在本节中,我们将查看 Hugging Face 生态系统中可用的工具,以便在消费者级 GPU 上高效训练 Llama 3.1。下面是一个示例命令,用于在 OpenAssistant 的chat 数据集上微调 Llama 3.1 8B。我们使用 4 位量化和QLoRA来节省内存,以针对所有注意力块的线性层。
chat 数据集:https://hf.co/datasets/OpenAssistant/oasst_top1_2023-08-25
QLoRA:https://arxiv.org/abs/2305.14314
首先,安装最新版本的 🤗 TRL 并克隆 repo 以访问训练脚本:
训练脚本:https://github.com/huggingface/trl/blob/main/examples/scripts/sft.py
然后你可以运行脚本:
如果您有更多的 GPU,可以使用 DeepSpeed 和 ZeRO Stage 3 运行训练:
使用 distilabel 生成合成数据
Llama 3.1 许可证的一个重大变化是,它允许使用模型输出来改进其他 LLM,这意味着您可以使用 Llama 3.1 模型生成合成数据集,并使用它们来微调更小、更专业的模型。
让我们看一个示例,如何使用distilabel,一个用于生成合成数据的开源框架,生成一个偏好数据集。该数据集可用于使用 TRL 提供的偏好优化方法 (如 DPO 或 KTO) 微调模型。
distilabel:https://github.com/argilla-io/distilabel
首先安装最新的 distilabel
版本,包括 hf-inference-endpoints
额外组件,使用 pip
如下:
然后定义一个管道:
从 Hugging Face Hub 加载带有指令的数据集。
使用 Hugging Face 推理端点,通过 Llama 3.1 70B Instruct 和 Llama 3.1 405B Instruct 生成响应。
最后,使用 Llama 3.1 405B Instruct 作为裁判,使用 UltraFeedback 提示对响应进行评分。从这些评分中,可以选择和拒绝响应,并使用偏好优化方法微调模型。
请参阅下面的代码以定义管道,或使用此Colab 笔记本自行运行并探索生成的数据集。
Colab 笔记本https://colab.research.google.com/drive/1o0ALge7DHBmcKgdyrk59yOL70tcGS3v4?usp=sharing
接下来是什么?除了上述示例, distilabel
还提供了使用 LLM 在广泛的场景和主题中生成合成数据的令人兴奋的方法。它包括当前 SOTA 文献中的实现,用于任务如使用 LLM-as-a-judge 方法评估输出、进化指令、数据过滤以及定义自定义组件。
Hub 上的模型:https://hf.co/collections/meta-llama/llama-31-669fc079a0c406a149a5738f
Hugging Face Llama Recipes:https://github.com/huggingface/huggingface-llama-recipes
Open LLM Leaderboard:https://hf.co/spaces/HuggingFaceH4/open_llm_leaderboard
Llama 3.1 405B Instruct 的 Hugging Chat 演示:https://hf.co/chat/models/meta-llama/Meta-Llama-3.1-405b-instruct/
Meta 博文:https://ai.meta.com/blog/meta-llama-3-1/
没有成千上万社区成员对 transformers、tgi、vllm、pytorch、LM Eval Harness 和许多其他项目的贡献,这些模型的发布和生态系统中的支持与评估是不可能实现的。这次发布离不开Clémentine和Nathan对 LLM 评估的支持;Nicolas、Olivier Dehaene和Daniël de Kok对 Text Generation Inference 支持的贡献;Arthur、Matthew Carrigan、Zachary Mueller、Joao、Joshua Lochner和Lysandre对 Llama 3.1 集成到 transformers
的贡献;Matthew Douglas对量化支持的贡献;Gabriel Martín Blázquez对 distilabel
支持的贡献;Merve Noyan和Aymeric Roucher对审核的贡献; 和 对演示的贡献;Ellie对微调测试的贡献;Brigitte Tousignant和Florent Daudens对沟通的贡献;Nathan和Victor对 Hugging Chat 中 Llama 3.1 的可用性的贡献。
感谢 Meta 团队发布 Llama 3.1 并使其在开源 AI 社区中可用!
英文原文: https://hf.co/blog/llama31
原文作者: Philipp Schmid, Omar Sanseviero, Alvaro Bartolome, Leandro von Werra, Daniel Vila, Vaibhav Srivastav, Marc Sun, Pedro Cuenca
译者: AdinaY