Amazon Web Services 한국 블로그

Amazon SageMaker Clarify – 파운데이션 모델 평가 기능 출시 (미리 보기)

Amazon SageMaker Clarify에서 이제 파운데이션 모델(FM) 평가(미리 보기)가 지원됩니다. 이제 데이터 과학자 또는 기계 학습(ML) 엔지니어는 SageMaker Clarify를 사용하여 정확성, 견고성, 창의성, 사실적 지식, 편향, 유해성 등의 지표를 기반으로 몇 분 만에 FM을 평가, 비교 및 선택할 수 있습니다. 이 새로운 기능은 SageMaker Clarify의 기존 기능에 추가되어 ML 데이터 및 모델의 편향을 감지하고 모델 예측을 설명합니다.

새로운 기능을 사용하면 SageMaker JumpStart에서 사용할 수 있는 LLM과 AWS 외부에서 훈련되고 호스팅된 모델을 포함하여 모든 위치의 대규모 언어 모델(LLM)에 대해 자동 평가 및 인간 참여형 평가를 수행할 수 있습니다. 이 기능은 적합한 모델 평가 도구를 찾아서 개발 환경에 통합하는 번거로운 작업을 없애줍니다. 또한 생성형 인공 지능(AI) 사용 사례에 학문적 벤치마크를 적용하려는 시도의 복잡성을 단순화합니다.

SageMaker Clarify로 FM 평가
SageMaker Clarify를 사용하면 이제 모델을 선택하고 사용자 지정하는 워크플로 전체에서 사전 정의된 기준에 따라 LLM을 한 곳에서 평가하고 비교할 수 있습니다. 자동 평가에 더해 인간 참여형 기능을 사용할 수도 있습니다. 인간 참여형 기능을 사용하면 자체 인력 또는 SageMaker Ground Truth의 관리형 인력을 사용하여 유용성, 창의적 의도 및 스타일과 같은 보다 주관적인 기준에 대한 인적 검토를 설정할 수 있습니다.

모델 평가를 시작하려면 서술형 텍스트 생성, 텍스트 요약, 질문 답변(Q&A) 및 분류 등 일반적인 LLM 작업을 위해 특별히 설계되고 큐레이션된 프롬프트 데이터 세트를 사용할 수 있습니다. 또한 특정 사용 사례에 맞게 사용자 지정 프롬프트 데이터 세트와 지표를 사용하여 모델 평가를 확장할 수 있습니다. 모든 작업 및 평가 지표에 인간 참여형 평가를 사용할 수 있습니다. 각 평가 작업이 끝나면 결과를 자연어로 요약하고 시각화와 예제가 포함된 평가 보고서를 받게 됩니다. 모든 지표와 보고서를 다운로드하고 모델 평가를 SageMaker MLOps 워크플로에 통합할 수도 있습니다.

SageMaker Studio의 왼쪽 메뉴의 작업에서 모델 평가를 찾을 수 있습니다. SageMaker JumpStart 내 모든 LLM의 모델 세부 정보 페이지에서 직접 평가를 선택할 수도 있습니다.

Amazon SageMaker Clarify로 파운데이션 모델 평가

Evaluate a model(모델 평가)을 선택하여 평가 작업을 설정합니다. UI 마법사의 안내에 따라 자동 또는 수동 평가, 모델, 관련 작업, 지표, 프롬프트 데이터 세트 및 검토 팀을 선택합니다.

Amazon SageMaker Clarify로 파운데이션 모델 평가

모델 평가 작업이 완료되면 평가 보고서에서 결과를 볼 수 있습니다.

Amazon SageMaker Clarify로 파운데이션 모델 평가

UI 외에도 예제 Jupyter 노트북의 단계별 지침에 따라 SageMaker에서 프로그래밍 방식으로 모델 평가를 실행할 수도 있습니다.

FMEval 오픈 소스 라이브러리로 어디서나 모델 평가하기
AWS 외부에서 훈련되고 호스팅된 모델을 포함하여 어디서나 모델 평가를 실행하려면 FMEval 오픈 소스 라이브러리를 사용하세요. 다음 예제에서는 ModelRunner 클래스를 확장하여 라이브러리를 통해 사용자 지정 모델을 평가하는 방법을 보여줍니다.

이 데모에서는 Hugging Face 모델 허브에서 GPT-2를 선택하고 Hugging Face 모델 허브의 인과적 디코더 전용 모델(예: GPT-2)과 연동되는 사용자 지정 HFModelConfigHuggingFaceCausalLLMModelRunner 클래스를 정의합니다. 이 예제는 FMEval GitHub 리포지토리에서도 사용할 수 있습니다.

!pip install fmeval

# ModelRunners invoke FMs
from amazon_fmeval.model_runners.model_runner import ModelRunner

# Additional imports for custom model
import warnings
from dataclasses import dataclass
from typing import Tuple, Optional
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer

@dataclass
class HFModelConfig:
    model_name: str
    max_new_tokens: int
    normalize_probabilities: bool = False
    seed: int = 0
    remove_prompt_from_generated_text: bool = True

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

다음으로 모델 정보를 사용하여 HFModelConfigHuggingFaceCausalLLMModelRunner의 인스턴스를 생성합니다.

hf_config = HFModelConfig(model_name="gpt2", max_new_tokens=32)
model = HuggingFaceCausalLLMModelRunner(model_config=hf_config)

그런 다음 평가 알고리즘을 선택하고 구성합니다.

# Let's evaluate the FM for FactualKnowledge
from amazon_fmeval.fmeval import get_eval_algorithm
from amazon_fmeval.eval_algorithms.factual_knowledge import FactualKnowledgeConfig

eval_algorithm_config = FactualKnowledgeConfig("<OR>")
eval_algorithm = get_eval_algorithm("factual_knowledge", eval_algorithm_config)

먼저 하나의 샘플로 테스트해 보겠습니다. 평가 점수는 사실상 옳은 응답의 비율입니다.

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

eval_algo.evaluate_sample(
    target_output="UK<OR>England<OR>United Kingdom", 
	model_output=model_output
)
the UK, and the UK is the largest producer of food in the world.

The UK is the world's largest producer of food in the world.
[EvalScore(name='factual_knowledge', value=1)]

완벽한 응답은 아니지만 ‘UK’가 포함되어 있습니다.

다음으로 기본 제공 데이터 세트를 사용하여 FM을 평가하거나 사용자 지정 데이터 세트를 정의할 수 있습니다. 사용자 지정 평가 데이터 세트를 사용하려면 DataConfig 인스턴스를 생성합니다.

config = DataConfig(
    dataset_name="my_custom_dataset",
    dataset_uri="dataset.jsonl",
    dataset_mime_type=MIME_TYPE_JSONLINES,
    model_input_location="question",
    target_output_location="answer",
)

eval_output = eval_algorithm.evaluate(
    model=model, 
    dataset_config=config, 
    prompt_template="$feature", #$feature is replaced by the input value in the dataset 
    save=True
)

평가 결과는 데이터 세트 전체의 통합 평가 점수와 로컬 출력 경로에 저장된 각 모델 입력에 대한 세부 결과를 반환합니다.

미리 보기에 참여하기
오늘부터 미국 동부(오하이오), 미국 동부(버지니아 북부), 미국 서부(오레곤), 아시아 태평양(싱가포르), 아시아 태평양(도쿄), 유럽(프랑크푸르트) 및 유럽(아일랜드) AWS 리전에서 Amazon SageMaker Clarify를 사용하여 FM을 평가할 수 있습니다. FMEval 오픈 소스 라이브러리는 GitHub에서 사용 가능합니다. 자세히 알아보려면 Amazon SageMaker Clarify로 이동하세요.

시작하기
지금 바로 AWS Management Console에 로그인하여 SageMaker Clarify로 FM을 평가해 보세요!

— Antje