※この記事は ヌーラバーブログリレー2023 for Tech Advent Calendar 2023 20日目の記事です。明日は Kohei Itoさんの記事です。
こんにちは。Backlog生成AIチーム所属のテリーです。私にはもともと生成AIの素養はないのですが、いつ誰にChatGPTみたいなやつ作ってよと言われても慌てないようにLLMをローカルで動かしてみました。
この記事はとりあえず自分のローカル環境でLLMを動かしてみたいという人を対象としています。高度なことはしていませんが、同じような気持ちの人がいたら参考にしてもらえたらと思います。
目次
PCのスペックについて
この記事では以下のスペックのラップトップで全ての作業を行っています。
MacBook Pro 14-inch, 2023 Chip Apple M2 Max Memory 64GB OS macOS 14.1
大規模言語モデルの種類について
大規模言語モデル(以下LLM)にはChatGPTで有名なGPT、BERT、LLaMAなど様々な種類があります。違いや特性については私の現在の知識で言及することは避けますが、今回はサードパーティが活発で精度がよく商用利用可能なLLaMAを使ってローカルで動かしてみることにしました。
とりあえず動かしたい
まず初めにローカルで動かすために公開されているLLMを探す必要があります。Hugging Faceで公開されていることは知ってましたが、それをどう自分のPCで動かすのかについては全くわからない状態でした。できれば簡単にChatGPTのようなものを作成して今後のアプリ実装のアイデアになればと思っていました。
さて色々探してみると意外と簡単にLLMをローカルでPythonのスクリプト使って動くところまではいきました。もし興味ある方はHugging Face上で各モデルのModel cardの項にPythonのサンプルスクリプトが用意されていることが多いので少し探してみると良さそうです。
ですがとにかく今回はUIが欲しい!!!ということで探してみると以下のようなOSSにたどり着きました。読者の皆様におかれましては下記以外にもたくさんのOSSがありそうな雰囲気がありましたので色々と検索してみるのはどうでしょうか?
上記のリポジトリを使用してとりあえずLlama2をローカルで動かしチャット形式で会話することができました。
ちなみにですがただ単にLlama2を試したい方はHugging Faceにデモ用のページがあるのでそちらを利用するのが一番早いかと思います。
https://huggingface.co/spaces/ysharma/Explore_llamav2_with_TGI
めでたしめでたし。としたかったところですが、もう少しやりたいことがあったため次に進むこととします。
日本語モデルはどうか
Llama2は英語についてはかなりよくできています。性能の比較などを行っているブログなどをみていると要約などの特定の領域ではGPT-3.5と同等もしくは上回る性能があるのではとされています。私の知識で何かを論じることはできないのでここでは言及は避けます。
https://promptengineering.org/how-does-llama-2-compare-to-gpt-and-other-ai-language-models/
さてじゃあ日本語はどうかというとChatGPTのようなレベルには程遠いように感じました。
- 日本語に対して英語を返答してしまう
- 日本語に英語の単語が度々入る
- 日本語をローマ字で表現してしまう
など。ということで日本語に特化したモデルを探すことにしました。
Youri7Bについて
rinna株式会社がLlama2を元に日本語を事前学習させたモデルです。これを動かしてみたいと思ったので上記の Text generation web UIで動かしてみることにしました。
https://rinna.co.jp/news/2023/10/20231031.html
動かない
https://huggingface.co/rinna/youri-7b-chat のFiles and Versionsから全てのファイルをダウンロードしてREADME通りに Text generation Web UI を動かしてみました、がうまく動きませんでした。UI上ではうまくモデルをロードできている感じなのに返答が全て英語。
Pythonファイルの実行はどうか
https://huggingface.co/rinna/youri-7b-chat のページ下部にPythonのスクリプト例があったのでUIの部分は諦めてPythonを動かしてみることにしました。しかし自分のPythonの知識不足もあり30GB程度のメモリを使うことになりPCが落ちてしまう結果となってしまいました。
いいですね Ollama
ここまで私は以下のようなことで困っていました。
- Pythonに対する知識の不足
- LLMのモデルに対する知識の不足
- モデルのランタイムの知識の不足
- Pythonの依存関係のインストール
以上のことをまとめると今私が欲しいのはPython固有の知識や依存関係の理解がいらず、Hugging Face上のモデルの適用などのドキュメントがわかりやすいチャットUIもついたOSSです。
その観点でインターネットの海を漂流している時に見つけたのがOllamaです。ドキュメントをみているとDockerライクなモデルの設定ファイルやHugging Faceなどからダウンロードしてきたモデルをどうやったら使えるようになるかなどのドキュメントが必要最低限揃っており今回はこれだと感じました。
Ollamaはアプリをダウンロードするだけで使えるようになるためpipなどで新たに依存関係などを解決する必要がありません。ただローカルでLLMとチャットをしたいだけの私にとってはベストな構成でした。
動かしてみる
具体的な動かし方はREADME.mdをみてもらうとして今回は日本語モデルであるyouri-7bを動かしたかったのでModelfileに以下のように設定してみました。TEMPLATEの設定はドキュメントを参考にしています。
またyouri-7b-chatではggufが提供されていなかったので、有志でモデルをggufに変換している方のページからダウンロードして使用しました。
FROM ./models/rinna-youri-7b-chat-q6_K.gguf TEMPLATE """[INST] {{ .Prompt }} [/INST] """ PARAMETER num_ctx 4096 PARAMETER stop "[INST]" PARAMETER stop "[/INST]"
サーバーとして動かしてみる
さて目標はチャットのUIを作ることでしたね。Ollamaはアプリが動いている間はローカルにサーバーを立ち上げてくれるため、そのフロントエンドとして様々なOSSが公開されています。今回はその一つである ollama-ui を試してみることにしました。
試しに日本の歴史について質問してみました。
英語でも聞いてみました。
さて目標は達成しました。これでローカルで任意のLLMを試せることになるでしょうめでたしめでたし。
Ollamaを動かしているときに得た気づき
さてこのOllamaのリポジトリをよくよくみてみるとGoで書かれてるようです。どうやってLlama2を実行してるんだろうって思いソースコードを確認したところOllamaのLlama2実行部分ではllama.cppを利用しているようです。
llama.cppはmacOSでLlamaを動かすことをゴールとしたプロジェクトで、Llama2のモデルの実行部分をC++の実装しPython依存を省いていくれています。結局のところllama.cppが色々とPythonの依存関係などめんどくさいところを隠してくれていたおかげでLlama2を簡単にmacOSのローカルで実行できるようにしてくれてました。
さて風の噂(Xのタイムライン)でLlama2をwasmとしてフロントエンドで動かすことができるということを聞いていたのでこちらも最後に試してみたいと思います
フロントエンドLLM
少し調べてみるとllama2.c-webやWebLLMなどLLMをWebAssemblyランタイム上で動かすような意欲的なプロジェクトが見つかりました。ブラウザ上で動かすとなるとモデルの初期ロード容量の大きさなどが気になりますが、ネットワークを介さずAIのレスポンスを得られるのはやはり魅力です。音声入力や文字の要約などすぐにレスポンスが欲しい場合に役立つような気がします。軽量で早いレスポンスが求められる機能はエッジで行い比較的重いタスクはサーバーにあるLLMが回答するような構成は拡張性が高そうに思えます。
私が今回見つけた二つのプロジェクトはブラウザでアクセスするだけで動作するため早速使ってみました。
普通にすごい
こちらの画面にアクセスすると機能が使えます。
https://webllm.mlc.ai/#chat-demo
llama2.c-webのデモページではStoryを作ってくれます。
https://diegomarcos.com/llama2.c-web/
やはり日本語で動く姿を見たい
やはり日本語に対応したLLMを動かしてみたいということで少し調整してみました。結果から言うとうまくいかなかったのですが、以下試行錯誤の過程を記述します。
WebLLMで試してみる
WebLLMはMLC-LLMのプロジェクトの一つでLLMをweb上で動かせるようにコンパイルするプロジェクトです。モデルをコンパイルすることでMLC-LLMが用意する各種デバイス上のランタイムで動かせるようにしたものです。Llama2をコンパイルすることでPythonのモジュールに依存することなくブラウザのランタイムで動くようなLLMを生成することができます。ユーザーからするとブラウザ上でただモデルをロードするだけで魔法のようにチャットが開始できるので驚きです。
参照
https://llm.mlc.ai/docs/get_started/project_overview.html
youri7b-chatを動かしてみる
上記の説明の通りまずはモデルをコンパイルする必要があるので、下記のドキュメントを参考にしながらコンパイルを行います。
https://llm.mlc.ai/docs/compilation/compile_models.html
ドキュメントを読んでるとemscriptenもインストールする必要があったのでこちらも用意します。
さて準備が整いました。モデルをコンパイルした後にWebLLMのexampleディレクトリにsimple-chatなるものがあったのでこちらを使ってローカルで動かすことにしました。
https://github.com/mlc-ai/web-llm/tree/main/examples/simple-chat
コンパイルも通ってモデルのロードも完了したのですが。。。
ここで時間切れとなりました。
まとめ
今回私が行ったことはOSSを探して自分のローカル環境で実行したことだけでした。OSSコミュニティのパワーを思い知ると同時にOSSで開発されている全ての人々に改めて尊敬の念を抱くことになりました。私も何かしらの観点でLLMのエコシステムに貢献していけたらと考えています。
まとめるとなんか色々あって難しいけどM2 Macでも普通に動くのでどんどん遊んでいきたいです!!!と言うところを結論として。さようなら。