

# SageMaker HyperPod에서 Amazon Nova 모델 미세 조정
<a name="nova-hp-fine-tune"></a>

다음 기법은 SageMaker HyperPod에서 Amazon Nova 2 모델을 미세 조정하는 방법을 보여줍니다.

**Topics**
+ [지도 미세 조정(SFT)](nova-fine-tune.md)
+ [직접 선호 최적화(DPO)](nova-dpo.md)
+ [근접 정책 최적화(PPO)](nova-ppo.md)

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

SFT 훈련 프로세스는 다음과 같은 두 가지 주요 단계로 구성됩니다.
+ **데이터 준비**: 정해진 지침에 따라 데이터세트를 생성, 정리 또는 필요한 구조로 다시 포맷합니다. 입력, 출력 및 보조 정보(예: 추론 트레이스 또는 메타데이터)가 올바르게 조정되고 형식이 지정되었는지 확인합니다.
+ **훈련 구성**: 모델 훈련 방법을 정의합니다. Amazon SageMaker HyperPod를 사용하는 경우 이 구성은 다음을 포함하는 YAML 레시피 파일로 작성됩니다.
  + 데이터 소스 경로(훈련 및 검증 데이터세트)
  + 주요 하이퍼파라미터(에포크, 학습 속도, 배치 크기)
  + 선택적 구성 요소(분산 훈련 파라미터 등)

## Nova 모델 비교 및 선택
<a name="nova-model-comparison"></a>

Amazon Nova 2.0은 Amazon Nova 1.0보다 더 크고 다양한 데이터세트를 기반으로 훈련된 모델입니다. 주요 개선 사항에는 다음이 포함됩니다.
+ **개선된 추론 기능**: 명시적 추론 모드 지원 포함
+ **더 광범위한 다국어 성능**: 추가 언어에서 지원
+ **복잡한 태스크에서 개선된 성능**: 코딩 및 도구 사용 포함
+ **확장된 컨텍스트 처리**: 더 긴 컨텍스트 길이에서 정확도와 안정성 개선

## Nova 1.0 및 Nova 2.0을 사용해야 하는 경우
<a name="nova-model-selection"></a>

다음과 같은 경우 Amazon Nova 1.0을 선택합니다.
+ 사용 사례에 고급 추론 없이 표준 언어 이해가 필요함
+ Amazon Nova 1.0에서 성능이 이미 검증되었으며 추가 기능이 필요하지 않음

# Nova 1.0에서 SFT
<a name="nova-sft-1"></a>

지도 미세 조정(SFT)은 프롬프트-응답 쌍으로 구성된 데이터세트를 파운데이션 모델에 제공하여 사전 학습된 파운데이션 모델의 특정 태스크 성능을 향상시키는 과정입니다. 레이블이 지정된 예제는 프롬프트 응답 쌍으로 형식이 지정되고 지시사항으로 구문이 지정됩니다. 이 미세 조정 프로세스는 모델의 가중치를 수정합니다.

특정 도메인 데이터가 있고 최적의 결과를 위해 특정 프롬프트-응답 쌍을 제공해야 하는 경우, SFT를 사용해야 합니다.

훈련 및 검증 입력 데이터세트는 에스크로 또는 서비스 관리형 S3 버킷이 아닌 고객 소유 버킷에 있어야 합니다.

## 데이터 요구 사항
<a name="nova-sft-1-data-requirements"></a>

전체 순위 SFT 및 저순위 어댑터(LoRA) SFT의 경우 데이터는 [Amazon Bedrock Converse 작업 형식](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_Converse.html)을 따라야 합니다. 이 형식의 예시 및 제약 조건은 [이해 모델 미세 조정을 위한 데이터 준비](https://docs.aws.amazon.com/nova/latest/userguide/fine-tune-prepare-data-understanding.html)를 참조하세요.

제출 전에 데이터세트 형식을 검증하려면 [Amazon Bedrock 샘플 리포지토리의 검증 스크립트](https://github.com/aws-samples/amazon-nova-samples/blob/main/customization/bedrock-finetuning/understanding/dataset_validation/nova_ft_dataset_validator.py)를 사용하는 것이 좋습니다. 이 검증 도구는 JSONL 파일이 필요한 형식 사양을 준수하는지 확인하고, 미세 조정 작업을 제출하기 전에 잠재적 문제를 식별하는 데 도움이 됩니다.

SFT를 통해 조정할 수 있는 Amazon Nova 파라미터는 다음과 같습니다.
+ **실행 구성**
  + `name`: 훈련 작업을 설명하는 이름입니다. AWS Management Console에서 작업을 식별하는 데 도움이 됩니다.
  + `model_type`: 사용할 Amazon Nova 모델 변형입니다. 사용할 수 있는 옵션은 `amazon.nova-micro-v1:0:128k`, `amazon.nova-lite-v1:0:300k` 또는 `amazon.nova-pro-v1:0:300k`입니다.
  + `model_name_or_path`: 훈련에 사용할 기본 모델의 경로입니다. 다음 중에서 사용할 모델을 선택합니다. `nova-micro/prod`, `nova-lite/prod`, `nova-pro/prod` 또는 훈련 후 체크포인트의 S3 경로(`s3://<escrow bucket>/<job id>/outputs/checkpoints`).
  + `replicas`: 분산 훈련에 사용할 컴퓨팅 인스턴스의 수입니다. 사용 가능한 값은 선택한 모델에 따라 다릅니다. Amazon Nova Micro는 2개, 4개 또는 8개의 복제본을 지원합니다. Amazon Nova Lite는 4개, 8개, 16개 또는 32개의 복제본을 지원합니다. Amazon Nova Pro는 6개, 12개 또는 24개의 복제본을 지원합니다.
  + `data_s3_path`: 훈련 데이터세트(JSONL 파일)의 S3 위치입니다. 이 파일은 클러스터와 동일한 AWS 계정 및 리전에 있어야 합니다. 제공된 S3 경로 내의 모든 S3 위치는 동일한 계정 및 리전에 있어야 합니다.
  + `validation_data_s3_path`: (선택 사항) 검증 데이터세트(JSONL 파일)의 S3 위치입니다. 이 파일은 클러스터와 동일한 계정 및 리전에 있어야 합니다. 제공된 S3 경로 내의 모든 S3 위치는 동일한 계정 및 리전에 있어야 합니다.
  + `output_s3_path`: 매니페스트 및 TensorBoard 로그가 저장되는 S3 위치입니다. 제공된 S3 경로 내의 모든 S3 위치는 동일한 계정 및 리전에 있어야 합니다.
+ **훈련 구성**
  + `max_length`: 토큰 단위의 최대 시퀀스 길이입니다. 이는 훈련을 위한 컨텍스트 창 크기를 결정합니다. SFT에 대해 지원되는 최대 값은 65,536개의 토큰입니다.

    시퀀스가 길어지면 훈련 효율성이 향상되지만 메모리 요구 사항이 증가합니다. `max_length` 파라미터를 데이터 분포와 일치시키는 것이 좋습니다.
+ **트레이너 설정**
  + `max_epochs`: 훈련 데이터세트의 완료 통과 횟수입니다.

    일반적으로 데이터세트가 클수록 수렴하는 데 필요한 에포크 수가 적고, 데이터세트가 작을수록 수렴하는 데 더 많은 에포크가 필요합니다. 데이터 크기에 따라 에포크 수를 조정하는 것이 좋습니다.
+ **모델 설정**
  + `hidden_dropout`: 숨겨진 상태 출력이 삭제될 확률입니다. 작은 데이터세트에서 과적합을 줄이려면 이 값을 약 0.0\$10.2 늘립니다. 유효한 값은 0\$11입니다.
  + `attention_dropout`: 어텐션 가중치가 삭제될 확률입니다. 이 파라미터는 일반화에 도움이 될 수 있습니다. 유효한 값은 0\$11입니다.
  + `ffn_dropout`: 피드포워드 네트워크 출력이 삭제될 확률입니다. 유효한 값은 0\$11입니다.
+ **옵티마이저 구성**
  + `lr`: 최적화 동안 단계 크기를 제어하는 학습률입니다. 유효한 값은 1e-6\$11e-3입니다. 성능 향상을 위해 1e-6에서 1e-4 사이의 값을 권장합니다.
  + `name`: 옵티마이저 알고리즘입니다. 현재 `distributed_fused_adam`만 지원됩니다.
  + `weight_decay`: L2 정규화 강도입니다. 값이 높을수록(0.01에서 0.1 사이) 정규화가 증가합니다.
  + `warmup_steps`: 학습률을 점진적으로 높이는 단계 수입니다. 이는 훈련의 안정성을 향상시킵니다. 유효한 값은 1\$120입니다.
  + `min_lr`: 감소 종료 시의 최소 학습률입니다. 유효한 값은 0\$11이지만 설정된 학습률보다 작아야 합니다.

## 전체 순위 SFT 레시피를 사용한 빠른 시작
<a name="nova-sft-1-quick-start"></a>

다음은 SageMaker HyperPod 클러스터에서 SFT 작업을 빠르게 시작하기 위한 전체 순위 SFT 레시피입니다. 이 레시피는 올바른 AWS 자격 증명을 사용하여 SageMaker HyperPod 클러스터에 연결되어 있다고 가정합니다.

```
run:
  name: "my-sft-micro-job" # gets appended with a unique ID for HP jobs
  model_type: "amazon.nova-micro-v1:0:128k"
  model_name_or_path: "nova-micro/prod"
  replicas: 2
  data_s3_path: s3:Replace with your S3 bucket name/input.jsonl
  validation_data_s3_path: [OPTIONAL] s3:your S3 bucket name/input.jsonl
  output_s3_path: [S3_PATH_TO_STORE_MANIFEST]

## training specific configs
training_config:
  max_length: 32768
  save_steps: 100000
  replicas: ${recipes.run.replicas}
  micro_batch_size: 1
  task_type: sft
  global_batch_size: 64
  weights_only: True
  allow_percentage_invalid_samples: 10

  exp_manager:
    exp_dir: null
    create_wandb_logger: False
    create_tensorboard_logger: True
      project: null
      name: null
    checkpoint_callback_params:
      monitor: step
      save_top_k: 10
      mode: max
      every_n_train_steps: ${recipes.training_config.save_steps}
      save_last: True
    create_early_stopping_callback: True
    early_stopping_callback_params:
      min_delta: 0.001
      mode: min
      monitor: "val_loss"
      patience: 2

  trainer:
    log_every_n_steps: 1
    max_epochs: -1
    max_steps: 16
    limit_test_batches: 0
    gradient_clip_val: 1.0
    num_nodes: ${recipes.training_config.replicas}

  model:
    hidden_dropout: 0.0 # Dropout probability for hidden state transformer.
    attention_dropout: 0.0 # Dropout probability in the attention layer.
    ffn_dropout: 0.0 # Dropout probability in the feed-forward layer.
    sequence_parallel: True
    optim:
      lr: 1e-5
      name: distributed_fused_adam
      bucket_cap_mb: 10
      contiguous_grad_buffer: False
      overlap_param_sync: False
      contiguous_param_buffer: False
      overlap_grad_sync: False
      adam_w_mode: true
      eps: 1e-06
      weight_decay: 0.0
      betas:
        - 0.9
        - 0.999
      sched:
        name: CosineAnnealing
        warmup_steps: 10
        constant_steps: 0
        min_lr: 1e-6

    mm_cfg:
      llm:
        freeze: false
      image_projector:
        freeze: true
        require_newline: true
      video_projector:
        freeze: true
        require_newline: false

    peft:
      peft_scheme: null

    training_validation:
      loader:
        args:
          data_loader_workers: 1
          prefetch_factor: 2
      collator:
        args:
          force_image_at_turn_beginning: false
```

## 샘플 전체 순위 레시피
<a name="nova-sft-1-sample-recipe"></a>

다음은 모든 구성 요소가 올바르게 구성된 SFT에 대한 샘플 전체 순위 레시피입니다.

```
## Run config
run:
    name: "my-sft-run"              # A descriptive name for your training job
    model_type: "amazon.nova-lite-v1:0:300k"  # Model variant specification
    model_name_or_path: "nova-lite/prod"      # Base model path
    replicas: 4                     # Number of compute instances for training
    data_s3_path: s3:Replace with your S3 bucket name/input.jsonl
    validation_data_s3_path: [OPTIONAL] s3:your S3 bucket name/input.jsonl
    output_s3_path: [S3_PATH_TO_STORE_MANIFEST]

## Training specific configs
training_config:
    max_length: 32768               # Maximum context window size (tokens)

    trainer:
        max_epochs: 2               # Number of training epochs

    model:
        hidden_dropout: 0.0          # Dropout for hidden states
        attention_dropout: 0.0       # Dropout for attention weights
        ffn_dropout: 0.0             # Dropout for feed-forward networks

        optim:
            lr: 1e-5                 # Learning rate
            name: distributed_fused_adam  # Optimizer algorithm
            adam_w_mode: true        # Enable AdamW mode
            eps: 1e-06               # Epsilon for numerical stability
            weight_decay: 0.0        # L2 regularization strength
            betas:                   # Adam optimizer betas
                - 0.9
                - 0.999
            sched:
                warmup_steps: 10     # Learning rate warmup steps
                constant_steps: 0    # Steps at constant learning rate
                min_lr: 1e-6         # Minimum learning rate

        peft:
            peft_scheme: null        # Set to null for full-parameter fine-tuning
```

## 제한 사항
<a name="nova-sft-1-limitations"></a>

Weights & Biases에 지표를 게시하는 것은 지원되지 않습니다.

하이퍼파라미터를 조정하려면 [하이퍼파라미터 선택](https://docs.aws.amazon.com/nova/latest/userguide/customize-fine-tune-hyperparameters.html)의 지침을 따릅니다.

## 파라미터 효율적 미세 조정(PEFT)
<a name="nova-fine-tune-peft"></a>

파라미터 효율적 미세 조정(PEFT)에는 파운데이션 모델을 새 태스크 또는 도메인에 맞게 조정하기 위해 몇 가지 추가 가중치를 재훈련하는 작업이 포함됩니다. 특히 저순위 어댑터(LoRA) PEFT는 특정 모델 계층에 저순위 학습 가능 가중치 행렬을 도입하여 모델 품질을 유지하면서 훈련 가능한 파라미터 수를 줄여 파운데이션 모델을 효율적으로 미세 조정할 수 있습니다.

LoRA PEFT 어댑터는 경량 어댑터 계층을 추가하여 추론 중 모델의 가중치를 수정하면서도 원래 모델 파라미터는 그대로 유지합니다. 이 접근 방식은 가장 비용 효율적인 미세 조정 기법 중 하나로도 간주됩니다. 자세한 내용은 [어댑터 추론 구성 요소를 사용한 모델 미세 조정](https://docs.aws.amazon.com/sagemaker/latest/dg/realtime-endpoints-adapt.html)을 참조하세요.

다음 시나리오에서는 LoRA PEFT를 사용해야 합니다.
+ 빠른 훈련 절차로 시작하려고 합니다.
+ 기본 모델의 성능이 이미 만족스럽습니다. 이 경우 LoRA PEFT의 목표는 텍스트 요약이나 언어 번역 등 여러 관련 태스크에서 모델의 역량을 향상시키는 것입니다. LoRA PEFT의 정규화 특성은 과적합을 방지하고, 모델이 원본 도메인을 잊어버리는 문제를 완화하는 데 도움을 줍니다. 이를 통해 모델이 다양한 응용 분야에서 유연하고 적응 가능하게 됩니다.
+ 비교적 작은 데이터세트를 사용하는 명령어 기반 미세 조정 시나리오를 수행하려고 합니다. LoRA PEFT는 더 광범위하고 큰 데이터세트보다 작고 특정 태스크에 맞춘 데이터세트에서 더 우수한 성능을 발휘합니다.
+ Amazon Bedrock 사용자 지정 데이터 제한을 초과하는 대규모의 레이블이 지정된 데이터세트가 있습니다. 이 경우 SageMaker AI에서 LoRA PEFT를 사용하면 더 나은 결과를 얻을 수 있습니다.
+ 이미 Amazon Bedrock 미세 조정을 통해 유망한 결과를 얻은 경우에는 SageMaker AI에서 LoRA PEFT를 활용하여 모델 하이퍼파라미터를 추가 최적화할 수 있습니다.

LoRA PEFT에서 사용할 수 있는 Amazon Nova 파라미터는 다음과 같습니다.
+ **실행 구성**
  + `name`: 훈련 작업을 설명하는 이름입니다. AWS Management Console에서 작업을 식별하는 데 도움이 됩니다.
  + `model_type`: 사용할 Nova 모델 변형입니다. 사용할 수 있는 옵션은 `amazon.nova-micro-v1:0:128k`, `amazon.nova-lite-v1:0:300k` 또는 `amazon.nova-pro-v1:0:300k`입니다.
  + `model_name_or_path`: 훈련에 사용할 기본 모델의 경로입니다. 사용할 모델을 선택합니다. 사용 가능한 옵션은 `nova-micro/prod`, `nova-lite/prod`, `nova-pro/prod` 또는 훈련 후 체크포인트의 S3 경로(`s3://<escrow bucket>/<job id>/outputs/checkpoints`)입니다.
  + `replicas`: 분산 훈련에 사용할 컴퓨팅 인스턴스의 수입니다. 사용 가능한 값은 사용하는 모델에 따라 다릅니다. Amazon Nova Micro는 2개, 4개 또는 8개의 복제본을 지원합니다. Amazon Nova Lite는 4개, 8개, 16개 또는 32개의 복제본을 지원합니다. Amazon Nova Pro는 6개, 12개 또는 24개의 복제본을 지원합니다.
  + `output_s3_path`: 매니페스트 및 TensorBoard 로그가 저장되는 S3 위치입니다. 제공된 S3 경로 내의 모든 S3 위치는 동일한 계정 및 리전에 있어야 합니다.
+ **훈련 구성**
  + `max_length`: 토큰 단위의 최대 시퀀스 길이입니다. 이는 훈련을 위한 컨텍스트 창 크기를 결정합니다. LoRA PEFT에 대해 지원되는 최대 값은 65,536개의 토큰입니다.

    시퀀스가 길어지면 훈련 효율성이 향상되지만 메모리 요구 사항이 증가합니다. `max_length` 파라미터를 데이터 분포와 일치시키는 것이 좋습니다.
+ **트레이너 설정**
  + `max_epochs`: 훈련 데이터세트의 완료 통과 횟수입니다. `max_steps` 또는 `max_epochs`를 설정할 수 있지만 둘 다 설정하는 것은 권장하지 않습니다. 최대값은 5입니다.

    일반적으로 데이터세트가 클수록 수렴하는 데 필요한 에포크 수가 적고, 데이터세트가 작을수록 수렴하는 데 더 많은 에포크가 필요합니다. 데이터 크기에 따라 에포크 수를 조정하는 것이 좋습니다.
+ **모델 설정**
  + `hidden_dropout`: 숨겨진 상태 출력이 삭제될 확률입니다. 작은 데이터세트에서 과적합을 줄이려면 이 값을 약 0.0\$10.2 늘립니다. 유효한 값은 0\$11입니다.
  + `attention_dropout`: 어텐션 가중치가 삭제될 확률입니다. 이 파라미터는 일반화에 도움이 될 수 있습니다. 유효한 값은 0\$11입니다.
  + `ffn_dropout`: 피드포워드 네트워크 출력이 삭제될 확률입니다. 유효한 값은 0\$11입니다.
+ **옵티마이저 구성**
  + `lr`: 최적화 동안 단계 크기를 제어하는 학습률입니다. 성능 향상을 위해 1e-6에서 1e-4 사이의 값을 권장합니다. 유효한 값은 0\$11입니다.
  + `name`: 옵티마이저 알고리즘입니다. 현재 `distributed_fused_adam`만 지원됩니다.
  + `weight_decay`: L2 정규화 강도입니다. 값이 높을수록(0.01에서 0.1 사이) 정규화가 증가합니다.
  + `warmup_steps`: 학습률을 점진적으로 높이는 단계 수입니다. 이는 훈련의 안정성을 향상시킵니다. 유효한 값은 1\$120입니다.
  + `min_lr`: 감소 종료 시의 최소 학습률입니다. 유효한 값은 0\$11이지만 설정된 학습률보다 작아야 합니다.
+ **LoRA 구성 파라미터**
  + `peft_scheme`: 저순위 적응을 활성화하려면 `lora`로 설정합니다.
  + `alpha`: LoRA 가중치의 조정 인수입니다. 이는 일반적으로 `adapter_dim`과 동일한 값으로 설정됩니다.
  + `adaptor_dropout`: LoRA의 정규화 파라미터입니다.

### PEFT 레시피
<a name="nova-sft-1-peft-recipe"></a>

다음은 LoRA PEFT의 레시피입니다.

```
## Run config
run:
    name: "my-lora-run"             # A descriptive name for your training job
    model_type: "amazon.nova-lite-v1:0:300k"  # Model variant specification
    model_name_or_path: "nova-lite/prod"      # Base model path
    replicas: 4                     # Number of compute instances for training
    output_s3_path: [S3_PATH_TO_STORE_MANIFEST]

## Training specific configs
training_config:
    max_length: 32768               # Maximum context window size (tokens)

    trainer:
        max_epochs: 2               # Number of training epochs

    model:
        hidden_dropout: 0.0          # Dropout for hidden states
        attention_dropout: 0.0       # Dropout for attention weights
        ffn_dropout: 0.0             # Dropout for feed-forward networks

        optim:
            lr: 1e-5                 # Learning rate
            name: distributed_fused_adam  # Optimizer algorithm
            adam_w_mode: true        # Enable AdamW mode
            eps: 1e-06               # Epsilon for numerical stability
            weight_decay: 0.0        # L2 regularization strength
            betas:                   # Adam optimizer betas
                - 0.9
                - 0.999
            sched:
                warmup_steps: 10     # Learning rate warmup steps
                constant_steps: 0    # Steps at constant learning rate
                min_lr: 1e-6         # Minimum learning rate

        peft:
            peft_scheme: "lora"      # Enable LoRA for parameter-efficient fine-tuning
            lora_tuning:
                loraplus_lr_ratio: 8.0  # LoRA+ learning rate scaling factor
                alpha: 32            # Scaling factor for LoRA weights
                adapter_dropout: 0.01  # Regularization for LoRA parameters
```

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

다음 정보를 사용하여 발생할 수 있는 문제를 해결할 수 있습니다.
+ 훈련 및 검증을 위한 입력 데이터세트는 에스크로 또는 서비스 관리형 S3 버킷이 아닌 고객 소유 버킷에 있어야 합니다.
+ AWS CLI에서 '리전을 찾을 수 없음' 오류가 발생하면 start-job 명령 앞에 리전을 추가하여 작업을 다시 제출합니다. 예를 들면 `AWS_REGION=us-east-1 hyperpod start-job ...Job Parameters`입니다.
+ 하이퍼파라미터를 조정하려면 [하이퍼파라미터 선택](https://docs.aws.amazon.com/nova/latest/userguide/customize-fine-tune-hyperparameters.html)의 지침을 따릅니다.

# 직접 선호 최적화(DPO)
<a name="nova-dpo"></a>

직접 선호 최적화(DPO)는 파운데이션 모델을 위한 효율적인 미세 조정 방법으로, 쌍 비교 데이터를 사용하여 모델 출력을 인간의 선호도에 맞추도록 조정합니다. 이 접근 방식을 사용하면 어떤 응답이 더 바람직한지에 대한 인간 피드백을 기반으로 모델 동작을 직접 최적화할 수 있습니다.

전체 순위 DPO와 저순위 어댑터(LoRA) DPO 모두 사용 가능합니다.

**데이터 형식 요구 사항**  
전체 순위 및 LoRA DPO 모두에서 훈련 데이터 형식 요구 사항은 SFT와 유사합니다. 그러나 DPO의 경우 마지막 턴에는 기본 설정 페어가 있어야 합니다. 다음은 DPO 데이터 형식의 예입니다.

```
// N-1 turns same as SFT format
{
    "role": "assistant",
    "candidates": [
        {
            "content": [
                {
                    "text": "..."
                } // content list can contain multiple 'text' objects
            ],
            "preferenceLabel": "preferred"
        },
        {
            "content": [
                {
                    "text": "..."
                } // content list can contain multiple 'text' objects
            ],
            "preferenceLabel": "non-preferred"
        }
    ]
}
```

다음은 또 다른 전체 DPO 텍스트 샘플입니다.

```
{
    "system": [
        {
            "text": "..."
        }
    ],
    "messages":[
        {
            "role": "user",
            "content": [
                {
                    "text": "..."
                }
            ]
        },
        {
            "role": "assistant",
            "content": [
                {
                    "text": "..."
                }
            ]
        },
        {
            "role": "user",
            "content": [
                {
                    "text": "..."
                }
            ]
        },
        {
            "role": "assistant",
            "candidates": [
                {
                    "content": [
                        {
                            "text": "..."
                        }
                    ],
                    "preferenceLabel": "preferred"
                },
                {
                    "content": [
                        {
                            "text": "..."
                        }
                    ],
                    "preferenceLabel": "non-preferred"
                }
            ]
        }
    ],
}
```

다음은 전체 DPO 이미지 샘플입니다.

```
{
    "system": [
        {
            "text": "..."
        }
    ],
    "messages":[
        {
            "role": "user",
            "content": [
                {
                    "text": "..."
                },
                {
                    "text": "..."
                },
                {
                    "image": {
                        "format": "jpeg",
                        "source": {
                            "s3Location": {
                                "uri": "s3://your-bucket/your-path/your-image.jpg",
                                "bucketOwner": "your-aws-account-id"
                            }
                        }
                    }
                } // "content" can have multiple "text" and "image" objects.
                 // max image count is 10
            ]
        },
        {
            "role": "assistant",
            "content": [
                {
                    "text": "..."
                }
            ]
        },
        {
            "role": "user",
            "content": [
                {
                    "text": "..."
                },
                {
                    "text": "..."
                },
                {
                    "image": {
                        "format": "jpeg",
                        "source": {
                            "s3Location": {
                                "uri": "s3://your-bucket/your-path/your-image.jpg",
                                "bucketOwner": "your-aws-account-id"
                            }
                        }
                    }
                } // "content" can have multiple "text" and "image" objects.
                 // max image count is 10
            ]
        },
        {
            "role": "assistant",
            "candidates": [
                {
                    "content": [
                        {
                            "text": "..."
                        }
                    ],
                    "preferenceLabel": "preferred"
                },
                {
                    "content": [
                        {
                            "text": "..."
                        }
                    ],
                    "preferenceLabel": "non-preferred"
                }
            ]
        }
    ],
}
```

입력 데이터세트에는 여러 제약 조건이 적용됩니다. 자세한 내용은 [데이터세트 제약 조건](https://docs.aws.amazon.com/nova/latest/userguide/fine-tune-prepare-data-understanding.html#custom-fine-tune-constraints)을 참조하세요. 효과적인 훈련을 위해 최소 1,000개의 기본 설정 페어를 포함하는 것이 좋습니다. 고품질 기본 설정 데이터를 사용하면 더 효율적인 결과를 얻을 수 있습니다.

다음과 같은 시나리오에서 DPO 사용을 권장합니다.
+ 특정 인간 선호도에 맞춘 주관적 출력 최적화
+ 모델의 톤, 스타일, 콘텐츠 특성을 원하는 응답 패턴에 맞게 조정
+ 사용자 피드백 및 오류 분석을 기반으로 기존 모델 개선
+ 다양한 사용 사례에서 일관된 출력 품질 유지
+ 선호 응답 패턴을 통해 안전 가드레일 구현
+ 보상 없는 강화 학습 수행
+ 등급화 또는 레이블링 데이터 없이 선호 데이터만 활용
+ 유용함, 무해함, 정직함 등 세밀한 정렬 과제에서 모델 개선

## 전체 순위 DPO
<a name="customize-fine-tune-hyperpod-dpo-fr"></a>

전체 순위 DPO에 사용할 수 있는 Amazon Nova 파라미터는 다음과 같습니다.
+ **실행 구성**
  + `name`: 훈련 작업을 설명하는 이름입니다. AWS Management Console에서 작업을 식별하는 데 도움이 됩니다.
  + `model_type`: 사용할 Nova 모델 변형입니다. 사용할 수 있는 옵션은 `amazon.nova-micro-v1:0:128k`, `amazon.nova-lite-v1:0:300k` 또는 `amazon.nova-pro-v1:0:300k`입니다.
  + `model_name_or_path`: 기본 모델의 경로입니다. 다음 중에서 사용할 모델을 선택합니다. `nova-micro/prod`, `nova-lite/prod`, `nova-pro/prod` 또는 훈련 후 체크포인트의 S3 경로(`s3://<escrow bucket>/<job id>/outputs/checkpoints`).
  + `replicas`: 분산 훈련에 사용할 컴퓨팅 인스턴스의 수입니다. 사용 가능한 값은 선택한 모델에 따라 다릅니다. Amazon Nova Micro는 2개, 4개 또는 8개의 복제본을 지원합니다. Amazon Nova Lite는 4개, 8개, 16개 또는 32개의 복제본을 지원합니다. Amazon Nova Pro는 6개, 12개 또는 24개의 복제본을 지원합니다.
  + `data_s3_path`: 훈련 데이터세트(JSONL 파일)의 S3 위치입니다. 이 파일은 클러스터와 동일한 계정 및 리전에 있어야 합니다. 제공된 모든 S3 위치는 동일한 계정 및 리전에 있어야 합니다.
  + `validation_data_s3_path`: 검증 데이터세트(JSONL 파일)의 S3 위치입니다. 이 파일은 클러스터와 동일한 AWS 계정 및 리전에 있어야 합니다. 제공된 모든 S3 위치는 동일한 계정 및 리전에 있어야 합니다.
+ **훈련 구성**
  + `max_length`: 토큰 단위의 최대 시퀀스 길이입니다. 이는 훈련을 위한 컨텍스트 창 크기를 결정합니다. DPO에 대해 지원되는 최대 값은 32,768개의 토큰입니다.

    시퀀스가 길어지면 훈련 효율성이 향상되지만 메모리 요구 사항이 증가합니다. `max_length` 파라미터를 데이터 분포와 일치시키는 것이 좋습니다.
+ **트레이너 설정**
  + `max_epochs`: 훈련 데이터세트의 완료 통과 횟수입니다.

    일반적으로 데이터세트가 클수록 수렴하는 데 필요한 에포크 수가 적고, 데이터세트가 작을수록 수렴하는 데 더 많은 에포크가 필요합니다. 데이터 크기에 따라 에포크 수를 조정하는 것이 좋습니다.
+ **모델 설정**
  + `hidden_dropout`: 숨겨진 상태 출력이 삭제될 확률입니다. 작은 데이터세트에서 과적합을 줄이려면 이 값을 약 0.0\$10.2 늘립니다. 유효한 값은 0\$11입니다.
  + `attention_dropout`: 어텐션 가중치가 삭제될 확률입니다. 이 파라미터는 일반화에 도움이 될 수 있습니다. 유효한 값은 0\$11입니다.
  + `ffn_dropout`: 피드포워드 네트워크 출력이 삭제될 확률입니다. 유효한 값은 0\$11입니다.
+ **옵티마이저 구성**
  + `lr`: 최적화 동안 단계 크기를 제어하는 학습률입니다. 성능 향상을 위해 1e-6에서 1e-4 사이의 값을 권장합니다. 유효한 값은 0\$11입니다.
  + `name`: 옵티마이저 알고리즘입니다. 현재 `distributed_fused_adam`만 지원됩니다.
  + `weight_decay`: L2 정규화 강도입니다. 값이 높을수록(0.01에서 0.1 사이) 정규화가 증가합니다.
  + `warmup_steps`: 학습률을 점진적으로 높이는 단계 수입니다. 이는 훈련의 안정성을 향상시킵니다. 유효한 값은 1\$120입니다.
  + `min_lr`: 감소 종료 시의 최소 학습률입니다. 유효한 값은 0\$11이지만 설정된 학습률보다 작아야 합니다.
+ **DPO 구성**
  + `beta`: 모델이 훈련 데이터 또는 원래 모델에 얼마나 근접해야 하는지 결정합니다. 유효한 값은 0.001\$10.5입니다.

    큰 값(예: 0.5)을 지정하면 참조 모델 동작을 더 많이 유지하면서 새로운 기본 설정을 더 느리게 학습합니다. 작은 값(예: 0.01\$10.05)을 지정하면 새로운 기본 설정을 더 빠르게 학습하지만 참조 모델 동작에서 멀어질 위험이 있습니다.

**전체 순위 DPO 레시피**  
다음은 DPO에 대한 전체 순위 레시피입니다.

```
## Run config
run:
  name: "my-dpo-micro-job"             # A descriptive name for your training job
  model_type: "amazon.nova-micro-v1:0:128k"  # Model variant specification, do not change
  model_name_or_path: "nova-micro/prod"      # Base model path, do not change
  replicas: 2                     # Number of compute instances for training, allowed values are 2, 4, 8
  data_s3_path: s3:Replace with your S3 bucket name/input.jsonl
  validation_data_s3_path: [OPTIONAL] s3:your S3 bucket name/input.jsonl
  output_s3_path: [S3_PATH_TO_STORE_MANIFEST]

## Training specific configs
training_config:
  max_length: 32768               # Maximum context window size (tokens).
  global_batch_size: 64           # Global batch size, allowed values are 16, 32, 64.

  trainer:
    max_epochs: 2                # Number of training epochs

  model:
    hidden_dropout: 0.0          # Dropout for hidden states, must be between 0.0 and 1.0
    attention_dropout: 0.0       # Dropout for attention weights, must be between 0.0 and 1.0
    ffn_dropout: 0.0             # Dropout for feed-forward networks, must be between 0.0 and 1.0

    optim:
      lr: 1e-5                 # Learning rate
      name: distributed_fused_adam  # Optimizer algorithm, do not change
      adam_w_mode: true        # Enable AdamW mode
      eps: 1e-06               # Epsilon for numerical stability
      weight_decay: 0.0        # L2 regularization strength, must be between 0.0 and 1.0
      betas:                   # Adam optimizer betas, must be between 0.0 and 1.0
        - 0.9
        - 0.999
      sched:
        warmup_steps: 10     # Learning rate warmup steps
        constant_steps: 0    # Steps at constant learning rate
        min_lr: 1e-6         # Minimum learning rate, must be lower than lr

    dpo_cfg:
        beta: 0.1               # Strength of preference enforcement. Limits: [0.001, 0.5]

    peft:
        peft_scheme: null        # Disable LoRA, trigger full rank fine tuning
```

## 저순위 어댑터 DPO
<a name="customize-fine-tune-hyperpod-dpo-lora"></a>

저순위 어댑터 DPO에 사용할 수 있는 Amazon Nova 파라미터는 다음과 같습니다.
+ **실행 구성**
  + `name`: 훈련 작업을 설명하는 이름입니다. AWS Management Console에서 작업을 식별하는 데 도움이 됩니다.
  + `model_type`: 사용할 Nova 모델 변형입니다. 사용할 수 있는 옵션은 `amazon.nova-micro-v1:0:128k`, `amazon.nova-lite-v1:0:300k` 또는 `amazon.nova-pro-v1:0:300k`입니다.
  + `model_name_or_path`: 기본 모델의 경로입니다. 다음 중에서 사용할 모델을 선택합니다. `nova-micro/prod`, `nova-lite/prod`, `nova-pro/prod` 또는 훈련 후 체크포인트의 S3 경로(`s3://<escrow bucket>/<job id>/outputs/checkpoints`).
  + `replicas`: 분산 훈련에 사용할 컴퓨팅 인스턴스의 수입니다. 사용 가능한 값은 선택한 모델에 따라 다릅니다. Amazon Nova Micro는 2개, 4개 또는 8개의 복제본을 지원합니다. Amazon Nova Lite는 4개, 8개, 16개 또는 32개의 복제본을 지원합니다. Amazon Nova Pro는 6개, 12개 또는 24개의 복제본을 지원합니다.
+ **훈련 구성**
  + `max_length`: 토큰 단위의 최대 시퀀스 길이입니다. 이는 훈련을 위한 컨텍스트 창 크기를 결정합니다. DPO에 대해 지원되는 최대 값은 32,768개의 토큰입니다.

    시퀀스가 길어지면 훈련 효율성이 향상되지만 메모리 요구 사항이 증가합니다. `max_length` 파라미터를 데이터 분포와 일치시키는 것이 좋습니다.
+ **트레이너 설정**
  + `max_epochs`: 훈련 데이터세트의 완료 통과 횟수입니다.

    일반적으로 데이터세트가 클수록 수렴하는 데 필요한 에포크 수가 적고, 데이터세트가 작을수록 수렴하는 데 더 많은 에포크가 필요합니다. 데이터 크기에 따라 에포크 수를 조정하는 것이 좋습니다.
+ **모델 설정**
  + `hidden_dropout`: 숨겨진 상태 출력이 삭제될 확률입니다. 작은 데이터세트에서 과적합을 줄이려면 이 값을 약 0.0\$10.2 늘립니다. 유효한 값은 0\$11입니다.
  + `attention_dropout`: 어텐션 가중치가 삭제될 확률입니다. 이 파라미터는 일반화에 도움이 될 수 있습니다. 유효한 값은 0\$11입니다.
  + `ffn_dropout`: 피드포워드 네트워크 출력이 삭제될 확률입니다. 유효한 값은 0\$11입니다.
+ **옵티마이저 구성**
  + `lr`: 최적화 동안 단계 크기를 제어하는 학습률입니다. 성능 향상을 위해 1e-6에서 1e-4 사이의 값을 권장합니다. 유효한 값은 0\$11입니다.
  + `name`: 옵티마이저 알고리즘입니다. 현재 `distributed_fused_adam`만 지원됩니다.
  + `weight_decay`: L2 정규화 강도입니다. 값이 높을수록(0.01에서 0.1 사이) 정규화가 증가합니다.
  + `warmup_steps`: 학습률을 점진적으로 높이는 단계 수입니다. 이는 훈련의 안정성을 향상시킵니다. 유효한 값은 1\$120입니다.
  + `min_lr`: 감소 종료 시의 최소 학습률입니다. 유효한 값은 0\$11이지만 설정된 학습률보다 작아야 합니다.
+ **DPO 구성**
  + `beta`: 모델이 훈련 데이터 또는 원래 모델에 얼마나 근접해야 하는지 결정합니다. 유효한 값은 0.001\$10.5입니다.

    큰 값(예: 0.5)을 지정하면 참조 모델 동작을 더 많이 유지하면서 새로운 기본 설정을 더 느리게 학습합니다. 작은 값(예: 0.01\$10.05)을 지정하면 새로운 기본 설정을 더 빠르게 학습하지만 참조 모델 동작에서 멀어질 위험이 있습니다.
+ **LoRA 구성 파라미터**
  + `peft_scheme`: 더 효율적이고 경량화된 출력 모델을 생성하는 저순위 적응을 활성화려면 `lora`로 설정합니다. 이러한 LoRA 특정 속성도 사용할 수 있습니다.
    + `alpha`: LoRA 가중치의 조정 인수입니다. 이는 일반적으로 `adapter_dim`과 동일한 값으로 설정됩니다.
    + `adapter_dropout`: LoRA 파라미터의 정규화 파라미터입니다.

**LoRA DPO 레시피**  
다음은 LoRA DPO의 레시피입니다.

```
## Run config
run:
    name: "my-lora-run"             # A descriptive name for your training job
    model_type: "amazon.nova-lite-v1:0:300k"  # Model variant specification, do not change
    model_name_or_path: "nova-lite/prod"      # Base model path, do not change
    replicas: 4                     # Number of compute instances for training. All supported values: {4, 8, 16}
    data_s3_path: s3:Replace with your S3 bucket name/input.jsonl
    validation_data_s3_path: [OPTIONAL] s3:your S3 bucket name/input.jsonl
    output_s3_path: [S3_PATH_TO_STORE_MANIFEST]

## Training specific configs
training_config:
    max_length: 16384               # Maximum context window size (tokens). Should be between [1024, 32768] and multiple of 1024.
                                    # Note: Image dataset for DPO has a limit on 20k samples and 16384 max_length
    global_batch_size: 64           # Total samples per step. Limits: {16, 32, 64, 128, 256}

    trainer:
        max_epochs: 2               # Number of training epochs

    model:
        hidden_dropout: 0.0          # Dropout for hidden states. Limits: [0.0, 1.0]
        attention_dropout: 0.0       # Dropout for attention weights. Limits: [0.0, 1.0]
        ffn_dropout: 0.0             # Dropout for feed-forward networks. Limits: [0.0, 1.0]

        optim:
            lr: 1e-5                 # Learning rate
            name: distributed_fused_adam  # Optimizer algorithm, do not change
            adam_w_mode: true        # Enable AdamW mode
            eps: 1e-08               # Epsilon for numerical stability
            weight_decay: 0.01       # L2 regularization strength
            betas:                   # Adam optimizer betas. Limits: [0.0, 1.0]
                - 0.9
                - 0.999
            sched:
                warmup_steps: 10     # Learning rate warmup steps
                constant_steps: 0    # Steps at constant learning rate
                min_lr: 1e-6         # Minimum learning rate

        dpo_cfg:
            beta: 0.01               # Strength of preference enforcement. Limits: [0.001, 0.5]

        peft:
            peft_scheme: "lora"      # Enable LoRA for parameter-efficient fine-tuning
            lora_tuning:
                loraplus_lr_ratio: 20.0  # LoRA+ learning rate scaling factor. Limits: [0.0, 100.0]
                alpha: 64            # Scaling factor for LoRA weights. [32, 64, 96, 128, 160, 192]
                adapter_dropout: 0.01  # Regularization for LoRA parameters. Limits: [0.0, 1.0]
```

**제한 사항**  
DPO에는 다음과 같은 제한 사항이 있습니다.
+ 중간 체크포인트는 평가를 위해 저장되지 않으며 중간 체크포인트에서 재개할 수 없습니다. 마지막 체크포인트만 저장됩니다.
+ 하이퍼파라미터를 조정하려면 [하이퍼파라미터 선택](https://docs.aws.amazon.com/nova/latest/userguide/customize-fine-tune-hyperparameters.html)의 지침을 따릅니다.

# 근접 정책 최적화(PPO)
<a name="nova-ppo"></a>

근접 정책 최적화(PPO)는 여러 기계 학습 모델을 활용해 하나의 모델을 학습하고 점수를 매기는 과정입니다. 다음 모델은 PPO 프로세스의 일부입니다.
+ **액터 훈련 또는 정책 모델**: 지도 미세 조정(SFT) 방식의 모델로, 에포크마다 미세 조정 및 업데이트가 이루어집니다. 업데이트는 프롬프트를 샘플링하고, 결과물을 생성하며, 클리핑 대리 목표를 사용해 가중치를 업데이트하는 방식으로 수행됩니다. 이를 통해 토큰 단위의 로그 가능도 변화 폭이 제한되어 각 정책 단계가 이전 단계와 *근접*하게 유지되며 학습 안정성이 보장됩니다.
+ **액터 생성 모델**: 보상 모델과 비평가 모델의 평가를 받기 위해 프롬프트 완성 또는 응답을 생성하는 모델입니다. 이 모델의 가중치는 매 에포크마다 액터 학습 모델 또는 정책 모델에서 업데이트됩니다.
+ **보상 모델**: 가중치가 고정된 모델로, 액터 생성 모델을 평가하는 데 사용됩니다.
+ **비평가 모델**: 가중치가 고정되지 않은 모델로, 액터 생성 모델을 평가하는 데 사용됩니다. 이 점수는 일반적으로 액터가 나머지 토큰을 생성할 때 받을 총 보상에 대한 추정치로 간주됩니다.
+ **앵커 모델**: 가중치가 고정된 SFT 모델로, 액터 훈련 모델과 기본 모델 간의 KL 발산을 계산하는 데 사용됩니다. 앵커 모델은 액터 모델의 업데이트가 기본 모델과 비교해 지나치게 급격하지 않도록 보장합니다. 급격한 변화는 학습 불안정이나 성능 저하를 초래할 수 있습니다.

훈련 데이터는 JSONL 형식이어야 하며, 각 줄에 훈련 예시를 나타내는 단일 JSON 객체가 포함되어야 합니다. 다음 예를 참고하세요

```
{
    "turns": ["string", "string", ...], // Required
    "turns_to_mask": [integer, integer, ...], // Required
    "reward_category": "string", // Required
    "meta_data": {} // Optional
}
```
+ `turns`는 대화 시퀀스를 나타내는 대화 문자열 배열의 배열입니다. 이 줄에는 시스템 프롬프트, 사용자 메시지 및 봇 응답이 포함되어 있습니다. 사용자 메시지는 일반적으로 "Bot: "로 끝나는데, 이는 모델 출력이 시작되는 위치를 나타냅니다. 예를 들어 `[["System prompt"], ["User: Question Bot:"], ["Bot response"]]`입니다.
+ `turns_to_mask`는 0 기반 인덱스의 배열로, 그라디언트 업데이트가 적용되어서는 안 되는 턴을 식별합니다. 마스킹된 턴은 일반적으로 시스템 프롬프트와 사용자 턴입니다. 예를 들어 `[0, 1, 3]`은 시스템 프롬프트와 사용자 메시지(첫 번째 및 세 번째 메시지)를 마스킹합니다.
+ `reward_category`는 평가할 모델 성능의 측면을 식별하는 문자열입니다. 이것은 훈련 중에 적절한 보상 모델 범주를 선택하는 데 사용됩니다. `default`, `math`, `coding`, `if`, `rag` 및 `rai`와 같은 보상 범주를 사용할 수 있습니다.
+ `meta_data`는 추가 컨텍스트 또는 실측 정보가 포함된 선택적 객체입니다. 여기에는 식별자, 소스 정보 또는 대화 컨텍스트가 포함될 수 있습니다. 구조는 데이터세트 요구 사항에 따라 유연합니다.

다음은 예시 레코드입니다.

```
{
    "turns": ["You are a helpful AI assistant.",
        "User: What is ML? Bot:",
        "Machine learning is...", "User: Examples? Bot:",
        "Email spam filtering is..."
    ],
    "turns_to_mask": [0, 1, 3],
    "reward_category": "default",
    "meta_data": {
        "messages": [{
                "role": "system",
                "content": "You are a helpful AI assistant."
            },
            {
                "role": "user",
                "content": "What is ML?"
            },
            {
                "role": "assistant",
                "content": "Machine learning is..."
            },
            {
                "role": "user",
                "content": "Examples?"
            },
            {
                "role": "assistant",
                "content": "Email spam filtering is..."
            }
        ]
    }
}
```

보상 모델링 프레임워크는 고유한 범주형 목표에 다차원 최적화를 구현하여 강력한 모델 수렴을 촉진합니다. 보상 범주는 모델을 최적화해야 하는 대상 태스크에 따라 선택해야 합니다.

태스크에 적합한 프레임워크를 선택하려면 다음 지침을 따르는 것이 좋습니다.
+ `default`: 표준 대화 태스크 및 기본 상호 작용을 위한 범용 옵티마이저입니다. 일반적인 대화 및 토론, 기본적인 글쓰기, 간단한 질문 답변 및 전문 지식이 필요하지 않은 정보 쿼리에 사용됩니다.

  다음 예를 참고하세요

  ```
  {
      "turns": ["Write a summary of climate change"],
      "turns_to_mask": [0],
      "reward_category": "default"
  }
  ```
+ `math`: 수학적 계산 및 수치 추론 태스크에 특화된 옵티마이저입니다. 수학 문제 해결, 산술 계산, 대수 방정식, 기하학 문제 및 통계 분석에 사용됩니다.

  다음 예를 참고하세요

  ```
  {
      "turns": ["Calculate the derivative of x²"],
      "turns_to_mask": [0],
      "reward_category": "math"
  }
  ```
+ `coding`: 프로그래밍 및 소프트웨어 개발 관련 쿼리 전용 범주입니다. 코드 구현, 디버깅 지원, 알고리즘 설계, 기술 문서 작성 및 시스템 아키텍처 질문에 사용됩니다.

  다음 예를 참고하세요

  ```
  {
      "turns": ["Write a function to check if a string is palindrome"],
      "turns_to_mask": [0],
      "reward_category": "coding"
  }
  ```
+ `if`: 정확한 절차 수행과 단계별 안내가 필요한 태스크를 위한 범주입니다. 다단계 절차, 순차적 지시, 복잡한 태스크 분해 및 프로세스 문서화에 사용됩니다.

  다음 예를 참고하세요

  ```
  {
      "turns": ["Provide steps to deploy a web application"],
      "turns_to_mask": [0],
      "reward_category": "if"
  }
  ```
+ `rag`: 검색된 컨텍스트 정보를 기반으로 쿼리에 응답해야 하는 태스크를 위한 보상 범주입니다. 제공된 참조 자료에서 직접 응답을 도출해야 하는 경우에 사용됩니다. 사실에 기반한 내용을 종합하되 검색된 정보의 범위를 벗어나지 않도록 하여 일반적인 지식이 아닌 제공된 컨텍스트에 근거한 답변이 생성되도록 보장합니다.

  다음 예를 참고하세요

  ```
  {
              "turns": ["The Synthesis Report integrates findings from all six IPCC assessment cycles, revealing that global surface temperature has increased 1.1°C from 1850-1900 to 2011-2020, with human activities unequivocally identified as the cause of this warming. Alarmingly, current policies put the world on track for 3.2°C warming by 2100. The document identifies 5 key climate system "tipping points" approaching and emphasizes that greenhouse gas emissions must decline 43% by 2030 (compared to 2019 levels) to limit warming to 1.5°C. Climate-related risks will escalate with every increment of warming, with loss and damage disproportionately affecting vulnerable populations. Despite some progress, climate adaptation remains uneven with significant gaps, and financial flows continue to fall below levels needed for mitigation goals.",
              "What were the key findings of the latest IPCC climate report?"],
              "turns_to_mask": [0, 0],
              "reward_category": "rag"
              }
  ```
+ `rai`: 공정성, 투명성, 윤리와 같은 책임 있는 AI 원칙을 적용해야 하는 태스크를 위한 보상 범주입니다. AI 시스템의 잠재적 편향을 평가하고, 프라이버시를 보호하며, 윤리적 딜레마를 해결하고, 포괄적인 설계 원칙을 장려하는 데 사용됩니다.

  다음 예를 참고하세요

  ```
  {
              "turns": ["Identify potential bias concerns when developing a loan approval algorithm and suggest mitigation strategies"],
              "turns_to_mask": [0],
              "reward_category": "rai"
              }
  ```

**턴 마스킹**  
훈련 데이터세트에서 `turns_to_mask` 파라미터는 훈련 중에 어떤 대화 턴이 그라디언트 업데이트를 받을지 제어하는 핵심 요소입니다. 이 인덱스 배열은 모델이 어떤 대화 부분을 학습 대상으로 삼을지 그리고 어떤 부분을 단순히 컨텍스트로 처리할지 결정합니다. 마스킹을 적절하게 사용하면 모델이 적절한 응답 패턴을 학습하는 동시에 성능을 저하시킬 수 있는 시스템 프롬프트 또는 사용자 입력에 대한 훈련을 피할 수 있습니다.

다음은 권장하는 마스킹 지침입니다.
+ **항상 인덱스 0 마스킹** - 시스템 프롬프트에 그라디언트 업데이트가 적용되어서는 안 됩니다.
+ **항상 사용자 턴 마스킹** - 모델이 사용자 입력을 생성하는 것을 학습하지 못하도록 합니다.
+ **패턴 일관성** - 유사한 대화 구조에 동일한 마스킹 패턴을 사용합니다(예: 멀티턴 대화의 경우 (0, 1, 3, 5)).
+ **선택적 훈련** - 초기 봇 응답을 마스킹하여 훈련을 개선된 최종 응답에 집중합니다.
+ **생각의 사슬 보존** - 추론 시퀀스를 훈련할 때는 시스템 턴과 사용자 턴만 마스킹합니다.
+ **품질 필터링** - 성능 저하를 방지하기 위해 품질이 낮은 어시스턴트 응답을 마스킹합니다.
+ **컨텍스트 최적화** - 마스킹된 턴이 후속 응답에 필요한 필수 컨텍스트를 제거하지 않도록 합니다.

효과적인 마스킹의 핵심은 훈련 지표와 검증 성능을 모니터링하여 마스킹 전략이 원하는 모델 출력에 그라디언트 업데이트를 집중하면서 필요한 컨텍스트를 보존하는지 여부를 식별하는 것입니다.

**KL 발산 손실 활성화**  
KL 발산 손실을 활성화하려면 현재 정책이 원래 분포로부터 얼마나 발산되었는지 계산하기 위해 앵커 서버를 활성화 해야 합니다. KL 손실 유형을 지정해야 하며 계수는 0이 아닌 값이어야 합니다. 계수 값을 크게 설정하면 모델이 원래 정책에서 크게 벗어나지 않아 결과적으로 일반적 성능의 변화가 더 적습니다. 계수 값을 작게 설정하면 이전 정책과 더 큰 편차가 발생하여 대상 지표의 성능은 향상되지만 일반적 성능에는 영향을 미칩니다.

```
ppo_anchor:
  max_length: 8192
  trainer:
    num_nodes: ${recipes.run.cm_replicas}
  model:
    global_batch_size: 32

ppo_actor_train:
  model:
    ######## Use KL in actor loss ########
    kl_loss_type: low_var_kl
    kl_loss_coeff: 0.1

    ######## Use KL in reward model ######
    kl_reward_penalty_coeff: 0.1
```

**학습률**  
비평가 및 정책 모델의 학습률을 조정할 수 있으며, 기본값은 3e-6으로 적절한 균형을 제공합니다. 학습률이 너무 높으면 일반적으로 훈련 불안정이 발생하며, 이는 KL 발산 스파이크 및 불규칙한 정책 동작을 통해 식별할 수 있습니다. 반대로 학습률이 너무 낮으면 수렴 문제가 발생하거나 학습 속도가 느려질 수 있는데, 이는 보상 정체와 최소한의 정책 업데이트로 알 수 있습니다. KL 발산, 보상 점수 및 가치 손실을 정기적으로 모니터링하면 훈련 중에 학습률을 조정할지 여부를 결정하는 데 도움이 됩니다.

```
ppo_critic:
  model:
    optim:
      lr: 3e-6

ppo_actor_train:
  model:
    optim:
      lr: 3e-06
```

**글로벌 배치 크기**  
글로벌 배치 크기는 Amazon Nova의 PPO 성능에 상당한 영향을 미치는데, 배치 크기가 클수록 일반적으로 훈련 안정성과 그라디언트 추정이 향상되고 병렬 처리 효율도 높아집니다. 그러나 너무 큰 배치 크기는 훈련 효율 감소로 이어질 수 있으며, 가용 메모리 제약으로 인해 학습률 및 기타 하이퍼파라미터와의 신중한 균형 조정이 필요합니다.

```
ppo_actor_train:
  model:
    global_batch_size: 160
```

PPO를 통해 조정할 수 있는 Amazon Nova 파라미터는 다음과 같습니다.
+ **실행 구성**
  + `actor_train_replicas`: 액터 훈련 모델에 사용할 컴퓨팅 인스턴스 수입니다. 사용 가능한 값은 선택한 모델에 따라 다릅니다. Amazon Nova Micro는 1개 또는 2개의 복제본을 지원합니다. Amazon Nova Lite는 1개, 2개 또는 4개의 복제본을 지원합니다. Amazon Nova Pro는 3개, 6개 또는 12개의 복제본을 지원합니다.
  + `rm_replicas`: 보상 모델에 사용되는 컴퓨팅 인스턴스 수입니다. 모든 모델 크기에 1개의 복제본을 사용하는 것이 좋습니다.
  + `cm_replicas`: 비평가 모델에 사용되는 컴퓨팅 인스턴스 수입니다. 모든 모델 크기에 1개의 복제본을 사용하는 것이 좋습니다.
  + `actor_generation_replicas`: 액터 생성에 사용되는 컴퓨팅 인스턴스 수입니다. 사용 가능한 값은 선택한 모델에 따라 다릅니다. Amazon Nova Micro는 1개의 복제본을 지원합니다. Amazon Nova Lite는 1개 또는 2개의 복제본을 지원합니다. Amazon Nova Pro는 1개 또는 2개의 복제본을 지원합니다.
  + `am_replicas`: 앵커 모델에 사용되는 컴퓨팅 인스턴스 수입니다. 모든 모델 크기에 1개의 복제본을 사용하는 것이 좋습니다.
+ **액터 훈련 구성(정책 구성)**
  + `max_steps`: 액터 훈련 모델을 미세 조정하거나 훈련하는 최대 단계 수입니다. 여기서 한 단계는 롤아웃을 수행한 후 `global_batch_size`에 해당하는 액터 훈련 모델을 훈련하는 과정으로 정의됩니다. 하나의 에포크는 `global_batch_size * trajectory_buffer_scale`로 정의됩니다.

    여기에서 선택한 값은 사용 사례 및 데이터세트 복잡성에 따라 달라집니다. 권장 시작점은 65개 에포크 또는 520개 단계로, 이 단계 값은 에포크 수에 `trajectory_buffer_scale` 값을 곱해 계산된 것입니다. 그러나 일부 태스크는 동일한 성능을 달성하려면 더 긴 PPO 훈련 시간이 필요합니다.

    PPO의 경우 [ml-flow](https://docs.aws.amazon.com/sagemaker/latest/dg/mlflow-create-tracking-server.html) 콘솔의 훈련 지표(예: 보상 모델 점수의 포화 및 평균 행동 길이)는 평가를 위한 최적의 지점을 식별하는 데 도움이 될 수 있습니다.
  + `actor_model_max_length`: 완료를 생성하기 위해 액터 생성 구성 요소로 전송되는 입력 데이터의 최대 길이입니다.
  + `reward_model_max_length`: 완료를 평가하기 위해 보상 서버로 전송되는 입력 데이터의 최대 길이입니다.
  + `trajectory_buffer_scale`:이 버퍼는 가중치를 업데이트하고 새 롤아웃을 생성하기 전에 이전 액터 훈련(정책) 모델을 사용하여 생성된 롤아웃 수를 나타냅니다. 지원되는 값은 1, 2, 4, 8 및 16입니다.

    `trajectory_buffer_scale`이 1이면 훈련은 온-폴리시 방식으로 수행됩니다. 즉, 롤아웃은 가장 업데이트된 모델 가중치로 생성되지만 처리량은 떨어집니다. 반면 값을 16으로 설정하면 모델은 다소 오프-폴리시 상태가 되지만 처리량은 더 높아집니다. 각 모델에 대해 8로 시작하는 것이 좋습니다.
  + `kl_reward_penalty_coeff`: 업데이트가 너무 급격하게 이루어지지 않도록 하고 정책이 기본 또는 SFT 모델에서 벗어나지 않도록 보장하는 KL 발산 항입니다.
  + `kl_loss_coeff`:이 값은 KL 발산 페널티가 PPO의 전체 훈련 목표에 미치는 영향을 제어합니다.
  + `kl_loss_type`:이 값은 현재 정책 분포와 참조 정책 분포 간의 발산을 계산하는 방법을 지정합니다. 사용 가능한 `kl_loss_types`은 `kl`(표준 KL 발산), `mse`(평균 제곱 오차), `abs`(로그 확률 간 절대 차이) 및 `low_var_kl`(저분산 KL 근사)입니다.
  + `model.clip_ratio`: PPO의 액터 클립 비율(ε)은 각 업데이트 동안의 정책 변경 정도를 제한하는 하이퍼파라미터입니다.
  + `model.optim.lr`: 액터 모델의 대리 모델 손실 훈련에 사용되는 학습률입니다.
  + `model.lam`: 이점 추정 프로세스의 일부입니다. λ 값이 클수록 장기 보상에 더 많은 가중치가 부여되지만 분산이 커집니다. 반대로 λ 값이 작으면 즉각적인 보상에 더 집중하게 되고 분산은 작아지지만 편향이 커집니다.
  + `model.ent_coeff`: PPO의 엔트로피 손실은 정책이 너무 결정론적으로 변할 때(즉, 항상 높은 신뢰도로 동일한 행동을 선택할 때) 정책에 페널티를 적용하여 탐색을 장려합니다.
+ **보상 모델 구성**
  + `global_batch_size`: 보상 모델을 사용하여 완료 점수를 매기기 위한 배치 크기입니다. `ppo_actor_train.model.global_batch_size`가 `ppo_reward.model.global_batch_size`보다 크면 여러 배치로 나누어 처리됩니다. 단, `ppo_actor_train.model.global_batch_size % ppo_reward.model.global_batch_size`는 0이어야 합니다.
  + `max_length`: 보상 모델의 최대 컨텍스트 길이입니다. 이 값은 `ppo_actor_train.model.max_length`와 동일해야 합니다.
+ **비평가 모델 구성**
  + `global_batch_size`: 비평가 모델 값의 배치 크기입니다. 비평가 모델은 액터 모델에서 제공하는 응답의 각 토큰에 대한 값 추정치를 제공합니다. 이 배치 크기는 추론과 훈련 모두에 사용됩니다.

    단, `ppo_actor_train.model.global_batch_size % ppo_critic.model.global_batch_size`는 0이어야 하며 다음이 참이어야 합니다. `ppo_actor_train.model.global_batch_size * ppo_actor_train.model.trajectory_buffer_size % ppo_critic.model.global_batch_size == 0`.
  + `max_length`: 비평가 모델의 최대 컨텍스트 길이입니다. 이 값은 `ppo_actor_train.model.max_length`와 동일해야 합니다.
  + `model.optim.lr`: 액터 모델의 대리 모델 손실 훈련에 사용되는 학습률입니다.
+ **앵커 모델 구성**
  + `global_batch_size`: 고정된 SFT 또는 앵커 모델의 logp를 생성하기 위한 배치 크기입니다. 단, `ppo_actor_train.model.global_batch_size % ppo_anchor.model.global_batch_size`는 0이어야 합니다.
  + `max_length`: 보상 모델의 최대 컨텍스트 길이입니다. 이 값은 `ppo_actor_train.model.max_length`와 동일해야 합니다.
+ **액터 생성 모델 구성**
  + `actor_model_max_length`: 액터 모델 생성 구성 요소의 최대 컨텍스트 길이입니다. 이 값은 `ppo_actor_train.model.max_length`와 동일해야 합니다.

**PPO 레시피**  
다음은 PPO의 레시피입니다.

```
## Run config
run:
  name: ndry-ppo-pro
  model_type: amazon.nova-pro-v1:0:300k
  model_name_or_path: nova-pro/prod
  data_s3_path: s3://testing/train.jsonl # Your training data S3 path

  actor_train_replicas: 6 # Actor train model replicas
  rm_replicas: 1 # Reward model replicas
  cm_replicas: 1 # Critic model replicas
  actor_generation_replicas: 2 # Actor generation model replicas
  am_replicas: 1 # Anchor model replicas

## Training config for each PPO component
ppo_reward:
  max_length: 8192 # model architecture max length
  trainer:
    num_nodes: ${recipes.run.rm_replicas}
  model:
    global_batch_size: 16

ppo_critic:
  max_length: 8192
  trainer:
    num_nodes: ${recipes.run.cm_replicas}
  model:
    global_batch_size: 16
    optim:
      lr: 3e-6
      name: distributed_fused_adam
      adam_w_mode: true
      eps: 1e-06
      weight_decay: 0.0
      betas:
        - 0.9
        - 0.999

ppo_anchor:
  max_length: 8192
  trainer:
    num_nodes: ${recipes.run.am_replicas}
  model:
    global_batch_size: 16

ppo_actor_generation:
  actor_model_max_length: 8192
  trainer:
    num_nodes: ${recipes.run.actor_generation_replicas}

ppo_actor_train:
  max_length: 8192
  max_steps: 520 # Stopping criteria Desired epoch num * trajectory_buffer_scale
  actor_model_max_length: 8192 # truncate input data to max length
  reward_model_max_length: 8192 # truncate input data to max length
  trajectory_buffer_scale: 8
  trainer:
    num_nodes: ${recipes.run.actor_train_replicas}
  model:
    global_batch_size: 160
    ent_coeff: 0
    clip_ratio: 0.2
    lam: 1
    kl_loss_coeff: 0.0
    kl_loss_type: low_var_kl
    kl_reward_penalty_coeff: 0.0
    hidden_dropout: 0.0 # Dropout probability for hidden state transformer.
    attention_dropout: 0.0 # Dropout probability in the attention layer.
    ffn_dropout: 0.0 # Dropout probability in the feed-forward layer.
    optim:
      lr: 3e-06
      name: distributed_fused_adam # only this one is available for p0.
      adam_w_mode: true
      eps: 1e-08
      weight_decay: 0.0
      betas:
        - 0.9
        - 0.999
```

**제한 사항**  
PPO에는 다음과 같은 제한 사항이 있습니다.
+ 중간 체크포인트는 평가를 위해 저장되지 않으며 중간 체크포인트에서 재개할 수 없습니다. 마지막 체크포인트만 저장됩니다.
+ 멀티모달 데이터세트는 지원되지 않습니다.
+ 훈련 작업은 자동으로 중지되지 않습니다. SageMaker HyperPod CLI를 사용하여 작업을 중지해야 합니다.
+ TensorBoard에서는 비평가 훈련 지표가 지원되지 않습니다.
+ 하이퍼파라미터를 조정하려면 [하이퍼파라미터 선택](https://docs.aws.amazon.com/nova/latest/userguide/customize-fine-tune-hyperparameters.html)의 지침을 따릅니다.