大規模言語モデルOPTをM1/M2 Mac上のFlexGenで動かしてチャットする
人工知能技術の一分野である自然言語処理を利用したサービスChatGPTが2022年末から2023年に入っても話題となっています。無料で登録できますが、有料プランができたり、API提供が正式に始まって低価格を打ち出したりと、人の言葉を処理できる機能が急速に身近になっています。
前置きを省略するために、清水亮さんがFlexGenについて熱く紹介した記事をご覧いただければと思います。
つまり、自宅のパソコンで大規模言語モデル(LLM)を利用できる推論エンジンFlexGenを、私もMacを使って動かしたいというのが今回のテーマです。
準備する
Mac上で動かしてみる手順から紹介します。
ターミナルアプリの起動
Python導入
PyTorchのNightlyバージョン導入
FlexGen導入
チャットボットの準備
チャットボットの利用
Python導入
Pythonを準備しておく必要があります。
Python導入方法は、いろんなルートが取れるので、状況に応じてというのが現実です。
すでに何かの機会にPythonは導入済みといったこともあり得ます。以下にもいくつか参考情報を貼っておきます。
https://www.python.jp/install/macos/install_python.html
また、今回はモジュールをインストールするためpipを使います。
python3 -m pip install --upgrade pip
なお、「python」「pip」コマンドは、環境によって「python3」「pip3」などバージョン指定する必要があるかも知れません。
PyTorchのNightlyバージョン導入
機械学習ライブラリであるPyTorchを導入します。
ただし、Apple SiliconのMPS(Metal Performance Shaders)というフレームワーク(GPUを機械学習に使える)への対応は現在進行形なので、少しでも新しいバージョン(Nightlyバージョン)を導入します。
pip3 install --pre torch torchvision --index-url https://download.pytorch.org/whl/nightly/cpu
導入自体は上記コマンドで済みますが、関連情報はこちら
FlexGen導入
推論エンジンであるFlexGenを導入します。
git clone https://github.com/con3office/FlexGen.git
cd FlexGen
git checkout m1
pip3 install -e .
今回はAppleシリコンMacで利用するため、「m1」ブランチへと切り替える必要があるので「git checkout m1」しています。(Intel Macでも同じです)
チャットボットの準備
まずはさらにディレクトリ移行します。
cd flexgen
必要なライブラリモジュールをセットします。
pip3 install -r apps/requirements.txt
これは「requirements.txt」というファイルの中に必要になりそうなライブラリをリストアップしているので、それをインストールするためのコマンドです。すでにインストール済みのものもあるかも知れませんし、リストで足りないものがあったら適宜別途追加してください。
チャットボットの利用
「apps」ディレクトリの「chatbot.py」がチャットアプリです。
python3 apps/chatbot.py --model facebook/opt-1.3b --platform mps:0
上記は「facebook/opt-1.3b」という言語モデルを読み込み、「mps」(GPU)で処理することをオプション指定した場合です。
会話が始まりますのでお楽しみください。
終了する場合は何も入力せず改行すると終了します。
Human:(改行)
exit...
コマンドオプション
python3 apps/chatbot.py [options]
コマンドオプションは以下の通りです。
--model
利用する言語モデルを指定します。言語モデルにはMeta(Facebook)が提供したOPTを利用できます。他にも利用できるものがあると思います。
--model facebook/opt-2.7b
facebook/opt-1.3b
facebook/opt-2.7b
facebook/opt-30b
facebook/opt-66b
facebook/opt-iml というチューニングバージョンもあり指定できそうです。
facebook/opt-iml-1.3b
facebook/opt-iml-max-1.3b <- かなりヤンチャな返答をする。
facebook/opt-iml-30b
facebook/opt-iml-max-30b
--platform
FlexGenを処理するプラットフォームを選択します。
--platform mps:0
cpu - CPUで処理します。(IntelMacはこちらで動作)
mps:0 - MacではMetal(つまりGPU)で処理します。
cuda - NVIDIAのGPUを利用できる場合に指定します。
--gen-len
生成する返答の文字長を指定します。
--gen-len 96
なお、指定がない場合はデフォルトで64文字になっています。
--compress-weigh
OPTなど言語モデルは大規模と銘打つだけあって巨大です。それをパソコン上で扱うにはいろいろ工夫が必要ですが、その一つが圧縮です。
--compress-weigh
facebook/opt-30b
facebook/opt-66b
といったサイズの大きなものを扱うのはそもそも大変ですが、このオプションを付けると可能になる場合があります。
--dpl-apikey
DeepL APIサービスを利用してチャットを翻訳できます。
入力する言語は自動判別されますが、チャットボットからの返答は英語のままです。裏側では英語ベースで会話している状態です。
--dpl-apikey YOUR_API_KEY
DeepLアカウント画面からAPIキーを確認してYOUR_API_KEY部分に置き換えて指定してください。
--dpl-lang
チャットボットからの返答の言語を指定します。
「--dpl-apikey」を一緒に指定する必要があります。
--dpl-lang ja
日本語は「ja」です。
言語指定キーワードはDeepLの説明を参照してください。
開発メモ
AppleシリコンMacへの対応に関しては、Twitter上でアドバイスをいただきました。ありがとうございました。
@GOROman さん
@gravitino さん
chatbot.pyは、オリジナルリポジトリで公開のちに削除されたものを復活させて改良したものです。
元開発者の方が削除したのには理由があるのかも知れませんので、今回の復活は歓迎されていないかも知れません。
ただ、ローカルマシンで言語モデルを動かすデモとしてはチャットが一番分かりやすいと思われます。いろんな方がローカルで動かしてみることに関心を寄せてもらうためにもチャットを復活させてみた次第です。
DeepL APIを利用する機能は、チャットデモの敷居を下げたり、魅力的に見せるためには効果的だと思うので実装してみました。
DeepL APIの登録は無料プランでもクレジットカードの登録が必要なため、敷居が高くなっていますが、プリペイド方式など何かしらハードルをクリアして使ってみていただけると、面白味が増すと思います。
そもそも大規模言語モデルをローカルのパソコンで動かすことに、実験的な意味合い以上のものを見つけるのは難しいかも知れません。Open AI社のChatGPTがいろんなやり方でサービスを提供しているので、それを利用した方がよほど実用的です。
ただ、こうした技術チャレンジに魅力を感じたり、面白さを感じてみたりすることは、年齢問わず大事なことだと思います。
もしハードウェア的な条件がクリアできていたり、できるのであれば、挑戦してみてもよいのではないでしょうか。