はじめに
「人が幸せになるように呪う」、nikkieです。
今週公開された日本語LLMを動かしてみた際の備忘録です。
目次
サイバーエージェント発 OpenCALM
このたび一部モデルをHugging Face Hubにて公開いたしました。
公開されたモデルはオープンな日本語データで学習したもので、商用利用可能なCC BY-SA 4.0ライセンスで提供されます。
https://huggingface.co/cyberagent で公開されています(公開ありがとうございます!!)。
- small
- medium
- large
- 1b
- 3b
- 7b
と6種類!
これらはBase LLMという理解です。
ChatGPTやBardはInstruction tuned LLM1で、Base LLMをRLHFして到達すると理解しています。
6種類の中から3b(30億パラメタ)を動かします。
動作環境
M1 MacでCPUで動かしていきます!
% sw_vers ProductName: macOS ProductVersion: 12.6.3 BuildVersion: 21G419
- Python 3.10.9
- transformers 4.29.2
- torch 2.0.1
- accelerate 0.19.0
% pip install transformers torch accelerate
Hugging Face Hubのサンプルコードを動かす
特別なことはほとんどありませんでした。
ただのtransformers
(ライブラリ)でした2。
CPUで動かすコードとして https://huggingface.co/cyberagent/open-calm-3b のUsageのスニペットからの差分を示します。
import torch from transformers import AutoModelForCausalLM, AutoTokenizer -model = AutoModelForCausalLM.from_pretrained("cyberagent/open-calm-3b", device_map="auto", torch_dtype=torch.float16) +model = AutoModelForCausalLM.from_pretrained("cyberagent/open-calm-3b", device_map="auto", torch_dtype=torch.float32) tokenizer = AutoTokenizer.from_pretrained("cyberagent/open-calm-3b") inputs = tokenizer("AIによって私達の暮らしは、", return_tensors="pt").to(model.device) with torch.no_grad(): tokens = model.generate( **inputs, max_new_tokens=64, do_sample=True, temperature=0.7, pad_token_id=tokenizer.pad_token_id, ) output = tokenizer.decode(tokens[0], skip_special_tokens=True) print(output)
おー、CyberAgentさんのモデルの3B、CPUで動いた〜(スペック的にギリギリを攻めた)。
— nikkie にっきー (@ftnext) 2023年5月17日
generateするまでにだいたい30秒、頑張ってる!
「AIによって私達の暮らしは、」の続きを書かせる例を動かしましたhttps://t.co/CkjBZxdgDu
こいつはBase LLMという理解なので、支離滅裂でも動いているからOK pic.twitter.com/Ve78xQDRv7
CPUで動かすには、torch_dtype=torch.float32
を指定する
サンプルコードをそのまま動かしたときに以下のエラーに直面しました。
RuntimeError: "LayerNormKernelImpl" not implemented for 'Half'
解決のヒントは RuntimeError: "LayerNormKernelImpl" not implemented for 'Half' · Issue #21989 · huggingface/transformers · GitHub にありました。
you need to run your model on the GPU as the operations are not all implemented on the CPU in float16. On CPU you can only run models in float32. (こちらのコメントより)
CPUではfloat16
をサポートしていなくて、float32
のみのようです。
Halfとは、float32
に対してfloat16
ということなのですね!3
その他対処したこと
pip install accelerate
ImportError: Using
low_cpu_mem_usage=True
or adevice_map
requires Accelerate:pip install accelerate
- 案内されたのでインストールしました
- (「or」だから前者でもいいかと思ったのですが、解決しなかったのでインストールしています)
- Hugging Face Hubからモデルをダウンロードできない(502)
- ブラウザからモデルをダウンロードして対処しました
- Stable Diffusion web UIの経験が思わぬところで活きました4
from_pretrained
メソッドにはローカルのファイルパスも指定できます(第1引数pretrained_model_name_or_path
5)- https://huggingface.co/cyberagent/open-calm-3b/tree/main
- .gitattributes と README.md を除いた6つをダウンロード
- コミットメッセージから、modelとtokenizerで3つずつファイルを使うのだと思っています
- スクリプトと同じディレクトリに
ca/
ディレクトリを作って6つのファイルを配置AutoModelForCausalLM.from_pretrained("ca/", device_map="auto", torch_dtype=torch.float32)
のようにします
- ブラウザからモデルをダウンロードして対処しました
- ぱっと環境構築だけしたいなら、一番小さい
"cyberagent/open-calm-small"
がオススメ- 一番小さいのでダウンロードがすぐ終わります
- 環境構築できていて、スクリプトも動くかを確認するのに向いてます
- smallで動けば、別のモデル指定に変えても動くと期待できます!
資料メモ
参考資料やこれから参照予定の資料を並べます。
- きしださんのブログにはたびたびお世話になっております
- 3Bを選ぶ助けとなりました
(注:7Bを)CPUで動かすと、読み込み時に最大で34GBくらいのメモリを消費した
- Base LLMは続きを書けるから、「アメリカの首都はワシントン。日本の首都は」と渡しているのか!
- https://pypi.org/project/colorama/ で簡単に見やすくできるのか!
float32
の件も書いてあることに気づきましたRuntimeError: "LayerNormKernelImpl" not implemented for 'Half'
というエラーが出る場合はtorch_dtype=torch.float16
を消す必要があります。- 省略できるってことは引数のデフォルト値ってことですね
今までの日本語モデルからは考えられないほど回答の質が良いので是非結果を見ていただきたいと思います。
- Instruction tune事例
- マシンが揃わないかもしれないけど、どういうコードやデータでやるのか知りたい
- (💡りんな社のモデルも参考になるかも)
モデルを指定して動かすスクリプト(ドラフト版)
見た目など細かいところをアップデートしたいなと思っており、最新は https://github.com/ftnext/practice-dl-nlp/tree/master/llmjp にあります。
終わりに
OpenCALM、日本語LLMだからといって特別なことはなく、ライブラリtransformers
のお作法に従って触るだけでした。
Pythonの経験や、特にtransformers
の経験がある方には、ハードルは高くないんじゃないかと思います。
動きはしたので、embeddings取れるのかやfine tuningの仕方など、気になるところを見ていきたいなと思います。
temperatureがChatGPTとは違うのかも(再現性を確保したかったのですが、0の指定はエラー送出。positive floatとのこと)。
transformersライブラリのドキュメントもちょっと見てみよう
OpenCALM-3Bを召喚したら「こじはる」(?)だった件https://t.co/CkjBZxdOt2
— nikkie にっきー (@ftnext) 2023年5月18日
「こんにちは、私の名前は」の続きを生成してみたnikkie。
現れたのは...
>こんにちは、私の名前は、小嶋陽菜(こじま はるな)です。 pic.twitter.com/XNSK83R5pp
-
DeepLearning.AIの「ChatGPT Prompt Engineering for Developers」を視聴し終えました。LLM時代の見取り図 得たり!勝ったなガハハ! - nikkie-ftnextの日記
↩Ng先生の講座で出たとこだ〜!https://t.co/vqsyWgVx9L
— nikkie にっきー (@ftnext) 2023年5月17日
Base LLMと、それをRLHFしたInstruction-Tuned LLM。
サイバーエージェントさんのは前者(Base)で、後者の例のChatGPTとは少し違う(後者にすることはできる) https://t.co/RBvMsWbEAa - 利用者はモデルごとの差異を意識しなくていいからこそ、この感想に至るわけで、ライブラリがうまく作られていてすごいですよね↩
- Stable Diffusion web UIでも似たようなHalfのエラーを見かけたのですが、どういうことか分かったかも!↩
- モデルをダウンロードして環境構築します。Stable Diffusion web UIの環境構築できあがり! かわいいは作れるぞおおおおおおおおお!!! - nikkie-ftnextの日記↩
- https://huggingface.co/docs/transformers/model_doc/auto#transformers.AutoModelForCausalLM.from_pretrained↩