ChatGPT のような LLM モデルの成長に伴い、企業は言語ベースの深層学習アプリケーションの商品化を急いでいます。 Duolingo や Blinkist のような企業は教育用チャット アプリケーションを構築しており、Cocounsel のような企業は文書分析モデルを構築しており、MedGPT のような一部の企業は医療診断などを実行できる専門モデルを構築しています。前回の記事で、ChatGPT を使用してエンジニアリングを促進し、パワー ドキュメント アナライザーを構築する方法について書きました。
より強力でドメイン固有の LLM アプリケーションをサポートするために、テクノロジー プロバイダーは多くのクラウド ソリューションを利用可能にしました。たとえば、ChatGPT を開発した OpenAI は、シンプルだが強力な微調整 API をユーザーが利用できるようにし、ユーザーが GPT3 テクノロジーに基づいて独自の言語モデルを構築できるようにしました。 Google も負けじと、GPT 3 や GPT 3.5 の有力な競合相手として広く考えられているバイソンテキスト モデルを、Google Cloud プラットフォームを通じて微調整できるようにしました。前回の記事では、微調整 API を使用してドメイン エキスパート LLM を作成する方法について書きました。
これらのサービスは強力ですが、LLM テクノロジーへの本格的な投資を検討している企業は、オープンソース テクノロジーから独自のモデルをトレーニングする方法を学ぶ必要があるでしょう。これらのベンダー提供のエンドポイントを使用する場合と比較して、独自のモデルをトレーニングすることには次の利点があります。
この記事では、人気があり有能なオープンソース LLM モデルを取り上げ、前の記事で行ったのと同様に独自のデータでトレーニングし、結果を検証します。私たちが取り組んでいる例は非営利であり、公開情報に基づいていますが、このテクニックは商業的な取り組みにも簡単に応用できます。この記事で解決する問題を定義する「エキスパート LLM モデル」セクションで、この手法を使用してどのような商用アプリケーションを構築できるかについての具体的な提案を詳しく掘り下げます。
今日の実験では、Google がリリースした大規模言語モデルである Flan-T5 Large を利用します。これは Bard の基礎となるテクノロジーではありませんが、このモデルは GPT ベースのテクノロジーと競合すると広く考えられています。ただし、Flan T5 モデルの素晴らしい点は、GPT ベースのモデルよりもはるかに少ないパラメーターを使用して満足のいく結果が得られることです。たとえば、モデルの XL バージョンでさえ、パラメーターが 1,750 億個ある GPT3 と比較して、30 億個しかありません。
このコンパクトさの結果、これらのモデルをクラウド コンピューティング資産にトレーニングして保存するのが比較的安価になります。さらに、Flan-T5 ファミリのモデルは Apache ライセンスとともにリリースされているため、商用利用が可能であり、他のオープンソース LLM に伴う潜在的なライセンスの問題が軽減されます。たとえば、Facebook の LLaMa は依然として研究および非営利目的でのみ利用できます。
この記事を書くために、私はテクノロジーの有効性をテストするために、いくつかの異なるクラスのタスクを実験しました。一般に、Flan-T5、特に XL バリアントは、市販されている GPT モデルの一部と同様の優れた自然言語理解機能を備えているようです。ただし、このモデルは抽象的な接続を描画する場合に若干不十分であり、長い出力を生成する際に問題が発生します。したがって、適切なタスクに対して適切なモデルを選択するように注意する必要があります。
Replicate は、大規模な AI モデルのトレーニングと実行用の GPU を手頃な価格でレンタルできるサービスとしてのプラットフォーム企業です。同社の AI モデル管理ツール スイートを使用すると、ユーザーはサーバー リソースの管理ではなく、データの操作に集中できます。
この記事を書くために、AWS SageMaker、Google Colab、PaperSpace Gradient など、いくつかの AI トレーニング PaaS 製品を試しました。 Replicate は、これまでで最も使い始めるのが簡単なプラットフォームであり、前述した他のサービスと比べて非常に競争力のある価格設定を提供しました。
Python はデータ エンジニアリングの共通語です。広範なエコシステムにより、プログラマーはデータを迅速に取り込み、分析、処理できます。ほとんどの主要な AI トレーニング プラットフォームは Python を第一級にサポートしているため、私たちの仕事ははるかに簡単になります。 Replicate の優れた統合により、今日はすべてのコードを Python で記述します。
Flan-T5 ファミリのモデルはテキストを生成するよりもテキストを理解する方がはるかに優れているため、入力は多く、出力は軽いタスクを選択したいと考えています。自然言語分類子はこの種のシナリオに最適なユースケースであるため、今日は劇作家識別子を構築します。具体的には、モデルにウィリアム シェイクスピアまたはアントン チェーホフの一節を与え、文体と言葉の選択に基づいて劇作家を特定するようにモデルに教えることができるかどうかを確認します。
もちろん、これは公開チュートリアルであるため、公開され、簡単にアクセスできるデータを含むモデルを意図的に選択しています。ただし、これは商業的な文脈に簡単に適応できます。自然言語分類子が役立つ例をいくつか示します。
トレーニング データを作成するには、Project Gutenberg からアントン チェーホフとウィリアム シェイクスピアの戯曲をダウンロードします。データの取り込みを設定するには、次の Python スクリプトを実行します。
import requests import openai import replicate import os import pandas as pd import random texts = { 'chekhov': 'https://www.gutenberg.org/files/7986/7986-0.txt', 'chekhov_2': 'https://www.gutenberg.org/cache/epub/1755/pg1755.txt', 'shakespeare_midsummer': 'https://www.gutenberg.org/cache/epub/1514/pg1514.txt', 'shakespeare_romeo_juliet': 'https://www.gutenberg.org/cache/epub/1112/pg1112.txt', 'shakespeare_macbeth': 'https://www.gutenberg.org/cache/epub/2264/pg2264.txt', 'shakespeare_hamlet': 'https://www.gutenberg.org/cache/epub/2265/pg2265.txt', }
次に、トレーニング データ フォルダーを作成し、テキストをダウンロードします。
if not os.path.exists('training_text'): os.mkdir('training_text') for name, url in texts.items(): print(name) res = requests.get(url) with open(os.path.join('training_text', '%s.txt' % name), 'w') as fp_write: fp_write.write(res.text)
成功したことを示す次のような出力が表示されるはずです。
chekhov chekhov_2 shakespeare_midsummer shakespeare_romeo_juliet shakespeare_macbeth Shakespeare_hamlet
また、training_text フォルダーをチェックして、ファイルが適切にダウンロードされたことを確認することもできます。
次に、これらのファイルをメモリに読み込み、行のリストに分割します。その際に、各ファイルの行数を数えます。
lines_by_file = {} for fn in os.listdir('training_text'): if not fn.endswith('.txt'): continue with open(os.path.join('training_text', fn)) as fp_file: lines_by_file[fn.split('.')[0]] = '\n'.join(fp_file.readlines()) print(fn, len(lines_by_file[fn.split('.')[0]]))
以下のような出力が表示されるはずです。
shakespeare_midsummer.txt 120198 shakespeare_romeo_juliet.txt 179726 shakespeare_macbeth.txt 140022 shakespeare_hamlet.txt 204169 chekhov.txt 419063 chekhov_2.txt 148324
ここからが楽しい部分です。行を実際のトレーニング データに分割したいと考えています。これを行うには、まず最初と最後の 1,000 行を削除します。これらの行は、導入部、ヘッダー、およびフッターのコンテンツによって占められています。次に、残りのテキストを一度に 50 行ずつ取得します。次に、50 行をプロンプトと完了のペアに変換します。
train_data = [] for k in lines_by_file: is_chekhov = 'chekhov' in k useful_lines = lines_by_file[k].split('\n')[1000:-1000] prompt_fmt = "Which playwright wrote the following passage? \n ==== \n %s \n ====" for i in range(0, len(useful_lines), 50): training_set = useful_lines[i: i+50] train_data.append({ 'prompt': prompt_fmt % '\n'.join(training_set), 'completion': 'Anton Chekhov' if is_chekhov else 'William Shakespeare' })
これで、問題が明確に定義されました。戯曲のテキストが 50 行あるとすると、その劇作家がアントン・チェコフなのかウィリアム・シェイクスピアなのかを判断します。まだ終わっていません。トレーニングのためにデータを jsonl (JSON Lines) 形式に書き込む必要があります。また、テスト目的でいくつかのサンプルを予約したいと考えています。次のようにコードを実行します。
df = pd.DataFrame(train_data) df_chekhov = df[df['completion'] == 'Anton Chekhov'] df_shakespeare = df[df['completion'] == 'William Shakespeare'] chekhov_test_indices = random.sample(df_chekhov.index.tolist(), 15) shakespeare_test_indices = random.sample(df_shakespeare.index.tolist(), 15) df_chekhov_test = df_chekhov.loc[chekhov_test_indices] df_shakespeare_test = df_shakespeare.loc[shakespeare_test_indices] df_chekhov_train = df_chekhov.loc[[i for i in df_chekhov.index if i not in chekhov_test_indices]] df_shakespeare_train = df_shakespeare.loc[[i for i in df_shakespeare.index if i not in shakespeare_test_indices]] pd.concat([df_chekhov_train, df_shakespeare_train]).to_json('chekhov_shakespeare_train.jsonl', orient='records', lines=True) pd.concat([df_chekhov_test, df_shakespeare_test]).to_json('chekhov_shakespeare_test.jsonl', orient='records', lines=True)
もちろん、コーパス全体をトレーニングに使用したい場合は、次のように実行できます。
pd.DataFrame(train_data).to_json('output.jsonl', orient='records', lines=True)
。
トレーニングを呼び出す前に、2 つのことを行う必要があります。まず、レプリケートによってアクセスできる場所にトレーニング データをアップロードする必要があります。これを行う非常に簡単な方法の 1 つは、ファイルを Google Cloud バケットにアップロードし、バケットとファイルを公開して、 https://storage.googleapis.com/<bucket_name>/<file_name>
の形式で URL を指定することです。 https://storage.googleapis.com/<bucket_name>/<file_name>
。
次に、宛先を作成する必要があります。これを行うには、Replicate にログインし (Github OAuth を通じて実行できます)、新しいモデルを作成します。モデルを作成して名前を付けると、モデルをこのスペースにプッシュできるようになります。
すべての設定が完了したら、次のようにトレーニングを開始できます。
training = replicate.trainings.create( version="[flant5-large location]", input={ "train_data": "[Data Location]", }, destination="[Destination]" ) print(training)
トレーニングが開始されたことを示す出力が表示されるはずです。数分待ってから、次のコードを実行してトレーニングを再度確認してください。
training.reload() print(training)
Replicate Web サイトでトレーニングの進行状況を監視することもできます。トレーニングが完了したら、トレーニング オブジェクトをリロードして出力名を取得し、次のステップに進むことができます。
GPU リソースが不足する時間帯があり、「トレーニングに失敗しました」というエラーが発生する可能性があることに注意してください。この問題が発生した場合は、数時間待ってからもう一度試してください。 GPU が不足しており、PaaS プロバイダーも無縁ではありません。
よし!微調整されたモデルが完成したので、それをテストする必要があります。チェーホフとシェイクスピアの 15 節をテスト用に予約したことを思い出してください。ここでは次のように使用できます。
for _, row in df_chekhov_test.iterrows(): output = replicate.run( training.output["version"], input={"prompt": row['prompt']} ) for s in output: print(s, end="", flush=True) print('')
短い起動時間の後、出力がコンソールに表示されるはずです。モデルは非常に正確であり、毎回「Anton Chekhov」を返す必要があります。シェイクスピアでこれを試してみましょう:
for _, row in df_shakespeare_test.iterrows(): output = replicate.run( training.output["version"], input={"prompt": row['prompt']} ) for s in output: print(s, end="", flush=True) print('')
チェーホフの例と同様に、モデルが常にシェイクスピアを識別できることがわかります。
適切な測定のために、基本モデルがシェイクスピアまたはチェーホフを識別できるかどうかを確認してみましょう。
for _, row in df_shakespeare_test.iterrows(): output = replicate.run( "[base flant5-large location]", input={"prompt": row['prompt']} ) for s in output: print(s, end="", flush=True) print('') for _, row in df_chekhov_test.iterrows(): output = replicate.run( "[base flant5-large location]", input={"prompt": row['prompt']} ) for s in output: print(s, end="", flush=True) print('')
基本モデルでは、同じパッセージの劇作家を確実に識別できないことがわかります。これは、微調整によってモデルに新しい情報が確実に与えられ、自然言語劇作家の分類器を独自に構築したことを示しています。
今日の記事では、Google が提供する大規模な言語モデルである Flan-T5 に基づいて単純な自然言語分類器をトレーニングしました。 Flan-T5 は、コンパクトなサイズと寛容なライセンスにより、プライベート インフラストラクチャ上でトレーニングおよび展開することができ、ChatGPT など、市場で人気のある他の多くのモデルとは一線を画しています。
今日の例は公開データに基づいており、明らかに非商用でしたが、この概念実証は、上で概説した他の多くの商用アプリケーションに簡単に適用できます。 LLM を使って実現してほしいアイデアがある場合は、私のGitHubまたはLinkedInページにアクセスして、お気軽に会話を始めてください。また、 ChatGPT を使用したドキュメント アナライザーの構築や、 OpenAI の Fine Tuning API を使用したドメイン エキスパート LLM の作成など、私の以前の LLM 記事もお読みください。
ハッピーハッキング!