1. はじめに
長らくベータ版だったML-Agentsですが、最近になってついにPreview Packageとしてリリースされたとのこと。良い機会なので、手元のv0.13.1で構築されたプロジェクトを最新版のrelease_3に更新してみたいと思い、自分用の忘備録として情報をまとめてみました。基本的に影響がでかそうな変更点だけです。細々した変更や、私自身があまり使っていない機能については言及していません。たとえばC#とPython間で通信を行い、独自のデータ形式をやりとりできるようにするSide Channelという機能についてv0.13.1からrelease 3 の間でいくつか変更点があるようですが、取り上げていません。
2. 移行方法
公式が移行ガイドを公開しています。それぞれのバージョンの重要な変更点と、移行する方法がまとめられています。
3. ML-Agentsの変更点
だいぶ情報が重複していますが、以下の公式のリリースノートが参考になります。
0.14.0
0.14.1
0.15.0
0.15.1
Release 1
Release 2
Release 3
変更点についてざっくり確認していきます。
Academyクラスの変更点
シングルトンに変更 v0.14.0
v0.13.1
public abstract class Academy : MonoBehaviour {}
v0.14.0
public class Academy : IDisposable
{
public static Academy Instance { get; }
}
MonoBehaviourクラスを継承しないので、GameObjectにアタッチできない。Start,FixedUpdateとかのメソッドが使えなくなった。InitializeAcademy, AcademyStepも廃止。
移行ガイドによると
- InitializeAcademyのコードをMonoBehaviour.Awakeに移動する。
- AcademyStepのコードをMonoBehaviour.FixedUpdateに移動する。
- OnDestroyコードをMonoBehaviour.OnDestroyに移動する。
- AcademyResetコードを新しいメソッドに移動し、Academy.OnEnvironmentResetアクションに追加する。
とあるので、いままでAcademyに実装していた内容を他のMonoBehaviour継承クラスに移動させる必要があるようです。
自分のプロジェクトだとInitializeAcademyでカリキュラムの設定をしていたので、それを移動させる必要がありそうです。
カリキュラムのパラメータはすべてAgentクラスのパラメータだったので、直接AgentクラスのAwakeメソッドでカリキュラムの設定を行うようにしてみました。つまり
using MLAgents;
using UnityEngine;
public class HogeAcademy : Academy
{
[field: SerializeField]
public float m_HogeParam { get; private set; }
public override void InitializeAcademy()
{
base.InitializeAcademy();
FloatProperties.RegisterCallback("hoge_param", f =>
{
this.m_HogeParam = f;
});
}
}
を
using Unity.MLAgents;
using Unity.MLAgents.Sensors;
using UnityEngine;
public class HogeAgent : Agent
{
[field: SerializeField]
public float m_HogeParam { get; private set; }
private void Awake()
{
Academy.Instance.EnvironmentParameters.RegisterCallback("hoge_param", (float f) =>
{
this.m_HogeParam= f;
});
}
}
のような形にしてみました。
Agentクラスの変更点
CollectObservationsメソッドの値の渡し方が変更 v0.15.0
void override CollectObservations()
{
base.CollectObservations();
this.AddVectorObs(this.transform.localPosition);
}
public override void CollectObservations(VectorSensor sensor)
{
base.CollectObservations(sensor);
sensor.AddObservation(this.transform.localPosition);
}
メソッドの名前が変更 v0.15.0
- InitializeAgent() -> Initialize()
- AgentAction() -> OnActionReceived()
- AgentReset() -> OnEpisodeBegin()
- Done() -> EndEpisode()
- GiveModel() -> SetModel()
Heuristicメソッドの値の渡しかたが変更 release_1
public override float[] Heuristic()
{
float hoge = Input.GetAxis("Horizontal");
return new float[] { hoge };
}
public override void Heuristic(float[] actionsOut)
{
float hoge = Input.GetAxis("Horizontal");
actionsOut[0] = hoge;
}
trainer_config.yamlの変更点
step数の数え方が変更されたようです。v0.14.0
トレーナーのステップは、以前のバージョンのように環境ごとではなく、エージェントごとにカウントされるようになりました。例えば、シーンに10人のエージェントがいる場合、ターミナルとTensorboardに印刷されているように、20の環境ステップが200ステップに対応するようになりました(#3113)
移行ガイドによると
trainer_config.yamlのmax_stepsとsummary_freqにシーン内のエージェントの数を掛け合わせてください。
とのこと。
コマンド
--loadオプションの変更 release_1
--load -> --resume
--trainオプションの廃止 release_1
--trainをつけなくても、デフォで学習開始してくれるようになった
逆に学習しないで実行したい場合は--inference をつける。
その他
名前空間の変更
名前空間 MLAgentsがUnity.MLAgentsに変更 release_1
TensorBoardが使えるようになった release_1
Academy.Instance.StatsRecorder.Add(key, value);
最後に
まだ自分のプロジェトは作業中なので、随時更新する予定です。