「Amazon SageMaker JumpStartを使用したスケーラブルなテキスト埋め込みと文の類似性検索」
「スケーラブルなテキスト埋め込みと文の類似性検索を実現するためのAmazon SageMaker JumpStartの活用方法」
テキストベクトルまたは埋め込みは、大規模な言語モデル(LLM)によって生成される、テキストの数値ベクトル表現です。LLMは、テキストの補完、質問応答、翻訳などのさまざまなタスクから大規模なデータセットで事前にトレーニングされた後、テキスト埋め込みは入力テキストの意味情報を捉えます。テキスト埋め込みにより、類似度検索、情報検索、推薦と個別化、多言語翻訳など、さまざまな下流アプリケーションが可能になります。
テキスト埋め込みからインテリジェントなアプリケーションを構築する前に、企業や組織は既存のドキュメントを埋め込む必要がありましたが、これは高額で技術的に複雑な作業です。 Amazon SageMaker JumpStartは、この旅を加速するための機械学習(ML)ハブです。SageMaker JumpStartを使用すると、Hugging Face、AI 21 Labs、Cohere、Meta AIなどのさまざまなモデルプロバイダから事前トレーニング済みの先進的なテキスト埋め込みモデルにアクセスできます。SageMaker JumpStartのユーザーインターフェースまたはSDKを使用して、これらのモデルを本番環境にシームレスに展開できます。また、基になるモデルのトレーニングにはデータが使用されません。すべてのデータは暗号化され、独自のVPCから出て行かないため、データはプライベートかつ機密性が保たれます。
この記事では、SageMaker Python SDKを使用してテキスト埋め込みと文の類似性をどのように使用するかを実演します。文の類似性は、LLMによって埋め込みに変換された後の2つのテキストの類似度を評価することを意味し、検索増強型生成(RAG)などのアプリケーションの基礎ステップです。次の操作を実演します。
- SageMaker JumpStartから展開されたテキスト埋め込みモデルで推論を実行する
- 独自のデータセットに対して入力文の最も近い隣接点を見つける
- 大規模なドキュメントにバッチ変換を実行してコストを最小化する
すべてのコードは GitHubで入手できます。
- 「MATLABとAmazon SageMakerによる機械学習」
- Amazon MusicはSageMakerとNVIDIAを使用してMLの訓練および推論のパフォーマンスとコストを最適化しています
- NVIDIAは、Generative AIを用いて薬物探索を加速させるためにGenentechと協力
SageMaker JumpStartを使用してテキスト埋め込みモデルを展開する
Amazon SageMakerでモデルをホストするための最初のステップは、AWSサービスのセットアップと認証を行うことです。 Amazon SageMaker Studioでは、ノートブックインスタンスに関連付けられた実行ロールを使用します。次のコードを参照してください:
import sagemaker, boto3, json
from sagemaker.session import Session
sagemaker_session = Session()
aws_role = sagemaker_session.get_caller_identity_arn()
aws_region = boto3.Session().region_name
sess = sagemaker.Session()
Hugging Faceでは、Massive Text Embedding Benchmark(MTEB)がさまざまなテキスト埋め込みタスクのリーダーボードとして提供されています。現在、113の言語で8つの異なるタスクにわたる129のベンチマークデータセットが提供されています。MTEBのトップテキスト埋め込みモデルは、bge
、gte
、e5
などを含めてSageMaker JumpStartから利用できます。この記事では、huggingface-sentencesimilarity-bge-large-en
を使用します。SageMaker SDKを使用して、最先端のテキスト埋め込みモデルを展開できます:
from sagemaker.jumpstart.model import JumpStartModel
model_id = "huggingface-sentencesimilarity-bge-large-en"
text_embedding_model = JumpStartModel(model_id=model_id)
predictor = text_embedding_model.deploy()
テキスト埋め込みモデルのクエリ
テキスト埋め込みモデルのクエリについて詳しく見てみましょう。
テキストから埋め込みへ
SageMakerエンドポイントをすでに展開している場合、predictor
は次のように復元できます:
from sagemaker.predictor import Predictor
from sagemaker.deserializers import JSONDeserializer
from sagemaker.serializers import IdentitySerializer
predictor = Predictor(
endpoint_name=<YOUR_ENDPOINT_NAME>,
deserializer=JSONDeserializer(),
serializer=IdentitySerializer(),)
predictor.content_type = "application/x-text"
モデルが正常に展開された後、JSONペイロード内の一連の入力テキストでエンドポイントをクエリできます:
sentences = [ # ペット "あなたの犬はとてもかわいいです。", "どれくらいかわいいあなたの犬です!", "あなたはとてもかわいい犬を持っています!", # 都市 "シドニーは私が働く場所です。", "私はシドニーで働いています。", # 色 "あなたは一番好きな色は何ですか?", "あなたのお気に入りの色は何ですか?",]predictor.predict(json.dumps(sentences).encode('utf-8'))
これらの文の埋め込みの相関関係は、以下の図にプロットされています。
前の図に示されているように、同じ主題は自身の内部で高い相関を持ち、Pets
、Cities
、およびColor
を含みます。異なる主題は非常に異なります。これは、LLMs(この場合、bge
)によって生成された埋め込みが意味情報を正確に表現できることを示しています。
この記事では、SageMaker JumpStartから現在利用可能なさまざまな文埋め込みモデル間のレイテンシーを比較しました。レイテンシーとは、ユーザーがリクエストを送信してからアプリケーションがリクエストが完了したことを示すまでの時間のことです。以下のテーブルの数値は、ml.g5.2xlarge
およびml.c6i.xlarge
インスタンスで同じ一連の入力テキストを使用して合計100回リクエストした場合の平均レイテンシーを示しています。
モデル | g5.2xlarge 平均レイテンシー(ms) | c6i.xlarge 平均レイテンシー(ms) | 言語サポート |
---|---|---|---|
all-MiniLM-L6-v2 | 19.5 | 27.9 | 英語 |
BGE Base En | 21.2 | 114 | 英語 |
BGE Small En | 28.3 | 45.6 | 英語 |
BGE Large En | 34.7 | 337 | 英語 |
Multilingual E5 Base | 22.1 | 118 | 多言語 |
Multilingual E5 Large | 39.8 | 360 | 多言語 |
E5 Base | 25.6 | 117 | 英語 |
E5 Base V2 | 25.2 | 123 | 英語 |
E5 Large | 32.2 | 339 | 英語 |
E5 Large V2 | 32.5 | 331 | 英語 |
GTE Base | 22.2 | 112 | 英語 |
GTE Small | 19.7 | 46 | 英語 |
GTE Large | 39.7 | 347 | 英語 |
最寄りの近傍を取得する
SageMaker JumpStartから展開されるモデルは、クエリ内のコーパスへの最寄りの近傍を特定するプロセスを支援することもできます。クエリとコーパスが提供されると、モデルはcorpus_id
(入力コーパスリスト内の関連するコーパスエントリの位置を示す)とクエリへの近さを示すスコアを生成します。以下のパラメータを使用します:
- corpus – 最寄りの近傍を見つけるための入力リストを提供します
- queries – コーパスから最寄りの近傍を見つけるための入力リストを提供します
- top_k – コーパスから見つける最寄りの近傍の数
- mode – コーパス内の入力クエリに対して最寄りの近傍を取得するために
nn_corpus
として設定されます
以下のコードを参照してください:
corpus = [ "Amazon SageMakerは、完全に管理されたサービスであり、データの準備、構築、トレーニング、展開、あらゆるユースケースの機械学習(ML)モデルを完全に管理されたインフラストラクチャ、ツール、ワークフローで行うことができます。", "Amazon SageMakerは、MLストレージボリュームにコードを格納し、セキュリティグループで保護し、必要に応じて静止状態で暗号化することができます。", "Amazon SageMakerはフルエンドツーエンドのワークフローを提供しますが、既存のツールをSageMakerと共に使用することもできます。各ステージの結果をSageMakerの内外に簡単に転送でき、ビジネスの要件に従います。"
]queries = [ "Amazon SageMakerとは何ですか?", "Amazon SageMakerはコードをどのように保護していますか?", "自社のノートブック、トレーニング、またはホスティング環境がある場合はどうすればよいですか?"
]payload_nearest_neighbor = {"corpus": corpus, "queries": queries, "top_k": 3, "mode": "nn_corpus"}query_response = predictor.predict(payload_nearest_neighbor)
以下の出力が得られます:
[ [ {'corpus_id': 0, 'score': 0.8992230892181396}, {'corpus_id': 2, 'score': 0.8664969205856323}, {'corpus_id': 1, 'score': 0.8456423282623291} ], [ {'corpus_id': 1, 'score': 0.8919335603713989}, {'corpus_id': 0, 'score': 0.840064525604248}, {'corpus_id': 2, 'score': 0.8145401477813721} ], [ {'corpus_id': 2, 'score': 0.7712811231613159}, {'corpus_id': 1, 'score': 0.7564010620117188}, {'corpus_id': 0, 'score': 0.7525666356086731} ]]
この結果は、最初のクエリが最初のコーパスに最も類似していること、2番目のクエリが2番目のコーパスに近いこと、そしてそれ以降の順番に対応していることを意味します。この例では正しい一致です。
また、前のサンプルを使用して、SageMaker JumpStartで現在利用可能なさまざまな文埋め込みモデル間のレイテンシを比較しました。「ml.g5.2xlarge
」インスタンスと「ml.c6i.xlarge
」インスタンスで同じペイロードを使用した100回のリクエストの平均レイテンシーを示しています。
モデル | g5.2xlarge 平均レイテンシー(ms) | c6i.xlarge 平均レイテンシー(ms) | 言語サポート |
---|---|---|---|
all-MiniLM-L6-v2 | 21.7 | 69.1 | 英語 |
BGE Base En | 29.1 | 372 | 英語 |
BGE Small En | 29.2 | 124 | 英語 |
BGE Large En | 47.2 | 1240 | 英語 |
Multilingual E5 Base | 30 | 389 | 多言語 |
Multilingual E5 Large | 47.1 | 1380 | 多言語 |
E5 Base | 30.4 | 373 | 英語 |
E5 Base V2 | 31 | 409 | 英語 |
E5 Large | 45.9 | 1230 | 英語 |
E5 Large V2 | 49.6 | 1220 | 英語 |
GTE Base | 30.3 | 375 | 英語 |
GTE Small | 28.5 | 129 | 英語 |
GTE Large | 46.6 | 1320 | 英語 |
大規模データセットで最も近い隣人を取得する
SageMakerの呼び出しエンドポイントへのリクエストでは、ペイロードは約5MBに制限され、リクエストのタイムアウトは1分に設定されています。コーパスのサイズがこれらの制限を超える場合、SageMakerのトレーニングジョブを使用して、大規模データセットの埋め込みを生成し、モデルとともにSageMakerエンドポイント内に保存することができます。したがって、それらは呼び出しのペイロードの一部として渡す必要はありません。最も近い隣人を見つけるプロセスは、SentenceTransformerとそのユーティリティ関数を使用して行われます。最も近い隣人は、入力文の埋め込みとトレーニングジョブ中に事前計算された文の埋め込みとのコサイン類似度に基づいています。
次の例では、入力の質問に最も近い隣人を見つけるために、Amazon_SageMaker_FAQs
データセットを取得して準備します:
!aws s3 cp s3://jumpstart-cache-prod-us-west-2/training-datasets/Amazon_SageMaker_FAQs/Amazon_SageMaker_FAQs.csv Amazon_SageMaker_FAQs.csvimport pandas as pddata = pd.read_csv("Amazon_SageMaker_FAQs.csv", names=["Questions", "Answers"])data["id"] = data.indexdata_req = data[["id", "Answers"]]data_req.to_csv("data.csv", index=False, header=False)output_bucket = sess.default_bucket()output_prefix = "jumpstart-example-ss-training"s3_output_location = f"s3://{output_bucket}/{output_prefix}/output"training_dataset_s3_path = f"s3://{output_bucket}/{output_prefix}/data/data.csv"!aws s3 cp data.csv {training_dataset_s3_path}
アルゴリズム固有のトレーニングハイパーパラメータは、SageMaker SDKから取得または上書きすることができます:
from sagemaker import hyperparametershyperparameters = hyperparameters.retrieve_default(model_id=model_id, model_version = "*")hyperparameters["batch_size"] = "64"print(hyperparameters)>>> {'max_seq_length': 'None', 'batch_size': '64', 'store_text_with_embedding': 'True'}
SageMakerのトレーニングは、エスティメータオブジェクトを作成し、トレーニングジョブを開始するという2つのステップで構成されます。出力は、トレーニングデータとして使用される大規模データセットの埋め込みが付いたモデルであり、任意の入力文の最も近い隣人を取得するためにデプロイできます。以下のコードを参照してください:
from sagemaker.jumpstart.estimator import JumpStartEstimatorestimator = JumpStartEstimator( model_id=model_id, hyperparameters=hyperparameters, output_path=s3_output_location)estimator.fit( {"training": f"s3://{output_bucket}/{output_prefix}/data"})predictor = estimator.deploy()
テキストを埋め込みに変換するためのクエリ構文は以前と同じです。ただし、最も近い隣人を取得するためのコードは、以下のように簡略化できます:
payload_nearest_neighbour = { "queries": ["Amazon SageMakerでRをサポートしていますか?"], "top_k": 1, "mode": "nn_train_data",}response = predictor.predict(payload_nearest_neighbour)>>> [[{'id': '9', 'score': 0.9240573048591614}]]data["Answers"].iloc[int(response[0][0]["id"])]>>> "はい、Amazon SageMakerはRをサポートしています。SageMakerノートブックインスタンス内でRを使用することができます。それには、事前にインストールされたRカーネルとreticulateライブラリが含まれています。Reticulateは、Amazon SageMaker Python SDKのRインターフェースを提供し、MLプラクティショナーがRモデルを構築、トレーニング、調整、展開することができます。"
Amazon_SageMaker_FAQs
データセットの質問でエンドポイントにクエリを行い、正しい対応する回答がいくつ返されるかを比較することもできます。以下の例では、トップ3の精度を測定し、似たような質問回答のペアがある場合を考慮しています。つまり、正しい回答がトップ3のうちの1つとして返された場合、正しいクエリとして扱われます。
total_correct_answers = 0for i in range(len(data)): question = data["Questions"].iloc[i] payload_nearest_neighbor = { "queries": [question], "top_k": 3, "mode": "nn_train_data", } response = predictor.predict(payload_nearest_neighbor) response_ids = [int(res["id"]) for res in response[0]] if i in response_ids: total_correct_answers += 1 else: pred_answer = [data["Answers"].iloc[response_id] for response_id in response_ids]print(total_correct_answers*100/len(data))>>>81.16883116883118
大規模データセット上で埋め込みを取得するためのバッチ変換を実行する
単一エンドポイントインスタンスのメモリを超える大量の歴史的文書を保持する企業や組織では、コストを節約するためにSageMakerバッチ変換を利用することができます。バッチ変換ジョブを開始すると、SageMakerは必要な計算リソースを起動してデータを処理します。ジョブ中、SageMakerは計算リソースを自動的にプロビジョニングおよび管理します。バッチ変換ジョブが完了すると、これらのリソースは自動的にクリーンアップされ、コストを最小限に抑えることができます。大規模データセットをより小さなチャンクに分割し、より多くのインスタンスを使用することで、インフラストラクチャの管理はせずに、同様のコストでより高速な推論をスケールアウトすることができます。バッチ変換の最大ペイロードは100 MBで、タイムアウトは1時間です。
バッチ変換ジョブの入力形式は、JSON行リスト(JSONの1行がエントリとなる形式)であり、id
とtext_inputs
から構成されます。以下のコードを参照してください:
test_data_file_name = "test.jsonl"test_data = []for i in range(len(data)): answer = data.loc[i, "Answers"] payload = {"id": i, "text_inputs": answer} test_data.append(payload)with open(test_data_file_name, "w") as outfile: for entry in test_data: outfile.write(f"{json.dumps(entry)}\n")s3 = boto3.client("s3")s3.upload_file(test_data_file_name, output_bucket, f"{output_prefix}/batch_input/test.jsonl")
データが Amazon Simple Storage Service (Amazon S3) に準備されたら、SageMaker JumpStart モデルからバッチ変換オブジェクトを作成し、変換ジョブを開始します:
s3_input_data_path = f"s3://{output_bucket}/{output_prefix}/batch_input/"s3_output_data_path = f"s3://{output_bucket}/{output_prefix}/batch_output/"batch_transformer = text_embedding_model.transformer( instance_count=1, instance_type="ml.p3.2xlarge", output_path=s3_output_data_path, assemble_with="Line", accept="text/csv", max_payload=1,)batch_transformer.transform( s3_input_data_path, content_type="application/jsonlines", split_type="Line")batch_transformer.wait()
バッチ変換ジョブが完了したら、Amazon S3 から結果をダウンロードすることができます:
s3 = boto3.client("s3")s3.download_file( output_bucket, output_prefix + "/batch_output/" + "test.jsonl.out", "predict.jsonl")with open("predict.jsonl", "r") as json_file: json_list = list(json_file)
結論
SageMaker JumpStart は、テキスト埋め込みやセマンティック検索のための先進的な大規模言語基盤モデルを簡単に利用する方法を提供します。ユーザーインターフェースまたはわずかなコード行を使用して、高精度なテキスト埋め込みモデルを展開し、大規模データセットでセマンティックマッチを見つけ、スケールとコストの効率性が向上します。SageMaker JumpStart は、MTEBリーダーボード上でベンチマークされたモデルなど、最先端のモデルへの即時アクセスを提供することで、セマンティック検索の実装の障壁を取り除きます。ビジネスや開発者は、より高速にインテリジェントな検索や推薦システムを構築することができます。
この記事では、類似の意味を持つ質問と回答の検索方法を紹介しました。これは、RAGユースケース、推奨およびパーソナライゼーション、多言語翻訳などに適用することができます。言語モデルの進化とSageMaker JumpStartのシンプルさにより、より多くの組織が生成的なAI機能を製品に組み込むことができます。次のステップとして、独自のデータセットでSageMaker JumpStartのテキスト埋め込みモデルを試し、RAGユースケースに対して結果をテストおよびベンチマークしてみることができます。
We will continue to update VoAGI; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles
- 「基本的なアルゴリズムと機械学習の最新のアルゴリズムを使用して、コンピュータ科学の問題に取り組む」
- 「13/11から19/11までの週の最も重要なコンピュータビジョンの論文トップです」
- 「LanguageChainを使用して大規模言語モデルをあなたのソフトウェアとうまく連携させる方法」
- ユレカ:大規模な言語モデルをコーディングすることによる人間レベルの報酬設計
- 「OpenAI Dev Day 2023 創設者サム・オルトマンの基調講演からの4つの重要発表、見逃せません!」
- このAI論文では、マルチビューの冗長性を超えるための新しいマルチモーダル表現学習手法であるFACTORCLを提案しています
- アマゾンセージメーカースタジオを使用して、素早い実験結果のためにLlama 2、LangChain、およびPineconeを使用してRAG型の質問応答ソリューションを構築しましょう