最近在折腾大模型微调,项目里同事用PyTorch写LoRA,我自己之前一直跟的TF2教程,现在感觉两边的生态差别太大了。HuggingFace的模型基本都是PyTorch权重,转成TF格式总出幺蛾子,比如Embedding层名字对不上,或者自定义层要重写。但公司老代码又是TF的SavedModel部署,Keras的Callback写起来确实省心。想问问各位实际工作中怎么取舍的?是硬着头皮把PyTorch学透,还是继续用TF硬扛着转换?有没有人两个框架都用在生产环境的?求真实经验,别整那些官方文档里的话术。
PyTorch和TensorFlow轮着用,到底该深耕哪个?
全部回复
共 94 条建议主攻PyTorch,TF能跑通部署就行,大模型生态差距只会越拉越大。
我们生产环境两个都跑,但新项目全用PT,TF只维护老服务,转换问题真没必要硬吃。
说个我们组的实际状态吧,两个都在生产环境跑,PyTorch负责研究和训练,TF只留了那套老部署管线。你提到的Embedding层问题我太懂了,最后我们干脆在转换脚本里写了个层名映射表,硬生生维护了半年才稳定下来。真心建议你如果还有得选就主攻PyTorch,现在新模型和工具链几乎全是它先出,省下的折腾时间够你把Keras那点便利补回来。不过要是公司短期不可能换部署栈,那还是得双修,但别想着学透,学精一条主线,另一条能改能用就行。
跟你情况差不多,我在一家做NLP落地的公司,TF的SavedModel部署管线跑了好几年,但新模型全是PyTorch的。我的解法是彻底放弃在TF里跑训练,只把PyTorch模型导出成ONNX,再转成TF Serving能吃的格式。说实话一开始也老碰到Embedding层权重顺序错乱的问题,后来发现是pytorch的embedding默认是随机初始化的,得手动对齐词表索引,现在写了个转换脚本基本能自动化了。但你要说让我现在从头学PyTorch的所有细节,我也没那精力,毕竟Keras的callback写起来是真的省心,像早停、学习率衰减这些都不用自己造轮子。不过要是你有机会主导新项目,我建议还是直接上PyTorch,因为HuggingFace的生态真的是围绕它转的,LoRA微调那些现成脚本改起来太方便了,TF那边经常要自己补一堆兼容层。至于生产环境,我们最后是拆成两个服务,老的用TF跑,新的用PyTorch的TorchServe,中间用消息队列隔开,省得互相踩坑。
学到了,感谢分享!
我跟你情况挺像的,之前也是TF2入的门,后来被HuggingFace逼着转了PyTorch。说实话别纠结深耕哪个,现在这行情是PyTorch在研究和微调这块基本垄断了,你同事用LoRA大概率也是抄的PyTorch代码,转TF纯粹给自己添堵。但你说公司部署是老TF的SavedModel,这我太理解了,我们之前就是硬转,后来发现与其跟Embedding层较劲,不如在PyTorch训完用ONNX导出,再走TF-TRT或者直接换TorchServe,反而省心。不过Keras的Callback确实是真香,PyTorch那个Callback逻辑写起来啰嗦得要命,我到现在还留着TF的习惯处理日志和早停。我的建议是主力学透PyTorch,但别扔TF,毕竟老代码维护和某些场景下TF的静态图部署还是稳。你这转换的坑有没有试过直接转成safetensors再加载?我上次那么搞少了好多报错,不知道你踩的是不是这个雷。
说实话这题我太有感触了,之前也是TF转PyTorch,卡在权重转换上整整一周。后来想通了,微调跟模型走,部署跟代码走,现在训练用PyTorch,导出ONNX再转TF Serving,虽然多一步但省心太多。你如果公司老代码改不动,建议还是把PyTorch学透,毕竟新模型和论文都在那边,LoRA这种玩法TF社区跟进太慢了。
跟你的情况挺像的,我去年也是两头倒腾,最后干脆主攻PyTorch了,TF只留着跑老模型推理。LoRA那块PyTorch确实省心,HuggingFace直接load完事,转TF那个Embedding对齐问题我调了两天才发现是transformer版本不一致导致的,纯浪费时间。不过Keras的callback是真香,我有时候会拿TF写数据预处理管道,训练和部署分开,虽然麻烦点但两边优势都能吃到。你如果公司部署链路已经锁死TF,建议至少把PyTorch的模型加载和权重转换流程跑通,剩下硬啃转换总比重写业务代码强。话说你们生产环境有试过ONNX中转吗?我最近在试这个,感觉能省掉不少框架适配的坑。
别纠结,大模型这块PyTorch已经是事实标准了,TF转来转去纯浪费时间,生产部署用ONNX或Triton兜底就行。
建议主攻PyTorch,TF那边能跑通旧项目就别再投入新学习了,两边都精不现实。
说实话你这个情况我太懂了,两边生态割裂真的磨人。我建议别硬扛转换,花两周把PyTorch的nn.Module和训练循环摸熟,因为HuggingFace的新模型和论文代码基本都先出PyTorch版,长期看省心。但公司部署端可以保留TF,用ONNX或者Triton做中间层,两边都别丢,生产环境各干各的活儿。我自己现在就是训练用PT,推理走TF Serving,中间踩坑无数,但比死磕一个框架强。
别纠结,直接学PyTorch,TF部署用ONNX绕一下就行,真到生产没人管你训练用的啥。
跟你情况差不多,我们生产环境是TF的SavedModel,但新模型全用PyTorch训。我的办法是PyTorch训完直接转ONNX,再走TF的runtime部署,绕开那些权重转换的坑,虽然多一步但稳定多了。
LoRA这块建议还是跟着PyTorch走,HuggingFace的peft库迭代太快,TF那边支持总是慢半拍。你与其纠结转格式,不如把PyTorch的生态吃透,部署那层用ONNX或TFLite做桥接就够了。
至于Keras的Callback省心,我倒觉得PyTorch的Lightning也能做到差不多,只是要重新适应下写法。反正我现在是主力PyTorch,TF只用来跑老代码,两边切换确实烦,但也没办法,工作嘛。
说实话你这情况跟我去年一模一样,最后我是咬牙把主力切到PyTorch了。倒不是TF不好,而是大模型这块的社区惯性太强了,新论文、新权重、新trick几乎都是PT先出,你等TF的适配版本出来黄花菜都凉了。HuggingFace那个转换工具说实话能用,但遇到自定义模型或者老版本op的时候,真的能把人逼疯,我光调一个ALBERT的position embedding就对了一下午。
不过你那边如果部署链路是TF的SavedModel,我建议也别全扔,可以搞个混合方案:训练和实验全走PyTorch,部署的时候用ONNX或者TorchScript转成通用格式,再包一层TF Serving的接口。我们生产环境现在就是PT训练、ONNX中转、TF部署,虽然多一道工序,但两边的好处都占到了。
至于Keras的Callback,说实话那玩意儿写起来确实爽,但等你用多了PT的Trainer和自定义Callback,会发现自由度完全不是一个量级。我现在的感觉是,TF适合快速验证和标准化流水线,PT适合搞研究和应对不按套路出牌的模型。你要是短期要交付,就先把PT学透,毕竟现在招人简历上写熟练PT都比写TF吃香。但别完全放弃TF,万一哪天你们老系统要加新功能,你还能救个火。
这题我太有感触了,之前也是TF转PyTorch,卡在权重转换上浪费了一周。后来干脆把公司老代码的部署层用ONNX包了一下,新模型全走PyTorch,两边互不干扰。你如果做微调多,建议主攻PyTorch,HuggingFace生态绕不开,但部署那层可以找个中间格式过渡,别死磕直接转换。
说个真实情况,我们组就是两个都用在生产环境,PyTorch负责训练和实验,TF SavedModel只留给线上推理。LoRA这种新玩法基本绕不开PyTorch,HuggingFace生态太强势了,转TF纯属自找麻烦。建议你学透PyTorch,但别丢TF的部署技能,毕竟Keras那套写服务确实快。转换问题我后来用ONNX中转,比直接转省心不少,你可以试试。