翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
fmeval
ライブラリを使用してワークフローをカスタマイズする
モデル評価をカスタマイズして、 JumpStart または Amazon Bedrock モデルではないモデルを許可したり、評価にカスタムワークフローを使用したりできます。独自のモデルを使用する場合は、カスタム を作成する必要がありますModelRunner
。評価に独自のデータセットを使用する場合は、 DataConfig
オブジェクトを設定する必要があります。次のセクションでは、入力データセットをフォーマットし、カスタムデータセットを使用するようにDataConfig
オブジェクトをカスタマイズし、カスタム を作成する方法を示しますModelRunner
。
独自のデータセットを使用してモデルを評価する場合は、 DataConfig
オブジェクトを使用して、評価するデータセットdataset_uri
の dataset_name
と を指定する必要があります。組み込みデータセットを使用する場合、DataConfig
オブジェクトは評価アルゴリズムのデフォルトとして既に設定されています。
evaluate
関数を使用するたびに 1 つのカスタムデータセットを使用できます。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
を指定する を使用します。列には、次の関連するタスクに対応する次の値が含まれている必要があります。-
オープンエンド世代の 、有害性、精度評価では、モデルが応答するプロンプトを含む列を指定します。
-
質問回答タスクでは、モデルが回答を生成する質問を含む列を指定します。
-
テキスト要約タスク では、モデルに要約するテキストを含む列の名前を指定します。
-
分類タスク には、モデルが分類するテキストを含む列の名前を指定します。
-
事実に基づくナレッジ評価では、モデルが回答を予測する質問を含む列の名前を指定します。
-
セマンティック堅牢性評価では、モデルが動員する入力を含む列の名前を指定します。
-
プロンプトのステレオタイプ評価では、次のパラメータに示すように
model_input_location
、 の代わりにsent_more_input_location
とsent_less_input_location
を使用します。
-
-
model_output_location
– (オプション) に含まれるリファレンス出力と比較する予測出力を含むデータセット内の列の名前target_output_location
。を指定した場合model_output_location
、 FMEvalは推論のリクエストをモデルに送信しません。代わりに、指定された列に含まれる出力を使用してモデルを評価します。 -
target_output_location
– に含まれる予測値と比較する true 値を含む参照データセット内の列の名前model_output_location
。事実に基づいた知識、正確性、セマンティック堅牢性にのみ必要です。事実上、この列の各行には、区切り文字で区切られたすべての可能な回答が含まれている必要があります。例えば、質問に対する回答が [「UK」、「England」] の場合、列には「UK<OR>England」が含まれている必要があります。モデル予測は、区切り文字で区切られた回答のいずれかが含まれている場合、正しいです。 -
category_location
– カテゴリの名前を含む列の名前。の値を指定するとcategory_location
、スコアはカテゴリごとに集計され、レポートされます。 -
sent_more_input_location
– バイアスの大きいプロンプトを含む列の名前。プロンプトのステレオタイプ化にのみ必要です。無意識のバイアスを避ける。バイアスの例については、CrowSペアデータセット」を参照してください。 -
sent_less_input_location
– バイアスの少ないプロンプトを含む列の名前。プロンプトのステレオタイプ化にのみ必要です。無意識のバイアスを避ける。バイアスの例については、CrowSペアデータセット」を参照してください。 -
sent_more_output_location
– (オプション) モデルが生成したレスポンスにより多くのバイアスが含まれるという予測確率を含む列の名前。このパラメータは、プロンプトのステレオタイプ化タスクでのみ使用されます。 -
sent_less_output_location
– (オプション) モデルが生成したレスポンスに含まれるバイアスが少ないという予測確率を含む列の名前。このパラメータは、プロンプトのステレオタイプ化タスクでのみ使用されます。
データセット列に対応する新しい属性をDataConfig
クラスに追加する場合は、属性名の末尾suffix _location
に を追加する必要があります。
カスタムモデルを評価するには、ベースデータクラスを使用してモデルを設定し、カスタム を作成しますModelRunner
。次に、これを使用して任意の言語モデルをModelRunner
評価できます。次のステップを使用して、モデル設定を定義ModelRunner
し、カスタム を作成してテストします。
ModelRunner
インターフェイスには、次のように 1 つの抽象メソッドがあります。
def predict(self, prompt: str) → Tuple[Optional[str], Optional[float]]
このメソッドは、プロンプトを文字列入力として受け取り、モデルテキストレスポンスと入力ログ確率を含むタプルを返します。すべての は predict
メソッドを実装ModelRunner
する必要があります。
カスタムを作成する ModelRunner
-
モデル設定を定義します。
次のコード例は、カスタム
HFModelConfig
クラスにデdataclass
コレータを適用して、 のモデル設定を定義できるようにする方法を示しています。 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
は、事前トレーニング済みの OpenAIgpt2
モデルのモデル設定を使用してテキスト生成戦略を設定するオプションの 1 つです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
例については、ライブラリの model_runnerセクションを参照してください fmeval
。コン
HuggingFaceCausalLLMModelRunner
ストラクターには、次の定義が含まれています。-
設定は
HFModelConfig
、このセクションの冒頭で定義されている に設定されます。 -
モデルは、 から事前トレーニング済みのモデルに設定されます。Hugging Face インスタンス化時に model_name パラメータを使用して指定された自動クラス
。 -
トークナイザは、 から クラスに設定されます。 Hugging Face で指定された事前トレーニング済みモデルに一致するトークナイザーライブラリ
model_name
。
HuggingFaceCausalLLMModelRunner
クラスのpredict
メソッドは、次の定義を使用します。-
input_ids
– モデルの入力を含む変数。モデルは次のように入力を生成します。-
に含まれるリクエストを
prompt
トークン識別子 ()tokenizer
に変換しますIDs。これらのトークン はIDs、特定のトークン (単語、サブ単語、または文字) を表す数値であり、モデルが入力として直接使用できます。トークンIDsは として返されます。PyTorch で指定されたテンソルオブジェクトreturn_tensors="pt"
。他のタイプのリターンテンソルタイプについては、「」を参照してください。Hugging Face apply_chat_templateのドキュメント。 -
トークンIDsは、モデルが配置されているデバイスに送信され、モデルで使用できるようにします。
-
-
generations
– によって生成されたレスポンスを含む変数LLM。モデルの生成関数は、次の入力を使用してレスポンスを生成します。-
前のステップ
input_ids
の 。 -
で
max_new_tokens
指定されたパラメータHFModelConfig
。 -
はレスポンスに文末 (eo) トークン
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()