기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
상위 수준 ModelRunner
래퍼를 사용하여 프롬프트 고정 관념화에 대해 Amazon SageMaker JumpStart 모델을 평가할 수 있습니다. 프롬프트 고정 관념화 알고리즘은 모델이 응답에서 편향을 인코딩할 확률을 측정합니다. 이러한 편향에는 인종, 성별, 성적 지향, 종교, 연령, 국적, 장애, 신체적 외모 및 사회경제적 상태에 대한 편향이 포함됩니다.
이 자습서에서는 JumpStart에서 사용할 수 있는 Technology Innovation Institute
자습서의 이 섹션에서는 다음을 수행하는 방법을 보여줍니다.
-
환경을 설정합니다.
-
모델 평가를 실행합니다.
-
분석 결과를 봅니다.
환경을 설정합니다
사전 조건
-
이 자습서를 시작하기 전에 기본 3.10 Python 커널 환경과
ml.g4dn.2xlarge
Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스를 사용합니다.인스턴스 유형 및 권장 사용 사례에 대한 자세한 내용은 Studio Classic에 사용할 수 있는 인스턴스 유형 섹션을 참조하세요.
필요한 라이브러리 설치
-
다음과 같이 코드에 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
-
샘플
JSON Lines
데이터세트 crows-pairs_sample.jsonl을 현재 작업 디렉터리에 다운로드합니다. -
다음 코드를 사용하여 환경에 샘플 입력 파일이 포함되어 있는지 확인합니다.
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")
-
다음과 같이 JumpStart 모델을 정의합니다.
from sagemaker.jumpstart.model import JumpStartModel model_id, model_version, = ( "huggingface-llm-falcon-7b-instruct-bf16", "*", )
-
JumpStart 모델을 배포하고 다음과 같이 엔드포인트를 만듭니다.
my_model = JumpStartModel(model_id=model_id) predictor = my_model.deploy() endpoint_name = predictor.endpoint_name
-
다음과 같이 프롬프트와 모델 요청 또는 페이로드의 형식을 정의합니다.
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를 참조하세요. -
샘플 추론 요청 전송
모델을 테스트하려면 모델로 샘플 요청을 보내고 다음과 같이 모델 응답을 인쇄합니다.
response = predictor.predict(payload)
print(response[0]["generated_text"])
이전 코드 예시에서 모델이 [{"response": "this is the output"}]
응답을 제공한 경우 print
문은 this is the
output
을 반환합니다.
FMEval 설정
-
다음과 같이 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
-
입력 데이터세트의 데이터 구성을 설정합니다.
기본 제공 데이터세트를 사용하지 않는 경우 데이터 구성은
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", )
다른 작업에 필요한 열 정보에 대한 자세한 내용은 사용자 지정 입력 데이터세트 사용의 사용자 지정 입력 데이터세트 사용 섹션을 참조하세요.
-
다음 코드 예시에 표시된 대로 사용자 지정
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 모델에서 출력을 캡처합니다. 모델이 [{"generated_text": "this is the output"}]
응답을 제공한 경우[0].generated_text
는this is the output
을 반환합니다. -
log_probability
- 이 JumpStart 모델에서 반환된 로그 확률을 캡처합니다. -
content_template
- 모델이 요청과 상호 작용하는 방식을 지정합니다. 예시 구성 템플릿은 이전 예시를 설명하기 위한 목적으로만 자세히 설명되어 있으며 필수는 아닙니다. 콘텐츠 템플릿의 파라미터는payload
에 대해 선언된 파라미터와 동일합니다. 이Hugging Face
모델의 파라미터에 대한 자세한 내용은 types.py를 참조하세요.
-
-
다음 예시 코드와 같이 평가 보고서를 구성하고 디렉터리에 저장합니다.
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)
-
다음과 같이 병렬화 인수를 설정합니다.
os.environ["PARALLELIZATION_FACTOR"] = "1"
PARALLELIZATION_FACTOR
는 컴퓨팅 인스턴스로 전송된 동시 배치 수의 승수입니다. 하드웨어가 병렬화를 허용하는 경우 이 숫자를 설정하여 평가 작업에 대한 간접 호출 수를 곱할 수 있습니다. 예를 들어100
간접 호출이 있고PARALLELIZATION_FACTOR
가2
로 설정된 경우 작업은200
간접 호출을 실행합니다.PARALLELIZATION_FACTOR
를 최대10
까지 늘리거나 변수를 완전히 제거할 수 있습니다. Lambda의 사용 방식에 AWS 대한 블로그를 읽으려면 Kinesis 및 DynamoDB 이벤트 소스에 대한 새 AWS Lambda 조정 제어를PARALLELIZATION_FACTOR
참조하세요.
모델 평가 실행
-
평가 알고리즘을 정의합니다. 다음 예시는
PromptStereotyping
알고리즘을 정의하는 방법을 보여줍니다.eval_algo = PromptStereotyping()
다른 평가 작업에 대한 지표를 계산하는 알고리즘의 예는 fmeval 라이브러리를 사용하여 자동 평가 실행의 모델 평가를 참조하세요.
-
평가 알고리즘을 실행합니다. 다음 코드 예시에서는 이전에 정의한 모델 및 데이터 구성과
feature
를 사용하여 다음과 같이 프롬프트를 모델에 전달하는prompt_template
을 사용합니다.eval_output = eval_algo.evaluate(model=js_model_runner, dataset_config=config, prompt_template="$feature", save=True)
모델 출력은 이전 샘플 출력과 다를 수 있습니다.
분석 결과 보기
-
다음과 같이 평가 알고리즘에서 반환한
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
을 만듭니다. -
결과를 가져와
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
를 참조하세요.