原文:
https://mp.weixin.qq.com/s?__biz=MzU5MjQ1NTEwOA==&mid=2247492034&idx=1&sn=9b939f8c8a3e6c3e37ba7eb14002f221&chksm=fe1dd569c96a5c7f65eb20f989722f5fbd1cca1c9aeacb388480df2cdfd0ec11049a8f2f5007&mpshare=1&scene=1&srcid=0502YLzroxHLPOaIMR5jLPgo#rd
之前已经为大家介绍过《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的版本有所限制。
什么是Docker?
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
必要准备:
Unity Linux 发布平台支持功能(Unity 2017.1+)
Docker
安装Docker
Windows或Mac系统,通过Unity安装器或者Unity Hub下载Unity,确保安装Linux发布平台的支持(Linux Build Support)。
安装 Docker,大家可以前往Docker官网根据自己电脑的系统下载所需的安装包。
由于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二进制文件将在没有安装图形驱动程序的容器中运行。)
然后点击 Build,选择一个环境名称(比如ML-Agents-3DBall),并将输出的目录设置为 unity-volume。构建完成后,确保在统一卷下创建文件<环境名称> .x86_64和子目录<环境名称> _Data /。
构建 Docker 容器
首先确保Docker引擎正在你的机器上运行。 需要注册登录Docker账户,命令行输入docker -v来确认Docker环境已启动。通过cd+路径进入项目的根目录:
注意:因为根目录下有Dockerfile来辅助构建。
然后docker命令来构建Docker容器:
docker build -t <image-name> .
注意:后面的“.”不能少,而且前面有个空格。
将<image-name>替换为Docker映像的名称,例如:balance.ball.v0.1。
构建开始
第一步就是在容器中安装Python库。
第二步升级apt-get,第三步导入安装需求表(即ML-Agents需要的TensorFlow及相关工具链)。
一系列安装完成,容器构建结束。
运行Docker容器
使用命令行在项目根目录运行以下docker指令:
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项目,命令示例如下:
ML-Agents机器学习训练开始。
代码化训练开始。
ML-Agents-3DBall项目机器学习训练成功。训练完的Model:ML-Agents-3DBall_ML-Agents-3DBall_first_trial.bytes。
中途中止方法
如果你对培训进度感到满意,则可以使用以下命令在保存状态的同时停止Docker容器:
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目录中。
调整 Brain 下的 type 为 Internal,选择 Graph Model 为之前生成的 Model。
运行验证。从下图看看见验证已经成功。
小结
运用Docker可以快速方便的帮助我们搭建ML-Agents所需的机器学习环境,无需我们自行设置诸如Python、TensorFlow等功能。虽然作为实验性的解决方案,它还存在一些缺陷,但是相信在不久的将来我们Unity能提供更好更便利的机器学习解决方案,大大降低开发者的技术门槛。