Hacker News

WorldTUI: I trained a 360M model to pretend to be a terminal

WorldTUI: 3억 6천만 매개변수 모델을 터미널인 척하도록 학습시켰습니다

WorldTUI는 실제 셸이나 파일시스템 없이 키 입력마다 터미널 화면의 변화를 예측하는 3억 6천만 매개변수 모델입니다. 화면 행 병렬 디코딩과 자기 오류 수정 학습으로 속도와 일관성을 높였지만, 파일 읽기 테스트는 13회 중 9회 성공해 실제 터미널처럼 신뢰할 수 있는 수준은 아닙니다.

에디터 노트

WorldTUI가 보여준 가장 구체적인 성과는 터미널을 대체하는 일이 아니라, 작은 모델이 상태를 얼마나 이어갈 수 있는지 측정하고 학습하는 방법입니다. 저자 테스트에서 프롬프트만 넣은 모델보다 파일 읽기 결과가 나아졌고, 자기 오류를 고치는 학습도 PresetBench 점수를 높였습니다. 다만 파일 테스트는 짧은 간격으로 이뤄졌고 비교 표의 읽기 횟수도 13회입니다. 이를 실제 파일시스템의 지속성으로 넓혀 해석할 근거는 없습니다. 댓글에서 허니팟이나 지연이 큰 SSH의 즉시 반응 같은 응용이 제안됐지만, 데모는 실제 파일을 쓰지 않고 Firefox에서 훨씬 느립니다. 작성자는 허니팟 운영 비용도 우려했습니다. 따라서 당장 실용적인 터미널이라기보다 화면 상태 예측과 오류 보정, 행 병렬 디코딩이 작은 모델의 일관성에 어떤 영향을 주는지 확인하는 실험으로 보는 편이 정확합니다. 실제 시스템과 연결하는 순간에는 이 데모가 보여준 성능과 별도의 검증이 필요합니다.

AI 요약

터미널을 흉내 내는 소형 언어 모델 WorldTUI는 Qwen2.5-Coder-0.5B를 미세 조정해 만들었습니다. 실제 셸이나 파일시스템은 없으며, 키 입력과 이전 화면을 바탕으로 다음 화면에서 바뀔 행과 커서 위치를 예측합니다. 브라우저 데모는 208MB 모델을 WebGPU로 실행합니다.

화면 변화 표현

일반적인 언어 모델처럼 출력 문자열을 이어 붙이는 대신 터미널을 문자 격자로 다룹니다. 세션 시작 때 화면 크기와 내용, 커서 위치를 입력하고 이후에는 키 입력을 실제 터미널이 받는 바이트 형태로 전달합니다. 모델은 수정할 행과 해당 행에서 바꿀 위치, 커서 위치를 반환합니다. 화면을 지우지 않고 새 문자를 기존 화면 위에 덮어씁니다.

화면을 통째로 다시 출력하면 한 번의 키 입력에 약 3,000개 토큰이 들 수 있어 COPY 연산을 추가했습니다. 이전 화면의 행을 새 화면의 행으로 복사하므로 스크롤 같은 변화는 행마다 세 토큰으로 표현합니다. 전체 어휘는 바이트 토큰 256개와 행 토큰 64개, 몇 가지 특수 연산을 합쳐 333개입니다. 문법 제약 디코딩으로 화면 갱신 형식도 유효한 값만 출력하게 합니다.

학습 데이터와 자기 오류 수정

기존 터미널 기록 데이터는 키 입력과 화면을 필요한 정밀도로 짝지은 자료가 없어 Docker 안에서 실제 프로그램을 실행해 직접 만들었습니다. 사용자와 호스트 이름, 프롬프트, 터미널 크기, 파일과 작업을 다양하게 바꾸고 사람처럼 한 글자씩 입력하는 세션을 기록했습니다. 세션의 35%는 프로그램이나 작업 중간 화면에서 시작합니다. 최종 데이터는 33만 6천 개 에피소드, 약 20억 토큰입니다.

기본 지도 미세 조정만으로는 긴 세션에서 파일명 오류가 이어지는 문제가 생겼습니다. 이를 줄이려고 DAgger 방식에서 아이디어를 얻어 모델이 실제로 방문한 화면 상태를 학습에 넣었습니다. 모델이 다음 1~4개 이벤트를 예측하고 실제 기록과 비교한 뒤, 이전에 입력이나 실제 화면에 나타난 정보만 사용해 다음 키 입력에서 화면을 바로잡는 예제를 만듭니다. 모델이 한 번도 보지 못한 파일명을 교정 정보로 넣으면 환각을 보상하게 되므로 이런 예제는 제외합니다. 세 차례 반복했고, PresetBench 점수는 int4 모델 기준 24/47에서 38/47로 올랐습니다. 학습과 후속 조정에는 RTX 4090에서 약 75 GPU 시간이 들었습니다.

성능과 속도

평가는 학습에 포함되지 않은 셸 명령 106개를 24개 세션에서 확인하는 ShellBench, 데모에서 발견한 실패 사례 47개로 만든 PresetBench, 파일 내용을 여러 세션에 걸쳐 기억하는 테스트로 진행했습니다. 표에 제시한 결과에서 프롬프트만 넣은 Qwen2.5-Coder-0.5B는 ShellBench 52/106, 파일 읽기 2/13이었고 Qwen3-0.6B는 각각 60/106, 3/13이었습니다. WorldTUI는 80/106과 9/13을 기록했습니다. 파일 기억 테스트는 무작위 값 두 개를 파일에 쓴 뒤 별도 세션에서 다시 읽으며, 이름과 값은 학습 데이터에 나오지 않습니다. 본문은 전체 64회 읽기 결과도 설명하지만, 비교 표에는 13회 기준이 제시돼 있습니다. 저자는 새 조합의 명령에서 쉽게 실패하며 신뢰할 만한 파일시스템과는 거리가 있다고 밝혔습니다.

처음에는 화면 전체를 순차 생성해 큰 화면 갱신에 RTX 4090 기준 최대 12초가 걸렸습니다. 행별 갱신은 서로 독립적이라는 점을 이용해 각 행을 병렬로 예측하고, 마지막에 전체 행을 보는 단계에서 커서를 정합니다. 큰 화면 갱신의 p95 지연은 6.7초에서 0.87초로 줄었습니다. 독립 예측은 여러 행이 동시에 바뀌는 오류를 만들었고, 같은 모델이 병렬 예측을 순차 검증하는 speculative decoding으로 보완했습니다. M4 Mac 브라우저에서는 문자 하나 입력에 약 60ms, man test 갱신에 순차 방식 2.5초, 병렬 예측과 검증 방식 0.9초가 걸렸습니다.

브라우저 실행과 한계

기반 모델의 1,519만 개 어휘 임베딩을 필요한 333개 토큰에 맞춰 줄여 매개변수를 약 4억 9,400만 개에서 3억 6천만 개로 줄였습니다. int4 양자화 뒤 크기는 208MB입니다. 브라우저용 Qwen 디코더를 JavaScript로 구현했고 WGSL 계산 셰이더를 WebGPU에서 실행합니다. 가중치는 추론 중 4비트로 풀며 활성값과 어텐션 캐시는 32비트 부동소수점으로 처리합니다. 모든 추론은 브라우저 탭 안에서 이뤄집니다.

저자는 레이어를 줄이는 증류도 실험했습니다. 7번 레이어 하나를 제거하자 다음 토큰 정확도는 99.3%에서 98.9%로 조금 낮아졌지만, 파일 기억 읽기는 64/64에서 0/64로 떨어졌습니다. 레이어를 짝수 번호 위주로 남긴 학생 모델은 31/64였고, 기억에 영향을 준 것으로 보이는 레이어를 유지한 16층 모델은 64/64를 기록했습니다. 다만 ShellBench 점수는 교사 모델 78점에 비해 65점이었습니다. 결국 저자는 증류를 중단했습니다.

데모는 vim, tmux, Python REPL, snake와 환경 변수 등을 흉내 내지만 실제 파일시스템을 바꾸지 않습니다. 인터넷 연결도 없으며 중첩 디렉터리에서 경로를 잃거나 파일 내용을 잘못 출력할 수 있습니다. Firefox에서는 Chrome보다 약 20배 느렸고 원인은 확인하지 못했습니다. 저자는 이 프로젝트를 유용한 터미널이라기보다, 구현 규칙 없이 입력에 맞춰 화면을 예측하는 작은 월드 모델 실험으로 설명합니다.

Hacker News 반응

  • @htoz1 — 실제 터미널이 있는데 이 프로젝트의 목적이 무엇인가요?
    • @mehmetoguzderin — 터미널 월드 모델은 여러 응용 가능성이 있습니다. 특히 값비싼 Bash 기록을 이용해 사전학습이나 미세 조정이 성공하는지 경험적으로 확인하면, 가속기가 부족한 시스템에서 얻은 기록을 활용하는 데 의미가 있을 수 있습니다.
    • @YmFzZTY0ZGFkZHk — 가끔은 터무니없는 일을 할 수 있으니까 해보는 것도 재미있습니다. 이런 점도 소프트웨어의 매력입니다.
  • @prodigycorp — GPT-3로 비슷한 걸 해봤을 때도 작동했던 기억이 납니다. tmux는 실제 프로그램처럼 보여 잠깐 헷갈렸는데, tmux를 흉내 내는 거란 걸 깨달았습니다. 재미있네요. 모델이 창 너비를 인식하나요?
    • @simedw — 컨텍스트 첫 부분에 화면 너비가 들어갑니다. 세 가지 해상도로 학습했지만 그 사이의 크기도 어느 정도 처리할 겁니다.
  • @yjftsjthsd-h — sleep 3은 어떻게 처리했나요? LLM은 시간 개념이 없다고 생각했는데요.
    • @sprobertson — 본문에 따르면 시간도 입력으로 들어갑니다. 아무 키도 누르지 않으면 키 대신 지속 시간을 담은 WAIT 토큰을 넣어 snake가 혼자 움직이게 합니다.
    • @simedw — 보통은 키 입력이 다음 프레임을 실행합니다. 실행기가 시간이 흐른다고 알릴 때 사용할 sleep 토큰도 있습니다.
  • @thorum — 저는 이 방식이 미래 UI가 될 것 같아 걱정됩니다. 빠른 로컬 모델이 충분히 높은 프레임 속도로 동작하기만 하면 장기적으로 불가피하지 않을까요?
    • @gr_norm — UI로 하려는 일을 모델에 맡기는 대신 이런 방식을 쓸 이유가 있나요? 필요한 입력을 더 풍부하게 받도록 UI 위젯을 즉석에서 만들 수도 있습니다.
    • @skohan — 반복 작업에는 비효율적입니다. CPU와 몇 KB 메모리로 밀리초 안에 처리할 프로그램 대신 GPU와 수 GB VRAM을 쓰며 비결정적으로 동작하는 이유가 무엇인가요?
    • @rvz — Excel, Photoshop, Word의 UI가 오랫동안 일관성을 유지한 데에는 이유가 있습니다. Windows 8 UI 실패를 잊은 것 같습니다.
  • @mrweasel — 하드웨어와 모델이 좋아져도 비결정성 문제는 남지 않나요? 터미널 명령에는 무작위성이 필요하지 않습니다.
    • @claykkari — 예상하지 못한 입력을 처리하는 능력을 무작위성이라고 부른다면 오히려 원할 수도 있습니다. 예를 들어 ps "어떤 프로세스가 PC를 느리게 하나요?" 같은 명령을 생각해 보세요.
  • @donperignon — 직접 써보니 데모 GIF만큼 가깝게 동작하지 않았습니다. 만들려는 test1 폴더가 이미 있다고 하고 mkdier test2는 받아들이지만 ls에서 폴더가 보이지 않았습니다. 상태나 규칙을 따르지 않고 현재 컨텍스트에서 지어내는 건 예상했지만, 영상만큼 신기하진 않았습니다.
  • @simedw — 실제 파일은 만들지 않고 모델 컨텍스트 안에만 존재합니다.
    • @ambicapter — 실제 파일시스템에 파일을 만들 수 있나요, 아니면 모델만의 작은 세계를 보여주는 건가요?
  • @rowbin — 저는 학습 없이 프런티어 모델과 긴 프롬프트로 컴퓨터 전체를 환각하는 vibeSH를 만들었습니다. 이 프로젝트는 키 입력 단위로 행 변화를 예측하고, 제 것은 여러 키 입력을 묶어 매번 화면 전체를 다시 그립니다. 큰 모델을 쓰는 제 방식은 컨텍스트가 유지되는 동안 파일과 Python 결과의 일관성이 더 높지만 세션이 길어지면 기억을 잃습니다. WorldTUI의 DAgger 방식은 제가 해결하지 않은 상태 기억 문제를 직접 다룹니다.
  • @qurren — 1천만~5천만 매개변수 모델을 10ms 이하 지연으로 학습해, 느린 네트워크 SSH에서도 키 입력에 로컬 화면이 즉시 반응하고 서버 응답이 오면 수정되는 방식이 유용할 것 같습니다.
    • @pinusc — mosh를 확인해 보세요. SSH의 연결 이동성을 지원하고 입력을 즉시 반영합니다. 다만 snake처럼 움직이는 게임까지 예측하지는 않습니다.
  • @Meleagris — 상호작용이 많은 허니팟에 유용할 수 있습니다.
    • @simedw — 좋은 아이디어지만 대규모로 운영하기에는 비용이 조금 클 수 있습니다.
    • @root_axis — 일반적인 비생성형 허니팟보다 이 방식을 선호할 이유가 무엇인가요?
    • @Meleagris — 목표 지향적으로 공격자와 상호작용할 수 있다는 장점이 있습니다. 공격자의 역량이나 전술, 인프라를 드러내도록 경로를 유도할 수 있습니다. 지금도 가능하지만 시나리오를 직접 만드는 수고가 듭니다.
  • @teiferer — 미세 조정에서 기반 모델은 어떤 역할을 하나요?
    • @simedw — 기반 모델은 언어를 잘 이해해 man 페이지를 자연스러운 문장으로 만들고 Python 같은 언어도 알고 있습니다. 그래서 1+5나 print(["hi" for _ in range(5)]) 같은 작업이 됩니다. 처음부터 학습도 해봤지만 훨씬 약했고 보조 손실도 많이 추가해야 했습니다.
  • @saagarjha — Anthropic은 이런 종류의 모델을 정렬 평가에 사용해 왔습니다.

원문: simedw.com / 번역·요약: Trawling