목차
그동안 대형 언어 모델, Tokenizer는 물론, AI (인공지능) 기술과 관련하여 다양한 이야기를 해 왔습니다. 이제부터는 지금까지 다뤄본 기술들을 기반으로 실제 나만의 생성형 AI 모델을 만들어 보고자 합니다. 개인 프로젝트다 보니 GPT-4나 Gemini 같은 거대한 모델을 다뤄볼 수는 없어요. 로컬 PC에서 실행할 거니까요.
저렴한 비용에 고성능 리소스를 제공해 주는 서비스가 있으면 얼마나 좋을까요. 누군가는 코랩을 얘기하는데, 짧은 실험 이외 몇 시간씩 소요되는 실험을 하기에는 코랩 비용도 장난이 아니거든요.
“그렇다면 로컬 환경에서 내가 직접 실험해 볼 수 있는 생성형 AI는 어떤 것이 가능할까?”라는 질문을 스스로에게 던지면서, 가능한 범위 내에서 나만의 모델을 구성해 보기로 했습니다.

HyperCLOVA의 Tokenizer로 한국어 AI 생성하기
우선, 간단하게 프로젝트의 목표를 생각해 봤는데요, 이 프로젝트를 시작하는 이유였던 한국어에 능통한 모델이어야 합니다. 요즘은 더 다양하고 출중한 생성형 AI들이 등장하는 모양입니다만, 그럼에도 GPT는 아직까지 한국어가 어색합니다. 물론 대충 보면 잘해 보입니다만, 글 작성하게 하거나 깊이 있는 논리 구조를 만들어 보면 완벽한 한국어의 문장들이 아닙니다. 특히 비유나 과장은 상당히 공감하기 어렵습니다. 마치 외국 영화를 보는 느낌이죠. 두 번째는 목표는 멀티모달 모델입니다. 과연 적은 파라미터 모델이 이미지를 인식할 수 있을지, 이것이 달성 가능한 목표일지 아직은 모르겠습니다만 일단 목표로 했어요. 세 번쨰는 온디바이스 모델이어야 합니다. 뭐 이것은 상당히 개인적 취향입니다.
하여간 시작해 첫 번째 목표부터 시작해 보죠.
기초 모델 선택의 기준
개인이 원천적인 기초 모델 수준의 대형 언어 모델을 만들어 낼 수 있을까요? 어렵죠. 앞에서 이미 말한 이유 이외, 학습에 필요한 방대한 데이터조차도 개인의 위치에서는 모을 수 없습니다. 아무리 hugging face 등에서 여러 데이터셋을 공개하고 있음에도, 그 보다 더 다양한 학습 자료들이 필요합니다. 어마어마한 데이터들이 말이죠. 그것도 한글로 되어 있는 자료들만 말입니다. 더군다나, 이 자료들이 있다고 하더라고 인공지능의 학습 또는 훈련에 맞는 데이터로 다시 가공해야죠. 데이터도 중요하지만, 가공도 중요합니다. 데이터 가공이 잘 되어야 훈련이나 학습이 올바르게 되니까요. 결국 이런 과정이 LLM 모델의 성능을 좌지우지하게 됩니다.
때문에, 이번 개인 프로젝트에서는 당연하게도 기존 대형 언어 모델을 활용해야 합니다. 오픈소스로 공개된 언어 모델을 기반으로 시작하는 것이 가장 현실적이죠.
대략적으로 조사해 본 오픈소스 언어 모델들을 다음과 같이 정리해 봤어요.
모델명 | 크기 (파라미터) | 특징 | 한국어 지원 | 개인 실험 적합 |
GPT-2 | 117M\~1.5B | 기본 GPT 구조, 가볍고 단순 | ❌ (토크나이저 필요) | ✅ |
GPT-Neo | 125M\~2.7B | GPT-2 확장, 오픈소스 | ❌ | ✅ |
GPT-J | 6B | GPT-3급 성능 | ❌ | ✅ (고성능 필요) |
KoGPT2 (카카오) | 125M\~ | GPT-2 구조 + 한국어 학습됨 | ✅ | ✅ |
OPT (Meta) | 125M\~66B | GPT-2/3 호환형 | ❌ | ✅ (중형 이하) |
LLaMA / MPT | 7B\~ | 최신 성능 반영, 다양한 변형 | ❌ (LLaMA2-Ko 별도) | ✅ (고성능 필요) |
위 표에서 한국어 지원 부분에서 ❌ 이와 같은 표기는 한국어 능력이 없다는 것이 아니에요. 위 모델들 전부 한국어 구사는 가능해요. 다만, 한국어 전용 학습을 하지 않았기 때문에 성능면에서 영어 대비 확연하게 낮다는 의미입니다. 아주 기본적인 유니코드 기반 텍스트 처리조차 불가능하다면 한국어 학습조차 불가능 하니 말이죠.
저는 OpenAI가 공개한 GPT-2 모델을 선택했습니다. 자유롭게 사용할 수 있는 MIT 라이선스를 따르고 있고, 구조가 단순하다고 하니, 로컬 PC에서도 충분히 다뤄 볼만할 것 같았습니다.
토크나이저 추출과 이식
이미 앞서 다른 글들을 통해 대형 언어 모델(LLM)이 언어를 다룰 때 토큰화(tokenizer)를 통해 인식한다는 이야기를 많이 했어요. GPT 기반 토큰 계산식도 다뤄봤으니, (궁금하신 분은 본문 아래 링크를 참고해 주세요.) 이 글에서는 토큰에 대한 이야기는 넘어갑니다.
언어 모델은 텍스트를 직접 다루지 않습니다. 텍스트를 수치화된 단위인 **토큰(token)**으로 변환해 처리합니다. 이 과정을 수행하는 것이 토크나이저이며, 모델이 문장을 얼마나 효율적으로 이해할 수 있는지를 결정짓는 중요한 요소입니다.
GPT-2의 기본 토크나이저는 영어에 최적화돼 있어요. 예를 들어 “인공지능” 같은 단어를 지나치게 잘게 쪼개 처리할 수 있으며, 이는 한국어 문장을 비효율적으로 인식하게 만들죠. 때문에 한국어에 특화된 토크나이저를 적용해야 한국어에 특화된 모델이라 할 수 있을 거예요. 앞에서 말했던 첫 번째 목표 중 하나, 한국어에 능통한 모델이 되기 위해서 반드시 필요한 부분인 거죠.
저는 네이버가 공개한 HyperCLOVAX-SEED-Text-Instruct-1.5B 모델의 토크나이저를 활용했습니다. 이 토크나이저는 대규모 한국어 데이터 기반으로 학습되었고, 한국어 능력에 특화되었다고 하더라고요. 사실, 한국어 특화된 언어 모델 중 이렇게 오픈되어 있는 모델은 아직은 많지 않습니다. 그것도 원천 모델들 중에서 말이죠. 제가 알기로는 네이버 이외에는 GPT 기반이거나 대부분 다른 기초 모델에서 한국어 능력을 고도화한 모델들이에요.
저는 한국어 원천 모델의 언어 사전 즉 토크나이저(tokenizer)를 추출해서 나의 모델에 이식하겠습니다.
STEP 1.토커나이저(tokenizer) 추출하기
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained( # hugging face에서 직접 네이버 모델을 가져옵니다.
"HyperCLOVAX-SEED-Text-Instruct-1.5B",
trust_remote_code=True
)
vocab_size = tokenizer.vocab_size
- tokenizer.vocab_size는 네이버 모델의 어휘수라고 할 수 있어요. 토크나이저가 사용하는 어휘의 크기니까요. 토크나이저는 물론, 이 어휘수도 나의 모델과 일치 시켜야 해요.
STEP 2.나의 모델에 토크나이저 이식 준비
from transformers import GPT2Config
config = GPT2Config(
vocab_size=vocab_size,
n_embd=1024,
n_layer=24,
n_head=16,
bos_token_id=tokenizer.bos_token_id,
eos_token_id=tokenizer.eos_token_id,
pad_token_id=tokenizer.pad_token_id
)
- 정확하게는 GPT-2 medium 모델을 사용합니다. 파라미터수는 345M로 저의 개인 로컬 PC에서 문제없이 실행될 수 있는 모델입니다.
- 추출한 네이버 모델에서 추출한 토크나이저의 문장의 시작과 끝, 그리고 입력 길이와 관련한 pad까지 적용을 합니다.
STEP 3.모델 생성 및 임베딩 조정
from transformers import AutoModelForCausalLM
model = AutoModelForCausalLM.from_config(config)
model.resize_token_embeddings(vocab_size)
- STEP 2에서 설정한 config를 실제로 적용하여 나의 기초 모델을 생성합니다.
STEP 4.모델 및 토크나이저 저장
save_path = "./gpt2_with_korean_tokenizer"
model.save_pretrained(save_path)
tokenizer.save_pretrained(save_path)
- 이제부터 이 모델을 계속 활용해야 하기에 생성한 모델을 저장합니다.
오늘은 여기까지 하고요, 다음에는 이제 생성한 모델을 이용해서 실제 한국어 학습을 해 보도록 할게요.
- 관련 이전 글: