模型概述
模型特點
模型能力
使用案例
🚀 OpenLLaMA:LLaMA的開源復刻版本
OpenLLaMA是Meta AI的LLaMA大語言模型的開源復刻版本,採用寬鬆的開源許可協議。本項目發佈了一系列在不同數據混合集上訓練的3B、7B和13B模型,模型權重可直接替換現有實現中的LLaMA權重。
🚀 快速開始
本項目以兩種格式發佈模型權重:一種是適用於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
## v2模型
model_path = 'openlm-research/open_llama_3b_v2'
# model_path = 'openlm-research/open_llama_7b_v2'
## v1模型
# 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]))
更多高級用法,請參考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的分詞器和權重。
✨ 主要特性
- 開源復刻:OpenLLaMA是Meta AI的LLaMA大語言模型的開源復刻版本,採用寬鬆的開源許可協議。
- 多模型版本:發佈了一系列在不同數據混合集上訓練的3B、7B和13B模型。
- 多種加載方式:支持以EasyLM格式和PyTorch格式加載模型權重,分別適用於EasyLM框架和Hugging Face transformers庫。
- 性能可比:在大多數任務上,OpenLLaMA的性能與原始LLaMA和GPT - J相當,在某些任務上表現更優。
📦 安裝指南
文檔中未提及具體安裝步驟,可參考上述快速開始部分關於模型權重加載的內容。
💻 使用示例
基礎用法
import torch
from transformers import LlamaTokenizer, LlamaForCausalLM
## v2模型
model_path = 'openlm-research/open_llama_3b_v2'
# model_path = 'openlm-research/open_llama_7b_v2'
## v1模型
# 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]))
高級用法
更多高級用法,請參考transformers LLaMA文檔。
📚 詳細文檔
數據集與訓練
- 數據集:v1模型在RedPajama數據集上訓練。v2模型在Falcon refined - web數據集、StarCoder數據集以及RedPajama數據集中的維基百科、arxiv、書籍和stackexchange部分的混合數據上訓練。
- 訓練設置:遵循與原始LLaMA論文完全相同的預處理步驟和訓練超參數,包括模型架構、上下文長度、訓練步驟、學習率調度和優化器。與原始設置的唯一區別是使用的數據集:OpenLLaMA採用開放數據集,而非原始LLaMA使用的數據集。
- 訓練平臺:使用基於JAX的訓練管道EasyLM在雲TPU - v4上訓練模型。採用普通數據並行和完全分片數據並行(,也稱為ZeRO stage 3)相結合的方式,以平衡訓練吞吐量和內存使用。7B模型在每個TPU - v4芯片上的吞吐量超過2200個令牌/秒。
評估
使用lm - evaluation - harness在廣泛的任務上對OpenLLaMA進行評估。LLaMA的結果是通過在相同評估指標上運行原始LLaMA模型生成的。注意到本項目中LLaMA模型的結果與原始LLaMA論文略有不同,認為這是由於不同的評估協議導致的。lm - evaluation - harness的這個問題中也報告了類似的差異。此外,還展示了GPT - J的結果,它是由EleutherAI在Pile數據集上訓練的一個6B參數模型。
原始LLaMA模型訓練了1萬億個令牌,GPT - J訓練了5000億個令牌。評估結果如下表所示:
任務/指標 | GPT - J 6B | LLaMA 7B | LLaMA 13B | OpenLLaMA 3Bv2 | OpenLLaMA 7Bv2 | OpenLLaMA 3B | OpenLLaMA 7B | OpenLLaMA 13B |
---|---|---|---|---|---|---|---|---|
anli_r1/acc | 0.32 | 0.35 | 0.35 | 0.33 | 0.34 | 0.33 | 0.33 | 0.33 |
anli_r2/acc | 0.34 | 0.34 | 0.36 | 0.36 | 0.35 | 0.32 | 0.36 | 0.33 |
anli_r3/acc | 0.35 | 0.37 | 0.39 | 0.38 | 0.39 | 0.35 | 0.38 | 0.40 |
arc_challenge/acc | 0.34 | 0.39 | 0.44 | 0.34 | 0.39 | 0.34 | 0.37 | 0.41 |
arc_challenge/acc_norm | 0.37 | 0.41 | 0.44 | 0.36 | 0.41 | 0.37 | 0.38 | 0.44 |
arc_easy/acc | 0.67 | 0.68 | 0.75 | 0.68 | 0.73 | 0.69 | 0.72 | 0.75 |
arc_easy/acc_norm | 0.62 | 0.52 | 0.59 | 0.63 | 0.70 | 0.65 | 0.68 | 0.70 |
boolq/acc | 0.66 | 0.75 | 0.71 | 0.66 | 0.72 | 0.68 | 0.71 | 0.75 |
hellaswag/acc | 0.50 | 0.56 | 0.59 | 0.52 | 0.56 | 0.49 | 0.53 | 0.56 |
hellaswag/acc_norm | 0.66 | 0.73 | 0.76 | 0.70 | 0.75 | 0.67 | 0.72 | 0.76 |
openbookqa/acc | 0.29 | 0.29 | 0.31 | 0.26 | 0.30 | 0.27 | 0.30 | 0.31 |
openbookqa/acc_norm | 0.38 | 0.41 | 0.42 | 0.38 | 0.41 | 0.40 | 0.40 | 0.43 |
piqa/acc | 0.75 | 0.78 | 0.79 | 0.77 | 0.79 | 0.75 | 0.76 | 0.77 |
piqa/acc_norm | 0.76 | 0.78 | 0.79 | 0.78 | 0.80 | 0.76 | 0.77 | 0.79 |
record/em | 0.88 | 0.91 | 0.92 | 0.87 | 0.89 | 0.88 | 0.89 | 0.91 |
record/f1 | 0.89 | 0.91 | 0.92 | 0.88 | 0.89 | 0.89 | 0.90 | 0.91 |
rte/acc | 0.54 | 0.56 | 0.69 | 0.55 | 0.57 | 0.58 | 0.60 | 0.64 |
truthfulqa_mc/mc1 | 0.20 | 0.21 | 0.25 | 0.22 | 0.23 | 0.22 | 0.23 | 0.25 |
truthfulqa_mc/mc2 | 0.36 | 0.34 | 0.40 | 0.35 | 0.35 | 0.35 | 0.35 | 0.38 |
wic/acc | 0.50 | 0.50 | 0.50 | 0.50 | 0.50 | 0.48 | 0.51 | 0.47 |
winogrande/acc | 0.64 | 0.68 | 0.70 | 0.63 | 0.66 | 0.62 | 0.67 | 0.70 |
平均 | 0.52 | 0.55 | 0.57 | 0.53 | 0.56 | 0.53 | 0.55 | 0.57 |
從表中可以看出,OpenLLaMA在大多數任務上的性能與原始LLaMA和GPT - J相當,在某些任務上表現更優。同時,從評估中移除了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 v1模型是與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}
}
🔧 技術細節
- 數據集:使用了多個開源數據集,包括RedPajama、Falcon refined - web、StarCoder等,與原始LLaMA使用的數據集不同,但在訓練步驟和超參數設置上保持一致,確保模型架構和訓練過程的可比性。
- 訓練框架:基於JAX開發的EasyLM訓練管道,結合了普通數據並行和完全分片數據並行(ZeRO stage 3)技術,有效平衡了訓練吞吐量和內存使用,提高了訓練效率。
- 評估協議:使用lm - evaluation - harness進行評估,雖然評估結果與原始LLaMA論文略有差異,但這是由於評估協議不同導致的,在開源社區中類似差異也有報告。
📄 許可證
本項目遵循Apache 2.0許可協議。



