本セッションの登壇者
セッション動画
では「オープンなLLMをローカルで動かす」というタイトルで発表させていただきます。
からあげという名前で活動しています。職業はエンジニアで、最近AI関係のお仕事に転職しました。ブログとか各種SNSで情報発信していますので、よろしければフォローいただけると嬉しいです。
AIの著書とか、Raspberry PiやJetsonといったマイコン関係の寄稿などしておりますので、こちらもよろしければ手に取っていただけると嬉しいです。
早速今日の議題なんですけど、オープンなLLM(Large Language Model)、大規模言語モデルの話をしたいと思います。前提としては、話題のChatGPT以外のLLMの話になります。
日本語タスクで最強なLLMは?
そもそもChatGPT以外のLLMって何があるのかは、あまり知らない方もいるかなと思いますので紹介します。
特に我々日本人がわかりやすい日本語が使えるLLMに関して、Weights & Biasesという会社が日本語タスクのベンチマークの記事をあげていまして、そこからランキングを引用して紹介させていただきます。
やっぱり1位はChatGPTに使われているGPT-4が最強で、続いてアメリカのMosaicMLという会社のmpt-7b、そして日本からはrinna株式会社のrinnaとか、サイバーエージェントのOpenCALMが頑張っているという状況です。ここには載ってないんですけれども、RWKVベース、いわゆる一般的なトランスフォーマーベースではない方式のLLMもあったりします。
これらを比較した表がこちらです。性能とモデル、データ、ライセンスといった観点で比較しています。これ以外にMetaのLLaMA系というものがあって、商用不可でダウンロード許可制だったため除外していたんですけれども、ちょうど今日、商用利用に可能なLlama2というのが発表されたので、今後は注目かなというところです。今回は手軽に動かせるrinna、OpenCALM、RWKVを試していきたいと思います。
「そもそもChatGPT以外のLLMを使う理由って何でしょう?」というところを最初に話したいんですけれども、正直、現時点ではあんまりないかなというのが個人的な感想です。
ただその中であえて言うなら、以下の点があるかなというところで、OpenAIが止まった時、トラブルとかサービス変更、終了リスクに対応できるOpenAIの代替であったり、ローカルで動かせる、ネットが使えない環境でもスピーディに使えるというところが魅力の1つかなと考えているのと、あとは、ハイスペックなマシンがあればファインチューニングなどもできることですが今日の私の発表では扱いません。あとはOpenAIのAPI費用が不要になるというお金の面と、最後に「楽しい」ということで、これが個人的には一番です。こういったことを楽しめる方がトライされるとよいと思います。
まずはPCを買いに行くところから!
早速、オープンなLLMの動かし方を紹介していきたいと思います。動かし方はいくつかあって、今回はローカルで動かす話をしていきたいと思います。Google Colabで手軽に動かす方法はnpakaさんという方がわかりやすいブログ記事を公開されているので、そちらを参照してください。特に、ローカルでやる場合はセットアップが少し煩雑なので、今日はその辺のポイントをお話ししていきます。
では早速、環境構築の話をしていきたいと思います。まず最初に、私、結構Macが好きでたくさん持ってたりするんですけど、オープンなLLMを動かす場合はMacはいったん忘れてください。
じゃあ何をするかというと、ゲーミングPCを買いに行きましょうというのが重要なポイントです。Macしか使わない人はパソコンやゲーミングPCは全然買わないという人も多いと思います。少し紹介するとこのようなメーカーがあるので、好きなところで買うといいかなと思います。私はパソコン工房さんが近くにあるので、そこで買いました。
続いてパソコンを選びましょうということで、選定のポイントはまずはGPU、あとはお金が許す限りメモリをたくさん積みましょうということです。
特に、メモリが多めのGPUを選定するというのがポイントです。メモリが足りないと、結構大きめのモデルを扱うとCUDA out of memoryと表示が出てきて切ない思いをするので、なるべく高い物を買うといいです。とは言ってもGPU結構高いので、たとえば個人的に貧者のGPU(5万近くするのに何が貧者だという話もありますが)と呼んでいるRTX3060とかが比較的安価でメモリも多めなのでおすすめです。
とりあえずバカでかスワップを確保
続いて、パソコンを買ったらセットアップしていきましょうということで、最近、Linux環境以外にもWindows環境を前提としたセットアップの記事も多く出ているので、両方を揃えておくと便利です。おすすめはSSDメモリにOSを含めて開発環境をまるごと入れることです。SSDからブートしてOSごと切り替えることで、比較的安定して運用できます。ここら辺はブログ記事に書いていますので、興味のある方は参考にしていただければと思います。
また、スワップメモリをなるべく確保していくのが安定して動かすポイントです。Windowsでwsl2の環境で動かす場合はconfigファイルに memory=
、swap=
と書いて、とりあえずバカでかスワップを確保しましょう。
Linuxの場合も同様にスワップメモリを増やすといいんですけれども、Linuxの場合は4つコマンドを打てばスワップメモリを確保できます。これは32 GBの例ですが、スワップメモリなのでハードディスク容量が許す限り増やすのがおすすめです。
LLMにはDockerがおすすめ
続いてDockerでのLLMの動かし方ですが、Dockerをインストールしてビルドして、ランして実行するという3ステップでOKです。
そもそもDockerを使う理由は、今日はDockerが何かというところまで説明する時間はないんですけれども、利点だけを3つ挙げておきます。LLMをローカルで動かす時はDockerを使うのが、個人的おすすめです。
Dockerをインストールする方法については、公式のページビルドではいくつかコマンドを入力する必要があって煩雑ですが、私の方でワンライナーでインストールできるスクリプトを用意していますので、そちらを使っていただけると結構楽にインストールできるかなと思います。CPUのみの場合は、上の一行を実行するだけでOKで、GPUも使いたい場合は2行目を実行すれば、GPUが使えるDocker環境がセットアップ可能です。もしダメだったり不安だったりしたら、公式サイトを参照いただければと思います。インストールもけっこう変更が激しいので、まめにチェックするのがおすすめです。
続いて、Dockerのイメージをビルドしてランします。こちらもリポジトリにDockerファイルを含めて私が作成したものがあるので、そちらをビルドして実行すると、LLMを動かせる環境が手に入ります。GPUをCPUに切り替える場合は、--gpus all
というオプションを消すだけで簡単に切り替えることができます。
実際にDockerで動かす方法ですけれども、cdでコンテナ内ディレクトリをチェンジして、それぞれモデルに対応したコマンドを実行していくだけで動かせます。1回目だけはモデルのダウンロードがあるのでちょっと時間がかかるんですけれど、2回目からはサクサク動かせます。
3つのLLM動作例
これで動かせるようになったので、動かした例を紹介していきたいと思います。使用するモデルは、リファレンスとしてChatGPT。他に、先ほど紹介したrinnaと、サイバーエージェントのOpen Calmと、RWKVの3つを比較していきます。ちょっとここで注意いただきたいのは、これはあくまで小さいモデルを使った特定の少量のプロンプトで確認した動作例となります。本来はモデルに合わせたプロンプトエンジニアリングが必要だったり、条件も揃えないといけないんですけれども、今回はそういう厳密なことをやっていないので、あくまでモデルのベンチマークではなくてこういう実行例になるんだと雰囲気で楽しんでいただければ良いかなと思っております。
最初にChatGPT選手の模範演技です。たとえば「日本で一番高い山は何ですか?」と聞くと、「富士山です。3776メートルです」と完璧な答えを出してくれます。疑問形ではなく「日本で一番高い山は」と、後に続く言葉を推測させる形でプロンプトを入れても完璧に答えてくれます。
続いて、PythonでFizzBuzzのコードを書いてくださいと言うと、これもまた完璧に答えてくれます。続いて、「からあげにレモンをかけたら死刑です」といったことを言ったら、「それはジョークでしょう」というふうに、倫理観も強いというか、あんまり適当なことを言わないようにチューニングされていますという状況ですね。
そこでrinnaさんを動かしたらどうかというとこのような感じです。惜しいんですけれど標高がかなり高めの富士山ですね。聞き方を変えても同様です。
続いて、「PythonでFizzBuzzを書いてください」と頼むと、「もちろんです」って答えてくれるんですけど、そこで終わって続きを書いてくれないという状況ですね。もう一回聞いても、同じ結果になってしまいます。
次にサイバーエージェントのOpen Calmの動作例です。なんとか正解にたどり着いたんですけど、高さは答えてくれないですね。
続いて「日本で一番高い山は」という聞き方をすると、若干ユニークな回答が出てきました。
「FizzBuzzを書いてください」と書くとその説明とか、日本語で書くとどうだなど、これもなかなかお茶目な回答をしてくれるんですけど、プログラムは書いてくれません。
続いてRWKVがどうかというと、シンプルに無駄なことを言わず回答してくれます。ただ、ちょっと聞き方を変えると、独特の解釈で突然「北海道の山じゃないか」と全然違うことを言い出しますね。
続いてPythonのFizzBuzzを書いてくださいとお願いすると、これはかなり正確に返してくれます。RNNベースなんですけれども思ったより性能がいいなという印象です。
GUI入力を試してみよう
先ほどは簡素なCUIでしたが、OSSでGUIで入力できるようなものがもうありますので、これを使うとプロンプトも作りやすく、設定が豊富で便利なので、試していただくといいかなと思います。動かし方はブログの記事に上げています。
これは実際に動かしてみた例です。rinnaの3.6billionのモデルを使用して、「からあげにレモンをかけたら死刑です」と入れると、けっこう過激な発言をしたりします。最近はそうでもないですけれど、オープンなLLMは結構こういう過激派な発言も多くなるのでそこら辺が注意点でもあるし、魅力でもあったりするのかなと思ったりしています。
課題はあるが時間が解決してくれそう
オープンなLLMの課題です。今回は小さ目のモデルで検証している点には注意いただきたいかなと思います。ただ、課題はあっても時間が解決してくれそうではあるなというところですね。
まとめとして、オープンなLLMの概要、動かし方、動かした結果を学びました。ということで、オープンなLLMを楽しんでいただければと思います。
最新のLlama2も試してみた
少し時間があるので、今日発表されたばかりのLlama2のモデルを少し動かしてみました。動かし方はnpakaさんのブログの記事を参考にさせていただきました。軽量化モデルの方で試してみた結果ですのでその点はご注意ください。
結果は以下のとおりです。最後の「からあげにレモンをかけたら」の理由がちょっと独特の理解を持っているようですね。
以上です。ご清聴ありがとうございました。