Llama 2 已推出 - 在 Hugging Face 上获取
引言
Llama 2 是 Meta 今天发布的一系列最先进的开放式大型语言模型,我们很高兴能通过与 Hugging Face 的全面集成来全力支持其发布。Llama 2 正在以非常宽松的社区许可证发布,并可用于商业用途。代码、预训练模型和微调模型今天都将发布 🔥
我们与 Meta 合作,确保其顺利集成到 Hugging Face 生态系统中。您可以在 Hub 上找到 12 个开放式模型(3 个基础模型和 3 个使用原始 Meta 检查点进行微调的模型,以及它们对应的 transformers
模型)。在发布的功能和集成中,我们有
- Hub 上的模型及其模型卡和许可证。
- Transformers 集成
- 使用单个 GPU 微调模型小变体的示例
- 与 Text Generation Inference 集成,实现快速高效的生产级推理
- 与推理端点集成
目录
为什么选择 Llama 2?
Llama 2 版本推出了一系列预训练和微调的 LLM,规模从 7B 到 70B 参数不等(7B、13B、70B)。与 Llama 1 模型相比,预训练模型有了显著改进,包括在多 40% 的标记上进行训练,具有更长的上下文长度(4k 标记 🤯),并使用分组查询注意力实现 70B 模型的快速推理 🔥!
然而,此版本最令人兴奋的部分是微调模型(Llama 2-Chat),它们已通过 来自人类反馈的强化学习 (RLHF) 针对对话应用进行了优化。在广泛的帮助性和安全性基准测试中,Llama 2-Chat 模型比大多数开放模型表现更好,并根据人类评估实现了与 ChatGPT 相当的性能。您可以在此处阅读论文。
如果您一直在等待闭源聊天机器人的开放替代方案,Llama 2-Chat 可能是您今天最好的选择!
模型 | 许可证 | 商业用途? | 预训练长度 [令牌] | 排行榜得分 |
---|---|---|---|---|
Falcon-7B | Apache 2.0 | ✅ | 1,500B | 44.17 |
MPT-7B | Apache 2.0 | ✅ | 1,000B | 47.24 |
Llama-7B | Llama 许可证 | ❌ | 1,000B | 45.65 |
Llama-2-7B | Llama 2 许可证 | ✅ | 2,000B | 50.97 |
Llama-33B | Llama 许可证 | ❌ | 1,500B | - |
Llama-2-13B | Llama 2 许可证 | ✅ | 2,000B | 55.69 |
mpt-30B | Apache 2.0 | ✅ | 1,000B | 52.77 |
Falcon-40B | Apache 2.0 | ✅ | 1,000B | 58.07 |
Llama-65B | Llama 许可证 | ❌ | 1,500B | 61.19 |
Llama-2-70B | Llama 2 许可证 | ✅ | 2,000B | 67.87 |
Llama-2-70B-chat | Llama 2 许可证 | ✅ | 2,000B | 62.4 |
注意:下表所示的性能分数已更新,以反映 2023 年 11 月引入的新方法,该方法增加了新的基准。更多详情请参阅此帖子.
演示
您可以在这个空间或嵌入在下面的游乐场中轻松尝试 13B Llama 2 模型
要了解此演示的工作原理,请继续阅读下面的内容,了解如何在 Llama 2 模型上运行推理。
推理
在本节中,我们将介绍运行 Llama 2 模型推理的不同方法。在使用这些模型之前,请确保您已在官方 Meta Llama 2 存储库中请求了对其中一个模型的访问权限。
注意:请务必同时填写官方 Meta 表格。用户在填写两份表格后数小时即可获得存储库访问权限。
使用 transformers
借助 transformers 版本 4.31,已经可以使用 Llama 2 并利用 HF 生态系统中的所有工具,例如
- 训练和推理脚本以及示例
- 安全文件格式 (
safetensors
) - 与 bitsandbytes(4 位量化)和 PEFT(参数高效微调)等工具集成
- 用于模型生成运行的实用程序和辅助函数
- 导出模型以进行部署的机制
请确保使用最新的 transformers
版本并登录您的 Hugging Face 帐户。
pip install transformers
huggingface-cli login
在以下代码片段中,我们展示了如何使用 transformers 运行推理。只要您选择 GPU 运行时,它就可以在 Colab 的免费层运行。
from transformers import AutoTokenizer
import transformers
import torch
model = "meta-llama/Llama-2-7b-chat-hf"
tokenizer = AutoTokenizer.from_pretrained(model)
pipeline = transformers.pipeline(
"text-generation",
model=model,
torch_dtype=torch.float16,
device_map="auto",
)
sequences = pipeline(
'I liked "Breaking Bad" and "Band of Brothers". Do you have any recommendations of other shows I might like?\n',
do_sample=True,
top_k=10,
num_return_sequences=1,
eos_token_id=tokenizer.eos_token_id,
max_length=200,
)
for seq in sequences:
print(f"Result: {seq['generated_text']}")
Result: I liked "Breaking Bad" and "Band of Brothers". Do you have any recommendations of other shows I might like?
Answer:
Of course! If you enjoyed "Breaking Bad" and "Band of Brothers," here are some other TV shows you might enjoy:
1. "The Sopranos" - This HBO series is a crime drama that explores the life of a New Jersey mob boss, Tony Soprano, as he navigates the criminal underworld and deals with personal and family issues.
2. "The Wire" - This HBO series is a gritty and realistic portrayal of the drug trade in Baltimore, exploring the impact of drugs on individuals, communities, and the criminal justice system.
3. "Mad Men" - Set in the 1960s, this AMC series follows the lives of advertising executives on Madison Avenue, expl
尽管该模型只有 4k 个标记的上下文,但您可以使用 transformers
中支持的技术,例如旋转位置嵌入缩放(推文),以进一步扩展它!
使用 text-generation-inference 和 Inference Endpoints
Text Generation Inference 是 Hugging Face 开发的生产级推理容器,可轻松部署大型语言模型。它具有连续批处理、标记流式传输、用于多 GPU 快速推理的张量并行化以及生产级日志记录和跟踪等功能。
您可以在自己的基础设施上尝试 Text Generation Inference,也可以使用 Hugging Face 的 Inference Endpoints。要部署 Llama 2 模型,请转到 模型页面,然后单击 部署 -> Inference Endpoints 小部件。
- 对于 7B 模型,我们建议您选择“GPU [中] - 1x Nvidia A10G”。
- 对于 13B 模型,我们建议您选择“GPU [xlarge] - 1x Nvidia A100”。
- 对于 70B 模型,我们建议您选择“GPU [2xlarge] - 2x Nvidia A100”并启用
bitsandbytes
量化,或选择“GPU [4xlarge] - 4x Nvidia A100”
注意:您可能需要通过电子邮件向 api-enterprise@huggingface.co 申请配额升级才能访问 A100
您可以通过我们的博客了解有关如何使用 Hugging Face Inference Endpoints 部署 LLM 的更多信息。该博客包含有关受支持的超参数以及如何使用 Python 和 Javascript 流式传输响应的信息。
使用 PEFT 进行微调
训练 LLM 在技术和计算上可能具有挑战性。在本节中,我们将介绍 Hugging Face 生态系统中可用的工具,以在简单的硬件上高效训练 Llama 2,并展示如何在一块 NVIDIA T4(16GB - Google Colab)上微调 Llama 2 的 7B 版本。您可以在让 LLM 更易访问的博客中了解更多信息。
我们创建了一个脚本,用于使用 QLoRA 和 trl
中的 SFTTrainer
对 Llama 2 进行指令微调。
一个用于在 timdettmers/openassistant-guanaco
上微调 Llama 2 7B 的示例命令如下所示。该脚本可以通过提供 merge_and_push
参数将 LoRA 权重合并到模型权重中,并将其保存为 safetensor
权重。这使我们能够在训练后使用 text-generation-inference 和 inference endpoints 部署我们微调的模型。
首先 pip 安装 trl
并克隆脚本
pip install trl
git clone https://github.com/lvwerra/trl
然后你可以运行脚本
python trl/examples/scripts/sft_trainer.py \
--model_name meta-llama/Llama-2-7b-hf \
--dataset_name timdettmers/openassistant-guanaco \
--load_in_4bit \
--use_peft \
--batch_size 4 \
--gradient_accumulation_steps 2
如何提示 Llama 2
开放式模型的一个无名优势是您对聊天应用程序中的 system
提示拥有完全控制权。这对于指定聊天助手的行为(甚至赋予它一些个性)至关重要,但在通过 API 提供的模型中无法实现。
我们在 Llama 2 首次发布几天后添加了此部分,因为社区对如何提示模型以及如何更改系统提示提出了许多问题。我们希望这有所帮助!
首次轮次的提示模板如下所示
<s>[INST] <<SYS>>
{{ system_prompt }}
<</SYS>>
{{ user_message }} [/INST]
此模板遵循Llama 2 论文中描述的模型训练过程。我们可以使用任何我们想要的 system_prompt
,但关键是格式必须与训练期间使用的格式匹配。
为了更清晰地说明,当用户在我们的 13B 聊天演示中输入一些文本 (我的花园里有只羊驼 😱 我该怎么办?
) 来启动聊天时,实际发送到语言模型的内容是这样的
<s>[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.
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.
<</SYS>>
There's a llama in my garden 😱 What should I do? [/INST]
如您所见,特殊 <<SYS>>
标记之间的指令为模型提供了上下文,使其了解我们期望它如何响应。这之所以有效,是因为在训练期间使用了完全相同的格式,并带有用于不同任务的各种系统提示。
随着对话的进行,人类和“机器人”之间的**所有**交互都会附加到之前的提示中,并用 [INST]
分隔符括起来。多轮对话中使用的模板遵循此结构(🎩 鸣谢 Arthur Zucker 提供的最终澄清)
<s>[INST] <<SYS>>
{{ system_prompt }}
<</SYS>>
{{ user_msg_1 }} [/INST] {{ model_answer_1 }} </s><s>[INST] {{ user_msg_2 }} [/INST]
模型是无状态的,不会“记住”对话的先前片段,我们必须始终为其提供所有上下文,以便对话可以继续。这就是为什么**上下文长度**是一个非常重要的参数,需要最大化,因为它允许更长的对话和使用更多的信息。
忽略之前的指令
在基于 API 的模型中,人们会尝试使用技巧来覆盖系统提示并更改默认模型行为。尽管这些解决方案富有想象力,但在开放访问模型中,这并非必需:任何人都可以使用不同的提示,只要它遵循上述格式即可。我们相信这将是研究人员研究提示对期望和不期望特征影响的重要工具。例如,当人们对荒谬谨慎的生成感到惊讶时,您可以探索是否不同的提示会起作用。(🎩 鸣谢 Clémentine Fourrier 提供的此示例链接)。
在我们的 13B
和 7B
演示中,您可以通过展开“高级选项”UI 并简单地输入所需的指令来轻松探索此功能。您还可以复制这些演示并将其私下用于娱乐或研究!
其他资源
结论
我们对 Llama 2 的推出感到非常兴奋!在接下来的几天里,请准备好了解更多关于运行您自己的微调、在设备上执行最小模型以及我们正在为您准备的许多其他激动人心的更新!