OpenAI互換APIも使えるllama-cpp-python

OpenAIのAPIは有料なので気軽に使うにはちょっと厳しいので、気軽に使う方法がないかなと言うときに良さそうなのが、llama-cpp-pythonというのがあります。Llama2とか、いい感じのものも増えてきていますし、これと合わせて使うと、気軽に試したりすることができます。

llama.cppで、量子化してたりして、利用する環境に合わせたサイズのモデルを事前に準備しておくと良いです。事前に準備しておいたら、llama-cpp-pythonは

pip install llama-cpp-python

でインストールすることができます。GPU環境とかであれば、ドキュメントを参考にして、cuBlasなどを有効にして、インストールしてください。

あとは、

python3 -m llama_cpp.server --model models/7B/ggml-model.bin

みたいな感じで、モデルを指定すれば起動できます。–portとか、オプションもいろいろとあるので、指定すれば、一部の層をGPUに置いたりとか、できたりで便利です。

OpenAIのライブラリ経由とかで使う場合は、OPENAI_API_BASE環境変数とかで、http://localhost:8000/v1とか指定すれば、差し替えて使えることもできると思います。

補足:llama.cppにもserverコマンドでAPI化できるのですが、これはllama-cpp-pythonほど、実装されていなかったので、まだ使えなかった…。

Fess 14.10.0のリリース

Fess 14.10.0をリリースしました。Fessとしては、特に大きな変更はないのですが、OpenSearch 2.9でmapping char filterが辞書ファイルに#で始まるコメントを許可しないという破壊的な変更が入っているため、OpenSearchをアップグレードする際には注意が必要になります。Fessで利用しているmapping.txtで、#の行を削除しないと、fessインデックスがopenできない状態になります。

という感じですが、14.10の変更を見ていくと、

#2758はデータストアクロールで、インデクシングするURLに#を含めると、検索結果でリンクが機能しないという問題があるのを対応しました。

#2759はデータストアクロールでは設定パラメーターで指定するような値が利用できないので、パラメーターの入力されたものを利用できるようにしました。CSVリストクロールなどのときに、CrawlerClientが指定されたURLにアクセスするときのパラメーターとして渡せるようになりました。

#2760はAzureADを認証として利用して、AzureADを利用したファイルシステムのクロールするときに認証情報が異なるので、それに対応するようにしました。

#2762はFessのアップグレード処理関連の更新です。今回はmapping.txtの問題があるので、アップグレードを実行すると、mapping.txtから#〜を削除してくれる機能を追加してあります。なので、OpenSearch 2.9でfessインデックスが起動できないときには、アップグレードを実行すると、mapping.txtの問題を修正してくれます。

という感じで、OpenSearch 2.9のmapping char filterの処理が変更された問題はありますが、何かあれば、フォーラムをご利用ください。

llama.cppを試す

llama.cppはLlamaモデルの推論を実行するC/C++の実装です。量子化もできたり、簡単に動かして試すときに便利なツールだと思います。

実際にllama.cppを用いてなんか作るようなときは、Pythonバインディングなどを使って、作ったりするほうが良いと思いますが、今回はllama.cppをビルドして試す方法を書いておきます。

まず、git cloneします。今回利用している環境はUbuntu 22.04を使っています。makeとかが実行できるように開発に必要なツールは事前にインストールある想定です。

git clone https://github.com/ggerganov/llama.cpp
cd llama.cpp

あとは、

make

を実行すれば、mainコマンドなどが生成されます。libllama.soを作成したいときには、

 make libllama.so 

を実行すれば生成できます。libllama.soはPythonバインディングとかで差し替えて使いたいときとかにあると便利かもしれません。

MKLやBLASなど用にビルドしたいときには、makeのときに環境変数で指定してあげれば、良いです。

次に、Llama 2をMetaのサイト経由で入手すると、pthのファイルですが、これをggmlなファイルに変換します。llama.cppに必要なコマンドが用意されているのでそれを利用します。以下のような感じで、ダウンロードしたtokenizerやpthファイルをmodelsディレクトリに置いて、convert.pyを実行します。

$ ls models                                                                                                                                    ggml-vocab.bin  llama-2-7b-chat  tokenizer.model  tokenizer_checklist.chk
$ ls models/llama-2-7b-chat/                                                                                                                   checklist.chk  consolidated.00.pth  params.json

という感じで、

python convert.py models/llama-2-7b-chat/

で変換処理を実行すると、models/llama-2-7b-chat/ggml-model-f32.bin が生成されます。

量子化するコマンドも提供されています。ggmlのファイルができたら、quantizeコマンドを実行すれば、量子化してサイズを減らすこともできます。オプションについては、–helpで確認できます。

./quantize models/llama-2-7b-chat/ggml-model-f32.bin models/llama-2-7b-chat/ggml-model-f32-q4km.bin Q4_K_M 

を実行するだけで、変換処理が実行できます。

あとは、

./main -m ./models/llama-2-7b-chat/ggml-model-f32-q4km.bin -n 128

という感じで実行すれば、動作確認することができます。

実際に利用するときには、llama-cpp-pythonなどのバインディング経由で、生成したbinファイルを指定して利用すると良いと思います。