
목차
게임 스튜디오가 언어 모델을 훈련하는 이유
NETBYTE는 게임, 앱, 웹사이트를 만듭니다. 이런 제품 안에 언어 모델이 들어가는 일이 점점 늘고 있습니다. 말을 받아 주는 캐릭터, 질문을 이해하는 도움말, 실제로 무언가를 처리하는 도구로서 말이죠. 대부분의 공개 모델은 영어를 먼저 생각하고, 에스토니아어나 아일랜드어, 몰타어는 뒷전입니다. 저희는 데이터, 토크나이저, 아키텍처, 학습까지 전 과정을 직접 이해하고, 비용이 실제로 어디에 드는지 알고 싶었습니다.
- 파라미터
- 3.2억
- EU 공용어
- 24
- 학습 토큰
- 65억
- 임대 GPU 비용
- ≈ $12
Helix는 연구용 프로토타입으로 시작했습니다. 아래 내용은 모두 모델을 만든 결정이며, 각각 측정으로 뒷받침됩니다. 시간을 가장 많이 잡아먹은 실수들도 함께 적었습니다.
네 가지 아이디어, 살아남은 하나
프로토타입은 오늘날 텍스트 생성기의 잘 알려진 약점 네 가지를 겨냥했습니다. 토큰을 하나씩 쓰는 대신 16개 토큰 블록 단위로 쓰고, 공유된 레이어 코어를 여러 번 반복해 통과할 수 있으며, 블록마다 압축된 ‘계획’을 예측하고, 값싼 로컬 어텐션에 먼 거리용 선형 어텐션을 섞습니다.
블록 단위 쓰기는 바로 효과가 있었습니다. 작은 테스트 모델이 네트워크를 13번 통과해 64개 토큰을 썼는데, 일반 모델은 토큰마다 한 번씩 통과해야 하니 작업량이 약 5분의 1입니다. 나머지 세 아이디어는 더 어려운 시험에서 떨어졌습니다. 답이 로컬 윈도 훨씬 바깥에 있어서 모델이 텍스트 전체를 거슬러 봐야 하는 과제를 만들었기 때문입니다.
데이터 보기
| 변형 | 정답률 |
|---|---|
| 로컬 윈도만 | 23.1% |
| + 선형 어텐션, 계획, 반복 | 23.1% |
| + 정확한 전역 헤드 2개 | 49.4% |
| 전체 어텐션 (대조군) | 49.0% |
| 무작위 (25%) | 25.0% |
이 과제는 거리 전체에 걸친 정확한 어텐션만 풀었습니다. 선형 어텐션, 계획, 반복은 찍기 수준에 머물렀고, 옵티마이저는 선형 메모리의 반감기를 토큰 하나보다 짧게 줄여 버리기까지 했습니다. 정확한 전역 헤드 두 개만으로 전체 어텐션을 따라잡을 수 있었습니다.
그래서 최종 모델은 모든 레이어에 256토큰 윈도의 로컬 헤드 여덟 개를 두고, 한 레이어 걸러 정확한 전역 헤드 두 개를 더합니다. 그 사이 레이어에는 게이트 선형 어텐션 헤드 두 개가 남아 있습니다. 계획과 반복은 꺼 두었습니다. 코드에 남아 있고 테스트도 되어 있지만, 실제 텍스트에서는 비용만큼의 값을 하지 못했습니다.
- 로컬, 256토큰 윈도
- 정확한 전역 어텐션
- 게이트 선형 어텐션
데이터 보기
| 헤드 종류 | 레이어 | 레이어당 헤드 |
|---|---|---|
| 로컬, 256토큰 윈도 | 1–12 | 8 |
| 정확한 전역 어텐션 | 1, 3, 5, 7, 9, 11 | 2 |
| 게이트 선형 어텐션 | 2, 4, 6, 8, 10, 12 | 2 |
추측하지 말고 측정하기
모든 학습 기법은 파라미터 9,400만 개짜리 모델에서 실행마다 같은 예산으로 시험했습니다. 토큰 2,950만 개, 같은 시드, 같은 데이터 순서입니다. 같은 설정을 두 번 실행하면 ±0.03만큼 차이가 나므로, 그보다 작은 차이는 모두 노이즈입니다.
데이터 보기
| 변경 | Δ 손실 (나트) |
|---|---|
| Muon + WSD 스케줄 | -0.587 |
| Muon 옵티마이저 | -0.347 |
| 더 깊고 좁은 네트워크 | -0.099 |
| WSD 스케줄 | -0.080 |
| 값 잔차 연결 | -0.007 |
| z-loss | +0.029 |
| 그룹 쿼리 어텐션 | +0.088 |
Muon 옵티마이저가 유일하게 큰 효과를 냈고, warmup-stable-decay 학습률 스케줄과 함께 쓸 수 있습니다. Muon 저자들이 권하는 대로 임베딩과 출력 레이어를 다시 AdamW로 돌리자 0.12가 더 좋아졌고 학습도 5% 빨라졌습니다. 조합은 단순히 더해지지 않습니다. 더 깊고 좁은 네트워크는 AdamW에서는 도움이 됐지만 Muon에서는 오히려 손해였습니다. 그래서 유망한 조합마다 따로 실행했습니다.
24개 언어, 65억 토큰
Helix는 영어는 FineWeb-Edu에서, 나머지 23개 언어는 FineWeb-2에서 웹 텍스트를 읽습니다. 큰 언어는 그중 품질 필터를 거친 상위 10%를 씁니다. 코드, 수학, 작은 합성 채팅 스트림이 혼합을 완성합니다. 영어가 3분의 1을 차지합니다. 나머지 언어는 존재하는 텍스트 양에 따라 가중치를 주되, 아일랜드어와 몰타어가 묻히지 않도록 평탄화했습니다. 어떤 출처도 네 번 넘게 반복하지 않는데, 그 정도까지는 반복이 새 데이터와 거의 비슷하게 좋기 때문입니다.
데이터 보기
| 출처 | 비율 |
|---|---|
| 기타 EU 언어 23개 | 51.6% |
| 영어 | 33.0% |
| 코드와 마크업 | 10.0% |
| 수학 | 3.0% |
| 합성 채팅과 도구 | 2.4% |
채팅 스트림은 추출식입니다. 답변은 실제 문단에서 가져오고, 도구 결과는 지어내지 않고 계산합니다. 지식이 아니라 형식을 가르치는 데이터입니다. 토크나이저는 항목 64,000개의 바이트 수준 BPE로, 라틴 문자를 쓰는 모든 언어에서 토큰 하나에 텍스트 3.3~4바이트를 담습니다.
이야기할 만한 버그 세 가지
- 답을 미리 읽은 모델. 한 코드 경로에서 전역 헤드가 인과 마스크를 무시해 미래 토큰을 볼 수 있었습니다. 손실이 75스텝 만에 6.85에서 1.71로 떨어졌고, 16시간짜리 실행 하나가 쓸모없어졌습니다. 의심스러울 만큼 좋은 손실은 버그 신고입니다. 이제 회귀 테스트가 바로 이 경우를 지킵니다.
- 문자는 바이트가 아니다. 압축률을 UTF-8 바이트가 아니라 문자 단위로 셌습니다. 그 때문에 중국어에 없는 ‘약점’이 생겼고, 그리스어와 불가리아어는 실제보다 거의 두 배나 나빠 보였습니다.
- 빈 줄마다 잘린 문서. 인코더가 빈 줄이 나올 때마다 문서를 나눴는데, 빈 줄은 거의 모든 소스 파일 한가운데에 있습니다. 코드와 수학 텍스트의 최대 35%가 사라졌습니다. 구분자를 고치고 10월 31일에 코퍼스 전체를 다시 만들었고, 2시간 12분이 걸렸습니다.
책상에서 임대 장비로
처음 16억 6천만 토큰은 AMD Radeon RX 7800 XT 한 장에서 돌렸습니다. 이를 쓸 만하게 만든 것은 두 가지입니다. 기본값이 꺼져 있는 어텐션 커널 플래그(이것 없이는 어텐션이 12배 느렸습니다)와 torch.compile로 모든 레이어를 컴파일한 것입니다. 초당 토큰 중앙값 11,800개로는 나머지를 마치는 데 거의 닷새가 더 걸렸을 겁니다.
그래서 오토파일럿을 만들었습니다. Vast.ai에서 GPU를 빌리고, 코드와 코퍼스와 체크포인트를 올리고, 학습하고, 세 시간마다 체크포인트를 집으로 가져오고, 크레딧이 떨어지기 전에 멈춥니다. 11월 2일에는 제공자가 끝내 시작하지 않은 장비 세 대를 거친 뒤 독일에 있는 RTX 4070 Ti Super 두 장에 시간당 $0.363로 자리 잡았습니다. 15.4 GiB 업로드에는 40분이 걸렸습니다.
데이터 보기
| 구성 | 토큰/초 |
|---|---|
| 로컬, 최적화 전 | 8,319 |
| 로컬, 컴파일 후 | 11,830 |
| 임대, GPU 2장 | 41,367 |
초당 41,400 토큰은 책상 장비의 3.5배입니다. 임대한 부분, 즉 약 33시간 동안의 48억 토큰은 대략 $12가 듭니다.
Helix의 현재 위치
- 홀드아웃
- 학습
손실 (토큰당 나트)
읽은 토큰 (10억 단위)
데이터 보기
| 읽은 토큰 (10억 단위) | 홀드아웃 | 학습 |
|---|---|---|
| 0.06 | 4.571 | 4.261 |
| 0.55 | 3.776 | 3.574 |
| 1.04 | 3.694 | 3.469 |
| 1.54 | 3.596 | 3.421 |
| 2.03 | 3.426 | 3.238 |
| 2.52 | 3.329 | 3.143 |
| 3.01 | 3.291 | 3.113 |
| 3.50 | 3.263 | 3.076 |
| 3.99 | 3.225 | 3.079 |
| 4.49 | 3.244 | 3.076 |
| 4.98 | 3.218 | 3.036 |
| 5.35 | 3.123 | 2.884 |
2026년 11월 3일 기준으로 Helix는 65억 토큰 중 53억 5천만 토큰을 읽었습니다. 52억 토큰부터는 쿨다운 단계입니다. 학습률이 내려가고 혼합 비율이 수학, 코드, 채팅 쪽으로 옮겨 갑니다. 모든 스트림의 홀드아웃 텍스트에서 손실은 토큰당 3.12나트입니다.
데이터 보기
| 언어 | 바이트당 비트 |
|---|---|
| 그리스어 | 0.721 |
| 불가리아어 | 0.844 |
| 프랑스어 | 1.065 |
| 영어 | 1.086 |
| 스페인어 | 1.135 |
| 포르투갈어 | 1.219 |
| 독일어 | 1.257 |
| 네덜란드어 | 1.268 |
| 이탈리아어 | 1.277 |
| 폴란드어 | 1.355 |
| 덴마크어 | 1.364 |
| 헝가리어 | 1.407 |
| 슬로바키아어 | 1.412 |
| 몰타어 | 1.415 |
| 루마니아어 | 1.416 |
| 스웨덴어 | 1.418 |
| 아일랜드어 | 1.422 |
| 슬로베니아어 | 1.431 |
| 체코어 | 1.444 |
| 리투아니아어 | 1.450 |
| 라트비아어 | 1.451 |
| 크로아티아어 | 1.507 |
| 핀란드어 | 1.508 |
| 에스토니아어 | 1.727 |
이게 실제로 무엇을 뜻하는지는 약 49억 토큰 시점 체크포인트에서 뽑은, 손대지 않은 샘플이 가장 잘 보여 줍니다. 앞부분은 저희가 쓴 것이고 나머지는 Helix가 썼습니다.
시작 문장: The history of the printing press begins in the fifteenth century, when Johannes Gutenberg introduced movable type to Europe. Before that, books
모델 출력: for printing were usually in the form of texts, usually in the format of illustrations. In its introduction to the printing press, Gutenberg uses one line-of-action model to illustrate a series of printed pieces of a book.
문법, 단어 선택, 주제는 유지되지만 사실은 그렇지 않습니다. 파라미터 3억 2천만 개와 토큰 65억 개에서 기대할 수 있는 수준이 대략 이 정도입니다. 유창하지만 지어내는 모델이죠.
다음 단계
사전 학습은 몇 시간 안에 끝납니다. 그다음에는 Project Gutenberg의 책과 EUR-Lex의 EU 법률 문서로 하는 긴 문맥 단계, 대화와 도구 사용을 위한 미세 조정, 그리고 생성 속도를 높이는 작은 초안 모델이 이어집니다.