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

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

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

您可以自訂模型評估,以允許不是 JumpStart 或 Amazon 基岩模型的模型,或使用自訂工作流程進行評估。如果您使用自己的模型,則必須創建一個自定義模型ModelRunner。如果您使用自己的資料集進行評估,則必須設定DataConfig物件。以下部分說明如何設定輸入資料集的格式、自訂DataConfig物件以使用自訂資料集,以及建立自訂資料集ModelRunner

如果您想要使用自己的資料集來評估模型,則必須使用DataConfig物件來指定要評估dataset_uri之資料集的dataset_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— 參考資料集中的資料行名稱,此資料集包含要與其中包含的預測值進行比較的 true 值model_output_location。僅對於事實知識,準確性和語義穩健性才需要。對於事實知識,此列中的每一行應包含以分隔符分隔的所有可能答案。例如,如果問題的答案是 [英國」,「英格蘭」],則該欄應包含「英國英<OR>格蘭」。如果模型預測包含以分隔符分隔的任何答案,則模型預測是正確的。

  • category_location— 包含類別名稱的欄名稱。如果您提供的值category_location,則會針對每個類別彙總和報告分數。

  • sent_more_input_location— 包含具有較多偏差之提示的欄名稱。僅對於提示刻板印刷才需要。避免無意識的偏見。有關偏差示例,請參閱烏鴉對數據集

  • sent_less_input_location— 包含較少偏差之提示的欄名稱。僅對於提示刻板印刷才需要。避免無意識的偏見。有關偏差示例,請參閱烏鴉對數據集

  • 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 GPT 模型的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構造函數包含以下定義:

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

    • input_ids— 包含模型輸入的變數。該模型生成輸入如下。

      • A tokenizer 將包含在請求轉換prompt為令牌標識符(IDs)。這些標記IDs是代表特定標記(單詞,子字或字符)的數值,可以直接由您的模型用作輸入。令牌IDs作為返回 PyTorch 張量物件,如所return_tensors="pt"指定。有關其他類型的返回張量類型,請參閱 Hugging Face 應用聊天模板的文檔。

      • 令牌IDs被發送到模型所在的設備,以便模型可以使用它們。

    • generations— 包含您所產生之回應的變數LLM。模型的生成函數使用以下輸入來生成響應:

      • input_ids從上一個步驟。

      • 在中max_new_tokens指定的參數HFModelConfig

      • A pad_token_id 將句子結尾(EOS)令牌添加到響應中。有關您可以使用的其他令牌,請參閱 Hugging Face 文件的 PreTrainedTokenizer.

    • generation_contains_inputTrue 當產生的回應在其回應中包含輸入提示時傳回的 Boolean 變數,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中的任何特殊 Token (如所指定) 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_configmax_new_tokens,並用於初始化。ModelRunner

    如果您想使用另一個預先訓練的模型 Hugging Face,選擇from_pretrained下方pretrained_model_name_or_path的一個AutoClass

    最後,測試您的ModelRunner. 將範例請求傳送至您的模型,如下列程式碼範例所示:

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