ML-Agentsのバージョンをv0.13.1からv.1.0.2にアップデートする

# 1. はじめに

長らくベータ版だったML-Agentsですが、最近になってついにPreview Packageとしてリリースされたとのこと。良い機会なので、手元の`v0.13.1`で構築されたプロジェクトを最新版の`release_3`に更新してみたいと思い、自分用の忘備録として情報をまとめてみました。基本的に影響がでかそうな変更点だけです。細々した変更や、私自身があまり使っていない機能については言及していません。たとえばC#とPython間で通信を行い、独自のデータ形式をやりとりできるようにする`Side Channel`という機能について`v0.13.1`から`release 3` の間でいくつか変更点があるようですが、取り上げていません。

# 2. 移行方法

公式が移行ガイドを公開しています。それぞれのバージョンの重要な変更点と、移行する方法がまとめられています。

https://github.com/Unity-Technologies/ml-agents/blob/release_3_docs/docs/Migrating.md


## 3. ML-Agentsの変更点

だいぶ情報が重複していますが、以下の公式のリリースノートが参考になります。

[0.14.0](https://github.com/Unity-Technologies/ml-agents/releases/tag/0.14.0)
[0.14.1](https://github.com/Unity-Technologies/ml-agents/releases/tag/0.14.1)
[0.15.0](https://github.com/Unity-Technologies/ml-agents/releases/tag/0.15.0)
[0.15.1](https://github.com/Unity-Technologies/ml-agents/releases/tag/0.15.1)
[Release 1](https://github.com/Unity-Technologies/ml-agents/releases/tag/release_1)
[Release 2](https://github.com/Unity-Technologies/ml-agents/releases/tag/release_2)
[Release 3](https://github.com/Unity-Technologies/ml-agents/releases/tag/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メソッドでカリキュラムの設定を行うようにしてみました。つまり

```c#:HogeAcademy

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;
        });
    }
}
```

を

```c#:HogeAgent

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


   
```c#:v0.13.1

    void override CollectObservations()
    {
        base.CollectObservations();
        this.AddVectorObs(this.transform.localPosition);
    }
```

```c#:v0.15.0

    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

```c#:v0.13.1

    public override float[] Heuristic()
    {
        float hoge = Input.GetAxis("Horizontal");
        return new float[] { hoge };
    }
```

```c#:release_1

    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)

[移行ガイド](https://github.com/Unity-Technologies/ml-agents/blob/master/docs/Migrating.md#migrating-from-013-to-014)によると

> 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
  
```c#  
    Academy.Instance.StatsRecorder.Add(key, value);
```

## 最後に

まだ自分のプロジェトは作業中なので、随時更新する予定です。