尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

PyTorch和TensorFlow怎么选?从环境搭建到实战部署的完整路径

PyTorch和TensorFlow怎么选?从环境搭建到实战部署的完整路径 先直接说一个我这两年观察下来最深的体会PyTorch 和 TensorFlow 并不是一道“二选一”的送命题而是一道“在什么阶段、用什么工具”的流程题。很多入门者会在同一个下午经历这样一幕先看到 PyTorch 官网的动态图教程觉得“这才是人写的代码”转头又看到 TensorFlow 在工业部署、移动端推理上的生态觉得“不学这个好像没法落地”。于是桌面堆满了十几个安装教程网页收藏夹里躺着“pytorch安装教程gpu版本”和“虚拟环境安装tensorflow”折腾到深夜最后连import torch和import tensorflow都没有同时在虚拟环境里跑通。这类问题的本质不是不会装而是不知道为什么要装、装完先拿来干什么。这篇文章不会替你站队也不会用“二选一”来制造焦虑。我会把两个框架的环境搭建、最小实战、进阶用法和常见报错串成一条完整路径让你看完之后可以自己判断在什么场景下以谁为主在什么场景下必须把另一个也接进来。1. 先搞清楚两个框架真正代表的两种工作方式1.1 PyTorch 的优势来自“研究回路”PyTorch 能够成为过去几年学术论文和竞赛代码的主力不是因为它某个 API 写得更短而是因为它把“调试”这件事做得很顺手。你可以把一个模型的前向传播过程想象成一条生产流水线。TensorFlow 早期采用静态图模式相当于先把整条流水线画成图纸再让机器按照图纸一次性跑完。图纸一旦定稿想中途插入一个print看看中间结果就得把图纸重新设计一遍。PyTorch 的动态图机制则更像直接在车间里调试每一个节点在运行的时候都可以被暂停、检查、修改你可以在任意一行代码后面输出张量的形状和数值。这种差异对新手和研究场景非常重要。比如热搜词里反复出现的“pytorch 实现 transformer”“pytorch 手写数字识别”很多教程之所以选择 PyTorch原因不是 TensorFlow 不能做而是 PyTorch 可以用更少的样板代码把核心逻辑暴露出来。你可以边写边验证逻辑对了再继续往下写。1.2 TensorFlow 的阵地是“生产链路”TensorFlow 的价值不在“写起来爽”而在“交付出去以后怎么办”。当你训练完一个模型接下来要面对的是模型如何保存成固定格式、如何在服务端用高性能接口部署、如何在手机或嵌入式设备上运行、如何和已有的 Java/C/Go 服务打通。这些环节正是 TensorFlow 生态积累最厚的地方。TF Serving、TFLite、TensorFlow.js 这些工具链解决的都是“模型离开训练环境之后还能不能高效工作”的问题。所以你会发现一个很有意思的现象很多在 PyTorch 里做完实验的团队最后部署时会选择把权重转换到 TensorFlow 或者 ONNX再接到生产环境。这不是说 PyTorch 不能部署而是 TensorFlow 的部署链路更成熟、文档更完整、历史案例更多。1.3 “我全都要”的真正含义“全都要”不等于在同一个项目里混用两个框架也不等于同时深入学习两套完整的生态。更合适的理解是用 PyTorch 解决研究和快速验证用 TensorFlow/Keras 解决部署兼容和跨语言场景。在本地机器上完全可以通过 conda 创建多个独立虚拟环境一个装 PyTorch一个装 TensorFlow。它们互不干扰你需要哪套就激活哪个环境。这一步我们下一节详细讲。2. 先把环境跑通安装才是第一道分水岭从热搜词里可以看到“安装”是绝大多数人遇到的第一道坎。pytorch安装教程gpu版本、tensorflow 2.18 安装、anaconda配置pytorch环境、5060安装pytorch、cpu版pytorch安装……这些问题本质上都在问同一个事情我的电脑装哪个版本才匹配2.1 先看清显卡驱动和 CUDA再谈安装无论你装哪个框架GPU 版的第一步都不是打开官网而是先看显卡驱动能支持到哪个 CUDA 版本。在命令行输入nvidia-smi输出的右上角会显示当前驱动支持的 CUDA 版本比如CUDA Version: 12.4。这个数字是一个“上限”它告诉你你后续安装的 CUDA 运行库、PyTorch 或 TensorFlow 的 CUDA 版本只要不高于这个数字通常都可以正常工作。这里有一个新手最常踩的坑以为nvidia-smi显示的 CUDA 就是已经装好的 CUDA。实际上它只代表驱动默认支持的版本你还需要在虚拟环境里安装对应 CUDA 版本的 PyTorch 或 TensorFlow 包。很多安装教程会提醒“先装 CUDA”但在今天的包管理机制下PyTorch 和 TensorFlow 的官方安装命令通常会一并带上所需 CUDA 运行库你不需要单独去 NVIDIA 官网下载整套 CUDA Toolkit。2.2 用 conda 建立隔离环境两个框架都能装在真实项目中不建议直接往 base 环境里装深度学习框架。因为 PyTorch、TensorFlow 以及不同版本的 CUDA 依赖互相覆盖很容易出现“装完 TensorFlow 后 PyTorch 启动报错”的鬼故事。推荐的做法是创建两个独立环境conda create -n torch_env python3.10 -y conda create -n tf_env python3.10 -y随后分别激活对应的环境安装框架。两个环境互相隔离即使一个环境的依赖被搞坏也不会影响另一个。2.3 安装 PyTorch官网命令要对准自己的系统PyTorch 官方首页提供了安装命令生成器。你选择操作系统、包管理工具和 CUDA 版本它就会给出对应命令。需要留意的是默认选项可能是 CPU 版本。如果你的显卡支持 CUDA要手动选择对应的 CUDA 版本。例如在 Linux 上使用 pip 安装 CUDA 12.x 对应的版本命令形式类似pip install torch torchvision torchaudio如果你在 Windows 上安装路径同样从官网生成即可。如果你在国内网络环境下下载速度慢可以考虑配置国内 PyPI 镜像源。这里要提醒一句不要随便使用来路不明的第三方 whl 包尤其是那些打着“破解”“加速”“一键安装”旗号的资源。5060安装pytorch这类关键词的出现说明很多用户用的是较新的显卡。新显卡的驱动一般会比较新反而更容易匹配新版 PyTorch。真正容易出问题的反而是 NVIDIA 老显卡在最新框架版本中不再被支持需要回退 PyTorch 版本。2.4 安装 TensorFlow记住 CPU 和 GPU 可能要走不同命令TensorFlow 的安装路径稍有不同。最简单的做法是pip install tensorflow这条命令会根据你的系统选择 CPU 或 GPU 版本。对于大多数环境来说它能识别出正确的目标平台。部分 Linux 系统上如果你不需要 GPU也可以显式安装tensorflow-cpu包体积更小、依赖更少。至于热搜词里出现的tensorflow 2.18 安装这更像是当前某个版本的示例。落地时千万不要只看版本号更重要的是确认你选择的 TensorFlow 版本和 Python 版本、CUDA 版本之间是否兼容。通常官方文档会给出明确的版本对应表安装前先看一眼比报错后再搜索“tensorflow 2.18 安装失败”高效得多。2.5 特殊硬件的适配Jetson 和昇腾jetson jetpack 6.2.2 安装什么版本 pytorch是一个很有代表性的问题。Jetson 这类嵌入式平台不会使用普通的 pip 安装方式而是需要从 NVIDIA 发布的 PyTorch 预编译包安装并且要与 JetPack 版本严格对应。安装前需要先确认 JetPack 版本再到对应论坛或官方仓库地址找对应的.whl文件。因为这类平台的 GPU 架构和桌面显卡不同直接用 PyTorch 官网命令通常无法识别 CUDA。类似地国内有昇腾 NPU 的场景也会看到“https://gitcode.com/ascend/pytorch/releases/... ”这类仓库地址。这类适配版本解决的问题是如何把 PyTorch 代码跑到非 NVIDIA 硬件上。使用这类版本时最重要的是看清楚它对应的 PyTorch 版本和 CANN 版本。如果目标项目本来用的就是最新版 PyTorch而适配包只支持到某个旧版本你就需要权衡是降级 PyTorch 版本还是换一种部署方案。表格总结一下常见的选型组合场景推荐方案说明桌面新显卡如 RTX 5060新版 PyTorch CUDA 12.x先看nvidia-smi确认驱动上限仅 CPU 开发/学习pip install torch/pip install tensorflow-cpu不装 CUDA 相关包避免环境混乱Jetson 嵌入式平台从 NVIDIA 官方仓库安装对应 JetPack 版本不要用普通 pip 命令昇腾 NPU安装昇腾适配版 PyTorch确认版本匹配 CANN部署模型服务TensorFlow Serving 或 ONNX Runtime训练用 PyTorch部署再做转换3. 最小实战用同一个分类任务打通两个框架环境配置完成后不要急着去啃一万行代码。先写一个最小的手写数字识别项目把两个框架各自的数据加载、模型定义、训练循环和输出流程跑通。这一步的价值不是教你写模型而是让你建立“这个框架到底长什么样”的手感。3.1 PyTorch 最小模型像写普通 Python 一样定义网络PyTorch 定义一个神经网络本质上就是定义一个继承自torch.nn.Module的类。你只需要实现__init__和forward两个方法。import torch import torch.nn as nn import torch.nn.functional as F class SimpleCNN(nn.Module): def __init__(self): super().__init__() self.conv1 nn.Conv2d(1, 32, 3) self.fc nn.Linear(32 * 13 * 13, 10) def forward(self, x): x F.relu(self.conv1(x)) x F.max_pool2d(x, 2) x x.view(x.size(0), -1) return self.fc(x)这段代码的阅读顺序几乎是直线的先定义一个卷积层再定义一个线性层前向传播时依次经过卷积、激活、池化、展平、全连接。整个过程可以直接在 Jupyter Notebook 里逐行调试。训练循环的骨架大致如下model SimpleCNN() optimizer torch.optim.Adam(model.parameters()) loss_fn nn.CrossEntropyLoss() for epoch in range(3): for x, y in train_loader: optimizer.zero_grad() out model(x) loss loss_fn(out, y) loss.backward() optimizer.step()对新手来说PyTorch 最有价值的一点是所有中间张量都可以直接用print查看不需要额外工具。3.2 TensorFlow/Keras 最小模型像组装积木一样搭网络TensorFlow 中第二代的 Keras API 把模型定义变成了非常直观的流程。你可以用Sequential把各层依次连接import tensorflow as tf model tf.keras.Sequential([ tf.keras.layers.Conv2D(32, 3, activationrelu, input_shape(28, 28, 1)), tf.keras.layers.MaxPooling2D(), tf.keras.layers.Flatten(), tf.keras.layers.Dense(10) ]) model.compile( optimizeradam, losstf.keras.losses.SparseCategoricalCrossentropy(from_logitsTrue) ) model.fit(train_dataset, epochs3)和 PyTorch 相比Keras 把训练循环、梯度更新、批次处理都封装进了compile和fit两个方法里。对一个初学者来说同等功能下 Keras 的代码量更少。但这种“少”也会带来一个副作用你不太清楚训练循环内部到底发生了什么。一旦出现奇怪的 loss 或梯度问题排查的难度反而会上升。3.3 两者的心智模型差异这里可以做一个不精确但很有用的类比PyTorch 更像手动挡汽车。你需要理解何时换挡、何时踩离合但正因为你全程参与你对车辆的运行机理更了解遇到异常时也能更快定位。TensorFlow/Keras 更像自动挡汽车。日常使用非常省心大多数情况下它都能正常工作。但如果你遇到变速箱逻辑层面的问题能做的事就比较有限更多时候需要依赖文档和社区经验。所以我的建议是入门阶段可以先从 PyTorch 入手手推一遍训练循环当你想快速验证一个想法、或者需要把模型快速接到服务里时再用 Keras 写一个等价的版本。两边都跑通了你对“深度学习框架”这件事的理解会瞬间立体起来。4. 进阶实战从“会跑”到“能用来解决问题”“会跑”只是第一步。真正的分水岭出现在你开始处理真实任务时数据不整齐、模型要调参、训练过程要保存、推理完要批量输出。这个阶段两个框架的差异会变得具体。4.1 用 PyTorch 实现 Transformer 模块理解注意力机制热搜词里有“pytorch 实现 transformer”“a generic attention module for a decoder in seq2seq pytorch”这其实是很多人学习 Transformer 时会写的代码。理解 Attention 最好的方式不是看论文而是自己实现一个最简单的缩放点积注意力模块。import torch import torch.nn.functional as F class Attention(nn.Module): def __init__(self, hidden_dim): super().__init__() self.hidden_dim hidden_dim def forward(self, query, key, value, maskNone): scores torch.matmul(query, key.transpose(-2, -1)) / (self.hidden_dim ** 0.5) if mask is not None: scores scores.masked_fill(mask 0, float(-inf)) weights F.softmax(scores, dim-1) return torch.matmul(weights, value)这个模块虽然短但它包含了注意力机制的核心query和key做点积得到相似度缩放后经过 softmax 变成权重再用权重加权value。用 PyTorch 实现这个逻辑每一步的形状变化都是可见、可调试的。这对理解 Transformer 的底层原理非常重要。4.2 冻结模型参数迁移学习的典型操作热搜词里还有“pytorch冻结部分模型”。这个操作在迁移学习里非常常见用预训练模型提取特征只训练最后一层分类器。在 PyTorch 中冻结参数的方法很直接for param in model.parameters(): param.requires_grad False for param in model.classifier.parameters(): param.requires_grad True然后在训练时只把requires_gradTrue的参数传给优化器。这样做能大幅减少训练时间同时利用预训练模型在大量数据上学到的通用特征。TensorFlow 中也有类似能力。你可以先加载预训练模型base_model设置base_model.trainable False然后在上面添加新的全连接层。区别在于PyTorch 需要你手动控制“哪些参数要更新梯度”TensorFlow 则通过层的trainable属性来管理。前者更灵活后者更省心。4.3 批量推理模板从单张图片到一个文件夹“pytorch 图像批量推理模板”是一个特别接地气的需求。训练完成后面对一个文件夹里的几十张图片你需要一种稳定的方式批量读取、推理、输出结果。一个常见写法如下from torchvision import transforms from PIL import Image import os transform transforms.Compose([ transforms.Resize((224, 224)), transforms.ToTensor(), ]) for img_name in os.listdir(images): img Image.open(os.path.join(images, img_name)) input_tensor transform(img).unsqueeze(0) with torch.no_grad(): output model(input_tensor) pred output.argmax(dim1).item() print(img_name, pred)这段代码里最关键的一点是torch.no_grad()。推理时不需要计算梯度它能显著减少内存占用并提高速度。如果要做更工业化的批量推理不要满足于在 Python 循环里逐张处理建议考虑 DataLoader 或 TensorFlow 的tf.data它们能利用多进程和预取机制提升吞吐量。4.4 PyTorch Lightning减少样板代码但不放弃底层控制“pytorch lightning csdn”也进入了热搜词。PyTorch Lightning 的本质是一套组织代码的框架它把训练循环、验证循环、日志记录等样板代码封装起来让你专注于模型结构、数据处理和实验配置。使用 Lightning 之后你的代码会变得更结构化、更接近工程标准。但是要注意Lightning 不是 PyTorch 的替代品而是它的上层封装。如果你还没有写过 10 次以上原生 PyTorch 训练循环不建议一开始就上 Lightning。先理解底层再使用封装才能判断封装到底帮你省了什么、又隐藏了什么。5. 二选一的正确姿势从需求出发做决策前面花了大量篇幅讲“怎么把两边都跑起来”现在回到标题里那个问题到底应该怎么选5.1 决策表先看场景再看框架你的目标更推荐理由打基础、做实验、快速验证 ideaPyTorch动态图调试方便社区论文代码大多是 PyTorch把模型部署到服务端/移动端TensorFlowTF Serving、TFLite 生态更完整已有项目是 Keras 写的TensorFlow兼容性好迁移成本低团队里有部署平台用 ONNXPyTorch 或 TensorFlow 均可通过 ONNX 导出统一格式嵌入式设备Jetson取决于 JetPack 版本通常 PyTorch 支持较及时但要查官方发布国内云计算平台上使用看平台提供哪种优化包有些平台对 TensorFlow/PyTorch 分别有定制优化这张表的结论不是“PyTorch 一定好”或“TensorFlow 一定好”而是先确定你要解决什么场景再看哪个框架在这个场景里最少被坑。5.2 我的建议以 PyTorch 为主线把 TensorFlow 作为兼容能力如果只从学习效率角度出发我个人更建议以 PyTorch 为主线。原因有三点学习资料密度更高。过去几年顶会和开源代码的默认语言已经向 PyTorch 倾斜你在 GitHub 上找到一个项目大概率可以直接用 PyTorch 跑起来。动态图更适合理解。对于初学者能看到每一步计算过程和中间结果比一个抽象、打包好的高层 API 更有利于建立直觉。从研究到部署之间有一层转换工具。当你想把 PyTorch 模型部署到服务端时可以先导出 ONNX再用 ONNX Runtime 或转换到 TensorFlow Serving 生态。你不必因为一个部署需求而放弃 PyTorch 带来的开发效率。但这不意味着 TensorFlow 可以完全不学。如果你的职业方向偏向传统企业服务、端侧部署、跨语言集成TensorFlow 的经验会变得越来越重要。正确路径是先把一个框架用到足以解决实际问题的水平再花时间学会另一个框架的基础用法。两个都会不是负担而是你在不同技术路线之间切换时的选择权。5.3 从一个最小课程开始而不是从框架对比开始很多人的学习误区是把“选框架”当成了学习的第一步花了两天时间对比 PyTorch 和 TensorFlow 的优缺点却始终没有写出一行真正的代码。更合理的顺序是选一个入门任务比如手写数字识别。先用 PyTorch 把这个任务完整跑通。再花一天时间用 TensorFlow/Keras 写一个等价版本。感受两者在 API、调试、部署上的差异。遇到实际项目时按照项目和团队的约束再决定主力框架。这样学完之后你脑子里会留下一条经验链路什么场景下 PyTorch 更顺手什么场景下 TensorFlow 更省事。这种第一手的感觉比任何一份框架对比表格都可靠。6. 安装和运行报错按顺序排查而不是搜遍全网这一节专门说说报错。无论是 PyTorch 还是 TensorFlow安装阶段和运行阶段的报错都遵循同一个排查思路我把它总结成一条链路。6.1 排查链路现象 → 输入 → 环境 → 参数 → 工具边界第一步看现象。是命令装不上还是装上了但import报错还是训练时 GPU 不可用先弄清楚是哪一层出了问题。第二步看输入。安装命令是否和官网生成的一致Python 版本是否匹配nvidia-smi显示的驱动版本是否支持所需 CUDA第三步看环境。当前是否激活了正确的 conda 环境pip list里是否出现过两个不同来源的 torch 包之前是否安装过其他深度学习框架第四步看参数。训练或推理代码里的设备是否明确指定为cuda批量大小是否过大导致显存溢出输入张量形状是否和模型定义一致第五步看工具边界。PyTorch 版本对 Python 版本的要求、TensorFlow 对 CUDA/cuDNN 的版本要求、Jetson 的 JetPack 对应关系。这些问题单看报错信息很难定位必须在安装前就做功课。6.2 高频报错和对应处理报错一ModuleNotFoundError: No module named torch常见原因是没有在正确的虚拟环境里安装或者安装过程中断。先检查当前 Python 环境路径which python pip list | grep torch如果确认环境正确但模块缺失直接重新执行安装命令。报错二CUDA driver too old这通常意味着 PyTorch 或 TensorFlow 要求的新版 CUDA 已经超过当前驱动的支持上限。解决方法不是重装驱动而是安装一个对应旧版 CUDA 的框架版本。比如你的驱动只支持 CUDA 11.8就不要装需要 CUDA 12.x 的 PyTorch。报错三libcudnn.so: cannot open shared object file这个报错经常出现在 TensorFlow 安装中是因为 cuDNN 版本与 TensorFlow 期望的版本不一致。如果使用 pip 安装 TensorFlow通常会自动携带匹配的依赖遇到此问题优先尝试升级或降级 TensorFlow 版本。报错四PyTorch 2.6 中weights_only相关提醒这里需要展开讲一下因为原文搜索里出现了 “(1) in pytorch 2.6, we changed the default value of theweights_onlyargum”。这是什么意思呢PyTorch 在加载模型权重时从某个版本开始把weights_only参数的默认值改成了更安全的设置目的是避免加载恶意 pickle 文件导致任意代码执行。听起来抽象实际影响是如果你之前用torch.load(path)加载的模型在新的 PyTorch 版本里可能会遇到新报错或提示。解决办法很简单如果模型文件是你自己训练的可以显式传入weights_onlyFalse如果是从网上下载的模型文件强烈建议保持weights_onlyTrue或者校验文件来源后再加载。这个变化对于安全实践是好事。模型文件本质上是一段可以被反序列化的数据一旦被恶意构造就可能在加载过程中执行任意代码。对于生产环境最好统一使用经过验证的模型仓库而不是随意从网上下载.pth文件。6.3 验证结果每个环境都要能跑通最小示例修好报错后不要直接训练大模型。先跑一个最小验证代码import torch print(torch.__version__) print(torch.cuda.is_available()) print(torch.cuda.get_device_name(0) if torch.cuda.is_available() else CPU)import tensorflow as tf print(tf.__version__) print(tf.config.list_physical_devices(GPU))这两段代码能确认三件事框架是否装好、GPU 是否可用、当前环境是否是你预期的那一个。把这些验证跑通后再继续下一步。7. 别被二选一绑架去解决具体问题回到开头那个问题。PyTorch 和 TensorFlow 的“战争”在网络讨论里被无限放大但对真正使用它们的人来说这两个框架更像不同工具箱里的扳手和螺丝刀。你不需要因为家里有一套改锥就不买扳手也不需要把两套工具全部背在包里才敢开工。任何工具类框架的学习路径最后都会收敛到同一个判断它能不能帮你把一个具体问题从想法变成可用结果。如果你的目标是快速学习深度学习的核心概念、调通一个 Transformer、做一个图像分类应用那 PyTorch 足以成为你的主线如果你的目标是进入大规模服务化部署、端侧推理或跨语言项目TensorFlow 的生态绝对不是可有可无的选项。所以我的最终建议很具体先创建两个隔离的 conda 虚拟环境。把 PyTorch 和 TensorFlow 都装好跑通最小验证代码。用手写数字识别任务分别完成一次“数据加载 → 模型定义 → 训练 → 推理”的完整流程。之后再根据实际项目需求决定以谁为主。这个过程至少会让你获得一个真实的好处下次再看到“二选一”“封神”这类标题你知道它们更关心的是流量而不是你的学习路线。你手里同时握着两个可运行的环境心里自然就有了判断力。
返回列表