Llama 现在可以在您的设备上看到并运行 - 欢迎 Llama 3.2

发布于 2024 年 9 月 25 日
在 GitHub 上更新

Llama 3.2 发布了!今天,我们欢迎 Llama 系列的下一次迭代来到 Hugging Face。这次,我们很高兴与 Meta 合作发布多模态和小模型。Hub 上提供了十个开源模型(5 个多模态模型和 5 个仅文本模型)。

Llama 3.2 Vision 有两种尺寸:11B 用于在消费级 GPU 上高效部署和开发,90B 用于大型应用程序。两个版本都有基础版和指令微调版。除了四种多模态模型外,Meta 还发布了支持视觉的 Llama Guard 新版本。Llama Guard 3 是一种安全模型,可以对模型输入和生成进行分类,包括检测有害的多模态提示或助手响应。

Llama 3.2 还包括可以在设备上运行的小型纯文本语言模型。它们有两种新尺寸(1B 和 3B),具有基础版和指令版,并且它们在各自尺寸下具有强大的功能。还有一个小型 1B 版本的 Llama Guard,可以在生产用例中与这些模型或更大的文本模型一起部署。

在发布的功能和集成中,我们有

目录

Llama 3.2 Vision 是什么?

Llama 3.2 Vision 是 Meta 发布的最强大的开放式多模态模型。它具有出色的视觉理解和推理能力,可用于完成各种任务,包括视觉推理和接地、文档问答以及图像-文本检索。思维链 (CoT) 答案通常非常好,这使得视觉推理特别强大。

Llama 3.2 Vision 可用于处理文本和图像,也可以仅处理文本。通过图像-文本提示,模型可以接受英语输入,而对于仅文本提示,模型可以处理多种语言。

仅文本模式下支持的完整语言列表是

  • 英语
  • 德语
  • 法语
  • 意大利语
  • 葡萄牙语
  • 印地语
  • 西班牙语
  • 泰语

这些模型的架构基于 Llama 3.1 LLM 与视觉塔和图像适配器的组合。文本模型分别用于 Llama 3.2 11B Vision 模型的 Llama 3.1 8B 和用于 3.2 90B Vision 模型的 Llama 3.1 70B。据我们了解,在视觉模型训练期间,文本模型被冻结以保持纯文本性能。

下面您可以看到 11B 指令微调模型的一些推理示例,它们展示了真实世界知识、文档推理和信息图理解能力。

输入图片输入提示回答
它位于哪里?附近还有其他景点吗? 图像描绘的是泰国曼谷的大皇宫。大皇宫是一组建筑群,曾是暹罗国王的官方住所和政府行政所在地,长达 150 年。它是曼谷最受欢迎的旅游景点之一,也是任何到访该城市的人必看之地。

大皇宫附近的其他景点包括
* 玉佛寺:这座寺庙位于大皇宫建筑群内,是著名的翡翠佛像所在地。
* 郑王庙:这座寺庙位于湄南河西岸,以其令人惊叹的建筑和城市美景而闻名。
* 卧佛寺:这座寺庙位于大皇宫附近,是大型卧佛像的所在地。
根据此图表,干旱发生在哪里? 2016 年干旱地区
根据图表,2016 年干旱发生在两个不同地区
* 东部和南部非洲:该地区经历了严重的干旱。
* 智利:智利在 1 月份经历了 50 多年来最干旱的时期。这些地区在此期间面临严重的缺水问题。
从发票日期到到期日需要多长时间?简短明了。 发票日期 11/02/2019
到期日 26/02/2019
时间差计算
2019/02/26 - 2019/02/11 = 15 天
发票日期与到期日之间的时间差是 15 天。

视觉模型的上下文长度为 128k 令牌,这允许包含图像的多轮对话。但是,模型在处理单个图像时效果最佳,因此 `transformers` 实现只关注输入中提供的最后一张图像。这可以保持质量并节省内存。

11B 基础模型支持 448 的图块大小,而指令版本和 90B 模型都使用 560 的图块大小。这些模型在一个包含 60 亿图像-文本对的庞大数据集上进行训练,数据混合多样。这使它们成为下游任务微调的绝佳候选。作为参考,您可以在下面看到 11B、90B 及其指令微调版本在 Meta 报告的一些基准测试中的比较。请参阅模型卡以获取更多基准测试和详细信息。

11B 11B(指令微调) 90B 90B(指令微调) 指标
MMMU (val) 41.7 50.7 (CoT) 49.3 (零样本) 60.3 (CoT) 微平均准确率
VQAv2 66.8 (val) 75.2 (test) 73.6 (val) 78.1 (test) 准确率
DocVQA 62.3 (val) 88.4 (test) 70.7 (val) 90.1 (test) ANLS
AI2D 62.4 91.1 75.3 92.3 准确率

我们预计这些模型的文本能力将分别与 8B 和 70B Llama 3.1 模型持平,因为我们了解到文本模型在 Vision 模型训练期间是冻结的。因此,文本基准测试应与 8B 和 70B 保持一致。

Llama 3.2 许可证变更。抱歉,欧盟 :(

License Change

关于许可条款,Llama 3.2 的许可证与 Llama 3.1 非常相似,但在可接受使用政策上有一个关键区别:任何居住在欧盟的个人或主要营业地在欧盟的公司均不被授予使用 Llama 3.2 中包含的多模态模型的许可权利。此限制不适用于包含此类多模态模型的产品或服务的最终用户,因此人们仍然可以使用视觉变体构建全球产品。

有关完整详细信息,请务必阅读官方许可证可接受使用政策

Llama 3.2 1B 和 3B 有何特别之处?

Llama 3.2 系列包括 1B 和 3B 文本模型。这些模型专为设备上的用例而设计,例如提示重写、多语言知识检索、摘要任务、工具使用和本地运行的助手。它们在这些尺寸下优于许多可用的开放访问模型,并与大得多倍的模型竞争。在后面的部分中,我们将向您展示如何在离线状态下运行这些模型。

这些模型遵循与 Llama 3.1 相同的架构。它们使用多达 9 万亿个标记进行训练,并且仍然支持 128k 标记的长上下文长度。这些模型是多语言的,支持英语、德语、法语、意大利语、葡萄牙语、印地语、西班牙语和泰语。

还有一个新的小型 Llama Guard 版本,Llama Guard 3 1B,可以与这些模型一起部署,以评估多轮对话中最后的用户或助手响应。它使用一组预定义的类别,这些类别(此版本新增)可以自定义或排除,以适应开发者的用例。有关 Llama Guard 使用的更多详细信息,请参阅模型卡。

额外福利:Llama 3.2 已接触到比上述 8 种支持语言更广泛的语言集。鼓励开发者根据其特定语言用例对 Llama 3.2 模型进行微调。

我们对基础模型进行了 Open LLM Leaderboard 评估套件的评估,而指令模型则在三个流行的基准测试中进行评估,这些基准测试衡量指令遵循能力并与 LMSYS Chatbot Arena 很好地相关:IFEvalAlpacaEvalMixEval-Hard。以下是基础模型的结果,Llama-3.1-8B 作为参考

模型 BBH MATH Lvl 5 GPQA MUSR MMLU-PRO 平均分
Meta-Llama-3.2-1B 4.37 0.23 0.00 2.56 2.26 1.88
Meta-Llama-3.2-3B 14.73 1.28 4.03 3.39 16.57 8.00
Meta-Llama-3.1-8B 25.29 4.61 6.15 8.98 24.95 14.00

以下是指令模型的结果,Llama-3.1-8B-Instruct 作为参考

模型 AlpacaEval (LC) IFEval MixEval-Hard 平均分
Meta-Llama-3.2-1B-Instruct 7.17 58.92 26.10 30.73
Meta-Llama-3.2-3B-Instruct 20.88 77.01 31.80 43.23
Meta-Llama-3.1-8B-Instruct 25.74 76.49 44.10 48.78

值得注意的是,3B 模型在 IFEval 上与 8B 模型一样强大!这使得该模型非常适合代理应用,其中遵循指令对于提高可靠性至关重要。对于这种规模的模型来说,如此高的 IFEval 分数令人印象深刻。

1B 和 3B 指令微调模型都支持工具使用。工具由用户在零样本设置中指定(模型没有关于开发者将使用哪些工具的先前信息)。因此,Llama 3.1 模型中内置的工具(`brave_search` 和 `wolfram_alpha`)不再可用。

由于其尺寸,这些小型模型可以用作大型模型的助手并执行辅助生成(也称为推测解码)。此处是使用 Llama 3.2 1B 模型作为 Llama 3.1 8B 模型助手的示例。对于离线用例,请查看本文后面的设备上部分

演示

您可以在以下演示中试用三个指令模型

Demo GIF

使用 Hugging Face Transformers

纯文本检查点与以前的版本具有相同的架构,因此无需更新您的环境。但是,鉴于新架构,Llama 3.2 Vision 需要更新 Transformers。请确保将您的安装升级到 4.45.0 或更高版本。

pip install "transformers>=4.45.0" --upgrade

升级后,您可以使用新的 Llama 3.2 模型并利用 Hugging Face 生态系统的所有工具。

Llama 3.2 1B & 3B 语言模型

您只需几行代码即可使用 Transformers 运行 1B 和 3B 文本模型检查点。模型检查点以 `bfloat16` 精度上传,但您也可以使用 float16 或量化权重。内存要求取决于模型大小和权重精度。下表显示了使用不同配置进行推理所需的近似内存

模型大小 BF16/FP16 FP8 INT4
3B 6.5 GB 3.2 GB 1.75 GB
1B 2.5 GB 1.25 GB 0.75 GB
from transformers import pipeline
import torch

model_id = "meta-llama/Llama-3.2-3B-Instruct"
pipe = pipeline(
    "text-generation",
    model=model_id,
    torch_dtype=torch.bfloat16,
    device_map="auto",
)

messages = [
    {"role": "user", "content": "Who are you? Please, answer in pirate-speak."},
]
outputs = pipe(
    messages,
    max_new_tokens=256,
)
response = outputs[0]["generated_text"][-1]["content"]
print(response)
# Arrrr, me hearty! Yer lookin' fer a bit o' information about meself, eh? Alright then, matey! I be a language-generatin' swashbuckler, a digital buccaneer with a penchant fer spinnin' words into gold doubloons o' knowledge! Me name be... (dramatic pause)...Assistant! Aye, that be me name, and I be here to help ye navigate the seven seas o' questions and find the hidden treasure o' answers! So hoist the sails and set course fer adventure, me hearty! What be yer first question?

一些细节

  • 我们以 `bfloat16` 加载模型。如上所述,这是 Meta 发布的原始检查点使用的类型,因此它是确保最佳精度或进行评估的推荐方式。根据您的硬件,float16 可能更快。

  • 默认情况下,transformers 使用与原始 meta 代码库相同的采样参数(temperature=0.6 和 top_p=0.9)。我们尚未进行广泛测试,欢迎您探索!

Llama 3.2 Vision

Vision 模型更大,因此比小型文本模型需要更多的内存才能运行。作为参考,11B Vision 模型在 4 位模式下推理时大约需要 10 GB 的 GPU RAM。

使用指令微调的 Llama Vision 模型进行推理的最简单方法是使用内置的聊天模板。输入具有 `user` 和 `assistant` 角色,以指示对话轮次。与文本模型的一个区别是系统角色不受支持。用户轮次可能包括图像-文本或纯文本输入。要指示输入包含图像,请在输入的内容部分添加 `{"type": "image"}`,然后将图像数据传递给 `processor`

import requests
import torch
from PIL import Image
from transformers import MllamaForConditionalGeneration, AutoProcessor

model_id = "meta-llama/Llama-3.2-11B-Vision-Instruct"
model = MllamaForConditionalGeneration.from_pretrained(
    model_id,
    torch_dtype=torch.bfloat16,
    device="cuda",
)
processor = AutoProcessor.from_pretrained(model_id)

url = "https://huggingface.co/datasets/huggingface/documentation-images/resolve/0052a70beed5bf71b92610a43a52df6d286cd5f3/diffusers/rabbit.jpg"
image = Image.open(requests.get(url, stream=True).raw)

messages = [
    {"role": "user", "content": [
        {"type": "image"},
        {"type": "text", "text": "Can you please describe this image in just one sentence?"}
    ]}
]

input_text = processor.apply_chat_template(
    messages, add_generation_prompt=True,
)
inputs = processor(
    image,
    input_text,
    add_special_tokens=False,
    return_tensors="pt",
).to(model.device)
output = model.generate(**inputs, max_new_tokens=70)

print(processor.decode(output[0][inputs["input_ids"].shape[-1]:]))


## The image depicts a rabbit dressed in a blue coat and brown vest, standing on a dirt road in front of a stone house.

您可以继续有关图像的对话。但是请记住,如果您在新的用户回合中提供新图像,模型将从那一刻起引用新图像。您不能同时查询两张不同的图像。这是之前对话的示例,我们添加了助手回合并要求提供更多详细信息

messages = [
    {"role": "user", "content": [
        {"type": "image"},
        {"type": "text", "text": "Can you please describe this image in just one sentence?"}
    ]},
    {"role": "assistant", "content": "The image depicts a rabbit dressed in a blue coat and brown vest, standing on a dirt road in front of a stone house."},
    {"role": "user", "content": "What is in the background?"}
]

input_text = processor.apply_chat_template(
    messages,
    add_generation_prompt=True,
)
inputs = processor(image, input_text, return_tensors="pt").to(model.device)
output = model.generate(**inputs, max_new_tokens=70)
print(processor.decode(output[0][inputs["input_ids"].shape[-1]:]))

这是我们得到的回复

In the background, there is a stone house with a thatched roof, a dirt road, a field of flowers, and rolling hills.

您还可以使用 `bitsandbytes` 库自动量化模型,以 8 位甚至 4 位模式加载。以下是您如何以 4 位加载生成管道的方式

import torch
from transformers import MllamaForConditionalGeneration, AutoProcessor
+from transformers import BitsAndBytesConfig

+bnb_config = BitsAndBytesConfig(
+    load_in_4bit=True,
+    bnb_4bit_quant_type="nf4",
+    bnb_4bit_compute_dtype=torch.bfloat16
)
 
model = MllamaForConditionalGeneration.from_pretrained(
    model_id,
-   torch_dtype=torch.bfloat16,
-   device="cuda",
+   quantization_config=bnb_config,
)

然后,您可以应用聊天模板,使用处理器,并像以前一样调用模型。

设备上

您可以使用以下几种开源库,将 Llama 3.2 1B 和 3B 直接在您的设备的 CPU/GPU/浏览器上运行。

Llama.cpp & Llama-cpp-python

Llama.cpp 是跨平台设备上机器学习推理的首选框架。我们为该系列中的 1B 和 3B 模型提供了量化的 4 位和 8 位权重。我们期望社区采纳这些模型并创建额外的量化和微调。您可以在这里找到所有量化的 Llama 3.2 模型。

以下是如何直接使用 llama.cpp 检查点。

通过 brew 安装 llama.cpp(适用于 Mac 和 Linux)。

brew install llama.cpp

您可以使用 CLI 运行单个生成或调用 llama.cpp 服务器,该服务器与 OpenAI 消息规范兼容。

您将使用类似这样的命令运行 CLI

llama-cli --hf-repo hugging-quants/Llama-3.2-3B-Instruct-Q8_0-GGUF --hf-file llama-3.2-3b-instruct-q8_0.gguf -p "The meaning to life and the universe is"

您将像这样启动服务器

llama-server --hf-repo hugging-quants/Llama-3.2-3B-Instruct-Q8_0-GGUF --hf-file llama-3.2-3b-instruct-q8_0.gguf -c 2048

您还可以使用llama-cpp-python以编程方式在 Python 中访问这些模型。使用以下命令从PyPI安装该库

pip install llama-cpp-python

然后,您可以按如下方式运行模型

from llama_cpp import Llama

llm = Llama.from_pretrained(
    repo_id="hugging-quants/Llama-3.2-3B-Instruct-Q8_0-GGUF",
    filename="*q8_0.gguf",
)
output = llm.create_chat_completion(
      messages = [
          {
              "role": "user",
              "content": "What is the capital of France?"
          }
      ]
)

print(output)

Transformers.js

您甚至可以使用 Transformers.js 在浏览器(或任何 JavaScript 运行时,如 Node.js、Deno 或 Bun)中运行 Llama 3.2。您可以在 Hub 上找到 ONNX 模型。如果您还没有,可以使用以下命令从 NPM 安装该库

npm i @huggingface/transformers

然后,您可以按如下方式运行模型

import { pipeline } from "@huggingface/transformers";

// Create a text generation pipeline
const generator = await pipeline("text-generation", "onnx-community/Llama-3.2-1B-Instruct");

// Define the list of messages
const messages = [
  { role: "system", content: "You are a helpful assistant." },
  { role: "user", content: "Tell me a joke." },
];

// Generate a response
const output = await generator(messages, { max_new_tokens: 128 });
console.log(output[0].generated_text.at(-1).content);
示例输出
Here's a joke for you:

What do you call a fake noodle?

An impasta!

I hope that made you laugh! Do you want to hear another one?

MLC.ai Web-LLM

MLC.ai Web-LLM 是一种高性能的浏览器内 LLM 推理引擎,它将语言模型推理直接带入 Web 浏览器,并进行硬件加速。所有操作都在浏览器内部运行,无需服务器支持,并通过 WebGPU 进行加速。

WebLLM 完全兼容 OpenAI API。也就是说,您可以在本地使用相同的 OpenAI API 来处理任何开源模型,功能包括流式传输、JSON 模式、函数调用等。

您可以从 npm 安装 Web-LLM

npm install @mlc/web-llm

然后,您可以按如下方式运行模型

// Import everything
import * as webllm from "@mlc-ai/web-llm";
// Or only import what you need
import { CreateMLCEngine } from "@mlc-ai/web-llm";

// Callback function to update model loading progress
const initProgressCallback = (initProgress) => {
  console.log(initProgress);
}
const selectedModel = "Llama-3.2-3B-Instruct-q4f32_1-MLC";

const engine = await CreateMLCEngine(
  selectedModel,
  { initProgressCallback: initProgressCallback }, // engineConfig
);

成功初始化引擎后,您现在可以通过 `engine.chat.completions` 接口使用 OpenAI 风格的聊天 API 调用聊天完成。

const messages = [
  { role: "system", content: "You are a helpful AI assistant." },
  { role: "user", content: "Explain the meaning of life as a pirate!" },
]

const reply = await engine.chat.completions.create({
  messages,
});
console.log(reply.choices[0].message);
console.log(reply.usage);

微调 Llama 3.2

TRL 开箱即支持 Llama 3.2 文本模型的聊天和微调

# Chat
trl chat --model_name_or_path meta-llama/Llama-3.2-3B

# Fine-tune
trl sft  --model_name_or_path meta-llama/Llama-3.2-3B \
         --dataset_name HuggingFaceH4/no_robots \
         --output_dir Llama-3.2-3B-Instruct-sft \
         --gradient_checkpointing

TRL 也支持通过 此脚本 微调 Llama 3.2 Vision。

# Tested on 8x H100 GPUs
accelerate launch --config_file=examples/accelerate_configs/deepspeed_zero3.yaml \
    examples/scripts/sft_vlm.py \
    --dataset_name HuggingFaceH4/llava-instruct-mix-vsft \
    --model_name_or_path meta-llama/Llama-3.2-11B-Vision-Instruct \
    --per_device_train_batch_size 8 \
    --gradient_accumulation_steps 8 \
    --output_dir Llama-3.2-11B-Vision-Instruct-sft \
    --bf16 \
    --torch_dtype bfloat16 \
    --gradient_checkpointing

您也可以查看 此 notebook 以了解如何使用 transformers 和 PEFT 进行 LoRA 微调。

Hugging Face 合作伙伴集成

我们目前正在与 AWS、Google Cloud、Microsoft Azure 和 DELL 的合作伙伴合作,将 Llama 3.2 11B、90B 添加到 Amazon SageMaker、Google Kubernetes Engine、Vertex AI 模型目录、Azure AI Studio、DELL Enterprise Hub。一旦容器可用,我们将更新此部分,您可以订阅 Hugging Squad 以获取电子邮件更新。

附加资源

致谢

在生态系统中发布带有支持和评估的模型,离不开数千名社区成员的贡献,他们为 transformers、text-generation-inference、vllm、pytorch、LM Eval Harness 和许多其他项目做出了贡献。向 VLLM 团队致敬,感谢他们在测试和报告问题方面的帮助。没有 Clémentine、Alina、Elie 和 Loubna 在 LLM 评估方面的所有支持,Nicolas Patry、Olivier Dehaene 和 Daniël de Kok 在文本生成推理方面的支持;Lysandre、Arthur、Pavel、Edward Beeching、Amy、Benjamin、Joao、Pablo、Raushan Turganbay、Matthew Carrigan 和 Joshua Lochner 在 transformers、transformers.js、TRL 和 PEFT 支持方面的贡献;Nathan Sarrazin 和 Victor 在 Hugging Chat 中提供 Llama 3.2;Brigitte Tousignant 和 Florent Daudens 在沟通方面的贡献;Hub 团队的 Julien、Simon、Pierric、Eliott、Lucain、Alvaro、Caleb 和 Mishig 在 Hub 开发和发布功能方面的贡献,这次发布是不可能实现的。

非常感谢 Meta 团队发布 Llama 3.2 并将其提供给开放 AI 社区!

社区

注册登录以评论