GPT4ALLをCPUのみでpythonから実行する
nomic-aiという企業から、ローカル環境で動作するGPT4ALLというモデルが公開されました。動作手順をまとめます。
GPT4ALLとは
※OpenAI社のGPT-4とは異なります。※
オープンソースのみのデータでGPT(Generative Pretrained Transformer,生成型事前学習済みトランスフォーマー)を学習し、公開することを目的として実装が進められているリポジトリ兼モデルの名前です。新しいモデルは適宜公開されるため、定期的に確認すると良いでしょう。
GPT4ALLの4ALLの部分は"for ALL"という意味だと理解しています。コードを書くときに、例えば、入力データの画像をテキストに変換する際にimage2text
とか書くのと同じノリですね。みんなのためのGPTというお気持ちで作られているのだと思います。では、従来の大規模言語モデルはみんなのために作られていないのでしょうか。
答えは、みんなのためには作られていません。理由は、公開企業がライセンスを発行して自社の利益を守るためです。ライセンスは非常に重要な要素です。従来は、大量の計算資源と予算を持つ大企業だけが大規模な深層学習モデルを開発することができていました。しかし、最近になるとモデルサイズを小さくしつつも大規模言語モデルと同程度のタスク達成度を持つ大規模言語モデルが登場してきました。
Meta社が発表したLLAMAはその1例で、当時OpenAI社が開発したGPT-3の持つ1750億パラメータに対して、半分以下の650億パラメータでGPT-3のタスク達成度を一部上回る結果を示しました。
このパラメータ数が小さくなったLLAMAを基に、fine-tuningを行う手法が多く提案されています。最近特に注目されているのが、ユーザーの入力文に従って、適切な応答を返すことができるように学習するInstruction tuningです。さらにその中でも注目を集めているのが、指示文とその回答文を自動で生成することを目的としたself-instructです。
self-instructには言語モデルが必要です。これを、OpenAI社のtext-davinci-003
APIで賄うことにより大量の指示文と回答文を生成し、大規模言語モデルを、指示文に従うように学習させたモデルが、Stanford Universityから提案されたStanford Alpacaと呼ばれるモデルです。デモなどはhuggingfaceで公開されているものが多いため、この記事での掲載は割愛します。
Stanford alpacaは指示文と回答文さえ用意できれば、大規模言語モデルに対して、様々なタスクに特化させたモデルを追加で学習できる柔軟な設計がされています。
ここで、stanford alpacaを商用利用しようとすると、OpenAI社のライセンスに抵触します。OpenAI社は自社が提供するAPIの出力を、OpenAIの競合となるモデルの開発に使用してはいけない、と明記しています。(以下リンクの2.Usage requirementsの(c)Restrictionsの(iii))
従って、Stanford alpacaで学習されているtext-davinci-003
を使った学習データは、研究用途以外で開発する場合はライセンス上アウトであり、別で指示文と回答文を用意したデータセットを作成する必要があります。この課題を解決しようとしているのが今回紹介するGPT4ALLです。
実際にどんなデータを使用しているかは3ページ程のTechnical reportにまとめられていますので、こちらをご参照ください。
今回の記事はGPT4ALLをローカル環境で動かすことを目的に、その手順をまとめていきます。対象言語は英語です。日本語版は自分で作れないかなーと思いながら試行錯誤しています。
動作環境
- Ubuntu 20.04
- Python 3.8.10
動作手順
GPT4ALL自体は、Mac, Windows, Ubuntuそれぞれで実行ファイルを配布してくれているため、以下のコマンドで、コードを一切書かなくても、実行ファイルによるCUI上での動作確認が可能です。
git clone https://github.com/nomic-ai/gpt4all.git
cd gpt4all/chat
./gpt4all-lora-quantized-linux-x86
せっかくオープンソース化を目指しているため、今回はpythonからアクセスする手順を共有します。
手順の概要としては以下の流れになります。
- LLaMAをcppで実装しているリポジトリのpythonバインディングを利用する
- 公開されているGPT4ALLの量子化済み学習済みモデルをダウンロードする
- 学習済みモデルをGPT4ALLに差し替える(データフォーマットの書き換えが必要)
- pyllamacpp経由でGPT4ALLモデルを使用する
PyLLaMACppのインストール
以下のリポジトリからpyllamacpp
ライブラリをインストールします。
git clone --recursive https://github.com/nomic-ai/pyllamacpp && cd pyllamacpp
pip install .
学習済みファイルのダウンロード
以下のリンクから学習済みのモデルをダウンロードします。
以下の学習済みファイルをダウンロードしました。4.2G程あります。gpt4all-lora-quantized-ggml.bin 05-Apr-2023 13:07 4G
ダウンロードしたファイルは機械学習用のテンソルフォーマットggml形式で保存されています。
ggmlフォーマットからggjtフォーマットへの変換
上のバイナリファイルは、2023/04/17時点で、以下のissueに基づいて配布されているggml形式のバイナリファイルをggjt形式に変換しないと動きません。
README.mdにはggmlファイルをダウンロードしてね、とだけ書いてあるのですが、このまま手順通り実行してもエラーが出力されました。closedされたissueからggjt形式に変換するノウハウがありましたので、以下のコードからggjt形式に変換します。変換コードは先ほどcloneしたpyllamacppフォルダの中にあります。python llama.cpp/migrate-ggml-2023-03-30-pr613.py models/gpt4all-lora-quantized-ggml.bin models/gpt4all-lora-quantized_ggjt.bin
変換した学習済みモデルを指定し、プロンプトを入力し続きの文章を生成します。
from pyllamacpp.model import Model
def new_text_callback(text: str):
print(text, end="", flush=True)
model = Model(ggml_model='./models/gpt4all-lora-quantized_ggjt.bin', n_ctx=512)
model.generate("Hello, can you introduce yourself?, ", n_predict=55, new_text_callback=new_text_callback, n_threads=8)
出力例
Hi there! My name is Rebecca and I am currently working as a marketing manager for an IT company. As for my study, I majored in business administration with a focus on marketing during my undergrad
そのまま上記のコードを実行するとllamacppでコーディングされたログ文が大量に出力されてきます。issueでも言及されていましたが、自分の理解不足で弾き方が分からなかったため、今回は出力分の箇所だけ抜粋します。
自己紹介をお願いします、と入力したところ、大学では経営学専攻で現在はIT企業のマーケティングマネージャーをしているレベッカさんが出てきました。文章に一貫性は有りますが知らん人が出てきた、という感想です。私はAIエージェントです、的な回答を期待していました。当然このままだと使えるものではないので、色々と工夫が必要です。
まとめ
今回はGPT4ALLをCPUのみでpythonから実行する手順をまとめました。結果として動くものはあるけどこれから先どう調理しよう、といった印象です。ここからGPT4ALLができることとできないこと、一歩踏み込んで得意なことと不得意なことを把握しながら、言語モデルが得意なことをさらに引き伸ばせるような実装ができればよいなと思います。
余談ですが、学習された大規模言語モデルの知能指数を測るような評価指標があると大規模言語モデルも整備が進むのではと思いました。パラメータ数は知能指数と直感的な比例関係に無いことが近年実装付きで明らかになってきたので、言語モデルの評価にも力を入れていきたいと思います。むしろそちらの方が興味があります。
Discussion