

# SageMaker 훈련 작업에서 Amazon Nova 사용자 지정
<a name="nova-model-training-job"></a>

SageMaker 훈련 작업은 기계 학습 모델을 대규모로 훈련할 수 있는 환경입니다. 컴퓨팅 리소스를 자동으로 프로비저닝 및 확장하고, Amazon S3와 같은 소스에서 훈련 데이터를 로드하고, 훈련 코드를 실행하고, 결과 모델 아티팩트를 저장합니다.

훈련의 목적은 독점 데이터를 사용하여 기본 Amazon Nova 모델을 사용자 지정하는 것입니다. 훈련 프로세스에는 일반적으로 데이터를 준비하고, [레시피](nova-model-recipes.md)를 선택하며, YAML 파일에서 구성 파라미터를 수정하고, 훈련 작업을 제출하는 단계가 포함됩니다. 훈련 프로세스는 훈련된 모델 체크포인트를 서비스 관리형 Amazon S3 버킷에 출력합니다. 이 체크포인트 위치를 평가 작업에 사용할 수 있습니다. SageMaker AI 훈련 작업에서 Nova 사용자 지정을 수행하면, 모델 아티팩트가 서비스 관리형 Amazon S3 버킷에 저장됩니다. 서비스 관리형 버킷의 아티팩트는 SageMaker AI 관리형 KMS 키로 암호화됩니다. 현재 서비스 관리형 Amazon S3 버킷은 고객 관리형 KMS 키를 사용한 데이터 암호화를 지원하지 않습니다.

## Amazon Nova 사용자 지정 모범 사례
<a name="best-practices"></a>

### 개요
<a name="nova-customization-overview"></a>

이 섹션에서는 사용자 지정 기법에 대한 개요를 제공하고, 요구 사항과 사용 가능한 데이터에 가장 적합한 접근 방식을 선택하는 데 도움을 줍니다.

#### LLM 훈련의 두 가지 단계
<a name="nova-llm-training-stages"></a>

대규모 언어 모델 훈련은 두 가지 주요 단계(사전 훈련 및 사후 훈련)로 구성됩니다. 사전 훈련 단계에서 모델은 원시 텍스트의 토큰을 처리하고 다음 토큰 예측을 위해 최적화됩니다. 이 프로세스에서는 웹 및 엄선된 텍스트에서 구문, 시맨틱, 사실 및 추론 패턴을 흡수하는 패턴 완성기를 생성합니다. 그러나 사전 훈련된 모델은 지침, 사용자 목표 또는 컨텍스트별 동작을 이해하지 못합니다. 훈련 배포에 맞는 스타일로 텍스트를 계속 처리합니다. 사전 훈련된 모델은 지침을 따르는 대신 자동 완성을 수행하고, 일치하지 않는 형식을 생성하며, 훈련 데이터에서 원치 않는 편향이나 안전하지 않은 콘텐츠를 미러링할 수 있습니다. 사전 훈련에서는 태스크 유용성이 아닌 일반적인 기능을 구축합니다.

사후 훈련에서는 패턴 완성기를 유용한 어시스턴트로 변환합니다. 여러 차례의 감독 미세 조정(SFT)을 실행하여 모델이 지침을 따르고, 스키마 및 정책을 준수하며, 도구를 직접 호출하고, 고품질 데모를 모방하여 신뢰할 수 있는 출력을 생성하도록 가르칩니다. 이 조정을 통해 계속 진행하려면 텍스트가 아닌 태스크로 프롬프트에 응답하도록 모델을 가르칩니다. 그런 다음 강화 미세 조정(RFT)을 적용하여 측정 가능한 피드백(예: 확인자 또는 평가형 LLM), 정확도와 간결성, 안전과 적용 범위 또는 제약 조건 아래에서 여러 단계의 추론과 같은 장단점의 균형을 맞춰 동작을 최적화합니다. 실제로 SFT와 RFT를 주기적으로 교체하여 사전 훈련된 모델을 복잡한 태스크를 일관되게 수행하는 신뢰할 수 있는 정책 조정 시스템으로 구축합니다.

### 올바른 사용자 지정 접근 방식 선택
<a name="nova-choosing-customization-approach"></a>

이 섹션에서는 사후 훈련 사용자 지정 전략(RFT 및 SFT)을 다룹니다.

#### 강화 미세 조정(RFT)
<a name="nova-reinforcement-fine-tuning"></a>

강화 미세 조정은 정확히 올바른 답변으로 직접 감독하는 대신 응답 품질을 나타내는 피드백 신호(측정 가능한 점수 또는 보상)를 통해 모델 성능을 개선합니다. 입력과 출력 페어로부터 학습하는 기존의 지도 미세 조정과 달리, RFT는 보상 함수를 사용하여 모델 응답을 평가하고 반복적으로 모델을 최적화하여 이러한 보상을 극대화합니다. 이 접근 방식은 정확히 올바른 출력을 정의하기 어려운 태스크에 효과적이지만 신뢰할 수 있는 방식으로 응답 품질을 측정할 수 있습니다. RFT를 사용하면 모델이 시험과 피드백을 통해 복잡한 행동과 선호도를 학습할 수 있으므로, 세심한 의사 결정, 창의적인 문제 해결 또는 프로그래밍 방식으로 평가할 수 있는 특정 품질 기준 준수가 필요한 애플리케이션에 적합합니다. 예를 들어 복잡한 법적 질문에 대한 답변은 RFT의 이상적인 사용 사례입니다. 질문에 더 정확하게 답변하는 방법을 모델에 가르치고 싶기 때문입니다.

##### 작동 방식
<a name="nova-rft-how-it-works"></a>

강화 미세 조정에서는 지침 조정 기준에서 시작하여 각 프롬프트를 작은 토너먼트와 같이 처리합니다. 주어진 입력에 대해 모델의 몇 가지 후보 답변을 샘플링하고 보상 함수로 각각의 점수를 매긴 후 해당 그룹 내에서 순위를 정합니다. 업데이트 단계에서는 다음에 점수가 내려가지 않고 점수가 더 높아질 수 있도록 모델을 유도하면서, 기준 유지 제약 조건을 통해 동작이 드리프팅되거나 장황해지거나 악용되는 것을 방지합니다. 많은 프롬프트에서 이 루프를 반복하여 하드 케이스를 새로 고치고, 악용이 발견되면 확인자 또는 평가 루브릭을 강화하며, 태스크 지표를 지속적으로 추적합니다.

##### RFT는 사용하는 경우
<a name="nova-rft-when-to-use"></a>

RFT를 가장 많이 활용하는 태스크는 몇 가지 특성을 공유합니다. 하나의 올바른 출력을 지정하기 어려운 경우에도 측정 가능한 성공 신호를 제공합니다. 부분 크레딧 또는 등급이 지정된 품질을 인정하므로 프롬프트 내에서 또는 보상 함수를 사용하여 더 좋거나 나쁜 응답의 순위를 정할 수 있습니다. 여기에는 균형을 맞춰야 하는 여러 목표(예: 간결함, 명확함, 안전 또는 비용을 고려한 정확성)가 포함됩니다. 프로그래밍 방식으로 확인할 수 있는 명시적 제약 조건을 준수해야 합니다. 결과를 관찰할 수 있는 도구로 조정되는 설정 또는 환경 기반 설정(성공 또는 실패, 지연 시간, 리소스 사용)에서 작동합니다. 이는 골드 타겟을 수집하는 데 비용이 많이 들지만 자동 피드백이나 루브릭 기반 피드백이 많은 낮은 수준의 레이블 영역에서 나타납니다. RFT는 품질을 신뢰할 수 있는 스칼라 또는 순위로 전환하고 레이블이 지정된 전수 대상 없이도 모델이 더 높은 점수의 동작을 우선적으로 증폭하도록 하는 경우에 가장 효과적입니다.

**다음과 같은 경우 다른 방법을 고려합니다.**
+ 신뢰할 수 있는 많은 레이블이 지정된 입력과 출력 페어가 있는 경우 - SFT 사용
+ 기본 격차가 지식 또는 전문 용어에서 발생하는 경우 - 검색 증강 생성(RAG) 사용
+ 보상 신호에 노이즈가 있거나 이를 신뢰할 수 없으며 더 나은 루브릭이나 검사기로 수정할 수 없는 경우 - RFT 이전에 먼저 안정화

##### RFT를 사용하지 말아야 하는 경우
<a name="nova-rft-when-not-to-use"></a>

다음과 같은 상황에서는 RFT를 사용하지 않습니다.
+ 신뢰할 수 있는 레이블이 지정된 입력과 출력 페어를 저렴하게 생성할 수 있는 경우(SFT가 더 단순하고 저렴하며 안정적임)
+ 격차는 동작이 아닌 지식 또는 전문 용어에서 발생하는 경우(RAG 사용)
+ 보상 신호에 노이즈가 있거나 희소하거나 쉽게 훈련이 가능하거나 비용이 많이 들거나 컴퓨팅 속도가 느린 경우(먼저 평가자 수정)
+ 기준 성능이 0에 가까운 경우(선호도를 최적화하기 전에 SFT로 부트스트랩)
+ 태스크에 결정적 스키마, 엄격한 형식 또는 단일 정답이 포함된 경우(SFT 또는 규칙 기반 검증이 더 효과적임)
+ 긴 지연 시간 또는 비용 예산잉 RFT에 필요한 추가 샘플링 또는 탐색을 수용할 수 없는 경우
+ 안전 또는 정책 제약 조건이 명확하게 지정되지 않고 보상에서 적용 가능하지 않은 경우

'정답'을 가리킬 수 있는 경우 SFT를 사용합니다. 새로운 지식이 필요한 경우 RAG를 사용합니다. 견고한 기준과 강력하고 빠르며 악용하기 어려운 보상 함수가 있는 경우에만 RFT를 사용합니다.

#### 지도 미세 조정(SFT)
<a name="nova-supervised-fine-tuning"></a>

감독 미세 조정은 태스크에 대해 사람이 레이블을 지정하는 입력과 출력 페어의 데이터세트를 기반으로 LLM을 훈련합니다. 올바른 응답이나 원하는 응답과 함께 프롬프트의 예제(질문, 지침 등)를 제공하고 이를 기반으로 모델을 계속 훈련합니다. 모델은 지도 손실(일반적으로 예측과 대상 출력 토큰 사이의 교차 엔트로피)를 최소화하도록 해당 가중치를 조정합니다. 이는 대부분의 지도 기계 학습 태스크에 사용되는 것과 동일한 훈련으로, LLM을 전문화하는 데 적용됩니다.

SFT는 지식이 아닌 동작을 변경합니다. 사전 훈련에서 나타나지 않았던 새로운 사실이나 전문 용어를 모델에 가르치지 않습니다. 모델에 알아야 할 내용이 아닌 어떻게 답변하는지를 가르칩니다. 새로운 도메인 지식(예: 내부 용어)이 필요한 경우 검색 증강 생성(RAG)을 사용하여 추론 시 해당 컨텍스트를 제공합니다. 그런 다음 SFT는 원하는 지침 준수 동작을 맨 위에 추가합니다.

##### 작동 방식
<a name="nova-sft-how-it-works"></a>

SFT는 응답 토큰의 평균 교차 엔트로피 손실을 최소화하고 프롬프트 토큰을 컨텍스트로 처리하며 손실로부터 해당 정보를 마스킹하여 LLM을 최적화합니다. 모델은 대상 스타일, 구조 및 의사 결정 규칙을 내재화하여 각 프롬프트에 대해 올바른 완성 항목을 생성하는 방법을 학습합니다. 예를 들어 문서를 사용자 지정 카테고리로 분류하려면 프롬프트(문서 텍스트)와 레이블이 지정된 완성 항목(카테고리 레이블)으로 모델을 미세 조정합니다. 모델이 높은 확률로 각 프롬프트에 올바른 레이블을 출력할 때까지 해당 페어에서 훈련합니다.

몇백 개의 소수 예제만으로 SFT를 수행하다가 수십만 개로 스케일 업할 수 있습니다. SFT 샘플은 고품질이어야 하며 원하는 모델 동작에 맞게 직접 조정되어야 합니다.

##### SFT는 사용하는 경우
<a name="nova-sft-when-to-use"></a>

원하는 출력이 명확한 잘 정의된 태스크가 있는 경우 SFT를 사용합니다. 'X 입력 제공, 올바른 출력은 Y'라고 명시적으로 말할 수 있고 이러한 매핑의 예제를 수집할 수 있는 경우 지도 미세 조정이 적합합니다. SFT는 다음 시나리오에서 뛰어납니다.
+ **구조화되거나 복잡한 분류 태스크** - 내부 문서 또는 계약을 여러 사용자 지정 카테고리로 분류합니다. SFT를 사용하면 모델은 프롬프트만 사용할 때보다 이러한 특정 카테고리를 훨씬 더 잘 학습할 수 있습니다.
+ **알려진 답변이 있는 질문 답변 또는 변환 태스크** - 회사의 지식 베이스를 통해 질문에 답변하거나 각 입력에 올바른 응답이 있는 경우 여러 형식 사이에서 데이터를 변환하도록 모델을 미세 조정합니다.
+ **형식 지정 및 스타일 일관성** - 올바른 형식이나 어조의 예제를 미세 조정하여 모델이 항상 특정 형식 또는 어조로 응답하도록 훈련합니다. 예를 들어 특정 브랜드 음성을 보여주는 프롬프트와 응답 페어에서 훈련하는 경우 해당 스타일로 출력을 생성하도록 모델을 가르칩니다. 지침 준수 동작은 종종 처음에 SFT를 통해 선별된 올바른 어시스턴트 동작 예제를 사용하여 학습됩니다.

SFT는 올바른 동작을 지정할 수 있는 경우 LLM에 새로운 기술이나 동작을 가르치는 가장 직접적인 방법입니다. 그리고 모델의 기존 언어 이해를 사용하고 태스크에 집중합니다. 모델이 특정 작업을 수행하도록 하고 예제 데이터세트를 생성하거나 생성할 수 있는 경우 SFT를 사용합니다.

원하는 동작을 밀접하게 미러링하는 고품질 프롬프트 및 응답 페어를 조합할 수 있는 경우 SFT를 사용합니다. 스키마, 함수 또는 도구 직접 호출, 모방이 적절한 훈련 신호인 구조화된 답변과 같은 명확한 대상이나 결정적 형식이 있는 태스크에 적합합니다. 목표는 동작을 구성하는 것입니다. 즉, 프롬프트를 태스크로 처리하고, 지침을 따르며, 어조 및 거부 정책을 채택하고, 일관된 형식을 생성하도록 모델을 가리칩니다. 원시 볼륨보다 데이터 품질, 일관성 및 중복 제거가 더 중요한 수백 개 이상의 데모를 계획합니다. 직관적이고 비용 효율적인 업데이트를 위해 저순위 적응과 같은 파라미터 효율적 메서드를 사용하여 대부분의 백본을 그대로 유지하면서 소형 어댑터를 훈련합니다.

##### SFT를 사용하지 말아야 하는 경우
<a name="nova-sft-when-not-to-use"></a>

격차가 동작이 아닌 지식인 경우 SFT를 사용하지 마세요. 모델에 새로운 사실, 전문 용어 또는 최근 이벤트를 가르치지 않습니다. 이러한 경우 검색 증강 생성을 사용하여 추론 시 외부 지식을 가져옵니다. 품질을 측정할 수 있지만 하나의 올바른 답변에 레이블을 지정할 수 없는 경우 SFT를 사용하지 마세요. 확인 가능한 보상 또는 평가형 LLM로 강화 미세 조정을 사용하여 이러한 보상을 직접 최적화합니다. 요구 사항이나 콘텐츠가 자주 변경되는 경우 모델을 재훈련하는 대신 검색 및 도구 사용에 의존하세요.

**Topics**
+ [Amazon Nova 사용자 지정 모범 사례](#best-practices)
+ [Nova Forge SDK](nova-forge-sdk.md)
+ [Amazon Nova 모델에 대한 훈련](smtj-training.md)
+ [여러 반복에서 진행 상황 모니터링](nova-model-monitor.md)
+ [SageMaker AI로 훈련된 모델 평가](nova-model-evaluation.md)
+ [반복 학습](smtj-iterative-training.md)

# Nova Forge SDK
<a name="nova-forge-sdk"></a>

Nova Forge SDK는 Amazon Nova 모델을 사용자 지정하기 위한 포괄적인 Python SDK입니다. 이 SDK에서는 SageMaker AI 및 Amazon Bedrock을 비롯한 다양한 플랫폼에서 Amazon Nova 모델의 훈련, 평가, 모니터링, 배포 및 추론을 위한 통합 인터페이스를 제공합니다. 모델을 도메인별 태스크에 맞게 적응하든 사용 사례에 맞게 성능을 최적화하든 관계없이 이 SDK는 하나의 통합 인터페이스에서 필요한 모든 기능을 제공합니다.

## 이점
<a name="nova-forge-sdk-why-choose"></a>
+ 데이터 준비부터 배포 및 모니터링에 이르기까지 전체 모델 사용자 지정 수명 주기를 위한 단일 SDK.
+ 지속적인 사전 훈련(CPT), 지도 미세 조정(SFT), 직접 선호 최적화(DPO), 강화 미세 조정(RFT), 싱글턴 및 멀티턴 모두를 포함하여 LoRA 및 전체 순위 접근 방식을 함께 여러 훈련 방법에 대한 지원.
+ 자동 리소스 관리를 통해 SageMaker 훈련 작업 및 SageMaker HyperPod, Amazon Bedrock에 대한 기본 제공 지원.
+ 훈련 기법에 적합한 레시피 또는 컨테이너 URI를 더 이상 찾을 필요 없음.
+ 자체 훈련 레시피를 가져오거나 파라미터 재정의와 함께 SDK의 지능형 기본값을 사용합니다.
+ 이 SDK는 지원되는 모델 및 인스턴스 조합에 대해 구성을 검증하고 검증 지원을 제공하여 훈련이 시작되기 전에 오류를 방지합니다.
+ 통합 Amazon CloudWatch 모니터링을 사용하면 훈련 진행 상황을 실시간으로 추적할 수 있습니다.
+ MLFlow를 통합하여 SageMaker AI MLFlow 추적 서버로 훈련 실험을 추적합니다.

## 요구 사항
<a name="nova-forge-sdk-requirements"></a>

SDK에는 Python 3.12 이상이 필요합니다.

## 설치
<a name="nova-forge-sdk-installation"></a>

이 SDK를 설치하려면 아래 명령을 따르세요.

```
pip install amzn-nova-forge
```

## 지원되는 모델 및 기법
<a name="nova-forge-sdk-supported-models"></a>

이 SDK는 Amazon Nova 패밀리 내에서 다음과 같은 모델과 기법을 지원합니다.


****  

| 방법 | 지원되는 모델 | 
| --- | --- | 
| 지속적인 사전 훈련 | [모든 Nova 모델](https://docs.aws.amazon.com/sagemaker/latest/dg/nova-model-recipes.html#nova-model-recipes-reference)(SMHP만 해당) | 
| 지도 미세 조정 LoRA | [모든 Nova 모델](https://docs.aws.amazon.com/sagemaker/latest/dg/nova-model-recipes.html#nova-model-recipes-reference) | 
| 지도 미세 조정 전체 순위 | [모든 Nova 모델](https://docs.aws.amazon.com/sagemaker/latest/dg/nova-model-recipes.html#nova-model-recipes-reference)(SMHP 및 SMTJ만 해당) | 
| 직접 선호 최적화 LoRA | Nova 1.0 모델(SMHP 및 SMTJ만 해당) | 
| 직접 선호 최적화 전체 순위 | Nova 1.0 모델(SMHP 및 SMTJ만 해당) | 
| 강화 미세 조정 LoRA | Nova Lite 2.0 | 
| 강화 미세 조정 전체 순위 | Nova Lite 2.0(SMHP 및 SMTJ만 해당) | 
| 멀티턴 강화 미세 조정 LoRA | Nova Lite 2.0(SMHP만 해당) | 
| 멀티턴 강화 미세 조정 전체 순위 | Nova Lite 2.0(SMHP만 해당) | 

## 시작하기
<a name="nova-forge-sdk-getting-started"></a>

**Topics**
+ [1. 데이터 준비](#nova-forge-sdk-prepare-data)
+ [2. 인프라 구성](#nova-forge-sdk-configure-infrastructure)
+ [3. 훈련](#nova-forge-sdk-train)
+ [4. 모니터링](#nova-forge-sdk-monitor)
+ [5. 평가](#nova-forge-sdk-evaluate)
+ [6. 배포](#nova-forge-sdk-deploy)

### 1. 데이터 준비
<a name="nova-forge-sdk-prepare-data"></a>

로컬 파일 또는 S3에서 데이터세트를 로드하고 SDK가 선택한 훈련 방법에 맞는 올바른 형식으로 변환을 처리하게 합니다. 또는 형식이 지정된 데이터를 제공하고 즉시 시작합니다.

```
from amzn_nova_forge.dataset.dataset_loader import JSONLDatasetLoader
from amzn_nova_forge.model.model_enums import Model, TrainingMethod

loader = JSONLDatasetLoader(question="input", answer="output")
loader.load("s3://your-bucket/training-data.jsonl")
loader.transform(method=TrainingMethod.SFT_LORA, model=Model.NOVA_LITE)
```

### 2. 인프라 구성
<a name="nova-forge-sdk-configure-infrastructure"></a>

컴퓨팅 리소스를 선택합니다. SDK에서 구성을 검증하고 최적의 설정을 보장합니다.

```
from amzn_nova_forge.manager.runtime_manager import BedrockRuntimeManager, SMTJRuntimeManager, SMHPRuntimeManager
# Bedrock
runtime = BedrockRuntimeManager(
execution_role="arn:aws:iam::123456789012:role/ExampleRole"
)

# SageMaker Training Jobs
runtime = SMTJRuntimeManager(
    instance_type="ml.p5.48xlarge",
    instance_count=4
)

# SageMaker HyperPod
runtime = SMHPRuntimeManager(
    instance_type="ml.p5.48xlarge",
    instance_count=4,
    cluster_name="my-hyperpod-cluster",
    namespace="kubeflow"
)
```

### 3. 훈련
<a name="nova-forge-sdk-train"></a>

몇 줄의 코드만으로 훈련을 시작합니다.

```
from amzn_nova_forge.model import NovaModelCustomizer
from amzn_nova_forge.model.model_enums import Model, TrainingMethod

customizer = NovaModelCustomizer(
    model=Model.NOVA_LITE_2,
    method=TrainingMethod.SFT_LORA,
    infra=runtime,
    data_s3_path="s3://your-bucket/prepared-data.jsonl"
)

result = customizer.train(job_name="my-training-job")
```

### 4. 모니터링
<a name="nova-forge-sdk-monitor"></a>

SDK에서 훈련 진행 상황을 직접 추적합니다.

```
from amzn_nova_forge.monitor.log_monitor import CloudWatchLogMonitor

# Monitor training logs
customizer.get_logs()

# Or monitor directly via CloudWatchLogMonitor
monitor = CloudWatchLogMonitor.from_job_result(result)
monitor.show_logs(limit=10)

# Check job status
result.get_job_status() # InProgress, Completed, Failed
```

### 5. 평가
<a name="nova-forge-sdk-evaluate"></a>

다양한 [기본 제공 벤치마크](https://docs.aws.amazon.com/sagemaker/latest/dg/nova-model-evaluation.html#nova-model-evaluation-benchmark)를 사용하여 모델 성능을 평가하거나 자체 평가를 설계합니다.

```
from amzn_nova_forge.recipe_config.eval_config import EvaluationTask

# Evaluate on benchmark tasks
eval_result = customizer.evaluate(
    job_name="model-eval",
    eval_task=EvaluationTask.MMLU,
    model_path=result.model_artifacts.checkpoint_s3_path
)
```

### 6. 배포
<a name="nova-forge-sdk-deploy"></a>

Amazon Bedrock 또는 SageMaker에 대한 기본 지원을 통해 사용자 지정 모델을 프로덕션에 배포합니다.

```
from amzn_nova_forge.model.model_enums import DeployPlatform

# Bedrock provisioned throughput
deployment = customizer.deploy(
    model_artifact_path=result.model_artifacts.checkpoint_s3_path,
    deploy_platform=DeployPlatform.BEDROCK_PT,
    pt_units=10
)

# Bedrock On-Demand
deployment = customizer.deploy(
    model_artifact_path=result.model_artifacts.checkpoint_s3_path,
    deploy_platform=DeployPlatform.BEDROCK_OD,
    pt_units=10
)

# Sagemaker Real-time Inference
deployment = customizer.deploy(
    model_artifact_path=result.model_artifacts.checkpoint_s3_path,
    deploy_platform=DeployPlatform.SAGEMAKER,
    unit_count=10,
    sagemaker_instance_type="ml.p5.48xlarge",
    sagemaker_environment_variables={
        "CONTEXT_LENGTH": "12000",
        "MAX_CONCURRENCY": "16",
    }
)
```

## 주요 기능
<a name="nova-forge-sdk-key-capabilities"></a>

### 즉시 레시피 생성
<a name="nova-forge-sdk-recipe-creation"></a>

이 SDK를 사용하면 특정 기법에 적절한 레시피 또는 컨테이너 URI를 검색할 필요가 없습니다.

### 지능형 데이터 처리
<a name="nova-forge-sdk-data-processing"></a>

SDK에서 훈련을 위한 올바른 형식으로 데이터를 자동 변환합니다. JSON, JSONL 또는 CSV 파일로 작업하는 경우 데이터 로더에서 변환을 원활하게 처리합니다. 데이터 로더는 텍스트와 멀티모달 데이터(이미지 및 비디오)를 지원합니다.

### 엔터프라이즈 인프라 지원
<a name="nova-forge-sdk-infrastructure-support"></a>

이 SDK는 SageMaker 훈련 작업과 SageMaker HyperPod 모두에서 작동하며 다음을 자동으로 관리합니다.
+ 인스턴스 유형 검증
+ 레시피 검증
+ 데이터세트 검증
+ 작업 오케스트레이션 및 모니터링

SDK는 SageMaker 훈련 작업 서버리스 및 Bedrock 사용자 지정도 지원합니다.

### 포괄적인 평가
<a name="nova-forge-sdk-evaluation"></a>

다음을 포함한 [표준 벤치마크](https://docs.aws.amazon.com/sagemaker/latest/dg/nova-hp-evaluate.html)를 기준으로 사용자 지정된 모델을 평가합니다.
+ Massive Multitask Language Understanding(MMLU)
+ 고급 추론 작업(BBH)
+ Graduate-Level Google-Proof Q&A(GPQA)

벤치마크 기본값을 사용하거나 필요에 맞게 수정합니다.
+ 자체 지표 가져오기(BYOM)
+ 자체 데이터세트 가져오기(BYOD)

### 프로덕션 배포
<a name="nova-forge-sdk-deployment"></a>

다음에 대한 옵션을 사용하여 Amazon Bedrock 또는 SageMaker AI에 모델을 배포합니다.
+ **Bedrock 프로비저닝된 처리량** - 일관된 성능을 위한 전용 용량
+ **Bedrock 온디맨드(LoRA 기반 사용자 지정에만 해당)** - 종량제 요금
+ **Sagemaker AI 실시간 추론** - 일관된 성능을 위한 전용 용량

### 배치 추론
<a name="nova-forge-sdk-batch-inference"></a>

대규모 추론 작업을 효율적으로 실행합니다.
+ 수천 개의 요청을 병렬로 처리
+ 자동 결과 집계
+ 비용 효율적인 배치 처리

### Nova Forge
<a name="nova-forge-sdk-forge"></a>

Nova Forge 구독자의 경우 SDK는 데이터 혼합 레시피를 지원합니다.

## 자세히 알아보기
<a name="nova-forge-sdk-learn-more"></a>

Nova Forge SDK를 사용하여 Nova 모델 사용자 지정을 시작할 준비가 되셨나요? 자세한 가이드, API 참조 및 추가 예제는 GitHub 리포지토리([https://github.com/aws/nova-forge-sdk](https://github.com/aws/nova-forge-sdk))를 참조하세요.

# Amazon Nova 모델에 대한 훈련
<a name="smtj-training"></a>

SageMaker 훈련 작업에서 Amazon Nova 모델을 훈련하는 경우 지시 미세 조정(SFT) 및 강화 미세 조정(RFT)을 지원합니다. 각 기법은 다양한 사용자 지정 요구 사항을 충족하며 여러 Amazon Nova 모델 버전에 적용할 수 있습니다.

**Topics**
+ [Nova 2.0 미세 조정](nova-fine-tune-2.md)
+ [Amazon Nova 모델을 사용한 강화 미세 조정(RFT)](nova-reinforcement-fine-tuning.md)

# Nova 2.0 미세 조정
<a name="nova-fine-tune-2"></a>

## 사전 조건
<a name="nova-model-training-jobs-prerequisites2"></a>

훈련 작업을 시작하기 전에 다음을 확인하세요.
+ 입력 데이터와 훈련 작업 출력을 저장하는 Amazon S3 버킷. 두 가지 데이터를 하나의 버킷에 함께 저장하거나, 각 데이터 유형을 별도의 버킷에 저장할 수 있습니다. 버킷이 모든 훈련 관련 리소스를 생성하는 AWS 리전과 동일한 리전에 있는지 확인합니다. 자세한 내용은 [범용 버킷 생성](https://docs.aws.amazon.com//AmazonS3/latest/userguide/create-bucket-overview.html)을 참조하세요.
+ 훈련 작업 실행 권한이 있는 IAM 역할. IAM 정책을 `AmazonSageMakerFullAccess`에 연결해야 합니다. 자세한 내용은 [How to use SageMaker AI execution roles](https://docs.aws.amazon.com//sagemaker/latest/dg/sagemaker-roles.html)를 참조하세요.
+ 기본 Amazon Nova 레시피, [Amazon Nova 레시피 가져오기](nova-model-recipes.md#nova-model-get-recipes) 참조.

## SFT란 무엇인가요?
<a name="nova-2-what-is-sft"></a>

지도 미세 조정(SFT)은 레이블이 지정된 입력 및 출력 페어를 사용하여 언어 모델을 훈련합니다. 모델은 프롬프트와 응답으로 구성된 데모 예제로부터 학습하여 특정 태스크, 지침 또는 원하는 동작에 맞게 해당 기능을 개선합니다.

## 데이터 준비
<a name="nova-2-data-preparation"></a>

### 개요
<a name="nova-2-data-overview"></a>

Nova 2.0 SFT 데이터는 선택적 추론 콘텐츠 필드를 추가하여 Nova 1.0과 동일한 Converse API 형식을 사용합니다. 전체 형식 사양은 다음을 참조하세요.
+ 추론 콘텐츠: [ReasoningContentBlock](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_ReasoningContentBlock.html)
+ Converse API 스키마: [Converse API](https://docs.aws.amazon.com/bedrock/latest/userguide/conversation-inference-call.html)
+ 데이터세트 제약 조건: [데이터세트 제약 조건](https://docs.aws.amazon.com/nova/latest/userguide/fine-tune-prepare-data-understanding.html)

### 지원되는 기능
<a name="nova-2-supported-features"></a>
+ **입력 유형** - 사용자 콘텐츠 블록의 텍스트, 이미지 또는 비디오
+ **어시스턴트 콘텐츠** - 텍스트 전용 응답 및 추론 콘텐츠
+ **데이터세트 구성** - 동종이어야 합니다. 다음 중 하나를 선택합니다.
  + 텍스트 전용 턴
  + 텍스트 \$1 이미지 턴
  + 텍스트 \$1 비디오 턴(문서 이해 지원)

**중요**  
동일한 데이터세트 내에서 또는 다른 턴에 이미지와 비디오를 혼합할 수 없습니다.

### 현재 제한 사항
<a name="nova-2-current-limitations"></a>
+ **멀티모달 추론 콘텐츠** - Converse 형식은 이미지 기반 추론 콘텐츠를 지원하지만 Nova 2.0 SFT는 reasoningText 필드에서 텍스트 기반 추론 콘텐츠만 지원합니다.
+ **검증 세트** - Nova 2.0을 사용하는 SFT에 대한 검증 데이터세트를 제공할 수 없습니다. 검증 데이터세트를 제공하면 훈련 중에 무시됩니다. 이 제한 사항은 UI 기반 및 프로그래밍 방식 작업 제출 모두에 적용됩니다.

### 지원되는 미디어 형식
<a name="nova-2-supported-media"></a>
+ **이미지** - PNG, JPEG, GIF
+ **비디오** - MOV, MKV, MP4

### 데이터 형식 예제
<a name="nova-2-data-examples"></a>

------
#### [ Text-only (Nova 1.0 compatible) ]

```
{  
  "schemaVersion": "bedrock-conversation-2024",  
  "system": [  
    {  
      "text": "You are a digital assistant with a friendly personality"  
    }  
  ],  
  "messages": [  
    {  
      "role": "user",  
      "content": [  
        {  
          "text": "What country is right next to Australia?"  
        }  
      ]  
    },  
    {  
      "role": "assistant",  
      "content": [  
        {  
          "text": "The closest country is New Zealand"  
        }  
      ]  
    }  
  ]  
}
```

------
#### [ Text with reasoning (Nova 2.0) ]

```
{  
  "schemaVersion": "bedrock-conversation-2024",  
  "system": [  
    {  
      "text": "You are a digital assistant with a friendly personality"  
    }  
  ],  
  "messages": [  
    {  
      "role": "user",  
      "content": [  
        {  
          "text": "What country is right next to Australia?"  
        }  
      ]  
    },  
    {  
      "role": "assistant",  
      "content": [  
        {  
          "reasoningContent": {  
            "reasoningText": {  
              "text": "I need to use my world knowledge of geography to answer this question"  
            }  
          }  
        },  
        {  
          "text": "The closest country to Australia is New Zealand, located to the southeast across the Tasman Sea."  
        }  
      ]  
    }  
  ]  
}
```

------
#### [ Image \$1 text input ]

```
{  
  "schemaVersion": "bedrock-conversation-2024",  
  "system": [  
    {  
      "text": "You are a helpful assistant."  
    }  
  ],  
  "messages": [  
    {  
      "role": "user",  
      "content": [  
        {  
          "image": {  
            "format": "jpeg",  
            "source": {  
              "s3Location": {  
                "uri": "s3://your-bucket/your-path/your-image.jpg",  
                "bucketOwner": "your-aws-account-id"  
              }  
            }  
          }  
        },  
        {  
          "text": "Which country is highlighted in the image?"  
        }  
      ]  
    },  
    {  
      "role": "assistant",  
      "content": [  
        {  
          "reasoningContent": {  
            "reasoningText": {  
              "text": "I will determine the highlighted country by examining its location on the map and using my geographical knowledge"  
            }  
          }  
        },  
        {  
          "text": "The highlighted country is New Zealand"  
        }  
      ]  
    }  
  ]  
}
```

------
#### [ Video \$1 text input ]

```
{  
  "schemaVersion": "bedrock-conversation-2024",  
  "system": [  
    {  
      "text": "You are a helpful assistant."  
    }  
  ],  
  "messages": [  
    {  
      "role": "user",  
      "content": [  
        {  
          "video": {  
            "format": "mp4",  
            "source": {  
              "s3Location": {  
                "uri": "s3://your-bucket/your-path/your-video.mp4",  
                "bucketOwner": "your-aws-account-id"  
              }  
            }  
          }  
        },  
        {  
          "text": "What is shown in this video?"  
        }  
      ]  
    },  
    {  
      "role": "assistant",  
      "content": [  
        {  
          "reasoningContent": {  
            "reasoningText": {  
              "text": "I will analyze the video content to identify key elements"  
            }  
          }  
        },  
        {  
          "text": "The video shows a map with New Zealand highlighted"  
        }  
      ]  
    }  
  ]  
}
```

------

## 도구 직접 호출
<a name="nova-2-tool-calling"></a>

Nova 2.0 SFT는 도구 직접 호출 패턴에서 모델 훈련을 지원하므로 모델은 외부 도구 또는 함수를 간접 호출하는 시점과 방법을 배울 수 있습니다.

### 도구 직접 호출을 위한 데이터 형식
<a name="nova-2-tool-calling-format"></a>

훈련 데이터를 직접 호출하는 도구에는 도구 사용 패턴을 보여주는 대화 턴과 함께 사용 가능한 도구를 정의하는 `toolConfig` 섹션이 포함되어 있습니다.

**샘플 입력**

```
{  
  "schemaVersion": "bedrock-conversation-2024",  
  "system": [  
    {  
      "text": "You are an expert in composing function calls."  
    }  
  ],  
  "toolConfig": {  
    "tools": [  
      {  
        "toolSpec": {  
          "name": "getItemCost",  
          "description": "Retrieve the cost of an item from the catalog",  
          "inputSchema": {  
            "json": {  
              "type": "object",  
              "properties": {  
                "item_name": {  
                  "type": "string",  
                  "description": "The name of the item to retrieve cost for"  
                },  
                "item_id": {  
                  "type": "string",  
                  "description": "The ASIN of item to retrieve cost for"  
                }  
              },  
              "required": [  
                "item_id"  
              ]  
            }  
          }  
        }  
      },  
      {  
        "toolSpec": {  
          "name": "getItemAvailability",  
          "description": "Retrieve whether an item is available in a given location",  
          "inputSchema": {  
            "json": {  
              "type": "object",  
              "properties": {  
                "zipcode": {  
                  "type": "string",  
                  "description": "The zipcode of the location to check in"  
                },  
                "quantity": {  
                  "type": "integer",  
                  "description": "The number of items to check availability for"  
                },  
                "item_id": {  
                  "type": "string",  
                  "description": "The ASIN of item to check availability for"  
                }  
              },  
              "required": [  
                "item_id", "zipcode"  
              ]  
            }  
          }  
        }  
      }  
    ]  
  },  
  "messages": [  
    {  
      "role": "user",  
      "content": [  
        {  
          "text": "I need to check whether there are twenty pieces of the following item available. Here is the item ASIN on Amazon: id-123. Please check for the zipcode 94086"  
        }  
      ]  
    },  
    {  
      "role": "assistant",  
      "content": [  
        {  
          "reasoningContent": {  
            "reasoningText": {  
              "text": "The user wants to check how many pieces of the item with ASIN id-123 are available in the zipcode 94086"  
            }  
          }  
        },  
        {  
          "toolUse": {  
            "toolUseId": "getItemAvailability_0",  
            "name": "getItemAvailability",  
            "input": {  
              "zipcode": "94086",  
              "quantity": 20,  
              "item_id": "id-123"  
            }  
          }  
        }  
      ]  
    },  
    {  
      "role": "user",  
      "content": [  
        {  
          "toolResult": {  
            "toolUseId": "getItemAvailability_0",  
            "content": [  
              {  
                "text": "[{\"name\": \"getItemAvailability\", \"results\": {\"availability\": true}}]"  
              }  
            ]  
          }  
        }  
      ]  
    },  
    {  
      "role": "assistant",  
      "content": [  
        {  
          "text": "Yes, there are twenty pieces of item id-123 available at 94086. Would you like to place an order or know the total cost?"  
        }  
      ]  
    }  
  ]  
}
```

### 도구 직접 호출 요구 사항
<a name="nova-2-tool-calling-requirements"></a>

훈련 데이터를 직접 호출하는 도구를 생성할 때 다음 요구 사항을 따릅니다.


| 요구 사항 | 설명 | 
| --- | --- | 
| ToolUse 배치 | ToolUse는 어시스턴트 턴에만 표시되어야 함 | 
| ToolResult 배치 | ToolResult는 사용자 턴에만 표시되어야 함 | 
| ToolResult 형식 | ToolResult는 텍스트 또는 JSON 전용이어야 합니다. Nova 모델에서는 다른 양식이 지원되지 않음 | 
| inputSchema 형식 | toolSpec 내 inputSchema는 유효한 JSON 스키마 객체여야 함 | 
| toolUseId 일치 | 각 ToolResult는 이전 어시스턴트 ToolUse에서 유효한 toolUseId를 참조해야 하며, 이때 각 toolUseId는 대화당 정확히 한 번만 사용됨 | 

### 중요 정보
<a name="nova-2-tool-calling-notes"></a>
+ 모든 훈련 샘플에서 도구 정의가 일관된지 확인
+ 모델은 사용자가 제공하는 데모에서 도구 간접 호출 패턴을 학습함
+ 각 도구를 사용해야 하는 경우와 도구를 사용하지 않아야 하는 경우에 관한 다양한 예제를 포함함

## 문서 이해
<a name="nova-2-document-understanding"></a>

Nova 2.0 SFT는 문서 기반 태스크에 대한 훈련을 지원하므로 모델이 PDF 문서에 대한 질문을 분석하고 이에 응답하는 방법을 배울 수 있습니다.

### 문서 이해를 위한 데이터 형식
<a name="nova-2-document-format"></a>

문서 이해 훈련 데이터에는 문서 콘텐츠에서 추출하고 추론하는 모델 학습과 함께 사용자 콘텐츠 블록의 문서 참조가 포함됩니다.

**샘플 입력**

```
{  
{  
  "schemaVersion": "bedrock-conversation-2024",  
  "messages": [  
    {  
      "role": "user",  
      "content": [  
        {  
          "text": "What are the ways in which a customer can experience issues during checkout on Amazon?"  
        },  
        {  
          "document": {  
            "format": "pdf",  
            "source": {  
              "s3Location": {  
                "uri": "s3://my-bucket-name/path/to/documents/customer_service_debugging.pdf",  
                "bucketOwner": "123456789012"  
              }  
            }  
          }  
        }  
      ]  
    },  
    {  
      "role": "assistant",  
      "content": [  
        {
          "reasoningContent": {  
            "reasoningText": {  
              "text": "I need to find the relevant section in the document to answer the question."  
            }  
          }
        },
        {  
          "text": "Customers can experience issues with 1. Data entry, 2. Payment methods, 3. Connectivity while placing the order. Which one would you like to dive into?"  
        }   
      ]
    }  
  ]  
}
}
```

### 문서 이해 제한 사항
<a name="nova-2-document-limitations"></a>


| 제한 사항 | 세부 정보 | 
| --- | --- | 
| 지원되는 형식 | PDF 파일만 | 
| 최대 문서 크기 | 10MB | 
| 양식 혼합 | 샘플에는 문서와 텍스트가 있을 수 있지만, 문서를 다른 양식(이미지, 비디오)과 혼합할 수는 없음 | 

### 문서 이해 모범 사례
<a name="nova-2-document-best-practices"></a>
+ 문서의 형식이 명확하게 지정되고 텍스트를 추출할 수 있는지 확인
+ 여러 문서 유형 및 질문 형식을 포괄하는 다양한 예제 제공
+ 모델이 문서 분석 패턴을 학습하는 데 도움이 되는 추론 콘텐츠 포함

## 비디오 이해
<a name="nova-2-video-understanding"></a>

Nova 2.0 SFT는 비디오 기반 태스크에 대한 훈련을 지원하므로 모델이 비디오 콘텐츠에 대한 질문을 분석하고 이에 응답하는 방법을 배울 수 있습니다.

### 비디오 이해를 위한 데이터 형식
<a name="nova-2-video-format"></a>

비디오 이해 훈련 데이터에는 정보를 추출하고 비디오 콘텐츠에서 추론하는 모델 학습과 함께 사용자 콘텐츠 블록의 비디오 참조가 포함됩니다.

**샘플 입력**

```
  
{  
  "schemaVersion": "bedrock-conversation-2024",  
  "messages": [  
    {  
      "role": "user",  
      "content": [  
        {  
          "text": "What are the ways in which a customer can experience issues during checkout on Amazon?"  
        },  
        {  
          "video": {  
            "format": "mp4",  
            "source": {  
              "s3Location": {  
                "uri": "s3://my-bucket-name/path/to/videos/customer_service_debugging.mp4",  
                "bucketOwner": "123456789012"  
              }  
            }  
          }  
        }  
      ]  
    },  
    {  
      "role": "assistant",  
      "content": [  
        {
          "reasoningContent": {  
            "reasoningText": {  
              "text": "I need to find the relevant section in the video to answer the question."  
            }  
          }
        },
        {  
          "text": "Customers can experience issues with 1. Data entry, 2. Payment methods, 3. Connectivity while placing the order. Which one would you like to dive into?"  
        }   
      ]  
    }  
  ]  
}
```

### 비디오 이해 제한 사항
<a name="nova-2-video-limitations"></a>


| 제한 사항 | 세부 정보 | 
| --- | --- | 
| 최대 비디오 크기 | 50MB | 
| 최대 비디오 지속 시간 | 15분 | 
| 샘플당 비디오 수 | 샘플당 하나의 비디오만 허용됩니다. 동일한 샘플에서 여러 개의 비디오는 지원되지 않음 | 
| 양식 혼합 | 샘플에는 비디오와 텍스트가 있을 수 있지만, 비디오를 다른 양식(이미지, 문서)과 결합할 수는 없음 | 

### 지원되는 비디오 형식
<a name="nova-2-video-formats"></a>
+ MOV
+ MKV
+ MP4

### 비디오 이해 모범 사례
<a name="nova-2-video-best-practices"></a>
+ 비디오를 간결하게 유지하고 태스크와 관련된 콘텐츠에 집중함
+ 모델이 의미 있는 정보를 추출하기에 비디오 품질이 충분한지 확인
+ 비디오 콘텐츠의 특정 측면을 참조하는 명확한 질문 제공
+ 여러 비디오 유형 및 질문 형식을 포괄하는 다양한 예제 포함

## 추론 모드 및 비추론 모드 비교
<a name="nova-2-reasoning-modes"></a>

### 추론 콘텐츠 이해
<a name="nova-2-understanding-reasoning"></a>

추론 콘텐츠(연쇄적 사고라고도 함)는 최종 답변을 생성하기 전에 모델의 중간 사고 단계를 캡처합니다. `assistant` 턴에서 `reasoningContent` 필드를 사용하여 이러한 추론 트레이스를 포함합니다.

**손실 계산 방법**
+ **추론 콘텐츠 포함** - 훈련 손실에 추론 토큰과 최종 출력 토큰이 모두 포함됨
+ **추론 콘텐츠 제외** - 훈련 손실은 최종 출력 토큰에서만 계산됨

멀티턴 대화의 여러 어시스턴트 턴에서 `reasoningContent`를 포함할 수 있습니다.

**형식 지침**
+ 추론 콘텐츠에 대해 일반 텍스트 사용
+ 태스크에 특별히 필요하지 않은 한 `<thinking>` 및 `</thinking>`과 같은 마크업 태그 방지
+ 추론 콘텐츠가 명확하고 문제 해결 프로세스와 관련이 있는지 확인

### 추론 모드를 활성화하는 경우
<a name="nova-2-when-enable-reasoning"></a>

다음과 같은 경우 훈련 구성에서 `reasoning_enabled: true`를 설정합니다.
+ 훈련 데이터에 추론 토큰이 있는 경우
+ 최종 출력을 생성하기 전에 모델에서 사고 토큰을 생성하려는 경우
+ 복잡한 추론 태스크에서 성능 개선이 필요한 경우

`reasoning_enabled = true`를 사용하여 비추론 데이터세트에서 Nova 훈련이 허용됩니다. 그러나 Nova는 주로 추론을 적용하지 않고 데이터에 표시된 응답을 생성하는 방법을 배우기 때문에 이 경우 모델이 추론 기능을 상실할 수 있습니다. 비추론 데이터세트에서 Nova를 훈련하고 싶지만 유추 중에도 추론을 기대하는 경우 훈련 중에 추론을 비활성화하되(`reasoning_enabled = false`) 유추를 위해 추론을 활성화할 수 있습니다. 이 접근 방식을 사용하면 유추 시 추론을 사용할 수 있지만 추론이 없는 유추와 비교했을 때 성능 개선을 보장하지 않습니다. 일반적으로 추론 데이터세트를 사용할 때는 훈련 및 유추 모두에 대한 추론을 활성화하고, 비추론 데이터세트를 사용할 때는 둘 다에 대해 추론을 비활성화합니다.

다음과 같은 경우에 `reasoning_enabled: false`를 설정합니다.
+ 훈련 데이터에 추론 토큰이 없는 경우
+ 명시적 추론 단계의 이점을 얻지 못하는 간단한 태스크에서 훈련하는 경우
+ 속도를 최적화하고 토큰 사용량을 줄이려는 경우

### 추론 데이터 생성
<a name="nova-2-generating-reasoning"></a>

데이터세트에 추론 트레이스가 없는 경우 Nova Premier와 같은 추론 지원 모델을 사용하여 생성할 수 있습니다. 모델에 입력 및 출력 페어를 제공하고 해당 추론 프로세스를 캡처하여 추론 증강 데이터세트를 구축합니다.

### 훈련에 대해 추론 토큰 사용
<a name="nova-2-using-reasoning-training"></a>

추론 모드가 활성화된 상태에서 훈련하면 모델은 내부 추론을 최종 답변과 분리하는 방법을 학습합니다. 훈련 프로세스:
+ 입력, 추론 및 답변과 같은 트리플로 데이터를 구성함
+ 추론 토큰과 답변 토큰 모두에서 표준 다음 토큰 예측 손실을 사용하여 최적화함
+ 응답을 생성하기 전에 모델의 내부 추론을 장려함

### 효과적인 추론 콘텐츠
<a name="nova-2-effective-reasoning"></a>

고품질 추론 콘텐츠에는 다음이 포함되어야 합니다.
+ 중간 사고 및 분석
+ 논리적 연역 및 추론 단계
+ 단계별 문제 해결 접근 방식
+ 단계와 결론 사이에서 명시적 연결

그러면 모델이 '답변하기 전에 사고'하는 기능을 개발하는 데 도움이 됩니다.

## 데이터세트 준비 지침
<a name="nova-2-dataset-preparation"></a>

### 크기 및 품질
<a name="nova-2-size-quality"></a>
+ **권장 크기** - 2,000\$110,000개의 샘플
+ **최소 샘플 수** – 200
+ **우선순위** - 수량보다 품질을 우선합니다. 예제가 정확하고 주석이 잘 달렸는지 확인합니다.
+ **애플리케이션 정렬** - 데이터세트는 프로덕션 사용 사례를 긴밀하게 반영해야 함

### 다양성
<a name="nova-2-diversity"></a>

다음과 같은 다양한 예제를 포함합니다.
+ 예상 입력의 전체 범위 포괄
+ 여러 난이도 표시
+ 엣지 케이스 및 변형 포함
+ 패턴 범위를 좁히기 위해 과적합 방지

### 출력 형식
<a name="nova-2-output-formatting"></a>

어시스턴트 응답에서 원하는 출력 형식을 명확하게 지정합니다.
+ JSON 구조
+ 테이블
+ CSV 형식
+ 애플리케이션별 사용자 지정 형식

### 멀티턴 대화
<a name="nova-2-multi-turn"></a>

멀티턴 데이터세트의 경우 다음 사항에 유의하세요.
+ 손실은 사용자 턴이 아닌 어시스턴트 턴에서만 계산됨
+ 각 어시스턴트 응답의 형식이 올바르게 지정되어야 함
+ 여러 대화 턴에서 일관성 유지 관리

### 품질 체크리스트
<a name="nova-2-quality-checklist"></a>
+ 충분한 데이터세트 크기(2K\$110K 샘플)
+ 모든 사용 사례를 포괄하는 다양한 예제
+ 명확하고 일관된 출력 형식 지정
+ 정확한 레이블 및 주석
+ 프로덕션 시나리오 대변
+ 모순이나 모호성이 없음

### 데이터 업로드
<a name="nova-2-uploading-data"></a>

데이터세트는 SageMaker 훈련 작업에서 액세스할 수 있는 버킷에 업로드해야 합니다. 올바른 권한 설정에 대한 자세한 내용은 [사전 조건](https://docs.aws.amazon.com/sagemaker/latest/dg/nova-model-general-prerequisites.html)을 참조하세요.

## 훈련 작업 시작
<a name="nova-2-starting-training"></a>

### 하이퍼파라미터 선택 및 레시피 업데이트
<a name="nova-2-selecting-hyperparameters"></a>

Nova 2.0의 설정은 Nova 1.0의 설정과 거의 동일합니다. 입력 데이터가 S3에 업로드되면 미세 조정 폴더에서 [SageMaker HyperPod 레시피](https://github.com/aws/sagemaker-hyperpod-recipes/tree/main/recipes_collection/recipes/fine-tuning/nova)의 레시피를 사용합니다. Nova 2.0의 경우 다음은 사용 사례에 따라 업데이트할 수 있는 몇 가지 주요 하이퍼파라미터입니다. 다음은 Nova 2.0 SFT PEFT 레시피에 대한 예제입니다. 컨테이너 이미지 URI의 경우 `708977205387.dkr.ecr.us-east-1.amazonaws.com/nova-fine-tune-repo:SM-TJ-SFT-V2-latest`를 사용하여 SFT 미세 조정 작업을 실행합니다.

Nova 훈련과의 엄격한 호환성을 위해 SageMaker AI PySDK의 v2.254.1을 사용하세요. SDK를 v3.0 버전으로 업그레이드하면 호환되지 않는 변경 내용이 발생합니다. SageMaker AI PySDK v3에 대한 지원은 곧 제공될 예정입니다.

**샘플 입력**

```
!pip install sagemaker==2.254.1
```

```
run:  
  name: {peft_recipe_job_name}  
  model_type: amazon.nova-2-lite-v1:0:256k  
  model_name_or_path: {peft_model_name_or_path}  
  data_s3_path: {train_dataset_s3_path} # SageMaker HyperPod (SMHP) only and not compatible with SageMaker Training jobs. Note replace my-bucket-name with your real bucket name for SMHP job  
  replicas: 4                      # Number of compute instances for training, allowed values are 4, 8, 16, 32  
  output_s3_path: ""               # Output artifact path (Hyperpod job-specific; not compatible with standard SageMaker Training jobs). Note replace my-bucket-name with your real bucket name for SMHP job  
  
training_config:  
  max_steps: 10                   # Maximum training steps. Minimal is 4.  
  save_steps: 10                      # How many training steps the checkpoint will be saved. Should be less than or equal to max_steps  
  save_top_k: 1                    # Keep top K best checkpoints. Note supported only for SageMaker HyperPod jobs. Minimal is 1.  
  max_length: 32768                # Sequence length (options: 8192, 16384, 32768 [default], 65536)  
  global_batch_size: 32            # Global batch size (options: 32, 64, 128)  
  reasoning_enabled: true          # If data has reasoningContent, set to true; otherwise False  
  
  lr_scheduler:  
    warmup_steps: 15               # Learning rate warmup steps. Recommend 15% of max_steps  
    min_lr: 1e-6                   # Minimum learning rate, must be between 0.0 and 1.0  
  
  optim_config:                    # Optimizer settings  
    lr: 1e-5                       # Learning rate, must be between 0.0 and 1.0  
    weight_decay: 0.0              # L2 regularization strength, must be between 0.0 and 1.0  
    adam_beta1: 0.9                # Exponential decay rate for first-moment estimates, must be between 0.0 and 1.0  
    adam_beta2: 0.95               # Exponential decay rate for second-moment estimates, must be between 0.0 and 1.0  
  
  peft:                            # Parameter-efficient fine-tuning (LoRA)  
    peft_scheme: "lora"            # Enable LoRA for PEFT  
    lora_tuning:  
      alpha: 64                    # Scaling factor for LoRA weights ( options: 32, 64, 96, 128, 160, 192),  
      lora_plus_lr_ratio: 64.0
```

이 레시피에는 Nova 1.0과 거의 동일한 하이퍼파라미터도 포함되어 있습니다. 주목할 만한 하이퍼파라미터는 다음과 같습니다.
+ `max_steps` - 작업을 실행하려는 단계 수입니다. 일반적으로 하나의 에포크(전체 데이터세트를 통해 하나가 실행됨)의 경우 단계 수 = 데이터 샘플 수/글로벌 배치 크기입니다. 단계 수가 많고 글로벌 배치 크기가 작을수록 작업 실행 시간이 길어집니다.
+ `reasoning_enabled` - 데이터세트의 추론 모드를 제어합니다. 옵션:
  + `true`: 추론 모드 활성화(높은 노력의 추론과 동일)
  + `false`: 추론 모드 비활성화

  참고: SFT의 경우 추론 노력 수준을 세밀하게 제어하지 않습니다. `reasoning_enabled: true`를 설정하면 전체 추론 기능이 활성화됩니다.
+ `peft.peft_scheme` - 이를 'lora'로 설정하면 PEFT 기반 미세 조정이 활성화됩니다. null(따옴표 없음)로 설정하면 전체 순위 미세 조정이 활성화됩니다.

### 훈련 작업 시작
<a name="nova-2-start-job"></a>

```
from sagemaker.pytorch import PyTorch  
  
# define OutputDataConfig path  
if default_prefix:  
    output_path = f"s3://{bucket_name}/{default_prefix}/{sm_training_job_name}"  
else:  
    output_path = f"s3://{bucket_name}/{sm_training_job_name}"  

output_kms_key = "<KMS key arn to encrypt trained model in Amazon-owned S3 bucket>" # optional, leave blank for Amazon managed encryption
  
recipe_overrides = {  
    "run": {  
        "replicas": instance_count,  # Required  
        "output_s3_path": output_path  
    },  
}  
  
estimator = PyTorch(  
    output_path=output_path,  
    base_job_name=sm_training_job_name,  
    role=role,  
    disable_profiler=True,  
    debugger_hook_config=False,  
    instance_count=instance_count,  
    instance_type=instance_type,  
    training_recipe=training_recipe,  
    recipe_overrides=recipe_overrides,  
    max_run=432000,  
    sagemaker_session=sagemaker_session,  
    image_uri=image_uri,
    output_kms_key=output_kms_key,
    tags=[  
        {'Key': 'model_name_or_path', 'Value': model_name_or_path},  
    ]  
)  
  
print(f"\nsm_training_job_name:\n{sm_training_job_name}\n")  
print(f"output_path:\n{output_path}")
```

```
from sagemaker.inputs import TrainingInput  
  
train_input = TrainingInput(  
    s3_data=train_dataset_s3_path,  
    distribution="FullyReplicated",  
    s3_data_type="Converse",  
)  
  
estimator.fit(inputs={"validation": val_input}, wait=False)
```

**참고**  
Nova 2.0의 지도 미세 조정에 대해서는 검증 데이터세트 전달이 지원되지 않습니다.

작업을 시작하는 방법:
+ 데이터세트 경로 및 하이퍼파라미터로 레시피 업데이트
+ 노트북에서 지정된 셀을 실행하여 훈련 작업 제출

노트북은 작업 제출을 처리하고 상태 추적을 제공합니다.

# Amazon Nova 모델을 사용한 강화 미세 조정(RFT)
<a name="nova-reinforcement-fine-tuning"></a>

## 개요
<a name="nova-rft-overview"></a>

**RCF란 무엇인가요?**

강화 미세 조정(RFT)은 올바른 정답이 아닌 측정 가능한 점수나 모델의 성과를 나타내는 보상인 피드백 신호에서 훈련하여 모델 성능을 개선합니다. 입력과 출력 페어로부터 학습하는 지도 미세 조정과 달리, RFT는 보상 함수를 사용하여 모델 응답을 평가하고 반복적으로 모델을 최적화하여 이러한 보상을 극대화합니다. 이 접근 방식은 정확히 올바른 출력을 정의하기 어려운 태스크에 효과적이지만 신뢰할 수 있는 방식으로 응답 품질을 측정할 수 있습니다.

**RFT는 사용하는 경우**

명확하고 측정 가능한 성공 기준을 정의할 수 있지만 훈련에 정확히 올바른 출력을 제공하는 데 어려움을 겪는 경우 RFT를 사용합니다. 다음과 같은 경우에 적합합니다.
+ 품질이 주관적이거나 다면적인 태스크(창의적 글쓰기, 코드 최적화, 복잡한 추론)
+ 일부 솔루션이 다른 솔루션보다 명확하게 더 나은 여러 개의 유효한 솔루션이 있는 시나리오
+ 반복된 개선, 개인화 또는 복잡한 비즈니스 규칙 준수가 필요한 애플리케이션
+ 레이블이 지정된 고품질 예제를 수집하는 작업에 비용이 많이 들거나 해당 작업이 실용적이지 않은 경우

**최상의 사용 사례**

RFT는 출력 품질을 객관적으로 측정할 수 있지만 최적의 응답을 미리 정의하기 어려운 도메인에서 뛰어납니다.
+ 수학적 문제 해결 및 코드 생성
+ 과학적 추론 및 정형 데이터 분석
+ 단계별 추론 또는 멀티턴 문제 해결이 필요한 태스크
+ 여러 목표(정확도, 효율성, 스타일)의 균형을 맞추는 애플리케이션
+ 실행 결과 또는 성능 지표를 통해 프로그래밍 방식으로 성공을 확인할 수 있는 시나리오

**지원되는 모델**

Nova Lite 2.0

## 데이터 형식 개요
<a name="nova-rft-data-format"></a>

RFT 훈련 데이터는 OpenAI 강화 미세 조정 [형식](https://platform.openai.com/docs/api-reference/fine-tuning/reinforcement-input)을 따라야 합니다. 각 훈련 예제는 다음을 포함하는 JSON 객체입니다.
+ `system` 및 `user` 역할을 사용하는 대화 턴을 포함하는 `messages` 배열
+ 보상 계산에 대한 평가 기준 또는 예상 출력이 포함된 `reference_answer` 필드

**현재 제한 사항**
+ 텍스트 전용

### 데이터 형식 예제
<a name="nova-rft-data-examples"></a>

각 예제는 JSONL 파일에서 한 줄에 있어야 하며 한 줄에 하나의 JSON 객체가 있어야 합니다.

------
#### [ Chemistry problem ]

```
{
  "id": "chem-01",
  "messages": [
    {
      "role": "system",
      "content": "You are a helpful chemistry assistant"
    },
    {
      "role": "user",
      "content": "Calculate the molecular weight of caffeine (C8H10N4O2)"
    }
  ],
  "reference_answer": {
    "molecular_weight": 194.19,
    "unit": "g/mol",
    "calculation": "8(12.01) + 10(1.008) + 4(14.01) + 2(16.00) = 194.19"
  }
}
```

------
#### [ Math problem ]

```
{
  "id": "sample-001",  // Optional
  "messages": [
    {
      "role": "system",
      "content": "You are a math tutor"
    },
    {
      "role": "user",
      "content": "Solve: 2x + 5 = 13"
    }
  ],
  "reference_answer": {
    "solution": "x = 4",
    "steps": ["2x = 13 - 5", "2x = 8", "x = 4"]
  }
}
```

------
#### [ Code problem ]

```
{
  "id": "code-002",
  "messages": [
    {
      "role": "system",
      "content": "You are a helpful programming assistant"
    },
    {
      "role": "user",
      "content": "Write a Python function that reverses a string without using built-in reverse methods"
    }
  ],
  "reference_answer": {
    "code": "def reverse_string(s):  \n    result = ''  \n    for i in range(len(s) - 1, -1, -1):  \n        result += s[i]  \n    return result",
    "test_cases": [
      {
        "input": "hello",
        "expected_output": "olleh"
      },
      {
        "input": "",
        "expected_output": ""
      },
      {
        "input": "a",
        "expected_output": "a"
      },
      {
        "input": "Python123",
        "expected_output": "321nohtyP"
      }
    ],
    "all_tests_pass": true
  }
}
```

------

`reference_answer` 필드에는 보상 함수가 모델 응답 점수를 지정하는 데 사용하는 평가 기준 또는 예상 출력이 포함되어 있습니다. 구조화된 출력으로 제한되지 않습니다. 보상 함수가 품질을 평가하는 데 도움이 되는 모든 형식을 포함할 수 있습니다.

## 데이터세트 크기 권장 사항
<a name="nova-rft-dataset-size"></a>

**시작점**
+ 최소 100개의 훈련 예제
+ 최소 100개의 평가 예제

**평가 우선 접근 방식**

대규모 RFT 훈련에 투자하기 전에 모델의 기준 성능을 평가합니다.
+ **높은 성능(> 95% 보상)** - RFT가 불필요할 수 있음 - 모델이 이미 잘 작동함
+ **매우 낮은 성능(0% 보상)** - 먼저 SFT로 전환하여 기본 기능을 설정함
+ **중간 성능** - RFT가 적절할 가능성이 큼

작은 데이터세트로 시작하면 다음이 가능합니다.
+ 보상 함수에 버그가 없는지 검증
+ RFT가 사용 사례에 적합한 접근 방식인지 확인
+ 조기에 문제 식별 및 해결
+ 스케일 업하기 전에 워크플로 테스트

검증 후에 더 큰 데이터세트로 확장하여 성능을 더욱 개선할 수 있습니다.

## 효과적인 훈련 데이터의 특성
<a name="nova-rft-effective-data"></a>

**명확성 및 일관성**

좋은 RFT 예제에는 여러 모델 출력에서 정확한 보상을 계산할 수 있는 명확하고 모호하지 않은 입력 데이터가 필요합니다. 다음을 포함하여 데이터에서 노이즈를 방지합니다.
+ 일관되지 않은 형식 지정
+ 모순되는 레이블 또는 지침
+ 모호한 프롬프트
+ 참조 답변 충돌

모호할 경우 훈련 프로세스에서 오해가 발생하고 모델이 의도하지 않은 동작을 학습하게 됩니다.

**다양성**

데이터세트는 강력한 실제 성능을 보장하기 위해 프로덕션 사용 사례의 완전한 다양성을 캡처해야 합니다. 포함:
+ 여러 입력 형식 및 엣지 케이스
+ 로그 및 사용자 분석의 실제 프로덕션 사용 패턴 매핑
+ 사용자 유형, 지리적 리전 및 계절적 변형을 고려하는 샘플
+ 간단한 문제부터 복잡한 문제까지 난이도 포함

**보상 함수 고려 사항**

효율적인 훈련을 위해 보상 함수를 설계합니다.
+ 분이 아닌 초 단위 내 실행
+ Lambda를 사용하여 효과적으로 병렬 처리
+ 일관되고 신뢰할 수 있는 점수 반환
+ 여러 유형의 모델 출력을 정상적으로 처리

빠르고 확장 가능한 보상 함수를 사용하면 빠른 반복과 비용 효율적인 실험이 가능합니다.

## 추가 속성
<a name="nova-rft-additional-properties"></a>

RFT 데이터 형식은 핵심 스키마 요구 사항(`messages` 및 `reference_answer`) 이외에도 사용자 지정 필드를 지원합니다. 이러한 유연성을 통해 적절한 평가를 위해 보상 함수에 필요한 데이터를 더 추가할 수 있습니다.

**참고**  
레시피에서 이를 구성할 필요는 없습니다. 데이터 형식은 내재적으로 추가 필드를 지원합니다. 훈련 데이터 JSON에 포함하기만 하면 `metadata` 필드의 보상 함수로 전달됩니다.

**공통 추가 속성**

메타데이터 필드 예제:
+ `task_id` - 추적을 위한 고유 식별자
+ `difficulty_level` - 문제 복잡성 지표
+ `domain` - 주제 영역 또는 카테고리
+ `expected_reasoning_steps` - 솔루션에서 단계 수

**추가 속성이 있는 예제**

```
{
  "messages": [
    {
      "role": "system",
      "content": "You are a math tutor"
    },
    {
      "role": "user",
      "content": "Solve: 2x + 5 = 13"
    }
  ],
  "reference_answer": {
    "solution": "x = 4",
    "steps": ["2x = 13 - 5", "2x = 8", "x = 4"]
  },
  "task_id": "algebra_001",
  "difficulty_level": "easy",
  "domain": "algebra",
  "expected_reasoning_steps": 3
}
```

이러한 추가 필드는 평가 중에 보상 함수에 전달되므로 특정 사용 사례에 맞게 조정된 정교한 점수 매기기 로직이 가능합니다.

## 훈련 구성
<a name="nova-rft-training-config"></a>

**샘플 레시피**

```
# Note:
# This recipe can run on p5.48xlarge and p5en.48xlarge instance types.
run:
  name: "my-rft-run"                           # Unique run name (appears in logs/artifacts).
  model_type: amazon.nova-2-lite-v1:0:256k
  model_name_or_path: nova-lite-2/prod
  data_s3_path: s3://<bucket>/<data file>      # Training dataset in JSONL;
  replicas: 4
  reward_lambda_arn: arn:aws:lambda:<region>:<account-id>:function:<function-name>

  ## MLFlow configs
  mlflow_tracking_uri: "" # Required for MLFlow
  mlflow_experiment_name: "my-rft-experiment" # Optional for MLFlow. Note: leave this field non-empty
  mlflow_run_name: "my-rft-run" # Optional for MLFlow. Note: leave this field non-empty

## SMTJ GRPO Training specific configs
training_config:
  max_length: 8192                              # Context window (tokens) for inputs+prompt;
  global_batch_size: 16                         # Total samples per optimizer step across all replicas (16/32/64/128/256).
  reasoning_effort: high                        # Enables reasoning mode high / low / or null for non-reasoning

  rollout:                                      # How responses are generated for GRPO/advantage calc.
    advantage_strategy:
      number_generation: 2                      # N samples per prompt to estimate advantages (variance vs cost).
    generator:
      max_new_tokens: 6000                      # Cap on tokens generated per sample
      set_random_seed: true                     # Seed generation for reproducibility across runs.
      temperature: 1                            # Softmax temperature;
      top_k: 1                                  # Sample only from top-K logits
    rewards:
      preset_reward_function: null              # Usage of preset reward functions [exact_match]
      api_endpoint:
        lambda_arn: arn:aws:lambda:<region>:<account-id>:function:<function-name>
        lambda_concurrency_limit: 12             # Max concurrent Lambda invocations (throughput vs. throttling).

  trainer:
    max_steps: 2                                 # Steps to train for. One Step = global_batch_size
    save_steps: 5
    test_steps: 1

    # RL parameters
    ent_coeff: 0.0                              # A bonus added to the policy loss that rewards higher-output entropy.
    kl_loss_coef: 0.001                         # Weight on the KL penalty between the actor (trainable policy) and a frozen reference model

    optim_config:                    # Optimizer settings
        lr: 5e-5                       # Learning rate
        weight_decay: 0.0              # L2 regularization strength (0.0–1.0)
        adam_beta1: 0.9
        adam_beta2: 0.95

    peft:                            # Parameter-efficient fine-tuning (LoRA)
        peft_scheme: "lora"            # Enable LoRA for PEFT
        lora_tuning:
            alpha: 32
            lora_plus_lr_ratio: 64.0     # LoRA+ learning rate scaling factor (0.0–100.0)
```

## 평가형 LLM을 사용하는 RFT 훈련
<a name="nova-rft-llm-judge"></a>

### 개요
<a name="nova-rft-llm-judge-overview"></a>

대규모 언어 모델(LLM)은 강화 미세 조정(RFT) 워크플로의 평가자 역할로 더 많이 사용되고 있으며, 모델 최적화를 안내하는 자동화된 보상 신호를 제공합니다. 이 접근 방식에서 LLM은 정확성, 품질, 스타일 준수 또는 시맨틱 동등성 평가와 같은 지정된 기준에 따라 모델 출력을 평가하고 강화 학습 프로세스를 주도하는 보상을 지정합니다.

이는 여러 표현(예: '1/3', '0.333', '삼분의 일')의 시맨틱이 동등한지 확인하거나 일관성 및 관련성과 같은 미묘한 품질을 평가하는 등 프로그래밍 방식으로 정의하기 어려운 태스크에 특히 유용합니다. LLM 기반 평가를 보상 함수로 사용하면 광범위한 인적 주석 없이도 RFT 규모를 복잡한 도메인으로 조정할 수 있으므로 기존 정렬 문제를 넘어 다양한 사용 사례에서 모델을 빠르게 반복하고 지속적으로 개선할 수 있습니다.

### 추론 모드 선택
<a name="nova-rft-reasoning-mode"></a>

**사용 가능한 모드**
+ none - 추론 없음(reasoning\$1effort 필드 생략)
+ low - 최소한의 추론 오버헤드
+ high - 최대 추론 기능(reasoning\$1effort를 지정할 때 기본값)

**참고**  
RFT에는 중간 옵션이 없습니다. 구성에 reasoning\$1effort 필드가 없으면 추론이 비활성화됩니다. 추론이 활성화된 경우 확장된 추론 출력을 수용하려면 `max_new_tokens`를 32,768로 설정해야 합니다.

**각 모드를 사용해야 하는 경우**

다음과 같은 경우 높은 수준의 추론을 사용합니다.
+ 복잡한 분석 태스크
+ 수학적 문제 해결
+ 여러 단계의 논리적 연역
+ 단계별 사고가 가치를 더하는 태스크

다음과 같은 경우에 none(reasoning\$1effort) 또는 낮은 수준의 추론을 사용합니다.
+ 단순한 사실적 쿼리
+ 직접 분류
+ 속도 및 비용 최적화
+ 간단한 질문과 답변

**비용 및 성능의 장단점**

추론 모드의 노력이 높아질수록 다음이 증가합니다.
+ 훈련 시간 및 비용
+ 추론 지연 시간 및 비용
+ 복잡한 추론 태스크에 대한 모델 기능

### LLM 판단 검증
<a name="nova-rft-validating-judge"></a>

프로덕션 환경에서 평가형 LLM을 배포하기 전에 평가 모델의 평가가 사람의 평가와 일치하는지 확인합니다. 여기에는 다음이 포함됩니다.
+ 태스크의 대표 샘플에서 LLM 평가와 인적 평가자 간 합의 비율 측정
+ 사람과 LLM의 합의가 사람 간 합의 비율을 충족하거나 초과하도록 보장
+ 평가 모델의 잠재적 편향 식별
+ 보상 신호가 모델을 의도한 방향으로 안내한다는 확신 구축

이 검증 단계는 자동화된 평가 프로세스가 프로덕션 품질 기준을 충족하는 모델을 생성하는 데 도움이 됩니다.

### LLM 평가에 대한 Lambda 구성
<a name="nova-rft-lambda-config"></a>

평가형 LLM 사용은 검증 가능한 보상을 통한 강화 학습(RLVR)에 Lambda 함수를 사용하는 확장입니다. Lambda 함수 내에서 Amazon Bedrock에 호스팅되는 모델 중 하나를 직접 호출합니다.

**중요한 구성 요구 사항:**


| 구성 | 요구 사항 | 세부 정보 | 
| --- | --- | --- | 
| Amazon Bedrock 처리량 | 충분한 할당량 | 사용된 Amazon Bedrock 모델의 처리량 할당량이 훈련 워크로드에 충분하도록 보장 | 
| Lambda 제한 시간 | 연장된 제한 시간 | 최대 15분으로 Lambda 함수 제한 시간을 구성합니다. 기본 설정은 3초이며, 이는 Amazon Bedrock 모델 응답에 충분하지 않음 | 
| Lambda 동시성 | 동시성 증가 | Lambda는 훈련 중에 병렬로 간접 호출됩니다. 동시성을 늘려 사용 가능한 처리량 극대화 | 
| 레시피 구성 | Lambda 설정 일치 | 동시성 제한은 레시피에서 구성해야 함 | 

## 작업 생성 및 실행
<a name="nova-rft-creating-jobs"></a>

**훈련 작업 시작**

SageMaker 훈련 작업 노트북 템플릿([https://docs.aws.amazon.com/sagemaker/latest/dg/nova-fine-tuning-training-job.html#nova-model-training-jobs-notebook](https://docs.aws.amazon.com/sagemaker/latest/dg/nova-fine-tuning-training-job.html#nova-model-training-jobs-notebook))을 사용합니다.

**인스턴스 요구 사항**

컨테이너는 전체 순위 훈련 및 LoRA 훈련을 모두 지원합니다.
+ **LoRA 훈련** - 2/4/6/8 × p5.48xlarge 또는 p5en.48xlarge 인스턴스
+ **전체 순위 훈련** - 2/4/6/8 × p5.48xlarge 인스턴스(필수)

## 훈련 모니터링
<a name="nova-rft-monitoring"></a>

훈련 로그에는 각 단계에서 포괄적인 지표가 포함됩니다. 주요 지표 카테고리:

**보상 지표**
+ `critic/rewards/mean`, `critic/rewards/max`, `critic/rewards/min` – 보상 배포
+ `val-score/rewards/mean@1` - 검증 보상

**모델 동작**
+ `actor/entropy` – 정책 변형(높은 값 = 더 탐색적)

**훈련 상태**
+ `actor/pg_loss` - 정책 그라데이션 손실
+ `actor/pg_clipfrac` - 잘린 업데이트 빈도
+ `actor/grad_norm` - 그라데이션 크기

**응답 특성**
+ `prompt_length/mean`, `prompt_length/max`, `prompt_length/min` - 입력 토큰 통계
+ `response_length/mean`, `response_length/max`, `response_length/min` - 출력 토큰 통계
+ `response/aborted_ratio` - 불완전 생성 속도(0 = 모두 완료됨)

**성능**
+ `perf/throughput` - 훈련 처리량
+ `perf/time_per_step` - 훈련 단계당 시간
+ `timing_per_token_ms/*` - 토큰당 처리 시간

**리소스 사용량**
+ `perf/max_memory_allocated_gb`, `perf/max_memory_reserved_gb` – GPU 메모리
+ `perf/cpu_memory_used_gb` - CPU 메모리

## 미세 조정 모델 사용
<a name="nova-rft-using-models"></a>

훈련이 완료되면 최종 모델 체크포인트가 지정된 출력 위치에 저장됩니다. 체크포인트 경로는 다음 위치에서 사용할 수 있습니다.
+ 훈련 로그
+ 출력 Amazon S3 위치에서 `manifest.json` 파일(노트북의 `output_s3_uri`에 의해 정의)

## 제한 사항 및 모범 사례
<a name="nova-rft-limitations"></a>

**제한 사항 **
+ **Lambda 제한 시간** - 보상 함수는 15분 이내에 완료되어야 함(불필요한 프로세스를 방지하고 비용을 관리함)
+ **싱글턴만** - 멀티턴 대화는 지원되지 않음
+ **데이터 요구 사항** - 다양성이 충분해야 함, 희소 보상에 어려움(5% 미만의 긍정적인 예제)
+ **컴퓨팅 비용** - 지도 미세 조정보다 비용이 많이 발생함
+ **멀티모달 데이터 없음** - 텍스트 데이터 유형만 지원됨

**모범 사례**

**작게 시작**
+ 100\$1200개의 예제로 시작
+ 보상 함수 정확성 검증
+ 결과를 기반으로 점진적으로 규모 조정

**사전 훈련 평가**
+ RFT 이전에 기준 모델 성능 테스트
+ 보상이 일관되게 0%인 경우 먼저 SFT를 사용하여 기본 기능 설정
+ 보상이 95%를 초과하는 경우 RFT가 필요하지 않을 수 있음

**훈련 모니터링**
+ 평균 보상 점수 및 분포 추적
+ 과적합 감시(훈련 보상은 증가하지만, 검증 보상은 감소함)
+ 우려되는 패턴을 찾습니다.
  + 0.15 미만으로 보상 정체
  + 시간 경과에 따른 보상 분산 증가
  + 검증 성능 저하

**보상 함수 최적화**
+ 분이 아닌 초 단위 내 실행
+ 외부 API 직접 호출 최소화
+ 효율적인 알고리즘 사용
+ 적절한 오류 처리 구현
+ Lambda의 병렬 조정 활용

**반복 전략**

보상이 개선되지 않는 경우:
+ 보상 함수 설계 조정
+ 데이터세트 다양성 증가
+ 대표성이 강한 예제 추가
+ 보상 신호가 명확하고 일관된지 확인

## 고급 기능: Nova Forge
<a name="nova-rft-advanced"></a>

표준 RFT 제한 사항을 넘어 고급 기능이 필요한 사용자의 경우 Nova Forge를 유료 구독 서비스 오퍼링으로 사용할 수 있습니다.
+ 멀티턴 대화 지원
+ 실행 시간이 15분을 초과하는 보상 함수
+ 추가 알고리즘 및 조정 옵션
+ 사용자 지정 훈련 레시피 수정
+ 첨단 AI 기술

Nova Forge는 SageMaker HyperPod에서 실행되며 엔터프라이즈 고객이 자체 프론티어 모델을 빌드할 수 있도록 설계되었습니다.

## 유용한 명령 및 팁
<a name="nova-rft-useful-commands"></a>

[관찰성 스크립트](https://github.com/aws-samples/amazon-nova-samples/tree/main/customization/SageMakerUilts/SageMakerJobsMonitoring) 모음을 사용하여 훈련 작업의 상태 및 진행 상황을 모니터링할 수 있습니다.

사용 가능한 스크립트는 다음과 같습니다.
+ 훈련 작업 상태 업데이트에 대한 이메일 알림 활성화
+ 작업 구성을 기반으로 훈련 시간 추정치 확보
+ 진행 중인 작업에 대한 훈련 예상 시간의 근사치 확보

**설치**

**참고**  
다음 스크립트를 사용하기 전에 AWS 자격 증명을 새로 고쳐야 합니다.

```
pip install boto3
git clone https://github.com/aws-samples/amazon-nova-samples.git
cd amazon-nova-samples/customization/SageMakerUilts/SageMakerJobsMonitoring/
```

**기본 사용법**

```
# Enabling email notifications for training job status updates
python enable_sagemaker_job_notifs.py --email test@amazon.com test2@gmail.com --region us-east-1 --platform SMTJ

Creating resources........
Please check your email for a subscription confirmation email, and click 'Confirm subscription' to start receiving job status email notifications!
You'll receive the confirmation email within a few minutes.
```

```
# Obtaining training time estimates based on job configurations
python get_training_time_estimate.py
```

```
# Obtaining approximations for how long training is expected to take for in-progress jobs
python get-training-job-progress.py --region us-east-1 --job-name my-training-job --num-dataset-samples 1000
```

자세한 내용 및 예제는 [여기](https://github.com/aws-samples/amazon-nova-samples/blob/main/customization/SageMakerUilts/SageMakerJobsMonitoring/README.md)를 참조하세요.

# 여러 반복에서 진행 상황 모니터링
<a name="nova-model-monitor"></a>

MLflow를 통해 지표를 추적할 수 있습니다.

## Nova 사용자 지정 - SageMaker HyperPod에 대한 MLFlow 설정
<a name="nova-customization-mlflow-setup"></a>

SageMaker HyperPod 환경이 지표를 MLFlow에 출력하도록 하려면 몇 가지 추가 설정을 수행해야 합니다.

1. Amazon SageMaker AI 열기

1. SageMaker Studio 선택

   1. 이미 생성된 프로필이 있는 경우 'Studio 열기' 선택

   1. 프로필이 생성되지 않은 경우 'SageMaker 도메인 생성'을 선택하여 설정

1. MLFlow를 선택하세요. 생성된 MLFlow 앱이 없는 경우 'MLFlow 앱 생성'을 선택하세요.

1. ML Flow 앱에서 복사/붙여넣기 버튼 또는 '세부 정보 보기' 메뉴 항목을 클릭하여 ARN을 가져오세요. 훈련 작업을 제출할 때 이 정보가 필요합니다.  
![\[ML Flow 앱의 세부 정보 보기 버튼(ARN 포함).\]](http://docs.aws.amazon.com/ko_kr/nova/latest/nova2-userguide/images/how-it-works.png)

1. HyperPod 클러스터 실행 역할에서 다음 정책을 추가하세요. 그러면 HyperPod 클러스터가 MLFlow API를 직접 호출하여 지표를 게시할 수 있습니다.

```
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "sagemaker-mlflow:*",
            "Resource": [
                "arn:aws:sagemaker:us-east-1:372836560492:mlflow-app/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "sagemaker:ListMlflowTrackingServers",
                "sagemaker:CallMlflowAppApi"
            ],
            "Resource": "*"
        }
    ]
}
```

### CLI를 통해 작업 제출
<a name="submitting-job-cli"></a>

명령줄 또는 레시피 yaml에서 4개의 새 재정의 파라미터를 지정합니다.

1. `mlflow_tracking_uri`: MLFlow 앱의 ARN

1. `mlflow_experiment_name`: 실험에 대한 이 실행의 이름

1. `mlflow_experiment_name`: 지표가 MLFlow에 저장되는 실험 이름

1. `mlflow_run_name`: 이 실험의 이름

명령줄

```
--override-parameters '{"recipes.run.mlflow_tracking_uri": "arn:aws:sagemaker:us-east-1:925548216816:mlflow-app/app-B6XOUNCHQM4W", "recipes.run.mlflow_experiment_name": "myuser-sft-lora-exp1", "recipes.run.mlflow_run_name": "myuser-sft-lora-exp1-202512181940"}'
```

yaml:

```
## Run config
run:
  mlflow_tracking_uri: "arn:aws:sagemaker:us-east-1:925548216816:mlflow-app/app-B6XOUNCHQM4W" 
  mlflow_experiment_name: "myuser-sft-lora-exp1"
  mlflow_run_name: "myuser-sft-lora-exp1-202512181940"
```

### SageMaker Studio UI를 통해 작업 제출
<a name="submitting-job-ui"></a>

MLFlow 통합은 SageMaker Studio UI 환경에 이미 빌드되어 있습니다. 훈련 작업을 제출할 때 사용할 MLFlow 앱 인스턴스를 표시하기만 하면 됩니다.

1. SageMaker Studio에서 모델 > Nova 2.0 Lite > 사용자 지정 > UI로 사용자 지정으로 이동하세요.

1. 고급 구성 섹션 확장

1. 훈련 지표를 전송할 MLFlow 앱을 선택하세요. 여기에서 실험 이름과 실험 실행을 설정할 수도 있습니다.

![\[MLFlow 앱.\]](http://docs.aws.amazon.com/ko_kr/nova/latest/nova2-userguide/images/MLFlow-App.png)


### AWS AWS CLI를 통해 작업 제출
<a name="submitting-job-cli-aws"></a>

AWS AWS CLI를 사용하는 경우 MLflow 앱을 생성하고 이를 훈련 작업 API 요청에 대한 입력으로 전달해야 합니다.

```
mlflow_app_name="<enter your MLflow app name>"
role_arn="<enter your role ARN>"
bucket_name="<enter your bucket name>"
region="<enter your region>"

mlflow_app_arn=$(aws sagemaker create-mlflow-app \
  --name $mlflow_app_name \
  --artifact-store-uri "s3://$bucket_name" \
  --role-arn $role_arn \
  --region $region)
```

## MLflow 앱 생성
<a name="nova-model-monitor-mlflow-create"></a>

**Studio UI 사용**: Studio UI를 통해 훈련 작업을 생성하는 경우 기본 MLflow 앱이 자동으로 생성되고 고급 옵션에서 기본적으로 선택됩니다.

**CLI 사용**: CLI를 사용하는 경우 MLflow 앱을 생성하고 이를 훈련 작업 API 요청에 대한 입력으로 전달해야 합니다.

```
mlflow_app_name="<enter your MLflow app name>"
role_arn="<enter your role ARN>" 
bucket_name="<enter your bucket name>" 
region="<enter your region>"

mlflow_app_arn=$(aws sagemaker create-mlflow-app \
  --name $mlflow_app_name \
  --artifact-store-uri "s3://$bucket_name" \
  --role-arn $role_arn \
  --region $region)
```

## MLflow 앱에 액세스
<a name="nova-model-monitor-mlflow-access"></a>

**CLI 사용:** 미리 서명된 URL을 생성하여 MLflow 앱 UI에 액세스합니다.

```
aws sagemaker create-presigned-mlflow-app-url \
  --arn $mlflow_app_arn \
  --region $region \
  --output text
```

**Studio UI 사용:** Studio UI는 MLflow에 저장된 주요 지표를 표시하고 MLflow 앱 UI에 대한 링크를 제공합니다.

## 추적할 주요 지표
<a name="nova-model-monitor-mlflow-metircs"></a>

여러 반복에서 이러한 지표를 모니터링하여 개선 사항을 평가하고 작업 진행 상황을 추적합니다.

**SFT의 경우**
+ 훈련 손실 곡선
+ 소비된 샘플 수 및 샘플 처리 시간
+ 홀드아웃 테스트 세트의 성능 정확도
+ 형식 규정 준수(예: 유효한 JSON 출력 비율)
+ 도메인별 평가 데이터의 퍼플렉시티

**RFT의 경우**
+ 훈련 대비 평균 보상 점수
+ 보상 분포(높은 보상 응답의 백분율)
+ 검증 보상 추세(과적합 감시)
+ 태스크별 성공률(예: 코드 실행 통과 비율, 수학 문제 정확도)

**일반**
+ 반복 간 벤치마크 성능 델타
+ 대표 샘플에 대한 인적 평가 점수
+ 프로덕션 지표(반복적으로 배포하는 경우)

## 중지 시점 결정
<a name="nova-model-monitor-mlflow-stop"></a>

다음과 같은 경우 반복을 중지합니다.
+ **성능 정체**: 추가 훈련으로도 대상 지표가 더 이상 유의미하게 개선되지 않음
+ **기법 전환 지원**: 한 기법이 정체된 경우 성능 상한을 깨뜨리려면 전환(예: SFT → RFT → SFT) 시도
+ **목표 지표 달성**: 성공 기준을 충족함
+ **회귀 감지**: 새 반복은 성능을 저하시킴(아래 롤백 절차 참조)

자세한 평가 절차는 **평가** 섹션을 참조하세요.

# SageMaker AI로 훈련된 모델 평가
<a name="nova-model-evaluation"></a>

평가 프로세스의 목적은 훈련된 모델의 성능을 벤치마크 또는 사용자 지정 데이터세트와 비교하여 평가하는 것입니다. 평가 프로세스에는 일반적으로 훈련된 모델을 가리키는 평가 레시피를 생성하고, 평가 데이터세트와 지표를 지정하며, 별도의 평가 작업을 제출하고, 표준 벤치마크 또는 사용자 지정 데이터에 대해 성능을 평가하는 단계가 포함됩니다. 평가 프로세스는 Amazon S3 버킷에 저장된 성능 지표를 출력합니다.

**참고**  
이 주제에 설명된 평가 프로세스는 오프라인 프로세스입니다. 모델은 실시간 또는 실제 사용자 상호 작용을 통해 평가되지 않고 미리 정의된 답변이 있는 고정 벤치마크를 기준으로 테스트됩니다. 실시간 평가를 위해서는, 모델을 Amazon Bedrock에 배포한 후 [Amazon Bedrock](https://docs.aws.amazon.com//bedrock/latest/userguide/import-with-create-custom-model.html) 런타임 API를 직접적으로 호출하여 테스트할 수 있습니다.

**Topics**
+ [사전 조건](#nova-model-evaluation-prerequisites)
+ [사용 가능한 벤치마크 태스크](#nova-model-evaluation-benchmark)
+ [평가 관련 구성](#nova-model-evaluation-config)
+ [평가 훈련 작업 실행](#nova-model-evaluation-notebook)
+ [평가 결과 평가 및 분석](#nova-model-evaluation-assess)
+ [평가 모범 사례 및 문제 해결](#nova-model-evaluation-best-practices)
+ [사용 가능한 하위 태스크](#nova-model-evaluation-subtasks)
+ [추론 모델 평가](nova-reasoning-model-evaluation.md)
+ [RFT 평가](nova-rft-evaluation.md)
+ [보상 함수 구현](nova-implementing-reward-functions.md)

## 사전 조건
<a name="nova-model-evaluation-prerequisites"></a>

평가 훈련 작업을 시작하기 전에 다음 사항을 확인하세요.
+ 성능을 평가하려는, SageMaker AI로 훈련된 Amazon Nova 모델.
+ 평가를 위한 기본 Amazon Nova 레시피. 자세한 내용은 [Amazon Nova 레시피 가져오기](nova-model-recipes.md#nova-model-get-recipes) 섹션을 참조하세요.

## 사용 가능한 벤치마크 태스크
<a name="nova-model-evaluation-benchmark"></a>

Amazon Nova에 대한 SageMaker AI 모델 평가 기능을 사용하여 벤치마크 지표를 계산하는 방법을 보여주는 샘플 코드 패키지를 사용할 수 있습니다. 코드 패키지에 액세스하려면 [sample-Nova-lighteval-custom-task](https://github.com/aws-samples/sample-Nova-lighteval-custom-task/)를 참조하세요.

다음은 사용 가능한 업계 표준 벤치마크 목록입니다. `eval_task` 파라미터에 다음 벤치마크를 지정할 수 있습니다.

**모델 평가에 사용할 수 있는 벤치마크**


| 벤치마크 | 양식 | 설명 | Metrics | 전략 | 하위 태스크 사용 가능 | 
| --- | --- | --- | --- | --- | --- | 
| mmlu |  텍스트  |  다중 태스크 언어 이해 - 57개 주제에 걸친 지식을 테스트합니다.  |  정확도  | zs\$1cot | 예 | 
| mmlu\$1pro | 텍스트 |  MMLU - 전문 하위 세트 - 법률, 의학, 회계, 엔지니어링 등 전문 분야에 중점을 둡니다.  | 정확도 | zs\$1cot | 아니요 | 
| bbh | 텍스트 |  고급 추론 태스크 - 높은 수준의 인지 능력과 문제 해결 능력을 테스트하는 도전적 문제의 모음입니다.  | 정확도 | fs\$1cot | 예 | 
| gpqa | 텍스트 |  일반 물리학 질문 응답 - 물리 개념 이해와 관련 문제 해결 능력을 평가합니다.  | 정확도 | zs\$1cot | 아니요 | 
| math | 텍스트 |  수학적 문제 해결 - 대수학, 미적분학, 문장제 문제 등 여러 주제에서 수학적 추론 능력을 측정합니다.  | exact\$1match | zs\$1cot | 예 | 
| strong\$1reject | 텍스트 |  품질 관리 태스크 - 부적절하거나 유해하거나 잘못된 콘텐츠를 감지하고 거부하는 모델의 능력을 테스트합니다.  | deflection | zs | 예 | 
| ifeval | 텍스트 |  지침 준수 평가 - 모델이 주어진 지침을 얼마나 정확하게 따르고 요구 조건에 맞게 태스크를 완료하는지 측정합니다.  | 정확도 | zs | 아니요 | 
| gen\$1qa | 멀티모달(이미지) |  사용자 지정 데이터세트 평가 - 사용자가 자체 데이터세트를 가져와서 벤치마킹을 수행하고, ROUGE 및 BLEU와 같은 지표를 사용하여 모델 출력을 참조 답변과 비교합니다. `gen_qa`는 Amazon Nova Lite 또는 Amazon Nova Pro 기반 모델에 대한 이미지 추론을 지원합니다. 또한 Bring-Your-Own Metrics lambda를 지원합니다. (RFT 평가의 경우 RFT 평가 레시피를 사용하세요.)  | 모두 | gen\$1qa | 아니요 | 
| mmmu | 멀티모달 |  대규모 다분야 멀티모달 이해(MMMU) - 30개 학문 분야의 객관식 및 서술형 문제로 구성된 대학 수준 벤치마크입니다.  | 정확도 | zs\$1cot | 예 | 
| llm\$1judge | 텍스트 |  평가형 LLM 선호도 비교 - Nova Judge 모델을 사용하여 프롬프트에 대한 응답 쌍(A와 B)을 비교하고, B가 A보다 선호될 확률을 계산합니다.  | 모두 | judge | 아니요 | 
|  mm\$1llm\$1judge  | 멀티모달(이미지) |  이 새로운 벤치마크는 위의 텍스트 기반 `llm_judge`와 동일하게 동작합니다. 유일한 차이는 이미지 추론을 지원한다는 점입니다.  | 모두 | judge | 아니요 | 
|  rubric\$1llm\$1judge  |  텍스트  |  Rubric Judge는 Nova 2.0 Lite에 빌드된 향상된 평가형 LLM 평가 모델입니다. 기본 설정 결정만 제공하는 [원래 평가 모델](https://aws.amazon.com/blogs/machine-learning/evaluating-generative-ai-models-with-amazon-nova-llm-as-a-judge-on-amazon-sagemaker-ai/)과 달리 Rubric Judge는 각 프롬프트에 맞게 조정된 사용자 지정 평가 기준을 동적으로 생성하고 여러 차원에 세분화된 점수를 할당합니다.  |  모두  |  judge  |  아니요  | 
|  aime\$12024  |  텍스트  |  AIME 2024 - 고급 수학 추론 및 문제 해결을 테스트하는 미국 초대 수학 검사 문제  |  exact\$1match  |  zs\$1cot  |  아니요  | 
|  calendar\$1scheduling  | 텍스트 |  Natural Plan - 여러 사람을 대상으로 여러 날에 걸쳐 회의를 예약할 수 있는 일정 예약 태스크 테스트 계획 기능  |  exact\$1match  |  fs  | 아니요 | 
|  humaneval  | 텍스트 |  HumanEval - 대규모 언어 모델의 코드 생성 능력을 평가하도록 설계된 벤치마크 데이터세트입니다.  |  pass@1  | zs | 아니요 | 

## 평가 관련 구성
<a name="nova-model-evaluation-config"></a>

다음은 레시피의 주요 구성 요소에 대한 분석과 이를 사용 사례에 맞게 수정하는 방법에 대한 지침입니다.

### 레시피 이해 및 수정
<a name="nova-model-evaluation-config-explain"></a>

**일반 실행 구성**

```
run:
  name: eval_job_name 
  model_type: amazon.nova-2-lite-v1:0:256k 
  model_name_or_path: nova-lite-2/prod # or s3://escrow_bucket/model_location
  replicas: 1 
  data_s3_path: ""
  mlflow_tracking_uri: "" 
  mlflow_experiment_name : "" 
  mlflow_run_name : ""
```
+ `name`: 평가 작업에 대한 설명이 포함된 이름입니다.
+ `model_type`: 사용할 Nova 모델 변형을 지정합니다. 이 필드는 수동으로 수정하지 마세요. 옵션에는 다음이 포함됩니다.
  + amazon.nova-micro-v1:0:128k
  + amazon.nova-lite-v1:0:300k
  + amazon.nova-pro-v1:0:300k
  + amazon.nova-2-lite-v1:0:256k
+ `model_name_or_path`: 기본 모델 경로 또는 훈련 후 체크포인트의 S3 경로입니다. 옵션에는 다음이 포함됩니다.
  + nova-micro/prod
  + nova-lite/prod
  + nova-pro/prod
  + nova-lite-2/prod
  + 훈련 후 체크포인트 경로의 S3 경로(`s3:customer-escrow-111122223333-smtj-<unique_id>/<training_run_name>`)
**참고**  
**훈련 후 모델 평가**  
Nova SFT 훈련 작업 후 훈련 후 모델을 평가하려면 훈련 작업을 성공적으로 실행한 후 다음 단계를 따르세요. 훈련 로그 끝에 "Training is complete"라는 로그 메시지가 표시됩니다. 또한 출력 버킷에서 체크포인트 위치가 포함된 `manifest.json` 파일을 찾을 수 있습니다. 이 파일은 출력 S3 위치의 `output.tar.gz` 파일 내에 있습니다. 평가를 진행하려면 레시피 구성에서 이 체크포인트를 `run.model_name_or_path` 값으로 설정하세요.
+ `replica`: 분산 추론(여러 노드에서 추론 실행)에 사용할 컴퓨팅 인스턴스 수. 다중 노드 추론을 활성화하려면 `replica` > 1을 설정합니다. 그러면 평가 속도가 빨라집니다. `instance_count` 및 `replica`를 모두 지정하면 `instance_count`가 우선합니다. 여러 복제본은 SageMaker HyperPod가 아닌 SageMaker AI 훈련 작업에만 적용됩니다.
+ `data_s3_path`: 입력 데이터세트 Amazon S3 경로입니다. 이 필드는 필수이지만 항상 비워 두어야 합니다.
+ `mlflow_tracking_uri`: (선택 사항) MLflow 추적 서버의 위치(SMHP에만 필요)
+ `mlflow_experiment_name`: (선택 사항) 관련 ML 실행을 그룹화하는 실험의 이름
+ `mlflow_run_name`: (선택 사항) 실험 내 특정 훈련 실행의 사용자 지정 이름

**평가 구성**

```
evaluation:
  task: mmlu 
  strategy: zs_cot 
  subtask: abstract_algebra
  metric: accuracy
```
+ `task`: 사용할 평가 벤치마크 또는 태스크를 지정합니다. 지원되는 태스크에는 다음이 포함됩니다.
  + `mmlu`
  + `mmlu_pro`
  + `bbh`
  + `gpqa`
  + `math`
  + `strong_reject`
  + `gen_qa`
  + `ifeval`
  + `mmmu`
  + `llm_judge`
  + `mm_llm_judge`
  + `rubric_llm_judge`
  + `aime_2024`
  + `calendar_scheduling`
  + `humaneval`
+ `strategy`: 평가 접근 방식을 정의합니다.
  + `zs_cot`: 제로샷 생각의 사슬 - 명시적인 예시 없이, 단계별 추론을 수행하도록 대형 언어 모델에 지시하는 접근 방식입니다.
  + `fs_cot`: 퓨샷 생각의 사슬 - 모델에 새 문제를 해결하도록 요청하기 전에 단계별 추론의 몇 가지 예시를 제공하는 접근 방식입니다.
  + `zs`: 제로샷 - 사전 훈련 예시 없이 문제를 해결하는 접근 방식입니다.
  + `gen_qa`: 사용자 제공 데이터세트에 특화된 전략입니다.
  + `judge`: Nova LLM as Judge 및 `mm_llm_judge`에 특정한 전략.
+ `subtask`: 선택 사항입니다. 평가 태스크의 특정 구성 요소입니다. 사용 가능한 하위 태스크에 대한 전체 목록은 [사용 가능한 하위 태스크](#nova-model-evaluation-subtasks) 섹션을 참조하세요.
  + 사용 가능한 벤치마크 태스크에서 지원되는 하위 태스크를 확인합니다.
  + 하위 태스크 벤치마크가 없는 경우 이 필드를 제거해야 합니다.
+ `metric`: 사용할 평가 지표입니다.
  + `accuracy`: 정답 비율입니다.
  + `exact_match`: math 벤치마크의 경우 입력 예측 문자열이 참조와 정확히 일치하는 비율을 반환합니다.
  + `deflection`: strong reject 벤치마크의 경우기본 모델에 대한 상대 편향과 중요도 지표의 차이를 반환합니다.
  + `all`:

    `gen_qa`의 사용자 제공 데이터세트 벤치마크의 경우 다음 지표를 반환합니다.
    + `rouge1`: 생성된 텍스트와 참조 텍스트 간의 유니그램(단일 단어) 중복을 측정합니다.
    + `rouge2`: 생성된 텍스트와 참조 텍스트 간의 바이그램(2개 연속 단어) 중복을 측정합니다.
    + `rougeL`: 텍스트 간에 가장 긴 공통 부분 수열을 측정하며, 일치 항목 간의 간격을 허용합니다.
    + `exact_match`: 생성된 텍스트가 문자별로 참조 텍스트와 정확히 일치하는지 여부를 나타내는 이진 점수(0 또는 1)입니다.
    + `quasi_exact_match`: exact\$1match와 유사하지만 일반적으로 대소문자, 구두점 및 공백 차이를 무시하는 더 관대한 일치 방식입니다.
    + `f1_score`: 정밀도와 재현율의 조화 평균으로, 예측된 답변과 참조 답변 간의 단어 중복을 측정합니다.
    + `f1_score_quasi`: f1\$1score와 유사하지만 사소한 차이를 무시하는 정규화된 텍스트 비교를 사용하는 더 관대한 일치 방식입니다.
    + `bleu`: 생성된 텍스트와 참조 텍스트 간의 n그램 일치 정밀도를 측정하며, 일반적으로 번역 평가에 사용됩니다.

    `llm_judge` 및 `mm_llm_judge`의 경우 자체 제공 데이터세트 벤치마크를 가져오고 다음 지표를 반환합니다.
    + `a_scores`: 순방향 및 역방향 평가 패스에서 `response_A`가 승리한 횟수입니다.
    + `a_scores_stderr`: 쌍별 판단에서 `response_A_scores`의 표준 오차입니다.
    + `b_scores`: 순방향 및 역방향 평가 패스에서 `response_B`가 승리한 횟수를 측정합니다.
    + `a_scores_stderr`: 쌍별 판단에서 `response_B_scores`의 표준 오차입니다.
    + `ties`: `response_A`와 `response_B`가 동일한 것으로 평가되는 판단 수입니다.
    + `ties_stderr`: 쌍별 판단에서 `ties`의 표준 오차입니다.
    + `inference_error`: 올바르게 평가되지 못한 판단 수입니다.
    + `score`: `response_B`에 대한 순방향 및 역방향 패스의 승리 횟수에 기반한 집계 점수입니다.
    + `score_stderr`: `response_B`에 대한 순방향 및 역방향 패스의 승리 횟수에 기반한 집계 점수입니다.
    + `inference_error_stderr`: 쌍별 판단에서 집계 점수의 표준 오차입니다.
    + `winrate`: Bradley-Terry 확률을 사용하여 계산된, `response_B`가 `response_A`보다 선호될 확률입니다.
    + `lower_rate`: 부트스트랩 샘플링에서 추정된 승률의 하한(2.5번째 백분위수)입니다.
    + `upper_rate`: 부트스트랩 샘플링에서 추정된 승률의 상한(97.5번째 백분위수)입니다.

**추론 구성(선택 사항)**

```
inference:
  max_new_tokens: 2048 
  top_k: -1 
  top_p: 1.0 
  temperature: 0
  top_logprobs: 10
  reasoning_effort: null  # options: low/high to enable reasoning or null to disable reasoning
```
+ `max_new_tokens`: 생성할 최대 토큰 수입니다. 정수여야 합니다. (LLM Judge에는 사용할 수 없음)
+ `top_k`: 고려할 확률이 가장 높은 토큰의 수입니다. 정수여야 합니다.
+ `top_p`: 토큰 샘플링을 위한 누적 확률 임곗값입니다. 1.0에서 0.0 사이의 부동 소수점 수여야 합니다.
+ `temperature`: 토큰 선택의 무작위성(값이 높을수록 더 무작위). 결과를 결정론적으로 만들려면 0으로 유지합니다. 부동 소수점 수 유형, 최소값은 0입니다.
+ `top_logprobs`: 추론 응답에서 반환할 상위 logprobs 수. 이 값은 0\$120의 정수여야 합니다. Logprobs에는 메시지 콘텐츠에서 반환된 각 출력 토큰의 고려된 출력 토큰 수와 로그 확률이 포함됩니다.
+ `reasoning_effort`: 추론 가능 모델의 추론 동작을 제어합니다. `model_type`이 추론 가능 모델(현재 `amazon.nova-2-lite-v1:0:256k`)을 지정하는 경우에만 `reasoning_effort`를 설정합니다. 사용 가능한 옵션은 null(설정하지 않은 경우 기본값, 추론 비활성화), low 또는 high입니다.

### 로그 확률 출력 형식
<a name="nova-model-evaluation-logprobs"></a>

`top_logprobs`가 추론 설정에서 구성된 경우 평가 출력에는 parquet 파일에 토큰 수준 로그 확률이 포함됩니다. 각 토큰 위치에는 로그 확률이 다음과 같이 구성된 상위 후보 토큰의 사전이 포함되어 있습니다.

```
{
"Ġint": {"logprob_value": -17.8125, "decoded_value": " int"},
"Ġthe": {"logprob_value": -2.345, "decoded_value": " the"}
}
```

각 토큰 항목에는 다음이 포함됩니다.
+ `logprob_value`: 토큰의 로그 확률 값
+ `decoded_value`: 사람이 읽을 수 있는 디코딩된 토큰 문자열 표현

원시 토큰화 토큰은 고유성을 보장하기 위한 사전 키로 사용되는 반면, `decoded_value`는 사람이 읽을 수 있는 해석을 제공합니다.

### 평가 레시피 예시
<a name="nova-model-evaluation-config-example"></a>

Amazon Nova는 네 가지 유형의 평가 레시피를 제공합니다. 모든 레시피는 [SageMaker HyperPod 레시피 GitHub 리포지토리](https://github.com/aws/sagemaker-hyperpod-recipes/tree/main/recipes_collection)에서 사용할 수 있습니다.

**Topics**

#### 일반 텍스트 벤치마크 레시피
<a name="nova-model-evaluation-config-example-text"></a>

이러한 레시피를 사용하면 광범위한 텍스트 전용 벤치마크 모음 전반에서 Amazon Nova 모델의 기본 기능을 평가할 수 있습니다.

레시피 형식: `xxx_general_text_benchmark_eval.yaml`.

#### 사용자 제공 데이터세트 벤치마크 레시피
<a name="nova-model-evaluation-config-byo"></a>

이러한 레시피를 사용하면 벤치마킹을 위한 자체 데이터세트를 가져와서 다양한 유형의 지표를 사용하여 모델 출력을 참조 답변과 비교할 수 있습니다.

레시피 형식: `xxx_ bring_your_own_dataset_eval.yaml`.

**사용자 제공 데이터세트 요구 사항**

파일 형식: 
+ 평가 예시가 포함된 단일 `gen_qa.jsonl` 파일입니다. 파일 이름은 `gen_qa.jsonl`과 정확히 일치해야 합니다.
+ 데이터세트는 SageMaker AI 훈련 작업에서 액세스할 수 있는 S3 위치에 업로드해야 합니다.
+ 파일은 일반 Q&A 데이터세트에 필요한 스키마 형식을 따라야 합니다.

스키마 형식 요구 사항 - `.jsonl` 파일의 각 줄은 다음 필드가 있는 JSON 객체여야 합니다.
+ 필수 필드.

  `query`: 답변이 필요한 질문 또는 지침이 포함된 문자열입니다.

  `response`: 예상 모델 출력을 포함하는 문자열입니다.
+ 선택 필드.

  `system`: 쿼리를 처리하기 전에 AI 모델의 동작, 역할 또는 특성을 설정하는 시스템 프롬프트가 포함된 문자열입니다.

  `images`: 데이터 속성(Base64로 인코딩된 이미지 문자열)이 있는 객체 목록을 포함하는 배열.

  `metadata`: 태그 지정을 위해 항목과 연결된 메타데이터를 포함하는 문자열.

**입력 예**

```
{
"system":"You are an English major with top marks in class who likes to give minimal word responses: ",
   "query":"What is the symbol that ends the sentence as a question",
   "response":"?"
}{
"system":"You are a pattern analysis specialist who provides succinct answers: ",
   "query":"What is the next number in this series? 1, 2, 4, 8, 16, ?",
   "response":"32"
}{
"system":"You have great attention to detail and follow instructions accurately: ",
   "query":"Repeat only the last two words of the following: I ate a hamburger today and it was kind of dry",
   "response":"of dry"
}{
"system": "Image inference: ",
  "query": "What is the number in the image? Please just use one English word to answer.",
  "response": "two",
  "images": [
    {
      "data": "data:image/png;Base64,iVBORw0KGgoA ..."
    }
  ]
}
```

사용자 지정 데이터세트를 사용하려면 기존 구성을 변경하지 않으면서 다음 필수 필드를 추가하여 평가 레시피를 수정합니다.

```
evaluation:
  task: gen_qa 
  strategy: gen_qa 
  metric: all
```

**제한 사항 **
+ 평가당 하나의 `.jsonl` 파일만 허용됩니다.
+ 파일은 정의된 스키마를 엄격하게 따라야 합니다.

##### 자체 지표 가져오기
<a name="nova-model-evaluation-byom"></a>

사용자 지정 사전 처리, 사후 처리 및 지표 기능을 사용하여 자체 지표를 가져와 모델 평가 워크플로를 완전히 사용자 지정할 수 있습니다. 사전 처리에서는 입력 데이터를 추론 서버로 보내기 전에 입력 데이터를 처리할 수 있으며, 사후 처리에서는 지표 계산을 사용자 지정하고 필요에 따라 사용자 지정 지표를 반환할 수 있습니다.

다음 단계에 따라 사용자 지정 평가 SDK로 자체 지표를 가져옵니다.

1. 아직 수행하지 않은 경우 먼저 AWS 계정에서 [AWS Lambda 함수를 생성](https://docs.aws.amazon.com/lambda/latest/dg/getting-started.html)하세요.

1. [GitHub 리포지토리](https://github.com/aws/nova-custom-eval-sdk/releases)에서 `nova-custom-eval-layer.zip` 파일을 다운로드하세요. 이 오픈 소스 Nova 사용자 지정 평가 SDK를 사용하여 사용자 지정 함수의 입력 및 출력 페이로드를 검증하고 훈련 중에 Nova의 자체 지표 가져오기 평가와 통합하기 위해 통합 인터페이스를 제공할 수 있습니다.

1. 다음 명령을 사용하여 사용자 지정 Lambda 계층을 업로드하세요.

   ```
   aws lambda publish-layer-version \
       --layer-name nova-custom-eval-layer \
       --zip-file fileb://nova-custom-eval-layer.zip \
       --compatible-runtimes python3.12 python3.11 python3.10 python3.9
   ```

1. 필수 AWS 계층(`pydantic` 종속성에 필요한 `AWSLambdaPowertoolsPythonV3-python312-arm64`)과 함께 Lambda 함수에 사용자 지정 계층으로 이 계층을 추가하세요.

1. 제공된 예제를 사용하여 Lambda 코드를 업데이트하고 필요에 따라 코드를 수정하세요. 이 예제 코드는 모델 평가를 위한 사전 처리 및 사후 처리 단계를 사용하여 Nova의 사용자 지정 평가를 위한 Lambda 함수를 생성합니다.

   ```
   from nova_custom_evaluation_sdk.processors.decorators import preprocess, postprocess
   from nova_custom_evaluation_sdk.lambda_handler import build_lambda_handler
   
   @preprocess
   def preprocessor(event: dict, context) -> dict:
       data = event.get('data', {})
       return {
           "statusCode": 200,
           "body": {
               "system": data.get("system"),
               "prompt": data.get("prompt", ""),
               "gold": data.get("gold", "")
           }
       }
   
   @postprocess
   def postprocessor(event: dict, context) -> dict:
       # data is already validated and extracted from event
       data = event.get('data', [])
       inference_output = data.get('inference_output', '')
       gold = data.get('gold', '')
       
       metrics = []
       inverted_accuracy = 0 if inference_output.lower() == gold.lower() else 1.0
       metrics.append({
           "metric": "inverted_accuracy_custom",
           "value": accuracy
       })
       
       # Add more metrics here
       
       return {
           "statusCode": 200,
           "body": metrics
       }
   
   # Build Lambda handler
   lambda_handler = build_lambda_handler(
       preprocessor=preprocessor,
       postprocessor=postprocessor
   )
   ```

1. 평가 작업에 대한 액세스 권한을 Lambda에 부여하세요. 평가 작업에 지정된 실행 역할에 Lambda 함수를 간접 호출하는 정책이 포함되어 있는지 확인하세요. 다음은 예시 정책입니다.

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "LambdaAccess",
               "Effect": "Allow",
               "Action": [
                   "lambda:InvokeFunction"
               ],
               "Resource": "arn:aws:lambda:us-east-1:111122223333:function:ExampleFunction",
               "Condition": {
                   "StringLike": {
                       "aws:PrincipalArn": "arn:aws:iam::111122223333:role/service-role/AmazonSageMaker-ExecutionRole-ARN"
                   }
               }
           },
           {
               "Sid": "DenyNonAWSEventSourcesForLambda",
               "Effect": "Deny",
               "Action": [
                   "lambda:InvokeFunction"
               ],
               "Resource": "arn:aws:lambda:us-east-1:111122223333:function:ExampleFunction",
               "Condition": {
                   "Null": {
                       "lambda:EventSourceToken": false
                   }
               }
           }
       ]
   }
   ```

------

1. Lambda 페이로드 스키마를 검토하세요. 다음 표에는 Lambda 요청 및 응답 스키마가 나열되어 있습니다. Nova 사용자 지정 평가 SDK를 사용하여 스키마를 검증할 수 있습니다.  
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/nova/latest/nova2-userguide/nova-model-evaluation.html)

1. 레시피 파일을 수정하세요. 다음 예를 참고하세요 

   ```
   processor:
     lambda_arn: arn:aws:lambda:us-east-1:111122223333:function:name
     lambda_type: "custom_metrics"
     preprocessing:
       enabled: true
     postprocessing:
       enabled: true
     aggregation: average
   ```
   + `lambda-arn`: 사전 처리 및 사후 처리를 담당하는 Lambda 함수의 Amazon 리소스 이름(ARN).
   + `lambda_type`: 'custom\$1metrics' 또는 'rft'.
   + `preprocessing`: 사용자 지정 사전 처리 작업의 활성화 여부.
   + `postprocessing`: 사용자 지정 사후 처리 작업의 활성화 여부.
   + `aggregation`: 기본 제공 집계 함수(유효한 옵션: min, max, average, sum).

**제한 사항 **
+ 자체 지표 가져오기는 텍스트 입력 데이터세트에만 적용됩니다.
+ 멀티모달 입력 데이터세트는 지원되지 않습니다.
+ 사전 처리 단계에서는 메타데이터 필드를 처리하지 않습니다.

#### 평가형 Nova LLM 벤치마크 레시피
<a name="nova-model-evaluation-config-llm-judge"></a>

평가형 Nova LLM은 사용자 지정 데이터세트를 사용하여 한 모델의 응답 품질을 기준 모델의 응답과 비교하는 모델 평가 기능입니다. 프롬프트, 기준 응답 및 도전자 응답이 있는 데이터세트를 수락하고 Nova Judge 모델을 사용하여 쌍별 비교를 통해 [Bradley-Terry](https://en.wikipedia.org/wiki/Bradley%E2%80%93Terry_model) 확률에 기반한 승률 지표를 제공합니다. 레시피 형식: `xxx_llm_judge_eval.yaml`.

**Nova LLM 데이터세트 요구 사항**

파일 형식: 
+ 평가 예시가 포함된 단일 `llm_judge.jsonl` 파일입니다. 파일 이름은 `llm_judge.jsonl`과 정확히 일치해야 합니다.
+ 데이터세트는 SageMaker AI 훈련 작업에서 액세스할 수 있는 S3 위치에 업로드해야 합니다.
+ 파일은 `llm_judge` 데이터세트에 필요한 스키마 형식을 따라야 합니다.
+ 입력 데이터세트는 모든 레코드가 12k 컨텍스트 길이 미만인지 확인해야 합니다.

스키마 형식 - `.jsonl` 파일의 각 줄은 다음 필드가 있는 JSON 객체여야 합니다.
+ 필수 필드: 

  `prompt`: 생성된 응답에 대한 프롬프트가 포함된 문자열입니다.

  `response_A`: 기준 응답을 포함하는 문자열입니다.

  `response_B`: 기준 응답과 비교할 대체 응답을 포함하는 문자열입니다.

입력 예

```
{
"prompt": "What is the most effective way to combat climate change?",
"response_A": "The most effective way to combat climate change is through a combination of transitioning to renewable energy sources and implementing strict carbon pricing policies. This creates economic incentives for businesses to reduce emissions while promoting clean energy adoption.",
"response_B": "We should focus on renewable energy. Solar and wind power are good. People should drive electric cars. Companies need to pollute less."
}
{
"prompt": "Explain how a computer's CPU works",
"response_A": "CPU is like brain of computer. It does math and makes computer work fast. Has lots of tiny parts inside.",
"response_B": "A CPU (Central Processing Unit) functions through a fetch-execute cycle, where instructions are retrieved from memory, decoded, and executed through its arithmetic logic unit (ALU). It coordinates with cache memory and registers to process data efficiently using binary operations."
}
{
"prompt": "How does photosynthesis work?",
"response_A": "Plants do photosynthesis to make food. They use sunlight and water. It happens in leaves.",
"response_B": "Photosynthesis is a complex biochemical process where plants convert light energy into chemical energy. They utilize chlorophyll to absorb sunlight, combining CO2 and water to produce glucose and oxygen through a series of chemical reactions in chloroplasts."
}
```

사용자 지정 데이터세트를 사용하려면 다음 필수 필드를 포함하도록 평가 레시피를 수정합니다. 콘텐츠는 변경하지 마세요.

```
evaluation:
  task: llm_judge
  strategy: judge
  metric: all
```

**제한 사항 **
+ 평가당 하나의 `.jsonl` 파일만 허용됩니다.
+ 파일은 정의된 스키마를 엄격하게 따라야 합니다.
+ Nova Judge 모델은 micro/lite/pro 사양에서 동일합니다.
+ (현재 사용자 지정 구분 기호는 지원되지 않습니다.)

##### 멀티모달(이미지) 벤치마크 레시피에 대한 Nova 평가형 LLM
<a name="nova-model-evaluation-mm-llm-judge"></a>

Nova MM\$1LLM Judge라고 하는 멀티모달에 대한 Nova LLM Judge(이미지)는 사용자 지정 데이터세트를 사용하여 한 모델의 응답 품질을 기준 모델의 응답과 비교하는 모델 평가 기능입니다. 프롬프트, 기준 응답, 도전자 응답, Base64로 인코딩된 문자열 양식의 이미지가 있는 데이터세트를 수락하고 Nova Judge 모델을 사용하여 페어별 비교를 통해 [Bradley-Terry](https://en.wikipedia.org/wiki/Bradley%E2%80%93Terry_model) 확률에 기반한 승률 지표를 제공합니다. 레시피 형식: `xxx_mm_llm_judge_eval.yaml`.

**Nova LLM 데이터세트 요구 사항**

파일 형식: 
+ 평가 예시가 포함된 단일 `mm_llm_judge.jsonl` 파일입니다. 파일 이름은 정확히 `llm_judge.jsonl`이어야 합니다.
+ 데이터세트는 SageMaker 훈련 작업에서 액세스할 수 있는 S3 위치에 업로드해야 합니다.
+ 파일은 `mm_llm_judge` 데이터세트에 필요한 스키마 형식을 따라야 합니다.
+ 입력 데이터세트에서는 이미지 속성을 제외하고 모든 레코드가 12k 컨텍스트 길이 미만이 되도록 보장해야 합니다.

스키마 형식 - `.jsonl` 파일의 각 줄은 다음 필드가 있는 JSON 객체여야 합니다.
+ 필수 필드: 

  `prompt`: 생성된 응답에 대한 프롬프트가 포함된 문자열입니다.

  `images`: 데이터 속성(Base64로 인코딩된 이미지 문자열)이 있는 객체 목록을 포함하는 배열.

  `response_A`: 기준 응답을 포함하는 문자열입니다.

  `response_B`: 기준 응답과 비교할 대체 응답을 포함하는 문자열입니다.

입력 예

가독성을 위해 다음 예제에는 새 줄과 들여쓰기가 포함되지만 실제 데이터세트에서는 각 레코드가 한 줄에 있어야 합니다.

```
{
  "prompt": "What is in the image?",
  "images": [
    {
      "data": "data:image/jpeg;Base64,/9j/2wBDAAQDAwQDAwQEAwQFBAQFBgo..."
    }
  ],
  "response_A": "a dog.",
  "response_B": "a cat.",
} 
{
  "prompt": "How many animals are in each of the images?",
  "images": [
    {
      "data": "data:image/jpeg;Base64,/9j/2wBDAAQDAwQDAwQEAwQFBAQFBgo..."
    },
    {
      "data": "data:image/jpeg;Base64,/DKEafe3gihn..."
    }
  ],
  "response_A": "The first image contains one cat and the second image contains one dog",
  "response_B": "The first image has one aminal and the second has one animal"
}
```

사용자 지정 데이터세트를 사용하려면 다음 필수 필드를 포함하도록 평가 레시피를 수정합니다. 콘텐츠는 변경하지 마세요.

```
evaluation:
  task: mm_llm_judge
  strategy: judge
  metric: all
```

**제한 사항 **
+ 평가당 하나의 `.jsonl` 파일만 허용됩니다.
+ 파일은 정의된 스키마를 엄격하게 따라야 합니다.
+ Nova MM Judge 모델은 이미지 참조만 지원합니다.
+ Nova MM Judge 모델은 Amazon Nova Micro, Amazon Nova Lite 및 Amazon Nova Pro 사양에서 동일합니다.
+ (현재 사용자 지정 구분 기호는 지원되지 않습니다.)
+ Amazon S3 이미지 URI는 지원되지 않습니다.
+ 입력 데이터세트에서는 이미지 속성을 제외하고 모든 레코드가 12k 컨텍스트 길이 미만이 되도록 보장해야 합니다.

#### 지속적인 사전 훈련(CPT) 체크포인트 평가
<a name="nova-model-evaluation-cpt-checkpoints"></a>

지속적인 사전 훈련(CPT) 모델에 대한 평가는 CPT 모델이 정기적으로 지침을 따를 수 없기 때문에 지도 미세 조정(SFT)을 거친 모델보다 더 까다로울 수 있습니다. CPT 모델은 지침을 따르는 대신 완성 모델로 작동합니다. 즉, 입력 토큰 시퀀스와 함께 제공된 패턴만 계속하려고 시도합니다. 이러한 제한 사항을 고려할 때 일반적인 평가 데이터세트는 입력의 'Q&A' 형식으로 인해 제대로 작동하지 않을 수 있습니다. 질문에 답변하는 대신 모델은 동일한 질문으로 계속 진행하려고 시도합니다. 그러나 완료 스타일에서 모델을 프롬프트하는 특정 방식으로 데이터세트 형식을 지정하면 모델의 성능을 이해할 수 있습니다.

아래 단계에 따라 Nova Forge 평가 워크플로를 사용하여 사전 훈련된 지속적 모델에 대한 평가를 수행하는 방법을 이해합니다.

##### 데이터세트 준비 및 형식 지정
<a name="nova-cpt-dataset-preparation"></a>

CPT 모델 평가는 Nova Forge 모델 평가 경험에 이미 제공된 기존의 [자체 데이터세트 가져오기](#nova-model-evaluation-config-byo) 워크플로를 활용합니다. 그러나 CPT 모델은 SFT 모델과 동일한 방식으로 표준 질문 스타일 프롬프트에 응답하지 않으므로 데이터세트 내 쿼리는 순수 'completion' 형식으로 지정되어야 합니다.

CPT만 진행하는 모델의 또 다른 중요한 빈번한 제한 사항은 STOP 또는 시퀀스 종료 토큰을 생성할 수 없다는 점입니다. 즉, 모델이 강제로 중지될 때까지 토큰을 계속 생성합니다(예: max\$1new\$1tokens 파라미터 사용). 이러한 제한 사항을 고려할 때 모범 사례는 단일 토큰 응답(예: 다중 선택)을 사용하여 모델을 평가함으로써 모델이 프롬프트 후 필요하지 않은 정크 출력을 계속 생성하지 않도록 하는 것입니다.

예를 들어 일반적인 평가 데이터세트(예: MMLU, GPQA, MATH 등)는 다음과 같은 질문으로 모델에 프롬프트를 표시할 수 있습니다.

```
Early settlements and high population density along coastlines and rivers are 
best attributed to which of the following?
A: "Poor climate conditions"
B: "Limited forest cover"
C: "Cars"
D: "Access to trade routes" 

(Expected answer is D.)
```

그러나 CPT 모델은 지침 준수에서 미세 조정이 결여되었기 때문에 이 질문에 올바르게 응답하는 방법을 이해하지 못합니다. 따라서 CPT 모델은 다음과 같은 완료 스타일로 프롬프트되어야 합니다.

```
Early settlements and high population density along coastlines and rivers 
are best attributed to which of the following?
A: Poor climate conditions
B: Limited forest cover
C: Cars
D: Access to trade routes
The correct answer to this question is option 

(Expected answer is D.)
```

추론을 검사한 후 모델에서 생성된 logprobs 출력은 모델이 입력을 올바르게 처리하고 올바른 응답을 생성했는지에 대한 세부 정보를 제공합니다. 모델이 항상 예상되는 정확한 응답(이 경우 문자 D)을 생성한다는 보장은 없지만 모델이 올바르게 작동하는 경우 해당 응답이 logprobs 내에 있어야 합니다.

다중 선택이 아닌 또 다른 완료 스타일 프롬프트 예제:

```
The capital of France is

(Expected answer of Paris)
```

모델은 'Paris'의 응답을 생성하거나 logprobs 출력의 어딘가에 'Paris'에 해당하는 토큰이 나타날 것으로 예상됩니다.

##### 데이터세트 형식 지정
<a name="nova-cpt-dataset-formatting"></a>

CPT 평가는 기존의 [자체 데이터세트 가져오기](#nova-model-evaluation-config-byo) 워크플로를 활용합니다. 데이터는 JSONL 파일에서 새 줄로 구분된 'query response' 형식으로 지정되어야 합니다.

4개의 항목이 포함된 데이터세트 예제:

```
{"query": "The capital of France is", "response": "Paris"}
{"query": "2 + 2 =", "response": "4"}
{"query": "The mitochondria is the powerhouse of the", "response": "cell"}
{"query": "What is the largest planet?\nA: Mars\nB: Jupiter\nC: Saturn\nD: Earth\nAnswer:", "response": "B"}
```

각 줄에는 다음이 포함되어야 합니다.
+ `query`: 완료를 위한 프롬프트 텍스트
+ `response`: 예상 완료(실측 정보)

모델은 채팅 형식을 지정하지 않고 원시 텍스트 입력을 수신합니다. CPT 모델은 일반적으로 아직 특수 토큰에서 훈련되지 않았으며 채팅 템플릿에 제대로 응답하지 않으므로 모델에 프롬프트를 표시할 때 쿼리에 제공된 문자열만 모델로 전송됩니다(이때 추가 `[BOS]` 토큰이 자동으로 앞에 추가됨).

##### 레시피 구성
<a name="nova-cpt-recipe-configuration"></a>

다음은 CPT 모델을 평가하도록 구성된 레시피에 대한 예제입니다.

```
run:
  name: cpt_eval_job
  model_type: amazon.nova-2-lite-v1:0:256k
  model_name_or_path: s3://bucket/path/to/cpt-checkpoint/

evaluation:
  task: gen_qa  # Required for CPT - bring your own dataset
  strategy: gen_qa
  metric: all  # Returns rouge1, rouge2, rougeL, exact_match, f1_score, bleu

inference:
  checkpoint_is_instruction_tuned: "false"  # Required for CPT checkpoints
  top_logprobs: 5 # Change to desired amount of logprobs to calculate
  max_new_tokens: 1 # Keep low for completion tasks
  temperature: 0.0
```

CPT 평가에 대한 주요 변경 내용:
+ `checkpoint_is_instruction_tuned: "false"`

  이는 CPT 체크포인트에서 평가 실행을 지원하기 위해 특별히 추가된 새 파라미터입니다. checkpoint\$1is\$1instruction\$1tuned를 false로 설정하면 일반적으로 입력 프롬프트를 래핑하는 기본 Amazon Nova 채팅 템플릿이 **비활성화**됩니다.
+ `top_logprobs: 5`

  로그 확률(logprobs)은 잠재적 다음 토큰에서 모델의 신뢰도 분포를 보여주므로 모델이 사전 훈련 중에 예상 완료를 학습했는지를 평가하는 데 도움이 됩니다. 일반적으로 모델이 의도한 대로 실행되는 경우 예상 응답(예: 'A', 'B' 등)이 생성된 출력 토큰 또는 logprobs의 토큰으로 나타날 수 있습니다.
+ `max_new_tokens: 1`

  CPT 모델은 일반적으로 추론을 중지할 시점을 알리기 위해 아직 특별한 'stop' 또는 'end of sequence' 토큰을 생성하는 방법에 대해 훈련되지 않았습니다. 즉, 모델은 일반적으로 특정 최대 토큰 길이에 도달할 때까지 새 토큰을 계속 생성하여 불필요한 추론을 초래합니다. 일반적으로 max\$1new\$1tokens를 1로 제한하고 단일 응답으로 모델을 평가할 수 있는 프롬프트(예: 다중 선택 질문)를 제공하는 것이 모델을 프롬프트하는 가장 효율적인 방법입니다. max\$1new\$1tokens를 1로 설정하면 추가 정크 토큰이 생성되지 않습니다.

##### 키 파라미터
<a name="nova-cpt-key-parameters"></a>
+ **checkpoint\$1is\$1instruction\$1tuned**: 채팅 템플릿을 비활성화하려면 `"false"`(또는 부울 형식의 `false`)로 설정해야 함
+ **top\$1logprobs**: 5, CPT 중에 모델이 학습하는 방식을 확인하는 데 권장됨
+ **task**: `gen_qa`여야 함 - CPT 모델은 MMLU 또는 MATH와 같은 지침 준수 벤치마크를 사용할 수 없음
+ **strategy**: `gen_qa`여야 함
+ **max\$1new\$1tokens**: CPT 모델이 생성이 아닌 완료를 수행하기 때문에 낮은 수준(1\$15)을 유지하도록 권장

## 평가 훈련 작업 실행
<a name="nova-model-evaluation-notebook"></a>

다음 샘플 노트북을 사용하여 훈련 작업을 시작합니다. 평가 훈련 작업을 실행하려면 아래 노트북을 예제로 참조하세요. 자세한 내용은 [SageMaker AI 예측기를 사용하여 훈련 작업 실행](https://docs.aws.amazon.com//sagemaker/latest/dg/docker-containers-adapt-your-own-private-registry-estimator.html)을 참조하세요.

### 참조 테이블
<a name="nova-model-evaluation-reference-table"></a>

노트북을 실행하기 전에 다음 참조 테이블을 참조하여 이미지 URI 및 인스턴스 구성을 선택합니다.

**이미지 URI 선택**


| 방법 | 이미지 URI | 
| --- | --- | 
|  평가 이미지 URI  | 708977205387.dkr.ecr.us-east-1.amazonaws.com/nova-evaluation-repo:SM-TJ-Eval-V2-latest | 

**인스턴스 유형 및 개수 선택**


| 모델 | 작업 유형 | 인스턴스 유형 | 권장 인스턴스 수 | 허용된 인스턴스 수 | 
| --- | --- | --- | --- | --- | 
| Amazon Nova Micro | 평가(SFT/DPO) |  g5.12xlarge  | 1 | 1\$116 | 
| Amazon Nova Lite | 평가(SFT/DPO) |  g5.12xlarge  | 1 | 1\$116 | 
| Amazon Nova Pro | 평가(SFT/DPO) |  p5.48xlarge  | 1 | 1\$116 | 

### 샘플 노트북
<a name="nova-model-evaluation-sample-notebook"></a>

다음 샘플 노트북은 평가 훈련 작업을 실행하는 방법을 보여줍니다.

```
# install python SDK

# Do not use sagemaker v3, as sagemaker v3 introduced breaking changes

!pip install sagemaker==2.254.1
 
import os
import sagemaker,boto3
from sagemaker.inputs import TrainingInput
from sagemaker.pytorch import PyTorch

sagemaker_session = sagemaker.Session()
role = sagemaker.get_execution_role()

# Download recipe from https://github.com/aws/sagemaker-hyperpod-recipes/tree/main/recipes_collection/recipes/evaluation/nova to local
# Assume the file name be `recipe.yaml`

# Populate parameters
# input_s3_uri = "s3://<path>/input/" # (Optional) Only used for multi-modal dataset or bring your own dataset s3 location
output_s3_uri= "s3://<path>/output/" # Output data s3 location, a zip containing metrics json and tensorboard metrics files will be stored to this location
instance_type = "instance_type"  # ml.g5.16xlarge as example
instance_count = 1 # The number of instances for inference (set instance_count > 1 for multi-node inference to accelerate evaluation)             
job_name = "your job name"
recipe_path = "recipe path" # ./recipe.yaml as example
image_uri = "708977205387.dkr.ecr.us-east-1.amazonaws.com/nova-evaluation-repo:SM-TJ-Eval-V2-latest" # Do not change
output_kms_key = "<KMS key arn to encrypt trained model in Amazon-owned S3 bucket>" # optional, leave blank for Amazon managed encryption

# (Optional) To bring your own dataset and LLM judge for evaluation
# evalInput = TrainingInput(
# s3_data=input_s3_uri,
# distribution='FullyReplicated',
# s3_data_type='S3Prefix'
#)

estimator = PyTorch(
    output_path=output_s3_uri,
    base_job_name=job_name,
    role=role,
    instance_type=instance_type,
    instance_count=instance_count,
    training_recipe=recipe_path,
    sagemaker_session=sagemaker_session,
    image_uri=image_uri,
    output_kms_key=output_kms_key
)
estimator.fit()

# If input dataset exist, pass in inputs
# estimator.fit(inputs={"train": evalInput})
```

## 평가 결과 평가 및 분석
<a name="nova-model-evaluation-assess"></a>

평가 작업이 성공적으로 완료되면 다음 단계를 사용하여 결과를 평가하고 분석할 수 있습니다.

**결과를 평가하고 분석하려면 다음 단계를 따릅니다.**

1. 출력 위치 구조를 이해합니다. 결과는 지정된 Amazon S3 출력 위치에 압축 파일로 저장됩니다.

   ```
   s3://your-bucket/output/benchmark-name/
   └── job_name/
       └── output/
           └── output.tar.gz
   ```

1. 버킷에서 `output.tar.gz` 파일을 다운로드합니다. 콘텐츠를 추출하여 공개합니다.

   ```
   run_name/
   ├── eval_results/
   |   └── results_[timestamp].json
   │   └── inference_output.jsonl (only present for gen_qa)
   |   └── details/
   |         └── model/
   |              └── <execution-date-time>/
   |                    └──details_<task_name>_#_<datetime>.parquet
   └── tensorboard_results/
       └── eval/
           └── events.out.tfevents.[timestamp]
   ```
   + `results_[timestamp].json` - 출력 지표 JSON 파일
   + `details_<task_name>_#_<datetime>.parquet` - 추론 출력 파일(`strong_reject` 제외)
   + `events.out.tfevents.[timestamp]` - TensorBoard 출력 파일
   + `inference_output.jsonl` - 정리된 추론 출력 파일(`gen_qa` 태스크만 해당)

1. TensorBoard에서 결과를 봅니다. 평가 지표를 시각화하려면: 

   1. S3 버킷에 추출된 폴더 업로드합니다.

   1. SageMaker AI Tensorboard로 이동

   1. 'S3 폴더'를 선택합니다.

   1. S3 폴더 경로를 추가합니다.

   1. 동기화가 완료될 때까지 기다립니다.

1. 추론 출력을 분석합니다. `llm_judge` 및 `strong_reject`를 제외한 모든 평가 태스크의 추론 출력에는 분석을 위한 다음 필드가 있습니다.
   + `full_prompt` - 평가 태스크에 사용되는 모델로 전송되는 전체 사용자 프롬프트.
   + `gold` - 데이터세트에 지정된 정답이 포함된 필드.
   + `metrics` - 개별 추론에 대해 평가된 지표가 포함된 필드. 집계가 필요한 값은 개별 추론 출력에 값을 갖지 않습니다.
   + `predictions` - 지정된 프롬프트에 대한 모델 출력 목록이 포함된 필드.
   + `pred_logits` - 메시지 콘텐츠에서 반환된 각 출력 토큰의 고려된 출력 토큰 수와 로그 확률을 포함하는 필드.

   이러한 필드를 보면 지표 차이의 원인을 파악하고 사용자 지정 모델의 동작을 이해할 수 있습니다.

   `llm_judge`의 경우 추론 출력 파일의 지표 필드에는 각 평가 쌍별로 다음 필드가 포함됩니다.
   + `forward_output` - 정순으로 평가할 때 판단자의 원시 선호도(response\$1A, response\$1B).
   + `backward_output` - 역순으로 평가할 때 판단자의 원시 선호도(response\$1B, response\$1A).
   + `Pairwise metrics` - 순방향 및 역방향 평가 쌍별로 계산되는 지표로, 여기에는 `a_scores`, `b_scores`, `ties`, `inference-score` 및 `score` 등이 포함됩니다.
**참고**  
`winrate`와 같은 집계 지표는 개별 판단이 아닌 요약 결과 파일에서만 사용할 수 있습니다.

   `gen_qa`의 경우 `inference_output.jsonl` 파일에는 각 JSON 객체에 대해 다음 필드가 포함됩니다.
   + prompt - 모델에 제출된 최종 프롬프트
   + inference - 모델의 원시 추론 출력
   + gold - 입력 데이터세트의 대상 응답
   + metadata - 제공된 경우 입력 데이터세트의 메타데이터 문자열

## 평가 모범 사례 및 문제 해결
<a name="nova-model-evaluation-best-practices"></a>

### 모범 사례
<a name="nova-model-evaluation-best-practice"></a>

다음 목록은 평가 프로세스의 몇 가지 모범 사례입니다.
+ 출력 경로를 모델 및 벤치마크 유형별로 정리하여 유지합니다.
+ 쉽게 추적할 수 있도록 일관된 이름 지정 규칙을 유지합니다.
+ 추출된 결과를 안전한 위치에 저장합니다.
+ TensorBoard 동기화 상태를 모니터링하여 데이터가 성공적으로 로드되었는지 확인합니다.

### 문제 해결
<a name="nova-model-evaluation-troubleshoot"></a>

CloudWatch 로그 그룹 `/aws/sagemaker/TrainingJobs`를 훈련 작업 오류 로그에 사용할 수 있습니다.

#### 엔진 코어 장애
<a name="nova-model-evaluation-troubleshoot-cuda"></a>

**문제:** 

다음이 나타나는 경우: 

```
RuntimeError: Engine core initialization failed.
```

**원인:** 

여러 원인이 있을 수 있는 일반적인 오류이지만 일반적으로 로드하려는 모델 체크포인트와 지정된 모델 유형이 일치하지 않을 때 나타납니다. 예를 들어 미세 조정된 Nova 2.0 Lite 모델 체크포인트를 평가하려고 하지만 제공하는 모델 유형은 1.0 모델 유형입니다(예: `amazon.nova-micro-v1:0:128k`).

올바른 매핑은 다음과 같아야 합니다.

```
model_type: amazon.nova-2-lite-v1:0:256k
model_name_or_path: nova-lite-2/prod # or s3://escrow_bucket/model_location
```

**예방책**: 

평가 작업을 제출하기 전에 `model_name_or_path`가 오른쪽 `model_type`에 매핑되었는지 다시 확인합니다.

## 사용 가능한 하위 태스크
<a name="nova-model-evaluation-subtasks"></a>

다음은 대규모 멀티 태스크 언어 이해(MMLU), Big Bench Hard(BBH), MATH 및 대규모 다분야 멀티모달 이해(MMMU)를 포함한 여러 도메인에서 모델 평가에 사용할 수 있는 하위 태스크의 목록입니다. 이러한 하위 태스크를 통해 모델의 특정 기능 및 지식 영역에서 성능을 평가할 수 있습니다.

**MMLU**

```
MMLU_SUBTASKS = [
    "abstract_algebra",
    "anatomy",
    "astronomy",
    "business_ethics",
    "clinical_knowledge",
    "college_biology",
    "college_chemistry",
    "college_computer_science",
    "college_mathematics",
    "college_medicine",
    "college_physics",
    "computer_security",
    "conceptual_physics",
    "econometrics",
    "electrical_engineering",
    "elementary_mathematics",
    "formal_logic",
    "global_facts",
    "high_school_biology",
    "high_school_chemistry",
    "high_school_computer_science",
    "high_school_european_history",
    "high_school_geography",
    "high_school_government_and_politics",
    "high_school_macroeconomics",
    "high_school_mathematics",
    "high_school_microeconomics",
    "high_school_physics",
    "high_school_psychology",
    "high_school_statistics",
    "high_school_us_history",
    "high_school_world_history",
    "human_aging",
    "human_sexuality",
    "international_law",
    "jurisprudence",
    "logical_fallacies",
    "machine_learning",
    "management",
    "marketing",
    "medical_genetics",
    "miscellaneous",
    "moral_disputes",
    "moral_scenarios",
    "nutrition",
    "philosophy",
    "prehistory",
    "professional_accounting",
    "professional_law",
    "professional_medicine",
    "professional_psychology",
    "public_relations",
    "security_studies",
    "sociology",
    "us_foreign_policy",
    "virology",
    "world_religions"
]
```

**BBH**

```
BBH_SUBTASKS = [
    "boolean_expressions",
    "causal_judgement",
    "date_understanding",
    "disambiguation_qa",
    "dyck_languages",
    "formal_fallacies",
    "geometric_shapes",
    "hyperbaton",
    "logical_deduction_five_objects",
    "logical_deduction_seven_objects",
    "logical_deduction_three_objects",
    "movie_recommendation",
    "multistep_arithmetic_two",
    "navigate",
    "object_counting",
    "penguins_in_a_table",
    "reasoning_about_colored_objects",
    "ruin_names",
    "salient_translation_error_detection",
    "snarks",
    "sports_understanding",
    "temporal_sequences",
    "tracking_shuffled_objects_five_objects",
    "tracking_shuffled_objects_seven_objects",
    "tracking_shuffled_objects_three_objects",
    "web_of_lies",
    "word_sorting"
]
```

**수학 연산**

```
MATH_SUBTASKS = [
    "algebra",
    "counting_and_probability",
    "geometry",
    "intermediate_algebra",
    "number_theory",
    "prealgebra",
    "precalculus",
```

**MMMU**

```
            MATH_SUBTASKS = [
    "Accounting",
    "Agriculture",
    "Architecture_and_Engineering",
    "Art",
    "Art_Theory",
    "Basic_Medical_Science",
    "Biology",
    "Chemistry",
    "Clinical_Medicine",
    "Computer_Science",
    "Design",
    "Diagnostics_and_Laboratory_Medicine",
    "Economics",
    "Electronics",
    "Energy_and_Power",
    "Finance",
    "Geography",
    "History",
    "Literature",
    "Manage",
    "Marketing",
    "Materials",
    "Math",
    "Mechanical_Engineering",
    "Music",
    "Pharmacy",
    "Physics",
    "Psychology",
    "Public_Health",
    "Sociology",
```

다양한 평가 방법 및 지표를 사용하여 사용자 지정된 Nova 모델을 평가합니다.

**Topics**
+ [사전 조건](#nova-model-evaluation-prerequisites)
+ [사용 가능한 벤치마크 태스크](#nova-model-evaluation-benchmark)
+ [평가 관련 구성](#nova-model-evaluation-config)
+ [평가 훈련 작업 실행](#nova-model-evaluation-notebook)
+ [평가 결과 평가 및 분석](#nova-model-evaluation-assess)
+ [평가 모범 사례 및 문제 해결](#nova-model-evaluation-best-practices)
+ [사용 가능한 하위 태스크](#nova-model-evaluation-subtasks)
+ [추론 모델 평가](nova-reasoning-model-evaluation.md)
+ [RFT 평가](nova-rft-evaluation.md)
+ [보상 함수 구현](nova-implementing-reward-functions.md)

# 추론 모델 평가
<a name="nova-reasoning-model-evaluation"></a>

## 개요
<a name="nova-reasoning-overview"></a>

추론 모델 지원을 사용하면 최종 응답을 생성하기 전에 명시적인 내부 추론을 수행하는 추론 가능 Nova 모델을 사용하여 평가할 수 있습니다. 이 기능은 `reasoning_effort` 파라미터를 통한 API 수준 제어를 사용하여 추론 기능을 동적으로 활성화하거나 비활성화함으로써 복잡한 분석 태스크에 대한 응답 품질을 개선할 수 있습니다.

**지원되는 모델**
+ amazon.nova-2-lite-v1:0:256k

## 레시피 구성
<a name="nova-reasoning-recipe"></a>

레시피의 `inference` 섹션에 `reasoning_effort` 파라미터를 추가하여 추론을 활성화합니다.

```
run:  
  name: reasoning-eval-job-name                          # [MODIFIABLE] Unique identifier for your evaluation job  
  model_type: amazon.nova-2-lite-v1:0:256k               # [FIXED] Must be a reasoning-supported model  
  model_name_or_path: nova-lite-2/prod                   # [FIXED] Path to model checkpoint or identifier  
  replicas: 1                                            # [MODIFIABLE] Number of replicas for SageMaker Training job  
  data_s3_path: ""                                       # [MODIFIABLE] Leave empty for SageMaker Training job; optional for SageMaker HyperPod job  
  output_s3_path: ""                                     # [MODIFIABLE] Output path for SageMaker HyperPod job (not compatible with SageMaker Training jobs)  
  
evaluation:  
  task: mmlu                                             # [MODIFIABLE] Evaluation task  
  strategy: zs_cot                                       # [MODIFIABLE] Evaluation strategy  
  metric: accuracy                                       # [MODIFIABLE] Metric calculation method  
  
inference:  
  reasoning_effort: high                                 # [MODIFIABLE] Enables reasoning mode; options: low/high or null to disable  
  max_new_tokens: 32768                                  # [MODIFIABLE] Maximum tokens to generate, recommended value when reasoning_effort set to high  
  top_k: -1                                              # [MODIFIABLE] Top-k sampling parameter  
  top_p: 1.0                                             # [MODIFIABLE] Nucleus sampling parameter  
  temperature: 0                                         # [MODIFIABLE] Sampling temperature (0 = deterministic)
```

## reasoning\$1effort 파라미터 사용
<a name="nova-reasoning-parameter"></a>

`reasoning_effort` 파라미터는 추론 가능 모델의 추론 동작을 제어합니다.

### 사전 조건
<a name="nova-reasoning-prerequisites"></a>
+ **모델 호환성** - `model_type`이 추론 가능 모델(현재 `amazon.nova-2-lite-v1:0:256k`)을 지정하는 경우에만 `reasoning_effort`를 설정함
+ **오류 처리** - 지원되지 않는 모델과 함께 `reasoning_effort`를 사용하면 `ConfigValidationError: "Reasoning mode is enabled but model '{model_type}' does not support reasoning. Please use a reasoning-capable model or disable reasoning mode."`에서 실패함

### 사용 가능한 옵션
<a name="nova-reasoning-options"></a>


| 옵션 | 동작 | 토큰 제한 | 사용 사례: | 
| --- | --- | --- | --- | 
| null(기본값) | 추론 모드 비활성화 | 해당 사항 없음 | 추론 오버헤드가 없는 표준 평가 | 
| low | 제약 조건과의 추론 활성화 | 내부 추론을 위한 4,000개의 토큰 | 간결한 추론이 필요한 시나리오, 속도와 비용에 맞게 최적화 | 
| 높음 | 제약 조건 없이 추론 활성화 | 내부 추론에 대한 토큰 제한 없음 | 광범위한 분석 및 단계별 추론이 필요한 복잡한 문제 | 


| 훈련 방법 | 사용 가능한 옵션 | 구성 방법 | 
| --- | --- | --- | 
| 지도 미세 조정(SFT) | 높음 또는 꺼짐만 | reasoning\$1enabled: true(high) 또는 reasoning\$1enabled: false(off) 사용 | 
| 강화 미세 조정(RFT) | 낮음, 높음 또는 꺼짐 | reasoning\$1effort: low 또는 reasoning\$1effort: high를 사용합니다. 비활성화하려면 필드를 생략합니다. | 
| 평가 | 낮음, 높음 또는 꺼짐 | reasoning\$1effort: low 또는 reasoning\$1effort: high를 사용합니다. 비활성화하려면 null을 사용합니다. | 

### 추론을 활성화하는 경우
<a name="nova-reasoning-when-to-enable"></a>

**추론 모드(`low` 또는 `high`)를 사용하는 경우**
+ 복잡한 문제 해결 태스크(수학, 논리적 퍼즐, 코딩)
+ 중간 추론이 필요한 다단계 분석 질문
+ 자세한 설명 또는 단계별 사고로 정확도가 향상되는 태스크
+ 응답 품질이 속도보다 우선되는 시나리오

**비추론 모드(`null` 또는 파라미터 생략)를 사용하는 경우**
+ 간단한 Q&A 또는 실제 쿼리
+ 창의적 쓰기 태스크
+ 더 빠른 응답 시간이 중요한 경우
+ 추론 오버헤드를 제외해야 하는 성능 벤치마킹
+ 추론으로 태스크 성능이 개선되지 않는 경우 비용 최적화

### 문제 해결
<a name="nova-reasoning-troubleshooting"></a>

**오류: 'Reasoning mode is enabled but model does not support reasoning'**

**원인**: `reasoning_effort` 파라미터가 null이 아닌 값으로 설정되었지만 지정된 `model_type`에서 추론을 지원하지 않습니다.

**​해결 방법:**
+ 모델 유형이 `amazon.nova-2-lite-v1:0:256k`인지 확인
+ 다른 모델을 사용하는 경우 추론 가능 모델로 전환하거나 레시피에서 `reasoning_effort` 파라미터를 제거합니다.

# RFT 평가
<a name="nova-rft-evaluation"></a>

## RFT 평가란 무엇인가요?
<a name="nova-rft-eval-what-is"></a>

RFT 평가를 사용하면 강화 학습 훈련 이전, 도중 또는 이후에 사용자 지정 보상 함수를 통해 모델의 성능을 평가할 수 있습니다. 사전 정의된 지표를 사용하는 표준 평가와 달리, RFT 평가를 사용하면 특정 요구 사항에 따라 모델 출력의 점수를 계산하는 Lambda 함수를 통해 고유한 성공 기준을 정의할 수 있습니다.

## RFT로 평가하는 이유는 무엇인가요?
<a name="nova-rft-eval-why"></a>

RL 미세 조정 프로세스에서 다음을 지원하는지 확인하려면 평가가 중요합니다.
+ 특정 사용 사례 및 인적 값에 맞게 모델 정렬 개선
+ 주요 태스크에 대한 모델 기능 유지 관리 또는 개선
+ 다른 태스크에서 사실성 감소, 세부성 증가 또는 성능 저하와 같은 의도하지 않은 부작용 방지
+ 보상 함수에 정의된 대로 사용자 지정 성공 기준 충족

## RFT 평가를 사용해야 하는 경우
<a name="nova-rft-eval-when"></a>

다음 시나리오에서 RFT 평가를 사용합니다.
+ RFT 훈련 이전: 평가 데이터세트에서 기준 지표 설정
+ RFT 훈련 도중: 중간 체크포인트를 사용하여 훈련 진행 상황 모니터링
+ RFT 훈련 이후: 최종 모델이 요구 사항을 충족하는지 검증
+ 모델 비교: 일관된 보상 기준을 사용하여 여러 모델 버전 평가

**참고**  
사용자 지정 도메인별 지표가 필요한 경우 RFT 평가를 사용합니다. 범용 평가(정확성, 복잡성, BLEU)의 경우 표준 평가 방법을 사용합니다.

## 데이터 형식 요구 사항
<a name="nova-rft-eval-data-format"></a>

### 입력 데이터 구조
<a name="nova-rft-eval-input-structure"></a>

RFT 평가 입력 데이터는 OpenAI 강화 미세 조정 형식을 따라야 합니다. 각 예제는 다음을 포함하는 JSON 객체입니다.
+ `messages` - `system` 및 `user` 역할을 포함하는 대화 턴 배열
+ `reference_answer` - 보상 함수가 점수 계산을 위해 사용하는 예상 출력 또는 실측 데이터

### 데이터 형식 예제
<a name="nova-rft-eval-data-example"></a>

```
{  
  "messages": [  
    {  
      "role": "user",  
      "content": [  
        {  
          "type": "text",  
          "text": "Solve for x. Return only JSON like {\"x\": <number>}. Equation: 2x + 5 = 13"  
        }  
      ]  
    }  
  ],  
  "reference_answer": {  
    "x": 4  
  }  
}
```

### 현재 제한 사항
<a name="nova-rft-eval-limitations"></a>
+ 텍스트만 해당: 멀티모달 입력(이미지, 오디오, 비디오)은 지원되지 않음
+ 싱글턴 대화: 단일 사용자 메시지만 지원(멀티턴 대화 없음)
+ JSON 형식: 입력 데이터는 JSONL 형식이어야 함(줄당 JSON 객체 1개)
+ 모델 출력: 지정된 모델에서 생성된 완료를 대상으로 평가가 수행됨

## 평가 레시피 준비
<a name="nova-rft-eval-recipe"></a>

### 샘플 노트북
<a name="nova-rft-eval-sample-notebook"></a>

전체 예제는 [평가 노트북](https://docs.aws.amazon.com/sagemaker/latest/dg/nova-model-evaluation.html#nova-model-evaluation-notebook)을 참조하세요.

### 샘플 레시피 구성
<a name="nova-rft-eval-sample-recipe"></a>

```
run:  
  name: nova-lite-rft-eval-job    
  model_type: amazon.nova-lite-v1:0:300k    
  model_name_or_path: s3://escrow_bucket/model_location # [MODIFIABLE] S3 path to your model or model identifier  
  replicas: 1 # [MODIFIABLE] For SageMaker Training jobs only; fixed for HyperPod jobs  
  data_s3_path: "" # [REQUIRED FOR HYPERPOD] Leave empty for SageMaker Training jobs and use TrainingInput in sagemaker python SDK  
  output_s3_path: "" # [REQUIRED] Output artifact S3 path for evaluation results  
  
evaluation:  
  task: rft_eval # [FIXED] Do not modify  
  strategy: rft_eval # [FIXED] Do not modify  
  metric: all # [FIXED] Do not modify  
  
# Inference Configuration  
inference:  
  max_new_tokens: 8192 # [MODIFIABLE] Maximum tokens to generate  
  top_k: -1 # [MODIFIABLE] Top-k sampling parameter  
  top_p: 1.0 # [MODIFIABLE] Nucleus sampling parameter  
  temperature: 0 # [MODIFIABLE] Sampling temperature (0 = deterministic)  
  top_logprobs: 0 # [MODIFIABLE] Set between 1-20 to enable logprobs output  
  
# =============================================================================  
# Bring Your Own Reinforcement Learning Environment  
# =============================================================================  
rl_env:  
  reward_lambda_arn: arn:aws:lambda:<region>:<account_id>:function:<reward-function-name>
```

## 보상 함수 사전 설정
<a name="nova-rft-eval-preset-functions"></a>

RFT Lambda 함수에 쉽게 통합할 수 있도록 두 가지 사전 설정 보상 함수(`prime_code` 및 `prime_math`)를 Lambda 계층으로 사용할 수 있습니다.

### 개요
<a name="nova-rft-eval-preset-overview"></a>

이러한 사전 설정 함수는 다음에 대한 즉각적인 평가 기능을 제공합니다.
+ `prime_code` - 코드 생성 및 정확성 평가
+ `prime_math` - 수학적 추론 및 문제 해결 평가

### 빠른 설정
<a name="nova-rft-eval-preset-setup"></a>

1. [nova-custom-eval-sdk 릴리스](https://github.com/aws/nova-custom-eval-sdk/releases)에서 Lambda 계층을 다운로드하세요.

1. AWS Command Line Interface(AWS CLI)를 사용하여 Lambda 계층을 게시하세요.

   ```
   aws lambda publish-layer-version \
       --layer-name preset-function-layer \
       --description "Preset reward function layer with dependencies" \
       --zip-file fileb://universal_reward_layer.zip \
       --compatible-runtimes python3.9 python3.10 python3.11 python3.12 \
       --compatible-architectures x86_64 arm64
   ```

1. AWS Management Console에서 Lambda 함수에 계층을 추가하세요(사용자 지정 계층에서 preset-function-layer를 선택하고 numpy 종속성에서 AWSSDKPandas-Python312도 추가).

1. Lambda 코드에서 다음을 가져와 사용하세요.

   ```
   from prime_code import compute_score  # For code evaluation
   from prime_math import compute_score  # For math evaluation
   ```

### prime\$1code 함수
<a name="nova-rft-eval-preset-code"></a>

테스트 사례를 기준으로 코드를 실행하고 정확성을 측정하여 Python 코드 생성 작업을 평가합니다.

**입력 데이터세트 형식 예제**

```
{"messages":[{"role":"user","content":"Write a function that returns the sum of two numbers."}],"reference_answer":{"inputs":["3\n5","10\n-2","0\n0"],"outputs":["8","8","0"]}}
{"messages":[{"role":"user","content":"Write a function to check if a number is even."}],"reference_answer":{"inputs":["4","7","0","-2"],"outputs":["True","False","True","True"]}}
```

**주요 기능**
+ 마크다운 코드 블록에서 자동 코드 추출
+ 함수 탐지 및 직접 호출 기반 테스트
+ 제한 시간 보호를 사용하는 테스트 사례 실행
+ 구문 검증 및 컴파일 검사
+ 트레이스백을 사용하는 세부 오류 보고

### prime\$1math 함수
<a name="nova-rft-eval-preset-math"></a>

기호 수학 지원을 통해 수학 추론 및 문제 해결 기능을 평가합니다.

**입력 형식**

```
{"messages":[{"role":"user","content":"What is the derivative of x^2 + 3x?."}],"reference_answer":"2*x + 3"}
```

**주요 기능**
+ SymPy를 사용하는 기호 수학 평가
+ 여러 응답 형식(LaTeX, 일반 텍스트, 기호)
+ 수학적 동등성 검사
+ 표현식 정규화 및 단순화

### 데이터 형식 요구 사항
<a name="nova-rft-eval-preset-data-format"></a>

**코드 평가의 경우**
+ 입력: 함수 인수의 배열(적절한 유형: 정수, 문자열 등)
+ 출력: 예상 반환 값의 배열(적절한 유형: 부울, 숫자 등)
+ 코드: 명확한 함수 정의를 포함하는 Python에 있어야 함

**수학 평가의 경우**
+ 참조 답변: 수학 표현식 또는 숫자 값
+ 응답: LaTeX, 일반 텍스트 또는 기호 표기법일 수 있음
+ 동등성: 문자열 일치뿐만 아니라 기호적으로 확인됨

### 모범 사례
<a name="nova-rft-eval-preset-best-practices"></a>
+ 테스트 사례에서 적절한 데이터 유형 사용(정수 대 문자열, 부울 대 'True')
+ 코드 문제에서 명확한 함수 서명 제공
+ 테스트 입력에서 엣지 케이스 포함(0, 음수, 빈 입력)
+ 참조 답변에서 일관된 수학 표현식 형식 지정
+ 배포 전에 샘플 데이터를 사용하여 보상 함수 테스트

### 오류 처리
<a name="nova-rft-eval-preset-error-handling"></a>

두 함수 모두 다음에 대한 강력한 오류 처리 기능을 포함합니다.
+ 생성된 코드에서 컴파일 오류
+ 실행 중 런타임 예외
+ 잘못 구성된 입력 데이터
+ 무한 루프에 대한 제한 시간 시나리오
+ 유효하지 않은 수학 표현식

## 보상 함수 생성
<a name="nova-rft-eval-custom-reward"></a>

### Lambda ARN 요구 사항
<a name="nova-rft-eval-lambda-arn"></a>

Lambda ARN은 다음 형식을 따라야 합니다.

```
"arn:aws:lambda:*:*:function:*SageMaker*"
```

Lambda에 이 이름 지정 스키마가 없는 경우 이 오류가 발생하며 작업이 실패합니다.

```
[ERROR] Unexpected error: lambda_arn must contain one of: ['SageMaker', 'sagemaker', 'Sagemaker'] when running on SMHP platform (Key: lambda_arn)
```

### Lambda 요청 형식
<a name="nova-rft-eval-lambda-request"></a>

Lambda 함수는 다음 형식으로 데이터를 수신합니다.

```
[  
  {  
    "id": "sample-001",  
    "messages": [  
      {  
        "role": "user",  
        "content": [  
          {  
            "type": "text",  
            "text": "Do you have a dedicated security team?"  
          }  
        ]  
      },  
      {  
        "role": "nova_assistant",  
        "content": [  
          {  
            "type": "text",  
            "text": "As an AI developed by Company, I don't have a dedicated security team..."  
          }  
        ]  
      }  
    ],  
    "reference_answer": {  
      "compliant": "No",  
      "explanation": "As an AI developed by Company, I do not have a traditional security team..."  
    }  
  }  
]
```

**참고**  
메시지 구조에는 입력 데이터 형식과 일치하는 중첩된 `content` 배열이 포함됩니다. `nova_assistant` 역할이 있는 마지막 메시지에는 모델의 생성된 응답이 포함됩니다.

### Lambda 응답 형식
<a name="nova-rft-eval-lambda-response"></a>

Lambda 함수는 다음 형식으로 데이터를 반환해야 합니다.

```
[  
  {  
    "id": "sample-001",  
    "aggregate_reward_score": 0.75,  
    "metrics_list": [  
      {  
        "name": "accuracy",  
        "value": 0.85,  
        "type": "Metric"  
      },  
      {  
        "name": "fluency",  
        "value": 0.90,  
        "type": "Reward"  
      }  
    ]  
  }  
]
```

**응답 필드**
+ `id` - 입력 샘플 ID와 일치해야 함
+ `aggregate_reward_score` - 전체 점수(일반적으로 0.0\$11.0)
+ `metrics_list` - 다음을 포함하는 개별 지표의 배열:
  + `name` - 지표 식별자(예: 'accuracy', 'fluency')
  + `value` – 지표 점수(일반적으로 0.0\$11.0)
  + `type` - 'Metric'(보고용) 또는 'Reward'(훈련에 사용됨)

## IAM 권한
<a name="nova-rft-eval-iam"></a>

### 필수 권한
<a name="nova-rft-eval-iam-required"></a>

SageMaker 실행 역할에는 Lambda 함수를 간접 호출할 권한이 있어야 합니다. SageMaker 실행 역할에 이 정책을 추가합니다.

```
{  
  "Version": "2012-10-17",		 	 	   
  "Statement": [  
    {  
      "Effect": "Allow",  
      "Action": [  
        "lambda:InvokeFunction"  
      ],  
      "Resource": "arn:aws:lambda:region:account-id:function:function-name"  
    }  
  ]  
}
```

### Lambda 실행 역할
<a name="nova-rft-eval-iam-lambda"></a>

Lambda 함수의 실행 역할에는 기본 Lambda 실행 권한이 필요합니다.

```
{  
  "Version": "2012-10-17",		 	 	   
  "Statement": [  
    {  
      "Effect": "Allow",  
      "Action": [  
        "logs:CreateLogGroup",  
        "logs:CreateLogStream",  
        "logs:PutLogEvents"  
      ],  
      "Resource": "arn:aws:logs:*:*:*"  
    }  
  ]  
}
```

Lambda 함수가 다른 AWS 서비스(예: 참조 데이터의 경우 S3, 로깅의 경우 DynamoDB)에 액세스하는 경우 해당 권한을 Lambda 실행 역할에 추가합니다.

## 평가 작업 실행
<a name="nova-rft-eval-execute"></a>

1. **데이터 준비** - 데이터 형식 요구 사항에 따라 평가 데이터의 형식을 지정하고 S3에 JSONL 파일 업로드: `s3://your-bucket/eval-data/eval_data.jsonl`

1. **레시피 구성** - 사용자 구성으로 샘플 레시피 업데이트:
   + `model_name_or_path`를 모델 위치로 설정
   + `lambda_arn`을 보상 함수 ARN으로 설정
   + `output_s3_path`를 원하는 출력 위치로 설정
   + 필요에 따라 `inference` 파라미터 조정

   레시피를 `rft_eval_recipe.yaml`로 저장

1. **평가 실행** - 제공된 노트북: 평가 노트북을 사용하여 평가 작업 실행: [평가 노트북](https://docs.aws.amazon.com/sagemaker/latest/dg/nova-model-evaluation.html#nova-model-evaluation-notebook)

1. **진행 상황 모니터링** - 다음을 통해 평가 작업을 모니터링합니다.
   + SageMaker 콘솔: 작업 상태 및 로그 확인
   + CloudWatch Logs: 세부 실행 로그 보기
   + Lambda 로그: 보상 함수 문제 디버깅

## 평가 결과 이해
<a name="nova-rft-eval-results"></a>

### 출력 형식
<a name="nova-rft-eval-output-format"></a>

평가 작업은 결과를 지정된 S3 위치에 JSONL 형식으로 출력합니다. 각 줄에는 하나의 샘플에 대한 평가 결과가 포함됩니다.

```
{  
  "id": "sample-001",  
  "aggregate_reward_score": 0.75,  
  "metrics_list": [  
    {  
      "name": "accuracy",  
      "value": 0.85,  
      "type": "Metric"  
    },  
    {  
      "name": "fluency",  
      "value": 0.90,  
      "type": "Reward"  
    }  
  ]  
}
```

**참고**  
RFT 평가 작업 출력은 Lambda 응답 형식과 동일합니다. 평가 서비스는 Lambda 함수의 응답을 수정하지 않고 전달하여 보상 계산과 최종 결과 사이의 일관성을 보장합니다.

### 결과 해석
<a name="nova-rft-eval-interpret"></a>

**보상 점수 집계**
+ 범위: 일반적으로 0.0(최저)\$11.0(최상)이지만 구현에 따라 다름
+ 용도: 전체 성능을 요약하는 단일 숫자
+ 사용법: 모델 비교, 훈련 대비 개선 추적

**개별 지표**
+ 지표 유형: 분석을 위한 정보용 지표
+ 보상 유형: RFT 훈련 도중 사용되는 지표
+ 해석: 반대 지표를 설계하지 않는 한, 값이 높을수록 일반적으로 더 나은 성능을 나타냄

### 성능 벤치마크
<a name="nova-rft-eval-benchmarks"></a>

'양호'한 성능을 구성하는 요소는 사용 사례에 따라 달라집니다.


| 점수 범위 | 해석 | 작업 | 
| --- | --- | --- | 
| 0.8 - 1.0 | 우수 | 배포 준비된 모델 | 
| 0.6\$10.8 | 양호 | 약간의 개선이 도움이 될 수 있음 | 
| 0.4\$10.6 | 공정 | 상당한 개선이 필요함 | 
| 0.0\$10.4 | 열악 | 훈련 데이터 및 보상 함수 검토 | 

**중요**  
다음은 일반적인 지침입니다. 비즈니스 요구 사항, 기준 모델 성능, 도메인별 제약 조건 및 추가 훈련의 비용 편익 분석을 기반으로 자체 임계치를 정의합니다.

## 문제 해결
<a name="nova-rft-eval-troubleshooting"></a>

### 일반적인 문제
<a name="nova-rft-eval-common-issues"></a>


| 문제 | 원인 | 솔루션 | 
| --- | --- | --- | 
| Lambda 제한 시간 | 복잡한 보상 계산 | Lambda 제한 시간 증가 또는 함수 최적화 | 
| 권한 거부됨 | IAM 권한 누락 | SageMaker 역할이 Lambda를 간접 호출할 수 있는지 확인 | 
| 일관되지 않은 점수 | 비결정적 보상 함수 | 고정 시드 또는 결정론적 로직 사용 | 
| 누락된 결과 | Lambda 오류가 발견되지 않음 | Lambda에서 포괄적인 오류 처리 추가 | 

### 디버그 체크리스트
<a name="nova-rft-eval-debug-checklist"></a>
+ 입력 데이터가 중첩된 콘텐츠 배열을 사용하여 올바른 형식을 따르는지 확인
+ Lambda ARN이 올바르고 함수가 배포되었는지 확인
+ SageMaker → Lambda 간접 호출에 대한 IAM 권한 확인
+ CloudWatch 로그에서 Lambda 오류 검토
+ Lambda 응답이 예상 형식과 일치하는지 확인

## 모범 사례
<a name="nova-rft-eval-best-practices-section"></a>
+ 간단하게 시작: 기본 보상 함수로 시작하고 반복
+ 별도로 Lambda 테스트: 전체 평가 전에 Lambda 테스트 이벤트 사용
+ 소규모 데이터세트에서 검증: 전체 데이터세트 이전에 하위 세트에서 평가 실행
+ 버전 제어: 모델 버전과 함께 보상 함수 버전 추적
+ 비용 모니터링: Lambda 간접 호출 및 컴퓨팅 시간이 비용에 미치는 영향
+ 포괄적인 로그: 디버깅을 위해 Lambda에서 print 문 사용
+ 적절한 제한 시간 설정: 인내와 비용 사이의 균형
+ 지표 문서화: 각 지표가 측정하는 항목을 명확하게 정의

## 다음 단계
<a name="nova-rft-eval-next-steps"></a>

RFT 평가를 완료한 후:
+ 결과가 만족스러운 경우: 프로덕션에 모델 배포
+ 개선이 필요한 경우:
  + 보상 함수 조정
  + 더 많은 훈련 데이터 수집
  + 훈련 하이퍼파라미터 수정
  + 추가 RFT 훈련 반복 실행
+ 지속적인 모니터링: 새 데이터를 사용하여 주기적으로 재평가

# 보상 함수 구현
<a name="nova-implementing-reward-functions"></a>

## 개요
<a name="nova-reward-overview"></a>

보상 함수(점수 계산기 또는 등급 계산기라고도 함)는 모델 응답을 평가하고 훈련을 위한 피드백 신호를 제공하는 핵심 구성 요소입니다. 이는 모델 응답을 수락하고 보상 점수를 반환하는 Lambda 함수로 구현해야 합니다.

## 인터페이스 형식
<a name="nova-reward-interface"></a>

보상 함수는 다음 형식으로 데이터를 수락하고 반환해야 합니다.

**훈련을 위한 샘플 입력 샘플**

```
{  
    "messages": [  
        {  
            "role": "user",  
            "content": "Do you have a dedicated security team?"  
        }  
    ],              
   "reference_answer": {  
       "compliant": "No",  
       "explanation": "As an AI developed by Company, I do not have a traditional security team..."  
    }  
}
```

**보상 Lambda용 샘플 페이로드**

컨테이너는 다음을 통해 데이터를 Lambda 함수로 전송하기 전에 데이터를 자동으로 변환합니다.

1. 각 프롬프트에 대한 모델 응답 생성

1. 메시지 배열에 어시스턴트 턴(생성된 응답) 추가

1. 추적을 위한 고유한 `id` 필드 추가

Lambda 함수는 이러한 변환된 형식으로 데이터를 수신합니다.

```
{    
   "id": "123",  
    "messages": [  
        {  
            "role": "user",  
            "content": "Do you have a dedicated security team?"  
        },  
        {  
            "role": "assistant",  
            "content": "As an AI developed by Amazon, I don not have a dedicated security team..."  
        }  
    ],              
    # Following section will be same as your training dataset sample  
    "reference_answer": {  
        "compliant": "No",  
        "explanation": "As an AI developed by Company, I do not have a traditional security team..."  
    }  
}
```

**보상 Lambda 계약**

```
def lambda_handler(event, context):  
   return lambda_grader(event)  
  
def lambda_grader(samples: list[dict]) -> list[dict]:  
    """  
    Args:  
        samples: List of dictionaries in OpenAI format  
          
        Example input:  
        {     
            "id": "123",  
            "messages": [  
                {  
                    "role": "user",  
                    "content": "Do you have a dedicated security team?"  
                },  
                {  
                    "role": "assistant",  
                    "content": "As an AI developed by Company, I don nott have a dedicated security team..."  
                }  
            ],              
            # This section will be same as your training dataset  
            "reference_answer": {  
                "compliant": "No",  
                "explanation": "As an AI developed by Company, I do not have a traditional security team..."  
            }  
        }  
      
    Returns:  
        List of dictionaries with reward scores:  
        {  
            "id": str,                              # Same id as input sample  
            "aggregate_reward_score": float,        # Overall score for the sample  
            "metrics_list": [                       # OPTIONAL: Component scores  
                {  
                    "name": str,                    # Name of the component score  
                    "value": float,                 # Value of the component score  
                    "type": str                     # "Reward" or "Metric"  
                }  
            ]  
        }  
    """
```

## 입력 및 출력 필드
<a name="nova-reward-fields"></a>

### 입력 필드
<a name="nova-reward-input-fields"></a>


| 필드 | 설명 | 추가 참고 사항 | 
| --- | --- | --- | 
| id | 샘플의 고유 식별자 | 출력에서 다시 반향됩니다. 문자열 형식 | 
| messages | 정렬된 채팅 기록(OpenAI 형식) | 메시지 객체 배열 | 
| messages[].role | 메시지의 화자 | 일반적인 값: "user", "assistant", "system" | 
| messages[].content | 메시지의 텍스트 콘텐츠 | 일반 문자열 | 
| \$1\$1metadata | 등급 지정에 도움이 되는 자유 양식 정보 | 객체, 훈련 데이터에서 전달되는 선택적 필드 | 

### 출력 필드
<a name="nova-reward-output-fields"></a>


| 필드 | 설명 | 추가 참고 사항 | 
| --- | --- | --- | 
| id | 입력 샘플과 동일한 식별자 | 입력과 일치해야 함 | 
| aggregate\$1reward\$1score | 샘플의 전체 점수 | 부동 소수점(예: 0.0\$11.0 또는 태스크 정의 범위) | 
| metrics\$1list | 집계를 구성하는 구성 요소 점수 | 지표 객체의 배열 | 

## 기술적 제약 조건
<a name="nova-reward-constraints"></a>
+ **제한 시간** - Lambda 간접 호출당 최대 15분의 실행 시간
+ **동시성** - `rollout_worker_replicas * 64` 동시 요청을 처리해야 함
+ **신뢰성** - 적절한 오류 처리를 구현하고 유효한 점수를 일관되게 반환해야 함
+ **성능** - 빠른 실행(분이 아닌 초 단위)을 위해 최적화하여 효율적인 훈련을 지원함

**모범 사례**
+ 외부 API 직접 호출 최소화
+ 효율적인 알고리즘 및 데이터 구조 사용
+ 일시적인 장애에 대한 재시도 로직 구현
+ 캐시 재사용 가능 계산
+ 훈련 전에 철저히 테스트하여 버그 없는 실행 보장

## 사용자 지정 보상 함수 사용
<a name="nova-reward-using-custom"></a>

태스크별 평가 기준이 있는 경우 사용자 지정 보상 함수를 구현합니다.
+ **평가 기준 정의** - 태스크에 대해 좋은 응답을 만드는 요소 결정
+ **Lambda 함수 구현** - 인터페이스 형식에 따라 Lambda 함수 생성
+ **로컬에서 테스트** - 함수가 샘플 입력에 대해 올바른 점수를 반환하는지 검증
+ **AWS에 배포** - Lambda를 배포하고 ARN 기록
+ **레시피 구성** - Lambda ARN을 레시피의 `reward_lambda_arn` 필드에 추가
+ **소규모 데이터세트로 테스트** - 최소한의 데이터로 RFT를 실행하여 통합 확인

## IAM 권한
<a name="nova-reward-iam"></a>

### 필수 권한
<a name="nova-reward-required-permissions"></a>

SageMaker 실행 역할에는 Lambda 함수를 간접 호출할 권한이 있어야 합니다. SageMaker 실행 역할에 이 정책을 추가합니다.

```
{  
  "Version": "2012-10-17",		 	 	   
  "Statement": [  
    {  
      "Effect": "Allow",  
      "Action": [  
        "lambda:InvokeFunction"  
      ],  
      "Resource": "arn:aws:lambda:region:account-id:function:function-name"  
    }  
  ]  
}
```

### Lambda 실행 역할
<a name="nova-reward-lambda-role"></a>

Lambda 함수의 실행 역할에는 기본 Lambda 실행 권한이 필요합니다.

```
{  
  "Version": "2012-10-17",		 	 	   
  "Statement": [  
    {  
      "Effect": "Allow",  
      "Action": [  
        "logs:CreateLogGroup",  
        "logs:CreateLogStream",  
        "logs:PutLogEvents"  
      ],  
      "Resource": "arn:aws:logs:*:*:*"  
    }  
  ]  
}
```

추가 권한: Lambda 함수가 다른 AWS 서비스(예: 참조 데이터의 경우 S3, 로깅의 경우 DynamoDB)에 액세스하는 경우 해당 권한을 Lambda 실행 역할에 추가합니다.

## 예: 평가형 LLM 보상 함수
<a name="nova-reward-llm-judge-example"></a>

이 예제에서는 Amazon Bedrock 모델을 평가자로 사용하여 모델 응답을 참조 답변과 비교하여 평가하는 방법을 보여줍니다. 이 Lambda 템플릿은 고객이 평가자의 평가를 처리하기 위한 추론 요청에 대해 Amazon Bedrock에 대한 직접 호출을 구현할 수 있는 프레임워크를 제공합니다. Lambda 함수는 다른 보상 함수와 동일한 입력/출력 계약을 유지 관리합니다.

### 구현
<a name="nova-reward-llm-judge-implementation"></a>

이 Lambda 함수는 2단계 평가 프로세스를 구현합니다. 즉, `lambda_handler`는 수신 샘플에서 모델 응답과 참조 응답을 추출한 다음, `lambda_graded` 함수에서 Amazon Bedrock을 직접 호출하여 이들 간의 시맨틱 유사성을 평가합니다. 이 구현에서는 일시적인 장애에 대한 자동 재시도를 통한 강력한 오류 처리를 포함하며 유연한 참조 응답 형식(문자열 및 구조화된 사전 형식 모두)을 지원합니다.

**구현 세부 정보:**
+ **재시도 로직**: Bedrock API 사용량 제한을 처리하기 위해 스로틀링 예외에 대한 지수 백오프(1초, 2초, 4초) 구현
+ **오류 처리**: 예외를 발생시키는 대신, 실패한 평가에 대해 0.0의 점수 반환
+ **결정적 점수:** 온도=0.0을 사용하여 여러 평가에서 일관된 점수 보장
+ **유연한 참조 형식**: 문자열 및 사전 참조 답변 모두를 자동으로 처리
+ **점수 고정**: 모든 점수가 유효한 [0.0, 1.0] 범위 내에 있는지 확인
+ **모델 무관**: 모든 Amazon Bedrock 모델(Nova, Llama, Mistral 등)을 사용하도록 JUDGE\$1MODEL\$1ID 변경

```
"""  
LLM Judge Lambda POC - Working implementation using Amazon Bedrock  
"""  
  
import json  
import time  
import boto3  
  
bedrock_runtime = boto3.client('bedrock-runtime', region_name='us-east-1')  
JUDGE_MODEL_ID = "anthropic.claude-3-5-sonnet-20240620-v1:0"  
SYSTEM_PROMPT = "You must output ONLY a number between 0.0 and 1.0. No explanations, no text, just the number."  
  
JUDGE_PROMPT_TEMPLATE = """Compare the following two responses and rate how similar they are on a scale of 0.0 to 1.0, where:  
- 1.0 means the responses are semantically equivalent (same meaning, even if worded differently)  
- 0.5 means the responses are partially similar  
- 0.0 means the responses are completely different or contradictory  
  
Response A: {response_a}  
  
Response B: {response_b}  
  
Output ONLY a number between 0.0 and 1.0. No explanations."""  
  
  
def lambda_graded(response_a: str, response_b: str, max_retries: int = 3) -> float:  
    """Call Bedrock to compare responses and return similarity score."""  
    prompt = JUDGE_PROMPT_TEMPLATE.format(response_a=response_a, response_b=response_b)  
      
    for attempt in range(max_retries):  
        try:  
            response = bedrock_runtime.converse(  
                modelId=JUDGE_MODEL_ID,  
                messages=[{"role": "user", "content": [{"text": prompt}]}],  
                system=[{"text": SYSTEM_PROMPT}],  
                inferenceConfig={"temperature": 0.0, "maxTokens": 10}  
            )  
            print(f"Bedrock call successful: {response}")  
            output = response['output']['message']['content'][0]['text'].strip()  
            score = float(output)  
            print(f"Score parsed: {score}")  
            return max(0.0, min(1.0, score))  
                  
        except Exception as e:  
            if "ThrottlingException" in str(e) and attempt < max_retries - 1:  
                time.sleep(2 ** attempt)  
            else:  
                print(f"Bedrock call failed: {e}")  
                return None  
    return None  
  
  
def lambda_handler(event, context):  
    """AWS Lambda handler - processes samples from RFTEvalInvoker."""  
    try:  
        samples = event if isinstance(event, list) else [event]  
        results = []  
          
        for sample in samples:  
            sample_id = sample.get("id", "unknown")  
            messages = sample.get("messages", [])  
              
            # Extract assistant response (response A)  
            response_a = ""  
            for msg in messages:  
                if msg.get("role") in ["assistant", "nova_assistant"]:  
                    response_a = msg.get("content", "")  
                    break  
              
            # Extract reference answer from root level (no longer in metadata)  
            reference_answer = sample.get("reference_answer", "")  
              
            # Handle both string and dict reference_answer formats  
            if isinstance(reference_answer, dict):  
                # If reference_answer is a dict, extract the explanation or compliant field  
                response_b = reference_answer.get("explanation", reference_answer.get("compliant", ""))  
            else:  
                response_b = reference_answer  
              
            if not response_a or not response_b:  
                results.append({  
                    "id": sample_id,  
                    "aggregate_reward_score": 0.0,  
                    "metrics_list": [{"name": "similarity_score", "value": 0.0, "type": "Metric"}]  
                })  
                continue  
              
            # Get similarity score  
            score = lambda_graded(response_a, response_b)  
              
            results.append({  
                "id": sample_id,  
                "aggregate_reward_score": score,  
                "metrics_list": [  
                    {  
                        "name": "similarity_score",  
                        "value": score,  
                        "type": "Metric"  
                    }  
                ]  
            })  
          
        return {"statusCode": 200, "body": json.dumps(results)}  
          
    except Exception as e:  
        print(f"Error: {e}")  
        return {"statusCode": 500, "body": json.dumps({"error": str(e)})}
```

### 입력 형식
<a name="nova-reward-llm-judge-input"></a>

Lambda는 다른 보상 함수와 동일한 입력 형식을 수신합니다.

```
{  
    "id": "sample-001",  
    "messages": [  
        {  
            "role": "user",  
            "content": "Do you have a dedicated security team?"  
        },  
        {  
            "role": "assistant",  
            "content": "As an AI developed by Amazon, I don't have a dedicated security team..."  
        }  
    ],  
    "reference_answer": {  
        "compliant": "No",  
        "explanation": "As an AI developed by Company, I do not have a traditional security team..."  
    },  
    "my_custom_field": "custom_value"  
}
```

### 출력 형식
<a name="nova-reward-llm-judge-output"></a>

```
{  
    "id": "sample-001",  
    "aggregate_reward_score": 0.85,  
    "metrics_list": [  
        {  
            "name": "similarity_score",  
            "value": 0.85,  
            "type": "Metric"  
        }  
    ]  
}
```

### 배포 고려 사항
<a name="nova-reward-llm-judge-deployment"></a>

선택한 모델의 기능 및 API 형식에 따라 프롬프트 템플릿 및 추론 파라미터를 조정해야 할 수도 있습니다.
+ **IAM 권한**: Lambda 실행 역할은 선택한 모델에 대한 `bedrock:InvokeModel` 권한을 보유해야 함
+ **제한 시간**: Bedrock API 지연 시간 및 재시도를 수용할 수 있도록 Lambda 제한 시간을 최소 60초로 설정
+ **리전**: 선택한 Bedrock 모델이 사용 가능한 리전에 배포
+ **비용**: 각 평가가 샘플당 하나의 API를 직접 호출할 때 Bedrock API 사용량 모니터링
+ **처리량**: 대규모 평가의 경우 스로틀링을 방지하기 위해 Bedrock 할당량 증가 요청

**Bedrock 처리량 증가**

평가 중에 스로틀링이 발생하는 경우 Bedrock 모델 할당량을 늘립니다.
+ AWS Service Quotas 콘솔로 이동
+ 'Bedrock'을 검색하고 리전 선택
+ 선택한 모델의 할당량 찾기(예: 'Claude 3.5 Sonnet에 대한 분당 간접 호출 수')
+ '할당량 증가 요청'을 클릭하고 원하는 처리량 지정
+ 증가에 대한 근거 제공(예: 'RFT 평가 워크로드')

Lambda의 기본 제공 재시도 로직은 간헐적인 스로틀링을 처리하지만 지속적인 대규모 평가에는 적절한 할당량 증가가 필요합니다.

**필수 IAM 정책:**

```
{  
    "Version": "2012-10-17",		 	 	   
    "Statement": [  
        {  
            "Effect": "Allow",  
            "Action": [  
                "bedrock:InvokeModel"  
            ],  
            "Resource": "arn:aws:bedrock:*::foundation-model/*"  
        }  
    ]  
}
```

# 반복 학습
<a name="smtj-iterative-training"></a>

반복 훈련은 여러 훈련 주기를 통해 모델을 미세 조정하는 체계적인 접근 방식으로, 각 라운드는 평가를 통해 발견된 특정 약점을 해결하여 이전 체크포인트를 기반으로 빌드됩니다. 이 방법을 사용하면 실패 모드를 해결하는 선별된 예제를 통합하고, 변화하는 요구 사항에 적응하며, 긴 단일 훈련 실행에 커밋하는 대신 점진적으로 개선 사항을 검증하여 모델 성능을 목표로 개선할 수 있습니다. 이 프로세스는 일반적으로 지도 미세 조정(SFT) 및 보상 기반 미세 조정(RFT)과 같은 패턴을 따르며, 이때 파이프라인 전체에서 모델 유형 및 훈련 기법의 일관성을 유지 관리하면서 후속 훈련 반복을 위해 참조할 수 있는 AWS 관리형 에스크로 S3 버킷에 체크포인트가 저장됩니다.

자세한 내용은 [반복 훈련](nova-iterative-training.md) 단원을 참조하십시오.