لعبة فتى العملاق

بسرعات تزيد عن مليار إطار في الثانية ، يمكن القول إنها أسرع مجموعات الكتل 8 بت في العالم.


تتريس الموزعة (1989)

كيفية بناء مثل هذا الكمبيوتر؟


وصفة


خذ حفنة من السيليكون ، وقم بتطبيق التدريب على التعزيز ، والخبرة مع أجهزة الكمبيوتر العملاقة ، وشغف بهندسة الكمبيوتر ، وأضف العرق والدموع ، وحرك 1000 ساعة حتى يغلي - وفويلا.

لماذا يحتاج أي شخص مثل هذا الكمبيوتر؟


باختصار: التحرك نحو تعزيز الذكاء الاصطناعي.


واحدة من 48 لوحة كمبيوتر IBM Neural تستخدم للتجارب

وهنا نسخة أكثر تفصيلا


2016 سنة. التعلم العميق في كل مكان. يمكن اعتبار التعرف على الصور مهمة تم حلها بفضل الشبكات العصبية التلافيفية ، وتسعى اهتماماتي البحثية إلى شبكات عصبية مع الذاكرة والتعلم المعزز.



على وجه التحديد ، في عمل تأليف Google Deepmind ، تبيّن أنه من الممكن الوصول إلى مستوى الشخص أو حتى تجاوزه في الألعاب المختلفة لـ Atari 2600 (وحدة التحكم في الألعاب المنزلية ، التي صدرت عام 1977) ، باستخدام خوارزمية تعليمية بسيطة تدعمها شبكة Deep Q-Neural Network. وكل هذا يحدث ببساطة عند عرض طريقة اللعب. لفتت انتباهي.


واحدة من الألعاب مع Atari 2600 ، Breakout. تم تدريب الآلة باستخدام خوارزمية تعلم التعزيز البسيطة. بعد ملايين التكرارات ، بدأ الكمبيوتر يلعب بشكل أفضل من البشر.

لقد بدأت تجربة ألعاب Atari 2600. لا يمكن أن يسمى الاختراق ، على الرغم من الإعجاب به ، بالتعقيد. يمكن تحديد الصعوبة بدرجة الصعوبة وفقًا لأفعالك (ذراع التحكم) ونتائجك (النقاط). المشكلة تظهر عندما يحتاج التأثير إلى الانتظار لفترة طويلة.


مثال لمشكلة استخدام ألعاب أكثر تعقيدًا كمثال. Left - Breakout (ATARI 2600) [أخطأ المؤلف ، إنها لعبة / تقريبًا لـ Pong. عبر.] مع استجابة سريعة جدا وردود الفعل السريعة. Right - Mario Land (Nintendo Game Boy) لا يوفر معلومات فورية عن تأثيرات الإجراء ؛ فقد تظهر فترات طويلة من الملاحظات غير ذات الصلة بين حدثين مهمين.

لجعل التعلم أكثر فعالية ، يمكن للمرء أن يتخيل محاولات نقل بعض المعرفة من ألعاب أبسط. هذه المهمة لا تزال دون حل ، وهي موضوع نشط للبحث. مهمة تم نشرها مؤخرًا من OpenAI تحاول قياس ذلك تمامًا.

إن القدرة على نقل المعرفة لن تؤدي فقط إلى تسريع التدريب - أعتقد أنه لا يمكن حل بعض مشكلات التعلم على الإطلاق في غياب المعرفة الأساسية. نحن بحاجة إلى كفاءة البيانات. خذ لعبة أمير بلاد فارس:



لا توجد نقاط واضحة في ذلك.
يستغرق 60 دقيقة لإكمال اللعبة.



هل من الممكن تطبيق نفس الأسلوب الذي تم استخدامه عند كتابة العمل على أتاري 2600؟ ما مدى احتمال أن تصل إلى النهاية عن طريق الضغط على مفاتيح عشوائية؟

دفعني هذا السؤال إلى المساهمة في المجتمع ، والذي يتمثل في محاولة حل هذه المشكلة. في الواقع ، لدينا مهمة الدجاج والبيض - نحتاج إلى خوارزمية أفضل تسمح لنا بنقل رسالة ، ولكن هذا يتطلب البحث ، والتجارب تستغرق وقتًا طويلاً ، لأنه ليس لدينا خوارزمية أكثر كفاءة.


مثال على نقل المعرفة: تخيل أننا تعلمنا أولاً لعب لعبة بسيطة ، مثل اللعبة الموجودة على اليسار. ثم ننقذ مفاهيم مثل "العرق" ، "السيارة" ، "المسار" ، "الفوز" وتعلم الألوان أو النماذج ثلاثية الأبعاد. نؤكد أن المفاهيم الشائعة يمكن "ترحيلها" بين الألعاب. يمكن تحديد تشابه الألعاب بعدد المعرفة المنقولة بينهما. على سبيل المثال ، لن تكون ألعاب Tetris و F1 مماثلة.

لذلك ، قررت استخدام النهج المثالي الثاني ، وتجنب التباطؤ الأولي ، وتسريع النظام بشكل كبير. أهدافي هي:
- بيئة متسارعة (تخيل أن أمير بلاد فارس يمكن أن يكتمل أسرع 100 مرة) والإطلاق المتزامن لـ 100،000 لعبة.
- بيئة أكثر ملاءمة للبحث (نركز على المهام ، ولكن ليس على الحسابات الأولية ، لدينا إمكانية الوصول إلى العديد من الألعاب).

في البداية ، اعتقدت أن عنق الزجاجة في الأداء قد يعتمد بطريقة أو بأخرى على تعقيد كود المحاكي (على سبيل المثال ، قاعدة كود ستيلا كبيرة ، وتعتمد على تجريدات C ++ - وليس الخيار الأفضل لمحاكيات).

لوحات المفاتيح




إجمالاً ، عملت على العديد من المنصات ، بدءًا من واحدة من الألعاب الأولى التي تم إنشاؤها على الإطلاق (جنبًا إلى جنب مع لعبة Pong) - Arcade Space Invaders و Atari 2600 و NES و Game Boy. وكل هذا كتب في C.

تمكنت من الوصول إلى الحد الأقصى لمعدل الإطار 2000-3000 في الثانية الواحدة. لبدء الحصول على نتائج التجارب ، نحتاج إلى ملايين أو مليارات الإطارات ، لذا كانت الفجوة هائلة.


غزاة الفضاء الذين يعملون في FPGA - وضع تصحيح سرعة منخفضة. يُظهر عداد FPGA عدد دورات الساعة التي مرت.

ثم فكرت - ماذا لو استطعنا تسريع البيئة المناسبة بالحديد. على سبيل المثال ، ذهب غزاة الفضاء الأصليون إلى 8080 وحدة المعالجة المركزية مع تردد 1 ميغاهيرتز. تمكنت من محاكاة 8080 40 ميغاهيرتز وحدة المعالجة المركزية على معالج زيون 3 جيجاهرتز. ليس سيئًا ، ولكن بعد أن وضعت كل هذا داخل FPGA ، ارتفع التردد إلى 400 ميجاهرتز. هذا يعني 24000 إطارا في الثانية من تيار واحد - أي ما يعادل 30 جيجا هرتز زيون! هل ذكرت أنه يمكنك حشر 100 8080 معالجات في متوسط ​​FPGA؟ هذا ينتج بالفعل 2.4 مليون إطار في الثانية.


غزاة الفضاء مع تسريع الأجهزة 100 ميغاهيرتز ، ربع السرعة الكاملة


أكثر من مائة نواة داخل Xilinx Kintex 7045 FPGA (يشار إليها بألوان زاهية ؛ البقعة الزرقاء في الوسط هي المنطق العام للمظاهرة).


مسار التنفيذ غير متساو

قد تسأل ، ماذا عن GPU؟ باختصار ، نحن بحاجة إلى التزامن مثل MIMD ، وليس SIMD . كطالب ، عملت لمدة من الوقت على تنفيذ بحث شجرة Monte Carlo على وحدة معالجة الرسومات (مثل هذا البحث تم استخدامه في AlphaGo).

في ذلك الوقت ، قضيت ساعات لا حصر لها في محاولة للحصول على GPU وقطع أخرى من الأجهزة تعمل على مبدأ SIMD (IBM Cell ، Xeon Phi ، AVX CPU) لتنفيذ مثل هذا الرمز ، ولم يأت منه شيء. قبل بضع سنوات ، بدأت أعتقد أنه سيكون من الجيد أن أكون قادرًا على تطوير أجهزة بشكل مستقل مصممة خصيصًا لحل المشكلات المتعلقة بالتدريب التعزيز.




MIMD التزامن

ATARI 2600 ، NES أو Game Boy؟


في 8080 ، قمت بتنفيذ Space Invaders ، NES ، 2600 ، و Game Boy. وهنا بعض الحقائق عنها وفوائد كل منها.


NES بكمن

كان غزاة الفضاء مجرد الاحماء. لقد نجحنا في جعلهم يعملون ، لكنها كانت لعبة واحدة فقط ، وبالتالي فإن النتيجة لم تكن مفيدة للغاية.

أتاري 2600 هو في الواقع المعيار في بحوث التعلم التعزيز. يعد المعالج MOS 6507 إصدارًا مبسطًا من نظام 6502 الشهير ، وتصميمه أكثر أناقة وأكثر كفاءة من تصميمه في 8080. لقد اخترت 2600 ليس فقط بسبب بعض القيود المتعلقة بالألعاب ورسوماتها.

قمت أيضًا بتطبيق NES (نظام Nintendo Entertainment System) ، حيث تشترك في وحدة المعالجة المركزية مع 2600. هناك ألعاب أفضل بكثير من 2600. لكن كلاً من لوحات المفاتيح تعاني من خط أنابيب معالجة رسومات معقدة للغاية والعديد من تنسيقات الخراطيش التي تحتاج إلى الدعم.

وفي الوقت نفسه ، اكتشفت لعبة نينتندو جيم بوي. وهذا ما كنت أبحث عنه.

لماذا هو لعبة بوي بارد جدا؟


الصورة
1049 لعبة كلاسيكية و 576 لعبة لـ Game Boy Color

في المجموع ، هناك أكثر من 1000 لعبة ، وهي مجموعة كبيرة جدًا وذات جودة عالية ، بعضها معقد جدًا (Prince) ، ويمكن تجميع الألعاب وتعيينها تعقيدًا للبحث في نقل المعرفة والتدريب (على سبيل المثال ، هناك خيارات لـ Tetris وألعاب السباقات وماريو). لحل لعبة Prince of Persia ، قد تحتاج إلى نقل المعرفة من لعبة أخرى مشابهة تشير إليها النقاط بوضوح (في Prince this is not).


نينتندو جيم بوي هي منبر بحثي المفضل لنقل المعرفة. على الرسم البياني ، حاولت تجميع الألعاب وفقًا للتعقيد (شخصي) والتشابه (مفاهيم مثل السباق ، القفز ، الرماية ، ألعاب مختلفة مثل Tetris ، هل لعب أي شخص لعبة HATRIS؟).

تحتوي لعبة Game Boy الكلاسيكية على شاشة بسيطة للغاية (160 × 144 ، لون 2 بت) ، لذلك تصبح المعالجة المسبقة بسيطة ، ويمكنك التركيز على الأشياء المهمة. في 2600 ، حتى الألعاب البسيطة لها العديد من الألوان. بالإضافة إلى ذلك ، تظهر كائنات Game Boy أفضل بكثير ، دون وميض ودون الحاجة إلى أخذ إطارين متتاليين كحد أقصى.



لا يوجد تخطيط ذاكرة مجنون ، مثل NES أو 2600. يمكن إجراء معظم الألعاب للعمل مع 2-3 معينين.

رمز مضغوط - تمكنت من احتواء المحاكي بالكامل في C في أكثر من 700 سطر من التعليمات البرمجية ، ويتناسب تنفيذ Verilog مع 500 سطر.

هناك نفس الإصدار البسيط من Space Invaders كما في الممرات.



وها هو ، بلدي 1989 بوي مصفوفة نقطة وإصدار FPGA الذي يعمل عبر HDMI على شاشة 4K.



وهنا ما لا يستطيع My Game Game القديم:


تتسارع تتريس مع الحديد - تسجيل من الشاشة في الوقت الحقيقي ، والسرعة هي 1/4 من الحد الأقصى.

هل هناك أي فائدة حقيقية لهذا؟


نعم هناك. لقد اختبرت النظام حتى الآن في ظروف بسيطة ، من خلال شبكة خارجية من القواعد التي تتفاعل مع لعبة Game Boys الفردية. وبشكل أكثر تحديدًا ، استخدمت خوارزمية A3C (Advantage Actor Actor Critic) ، وأخطط لوصفها في منشور منفصل. قام زميلي بتوصيلها بالشبكة التلافيفية على FPGA ، وهي تعمل.


كيف يتواصل FGPA مع شبكة عصبية


توزيع A3C


ماريو الأرض: الشرط الأولي. ضغط المفاتيح العشوائي لن يأخذنا بعيدًا. يُظهر الركن الأيمن العلوي الوقت المتبقي. إذا كنا محظوظين ، فسوف ننهي اللعبة بسرعة بعد لمس gumba. إذا لم يكن الأمر كذلك ، فسوف يستغرق "خسارة" 400 ثانية.


أرض ماريو: بعد ساعة من اللعب ، تعلم ماريو الركض والقفز وحتى فتح غرفة سرية ، متجهًا نحو الأنبوب.


باك مان: بعد حوالي ساعة من التدريب ، كانت الشبكة العصبية قادرة حتى على إنهاء اللعبة بأكملها مرة واحدة (بعد تناول كل النقاط).

الخاتمة


أود أن أعتقد أن العقد القادم سيكون هو الفترة التي يعثر فيها الحواسيب الفائقة والبحث الذكي على بعضهما البعض. أرغب في امتلاك أجهزة تسمح لي بإعداد نفسي على مستوى معين من أجل التكيف مع خوارزمية AI المطلوبة.


العقد القادم

كود لعبة Game Boy in C.

تصحيح الأخطاء


كثيرا ما يسألني الناس: ما هو الأصعب؟ هذا كل شيء - المشروع بأكمله كان مؤلما للغاية. بالنسبة للمبتدئين ، لا توجد مواصفات لـ Game Boy. كل ما تعلمناه ، حصلنا على الهندسة العكسية ، أي أننا أطلقنا مهمة متوسطة ، مثل لعبة ، وشاهدنا كيف يتم تنفيذها. هذا يختلف تمامًا عن تصحيح البرامج القياسي ، لأننا هنا نقوم بتصحيح الأجهزة التي تدير البرامج. كان علي أن أتوصل إلى طرق مختلفة لتحقيق ذلك. وتحدثت عن مدى صعوبة مراقبة العملية عند تشغيلها بتردد 100 MHz؟ أوه ، وليس هناك printf هناك.


أحد الأساليب لتطبيق وحدة المعالجة المركزية هو تجميع الإرشادات حول وظائفها. مع 6502 هو أسهل بكثير. حشر LR35092 الكثير من كل هذا الهراء "العشوائي" وهناك العديد من الاستثناءات. لقد استخدمت هذا الجدول عند العمل مع CPU Game Boy. لقد استخدمت استراتيجية جشعة - أخذت أكبر جزء من التعليمات ، وقمت بتنفيذها وحذفتها ، ثم كررتها. 1/4 من التعليمات هي ALU ، 1/4 يتم تحميل التسجيل ، والذي يمكن تنفيذه بسرعة كبيرة. على الجانب الآخر من الطيف ، توجد كل أنواع الأشياء المنفصلة ، مثل "التحميل من HL إلى SP مع علامة" ، والتي يجب معالجتها بشكل منفصل.


تصحيح الأخطاء: قم بتشغيل التعليمات البرمجية على الجهاز الذي تقوم بتصحيحه ، ثم اكتب سجل التنفيذ ومعلومات إضافية (يوضح هذا مقارنة رمز Verilog على اليسار مع محاكي C على اليمين). ثم قم بتشغيل الفرق حتى تتمكن السجلات من العثور على تناقضات (زرقاء). أحد أسباب استخدام الأتمتة هو أنني وجدت في كثير من الحالات مشكلات بعد ملايين دورات التنفيذ عندما تسبب علم وحدة المعالجة المركزية (CPU) واحد في تأثير كرة الثلج. جربت عدة طرق ، واتضح أن هذا النهج هو الأكثر فعالية.


سوف تحتاج إلى الكثير من القهوة!


هذه الكتب 40 سنة. كان من المدهش أن أتصفحهم وأن ينظروا إلى عالم أجهزة الكمبيوتر من خلال عيون هؤلاء المستخدمين في ذلك الوقت - شعرت كضيف من المستقبل.

OpenAI طلب بحث


في البداية كنت أرغب في العمل مع الألعاب من حيث الذاكرة ، كما هو موضح في منشور من OpenAI.

من المثير للدهشة أن الحصول على Q-Learning للعمل بشكل جيد على المدخلات التي تمثل حالات الذاكرة كان أمرًا صعبًا بشكل غير متوقع.

هذا المشروع قد لا يكون حلا. سيكون من غير المتوقع معرفة أن Q-Learning لن ينجح أبدًا في العمل مع الذاكرة في Atari ، ولكن هناك فرص أن تكون هذه المهمة صعبة للغاية.

بالنظر إلى أن الألعاب الموجودة على Atari لا تستخدم سوى 128 ب من الذاكرة ، فقد بدا الأمر جذابًا للغاية لمعالجة هذه 128 ب بدلاً من إطارات ملء الشاشة. حصلت على نتائج مختلطة ، لذلك بدأت في معرفة ذلك.

وعلى الرغم من أنني لا أستطيع إثبات أنه من المستحيل التعلم من الذاكرة ، إلا أنني أستطيع أن أثبت أن الافتراض بأن الذاكرة تعكس الحالة الكاملة للعبة هو خطأ. تستخدم وحدة المعالجة المركزية Atari 2600 (6507) ذاكرة 128 ب ، ولكن لا يزال لديها إمكانية الوصول إلى سجلات إضافية تعيش على دارة منفصلة (TIA ، محول لجهاز تلفزيون ، مثل GPU). تُستخدم هذه السجلات لتخزين ومعالجة معلومات حول الكائنات (مضرب ، صاروخ ، كرة ، تصادم). بمعنى آخر ، لن يكون الوصول إليها ممكنًا إذا نظرنا إلى الذاكرة فقط. لدى NES و Game Boy أيضًا سجلات إضافية تُستخدم للتحكم في الشاشة والتمرير. ذاكرة واحدة فقط لا تعكس الحالة الكاملة للعبة.

يقوم 8080 فقط بتخزين البيانات مباشرة في ذاكرة الفيديو ، مما يسمح لك باستخراج الحالة الكاملة للعبة. في حالات أخرى ، يتم توصيل سجلات "GPU" بين وحدة المعالجة المركزية والمخزن المؤقت للشاشة ، بينما خارج ذاكرة الوصول العشوائي.



حقيقة مثيرة للاهتمام: إذا أجريت بحثًا حول تاريخ GPU ، فقد يكون 8080 هو أول "مسرّع رسومات" - فهو يحتوي على سجل تحويل خارجي يسمح لك بنقل غزاة الفضاء باستخدام أمر واحد ، وهو يفرغ وحدة المعالجة المركزية.




Eof

Source: https://habr.com/ru/post/ar435506/


All Articles