본문으로 건너뛰기

DOOM을 Transformer로 컴파일하다

DOOM의 렌더링 전체를 Transformer 계산 그래프로 컴파일해 학습 없이 토큰 단위로 화면을 생성합니다.

이 요약은 AI가 원문을 분석해 생성했습니다. 정확한 내용은 원문 기준으로 확인하세요.

TL;DR

torchwright_doom은 DOOM 렌더링 로직을 계산 그래프로 구성해 torchwright 컴파일러로 Transformer에 직접 넣고, 학습 없이 자기회귀 방식으로 화면을 생성합니다. 호스트는 고정 영역의 맵 정보를 토큰으로 준비하고 모델이 낸 커서·방향·실행 폭 토큰을 화면에 복사할 뿐, 벽 선택·가시성·거리·텍스처·합성 같은 연산은 Transformer 내부에서 처리합니다. 배포 산출물은 별도 커스텀 코드 없이 일반 Hugging Face 자동 클래스와 Transformers pipeline으로 읽는 Phi3ForCausalLM이며, 320×200 모델은 38개 레이어와 85.87GB fp32 가중치, 80×50 모델은 70개 레이어와 34.09GB fp32 가중치로 구성됩니다. 저해상도 모델은 7,007토큰 프레임과 8,000토큰 생성 한도를 사용하고, 참조 Python 렌더러와 픽셀 단위 비교로 정확성을 측정합니다.

섹션별 상세

01
torchwright_doom은 DOOM 렌더러를 외부 프로그램으로 호출하는 대신 계산 그래프로 구성하고 torchwright 컴파일러를 통해 Transformer로 변환합니다. 모델은 자기회귀 루프에서 이산 입력 토큰 하나를 읽고 출력 토큰 하나를 내보내며, 호스트는 출력 토큰을 다음 입력으로 넘깁니다. 따라서 렌더링이 모델 가중치와 실행 그래프 안에서 이뤄지고 별도 학습 과정은 필요하지 않습니다.
02
프로젝트의 핵심 경계는 호스트가 화면을 해석하지 않는다는 dumb-host 원칙입니다. 입력 단계에서 호스트는 scene config가 지정한 고정 world-space rectangle로 레벨 파일을 잘라 정적 맵 정보를 토큰화하지만, 시점에 따른 가시성·정렬·투영·가림은 Transformer가 계산합니다. 출력 단계에서도 모델이 직접 낸 커서 위치, 방향 표시, 실행 폭 토큰을 디코더가 순서대로 적용하고 호스트는 커서 추적과 bitblitting만 수행합니다.
03
모델 내부의 한 번의 forward pass는 입력 토큰과 정적 맵 정보를 읽은 뒤 protocol dispatch를 거쳐 BSP 순회, 벽 투영, wall·visplane·flat 래스터라이저, 픽셀 단계로 이어집니다. BSP 순회는 가까운 벽을 먼저 방문하고 occlusion을 처리하며, attention 기반 반환 스택이 재귀적 순회 상태를 유지합니다. 이 구조는 DOOM의 공간 처리와 픽셀 기록을 모델이 실행하는 토큰 프로토콜로 바꾸며, 호스트의 기하 계산이나 값에 대한 산술을 제거합니다.
python
from pathlib import Path
from transformers import pipeline

generate = pipeline("text-generation", model=bundle, device_map="auto")
prompt = Path(bundle, "examples/e1m1_prompt.txt").read_text()
generated_text = generate(prompt, return_full_text=False)[0]["generated_text"]

배포된 Phi3ForCausalLM 번들을 일반 Transformers text-generation pipeline으로 로드하고 E1M1 프롬프트에서 출력 토큰을 생성합니다.

04
배포 모델은 Phi3ForCausalLM을 기반으로 한 일반 Hugging Face 산출물이며, 가중치는 sharded fp32 safetensors로 저장됩니다. 320×200 flagship checkpoint는 38 layers와 85.87 GB의 fp32 weight shards를 사용하고, 80×50 practical checkpoint는 70 layers와 34.09 GB를 사용합니다. 저해상도 구성은 7,007-token frame과 8,000-token generation cap을 사용하며 A100-80GB 실행에서 reserved memory가 43.48 GiB까지 올라가 두 개의 32 GiB consumer GPU에도 device_map="auto"로 배치할 수 있습니다.
bash
python infer.py --model . --prompt examples/e1m1_prompt.txt --output out
python tools/pretty_text.py --input out/output.txt --output out/output.pretty.txt
python tools/txt_to_png.py --input out/output.txt --output out/frame.png

모델 추론 결과를 생성한 뒤 토큰 스트림을 사람이 읽을 수 있는 텍스트로 바꾸고, 커서 프로토콜을 적용해 PNG 프레임으로 변환합니다.

05
실행 검증은 모델 출력을 이미지로 간주하는 데서 끝나지 않고, vendored plain-Python reference renderer인 pydoom과 모든 렌더 프레임을 픽셀 단위로 비교하는 방식으로 이뤄집니다. make run COMPARE=1은 coverage와 within-option color를 계산하고 diff PNG를 기록하며, infer.py는 표준 Transformers text-generation pipeline으로 토큰을 생성합니다. pretty_text.py와 txt_to_png.py는 동일한 출력 스트림을 각각 가독성 높은 텍스트와 최종 프레임으로 변환해 모델 출력과 화면 결과를 분리해서 확인하게 합니다.

용어 해설

자기회귀 생성(Autoregressive Generation)
이전 단계에서 생성한 토큰을 다음 입력으로 다시 넣어 한 번에 하나씩 출력을 이어 가는 방식입니다. 이 프로젝트에서는 입력 토큰 하나를 읽은 Transformer가 픽셀 정보를 담은 출력 토큰 하나를 만들고, 호스트가 이를 다음 입력으로 전달합니다.
계산 그래프(Computation Graph)
연산과 데이터 흐름을 노드와 연결 관계로 표현한 구조입니다. torchwright_doom은 DOOM의 장면 읽기, BSP 순회, 래스터화, 픽셀 출력을 그래프로 구성한 뒤 이를 Transformer가 실행할 수 있는 형태로 컴파일합니다.
BSP 순회(BSP Traversal)
Binary Space Partitioning 구조를 따라 공간을 분할한 노드를 방문하는 방법입니다. 이 구현은 가까운 벽을 먼저 처리하고 가시성과 가림 관계를 계산해 벽의 출력 순서를 결정하며, attention 기반 반환 스택으로 순회 상태를 유지합니다.
safetensors
Machine Learning 모델 가중치를 저장하는 파일 형식으로, 이 프로젝트의 배포 산출물은 fp32 가중치를 여러 조각의 safetensors 파일로 보관합니다. 일반 Hugging Face 자동 클래스가 이 파일을 읽어 모델을 로드합니다.
WordLevel 토크나이저(WordLevel Tokenizer)
토큰과 정수 ID의 대응을 단어 수준으로 저장하는 단순한 토크나이저입니다. 여기서는 별도 토크나이저 코드 없이 사람이 읽을 수 있는 토큰 이름을 tokenizer.json에 기록하고, 행 인덱스와 픽셀 프로토콜을 모델 입출력으로 변환합니다.

기술

  • torchwright
  • Phi3ForCausalLM
  • Hugging Face
  • Transformers
  • ONNX
  • Modal
  • Python
  • safetensors
  • device_map="auto"
  • pydoom

활용 사례

  • DOOM 게임 화면 렌더링
  • Transformer 내부 계산 그래프 실험
  • 토큰 프로토콜 기반 그래픽 출력
  • GPU 분산 모델 추론
AI 분석 전체 내용 보기

AI 요약 · 북마크 · 개인 피드 설정 — 무료

출처 · 인용 안내

원문 발행 2026. 09. 01.수집 2026. 09. 01.출처 타입 RSS

인용 시 "요약 출처: AI Trends (aitrends.kr)"를 표기하고, 사실 확인은 원문 보기 기준으로 진행해 주세요. 자세한 기준은 운영 정책을 참고해 주세요.