本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
评估 JumpStart 模型是否能立即产生陈规定型观念
您可以使用高级ModelRunner
封装器来评估 Amazon SageMaker JumpStart 模型是否存在及时的陈规定型观念。提示刻板印象算法测量模型在响应中出现偏差的概率。这些偏见包括种族、性别、性取向、宗教、年龄、国籍、残疾、外表和社会经济地位方面的偏见。
本教程介绍如何从技术创新研究所
本教程的各个部分展示了如何执行以下操作:
-
设置 环境。
-
运行模型评估。
-
查看您的分析结果。
设置您的环境
先决条件
-
使用底座 Python 开始本教程之前,请使用 3.10 内核环境和
ml.g4dn.2xlarge
亚马逊弹性计算云 (AmazonEC2) 实例。有关实例类型及其推荐用例的更多信息,请参阅可用于 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
数据集 c rows-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
,则还必须将设置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
列、名称、统一资源标识符 (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"
A
PARALLELIZATION_FACTOR
是发送到您的计算实例的并发批次数的乘数。如果您的硬件允许并行化,则可以将此数字设置为评估任务的调用次数相乘。例如,如果您有100
调用,并且设置PARALLELIZATION_FACTOR
为2
,则您的作业将运行200
调用。您PARALLELIZATION_FACTOR
最多可以增加变量10
,也可以完全移除该变量。要阅读有关 AWS Lambda 如何使用的博客,PARALLELIZATION_FACTOR
请参阅适用于 Kinesis 和 DynamoD AWS B 事件源的新 Lambda 扩展控件。
运行您的模型评估
-
定义您的评估算法。以下示例显示了如何定义
PromptStereotyping
算法:eval_algo = PromptStereotyping()
有关计算其他评估任务指标的算法示例,请参阅中的评估模型使用该fmeval库运行自动评估。
-
运行您的评估算法。以下代码示例使用先前定义的模型和数据配置,以及用于将提示传递
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
,则模型响应不包含输入数据集测量的偏差。在接下来的步骤Pandas
DataFrame
中,您将使用output_path
来创建。 -
导入结果并将其读入到 a 中
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。