

# 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)를 참조하세요.