欢迎 Llama 3 - Meta 的新开源大语言模型

发布于 2024 年 4 月 18 日
在 GitHub 上更新

简介

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)。在我们发布的特性和集成中,包括:

目录

Llama 3 有哪些新功能?

Llama 3 的发布带来了 Meta 基于 Llama 2 架构的 4 个新的开放大语言模型。它们有两种尺寸:8B 和 70B 参数,每种尺寸都有基础(预训练)和指令调优版本。所有变体都可以在各种类型的消费级硬件上运行,并具有 8K tokens 的上下文长度。

除了这 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 代码库的默认采样参数(temperaturetop_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 的信息:此处

其他资源

致谢

在生态系统中发布此类模型并提供支持和评估,离不开许多社区成员的贡献,包括:

感谢 Meta 团队发布 Llama 3 并将其提供给开源 AI 社区!

社区

注册登录以发表评论