Scaling Up 的工程优化
2026/6/26 7:53:18 网站建设 项目流程

一、样本存储格式:TFRecord → ORC

TFRecord 是 TensorFlow 原生的二进制序列化格式,本质上是 Protocol Buffer 的封装,每条样本顺序存储,不支持列式访问,也没有内置压缩。

ORC(Optimized Row Columnar)是 Hadoop 生态里的列式存储格式,核心优势有三点:

第一是列式存储天然适合压缩。同一列的数据类型相同、值域相近,压缩算法(Zlib、Snappy、Zstd)可以获得极高的压缩比。推荐系统的特征大量是稀疏 ID,同一列里重复值很多,压缩比可以达到几十倍甚至上百倍,这就是为什么 67TB 能压缩到 1TB,压缩比约 67:1。

第二是支持谓词下推(Predicate Pushdown),读取时可以跳过不需要的列,减少 IO。

第三是支持 Stripe 级别的统计信息(min/max/count),可以做粗粒度过滤。

存储成本降低 95% 的直接收益是:在相同存储预算下,样本量从 40 亿扩大到 120 亿,训练窗口从 65 天扩大到 150 天,模型能看到更长的历史数据,泛化能力更强。


二、数据结构优化:String → Array + 提前哈希

这两个优化都是在把训练时的计算量前移到数据预处理阶段。

序列特征从 String 转 Array 的问题背景是:原来序列特征存储为字符串,比如"12345,67890,11111",训练时每个 batch 都要实时做字符串分割和类型转换,这是纯 CPU 计算,而且在 Python/TF 的 data pipeline 里效率很低,容易成为数据读取的瓶颈(IO bound 变成 CPU bound)。预处理成 Array 之后,训练时直接读取数值数组,省去了解析开销。

提前哈希化的逻辑类似:原来特征值(比如城市名、品类字符串)在训练时实时做哈希映射到 embedding 表的 index,这个操作虽然单次很快,但在百亿样本规模下累积开销不可忽视。提前哈希化后,训练时直接用整数 index 查表,减少了训练过程中的 CPU 计算量。

这两个优化本质上是把训练时的重复计算变成一次性的预处理,是典型的以存储换计算的思路。


三、Embedding HashTable:从 Variable 到 HashTable

这是整个方案里工程难度最高的部分,解决了 TensorFlow 原生 Variable 在大规模稀疏特征场景下的三个根本性缺陷。

缺陷一:单 PS 内存放不下

TF 的 Variable 是静态分配的,embedding 矩阵大小在图构建时就确定了。如果有 1 亿个 ID,每个 embedding 64 维,float32 存储,就需要 1亿 × 64 × 4 bytes = 25.6 GB,单个 PS 节点放不下。原生解决方案是 partition,但 partition 的粒度是固定的,灵活性差。

HashTable 方案把 embedding 存储改成 key-value 结构,key 是特征 ID,value 是对应的 embedding 向量。这样可以分布式存储在多个节点上,按 key 做哈希路由,天然支持水平扩展。

缺陷二:不能动态增加 ID

Variable 的 shape 在图构建时固定,新出现的 ID(比如新上线的酒店)无法动态加入 embedding 表,只能定期重新训练。HashTable 是动态结构,新 ID 第一次出现时自动插入,支持在线学习场景。

缺陷三:不支持低频过滤

推荐系统里大量 ID 出现频次极低(长尾分布),这些 ID 的 embedding 训练样本不足,学不到有效表示,反而占用大量内存。Variable 方式无法在训练过程中动态过滤低频 ID。HashTable 可以维护每个 key 的访问计数,低于阈值的 ID 不插入或定期清理,大幅减少内存占用,同时提升模型质量(减少噪声 embedding 的干扰)。


四、优化器和学习率调优

把训练 Epoch 从 10 轮降到 3 轮,本质上是让模型在更少的数据遍历次数内达到相同甚至更好的收敛效果。常见的调优手段有几个方向:

学习率 Warmup + Decay:前期用小学习率让模型稳定起步,中期用大学习率快速收敛,后期用小学习率精细调整。合理的 Warmup 步数和 Decay 策略可以显著减少收敛所需的 Epoch 数。

优化器选择:Adam 系列(AdaGrad、Adam、AdamW)对稀疏特征友好,因为它对每个参数维护独立的自适应学习率,稀疏更新的参数不会因为全局学习率过大而震荡。推荐系统里 embedding 参数更新极度稀疏,Adam 比 SGD 收敛快很多。

梯度累积和 Batch Size 调整:更大的 Batch Size 可以提供更稳定的梯度估计,减少噪声,加快收敛,但需要相应调大学习率(Linear Scaling Rule)。


五、RankMixer 算子融合优化

算子融合(Kernel Fusion)是 GPU 训练加速的核心手段之一。

RankMixer 的计算流程包含多个步骤:reshape、transpose、矩阵乘法、LayerNorm、残差加法等。如果每个步骤都是独立的 CUDA kernel,每次 kernel 启动都有固定开销(kernel launch overhead),而且中间结果需要写回显存再读取,产生大量显存 IO。

算子融合把多个连续的小 kernel 合并成一个大 kernel,中间结果直接在寄存器或 shared memory 里传递,不写回显存,大幅减少显存带宽消耗和 kernel 启动开销。

对于 RankMixer 这种计算密集但单个算子不大的结构,融合优化的收益尤其明显,因为原来大量时间花在 kernel 启动和显存 IO 上,而不是真正的计算上。这也是 MFU(Model FLOPs Utilization)提升的核心手段之一。


整体收益的逻辑链

这五个优化之间有清晰的依赖关系:ORC 格式降低存储成本 → 样本量扩大 3 倍 → 训练窗口从 65 天扩到 150 天;HashTable 解决内存瓶颈 → 参数量从 8M 扩到 27M;算子融合 + 优化器调优 → Epoch 从 10 降到 3;三者共同作用 → 训练时间从 389 小时降到 144 小时,降幅 63%。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询