fmeval ライブラリを使用してワークフローをカスタマイズする - Amazon SageMaker

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

fmeval ライブラリを使用してワークフローをカスタマイズする

モデル評価をカスタマイズして、 JumpStart または Amazon Bedrock モデルではないモデルを許可したり、評価にカスタムワークフローを使用したりできます。独自のモデルを使用する場合は、カスタム を作成する必要がありますModelRunner。評価に独自のデータセットを使用する場合は、 DataConfig オブジェクトを設定する必要があります。次のセクションでは、入力データセットをフォーマットし、カスタムデータセットを使用するようにDataConfigオブジェクトをカスタマイズし、カスタム を作成する方法を示しますModelRunner

独自のデータセットを使用してモデルを評価する場合は、 DataConfig オブジェクトを使用して、評価するデータセットdataset_uridataset_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
  1. モデル設定を定義します。

    次のコード例は、カスタム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 gpt2モデルのモデル設定を使用してテキスト生成戦略を設定するオプションの 1 つですGPT。他のモデルタイプAutoConfigについては、「」を参照してください。

    • パラメータremove_prompt_from_generated_textが に設定されている場合True、生成されたレスポンスにはリクエストで送信された送信元プロンプトは含まれません。

    その他のテキスト生成パラメータについては、「」を参照してください。 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 – モデルの入力を含む変数。モデルは次のように入力を生成します。

      • に含まれるリクエストを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

  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_config としてインスタンス化されmax_new_tokens、 の初期化に使用されますModelRunner

    から別の事前トレーニング済みモデルを使用する場合 Hugging Faceで、 pretrained_model_name_or_pathfrom_pretrained下にある を選択しますAutoClass

    最後に、 をテストしますModelRunner。次のコード例に示すように、モデルにサンプルリクエストを送信します。

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