🚀 OpenLLaMA: LLaMAのオープンな再現版
このリポジトリでは、Meta AIのLLaMA大規模言語モデルを許容的なライセンスの下でオープンソースで再現したものを公開しています。1兆トークンで学習させた7Bと3Bのモデル、および6000億トークンで学習させた13Bモデルのプレビューをリリースしています。事前学習済みのOpenLLaMAモデルのPyTorchとJAXの重み、評価結果、およびオリジナルのLLaMAモデルとの比較も提供しています。詳細については、OpenLLaMAのプロジェクトホームページを参照してください。
🚀 クイックスタート
✨ 主な機能
- オープンソースで許容的なライセンスの下で、Meta AIのLLaMAモデルを再現。
- 7B、3B、13Bのモデルを提供。
- PyTorchとJAXの重み、評価結果、比較を公開。
📦 インストール
本READMEではインストール手順に関する具体的なコマンドが記載されていないため、このセクションは省略します。
💻 使用例
基本的な使用法
import torch
from transformers import LlamaTokenizer, LlamaForCausalLM
model_path = 'openlm-research/open_llama_3b'
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]))
高度な使用法
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
)
📚 ドキュメント
重みのリリース、ライセンス、および使用方法
重みは2つの形式でリリースしています。1つはEasyLMフレームワークで使用するためのEasyLM形式、もう1つは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)を使用しているため、few-shot評価時にはこのトークンを先頭に付けると最適なパフォーマンスが得られます。
データセットと学習
モデルは、TogetherがリリースしたRedPajamaデータセットで学習されています。これは、1.2兆トークン以上を含むLLaMA学習データセットの再現版です。オリジナルのLLaMA論文とまったく同じ前処理手順と学習ハイパーパラメータを使用しています。モデルアーキテクチャ、コンテキスト長、学習ステップ、学習率スケジュール、およびオプティマイザーなどです。設定とオリジナルの唯一の違いは、使用するデータセットです。OpenLLaMAは、オリジナルのLLaMAが使用したデータセットではなく、RedPajamaデータセットを使用しています。
モデルは、クラウドのTPU-v4で、大規模言語モデルの学習と微調整に開発したJAXベースの学習パイプラインであるEasyLMを使用して学習されています。通常のデータ並列化と完全分割データ並列化(ZeROステージ3とも呼ばれる)を組み合わせて、学習スループットとメモリ使用量のバランスを取っています。全体として、7Bモデルでは、TPU-v4チップあたり2200トークン/秒以上のスループットを達成しています。
評価
OpenLLaMAは、lm-eval-harnessを使用して幅広いタスクで評価されています。LLaMAの結果は、同じ評価指標でオリジナルのLLaMAモデルを実行することで生成されています。LLaMAモデルの結果は、オリジナルのLLaMA論文とわずかに異なっています。これは、評価プロトコルが異なるためだと考えています。同様の違いは、lm-eval-harnessのこの問題で報告されています。また、EleutherAIによってPileデータセットで学習された6BパラメータのモデルであるGPT-Jの結果も提示しています。
オリジナルのLLaMAモデルは1兆トークンで学習され、GPT-Jは5000億トークンで学習されています。結果は以下の表に示しています。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を削除しました。これらの2つのタスクでモデルが疑わしいほど良好なパフォーマンスを示したためです。学習セットにベンチマークデータの汚染がある可能性があると仮説を立てています。
🔧 技術詳細
本READMEでは具体的な技術説明が50文字以上記載されていないため、このセクションは省略します。
📄 ライセンス
本プロジェクトは、Apache 2.0ライセンスの下で公開されています。
コンタクト
コミュニティからのフィードバックを歓迎しています。質問がある場合は、issueを開くか、お問い合わせください。
OpenLLaMAは、Berkeley AI Researchの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}
}