Unity3D ML-Agent-0.8.1 学习五(源码分析)

写的目的

本篇想从部分训练和通信的类的源码开始,探究ml-agent的训练运作流程。话不多说,我们从Academy.cs开始吧。

Academy

这个是干嘛的很多资料都有,我就说说他里面干了点什么吧。代码就不贴了,大家都能看到,就讲下基本的流程。
Academy主要提供一个训练的环境,包括训练的参数,和环境参数,维护一个BroadcastHub,通过Batcher(包含Communicator,套了个壳)与外界建立通信,同时也维护很多个大脑Brain(大脑里拥有同一个Batcher,可以用于通信),初始化InitializeEnvironment()的时候会做各种初始化,检测是否有训练大脑,打开和Python通信,设置委托,写log等等。重要的还是每次是在FixedUpdate()里进行迭代的,判断一些重置和退出的命令,然后进行委托的调用,环境参数等,所有的通信数据采用谷歌的Protobuf

Batcher

这个是大脑和外界的通信,里面会维护一个大脑的通信和数据队列,每个大脑在有需要的时候,或者Academy调用了一次done的时候,通过这个跟外界通信。其实自身里面拥有一个Communicator,用于跟外界通信,通过封装UnityRLOutput,向外输出信息,得到外界的输入UnityInput,用来更新agent信息。

Brain

大脑,可以设置各种参数,拥有BrainParameters参数设置类,和Batcher,以及维护一个代理信息的字典集合。

Communicator

这个只是个接口,定义了初始化方法,和通信方法。主要实现类有RPCCommunicatorSocketCommunicator
RPCCommunicator:内部是用ProtoBufferGrpcgRPC是由Google主导开发的RPC框架,方便进程间通信。目前发现训练使用这个来通信的。
SocketCommunicator:暂时未发现用这个来通信,估计是以前的,现在新版改成谷歌的ProtoBuffergRPC了,调用需要传输的数据使用的是proto编码,可以有效的提高数据的解编码效率和数据传输率。

Agent

代理,拥有大脑,代理信息,动作信息,主要是收集环境等各种信息。每一次迭代是这样的:
Unity3D ML-Agent-0.8.1 学习五(部分源码介绍)
首先Academy每帧调用AgentSendState,会调用AgentSendInfo将代理的信息给Brain
Unity3D ML-Agent-0.8.1 学习五(部分源码介绍)
Unity3D ML-Agent-0.8.1 学习五(部分源码介绍)
然后Brain会将代理信息加到AcademyBrainDecideAction委托里。
Unity3D ML-Agent-0.8.1 学习五(部分源码介绍)
然后Academy调用BrainDecideActionBrain就开始通过Batcher送信息给外部,然后返回UnityRLInput之后提取agent的信息,进行agent一系列Action信息的更新。
Unity3D ML-Agent-0.8.1 学习五(部分源码介绍)Unity3D ML-Agent-0.8.1 学习五(部分源码介绍)
Unity3D ML-Agent-0.8.1 学习五(部分源码介绍)

然后Academy调用AgentAct,即调用了AgentAgentStep,进行AgentAction的调用。
Unity3D ML-Agent-0.8.1 学习五(部分源码介绍)

总结

通过这个简答的流程理解,写代码的时候就不会很莫名其妙的写了,至少知道在哪里去,哪里会回调,我该给什么信息,拿回什么信息。

好了,今天就到这里了,希望对学习理解有帮助,大神看见勿喷,仅为自己的学习理解,能力有限,请多包涵,部分图片来自网络,侵删。

相关文章:

  • 2021-10-29
  • 2021-08-25
  • 2021-05-29
  • 2021-10-11
  • 2021-09-23
  • 2021-05-18
  • 2021-12-05
  • 2021-12-01
猜你喜欢
  • 2021-05-26
  • 2021-05-28
  • 2021-09-19
  • 2021-07-17
  • 2022-12-23
  • 2021-11-08
  • 2022-12-23
相关资源
相似解决方案