写的目的
本篇想从部分训练和通信的类的源码开始,探究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的调用。

总结
通过这个简答的流程理解,写代码的时候就不会很莫名其妙的写了,至少知道在哪里去,哪里会回调,我该给什么信息,拿回什么信息。
好了,今天就到这里了,希望对学习理解有帮助,大神看见勿喷,仅为自己的学习理解,能力有限,请多包涵,部分图片来自网络,侵删。

本文从部分训练和通信类的源码入手,探究ml - agent的训练运作流程。介绍了Academy提供训练环境、Batcher负责大脑与外界通信、Brain可设置参数、Communicator定义通信接口、Agent收集信息等内容,帮助理解代码编写时的信息交互。
488

被折叠的 条评论
为什么被折叠?



