GPT4ALLをCPUのみでpythonから実行する

2023/04/22に公開

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のタスク達成度を一部上回る結果を示しました。
https://arxiv.org/abs/2302.13971

このパラメータ数が小さくなったLLAMAを基に、fine-tuningを行う手法が多く提案されています。最近特に注目されているのが、ユーザーの入力文に従って、適切な応答を返すことができるように学習するInstruction tuningです。さらにその中でも注目を集めているのが、指示文とその回答文を自動で生成することを目的としたself-instructです。
https://arxiv.org/abs/2212.10560

self-instructには言語モデルが必要です。これを、OpenAI社のtext-davinci-003 APIで賄うことにより大量の指示文と回答文を生成し、大規模言語モデルを、指示文に従うように学習させたモデルが、Stanford Universityから提案されたStanford Alpacaと呼ばれるモデルです。デモなどはhuggingfaceで公開されているものが多いため、この記事での掲載は割愛します。
https://crfm.stanford.edu/2023/03/13/alpaca.html

Stanford alpacaは指示文と回答文さえ用意できれば、大規模言語モデルに対して、様々なタスクに特化させたモデルを追加で学習できる柔軟な設計がされています。

ここで、stanford alpacaを商用利用しようとすると、OpenAI社のライセンスに抵触します。OpenAI社は自社が提供するAPIの出力を、OpenAIの競合となるモデルの開発に使用してはいけない、と明記しています。(以下リンクの2.Usage requirementsの(c)Restrictionsの(iii))
https://openai.com/policies/terms-of-use

従って、Stanford alpacaで学習されているtext-davinci-003を使った学習データは、研究用途以外で開発する場合はライセンス上アウトであり、別で指示文と回答文を用意したデータセットを作成する必要があります。この課題を解決しようとしているのが今回紹介するGPT4ALLです。

実際にどんなデータを使用しているかは3ページ程のTechnical reportにまとめられていますので、こちらをご参照ください。
https://s3.amazonaws.com/static.nomic.ai/gpt4all/2023_GPT4All_Technical_Report.pdf

今回の記事はGPT4ALLをローカル環境で動かすことを目的に、その手順をまとめていきます。対象言語は英語です。日本語版は自分で作れないかなーと思いながら試行錯誤しています。

動作環境

  • Ubuntu 20.04
  • Python 3.8.10

動作手順

GPT4ALL自体は、Mac, Windows, Ubuntuそれぞれで実行ファイルを配布してくれているため、以下のコマンドで、コードを一切書かなくても、実行ファイルによるCUI上での動作確認が可能です。
https://github.com/nomic-ai/gpt4all

git clone https://github.com/nomic-ai/gpt4all.git
cd gpt4all/chat
./gpt4all-lora-quantized-linux-x86

せっかくオープンソース化を目指しているため、今回はpythonからアクセスする手順を共有します。
手順の概要としては以下の流れになります。

  1. LLaMAをcppで実装しているリポジトリのpythonバインディングを利用する
  2. 公開されているGPT4ALLの量子化済み学習済みモデルをダウンロードする
  3. 学習済みモデルをGPT4ALLに差し替える(データフォーマットの書き換えが必要)
  4. pyllamacpp経由でGPT4ALLモデルを使用する

PyLLaMACppのインストール

以下のリポジトリからpyllamacppライブラリをインストールします。
https://github.com/nomic-ai/pyllamacpp

git clone --recursive https://github.com/nomic-ai/pyllamacpp && cd pyllamacpp
pip install .

学習済みファイルのダウンロード

以下のリンクから学習済みのモデルをダウンロードします。
https://the-eye.eu/public/AI/models/nomic-ai/gpt4all/
以下の学習済みファイルをダウンロードしました。4.2G程あります。

gpt4all-lora-quantized-ggml.bin                    05-Apr-2023 13:07      4G

ダウンロードしたファイルは機械学習用のテンソルフォーマットggml形式で保存されています。
https://github.com/ggerganov/ggml

ggmlフォーマットからggjtフォーマットへの変換

上のバイナリファイルは、2023/04/17時点で、以下のissueに基づいて配布されているggml形式のバイナリファイルをggjt形式に変換しないと動きません。
https://github.com/ggerganov/llama.cpp/issues/662#issuecomment-1492712443
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