CPT(Continual Pre-Training) 기초부터 시작하기: 복잡한 트레이닝 프레임워크 탈출하기

비즈니스 문제를 해결하기 위해 도메인 지식을 대규모 언어 모델에 주입해야 하는 상황이 발생했습니다. 이전에는 간단한 파인튜닝(GLM 프레임워크에서 Lora를 적용, 데이터 규모도 작음)만 수행했지만, 이제는 특정 산업 분야의 전체 관련 데이터를 수집하여 훈련해야 합니다. 규모 면에서 이전에 반수동으로 구축한 파인튜닝 데이터셋보다 훨씬 커졌고, 조사 결과 프리트레인 단계에서 훈련하는 것이 더 적합하다는 결론을 내렸습니다.

트레이닝 프레임워크 시도

  • LLaMA Factory: 유명한 LLaMA Factory는 파인튜닝뿐만 아니라 프리트레인 단계의 훈련도 지원합니다. 이 사실은 Alibaba의 동료를 통해 알게 되었습니다.
  • GPT-NeoX: 고성능 트레이닝 프레임워크입니다. README에서 다음과 같이 경고합니다: "수십억 개의 파라미터를 가진 모델을 처음부터 훈련할 계획이 없다면, 이 라이브러리를 사용하지 않는 것이 좋습니다."
  • Pai-Megatron-Patch: GPT-NeoX와 마찬가지로 Megatron 기반 프레임워크입니다. 하지만 Alibaba의 오픈소스 프로젝트 중 antd 외에는 사용하기 좋은 것이 없어 보입니다.

솔직히 말하면, 이러한 프레임워크의 설정은 복잡합니다(특히 프리트레인 초보자인 저에게는). 문서를 읽는 것만으로도 혼란스러워집니다.

물론 LLaMA Factory는 비교적 사용하기 쉽습니다. UI 인터페이스가 있어 클릭만으로 최종 실행 명령어를 생성할 수 있습니다. 하지만 제품 설계 자체가 파인튜닝에 특화되어 있어 프리트레인 기능은 고려되지 않은 느낌입니다.

간단한 접근 방식: Transformer 라이브러리 활용

복잡한 프레임워크 없이 기술적 가능성을 검증하기 위해 Transformer 라이브러리부터 시작하기로 했습니다.

먼저 모델과 토크나이저를 초기화합니다:

import os
from transformers import AutoModelForCausalLM, AutoTokenizer

model_path = os.path.join(
    "/home/ubuntu/ycd/pretrained_models", "Qwen2.5-Coder-0.5B-Instruct"
)
save_dir = os.path.join("models", "qwen2.5-coder")

model = AutoModelForCausalLM.from_pretrained(model_path)
tokenizer = AutoTokenizer.from_pretrained(model_path)

데이터를 로드하고 토큰화합니다:

from datasets import load_dataset

dataset = load_dataset(data_files="/home/ubuntu/ycd/continual-pretrain-qwen2.5-coder/data")

def encode_text(example):
    return tokenizer(example["text"], truncation=True, padding=True)

tokenized_data = dataset.map(encode_text, batched=True)

훈련 파라미터를 설정합니다. output_dir은 필수이며, 나머지는 기본값을 사용할 수 있습니다. 데이터셋의 컬럼 이름을 text로 지정해야 합니다. 그렇지 않으면 기본값인 label 필드를 찾다가 오류가 발생합니다.

from transformers import TrainingArguments

training_config = TrainingArguments(
    output_dir=save_dir,
    label_names=["text"],
    # num_train_epochs=3,
    # per_device_train_batch_size=4,
    # save_steps=10_000,
    # save_total_limit=2
)

Trainer를 사용하여 훈련을 시작합니다:

from transformers import Trainer

trainer = Trainer(
    model=model,
    args=training_config,
    train_dataset=tokenized_data,
    tokenizer=tokenizer,
)

trainer.train()

추론 결과를 간단히 검증해보면, zero-shot으로 AFSIM 스크립트 코드를 생성할 수 있습니다. 이는 훈련 데이터의 지식을 학습했음을 의미합니다.

다만 Qwen2.5-coder 0.5B 모델에서는 반복적인 패턴이 나타났지만, 3B 모델에서는 문제가 없었습니다.

향후에는 훈련 데이터의 품질 처리를 강화해야 합니다. 이번 훈련에서는 주로 AFSIM 관련 코드를 사용했는데, C++/C# 등 다양한 유형의 데이터를 일정 비율로 혼합해야 합니다.

태그: CPT Continual Pre-Training Transformer Qwen2.5-Coder LLaMA Factory

7월 11일 01:42에 게시됨