使用 fmeval程式庫自訂工作流程 - Amazon SageMaker

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用 fmeval程式庫自訂工作流程

您可以自訂模型評估,以允許 模型不是 JumpStart 或 Amazon Bedrock 模型,或使用自訂工作流程進行評估。如果您使用自己的模型,則必須建立自訂 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]]

此方法以提示作為字串輸入,並傳回包含模型文字回應和輸入日誌機率的組合。每個 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是使用預先訓練 OpenAI 模型的gpt2模型組態來設定文字產生策略的一個選項GPT。如需其他模型類型AutoConfig,請參閱 。

    • 如果參數remove_prompt_from_generated_text設定為 True,則產生的回應不會包含在請求中傳送的原始提示。

    如需其他文字產生參數,請參閱 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範例,請參閱 fmeval 程式庫的 model_runner 區段。

    HuggingFaceCausalLLMModelRunner 建構器包含下列定義:

    • 組態設定為 HFModelConfig,定義於本節開頭。

    • 模型從 設定為預先訓練的模型 Hugging Face 初始化時使用 model_name 參數指定的自動類別

    • 權杖化器從 設定為類別 Hugging Face 權杖程式庫,符合 指定的預先訓練模型model_name

    HuggingFaceCausalLLMModelRunner 類別中的 predict 方法使用下列定義:

    • input_ids – 包含模型輸入 的變數。模型會產生輸入,如下所示。

      • A 將 中包含的請求tokenizer轉換為prompt字符識別符 (IDs)。這些字符 是代表特定字符 (單字、子單字或字元) 的數值IDs,可以直接由模型用作輸入。權杖IDs會傳回為 PyTorch 張量物件,如 所指定return_tensors="pt"。如需其他類型的傳回張量類型,請參閱 Hugging Face apply_chat_template 的文件。

      • 權杖IDs會傳送到模型所在的裝置,以便模型使用。

    • generations – 包含 產生的回應的變數LLM。模型的產生函數會使用下列輸入來產生回應:

      • 上一個步驟input_ids中的 。

      • max_new_tokens指定的參數HFModelConfig

      • 會將句點結束 (eos) 權杖pad_token_id新增至回應。如需您可以使用的其他權杖,請參閱 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中將 導向LLM至 ,但產生的回應不包含輸入提示,則 predict方法會傳回警告。

      predict 方法的輸出包含 batch_decode方法傳回的字串,會將回應中IDs傳回的權杖轉換為人類可讀文字。如果您將 指定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 類別會以參數 的值做為 hf_config 進行實例化max_new_tokens,並用於初始化 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()