AWSDeepRacerのローカルトレーニング (DeepRacer For Cloud) をWindows(WSL)でやってみた

2022.05.16

AWS事業本部梶原@福岡オフィスです。AWS DeepRacerではMentaiko-DevelopersIOで参加しています。

AWS 上で実施する場合はちょっと古いですが、こちらの記事をご参考ください。

WindowsマシンでAWS DeepRacerのローカルトレーニングを実施してみます。

本来、Nvidia のGPU(CUDA)が必要ですが、ちょっとやってみたいという人のためにCPUだけでぶん回してみます。

実際に、手元のWindows (Surface3)で実行しています。

AWSDeepRacer ローカルトレーニングとは

通常 AWS DeepRacerはAWSのコンソール上から、お手軽にモデルのトレーニングを開始、レースに参加できます。(無料利用枠もあります)

AWS DeepRacerは、AWSのマネージドサービスSageMaker, RoboMaker, S3, Kinesis等を組み合わせてAWSのコンソール上で実施できるようにサービスが提供されています。 AWS DeepRacerの構築内容などはAWSから公開されています。それを単独の環境(EC2やローカルのPCなど)でモデルのトレーニングを実行できるように有志によって作成されたのがローカルトレーニングになります。

主なモチベーションはコストメリットになりますが、マネージドサービスを使わないことによるトレードオフが発生します。具体的にはメモリ不足、ストレージの空き容量などのハード面の管理、個人的に一番大きいと思っているのがモデルの履歴管理を自分でしないといけません。

とはいえ、ローカルトレーニング環境を触っていると、各サービスの連携やSageMaker,RoboMakerの実装方法などに詳しくなれます。そして自由にカスタマイズ(壊すこともよくありますが)もできます。

WSLの準備

Ubuntu 20.04.4 LTS を使用します。

Microsoft Store よりUbuntu 20.04.4 LTS を入手してください

https://apps.microsoft.com/store/detail/ubuntu-20044-lts/9MTTCL66CPXJ

Ubuntu 20.04 がインストールできたら、スタートメニュー等より起動させてください

DeepRacer 用のユーザー追加(オプション)

$sudo useradd deepracer
$sudo usermod -aG sudo deepracer
$sudo su - deepracer

Docker 環境等の準備

Docker また、AWSコマンド等のインストールを実施します。

$ sudo apt-get update -y
$ sudo apt-get install jq awscli python3-boto3 docker-compose -y
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository    "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get update && sudo apt-get install -y --no-install-recommends docker-ce docker-ce-cli containerd.io

GPUを使用する場合はnvidiaのDocker イメージを有効にまたDockerでのGPUの使用を有効にしてください

distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
cat /etc/docker/daemon.json | jq 'del(."default-runtime") + {"default-runtime": "nvidia"}' | sudo tee /etc/docker/daemon.json

参考 https://aws-deepracer-community.github.io/deepracer-for-cloud/windows.html

Docker の起動

sudo service docker start

minio の設定

$ aws configure --profile minio
AWS Access Key ID [None]: minio <= なんでもいいです
AWS Secret Access Key [None]: miniokey <= なんでもいいです
Default region name [None]:
Default output format [None]:

Install DRfC

DeepRacer for Cloud のインストールを実施します。

docker 関連でエラーが出る場合は、dockerグループへの追加が有効になっていないので、一度ログインしなおしてみてください

$ git clone https://github.com/aws-deepracer-community/deepracer-for-cloud.git
$ cd deepracer-for-cloud/

$ bin/init.sh -a cpu -c local

(Dokcer Imageのダウンロードが実施されます)
5.0.0: Pulling from awsdeepracercommunity/deepracer-rlcoach
5.0.1-cpu-avx2: Pulling from awsdeepracercommunity/deepracer-robomaker
5.0.0-cpu: Pulling from awsdeepracercommunity/deepracer-sagemaker

(GPUを使う場合は)
$ bin/init.sh -a gpu -c local
$ docker pull awsdeepracercommunity/deepracer-sagemaker:5.0.0-gpu
$ docker pull awsdeepracercommunity/deepracer-robomaker:5.0.1-gpu

DeepRacer for Cloudの実行

$ source bin/activate.sh
Creating service s3_minio

$ dr-upload-custom-files
Uploading files to s3://bucket/custom_files/
upload: custom_files/hyperparameters.json to s3://bucket/custom_files/hyperparameters.json
upload: custom_files/model_metadata.json to s3://bucket/custom_files/model_metadata.json
upload: custom_files/reward_function.py to s3://bucket/custom_files/reward_function.py

ここまでできたら、ローカルトレーニングを一度実行してみます。

初期のmodel_metadata.json は速度がかなり遅い(0.8m/s)ので、以下のように編集して速くしてみます。

$ vi custom_files/model_metadata.json
{
    "action_space": [
        {
            "steering_angle": -30,
            "speed": 1.0
        },
        {
            "steering_angle": -15,
            "speed": 2.0
        },
        {
            "steering_angle": 0,
            "speed": 3.0
        },
        {
            "steering_angle": 15,
            "speed": 2.0
        },
        {
            "steering_angle": 30,
            "speed": 1.0
        }
    ],
    "sensor": ["FRONT_FACING_CAMERA"],
    "neural_network": "DEEP_CONVOLUTIONAL_NETWORK_SHALLOW",
    "training_algorithm": "clipped_ppo",
    "action_space_type": "discrete",
    "version": "4"
}
$ 編集したら再度アップロードをして反映させてください
$ dr-upload-custom-files

実際にローカルトレーニングを始めてみます。

$ dr-start-training
Creating Robomaker configuration in s3://bucket/rl-deepracer-sagemaker/training_params.yaml
Creating service deepracer-0_rl_coach
Creating service deepracer-0_robomaker
22:C 16 May 2022 08:21:24.688 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
22:C 16 May 2022 08:21:24.688 # Redis version=6.2.6, bits=64, commit=00000000, modified=0, pid=22, just started
22:C 16 May 2022 08:21:24.688 # Configuration loaded
22:M 16 May 2022 08:21:24.689 * monotonic clock: POSIX clock_gettime
                _._
           _.-``__ ''-._
      _.-``    `.  `_.  ''-._           Redis 6.2.6 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._
 (    '      ,       .-`  | `,    )     Running in standalone mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
 |    `-._   `._    /     _.-'    |     PID: 22
  `-._    `-._  `-./  _.-'    _.-'
 |`-._`-._    `-.__.-'    _.-'_.-'|
 |    `-._`-._        _.-'_.-'    |           https://redis.io
  `-._    `-._`-.__.-'_.-'    _.-'
 |`-._`-._    `-.__.-'    _.-'_.-'|
 |    `-._`-._        _.-'_.-'    |
  `-._    `-._`-.__.-'_.-'    _.-'
      `-._    `-.__.-'    _.-'
          `-._        _.-'
              `-.__.-'

下記のようなログがではじめたら、起動は成功です!!!

Unable to find deepracer checkpoint json
[s3] Successfully uploaded .lock to                      s3 bucket bucket with s3 key rl-deepracer-sagemaker/model/.lock.
[s3] Successfully uploaded .ready to                      s3 bucket bucket with s3 key rl-deepracer-sagemaker/model/.ready.
DoorMan: installing SIGINT, SIGTERM
Training> Name=main_level/agent, Worker=0, Episode=1, Total reward=36.35, Steps=67, Training iteration=0
Training> Name=main_level/agent, Worker=0, Episode=2, Total reward=9.03, Steps=90, Training iteration=0
Training> Name=main_level/agent, Worker=0, Episode=3, Total reward=34.73, Steps=145, Training iteration=0
Training> Name=main_level/agent, Worker=0, Episode=4, Total reward=12.75, Steps=176, Training iteration=0

Ctrl-C 等で一度ぬけます(トレーニングはバックグランドで実行されています)

動いているDeepRacerを見てみます。

$ dr-start-viewer

Docker内でストリームが起動するので、WSLのIPアドレスを確認します。

$ dr-start-viewer
$ ip addr show dev eth0
4: eth0:  mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether xxxxxxxxxxxxxxxxxxxxxxxxxx brd ff:ff:ff:ff:ff:ff
    inet 172.25.xx.xx/20 brd 172.25.xxxx.255 scope global eth0
       valid_lft forever preferred_lft forever

eth0 の情報のinet の部分 172.xx.xx.xx をWindowsの方でブラウザに入力し、ポート8100 に接続します。

http://172.XX.XX.XX:8100

下記のような画面がでてくれば、成功です。

AWSコンソールと同様にDeepRacerCarが動いているのが確認できるかと思います。

結構CPUが唸ると思いますが、1~2時間ほどトレーニングすると初期の報酬関数でもそれなりに走りますので、眺めてみてください。

DeepRacer for Cloud を停止する

ビューアを停止します。

$ dr-stop-viewer

トレーニングを停止します

$ dr-stop-training

Dockerを停止します。

$ sudo service docker stop

まとめ

Windows環境でもローカルトレーニングが実施できました。Docker イメージがおそらくx86系になるかとおもいますがIntel Macでもおそらくできそうな気がしています。

WSLでGPUサポートが始まったのが最近なので、ちょっとGPUを実際に使用するのはコツがいりますがCPUだけでもそれなりに動くのでDeepRacerのローカルトレーニングのために、Ubuntuマシンを用意するハードルがちょっと高いなと思っている方でもできるようにしてみました。

よくよく考えると、WSLで機械学習のトレーニングができちゃってるのはなかなか面白い気がします。

参考情報

deepracer-for-cloud

WSLでGPUを有効にする

https://docs.nvidia.com/cuda/wsl-user-guide/index.html