摘要
本文介绍了如何在仅限 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 个步骤:
- 从软件包(参见此处)中下载并安装 Unity 2017.1 或更高版本。
- 从 GitHub下载 ML-Agents SDK。解压文件并将它们移动到选定的项目文件夹(如 C:\ml-agents)。
- 点击此处,下载并安装面向 Windows 的 Python 3.6 版本的 Anaconda* 分发版。
安装预构建 TensorFlow*
本部分遵循了在仅限 CPU 支持的 Windows 上安装 TensorFlow 的指南。根据 TensorFlow 网站,“该 TensorFlow 版本通常更容易安装(一般需要 5 到 10 分钟),因此,即便您配备了 NVIDIA* GPU,我们建议您首先安装该版本。”执行以下步骤,在您的 Windows 10 系统上安装预构建 TensorFlow:
- 在开始菜单中,单击 Anaconda Prompt图标(见图 2),以打开新的终端。
图 2. Windows* 开始菜单。 - 在提示符后输入以下命令:
> conda create -n tensorflow-cpu python=3.5
> activate tensorflow-cpu
> pip install --ignore-installed --upgrade tensorflow - 按照 TensorFlow 文档的说明,打开 Python 并输入以下命令,以确保正确执行安装:
> python
>>> import tensorflow as tf
>>> hello = tf.constant('Hello')
>>> sess = tf.Session()
>>> print (sess.run(hello)) - 如果所有步骤都正确,“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,它可以更快速地在电脑上运行,我们将在下一部分展开讨论。
- 收到提示后按下 CTRL+Z,以关闭 Python。
- 导航至之前下载的 ML-Agents 存储库的 python 子目录,然后运行以下命令,以安装所需的其他关联组件:
> pip install.
- 请参阅《Balance Ball 示例入门》教程的构建 Unity 环境章节,以完成对 ML-Agents 教程的学习。
从源代码安装 TensorFlow
本部分描述了如何在 Windows 10 系统上构建一个优化版 TensorFlow。
TensorFlow 网站指出“我们不会正式支持在 Windows 上构建 TensorFlow;但是,如果您不介意在 Windows 或 TensorFlow CMake 构建中使用试验性很强的 Bazel,可以尝试在 Windows 上构建 TensorFlow。”但是,不要因为这则声明而气馁。在本部分,我们提供了关于如何在 Windows 系统上执行 CMake 构建的说明。
以下 TensorFlow 构建指南是对 GitHub上显示的分步 Windows 构建说明的补充。建议您在继续操作之前,查看 GitHub 文档,以全面了解构建过程。
- 安装 Microsoft Visual Studio* 2015。请务必查看图 4 显示的编程选项。
图 4. Visual Studio* 编程选项。 - 从此处下载与安装 Git。接受面向安装的所有默认设置。
- 从此处下载与提取 swigwin。将文件夹改为 C:\swigwin-3.0.12(请注意,您系统上的版本号可能有所不同)。
- 从此处下载与安装 CMake 版本 3.6。在安装过程中,请务必检查 面向所有用户将 CMake 添加至系统路径(Add CMake to the system path for all users)选项。
- 在开始菜单中,单击 Anaconda Prompt图标(见图 2),以打开新的终端。在提示符后输入以下命令:
> conda create -n tensorflow-custom36 python=3.6
> activate tensorflow-custom36 - 运行以下命令,以设置环境:
(注:如果未发现 vcvarsall.bat,尝试此处提供的以下指令。)> "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat"
- 复制 TensorFlow 存储库并为您的构建创建一个工作目录:
cd /
> git clone https://github.com/tensorflow/tensorflow.git
> cd tensorflow\tensorflow\contrib\cmake
> mkdir build
> cd build - 输入下列命令(注:请务必检查系统中的下列路径和库版本,因为它们可能会有所不同):
> 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 - 构建 pip 程序包,它将被创建为 .\tf_python\dist 目录中的 .whl 文件(如 C:\tensorflow\tensorflow\contrib\cmake\build\tf_python\dist\tensorflow-1.4.0-cp36-cp36m-win_amd64.whl)。
(注:请务必检查系统中的 MSBuild 路径,因为它们可能会有所不同。)> C:\Windows\Microsoft.NET\Framework64\v4.0.30319\MSBuild /p:Configuration=Release tf_python_build_pip_package.vcxproj
- 输入以下命令,安装新创建的 TensorFlow 构建:
pip install C:\tensorflow\tensorflow\contrib\cmake\build\tf_python\dist\tensorflow-1.4.0-cp36-cp36m-win_amd64.whl
- 按照 TensorFlow 文档的说明,打开 Python 并输入以下命令,以确保正确执行安装:
> python
>>> import tensorflow as tf
>>> hello = tf.constant('Hello')
>>> sess = tf.Session()
>>> print (sess.run(hello)) - 如果所有步骤都正确,“Hello”应在终端打印。我们不会看到上文中出现的任何构建优化警告(见图 5)。
图 5. Python* 测试输出。 - 收到提示后按下 CTRL+Z,以关闭 Python。
- 导航至之前下载的 ML-Agents 存储库的 python 子目录,然后运行以下命令,以安装所需的其他关联组件:
> pip install .
- 请参阅《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应用的训练。
- 如果您没有账户,需要在 AWS 上创建一个账户。您可以按照本部分展示的步骤创建一个 AWS 免费套餐账户;但是,我们不会具体介绍如何创建账户与配置 AMI,因为该网站包含详细的操作信息。
- 创建一个 Ubuntu 服务器 16.04 AMI。图 6 显示了我们准备本文所使用的机器实例。
图 6. Linux* 服务器 16.04 LTS Amazon Machine Image*。 - 在您的 Windows 工作站上安装 PuTTY* 和 WinSCP*。AWS 网站提供了关于如何安装这些组件、如何使用 PuTTY 从 Windows 连接至 Linux 实例以及如何使用 WinSCP 将文件传输至 Linux 实例的详细说明和链接。
- 使用 PuTTY 登录 Linux 服务器 AMI,然后输入以下命令,以安装 Python 和 TensorFlow:
注:以下步骤假设您已完成 ML-Agents《Balance Ball 示例入门》教程的学习。如果您未完成该教程,在进行下一步之前,请务必输入完整的指令,并验证您能否在本地 Windows 工作站上成功训练与运行模型。> sudo apt-get update
> sudo apt-get install python3-pip python3-dev
> pip3 install tensorflow
> pip3 install image
- 确保您的 Unity 软件安装包括 Linux 构建支持。您需要在安装时明确指定该选项,或者您可以通过运行 Unity Download Assistant 将它添加至现有的安装(如图 7 所示)。
图 7.Unity* 软件 Linux* 构建支持。 - 在 Unity 软件中,打开 File – Build Settings并选择以下选项:
- 目标平台:Linux
- 架构:x86_64
- 无头模式:已检查
- 设置如图 8 所示。
图 8.面向无头 Linux 操作的 Unity* 软件构建设置。 - 点击 Build后,为应用创建一个独特的名称,并将其保存至存储库的 python文件夹内(见图 9)。在我们的示例中,我们将它命名为 Ball3DHeadless.x86_64,并在文章的后续部分沿用该名称。
图 9.构建 Linux* 应用。 - 为了在 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,然后继续进行下一步操作。 - 面向 Linux 环境构建了应用,并生成了测试脚本后,使用 WinSCP 将 python文件夹从 ML-Agents 存储库复制到 Ubuntu AMI。(关于如何使用 WinSCP 将文件传输至 Linux 实例的详细信息,请参阅 AWS 网站。)
- 在 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%。