Indigo
Indigo被实现在Pantheon平台上,是一种机器学习、数据驱动的拥塞控制算法。作为Indigo的核心部分,其做了两件事:
- 观察网络的状态。
- 调整它的拥塞窗口。
以上好像是废话,因为大多数数据驱动的或者基于强化学习的拥塞控制算法都是这么做的。
状态
观测发生在当接收到一个ACK
时,并根据观测更新Indigo的内部状态,状态向量包含以下内容:
-
排队时延的
EWMA
,通过当前RTT
和观测到的最小RTT
之间的差别进行计算。difference between the current RTT and the minimum RTT observed during the current connection.
-
发送速率的
EWMA
,通过自从上一个ACK
后又发送的字节除以RTT
来进行计算。number of bytes sent since the last ACK’ed packet was sent, divided by the RTT.
-
接收速率的
EWMA
,定义为自最近ACK
的分组传输之前的ACK
以来接收的字节数除以相应的持续时间。the number of bytes received since the ACK preceding the transmission of the most recently ACK’ed packet, divided by the corresponding duration.
-
当前拥塞窗口大小。
-
前一次选择的状态。
关于EWMA
相关内容可以在数学
目录中找到。
动作
Indigo每10ms
调整它的拥塞窗口。
原理
Indigo通过长短期记忆神经网络(一层32个隐层单元)存储了一个从状态到动作的映射。Indigo需要一个预训练,一旦训练好并且部署了,那么映射也就确定了。
训练阶段
使用模仿学习来训练神经网络,简单来说,分为两步:
- 首先,生成一个或者多个拥塞控制神谕,这些神谕是非常理想化的算法,能够非常完美地将状态映射到对应的动作。
- 使用一个标准的模仿学习算法使用这些神谕来生成训练数据。
得到神谕后通过一个state of the art
的算法,即DAgger
进行训练神经网络。
如何训练神经网络
- 让神经网络根据状态向量做一系列的拥塞控制决策。
- 根据记录的状态向量,使用神谕标记正确的动作。
- 通过状态动作映射作为训练数据,更新神经网络。以上过程直到收敛为止。
神谕
就像搬山道人苦苦寻求的雮尘珠,我们也需要得到神谕来帮助我们进行模拟学习,从而生成一个正确的算法。
在真实世界路径中,神谕是不存在的。但是,我们可以通过仿真路径来生成神谕。
如何使用神谕
鹧鸪哨要用雮尘珠祭祀鬼洞,从而消弭鬼洞族对于扎格拉玛族的诅咒。而我们应当如何使用神谕?
如果对于一个给定的链路,我们知道理想的拥塞控制窗口,我们可以将其作为神谕:对于任何状态,输出哪一个动作能够导致拥塞控制窗口的变化能够接近该神谕。
如何得到神谕
一个关键的思想是,对于模拟的链路,我们能够非常接近地模拟出理想的拥塞控制窗口。对于一个有着固定带宽和最小延迟的简单链路,理想的拥塞控制窗口通过链路中每一个流的Bandwidth-Delay Product (BDP)给出。通过计算该值,然后在该值的附近搜索即可。