跳到正文
原文
Hugging Face Blog·· 2024-09-25精选AI 评分82

Llama 3.2 发布:支持视觉与端侧运行

Llama can now see and run on your device - welcome Llama 3.2

AI 导读

Meta 发布 Llama 3.2,共 10 个开放权重模型,包含 5 个多模态模型和 5 个纯文本模型。Llama 3.2 Vision 提供 11B 和 90B 两个规模,均有 base 与指令微调版本,视觉模型上下文长度为 128k tokens;文本模型新增 1B 和 3B 两种规格,面向端侧场景,训练使用最多 9 万亿 tokens。

推荐理由

文章给出 10 个开放权重模型与端侧量化运行路径,便于评估多模态开源方案的落地条件。

正文 · AI 翻译

Llama 3.2 发布啦!今天,我们欢迎 Llama 系列的最新成员加入 HF Mirror。这一次,我们非常兴奋能与 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 指令微调模型的一些推理示例,展示其现实世界知识、文档推理和信息图理解能力。

输入图像输入提示回答
它位于哪里?附近还有哪些其他景点? The image depicts the Grand Palace in Bangkok, Thailand. The Grand Palace is a complex of buildings that served as the official residence of the King of Siam and the administrative seat of government for 150 years. It is one of the most popular tourist attractions in Bangkok and a must-see for anyone visiting the city.

大皇宫附近的其他景点包括:
* 玉佛寺:这座寺庙位于大皇宫建筑群内,供奉着著名的玉佛。
* 郑王庙:这座寺庙位于湄南河西岸,以其令人惊叹的建筑和美丽的城市景观而闻名。
* 卧佛寺:这座寺庙位于大皇宫附近,供奉着一尊巨大的卧佛。

根据此图,干旱发生在哪里? 2016 年干旱地区
根据此图,2016 年干旱发生在两个不同的地区:
* 东部和南部非洲:该地区经历了严重干旱。
* 智利:智利经历了 50 多年来最干燥的一月。这些地区在那段时期面临严重的水资源短缺问题。
从发票日期到到期日期需要多长时间?请简短回答。 发票日期:2019 年 11 月 2 日
到期日期:2019 年 2 月 26 日
时间差计算:
2019 年 2 月 26 日 - 2019 年 11 月 2 日 = 15 天
发票日期与到期日期之间的时间差为 15 天。

视觉模型具有 128k tokens 的上下文长度,这允许进行可能包含图像的多轮对话。然而,该模型在关注单张图像时效果最佳,因此 transformers 实现仅关注输入中提供的最后一张图像。这保持了质量并节省了内存。

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

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

我们预计这些模型的文本能力将分别与 8B 和 70B Llama 3.1 模型相当,因为我们的理解是文本模型在视觉模型训练期间被冻结。因此,文本基准测试应与 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聊天机器人竞技场有良好的相关性:IFEval、AlpacaEval和MixEval-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

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

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

由于它们的体积,这些小模型可以作为更大模型的助手,并执行辅助生成(也称为推测性解码)。这里有一个使用Llama 3.2 1B模型作为Llama 3.1 8B模型助手的例子。对于离线使用场景,请查看文章后面的设备端部分。

演示

您可以在以下演示中尝试这三个指令模型:

Demo GIF

使用HF Mirror Transformers

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

pip install "transformers>=4.45.0" --upgrade

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

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

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

使用指令微调的 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://hf-mirror.com/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,
)

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

设备端

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

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 来运行单次生成,或调用兼容 OpenAI 消息规范的 llama.cpp 服务器。

你可以使用类似这样的命令来运行 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 安装该库:

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/sft_visual_chat/sft_visual_chat.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 微调。

HF Mirror 合作伙伴集成

我们目前正在与 AWS、Google Cloud、Microsoft Azure 和 DELL 的合作伙伴合作,将 Llama 3.2 11B、90B 添加到 Amazon SageMaker、Google Kubernetes Engine、Vertex AI Model Catalog、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 在 Text Generation Inference 方面的支持;Lysandre、Arthur、Pavel、Edward Beeching、Amy、Benjamin、Joao、Pablo、Raushan Turganbay、Matthew Carrigan 和 Joshua Lochner 在 transformers、transformers.js、TRL 和 PEFT 支持方面的支持;Nathan Sarrazin 和 Victor 让 Llama 3.2 在 Hugging Chat 中可用;Brigitte Tousignant 和 Florent Daudens 的沟通工作;以及 Hub 团队的 Julien、Simon、Pierric、Eliott、Lucain、Alvaro、Caleb 和 Mishig 为发布所做的 Hub 开发和功能工作,本次发布不可能实现。

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

来源:Hugging Face Blog · hf-mirror.com