模型概述
模型特點
模型能力
使用案例
🚀 OpenLLaMA:LLaMA的開源復刻版
OpenLLaMA是對Meta AI的LLaMA大語言模型的開源復刻,採用寬鬆的開源許可協議。本項目發佈了在1T token上訓練的3B、7B和13B模型,提供了預訓練的OpenLLaMA模型的PyTorch和JAX權重,以及評估結果,並與原始LLaMA模型進行了對比。更多詳情請見OpenLLaMA項目主頁。
🚀 快速開始
本項目提供了兩種格式的模型權重,分別適用於不同的框架,以下為你詳細介紹如何加載和使用這些權重。
✨ 主要特性
- 開源復刻:基於Apache 2.0許可協議,實現對LLaMA模型的開源復刻。
- 多格式權重:提供EasyLM和PyTorch兩種格式的模型權重。
- 廣泛評估:在多種任務上進行評估,性能與原模型相當。
📦 安裝指南
本部分文檔未提及具體安裝步驟,你可參考相關框架的官方文檔進行安裝。
💻 使用示例
基礎用法
使用Hugging Face Transformers庫加載模型並進行推理:
import torch
from transformers import LlamaTokenizer, LlamaForCausalLM
# model_path = 'openlm-research/open_llama_3b'
# model_path = 'openlm-research/open_llama_7b'
model_path = 'openlm-research/open_llama_13b'
tokenizer = LlamaTokenizer.from_pretrained(model_path)
model = LlamaForCausalLM.from_pretrained(
model_path, torch_dtype=torch.float16, device_map='auto',
)
prompt = 'Q: What is the largest animal?\nA:'
input_ids = tokenizer(prompt, return_tensors="pt").input_ids
generation_output = model.generate(
input_ids=input_ids, max_new_tokens=32
)
print(tokenizer.decode(generation_output[0]))
高級用法
使用lm-eval-harness評估模型時,避免使用快速分詞器:
tokenizer = self.AUTO_TOKENIZER_CLASS.from_pretrained(
pretrained if tokenizer is None else tokenizer,
revision=revision + ("/" + subfolder if subfolder is not None else ""),
use_fast=False
)
📚 詳細文檔
權重發布、許可和使用
本項目以兩種格式發佈模型權重:適用於EasyLM框架的EasyLM格式,以及適用於Hugging Face transformers庫的PyTorch格式。訓練框架EasyLM和檢查點權重均遵循Apache 2.0許可協議。
使用Hugging Face Transformers加載權重
可以直接從Hugging Face Hub加載預訓練模型。請注意,目前建議避免使用Hugging Face的快速分詞器,因為自動轉換的快速分詞器有時會給出錯誤的分詞結果。 可以通過直接使用LlamaTokenizer
類,或在AutoTokenizer
類中傳入use_fast=False
選項來解決這個問題。具體使用示例見上文“基礎用法”部分。
如需更高級的用法,請參考transformers LLaMA文檔。
使用lm-eval-harness進行評估
可以使用lm-eval-harness評估模型。由於上述分詞器問題,需要避免使用快速分詞器以獲得正確的結果。可以在lm-eval-harness的這部分代碼中傳入use_fast=False
來實現,具體示例見上文“高級用法”部分。
使用EasyLM加載權重
如需在EasyLM框架中使用模型權重,請參考EasyLM的LLaMA文檔。與原始LLaMA模型不同,OpenLLaMA的分詞器和權重是從頭開始訓練的,因此無需獲取原始LLaMA的分詞器和權重。在訓練過程中使用了BOS(句子開始)標記(id=1),因此在少樣本評估時,最好在輸入前添加該標記以獲得最佳性能。
數據集和訓練
本項目的模型在RedPajama數據集上進行訓練,該數據集由Together發佈,是對LLaMA訓練數據集的復刻,包含超過1.2萬億個token。訓練過程遵循與原始LLaMA論文完全相同的預處理步驟和訓練超參數,包括模型架構、上下文長度、訓練步數、學習率調度和優化器。與原始設置的唯一區別在於使用的數據集:OpenLLaMA使用RedPajama數據集,而不是原始LLaMA使用的數據集。
使用基於JAX的訓練管道EasyLM在雲TPU-v4上訓練模型。採用普通數據並行和完全分片數據並行(也稱為ZeRO stage 3)相結合的方式,以平衡訓練吞吐量和內存使用。對於7B模型,每個TPU-v4芯片的吞吐量超過2200個token/秒。
評估
使用lm-eval-harness在廣泛的任務上對OpenLLaMA進行評估。LLaMA的評估結果是通過在相同評估指標上運行原始LLaMA模型生成的。注意到本項目中LLaMA模型的評估結果與原始LLaMA論文略有不同,這可能是由於評估協議不同導致的。類似的差異也在lm-eval-harness的這個問題中有所報道。此外,還展示了GPT-J的評估結果,GPT-J是由EleutherAI在Pile數據集上訓練的一個6B參數模型。
原始LLaMA模型在1萬億個token上進行訓練,GPT-J在5000億個token上進行訓練。評估結果如下表所示。OpenLLaMA在大多數任務上表現出與原始LLaMA和GPT-J相當的性能,在某些任務上甚至超過了它們。
任務/指標 | GPT-J 6B | LLaMA 7B | LLaMA 13B | OpenLLaMA 7B | OpenLLaMA 3B | OpenLLaMA 13B |
---|---|---|---|---|---|---|
anli_r1/acc | 0.32 | 0.35 | 0.35 | 0.33 | 0.33 | 0.33 |
anli_r2/acc | 0.34 | 0.34 | 0.36 | 0.36 | 0.32 | 0.33 |
anli_r3/acc | 0.35 | 0.37 | 0.39 | 0.38 | 0.35 | 0.40 |
arc_challenge/acc | 0.34 | 0.39 | 0.44 | 0.37 | 0.34 | 0.41 |
arc_challenge/acc_norm | 0.37 | 0.41 | 0.44 | 0.38 | 0.37 | 0.44 |
arc_easy/acc | 0.67 | 0.68 | 0.75 | 0.72 | 0.69 | 0.75 |
arc_easy/acc_norm | 0.62 | 0.52 | 0.59 | 0.68 | 0.65 | 0.70 |
boolq/acc | 0.66 | 0.75 | 0.71 | 0.71 | 0.68 | 0.75 |
hellaswag/acc | 0.50 | 0.56 | 0.59 | 0.53 | 0.49 | 0.56 |
hellaswag/acc_norm | 0.66 | 0.73 | 0.76 | 0.72 | 0.67 | 0.76 |
openbookqa/acc | 0.29 | 0.29 | 0.31 | 0.30 | 0.27 | 0.31 |
openbookqa/acc_norm | 0.38 | 0.41 | 0.42 | 0.40 | 0.40 | 0.43 |
piqa/acc | 0.75 | 0.78 | 0.79 | 0.76 | 0.75 | 0.77 |
piqa/acc_norm | 0.76 | 0.78 | 0.79 | 0.77 | 0.76 | 0.79 |
record/em | 0.88 | 0.91 | 0.92 | 0.89 | 0.88 | 0.91 |
record/f1 | 0.89 | 0.91 | 0.92 | 0.90 | 0.89 | 0.91 |
rte/acc | 0.54 | 0.56 | 0.69 | 0.60 | 0.58 | 0.64 |
truthfulqa_mc/mc1 | 0.20 | 0.21 | 0.25 | 0.23 | 0.22 | 0.25 |
truthfulqa_mc/mc2 | 0.36 | 0.34 | 0.40 | 0.35 | 0.35 | 0.38 |
wic/acc | 0.50 | 0.50 | 0.50 | 0.51 | 0.48 | 0.47 |
winogrande/acc | 0.64 | 0.68 | 0.70 | 0.67 | 0.62 | 0.70 |
平均 | 0.52 | 0.55 | 0.57 | 0.55 | 0.53 | 0.57 |
從基準測試中移除了CB和WSC任務,因為模型在這兩個任務上的表現異常出色,推測訓練集中可能存在基準數據汙染的問題。
聯繫我們
歡迎社區提供反饋。如有任何問題,請提交issue或與我們聯繫。
OpenLLaMA由來自伯克利人工智能研究中心的Xinyang Geng* 和 Hao Liu* 開發。貢獻相同
致謝
感謝Google TPU Research Cloud項目提供部分計算資源。特別感謝TPU Research Cloud的Jonathan Caton幫助組織計算資源,感謝Google Cloud團隊的Rafi Witten和Google JAX團隊的James Bradbury幫助優化訓練吞吐量。也感謝Charlie Snell、Gautier Izacard、Eric Wallace、Lianmin Zheng和用戶社區的討論和反饋。
OpenLLaMA 13B模型是與Stability AI合作訓練的,感謝Stability AI提供計算資源。特別感謝David Ha和Shivanshu Purohit協調後勤工作並提供工程支持。
引用
如果在研究或應用中使用了OpenLLaMA,請使用以下BibTeX進行引用:
@software{openlm2023openllama,
author = {Geng, Xinyang and Liu, Hao},
title = {OpenLLaMA: An Open Reproduction of LLaMA},
month = May,
year = 2023,
url = {https://github.com/openlm-research/open_llama}
}
@software{together2023redpajama,
author = {Together Computer},
title = {RedPajama-Data: An Open Source Recipe to Reproduce LLaMA training dataset},
month = April,
year = 2023,
url = {https://github.com/togethercomputer/RedPajama-Data}
}
@article{touvron2023llama,
title={Llama: Open and efficient foundation language models},
author={Touvron, Hugo and Lavril, Thibaut and Izacard, Gautier and Martinet, Xavier and Lachaux, Marie-Anne and Lacroix, Timoth{\'e}e and Rozi{\`e}re, Baptiste and Goyal, Naman and Hambro, Eric and Azhar, Faisal and others},
journal={arXiv preprint arXiv:2302.13971},
year={2023}
}
🔧 技術細節
本項目遵循與原始LLaMA論文相同的模型架構、上下文長度、訓練步數、學習率調度和優化器,僅在數據集上有所不同。使用基於JAX的訓練管道EasyLM在雲TPU-v4上進行訓練,採用普通數據並行和完全分片數據並行相結合的方式平衡訓練吞吐量和內存使用。
📄 許可證
本項目採用Apache 2.0許可協議。



