刘卫国,项志宇,刘伟平,齐道新,王子旭
(1. 浙江大学信息与电子工程学院,杭州 310058;2. 国家智能网联汽车创新中心,北京 100160)
自动驾驶框架大多遵循模块化设计原则,然而单个模块的设计、调试和后期维护成本非常高,且模块间需要不断调试才能保证数据和逻辑的准确性[1]。因此,提高自动驾驶开发及调试效率、降低模块化程度将成为当前研究的热点。随着技术与理论的进步,基于规则的自动驾驶算法逐步过渡到基于数据驱动的算法,但仍存在训练数据依赖性强、感知和定位模块数据错误的问题,因此具备可扩展性的学习驱动方法将逐渐成为未来发展趋势[2]。
由于仿真与真实环境间的差异性,导致没有一种成熟的基于仿真训练算法的量产解决方案,并且算法不能较好地应用在实车环境[3],无法通过OTA更新车辆软件,提高车辆的性能与操控性。故本文将基于强化学习的规划控制部分的输入限定为目标物列表级别,而感知部分可以使用真实RAW 级别数据进行训练和测试。因此,这种方法可以有效保证强化学习训练的安全性和环境感知的真实性。
在仿真阶段,自动驾驶模拟器Carla 被广泛应用于自动驾驶算法开发中[4],其虽然能规避实车开发中学习驱动的安全性问题,但因仿真和强化学习的效率低下,在线强化学习算法很少被用于自动驾驶算法的开发[5]。自动驾驶具有宽范围的连续动作空间、复杂的交通场景,且环境中存在其他动态交通参与者,将都导致强化学习算法的研究和开发更复杂化,这些极大地限制了Carla 在自动驾驶领域的应用。
为解决上述问题,本文引入在线强化学习的大规模并行化分布式框架加速模拟环境中智能体的训练过程。这要求既需要考虑计算资源的利用率与智能体间的异质性问题,又需要设计仿真模拟器的GPU资源差异分配[6]。
在Carla 上实施并行化在线强化学习时,首先,需要以分布式结构框架实现跨机器运行[7]。其次,单个智能体并未充分利用单步仿真环境渲染结果,绝大多数渲染范围超出了智能体的观测范围,存在大量计算资源浪费。所以为防止计算资源浪费,在线强化学习算法应在同一仿真时间步中并行化多个智能体。最后,作为目标导航问题自动驾驶具有很高的可变性,任务持续时间和难度等级交替出现,故还要设计异步策略实现多智能体更新迭代。
基于上述问题,本文提出了一种异步分布式多智能体强化学习算法,构建了奖励函数,实现了以Carla NoCrash[8]为基准的最佳性能,此外还利用多智能体并行SAC 算法显著加快了Carla 模拟器上在线强化学习的训练,避免了单点故障,提高了Carla 实例的利用率,有效解决了自动驾驶在密集场景下运行的难题;建立并实现了一个基于ROS 的Autoware和Carla 联合集成开发工具链,通过ROS 建立Carla仿真世界和控制系统之间的连接,提高模型可重用性,该框架用于模型快速部署。
为更符合实际工程应用,加速迭代升级,本研究采用部分模块化方法,将视觉感知与基于深度强化学习的控制策略分离,使其能够从仿真训练直接迁移应用到真实世界的测试。同时,系统故障排除变得更简单。如图1 所示,基于Cloud-OTA 的分布式模型快速训练和部署系统架构主要由云端分布式模型训练框架和车辆端到端规划控制模块组成,其中强化学习分布式训练框架部署在云端,而基于ROS的自动驾驶软件框架部署在车端。车辆采集数据可以上传至云端完成更新,由分布式训练框架完成最新模型快速训练,并推送至待升级车辆,车端收到推送升级模型包后在车载计算平台上快速完成模型部署和适配。这样,通过该系统可以在线修复或升级车辆控制算法,用户只须将车辆连入网络便可进行OTA升级,从而降低召回成本和提升便利性,使得模型随着历史数据和实验里程的累计不断自我升级优化。
图1 基于Cloud-OTA的分布式模型快速训练和部署系统架构框图
强化学习训练阶段中的数据准备包括数据的采集、上传、下载以及在大量驾驶数据中提取特征数据等过程。因特征数据的定义是任务导向的,从优化决策规划的角度看,既需要获得影响路径规划的静态障碍物信息、动态障碍物及道路限速信息,又需要提供决策的交通标识等信息。需要采集的数据包含静态障碍物、动态障碍物、自车状态、道路信息、交通标识,由图1 可知,上述数据可以通过自动驾驶系统中的感知模块、定位模块、总线模块和高精地图模块获取,而在仿真训练过程中则是直接从仿真软件的动态场景中获取。
因低维输入和输出仅须较少的参数便可覆盖大多数可行状态,故强化学习多倾向于低维特征和动作。因此,本文利用Carla 模拟器的导航传感器输入、交通标志信息制定强化学习任务的低维向量表示规则。
矢量化状态空间S可以扩展为7 维向量[9],表示为
为简化车辆控制问题,定义矢量化行为空间A,该空间由目标速度以及预测转向角θ组成。-为自车完全制动,因本实验中不能设置为倒车,实验中限制在[-0.5, 0.5]。
奖励函数不仅可以使智能体学到的策略更合理,也会使收敛速度更快,加速实现系统最优性能。为使车辆沿道路中轴线快速通行,本文从通行效率、安全性和舒适性[10]3 方面进行设计,主要包含如下函数。
(1)车辆速度与设定速度的偏差
式中:v和vref分别为实际车速与参考车速;Rv为车速奖励项,且αv<1/vref。
(2) 车辆转向盘转向角幅度
为使智能体过弯道及避障等行为时转向角更平滑,考虑转向盘转角δ的幅度。
式中:转向盘转角范围为[-1,1];Rθ为车辆方向转向角奖励项。
(3) 车辆当前位置与道路中轴线偏差
作为对车辆偏离参考线的奖惩,采用当前位置与道路中轴线之间偏差的绝对值。
式 中:de为 距 离 中 心 线 的 绝 对 值;Rδ为 车 道 中 心偏差。
(4) 车辆违规行为检测
此项是对车辆发生碰撞后的惩罚。
式中collision_flag为违规行为触发标志位。综上可得智能体最终奖励函数为
式中αv、αθ、αδ、αI分别为车速奖励系数、转向角惩罚系数、车道中心偏差惩罚系数和违规行为惩罚系数。
本文所设计的分布式并行SAC框架是以参数服务器结构与分布式训练框架为基础,在训练框架中为每个智能体提供决策控制的 SAC 算法[11]。本文的分布式训练中有3 个重要角色:worker、server 和agent。其中:worker是分布式训练的执行单元,在分布式训练每个batch 时,worker 会从server 处拉取最新的权重,其次worker 在每个batch 训练结束后将梯度发送至server 处;server 是服务器单元,用于存储模型参数并和各个worker 进行通信;而agent 则是被训练的算法或模型。
在Carla 上训练基于强化学习智能体的瓶颈之一是需要较长的周期渲染每个时间步。整体框架如图2所示,worker与Carla 两者均处于高度忙碌状态,而server则处于较空闲状态,同时worker通过反向传播生成梯度。
由图2可知,本文使用server 维护全局经验缓冲区,利用单智能体SAC 算法获得批量状态转换,worker 通过访问模拟环境收集状态转换,并定期将状态转换推送到server 上托管的集中缓冲区,最终执行策略更新。
分布式深度学习算法框架的层次结构采用专门为Carla 自动驾驶设计的功能定义接口和标准参数服务器架构[12],且内部还包含两个级别的并行化,即异步运行的进程间和进程内级别。如图3 所示,参数服务器被分配到同一个或多个工作组中,worker托管多个智能体,这些数据之间保持异步性;server采用value/Q 函数的全局缓冲区更新全局策略,并采用智能体按顺序执行的策略。
图3 不同级别数据并行化
在Carla 上训练多并行SAC 的另一个瓶颈是如何最大限度地利用每个Carla 模拟器实例上的资源。尽管已通过参数服务器框架创建了进程内的并行化,然而并没有解决单独worker的进程内效率问题。此时自车在每个时间步只与附近的环境交互,渲染的大部分场景被忽略,浪费了大量算力和GPU资源。
基于多并行SAC 算法,参数服务器聚合 worker的更新权重,如图4 所示。图4 (a)中,迭代开始时,worker 获取最新的全局权重W,并从参数服务器更新局部权重。而当worker 1和3完成计算时,worker 2仍在迭代,但参数服务器只有在收到所有机器更新的权重后,才能开始聚合计算全局权重。
图4 数据训练迭代过程示意图
图4(b) 为异步数据并行模式,可提高进程内运行效率。此模式中,worker 完成一次迭代后立即从参数服务器中拉取全局权重,且无须等待所有其他worker,但因每台机器的运行迭代可能不相同,实际操作中要考虑各系统效率和算法的收敛性。
为计算最优迭代时长下智能体个数,在Carla 中进行了模拟仿真实验,结果如图5 所示。当模拟器中有一个智能体时,Carla 渲染单个时间步长(即同一环境中的所有智能体与环境交互一次)大约需要0.08 s。单个Carla 环境中有8 个智能体时,尽管每一步的仿真时长增加到0.20 s 左右,但在Carla 单一仿真步长中进行的交互总数为8。平均而言,单个智能体与环境交互一次只需大约0.025 s,显著提高了每个Carla实例的利用率。
图5 Carla每个时间步渲染耗时与智能体个数之间的关系
由图5 可知,随着更多的智能体添加到环境中,Carla 渲染帧的时间在增加,但每个智能体的平均步进时间(即交互一次)在减少。在智能体为10 个时,渲染时间增加到0.32 s,所以单个Carla 模拟环境中的最佳智能体数为7~9 个。故基于递减回报规则,worker中有8个智能体时将充分利用进程内并行化。为评估多智能体的性能以及训练算法的有效性,进行了模拟仿真实验,这里选取了其中4 个智能体的错误率表现,结果如图6所示。
图6 多智能体在每回合中的错误率曲线
作为自动驾驶轨迹优化的核心算法之一,SAC算法要定期更新worker 全局策略,异步处理各worker 的信息。在训练过程中,可能会有多种SAC策略并存[13],并通过比较它们的性能来选择最优的策略,如图7所示。
图7 SAC算法示意图
为表示多策略学习框架,将策略集定义为(πθ,≤) ={π(θ0),π(θ1),π(θ2),…}。此集合包含在训练过程中生成的所有策略,(i)代指每个策略的顺序时间戳,只有一个元素π(θ0)与初始化策略相关,server始终保持最新全局策略,为每次server 策略更新后,都会创建新策略π(θ|πθ|)元素并附加到不断增加的πΘ集。
对于智能体集合W={ω1,ω2,ω3, …,ωn},其作用是为全局经验缓冲区D提供状态转换(si,a(ij),ri,s′i,di),包括当前状态si、策略相关动作a(ij)、奖励ri、下一个状态s′i和最终状态指示符di,其中a(j)~π(j)θ(·|s), 0 ≤j≤|πθ|,下标i∈W,表示此转换隶属哪个智能体。
因此,将全局缓冲区D表示为
在SAC 更新后,在D中采样一批次转换B,通过以下方式计算Q函数:
由式(9)可知,优化发生在最新策略及其Q 函数上,并在此基础上生成下一个策略因此,从理论上保证了轨迹优化始终是向前迭代的,但只能把策略更新从worker转移到server上来实现,而按标准参数服务器运行时,旧策略计算的梯度并不一定会优化全局策略。
实验在集群4-GPU 节点上运行,在Carla-Tensorflow 中完成智能体的训练过程,采用Town 01地图进行仿真。
一般将仿真环境下训练的模型进行软件在环测试验证或者部署在真实车辆中时需要额外的开发成本。为此,本文使用 ROS 将仿真环境与自动驾驶系统或框架分开,从而可以更轻松地迁移到自动驾驶软件框架或真实车辆。这使得在相同条件下评估基于模型的方法和现有的基于学习的端到端方法成为可能。
图8 展示了从训练、验证到部署的快速框架,协同使用 Carla、Autoware、TensorFlow 开发工具链并基于 ROS 工具桥接,可用于虚实交替验证、模型训练或模型快速部署,其中一些模块在相同的步骤和阶段之间共享,从而降低了模型的开发成本。ROS 允许共享模块,并使用 ROS 桥来统一数据格式。在使用Carla 评估模型时,可使用 ROS-bridge 连接到Carla,它能够通过摄像头、激光雷达模型等获取传感器信息,ROS接收车辆摄像头各帧图像,将其发送到YOLO 微型节点,处理完后将矩阵发送到Agent节点,获取环境状态空间相关信息后,再向Autoware发送适当的动作空间。通过使用ROS,模型可以独立于模拟器运行,并且只须连接它们就可以将使用Carla 获得的信息转移到真实环境中,因此迁移成本较低。
图8 基于ROS的Carla-Autoware 集成验证框架
由SAC 规则可知,actor 网络(策略网络)具有ReLU 和Tanh 激活的两层MLP,而critic 网络(Q 网络)带有ReLU 激活的3 层MLP。本文将策略网络和两组Q 网络实例化,把server 上的Q 网络裁剪成double-Q模块,并于每25个全局时间步内更新一次。
多并行SAC 将actor 和learner 分为两部分,故worker 不需要访问Q 网络便可实现系统实例化。为提升系统灵活性,每个worker 托管多个策略网络且分给不同智能体,因单独与server 同步,可能使同一环境中运行的智能体行为有所差异,并且可学习的熵策略会使训练更不稳定,所以本文固定熵系数α。
实验训练过程中使用的超参数如表1 所示,为使 NoCrash 准生成最佳模型,表2 列出与多并行SAC具体方法相关的超参数。
表1 一般超参数
表2 多智能体并行SAC超参数
为测试设计方法的可行性与性能,将本文方法与3 种主流的自动驾驶方法进行比较,即模块化方法、模仿学习和强化学习。对于强化学习方法,将本文方法与在线强化学习方法、离线强化学习方法进行比较。
尽管每种方法所涉及的运行环境、模拟器版本不同,可能存在渲染引擎、纹理细节等细节问题,但因不使用任何高维视觉输入,所以不会影响测试方法的使用。
为验证两种算法的可行性与运行速度,将本文方法与关联规则学习算法(ARL)[7]比较,两者共享相似的状态空间,这里只粗略地估计训练速度,完成两者速度的优劣对比。
本文首先分析了不同交通条件下以NoCrash[8]为基准的成功率。典型交通场景是指车辆相对较少、车速较快、间距较大的场景,更容易执行加速、制动和转向等基本操作;密集交通场景是指车辆相对较多、车速相对较慢、间距相对较小的场景,还可能有行人及其他障碍物,需要更复杂的决策和动作执行能力;表3 列出了常见方法和本文方法的运行数据结果。
表3 不同交通流条件下的NoCrash定量结果 %
表3为25次测试中的平均成功率(百分比)。多智能体并行SAC 代表本文方法,多智能体并行SAC(1)是指单智能体SAC,多智能体并行SAC(std 64)是指使用标准参数服务器设置的64 智能体SAC,其中局部计算的梯度用于全局更新。
多智能体并行SAC(std64)是一个具有标准参数服务器工作流的64 智能体训练系统,因车辆没有学习驾驶功能,导致3 种场景下均以失败告终,由此可知局部梯度具有很高的噪声和偏差,无法优化全局策略。而多智能体并行SAC(64)是在训练中采用64个并行的智能体,共同更新模型参数。从表中可得出,在最具挑战的密集场景上,本文的方法实现了较高的自动驾驶成功率及良好的性能。梯度使用局部目标计算,无法使用梯度灵敏地更新全局策略,也从侧面突出了修改原始参数服务器工作流以支持分布式强化学习方法的重要性。
由实验得出,当在测试环境中更改动态参与者的数量时,智能体的成功率没有太大差异。这与连续积分学习算法(CIL)[14]、跨域自适应学习算法(CAL)[15]不同,当驾驶环境变得更加复杂和混乱时,这些传统方法的性能会急剧下降,可能因为这些智能体在遇到障碍物或交通信号灯时不能做出反应;本文构建的智能体使用与ARL[5]类似的状态空间,在避障和遵守交通规则方面做得更好。此外,实验发现多智能体运行的失败案例几乎都因超时产生,由此导致智能体静止不动,因低维状态空间和动作空间容易受到特殊锁死情况的影响。因此SAC在测试时是确定性的,相同的观察结果会导致智能体继续出现相同的错误。
文中还对不同并行智能体SAC(1)、SAC(std64)与SAC(64)进行了深入的分析,得出worker 的平均奖励及成功率曲线,结果如图9 与图10 所示。结果表明SAC(64)在处理异常情况时更具优势,具有更好的稳定性以及鲁棒性。而SAC(std64) 由于局部梯度具有较高的偏差,无法优化全局策略,导致成功率变化范围较大且极不稳定。
图9 worker 平均奖励曲线
图10 worker 成功率曲线
文中还列出了不同方法下每1 h 的近似模拟时间步长,结果和设置见表4。 因两者在强化学习设置方面有诸多相似之处,所以将本文方法与ARL[5]进行比较。本文不将总训练时间作为定量分析的可靠指标,尽管本方法可以在7 h 内完成整个训练过程,比ARL[5]的典型训练减少几天甚至几周的训练时间,但总训练时间在强化学习训练过程中仍是高度随机和不稳定的[16],故本文将专注于每1 h的模拟时间步,以证明分布式训练的有效性。
表4 不同设置下每1 h近似模拟时间步长
“Std. param. Server”[17]指使用标准参数服务器工作流,即智能体计算梯度。一个训练系统中的agent 总数等于worker 总数乘以每个worker 的agent数量。因强化学习的随机性,一种方法达到其峰值性能所需时间步是高度不可预测的。即使对于相同的方法,多次运行的总训练时间(定义为一种方法达到其峰值性能所需的时间)也有很大不同。因此,文中着眼于每1 h内深度学习算法完成时间步数,实验的结果在很大程度上仍取决于集群状态。
通过实验发现多智能体并行SAC(64)与单智能体SAC(1)相比,显著加快了20 倍以上的训练速度,结合表4 结果可得此加速方式并不以牺牲性能为代价。此外,即使训练系统中有大量智能体,server 的数量也不会影响训练速度,这表明训练的瓶颈仍然在模拟器的worker 端,而不是server 的通信或计算,理论上说明通过扩大worker规模进一步加快仿真速度是可行的。结果也表明,与一个 worker 中只有一个智能体相比,一个模拟器中有多个智能体可以更好地利用虚拟环境,提高训练效率,侧面也验证本文的多级并行化设计的有效性。
通过改进方案的消融实验,与多智能体并行SAC(64)相比,使用Std 的64 智能体多智能体并行SAC 的训练速度慢得多,训练快速的原因是多智能体并行SAC将局部缓冲区推送到server,避免了局部梯度计算。
本文提出了一种异步分布式多智能体强化学习算法,以及基于Cloud-OTA 的分布式模型快速训练和部署系统架构,并以此为基础建立了基于ROS 的Autoware 和Carla 联合集成开发工具链。实验表明,该方法能有效地提高自动驾驶算法的开发效率和适应性,解决了强化学习算法训练过程中低效性和高复杂度的问题,具有很高的实际应用价值。