delimiter

ローカルでテキスト生成AI(チャットAI)を動かして遊ぶ

テキスト生成AIで遊んでみた話。


仕事ではChatGPT Plusを使ってるけど、プライベートでもgpt-4で遊びたい。それに、ローカルで動くモデルもいじってみたい。ちょうど最近Googleの新しいモデル「gemma」のニュースもあり気になっていた。これらを家のサーバでやりたくて、オープンソースプロダクトを調べながらやってみた。


LibreChat


https://github.com/danny-avila/LibreChat


ChatGPTっぽいUIを提供するオープンソースは、たくさんあるので、迷う。 私はこの LibreChat を気に入っている。


LibreChat は、OpenAI の API キーを入れるだけで、OpenAI 上のモデルを使ったチャットが可能だ。ローカルで動かす場合、docker-compose で構成されているので、簡単に動かすことができる。この場合の「ローカルで動かす」は、UIや会話履歴などの機能をローカルでホストし、実際のテキスト生成はOpenAIがやる、ということ。


LibreChat は、メインのデータベースにMongoDBを使っている。また、全文検索エンジンにmeilisearchを使っている。これらは、docker-composeで管理される。ふつうのwebサービスと同じようなスタックである。 テキスト生成は OpenAI のサーバで行うわけだから、LibreChatそれ自体は非力なサーバでも動かすことができる(そう、RaspberryPiのこと。)2GB程度の空きRAMがあれば十分だと思われる。


LibreChatは、OpenAI以外のチャットプロバイダにも対応している。APIキーを設定すれば、GoogleやClauseなどに繋ぐことができるし、互換APIにも対応している。 ただ「対応している」だけではなくて、UI上で、接続先のサービスを任意に切り替えられる。また、ChatGPTと同じように、モデルも選択できるUIになっている。


OpenAIのいくつかの機能に対応しており、画像認識させたり、プラグインとしてDALL-Eで画像生成することだって可能で、これらはOpenAIの従量課金になる。


LibreChatは独立した認証機能を備えている。自分のインスタンスにアカウントを作成して利用する。つまり、自分専用なのではなく、家族や会社で使うことができる(プライバシーはさておき)。いくつかのIDフェデレーションにも対応していて、すごい。


そして、ローカルのテキスト生成システムと組み合わせることもできる。それは後述する。


text-generation-web-ui


https://github.com/oobabooga/text-generation-webui


これは、 gradio ベースのUIでテキスト生成モデルを動かしたり、学習したりできるプロダクトだ。hugging face の id を入れるだけでモデルをダウンロードできるので便利。 (家にあるML用マシンはヘッドレスなLinuxだから、ヘッドレスでダウンロードできると大変助かる。。)


チャットUIもあるから、適切なモデルを入れれば、チャットも可能である。 ただチャットしたいだけなら、ミスマッチである。 チャットで遊ぶためには、通常のモデルではなく、it (instruction-tunned) モデルを使うこと。 ネット上を見ていると、 text-generation-web-ui は、ファインチューニングのために使うのよっていう人も多いようだ。


ollama


https://ollama.com/


ollamaは、macやLinuxで動くCLIツールで、とても簡単にチャットAIを動かすことができる。 golangで記述されているので、小さいフットプリントですばやく動作する。裏ではllama.cppを利用する。セットアップスクリプトによって簡単にインストールできる。 すさまじくUXが良い。チャットをしたいだけなら、こちらを使うのが良い。CLIだけど。


モデルは、hugging face ではなく、ollamaのサイト自体から探せるようになっている。サイズやらファイル形式やらで迷うことが一切ない。モデルのバリエーションを選ぶことができるが、デフォルトがinstruction-tunedモデルなので悩まない。


モデルの指定は、Dockerのようなtag方式になっている。たとえば、gemmaを指定すると、 gemma:latest が参照されて、これは、gemma-7b-itの4bit量子化バージョン gemma:7b-instruct-q4_0 と同じモデルをポイントしている。ほかの量子化ビットのバージョンも、リポジトリに存在するなら、直接指定することができる。


このモデル管理は、ollamaの長所のひとつである。一体何なのか。 モデルは、独自のファイル形式 Modelfile に記述し、ollama cli で専用のリポジトリにpushする仕組みになっている。実際、このModelfileや、リポジトリの仕組みは、DockefileやDockerの思想に基づいているのだろう。ユーザはhugging face のような「ファイル」での管理から開放され、ひとつの抽象化レイヤーを挟んでモデルと向き合うことになる。


少し使った感じ、丁寧にメモリ管理しているように見えて好感が持てる。


REST API サーバも提供しているので、ほかのツールからも動かすことができる。


大事なのは、 LibreChat と連携できるってこと。 ollamaのブログによれば、つい最近・2月にOpenAI互換APIがリリースされたばかりだ。 LibreChat の設定ファイルに、ollamaのAPIのURIを書けば、自分ちの ollama を通じてテキスト生成できるってわけ。わーお!


ollama と LibreChat を連携させる。


うちでは、常時稼働・省電力・非力なサーバマシンと、起きているときだけ起動するML用マシンを使い分けている。今回の計画は、LibreChatは常時稼働マシンで動かし、いつでもOpenAIを使えるようにしつつ、ローカルテキスト生成をしたいときはML用マシンを起動する。 どちらのマシンもヘッドレスなLinuxだ。MLマシンのスイッチは手(足)が届く場所にあるので、起動したいときは物理でキックするか、常時稼働マシンからマジックパケットを投げるようにしている。だいたいマジックパケットで立ち上げていると思う。


設定は、さほど難しくない。 ollama のLinux用セットアップスクリプトには、現時点で、systemdのサービス定義も入っていた。ollamaをLANからアクセスできるように設定変更しておく。 それから、LibreChatも、ドキュメントにしたがい、ollamaに繋ぐように設定した。


完成じゃ!


スクリーンショット 2024-03-08 6.58.20.png gemma-7b-it 4bit量子化バージョンは、エントリーモデルのビデオカードでも無理なく動くと思う。


スクリーンショット 2024-03-08 7.00.34.png スクリーンショット 2024-03-08 6.59.24.png mistral はおしゃべり。


スクリーンショット 2024-03-08 10.18.57.png OpenAIも。


なお、ebonyというのはマシンの名前です。黒いケースにおさまったPCで、なんと、20年以上の付き合い!子供の頃から使っている頼れる相棒だ。(ただし、ケースの中身は別としてね)


というわけで、別々のマシンで LibreChat と ollama を稼働させることができた。 UIは常時稼働サーバにいるLibreChatだけに一本化。つなぎ先を、ローカルかOpenAIか、また、モデルも任意に切り替えられる、家庭内チャットUIというわけ。


ローカルで動くって最高だな。


以上。