Hacker News

Show HN: Mini-AGI – Dynamic continual learning model trained on 8GB VRAM

Show HN: Mini-AGI — 8GB VRAM에서 학습하는 동적 지속 학습 모델

mini-AGI는 8GB VRAM GPU 한 장에서 처음부터 학습하며, 디스크에 둔 전문가 가중치를 필요할 때만 VRAM으로 올리는 byte-level language model입니다. 전문가를 동적으로 추가·삭제하고 trunk 학습률을 낮춰 지속 학습 중 망각을 줄이는 실험을 제시하지만, 아직 toy-level이며 일반화 성능은 검증되지 않았습니다.

AI 요약

mini-AGI는 고정된 사전학습 모델을 미세 조정하는 대신, 소비자용 GPU에서 처음부터 계속 학습하는 byte-level language model을 만들려는 프로젝트입니다. 현재 모델은 frontier급 성능을 목표로 한 완성품이 아니라, 한 스트림의 데이터를 계속 읽으면서 catastrophic forgetting을 줄일 수 있는지 확인하는 toy-level 실험입니다. 저자는 8GB VRAM을 가진 PC나 노트북이면 각자 데이터를 정해 모델을 학습할 수 있다고 설명합니다.

■ 8GB VRAM에 맞춘 저장 구조

학습에는 가중치뿐 아니라 gradient와 optimizer state도 필요하므로, 단순한 양자화만으로는 8GB 제약을 해결하기 어렵습니다. mini-AGI는 모든 expert의 가중치와 Adam moments를 디스크에 파일로 저장하고, 현재 텍스트가 요구하는 working set만 VRAM에 올립니다. RAM에는 최근 사용한 expert를 캐시하고, VRAM에는 한 번에 32개 expert를 상주시킵니다. 나머지는 디스크에 남겨 둡니다.

expert를 교체할 때 Adam moments도 해당 expert와 함께 이동합니다. VRAM 슬롯에 optimizer state를 남기면 새 expert가 이전 expert의 momentum을 물려받기 때문입니다. 이미 카드에 올라온 expert는 슬롯을 유지해 실제 집합이 바뀐 만큼만 로드합니다. 다음에 읽을 chunk를 미리 보지 못하도록 working set은 이전 chunk에서 수집한 routing 정보를 바탕으로 정합니다. 후보가 resident expert를 일정 margin 이상 앞서야 교체하고, 새 expert는 일정 시간 동안 유지하는 hysteresis도 적용합니다.

현재 318.1M characters를 읽은 상태에서 pool에는 169개 expert가 있으며 전체 파라미터는 540.1M입니다. core가 8.27M, routers가 0.17M, expert가 531.6M을 차지합니다. VRAM에 올라가는 expert는 약 109M 파라미터뿐이며, 전체 pool 크기와 VRAM 사용량을 분리했습니다. 학습 비용은 byte당 약 2.4 GFLOPs로, dense 400M byte-level transformer와 비슷한 compute class라고 설명합니다.

■ byte-level 입력과 동적 구조

입력 vocabulary는 256개 byte 값과 구조용 marker 9개를 합친 265개입니다. 별도 tokenizer나 새 데이터 종류에 맞춘 vocabulary가 필요하지 않습니다. context는 4,096에서 시작하며, 모델이 긴 문맥 끝부분에서도 계속 정보를 얻을 때만 학습을 이어가며 확장합니다.

일반적인 Transformer처럼 모든 문자가 고정된 layer stack을 통과하지 않습니다. 두 개의 dense prelude block 뒤에 weight-shared recurrent block을 최대 24회 적용합니다. 각 적용 단계마다 shared pool에서 top-8 expert를 고르고, 문자마다 필요한 계산 깊이를 다르게 정합니다. halting head가 각 문자와 각 row를 평가해 더 계산해도 결과가 바뀌지 않는다고 판단하면 멈춥니다. 따라서 쉬운 문자는 한 row만 쓰고, 어려운 문자는 최대 24회까지 반복합니다. 전체 구조는 문자 하나당 최대 26번의 block application을 수행합니다.

recurrent block 사이의 latent state는 다시 문자로 decode하지 않습니다. 매 단계에서 embedded input과 adapter로 합쳐 텍스트와의 연결을 유지합니다. 생성과 학습도 같은 forward path를 사용합니다. 외부 파일에서 다음 문자를 읽으면 학습하고, 생성에서는 모델의 argmax를 다음 문자로 사용한다는 차이만 있습니다. 생성 실험은 2,500 characters의 이야기로 priming한 뒤 greedy decoding으로 이어 쓰며, 같은 실행을 반복하면 같은 문장이 나옵니다.

■ expert의 성장과 pruning

pool은 학습 중 capacity가 부족하면 expert를 추가하고, 오랫동안 호출되지 않은 expert는 삭제합니다. 새 expert는 기존 expert 여러 개에서 hidden unit을 가져와 recombination으로 만들며, 작은 gate에서 시작해 모델에 미치는 영향을 제한합니다. 새 expert가 survival window 동안 계속 호출될 때만 유지합니다. 성장 조건에는 디스크와 VRAM 여유, 기존 capacity 사용량, 이전 cohort의 생존 여부, trial 중인 expert 수, train과 held-out loss의 분리 여부가 모두 포함됩니다.

저자가 기록한 가장 중요한 관찰은 gate 값이 expert의 생존 여부를 판단하는 지표가 아니라는 점입니다. 실제 사용 빈도가 낮은 expert를 dead로 간주해야 하며, 작은 gate를 가진 expert가 오히려 자주 선택되는 경우도 있었습니다. gate가 낮다고 죽은 expert로 판단하면 busy expert를 잘못 제거할 수 있습니다.

■ catastrophic forgetting 실험

저자는 모델이 chess 데이터 524,000 characters만 읽도록 하고, 읽지 않은 7개 subject의 held-out loss가 어떻게 변하는지 비교했습니다. expert와 trunk에 같은 learning rate를 적용하면 loss가 +2.2300 nats 상승했고, working set을 고정한 구성에서는 +2.5871 nats 상승했습니다. 반면 trunk의 learning rate를 expert의 0.1배로 낮추자 상승폭이 +0.0067 nats에 그쳤습니다. 저자가 계산한 chance 대비 성능 보존율은 각각 50.68%, 42.88%, 99.84%입니다. 모든 subject를 함께 읽은 control은 -0.0077 nats였습니다.

trunk는 embedding, attention, router, halting head처럼 모든 문자가 통과하는 부분이며 squared gradient norm의 97.6%를 차지합니다. expert보다 trunk를 느리게 학습하면 한 subject를 읽는 동안 다른 subject에 대한 손상이 줄어든다는 설명입니다. 이 실험에서 136개 expert 중 실제 gradient를 받은 expert는 54개뿐이었고, 60%는 구조적으로 업데이트되지 않았습니다. 저자는 expert pool 자체보다 업데이트가 실제로 선택된 부분에 머무는 구조와 trunk learning rate 차이가 망각 억제에 기여한다고 해석합니다.

이전 지식을 완전히 파괴하기보다 다른 지식이 덮어쓰는 displacement에 가깝다는 관찰도 제시합니다. 성능이 크게 떨어진 뒤 전체 데이터를 다시 읽으면 약 131,000 characters 안에 손실된 지식의 4분의 3이 돌아왔습니다. 처음 학습에 약 50M characters가 필요했던 것과 비교하면 재학습이 훨씬 빠르지만, 저자는 이 결과를 완전한 기억 보존으로 표현하지 않습니다.

■ 현재 성능과 실행 방법

현재 held-out loss는 0.8336 ± 0.0331 nats per character, 1.2026 bits per byte입니다. subject별 bits per byte는 chess 0.796, stories 0.919, arithmetic 0.948, code 1.066, reasoning 1.145, chat 1.199, chat_hermes 1.699, wikipedia 1.847입니다. 다만 동일한 configuration을 두 번 실행해도 CUDA의 비결정적 expert dispatch 때문에 약 0.014 차이가 나므로, 저자는 약 0.03 이상 차이만 실제 변화로 보라고 안내합니다.

MambaByte-353M은 비슷한 파라미터 규모와 byte당 FLOPs를 가진 비교 대상으로 제시됩니다. 다만 해당 모델은 mini-AGI보다 94배 많은 데이터를 읽었고, Transformer-320M은 251배 많은 데이터를 읽었습니다. 현재 결과는 데이터 규모가 크게 부족한 상태에서의 중간 기록입니다. 저자는 warmup 이후 loss 추세를 L ∝ D^-0.239, R² 0.96으로 맞췄지만, fitting 구간에 따라 지수는 0.21에서 0.32까지 달라집니다.

실행에는 CUDA GPU 8GB 이상과 Python 3.10 이상이 필요합니다. 기준 장비는 RTX 3070 Laptop GPU 8GB입니다. 저장소를 clone하고 PyTorch, NumPy, PyYAML 등을 설치한 뒤 python3 -m corpora all로 corpus를 만들거나 자기 파일과 디렉터리를 바로 지정합니다. python3 train.py read ~/src ~/docs --passes 3 --save처럼 읽히며, --save가 없으면 dry read로 끝나 weights를 저장하지 않습니다. 읽기와 학습은 같은 chunking, cache, gradient step 경로를 사용합니다. 별도 웹 UI는 python3 serve.py --port 8080으로 실행합니다.

learning rate는 cosine schedule 대신 held-out loss를 관찰하는 controller가 조절합니다. 개선이 확인되면 조금 올리고, 근거가 약하면 낮춥니다. held-out loss가 크게 악화되면 저장된 best state를 다시 불러오고 learning rate를 절반으로 줄인 뒤 context도 되돌립니다. 학습 run은 첫 corpus pass를 아직 끝내지 않았고, 원문 작성 시점에는 weights를 공개하지 않았습니다.

■ HN에서 제기된 한계

커뮤니티에서는 8GB VRAM에서 동작하는 구조와 expert swapping을 긍정적으로 본 반응이 있었지만, AGI라는 이름과 성능 검증 사이의 간극을 지적하는 의견도 많았습니다. generalization, unseen dataset 성능, 주제 전환 뒤 초기 지식 유지 여부가 충분히 검증되지 않았다는 질문이 나왔습니다. 작성자도 모델이 너무 작고 덜 학습된 상태라 generalization 주장을 할 수 없으며, corpus 전체를 읽은 뒤 간단한 benchmark를 시도하겠다고 답했습니다.

일부 댓글은 524,000 characters의 chess 실험만으로 continual learning을 입증하기 어렵고, 논문 수준의 ablation이나 관련 연구와의 비교가 부족하다고 비판했습니다. 작성자는 별도의 특수 알고리즘이 아니라 trunk learning rate를 expert보다 낮추는 설정이 관찰된 결과의 핵심이며, 현재는 학술 논문이나 major breakthrough를 주장하는 프로젝트가 아니라고 설명했습니다.

■ Hacker News 반응

  • @hexley19 — ‘Mini-AGI’와 ‘8GB VRAM’이 같은 문장에 등장하는 걸 보니 신선합니다. 로컬 AGI가 생각보다 멀지 않을지도 모릅니다.
  • @whizzter — 아무도 돌을 던지지는 않을 것 같습니다. 대부분 사람은 대형 업체를 궁금해하고 의심하며, 이 모든 것이 곧 충분히 저렴해질 것으로 보기에 직접 만져 보고 싶어 합니다.
  • @skeledrew — 인간 뇌가 작동하는 방식에 개념적으로 더 가까워지는 것 같습니다. 이런 시도가 계속되길 기대합니다.
    • @volotat — 저도 유기적인 점이 마음에 듭니다. 사용하지 않는 요소를 자연스럽게 키우고 삭제하므로, 전통적인 backpropagation 외에 자연 선택도 뒤에서 일어납니다. 참고로 새 expert 하나에는 부모가 16개씩 있습니다.
  • @advael — 흥미로워 보입니다. 최근 continual learning 접근법을 많이 실험하고 있는데, catastrophic forgetting을 피하는 것부터 설계한 점이 좋습니다. 일단 clone해 볼 만합니다.
    • @lostmsu — catastrophic forgetting을 해결했다는 징후는 보이지 않습니다.
  • @cpldcpu — 이 architecture가 실제로 generalization을 할 수 있습니까, 아니면 대부분 memorization에 의존합니까? 숫자 덧셈처럼 generalization이 필요한 기본 과제를 시도해 봤습니까?
    • @volotat — 모델이 너무 작고 덜 학습된 상태라 generalization에 관해 주장하기는 어렵습니다. 제공한 corpus를 전부 읽은 뒤 간단한 표준 benchmark에서 어떻게 동작하는지 확인하고 싶습니다.
    • @jacquesm — 학습에는 어떤 hardware를 사용합니까? 아, 찾았습니다. RTX 3070 Laptop GPU 8GB군요. 정말 인상적입니다.
    • @dinfinity — 제 생각에는 HN에 올리기엔 조금 이릅니다. 흥미로운 아이디어이지만 아직 실제로 흥미로운 일을 하지는 않습니다. 학습 run의 출력을 확인했는데, 어느 시점에도 coherent response가 나오지 않았습니다. 현재 상태는 GPT-2보다도 훨씬 나쁩니다. 규모를 키우고 충분히 학습했을 때 성능이 나오길 바랍니다.
  • @hanselot — 정말 감사합니다. 이게 빠져 있던 조각입니다.
  • @ilusion — 입력 주제가 바뀐 뒤 stream 초반에 학습한 내용을 얼마나 기억하는지 테스트했습니까?
    • @volotat — 전체 corpus를 읽을 때는 각각 32K characters인 random stream을 interleave하지만, 각 stream 안에서는 예상대로 연속해서 읽습니다. 일반적인 forgetting을 막으려면 필요한 단계입니다. 더 크거나 작은 window를 쓰는 다른 조건은 아직 테스트하지 않았습니다. 활동을 가끔 바꾸는 사람을 생각하면 정당한 설정이라고 봅니다. 그래서 실제로는 stream 초반이라는 구분이 없습니다. 대신 chess 데이터만 524K characters 읽고 다른 domain 성능이 얼마나 떨어지는지 측정했습니다. 결과는 README의 How continual learning works 부분에 있습니다. 미리 말하면 성능은 거의 떨어지지 않았습니다.
  • @bananaflag — 제 인생에서 proto-AGI처럼 보이는 것을 실제로 본 건 이번이 처음입니다. 이름을 쓸 자격이 있습니다.
  • @awfm9 — context management와 RAG를 잘하는 것과 비교했을 때 이 방식의 장점은 무엇입니까? 학습된 지식은 손실 방식으로 만들어지므로 신뢰하기 어렵다고 늘 생각했습니다.
    • @dinfinity — 사람인 여러분이 직접 학습한 지식도 신뢰하기 어렵다고 생각합니까?
  • @comboy — 보지 못한 dataset에서 character prediction rate는 어느 정도입니까?
    • @volotat — README에 보고한 held-out score가 unseen dataset 결과입니다.
  • @lostmsu — 이건 slop입니다. enwik9에서 2시간 동안 학습한 context length 64의 8M parameter dense model도 1.15 bpb가 나옵니다. 이 모델은 1.8 bpb입니다. bits per byte는 낮을수록 좋습니다.
  • @maaaaattttt — 전체 구조를 self-similar하게 만드는 방법을 생각해 본 적이 있습니까? MoE를 들을 때마다 왜 더 깊게 만들지 않는지 생각합니다. expert가 이전에 학습한 Mini-AGI model이 되도록 architecture를 확장하거나 조정할 수 있습니까? 직관적으로는 recurrence stack의 상위 expert가 intuition layer처럼 작동하면서 어느 정도 generalization이 가능할 것 같습니다.
    • @killerstorm — 작은 module을 많이 묶은 model은 GPU에서 비효율적입니다. routing이 data dependency를 추가하고, 특히 PyTorch에서는 custom kernel과 비교할 때 더 그렇습니다. 병렬성이 제한된 CPU에서는 차이가 작을 수 있습니다. 하지만 결국 매우 깊은 model을 만드는 것과 비슷하며, 학습이 어려워질 수 있습니다.
  • @ilaksh — 링크된 transcript를 실제로 훑어보면 학습처럼 보이는 일이 일어나는 것은 확인할 수 있지만, 어느 시점에도 coherent response는 나오지 않았습니다. 제가 대충 훑은 범위에서는 그랬습니다. 그래서 어떤 benchmark도 없는 것일 수 있습니다.
    • @synctext — 성능 분석 없이 AGI라는 용어를 사용하고 있습니다. 제 AI는 이를 massive marketing overreach라고 부릅니다. 댓글에서 누군가 slop이라고 했는데, continual learning 논문을 낸 교수로서 저도 그 의견에 가깝습니다. 관련 연구와의 관계, algorithm 설명, ablation study가 없고, 데이터를 넣으면 Chess를 잊지 않는다는 식의 설명뿐입니다. README의 How continual learning works 문서는 algorithm이 아닙니다.
    • @ilaksh — 주장만 보고 시간을 낭비한 것 같아 화가 납니다. 학습됐다고 암시하고 AGI와 continuous learning이라는 용어를 사용하지만, training run 하나도 끝내지 않았습니다. 실제로 유용한 것을 학습할 수 있다는 증거도 없습니다.
    • @synctext — 맞습니다. HN의 시간을 낭비하고 있습니다. 모델이 chess 데이터를 524,000 characters 읽었다는 말은 toy model에서 100KB 정도의 training data를 읽었다는 뜻이며, 파라미터는 고정되어 있고 global learning도 없습니다. 실제 LLM과 수조 개 token 사이의 격차가 큽니다.
    • @volotat — 특별한 algorithm은 없습니다. expert의 learning rate는 유지하면서 trunk의 learning rate를 낮추면 network에서 forgetting 대부분이 사라진다는 것이 관찰된 결과입니다. chess 데이터만 524K characters 읽은 실험에서도 다른 domain의 held-out loss가 거의 유지됐습니다. network 전체에 같은 learning rate를 적용하면 다른 domain의 loss가 크게 악화됩니다. 이는 catastrophic forgetting이 발생한다는 분명한 신호입니다. benchmark를 공개하지 않은 이유는 모델이 심하게 undertrained됐기 때문입니다. 그래도 loss와 sample을 보면 아직 barely coherent하지만 학습 중이라는 점은 확인할 수 있습니다. 저는 학술 연구자도 아니고 major breakthrough를 발표하려는 것도 아닙니다. 작동하는 흥미로운 현상을 발견했고 공유하고 싶었을 뿐입니다.
  • @imtringued — expert swapping architecture가 좋습니다. nested reinforcement learning을 사용해 nesting을 일종의 low-pass filter로 만드는 방법을 생각해 봤습니까? critic이 datastream을 모방하도록 학습한 다음 data 대신 critic을 대상으로 학습하는 방식입니다. online stochastic gradient descent의 큰 문제 중 하나는 training data가 memory 역할을 한다는 점입니다. 더 깊은 nesting을 사용하고 supervised critic을 제거하는 방향으로 확장할 수도 있습니다. top-level critic은 labeled training data를 모방하고, mid-level critic은 unlabeled stream과 top-level critic의 결과만 보면서 reward function을 학습합니다. actor는 mid-level critic만 대상으로 학습합니다. 그러면 기존 training data가 mid-level critic 안에 objective로 저장되어 최신 data와 이미 기억한 data를 함께 대상으로 삼게 되므로 catastrophic forgetting을 줄일 수 있습니다. 나중에는 더 넓은 Linear RNN, State Space Model, Mamba, Gated Delta Net을 middle critic으로 쓰고, 내부 RNN state를 LoRA vector로 표현하는 방법도 생각해 볼 수 있습니다.
  • @K0balt — tokenization을 사용하면 어떻게 될지도 궁금합니다. tokenization은 model이 syntactic level이 아니라 semantic level에서 작동하게 하지 않습니까? 저는 force multiplier가 될 것 같지만, 이 구조에서 작동할지는 모르겠습니다.

원문: GitHub README, Hacker News / 번역·요약: Trawling