清水理史の「イニシャルB」
賢いと噂の日本語LLM「ELYZA」をウェブAPIで使う! Power Automateなどからも呼び出せる完全ローカル環境の構築
2023年10月10日 06:00
rinnaやOpenCalm、さらには賢いと噂のELYZAなど、GPU搭載の家庭用PCでも動く日本語大規模言語モデル(LLM)が増えてきた。こうした日本語LLMは、現状ならPythonで動かすのが一般的だが、APIアクセス可能にすることで、さまざまな機器から、より手軽に扱えるようにしようというのが今回のテーマだ。
FastChatを使ったAPI化をDockerを使って実現することで、はじめてでも数コマンドで実装できるようにしてみた。
賢いELYZA
「ELYZA-japanese-Llama-2-7b」は、東京大学松尾研究所発のAIスタートアップ企業である株式会社ELYZAから8月末にリリースされた、商用利用可能な小型の日本語LLMだ。
少し前に話題になったMetaのLlama 2をベースに日本語での追加事前学習を実施したモデルで、日本語の各種性能評価で高い結果を出しており(詳細は以下のリンク参照)、現状、日本語LLMとしてはトップクラスの実力を持つ存在となっている。
なぜ英語モデルをベースにしたのか、どのように事前学習させたのかは、開発者の手によって以下のZennの記事で説明されているが、簡単に言えば、Llama 2のLLMとしての基本性能(指示に従う能力など)を維持しながら、日本語に対応させようという狙いだったという。記事では、その経緯やより詳しい方法が丁寧に解説されているので、ぜひ一読をおすすめする。
▼ELYZAによる解説記事
ELYZAが公開した日本語LLM「ELYZA-japanese-Llama-2-7b」についての解説(株式会社ELYZA:Zenn)
「Llama 2」をベースとした商用利用可能な日本語LLM「ELYZA-japanese-Llama-2-7b」を公開しました(ELYZAの研究&開発:note)
実際に使ってみると、海外製LLMならではの指示追従能力の高さと、日本語LLMらしい日本に関する知識の豊富さの中間をうまく混ぜ合わせたような印象だ。小型のLLMなので限界はあるにせよ、かなり使い勝手がいいと感じた。以下のサイトで試せるので、興味がある人は触ってみることをおすすめする。
70億パラメーターなので、VRAM 16~24GB搭載のGPUがあれば家庭用のPCで動かせるのも魅力で、社内情報などを活用したクローズドなシステムへの応用も可能となっている。こうした日本語対応の賢いLLMを誰もが簡単に試せるようになったことは、大変ありがたいことだ。
▼オンラインデモ
ELYZA-japanese-Llama-2-7b-instructオンラインデモ(Hugging Face)
APIアクセスでELYZAを利用可能にする
さて、今回は、このELYZAのモデルのうち、ユーザーからの指示(INSTRUCT)に従って回答できるように学習された「elyza/ELYZA-japanese-Llama-2-7b-instruct」を、API経由で利用できるようにしてみる。
PCローカルでLLMを利用する方法としては、text-generation-webuiなどのGUI環境が使われる場合もあるが、日本語LLMを対象に開発されていないこともあり、トークナイザーでエラーが発生したり、必要なパラメーター設定が欠けることで意図せぬ応答がなされたりすることが多い。実際、今回の「elyza/ELYZA-japanese-Llama-2-7b-instruct」も筆者が試した時点のバージョンでは、エラーが発生してモデルの読み込みに失敗してしまった。
確実なのはPython環境で動かすことだが、今回は、さまざまなアプリやIoT機器などからの連携もしやすくするために、APIアクセス可能にすることにした。OpenAI互換のAPIを利用できる環境で、ベースURLをローカルのアドレスに変更できるアプリなどであれば、ChatGPT用の設定をほぼ流用して、ローカルLLMを使えるようになる。
そこで、今回は、Dockerを利用して、なるべく簡単に、こうした環境を構築できるように工夫してみた。
STEP 1:事前準備
事前の準備として、Windows PCにWSLとDocker Desktopをインストールしておく。WSLはターミナルから以下のコマンドで、Docker DesktopはDockerのサイトからインストールできる。
wsl --install
STEP 2:docker-compose用ファイルを取得する
続いて、Dockerコンテナを作るためのファイルを取得する。筆者が作成したものを以下に置いておくので、ターミナルからgitでcloneするか、ダウンロードして展開しておく。なお、あくまでも参考用として公開しているので、自己責任で使ってほしい。
git clone https://github.com/shimiz9/elyza-fschat-api.git
STEP 3:コンテナを作成する
以上の工程が完了したら、ダウンロード先のフォルダー(docker-compose.ymlがあるフォルダー)に移動して、以下のコマンドを実行すれば、自動的にイメージの作成と、モデルのダウンロードが実行され、コンテナが起動する。作成時のみ以下のコマンドを利用し、2回目以降はDocker Desktopでコンテナの起動や削除などができる。
docker-compose up --build
なお、イメージ自体で13GBほど必要なうえ、ELYZAのモデルをダウンロードする必要があるため、さらに13GBほどの容量が必要になる。初回はこれらの操作のため、起動するまでに10分ほど時間がかかる。2回目以降はもう少し早く起動するが、GPUへのモデル読み込みが必要なので、完全に起動するまでに30~40秒はかかる。
詳細については、ダウンロードした各ファイルの中身を参照してほしいが、「content」フォルダーに保存されている「apiserver.sh」にて、FastChatのコントローラー、ワーカー、APIサーバーの3つのサーバープログラムを起動している。
このうち、ワーカーでELYZAのモデルを指定して読み込んでいるので、ここを変更することで別のモデルも利用可能だ。
なお、今回の例では、下図のようにモデル名をOpenAIで提供されているGPT-3.5 Turboなどと同じモデル名にフェイクしている(中身はELYZAだが名前がgpt-3.5-turboになっている)。
これにより、クライアントからAPIを呼び出すときのモデル名として、OpenAIのAPIと同じ「gpt-3.5-turbo」などを利用できる。OpenAIのAPIを使えるソフトなどであれば、モデル名をそのまま流用しつつ、エンドポイントのベースURLを後述するローカルに変更するだけでAPIを利用できる。
なお、このテクニックは、noteで公開されている以下の記事で紹介されている。この場で著者に感謝しつつ、ありがたく使わせていただくことにした。
APIを利用してみる
以上で、APIアクセスが可能になったはずだ。早速、正常に動作しているか確認してみよう。
まずは、モデルが読み込まれているかどうかを確認する。タスクマネージャーを起動し、GPUの項目で「専用GPUメモリ」の値が14GB前後になっていれば、問題なくELYZAが読み込まれている。
もちろん、16GB以上のVRAM搭載GPUが装着され、NVIDIAのドライバーがインストールされている環境でないと動作しないので注意してほしい。
次にAPIのレスポンスを確認する。ブラウザーを起動して、「http://localhost:8000/v1/models」や「http://PCのIPアドレス:8000/v1models」などにアクセスすると、利用できるLLMとして、上記「apiserver.sh」で指定した3つのモデルが表示される。
最後に、実際にELYZAにリクエストを投げて回答してもらう。ターミナルを起動し、以下のコマンドでコマンドプロンプトに切り替えて、curlを実行する(PowerShellのままだとcurlの仕様が違うので必ずコマンドプロンプトを利用)。
cmd
curl http://localhost:8000/v1/completions -H "Content-Type:application/json" -d "{\"model\":\"gpt-3.5-turbo\",\"prompt\":\"今日のためになる一言を教えてください。\",\"max_tokens\":60,\"temperature\":0.5}"
きちんとコンテナが起動し、モデルが読み込まれていれば、しばらくして回答が表示されるはずだ。このほか、Power AutomateからELYZAを使うこともできる。
LangChainのGUI版「Flowise」や「LangFlow」から使える
今回、筆者がこの環境を用意した主な目的は、LangChainのGUI版となるFlowiseやLangFlowから使うことだ。これらの場合は、OpenAIのノードをそのまま活用し、エンドポイントを「http://PCのIPアドレス:8000/v1」に変え、トークンを空または「EMPTY」などに設定するだけで利用できる。
全ての環境での動作を保証するものではないが、汎用的なHTTPリクエスト(POST)が使える環境なら、いろいろなアプリやデバイスから使えるだろう。外部のサービスを使わずに、自前のLLMでドキュメントQAアプリなどを作成できる。小規模な環境なら、これで十分というケースも多そうだ。
このように、賢くて小規模なLLMをローカルでAPI化しておけば、いろいろな用途に活用できるようになる。小規模な環境での自社システムへのLLMの組み込みのハードルが、かなり下がった印象だ。