

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

# JumpStart 모델의 프롬프트 고정 관념화 평가
<a name="clarify-foundation-model-evaluate-auto-tutorial-one"></a>

상위 수준 `ModelRunner` 래퍼를 사용하여 프롬프트 고정 관념화에 대해 Amazon SageMaker JumpStart 모델을 평가할 수 있습니다. 프롬프트 고정 관념화 알고리즘은 모델이 응답에서 편향을 인코딩할 확률을 측정합니다. 이러한 편향에는 인종, 성별, 성적 지향, 종교, 연령, 국적, 장애, 신체적 외모 및 사회경제적 상태에 대한 편향이 포함됩니다.

이 자습서에서는 JumpStart에서 사용할 수 있는 [Technology Innovation Institute](https://www.tii.ae/)의 [Falcon 7-B](https://huggingface.co/tiiuae/falcon-7b) 모델을 로드하고 이 모델에 프롬프트에 대한 응답을 생성하도록 요청하는 방법을 보여줍니다. 그런 다음 이 자습서에서는 기본 제공 [CrowS -Pairs](https://github.com/nyu-mll/crows-pairs) 오픈 소스 챌린지 데이터세트와 비교해 응답에서 프롬프트 고정 관념화를 평가하는 방법을 보여줍니다.

자습서의 이 섹션에서는 다음을 수행하는 방법을 보여줍니다.
+ 환경을 설정합니다.
+ 모델 평가를 실행합니다.
+ 분석 결과를 봅니다.

## 환경 설정
<a name="clarify-foundation-model-evaluate-auto-tutorial-one-setup"></a>

**사전 조건**
+ 이 자습서를 시작하기 전에 기본 3.10 Python 커널 환경과 `ml.g4dn.2xlarge` Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스를 사용합니다.

  인스턴스 유형 및 권장 사용 사례에 대한 자세한 내용은 [Amazon SageMaker Studio Classic 노트북에 사용할 수 있는 인스턴스 유형](notebooks-available-instance-types.md) 섹션을 참조하세요.

**필요한 라이브러리 설치**

1. 다음과 같이 코드에 SageMaker AI, `fmeval` 및 기타 필수 라이브러리를 설치합니다.

   ```
   !pip3 install sagemaker
   !pip3 install -U pyarrow
   !pip3 install -U accelerate
   !pip3 install "ipywidgets>=8"
   !pip3 install jsonlines
   !pip install fmeval
   !pip3 install boto3==1.28.65
   import sagemaker
   ```

1. 샘플 `JSON Lines` 데이터세트 [crows-pairs\$1sample.jsonl](https://github.com/aws/fmeval/blob/main/examples/crows-pairs_sample.jsonl)을 현재 작업 디렉터리에 다운로드합니다.

1. 다음 코드를 사용하여 환경에 샘플 입력 파일이 포함되어 있는지 확인합니다.

   ```
   import glob
   
   # Check for fmeval wheel and built-in dataset
   if not glob.glob("crows-pairs_sample.jsonl"):
   print("ERROR - please make sure file exists: crows-pairs_sample.jsonl")
   ```

1. 다음과 같이 JumpStart 모델을 정의합니다.

   ```
   from sagemaker.jumpstart.model import JumpStartModel
   
   model_id, model_version, = (
   "huggingface-llm-falcon-7b-instruct-bf16",
   "*",
   )
   ```

1. JumpStart 모델을 배포하고 다음과 같이 엔드포인트를 만듭니다.

   ```
   my_model = JumpStartModel(model_id=model_id)
   predictor = my_model.deploy()
   endpoint_name = predictor.endpoint_name
   ```

1. 다음과 같이 프롬프트와 모델 요청 또는 페이로드의 형식을 정의합니다.

   ```
   prompt = "London is the capital of"
   payload = {
   "inputs": prompt,
   "parameters": {
       "do_sample": True,
       "top_p": 0.9,
       "temperature": 0.8,
       "max_new_tokens": 1024,
       "decoder_input_details" : True,
       "details" : True
   },
   }
   ```

   이전 코드 예시에서는 모델 요청에 다음 파라미터가 포함됩니다.
   + `do_sample` - 모델 추론 중에 원시 모델 출력(정규화 전)에서 샘플링하도록 모델에 지시하여 모델 응답에 다양성과 창의성을 더합니다. 기본값은 `False`입니다. `do_sample`을 `True`로 설정한 경우 `temperature`, `top_k`, `top_p` 또는 `typical_p` 파라미터 중 하나에 값을 지정해야 합니다.
   + `top_p` - 다음 토큰을 생성할 때 고려할 토큰 세트를 제한하여 무작위성을 제어합니다. `top_p`의 값이 클수록 더 넓은 어휘가 포함된 세트가 허용됩니다. 값이 작으면 토큰 세트가 더 가능성이 높은 단어로 제한됩니다. `top_p`의 범위는 `0`보다 크고 `1`보다 작습니다.
   + `temperature` - 생성된 텍스트의 무작위성을 제어합니다. `temperature`의 값이 클수록 모델에 더 무작위적이고 다양한 응답을 생성하도록 지시합니다. 값이 작으면 예측 가능한 응답이 생성됩니다. `temperature`의 값은 양수여야 합니다.
   + `max_new_tokens` - 모델에서 반환되는 토큰 수를 제한하여 응답의 길이를 제한합니다. 기본값은 `20`입니다.
   + `decoder_input_details` - 모델이 각 다음 잠재적 토큰과 해당 토큰 ID에 할당한 로그 가능성에 대한 정보를 반환합니다. `decoder_input_details`이 `True`로 설정된 경우 요청된 세부 정보를 수신하려면 `details`도 `True`로 설정해야 합니다. 기본값은 `False`입니다.

   이 `Hugging Face` 모델의 파라미터에 대한 자세한 내용은 [types.py](https://github.com/huggingface/text-generation-inference/blob/v0.9.3/clients/python/text_generation/types.py#L8)를 참조하세요.

## 샘플 추론 요청 전송
<a name="clarify-foundation-model-evaluate-auto-tutorial-one-sample"></a>

모델을 테스트하려면 모델로 샘플 요청을 보내고 다음과 같이 모델 응답을 인쇄합니다.

```
response = predictor.predict(payload)
print(response[0]["generated_text"])
```

이전 코드 예시에서 모델이 `[{"response": "this is the output"}]` 응답을 제공한 경우 `print` 문은 `this is the output`을 반환합니다.

## FMEval 설정
<a name="clarify-foundation-model-evaluate-auto-tutorial-one-fmeval"></a>

1. 다음과 같이 FMEval을 실행하는 데 필요한 라이브러리를 로드합니다.

   ```
   import fmeval
   from fmeval.data_loaders.data_config import DataConfig
   from fmeval.model_runners.sm_jumpstart_model_runner import JumpStartModelRunner
   from fmeval.constants import MIME_TYPE_JSONLINES
   from fmeval.eval_algorithms.prompt_stereotyping import PromptStereotyping, PROMPT_STEREOTYPING
   from fmeval.eval_algorithms import EvalAlgorithm
   ```

1. 입력 데이터세트의 데이터 구성을 설정합니다.

   기본 제공 데이터세트를 사용하지 않는 경우 데이터 구성은 `sent_more_input_location`에서 더 많은 편향이 포함된 열을 식별해야 합니다. 또한 `sent_less_input_location`에서 편향이 적은 열을 식별해야 합니다. JumpStart의 기본 제공 데이터세트를 사용하는 경우 이러한 파라미터는 모델 메타데이터를 통해 FMEval로 자동으로 전달됩니다.

   프롬프트 고정 관념화 작업, 이름, URI(Uniform Resource Identifier) 및 `MIME` 유형에 대한 `sent_more_input_location` 및 `sent_less_input_location` 열을 지정합니다.

   ```
   config = DataConfig(
   dataset_name="crows-pairs_sample",
   dataset_uri="crows-pairs_sample.jsonl",
   dataset_mime_type=MIME_TYPE_JSONLINES,
   sent_more_input_location="sent_more",
   sent_less_input_location="sent_less",
   category_location="bias_type",
   )
   ```

   다른 작업에 필요한 열 정보에 대한 자세한 내용은 [사용자 지정 입력 데이터세트 사용](clarify-foundation-model-evaluate-auto-lib-custom.md#clarify-foundation-model-evaluate-auto-lib-custom-input)의 **사용자 지정 입력 데이터세트 사용** 섹션을 참조하세요.

1. 다음 코드 예시에 표시된 대로 사용자 지정 `ModelRunner`를 설정합니다.

   ```
   js_model_runner = JumpStartModelRunner(
   endpoint_name=endpoint_name,
   model_id=model_id,
   model_version=model_version,
   output='[0].generated_text',
   log_probability='[0].details.prefill[*].logprob',
   content_template='{"inputs": $prompt, "parameters":
   {"do_sample": true, "top_p": 0.9, "temperature": 0.8, "max_new_tokens": 1024,
   "decoder_input_details": true,"details": true}}',
   )
   ```

   이전 코드 예시에서는 다음을 지정합니다.
   + `endpoint_name` - 이전 **필수 라이브러리 설치** 단계에서 만든 엔드포인트의 이름입니다.
   + `model_id` – 모델을 지정하는 데 사용되는 ID입니다. 이 파라미터는 JumpStart 모델이 정의될 때 지정되었습니다.
   + `model_version` - 모델을 지정하는 데 사용되는 모델의 버전입니다. 이 파라미터는 JumpStart 모델이 정의될 때 지정되었습니다.
   + `output` - `generated_text` 키에 응답을 반환하는 [Falcon 7b 모델](https://huggingface.co/tiiuae/falcon-7b)에서 출력을 캡처합니다. 모델이 `[{"generated_text": "this is the output"}]` 응답을 제공한 경우 `[0].generated_text`는 `this is the output`을 반환합니다.
   + `log_probability` - 이 JumpStart 모델에서 반환된 로그 확률을 캡처합니다.
   + `content_template` - 모델이 요청과 상호 작용하는 방식을 지정합니다. 예시 구성 템플릿은 이전 예시를 설명하기 위한 목적으로만 자세히 설명되어 있으며 필수는 아닙니다. 콘텐츠 템플릿의 파라미터는 `payload`에 대해 선언된 파라미터와 동일합니다. 이 `Hugging Face` 모델의 파라미터에 대한 자세한 내용은 [types.py](https://github.com/huggingface/text-generation-inference/blob/v0.9.3/clients/python/text_generation/types.py#L8)를 참조하세요.

1. 다음 예시 코드와 같이 평가 보고서를 구성하고 디렉터리에 저장합니다.

   ```
   import os
   eval_dir = "results-eval-prompt-stereotyping"
   curr_dir = os.getcwd()
   eval_results_path = os.path.join(curr_dir, eval_dir) + "/"
   os.environ["EVAL_RESULTS_PATH"] = eval_results_path
   if os.path.exists(eval_results_path):
   print(f"Directory '{eval_results_path}' exists.")
   else:
   os.mkdir(eval_results_path)
   ```

1. 다음과 같이 병렬화 인수를 설정합니다.

   ```
   os.environ["PARALLELIZATION_FACTOR"] = "1"
   ```

   `PARALLELIZATION_FACTOR`는 컴퓨팅 인스턴스로 전송된 동시 배치 수의 승수입니다. 하드웨어가 병렬화를 허용하는 경우 이 숫자를 설정하여 평가 작업에 대한 간접 호출 수를 곱할 수 있습니다. 예를 들어 `100` 간접 호출이 있고 `PARALLELIZATION_FACTOR`가 `2`로 설정된 경우 작업은 `200` 간접 호출을 실행합니다. `PARALLELIZATION_FACTOR`를 최대 `10`까지 늘리거나 변수를 완전히 제거할 수 있습니다. Lambda의 사용 방식에 AWS 대한 블로그를 읽으려면 [Kinesis 및 DynamoDB 이벤트 소스에 대한 새 AWS Lambda 조정 제어를](https://aws.amazon.com/blogs/compute/new-aws-lambda-scaling-controls-for-kinesis-and-dynamodb-event-sources/) `PARALLELIZATION_FACTOR` 참조하세요.

## 모델 평가 실행
<a name="clarify-foundation-model-evaluate-auto-tutorial-one-run"></a>

1. 평가 알고리즘을 정의합니다. 다음 예시는 `PromptStereotyping` 알고리즘을 정의하는 방법을 보여줍니다.

   ```
   eval_algo = PromptStereotyping()
   ```

   다른 평가 작업에 대한 지표를 계산하는 알고리즘의 예는 [`fmeval` 라이브러리를 사용하여 자동 평가 실행](clarify-foundation-model-evaluate-auto-lib.md)의 **모델 평가**를 참조하세요.

1. 평가 알고리즘을 실행합니다. 다음 코드 예시에서는 이전에 정의한 모델 및 데이터 구성과 `feature`를 사용하여 다음과 같이 프롬프트를 모델에 전달하는 `prompt_template`을 사용합니다.

   ```
   eval_output = eval_algo.evaluate(model=js_model_runner, dataset_config=config,
   prompt_template="$feature", save=True)
   ```

   모델 출력은 이전 샘플 출력과 다를 수 있습니다.

## 분석 결과 보기
<a name="clarify-foundation-model-evaluate-auto-tutorial-one-view"></a>

1. 다음과 같이 평가 알고리즘에서 반환한 `eval_output` 객체에서 평가 보고서를 구문 분석합니다.

   ```
   import json
   print(json.dumps(eval_output, default=vars, indent=4))
   ```

   이전 명령은 다음 출력을 반환합니다(간결성을 위해 압축됨).

   ```
   [
   {
       "eval_name": "prompt_stereotyping",
       "dataset_name": "crows-pairs_sample",
       "dataset_scores": [
           {
               "name": "prompt_stereotyping",
               "value": 0.6666666666666666
           }
       ],
       "prompt_template": "$feature",
       "category_scores": [
           {
               "name": "disability",
               "scores": [
                   {
                       "name": "prompt_stereotyping",
                       "value": 0.5
                   }
               ]
           },
           ...
       ],
       "output_path": "/home/sagemaker-user/results-eval-prompt-stereotyping/prompt_stereotyping_crows-pairs_sample.jsonl",
       "error": null
   }
   ]
   ```

   이전 예시 출력에는 `"name": prompt_stereotyping`을 따르는 데이터세트의 전체 점수가 표시됩니다. 이 점수는 편향을 **더 많이** 제공하는 모델 응답과 더 적게 제공하는 모델 응답 간의 로그 확률의 정규화된 차이입니다. 점수가 `0.5`보다 크면 모델 응답이 더 많은 편향을 포함하는 응답을 반환할 가능성이 더 크다는 의미입니다. 점수가 `0.5`보다 작으면 모델이 더 적은 편향을 포함하는 응답을 반환할 가능성이 더 크다는 의미입니다. 점수가 `0.5`인 경우 모델 응답에 입력 데이터세트로 측정한 편향이 포함되지 않습니다. 다음 단계에서 `output_path`를 사용하여 `Pandas` `DataFrame`을 만듭니다.

1. 결과를 가져와 `DataFrame`에 읽고 다음과 같이 프롬프트 고정 관념화 점수를 모델 입력, 모델 출력 및 대상 출력에 연결합니다.

   ```
   import pandas as pd
   data = []
   with open(os.path.join(eval_results_path,
   "prompt_stereotyping_crows-pairs_sample.jsonl"), "r") as file:
   for line in file:
   data.append(json.loads(line))
   df = pd.DataFrame(data)
   df['eval_algo'] = df['scores'].apply(lambda x: x[0]['name'])
   df['eval_score'] = df['scores'].apply(lambda x: x[0]['value'])
   df
   ```

   이 섹션에 제공된 코드 예시가 포함된 노트북은 [Jumpstart-falcon-stereotyping.ipnyb](https://github.com/aws/fmeval/blob/main/examples/jumpstart-falcon-stereotyping.ipynb)를 참조하세요.