Skip to content

如何在 ExperienceOperator 中使用空闲 GPU 训练辅助模型? #449

@SYSUzhouting

Description

@SYSUzhouting

背景与动机

Trinity-RFT 开发者您好!

我们正在使用 Trinity-RFT 框架进行一些关于RLHF的前沿研究。在我们的探索中,一个核心需求是能够基于 Experience 数据流,动态地训练和更新一个辅助小模型,用以实现更复杂的经验筛选或奖励修正策略。这对于扩展框架的研究能力、满足更多样的学术探索非常有价值。

目前,我们尝试在 trinity/buffer/operators 中实现一个自定义算子,该算子会初始化一个小模型,并在 process 方法中周期性地利用历史经验数据对其进行训练。

问题描述

我们发现,在这个自定义算子中,无法将待训练的小模型的训练任务加载到指定的 GPU 上。如果将模型和数据强制 to(device),即使该设备在物理上是空闲的,程序也会立即报错并中断。这导致我们只能在 CPU 上进行训练,对于需要频繁更新的模型来说,效率非常低下。

复现概述

  1. 我们新建了一个 OutlierRewardFilter,一个 ExperienceOperator,并尝试放到 GPU 上
training_device: str = "cuda:5"
self.preference_classifier = PreferenceClassifier(
            input_dim=self.input_hidden_state_dim, 
            hidden_layer_size=self.output_hidden_dim
        ).to(training_device)
  1. 我们使用以下命令启动训练:
CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 trinity run --config xxx.yaml
cluster:
  node_num: 1
  gpu_per_node: 6

explorer:
  rollout_model:
    engine_num: 2
    tensor_parallel_size: 1
  1. 报错信息

当 ExperienceOperator 被初始化时,程序崩溃,并抛出以下错误,指出对于该进程没有可用的 CUDA 设备:

可能原因和需求

我们猜测,这个问题可能与 Trinity-RFT(及其底层的 Ray 框架)的分布式资源管理机制有关;例如在 trinity run 启动时,框架可能会为每个工作进程(Ray Actor)设置独立的 CUDA_VISIBLE_DEVICES 环境变量,导致所有GPU都被锁了,无法再次进行使用。

希望能请教一下这个训练问题的原因,以及是否有比较合适的解决方案,谢谢!

以下是报错内容附图

Image

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions