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



