模型简介
模型特点
模型能力
使用案例
🚀 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许可协议。



