インテル® アーキテクチャー上で Unity Technology ML-Agents* を調査する

この記事は、インテル® デベロッパー・ゾーンに掲載されている「Explore Unity Technologies ML-Agents* Exclusively on Intel® Architecture」の日本語参考訳です。


概要

この記事は、CPU のみの環境に Unity Technology ML-Agents* をインストールして実行する方法を説明しています。次のことを行います。

  • CUDA* と cuDNN* がない Windows* 上で、ML-Agents* のバランスボールの例をトレーニングし実行します。
  • Windows* 上でインテル® アドバンスト・ベクトル・エクステンション 2 (インテル® AVX2) 向けに最適化された TensorFlow* の CMake ビルドを行います。
  • CUDA* と cuDNN* なしでスクラッチから簡単な Amazon Web Services* (AWS*) Ubuntu* Amazon Machine Image (AMI) 環境を作成し、Linux* 向けのバランスボール “ヘッドレス” バージョンをビルドして、AWS* 上でトレーニングします。

はじめに

Unity Technologies は、2017 年 9 月に 3D ゲームエンジンを使用してエキサイティングな強化学習を提供する Machine Learning Agents* (ML-Agents*) (英語) のベータバージョンをリリースしました。Unity* の入門向けブログ (英語) では、このオープン SDK は, “ロボット、自律型車両、およびその他の産業アプリケーション向けのトレーニング” に注目する業界の研究者、学術研究者、およびゲーム開発者にとって有益であると紹介されています。

Unity* ML-Agents* SDK は、トレーニング・エージェントの機械学習フレームワークとして近位ポリシーの最適化 (Proximal Policy Optimization – PPO) (英語) アルゴリズムを使用した TensorFlow* (英語) を利用しています。GitHub* ダウンロードには、導入ガイド (英語) の例、SDK のインストールと使用法に関するドキュメントを初め、いくつかのプロジェクトの例があります。

一部の開発者にとって SDK には、ML-Agents* 環境を設定して実行するため CUDA* と cuDNN* への暗黙の依存性があるという欠点があります。CPU 上で ML-Agents* を調査するだけではなく、Windows® 10 コンピューター上でインテル® アーキテクチャー向けの最適化を含む TensorFlow* のカスタムビルドを行うこともできます。

この記事では以下を説明します。

  • CUDA* と cuDNN* なしで Windows* 上で ML-Agents* のバランスボール (図 1 を参照) の例をトレーニングして実行します。
  • Windows* 上でインテル® アドバンスト・ベクトル・エクステンション 2 (インテル® AVX2) 向けに最適化された TensorFlow* の CMake ビルドを行います。
  • CUDA* と cuDNN* なしでスクラッチから簡単な Amazon Web Service* (AWS*) Ubuntu* Amazon Machine Image (AMI) 環境を作成し、Linux* 向けのバランスボール “ヘッドレス” バージョンをビルドして、AWS* 上でトレーニングします。


図 1. Unity* ソフトウェアでトレーニングされたバランスボール・モデルを実行

対象ユーザー

この記事は、TensorFlow*、Unity* ソフトウェア、Python*、AWS*、および機械学習の概念に注目する開発者向を対象として書かれています。

システム構成

記事では次のシステム構成を使用しています。

Windows* ワークステーション

  • インテル® Xeon® プロセッサー E3-1240 v5
  • Microsoft* Windows® 10 バージョン 1709

Linux* サーバー (トレーニング)

  • インテル® Xeon® Platinum 8180 プロセッサー @ 2.50GHz
  • Ubuntu* Server 16.04 LTS

AWS* Cloud (トレーニング)

  • インテル® Xeon® プロセッサー
  • Ubuntu* Server 16.04 LTS AMI

クラウド環境における ML-Agents* のトレーニングのセクションでは、無料利用枠で Ubuntu* Server 16.04 AMI を使用します。

共通 Windows* コンポーネントをインストール

ここでは、ML-Agents* の環境設定と実行に必要な共通ソフトウェア・コンポーネントのインストール方法について説明します。Unity* ML-Agents* のドキュメントのインストールと設定 (英語) 手順には、CUDA* と cuDNN* のインストール方法を説明するウェブページへのリンクが含まれています。システムに CUDA 互換 (英語) のグラフィックス処理ユニット (GPU) カードがすでに装着されており、追加の作業をいとわないのであれば問題ありませんが、ここでは必須条件ではありません。いずれにしても、続行する間に Unity* ML-Agents* のドキュメントを見直すことを推奨します。

共通ソフトウェア・コンポーネントをインストールするには、基本的な 3 つのステップがあります。

  1. こちら (英語) から、Unity* 2017.1 以降をダウンロードしてインストールします。
  2. GitHub* (英語) から ML-Agents* SDK をダウンロードします。ファイルを展開して、任意のプロジェクト・フォルダー (例えば C:\ml-agents) へ移動します。
  3. こちら (英語) から、Anaconda* distribution for Python 3.6 version for Windows* をダウンロードしてインストールします。

事前ビルドされた TensorFlow* のインストール

ここでは、Windows* 上の CPU のみをサポートする TensorFlow* のインストール・ガイドラインに従います。TensorFlow* のウェブサイト (英語) によると、「このバージョンの TensorFlow* は、NVIDIA* GPU を使用している場合でも、通常 5 から 10 分程度で簡単にインストールできるため、最初にこのバージョンをインストールすることを推奨します」、と説明されています。Windows® 10 システムに事前ビルドされた TensorFlow* をインストールするには、次の手順に従ってください。

  1. スタートメニューで、Anaconda Prompt アイコン (図 2 参照) をクリックして、新しいターミナルを開きます。


    図 2. Windows* スタートメニュー

  2. ターミナルから次のコマンドを実行します。

    > conda create -n tensorflow-cpu python=3.5
    > activate tensorflow-cpu
    > pip install --ignore-installed --upgrade tensorflow

  3. TensorFlow* のドキュメントで指示されるように、Python* を起動して次のコマンドを入力して、インストールが正しく動作していることを確認してください。

    > python
    >>> import tensorflow as tf
    >>> hello = tf.constant('Hello')
    >>> sess = tf.Session()
    >>> print (sess.run(hello))

  4. すべてが正しく動作すると、図 3 に示すようにターミナルに ‘Hello’ が出力されます。


    図 3. Python* テストの出力

    図 3 に示すように、”Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX, AVX2 (CPU は TensorFlow* のコンパイルでは使用されていないインテル® AVX、インテル® AVX2 命令をサポートしています)” というメッセージが表示されることがあります。このメッセージは、システムに搭載されるインテル® プロセッサーによって異なる可能性があります。これは、ソースからビルドを行う場合、コンピューター上で TensorFlow* がさらに高速に動作する可能性があることを示します。これについては次のセクションで説明します。

  5. Python* を閉じるには CTRL + Z キーを押します。
  6. 前にダウンロードした ML-Agents* レポジトリーの python サブディレクトリーへ移動し、ほかの必要な依存関係のあるコンポーネントをインストールするため、次のコマンドを実行します。

    > pip install.

  7. 「バランスボールの導入ガイド」チュートリアルの Unity* 環境のビルド (英語) を参照して、ML-Agents* を完了します。

ソースから TensorFlow* をインストール

ここでは、Windows® 10 システムで最適化バージョンの TensorFlow* をビルドする方法を説明しています。

TensorFlow* のウェブサイト (英語) では、「Windows* 上では TensorFlow* のビルドは正式にサポートされていませんが、Windows* または TensorFlow* CMake ビルドで実験的な Bazel を使用してもかまわないなら、Windows* で TensorFlow* をビルドできるかもしれません」と説明されています。しかし、落胆する必要はありません。ここでは、Windows* システム上で CMake ビルドを行う方法を説明します。

次の TensorFlow* のビルド・ガイドラインは、GitHub* (英語) にあるステップごとの Windows* ビルド (英語) 手順を補完します。ビルド手順をより完全に理解するには、続行する前に GitHub* のドキュメントをご覧ください。

  1. Microsoft* Visual Studio* 2015 (英語) をインストールします。図 4 のように、プログラミング・オプションが設定されていることを確認してください。


    図 4. Visual Studio* プログラミング・オプション

  2. こちら (英語) から Git をダウンロードしてインストールします。インストールですべてのデフォルト設定を承諾してください。
  3. こちら (英語) から swigwin をダウンロードして展開します。C:\swigwin-3.0.12 にフォルダーを変更します (バージョン番号はシステムでは異なる可能性があることに留意してください)。
  4. こちら (英語) から CMake バージョン 3.6 をダウンロードしてインストールします。インストール中に、[Add CMake to the system path for all users] オプションを必ずオンにしてください。
  5. スタートメニューで、Anaconda Prompt アイコン (図 2 参照) をクリックして、新しいターミナルを開きます。ターミナルから次のコマンドを実行します。

    > conda create -n tensorflow-custom36 python=3.6
    > activate tensorflow-custom36

  6. 次のコマンドを実行して環境を設定します。

    > "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat"

    (注: vcvarsall.bat が見つからない場合、ここ (英語) で示される手順に従ってください。)
  7. TensorFlow* レポジトリーをクローンして、ビルドに必要な作業ディレクトリーを作成します。

    cd /
    > git clone https://github.com/tensorflow/tensorflow.git
    > cd tensorflow\tensorflow\contrib\cmake
    > mkdir build
    > cd build

  8. 次のコマンドを入力します (注: 以下に示されるパスとライブラリーのバージョンは、実際のシステムとは異なる可能性があるため確認してください)。

    > cmake .. -A x64 -DCMAKE_BUILD_TYPE=Release ^
    -DSWIG_EXECUTABLE=C:\swigwin-3.0.12/swig.exe ^
    -DPYTHON_EXECUTABLE=C:/Users/%USERNAME%/Anaconda3/python.exe ^
    -DPYTHON_LIBRARIES=C:/Users/%USERNAME%/Anaconda3/libs/python36.lib ^
    -Dtensorflow_WIN_CPU_SIMD_OPTIONS=/arch:AVX2

  9. .\tf_python\dist ディレクトリーに .whl ファイルとして作成される pip パッケージをビルドします (例えば、C:\tensorflow\tensorflow\contrib\cmake\build\tf_python\dist\tensorflow-1.4.0-cp36-cp36m-win_amd64.whl)。

    > C:\Windows\Microsoft.NET\Framework64\v4.0.30319\MSBuild /p:Configuration=Release tf_python_build_pip_package.vcxproj

    (注: 実際のシステムでは MSBuild へのパスが異なる可能性があるため確認してください。)
  10. 次のコマンドを使用して新たに作成した TensorFlow* ビルドをインストールします。

    pip install C:\tensorflow\tensorflow\contrib\cmake\build\tf_python\dist\tensorflow-1.4.0-cp36-cp36m-win_amd64.whl

  11. TensorFlow* のドキュメントで指示されるように、Python* を起動して次のコマンドを入力して、インストールが正しく動作していることを確認してください。

    > python
    >>> import tensorflow as tf
    >>> hello = tf.constant('Hello')
    >>> sess = tf.Session()
    >>> print (sess.run(hello))

  12. 正しく動作すると、ターミナルに ‘Hello’ が出力されます。また、前のセクション (図 5 を参照) で確認したような最適化に関する警告は表示されません。


    図 5. Python* テストの出力

  13. Python* を閉じるには CTRL + Z キーを押します。
  14. 前にダウンロードした ML-Agents* レポジトリーの python サブディレクトリーへ移動し、ほかの必要な依存関係のあるコンポーネントをインストールするため、次のコマンドを実行します。

    > pip install .

  15. 「バランスボールの導入ガイド」チュートリアルの Unity* 環境のビルド (英語) を参照して、ML-Agents* を完了します。

クラウド環境で ML-Agents* をトレーニング

ML-Agents* のドキュメント『Training on Amazon–Web Service』では、ML-Agents* をトレーニングするため AWS* 上で EC2 インスタンスを設定する手順が説明されています。このガイドでは、「最新の Nvidia* ドライバー、CUDA8*、および cuDNN* が含まれる EC2 インスタンスを必要とします」とされていますが、GPU のオーバーヘッドなしにクラウドベースのトレーニングを行う簡単な方法があります。

ここでは、次のステップを実行します。

  • Ubuntu* Server 16.04 AMI (無料利用) を作成します。
  • Windows* 上でクラウドサーバーと対話するために必要なアプリケーションをインストールします。
  • AMI 上で Python* と TensorFlow* をインストールします。
  • Windows* 上でバランスボール・アプリケーションのヘッドレス Linux* バージョンをビルドします。
  • Linux* 環境でスタンドアロンのスクリプトとして実行するため、PPO.ipynb Jupyter Notebook* で Python* コードをエクスポートします。
  • Windows* から Linux* AMI へ python ディレクトリーをコピーします。
  • ML-Agents* バランスボール・アプリケーション向けに AWS* 上でトレーニング・セッションを実行します。
  1. AWS* 上にアカウントを作成します (作成していなければ)。ここで示される手順は、AWS* 無料利用アカウントで実行できます。ただし、アカウントの作成と AMI の設定の詳細に関しては、ウェブサイトで詳しく説明されているため、ここでは省略します。
  2. Ubuntu* Server 16.04 AMI を作成します。この記事で使用したマシン・インスタンスを図 6 に示します。


    図 6. Linux* サーバー 16.04 LTS Amazon Machine Image

  3. Windows* ワークステーションに PuTTY と WinSCP* をインストールします。これらのコンポーネントをインストールする詳しい手順とリンク、PuTTY を使用した Windows* から Linux* への接続、および WinSCP を使用した Linux* へのファイル転送については、AWS* ウェブサイト を参照してください。
  4. PuTTY を使用して Linux* Server AMI にログインして、Python* と TensorFlow* をインストールするため次のコマンドを実行します。

    > sudo apt-get update
    > sudo apt-get install python3-pip python3-dev
    > pip3 install tensorflow
    > pip3 install image

    注: 次のステップでは、ML-Agents* のバランスボール導入ガイド (英語) チュートリアルはすでに完了していると仮定しています。そうでなければ、続行する前にこれらの手順を完了して、ローカル Windows* ワークステーションでモデルのトレーニングと実行が成功していることを確認してください。
  5. 使用する Unity* ソフトウェアのインストールに、Linux* ビルドのサポートが含まれていることを確認してください。インストール中に明示的にこのオプションを指定するか、図 7 に示すように Unity* ダウンロード・アシスタントを実行することで既存のインストールにオプションを追加することができます。


    図 7. Unity* ソフトウェア Linux* ビルドサポート

  6. 6. Unity* ソフトウェアで、[File] – [Build Setting] を開いて以下を行います。
    • ターゲット・プラットフォーム: Linux*
    • アーキテクチャー: x86_64
    • ヘッドレスモード: オン
  7. 図 8 にこれらの設定を示します。


    図 8. ヘッドレス Linux* 操作向けの Unity* ソフトウェアのビルド設定

  8. Build をクリックして、ユニークな名前のアプリケーションを作成し、レポジトリーの python フォルダーに保存します (図 9 を参照)。この例では、Ball3DHeadless.x86_64 と名前を付け、以降の説明で参照しています。


    図 9. Linux* アプリケーションのビルド

  9. Linux* AMI 上で完全なトレーニング・セッションを実行するため、PPO.ipynb Jupyter Notebook* に Python* コードをエクスポートして、Linux* 環境でスタンドアロン・スクリプトとして実行できるようにします。これを行うには以下の手順に従います。
    • スタートメニューで新しいターミナルを開くには、Anaconda Prompt アイコン (図 2) をクリックします。
    • python フォルダーに移動し、コマンドラインで Jupyter Notebook を入力します。
    • PPO.ipynb ノートブックを開いて、[File] – [Download As – Python (.py)] をクリックします。これにより、Windows* コンピューターのダウンロード・フォルダーに、新しいファイル名 “ppo.py” が保存されます。
    • ファイル名を “ppo-test.py” に変更し、ML-Agents* レポジトリーの python フォルダーにコピーします。
    • テキストエディターで ppo-test.py を開き、env_name 変数に “Ball3DHeadless” を設定します。

      env_name = “Ball3DHeadless” # トレーニング環境ファイル名

    • ppo-test.py を保存して、次の手順に進みます。
  10. Linux* 環境向けにアプリケーションがビルドされ、テストスクリプトが作成されたら、WinSCP を使用して ML-Agents* レポジトリーから Ubuntu* AMI へ python フォルダーをコピーします (WinSCP を使用して Linux* 環境にファイルを転送する方法の詳細は、AWS* ウェブサイトで説明されています)。
  11. PuTTY コンソールで、python フォルダーへ移動して次のコマンドを実行します。

    > cd python
    > chmod +x Ball3DHeadless.x86_64
    > python3 ppo-test.py

    すべてが上手くいくと、図 10 のようなトレーニング・セッションの開始が示されます。


    図 10. Amazon Web Services* Linux* でトレーニング・セッションを実行

まとめ

図 10 の出力に見られるように、それぞれのモデルが保存された後で時間 (秒) が示されています。この記事で使用した ppo-test.py スクリプトでは、次のモデルが保存されるまでの間にトレーニングの概算時間を取得するため、コードが追加されています。

コードをインストルメントするため、Python* スクリプトは次のように変更されています。

import numpy as np
import os
import tensorflow as tf
import time # New Code
.
.
.
trainer = Trainer(ppo_model, sess, info, is_continuous, use_observations, use_states)
timer_start = time.clock() # New Code
.
.
.
Save_model(sess, model_path=model_path, steps=steps, saver=saver)
print(“ %s seconds “ % (time.clock() – timer_start)) # New Code
timer_start = time.clock() # New Code
.
.
.

この非公式のパフォーマンス・メトリックを使用して、Windows* ワークステーション上で事前ビルドされた TensorFlow* GPU バイナリーと CPU のみのバイナリー間のトレーニングの平均時間を比較した差は、ごくわずかであることが判明しました。Windows* ワークステーション上で、カスタムバージョンの CPU のみの TensorFlow* ビルドのトレーニング時間は、事前ビルドされた CPU のみのバイナリーよりおよそ 19% 高速でした。クラウド環境でトレーニングを行った場合、AWS* Ubuntu* Server AMI は Windows* 上のカスタム TensorFlow* ビルドよりおよそ 29% 高速に実行されました。

コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。

関連記事