概要
LLMかいわいは、毎月、毎週のように目を引くアップデートがありますね。
今日は、2023年GW中に登場した 商用利用 もできそうな LLaMA 互換言語モデル open_llama_7b_preview_300bt を味見してみました。
最近の LLaMA モデルのめぐる経緯
Meta 社がリリースした強力な LLM(大規模言語モデル) である LLaMA は一大ブームを引き起こしています。
Alpaca や Vicuna といったラマ🦙の近縁種の名前がついたモデルたちも人気がありますね。
ここでポイントですが、LLaMA のトレーニングデータや学習済の重みデータは 学術目的の利用に限られて いました
こうした中、最近、トレーニングデータや学習済の重みデータのライセンスをオープンにしようという流れが起こりつつあります。
(20年前のオープンソース論争のように、オープンにすることのベネフィットとリスクが AI の世界でも活発に議論されはじめています。大事なことだとおもいます)
さて、オープンソース化を進める動きとして、まず2023年4月に LLaMA のトレーニングデータのオープンソース版として 颯爽と登場したのが Together の RedPajama というデータセットです。このデータセットは LLaMA のトレーニングデータセット相当を目指しており、ライセンスは Apache 2.0 となっています。
さらに、つい先日の 2023年5月3日に、この RedPajama データセットをつかって学習をした学習済重みデータが open_llama_7b_preview_300bt が公開されました。この学習済重みデータのライセンスも Apache 2.0 です。
つまり、論理的には、この学習済データを使えば、 LLaMA ベースの言語モデルが商用利用できる ということになりそうです。
さっそく試してみました。
open_llama_7b_preview_300bt とは
- RedPajama の 3000億トークンでトレーニングされた 70億パラメータのモデル(チェックポイント)
- まだプレビュー段階だそう
- 先行して 2000億トークンのモデルもリリースされている。こちらは、入力トークンに BOS を付加しないと結果がイマイチらしい。3000億トークンは BOS 入れなくてもいい感じなので、そっちがオススメとのこと。
お試し手順
試した環境
- OS: Ubuntu 20.04
- CUDA: 11.7
- GPU: RTX 3090
(遅いけどCPUでも動作します)
パッケージのインストール
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu117
pip install accelerate transformers
pip install SentencePiece
ソースコード
お試し用に作ったソースコードは以下となります。
git clone https://github.com/riversun/open_llama_7b_hands_on.git
python main.py
一般的な HuggingFace Transformer をつかった LLM 処理のソースコードですが、いくつかハマったポイントがあったので、ハマった部分を中心に説明していきます。
試したときの様子
こんな感じで動きました
- 文章生成は動作している模様
- かなり軽快に動作する
いろいろハマったところ
ポイントその1 HuggingFace 用の Transformer モデルが一段深いところにある
モデルはHuggingFace のココ→ https://huggingface.co/openlm-research/open_llama_7b_preview_300bt にあるので、モデル名を軽いノリで "openlm-research/open_llama_7b_preview_300bt" と指定するとうまくいかない。
model_name="openlm-research/open_llama_7b_preview_300bt"
tokenizer = LlamaTokenizer.from_pretrained(model_name, add_eos_token=True)
model = LlamaForCausalLM.from_pretrained(
model_name, low_cpu_mem_usage=True, **kwargs
)
上記のようにやってもうまくいかないので、いったんローカルに落としてから使うことにした
git clone https://huggingface.co/openlm-research/open_llama_7b_preview_300bt
model_path ="/home/user/sandbox/open_llama_7b_preview_300bt/open_llama_7b_preview_300bt_transformers_weights"
tokenizer = LlamaTokenizer.from_pretrained(model_path, add_eos_token=True)
model = LlamaForCausalLM.from_pretrained(
model_path, low_cpu_mem_usage=True, **kwargs
)
ポイントその2 LLaMa 用のモデルローダー、トークナイザーを使おう
モデルのロード、トークナイザは Llama 用のもの(LlamaTokenizer,LlamaForCausalLM)を使うのが吉
ポイントその3 BOS と EOS を正しくセットしよう
BOS = Begin Of Sentence、 EOS = End Of Sentence のトークンIDを手動セットする。
EOS で文章生成を停止させようとしていたが、生成トークン数を増やしても、ダラダラと文章を生成しつづけるので、どうしてかなーとおもったら tokenizer.bos_token_id
と tokenizer.eos_token_id
がセットされていなかった。(というか、0にセットされていた)
LLaMa のお作法にあわせて、 tokenizer.bos_token_id=1 tokenizer.eos_token_id=2
とした。
ポイントその4 open_llama_7b_preview_200bt は入力トークンの先頭 BOS を忘れずに
open_llama_7b_preview_200bt
を使うときは、入力トークン列の先頭にBOSトークンをはさむと、いい感じになる。
input_ids = [tokenizer.bos_token_id] + tokenizer(prompt).input_ids
ポイントその5 tokenizer.eos_token_id=2 とすると生成結果があやしくなる
ポイントその3で説明したばかりだが、 tokenizer.eos_token_id=2
のように強制セットするのはダメかもしれない。停止条件として EOS トークンを使いたいだけなら、生成中に 生成された トークンID が EOSかを判定するだけで十分
stop_token_ids=[2]
# 中略
if token_id in stop_token_ids:
stopped = True
else:
stopped = False
ポイントその6 単純な入力プロンプトだと、同じようなセンテンスを生成しつづける
これはこのモデルに限ったことじゃないが、それを抑制するために、
トップKサンプリングを導入した。上位K位のトークンを選択し、その中からランダムに1つを選ぶ。
このほうがいい感じの生成結果につながった。
以下のトップKの関数は ChatGPT に作ってもらった :)
def top_k_sampling(logits, k=top_k_value):
top_k = torch.topk(logits, k)
top_k_indices = top_k.indices
top_k_values = top_k.values
probabilities = torch.softmax(top_k_values, dim=-1)
choice = torch.multinomial(probabilities, num_samples=1)
token_id = int(top_k_indices[choice])
return token_id
まだ、ハマってるところ
今回ためしたのは、いわゆる text continuation (与えられたテキストの続きを生成する) だったが、今まだうまくいっていないのが、二者間のチャット。USER と ASSISTANT にわかれてチャットをするような ChatGPT 的な機能。
LLama で実績のある初期プロンプト を食わせると、コンテクストも維持しつつなんとなく6割くらい動いているが、途中からズレてくる。ヒューリスティックにトークナイズする手もあるけど、もうすこし要スタディ。
まとめ
-
リリースされたばかりの open_llama_7b_preview_300bt をお試しして、ファーストルックをご紹介しました。
- いくつかハマりポイントはあったものの、一応うごくというレベルまでお試ししました。
- ChatGPTのような二者間チャットは、まだ道半ばな感じなので初期プロンプトの与え方やトークナイズをスタディしていきたいとおもいます。
-
ちなみに、 RedPajama リリース元の Together 自身もRedPajamaデータセットをトレーニング中だそうですが、まだ 2023/05/05 時点で、学習済の重みはリリースされていません。データセットが公開されたら本家よりも先にちらほら 学習済モデルがリリースされるあたり、本当に、この分野は活発ですね。
-
先日 Dolly V2 をお試し しましたが、 Dolly V2 も商用無料なオープンソースとしてかなり話題となりました。今後、制約の緩いオープンソース系LLMが席巻するのか、あくまで最先端のものは Gated なリリースが続くのかどちらの流れになっていくのか注目しています。