翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
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
は、事前トレーニング済みの OpenAI GPTモデルのgpt2
モデル設定を使用してテキスト生成戦略を設定する 1 つのオプションです。その他のモデルタイプ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
– モデルの入力を含む変数。モデルは次のように入力を生成します。-
は、 に含まれるリクエストを
prompt
トークン識別子 ()tokenizer
に変換します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()