

# 지도 미세 조정(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 2.0을 선택합니다.
+ 고급 추론 기능을 갖춘 뛰어난 성능이 필요한 경우
+ 다국어 지원 또는 복잡한 태스크를 처리해야 하는 경우
+ 코딩, 도구 직접 호출 또는 분석 태스크에 대한 더 나은 결과가 필요한 경우

# Nova 2.0에서 SFT
<a name="nova-sft-2-fine-tune"></a>

Amazon Nova Lite 2.0은 고급 추론 모드, 향상된 멀티모달 이해, 확장된 컨텍스트 처리 등 지도 미세 조정을 위한 향상된 기능을 제공합니다. Nova 2.0에서 SFT를 사용하면 복잡한 태스크에서 모델의 뛰어난 성능을 유지하면서 이러한 강력한 기능을 특정 사용 사례에 맞게 조정할 수 있습니다.

Nova 2.0에서 SFT의 주요 기능은 다음과 같습니다.
+ **추론 모드 지원**: 향상된 분석 기능에 대한 최종 답변 전에 명시적 추론 트레이스를 생성하도록 모델을 훈련합니다.
+ **고급 멀티모달 훈련**: 향상된 정확도로 문서 이해(PDF), 비디오 이해 및 이미지 기반 태스크를 미세 조정합니다.
+ **도구 직접 호출 기능**: 복잡한 워크플로에 대한 외부 도구 및 함수 직접 호출을 효과적으로 사용하도록 모델을 훈련합니다.
+ **확장된 컨텍스트 지원**: 문서 집약적인 애플리케이션의 안정성과 정확도를 높여 더 긴 컨텍스트 기간을 활용합니다.

**참고**  
사용할 컨테이너 이미지 또는 레시피 예제에 대한 자세한 내용은 [ Amazon Nova 레시피](nova-model-recipes.md)를 참조하세요.

**Topics**
+ [추론 모드 선택(Nova 2.0만 해당)](#nova-sft-2-reasoning-mode)
+ [도구 직접 호출 데이터 형식](#nova-sft-2-tool-calling)
+ [문서 이해 데이터 형식](#nova-sft-2-document-understanding)
+ [SFT에 대한 비디오 이해](#nova-sft-2-video-understanding)
+ [데이터 업로드 지침](#nova-sft-2-data-upload)
+ [미세 조정 작업 생성](#nova-sft-2-creating-job)
+ [SFT 조정 파라미터](#nova-sft-2-tuning-parameters)
+ [하이퍼파라미터 지침](#nova-sft-2-hyperparameters)

## 샘플 SFT 레시피
<a name="nova-sft-2-sample-recipe"></a>

다음은 SFT에 대한 샘플 레시피입니다. 이 레시피 및 기타 레시피는 [레시피](https://github.com/aws/sagemaker-hyperpod-recipes/tree/main/recipes_collection/recipes/fine-tuning/nova) 리포지토리에서 찾을 수 있습니다.

```
run:
  name: my-full-rank-sft-run
  model_type: amazon.nova-2-lite-v1:0:256k
  model_name_or_path: nova-lite-2/prod
  data_s3_path: s3://my-bucket-name/train.jsonl  #  only and not compatible with SageMaker Training Jobs
  replicas: 4                                     # Number of compute instances for training, allowed values are 4, 8, 16, 32
  output_s3_path: s3://my-bucket-name/outputs/    # Output artifact path (HyperPod job-specific; not compatible with standard SageMaker Training Jobs)
  mlflow_tracking_uri: ""                         # Required for MLFlow
  mlflow_experiment_name: "my-full-rank-sft-experiment"  # Optional for MLFlow. Note: leave this field non-empty
  mlflow_run_name: "my-full-rank-sft-run"         # Optional for MLFlow. Note: leave this field non-empty

training_config:
  max_steps: 100                    # Maximum training steps. Minimal is 4.
  save_steps: ${oc.select:training_config.max_steps}  # How many training steps the checkpoint will be saved
  save_top_k: 5                     # Keep top K best checkpoints. Note supported only for  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
    adam_beta2: 0.95                 # Exponential decay rate for second-moment estimates

  peft:                             # Parameter-efficient fine-tuning (LoRA)
    peft_scheme: "null"             # Disable LoRA for PEFT
```

## 추론 모드 선택(Nova 2.0만 해당)
<a name="nova-sft-2-reasoning-mode"></a>

Amazon Nova 2.0은 향상된 분석 기능에 대한 추론 모드를 지원합니다.
+ **추론 모드(활성화됨)**:
  + 훈련 구성에서 `reasoning_enabled: true` 설정
  + 최종 답변 전에 추론 트레이스를 생성하도록 모델 훈련
  + 복잡한 추론 태스크의 성능 개선
+ **비추론 모드(비활성화됨)**:
  + `reasoning_enabled: false` 설정 또는 파라미터 생략(기본값)
  + 명시적 추론이 없는 표준 SFT
  + 단계별 추론의 이점을 얻지 못하는 태스크에 적합

**참고**  
추론이 활성화되면 높은 수준의 추론 노력으로 작동합니다. SFT에는 낮은 추론 옵션이 없습니다.
SFT에서 멀티모달 추론 콘텐츠는 지원되지 않습니다. 추론 모드는 텍스트 전용 입력에 적용됩니다.

### 비추론 데이터세트와 함께 추론 모드 사용
<a name="nova-sft-2-reasoning-non-reasoning-data"></a>

`reasoning_enabled: true`를 사용하여 비추론 데이터세트에서 Nova 훈련이 허용됩니다. 그러나 Amazon Nova는 주로 추론을 적용하지 않고 데이터에 표시된 응답을 생성하는 방법을 배우기 때문에 이 경우 모델이 추론 기능을 상실할 수 있습니다.

비추론 데이터세트에서 Amazon Nova를 훈련하지만 유추 중에 추론을 계속 사용하려는 경우:

1. 훈련 중 추론 비활성화(`reasoning_enabled: false`)

1. 추론 중 나중에 추론 활성화

이 접근 방식에서는 유추 시 추론을 허용하지만 추론이 없는 유추와 비교했을 때 성능 개선을 보장하지 않습니다.

**모범 사례:** 추론 데이터세트를 사용할 때는 훈련 및 유추 모두에 대한 추론을 활성화하고, 비추론 데이터세트를 사용할 때는 둘 다에 대해 추론을 비활성화합니다.

**참고**  
사용할 컨테이너 이미지 또는 레시피 예제에 대한 자세한 내용은 [ Amazon Nova 레시피](nova-model-recipes.md)를 참조하세요.

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

SFT는 도구를 사용하기 위한 모델 훈련(함수 직접 호출)을 지원합니다. 다음은 도구 직접 호출에 대한 샘플 입력 형식입니다.

**샘플 입력:**

```
{
  "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?"
        }
      ]
    }
  ]
}
```

도구 직접 호출 데이터에 대한 중요 고려 사항:
+ ToolUse는 어시스턴트 턴에만 표시되어야 함
+ ToolResult는 사용자 턴에만 표시되어야 함
+ ToolResult는 텍스트 또는 JSON 전용이어야 하며, 다른 양식은 현재 Amazon Nova 모델에서 지원되지 않음
+ toolSpec 내 inputSchema는 유효한 JSON 스키마 객체여야 함
+ 각 ToolResult는 이전 어시스턴트 ToolUse에서 유효한 toolUseId를 참조해야 하며, 이때 각 toolUseId는 대화당 정확히 한 번만 사용됨

**참고**  
사용할 컨테이너 이미지 또는 레시피 예제에 대한 자세한 내용은 [ Amazon Nova 레시피](nova-model-recipes.md)를 참조하세요.

## 문서 이해 데이터 형식
<a name="nova-sft-2-document-understanding"></a>

SFT는 문서 이해 작업에 대해 모델 훈련을 지원합니다. 다음은 샘플 입력 형식입니다.

**샘플 입력**

```
{
  "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": [
        {
          "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?"
        }
      ],
      "reasoning_content": [
        {
          "text": "I need to find the relevant section in the document to answer the question.",
          "type": "text"
        }
      ]
    }
  ]
}
```

문서 이해에 대한 중요 고려 사항:
+ PDF 파일만 지원됨
+ 최대 문서 크기는 10MB임
+ 샘플에는 문서와 텍스트가 포함될 수 있지만, 문서를 다른 양식(예: 이미지 또는 비디오)과 혼합할 수는 없음

**참고**  
사용할 컨테이너 이미지 또는 레시피 예제에 대한 자세한 내용은 [ Amazon Nova 레시피](nova-model-recipes.md)를 참조하세요.

## SFT에 대한 비디오 이해
<a name="nova-sft-2-video-understanding"></a>

SFT는 비디오 이해 태스크에 대해 모델 미세 조정을 지원합니다. 다음은 샘플 입력 형식입니다.

**샘플 입력**

```
{
  "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": [
        {
          "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?"
        }
      ],
      "reasoning_content": [
        {
          "text": "I need to find the relevant section in the video to answer the question.",
          "type": "text"
        }
      ]
    }
  ]
}
```

비디오 이해에 대한 중요 고려 사항:
+ 비디오는 최대 50MB일 수 있음
+ 비디오 길이는 최대 15분일 수 있음
+ 샘플당 하나의 비디오만 허용되며 동일한 샘플에서 여러 비디오는 지원되지 않음
+ 샘플에는 비디오와 텍스트가 포함될 수 있지만, 비디오를 다른 양식(예: 이미지 또는 문서)과 혼합할 수는 없음

**참고**  
사용할 컨테이너 이미지 또는 레시피 예제에 대한 자세한 내용은 [ Amazon Nova 레시피](nova-model-recipes.md)를 참조하세요.

## 데이터 업로드 지침
<a name="nova-sft-2-data-upload"></a>

훈련 및 검증 데이터세트를 S3 버킷에 업로드합니다. 레시피의 `run` 블록에서 다음 위치를 지정합니다.

```
## Run config
run:
  ...
  data_s3_path: "s3://<bucket-name>/<training-directory>/<training-file>.jsonl"
```

**참고**: `<bucket-name>`, `<training-directory>`, `<validation-directory>`, `<training-file>`, `<validation-file>`을 실제 S3 경로로 바꿉니다.

**참고**: 현재 검증 데이터세트는 Amazon Nova 2.0을 사용하는 SFT에 대해 지원되지 않습니다. 검증 데이터세트가 제공되면 무시됩니다.

## 미세 조정 작업 생성
<a name="nova-sft-2-creating-job"></a>

`run` 블록의 `model_type` 및 `model_name_or_path` 필드를 사용하여 기본 모델을 정의합니다.

```
## Run config
run:
  ...
  model_type: amazon.nova-2-lite-v1:0:256k
  model_name_or_path: nova-lite-2/prod
  ...
```

## SFT 조정 파라미터
<a name="nova-sft-2-tuning-parameters"></a>

SFT를 통해 조정할 수 있는 파라미터로 다음이 포함됩니다.

**실행 구성**  

+ **name**: 훈련 작업을 설명하는 이름입니다. AWS Management Console에서 작업을 식별하는 데 도움이 됩니다.
+ **model\$1type**: 사용할 Amazon Nova 모델 변형입니다. 사용할 수 있는 옵션은 `amazon.nova-2-lite-v1:0:256k`입니다.
+ **model\$1name\$1or\$1path**: 훈련에 사용할 기본 모델의 경로입니다. 사용 가능한 옵션은 `nova-lite-2/prod` 또는 사후 훈련 체크포인트의 S3 경로(`s3://customer-escrow-bucket-unique_id/training_run_name`)입니다.
+ **replicas**: 분산 훈련에 사용할 컴퓨팅 인스턴스의 수입니다. 사용 가능한 값은 선택한 모델에 따라 다릅니다. Amazon Nova Lite 2.0은 4개, 8개, 16개 또는 32개의 복제본을 지원합니다.
+ **data\$1s3\$1path**: 훈련 데이터세트(JSONL 파일)의 S3 위치입니다. 이 파일은 클러스터와 동일한 AWS 계정 및 리전에 있어야 합니다. 제공된 모든 S3 위치는 동일한 계정 및 리전에 있어야 합니다.
+ **validation\$1data\$1s3\$1path**: (선택 사항) 검증 데이터세트(JSONL 파일)의 S3 위치입니다. 이 파일은 클러스터와 동일한 계정 및 리전에 있어야 합니다. 제공된 모든 S3 위치는 동일한 계정 및 리전에 있어야 합니다.
+ **output\$1s3\$1path**: 매니페스트 및 TensorBoard 로그가 저장되는 S3 위치입니다. 제공된 모든 S3 위치는 동일한 AWS 계정 및 AWS 리전에 있어야 합니다.
+ **mlflow\$1tracking\$1uri**: MLFlow 로깅에 사용할 MLFlow 앱의 ARN입니다.
+ **mlflow\$1experiment\$1name**: MLFlow 실험 이름입니다.
+ **mlflow\$1run\$1name**: MLFlow 실행 이름입니다.

**훈련 구성**  

+ **max\$1steps**: 실행할 훈련 단계 수입니다. 각 단계는 `global_batch_size`개의 요소를 사용하여 모델을 훈련합니다.
+ **save\$1steps**: 훈련 중에 모델 체크포인트를 저장할 빈도(단계)입니다.
+ **save\$1top\$1k**: 검증 지표를 기반으로 유지할 최적의 최대 체크포인트 수입니다.
+ **max\$1length**: 토큰 단위의 최대 시퀀스 길이입니다. 이는 훈련을 위한 컨텍스트 창 크기를 결정합니다. SFT에 대해 지원되는 최대 값은 32,768개의 토큰입니다.

  시퀀스가 길어지면 훈련 효율성이 향상되지만 메모리 요구 사항이 증가합니다. max\$1length 파라미터를 데이터 분포와 일치시키는 것이 좋습니다.
+ **global\$1batch\$1size**: 모든 디바이스 및 워커에서 한 번의 순방향 또는 역방향 패스 동안 함께 처리되는 전체 훈련 샘플 수입니다.

  이 값은 디바이스당 배치 크기와 디바이스 수를 곱한 값입니다. 이는 훈련의 안정성과 처리량에 영향을 미칩니다. 메모리 내에서 적절한 배치 크기로 시작하여 점진적으로 스케일 업하는 것이 좋습니다. 도메인별 데이터의 경우 배치 크기가 크면 그라디언트가 과도하게 평활화될 수 있습니다.
+ **reasoning\$1enabled**: 훈련 중에 추론 기능을 활성화하는 부울 플래그입니다.

**학습률 스케줄러**  

+ **warmup\$1steps**: 학습률을 점진적으로 높이는 단계 수입니다. 이는 훈련의 안정성을 향상시킵니다.
+ **min\$1lr**: 감소 종료 시의 최소 학습률입니다. 유효한 값은 0\$11이지만 설정된 학습률보다 작아야 합니다.

**옵티마이저 구성**  

+ **lr**: 최적화 동안 단계 크기를 제어하는 학습률입니다. 성능 향상을 위해 1e-6에서 1e-4 사이의 값을 권장합니다. 유효한 값은 0\$11입니다.
+ **weight\$1decay**: L2 정규화 강도입니다. 값이 높을수록(0.01에서 0.1 사이) 정규화가 증가합니다.
+ **adam\$1beta1**: Adam 옵티마이저의 첫 번째 순간 추정치에 대한 지수 감소율입니다. 기본값은 0.9입니다.
+ **adam\$1beta2**: Adam 옵티마이저의 두 번째 순간 추정치에 대한 지수 감소율입니다. 기본값은 0.95입니다.

**PEFT 구성**  

+ **peft\$1scheme**: 사용할 파라미터 효율 미세 조정 스키마입니다. 옵션은 전체 순위 미세 조정의 경우 `'null'` 또는 LoRA 기반 미세 조정의 경우 `lora`입니다.

**LoRA 조정(peft\$1scheme이 'lora'인 경우)**  

+ **alpha**: LoRA 조정 파라미터입니다. 하위 순위 적응의 크기를 제어합니다. 일반적 값은 8\$1128입니다.
+ **lora\$1plus\$1lr\$1ratio**: LoRA\$1 최적화에 대한 학습률입니다. 이 승수는 특별히 LoRA 파라미터에 대한 학습률을 조정합니다.

## 하이퍼파라미터 지침
<a name="nova-sft-2-hyperparameters"></a>

훈련 접근 방식에 따라 다음과 같은 권장 하이퍼파라미터를 사용합니다.

**전체 순위 훈련**
+ **에포크**: 1
+ **학습률(lr)**: 1e-5
+ **최소 학습률(min\$1lr)**: 1e-6

**저순위 적응(LoRA)**
+ **에포크**: 2
+ **학습률(lr)**: 5e-5
+ **최소 학습률(min\$1lr)**: 1e-6

**참고**: 데이터세트 크기 및 검증 성능에 따라 이러한 값을 조정합니다. 훈련 지표를 모니터링하여 과적합을 방지합니다.