نمایش HN: یک نینتندوی در حال کار با 1 گیگابایت وزن Qwen
آدرس مقاله: https://github.com/dbreunig/nesformer آدرس نظرات: https://news.ycombinator.com/item?id=50306442 امتیاز: 267 # نظرات: 130
یک CPU NES که در وزن یک مدل Qwen3.5 موجود است.
CPU 6502 NES (هسته تراشه 2A03 آن)، رم 2 کیلوبایتی آن، و رام برنامه یک کارتریج در داخل یک ایست بازرسی استاندارد Qwen3_5ForCausalLM اجرا می شود. هیچ کس این وزنه ها را تمرین نکرد. یک کامپایلر هر کدام را محاسبه کرد. وقتی یک بازی را انجام میدهید، مدل گزارش اجرای CPU را یک توکن در یک زمان پیشبینی میکند. یک برنامه میزبان کوچک بقیه کنسول را در اطراف خود پخش می کند: تصویر را می کشد، کنترلر را می خواند و وقفه vblank را فعال می کند.
nesformer بر روی Qwenputer توسط Divyansh Agrawal ساخته شده است، که یک CHIP-8 و سپس یک CPU RISC-V را در Qwen3.5-4B کامپایل کرد. از کامپایلر Qwenputer و ترفند مرکزی آن مجددا استفاده می کند: حالت Gated DeltaNet مدل حافظه دستگاه است.
هر توکن CPU در این اجراها از مدل آمده است. برای بازی های آزمایشی همراه، هر فریم دقیقا با خروجی شبیه ساز معمولی 6502 مطابقت دارد (به نحوه بررسی آن مراجعه کنید).
nesformer.zip و nesformer-weights.zip را در یک پوشه باز کنید. وزنه ها در کنار nesformer/ بسته قرار می گیرند نه داخل آن:
CLI به دنبال وزنه ها / در کنار بسته nesformer / است. برای نگه داشتن وزن ها در جای دیگر، --weights /path/to/weights را برای اجرا، بررسی یا ردیابی ارسال کنید، یا مسیر را به اطلاعات بدهید.
برای تأیید درستی باز کردن زیپ وزن ها، shasum -a 256 -c weights/SHA256SUMS را از پوشه بالا اجرا کنید.
--show هر فریم را در ترمینال شما ترسیم می کند همانطور که مدل آن را تولید می کند. هنگامی که اجرا به پایان می رسد، CLI یک GIF متحرک به نام رام (در اینجا thwaite.gif) در پوشه فعلی ذخیره می کند.
انتظار داشته باشید که سرعت آن کند باشد. اولین اجرا حدود 20 ثانیه صرف کامپایل کردن موتور با numba می کند. پس از آن، یک فریم 1 تا 6 ثانیه طول می کشد، بنابراین 600 فریم (10 ثانیه زمان NES) حدود 25 دقیقه طول می کشد.
در هر فایل .nes که از برد NROM (iNES mapper 0) استفاده می کند، مانند Super Mario Bros.، Donkey Kong یا Excitebike، نقطه اجرا شود. شما رام را تامین می کنید. nesformer فقط سه رام آزمایشی دارای مجوز آزاد را در رام ارسال می کند.
آن اسکریپت بازی را شروع می کند، سپس ماریو را به سمت راست راه می دهد و تقریبا یک بار در ثانیه می پرد. CLI در هنگام راهاندازی رام را در حالت مدل بارگذاری میکند، بنابراین همان وزنهها هر بازی NROM را بدون بازسازی اجرا میکنند. بازیهای روی تختههای دیگر با یک پیام متوقف میشوند: محدودیتها را ببینید.
--buttons فهرستی از ورودی های جدا شده با کاما را می گیرد. هر ورودی یک یا چند دکمه را نام میبرد که با + و سپس @ و سپس یک یا چند محدوده فریم به هم پیوسته شدهاند با +:
دکمه های a، b، انتخاب، شروع، بالا، پایین، چپ و راست هستند. فریمها از روشن شدن 60 در ثانیه محاسبه میشوند، بنابراین فریم 600 10 ثانیه است. بازیها ورودی روی صفحههایی را که نمیتوانید حرکت کنید، نادیده میگیرند، بنابراین نگه داشتن یک دکمه زودتر ضرری ندارد. در Super Mario Bros، یک فشار طولانی تر A باعث پرش بالاتر می شود.
اجرا کنید، بررسی کنید و ردیابی کنید. check --tokens N میزان مقایسه را تعیین می کند (پیش فرض 50000). trace --tokens N تعداد توکن هایی را برای چاپ تنظیم می کند (پیش فرض 40). build --out DIR نقطه بازرسی را در جایی غیر از وزن مینویسد.
این تقسیم به دنبال ساخت CHIP-8 Qwenputer است که میزبان آن تیک های تایمر را تزریق می کند و نمایشگر را از ردیابی می کشد. میزبان هرگز رجیسترهای CPU یا RAM را نمی بیند مگر از طریق ردیابی.
ترفند حافظه به این صورت عمل می کند. هر هد DeltaNet یک ماتریس حالت 128 × 128 را نگه می دارد که قانون دلتا در هر توکن به روز می شود. با باز نگه داشتن گیت و یک کلید داغ، بهروزرسانی دقیقا یک ردیف از آن ماتریس را بازنویسی میکند و یک پرسوجو یکبار آن را بازخوانی میکند. بنابراین هر ردیف یک سلول حافظه است و کارتریج، رم و رجیسترها همگی در ردیفها زندگی میکنند.
وزن/ یک پوشه معمولی Hugging Face است. با Qwen3_5ForCausalLM.from_pretrained بارگیری می شود و نیازی به کد سفارشی ندارد.
nesformer.json ثبت می کند که کدام لایه و هد هر قسمت از دستگاه را نگه می دارد. یک اجرا کارتریج را می نویسد، ثبت می کند و RAM را در آن حالت های DeltaNet ثبت می کند، سپس با حرص رمزگشایی می کند.
هر دستور به یک رکورد تبدیل می شود و آخرین نشانه رکورد آن را انجام می دهد. همانطور که در هسته RISC-V Qwenputer، PC به جای نوشته شدن به صورت ضمنی است: هر توکن نهایی طول دستورالعمل خود را دارد، سه شمارنده DeltaNet دستورالعمل های هر طول را از آخرین پرش محاسبه می کنند، و PC هدف پرش به اضافه آن افست است. گزیده ای از بازی کامل:
بیشتر دستورالعمل ها یک نشانه را می گیرند. میانگین کد بازی واقعی 1.1 تا 1.3 توکن در هر دستورالعمل است. nesformer/spec.py هر خانواده توکن را مستند می کند.
CPU مرجع (nesformer/cpu.py) با لاگ طلایی nestest برای 3348 دستورالعمل و شبیه ساز py65 در 5.7 میلیون دستورالعمل کد بازی مطابقت دارد.
مدار دقیق، که در ارزیابیکننده Qwenputer با بررسیهای دقیق bf16 اجرا میشود، همه نشانههای مرجع را پیشبینی میکند: همه توکنها به اضافه ۲۸۳۶۱۰ موقعیت از دنبالههای بوت دو بازی.
ایست بازرسی در ترانسفورماتورهای استوک (bf16، CPU) 2651 موقعیت آشیانه و کامل بازی را بدون عدم تطابق پیش بینی می کند.
وزنها، آزادانه، ردپایی مشابه CPUهای مرجع ایجاد میکنند:
رد شدن از حلقه بیکار هیچ چیز قابل مشاهده ای را تغییر نمی دهد: فریم ها و نوشته های ورودی/خروجی، مهرهای زمانی چرخه گنجانده شده است، اجرا بدون آن مطابقت دارد.
موتور پیشفرض، عبور رو به جلو Qwen3.5 را از model.safetensors محاسبه میکند، که با numba کامپایل شده و بلوکهای تمام صفر را رد میکند. این در حدود 1650 توکن در ثانیه روی یک هسته CPU دستگاهی که روی آن ساخته شده بود کار می کرد. موتورهای ساده تقریبا 210 کار می کنند و ترانسفورماتورهای استوک حدود 10. یک NES واقعی به حدود 700000 توکن در ثانیه نیاز دارد.
بازی ها بیشتر هر فریم را در حلقه ای صرف می کنند که منتظر vblank است. هنگامی که میزبان می بیند که یک بدنه حلقه دقیقا تکرار می شود، بدون RAM یا نوشتن I/O، ساعت را درست قبل از رویداد PPU بعدی پیش می برد، و تکرارهای باقی مانده همچنان اجرا می شوند. که تعداد توکن ها را 2.6× به 4.2× کاهش می دهد. به طور کلی، nesformer 150-290× کندتر از کنسول واقعی اجرا می شود.
آزمایش ها چند دقیقه طول می کشد. آنها CPU مرجع را در برابر گزارش Nestest، مدار را در برابر مرجع، وزنهای آزاد در برابر مرجع، و پرش حلقه بیکار را بررسی میکنند.
nesformer/hfcheck.py کل رویه را نشان میدهد: نقطه بازرسی را بارگیری کنید، یک نشانه padding را رمزگشایی کنید، وضعیت دستگاه را در حالتهای DeltaNet کش بنویسید، سپس توکنها را یکی یکی تغذیه کنید.
nesformer تحت مجوز MIT منتشر می شود (به مجوز مراجعه کنید). رام های موجود در رام/ مجوزهای خود را حفظ می کنند که در roms/SOURCES.md فهرست شده است.
متن اصلی (انگلیسی)
Show HN: A working Nintendo in ~1GB of Qwen weights
Article URL: https://github.com/dbreunig/nesformer Comments URL: https://news.ycombinator.com/item?id=50306442 Points: 267 # Comments: 130