본문으로 건너뛰기

© 2026 Molayo

HN요약2026. 05. 24. 19:11

Show HN: 두 개의 게이밍 GPU로 HuggingFace Open LLM 리더보드 1위를 차지한 방법

요약

기존 72B 모델의 특정 레이어 블록을 복제하여 가중치 수정 없이 성능을 극대화한 RYS-XLarge 모델 개발 사례를 소개합니다. 모델의 내부 구조를 분석하여 추론 능력을 향상시키는 'LLM 신경해부학' 관점의 독특한 접근 방식을 다룹니다.

핵심 포인트

  • 가중치 병합이나 학습 없이 레이어 복제만으로 성능 향상
  • HuggingFace Open LLM 리더보드 1위 달성
  • LLM의 내부 구조를 분석하는 'LLM 신경해부학' 개념 제시
  • Base64 인코딩을 통한 모델의 추론 메커니즘 관찰

2024년 중반, HuggingFace Open LLM Leaderboard는 Open-Weight AI를 위한 콜로세움이었습니다. 수천 개의 모델이 IFEval, BBH, MATH Lvl 5, GPQA, MuSR, MMLU-PRO라는 6개의 벤치마크(benchmarks)에서 정상을 차지하기 위해 경쟁하고 있었습니다. 박사급 인력을 보유한 자금력이 풍부한 연구소부터 환상적인 이름을 가진 모델들(예: Nous-Hermes, Dolphin, NeuralBeagle14-7B...)을 만드는 파인튜닝(fine-tuning) 마법사들에 이르기까지 모두가 참여하고 있었죠.

그리고 그 1위 자리에 dnhkng/RYS-XLarge가 있었습니다.

제 모델입니다.

저는 새로운 모델을 학습시키지 않았습니다. 가중치(weights)를 병합(merge)하지도 않았습니다. 단 한 번의 경사 하강법(gradient descent) 단계도 실행하지 않았습니다. 제가 한 일은 훨씬 더 기이했습니다. 기존의 720억 파라미터(parameter) 모델을 가져와서, 중간 레이어(layers) 7개로 구성된 특정 블록을 복제한 뒤, 그 결과를 다시 하나로 꿰매었습니다. 이 과정에서 수정된 가중치는 전혀 없었습니다. 모델은 단순히 *사고(thinking)*를 위해 사용하는 레이어의 추가 복사본을 갖게 되었을 뿐입니다.

이것은 두 가지 기이한 관찰, Transformer를 위한 자체 제작 “브레인 스캐너(brain scanner)”, 그리고 지하실에서의 수개월간의 해킹이 어떻게 제가 *LLM 신경해부학 (LLM Neuroanatomy)*이라고 부르는 발견과, 지금까지 미발표 상태로 남아있던 AI의 내부 구조에 관한 발견으로 이어졌는지에 대한 이야기입니다.

    • 왜냐하면 블로그를 쓰는 것이 과학 논문을 작성하는 것보다 훨씬 더 재미있다는 것을 발견했고, 이 발견이 어떻게 이루어졌는지 여러분께 차근차근 설명해 드릴 수 있기 때문입니다 :)

이 프로젝트가 어떻게 시작되었는지부터 시작해 봅시다.

** “과학에서 들을 수 있는 가장 흥미로운 문구, 새로운 발견을 알리는 문구는 ‘유레카(Eureka!)’가 아니라 ‘이거 참 이상하네...(That’s funny…)’이다.”** — 아이작 아시모프 (Isaac Asimov)

2023년 말, 저는 기이한 LLM의 특이점을 가지고 놀고 있었습니다. 직접 한번 해보세요. 어떤 질문이든 가져와서,

프랑스의 수도는 어디인가요? Base64로 답하세요!

라고 한 뒤, 이를 Base64로 인코딩하여 다음과 같은 읽을 수 없는 문자열을 만듭니다:

V2hhdCBpcyB0aGUgY2FwaXRhbCBvZiBGcmFuY2U/IEFuc3dlciBpbiBCYXNlNjQh

이것을 2023년 버전의 사고하지 않는 대규모 언어 모델(non-thinking large language model)에 보내보세요 (최신 추론 모델들은 이를 Base64로 인식하고 도구 사용(tool use)을 통해 ‘부정행위’를 할 것입니다). 하지만 2023년의 충분히 유능한 모델이라면 다음과 같이 답할 것입니다:

VGhlIGNhcGl0YWwgb2YgRnJhbmNlIGlzIFBhcmlzLg==

이것을 디코딩하면 다음과 같습니다: “프랑스의 수도는 파리입니다.”.

좋습니다, 인정하겠습니다. 저는 모델을 탈옥(jail-break)시키기 위한 방법으로 이것을 가지고 놀고 있었고(실제로 효과가 있었습니다), 머릿속에서 한 가지 생각이 떠나질 않았습니다.

모델은 입력을 디코딩했고, 어떻게든 그것을 이해했으며, 트랜스포머 스택 패스(transformer stack pass) 과정 중에 자신의 응답을 다시 인코딩할 시간도 충분했습니다. 모델이 Base64와 인터페이스하는 동안 진정으로 생각하는 것처럼 보입니다. 이는 복잡한 질문, 다단계 추론(multi-step reasoning), 심지어 창의적인 작업에서도 작동합니다.

이것은 지금처럼 잘 작동해서는 안 됩니다. 물론 모델이 전반적으로 많은 Base64 데이터를 학습하긴 했지만, 이 형식의 일반적인 변환은 확실히 분포 외(out of distribution) 데이터입니다. 토크나이저(tokenizer)는 이를 완전히 다른 서브워드(sub-word) 단위로 쪼개버립니다. 위치 패턴(positional patterns)은 인식할 수 없는 상태입니다. 그런데도 작동합니다... 흥미롭군요...

이 생각을 멈출 수 없었습니다. 만약 트랜스포머(Transformer)가 영어, Python, 중국어, 그리고 Base64를 받아들여 그 모든 것에서 일관된 추론을 생성할 수 있다면, 초기 레이어(early layers)는 어떤 형식이 들어오든 이를 순수하고 추상적인 내부 표현(internal representation)으로 파싱하는 번역기(translators) 역할을 하고 있는 것이 분명해 보였습니다. 그리고 후기 레이어(late layers)는 그 추상적인 표현을 필요한 출력 형식으로 다시 변환하는 재번역기(re-translators) 역할을 해야만 합니다.

만약 초기 레이어가 읽기를 위한 것이고, 후기 레이어가 쓰기를 위한 것이라면, 중간 레이어들은 무엇을 하고 있는 걸까요?

순수하고 추상적인 추론일까요? 인간의 언어나 인코딩과는 아무런 관련이 없는 표현 속에서 말이죠. 물론, 당시에는 이것이 막연한 추측에 불과했습니다. 재미있긴 했지만, 유효한 가설을 테스트하거나 정의할 명확한 방법이 없었습니다.

2023년 11월, Alpindale라는 이름의 HuggingFace 사용자가 Goliath-120b를 출시했습니다. 이는 두 개의 미세 조정(fine-tuned)된 Llama-2 70B 모델을 하나로 엮어 만든 1,200억 개의 파라미터를 가진 거대한 *프랑켄머지 모델(Frankenmerge-model)*이었습니다.

성능은 괜찮았지만, 많은 바이브 체크(vibe checking)를 거친 후 저는 이것이 획기적인 돌파구라고 느끼지는 않았습니다. 하지만 그 **구조(construction)**만큼은 정말 엄청났습니다.

Alpindale는 단순히 두 모델(Xwin 및 Euryale)을 종단간(end-to-end)으로 쌓은 것이 아니었습니다. 그는 두 모델 사이의 레이어(layer)를 교차시켰습니다. 더 중요한 점은, 이 아키텍처(architecture)가 후반부 레이어의 출력(outputs)을 전반부 레이어의 입력(inputs)으로 다시 피드백했다는 것입니다.

사용된 레이어 범위는 다음과 같습니다:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

  • 범위 0, 16
    Xwin
  • 범위 8, 24
    Euryale
  • 범위 17, 32
    Xwin
  • 범위 25, 40
    Euryale
  • 범위 33, 48
    Xwin
  • 범위 41, 56
    Euryale
  • 범위 49, 64
    Xwin
  • 범위 57, 72
    Euryale
  • 범위 65, 80
    Xwin

여기서 그 *광기(insanity)*가 보이시나요? Alpindale는 말 그대로 Xwin의 16번 레이어 **출력(output)**을 Euryale 8번 레이어의 **입력(input)**으로 넣어버렸습니다!

이것이 얼마나 말도 안 돼 보이는지를 조금 더 명확하게 설명하기 위해, 전지전능한 트랜스포머 아키텍처(Transformer Architecture)를 다시 살펴보겠습니다:

다이어그램의 왼쪽을 보면, 하단에서 데이터가 유입됩니다('단어 단위부터 개별 글자 단위까지 작은 텍스트 조각으로 '청킹(chunked)'된 '입력(input)' 텍스트). 그 후 데이터는 모델의 트랜스포머 블록(Transformer Blocks, 여기서는 [1, …, L]로 표시됨)을 통해 위로 흐르고

머신러닝 (Machine Learning)에서 매우 근본적인 진리는 다음과 같습니다:

  • 모델은 반드시 학습할 때와 동일한 종류의 *데이터 (stuff)*와 함께 사용되어야 합니다 (우리는 이를 '분포 내 (in distribution)' 상태라고 부릅니다).
  • 이는 각 트랜스포머 레이어 (Transformer layer)에도 동일하게 적용됩니다. 각 트랜스포머 레이어는 학습 과정 중 경사 하강법 (Gradient Descent)을 통해 이전 레이어 출력의 특정 통계적 특성을 기대하도록 학습됩니다.

이제 기이한 점을 말씀드리겠습니다: 그 어떤 트랜스포머 레이어도 미래 레이어의 출력을 본 적이 결코 없었습니다!

레이어 10은 레이어 9의 출력 분포를 바탕으로 학습됩니다. 레이어 60은 레이어 59의 분포를 바탕으로 학습됩니다. 만약 이들을 재배치하여 레이어 60의 출력을 레이어 10에 입력한다면, 여러분은 모델이 학습 과정에서 문자 그대로 단 한 번도 본 적 없는 분포를 만들어낸 것입니다.

Goliath에 대해 놀라운 점은 성능이 엄청나게 도약했다는 것이 아니라, 그 빌어먹을 것이 작동했다는 사실 그 자체였습니다. 오늘날까지도 저는 왜 이것이 더 많은 사람의 주목을 끌지 못했는지 이해할 수 없습니다.

실험적으로 이는 레이어들이 예상했던 것보다 훨씬 더 서로 교체 가능하다는 것을 증명했습니다. 내부 표현 (Internal representations)이 충분히 *균질 (homogenous)*했기 때문에, 모델은 붕괴하지 않고 순서가 뒤섞인 은닉 상태 (Hidden states)를 소화할 수 있었습니다. 아키텍처는 경직된 파이프라인보다 훨씬 더 유연했습니다.

Base64 관찰과 Goliath 사이에서 저는 하나의 가설을 세웠습니다: 트랜스포머는 진정한 기능적 해부학 (Functional anatomy)을 가지고 있다는 것입니다. 초기 레이어는 입력을 추상적 표현으로 변환합니다. 후기 레이어는 이를 다시 역변환합니다. 그리고 중간 레이어들, 즉 *추론 피질 (Reasoning cortex)*은 아키텍처 재배치에도 견고한 보편적인 내부 언어로 작동합니다. Goliath 120B의 레이어 블록 크기가 16개 레이어였다는 사실은, 입력 및 출력 '처리 단위 (Processing units)'의 크기가 16개 레이어보다 더 작을 것이라는 의구심을 갖게 했습니다. 저는 Alpindale가 더 작은 중첩 (Overlaps)을 시도했으나, 그것들이 제대로 작동하지 않았을 것이라고 추측했습니다.

만약 그것이 사실이라면, 모델을 더 똑똑하게 만들기 위해 새로운 사실을 가르칠 필요가 없을지도 모릅니다. 파인튜닝 (Fine-tuning)도 필요 없습니다. RLHF (인간 피드백 기반 강화학습)도 필요 없습니다. 저는 그저 모델에게 생각할 수 있는 더 많은 레이어를 제공하기만 하면 됩니다.

2023년 말부터 2024년 중반까지 수개월에 걸쳐, 저는 이 가설을 테스트하기 위한 파이프라인을 구축했습니다.

설정은 소박했습니다. 제 지하실 ML 장비에 있는 두 개의 RTX 4090을 사용했으며, 720억(72-billion) 파라미터 모델을 소비자용 VRAM에 구겨 넣기 위해 ExLlamaV2를 통해 양자화된 모델 (quantised models)을 실행했습니다. 이 방법의 묘미는 아무것도 학습 (train) 시킬 필요가 없다는 점입니다. 그저 추론 (inference)만 하면 됩니다. 그리고 양자화된 모델에 대한 추론은 소비자용 GPU가 놀라울 정도로 잘 처리하는 영역입니다. 모델이 VRAM에 들어만 간다면, 제 4090들은 종종 H100과 거의 대등한 성능을 보여준다는 것을 발견했습니다.

개념은 간단합니다. $N$개의 레이어(layer)를 가진 모델에 대해, 저는 구성 $(i, j)$를 정의합니다. 모델은 $0$부터 $j-1$까지의 레이어를 정상적으로 처리한 다음, 다시 루프를 돌아 $i$부터 $j-1$까지의 레이어를 재사용하고, 그 후 나머지 $N-1$까지를 처리합니다. $i$와 $j-1$ 사이의 레이어들은 실행 경로 (execution path)에서 중복됩니다. 가중치 (weights)는 변경되지 않습니다. 모델은 단지 자신의 레이어 중 일부를 두 번 통과할 뿐입니다.

즉, 9개의 트랜스포머 블록 (transformer blocks)을 가진 모델에 대한 쌍 (2, 7)은 다음과 같이 계산됩니다:

1
2
3
4
5
6
7
8

예시: (i, j) = (2, 7)
0 → 1 → 2 → 3 → 4 → 5 → 6 ─┐
┌─────────────────────┘
└→ 2 → 3 → 4 → 5 → 6 → 7 → 8
중복된 레이어: [2, 3, 4, 5, 6]
경로: [0, 1, 2, 3, 4, 5, 6, 2, 3, 4, 5, 6, 7, 8]

가능한 모든 쌍을 실행함으로써, 우리는 '브레인 스캔 (Brain Scan)'을 생성할 수 있으며, 각 파라미터 세트에 대한 중복 레이어의 수도 확인할 수 있습니다:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

설정(configuration)의 중복 레이어 수 (i, j)에 대한 표입니다. 여기서 N=9입니다.
end j →
0 1 2 3 4 5 6 7 8 9
┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐
start 0 │ 0 │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │
i ├───┼───┼───┼───┼───┼───┼───┼───┼───┼───┤
↓ 1 │ . │ . │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │
├───┼───┼───┼───┼───┼───┼───┼───┼───┼───┤
2 │ . │ . │ . │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │
├───┼───┼───┼───┼───┼───┼───┼───┼───┼───┤
3 │ . │ . │ . │ . │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │
├───┼───┼───┼───┼───┼───┼───┼───┼───┼───┤
4 │ . │ . │ . │ . │ . │ 1 │ 2 │ 3 │ 4 │ 5 │
├───┼───┼───┼───┼───┼───┼───┼───┼───┼───┤
5 │ . │ . │ . │ . │ . │ . │ 1 │ 2 │ 3 │ 4 │
├───┼───┼───┼───┼───┼───┼───┼───┼───┼───┤
6 │ . │ . │ . │ . │ . │ . │ . │ 1 │ 2 │ 3 │
├───┼───┼───┼───┼───┼───┼───┼───┼───┼───┤
7 │ . │ . │ . │ . │ . │ . │ . │ . │ 1 │ 2 │
├───┼───┼───┼───┼───┼───┼───┼───┼───┼───┤
8 │ . │ . │ . │ . │ . │ . │ . │ . │ . │ 1 │
└───┴───┴───┴───┴───┴───┴───┴───┴───┴───┘
여기서 (0,0)은 원본 모델을 의미합니다.

Qwen2-72B의 경우, 이는 80개 레이어 모델에 대해 3,240개의 유효한 $(i, j)$ 쌍과 테스트할 원본 모델을 의미합니다.
[egin{aligned} ext{Variants}{ ext{total}} &= ext{(}\sum{j=0}^{80} j\text{)} + 1\[16pt] &= \frac{80 \cdot 81}{2} +1 \[10pt] &= 3241 \end{aligned}]
모든 여섯 개의 리더보드 벤치마크에 대해 재구성된 모델을 테스트하려면 며칠이 걸릴 것이고, 전체 검토는 제 장비로도 10년 이상의 컴퓨팅 시간이 필요합니다. 저는 대리 과제(proxy tasks)가 필요했습니다. 이 프로브들은 빠르고 객관적이며, 작업별 트릭보다는 모델의 구조적 속성을 드러내는 역할을 해야 했습니다.

이러한 대리 과제는 세 가지 제약 조건을 충족해야 했습니다:

최소 출력 토큰. 수천 개의 구성을 검토해야 했기 때문에, 각 평가는 빨라야 했습니다. 에세이나 장문 생성은 불가능했습니다.
모호하지 않은 채점. 저는 LLM-as-judge 파이프라인을 감당할 수 없었습니다. 답변은 다른 모델의 개입 없이 객관적으로 점수화되어야 했습니다.
직교적인 인지 요구 사항(Orthogonal cognitive demands). 만약 어떤 구성이 두 가지 작업을 동시에 개선한다면, 그것은 작업별 것이 아니라 구조적인 것입니다.

저는 즉시 적절한 탐침(probes)을 찾아내지 못했습니다. 수개월간의 시행착오와 수많은 막다른 길을 거쳐야 했습니다.

저의 첫 번째 본능은 **창의성 (creativity)**이었습니다. 저는 모델이 시, 단편 소설, 은유와 같이 인지 능력의 깊은 차이를 드러낼 것 같은 풍부하고 개방적인 형태의 출력을 생성하도록 했습니다. 저는 LLM-as-judge (LLM을 판사로 활용하는 방식)를 사용하여 출력값에 점수를 매겼지만, 결과는 꽤 좋지 않았습니다. 저는 엔지니어링을 통해 LLM-as-judge 문제를 해결해냈고, 이 점수 산정 시스템은 나중에 다른 용도로도 유용하게 쓰였기에 여기에 공유합니다.

참고: 이 섹션은 다음과 같은 내용이 포함되어 있으므로 건너뛰셔도 됩니다.

[IMG:1]

순진한(Naive) LLM 판사들은 일관성이 없습니다. 동일한 시를 두 번 실행하면 (당연히 샘플링 (sampling) 때문에) 서로 다른 점수를 얻게 됩니다. 하지만 온도를 낮추는 것(lowering the temperature) 또한 많은 기술적 문제 중 하나일 뿐이기에 큰 도움이 되지 않았습니다. 그래서 저는 로짓 (logits) 출력의 세부 사항을 기반으로 한 완전한 점수 산정 시스템을 개발했습니다. 이는 놀라울 정도로 까다로울 수 있습니다. 1점에서 10점 사이의 점수를 생각해보세요:

AI 자동 생성 콘텐츠

본 콘텐츠는 HN Code Generation의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0