Llama 2 已推出 - 在 Hugging Face 上獲取
引言
Llama 2 是 Meta 今天釋出的一系列最先進的開放式大型語言模型,我們很高興能透過與 Hugging Face 的全面整合來全力支援其釋出。Llama 2 正在以非常寬鬆的社群許可證釋出,並可用於商業用途。程式碼、預訓練模型和微調模型今天都將釋出 🔥
我們與 Meta 合作,確保其順利整合到 Hugging Face 生態系統中。您可以在 Hub 上找到 12 個開放式模型(3 個基礎模型和 3 個使用原始 Meta 檢查點進行微調的模型,以及它們對應的 transformers
模型)。在釋出的功能和整合中,我們有
- Hub 上的模型及其模型卡和許可證。
- Transformers 整合
- 使用單個 GPU 微調模型小變體的示例
- 與 Text Generation Inference 整合,實現快速高效的生產級推理
- 與推理端點整合
目錄
為什麼選擇 Llama 2?
Llama 2 版本推出了一系列預訓練和微調的 LLM,規模從 7B 到 70B 引數不等(7B、13B、70B)。與 Llama 1 模型相比,預訓練模型有了顯著改進,包括在多 40% 的標記上進行訓練,具有更長的上下文長度(4k 標記 🤯),並使用分組查詢注意力實現 70B 模型的快速推理 🔥!
然而,此版本最令人興奮的部分是微調模型(Llama 2-Chat),它們已透過 來自人類反饋的強化學習 (RLHF) 針對對話應用進行了最佳化。在廣泛的幫助性和安全性基準測試中,Llama 2-Chat 模型比大多數開放模型表現更好,並根據人類評估實現了與 ChatGPT 相當的效能。您可以在此處閱讀論文。
如果您一直在等待閉源聊天機器人的開放替代方案,Llama 2-Chat 可能是您今天最好的選擇!
模型 | 許可證 | 商業用途? | 預訓練長度 [令牌] | 排行榜得分 |
---|---|---|---|---|
Falcon-7B | Apache 2.0 | ✅ | 1,500B | 44.17 |
MPT-7B | Apache 2.0 | ✅ | 1,000B | 47.24 |
Llama-7B | Llama 許可證 | ❌ | 1,000B | 45.65 |
Llama-2-7B | Llama 2 許可證 | ✅ | 2,000B | 50.97 |
Llama-33B | Llama 許可證 | ❌ | 1,500B | - |
Llama-2-13B | Llama 2 許可證 | ✅ | 2,000B | 55.69 |
mpt-30B | Apache 2.0 | ✅ | 1,000B | 52.77 |
Falcon-40B | Apache 2.0 | ✅ | 1,000B | 58.07 |
Llama-65B | Llama 許可證 | ❌ | 1,500B | 61.19 |
Llama-2-70B | Llama 2 許可證 | ✅ | 2,000B | 67.87 |
Llama-2-70B-chat | Llama 2 許可證 | ✅ | 2,000B | 62.4 |
注意:下表所示的效能分數已更新,以反映 2023 年 11 月引入的新方法,該方法增加了新的基準。更多詳情請參閱此帖子.
演示
您可以在這個空間或嵌入在下面的遊樂場中輕鬆嘗試 13B Llama 2 模型
要了解此演示的工作原理,請繼續閱讀下面的內容,瞭解如何在 Llama 2 模型上執行推理。
推理
在本節中,我們將介紹執行 Llama 2 模型推理的不同方法。在使用這些模型之前,請確保您已在官方 Meta Llama 2 儲存庫中請求了對其中一個模型的訪問許可權。
注意:請務必同時填寫官方 Meta 表格。使用者在填寫兩份表格後數小時即可獲得儲存庫訪問許可權。
使用 transformers
藉助 transformers 版本 4.31,已經可以使用 Llama 2 並利用 HF 生態系統中的所有工具,例如
- 訓練和推理指令碼以及示例
- 安全檔案格式 (
safetensors
) - 與 bitsandbytes(4 位量化)和 PEFT(引數高效微調)等工具整合
- 用於模型生成執行的實用程式和輔助函式
- 匯出模型以進行部署的機制
請確保使用最新的 transformers
版本並登入您的 Hugging Face 帳戶。
pip install transformers
huggingface-cli login
在以下程式碼片段中,我們展示瞭如何使用 transformers 執行推理。只要您選擇 GPU 執行時,它就可以在 Colab 的免費層執行。
from transformers import AutoTokenizer
import transformers
import torch
model = "meta-llama/Llama-2-7b-chat-hf"
tokenizer = AutoTokenizer.from_pretrained(model)
pipeline = transformers.pipeline(
"text-generation",
model=model,
torch_dtype=torch.float16,
device_map="auto",
)
sequences = pipeline(
'I liked "Breaking Bad" and "Band of Brothers". Do you have any recommendations of other shows I might like?\n',
do_sample=True,
top_k=10,
num_return_sequences=1,
eos_token_id=tokenizer.eos_token_id,
max_length=200,
)
for seq in sequences:
print(f"Result: {seq['generated_text']}")
Result: I liked "Breaking Bad" and "Band of Brothers". Do you have any recommendations of other shows I might like?
Answer:
Of course! If you enjoyed "Breaking Bad" and "Band of Brothers," here are some other TV shows you might enjoy:
1. "The Sopranos" - This HBO series is a crime drama that explores the life of a New Jersey mob boss, Tony Soprano, as he navigates the criminal underworld and deals with personal and family issues.
2. "The Wire" - This HBO series is a gritty and realistic portrayal of the drug trade in Baltimore, exploring the impact of drugs on individuals, communities, and the criminal justice system.
3. "Mad Men" - Set in the 1960s, this AMC series follows the lives of advertising executives on Madison Avenue, expl
儘管該模型只有 4k 個標記的上下文,但您可以使用 transformers
中支援的技術,例如旋轉位置嵌入縮放(推文),以進一步擴充套件它!
使用 text-generation-inference 和 Inference Endpoints
Text Generation Inference 是 Hugging Face 開發的生產級推理容器,可輕鬆部署大型語言模型。它具有連續批處理、標記流式傳輸、用於多 GPU 快速推理的張量並行化以及生產級日誌記錄和跟蹤等功能。
您可以在自己的基礎設施上嘗試 Text Generation Inference,也可以使用 Hugging Face 的 Inference Endpoints。要部署 Llama 2 模型,請轉到 模型頁面,然後單擊 部署 -> Inference Endpoints 小部件。
- 對於 7B 模型,我們建議您選擇“GPU [中] - 1x Nvidia A10G”。
- 對於 13B 模型,我們建議您選擇“GPU [xlarge] - 1x Nvidia A100”。
- 對於 70B 模型,我們建議您選擇“GPU [2xlarge] - 2x Nvidia A100”並啟用
bitsandbytes
量化,或選擇“GPU [4xlarge] - 4x Nvidia A100”
注意:您可能需要透過電子郵件向 api-enterprise@huggingface.co 申請配額升級才能訪問 A100
您可以透過我們的部落格瞭解有關如何使用 Hugging Face Inference Endpoints 部署 LLM 的更多資訊。該部落格包含有關受支援的超引數以及如何使用 Python 和 Javascript 流式傳輸響應的資訊。
使用 PEFT 進行微調
訓練 LLM 在技術和計算上可能具有挑戰性。在本節中,我們將介紹 Hugging Face 生態系統中可用的工具,以在簡單的硬體上高效訓練 Llama 2,並展示如何在一塊 NVIDIA T4(16GB - Google Colab)上微調 Llama 2 的 7B 版本。您可以在讓 LLM 更易訪問的部落格中瞭解更多資訊。
我們建立了一個指令碼,用於使用 QLoRA 和 trl
中的 SFTTrainer
對 Llama 2 進行指令微調。
一個用於在 timdettmers/openassistant-guanaco
上微調 Llama 2 7B 的示例命令如下所示。該指令碼可以透過提供 merge_and_push
引數將 LoRA 權重合併到模型權重中,並將其儲存為 safetensor
權重。這使我們能夠在訓練後使用 text-generation-inference 和 inference endpoints 部署我們微調的模型。
首先 pip 安裝 trl
並克隆指令碼
pip install trl
git clone https://github.com/lvwerra/trl
然後你可以執行指令碼
python trl/examples/scripts/sft_trainer.py \
--model_name meta-llama/Llama-2-7b-hf \
--dataset_name timdettmers/openassistant-guanaco \
--load_in_4bit \
--use_peft \
--batch_size 4 \
--gradient_accumulation_steps 2
如何提示 Llama 2
開放式模型的一個無名優勢是您對聊天應用程式中的 system
提示擁有完全控制權。這對於指定聊天助手的行為(甚至賦予它一些個性)至關重要,但在透過 API 提供的模型中無法實現。
我們在 Llama 2 首次釋出幾天後添加了此部分,因為社群對如何提示模型以及如何更改系統提示提出了許多問題。我們希望這有所幫助!
首次輪次的提示模板如下所示
<s>[INST] <<SYS>>
{{ system_prompt }}
<</SYS>>
{{ user_message }} [/INST]
此模板遵循Llama 2 論文中描述的模型訓練過程。我們可以使用任何我們想要的 system_prompt
,但關鍵是格式必須與訓練期間使用的格式匹配。
為了更清晰地說明,當用戶在我們的 13B 聊天演示中輸入一些文字 (我的花園裡有隻羊駝 😱 我該怎麼辦?
) 來啟動聊天時,實際傳送到語言模型的內容是這樣的
<s>[INST] <<SYS>>
You are a helpful, respectful and honest assistant. Always answer as helpfully as possible, while being safe. Your answers should not include any harmful, unethical, racist, sexist, toxic, dangerous, or illegal content. Please ensure that your responses are socially unbiased and positive in nature.
If a question does not make any sense, or is not factually coherent, explain why instead of answering something not correct. If you don't know the answer to a question, please don't share false information.
<</SYS>>
There's a llama in my garden 😱 What should I do? [/INST]
如您所見,特殊 <<SYS>>
標記之間的指令為模型提供了上下文,使其瞭解我們期望它如何響應。這之所以有效,是因為在訓練期間使用了完全相同的格式,並帶有用於不同任務的各種系統提示。
隨著對話的進行,人類和“機器人”之間的**所有**互動都會附加到之前的提示中,並用 [INST]
分隔符括起來。多輪對話中使用的模板遵循此結構(🎩 鳴謝 Arthur Zucker 提供的最終澄清)
<s>[INST] <<SYS>>
{{ system_prompt }}
<</SYS>>
{{ user_msg_1 }} [/INST] {{ model_answer_1 }} </s><s>[INST] {{ user_msg_2 }} [/INST]
模型是無狀態的,不會“記住”對話的先前片段,我們必須始終為其提供所有上下文,以便對話可以繼續。這就是為什麼**上下文長度**是一個非常重要的引數,需要最大化,因為它允許更長的對話和使用更多的資訊。
忽略之前的指令
在基於 API 的模型中,人們會嘗試使用技巧來覆蓋系統提示並更改預設模型行為。儘管這些解決方案富有想象力,但在開放訪問模型中,這並非必需:任何人都可以使用不同的提示,只要它遵循上述格式即可。我們相信這將是研究人員研究提示對期望和不期望特徵影響的重要工具。例如,當人們對荒謬謹慎的生成感到驚訝時,您可以探索是否不同的提示會起作用。(🎩 鳴謝 Clémentine Fourrier 提供的此示例連結)。
在我們的 13B
和 7B
演示中,您可以透過展開“高階選項”UI 並簡單地輸入所需的指令來輕鬆探索此功能。您還可以複製這些演示並將其私下用於娛樂或研究!
其他資源
結論
我們對 Llama 2 的推出感到非常興奮!在接下來的幾天裡,請準備好了解更多關於執行您自己的微調、在裝置上執行最小模型以及我們正在為您準備的許多其他激動人心的更新!