MarioGPT:AIによるステージ自動生成

テキストからマリオのステージを生成する

MarioGPTは、「パイプが多い、敵が少ない、高低差がある」のような自然言語の指示から、スーパーマリオブラザーズのステージを自動生成するAIツールです。

GitHub リポジトリを見る
MarioGPTとは

MarioGPTは、NeurIPS 2023で発表された研究プロジェクトで、GPT-2(大規模言語モデル)をスーパーマリオブラザーズのステージデータでファインチューニングしたものです。

仕組み

  1. 学習データ:スーパーマリオブラザーズ(初代 + The Lost Levels)の全ステージをタイル文字列に変換
  2. モデル:DistilGPT-2(GPT-2の軽量版、約82Mパラメータ)をステージデータでファインチューニング
  3. テキスト条件付け:BART(テキストエンコーダ)がプロンプトを解析し、生成を制御
  4. 経路整合性:MarioBERT(マスク予測モデル)が、生成されたステージをプレイ可能に調整

テキストプロンプトでステージを制御

🌱 🌱 🌱
"many pipes, few enemies, low elevation"
👾 👾 👾
"many enemies, some blocks, high elevation"
🔥 🏰 🔥
"no pipes, many enemies, high elevation"
論文:Sudhakaran, S., Gonzalez-Duque, M., Glanois, C., Freiberger, M., Najarro, E., & Risi, S. (2023). "MarioGPT: Open-Ended Text2Level Generation through Large Language Models." NeurIPS 2023. arXiv:2302.05981
必要な環境

Python

3.8 以上

Java

8 以上(ステージプレイ用)

GPU(推奨)

CUDA対応。CPUでも動作可

ディスク容量

約2GB(モデル自動DL)

注意:GPUがなくても動作しますが、ステージ生成に時間がかかります。大学のサーバ(mikawa)にはGPUがないため、自分のPC(WSL)で実行するか、Google Colabを利用してください。
セットアップ手順

1 Python仮想環境の作成

プロジェクト専用の仮想環境を作成します。これにより、他のプロジェクトとパッケージが干渉しません。

# プロジェクトディレクトリを作成
$ mkdir mario-gpt-project
$ cd mario-gpt-project

# Python仮想環境を作成・有効化
$ python3 -m venv venv
$ source venv/bin/activate

2 MarioGPTのインストール

pipコマンドで簡単にインストールできます。

# pip でインストール(推奨)
$ pip install mario-gpt

ソースからインストールする場合:

# リポジトリをクローンしてインストール
$ git clone https://github.com/shyamsn97/mario-gpt.git
$ cd mario-gpt
$ pip install -e .

3 Javaのインストール(ステージプレイ用)

生成したステージを実際にプレイするには、Java 8以上が必要です。

# Ubuntu / WSL の場合
$ sudo apt update
$ sudo apt install default-jdk

# バージョン確認
$ java -version
openjdk version "17.0.x" ...

4 動作確認

Pythonスクリプトでステージを生成してみましょう。初回実行時にモデルが自動的にHugging Faceからダウンロードされます(約500MB)。

# test_mario.py として保存
from mario_gpt import MarioLM

# モデルの読み込み(初回はダウンロードが発生)
mario_lm = MarioLM()

# プロンプトでステージを生成
prompts = ["many pipes, many enemies, some blocks, high elevation"]

# ステージ生成(num_stepsでステージの長さを制御)
generated_level = mario_lm.sample(
    prompts=prompts,
    num_steps=1400,
    temperature=2.0
)

# 生成結果を表示
generated_level.img.show()

# ステージをプレイ!(Java必要)
generated_level.play()
# 実行
$ python3 test_mario.py
使い方の詳細

プロンプトのキーワード

MarioGPTは以下のキーワードの組み合わせでステージを制御します。

カテゴリ キーワード 効果
パイプ many pipes / some pipes / no pipes パイプ(土管)の数を制御
many enemies / some enemies / few enemies / no enemies 敵キャラクターの数を制御
ブロック many blocks / some blocks / few blocks ブロック(? ブロック含む)の数を制御
高低差 high elevation / low elevation 地形の高さ・起伏を制御

生成パラメータ

生成結果の保存

# 画像として保存
generated_level.img.save("my_level.png")

# テキスト表現を取得
level_text = generated_level.level
print(level_text)

# 複数ステージを一括生成
prompts = [
    "many pipes, few enemies, low elevation",
    "no pipes, many enemies, high elevation",
    "many blocks, some enemies, high elevation",
]
levels = mario_lm.sample(prompts=prompts, num_steps=1400, temperature=2.0)
Google Colab で試す(GPU不要のPC向け)

自分のPCにGPUがない場合や、環境構築が面倒な場合は、Google Colabを使うと簡単に試せます。

手順

  1. Google Colab にアクセス(Googleアカウントが必要)
  2. 「ノートブックを新規作成」をクリック
  3. 以下のコードをセルに貼り付けて実行
# セル1: インストール
!pip install mario-gpt
!apt-get install -y default-jdk

# セル2: ステージ生成
from mario_gpt import MarioLM

mario_lm = MarioLM()
prompts = ["many pipes, many enemies, some blocks, high elevation"]
generated_level = mario_lm.sample(prompts=prompts, num_steps=1400, temperature=2.0)

# 生成結果を表示
generated_level.img
ヒント:Colabの「ランタイム」→「ランタイムのタイプを変更」でGPUを選択すると、生成速度が大幅に向上します(無料枠でも使えます)。
スーパーマリオの改良との組み合わせ

MarioGPTで生成したステージのデータを、スーパーマリオの改良課題で作成したゲームに取り込むことで、AIが生成したステージで遊べるゲームを作れます。

アイデア

これは上級者向けの発展課題です。MarioGPTの出力フォーマットと自作ゲームのステージフォーマットを合わせる作業が必要になります。生成AIに「MarioGPTの出力を自分のゲーム用に変換するスクリプトを書いて」と指示するのも有効です。
トラブルシューティング

よくある問題

「ModuleNotFoundError: No module named 'mario_gpt'」

仮想環境が有効化されていない可能性があります。source venv/bin/activate を実行してからやり直してください。

「CUDA out of memory」

num_steps を小さくする(例: 700)か、CPUで実行してください。

# CPUで明示的に実行
import torch
device = torch.device("cpu")
mario_lm = MarioLM(device=device)

「play() でエラーが出る」

Javaがインストールされていないか、GUIが利用できない環境(リモートサーバ等)の可能性があります。WSLの場合はsudo apt install default-jdkでJavaをインストールしてください。画像保存は generated_level.img.save("level.png") でGUIなしでも可能です。

「モデルのダウンロードが遅い」

Hugging Faceからのダウンロードは初回のみです。ネットワーク状況により時間がかかる場合があります。学内Wi-Fiが遅い場合は有線LAN接続を試してください。

参考文献
  1. S. Sudhakaran, M. González-Duque, C. Glanois, M. Freiberger, E. Najarro, and S. Risi, "MarioGPT: Open-Ended Text2Level Generation through Large Language Models," in Advances in Neural Information Processing Systems (NeurIPS), 2023. arXiv:2302.05981
  2. A. Radford, J. Wu, R. Child, D. Luan, D. Amodei, and I. Sutskever, "Language Models are Unsupervised Multitask Learners," OpenAI Technical Report, 2019. — GPT-2の原論文(MarioGPTのベースモデル)
  3. V. Sanh, L. Debut, J. Chaumond, and T. Wolf, "DistilBERT, a distilled version of BERT: smaller, faster, cheaper and lighter," in NeurIPS Workshop on Energy Efficient Machine Learning and Cognitive Computing, 2019. arXiv:1910.01108 — DistilGPT-2の蒸留手法
  4. M. Lewis, Y. Liu, N. Goyal, M. Ghazvininejad, A. Mohamed, O. Levy, V. Stoyanov, and L. Zettlemoyer, "BART: Denoising Sequence-to-Sequence Pre-training for Natural Language Generation, Translation, and Comprehension," in ACL, 2020. arXiv:1910.13461 — テキスト条件付けに使用
  5. A. Summerville, S. Snodgrass, M. Guzdial, C. Holmgård, A. K. Hoover, A. Isaksen, A. Nealen, and J. Togelius, "Procedural Content Generation via Machine Learning (PCGML)," IEEE Transactions on Games, vol. 10, no. 3, pp. 257–270, 2018. arXiv:1702.00539 — 機械学習によるゲームコンテンツ自動生成のサーベイ
  6. MarioGPT GitHub リポジトリ: https://github.com/shyamsn97/mario-gpt