备注

Ray 2.10.0 引入了 RLlib 的“新 API 栈”的 alpha 阶段。Ray 团队计划将算法、示例脚本和文档迁移到新的代码库中,从而在 Ray 3.0 之前的后续小版本中逐步替换“旧 API 栈”(例如,ModelV2、Policy、RolloutWorker)。

然而,请注意,到目前为止,只有 PPO(单代理和多代理)和 SAC(仅单代理)支持“新 API 堆栈”,并且默认情况下继续使用旧 API 运行。您可以继续使用现有的自定义(旧堆栈)类。

请参阅此处 以获取有关如何使用新API堆栈的更多详细信息。

使用 RLlib 与 torch 2.x 编译#

torch 2.x 带来了 torch.compile() API,它可以用于即时编译(JIT-compile)包装的代码。我们在 RLModules 和 Learners 的上下文中将 torch.compile() 与 RLlib 集成。

我们已经将此功能与 RLModules 集成。您可以通过 AlgorithmConfig 对象上的 framework() API 设置后端和模式。或者,您可以直接在独立使用期间(如推理)编译 RLModule

基准测试#

我们对此功能进行了全面的基准测试。以下基准测试仅考虑在推理和环境探索期间启用 torch-compile 可能带来的潜在速度提升。这种方法是相关的,因为强化学习通常受采样瓶颈的限制。

推理#

对于基准测试指标,我们计算运行 forward_exploration() 方法所需时间的倒数。我们在不同的硬件设置、torch 版本、dynamo 后端和模式以及不同的批量大小下,对 PPO RLModule 的默认实现进行了此基准测试。下表显示了在给定硬件和 PyTorch 版本组合下,能够获得最高加速的 torch-backend 和 -mode 的组合:

硬件

PyTorch 版本

加速(%)

后端 + 模式

CPU

2.0.1

33.92

ipex + 默认

CPU

2.1.0 夜间版

x

ipex + 默认

T4

2.0.1

14.05

电感器 + 减少开销

T4

2.1.0 夜间版

15.01

电感器 + 减少开销

V100

2.0.1

92.43

电感器 + 减少开销

V100

2.1.0 夜间版

85.71

电感器 + 减少开销

A100

2.0.1

x

电感器 + 减少开销

A100

2.1.0 夜间版

156.66

电感器 + 减少开销

有关详细表格,请参见 附录 。有关基准测试代码,请参见 run_inference_bm.py 。要运行基准测试,请使用以下命令:

python ./run_inference_bm.py --backend <dynamo_backend> --mode <dynamo_mode> -bs <batch_size>

一些元级别的评论#

  1. 性能提升取决于许多因素,包括使用的神经网络架构、采样时的批量大小、后端、模式、torch版本以及其他许多因素。为了优化性能,首先获取非编译工作负载的学习,然后在不同硬件上对torch编译参数进行超参数调优。

  2. 对于CPU推理,请使用推荐的仅推理后端:ipexonnxrt

  3. 与旧款如T4相比,在更现代的架构如A100上,加速效果更为显著。

  4. Torch 编译仍在不断发展。我们注意到 2.0.1 版本和 2.1 夜间版本之间存在显著差异。因此,在基准测试您自己的工作负载时,考虑 torch 版本是非常重要的。

探索#

在 RLlib 中,您现在可以设置配置,以便在 RL 代理训练过程的采样期间使用编译模块。默认情况下,回滚工作程序在 CPU 上运行,因此建议使用 ipexonnxrt 后端。但是,您仍然可以通过设置 num_gpus_per_env_runner 在 GPU 上运行采样部分,在这种情况下也可以使用其他后端。要启用训练期间的 torch-compile,您还可以设置 torch_compile_learner 等效项。

from ray.rllib.algorithms.ppo import PPOConfig
config = PPOConfig().framework(
    "torch",
    torch_compile_worker=True,
    torch_compile_worker_dynamo_backend="ipex",
    torch_compile_worker_dynamo_mode="default",
)

This 基准脚本在Atari-Breakout游戏中使用默认模型架构运行PPO算法。它对编译和未编译的RLModules进行``n``次迭代训练,并报告加速比。请注意,负的加速比值意味着编译模块时会减慢速度。

要运行基准测试脚本,您需要一个由至少129个CPU(2x64 + 1)和2个GPU组成的Ray集群。如果此配置对您不可用,您可以更改采样工作者的数量和批量大小以减少要求。

python ./run_ppo_with_inference_bm.py --backend <backend> --mode <mode>

以下是结果的总结:

后端

模式

加速(%)

onnxrt

默认

-72.34

onnxrt

reduce-overhead

-72.72

ipex

默认

11.71

ipex

reduce-overhead

11.31

ipex

max-autotune

12.88

如你所见,onnxrt 在我们测试的设置中并没有获得任何速度提升(实际上它使工作负载减慢了70%),而 ipex 提供了约10%的速度提升。如果我们改变模型架构,这些数字可能会发生变化。因此,首先固定架构,然后寻找最快的训练设置是非常重要的。