Amazon Nova 모델에 대한 강화 미세 조정(RFT) - Amazon Bedrock

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

Amazon Nova 모델에 대한 강화 미세 조정(RFT)

개요

RFT란 무엇입니까?

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

RFT를 사용해야 하는 경우

명확하고 측정 가능한 성공 기준을 정의할 수 있지만 훈련에 정확한 결과를 제공하는 데 어려움을 겪는 경우 RFT를 사용합니다. 다음과 같은 경우에 적합합니다.

  • 품질이 주관적이거나 다면적인 작업(생성적 쓰기, 코드 최적화, 복잡한 추론)

  • 일부 솔루션이 다른 솔루션보다 명확하게 더 나은 여러 개의 유효한 솔루션이 있는 시나리오

  • 반복적인 개선, 개인화 또는 복잡한 비즈니스 규칙 준수가 필요한 애플리케이션

  • 레이블이 지정된 고품질 예제를 수집하는 것이 비싸거나 실용적이지 않은 경우

최상의 사용 사례

RFT는 출력 품질을 객관적으로 측정할 수 있지만 최적의 응답을 미리 정의하기 어려운 도메인에서 뛰어납니다.

  • 수학적 문제 해결 및 코드 생성

  • 과학적 추론 및 구조화된 데이터 분석

  • step-by-step 추론 또는 멀티턴 문제 해결이 필요한 작업

  • 여러 목표(정확성, 효율성, 스타일)의 균형을 맞추는 애플리케이션

  • 실행 결과 또는 성능 지표를 통해 프로그래밍 방식으로 성공을 확인할 수 있는 시나리오

지원되는 모델

Amazon Nova Lite 2.0

데이터 형식

RFT 훈련 데이터는 OpenAI 강화 미세 조정 형식을 따라야 합니다. 각 훈련 예제는 다음을 포함하는 JSON 객체입니다.

  • systemuser 역할을 사용하여 대화 턴이 있는 messages 배열

  • 보상 계산을 위한 예상 출력 또는 평가 기준이 포함된 reference_answer 필드

참고

현재 제한: 텍스트 전용. RFT에는 다중 모달 입력이 지원되지 않습니다.

예: 수학 문제

{ "id": "sample-001", "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"] } }

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

데이터 세트 크기 권장 사항

시작점

  • 최소 100개의 훈련 예제

  • 최소 100개의 평가 예제

평가 우선 접근 방식

대규모 RFT 훈련에 투자하기 전에 모델의 기준 성능을 평가합니다.

  • 고성능(95% 이상의 보상) - 모델이 이미 잘 작동하기 때문에 RFT가 필요하지 않을 수 있습니다.

  • 매우 낮은 성능(0% 보상) - 먼저 SFT로 전환하여 기본 기능을 설정합니다.

  • 중간 성능 - RFT가 적절할 가능성이 높음

작은 데이터 세트부터 시작하여 보상 함수에 버그가 없는지 확인하고, RFT가 사용 사례에 적합한 접근 방식인지 확인하고, 문제를 조기에 식별 및 수정하고, 스케일 업하기 전에 워크플로를 테스트할 수 있습니다.

효과적인 훈련 데이터의 특성

명확성 및 일관성

좋은 RFT 예제에서는 다양한 모델 출력에서 정확한 보상 계산을 가능하게 하는 명확하고 모호하지 않은 입력 데이터가 필요합니다. 일관되지 않은 형식, 모순된 레이블 또는 지침, 모호한 프롬프트, 충돌하는 참조 답변 등 데이터의 노이즈를 방지합니다. 모호하면 훈련 프로세스가 오해를 받고 모델이 의도하지 않은 동작을 학습하게 됩니다.

다양성

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

보상 함수 고려 사항

효율적인 훈련을 위해 보상 함수를 설계합니다. 몇 초(분 아님) 내에 실행되고,와 효과적으로 병렬화되고AWS Lambda, 일관되고 신뢰할 수 있는 점수를 반환하고, 다양한 유형의 모델 출력을 정상적으로 처리해야 합니다. 빠르고 확장 가능한 보상 함수를 사용하면 빠른 반복과 비용 효율적인 실험이 가능합니다.

추가 속성

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

참고

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

일반적인 추가 속성

  • task_id - 추적을 위한 고유 식별자

  • difficulty_level - 문제 복잡성 지표

  • domain - 주제 영역 또는 범주

  • expected_reasoning_steps - 솔루션의 단계 수

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

추가 속성이 있는 예제

Chemistry problem
{ "id": "chem-001", "messages": [ { "role": "system", "content": "You are a helpful chemistry assistant" }, { "role": "user", "content": "Predict hydrogen bond donors and acceptors for this SMILES: CCN(CC)CCC(=O)c1sc(N)nc1C" } ], "reference_answer": { "donor_bond_counts": 2, "acceptor_bond_counts": 4 } }

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

Math problem with metadata
{ "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 }

보상 함수 구현

보상 함수는 모델 응답을 평가하고 숫자 점수를 반환하는 Lambda 함수로 구현됩니다. Lambda 함수는 OpenAI 형식으로 메시지와 실측 정보를 수신하며 점수를 사전으로 반환해야 합니다.

IAM 권한

SageMaker AI 실행 역할에 Lambda 함수에 대한 InvokeFunction 권한이 있는지 확인합니다.

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "lambda:InvokeFunction", "Resource": "arn:aws:lambda:us-east-1:123456789012:function:my-reward-function-lambda" } ] }

설계 지침

보상 함수를 작성할 때 다음을 수행합니다.

  • 순위 응답 - 가장 좋은 답변에 명확하게 더 높은 점수를 부여합니다.

  • 일관된 검사 사용 - 작업 완료, 형식 준수, 안전 및 적절한 길이 평가

  • 안정적인 조정 유지 - 점수를 정규화하고 확장할 수 없도록 유지

인터페이스 형식

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

입력 구조

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

출력 구조

[{ "id": "123", "aggregate_reward_score": 0.85, "metrics_list": [ { "name": "accuracy", "value": 0.9, "type": "Reward" }, { "name": "policy_compliance", "value": 0.8, "type": "Metric" } ] }]

Lambda 함수 예제

from typing import List import json from dataclasses import asdict, dataclass @dataclass class RewardOutput: """Reward service output.""" id: str aggregate_reward_score: float def lambda_handler(event, context): """Main lambda handler""" return lambda_grader(event) def lambda_grader(samples: list[dict]) -> list[dict]: """Core grader function""" scores: List[RewardOutput] = [] for sample in samples: idx = sample["id"] ground_truth = sample.get("metadata", {}).get("reference_answer") if "messages" not in sample: print(f"Messages is None/empty for id: {idx}") ro = RewardOutput(id=idx, aggregate_reward_score=0.0) scores.append(ro) continue if ground_truth is None: print(f"No answer found in ground truth for id: {idx}") ro = RewardOutput(id=idx, aggregate_reward_score=0.0) scores.append(ro) continue # Get model's response (last turn is assistant turn) last_message = sample["messages"][-1] assert last_message["role"] == "assistant", "Last message must be from assistant" model_text = last_message["content"] ground_truth_text = _extract_ground_truth_text(ground_truth) if model_text.lower() == ground_truth_text.lower(): score = 1.0 else: score = 0.0 ro = RewardOutput(id=idx, aggregate_reward_score=score) scores.append(ro) return [asdict(score) for score in scores] def _extract_ground_truth_text(ground_truth) -> str: """Turn the ground_truth field into a plain string.""" if isinstance(ground_truth, str): return ground_truth if isinstance(ground_truth, dict): if "explanation" in ground_truth and isinstance(ground_truth["explanation"], str): return ground_truth["explanation"] if "answer" in ground_truth and isinstance(ground_truth["answer"], str): return ground_truth["answer"] return json.dumps(ground_truth, ensure_ascii=False) return str(ground_truth)

훈련 구성

SageMaker AI 훈련 작업 노트북 템플릿을 사용하여 훈련 작업을 시작합니다. 자세한 내용은 훈련 작업 생성을 참조하세요.

훈련 컨테이너

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

인스턴스 요구 사항

컨테이너는 전체 순위 및 LoRA 훈련을 모두 지원합니다.

  • LoRA 훈련 - 2/4/6/8 × p5.48xlarge 또는 p5en.48xlarge 인스턴스

  • 전체 순위 훈련 - 2/4/6/8 × vv48xlarge 인스턴스(필수)

추론 모드 선택

사용 가능한 모드

  • none – 추론 없음(reasoning_effort필드 생략)

  • low - 최소한의 추론 오버헤드

  • high - 최대 추론 기능(reasoning_effort이 지정된 경우 기본값)

참고

RFT에는 중간 옵션이 없습니다. reasoning_effort 필드에 구성이 없으면 추론이 비활성화됩니다. 추론이 활성화된 경우 확장된 추론 출력을 수용max_new_tokens하려면를 32768로 설정해야 합니다.

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

복잡한 분석 작업, 수학적 문제 해결, 다단계 논리적 공제, step-by-step 사고가 가치를 더하는 작업에 high 추론을 사용합니다.

간단한 사실 쿼리, 직접 분류, 속도 및 비용 최적화, 간단한 질문-응답에 대해 none ( 생략reasoning_effort) 또는 low 추론을 사용합니다.

비용 및 성능 장단점

추론 모드가 높을수록 훈련 시간과 비용, 추론 지연 시간 및 비용, 복잡한 추론 작업을 위한 모델 기능이 증가합니다.

교육 모니터링

훈련 로그에는 각 단계의 포괄적인 지표가 포함됩니다. 주요 지표 범주는 다음과 같습니다.

  • 보상 지표 - 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 메모리)

미세 조정된 모델 사용

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

제한 사항 및 모범 사례

제한 사항

  • Lambda 제한 시간 - 보상 함수는 15분 이내에 완료해야 합니다(런어웨이 프로세스 방지 및 비용 관리).

  • 단일 전환만 - 다중 전환 대화는 지원되지 않습니다.

  • 데이터 요구 사항 - 충분한 다양성 필요, 희소 보상으로 어려움을 겪음(긍정적인 예 5% 미만)

  • 컴퓨팅 비용 - 지도 미세 조정보다 비용이 많이 듭니다.

모범 사례

  • 소규모 시작 - 100~200개의 예제로 시작하고, 보상 함수 정확성을 검증하고, 결과에 따라 점진적으로 확장합니다.

  • 훈련 전 평가 - RFT 전에 기준 모델 성능을 테스트합니다. 보상이 일관되게 0%인 경우 먼저 SFT를 사용하여 기본 기능을 설정합니다. 보상이 95%보다 크면 RFT가 필요하지 않을 수 있습니다.

  • 훈련 모니터링 - 평균 보상 점수 및 분포를 추적합니다. 과적합(훈련 보상은 증가하고 검증 보상은 감소)이 있는지 확인합니다. 0.15 미만의 보상 고원, 시간 경과에 따른 보상 분산 증가, 검증 성능 저하와 같은 우려되는 패턴을 찾습니다.

  • 보상 함수 최적화 - 몇 초(분 아님) 내에 실행하고, 외부 API 호출을 최소화하고, 효율적인 알고리즘을 사용하고, 적절한 오류 처리를 구현하고, Lambda의 병렬 조정을 활용합니다.

  • 반복 전략 - 보상이 개선되지 않는 경우 보상 함수 설계를 조정하고, 데이터세트 다양성을 높이고, 대표 예제를 추가하고, 보상 신호가 명확하고 일관적인지 확인합니다.