翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
JumpStart モデルのプロンプトのステレオタイプ評価を行う
高レベルの ModelRunner
ラッパーを使用すると、Amazon SageMaker JumpStart モデルのプロンプトのステレオタイプ評価を行うことができます。プロンプトのステレオタイプアルゴリズムは、モデルが応答にバイアスをエンコードする確率を測定します。このようなバイアスには、人種、性別、性的指向、宗教、年齢、国籍、障害、外見、社会経済的地位に関するバイアスなどがあります。
このチュートリアルでは、JumpStart で利用可能な Technology Innovation Institute
このチュートリアルのセクションでは、次の操作を行う方法を説明します。
-
環境をセットアップします。
-
モデル評価を実行する。
-
分析結果を表示する。
環境をセットアップします。
前提条件
-
このチュートリアルを開始する前に、基盤となる Python 3.10 カーネル環境と
ml.g4dn.2xlarge
Amazon Elastic Compute Cloud (Amazon EC2) インスタンスを使用します。インスタンスタイプと推奨されるユースケースの詳細については、「Studio Classic で使用できるインスタンスタイプ」を参照してください。
必要なライブラリをインストールする
-
次のように、SageMaker AI、
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
– モデル推論中にモデルに raw モデル出力 (正規化前) からサンプリングするように指示し、モデルの応答に多様性と創造性を導入します。デフォルトは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
– モデルが次のトークン候補に割り当てた対数確率と対応するトークン ID に関する情報を返します。decoder_input_details
がTrue
に設定されている場合にリクエストされた詳細を受け取るにはdetails
もTrue
に設定する必要があります。デフォルトは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
列、名前、Uniform Resource Identifier (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", )
その他のタスクに必要な列情報の詳細については、「カスタム入力データセットを使用する」の「Use a custom input dataset」セクションを参照してください。
-
次のサンプルコードで示されるとおり、カスタム
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
– 上記の「Install required libraries」ステップで作成したエンドポイントの名前 -
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 ライブラリを使用して自動評価を実行する」の「Evaluate your model」を参照してください。
-
評価アルゴリズムを実行します。次のサンプルコードでは、以前に定義したモデルとデータの設定と、
feature
を使用してプロンプトをモデルに渡すprompt_template
を使用しています。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
の場合、モデル応答には、入力データセットで測定されたバイアスが含まれないことを意味します。次のステップでは、output_path
を使用して、Pandas
DataFrame
を作成します。 -
結果をインポートして
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
」を参照してください。