快捷方式

RolloutFromModel

class torchrl.data.RolloutFromModel(model, ref_model, reward_model, kl_coef=0.1, max_new_tokens=50, score_clip=10.0, kl_scheduler: KLControllerBase | None = None, num_steps: int | None = None)[源代码]

用于对因果语言模型执行 rollout 的类。

假设此类封装的模型接收分词后的文本作为输入,其任务是根据已读取的前 n 个词预测句子中的下一个词。

参数:
  • model (transformers.Transformer) – 要使用的模型。应具有 generate() 方法。

  • ref_model (transformers.Transformer) – model 的冻结版本,其参数处于初始配置。这用于计算奖励的 KL 惩罚,以防止模型在训练期间偏离参考模型太远。

  • reward_model – (nn.Module, tensordict.nn.TensorDictModule): 一个模型,给定 input_idsattention_mask,计算每个 token 的奖励以及 end_scores(每个序列中最后一个 token 的奖励)。

  • kl_coef – (float, 可选): 初始 kl 系数。

  • max_new_tokens (int, 可选) – 序列的最大长度。默认为 50。

  • score_clip (float, 可选) – 奖励模型的分数将被裁剪到 (-score_clip, score_clip) 范围内。默认为 10。

  • kl_scheduler (KLControllerBase, 可选) – KL 系数调度器。

  • num_steps (int, 可选) – 两次优化之间的步数。

示例

>>> from tensordict.nn import TensorDictModule
>>> from torchrl.modules.models.rlhf import GPT2RewardModel
>>> from torchrl.data.rlhf.utils import RolloutFromModel
>>> from torchrl.data.rlhf.dataset import get_dataloader
>>> from torchrl.data.rlhf.prompt import PromptData
>>> from transformers import GPT2LMHeadModel
>>>
>>> dl = get_dataloader(
...     batch_size=4,
...     block_size=550,
...     tensorclass_type=PromptData,
...     device="cpu",
...     dataset_name="CarperAI/openai_summarize_tldr",
... )
>>> model = GPT2LMHeadModel.from_pretrained("gpt2")
>>> # we load ref_model with random weights so it differs from model
>>> ref_model = GPT2LMHeadModel(GPT2LMHeadModel.config_class())
>>> reward_model = GPT2RewardModel(model_path="gpt2")
>>> rollout_from_model = RolloutFromModel(model, ref_model, reward_model)
>>>
>>> batch = next(dl)
>>> rollout = rollout_from_model.rollout_from_data(batch)
>>> rollout
TensorDict(
    fields={
        action: Tensor(shape=torch.Size([4, 50]), device=cpu, dtype=torch.int64, is_shared=False),
        attention_mask: Tensor(shape=torch.Size([4, 50, 600]), device=cpu, dtype=torch.bool, is_shared=False),
        input_ids: Tensor(shape=torch.Size([4, 50, 600]), device=cpu, dtype=torch.int64, is_shared=False),
        next: TensorDict(
            fields={
                attention_mask: Tensor(shape=torch.Size([4, 50, 600]), device=cpu, dtype=torch.bool, is_shared=False),
                done: Tensor(shape=torch.Size([4, 50, 1]), device=cpu, dtype=torch.bool, is_shared=False),
                input_ids: Tensor(shape=torch.Size([4, 50, 600]), device=cpu, dtype=torch.int64, is_shared=False),
                reward: Tensor(shape=torch.Size([4, 50, 1]), device=cpu, dtype=torch.float32, is_shared=False),
                reward_kl: Tensor(shape=torch.Size([4, 50, 1]), device=cpu, dtype=torch.float32, is_shared=False),
                reward_raw: Tensor(shape=torch.Size([4, 50, 1]), device=cpu, dtype=torch.float32, is_shared=False)},
            batch_size=torch.Size([4, 50]),
            device=cpu,
            is_shared=False),
        sample_log_prob: Tensor(shape=torch.Size([4, 50, 1]), device=cpu, dtype=torch.float32, is_shared=False)},
    batch_size=torch.Size([4, 50]),
    device=cpu,
    is_shared=False)
create_rollout_td(batch, generated, log_probs, log_ratio)[源代码]

一个用于生成数据的 TensorDict 包装器。

此函数接收一个 batch 以及生成的 tokens,并复制了从每次 timestep 采样一个 token 的 TorchRL 环境 rollout 中获得的 tensordict 结构。

参数:
  • batch (TensorDict) – 包含原始 prompt 以及指示 prompt 右侧索引的字段“rindex”的数据批次。

  • generated (torch.Tensor) – 分词后的 prompt 后面跟着生成的 tokens。这可以通过调用 generate 方法获得。

  • log_probs (torch.Tensor) – 生成 tokens 的对数概率。这可以通过调用 generate 方法获得。

  • log_ratio (torch.Tensor) – 根据生成模型和冻结版本计算的生成 tokens 概率的对数比率。这可以通过调用 generate 方法获得。

返回:

  • "action": 动作序列(生成的 tokens)

  • "input_ids": 在每个时间步传递给生成模型的 input_ids。

  • "attention_mask": 在每个时间步传递给生成模型的 attention_mask

  • "sample_log_prob": 生成过程中每个 token 的对数概率

  • ("next", "input_ids"): 生成后的 tokens 序列。构成用于生成下一个 token 的输入的一部分。

  • ("next", "attention_mask"): token 生成后更新的 attention_mask。在下一个时间步传递给生成模型

  • ("next", "terminated"): 布尔数组,指示是否已达到终止状态(是因为生成了 EOS token 还是因为达到了 token 限制)

  • ("next", "done"): 布尔数组,指示是否已达到最终状态。当前是 "terminated" 的副本。

  • ("next", "reward"): 在每个时间步收到的奖励

  • ("next", "reward_raw"): 来自奖励模型的原始奖励,不包含 KL 项。这主要用于调试和日志记录,不用于训练。

  • ("next", "reward_kl"): 来自奖励的 KL 项。这主要用于调试和日志记录,不用于训练。

返回类型:

一个 TensorDict,包含以下键

generate(batch: PromptData, generation_config=None)[源代码]

从数据收集器采样的批量数据中生成 tokens 序列。

参数:
  • batch (PromptData) – 要使用的数据。必须包含 input_idsprompt_rindex 字段。

  • generation_config (GenerationConfig, 可选) – 调用 generate 的配置。

返回:

一个 [B x (Ti +To)] 整数序列 (tokens),

其中 Ti 是输入序列的长度,To 是生成序列的长度。

log_probs_gen: 生成 token 的对数概率。log_ratio: 生成

模型下概率与冻结版本之间概率的对数比率。

返回类型:

generated (torch.Tensor)

static logprobs_of_labels(logits, labels)[源代码]

labels 的对数概率。

这些是从 logits 计算得出的。labels (token id) 用于沿着相关维度索引 logits。

文档

查阅 PyTorch 的全面开发者文档

查看文档

教程

获取面向初学者和高级开发者的深度教程

查看教程

资源

查找开发资源并解答疑问

查看资源