現在 Llama 具備視覺能力並可以在你的裝置上執行 - 歡迎使用 Llama 3.2

HuggingFace發表於2024-10-15

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,可以與這些或更大的文字模型一起部署在生產用例中。

在釋出的功能和整合中,我們有:

  • Hub 上的模型檢查點
  • Hugging Face Transformers 和 TGI 對視覺模型的整合
  • 在 Google Cloud、Amazon SageMaker 和 DELL 企業中心的推理與部署整合
  • 使用 transformers🤗TRL 在單個 GPU 上微調 Llama 3.2 11B 視覺模型

什麼是 Llama3.2 Vision 模型?

Llama 3.2 Vision 是 Meta 釋出的最強大的開源多模態模型。它具有出色的視覺理解和推理能力,可以用於完成各種任務,包括視覺推理與定位、文件問答和影像 - 文字檢索。思維鏈 (Chain of Thought, CoT) 答案通常非常好,這使得視覺推理特別強大。

Llama 3.2 Vision 可以處理文字和影像,也可以僅處理文字。對於影像 - 文字提示,模型可以接受英文輸入,而對於僅文字提示,模型可以處理多種語言。在僅文字模式下,支援的完整語言列表包括英語、德語、法語、義大利語、葡萄牙語、印地語、西班牙語和泰語。

這些模型的架構基於 Llama 3.1 LLM 與視覺塔和影像介面卡的組合。用於 Llama 3.2 11B Vision 的文字模型是 Llama 3.1 8B,而 Llama 3.2 90B Vision 則使用 Llama 3.1 70B。根據我們的瞭解,文字模型在視覺模型訓練期間是凍結的,以保持僅文字的效能。

下面是一些來自 11B 指令調優模型的推理示例,展示了真實世界知識、文件推理和資訊圖理解能力。

這張圖片位於哪裡?附近還有哪些景點?
圖片描繪的是泰國曼谷的大皇宮。大皇宮是一個建築群,曾作為暹羅國王的官方住所,並作為政府的行政中心達 150 年之久。它是曼谷最受歡迎的旅遊景點之一,是任何訪問該市的人必去之地。

大皇宮附近的一些其他景點包括:
* 玉佛寺 (Wat Phra Kaew): 這座寺廟位於大皇宮複合區內,擁有著名的玉佛像。
* 鄭王廟 (Wat Arun): 這座寺廟位於湄南河的西岸,以其驚豔的建築和美麗的城市景觀而聞名。
* 臥佛寺 (Wat Pho): 這座寺廟靠近大皇宮,擁有一尊巨大的臥佛像。
* 隆比尼公園 (Lumpini Park): 這個公園位於曼谷中心,提供了一個遠離城市喧囂的寧靜避風港。
* 吉姆·湯普森故居 (Jim Thompson House): 這座博物館展示了美國商人吉姆·湯普森的生活和工作,他在 20 世紀 50 年代和 60 年代幫助振興了泰國絲綢產業。
根據這張圖表,乾旱發生在什麼地方?
2016 年乾旱區域: 根據圖表,2016 年發生乾旱的地區有兩個:
* 東非和南非: 該地區經歷了嚴重的乾旱。
* 智利: 智利在 1 月份經歷了 50 多年來最乾燥的天氣。這些地區在那段時間面臨嚴重的水資源短缺問題。
從發票日期到到期日期需要多長時間?請簡潔明瞭。
發票日期: 2019 年 2 月 11 日
到期日期: 2019 年 2 月 26 日
時間差計算:
2019 年 2 月 26 日 - 2019 年 2 月 11 日 = 15 天

發票日期與到期日期之間的時間差為**15 天**。

Vision 模型的上下文長度為 128k 個 token,這允許包含影像的多輪對話。然而,該模型在關注單一影像時效果最佳,因此 transformers 實現僅關注輸入中的最後一張影像。這可以保持質量並節省記憶體。

11B 基礎模型支援 448 的分塊尺寸,而指令微調版本和 90B 模型都使用 560 的分塊尺寸。這些模型在一個包含 60 億圖文對的海量資料集上進行了訓練,資料來源非常多樣化。這使得它們成為下游任務微調的極佳候選模型。下表展示了 11B、90B 模型及其指令微調版本在一些基準測試中的表現,資料來自 Meta。請參閱模型卡片以獲取更多基準測試和詳細資訊。

模型 11B 11B (指令微調) 90B 90B (指令微調) 指標
MMMU (val) 41.7 50.7 (CoT) 49.3 (zero-shot) 60.3 (CoT) Micro Average Accuracy
VQAv2 66.8 (val) 75.2 (test) 73.6 (val) 78.1 (test) Accuracy
DocVQA 62.3 (val) 88.4 (test) 70.7 (val) 90.1 (test) ANLS
AI2D 62.4 91.1 75.3 92.3 Accuracy

我們預計這些模型的文字能力將與 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 萬億個 token 進行訓練,並仍然支援長上下文長度的 128k 個 token。模型是多語言的,支援英語、德語、法語、義大利語、葡萄牙語、印地語、西班牙語和泰語。

還有一個新的 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 的指令調優模型均支援工具使用。使用者在 0-shot 環境中指定工具 (模型之前沒有關於開發者將使用的工具的資訊)。因此,Llama 3.1 模型中包含的內建工具 ( brave_searchwolfram_alpha ) 不再可用。

由於其體積小,這些小模型可以作為更大模型的助手,執行 輔助生成 (也稱為推測解碼)。這裡 是一個使用 Llama 3.2 1B 模型作為 Llama 3.1 8B 模型助手的示例。有關離線使用案例,請檢視後面的裝置上執行部分。

演示

你可以在以下演示中體驗這三種指令模型:

  • Gradio 空間中的 Llama 3.2 11B 視覺指令
  • Gradio 驅動的空間中的 Llama 3.2 3B
  • Llama 3.2 3B 在 WebGPU 上執行

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 或量化權重。記憶體要求取決於模型大小和權重精度。以下是一個表格,顯示使用不同配置進行推理時所需的大致記憶體:

Model Size 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 Vision 模型在 4 位模式下進行推理大約需要 10 GB 的 GPU RAM。

使用指令調優的 Llama 視覺模型進行推理的最簡單方法是使用內建的聊天模板。輸入具有 userassistant 角色,以指示對話的輪次。與文字模型的一個區別是不支援系統角色。使用者輪次可以包括影像 - 文字或僅文字輸入。要指示輸入包含影像,請在輸入的內容部分新增 {"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, 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-bit 或甚至 4-bit 模式載入。以下是如何在 4-bit 模式下載入生成管道的示例:

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,
)

然後,你可以應用聊天模板,使用 processor ,並像以前一樣呼叫模型。

裝置端部署

你可以直接在裝置的 CPU/GPU/瀏覽器上執行 Llama 3.2 1B 和 3B,使用多個開源庫,如下所示。

Llama.cpp & Llama-cpp-python

Llama.cpp 是進行跨平臺裝置上機器學習推理的首選框架。我們為 1B 和 3B 模型提供了 4-bit 和 8-bit 的量化權重。我們希望社群能夠採用這些模型,並建立其他量化和微調。你可以在 這裡 找到所有量化的 Llama 3.2 模型。

以下是如何直接使用 llama.cpp 執行這些檢查點的方法。

透過 brew 安裝 llama.cpp (適用於 Mac 和 Linux)。

brew install llama.cpp

你可以使用 CLI 執行單次生成或呼叫相容 Open AI 訊息規範的 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 " 生命和宇宙的意義是 "

你可以這樣啟動伺服器:

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 中以程式設計方式訪問這些模型。

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",
)
llm.create_chat_completion(
      messages = [
          {
              "role": "user",
              "content": "What is the capital of France?"
          }
      ]
)

Transformers.js

你甚至可以在瀏覽器 (或任何 JavaScript 執行時,如 Node.js、Deno 或 Bun) 中使用 Transformers.js 執行 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?

微調 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

你還可以檢視 筆記本,瞭解如何使用 Transformers 和 PEFT 進行 LoRA 微調。

Hugging Face 合作伙伴整合

我們目前正在與 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 獲取電子郵件更新。

額外資源

  • Hub 上的模型
  • Hugging Face Llama Recipes
  • Open LLM Leaderboard
  • Meta Blog
  • 評估資料集

鳴謝

沒有成千上萬社群成員的貢獻,這種模型的釋出以及生態系統中的支援和評估將無法實現,他們為 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 讓 Llama 3.2 在 Hugging Chat 上可用; Brigitte Tousignant 和 Florent Daudens 的溝通支援; Julien、Simon、Pierric、Eliott、Lucain、Alvaro、Caleb 和 Mishig 來自 Hub 團隊的開發和功能釋出支援。

特別感謝 Meta 團隊釋出 Llama 3.2 並使其開放給 AI 社群!


原文連結: https://hf.co/blog/llama32

原文作者: Merve Noyan, Philipp Schmid, Omar Sanseviero, Vaibhav Srivastav, Lewis Tunstall, Aritra Roy Gosthipaty, Pedro Cuenca

譯者: cheninwang, roseking

相關文章