Biên dịch CPU NES vào trọng số của mô hình ngôn ngữ Qwen3.5
Một dự án mới đã biên dịch trực tiếp bộ xử lý 6502 của Nintendo Entertainment System vào các tham số của một mô hình Qwen3.5 tiêu chuẩn, cho phép chạy game mà không cần huấn luyện.
Được dịch tự động từ bản gốc tiếng Anh.
Nhà phát triển David Breunig vừa ra mắt nesformer, một dự án biên dịch trực tiếp bộ xử lý 6502 của Nintendo Entertainment System vào trọng số (weights) của một mô hình ngôn ngữ Qwen3.5 tiêu chuẩn. Được công bố vào cuối tháng 10 năm 2026, công trình này chứng minh rằng một mô hình ngôn ngữ lớn có thể thực thi mã nhị phân bằng cách coi trạng thái nội bộ của nó là bộ nhớ máy tính, thay vì học hành vi từ dữ liệu.
Chuyện gì đã xảy ra
Dự án dựa trên công trình trước đó mang tên Qwenputer, vốn đã biên dịch các kiến trúc đơn giản hơn như CHIP-8 và RISC-V vào Qwen3.5-4B. Nesformer tiến xa hơn bằng cách nhắm mục tiêu vào bộ xử lý MOS 6502, trái tim của hệ thống NES. Thay vì huấn luyện mô hình trên các đoạn video gameplay hay mã assembly, Breunig đã sử dụng một trình biên dịch để tính toán từng trọng số trong checkpoint. Mô hình kết quả là một checkpoint Hugging Face tiêu chuẩn, có thể tải bằng Qwen3_5ForCausalLM.from_pretrained và không yêu cầu bất kỳ mã tùy chỉnh nào để khởi tạo.
Kho lưu trữ bao gồm một giao diện dòng lệnh cho phép người dùng chạy các ROM NES. Khi được thực thi, mô hình sẽ tạo ra một chuỗi token đại diện cho nhật ký thực thi của CPU. Một chương trình host riêng biệt xử lý phần cứng ngoại vi, chẳng hạn như Đơn vị Xử lý Hình ảnh (PPU) cho đồ họa và đầu vào từ bộ điều khiển. Hệ thống chạy thành công các ROM thử nghiệm như Thwaite và Full Game, tạo ra đầu ra chính xác từng khung hình khớp với các trình giả lập truyền thống. Nó cũng hỗ trợ Super Mario Bros., miễn là người dùng cung cấp tệp ROM.
Cách thức hoạt động
Cơ chế cốt lõi dựa trên kiến trúc Gated DeltaNet trong mô hình Qwen3.5. Trong thiết lập này, ma trận trạng thái nội bộ của mô hình đóng vai trò là bộ nhớ truy cập ngẫu nhiên (RAM) của máy tính. Mỗi hàng trong ma trận trạng thái 128x128 hoạt động như một ô nhớ. Bằng cách sử dụng các khóa và truy vấn one-hot, mô hình có thể ghi đè lên các hàng cụ thể để ghi dữ liệu hoặc đọc chúng lại để lấy giá trị. Điều này cho phép 2 KB RAM làm việc, 32 KB ROM chương trình và các thanh ghi CPU nằm hoàn toàn trong trọng số và trạng thái của mô hình.
Quá trình biên dịch ánh xạ các cổng logic và opcode của 6502 vào các lớp của mô hình. Mạch điện trải dài qua bảy lớp Gated DeltaNet. Lớp đầu tiên neo giữ bộ đếm chương trình và lưu trữ các cờ, trong khi các lớp tiếp theo xử lý việc nạp chỉ thị, giải mã địa chỉ và các phép toán số học. Lớp cuối cùng dự đoán token tiếp theo trong dấu vết thực thi. Vì các trọng số được tính toán về mặt toán học từ thiết kế mạch, chúng rất thưa: trong số 466,6 triệu tham số, chỉ có 9,3 triệu là khác không, cho phép checkpoint nén xuống chỉ còn 3,3 MB.
Chương trình host quản lý mọi thứ bên ngoài CPU. Nó chèn các token cho ngắt không che được (NMI) tại vblank và cung cấp dữ liệu đầu vào khi CPU đọc từ các thanh ghi I/O. Để quản lý tốc độ, host phát hiện các vòng lặp nhàn rỗi nơi CPU chờ vblank và bỏ qua các lần lặp dư thừa, đẩy đồng hồ trực tiếp đến sự kiện tiếp theo. Tối ưu hóa này giảm đáng kể số lượng token, mặc dù hệ thống vẫn chạy chậm hơn khoảng 150 đến 290 lần so với phần cứng thực.
Chi tiết chính
- Mô hình sử dụng kiến trúc Qwen3.5-4B với 7 lớp Gated DeltaNet và kích thước ẩn là 768.
- Chỉ 9,3 triệu trong số 466,6 triệu tham số là khác không, dẫn đến một checkpoint nén 3,3 MB.
- Hệ thống hỗ trợ băng NROM (iNES mapper 0) nhưng chưa hỗ trợ các mapper chuyển đổi ngân hàng như MMC1 hoặc MMC3.
- Tốc độ thực thi dao động từ 10 token mỗi giây với transformers nguyên bản đến 1.650 token mỗi giây với engine được biên dịch bằng numba.
- Chương trình host xử lý việc render PPU và đầu vào từ bộ điều khiển, chèn các token cần thiết vào ngữ cảnh của mô hình.
- Các opcode không chính thức và các lệnh nhảy vào RAM khiến quá trình giả lập dừng lại, vì mạch chỉ triển khai các chỉ thị 6502 chính thức.
Tại sao điều này quan trọng
Đối với các kỹ sư AI và nhà nghiên cứu, nesformer cung cấp một ví dụ cụ thể về cách các thành phần nội bộ của transformer có thể được tái sử dụng cho tính toán xác định. Nó thách thức giả định rằng các mô hình lớn phải được huấn luyện trên những tập dữ liệu khổng lồ để thực hiện các nhiệm vụ phức tạp. Bằng cách biên dịch logic trực tiếp vào trọng số, các nhà phát triển có thể tạo ra những mô hình đảm bảo các hành vi cụ thể, mở ra con đường hướng tới các hệ thống AI dễ kiểm chứng và minh bạch hơn. Cách tiếp cận này tách biệt phần "tư duy" của mô hình khỏi việc quản lý "trạng thái", làm rõ cách các cơ chế attention có thể bắt chước việc truy cập bộ nhớ.
Đối với các nhà phát triển phần mềm quan tâm đến giả lập, dự án này nhấn mạnh sự đánh đổi giữa độ chính xác và hiệu suất. Mặc dù mô hình tạo ra kết quả bit-perfect cho các trò chơi được hỗ trợ, chi phí tính toán là vô cùng lớn so với giả lập truyền thống. Tuy nhiên, khả năng chạy mã thực thi bên trong một checkpoint LLM tiêu chuẩn mở ra những hướng đi mới để tích hợp logic phần mềm cũ vào các pipeline AI hiện đại mà không cần trình thông dịch hoặc máy ảo bên ngoài.
Những gì bạn có thể làm
- Cài đặt các phụ thuộc yêu cầu, bao gồm
torch>=2.6vàtransformers>=5.22, để chạy checkpoint với các thư viện nguyên bản. - Sử dụng cờ
--showtrong CLI để render các khung hình trò chơi trực tiếp trong terminal nếu nó hỗ trợ màu 24-bit. - Chạy lệnh
checkđể so sánh đầu ra của mô hình với một triển khai CPU tham chiếu và xác minh tính đúng đắn. - Cung cấp các tệp
.nesNROM của riêng bạn, chẳng hạn như Donkey Kong hoặc Excitebike, để kiểm tra tính tương thích với các trò chơi khác nhau. - Thử nghiệm với tùy chọn script
--buttonsđể tự động hóa đầu vào từ bộ điều khiển nhằm kiểm tra các chuỗi trò chơi cụ thể. - Khám phá tệp
nesformer/spec.pyđể hiểu các họ token và cách mỗi chỉ thị CPU được mã hóa.



