我们之前已经为大家介绍过《Mac下配置Unity机器学习代理工具》和《Windows 10下配置Unity机器学习代理工具和TensorFlow环境》,但是还是不少开发者表示配置环境是个难题,一部分使用者对于安装TensorFlow、Python等工具链比较头疼。

现在随着Unity机器学习工具ML-agents v0.3 beta版的发布,今天由Unity技术经理鲍健运向各位推荐一种比较方便的“实验性”解决方案:使用Docker在Windows和Mac平台下进行ML-Agents的训练与推理。

这种解决方案还存在一些限制:
目前的设置会强制让TensorFlow和Unity使用CPU进行计算。(当然,如果你是没有N卡的Mac用户,原来的解决方案也是一样的情况。) Docker支持仅限于其代理不使用基于摄像头的视觉观察( camera-based visual observations)的学习环境。 因此,像GridWorld这种示例,在Docker方式下是不支持的。 因为Windows 10版的Docker需要使用Hyper-V功能,所以对于Windows 10的版本有所限制。


001559uxxx33crc033vzyh.png

什么是Docker?
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

001601epcsc414vg1ysiv4.png

必要准备:
Unity Linux 发布平台支持功能(Unity 2017.1+) Docker


安装Docker
Windows或Mac系统,通过Unity安装器或者Unity Hub下载Unity,确保安装Linux发布平台的支持(Linux Build Support)。

001558zfa3o1q36ojigoj3.png

安装 Docker,大家可以前往Docker官网根据自己电脑的系统下载所需的安装包。

001600ueeiqij319jd4o9q.png

由于Docker在与主机隔离的环境中运行容器,主机中的已安装目录用于共享数据,例如: Unity可执行文件,课程文件和TensorFlow图形。 为了方便起见,我们在存储库的根目录下创建了一个空的unity-volume文件夹。当然,你可以根据自身实际需求,随意使用其他目录。

使用方法
这个解决方案主要有三个步骤:使用特定标志构建Unity环境,构建Docker容器,最后运行容器。如果你不熟悉为ML-Agents构建Unity环境,可以先移步学习我们之前发布的《Unity机器学习项目实战:3D平衡小球》学习,下文也以《3D平衡小球》项目为例。

构建环境
由于Docker通常运行与主机共享(linux)内核的容器,所以必须为Linux平台构建Unity环境。 在构建Unity环境时,请从Build Settings窗口中选择以下选项:
Target Platform 设置为 Linux Architecture 设置为 x86_64 取消 Development Build 勾选 取消 Headless Mode 勾选(必须,因为Unity二进制文件将在没有安装图形驱动程序的容器中运行。)


001559b0vczww30wc02ufs.png

然后点击 Build,选择一个环境名称(比如ML-Agents-3DBall),并将输出的目录设置为 unity-volume。构建完成后,确保在统一卷下创建文件<环境名称> .x86_64和子目录<环境名称> _Data /。

001557iaiazey29m96enmn.png

构建 Docker 容器
首先确保Docker引擎正在你的机器上运行。 需要注册登录Docker账户,命令行输入docker -v来确认Docker环境已启动。通过cd+路径进入项目的根目录:

001557sco4z3e0gw53eerb.png

注意:因为根目录下有Dockerfile来辅助构建。

然后docker命令来构建Docker容器:

[AppleScript] 纯文本查看 复制代码docker build -t <image-name> .

注意:后面的“.”不能少,而且前面有个空格。

将<image-name>替换为Docker映像的名称,例如:balance.ball.v0.1。

构建开始

001557virhe09okj9ithlm.png

第一步就是在容器中安装Python库。

001556oq54wjb454yya4a4.png

第二步升级apt-get,第三步导入安装需求表(即ML-Agents需要的TensorFlow及相关工具链)。

001555gdx1pwwi0inq1tn8.png

一系列安装完成,容器构建结束。

运行Docker容器

使用命令行在项目根目录运行以下docker指令:
[AppleScript] 纯文本查看 复制代码docker run --name <container-name> \ --mount type=bind,source=$(pwd)/unity-volume,target=/unity-volume \ <image-name>:latest <environment-name> \ --docker-target-name=unity-volume \ --train \ --run-id=<run-id>

相关参数说明:
<container-name>:容器名称,用于标识容器(以防中断和终止容器)。 这是可选的,如果没有设置,Docker会生成一个随机名称。 请注意,对于Docker镜像的每次运行,这必须是唯一的。 <image-name>和<environment-name>:分别引用图像和环境名称。 source:引用你的主机操作系统中将存储Unity可执行文件的路径。 target:指示Docker将源路径挂载为具有该名称的磁盘。 docker-target-name:指示ML-Agents Python软件包它可以读取Unity可执行文件并存储图形的磁盘名称。因此这个与target相同。 train和run-id:传递给learn.py的ML-Agents参数。train 训练算法,run-id用于标记每个实验的唯一标识符。


例如这里创建的ML-Agents-3DBall项目,命令示例如下:

001554wjs9tb11z0uw13dj.png

ML-Agents机器学习训练开始。

001553z26b0prub0z6b0su.png

代码化训练开始。

001552dyjussq27urco6ps.png

ML-Agents-3DBall项目机器学习训练成功。训练完的Model:ML-Agents-3DBall_ML-Agents-3DBall_first_trial.bytes。

001551dkdtccrkyoqrrzir.png

中途中止方法
如果你对培训进度感到满意,则可以使用以下命令在保存状态的同时停止Docker容器:

[AppleScript] 纯文本查看 复制代码docker kill --signal=SIGINT <container-name>

<container-name>是在先前的docker run命令中指定的容器的名称。在这个演示项目中即ML-Agents-3DBallContainer.first.trial。如果你没有指定,你可以通过运行docker container ls找到随机生成的标识符。


验证model
将生成的Model文件放到Unity ML-Agents → Examples → 3DBall → TFModels目录中。

001551syqq336o32cd6btm.png

调整 Brain 下的 type 为 Internal,选择 Graph Model 为之前生成的 Model。

001550tc8uxqv9pk3893g1.png

运行验证。从下图看看见验证已经成功。

001549iycx7x7mqjqbcxxb.gif

小结
运用Docker可以快速方便的帮助我们搭建ML-Agents所需的机器学习环境,无需我们自行设置诸如Python、TensorFlow等功能。虽然作为实验性的解决方案,它还存在一些缺陷,但是相信在不久的将来我们Unity能提供更好更便利的机器学习解决方案,大大降低开发者的技术门槛。 机器学习锐亚教育

锐亚教育 锐亚科技 unity unity教程