ローカルでAIチャットをチャチャっと動かしたい

※この記事は ヌーラバーブログリレー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がありそうな雰囲気がありましたので色々と検索してみるのはどうでしょうか?

FastChat

Text generation web UI

上記のリポジトリを使用してとりあえずLlama2をローカルで動かしチャット形式で会話することができました。

AI: How can I help you today? You: can you tell me the capital of Japan AI: Yes, the capital of Japan is Tokyo.

ちなみにですがただ単に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上ではうまくモデルをロードできている感じなのに返答が全て英語。

You: こんにちは AI: Hi! You: えーっと君は誰ですか? AI: I am Artificial Intelligence. You: こんにちは AI: Hi there!

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などからダウンロードしてきたモデルをどうやったら使えるようになるかなどのドキュメントが必要最低限揃っており今回はこれだと感じました。

https://ollama.ai

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 を試してみることにしました。

試しに日本の歴史について質問してみました。

You: 日本は東アジアに位置し、大平洋に面しています。 AI: 日本の歴史は、古代、中世、近世、ロマンという近隣諸国によって影響を受けた歴史です。 You: 今日は日本の歴史について教えてください AI: いや歴史について教えてくださいちょっと短い

英語でも聞いてみました。

ユーザーが「tell me about the history of Japan」と質問し、AIが日本の歴史についての十分な量の簡単な概要を英語で回答しています。情報量すごい

さて目標は達成しました。これでローカルで任意の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-webWebLLMなどLLMをWebAssemblyランタイム上で動かすような意欲的なプロジェクトが見つかりました。ブラウザ上で動かすとなるとモデルの初期ロード容量の大きさなどが気になりますが、ネットワークを介さずAIのレスポンスを得られるのはやはり魅力です。音声入力や文字の要約などすぐにレスポンスが欲しい場合に役立つような気がします。軽量で早いレスポンスが求められる機能はエッジで行い比較的重いタスクはサーバーにあるLLMが回答するような構成は拡張性が高そうに思えます。

私が今回見つけた二つのプロジェクトはブラウザでアクセスするだけで動作するため早速使ってみました。

普通にすごい

こちらの画面にアクセスすると機能が使えます。

https://webllm.mlc.ai/#chat-demo 

System: [System Initialize] Finish loading on WebGPU - apple AI: Hello! I'm here to help. How can I assist you today? You: where is the capital of Japan? AI: The capital of Japan is Tokyo. It is located on the eastern coast of Honshu, the largest island of Japan. Tokyo is a city of over 13 million people and is known for its vibrant culture, rich history, and cutting-edge technology. It is home to many famous landmarks, including the Tokyo Tower, the Imperial Palace, and the Meiji Shrine. I hope that helps! Is there anything else you would like to know?いい回答ですね

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もインストールする必要があったのでこちらも用意します。

https://emscripten.org/docs/getting_started/downloads.html#installation-instructions-using-the-emsdk-recommended 

さて準備が整いました。モデルをコンパイルした後にWebLLMのexampleディレクトリにsimple-chatなるものがあったのでこちらを使ってローカルで動かすことにしました。

https://github.com/mlc-ai/web-llm/tree/main/examples/simple-chat 

コンパイルも通ってモデルのロードも完了したのですが。。。

モデルをロードできずWebGPUに関するエラーメッセージが表示されています。さっぱりわからない

ここで時間切れとなりました。

まとめ

今回私が行ったことはOSSを探して自分のローカル環境で実行したことだけでした。OSSコミュニティのパワーを思い知ると同時にOSSで開発されている全ての人々に改めて尊敬の念を抱くことになりました。私も何かしらの観点でLLMのエコシステムに貢献していけたらと考えています。

まとめるとなんか色々あって難しいけどM2 Macでも普通に動くのでどんどん遊んでいきたいです!!!と言うところを結論として。さようなら。

開発メンバー募集中

より良いチームワークを生み出す

チームの創造力を高めるコラボレーションツール

製品をみる