Unity ML-Agents Toolkit v0.8:游戏训练再提速
近期,我们对ML-Agents Toolkit发布了一项重要更新,最新版本的v0.8版本可以通过在单台机器上启动多个Unity模拟来加快训练速度。此次更新将使游戏开发人员能够大幅加速深度强化学习算法的训练,从而创建出角色行为。
本文将介绍Unity与合作伙伴JamCity进行合作,训练代理玩《史努比泡泡》的高级关卡。
Unity ML-Agents Toolkit v0.8帮助JamCity训练代理,让代理在单台机器上完成游戏关卡的速度比之前快7.5倍。我们同时也进行对多个关卡多台机器的训练。
下载Unity ML-Agents Toolkit v0.8:
https://github.com/Unity-Technologies/ml-agents
核心原则
发布Unity ML-Agents Toolkit以来,我们其中一个核心原则:让游戏开发人员利用深度强化学习(DRL),开发出玩家角色和非玩家角色NPC的行为。
我们此前介绍过如何使用深度强化学习的学习策略,用于控制使用基于物理动画的柯基犬Puppo。然而,真实的游戏很复杂,深度强化学习算法是计算密集型算法,要求使用大量游戏数据进行学习。
大多数深度强化学习研究使用非常轻量的游戏,这样可以大幅训练速度,更快地生成游戏数据,然而实际的游戏通常带有各种限制,要求游戏在正常速度下运行,或限制加速的程度。这种情况使我们开始关注普通开发者的本地开发机器上常用的计算平台。
模拟训练
使用深度强化学习创建应急行为需要学习神经网络的权重,用于表示策略和由代理观测到动作的映射。学习时,我们在一个或多个模拟实例上执行策略,使用输出结果更新权重,从而最大化代理的奖励。当我们有更多实例用于评估策略时,训练的完成速度会更快。
我们和JamCity及《史努比泡泡》游戏开发团队进行合作,通过利用16个Unity模拟过程,ML-Agents Toolkit v0.8的新功能在简单关卡的训练速度提升是5.5倍,在困难关卡上最大速度提升有7.5倍。总体而言,利用多个Unity模拟实例的提升效果在复杂关卡和游戏上更加明显。
Unity ML-Agents Toolkit更新的改进内容将使开发者充分利用开发机器的性能资源,同时利用Google云平台等云服务提供商的多核机器大幅加速训练过程。
我们在实验和构建内部基础架构,以扩展多个机器的训练过程,从而训练出一个可以同时通过《史努比泡泡》多个关卡的代理。
下面的视频中,一个已训练代理通过了难度逐渐提升的《史努比泡泡》关卡。
使用ML-Agents Toolkit 训练《史努比泡泡》
《史努比泡泡》是由JamCity开发的泡泡龙类游戏,在《史努比泡泡》中,玩家需要打破泡泡,救出游戏角色伍德斯托克和他的小鸟。
玩家可以向特定角度射出泡泡,或在射击前切换泡泡颜色。如果泡泡粘到相同类型的泡泡并形成三个以上的同色泡泡组,该泡泡组会消失,泡泡内的小鸟会被解救出来,同时玩家会提高自己的得分。
当关卡中所有小鸟被解救时,玩家就完成了关卡,反之,当玩家用完背包里的所有泡泡而没有救出所有小鸟时,玩家会遭遇失败。
我们的目标是训练代理,使它可以像玩家一样玩这款游戏,尽可能达到最高的关卡。通过使用ML-Agents Toolkit,代理在执行策略时,会接收表示游戏状态的观测结果,基于这些观察来采取行动。
为了使用深度强化学习解决《史努比泡泡》,我们首先需要定义观测和行为,以及策略会尝试最大化结果的奖励函数。对于观测结果,代理会接收简化的84×84低分辨率游戏视图和持有泡泡的信息。
代理会选择发射泡泡的21个不同角度,或在发射前切换泡泡类型。在泡泡发射并碰到其它泡泡后,代理会在提高得分,解救小鸟和胜利等情况下得到奖励。每次射出泡泡时和游戏失败时,代理都会受到惩罚,从而让代理更快地完成关卡。
可视化观测和大型行为空间的使用让《史努比泡泡》的关卡难以解决。对于简单关卡,代理需要超过8万次行为才能学会有效的策略,更加困难的关卡需要50万或更多次行为。
此外,游戏使用物理来模拟泡泡之间的反弹和碰撞效果,使它难以在不明显改变游戏动态效果的同时改变时长。即使在5倍时长下,我们也只能得到每秒二次动作,这意味着它需要超过11个小时才能解决简单关卡,数天时间才能解决困难关卡。因此调整数据收集过程很重要,我们运行了多个并行Unity模拟过程,从而最大化利用机器的性能资源。
运行多个并行实例
虽然我们对一个《史努比泡泡》实例的提速效果有限,但是多核处理器允许我们在一个机器上运行多个实例。由于每次游戏过程都是独立的,因此我们可以简单地并行化训练数据的收集过程。
每次模拟过程会把数据存到通用训练缓冲区,训练工具会使用该缓冲区更新策略,从而更好地完成游戏。
这种新范例允许我们收集更多数据,不必修改时长或其它游戏参数,对游戏机制产生负面影响。我们相信这是第一个必要步骤,它能够提供更高性能的训练过程给ML-Agents Toolkit用户。
性能结果
为了展示运行多个并行Unity模拟实例的实用性,我们分享了二个不同《史努比泡泡》关卡的训练时间,关卡分别为第2关和第25关。更准确地说,我们录制了多次Unity模拟之中的训练时间。由于每个额外并行环境有较小的协调开销,随着我们进一步扩大规模,我们预计收益会减少。
对于简单的游戏或关卡,添加更多Unity模拟过程可能不会提升性能,因为从额外模拟过程生成的游戏数据会很大程度关联已有游戏数据,因此不会对训练算法提供帮助。总的来说,随着我们添加更多Unity模拟过程,预期提速效果会逐渐递减,而递减速度取决于模型训练时使用的关卡或游戏复杂性。
下面的第一张图表示ML-Agents Toolkit v0.8在1到16个并行环境解决《史努比泡泡》第2关所用的训练时间。
我们使用了三次训练的平均时间,因为训练过程的随机情况会改变不同训练所用的时间。可以发现,1个环境扩展为2个环境会有很大的性能提升效果,而后增多环境数量的性能提升比较稳定,呈现次线性变化,在对比16个环境和1个环境所花的时间时,我们发现训练速度提升了5.5倍。
我们发现,并行环境的训练效果在《史努比泡泡》的关卡上有更大的相关性。这是因为困难关卡中多个模拟过程产生的经验比简单关卡的独立性更强,因此它有助于训练过程。
下图对比了ML-Agents Toolkit v0.8在训练《史努比泡泡》第25关时,使用不同环境数量的性能效果。对比1个环境,使用16个环境的提升效果约为原来的7.5倍。
ML-Agents Toolkit v0.8支持在一个机器上训练多个并行Unity模拟过程。如果已有现成的环境,只需要更新到ML-Agents Toolkit最新版本,并重新构建游戏,便可使用新版本。更新后,开发者将可以使用mlagents-learn工具的新功能,指定并行环境的数量。
其它更新
除了运行多个Unity模拟过程的功能,ML-Agents Toolkit的此次更新还带来了一些额外重要功能。
自定义协议缓冲区信息
许多研究人员需要能够在默认包含的内容外交换Python和Unity之间结构性数据。新版本中,我们提供的API允许任何开发者创建自定义协议缓冲区信息,使用这些信息作为观测、动作、或重置参数。
渲染纹理观测
除了摄像机的可视化观测外,我们还加入了使用RenderTexture渲染纹理的功能,该功能允许用户通过摄像机以外的方法为可视化观测渲染纹理。例如:2D精灵,网络摄像机或其它自定义实现。
2D光线投射
新版本中,我们重新开发了RayPerception光线感知功能,加入了2D光线投射的支持,即RayPerception2D。
多个Python包
我们把mlagents Python包分离为二个单独的Python包:mlagents.trainers和mlagents.envs。这将允许用户分离版本依赖,例如:TensorFlow,让研究人员更轻松地使用Unity环境,不必改变已有的Python配置。
感谢
Unity ML-Agents Toolkit是一个开源项目,它从社区贡献中获益匪浅。
我们非常感谢提供新版本改进的外部贡献者,其中包括:@pyjamads在渲染纹理方面的帮助,@Tkggwatson对优化改进效果的帮助,@malmaud对自定义协议缓冲区功能的帮助,@LeSphax对视频录制器的帮助,还有@Supercurious、@rafvasq、@markovuksanovic、@borisneal、@dmalpica等贡献者提供的诸多改进。
小提示:@后面为社区贡献者GitHub帐户。
未来发展
Unity ML-Agents Toolkit v0.8让开发者可以在一个机器上更快的训练代理。我们希望继续对这方面进行开发,在未来发布更新,使你可以最大化性能资源使用率。
关于Unity ML-Agents Toolkit的任何反馈,请通过邮件ml-agents@unity3d.com直接联系我们。如果你遇到问题或带有疑问,请在ML-Agents的GitHub Issue页面联系我们。
更多Unity技术文章分享,尽在Unity Connect平台(Connect.unity.com)。
推荐阅读
Unite Shanghai 2019
5月10日-12日上海,Unite大会强势回归。技术门票正在热销中,购票即获指定Asset Store资源商店精品21款资源的5折优惠券。
购票请访问:Unite2019.csdn.net
点击“阅读原文”下载ML-Agents Toolkit
↓↓↓↓