探索 RegressLM:文本到文本回归的实用指南

你有没有想过,如何从杂乱无章的非结构化文本数据中预测数值结果,而不必陷入复杂的特征工程?这就是 RegressLM 的用武之地。这个库让文本到文本回归任务变得简单明了,能将字符串转化为浮点数预测。它特别适合处理像日志或配置文件这样的数据形式,比如模拟大型系统的性能指标。

在这篇文章中,我们将一步步了解 RegressLM 是什么、如何设置,以及如何有效使用它。我会边走边回答常见问题,基于库的文档和相关研究,让内容清晰且实用。我们从基础开始吧。

RegressLM 是什么,为什么你可能需要它?

想象一下,你正在处理来自大型计算集群的数据,比如谷歌的 Borg 系统。你有满是细节的日志——时间戳、硬件分布、工作配置文件——你需要预测一个效率指标,比如每计算单元的百万指令每秒。传统方法可能需要将所有这些压平成表格,这可能会丢失重要上下文,或者对变动的数据库不切实际。

RegressLM 提供了一种不同的方法:文本到文本回归。它将你的输入视为字符串,通过类似语言模型的过程输出数值。这意味着你可以输入任何文本表示,而无需严格的格式化。库支持在大规模数据集上预训练,并在特定任务上微调,使其适合多任务学习。

从研究角度看,这种方法在大型系统性能预测中显示出潜力。例如,一个从随机初始化训练的 6000 万参数模型,在 Borg 数据上达到了近乎完美的 0.99 排序相关性(平均 0.9),比表格方法降低了 100 倍的均方误差。它还能用少量示例快速适应新任务。

RegressLM 从文本中解码数值性能指标。

这张图片展示了 RegressLM 如何从文本表示的系统状态中解码性能指标,突出了它在实际场景中的应用。

RegressLM 中的文本到文本回归如何工作?

你可能在想,“RegressLM 到底是怎么把文本变成数字的?”它基于回归语言模型(RLM),使用编码器-解码器架构来处理输入字符串,并生成标记化的数值输出。模型通过最小化目标值标记上的交叉熵损失来学习,而不是像均方误差这样的直接误差指标。

关键元素包括:

  • 输入表示:任何字符串,比如 YAML 格式的计算集群日志。
  • 输出标记化:数字分解为符号、尾数和指数(例如,72.5 表示为 <+><7><2><5>)。
  • 训练过程:在输入文本和目标值对上的下一个标记预测。
  • 推理:采样多个输出并聚合它们来得到预测。

这种设置避免了传统回归中固定长度张量的问题,允许可变长度输入,并自然处理嵌套数据。

在实际中,对于像 Borg 这样的系统性能预测,输入包括:

  • 集群名称和位置。
  • 数据收集的时间窗口。
  • 调度器超参数。
  • 机器分布和工作配置文件。

这些特征可能跨越数千个字符,如下表所示:

特征类型 平均字符数
集群名称 3
物理位置 8
时间窗口 86
调度器超参数 1,082
机器分布 461
工作-机器性能 268,157

总输入字符串长度的分布通常是大多数在 1M 字符以下,但有些更长,这强调了处理长上下文模型的需求。

![输入字符串长度的分布](假设路径或描述:文档中的图 3 显示了一个直方图,字符串长度从 1K 到 10M,频率随着长度增加而减少。)

设置 RegressLM:一步步指南

如果你准备试用,这里是如何开始的。安装简单,使用标准的 Python 工具。

如何安装 RegressLM?

  1. 从 GitHub 克隆仓库:git clone https://github.com/google-deepmind/regress-lm.git
  2. 进入目录:cd regress-lm
  3. 安装核心库:pip install -e .
  4. 对于像 T5Gemma 这样的高级模型,添加额外依赖:pip install ".[extras]"

这个设置让你访问主要类和模型。请注意,这不是谷歌官方支持的产品,最适合研究或实验用途。

安装后,你可以在 Python 脚本中导入并使用它。

基本用法:推理和预训练

现在,我们深入了解如何使用 RegressLM。主要有两个阶段:用于预测的推理,以及用于更好初始模型的预训练。

如何用 RegressLM 进行推理?

推理涉及创建模型,如果需要,在示例上微调,然后采样预测。

这里是一个代码示例:

from regress_lm import core
from regress_lm import rlm

# 用最大输入标记长度创建一个 RegressLM 实例。
reg_lm = rlm.RegressLM.from_default(max_input_len=2048)

# 为微调准备示例对。
examples = [core.Example(x='hello', y=0.3), core.Example(x='world', y=-0.3)]
reg_lm.fine_tune(examples)

# 定义查询输入。
query1 = core.ExampleInput(x='hi')
query2 = core.ExampleInput(x='bye')

# 采样预测。
samples1, samples2 = reg_lm.sample([query1, query2], num_samples=128)

这为每个查询生成 128 个样本,你可以平均它们或分析分布。它适合在新输入上快速预测。

预训练呢?

当你有大规模数据集时,预训练很有帮助。使用 PyTorch 来实现:

from torch import optim
from regress_lm.models.pytorch import model as torch_model_lib

# 初始化模型。
model = torch_model_lib.PyTorchModel(...)

# 设置优化器。
optimizer = optim.Adafactor(
    filter(lambda p: p.requires_grad, model.parameters()), lr=1e-4
)

# 训练循环。
for _ in range(...):
    examples = [core.Example(x=..., y=...), ...]  # 这里放你的数据。
    tensor_examples = model.convert(examples)
    optimizer.zero_grad()
    loss, _ = model.compute_loss_and_metrics(tensor_examples)
    loss.backward()
    optimizer.step()

这个循环在你的数据上更新模型,提高微调的起点。

扩展用法:提升性能

你可能在想,“如何让 RegressLM 表现更好?”库提供了几种方式来提升准确性和处理更复杂场景。

训练自定义词汇表

如果你的数据有独特模式,在你的语料库上训练词汇表:

encoder_vocab = SentencePieceVocab.from_corpus(corpus_path='mydata.txt', vocab_size=1024)

这将标记化调整为你的文本,可能提高效率。

使用更大模型

扩大规模以获得更好结果,尽管这会增加计算需求:

model = PyTorchModel(num_encoder_layers=12, num_decoder_layers=12)

更大尺寸能捕捉像 Borg 日志这样数据中的更多细微差别。

处理多目标回归

用于预测多个值:

reg_lm = rlm.RegressLM.from_default(max_num_objs=2)

# 具有可变长度的示例。
examples = [core.Example(x='hello', y=[0.2]), core.Example(x='world', y=[-0.2, 0.3])]
reg_lm.fine_tune(examples)

# 采样多维输出。
samples = reg_lm.sample([core.ExampleInput(x='hi')], num_samples=128)[0]  # 形状:(128, 2)

这对具有多个组件的指标很有用。

集成预训练模型

使用第三方模型如 T5Gemma:

from regress_lm.models.pytorch import t5gemma_model
model = t5gemma_model.T5GemmaModel('google/t5gemma-s-s-prefixlm')

它利用现有检查点来更快启动。

支持长上下文

对于超过 100K 标记的输入,尝试替代编码器:

# Mamba 编码器。
model = PyTorchModel(encoder_type='mamba', additional_encoder_kwargs={'d_state': 128})

# Performer 编码器。
model = PyTorchModel(encoder_type='performer', additional_encoder_kwargs={'num_features': 256})

这些处理扩展序列,对详细系统日志至关重要。

实际应用:大型系统中的性能预测

让我们谈谈来自谷歌 Borg 计算集群研究的一个实际示例。Borg 管理跨机器的工作调度,预测像 MIPS per GCU 这样的效率指标是优化的关键。

像 Borg 这样的系统中预测为什么具有挑战性?

特征复杂且嵌套:

  • 带有资源和副本的工作请求。
  • 带有可用资源的机器状态。
  • 来自 10 秒窗口的剖析数据。

传统表格方法难以处理,通常需要专家特征工程。文本到文本回归通过使用完整字符串表示来绕过这一点。

一个匿名化输入示例可能看起来像这样:

cell: cell_a
2024/06/02 17:00:00 PDT, Day:Fri Week:21
search_space:
{’JOB/data_pipeline/PRODUCTION_WORKLOAD’:
[’machineE’, ’machineA’, ’none_selected’]}
assignments: {"JOB/data_pipeline/PRODUCTION_WORKLOAD": "machineA"}
distributions:
- platform: {machineA}
num_machines: 1.239e+03
low_level_zones: 5.200e+01
mid_level_zones: 5.200e+01
high_level_zones: 4.300e+01
resources: 5.481e+05
job_profiles:
- job: {user: data_pipeline, group_name: data_pipeline_workers}
platform_profiles:
machineD: {mean_mips_per_resource_usage: 8.165e+02}
machineA: {mean_mips_per_resource_usage: 9.590e+02}
machineF: {mean_mips_per_resource_usage: 8.321e+02}
machineC: {mean_mips_per_resource_usage: 7.098e+02}
limits:
job_requested_resource_limit: 1.217e+04
job_requested_num_vms: 1087

从这个预测 MIPS per GCU 在模拟中可能需要数小时,但 RLM 在几秒内以高准确性完成。

![使用 RLM 进行性能预测的概述。](假设路径或描述:图 1 显示系统日志输入到编码器-解码器 RLM,输出标记化数字的预测分布。)

来自研究的关键洞见

  • 高准确性:在 Borg 数据上,RLM 在整个舰队达到了 0.99 排序相关性,平均 0.9。
  • 少样本适应:在新集群上用 500 个示例微调。
  • 不确定性处理:通过采样,模型自然量化本征噪声(aleatoric)和特征不完整(epistemic)不确定性。

偏差-方差分解显示,观察更多特征减少了 epistemic 不确定性,通过等价类上的总方差界定 MSE。

对于一个数据集,总方差计算为:

TotalVariance = (1/K) * Sum [Var(y | x in X_k)]

其中 X_k 是具有相同观察特征的组。

消融实验和设计选择:什么有效,为什么?

你可能在问,“为什么 RegressLM 有这些特定设计?”研究消融突出了:

  • 编码器必不可少:仅解码器模型在复杂输入上表现不佳;编码器更好地处理长字符串。
  • 无需语言预训练:从随机初始化开始——回归关注相关性,而不是语义。
  • 解码优于值头:交叉熵稳定了跨不同尺度的训练。
  • 序列长度重要:更长上下文(例如 2048 标记)通过捕捉完整细节来改善。
  • 模型大小:更大模型(例如 12 层)提升性能但增加成本。
  • 学习率和停止:使用 1e-4 的 Adafactor;早停防止过拟合。

这些选择使 RLM 对于像 Borg 预测这样的任务鲁棒,其中来自随机负载的噪声增加了挑战。

贡献者和如何引用

库由 Xingyou Song、Yash Akhauri、Dara Bahri、Michal Lukasik、Arissa Wongpanich、Adrian N. Reyes 和 Bryan Lewandowski 开发。

如果你在工作中使用这个,请引用:

  • 大型系统性能预测通过文本到文本回归 (Akhauri et al., 2025, arXiv:2506.21718)。
  • OmniPred:语言模型作为通用回归器 (Song et al., 2024, TMLR)。
  • 基于解码的回归 (Song and Bahri, 2025, TMLR)。

FAQ:回答关于 RegressLM 的常见问题

这里,我将回答你可能有的问题,基于典型用户好奇心。

什么是文本到文本回归?

它是一种方法,模型从文本输入预测数字,使用语言模型技术,适合非结构化数据。

RegressLM 如何处理不确定性?

通过采样多个输出,它估计分布,捕捉本征噪声(aleatoric)和特征不完整(epistemic)。

RegressLM 能同时预测多个指标吗?

是的,通过多目标支持——设置 max_num_objs 并为 y 使用列表。

RegressLM 适合长输入吗?

绝对是,有像 Mamba 或 Performer 编码器的选项,用于 100K+ 标记。

它与传统回归相比如何?

在复杂数据上表现更好,例如在 Borg 上 MSE 低 100 倍,通过避免特征压平。

如果我的数据有新特征怎么办?

在新示例上微调;无需从头开始。

如何评估性能?

使用像 MSE、排序相关性或对数似然这样的指标在保留数据上。

我能不用 PyTorch 使用它吗?

核心用法基于 Python,但预训练示例使用 PyTorch。

如何做:为新任务微调

  1. 将你的数据加载为 Example 对象:x 为字符串,y 为浮点数或列表。
  2. 创建 RegressLM:reg_lm = rlm.RegressLM.from_default()
  3. 微调:reg_lm.fine_tune(examples)
  4. 采样:samples = reg_lm.sample(queries, num_samples=100)
  5. 聚合:平均样本得到点预测,或分析方差。

这个过程启用快速适应,比如转移到新计算集群。

总结:RegressLM 的价值

RegressLM 简化了从文本的回归处理,为系统模拟等应用打开了大门。通过利用完整数据上下文,它在传统方法失效的地方实现了高准确性。无论你是预测效率还是探索多任务学习,这都是一个值得尝试的工具。