
rinna.cpp を試す
「rinna.cpp」を試したのでまとめました。
・rinna/japanese-gpt-neox-3.6b-instruction-ppo
・macOS 13.4.1
【追加情報】「redpajama.cpp」はメンテされてないので、今後は @syoyo さん版使うのが良さそうです。
redpajama.cpp はなんかもうメンテされていないから, rinna を llama.cpp で動かす時はこちらの fork を使うといいよ☺️
— syoyo.eth 🌸 レイトラ ® 🐯 5 周年 🎉 (@syoyo) July 14, 2023
(近日中に japanese-normalizer-cpp 取り込んで日本語正規化対応する!) https://t.co/M6LK0OZlm8https://t.co/ZAfp7YJjXr
1. rinna.cpp
「rinna.cpp」は、「llama.cpp」の「Rinna」対応版です。macのCPUでも高速推論が可能です。「llama.cpp」の「Redpajama」対応版である「redpajama.cpp」をベース作成します。RinnaとRedpajamaは同じGPT-NeoXベースのモデルになります。
2. rinna.cppの実行
「rinna.cpp」の実行手順は、次のとおりです。
(1) Pythonの仮想環境の準備。
(2) 「redpajama.cpp」パッケージのクローン。
$ git clone https://github.com/togethercomputer/redpajama.cpp.git
$ cd redpajama.cpp
(3) 「./examples/redpajama/gptneox.cpp」を以下のように編集。
BOSとEOSのトークンIDを変更しています。
gptneox_token gptneox_token_bos() {
return 0;
}
gptneox_token gptneox_token_eos() {
return 0;
}
↓
gptneox_token gptneox_token_bos() {
return 2;
}
gptneox_token gptneox_token_eos() {
return 3;
}
(4) 「./examples/redpajama/gptneox.h」を以下のように編集。
NLの関数のコメントアウトを解除しています。
// GPTNEOX_API gptneox_token gptneox_token_nl();
↓
GPTNEOX_API gptneox_token gptneox_token_nl();
これを行わないと、「libllama.so」ビルド時にエラーになりました。
(5) ビルド。
$ make redpajama
(6) Pythonの仮想環境を準備して以下のパッケージをインストール。
macOS以外のPyTorchのインストールコマンドは公式サイトを参照。
$ pip install torch torchvision torchaudio
$ pip install transformers sentencepiece protobuf==3.20
(7) 「rinna.cpp」に変換。
「./examples/redpajama/models/rinna/ggml-japanese-gpt-neox-3.6b-instruction-ppo-f16.bin」が生成されます。
$ python ./convert_gptneox_to_ggml.py 'rinna/japanese-gpt-neox-3.6b-instruction-ppo' ../models/rinna
これを量子化することも可能ですが、精度がさがるのでfp16までとします。
(8) 質問応答。
./redpajama -m ./examples/redpajama/models/rinna/ggml-japanese-gpt-neox-3.6b-instruction-ppo-f16.bin -t 10 --repeat_penalty 1.1 -p "ユーザー:まどか☆マギカで誰が一番かわいい?<NL>システム:"
ユーザー:まどか☆マギカで誰が一番かわいい?<NL>システム:キュゥべえです。可愛くてとても良いキャラクターで、彼の言葉や行動にとても共感できます。彼はとても賢く、多くのことを学ぶことができます。また、非常に魅力的な存在です。マギアレコードでは、彼女はまどかと協力して世界の様々な謎を解決しようとしています。彼女と協力することで、マギカの世界がより平和になることを願っています。キュゥべえはとても素晴らしいキャラクターで、多くの人に愛されています。彼の活躍に期待しています。</s> [end of text]
同様にいくつか質問してみます。
$ ./redpajama -m ./examples/redpajama/models/rinna/ggml-japanese-gpt-neox-3.6b-instruction-ppo-f16.bin -t 10 --repeat_penalty 1.1 -p "ユーザー:日本の首都は?<NL>システム:"
ユーザー:日本の首都は?<NL>システム:東京です。日本の首都には、国会、最高裁判所、政府機関が置かれています。</s> [end of text]
$ ./redpajama -m ./examples/redpajama/models/rinna/ggml-japanese-gpt-neox-3.6b-instruction-ppo-f16.bin -t 10 --repeat_penalty 1.1 -p "ユーザー:富士山の高さは?<NL>システム:"
ユーザー:富士山の高さは?<NL>システム:3776メートルです。</s> [end of text]
3. llama-cpp-pythonのrinna対応
「rinna.cpp」をPythonで実行できるように、「llama-cpp-python」を「rinna」(GPT-NeoX系モデル)に対応させます。「llama-cpp-python」は、llama.cppをPythonで実行するパッケージになります。
(1) 「redpajama.cpp」の「Makefile」を以下のように編集。
「libllama.so」に「gptneox.o」と「common-gptneox.o」を追加しています。
libllama.so: llama.o ggml.o $(OBJS)
↓
libllama.so: llama.o ggml.o gptneox.o common-gptneox.o $(OBJS)
(2) ビルド。
GPT-NoeXのコードが含まれている「libllama.so」ができました。
$ make libllama.so
(3) 「llama-cpp-python」のインストール。
$ pip install llama-cpp-python==0.1.40
(4) Pythonパッケージの保存場所を確認。
「sys.path」で確認できます。自分の環境では「./env/lib/python3.10/site-packages」でした。
$ python
>>> import sys
>>> sys.path
['', ..., '/path/to/env/lib/python3.10/site-packages']
(5) Pythonパッケージの保存場所の「llama_cpp/llama_cpp.py」内のすべての「_lib.llama」を「_lib.gptneox」に置換。
(6) Pythonパッケージの保存場所の「llama_cpp」内の「libllama.so」に「redpajama.cpp」内の「libllama.so」を上書き。
4. LangChainでの実行
(1) langchainパッケージのインストール。
$ pip instal langchain
(2) 以下のコードを実行。
・hello_langchain.py
from langchain.llms import LlamaCpp
# LLMの準備
llm = LlamaCpp(
model_path="./examples/redpajama/models/rinna/ggml-japanese-gpt-neox-3.6b-instruction-ppo-f16.bin",
max_tokens=64,
min_tokens=64,
top_k=10,
repeat_penalty=1.1,
stop=["</s>"],
f16_kv=True,
verbose=True,
)
# 質問応答
print(llm("ユーザー:まどか☆マギカで誰が一番かわいい?<NL>システム:"))
$ python hello_langchain.py
うーん、個人的には鹿目まどかが一番好きです。彼女はとても優しい性格で、友達思いなところがあります。また、強い意志を持ち、自分の信念を貫く強さもあります。彼女はとても美しいと思います。