MTGR: Industrial-Scale Generative Recommendation Framework in Meituan¶
1. 研究背景与动机¶
Scaling law 已在 NLP 和 CV 领域得到广泛验证。在工业推荐系统中,如何有效扩展排序模型(ranking model)是核心问题。当前扩展排序模型的方式分为两大类:
- DLRM (Deep Learning Recommendation Model):对每个 user-item pair 独立建模,输入包含大量精心构造的交叉特征(cross features),通过特征交互模块(MLP)学习排序概率。DLRM 的问题在于:(1) 无法高效处理完整用户行为序列;(2) 推理成本与候选数量线性相关。
- GRM (Generative Recommendation Model):将数据组织为 token 序列,使用 Transformer 做 next-token prediction,具备优秀的可扩展性。GRM 的问题在于:必须放弃 DLRM 中精心构造的交叉特征,而实验表明这种退化无法通过模型扩展来弥补。
MTGR 的核心动机:能否构建一个既保留交叉特征又具备 GRM 可扩展性的排序模型?
2. 方法¶
2.1 数据组织¶
传统 DLRM 中,第 $i$ 个样本由 user 和第 $i$ 个候选的特征对组成:
$$\mathbb{D}_i = [\mathbf{U}, \overrightarrow{\mathbf{S}}, \overrightarrow{\mathbf{R}}, \mathbf{C}_i, \mathbf{I}_i] \tag{1}$$
其中:
- $\mathbf{U} = [\mathbf{U}^1, ..., \mathbf{U}^{N_U}]$:用户 profile 特征(年龄、性别等),每个 $\mathbf{U}^j$ 为标量
- $\overrightarrow{\mathbf{S}} = [\mathbf{S}^1, ..., \mathbf{S}^{N_S}]$:用户历史行为序列,每个 $\mathbf{S}^i = [\mathbf{s}^1, ..., \mathbf{s}^{N_s}]$,每个 item 包含 ID、tag、平均 CTR 等特征
- $\overrightarrow{\mathbf{R}}$:用户实时行为序列(最近数小时/一天内的交互)
- $\mathbf{C} = [\mathbf{C}^1, ..., \mathbf{C}^{N_C}]$:交叉特征(用户与候选之间的交叉统计量,如用户对该候选的历史 CTR)
- $\mathbf{I} = [\mathbf{I}^1, ..., \mathbf{I}^{N_I}]$:候选特征(item ID、tag、brand 等)
2.2 传统 DLRM 排序流程¶
传统 DLRM 对每个样本独立处理: 1. 将 $\mathbf{U}, \mathbf{C}, \mathbf{I}$ 的特征分别 embedding 并拼接为 $\text{Emb}_\mathbf{U} \in \mathbb{R}^{K \times d_U}$, $\text{Emb}_\mathbf{C} \in \mathbb{R}^{K \times d_C}$, $\text{Emb}_\mathbf{I} \in \mathbb{R}^{K \times d_I}$ 2. 序列特征 $\overrightarrow{\mathbf{S}}$ 中每个 item 特征独立 embedding 后拼接为 $\text{Emb}_{\overrightarrow{S}} \in \mathbb{R}^{N_{\overrightarrow{S}} \times d_s}$ 3. 通过 Target Attention 提取序列兴趣表示:
$$\text{Feat}_{\overrightarrow{S}} = \text{Attention}(\text{Emb}_\mathbf{I}, \text{Emb}_{\overrightarrow{S}}, \text{Emb}_{\overrightarrow{S}}) \in \mathbb{R}^{K \times d_S} \tag{2}$$
- 所有特征拼接后送入 MLP 输出 logit:
$$\text{Feat}_\mathbb{D} = [\text{Emb}_\mathbf{U}, \text{Feat}_{\overrightarrow{S}}, \text{Feat}_{\overrightarrow{R}}, \text{Emb}_\mathbf{C}, \text{Emb}_\mathbf{s}] \in \mathbb{R}^{K \times (d_U + d_S + d_C + d_I)} \tag{3}$$
2.3 DLRM 扩展困境¶
扩展 DLRM 有两条路径,但都有瓶颈:
- 扩展交叉模块(cross module):即扩展特征交互 MLP。由于 cross module 对每个候选独立推理,推理成本与候选数量线性相关,导致延迟不可接受。
- 扩展用户模块(user module):只扩展用户侧参数。用户表示只计算一次,推理友好,但用户模块不涉及 user-item 交互,对性能提升有限。
MTGR 通过数据重组织和架构优化,实现了 user-item 交互的高效扩展,同时推理成本随候选数量亚线性增长。
2.4 MTGR 的用户聚合(User Sample Aggregation)¶
MTGR 将同一用户在特定时间窗口内的所有候选聚合为一个样本。聚合后的数据格式:
$$\mathbb{D} = [\mathbf{U}, \overrightarrow{\mathbf{S}}, \overrightarrow{\mathbf{R}}, [\mathbf{C}, \mathbf{I}]_1, ..., [\mathbf{C}, \mathbf{I}]_K] \tag{4}$$
关键设计:交叉特征 C 被安排在候选 token 中,而非作为共享特征。这使得 MTGR 可以保留交叉特征的同时享受聚合带来的效率提升。
聚合的效果:
- 训练阶段:大幅减少训练样本数,因为同一用户的所有候选共享用户表示
- 推理阶段:同一请求中的候选已自然聚合,只需一次前向推理即可对所有候选排序,推理成本随候选数量亚线性增长
2.5 Token 化与特征统一¶
MTGR 将所有特征转化为统一维度 $d_{\text{model}}$ 的 token:
- 标量特征($\mathbf{U}$):每个特征直接映射为一个 token,$\text{Feat}_\mathbf{U} \in \mathbb{R}^{N_U \times d_{\text{model}}}$
- 序列特征($\overrightarrow{\mathbf{S}}, \overrightarrow{\mathbf{R}}$):序列中每个 item 的多个特征先 embedding 拼接,再通过 MLP 统一维度,$\text{Feat}_{\mathbf{S}_i} = \text{MLP}(\text{Concat}(\text{Emb}_\mathbf{s})) \in \mathbb{R}^{d_{\text{model}}}$
- 候选特征($[\mathbf{C}, \mathbf{I}]$):每个候选的交叉特征和 item 特征一起 embedding 拼接后通过 MLP 统一
最终,所有 token 拼接为一个长序列:
$$\text{Feat}_\mathbb{D} = \text{Concat}([\text{Feat}_\mathbf{U}, \text{Feat}_{\overrightarrow{S}}, \text{Feat}_{\overrightarrow{R}}, \text{Feat}_\mathbf{I}]) \in \mathbb{R}^{(N_U + N_{\overrightarrow{S}} + N_{\overrightarrow{R}} + N_I) \times d_{\text{model}}} \tag{5}$$
2.6 Unified HSTU Encoder¶
MTGR 采用 HSTU(Hierarchical Sequential Transduction Units)的 encoder-only 架构,由 $L$ 层 self-attention 堆叠而成。每层 self-attention block 的计算流程:
Step 1: Group-Layer Normalization (GLN)
输入 token 序列 $\mathbf{X}$ 先按 domain 分组做 layer norm。不同类型的 token(U、$\overrightarrow{\mathbf{S}}$、$\overrightarrow{\mathbf{R}}$、候选)分别归属不同的 group,每个 group 内独立做 layer normalization:
$$\tilde{X} = \text{GroupLN}(\mathbf{X}) \tag{6}$$
GLN 的设计动机:不同类型的 token 来自不同语义空间,具有不同的分布特征。统一 layer norm 会混淆不同分布,而 GLN 通过分组归一化确保不同语义空间的 token 在进入 self-attention 前对齐到各自合适的分布。
Step 2: 多头注意力
归一化后的输入通过 4 个投影得到 K, Q, V, U:
$$\mathbf{K}, \mathbf{Q}, \mathbf{V}, \mathbf{U} = \text{MLP}_{K/Q/V/U}(\tilde{X}) \tag{7}$$
注意力计算使用 silu 非线性激活,attention score 除以总序列长度做平均归一化,并施加自定义掩码 $\mathbf{M}$:
$$\tilde{\mathbf{V}} = \frac{\text{silu}(\mathbf{K}^T \mathbf{Q})}{(N_U + N_{\overrightarrow{S}} + N_{\overrightarrow{R}} + N_I)} \mathbf{M} \mathbf{V} \tag{8}$$
投影后的 $\mathbf{U}$ 与更新后的 $\tilde{\mathbf{V}}$ 做逐元素乘积(dot-product),再通过 GLN 和残差 MLP:
$$\mathbf{X} = \text{MLP}(\text{GroupLN}(\tilde{\mathbf{V}} \odot \mathbf{U})) + \mathbf{X} \tag{9}$$
2.7 Dynamic Masking 策略¶
传统 HSTU 使用因果掩码做序列建模,但在 MTGR 中简单的因果掩码不够用。原因在于:$\overrightarrow{\mathbf{R}}$(实时行为序列)记录用户最近的交互,其时间戳可能与样本聚合窗口重叠,直接因果掩码会导致信息泄露。
MTGR 将 token 分为静态序列和动态序列两类,设计三条掩码规则:
- 静态序列($\mathbf{U}, \overrightarrow{\mathbf{S}}$)对所有 token 可见(full attention)
- 动态序列($\overrightarrow{\mathbf{R}}$)遵循因果性,每个 token 只对时间上在其之后的 token 可见(包括候选 token)
- 候选 token($[\mathbf{C}, \mathbf{I}]$)只对自身可见(diagonal masking)
具体示例:假设 token 序列为 [age, ctr | seq1, seq2 | rt1, rt2 | target1, target2, target3]:
- age, ctr(U 类型):full attention,对所有 token 可见
- seq1, seq2($\overrightarrow{\mathbf{S}}$):full attention
- rt1:假定在 rt2 之后出现,rt1 能看到 rt2 的信息但 rt2 看不到 rt1
- target1, target2, target3:每个只能看到自己,且 rt2 看不到任何 target(rt2 时间上在所有 rt 之前)
3. 训练系统¶
3.1 基于 TorchRec 的训练框架¶
MTGR 放弃了常用的 TensorFlow 框架,选择基于 TorchRec 构建训练框架,并做了多项优化。相比原版 TorchRec,训练吞吐提升 1.6x - 2.4x,在 100+ GPU 上保持良好可扩展性。
3.2 Dynamic Hash Table¶
TorchRec 使用固定大小静态 embedding table,在大规模工业流式训练场景中不适用(新用户/新 item 无法分配 embedding,预留空间浪费内存)。MTGR 设计了高性能动态哈希表:
- 解耦架构:key 存储和 value 存储分离
- key 存储:轻量级映射系统,将 key 映射为指向 embedding 向量的指针
- value 存储:包含 embedding 向量及计数器、时间戳等元数据(用于淘汰策略)
- 扩容时只需复制轻量的 key 存储,避免复制大量 embedding
3.3 Embedding Lookup¶
采用 All-to-All 通信实现跨设备 embedding 交换。实现了两步去重(通信前后各一次),最小化重复 ID 传输。
3.4 Load Balance(动态 BS)¶
用户行为序列呈长尾分布,固定 batch size 会导致 GPU 间负载不均。MTGR 引入 dynamic BS:每个 GPU 的 local BS 根据输入实际序列长度动态调整,确保计算负载均衡。梯度聚合时按各 GPU 的 BS 加权。
3.5 其他优化¶
- 三流水线并行:copy stream(CPU→GPU 数据搬运)、dispatch stream(embedding lookup)、compute stream(前向/反向计算),三者重叠执行
- bf16 混合精度训练
- 基于 cutlass 的定制 attention kernel
4. 实验¶
4.1 数据集¶
实验基于美团真实工业数据集,包含丰富的交叉特征和长用户行为序列:
| 数据集 | #Users | #Items | #Exposure | #Click | #Purchases |
|---|---|---|---|---|---|
| Train | 0.21 billion | 4,302,391 | 23.74 billion | 1.08 billion | 0.18 billion |
| Test | 3,021,198 | 3,141,997 | 76,855,608 | 4,545,386 | 769,534 |
离线实验使用 10 天数据,在线实验使用 6 个月以上数据。
4.2 Baseline¶
DLRM 类:
- SIM:基于序列检索的方法
- E2E:端到端建模长序列
- 扩展策略包括:DNN(基础 DNN)、MoE(4 expert,每个 expert 与 DNN 同复杂度)、Wukong(可堆叠的 Wukong layer)、MultiEmbed(多 embedding 策略)、UserTower(可学习 query + 16 expert MoE 用户模块)
MTGR 三种规模:
| Model | Setting | Learning rate | GFLOPs/example |
|---|---|---|---|
| UserTower-SIM | - | $8 \times 10^{-4}$ | 0.86 |
| MTGR-small | $n_{\text{layer}}=3, d_{\text{model}}=512, n_{\text{heads}}=2$ | $3 \times 10^{-4}$ | 5.47 |
| MTGR-medium | $n_{\text{layer}}=5, d_{\text{model}}=768, n_{\text{heads}}=3$ | $3 \times 10^{-4}$ | 18.59 |
| MTGR-large | $n_{\text{layer}}=15, d_{\text{model}}=768, n_{\text{heads}}=3$ | $1 \times 10^{-4}$ | 55.76 |
评估指标:CTR 和 CTCVR(Click-Through Conversion Rate)两个任务,使用 AUC 和 GAUC(Group AUC,按用户分组的 AUC 均值)。
4.3 Overall Performance(Table 3)¶
| Model | CTR AUC | CTR GAUC | CTCVR AUC | CTCVR GAUC |
|---|---|---|---|---|
| DNN-SIM | 0.7432 | 0.6679 | 0.8737 | 0.6504 |
| MoE-SIM | 0.7484 | 0.6698 | 0.8750 | 0.6519 |
| MultiEmbed-SIM | 0.7501 | 0.6715 | 0.8766 | 0.6525 |
| Wukong-SIM | 0.7568 | 0.6759 | 0.8800 | 0.6530 |
| UserTower-SIM | 0.7593 | 0.6792 | 0.8815 | 0.6550 |
| UserTower-E2E | 0.7576 | 0.6787 | 0.8818 | 0.6548 |
| MTGR-small | 0.7631 | 0.6826 | 0.8840 | 0.6603 |
| MTGR-medium | 0.7645 | 0.6843 | 0.8849 | 0.6625 |
| MTGR-large | 0.7661 | 0.6865 | 0.8862 | 0.6646 |
| Impr.% | 0.8956 | 1.0748 | 0.4990 | 1.4656 |
结论:
- 在所有 DLRM 变体中,Wukong-SIM 和 MultiEmbed-SIM 优于 MoE-SIM,UserTower-SIM 表现最佳
- UserTower-E2E 相比 UserTower-SIM 略有下降,推测是 DLRM paradigm 下模型复杂度不足以充分建模全序列信息,导致 underfitting
- MTGR-small 即超越最强 DLRM baseline(UserTower-SIM),且三个规模的 MTGR 均展现良好的可扩展性,性能随复杂度平滑提升
- 最佳 MTGR(large)相比最强 DLRM baseline 的提升(Impr.%):CTR GAUC +1.07%,CTCVR GAUC +1.47%(在工业场景中,0.001 的离线指标提升被视为显著)
4.4 Ablation Study(Table 4)¶
| Model | CTR AUC | CTR GAUC | CTCVR AUC | CTCVR GAUC |
|---|---|---|---|---|
| MTGR-small | 0.7631 | 0.6826 | 0.8840 | 0.6603 |
| w/o cross features | 0.7495 | 0.6689 | 0.8736 | 0.6514 |
| w/o GLN | 0.7606 | 0.6809 | 0.8826 | 0.6585 |
| w/o dynamic mask | 0.7620 | 0.6810 | 0.8828 | 0.6587 |
结论:
- 去除交叉特征后性能大幅下降(CTR GAUC: 0.6826→0.6689,下降 0.0137),甚至抹去了 MTGR-large 相比 DLRM 的优势,证明交叉特征在真实推荐系统中至关重要
- 去除 GLN 导致性能下降(CTR GAUC 下降 0.0017,CTCVR GAUC 下降 0.0018),说明分组归一化对异构 token 建模有效
- 去除 Dynamic Masking 也导致类似程度下降,说明信息泄露防护的必要性
- GLN 和 Dynamic Masking 的消融幅度相当,都是 MTGR 的重要组件
4.5 Scalability(Figure 3)¶
基于 MTGR-small 分别调整三个超参数:
- HSTU block 数量(2→8):CTCVR GAUC 从 ~0.659 平滑上升到 ~0.662
- $d_{\text{model}}$(128→1024):CTCVR GAUC 从 ~0.654 平滑上升到 ~0.661
- 序列长度(100→5000):CTCVR GAUC 从 ~0.655 平滑上升到 ~0.663
Figure 3(d) Scaling Law:以 UserTower-SIM 为基准,横轴为计算复杂度的对数倍数 $\log_2(\text{flops})$,纵轴为 CTCVR GAUC 增益。数据点呈现清晰的幂律关系(power-law),验证了 MTGR 具备 scaling law 特性。
4.6 Online Experiments(Table 5)¶
在美团外卖平台部署,A/B 测试占 2% 流量,日曝光量达数百万。对比 baseline 为持续训练 2 年以上的最先进 DLRM 模型(UserTower-SIM)。MTGR 使用 6 个月数据训练。
| Model | Offline CTR GAUC diff | Offline CTCVR GAUC diff | Online PV_CTR | Online UV_CTCVR |
|---|---|---|---|---|
| MTGR-small | +0.0036 | +0.0154 | +1.04% | +0.04% |
| MTGR-medium | +0.0071 | +0.0182 | +2.29% | +0.62% |
| MTGR-large | +0.0153 | +0.0288 | +1.90% | +1.02% |
结论:
- 尽管 MTGR 的训练数据量远少于 DLRM baseline,离线和在线指标仍大幅超越
- MTGR-large:离线 CTCVR GAUC 提升 +0.0288,在线 UV_CTCVR +1.02%(UV_CTCVR 是衡量业务增长最关键的指标)
- 随训练 token 数增加,MTGR 相比 DLRM 的优势持续放大
- MTGR-large 已全面部署上线,训练成本与 DLRM 持平,推理成本降低 12%
- 对比 DLRM:DLRM 推理成本与候选数量线性相关;MTGR 通过用户聚合实现亚线性推理成本
5. 核心贡献总结¶
- MTGR 框架:首次在 GRM 架构中保留 DLRM 的交叉特征,通过将交叉特征嵌入候选 token 实现两者优势的统一
- Group-Layer Normalization (GLN):对不同语义空间的 token 分组归一化,提升异构信息的建模能力
- Dynamic Masking:基于静态/动态序列分类的灵活掩码策略,防止信息泄露并保持高效注意力
- TorchRec 优化:动态哈希表、动态 BS、三流水线并行等系统优化,训练吞吐提升 1.6x-2.4x
- 工业验证:在美团外卖主流量上线,转化量提升 1.22%,CTR 提升 1.31%,推理成本降低 12%,是近两年最大的排序模型收益