Meta 发布 Llama 2,Hugging Face 全面集成
Llama 2 is here - get it on HF Mirror
Meta 发布开源大语言模型家族 Llama 2,包含 7B、13B、70B 参数规模,以宽松社区许可开放并允许商用,代码、预训练模型和微调模型同日放出。
文章给出了 Llama 2 的模型规格、商用许可和完整部署与微调路径,便于读者评估落地成本。
简介
Llama 2 是 Meta 今天发布的一系列最先进的开放访问大型语言模型,我们很高兴通过在 HF Mirror 中的全面集成来全力支持此次发布。Llama 2 以一个非常宽松的社区许可证发布,可用于商业用途。代码、预训练模型和微调模型均在今天发布 🔥
我们与 Meta 合作,确保顺利集成到 HF Mirror 生态系统中。您可以在 Hub 上找到 12 个开放访问模型(3 个基础模型和 3 个使用原始 Meta 检查点的微调模型,以及它们对应的 transformers 模型)。在发布的功能和集成中,我们有:
- Hub 上的模型及其模型卡和许可证。
- Transformers 集成
- 使用单个 GPU 微调模型小变体的示例
- 与 文本生成推理集成,以实现快速高效的生产就绪推理
- 与推理端点集成
目录
为什么选择 Llama 2?
Llama 2 的发布引入了一系列预训练和微调的大型语言模型,规模从 7B 到 70B 参数不等(7B、13B、70B)。预训练模型相比 Llama 1 模型有显著改进,包括在 40% 更多的 token 上进行训练,具有更长的上下文长度(4k token 🤯),并使用分组查询注意力以实现 70B 模型的快速推理🔥!
然而,本次发布最令人兴奋的部分是微调模型(Llama 2-Chat),它们使用基于人类反馈的强化学习(RLHF)针对对话应用进行了优化。在广泛的帮助性和安全性基准测试中,根据人类评估,Llama 2-Chat 模型的表现优于大多数开放模型,并达到与 ChatGPT 相当的性能。您可以在此阅读论文。
图片来自 Llama 2: Open Foundation and Fine-Tuned Chat Models
如果您一直在等待闭源聊天机器人的开放替代品,Llama 2-Chat 可能是您今天的最佳选择!
| 模型 | 许可证 | 商业用途? | 预训练长度 [token] | 排行榜分数 |
|---|---|---|---|---|
| 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 月引入的新方法,该方法增加了新的基准测试。更多详情见此帖子。
演示
您可以轻松地在此 Space 或下方嵌入的 playground 中尝试 13B Llama 2 模型:
要了解有关此演示如何工作的更多信息,请继续阅读下方关于如何在 Llama 2 模型上运行推理的内容。
推理
在本节中,我们将探讨运行 Llama 2 模型推理的不同方法。在使用这些模型之前,请确保您已申请获得官方 Meta Llama 2 仓库中某个模型的访问权限。
注意:请确保也填写官方 Meta 表单。在填写完两份表单后,用户将在几小时后获得仓库访问权限。
使用 transformers
使用 transformers 4.31 版本,您已经可以使用 Llama 2,并利用 HF 生态系统中的所有工具,例如:
- 训练和推理脚本及示例
- 安全文件格式(
safetensors) - 与 bitsandbytes(4 位量化)和 PEFT(参数高效微调)等工具的集成
- 用于运行模型生成的实用工具和辅助函数
- 将模型导出以进行部署的机制
请确保使用最新的 transformers 版本,并登录您的 HF Mirror 账户。
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 的上下文 token,您可以使用 transformers 中支持的技术(如旋转位置嵌入缩放(tweet))来进一步扩展它!
使用 text-generation-inference 和 Inference Endpoints
Text Generation Inference 是 HF Mirror 开发的生产就绪推理容器,可轻松部署大型语言模型。它具有连续批处理、token 流式传输、用于多 GPU 快速推理的张量并行性,以及生产就绪的日志记录和跟踪等功能。
您可以在自己的基础设施上试用 Text Generation Inference,也可以使用 HF Mirror 的 Inference Endpoints。要部署 Llama 2 模型,请转到模型页面,然后点击部署 -> Inference Endpoints 小部件。
- 对于 7B 模型,我们建议您选择 "GPU [medium] - 1x Nvidia A10G"。
- 对于 13B 模型,我们建议您选择 "GPU [xlarge] - 1x Nvidia A100"。
- 对于 70B 模型,我们建议您选择启用
bitsandbytes量化的 "GPU [2xlarge] - 2x Nvidia A100",或 "GPU [4xlarge] - 4x Nvidia A100"
注意:您可能需要通过电子邮件向 [email protected] 申请配额升级才能访问 A100
您可以在我们的博客中了解有关如何使用 HF Mirror Inference Endpoints 部署 LLM 的更多信息。该博客包含有关支持的超参数以及如何使用 Python 和 Javascript 流式传输响应的信息。
使用 PEFT 进行微调
训练 LLM 在技术和计算上都具有挑战性。在本节中,我们将介绍 HF Mirror 生态系统中可用的工具,以便在简单硬件上高效训练 Llama 2,并展示如何在单个 NVIDIA T4(16GB - Google Colab)上微调 Llama 2 的 7B 版本。您可以在让 LLM 更易于访问的博客中了解更多信息。
我们创建了一个脚本,使用 QLoRA 和来自 trl 的 SFTTrainer 对 Llama 2 进行指令微调。
下面可以找到一个在 timdettmers/openassistant-guanaco 上微调 Llama 2 7B 的示例命令。通过提供 safetensor 参数,该脚本可以将 LoRA 权重合并到模型权重中,并将其保存为 merge_and_push 权重。这使我们能够在训练后使用 text-generation-inference 和推理端点部署微调后的模型。
首先 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 聊天演示中输入一些文本(There's a llama in my garden 😱 What should I do?)以发起聊天时,实际发送给语言模型的内容如下:
<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 演示中,你可以通过展开“高级选项”界面并简单地编写你想要的指令来轻松探索此功能。你也可以复制这些演示,并私下用于娱乐或研究!
附加资源
结论
我们对 Llama 2 的发布感到非常兴奋!在接下来的日子里,准备好了解更多关于运行你自己的微调、在设备上执行最小模型,以及我们为你准备的许多其他令人兴奋的更新!
来源:Hugging Face Blog · hf-mirror.com
