探索专门用于英特尔® 架构的 Unity Technologies ML-Agents*

摘要

本文介绍了如何在仅限 CPU 的环境中安装并运行 Unity Technologies ML-Agents*。展示了如何:

  • 不使用 CUDA* 和 cuDNN* 的情况下,在 Windows* 上训练与运行 ML-Agents Balance Balls 示例。
  • 在专为英特尔® 高级矢量扩展指令集 2(英特尔® AVX2)优化的 Windows 上执行 TensorFlow* CMake 构建。
  • 不使用 CUDA 和 cuDNN 的情况下,从零创建一个简单的 Amazon Web Services*(AWS)Ubuntu* Amazon Machine Image* 环境,构建并在 AWS 上训练面向 Linux* 的“无头”版 Balance Balls

简介

Unity Technologies 于 2017 年 9 月发布了测试版 机器学习代理*(ML-Agents*),并借助 3D 游戏引擎提供了激动人心的 强化学习简介。根据 Unity 博客的介绍,这款开源 SDK 能够为学术研究人员、对“机器人、自动驾驶汽车和其他工业应用的训练机制”感兴趣的行业研究人员和游戏开发人员带来显著的优势。

Unity ML-Agents SDK 将 TensorFlow* 用作使用近端策略优化(PPO)算法训练代理的机器学习框架。GitHub* 下载页面提供了若干示例项目、入门示例和关于安装与使用这款 SDK 的文档。

对于某些开发人员,设置与运行 ML-Agents 环境对 CUDA* 和 cuDNN* 的深度依赖是这款 SDK 的一个缺点。事实证明,我们不仅可以只在 CPU 上探索 ML-Agents,还可以在 Windows® 10 电脑上执行 TensorFlow 自定义构建,以添加面向英特尔® 架构的优化。

本文将向您展示如何:

  • 不使用 CUDA 和 cuDNN 的情况下,在 Windows 上训练与运行 ML-Agents Balance Balls(见图 1)示例。
  • 在面向英特尔® 高级矢量扩展指令集 2(英特尔® AVX2)优化的 Windows* 上执行 TensorFlow CMake 构建。
  • 不使用 CUDA 和 cuDNN 的情况下,从零创建一个简单的 Amazon Web Services*(AWS)Ubuntu* Amazon Machine Image*(AMI)环境,构建并在 AWS 上训练面向 Linux* 的“无头”版 Balance Balls


图 1. 在 Unity* 软件上运行的经过训练的 Balance Balls 模型。

 

目标受众

本文面向接触过 TensorFlow、Unity 软件、Python*、AWS 和机器学习概念的开发人员。

系统配置

在准备本文的过程中使用了以下系统配置:

Windows 工作站

  • 英特尔® 至强® 处理器 E3-1240 v5
  • Microsoft Windows 10,1709 版本

Linux 服务器(训练)

  • 英特尔® 至强® 铂金 8180 处理器 @ 2.50 GHz
  • Ubuntu 服务器 16.04 LTS

AWS 云(训练)

  • 英特尔® 至强® 处理器
  • Ubuntu 服务器 16.04 LTS AMI

在“在云中训练 ML-Agents”部分,我们使用了免费的 Ubuntu 服务器 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. 点击此处,下载并安装面向 Windows 的 Python 3.6 版本的 Anaconda* 分发版。

安装预构建 TensorFlow*

本部分遵循了在仅限 CPU 支持的 Windows 上安装 TensorFlow 的指南。根据 TensorFlow 网站,“该 TensorFlow 版本通常更容易安装(一般需要 5 到 10 分钟),因此,即便您配备了 NVIDIA* GPU,我们建议您首先安装该版本。”执行以下步骤,在您的 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. 如果所有步骤都正确,“Hello”应在终端打印,如图 3 所示。


    图 3.Python* 测试输出。

    您可能会注意到类似图 3 所示的一条消息,即“您的 CPU 支持指令:该 TensorFlow 二进制未经过编译,无法使用 AVX AVX2(“Your CPU supports instructions that this TensorFlow binary was not compiled to use:AVX AVX2”)。该消息可能会因系统中英特尔® 处理器的不同而有所差异;它表示如果您从源代码构建 TensorFlow,它可以更快速地在电脑上运行,我们将在下一部分展开讨论。

  5. 收到提示后按下 CTRL+Z,以关闭 Python。
     
  6. 导航至之前下载的 ML-Agents 存储库的 python 子目录,然后运行以下命令,以安装所需的其他关联组件:

    > pip install.

  7. 请参阅《Balance Ball 示例入门》教程的构建 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。在安装过程中,请务必检查 面向所有用户将 CMake 添加至系统路径(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. 构建 pip 程序包,它将被创建为 .\tf_python\dist 目录中的 .whl 文件(如 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. 收到提示后按下 CTRL+Z,以关闭 Python。
     
  14. 导航至之前下载的 ML-Agents 存储库的 python 子目录,然后运行以下命令,以安装所需的其他关联组件:

    > pip install .

  15. 请参阅《Balance Ball 示例入门》教程的构建 Unity 环境章节,以完成对 ML-Agents 教程的学习。

在云中训练 ML-Agents

ML-Agents 文档提供了名为《在 Amazon–Web Service 上进行训练》的指南,包括用于在 AWS 上设置 EC2 实例(以训练 ML-Agents)的说明。虽然该指南声明“您需要一个包含最新版 Nvidia* 驱动程序、CUDA8 和 cuDNN 的 EC2 实例”,但是基于云的训练可以采取更简单的方式,同时不产生 GPU 开销。

在本部分,我们执行以下步骤:

  • 创建一个 Ubuntu 服务器 16.04 AMI(免费套餐)。
  • 在 Windows 上安装先决组件应用,以便与云服务器进行交互。
  • 在 AMI 上安装 Python 和 TensorFlow。
  • 在 Windows 上构建无头 Linux 版 Balance Balls 应用。
  • 导出 PPO.ipynb Jupyter 笔记本* 中的 Python 代码,使其在 Linux 环境中作为独立脚本运行。
  • python 目录从 Windows 复制至 Linux AMI。
  • 在 AWS 上运行面向 ML-Agents Balance Balls 应用的训练。
  1. 如果您没有账户,需要在 AWS 上创建一个账户。您可以按照本部分展示的步骤创建一个 AWS 免费套餐账户;但是,我们不会具体介绍如何创建账户与配置 AMI,因为该网站包含详细的操作信息。
  2. 创建一个 Ubuntu 服务器 16.04 AMI。图 6 显示了我们准备本文所使用的机器实例。


    图 6. Linux* 服务器 16.04 LTS Amazon Machine Image*。

  3. 在您的 Windows 工作站上安装 PuTTY* 和 WinSCP*。AWS 网站提供了关于如何安装这些组件、如何使用 PuTTY 从 Windows 连接至 Linux 实例以及如何使用 WinSCP 将文件传输至 Linux 实例的详细说明和链接。
     
  4. 使用 PuTTY 登录 Linux 服务器 AMI,然后输入以下命令,以安装 Python 和 TensorFlow:

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

    注:以下步骤假设您已完成 ML-Agents《Balance Ball 示例入门》教程的学习。如果您未完成该教程,在进行下一步之前,请务必输入完整的指令,并验证您能否在本地 Windows 工作站上成功训练与运行模型。
     
  5. 确保您的 Unity 软件安装包括 Linux 构建支持。您需要在安装时明确指定该选项,或者您可以通过运行 Unity Download Assistant 将它添加至现有的安装(如图 7 所示)。


    图 7.Unity* 软件 Linux* 构建支持。

  6. 在 Unity 软件中,打开 File – Build Settings 并选择以下选项:
    • 目标平台:Linux
    • 架构:x86_64
    • 无头模式:已检查
  7. 设置如图 8 所示。


    图 8. 面向无头 Linux 操作的 Unity* 软件构建设置。

  8. 点击 Build 后,为应用创建一个独特的名称,并将其保存至存储库的 python 文件夹内(见图 9)。在我们的示例中,我们将它命名为 Ball3DHeadless.x86_64,并在文章的后续部分沿用该名称。


    图 9.构建 Linux* 应用。

  9. 为了在 Linux AMI 上运行完整的训练流程,我们将导出 PPO.ipynb Jupyter 笔记本中的 Python 代码,使其在 Linux 环境中作为独立脚本运行。为此,执行以下步骤:

    - 在开始菜单中,单击 Anaconda Prompt 图标(图 2),以打开新的终端。
    - 导航至 python 文件夹,然后在命令行输入 Jupyter 笔记本。
    - 打开 PPO.ipynb 笔记本,然后单击 File – Download As – Python (.py)。将在 Windows 电脑的 Downloads 文件夹内保存一个名为“ppo.py”的新文件。
    - 将文件名改为“ppo-test.py”,然后将它复制到 ML-Agents 存储库中的 python 文件夹内。
    -在文本编辑器中打开 ppo-test.py,然后将 env_name 变量改为“Ball3DHeadless”:
    - env_name = “Ball3DHeadless” # Name of the training environment file.
    - 保存 ppo-test.py,然后继续进行下一步操作。

  10. 面向 Linux 环境构建了应用,并生成了测试脚本后,使用 WinSCP 将 python 文件夹从 ML-Agents 存储库复制到 Ubuntu AMI。(关于如何使用 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
.
.
.

通过使用非正式的性能指标,我们发现预构建 TensorFlow GPU 二进制和 Windows 工作站上仅限 CPU 的预构建二进制在平均训练时间方面的差异十分微小。相比 Windows 工作站上仅限 CPU 的预构建二进制,仅限 CPU 的自定义 TensorFlow 构建的训练速度领先了约 19%。在云内执行训练时,相比 Windows 上的自定义 TensorFlow 构建,AWS Ubuntu Server AMI 的执行速度提升了约 29%。

有关编译器优化的更完整信息,请参阅优化通知