Auto Byte

专注未来出行及智能汽车科技

微信扫一扫获取更多资讯

Science AI

关注人工智能与其他前沿技术、基础学科的交叉研究与融合发展

微信扫一扫获取更多资讯

张倩机器之心报道

一块V100运行上千个智能体、数千个环境,这个「曲率引擎」框架实现RL百倍提速

在强化学习研究中,一个实验就要跑数天或数周,有没有更快的方法?近日,来自 SalesForce 的研究者提出了一种名为 WarpDrive(曲率引擎)的开源框架,它可以在一个 V100 GPU 上并行运行、训练数千个强化学习环境和上千个智能体。实验结果表明,与 CPU+GPU 的 RL 实现相比,WarpDrive 靠一个 GPU 实现的 RL 要快几个数量级。

深度强化学习是一种训练 AI 智能体的强大方法。然而,如何将强化学习应用于多个智能体或高维状态、观察结果、行动空间等复杂场景仍然是一个具有挑战性的问题。多智能体系统是强化学习研究和应用的前沿,尤其是那些存在多个智能体交互的系统。它们对于解决经济、自动驾驶、对话智能体、机器人学以及其他很多领域的工程和科学问题具有重要意义。

在这一问题中,训练智能体的时间是一大挑战。如果训练的智能体比较多,一个强化学习实验往往要花费数天或数周才能完成。主要原因在于:在在线训练中,强化学习需要反复运行模拟、训练智能体模型。此外,学习所需的重复次数会随着问题的复杂度呈指数级增长。这在无模型设置中是最突出的,在这种设置中,强化学习智能体在训练时通常对当前的模拟或任务没有任何初始知识。由于深度强化学习实现通常将基于 CPU 的模拟和 GPU 神经网络模型结合在一起,现实世界中的训练时间可能会非常长。

为了提高强化学习系统的吞吐量,来自 Salesforce 的研究者提出了一种名为 WarpDrive 的开源框架,来构建极其快速的(多智能体)深度强化学习(MADRL)pipeline。

  • 论文链接:https://arxiv.org/pdf/2108.13976.pdf

  • 项目地址:https://github.com/salesforce/warp-drive


WarpDrive 在一个 GPU 上端到端地运行整个 MADRL 工作流,使用单个数据存储进行模拟 roll-out、推理和训练。这将最小化通信和复制的成本,显著提升模拟采样和学习速率。WarpDrive 还利用 GPU 的并行能力,并行地运行模拟和每次模拟中的智能体。综合来看,这些设计选择使得运行数千个并发模拟成为可能,每个模拟包含数千个智能体,在非常大的批次上进行训练。

论文中的基准测试表明,与混合 CPU 模拟和 GPU 模型的一般实现相比,WarpDrive 实现的 RL 要快几个数量级。比如,在有 2000 个模拟、1000 个智能体的 Tag 模拟中,WarpDrive 的吞吐量实现了至少 100 倍的性能提升。

此外,研究者还将 WarpDrive 构建得非常灵活、易用、易扩展,并在现有库的基础上进行构建和补充,如 PyCUDA 和 PyTorch。在这个初始版本中,WarpDrive 使用在 CUDA C 中实现的 step 和 reset 方法的模拟,使用 OpenAI gym-API 风格。这使得用户在实现模拟的时候能够使用 CUDA 编程的全部特征集。WarpDrive 在 PyCUDA 的基础上构建,可以方便地访问用 CUDA C 编写的 GPU 数据和模拟方法。它还提供了一个轻量级的 Python 包装器来自动构建 gym 风格的环境对象,实现模拟 API。因此,WarpDrive 可以让用户轻松地创建和扩展自定义 RL pipeline,以最大化 GPU 的用途。

作者表示,WarpDrive 这一名字的灵感来自科幻小说中的超光速宇宙飞船推进系统——曲率引擎,后者可以通过对时空本身的改造来驱动飞船。

在这篇论文中,研究者概述了 WarpDrive 的设计,并展示了它在基准模拟中的吞吐量和可扩展性。最后,他们总结了未来的发展方向。

用 WarpDrive 加速强化学习

WarpDrive 提供了一个框架和一些高质量的工具,帮助用户快速构建快捷而灵活的多智能体强化学习系统。图 3 显示了 WarpDrive 的一个基本用例。

接下来,研究者自下而上地介绍了 WarpDrive 的设计和组件,以及它们在加速强化学习方面的作用。

CUDA 计算

WarpDrive 专注于 CUDA(Compute Unified Device Architecture),这是一个流行的平台和编程模型,允许用户在(CUDAenabled)GPU 硬件上运行程序。CUDA 程序也被称为计算 kernel。CUDA API 可以直接访问 GPU 的虚拟指令集和并行计算元素。

GPU 的一个关键特性是它们可以并行运行许多计算线程。线程组成线程块,多个线程块组成一个网格结构。一个 CUDA kernel 可以访问并定义这些线程的并行计算,见下图 2。

DataManager 和 FunctionManager

图 2 显示了 WarpDrive 框架的一些细节。所有在 GPU 上运行的 CUDA 程序都需要通过 CPU 触发。按照 CUDA 的规则,CPU 被称为主机(host),GPU 被称为设备。任何 CUDA 程序的执行都包括三个主要步骤:
  1. 主机到设备的传输(push):将输入数据从主机内存复制到设备内存,例如在训练开始时。

  2. 加载 CUDA 函数,在 GPU 上执行并缓存数据以提高性能。

  3. 设备到主机的传输(pull):将数据从设备内存复制回主机,例如训练结束的时候。

按照这个模式,WarpDrive 实现了两个重要的 Python 类(驻留在 CPU 上)——DataManager 和 FunctionManager,以方便主机和设备之间所有与 RL 相关的通信和交互。DataManager 提供了一个简易 API 来处理与 RL 相关的主机和设备之间的所有数据传输(pull 和 push)。FunctionManager 允许用户从 CPU 调用 CUDA kernel,并在 GPU 上执行它们。

WarpDrive RL 工作流

使用 WarpDrive,在 GPU 上收集 rollout 和训练模型的一个典型 RL 工作流如下所示:

1. 初始化并重置环境对象后,将主机上的所有数据复制到设备上。DataManager 提供 API 方法来执行此 push 操作。从主机复制到设备的数据可能包括环境配置参数、在第一次重置结束时创建的数据数组,以及观察、动作、奖励和「完成」标志的占位符。DataManager 还帮助维护变量的副本,这些变量需要在每次重置时重新初始化。在这点之后,就不再从主机向设备推送数据了。


2. FunctionManager 提供 API 方法来初始化和调用 CUDA C kernel 函数,这些函数用于从主机节点执行环境步骤。这些函数只在设备上执行,所有的数据数组都被就地修改。出于可视化或分析的目的,主机可能会不时地拉取(pulled)数据,但所有数据本质上只能在训练期间驻留在 GPU 上。

3.WarpDrive 还包含一个 Sampler 类,用于对动作进行采样,以便逐步遍历环境。使用策略模型计算出的概率对动作进行抽样。WarpDrive 的采样器在每个智能体线程上并行运行,运行速度比等效的 PyTorch 实现快 2 倍。详见实验部分。

4. 在 GPU 中,研究者并行执行多个环境副本。每个环境运行在一个单独的线程块上。由于一个典型的 GPU 有数千个块,在一个 GPU 上并行执行数千个环境也是可行的。

5. 任何环境都可能达到终端状态并被「完成」。WarpDrive 提供了一个 EnvironmentReset 类,用于自动识别和重置那些已完成的环境。此时,那些环境也被重置并给出(新的)初始数据。例如,它们可能使用在初始重置时复制的初始数据数组。

6. 在每个环境中,每个智能体还可以在智能体独占(agent-exclusive)的线程上执行它自己的逻辑。图 2 显示了一个示例,其中智能体 i、j 和 k 分别在单个线程 i、j 和 k 上并行操作。这在多智能体 RL 中非常有用,因为可以完全将智能体操作并行化,因此模拟时间复杂度保持不变,即使智能体数量增加(达到可用线程的数量)。

7. 一旦从几个环境和智能体中收集到的数据被送到训练数据 batch 中,也可以用 WarpDrive 执行端到端训练。这次推出的 WarpDrive 包括一个示例训练脚本和 Trainer 类,它目前实现了 Advantage Actor Critic(A2C)、近端策略优化(PPO)RL 算法和一个全连接神经网络策略模型。Trainer 基于 PyTorch 构建,并从 CPU 主机调用所有 CUDA kernel 和 PyTorch 操作。然而,PyTorch 可以直接访问和解释以 torch 形式存储在设备上的 WarpDrive 数据 batch(状态、动作、奖励和完成标志)。这使得用户可以计算损失并修改模型参数,同时消除数据复制。考虑到 WarpDrive 的模块化特性,这一框架很容易扩展。

这些设计选择使得 WarpDrive 非常高效。

实验结果

研究者使用 Tag 游戏演示了 WarpDrive 的工作流,并对其性能进行了测试。他们比较了以下两种情况的性能:

  • 使用 CPU-simulations + GPU-agent 的模型;

  • 在单个 Nvidia V100 GPU 上运行 WarpDrive。


测试结果表明,与使用 CPU-simulation + GPU-agent 的模型相比,WarpDrive 的吞吐量要高几个数量级。


入门深度强化学习智能体
相关数据
深度强化学习技术

强化学习(Reinforcement Learning)是主体(agent)通过与周围环境的交互来进行学习。强化学习主体(RL agent)每采取一次动作(action)就会得到一个相应的数值奖励(numerical reward),这个奖励表示此次动作的好坏。通过与环境的交互,综合考虑过去的经验(exploitation)和未知的探索(exploration),强化学习主体通过试错的方式(trial and error)学会如何采取下一步的动作,而无需人类显性地告诉它该采取哪个动作。强化学习主体的目标是学习通过执行一系列的动作来最大化累积的奖励(accumulated reward)。 一般来说,真实世界中的强化学习问题包括巨大的状态空间(state spaces)和动作空间(action spaces),传统的强化学习方法会受限于维数灾难(curse of dimensionality)。借助于深度学习中的神经网络,强化学习主体可以直接从原始输入数据(如游戏图像)中提取和学习特征知识,然后根据提取出的特征信息再利用传统的强化学习算法(如TD Learning,SARSA,Q-Learnin)学习控制策略(如游戏策略),而无需人工提取或启发式学习特征。这种结合了深度学习的强化学习方法称为深度强化学习。

基准技术

一种简单的模型或启发法,用作比较模型效果时的参考点。基准有助于模型开发者针对特定问题量化最低预期效果。

参数技术

在数学和统计学裡,参数(英语:parameter)是使用通用变量来建立函数和变量之间关系(当这种关系很难用方程来阐述时)的一个数量。

时间复杂度技术

在计算机科学中,算法的时间复杂度是一个函数,它定量描述了该算法的运行时间。这是一个代表算法输入值的字符串的长度的函数。时间复杂度常用大O符号表述,不包括这个函数的低阶项和首项系数。使用这种方式时,时间复杂度可被称为是渐近的,亦即考察输入值大小趋近无穷时的情况。例如,如果一个算法对于任何大小为 n (必须比 n0 大)的输入,它至多需要 5n3 + 3n 的时间运行完毕,那么它的渐近时间复杂度是 O(n3)。

神经网络技术

(人工)神经网络是一种起源于 20 世纪 50 年代的监督式机器学习模型,那时候研究者构想了「感知器(perceptron)」的想法。这一领域的研究者通常被称为「联结主义者(Connectionist)」,因为这种模型模拟了人脑的功能。神经网络模型通常是通过反向传播算法应用梯度下降训练的。目前神经网络有两大主要类型,它们都是前馈神经网络:卷积神经网络(CNN)和循环神经网络(RNN),其中 RNN 又包含长短期记忆(LSTM)、门控循环单元(GRU)等等。深度学习是一种主要应用于神经网络帮助其取得更好结果的技术。尽管神经网络主要用于监督学习,但也有一些为无监督学习设计的变体,比如自动编码器和生成对抗网络(GAN)。

逻辑技术

人工智能领域用逻辑来理解智能推理问题;它可以提供用于分析编程语言的技术,也可用作分析、表征知识或编程的工具。目前人们常用的逻辑分支有命题逻辑(Propositional Logic )以及一阶逻辑(FOL)等谓词逻辑。

多智能体系统技术

一个多智能体系统,是由一个在一个环境中交互的多个智能体组成的计算系统。多智能体系统也能被用在解决分离的智能体以及单层系统难以解决的问题。智能可以由一些方法,函数,过程,搜索算法或加强学习来实现。尽管存在相当大的重叠,然而一个多智能体系统并不总是一个基于智能体的模型表现一致。

批次技术

模型训练的一次迭代(即一次梯度更新)中使用的样本集。

推荐文章
暂无评论
暂无评论~