尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

深度学习入门选 PyTorch 还是 TensorFlow?框架选型与部署实践指南

深度学习入门选 PyTorch 还是 TensorFlow?框架选型与部署实践指南 这个问题几乎是每年都会来一轮入门深度学习到底学 TensorFlow 还是 PyTorch我先把结论放在前面如果你是刚接触深度学习的小白想一步步理解模型是怎么训练的建议把 PyTorch 作为主框架如果你后续要进入工业部署、嵌入式设备或者公司已经有 TensorFlow 的存量系统那 TensorFlow 也需要认真学。下面我会从原理、安装、最小项目、部署和排障五个维度展开尽量让你看完之后能自己做出决定而不是跟着热度走。1. 先搞清楚两个框架的本质差异而不是只看热度1.1 动态图与静态图一个像 Python一个像编译型流程PyTorch 的核心是动态计算图。简单地说你写代码的时候计算过程也在同步执行中间变量可以直接打印调试体验接近普通 Python 程序。这对新手非常关键因为深度学习的大部分报错都发生在中间张量的形状、类型和数值上能直接看到张量解决问题就快一半。TensorFlow 1.x 时代是纯静态图你需要先把完整的计算图定义好再放到 Session 里运行中间变量不能随便打印。虽然 TensorFlow 2.x 引入了 Eager Execution 和 Keras让代码写起来已经接近动态执行但我发现很多网上教程还是老版本的习惯一会儿用 placeholder一会儿用 Session新手照着敲很容易被版本问题劝退。1.2 学术生态与工业生态两边各有主战场学术界和开源社区PyTorch 的使用率很高。你在 GitHub 上看到的论文复现代码很多都是 PyTorchHuggingFace 的 Transformers 库虽然也支持 TensorFlow但默认示例和社区解答大多以 PyTorch 为主。如果你做 NLP 或 CV 方向用 PyTorch 意味着你能更顺利地跑通开源代码。TensorFlow 的强项在生产部署。TensorFlow Serving 可以做稳定、成熟的模型服务TensorFlow Lite 可以把手写模型压缩成移动端或嵌入式设备能跑的格式TensorFlow.js 可以在浏览器里跑模型。这些工具链在工业场景里沉淀了很多年很多大型系统还是用 TensorFlow 在维护。不过这个差距在缩小。PyTorch 有 TorchServe、TorchScript也可以通过 ONNX 导出模型到各种推理引擎。对入门阶段来说不用一上来就把部署工具链分得太清楚但你需要知道这是后期选择框架时的一个重要考量。1.3 初学者最关心的其实是调试体验我见过不少新手因为框架选错而浪费时间其中一大半不是框架本身不行而是报错太难看懂。PyTorch 的报错信息一般是 Python 风格的会直接指向某个张量在哪个文件哪一行出现问题TensorFlow 的报错在某些版本里会堆一大段 C 栈信息新手根本不知道从哪里开始查。所以入门阶段我更建议让“调试友好”这个因素占用更多的权重。2. 入门者选框架之前先明确三个问题2.1 你的目标学习、比赛、科研还是就业不同目标的结论不一样。如果单纯想理解深度学习的核心概念比如张量、梯度、损失、优化器我建议选 PyTorch。因为它的代码更接近逻辑本身你写loss.backward()就能看到梯度是怎么反向传播的写optimizer.step()就能看到参数更新。整个过程没有太多隐藏封装理解起来更快。如果想参加 Kaggle 比赛PyTorch 在公开代码中的占比很高你随便搜一个比赛的上游方案基本都是 PyTorch。直接用 PyTorch 可以避免先转换代码的麻烦。如果想找算法类岗位尤其是视觉、自然语言处理、多模态方向PyTorch 几乎是默认要求。但如果你的目标岗位是传统推荐系统、广告系统或者偏工程部署TensorFlow 在很多公司仍有存量代码这个要看具体岗位要求。不要只看岗位写了什么最好去调研目标公司的技术栈。2.2 你的硬件和系统这决定了安装体验框架选得再好装不上也是白搭。Windows 下两个框架都能装但 GPU 版本都需要额外处理 CUDA。Linux 下配置相对顺利Ubuntu 22.04、24.04 是常见环境网上资料多。Mac 用户如果用的是 M 系列芯片PyTorch 可以用 MPS 后端加速TensorFlow 也有对应插件但很多第三方库对 Mac 的支持不一定及时。如果你的电脑没有独立显卡或者显卡显存比较小也没关系。入门阶段用 CPU 跑小型模型完全够用只是训练时间会长一些。建议先安装 CPU 版本把项目和代码流程跑通之后再根据需求装 GPU 版本。不要一上来就折腾驱动和 CUDA很容易在环境配置上消耗掉学习热情。2.3 你想做的方向CV、NLP、语音还是推荐PyTorch 在计算机视觉、自然语言处理、扩散模型这些方向的开源代码最多。TensorFlow 在 TensorFlow Hub 上也有很多预训练模型但相比 PyTorch 生态社区活跃度要弱一些。当你确定方向后可以做一个很有效的判断去 GitHub 搜索你感兴趣方向最近半年的开源项目统计一下哪个框架使用占比更高。如果十个项目里有八个是 PyTorch那你的主要时间应该放在 PyTorch 上。这个判断标准比看任何技术博客都直接。从这一点可以看出框架不是信仰而是工具。选框架的最终目的是让你能尽快跑通项目、理解原理不要为了“哪个更主流”花太多时间纠结。3. 本地安装先装 Python 和虚拟环境再装框架3.1 为什么必须用虚拟环境Python 的包依赖非常容易冲突。你可能一个项目需要 numpy 1.24另一个项目需要 numpy 2.x如果都装在系统 Python 里很快会乱套。虚拟环境就是把每个项目的依赖隔离开。我建议使用 Miniconda而不是直接装 Anaconda。Miniconda 更轻量而且能用conda create -n env_name python3.10精确指定 Python 版本。如果不喜欢 conda也可以使用 Python 自带的venv但 conda 在管理 CUDA 相关依赖时更省心尤其是 Linux 下安装cudatoolkit这类包时。创建环境的基本流程是conda create -n dl python3.10 conda activate dl之后所有安装都在这个环境里进行不会污染系统其他项目。3.2 PyTorch 安装去官网复制命令别用旧教程PyTorch 的安装方式经常随版本变化。最稳妥的方法始终是打开 PyTorch 官网首页选择你的操作系统、包管理器pip 还是 conda、CUDA 版本网站会生成对应的安装命令直接复制到终端执行。不要直接pip install torch因为你可能会装到 CPU 版本。如果你有 NVIDIA 独立显卡一般选择 CUDA 12.x 的版本。具体的 CUDA 版本可以查nvidia-smi右上角的驱动版本所支持的最高 CUDA 版本然后选择 PyTorch 支持的合适版本。这里的规则是驱动版本向下兼容 PyTorch 编译的 CUDA 版本并不是要求完全相等。安装完用这段代码验证python -c import torch; print(torch.__version__); print(torch.cuda.is_available())如果输出True说明 GPU 可用。如果输出False别急着卸先看驱动再看安装命令最后确认环境是不是你当前激活的那个。3.3 TensorFlow 安装版本差异大照着官网走TensorFlow 的安装命令也很简单pip install tensorflow这条命令会安装 TensorFlow 2.x包含 CPU 支持和部分 GPU 支持。但要注意Windows 上从某个版本开始GPU 支持不再通过 pip 自动提供具体可以参考 TensorFlow 官方说明。在 Linux 上可以使用类似pip install tensorflow[and-cuda]的方式安装带 CUDA 支持的版本但这条命令对环境有额外要求不一定适合所有系统。所以我的建议是安装 TensorFlow 前先花十分钟看官方安装文档。不要盲目复制一篇两年前博客里的命令TensorFlow 的依赖要求变化很快。3.4 四个常见安装坑提前避开第一个是 pip 下载速度慢。可以临时使用国内镜像源比如pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple但不建议全局换源因为有些镜像同步有延迟。第二个是安装完成后import tensorflow报 DLL 加载失败。在 Windows 上通常是缺少 Visual C 运行库或者 CUDA 相关 DLL 没有被正确找到先装运行库再检查环境变量。第三个是import torch正常但torch.cuda.is_available()返回 False。最常见原因是驱动版本太老或者 PyTorch 的 CUDA 版本与当前驱动不匹配。用nvidia-smi先看驱动能支持到多少版本再用 CPU 版先跑通项目之后再处理 GPU。第四个是在 Ubuntu 上“安装驱动后没反应”。先跑一下nvidia-smi如果提示找不到命令说明驱动没装上或者没有正确生效如果能看到显卡信息再看内核是否更新导致驱动模块要重新编译。这个问题经常不是框架造成的而是系统驱动环境的问题。4. 学习阶段怎么选用最小项目跑通训练闭环4.1 用 PyTorch 实现线性回归深度学习入门不一定要一上来就上 ResNet、Transformer。先写一个最简单的线性回归把训练闭环跑通比什么都重要。import torch import torch.nn as nn x torch.linspace(-1, 1, 100).reshape(-1, 1) y 2 * x 1 0.1 * torch.randn_like(x) model nn.Linear(1, 1) loss_fn nn.MSELoss() optimizer torch.optim.SGD(model.parameters(), lr0.01) for epoch in range(100): pred model(x) loss loss_fn(pred, y) optimizer.zero_grad() loss.backward() optimizer.step() if epoch % 20 0: print(epoch, loss.item())这段代码里最关键的不是 API而是四个动作前向传播得到预测值计算损失清空梯度反向传播更新参数。你不需要背代码但要能理解每一行在做什么。4.2 用 TensorFlow/Keras 实现同样的任务Keras 封装得很高代码更短import tensorflow as tf x tf.linspace(-1.0, 1.0, 100) y 2 * x 1 0.1 * tf.random.normal(tf.shape(x)) model tf.keras.Sequential([ tf.keras.layers.Dense(1, input_shape(1,)) ]) model.compile(optimizersgd, lossmse) model.fit(x, y, epochs100, verbose0)model.fit帮你处理了训练循环看起来确实方便。但对新手来说这种方便有代价你会很难理解梯度更新到底发生在哪里。一旦遇到训练不收敛、loss 变成 NaN、梯度爆炸之类的问题就不容易排查。4.3 为什么我建议先学显式的训练循环我的经验是入门阶段应该选“暴露细节更多”的框架而不是“隐藏细节更多”的框架。PyTorch 的训练循环是显式的你被迫去理解 forward、loss、backward、step 的关系。等你理解了再用 Keras 的compile/fit会非常轻松因为你知道背后发生了什么。反过来如果你一开始只用 Keras确实能很快跑出一个模型但后续读论文代码、自定义损失函数、改训练逻辑时会明显感觉吃力。所以我的判断标准是如果你打算认真理解深度学习主框架选 PyTorch如果只是希望快速体验一下“模型训练”这个过程Keras 也不是不能选但后续还是要补上底层原理。4.4 怎么判断项目真的跑通了很多人说“代码跑完了”但不知道结果是正常还是异常。这里给几个判断标准loss 曲线要下降。如果你打印 loss发现前几个 epoch 很高后面逐步变小说明训练在收敛。最终 loss 要稳定在一个偏小的范围内而不是来回跳动特别大。如果 loss 变成 NaN通常是学习率太大或者其他数值问题。用训练好的模型对一条新数据做预测看结果是否接近真实规律。比如上面的线性回归训练完成后预测x0.2输出应该接近1.4。这些判断标准比“有没有报错”更重要。哪怕代码没有报错也可能是模型没训练好这需要你从结果去反推问题。5. 项目阶段怎么选训练、导出、部署和端侧推理5.1 模型保存与加载的差异在项目阶段训练完模型只是第一步你还要考虑怎么保存和加载。PyTorch 里模型参数保存为.pth或.pt文件使用torch.save(model.state_dict(), model.pth)加载时先创建相同结构的模型再load_state_dict。TensorFlow/Keras 里model.save(my_model)会生成一个 SavedModel 目录包含权重和计算图加载直接用tf.keras.models.load_model。两者都能用但如果你要把模型交给别人或者部署到不同环境SavedModel 目录携带的信息更完整。5.2 部署工具链取舍TensorFlow 的部署工具链更成熟。TensorFlow Serving 可以用于提供稳定可靠的模型服务官方文档有完善的使用说明TensorFlow Lite 可以转换出较小的.tflite模型支持 Android、iOS、嵌入式设备TensorFlow.js 可以在浏览器中跑推理。这些工具在工业场景里都有大量案例。PyTorch 也有对应的工具TorchServe、TorchScript、ONNX 导出。如果你只是想把模型接到一个 FastAPI 服务里可以直接加载 PyTorch 模型做推理也可以用 ONNX Runtime 提高效率。ONNX 是一个中间格式PyTorch 和 TensorFlow 都支持导出很多实际项目会走 ONNX 到不同推理引擎这个时候框架的选择对部署的锁定效应就没那么强了。5.3 嵌入式设备看硬件平台再决定如果你做的是 Jetson 这类嵌入式平台安装和部署会遇到很多特殊问题。Jetson 上的 JetPack 版本会固定一组 CUDA、cuDNN、TensorRT 版本PyTorch 和 TensorFlow 都需要有针对 ARM 架构的 wheel 包或容器镜像不能直接pip install torch。安装前要先确认 JetPack 版本对应的 Python 版本和 PyTorch 版本否则会出现无法导入或 GPU 识别不到的情况。这种情况下与其纠结 PyTorch 还是 TensorFlow不如先看硬件厂商和社区对哪个框架的支持更完整。比如有些嵌入式推理场景会优先用 TensorRT而 TensorRT 支持从两种框架导出的模型核心问题就变成了“能否顺利导出和转换”。5.4 项目选型判断标准当你进入项目阶段我会建议按这样一个顺序判断你的模型是在训练端跑还是推理端跑训练端选你熟悉的框架推理端看部署环境。目标平台是服务器、浏览器、手机还是嵌入式设备不同平台有不同的工具链偏好。团队里其他同事用什么框架一致性比“哪个更好”重要得多。这个模型有没有现成的高质量代码以能跑通为准不要为了换框架而重写。6. 资源占用和性能用同一套任务对比才有意义6.1 先学会观察资源很多初学者拿到一个框架第一反应是跑一下看速度。但速度对比要建立在“同一环境、同一模型、同一次序”的前提下否则结果没有参考价值。训练时打开任务管理器或者在 Linux 下用watch -n 1 nvidia-smi观察显存占用和 GPU 利用率。你会发现显存占用高不一定代表训练速度快关键是 GPU-Util 那一栏是否经常有较高的数值。如果 GPU-Util 一直很低说明训练可能是数据加载或 CPU 预处理成了瓶颈这时换框架没有意义应该先优化数据管道。6.2 怎么对比 PyTorch 和 TensorFlow 的性能如果你想自己实测可以这样做固定同一个数据集比如 MNIST 或 CIFAR-10。固定同一个模型结构比如一个两层卷积网络。固定 batch size、epoch、优化器、学习率。在相同硬件和版本下分别运行记录单 epoch 耗时、GPU 显存峰值、loss 下降曲线。这样出来的结果有一定参考价值。但要注意两个框架的底层算子实现差异会导致部分模型 PyTorch 快部分模型 TensorFlow 快不能用一个模型的数据去总结“谁更快”。6.3 大多数时候瓶颈不在框架实测中我发现很多训练变慢的问题并不是框架造成的而是数据加载没做并发、batch size 太小、GPU 利用率不高、日志打印太频繁、磁盘读取太慢。先用工具定位瓶颈再决定要不要换框架。一个小技巧在 PyTorch 的 DataLoader 里可以调大num_workers和pin_memory如果显存足够适当增大 batch size让 GPU 尽量不空闲。在 TensorFlow 里可以调节tf.data的预取和并行程度比如dataset.prefetch(tf.data.AUTOTUNE)。这些调整常常比更换框架带来的收益更明显。6.4 低配置机器怎么办如果你只有 4G 显存或者只有 CPU我建议先不要追求速度而是追求“能跑通”。可以这样控制资源batch size 从 16 或 32 开始调显存不足时降低到 8 或 4。图片分辨率不要一上来就拉满先缩小到 224 或 128。训练输出不要每次都打印每 10 个 epoch 打印一次。开启混合精度比如 PyTorch 的torch.cuda.amp可以减少显存占用和计算量。不要同时开多个训练任务。这些经验看起来很小但对新手来说比选哪个框架更影响体验。7. 常见安装和环境问题排查7.1 先看现象再动环境遇到安装或环境问题第一件事不是卸载重装而是记下完整报错。不同错误对应的处理方式完全不同。import 模块直接报错先确认你当前激活的是哪个环境用python -c import sys; print(sys.executable)看路径。提示找不到 CUDA 动态库检查LD_LIBRARY_PATH或 Windows 的系统 PATH。torch.cuda.is_available()返回 False先查驱动再查 PyTorch 安装的 CUDA 版本。TensorFlow 报很多内部错误确认是否使用了与 GPU 驱动不匹配的 CUDA 版本。7.2 在 Windows 上的注意事项Windows 上最容易踩的坑是多个 Python 环境混用。建议只保留 Miniconda通过conda create创建环境然后在 Anaconda Prompt 或终端里conda activate。不要在系统解释器和 conda 环境之间来回切换。如果安装 TensorFlow 后提示缺少 DLL可以先去安装 Microsoft Visual C Redistributable很多情况下能解决问题。如果安装 PyTorch 后 import 很慢不一定是卡住有些版本首次导入要初始化 CUDA多等十几秒。7.3 Ubuntu 22.04 / 24.04 配置顺序这几个版本是最近几年常见的桌面系统。建议大家按这个顺序配置安装 NVIDIA 显卡驱动。nvidia-smi能正常输出显卡信息。安装 Miniconda。创建虚拟环境并指定 Python 版本。安装 PyTorch 或 TensorFlow。安装项目需要的其他依赖。不要先安装 CUDA 工具包再去装驱动那样容易把系统库弄乱。如果驱动安装后“没反应”先看是不是双显卡、BIOS 里有没有禁用独显再看内核更新后原驱动是否失效。可以用dkms status查看内核模块状态。7.4 Jetson 等 ARM 平台的安装Jetson 设备上安装 PyTorch 或 TensorFlow不能照抄普通电脑的命令。JetPack 版本与 CUDA、cuDNN、TensorRT 是绑定的安装前要确认JetPack 版本比如 6.2.2。支持的 Python 版本通常越新 JetPack 对应的 Python 越高。官方是否提供了对应 PyTorch 的 wheel 包或容器镜像。是否需要使用 TensorRT 来加速推理。在这些平台常见问题是 pip 安装了 CPU 版或错误平台的包导致 GPU 不可用。建议先查阅 NVIDIA 官方资料或社区论坛找到匹配版本再安装。7.5 Jupyter 或 IDE 找不到环境很多新手在终端里能 import torch但打开 Jupyter Notebook 后报 ModuleNotFoundError。原因通常是 Jupyter 没运行在 conda 环境里。解决办法是在激活环境后执行python -m ipykernel install --user --name dl --display-name dl之后 Jupyter 的内核选择里就能看到这个环境。Pycharm 也有类似的解释器配置问题记得把项目解释器指向虚拟环境里的 Python。8. 我的最终建议入门阶段到底怎么办8.1 先选 PyTorch 当主线但不排斥 TensorFlow综合前面的原理、安装、项目、部署和排障我给小白的建议是把 PyTorch 作为主框架花时间理解训练过程同时
返回列表