モデル概要
モデル特徴
モデル能力
使用事例
🚀 OpenLLaMA: LLaMAのオープンな再現版
このリポジトリでは、Meta AIのLLaMA大規模言語モデルのオープンソースな再現版を公開しています。1兆トークンで学習させた70億パラメータと30億パラメータのモデル、および6000億トークンで学習させた130億パラメータのモデルのプレビューをリリースしています。事前学習済みのOpenLLaMAモデルのPyTorchとJAXの重み、評価結果、およびオリジナルのLLaMAモデルとの比較を提供しています。詳細については、OpenLLaMAのプロジェクトホームページを参照してください。
🚀 クイックスタート
このセクションでは、OpenLLaMAの重みのリリース、ライセンス、使用方法、データセットと学習、評価などの基本的な情報を説明します。
✨ 主な機能
- Meta AIのLLaMAモデルのオープンソースな再現版を提供
- 7B、3B、13Bのモデルを公開
- PyTorchとJAXの重みを提供
- 評価結果とオリジナルのLLaMAモデルとの比較を提供
📦 インストール
重みのリリース、ライセンスと使用方法
重みは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
オプションを渡すことで実現できます。使用例を以下に示します。
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)を使用しているため、少数ショット評価時にはこのトークンを先頭に付けると最良のパフォーマンスが得られます。
💻 使用例
基本的な使用法
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]))
高度な使用法
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
)
📚 ドキュメント
データセットと学習
モデルは、Togetherによって公開されたRedPajamaデータセットで学習されています。これは、1.2兆トークン以上を含むLLaMA学習データセットの再現版です。オリジナルのLLaMA論文とまったく同じ前処理手順と学習ハイパーパラメータを使用しています。モデルアーキテクチャ、コンテキスト長、学習ステップ、学習率スケジュール、オプティマイザーなどです。設定とオリジナルの設定の唯一の違いは、使用するデータセットです。OpenLLaMAはRedPajamaデータセットを使用しており、オリジナルのLLaMAが使用していたデータセットではありません。
モデルは、大規模言語モデルの学習と微調整に開発したJAXベースの学習パイプラインであるEasyLMを使用して、クラウドのTPU-v4上で学習されています。通常のデータ並列化と完全分割型データ並列化(ZeROステージ3とも呼ばれる)を組み合わせて、学習スループットとメモリ使用量のバランスを取っています。全体として、7BモデルではTPU-v4チップあたり秒あたり2200トークン以上のスループットを達成しています。
評価
lm-evaluation-harnessを使用して、幅広いタスクでOpenLLaMAを評価しました。LLaMAの結果は、同じ評価指標でオリジナルのLLaMAモデルを実行することで生成されています。LLaMAモデルの結果は、オリジナルのLLaMA論文とわずかに異なっています。これは、異なる評価プロトコルの結果であると考えています。同様の違いが、lm-evaluation-harnessのこの問題で報告されています。また、EleutherAIによってPileデータセットで学習された60億パラメータのモデルである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つのタスクでモデルのパフォーマンスが疑わしいほど良いためです。学習セットにベンチマークデータの汚染がある可能性があると推測しています。
🔧 技術詳細
本プロジェクトでは、大規模言語モデルの学習と微調整にJAXベースの学習パイプラインであるEasyLMを使用しています。通常のデータ並列化と完全分割型データ並列化(ZeROステージ3)を組み合わせて、学習スループットとメモリ使用量のバランスを取っています。7BモデルではTPU-v4チップあたり秒あたり2200トークン以上のスループットを達成しています。
📄 ライセンス
学習フレームワークEasyLMとチェックポイントの重みは、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}
}



