本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用程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_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
— 參考資料集中的資料行名稱,此資料集包含要與其中包含的預測值進行比較的 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
-
定義模型組態。
下列程式碼範例會示範如何將
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_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
範例,請參閱資源庫的 Model_runner區段。 fmeval
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 應用聊天模板的文檔。 -
令牌IDs被發送到模型所在的設備,以便模型可以使用它們。
-
-
generations
— 包含您所產生之回應的變數LLM。模型的生成函數使用以下輸入來生成響應:-
input_ids
從上一個步驟。 -
在中
max_new_tokens
指定的參數HFModelConfig
。 -
A
pad_token_id
將句子結尾(EOS)令牌添加到響應中。有關您可以使用的其他令牌,請參閱 Hugging Face 文件的 PreTrainedTokenizer.
-
-
generation_contains_input
—True
當產生的回應在其回應中包含輸入提示時傳回的 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_text
為True
,則會從產生文字中移除輸入提示。如果您指定remove_prompt_from_generated_text
為False
,則會傳回產生文字,而不會包含在字典special_token_dict
中的任何特殊 Token (如所指定)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_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()