

# 지속적 사전 학습(CPT)
<a name="nova-cpt"></a>

지속적인 사전 훈련(CPT)은 파운데이션 모델의 사전 훈련 단계를 확장하여 특정 도메인 또는 코포라의 레이블이 지정되지 않은 추가 텍스트에 노출시키는 훈련 기법입니다. 레이블이 지정된 입력-출력 페어가 필요한 지도 미세 조정과 달리, CPT는 원시 문서에서 훈련하여 모델이 새 도메인에 대한 심층적인 지식을 얻고, 도메인별 용어 및 쓰기 패턴을 학습하며, 특정 콘텐츠 유형 또는 주제 영역에 적응할 수 있도록 지원합니다.

이 접근 방식은 법률 문서, 의학 문헌, 기술 문서 또는 독점 비즈니스 콘텐츠와 같은 도메인별 텍스트 데이터가 많고(수백억 개의 토큰)이고 모델이 해당 도메인에서 원어민 수준의 능숙도를 개발하기를 원하는 경우에 특히 유용합니다. 일반적으로 CPT 단계 이후에 모델이 새로 획득한 지식을 사용하고 유용한 태스크를 완료할 수 있도록 추가 명령 조정 단계를 거쳐야 합니다.

**지원되는 모델**  
CPT는 다음과 같은 Amazon Nova 모델에서 사용할 수 있습니다.
+ Nova 1.0(Micro, Lite, Pro)
+ Nova 2.0(Lite)

**Nova 1.0 및 Nova 2.0을 사용해야 하는 각각의 경우**  
Amazon Nova 모델 제품군은 정확도, 속도 및 비용 사이에서 최적화하기 위한 여러 가격 대비 성능 운영 지점을 제공합니다.

다음이 필요한 경우 Nova 2.0을 선택합니다.
+ 복잡한 분석 태스크를 위한 고급 추론 기능
+ 코딩, 수학 및 과학적 문제 해결에 대한 우수한 성능
+ 더 긴 컨텍스트 길이 지원
+ 더 나은 다국어 성능

**참고**  
더 큰 모델이 항상 더 좋은 것은 아닙니다. Nova 1.0 및 Nova 2.0 모델 중에서 선택할 때 비용 대비 성능의 장단점과 특정 비즈니스 요구 사항을 고려합니다.

# Nova 2.0에서 CPT
<a name="nova-cpt-2"></a>

Amazon Nova Lite 2.0은 Nova Lite 1.0보다 더 크고 다양한 데이터세트에서 훈련된 모델입니다. Nova Lite 2.0은 더 큰 모델이지만 Nova Lite 1.0보다 더 빠른 추론을 제공하는 동시에, 향상된 추론 기능, 더 긴 컨텍스트 길이 및 향상된 다국어 성능을 제공합니다.

Nova 2.0에서 CPT를 사용하면 도메인별 데이터로 이러한 고급 기능을 확장하여 모델이 우수한 추론 및 분석 능력을 유지 관리하면서 전문 분야에 대한 심층적인 전문 지식을 개발할 수 있습니다.

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

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

```
# Note:
# This recipe can run on p5.48xlarge
# Run config
run:
  name: "my-cpt-run"                           # A descriptive name for your training job
  model_type: "amazon.nova-2-lite-v1:0:256k"   # Model variant specification, do not change
  model_name_or_path: "nova-lite-2/prod"        # Base model path, do not change
  replicas: 8                                   # Number of compute instances for training, allowed values are 4, 8, 16, 32
  data_s3_path: ""                              # Customer data paths
  validation_data_s3_path: ""                   # Customer validation data paths
  output_s3_path: ""                            # Output artifact path,  job-specific configuration - not compatible with standard SageMaker Training Jobs
  mlflow_tracking_uri: ""                       # Required for MLFlow
  mlflow_experiment_name: "my-cpt-experiment"   # Optional for MLFlow. Note: leave this field non-empty
  mlflow_run_name: "my-cpt-run"                 # Optional for MLFlow. Note: leave this field non-empty

## Training specific configs
training_config:
  task_type: cpt
  max_length: 8192                              # Maximum context window size (tokens)
  global_batch_size: 256                        # Global batch size, allowed values are 32, 64, 128, 256.

  trainer:
    max_steps: 10                               # The number of training steps to run total
    val_check_interval: 10                      # The number of steps between running validation. Integer count or float percentage
    limit_val_batches: 2                        # Batches of the validation set to use each trigger

  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

  optim:
    optimizer: adam
    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
    adam_beta1: 0.9                             # Beta1 for Adam optimizer
    adam_beta2: 0.95                            # Beta2 for Adam optimizer
    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
```

## 2.0에서 CPT에 대한 데이터 준비
<a name="nova-cpt-2-data-prep"></a>

**데이터 형식 요구 사항**  
훈련 및 검증 데이터세트는 아래 표시된 형식을 따르는 JSONL 파일이어야 하며, 각 줄에는 필수 필드 및 구조를 갖춘 대화를 나타내는 JSON 객체가 포함되어야 합니다. 다음 예를 참고하세요

```
{"text": "AWS stands for Amazon Web Services"}
{"text": "Amazon SageMaker is a fully managed machine learning service"}
{"text": "Amazon Bedrock is a fully managed service for foundation models"}
```

텍스트 항목에는 대상 도메인을 잘 나타내는, 자연스럽게 흐르는 고품질의 콘텐츠가 포함되어야 합니다.

데이터가 [Arrow 형식](https://huggingface.co/docs/datasets/en/about_arrow)으로 변환될 수 있는지 테스트합니다. 아래 Python 스크립트를 사용하면 도움이 됩니다. 최소 `datasets==2.18.0` 버전이 사용되는지 확인합니다.

```
from datasets import load_dataset, load_from_disk
from pathlib import Path

input_path = Path("<Your jsonl file>")
output_path = Path("<Your output directory>")

dataset = load_dataset("json", data_files=str(input_path), split="train")
dataset.save_to_disk(str(output_path), max_shard_size="1GB")

try:
  test_dataset = datasets.load_from_disk(output_dir)
  print(f"Dataset loaded successfully ✅! Contains {len(test_dataset)} samples")
except Exception as e:
  print(e)
```

JSONL 파일에 있는 것과 동일한 수의 줄을 인쇄해야 합니다.

데이터 혼합을 사용하는 경우 `max_steps=2`를 사용하여 첫 번째 작업을 실행합니다. 그러면 클러스터에서 데이터 액세스에 대한 최적화를 생성하고 모든 데이터 혼합을 사용할 수 있는지 검증할 수 있습니다.

**CPT에 대한 데이터를 준비하는 방법**  
훈련 데이터는 지속적인 사전 훈련의 성공을 위한 가장 중요한 결정적인 요소입니다. CPT 데이터는 종종 'unlabeled'로 기술되지만 실제 의미는 훨씬 더 미묘합니다. 데이터의 구조화, 형식 지정 및 표시 방식에 따라 모델이 비즈니스 사용 사례에 필요한 지식과 기술을 획득하는지가 결정됩니다.

### CPT에 대한 구조화된 비즈니스 데이터세트 준비
<a name="nova-cpt-2-structured-data"></a>

이는 도메인에 특화된 파운데이션 모델을 빌드하는 기업과 조직의 공통 과제입니다. 대부분의 비즈니스는 제품 카탈로그, 사용자 프로필, 트랜잭션 로그, 양식 제출, API 직접 호출, 운영 메타데이터 등 정형 데이터의 풍부한 리포지토리를 보유하고 있습니다. 처음에는 표준 사전 훈련에 일반적으로 사용되는 비정형 웹 텍스트와 매우 다르게 보입니다.

정형 비즈니스 데이터를 효과적으로 학습하려면 다운스트림 태스크에 대해 신중하게 생각하고 모델이 올바른 예측 관계를 학습하도록 데이터 프레젠테이션을 설계합니다.

지속적인 사전 훈련의 잠재력을 최대한 활용하려면 다음을 고려합니다.
+ 추론 시 모델이 수행해야 하는 태스크
+ 원시 데이터에 있는 정보
+ 모델이 정보를 올바르게 추출하고 조작하는 방법을 학습하도록 해당 데이터를 정형화하는 방법

훈련에 정형 데이터를 가져오는 것만으로는 모델에서 해당 데이터로 추론하는 방법을 가르칠 수 없습니다. 모델이 학습하는 내용을 안내하기 위해 데이터 프레젠테이션을 적극적으로 구성합니다.

다음 섹션에는 데이터 증강의 중요성을 보여주는 문헌 자료를 검토합니다. 그리고 CPT에 대한 비즈니스 데이터세트를 처리하고 구성하는 방법에 대한 유용한 아이디어를 제공하는 정형 비즈니스 데이터에 대한 증강 전략 예제를 제공합니다.

**문헌 자료에서 CPT에 대한 정형 데이터**  
CPT는 도메인 관련 사실을 모델에 패킹할 수 있지만 이 경우 종종 입력 또는 태스크가 이전될 때 해당 팩트를 검색하고 조작할 수 없습니다. 제어된 실험에 따르면, 사전 훈련 중에 다양한 증강이 없으면 모델이 나중에 지침 조정 후에도 추출하기 어려운 취약한 방식으로 사실을 기억하고 훈련 초기에 신호와 같은 지침을 주입하도록 권장합니다. 반정형 데이터의 경우 무작위 직렬화 및 기타 증강은 스키마 과적합을 줄입니다. 이 때문에 CPT를 먼저 실행하고 나중에 IFT를 실행하는 대신, CPT를 지침 스타일 태스크와 함께 사용해야 합니다. 재무 중심의 업무에서는 배치 시점에 CPT와 지침 데이터를 함께 혼합하면 일반화가 개선되고 순차 레시피에 비해 망각이 줄어듭니다. Qwen 기술 보고서는 고품질 지침 데이터를 사전 훈련 자체에 통합하여 동일한 패턴으로 수렴하므로 컨텍스트 학습이 향상되고 새로운 도메인 지식을 획득하는 동시에 다음 지침을 유지합니다.

반정형 코포라에 대해 데이터 증강이 핵심 요소입니다. 합성 그래프 인식 CPT는 추론 시점에 검색을 통해 관계와 합성물을 명시적으로 가르치는 엔터티 연결 코포라로 작은 도메인 세트를 확장합니다. 공동 CPT와 지침을 혼합하면 재무 분야에서 순차 파이프라인보다 뛰어난 성능을 제공하고, 일반 데이터와의 도메인 밸런싱을 통해 일반 기술에서 성능 저하를 줄입니다. 또한 대규모 도메인 CPT는 광범위한 기능을 유지하고 모델 병합을 통한 장단점을 허용할 수 있지만, 여전히 지침 조정을 필수적인 다음 단계로 가리켜 CPT 중에 명령 신호를 도입하는 가치를 강화합니다.

**무작위화 및 셔플링을 통한 다양성 주입**  
정형 및 반정형 데이터세트에서 모델을 효과적으로 가르치는 데 도움이 되는 일반적인 전략은 데이터세트의 필드 순서를 셔플링하고 일부 키를 무작위로 삭제하는 것입니다.

필드를 셔플링하면 모델이 표시되는 위치 대신 각 값의 의미를 읽고 모든 필드 간의 관계를 학습합니다. 예를 들어 Amazon Store에 게시된 비디오 게임의 경우 '타이틀', '플랫폼', '가격', '상태', '에디션'이 서로 다른 순열로 도착하면 모델은 '세 번째 슬롯은 플랫폼'에 의존할 수 없습니다. 레이블을 값에 바인딩하고 속성 사이에서 쌍방 관계(제목 ⇄ 플랫폼, 플랫폼 ⇄ 가격, 상태 ⇄ 가격)를 학습해야 합니다. 따라서 예를 들어 게임 이름과 관찰된 가격에서 가능한 플랫폼을 유추하거나 제목과 플랫폼이 주어지면 타당한 가격 범위를 추정할 수 있습니다.

직렬화 중에 키를 무작위로 삭제하는 경우 기능 드롭아웃처럼 작동합니다. 즉, 한 필드에 대한 공동 적응을 방지하고 강제로 모델이 나머지 증거에서 누락된 정보를 복구합니다. '플랫폼'이 없는 경우 모델은 제목 문자열 또는 호환성 텍스트에서 선택해야 합니다. '가격'이 숨겨져 있는 경우 플랫폼, 에디션 및 상태에서 삼각 관계를 활용해야 합니다. 이러한 방식으로 대칭(A→B 및 B→A), 복잡한 실제 목록에 대한 견고성 그리고 필드 누락, 필드 이름 변경 또는 필드 순서 변경 시 스키마 불변성을 구축합니다.

쇼핑 스타일 예제에서 이를 구체적으로 설명합니다. '제목: 'Elden Ring' \$1 플랫폼: PlayStation 5 \$1 상태: 중고 - 거의 새 제품 \$1 가격: \$134.99', '가격: \$134.99 \$1 제목: 'Elden Ring' \$1 상태: 중고 - 거의 새 제품 \$1 플랫폼: PlayStation 5'와 같은 순열처럼 동일한 항목을 여러 방법으로 직렬화합니다. 그리고 설명에서 'PS5와 호환 가능'을 그대로 두고 일부 방식에서 '플랫폼'을 삭제하여 전달합니다. \$1title, price\$1에서 플랫폼 예측 및 \$1title, platform\$1에서 가격 버킷 예측과 같은 보완적 목표를 훈련합니다. 키의 순서와 존재도 달라지기 때문에 유일하게 안정적인 전략은 템플릿을 기억하지 않고 속성 간 실제 관계를 학습하는 것입니다.

### 중요한 데이터 표시 방식
<a name="nova-cpt-2-data-presentation"></a>

LLM은 이미 확인한 내용을 바탕으로 다음 토큰을 예측하여 학습합니다. 따라서 훈련 중에 표시되는 필드 및 이벤트의 순서에 따라 모델이 학습할 수 있는 내용이 결정됩니다. 훈련 형식이 실제 태스크와 일치하면 정확한 의사 결정 토큰에서 손실이 발생합니다. 필드가 구조 없이 함께 전달되는 경우 모델은 바로 가기를 학습하거나 인기도를 기억한 다음 옵션 중에서 선택하라는 메시지가 표시되면 실패합니다.

상황을 먼저 표시한 다음, 옵션과 의사 결정을 순차적으로 표시합니다. 모델이 결과나 설명에 대해서도 알고 있어야 하는 경우 의사 결정 후에 입력합니다.

### CPT에 대한 샘플 패킹
<a name="nova-cpt-2-packing"></a>

**패킹이란 무엇인가요?**  
창을 패딩이 아닌 실제 토큰으로 채우도록 여러 전체 예제로 훈련 데이터의 각 시퀀스 창을 채우는 것을 의미합니다.

**이것이 중요한 이유**  
훈련 중 최대 컨텍스트 길이(예: 8,192개의 토큰)가 설정됩니다. 배치는 [배치 크기 × 컨텍스트 길이]로 형성됩니다. 훈련 예제가 컨텍스트 길이보다 짧으면 나머지 위치가 채워집니다(패딩). 패딩은 손실이 마스킹된 경우에도 여전히 어텐션과 MLP 커널을 통해 실행되므로 학습 신호를 전달하지 않는 토큰에 대해 컴퓨팅이 소모됩니다.

**어떻게 패킹하나요?**  
여러 샘플을 패킹하려면 샘플의 전체 길이가 원하는 컨텍스트 길이 아래 포함되도록 ` [DOC] ` 구분 기호를 사이에 두고 여러 훈련 샘플을 연결합니다([DOC] 앞뒤에 공백 포함).

패킹된 문서 예제는 다음과 같습니다.

```
{"text": "training sample 1 [DOC] training sample 2 [DOC] training sample 3"}
```

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

CPT를 통해 미세 조정할 수 있는 파라미터는 다음과 같습니다.

**실행 구성**  

+ **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\$1length**: 토큰 단위의 최대 시퀀스 길이입니다. 이는 훈련을 위한 컨텍스트 창 크기를 결정합니다. CPT에 대해 지원되는 최대 값은 8,192개의 토큰입니다.

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

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

**트레이너 설정**  

+ **max\$1steps**: 실행할 훈련 단계 수입니다. 각 단계는 `global_batch_size`개의 요소를 사용하여 모델을 훈련합니다.

**모델 설정**  

+ **hidden\$1dropout**: 숨겨진 상태 출력이 삭제될 확률입니다. 작은 데이터세트에서 과적합을 줄이려면 이 값을 약 0.0\$10.2 늘립니다. 유효한 값은 0\$11입니다.
+ **attention\$1dropout**: 어텐션 가중치가 삭제될 확률입니다. 이 파라미터는 일반화에 도움이 될 수 있습니다. 유효한 값은 0\$11입니다.

**옵티마이저 구성**  

+ **lr**: 최적화 동안 단계 크기를 제어하는 학습률입니다. 성능 향상을 위해 1e-6에서 1e-4 사이의 값을 권장합니다. 유효한 값은 0\$11입니다.
+ **name**: 옵티마이저 알고리즘입니다. 현재 `distributed_fused_adam`만 지원됩니다.
+ **weight\$1decay**: L2 정규화 강도입니다. 값이 높을수록(0.01에서 0.1 사이) 정규화가 증가합니다.
+ **warmup\$1steps**: 학습률을 점진적으로 높이는 단계 수입니다. 이는 훈련의 안정성을 향상시킵니다. 유효한 값은 1\$120입니다.
+ **min\$1lr**: 감소 종료 시의 최소 학습률입니다. 유효한 값은 0\$11이지만 설정된 학습률보다 작아야 합니다.