⛏️

マイクラを学習するbotを作る!(2/n)

2023/09/05に公開

概要

目標/方針/環境/前回までの進捗

目標

Minecraftのマルチサーバーでプレイヤーに教わりながら操作を学習するbotを作る。

方針

  • botの作成、マルチサーバーへのログイン、実際の動作はMineflayerを使用。
  • OpenAI APIのChatGPT4を使用してコードを生成、スキルライブラリに追加。
  • 随時スキルライブラリからコードを呼び出して実行することでマイクラの操作を行わせる。
  • 基本的な仕組みは先行研究であるNVIDIAのVoyagerを参考にする。

環境

  • ローカル端末:MacbookPro 1.4GHz クアッドコアIntel Corei5 メモリ8GB
  • レンタルサーバー:ConohaVPS メモリ8GB CentOS

前回までの進捗

  • Mineflayerを用いたbotの作成・マルチサーバーへのログイン
  • OpenAI APIとの連携
  • OpenAI APIのChatGPT4を使用してbotを話せる機能の追加
  • その他標準搭載スキルの追加

目標と方針

今回の目標と方針

今回の目標

  • 先行研究であるVoyagerの実行環境を構築し、プレイヤーに教わりながら操作を学習するように改造する準備を整える
  • Azureサーバー上でVoyagerを動かす

今回の方針

  1. レンタルサーバーをAzureに変更する
  2. Azure上でMinecraftマルチサーバーを動かす
  3. VoyagerをAzure上のMinecraftマルチサーバーで動かしてみる
  4. botに実際のMinecraftアカウントを使用してスキンをカスタマイズする

成果

成果

Voaygerとは

Voyagerとは

方法

方法

レンタルサーバーをAzureに変更する

レンタルサーバーをAzureに変更する

Azureアカウントの登録

Azureアカウントの登録

VMの作成

VMの作成

以下のように記入する

minecraftサーバー用VMの設定
項目 記入例
サブスクリプション minebot-subsucription
リソースグループ minebot-resource-group
仮想マシン名 vm-minecraft
地域 (Asia Pacific) Japan East
可用性オプション インフラストラクチャ冗長は必要ありません
セキュリティの種類 Standard
イメージ Ubuntu Server 20.04 LTS - Gen2
Azure スポットインスタンス なし
サイズ Standard_B2s
認証の種類 SSH 公開キー
ユーザ名 azureuser
SSH公開キーのソース 新しい組の生成
キーの組名 vm-minecraft_key
パブリック受信ポート 選択したポートを許可する
受信ポートを選択 SSH (22)
minebotサーバー用VMの設定
項目 記入例
サブスクリプション minebot-subsucription
リソースグループ minebot-resource-group
仮想マシン名 vm-minebot
地域 (Asia Pacific) Japan East
可用性オプション インフラストラクチャ冗長は必要ありません
セキュリティの種類 Standard
イメージ Ubuntu Server 20.04 LTS - Gen2
Azure スポットインスタンス なし
サイズ Standard_B2s
認証の種類 SSH 公開キー
ユーザ名 azureuser
SSH公開キーのソース 新しい組の生成
キーの組名 vm-minebot_key
パブリック受信ポート 選択したポートを許可する
受信ポートを選択 SSH (22)

minecraftサーバー用ポートの設定

minecraftサーバー用ポートの設定

VMの左側のリストからネットワークを開く
受信ポートの規則を追加するをクリックし、以下のポート設定を記入する

MinecraftServer用ポートの設定
項目 記入例
ソース IP Addresses
ソースIP アドレス/CIDR 範囲 自分のIPアドレス
ソースポート範囲 *
宛先 Any
サービス Custom
宛先ポート範囲 25565
プロトコル TCP
アクション 許可
優先度 310
名前 MinecraftServer
説明 なし
MinecraftRcon用ポートの設定
項目 記入例
ソース IP Addresses
ソースIP アドレス/CIDR 範囲 自分のIPアドレス
ソースポート範囲 *
宛先 Any
サービス Custom
宛先ポート範囲 25575
プロトコル TCP
アクション 許可
優先度 310
名前 MinecraftRcon
説明 なし

SSH接続

SSH接続

Azure上でMinecraftマルチサーバーを動かす

Azure上でMinecraftマルチサーバーを動かす

server.jarのダウンロード

server.jarのダウンロード

Javaのインストール

Javaのインストール
  • パッケージリストのアップグレード
    最初に、すべてのパッケージリストを最新のものに更新してから、アップグレードする。
$ sudo apt update
$ sudo apt upgrade -y
  • OpenJDKのインストール
    今回のminecraft 1.19のサーバーを起動させるためにはバージョン17以上openjdkが必要です。
$ sudo apt install openjdk-17-jdk -y
  • Javaのバージョン確認
    インストールが成功したことを確認するために、以下のコマンドを実行してJavaのバージョンをチェックする。
$ java -version
openjdk version "17.0.8" 2023-07-18
OpenJDK Runtime Environment (build 17.0.8+7-Ubuntu-120.04.2)
OpenJDK 64-Bit Server VM (build 17.0.8+7-Ubuntu-120.04.2, mixed mode, sharing)

screenの起動

screenの起動
  • screenのインストール
    バックグラウンドでMinecraftサーバーを実行するために、screen を起動する。
    まだscreenをインストールしていない場合は、以下のコマンドでインストールする。
$ sudo apt update
$ sudo apt install screen
  • screenの起動
    screen セッションを作成し、それに適当な名前(今回はminecraft)を付ける。
$ screen -S minecraft

これにより、新しいscreenセッションが開始され、そのセッション内でコマンドを実行することができる。

マルチサーバー起動

マルチサーバー起動
  • eula.txtの生成
    以下のコマンドでminecraft_server_1.19.jarを実行する。
$ java -Xmx1024M -Xms1024M -jar minecraft_server_1.19.jar nogui

実行したらlsコマンドなどで必要なファイルが生成されたか確認する。

$ ls
eula.txt  libraries  logs  minecraft_server_1.19.jar  server.properties  versions
  • eula.txtの変更
    eula.txtの以下の部分をfalseからtrueに変更する。
#By changing the setting below to TRUE you are indicating your agreement to our EULA (https://aka.ms/MinecraftEULA).
#Sun Aug 27 11:08:21 UTC 2023
- eula=false
+ eula=true
  • マルチサーバーの起動
    もう一度以下のコマンドでマルチサーバーを立ち上げる。
$ java -Xmx1024M -Xms1024M -jar minecraft_server_1.19.jar nogui

worldフォルダなどが生成されれば成功。

マルチサーバーへ接続

マルチサーバーへ接続
  • Minecraftの起動
    Minecraft Launcherから起動構成をバージョン1.19に設定しマインクラフトを起動する。
  • マルチサーバーへのログイン
    マルチプレイのサーバーを追加からサーバーアドレスに作成したVMのパブリックIPアドレスを入力する。サーバー名は自由に設定してください。
    設定後に「サーバーに接続できません」などのエラーが出ていなければ成功。

VoyagerをAzure上のMinecraftマルチサーバーで動かしてみる

VoyagerをAzure上のMinecraftマルチサーバーで動かしてみる

Voyagerインストール

Voyagerインストール

以下のコマンドでVoyagerをインストールし、フォルダに移動する。

$ git clone https://github.com/MineDojo/Voyager
$ cd Voyager

python3&pipのインストール

python3&pipのインストール

以下のコマンドでpython3.9をインストールする。
Voyagerではバージョン3.9以上のPythonが必要。

$ sudo apt update
$ sudo apt install python3.9 python3.9-venv python3.9-dev

Python3.9のpipをインストールする。

$ sudo apt install python3.9-distutils
$ curl https://bootstrap.pypa.io/get-pip.py | sudo python3.9

Pythonパッケージのインストール

Pythonパッケージのインストール

以下のコマンドでPythonパッケージをインストールする。

$ python3.9 -m pip install -e .

npmのインストール

npmのインストール

以下のコマンドでnode.jsとnpmをインストールする。

$ sudo apt update
$ curl -sL https://deb.nodesource.com/setup_16.x | sudo -E bash -
$ sudo apt install -y nodejs

npmおよびnpxのバージョンを確認して、正常にインストールされたかを確認する。

$ npm -v
$ npx -v

nodeモジュールのインストール

nodeモジュールのインストール

以下のコマンドで各ディレクトリに必要なnodeモジュールをインストールする。

$ cd voyager/env/mineflayer
$ sudo npm install -g npx
$ npm install
$ npx tsc
$ cd ..
$ npm install

サーバー起動時&停止時に自動的に処理が走るようにする

起動時に自動的に処理が開始されるようにする

minecraftサーバー用VMの設定

minecraftサーバー用VMの設定

サーバー起動時にminecraftが起動し、サーバー停止時にminecraftがデータ保存&終了されるようにする。
systemdサービスファイルを作成する。

$ sudo nano /etc/systemd/system/minecraft-server.service

以下のように記入する。
/path/to/your/minecraft/directoryはminecraft_server_1.19.jarを設置したディレクトリのパスで置き換える。

minecraft-server.service
[Unit]
Description=Minecraft Server
After=network.target

[Service]
User=azureuser
Nice=1
KillMode=none
SuccessExitStatus=0 1
ProtectHome=true
ProtectSystem=full
PrivateDevices=true
NoNewPrivileges=true
WorkingDirectory=/path/to/your/minecraft/directory
ExecStart=/usr/bin/screen -DmS minecraft /usr/bin/java -Xmx1024M -Xms1024M -jar /path/to/your/minecraft/directory/minecraft_server_1.19.jar nog>
ExecStop=/usr/bin/screen -p 0 -S minecraft -X eval 'stuff "say SERVER SHUTTING DOWN. Saving map..."\015'
ExecStop=/usr/bin/screen -p 0 -S minecraft -X eval 'stuff "save-all"\015'
ExecStopSleep=5s
ExecStop=/usr/bin/screen -p 0 -S minecraft -X eval 'stuff "stop"\015'

[Install]
WantedBy=multi-user.target

サービスのリロードと有効化を行う。

$ sudo systemctl daemon-reload
$ sudo systemctl enable minecraft-server.service

今後の方針

今後の方針
  • チャットでプレイヤーの指示を受け取って、取り組むタスクを決めるようにする
  • チャットでプレイヤーの指示を受け取って、タスクの実行結果の評価を行うようにする
  • サーバーをdiscordから起動・停止・状態取得できるようにする

実際のコード(githubリンク)

今回は私のではなくNVIDIAによるVoyagerのgithubリンクを置いておきます。
https://github.com/MineDojo/Voyager

Discussion