rinna.cpp を試す
「rinna.cpp」を試したのでまとめました。
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>システム:"
同様にいくつか質問してみます。
$ ./redpajama -m ./examples/redpajama/models/rinna/ggml-japanese-gpt-neox-3.6b-instruction-ppo-f16.bin -t 10 --repeat_penalty 1.1 -p "ユーザー:日本の首都は?<NL>システム:"
$ ./redpajama -m ./examples/redpajama/models/rinna/ggml-japanese-gpt-neox-3.6b-instruction-ppo-f16.bin -t 10 --repeat_penalty 1.1 -p "ユーザー:富士山の高さは?<NL>システム:"
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