使用fmeval库自定义您的工作流程 - Amazon SageMaker
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

使用fmeval库自定义您的工作流程

您可以自定义模型评估以允许使用不是 Amazon Bedrock 模型的模型,也可以使用自定义工作流程进行评估。 JumpStart 如果您使用自己的模型,则必须创建自定义模型ModelRunner。如果您使用自己的数据集进行评估,则必须配置DataConfig对象。以下部分介绍如何设置输入数据集的格式、如何自定义DataConfig对象以使用您的自定义数据集以及如何创建自定义数据集ModelRunner

如果要使用自己的数据集来评估模型,则必须使用DataConfig对象来指定要评估的数据集dataset_uridataset_name和。如果您使用内置数据集,则该DataConfig对象已配置为评估算法的默认数据集。

每次使用该evaluate函数时,您都可以使用一个自定义数据集。您可以调用evaluate任意次数来使用任意数量的数据集。

配置自定义数据集,在问题列中指定您的模型请求,并在答案列中指定目标答案,如下所示:

from fmeval.data_loaders.data_config import DataConfig from fmeval.constants import MIME_TYPE_JSONLINES config = DataConfig( dataset_name="tiny_dataset", dataset_uri="tiny_dataset.jsonl", dataset_mime_type=MIME_TYPE_JSONLINES, model_input_location="question", target_output_location="answer", )

DataConfig类包含以下参数:

  • dataset_name— 您要用来评估您的数据集的名称LLM。

    dataset_uri— 数据集 S3 位置的本地路径或统一资源标识符 (URI)。

  • dataset_mime_type— 您要用来评估您的输入数据的格式LLM。该FMEval库可以同时支持MIME_TYPE_JSONMIME_TYPE_JSONLINES

  • model_input_location—(可选)数据集中包含要评估的模型输入或提示的列的名称。

    使用model_input_location指定您的列名称的。该列必须包含与以下关联任务相对应的以下值:

    • 要进行开放式生成性和精度评估,请指定包含模型应响应的提示的列。

    • 对于问答任务,请指定包含模型应生成答案的问题的列。

    • 对于文本摘要任务,请指定包含您希望模型汇总的文本的列的名称。

    • 对于分类任务,请指定包含您希望模型分类的文本的列的名称。

    • 对于事实知识评估,请指定包含您希望模型预测答案的问题的列的名称。

    • 要进行语义稳健性评估,请指定包含您希望模型扰动的输入的列的名称。

    • 快速评估陈规定型观念,请使用sent_more_input_location sent_less_input_location代替model_input_location,如以下参数所示。

  • model_output_location—(可选)数据集中包含要与中包含的参考输出进行比较的预测输出的列的名称target_output_location。如果您提供model_output_location,则FMEval不会向您的模型发送推理请求。相反,它使用指定列中包含的输出来评估您的模型。

  • target_output_location— 参考数据集中包含要与中包含的预测值进行比较的真实值的列的名称model_output_location。仅在事实知识、准确性和语义稳健性方面才需要。为了了解事实,本列中的每一行都应包含所有可能的答案,并用分隔符分隔。例如,如果问题的答案是 [“英国”、“英格兰”],则该列应包含 “英国<OR>英格兰”。如果模型预测包含用分隔符分隔的任何答案,则模型预测是正确的。

  • category_location-包含类别名称的列的名称。如果您为提供了一个值category_location,则会汇总并报告每个类别的分数。

  • sent_more_input_location— 包含带有更多偏见的提示的列的名称。仅在出现陈规定型观念时才需要。避免潜意识偏见。有关偏差示例,请参阅 Crows-Pairs 数据集

  • sent_less_input_location— 包含偏见较小的提示的列的名称。仅在出现陈规定型观念时才需要。避免潜意识偏见。有关偏差示例,请参阅 Crows-Pairs 数据集

  • sent_more_output_location—(可选)包含模型生成的响应将包含更多偏差的预测概率的列的名称。此参数仅用于提示刻板印象任务。

  • sent_less_output_location—(可选)包含模型生成的响应将包含较少偏差的预测概率的列的名称。此参数仅用于提示刻板印象任务。

如果要向DataConfig类中添加与数据集列对应的新属性,则必须在属性名称suffix _location的末尾添加。

要评估自定义模型,请使用基础数据类来配置您的模型并创建自定义模型ModelRunner。然后,你可以用它ModelRunner来评估任何语言模型。使用以下步骤定义模型配置、创建自定义ModelRunner模型并对其进行测试。

ModelRunner接口有一种抽象方法,如下所示:

def predict(self, prompt: str) → Tuple[Optional[str], Optional[float]]

此方法将提示作为字符串输入,并返回一个包含模型文本响应和输入日志概率的 Tuple。每个人都ModelRunner必须实现一种predict方法。

创建自定义 ModelRunner
  1. 定义模型配置。

    以下代码示例演示如何将dataclass装饰器应用于自定义HFModelConfig类,以便您可以为自定义类定义模型配置 Hugging Face型号:

    from dataclasses import dataclass @dataclass class HFModelConfig: model_name: str max_new_tokens: int seed: int = 0 remove_prompt_from_generated_text: bool = True

    在前面的代码示例中,以下内容适用:

    • 该参数max_new_tokens用于通过限制返回的令牌数量来限制响应的长度LLM。模型的类型是通过传递类实例化model_name时的值来设置的。在此示例中,模型名称设置为gpt2,如本节末尾所示。该参数max_new_tokens是使用预训练的 GPT OpenAI gpt2 模型的模型配置来配置文本生成策略的一个选项。AutoConfig有关其他模型类型,请参阅。

    • 如果将参数设置remove_prompt_from_generated_textTrue,则生成的响应将不包含请求中发送的原始提示。

    有关其他文本生成参数,请参阅 Hugging Face 的文档 GenerationConfig

  2. 创建自定义方法ModelRunner并实现预测方法。以下代码示例显示了如何ModelRunner为创建自定义 Hugging Face 使用在前面的代码示例中创建的HFModelConfig类进行建模。

    from typing import Tuple, Optional import torch from transformers import AutoModelForCausalLM, AutoTokenizer from fmeval.model_runners.model_runner import ModelRunner class HuggingFaceCausalLLMModelRunner(ModelRunner): def __init__(self, model_config: HFModelConfig): self.config = model_config self.model = AutoModelForCausalLM.from_pretrained(self.config.model_name) self.tokenizer = AutoTokenizer.from_pretrained(self.config.model_name) def predict(self, prompt: str) -> Tuple[Optional[str], Optional[float]]: input_ids = self.tokenizer(prompt, return_tensors="pt").to(self.model.device) generations = self.model.generate( **input_ids, max_new_tokens=self.config.max_new_tokens, pad_token_id=self.tokenizer.eos_token_id, ) generation_contains_input = ( input_ids["input_ids"][0] == generations[0][: input_ids["input_ids"].shape[1]] ).all() if self.config.remove_prompt_from_generated_text and not generation_contains_input: warnings.warn( "Your model does not return the prompt as part of its generations. " "`remove_prompt_from_generated_text` does nothing." ) if self.config.remove_prompt_from_generated_text and generation_contains_input: output = self.tokenizer.batch_decode(generations[:, input_ids["input_ids"].shape[1] :])[0] else: output = self.tokenizer.batch_decode(generations, skip_special_tokens=True)[0] with torch.inference_mode(): input_ids = self.tokenizer(self.tokenizer.bos_token + prompt, return_tensors="pt")["input_ids"] model_output = self.model(input_ids, labels=input_ids) probability = -model_output[0].item() return output, probability

    前面的代码使用了继承该HuggingFaceCausalLLMModelRunner类属性的自定义FMEvalModelRunner类。自定义类包含构造函数和预测函数的定义,后者返回Tuple

    有关更多ModelRunner示例,请参阅库的 model_runner 部分。fmeval

    HuggingFaceCausalLLMModelRunner构造函数包含以下定义:

    • 配置设置为HFModelConfig,在本节开头定义。

    • 该模型设置为来自的预训练模型 Hugging Face 在实例化时使用 model_name 参数指定的@@ 自动类

    • 分词器设置为一个类来自 Hugging Face 与指定的预训练模型相匹配的分词器库。model_name

    HuggingFaceCausalLLMModelRunner类中的predict方法使用以下定义:

    • input_ids-包含模型输入的变量。模型按如下方式生成输入。

      • A tokenizer 将中包含的请求prompt转换为令牌标识符 (IDs)。这些标记IDs是代表特定标记(单词、子词或字符)的数值,模型可以直接将其用作输入。令IDs牌以 a 的形式返回 PyTorch 张量对象,由指定。return_tensors="pt"有关其他类型的返回张量类型,请参见 Hugging Face apply_chat_ template 的文档。

      • 令牌IDs被发送到模型所在的设备,以便模型可以使用。

    • generations— 一个变量,其中包含由您生成的响应LLM。模型的生成函数使用以下输入来生成响应:

      • input_ids来自上一步的。

      • max_new_tokens指定的参数HFModelConfig

      • A 在响应中pad_token_id添加句尾 (eos) 标记。有关您可以使用的其他代币,请参阅 Hugging Face 的文档PreTrainedTokenizer

    • generation_contains_input— 一个布尔变量,True当生成的响应在其响应中包含输入提示时返回,False否则返回。返回值是使用以下内容之间的逐元素比较计算得出的。

      • 输入提示IDs中包含的所有标记input_ids["input_ids"][0]

      • 包含在中的生成内容的开头generations[0][: input_ids["input_ids"].shape[1]]

      如果您在配置remove_prompt_from_generated_text中指向,但生成的响应不包含输入提示,则该predict方法会返回警告。LLM

      该方法的输出包含该predict方法返回的字符串,该字符串将响应中IDs返回的令牌转换为人类可读的文本。batch_decode如果指定remove_prompt_from_generated_textTrue,则会从生成的文本中删除输入提示。如果您指定remove_prompt_from_generated_textFalse,则将返回生成的文本,而不包含您在字典中包含的任何特殊标记special_token_dict,如所指定skip_special_tokens=True

  3. 测试你的ModelRunner. 向您的模特发送样品请求。

    以下示例说明如何使用来自的gpt2预训练模型来测试模型 Hugging Face AutoConfig班级:

    hf_config = HFModelConfig(model_name="gpt2", max_new_tokens=32) model = HuggingFaceCausalLLMModelRunner(model_config=hf_config)

    在前面的代码示例中,model_name指定了预训练模型的名称。该HFModelConfig类被实例化为带有参数max_new_tokens值的 hf_config,并用于初始化。ModelRunner

    如果你想使用另一个预训练模型 Hugging Face,pretrained_model_name_or_pathfrom_pretrained下面选择一个AutoClass

    最后,测试你的ModelRunner。向您的模型发送示例请求,如以下代码示例所示:

    model_output = model.predict("London is the capital of?")[0] print(model_output) eval_algo.evaluate_sample()