模型概述
模型特點
模型能力
使用案例
🚀 OpenLLaMA:LLaMA的開源復刻版本
OpenLLaMA是對Meta AI的LLaMA大語言模型的開源復刻,遵循寬鬆的開源許可協議。本項目發佈了基於1萬億token訓練的70億和30億參數模型,以及基於6000億token訓練的130億參數模型預覽版。同時提供了預訓練的OpenLLaMA模型的PyTorch和JAX權重,以及評估結果,並與原始的LLaMA模型進行了對比。更多詳細信息請見OpenLLaMA項目主頁。
🚀 快速開始
本項目將權重以兩種格式發佈:一種是可與EasyLM框架配合使用的EasyLM格式,另一種是可與Hugging Face transformers庫配合使用的PyTorch格式。訓練框架EasyLM和檢查點權重均遵循寬鬆的Apache 2.0許可協議。
用Hugging Face Transformers加載權重
預覽檢查點可以直接從Hugging Face Hub加載。請注意,目前建議避免使用Hugging Face的快速分詞器,因為我們發現自動轉換的快速分詞器有時會產生錯誤的分詞結果。可以通過直接使用LlamaTokenizer
類,或為AutoTokenizer
類傳入use_fast=False
選項來解決這個問題。使用示例如下:
import torch
from transformers import LlamaTokenizer, LlamaForCausalLM
model_path = 'openlm-research/open_llama_3b'
# model_path = 'openlm-research/open_llama_7b'
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]))
更多高級用法請參考transformers LLaMA文檔。
用lm-eval-harness進行評估
可以使用lm-eval-harness對模型進行評估。但是,由於上述分詞器問題,需要避免使用快速分詞器以獲得正確的結果。可以通過在lm-eval-harness的這部分代碼中傳入use_fast=False
來實現,示例如下:
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框架中使用這些權重,請參考EasyLM的LLaMA文檔。與原始的LLaMA模型不同,OpenLLaMA的分詞器和權重是完全從頭開始訓練的,因此無需獲取原始的LLaMA分詞器和權重。需要注意的是,在訓練過程中使用了BOS(句子開始)標記(id=1),因此在少樣本評估時,最好在輸入前添加此標記以獲得最佳性能。
✨ 主要特性
- 開源復刻:對Meta AI的LLaMA模型進行開源復刻,遵循寬鬆的開源許可協議。
- 多參數模型:發佈了70億、30億參數模型,以及130億參數模型預覽版。
- 多格式權重:提供PyTorch和JAX兩種格式的預訓練模型權重。
- 評估對比:提供評估結果,並與原始LLaMA模型和GPT - J進行對比。
📦 安裝指南
文檔未提及具體安裝步驟,故跳過該章節。
💻 使用示例
基礎用法
import torch
from transformers import LlamaTokenizer, LlamaForCausalLM
model_path = 'openlm-research/open_llama_3b'
# model_path = 'openlm-research/open_llama_7b'
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]))
高級用法
更多高級用法請參考transformers LLaMA文檔。
📚 詳細文檔
數據集與訓練
模型在RedPajama數據集上進行訓練,該數據集由Together發佈,是對LLaMA訓練數據集的復刻,包含超過12萬億個token。訓練過程遵循與原始LLaMA論文完全相同的預處理步驟和訓練超參數,包括模型架構、上下文長度、訓練步數、學習率調度和優化器。與原始設置的唯一區別在於使用的數據集:OpenLLaMA採用RedPajama數據集,而非原始LLaMA使用的數據集。
使用基於JAX的訓練管道EasyLM在雲TPU - v4上訓練模型。採用普通數據並行和完全分片數據並行(也稱為ZeRO stage 3)相結合的方式,以平衡訓練吞吐量和內存使用。對於70億參數模型,整體吞吐量達到每個TPU - v4芯片每秒超過2200個token。
評估
使用lm-eval-harness在廣泛的任務上對OpenLLaMA進行評估。LLaMA的結果是通過在相同評估指標上運行原始LLaMA模型得到的。注意到LLaMA模型的評估結果與原始LLaMA論文略有不同,認為這是由於評估協議不同導致的。類似的差異也在lm-eval-harness的這個問題中有所報道。此外,還展示了GPT - J的評估結果,它是由EleutherAI在Pile數據集上訓練的60億參數模型。
原始LLaMA模型訓練了1萬億個token,GPT - J訓練了5000億個token。評估結果如下表所示。OpenLLaMA在大多數任務上表現出與原始LLaMA和GPT - J相當的性能,並且在某些任務上表現更優。
任務/指標 | GPT - J 6B | LLaMA 7B | OpenLLaMA 7B | OpenLLaMA 3B | OpenLLaMA 13B 600BT |
---|---|---|---|---|---|
anli_r1/acc | 0.32 | 0.35 | 0.33 | 0.33 | 0.33 |
anli_r2/acc | 0.34 | 0.34 | 0.36 | 0.32 | 0.35 |
anli_r3/acc | 0.35 | 0.37 | 0.38 | 0.35 | 0.38 |
arc_challenge/acc | 0.34 | 0.39 | 0.37 | 0.34 | 0.39 |
arc_challenge/acc_norm | 0.37 | 0.41 | 0.38 | 0.37 | 0.42 |
arc_easy/acc | 0.67 | 0.68 | 0.72 | 0.69 | 0.74 |
arc_easy/acc_norm | 0.62 | 0.52 | 0.68 | 0.65 | 0.70 |
ddboolq/acc | 0.50 | 0.56 | 0.53 | 0.49 | 0.71 |
hellaswag/acc | 0.36 | 0.36 | 0.63 | 0.43 | 0.54 |
hellaswag/acc_norm | 0.66 | 0.73 | 0.72 | 0.67 | 0.73 |
openbookqa/acc | 0.29 | 0.29 | 0.30 | 0.27 | 0.30 |
openbookqa/acc_norm | 0.38 | 0.41 | 0.40 | 0.40 | 0.41 |
piqa/acc | 0.75 | 0.78 | 0.76 | 0.75 | 0.77 |
piqa/acc_norm | 0.76 | 0.78 | 0.77 | 0.76 | 0.78 |
record/em | 0.88 | 0.91 | 0.89 | 0.88 | 0.90 |
record/f1 | 0.89 | 0.91 | 0.90 | 0.89 | 0.90 |
rte/acc | 0.54 | 0.56 | 0.60 | 0.58 | 0.65 |
truthfulqa_mc/mc1 | 0.20 | 0.21 | 0.23 | 0.22 | 0.22 |
truthfulqa_mc/mc2 | 0.36 | 0.34 | 0.35 | 0.35 | 0.35 |
wic/acc | 0.50 | 0.50 | 0.51 | 0.48 | 0.49 |
winogrande/acc | 0.64 | 0.68 | 0.67 | 0.62 | 0.67 |
平均 | 0.51 | 0.53 | 0.55 | 0.52 | 0.56 |
從基準測試中移除了CB和WSC任務,因為模型在這兩個任務上的表現異常出色。推測訓練集中可能存在基準數據汙染。
🔧 技術細節
訓練框架
使用基於JAX的EasyLM訓練框架,結合普通數據並行和完全分片數據並行(ZeRO stage 3)來平衡訓練吞吐量和內存使用。
數據集
採用RedPajama數據集,該數據集是對LLaMA訓練數據集的復刻,包含超過12萬億個token。
訓練參數
遵循與原始LLaMA論文相同的預處理步驟和訓練超參數,包括模型架構、上下文長度、訓練步數、學習率調度和優化器。
📄 許可證
本項目遵循Apache 2.0許可協議。
👥 聯繫我們
歡迎社區提供反饋。如有任何問題,請提交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}
}



