

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

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

직접 선호 최적화(DPO)는 페어링된 비교 데이터를 사용하여 모델 출력을 인적 선호도에 맞추도록 조정하는 방식으로 파운데이션 모델을 미세 조정하는 조정 기법입니다. 강화 학습 방법과 달리 DPO는 어떤 응답이 더 바람직한지에 대한 사람의 피드백을 기반으로 모델 동작을 직접 최적화하여 보다 안정적이고 확장 가능한 접근 방식을 제공합니다.

**DPO를 사용하는 이유**

파운데이션 모델은 사실상 정확한 출력을 생성할 수 있지만, 특정 사용자 요구, 조직의 가치, 안전 요구 사항과 일치하지 않을 수 있습니다. DPO는 다음을 지원하며 이 문제를 해결합니다.
+ 원하는 동작 패턴에 맞게 모델 미세 조정
+ 원치 않는 출력이나 유해한 응답 감소
+ 브랜드 톤과 커뮤니케이션 가이드라인에 맞춘 응답 정렬
+ 도메인 전문가 피드백을 기반으로 한 응답 품질 향상
+ 선호 응답 패턴을 통해 안전 가드레일 구현

**DPO의 작동 방식**

DPO는 두 가지 가능한 응답 중 어느 것이 선호되는지 인간 평가자가 표시한 쌍 예제를 사용합니다. 모델은 선호되는 응답을 생성할 가능성을 최대화하고 원치 않는 응답 가능성은 최소화하도록 학습합니다.

**DPO를 사용해야 하는 경우**

다음 시나리오에서 DPO를 사용합니다.
+ 특정 인적 선호도에 맞춘 주관적 출력 최적화
+ 모델의 어조, 스타일 또는 콘텐츠 특성 조정
+ 사용자 피드백 및 오류 분석을 기반으로 목표 개선 사항 달성
+ 다양한 사용 사례에서 일관된 출력 품질 유지
+ 선호 데이터만 사용하여 보상 없는 강화 학습으로 훈련

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

DPO는 전체 파라미터 미세 조정과 저순위 적응(LoRA)을 모두 지원합니다.


| 모델 | 지원되는 입력 | 인스턴스 유형 | 권장 인스턴스 수 | 허용된 인스턴스 수 | 
| --- | --- | --- | --- | --- | 
| Amazon Nova Micro | 텍스트 | ml.p5.48xlarge | 2 | 2, 4, 8 | 
| Amazon Nova Lite | 텍스트, 이미지 | ml.p5.48xlarge | 4 | 2, 4, 8, 16 | 
| Amazon Nova Pro | 텍스트, 이미지 | ml.p5.48xlarge | 6 | 6, 12, 24 | 

**훈련 접근 방식**
+ **전체 순위 DPO**: 모든 모델 파라미터를 업데이트합니다. 잠재적으로 더 나은 조정 품질을 제공하지만 더 많은 컴퓨팅 리소스가 필요하고 더 큰 모델을 생성합니다.
+ **LoRA DPO**: 파라미터 효율적 미세 조정을 위해 경량 어댑터를 사용합니다. 우수한 조정 품질을 유지 관리하면서 더 작은 출력 모델로 더 효율적인 훈련 및 배포를 제공합니다.

대부분의 사용 사례에서 LoRA 접근 방식은 효율성을 크게 개선하여 충분한 적응 기능을 제공합니다.

## 데이터 형식
<a name="nova-dpo-smtj-data"></a>

DPO 훈련 데이터는 마지막 어시스턴트 턴에는 `preferred` 및 `non-preferred` 레이블이 있는 기본 설정 페어가 포함되어야 한다는 점을 제외하면 SFT와 동일한 형식을 따릅니다.

### 기본 구조
<a name="nova-dpo-smtj-data-structure"></a>

마지막 어시스턴트 턴은 `content` 대신 `candidates` 배열을 사용합니다.

```
{
  "role": "assistant",
  "candidates": [
    {
      "content": [
        {
          "text": "This is the preferred response."
        }
      ],
      "preferenceLabel": "preferred"
    },
    {
      "content": [
        {
          "text": "This is the non-preferred response."
        }
      ],
      "preferenceLabel": "non-preferred"
    }
  ]
}
```

### 전체 텍스트 예제
<a name="nova-dpo-smtj-data-text-example"></a>

```
{
  "schemaVersion": "bedrock-conversation-2024",
  "system": [
    {
      "text": "You are a helpful assistant."
    }
  ],
  "messages": [
    {
      "role": "user",
      "content": [
        {
          "text": "What is the capital of France?"
        }
      ]
    },
    {
      "role": "assistant",
      "content": [
        {
          "text": "The capital of France is Paris."
        }
      ]
    },
    {
      "role": "user",
      "content": [
        {
          "text": "Tell me more about it."
        }
      ]
    },
    {
      "role": "assistant",
      "candidates": [
        {
          "content": [
            {
              "text": "Paris is the capital and largest city of France, known for the Eiffel Tower, world-class museums like the Louvre, and its rich cultural heritage."
            }
          ],
          "preferenceLabel": "preferred"
        },
        {
          "content": [
            {
              "text": "Paris is a city in France."
            }
          ],
          "preferenceLabel": "non-preferred"
        }
      ]
    }
  ]
}
```

### 이미지를 포함하는 예제
<a name="nova-dpo-smtj-data-image-example"></a>

```
{
  "schemaVersion": "bedrock-conversation-2024",
  "system": [
    {
      "text": "You are a helpful assistant."
    }
  ],
  "messages": [
    {
      "role": "user",
      "content": [
        {
          "text": "Describe this image."
        },
        {
          "image": {
            "format": "jpeg",
            "source": {
              "s3Location": {
                "uri": "s3://your-bucket/your-path/image.jpg",
                "bucketOwner": "your-aws-account-id"
              }
            }
          }
        }
      ]
    },
    {
      "role": "assistant",
      "candidates": [
        {
          "content": [
            {
              "text": "The image shows a detailed description with relevant context and observations."
            }
          ],
          "preferenceLabel": "preferred"
        },
        {
          "content": [
            {
              "text": "This is a picture."
            }
          ],
          "preferenceLabel": "non-preferred"
        }
      ]
    }
  ]
}
```

### 데이터 세트 요구 사항
<a name="nova-dpo-smtj-data-requirements"></a>
+ **형식**: 훈련을 위한 단일 JSONL 파일, 검증을 위한 단일 JSONL 파일(선택 사항)
+ **최소 크기**: 효과적인 훈련에 권장되는 선호 페어 1,000개
+ **품질**: 고품질 기본 설정 데이터로 보다 효과적인 결과 생성
+ **기타 제약 조건**: SFT와 동일합니다. 자세한 내용은 데이터세트 제약 조건을 참조하세요.

**데이터 업로드**

```
aws s3 cp /path/to/training-data/ s3://your-bucket/train/ --recursive
aws s3 cp /path/to/validation-data/ s3://your-bucket/val/ --recursive
```

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

### 일반 실행 구성
<a name="nova-dpo-smtj-recipe-run"></a>

```
run:
  name: "my-dpo-run"
  model_type: "amazon.nova-lite-v1:0:300k"
  model_name_or_path: "nova-lite/prod"
  replicas: 4
```


| 파라미터 | 설명 | 
| --- | --- | 
| name | 훈련 작업을 설명하는 이름 | 
| model\$1type | Nova 모델 변형(수정하지 않음) | 
| model\$1name\$1or\$1path | 기본 모델 경로(수정하지 않음) | 
| replicas | 분산 훈련에 대한 컴퓨팅 인스턴스 수 | 

### 훈련 구성
<a name="nova-dpo-smtj-recipe-training"></a>

```
training_config:
  max_length: 16384
  global_batch_size: 32

  trainer:
    max_epochs: 3

  model:
    hidden_dropout: 0.0
    attention_dropout: 0.0
    ffn_dropout: 0.0
```


| 파라미터 | 설명 | Range | 
| --- | --- | --- | 
| max\$1length | 토큰 단위의 최대 시퀀스 길이 | 1024\$132768 | 
| global\$1batch\$1size | 옵티마이저 단계당 샘플 | Micro/Lite/Pro: 16, 32, 64, 128. Micro/Lite: 256 | 
| max\$1epochs | 데이터세트를 통과한 훈련 | 최소: 1 | 
| hidden\$1dropout | 숨겨진 상태에 대한 드롭아웃 | 0.0\$11.0 | 
| attention\$1dropout | 관심 가중치에 대한 드롭아웃 | 0.0\$11.0 | 
| ffn\$1dropout | 피드포워드 계층에 대한 드롭아웃 | 0.0\$11.0 | 

### 옵티마이저 구성
<a name="nova-dpo-smtj-recipe-optimizer"></a>

```
model:
  optim:
    lr: 1e-5
    name: distributed_fused_adam
    adam_w_mode: true
    eps: 1e-08
    weight_decay: 0.0
    betas:
      - 0.9
      - 0.999
    sched:
      warmup_steps: 10
      constant_steps: 0
      min_lr: 1e-6
```


| 파라미터 | 설명 | Range | 
| --- | --- | --- | 
| lr | 학습률 | 0\$11(일반적으로 1e-6\$11e-4) | 
| weight\$1decay | L2 정규화 강도 | 0.0\$11.0 | 
| warmup\$1steps | 학습 속도가 점진적으로 증가하는 단계 | 0\$120 | 
| min\$1lr | 감소 종료 시의 최소 학습 속도 | 0\$11(< lr이어야 함) | 

### DPO 특정 구성
<a name="nova-dpo-smtj-recipe-dpo"></a>

```
model:
  dpo_cfg:
    beta: 0.1
```


| 파라미터 | 설명 | Range | 
| --- | --- | --- | 
| beta | 훈련 데이터 적합과 원래 모델과 가깝게 유지 사이에서 균형 | 0.001\$10.5 | 
+ **더 높은 베타(0.1)**: 더 많은 참조 모델 동작을 유지하지만 기본 설정을 더 느리게 학습할 수 있음
+ **낮은 베타(0.01\$10.05)**: 보다 적극적으로 기본 설정을 학습하지만 참조 기준과 차이를 보일 위험이 있음

**권장 사항**: `beta: 0.1`으로 시작하고 기본 설정 학습이 충분하지 않은 경우 하향 조정합니다.

### LoRA PEFT 구성
<a name="nova-dpo-smtj-recipe-lora"></a>

```
model:
  peft:
    peft_scheme: "lora"
    lora_tuning:
      loraplus_lr_ratio: 64.0
      alpha: 32
      adapter_dropout: 0.01
```


| 파라미터 | 설명 | 허용된 값 | 
| --- | --- | --- | 
| peft\$1scheme | 미세 조정 방법 | "lora" 또는 null(전체 순위) | 
| alpha | LoRA 가중치의 조정 인수 | 32, 64, 96, 128, 160, 192 | 
| loraplus\$1lr\$1ratio | LoRA\$1 학습 속도 조정 인자 | 0.0\$1100.0 | 
| adapter\$1dropout | LoRA 파라미터에 대한 정규화 | 0.0\$11.0 | 

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

**컨테이너 이미지**

```
708977205387.dkr.ecr.us-east-1.amazonaws.com/nova-fine-tune-repo:SM-TJ-DPO-latest
```

**예제 코드**

```
from sagemaker.pytorch import PyTorch
from sagemaker.inputs import TrainingInput

instance_type = "ml.p5.48xlarge"
instance_count = 4

image_uri = "708977205387.dkr.ecr.us-east-1.amazonaws.com/nova-fine-tune-repo:SM-TJ-DPO-latest"

recipe_overrides = {
    "training_config": {
        "trainer": {"max_epochs": 2},
        "model": {
            "dpo_cfg": {"beta": 0.1},
            "peft": {
                "peft_scheme": "lora",
                "lora_tuning": {
                    "loraplus_lr_ratio": 64.0,
                    "alpha": 32,
                    "adapter_dropout": 0.01,
                },
            },
        },
    },
}

estimator = PyTorch(
    output_path=f"s3://{bucket_name}/{job_name}",
    base_job_name=job_name,
    role=role,
    instance_count=instance_count,
    instance_type=instance_type,
    training_recipe="fine-tuning/nova/nova_lite_p5_gpu_lora_dpo",
    recipe_overrides=recipe_overrides,
    max_run=18000,
    sagemaker_session=sagemaker_session,
    image_uri=image_uri,
    disable_profiler=True,
    debugger_hook_config=False,
)

train_input = TrainingInput(
    s3_data=train_dataset_s3_path,
    distribution="FullyReplicated",
    s3_data_type="Converse",
)

val_input = TrainingInput(
    s3_data=val_dataset_s3_path,
    distribution="FullyReplicated",
    s3_data_type="Converse",
)

estimator.fit(inputs={"train": train_input, "validation": val_input}, wait=True)
```

## 모델 배포
<a name="nova-dpo-smtj-deploy"></a>

훈련이 완료되면 사용자 지정 모델 가져오기 기능을 사용하여 사용자 지정 모델을 Amazon Bedrock에 배포합니다. 모델은 프로비저닝된 처리량과 온디맨드 추론을 모두 지원합니다. LoRA 훈련 모델은 온디맨드 추론을 지원합니다.

배포 지침은 [사용자 지정된 모델 배포](deploy-custom-model.md)를 참조하세요.

## 제한 사항
<a name="nova-dpo-smtj-limitations"></a>
+ **입력 모달리티**: DPO는 텍스트 및 이미지만 허용합니다. 비디오 입력은 지원되지 않습니다.
+ **출력 양식**: 텍스트만
+ **기본 설정 페어**: 최종 어시스턴트 턴에는 `preferred` 및 `non-preferred` 레이블이 있는 정확히 두 개의 후보가 포함되어야 함
+ **이미지 제한**: 콘텐츠 블록당 최대 10개의 이미지
+ **혼합 모달리티**: 동일한 훈련 작업에서 텍스트, 이미지 및 비디오를 결합할 수 없음