写的目的
本篇想从部分训练和通信的类的源码开始,探究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
这个只是个接口,定义了初始化方法,和通信方法。主要实现类有RPCCommunicator
和SocketCommunicator
。
RPCCommunicator
:内部是用ProtoBuffer
的Grpc
,gRPC是
由Google主导开发的RPC框架,方便进程间通信。目前发现训练使用这个来通信的。
SocketCommunicator
:暂时未发现用这个来通信,估计是以前的,现在新版改成谷歌的ProtoBuffer
的gRPC
了,调用需要传输的数据使用的是proto编码,可以有效的提高数据的解编码效率和数据传输率。
Agent
代理,拥有大脑,代理信息,动作信息,主要是收集环境等各种信息。每一次迭代是这样的:
首先Academy
每帧调用AgentSendState
,会调用Agent
的SendInfo
将代理的信息给Brain
。
然后Brain
会将代理信息加到Academy
的BrainDecideAction
委托里。
然后Academy
调用BrainDecideAction
,Brain
就开始通过Batcher
送信息给外部,然后返回UnityRLInput
之后提取agent
的信息,进行agent
一系列Action
信息的更新。
然后Academy
调用AgentAct
,即调用了Agent
的AgentStep
,进行AgentAction
的调用。
总结
通过这个简答的流程理解,写代码的时候就不会很莫名其妙的写了,至少知道在哪里去,哪里会回调,我该给什么信息,拿回什么信息。
好了,今天就到这里了,希望对学习理解有帮助,大神看见勿喷,仅为自己的学习理解,能力有限,请多包涵,部分图片来自网络,侵删。