本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用 fmeval
程式庫自訂工作流程
您可以自訂模型評估,以允許 模型不是 JumpStart 或 Amazon Bedrock 模型,或使用自訂工作流程進行評估。如果您使用自己的模型,則必須建立自訂 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_JSON
和MIME_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
-
定義模型組態。
下列程式碼範例示範如何將
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
。 -
-
建立自訂
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_text
為True
,則會從產生的文字中移除輸入提示。如果您將 指定remove_prompt_from_generated_text
為False
,則產生的文字將傳回,而不會包含您在字典 中包含的任何特殊字符special_token_dict
,如 所指定skip_special_tokens=True
。 -
-
-
測試您的
ModelRunner
。將範例請求傳送至您的模型。下列範例示範如何使用來自 的
gpt2
預先訓練模型來測試模型 Hugging FaceAutoConfig
類別: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_path
在from_pretrained
下選擇 AutoClass。 最後,測試您的
ModelRunner
。將範例請求傳送至您的模型,如下列程式碼範例所示:model_output = model.predict("London is the capital of?")[0] print(model_output) eval_algo.evaluate_sample()