Custom model 생성 및 safetensors 저장 방법 – 나만의 모델 만들기 #4

오늘은 드디어 GPT-2 구조를 기반으로 한국어 전용 Custom Model을 생성해 보겠습니다. 지난 글에서 한국어 토크나이저를 직접 제작하고 Hugging face 환경에서 wrapping까지 완료했으므로, 오늘은 그것에 이어서 바로 기초 언어 모델을 생성하는 과정을 정리해 볼게요.

Custom model 생성 및 safetensors 저장
Custom model 생성 및 safetensors 저장


Custom model 생성 및 safetensors 저장

한국어 토크나이저를 HF Wrapping까지 했으니, 이제 기본적인 custom model을 생성하고 한국어 학습을 해야 합니다.

먼저, 내 custom model의 구조를 어떻게 할지 결정해야 하죠. 전문가도 아니고 장비, 리소스도 터무니없이 부족한 환경이니 공개된 인공지능 모델을 활용하는 게 좋습니다. 이번에는 GPT-2 모델을 기준으로 나만의 custom model을 생성하려 합니다.

이전에는 네이버의 대형언어모델(크로버엑스)이나 Qwen 등 여러 모델로 이 작업을 시도했지만, 매번 중간에 실패하곤 했어요. 모델의 한국어 성능이 전혀 향상되지 않더라고요. 지금 생각해 보면 끝까지 했으면 뭔가 결론이 있었을 듯합니다. 인공지능 모델이나 어떤 과제든 끝까지 진행해 보는 것이 처음 경험하는 입장에서는 가장 중요한 과정이라는 것을 다시 생각해 봅니다.


Custom model 생성

하여간, 두 달이라는 시간만 낭비하고 이제 기초 모델을 구성하는 단계에 있네요.

그럼, 모델을 구성해 보죠. 저는 모델의 구조만 활용하고 언어는 한국어 토크나이저를 사용하기 때문에 다음과 같이 모델의 config만을 활용하게 됩니다. 전체 코드에서 중요한 부분만 간략하게 보겠습니다.

from transformers import GPT2Config, AutoModelForCausalLM, PreTrainedTokenizerFast
...

TOK_DIR   = "./01_My_KOR_TOKENIZER"
MODEL_OUT = "./MODEL_INIT"
os.makedirs(MODEL_OUT, exist_ok=True)

tokenizer = PreTrainedTokenizerFast.from_pretrained(TOK_DIR)
...

config = GPT2Config.from_pretrained("gpt2-medium")
config.vocab_size   = len(tokenizer) 
...
model = AutoModelForCausalLM.from_config(config)
...

model.save_pretrained(MODEL_OUT, safe_serialization=True)
tokenizer.save_pretrained(MODEL_OUT)

PreTrainedTokenizerFast

“TOK_DIR”에서 토크나이저를 로딩할 때 PreTrainedTokenizerFast를 사용합니다. 이는 이전 글에서 설명한 HF wrapping으로 변환한 tokenizer.json 커스텀 토크나이저를 빠르고 안정적으로 불러오기 위해 사용한 클래스입니다. HF 라이브러리를 이용해서 복잡한 추가 작업 없이 간단하게 필요한 정보를 가져오기 위해서 사용합니다.

GPT-2 config

한마디로 GPT-2 모델의 구조도입니다. 그 유명한 GPT?라고 하실 수도 있는데요, 공개된 초기 버전의 GPT 모델이에요. 최근 고성능의 모델들과는 다릅니다. 하여간 이 클래스는 히든 크기(n_embd), 레이어 수(n_layer), 어텐션 헤드 수(n_head), 어휘 크기(vocab_size), 최대 시퀀스 길이(n_positions), special token ID 등의 정보를 담고 있습니다.

이 클래스를 이용해서 GPT-2 모델의 구조와 하이퍼파라미터를 정의할 수 있습니다. 실제로 from_pretrained(“gpt2-medium”) 메서드를 통해 GPT-2의 정보를 가져오는 거죠.

그러면, GPT-2 구조의 기존 정보를 활용하지 않고 직접 정의하려면 어떻게 할까요? 다음과 같이 해 볼 수 있겠죠. 즉, GPT-2 구조를 새롭게 정의하려면 다음과 같이 구성해 볼 수 있어요.

from transformers import GPT2Config

config = GPT2Config(
    n_layer=12,       # 레이어 12층
    n_head=12,        # 어텐션 헤드 12개
    n_embd=768,       # 히든 차원 768
    vocab_size=32000, # 내가 만든 토크나이저 크기
    n_positions=1024, # 최대 컨텍스트 길이
    pad_token_id=3,   # 패딩 토큰 ID
    eos_token_id=2    # EOS 토큰 ID
)

참고로, GPT-2 모델의 종류는 다음과 같아요.

  1. GPT-2 Small (117M)
    • 약 1억 1,700만 개 파라미터
    • 레이어 12층, 히든 차원 768, 어텐션 헤드 12
  2. GPT-2 Medium (345M)
    • 약 3억 4,500만 개 파라미터
    • 레이어 24층, 히든 차원 1,024, 어텐션 헤드 16
  3. GPT-2 Large (774M)
    • 약 7억 7,400만 개 파라미터
    • 레이어 36층, 히든 차원 1,280, 어텐션 헤드 20
  4. GPT-2 XL (1.5B)
    • 약 15억 개 파라미터
    • 레이어 48층, 히든 차원 1,600, 어텐션 헤드 25

이외, GPT-2 파생 모델로, GPT-Neo / GPT-J / GPT-NeoX 등 다양합니다.

다시 앞의 모델 생성 코드로 올라가서,

AutoModelForCausalLM

Hugging Face에서 제공하는 자동 모델 로더 중 하나로, 이름 그대로 “Causal Language Model(인과적 언어 모델)”을 위한 모델을 불러올 때 사용됩니다. 인과적 언어 모델이라는 것은 GPT-2처럼 왼쪽에서 오른쪽으로 순차적으로 단어를 예측하고 문장을 생성하는 구조를 말합니다. 현대 우리 글처럼 말이죠. 요즘은 위에서 아래로 또는 오른쪽에서 왼쪽으로 작성하지는 않잖나요.

즉, GPT-2 Medium의 구조를 기반으로 새로운 한국어 전용 모델을 생성하기 위해 AutoModelForCausalLM.from_config(config)를 사용한 것입니다.


safetensors 저장

중요한 설정은 다 끝났어요. 이제 GPT-2 custom model을 저장만 하면 됩니다.

model.save_pretrained(MODEL_OUT, safe_serialization=True) 이 구문을 통해 모델의 구조(config)와 실제 학습 파라미터(가중치)가 함께 저장됩니다. safe_serialization=True 옵션으로 안전하고 빠른 .safetensors 형식으로 저장되는 거죠. 최근에 Hugging face에서 모델을 찾다 보면 model.safetensors가 대부분이기는 한데, 가끔 pytorch_model.bin이 보이기도 합니다. 이 때 .bin과 .safetensors의 구분이 위에 저 옵션으로 결정되는 거죠.

하여간, 이렇게 저장된 파일에는 config.jsonmodel.safetensors 같은 핵심 요소가 포함되어, 이후 학습을 이어가거나 추론에 사용할 때 모델의 구조와 학습된 정보를 그대로 복원할 수 있게 됩니다.


자, 그럼 실제 생성된 모델을 볼게요. 위 코드에서 “MODEL_INIT” 폴더에 생생된 파일들을 저장하므로 해당 파일들이 아래와 같이 생성되었음을 확인할 수 있습니다.

-rw-r--r-- 1 root root        953 Sep 11 11:37 config.json
-rw-r--r-- 1 root root        140 Sep  1 00:11 generation_config.json
-rw-r--r-- 1 root root 1344574976 Sep  1 00:11 model.safetensors
-rw-r--r-- 1 root root        427 Sep  1 00:11 special_tokens_map.json
-rw-r--r-- 1 root root    2478083 Sep  1 00:11 tokenizer.json
-rw-r--r-- 1 root root        806 Sep  1 00:11 tokenizer_config.json

config.json 파일을 오늘 건드렸더니 날짜가 바뀌었네요.

vocal_size 32k, 2500만 코퍼스를 활용한 토크나이저와 GPT-2 구조 정보를 포함한 전체 모델의 저장용량은 1Gb가 넘어 버리는군요. 실제 이 모델의 파라미터는 3억 450만 개였어요.


이제 드디어 기초적인 Custom model을 생성했어요. 아직 한국어는 한마디도 못하는 인공지능 언어 모델이기는 합니다. 때문에 다음에는 Pre-training 단계인 한국어 문장 학습 과정에 대해 이야기해 보겠습니다.


답글 남기기