一、框架分野:当推荐系统遇上大模型

在AI技术演进的版图中,PyTorch和TensorFlow的定位正在发生深刻变化。过去,业界普遍认为“TensorFlow适合工业部署,PyTorch适合学术研究”,但这一格局已被大模型浪潮彻底改写。

根据行业数据,截至2025年,约60%的深度学习研究论文使用PyTorch作为实验框架,而大模型相关开源项目也从2024年的135个精简到114个,资源和注意力进一步向主流框架集中。更重要的是,随着生成式推荐等新范式的兴起,传统推荐系统(以TensorFlow为主力)与大模型(以PyTorch为核心)正在走向深度融合——这给技术选型和架构设计带来了全新的挑战。

两者的核心差异可以这样理解:TensorFlow在稀疏特征处理和大规模分布式训练上有深厚积累,PyTorch在Transformer架构和Attention优化上处于绝对领先地位。在生成式推荐等跨界场景中,单一框架已难以胜任全部需求。


二、TensorFlow的阵地:大规模稀疏推荐

2.1 优势领域

TensorFlow在传统推荐系统领域积累了十余年的生态优势,尤其是在大规模稀疏Embedding处理方面。以微信Gauss团队的经验为例,TensorFlow生态中存在TFRA扩展,可支持百亿量级动态变化的词向量,这在个性化推荐场景中是不可或缺的基础能力。

import tensorflow as tf
from tensorflow.keras import layers

# 大规模稀疏特征处理示例
class RecommendModel(tf.keras.Model):
    def __init__(self, vocab_size, embedding_dim):
        super().__init__()
        # 稀疏Embedding层——TensorFlow的看家本领
        self.user_embedding = layers.Embedding(
            vocab_size, embedding_dim,
            embeddings_initializer='uniform'
        )
        self.item_embedding = layers.Embedding(
            vocab_size, embedding_dim,
            embeddings_initializer='uniform'
        )
        self.dense = layers.Dense(1, activation='sigmoid')
    
    def call(self, user_ids, item_ids):
        user_vec = self.user_embedding(user_ids)
        item_vec = self.item_embedding(item_ids)
        # 内积计算相似度
        score = tf.reduce_sum(user_vec * item_vec, axis=-1)
        return self.dense(score)

2.2 局限性

然而,TensorFlow在大模型相关的技术上明显落后。大模型社区已实质上抛弃了TensorFlow,导致所有针对Transformer的开源优化(如FlashAttention)基本都只有PyTorch版本。此外,TensorFlow的开发复杂度较高,尤其在自定义算子开发方面,与PyTorch的易用性差距明显。


三、PyTorch的崛起:从大模型到推荐系统

3.1 核心优势:FlashAttention与动态图

PyTorch在大模型时代的统治地位,源于三个核心因素:动态计算图带来的灵活性FlashAttention等核心优化技术的原生支持、以及Triton等自定义算子工具链的成熟

在生成式推荐训练中,约70%的时间消耗在Attention相关的计算上。PyTorch生态中原生支持FlashAttention,而TensorFlow无法直接使用。这一差距在实践中被进一步放大——微信Gauss团队基于PyTorch重构推荐流水线后,训练速度相比TensorFlow实现提升了3倍,推理吞吐提升数十倍。

import torch
import torch.nn as nn
from flash_attn import flash_attn_qkvpacked_func

class PyTorchAttentionLayer(nn.Module):
    """使用FlashAttention的PyTorch Attention层"""
    def __init__(self, d_model, nhead):
        super().__init__()
        self.nhead = nhead
        self.d_model = d_model
        self.qkv_proj = nn.Linear(d_model, 3 * d_model)
        
    def forward(self, x):
        # FlashAttention原生支持——PyTorch生态独有优势
        qkv = self.qkv_proj(x).reshape(
            x.shape[0], x.shape[1], 3, self.nhead, -1
        )
        output = flash_attn_qkvpacked_func(qkv, dropout_p=0.0, causal=True)
        return output

3.2 补齐短板:动态Embedding与部署

过去,PyTorch在推荐场景的短板是大规模稀疏Embedding支持不足。但这一差距正在被快速弥合:

  • TorchRec:PyTorch官方扩展引入了动态词向量支持,降低了入门门槛
  • AOTInductor:PyTorch 2.x版本发布的AOTInductor特性,基于预编译技术可将模型编译为二进制动态库,训练与推理一致性得到充分保障,撕下了“PyTorch不易部署”的标签
import torch
import torchrec
from torchrec.modules.embedding_modules import EmbeddingBagCollection

# PyTorch + TorchRec 处理大规模稀疏特征
class PyTorchRecModel(torch.nn.Module):
    def __init__(self, num_embeddings, embedding_dim):
        super().__init__()
        self.ebc = EmbeddingBagCollection(
            tables=[
                torchrec.EmbeddingBagConfig(
                    name="user_table",
                    embedding_dim=embedding_dim,
                    num_embeddings=num_embeddings,
                    feature_names=["user_id"]
                )
            ]
        )
        self.fc = torch.nn.Linear(embedding_dim, 1)
    
    def forward(self, features):
        embeddings = self.ebc(features)["user_id"].values()
        return torch.sigmoid(self.fc(embeddings))

四、双轨并行:多框架协同的工业实践

当业务同时涉及传统推荐和大模型推理时,双框架协同往往是最优解。

以京东零售的Oxygen 9N-LLM训练引擎为例,其核心设计思路正是深度融合TensorFlow与PyTorch双框架:利用TensorFlow的稀疏Embedding生态处理TB级推荐特征,同时利用PyTorch生态加速Transformer计算和强化学习流程。该框架已支撑10万级序列、10TB级稀疏参数的生成式推荐模型训练,MFU(硬件算力利用率)最高达40%以上。

# 架构示意:双框架协同的抽象层设计
class HybridTrainingEngine:
    """
    多框架混合调度引擎
    - 稀疏部分使用TensorFlow生态
    - 稠密Transformer部分使用PyTorch
    """
    def __init__(self):
        # TensorFlow处理稀疏Embedding
        self.tf_embedding = self._build_tf_sparse_part()
        # PyTorch处理稠密Transformer
        self.pt_dense = self._build_pt_dense_part()
    
    def forward(self, sparse_inputs, dense_inputs):
        # Step 1: TF处理稀疏特征
        sparse_emb = self.tf_embedding(sparse_inputs)
        # Step 2: 转换为PyTorch Tensor
        dense_emb = torch.from_numpy(sparse_emb.numpy())
        # Step 3: PyTorch处理稠密计算
        output = self.pt_dense(dense_emb, dense_inputs)
        return output

五、框架选型决策框架

场景 推荐框架 理由
纯推荐系统(CTR预估、召回) TensorFlow 稀疏Embedding生态成熟,TFRA支持百亿级词表
LLM预训练/微调 PyTorch FlashAttention、DeepSpeed、FSDP等核心优化原生支持
生成式推荐(新范式) PyTorch 或 双框架 Transformer占主导,需PyTorch生态
已有TF上线链路、规模较小 保持TensorFlow 迁移成本需权衡
需要快速自定义算子 PyTorch Triton + PyTorch极大降低开发门槛

避坑指南

常见问题 解决方案
PyTorch稀疏Embedding性能不足 使用TorchRec或对接外部PS(参数服务器)
TensorFlow无法使用FlashAttention 考虑迁移至PyTorch或使用TFRT等替代方案
双框架协同增加工程复杂度 在服务层做抽象隔离,训练层通过统一数据格式对接
模型上线推理延迟高 PyTorch可使用AOTInductor编译为静态库部署

六、总结

PyTorch和TensorFlow的竞争格局已趋于清晰:PyTorch主导研究和LLM领域,TensorFlow在传统推荐系统和部分工业场景仍保有优势。在生成式推荐等新范式中,两者正在走向深度融合——这不是谁取代谁的问题,而是如何协同发挥各自优势的工程命题。

对大多数AI应用开发者而言,建议以PyTorch为核心构建大模型能力,借助TorchRec补齐稀疏处理短板,在不得不使用TensorFlow的场景中通过服务层做隔离和适配。框架的终极目标是服务业务,而非信仰之争。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐