歡迎 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 社群!

社群

註冊登入以發表評論

© . This site is unofficial and not affiliated with Hugging Face, Inc.