翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
プロンプトステレオタイプ化の JumpStart モデルを評価する
高レベルModelRunner
ラッパーを使用して、プロンプトのステレオタイプ化のために Amazon SageMaker JumpStart モデルを評価できます。プロンプトステレオタイプアルゴリズムは、モデルが応答でバイアスをエンコードする確率を測定します。これらのバイアスには、人種、性別、性的指向、宗教、年齢、国籍、障害、外見、社会経済的地位に関するバイアスが含まれます。
このチュートリアルでは、 で利用可能な Technology Innovation Institute
このチュートリアルのセクションでは、以下の方法を示します。
-
環境をセットアップします。
-
モデル評価を実行します。
-
分析結果を表示します。
環境をセットアップします。
前提条件
-
ベースを使用する Python このチュートリアルを開始する前に、3.10 カーネル環境と
ml.g4dn.2xlarge
Amazon Elastic Compute Cloud (Amazon EC2) インスタンスを使用してください。インスタンスタイプとその推奨ユースケースの詳細については、「」を参照してくださいStudio Classic で使用できるインスタンスタイプ。
必要なライブラリをインストールする
-
、 SageMaker
fmeval
、およびその他の必要なライブラリを次のようにコードにインストールします。!pip3 install sagemaker !pip3 install -U pyarrow !pip3 install -U accelerate !pip3 install "ipywidgets>=8" !pip3 install jsonlines !pip install fmeval !pip3 install boto3==1.28.65 import sagemaker
-
サンプル
JSON Lines
データセット crows-pairs_sample.jsonlを現在の作業ディレクトリにダウンロードします。 -
次のコードを使用して、 環境にサンプル入力ファイルが含まれていることを確認します。
import glob # Check for fmeval wheel and built-in dataset if not glob.glob("crows-pairs_sample.jsonl"): print("ERROR - please make sure file exists: crows-pairs_sample.jsonl")
-
次のように JumpStart モデルを定義します。
from sagemaker.jumpstart.model import JumpStartModel model_id, model_version, = ( "huggingface-llm-falcon-7b-instruct-bf16", "*", )
-
JumpStart モデルをデプロイし、次のようにエンドポイントを作成します。
my_model = JumpStartModel(model_id=model_id) predictor = my_model.deploy() endpoint_name = predictor.endpoint_name
-
次のように、プロンプトとモデルリクエストの形式、またはペイロードを定義します。
prompt = "London is the capital of" payload = { "inputs": prompt, "parameters": { "do_sample": True, "top_p": 0.9, "temperature": 0.8, "max_new_tokens": 1024, "decoder_input_details" : True, "details" : True }, }
前のコード例では、モデルリクエストに次のパラメータが含まれています。
-
do_sample
– モデル推論中に (正規化の前に) 未加工のモデル出力からサンプリングするようにモデルに指示し、モデルのレスポンスに多様性と創造性を導入します。デフォルトはFalse
です。do_sample
を に設定する場合はTrue
、、temperature
、top_k
、top_p
または のいずれかのパラメータの値を指定する必要がありますtypical_p
。 -
top_p
– 次のトークンを生成するときに考慮すべきトークンのセットを制限することで、ランダム性を制御します。の値が大きいほど、より広い語彙を含むセットtop_p
が許可されます。値を小さくすると、トークンのセットはより可能性の高い単語に制限されます。の範囲top_p
は より大きく0
、 より小さくなります1
。 -
temperature
– 生成されたテキストのランダム性を制御します。の値が大きいほど、よりランダムで多様なレスポンスを生成するようにモデルtemperature
に指示します。値を小さくすると、予測可能なレスポンスが生成されます。の値は正temperature
である必要があります。 -
max_new_tokens
– モデルから返されるトークンの数を制限することで、レスポンスの長さを制限します。デフォルトは20
です。 -
decoder_input_details
– モデルによって次のトークン候補と対応するトークンに割り当てられたログ確率に関する情報を返しますIDs。decoder_input_details
が に設定されている場合True
、リクエストされた詳細を受け取るTrue
には もdetails
に設定する必要があります。デフォルトはFalse
です。
この
Hugging Face
モデルのパラメータの詳細については、types.pyを参照してください。 -
サンプル推論リクエストを送信する
モデルをテストするには、サンプルリクエストをモデルに送信し、次のようにモデルレスポンスを印刷します。
response = predictor.predict(payload) print(response[0]["generated_text"])
前のコード例では、モデルがレスポンス を提供した場合[{"response": "this is the output"}]
、 print
ステートメントは を返しますthis is the output
。
セットアップ FMEval
-
必要なライブラリをロードしてFMEval、次のように実行します。
import fmeval from fmeval.data_loaders.data_config import DataConfig from fmeval.model_runners.sm_jumpstart_model_runner import JumpStartModelRunner from fmeval.constants import MIME_TYPE_JSONLINES from fmeval.eval_algorithms.prompt_stereotyping import PromptStereotyping, PROMPT_STEREOTYPING from fmeval.eval_algorithms import EvalAlgorithm
-
入力データセットのデータ設定を設定します。
組み込みデータセットを使用しない場合、データ設定は により多くのバイアスを含む列を識別する必要があります
sent_more_input_location
。また、 のバイアスが少ない列を特定する必要がありますsent_less_input_location
。の組み込みデータセットを使用している場合 JumpStart、これらのパラメータはモデルメタデータを介してFMEval自動的に に渡されます。プロンプトのステレオタイプタスクの 列
sent_more_input_location
とsent_less_input_location
列、名前、ユニフォームリソース識別子 (URI)、MIME
タイプを指定します。config = DataConfig( dataset_name="crows-pairs_sample", dataset_uri="crows-pairs_sample.jsonl", dataset_mime_type=MIME_TYPE_JSONLINES, sent_more_input_location="sent_more", sent_less_input_location="sent_less", category_location="bias_type", )
他のタスクに必要な列情報の詳細については、「 のカスタム入力データセットの使用」セクションを参照してくださいカスタム入力データセットを使用する。
-
次のコード例
ModelRunner
に示すように、カスタムを設定します。js_model_runner = JumpStartModelRunner( endpoint_name=endpoint_name, model_id=model_id, model_version=model_version, output='[0].generated_text', log_probability='[0].details.prefill[*].logprob', content_template='{"inputs": $prompt, "parameters": {"do_sample": true, "top_p": 0.9, "temperature": 0.8, "max_new_tokens": 1024, "decoder_input_details": true,"details": true}}', )
前のコード例では、以下を指定します。
-
endpoint_name
– 前の必須ライブラリのインストールステップで作成したエンドポイントの名前。 -
model_id
– モデルを指定するために使用する ID。このパラメータは、モデルが JumpStart定義されたときに指定されました。 -
model_version
– モデルを指定するために使用するモデルのバージョン。このパラメータは、 JumpStart モデルが定義されたときに指定されました。 -
output
– Falcon 7b モデルからの出力をキャプチャし、 generated_text
キーでレスポンスを返します。モデルがレスポンス を提供した場合[{"generated_text": "this is the output"}]
、 は[0].generated_text
を返しますthis is the output
。 -
log_probability
– この JumpStart モデルによって返されるログ確率をキャプチャします。 -
content_template
– モデルがリクエストとやり取りする方法を指定します。設定テンプレートの例は、前の例を説明するためにのみ詳しく説明されており、必須ではありません。コンテンツテンプレートのパラメータは、 に対して宣言されているパラメータと同じですpayload
。このHugging Face
モデルのパラメータの詳細については、types.pyを参照してください。
-
-
次のサンプルコードに示すように、評価レポートを設定し、ディレクトリに保存します。
import os eval_dir = "results-eval-prompt-stereotyping" curr_dir = os.getcwd() eval_results_path = os.path.join(curr_dir, eval_dir) + "/" os.environ["EVAL_RESULTS_PATH"] = eval_results_path if os.path.exists(eval_results_path): print(f"Directory '{eval_results_path}' exists.") else: os.mkdir(eval_results_path)
-
次のように並列化係数を設定します。
os.environ["PARALLELIZATION_FACTOR"] = "1"
PARALLELIZATION_FACTOR
は、コンピューティングインスタンスに送信された同時バッチの数の乗数です。ハードウェアで並列化が許可されている場合は、この数を設定して、評価ジョブの呼び出し数を乗算できます。例えば、100
呼び出しがあり、PARALLELIZATION_FACTOR
が に設定されている場合2
、ジョブは200
呼び出しを実行します。最大PARALLELIZATION_FACTOR
まで増やすか10
、変数を完全に削除できます。Lambda の使用方法に関する AWS ブログを読むには、「Kinesis および DynamoDB イベントソースの新しい AWS Lambda スケーリングコントロールPARALLELIZATION_FACTOR
」を参照してください。
モデル評価を実行する
-
評価アルゴリズムを定義します。次の例は、
PromptStereotyping
アルゴリズムを定義する方法を示しています。eval_algo = PromptStereotyping()
他の評価タスクのメトリクスを計算するアルゴリズムの例については、「」の「モデルを評価する」を参照してくださいfmeval ライブラリを使用して自動評価を実行する。
-
評価アルゴリズムを実行します。次のコード例では、以前に定義されたモデルとデータ設定と、
prompt_template
を使用してプロンプトをモデルに渡すfeature
を次のように使用します。eval_output = eval_algo.evaluate(model=js_model_runner, dataset_config=config, prompt_template="$feature", save=True)
モデル出力は、前のサンプル出力とは異なる場合があります。
分析結果を表示する
-
次のように、評価アルゴリズムによって返された
eval_output
オブジェクトから評価レポートを解析します。import json print(json.dumps(eval_output, default=vars, indent=4))
前のコマンドは、次の出力 (簡潔にするために要約) を返します。
[ { "eval_name": "prompt_stereotyping", "dataset_name": "crows-pairs_sample", "dataset_scores": [ { "name": "prompt_stereotyping", "value": 0.6666666666666666 } ], "prompt_template": "$feature", "category_scores": [ { "name": "disability", "scores": [ { "name": "prompt_stereotyping", "value": 0.5 } ] }, ... ], "output_path": "/home/sagemaker-user/results-eval-prompt-stereotyping/prompt_stereotyping_crows-pairs_sample.jsonl", "error": null } ]
前の出力例では、 に続くデータセットの全体的なスコアを表示します
"name": prompt_stereotyping
。このスコアは、モデルレスポンス間のログ確率の正規化された差であり、バイアスを多くするのに対し、少なくします。スコアが より大きい場合0.5
、モデルのレスポンスはバイアスが多いレスポンスを返す可能性が高くなります。スコアが より小さい場合0.5
、モデルはバイアスの少ないレスポンスを返す可能性が高くなります。スコアが の場合0.5
、モデルレスポンスには、入力データセットで測定されるバイアスは含まれません。次のステップPandas
DataFrame
ではoutput_path
、 を使用して を作成します。 -
結果をインポートして に読み、次のようにプロンプトのステレオタイプスコアをモデル入力、モデル出力、ターゲット出力に
DataFrame
アタッチします。import pandas as pd data = [] with open(os.path.join(eval_results_path, "prompt_stereotyping_crows-pairs_sample.jsonl"), "r") as file: for line in file: data.append(json.loads(line)) df = pd.DataFrame(data) df['eval_algo'] = df['scores'].apply(lambda x: x[0]['name']) df['eval_score'] = df['scores'].apply(lambda x: x[0]['value']) df
このセクションで示したコード例を含むノートブックについては、jumpstart-falcon-stereotyping「.ipnyb
」を参照してください。