

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# JumpStart モデルのプロンプトのステレオタイプ評価を行う
<a name="clarify-foundation-model-evaluate-auto-tutorial-one"></a>

高レベルの `ModelRunner` ラッパーを使用すると、Amazon SageMaker JumpStart モデルのプロンプトのステレオタイプ評価を行うことができます。プロンプトのステレオタイプアルゴリズムは、モデルが応答にバイアスをエンコードする確率を測定します。このようなバイアスには、人種、性別、性的指向、宗教、年齢、国籍、障害、外見、社会経済的地位に関するバイアスなどがあります。

このチュートリアルでは、JumpStart で利用可能な [Technology Innovation Institute](https://www.tii.ae/) の [Falcon 7-B](https://huggingface.co/tiiuae/falcon-7b) モデルをロードして、このモデルにプロンプトへの応答の生成をリクエストする方法を説明します。このチュートリアルではその後、組み込みの [CrowS-Pairs](https://github.com/nyu-mll/crows-pairs) Open Source Challenge データセットに対するプロンプトのステレオタイプの応答を評価する方法を説明します。

このチュートリアルのセクションでは、次の操作を行う方法を説明します。
+ 環境をセットアップします。
+ モデル評価を実行する。
+ 分析結果を表示する。

## 環境をセットアップする
<a name="clarify-foundation-model-evaluate-auto-tutorial-one-setup"></a>

**前提条件**
+ このチュートリアルを開始する前に、基盤となる Python 3.10 カーネル環境と `ml.g4dn.2xlarge` Amazon Elastic Compute Cloud (Amazon EC2) インスタンスを使用します。

  インスタンスタイプと推奨されるユースケースの詳細については、「[Amazon SageMaker Studio Classic ノートブックで使用できるインスタンスタイプ](notebooks-available-instance-types.md)」を参照してください。

**必要なライブラリをインストールする**

1. 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
   ```

1. サンプル `JSON Lines` データセットの [crows-pairs\_sample.jsonl](https://github.com/aws/fmeval/blob/main/examples/crows-pairs_sample.jsonl) を現在の作業ディレクトリにダウンロードします。

1. 次のコードを使用して、環境にサンプル入力ファイルが含まれていることを確認します。

   ```
   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")
   ```

1. JumpStart モデルを以下のとおり定義します。

   ```
   from sagemaker.jumpstart.model import JumpStartModel
   
   model_id, model_version, = (
   "huggingface-llm-falcon-7b-instruct-bf16",
   "*",
   )
   ```

1. JumpStart モデルをデプロイして、以下のとおりエンドポイントを作成します。

   ```
   my_model = JumpStartModel(model_id=model_id)
   predictor = my_model.deploy()
   endpoint_name = predictor.endpoint_name
   ```

1. 次のとおり、プロンプトとモデルへのリクエストの形式、またはペイロードを定義します。

   ```
   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](https://github.com/huggingface/text-generation-inference/blob/v0.9.3/clients/python/text_generation/types.py#L8)」を参照してください。

## サンプル推論リクエストを送信する
<a name="clarify-foundation-model-evaluate-auto-tutorial-one-sample"></a>

モデルをテストするには、サンプルリクエストをモデルに送信し、次のとおりモデル応答を表示します。

```
response = predictor.predict(payload)
print(response[0]["generated_text"])
```

上記のコード例では、モデルが応答 `[{"response": "this is the output"}]` を提供した場合、`print` ステートメントは `this is the output` を返します。

## FMEval を設定する
<a name="clarify-foundation-model-evaluate-auto-tutorial-one-fmeval"></a>

1. 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
   ```

1. 入力データセットのデータ設定を行います。

   組み込みデータセットを使用しない場合、データ設定では `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",
   )
   ```

   その他のタスクに必要な列情報の詳細については、「[カスタム入力データセットを使用する](clarify-foundation-model-evaluate-auto-lib-custom.md#clarify-foundation-model-evaluate-auto-lib-custom-input)」の「**Use a custom input dataset**」セクションを参照してください。

1. 次のサンプルコードで示されるとおり、カスタム `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 モデル](https://huggingface.co/tiiuae/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](https://github.com/huggingface/text-generation-inference/blob/v0.9.3/clients/python/text_generation/types.py#L8)」を参照してください。

1. 次のサンプルコードに示されるとおり、評価レポートを設定して、ディレクトリに保存します。

   ```
   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)
   ```

1. 並列化係数を次のとおり設定します。

   ```
   os.environ["PARALLELIZATION_FACTOR"] = "1"
   ```

   `PARALLELIZATION_FACTOR` は、コンピューティングインスタンスに送信された同時バッチの数の乗数です。ハードウェアで並列化できる場合は、この数値を設定して、評価ジョブの呼び出し回数を乗算できます。例えば、呼び出しの回数が `100` で、`PARALLELIZATION_FACTOR` が `2` に設定されている場合、ジョブは`200` の呼び出しを実行します。`PARALLELIZATION_FACTOR` は最大 `10` まで増やすことも、この変数を完全に削除することもできます。Lambda の使用方法に関する AWS ブログを読むには、[「Kinesis および DynamoDB イベントソースの新しい AWS Lambda スケーリングコントロール](https://aws.amazon.com/blogs/compute/new-aws-lambda-scaling-controls-for-kinesis-and-dynamodb-event-sources/)`PARALLELIZATION_FACTOR`」を参照してください。

## モデル評価を実行する
<a name="clarify-foundation-model-evaluate-auto-tutorial-one-run"></a>

1. 評価アルゴリズムを定義します。次の例は、`PromptStereotyping` アルゴリズムを定義する方法を説明しています。

   ```
   eval_algo = PromptStereotyping()
   ```

   その他の評価タスクのメトリクスを計算するアルゴリズムの例については、「[`fmeval` ライブラリを使用して自動評価を実行する](clarify-foundation-model-evaluate-auto-lib.md)」の「**Evaluate your model**」を参照してください。

1. 評価アルゴリズムを実行します。次のサンプルコードでは、以前に定義したモデルとデータの設定と、`feature` を使用してプロンプトをモデルに渡す `prompt_template` を使用しています。

   ```
   eval_output = eval_algo.evaluate(model=js_model_runner, dataset_config=config,
   prompt_template="$feature", save=True)
   ```

   モデル出力は、上記のサンプル出力とは異なる場合があります。

## 分析結果を表示する
<a name="clarify-foundation-model-evaluate-auto-tutorial-one-view"></a>

1. 評価アルゴリズムが返した `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` を作成します。

1. 結果をインポートして `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](https://github.com/aws/fmeval/blob/main/examples/jumpstart-falcon-stereotyping.ipynb)」を参照してください。