fmeval 라이브러리를 사용하여 워크플로 사용자 지정 - Amazon SageMaker

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

fmeval 라이브러리를 사용하여 워크플로 사용자 지정

JumpStart 또는 Amazon Bedrock 모델이 아닌 모델을 허용하도록 모델 평가를 사용자 지정하거나 평가에 사용자 지정 워크플로를 사용할 수 있습니다. 자체 모델을 사용하는 경우 사용자 지정 을 생성해야 합니다ModelRunner. 평가에 자체 데이터 세트를 사용하는 경우 DataConfig 객체를 구성해야 합니다. 다음 섹션에서는 입력 데이터 세트를 포맷하고, 사용자 지정 데이터 세트를 사용하도록 DataConfig 객체를 사용자 지정하고, 사용자 지정 을 생성하는 방법을 보여줍니다ModelRunner.

자체 데이터 세트를 사용하여 모델을 평가하려면 DataConfig 객체를 사용하여 평가하려는 데이터 세트dataset_uridataset_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 지정하는 를 사용합니다. 열에는 다음과 같은 관련 작업에 해당하는 다음 값이 포함되어야 합니다.

    • 개방형 생성 , 독성정확도 평가의 경우 모델이 응답해야 하는 프롬프트가 포함된 열을 지정합니다.

    • 질문에 답변하는 작업의 경우 모델이 응답을 생성해야 하는 질문이 포함된 열을 지정합니다.

    • 텍스트 요약 작업 의 경우 모델이 요약할 텍스트가 포함된 열의 이름을 지정합니다.

    • 분류 작업 의 경우 모델이 분류할 텍스트가 포함된 열의 이름을 지정합니다.

    • 사실 지식 평가의 경우 모델이 답변을 예측할 질문이 포함된 열의 이름을 지정합니다.

    • 의미 완건성 평가의 경우 모델이 섭동할 입력이 포함된 열의 이름을 지정합니다.

    • 프롬프트 고정 관념 평가의 경우 다음 파라미터와 model_input_location같이 대신 sent_more_input_location sent_less_input_location 를 사용합니다.

  • model_output_location – (선택 사항) 에 포함된 참조 출력과 비교하려는 예측 출력이 포함된 데이터 세트의 열 이름입니다target_output_location. 를 제공하는 경우 model_output_locationFMEval는 추론을 위해 모델에 요청을 보내지 않습니다. 대신 지정된 열에 포함된 출력을 사용하여 모델을 평가합니다.

  • 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]]

이 메서드는 프롬프트를 문자열 입력으로 가져와 모델 텍스트 응답과 입력 로그 확률이 포함된 Tuple을 반환합니다. 모든 는 predict 메서드를 구현ModelRunner해야 합니다.

사용자 지정 생성 ModelRunner
  1. 모델 구성을 정의합니다.

    다음 코드 예제에서는 에 대한 모델 구성을 정의할 수 있도록 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것처럼 모델 이름이 로 설정됩니다. 파라미터는 사전 훈련된 OpenAI gpt2 모델에 대한 GPT 모델 구성을 사용하여 텍스트 생성 전략을 구성하는 하나의 옵션max_new_tokens입니다. 다른 모델 유형은 섹션을 참조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 클래스에서 속성을 상속하는 사용자 지정 FMEval ModelRunner 클래스를 사용합니다. 사용자 지정 클래스에는 생성자와 예측 함수에 대한 정의가 포함되어 있으며, 이는 를 반환합니다Tuple.

    자세한 ModelRunner 예는 fmeval 라이브러리의 model_runner 섹션을 참조하세요.

    HuggingFaceCausalLLMModelRunner 생성기에 포함된 정의는 다음과 같습니다.

    HuggingFaceCausalLLMModelRunner 클래스의 predict 메서드는 다음 정의를 사용합니다.

    • input_ids - 모델의 입력을 포함하는 변수입니다. 모델은 다음과 같이 입력을 생성합니다.

      • 는 에 포함된 요청을 토큰 식별자()prompttokenizer 변환합니다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에서 from_pretrainedpretrained_model_name_or_path를 선택합니다AutoClass.

    마지막으로 를 테스트합니다ModelRunner. 다음 코드 예제와 같이 샘플 요청을 모델에 전송합니다.

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