评估 JumpStart 模型是否能立即产生陈规定型观念 - Amazon SageMaker

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

评估 JumpStart 模型是否能立即产生陈规定型观念

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

本教程介绍如何从技术创新研究所加载猎鹰7-B 模型(可在中找到) JumpStart,并要求该模型生成对提示的响应。然后,本教程展示了如何根据内置的 C rows-Pairs 开源挑战数据集评估提示刻板印象的响应。

本教程的各个部分展示了如何执行以下操作:

  • 设置 环境。

  • 运行模型评估。

  • 查看您的分析结果。

设置您的环境

先决条件
  • 使用底座 Python 开始本教程之前,请使用 3.10 内核环境和ml.g4dn.2xlarge亚马逊弹性计算云 (AmazonEC2) 实例。

    有关实例类型及其推荐用例的更多信息,请参阅可用于 Studio Classic 的实例类型

安装所需的库
  1. 在代码中安装 SageMakerfmeval、和其他必需的库,如下所示:

    !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
  2. 将示例JSON Lines数据集 c rows-pairs_sample.j sonl 下载到你当前的工作目录中。

  3. 使用以下代码检查您的环境是否包含示例输入文件:

    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")
  4. 按如下方式定义 JumpStart 模型:

    from sagemaker.jumpstart.model import JumpStartModel model_id, model_version, = ( "huggingface-llm-falcon-7b-instruct-bf16", "*", )
  5. 部署 JumpStart 模型并创建端点,如下所示:

    my_model = JumpStartModel(model_id=model_id) predictor = my_model.deploy() endpoint_name = predictor.endpoint_name
  6. 定义提示和模型请求或有效载荷的格式,如下所示:

    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_sampleTrue,则必须为以下参数之一指定值:temperaturetop_ktop_p、或typical_p

    • top_p— 通过限制生成下一个令牌时要考虑的令牌集来控制随机性。值越高,则top_p允许集合包含更宽的词汇量。较低的值会将标记集限制为更可能出现的单词。的范围大top_p0和小于1

    • temperature— 控制生成的文本的随机性。的值越高,temperature指示模型生成更多随机和多样化的响应。较低的值生成的响应更具可预测性。的值temperature必须为正数。

    • max_new_tokens— 通过限制模型返回的令牌数量来限制响应的长度。默认值为 20

    • decoder_input_details— 返回有关模型分配给每个潜在下一个标记和相应标记IDs的对数概率的信息。如果设置decoder_input_detailsTrue,则还必须将设置detailsTrue为才能收到请求的详细信息。默认值为 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

  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
  2. 为输入数据集设置数据配置。

    如果您不使用内置数据集,则您的数据配置必须标识中包含更多偏差的列sent_more_input_location。您还必须确定中包含较少偏差的列sent_less_input_location。如果您使用的是中的内置数据集 JumpStart,则这些参数FMEval将通过模型元数据自动传递给。

    为提示构造任务指定sent_more_input_locationsent_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", )

    有关其他任务所需的列信息的更多信息,请参阅中的使用自定义输入数据集部分使用自定义输入数据集

  3. 设置自定义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

  4. 配置您的评估报告并将其保存到目录中,如以下示例代码所示:

    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)
  5. 按如下方式设置并行因子:

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

    A PARALLELIZATION_FACTOR 是发送到您的计算实例的并发批次数的乘数。如果您的硬件允许并行化,则可以将此数字设置为评估任务的调用次数相乘。例如,如果您有100调用,并且设置PARALLELIZATION_FACTOR2,则您的作业将运行200调用。您PARALLELIZATION_FACTOR最多可以增加变量10,也可以完全移除该变量。要阅读有关 AWS Lambda 如何使用的博客,PARALLELIZATION_FACTOR请参阅适用于 Kinesis 和 DynamoD AWS B 事件源的新 Lambda 扩展控件

运行您的模型评估

  1. 定义您的评估算法。以下示例显示了如何定义PromptStereotyping算法:

    eval_algo = PromptStereotyping()

    有关计算其他评估任务指标的算法示例,请参阅中的评估模型使用该fmeval库运行自动评估

  2. 运行您的评估算法。以下代码示例使用先前定义的模型和数据配置,以及用于将提示传递feature给模型的,如下所示:prompt_template

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

    您的模型输出可能与之前的示例输出不同。

查看您的分析结果

  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,则模型响应不包含输入数据集测量的偏差。在接下来的步骤PandasDataFrame中,您将使用output_path来创建。

  2. 导入结果并将其读入到 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。