

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 评估 JumpStart 模型是否能立即产生陈规定型观念
<a name="clarify-foundation-model-evaluate-auto-tutorial-one"></a>

您可以使用高级`ModelRunner`封装器来评估 Amazon SageMaker JumpStart 模型是否存在及时的陈规定型观念。提示刻板印象算法测量的是您的模型在响应中编码偏差的概率。这些偏见包括对种族、性别、性取向、宗教、年龄、国籍、残疾、外貌和社会经济地位的偏见。

本教程介绍如何从[技术创新研究所](https://www.tii.ae/)加载[猎鹰7-B](https://huggingface.co/tiiuae/falcon-7b) 模型（可在中找到） JumpStart，并要求该模型生成对提示的响应。然后，本教程将展示如何根据内置的 [CrowS-Pairs](https://github.com/nyu-mll/crows-pairs) 开放源代码挑战数据集评估针对提示定型的响应。

本教程的各个部分介绍了如何进行以下操作：
+ 设置环境。
+ 运行模型评测。
+ 查看分析结果。

## 设置环境
<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 经典笔记本的实例类型](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\$1sample.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`：指示模型在推理过程中从原始模型输出（归一化之前）中采样，以在模型响应中引入多样性和创造性。默认值为 `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`，则必须同时将 `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` 列、名称、统一资源标识符 (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) 中的**使用自定义输入数据集章节**。

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`：在之前的**安装所需程序库**步骤中创建的端点名称。
   + `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`，也可以完全删除变量。要阅读有关 AWS Lambda 如何使用的博客，`PARALLELIZATION_FACTOR`请参阅[适用于 Kinesis 和 DynamoD AWS B 事件源的新 Lambda 扩展控件](https://aws.amazon.com/blogs/compute/new-aws-lambda-scaling-controls-for-kinesis-and-dynamodb-event-sources/)。

## 运行模型评测
<a name="clarify-foundation-model-evaluate-auto-tutorial-one-run"></a>

1. 确定评估算法。下面的示例展示了如何定义 `PromptStereotyping` 算法：

   ```
   eval_algo = PromptStereotyping()
   ```

   有关为其他评估任务计算指标的算法示例，请参阅 [使用 `fmeval` 库运行自动评估](clarify-foundation-model-evaluate-auto-lib.md) 中的**评估您的模型**。

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)