Python深度学习框架
先聊聊TensorFlow吧。2.0版本之后确实友好多了,eager execution模式让调试不再像猜谜游戏。前几天帮学弟搭个CNN,用keras接口三下五除二就搞定了,tf.data那套数据管道用顺手之后确实香。不过要说痛点,自定义层的时候还是得跟@tf.function装饰器斗智斗勇,有时候梯度莫名消失的问题能排查一整天。最近在尝试TPU训练,发现配置环境这块还是有点门槛,官方文档虽然详细但容易看晕。
PyTorch这边就灵动多了。去年复现一篇顶会论文的时候,那种即写即运行的感觉真的拯救生产力。特别是做注意力可视化的时候,直接对中间变量切片查看,比用tf.debugging直观太多。不过部署时踩过坑,转ONNX格式遇到算子不支持,最后只能重写部分网络结构。好在现在TorchScript越来越成熟,最近做的移动端项目用libtorch部署挺顺利。
说到易用性,Keras确实对新手特别友好。但很多人不知道的是,自从并入TF后,其功能也在不断强化。自定义训练循环现在也能玩得很溜,配合混合精度训练能让3080显卡多跑两倍batch_size。不过要是想做模型蒸馏这类进阶操作,还是得老老实实啃TF底层API。
MXNet和PaddlePaddle这两年也在闷声发大财。MXNet的Gluon接口设计得很优雅,内存控制尤其出色,在处理大尺寸医学影像时帮过我大忙。Paddle的官方模型库特别丰富,特别是动态图升级之后,中文文档对国内开发者真的很友好。
选型时还得考虑生态。TensorFlow的TFHub上有大量预训练模型,但PyTorch的TorchHub也在快速追赶。做NLP项目时HuggingFace对PyTorch的支持明显更到位,而TensorFlow在端侧推理的TFLite确实生态更成熟。最近还试了JAX,虽然生态还在建设中,但自动微分和向量化确实让人眼前一亮。
实际开发中经常要混搭使用。比如用PyTorch快速原型验证,再用TF serving部署线上服务。有个项目甚至用了ONNX在多个框架间传递模型,虽然中间遇到版本兼容问题掉了几根头发。个人感觉现在更重要的是理解计算图本质,框架不过是个工具罢了。
最近在GitHub扒代码时发现,新出的论文源码PyTorch占比明显更高。但企业级项目里TensorFlow还是稳坐头把交椅,特别是需要跨平台部署的场景。所以建议新手根据应用场景来选:搞科研可以优先PyTorch,要做工业部署还是得啃TensorFlow。
说个实战经验:别盲目追新版本。上次手贱升级TF导致整个项目环境崩掉,回退版本又发现某些API不兼容。现在学会用Docker封装环境了,每个项目独立容器,真香警告。另外多看看框架源码里的测试用例,比很多教程都有用。
最后给个忠告:框架只是工具,真正的功力还是在数学基础和工程能力。见过用最朴素NumPy实现Transformer的大佬,也见过抱着高级框架连损失函数都写不利索的新手。先把反向传播、自动微分这些原理搞明白,再折腾框架才能事半功倍。
更多推荐
所有评论(0)