跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
PythonAI算法

PyTorch JIT 与 TorchScript:实测推理性能提升 50%

PyTorch 推理优化实战。对比了 Eager 模式与 TorchScript 模式在 BERT 和 ResNet 模型上的性能差异。结果显示,TorchScript 通过 JIT 编译和图优化,在 GPU 环境下推理速度提升可达 50%,CPU 环境提升约 4%。此外,TorchScript 支持脱离 Python 环境部署,适用于 C++ 及嵌入式场景。推荐使用 TorchScript 提升生产环境的推理效率,根据模型动态特性选择 trace 或 script 接口。

念念不忘发布于 2025/1/15更新于 2026/8/2249 浏览
PyTorch JIT 与 TorchScript:实测推理性能提升 50%

PyTorch JIT 与 TorchScript:实测推理性能提升 50%

PyTorch 主要支持两种运行模式:Eager Mode(急切模式)和 Script Mode(脚本模式)。Eager 模式适合模型编写、训练和调试,而 Script 模式专为部署设计。Script 模式的核心在于 PyTorch JIT 编译器和 TorchScript 格式。

核心概念

Script 模式通过 torch.jit.trace 或 torch.jit.script 将 PyTorch eager module 转换为中间表示(IR)。这个 IR 经过内部优化,并在运行时由 PyTorch JIT 编译器处理。关键在于,该 IR 与 Python 运行时解耦,这意味着模型可以在没有 Python 解释器的环境中运行。

为什么要用 Script 模式?

  1. 脱离 Python 限制:可以绕过 Python GIL 和运行时开销,例如通过 LibTorch 在 C++ 中运行模型,非常适合 IoT 等嵌入式场景。
  2. 性能优化:JIT 编译器利用运行时信息进行优化,如层融合(Layer Fusion)、量化(Quantization)和稀疏化。通常比原生 PyTorch 模型更快。
  3. 跨平台部署:支持导出为独立文件,甚至可转换为 ONNX 格式在其他框架中运行。
  4. 资源受限环境:针对内存和计算资源受限的设备进行优化。

Trace 与 Script 的区别

这两个函数都是将 Python 代码转换为 TorchScript 的方法,但适用场景不同:

  • torch.jit.trace:基于特定输入(通常是张量)跟踪执行过程,记录计算图。适用于结构固定、输入大小不变的模型(如预训练模型)。
  • torch.jit.script:直接解析 Python 语法并编译。适用于动态图模型,结构和输入可在运行时变化(如 RNN 或变长序列)。

注意:虽然两者各有优势,但在静态图场景下,trace 往往更便捷;而在需要动态控制流时,script 是必须的。

性能实测

为了验证性能差异,我们分别在 CPU 和 GPU 上对比了 Eager 模式和 TorchScript 模式的推理速度。测试硬件为 Google Colab(Intel Xeon @ 2.00GHz, Tesla T4)。

1. BERT 模型测试

使用 HuggingFace 的 BERT 模型作为示例。

from transformers import BertTokenizer, BertModel
import numpy as np
import torch
from time import perf_counter

def timer(f, *args):
    start = perf_counter()
    f(*args)
    return (1000 * (perf_counter() - start))

# 加载原生模型
native_model = BertModel.from_pretrained("bert-base-uncased")

# 加载 TorchScript 模型
script_model = BertModel.from_pretrained("bert-base-uncased", torchscript=True)
script_tokenizer = BertTokenizer.from_pretrained('bert-base-uncased', torchscript=True)

# 准备输入数据
text = "[CLS] Who was Jim Henson ? [SEP] Jim Henson was a puppeteer [SEP]"
tokenized_text = script_tokenizer.tokenize(text)
masked_index = 8
tokenized_text[masked_index] = '[MASK]'
indexed_tokens = script_tokenizer.convert_tokens_to_ids(tokenized_text)
segments_ids = [0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1]
tokens_tensor = torch.tensor([indexed_tokens])
segments_tensors = torch.tensor([segments_ids])

CPU 测试结果:

native_model.eval()
print(np.mean([timer(native_model, tokens_tensor, segments_tensors) for _ in range(100)]))

GPU 测试结果:

native_model = native_model.cuda()
tokens_tensor_gpu = tokens_tensor.cuda()
segments_tensors_gpu = segments_tensors.cuda()
native_model.eval()
print(np.mean([timer(native_model, tokens_tensor_gpu, segments_tensors_gpu) for _ in range(100)]))

对 TorchScript 模型同样进行测试(注意:trace 后无需显式调用 .eval()):

traced_model = torch.jit.trace(script_model, [tokens_tensor, segments_tensors])
print(np.mean([timer(traced_model, tokens_tensor, segments_tensors) for _ in range(100)]))

结果对比:

模式CPU Latency (ms)GPU Latency (ms)
PyTorch (Eager)171.2730.42
TorchScript165.2413.50

数据显示,在 CPU 上 TorchScript 提升了约 3.5%,而在 GPU 上提升了 55.6%。

2. ResNet 模型测试

为了验证结论的普适性,我们使用了 ResNet18 再次测试。

import torchvision
import torch
from time import perf_counter
import numpy as np

def timer(f, *args):
    start = perf_counter()
    f(*args)
    return (1000 * (perf_counter() - start))

# PyTorch CPU 版本
model_ft = torchvision.models.resnet18(pretrained=True)
model_ft.eval()
x_ft = torch.rand(1, 3, 224, 224)
print(f'pytorch cpu: {np.mean([timer(model_ft, x_ft) for _ in range(10)])}')

# PyTorch GPU 版本
model_ft_gpu = torchvision.models.resnet18(pretrained=True).cuda()
x_ft_gpu = x_ft.cuda()
model_ft_gpu.eval()
print(f'pytorch gpu: {np.mean([timer(model_ft_gpu, x_ft_gpu) for _ in range(10)])}')

# TorchScript CPU 版本
script_cell = torch.jit.script(model_ft, (x_ft))
print(f'torchscript cpu: {np.mean([timer(script_cell, x_ft) for _ in range(10)])}')

# TorchScript GPU 版本
script_cell_gpu = torch.jit.script(model_ft_gpu, (x_ft_gpu))
print(f'torchscript gpu: {np.mean([timer(script_cell_gpu, x_ft.cuda()) for _ in range(100)])}')

结果对比:

模式CPU Latency (ms)GPU Latency (ms)
PyTorch (Eager)77.472.99
TorchScript74.241.64

结论一致:CPU 性能提升约 4.2%,GPU 性能提升约 45%。

总结

本次测试重点对比了 PyTorch 的 Eager 模式和 Script 模式。通过 BERT 和 ResNet 两个典型网络在 CPU 和 GPU 上的表现,我们发现:

  1. 部署效率更高:TorchScript 允许模型脱离 Python 环境运行,便于集成到 C++ 服务或嵌入式设备中。
  2. 推理性能显著提升:在 GPU 环境下,TorchScript 相比原生 PyTorch 能获得 50% 左右的推理加速;CPU 环境下也有 4% 左右的提升。
  3. 选择建议:对于静态结构模型,trace 足够高效;涉及动态控制流时,请使用 script。

如果你需要在生产环境中追求极致的推理性能,TorchScript 是一个值得投入的工具。

目录

  1. PyTorch JIT 与 TorchScript:实测推理性能提升 50%
  2. 核心概念
  3. 为什么要用 Script 模式?
  4. Trace 与 Script 的区别
  5. 性能实测
  6. 1. BERT 模型测试
  7. 加载原生模型
  8. 加载 TorchScript 模型
  9. 准备输入数据
  10. 2. ResNet 模型测试
  11. PyTorch CPU 版本
  12. PyTorch GPU 版本
  13. TorchScript CPU 版本
  14. TorchScript GPU 版本
  15. 总结
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • Python 代码打包成可执行文件的六种主流方案及优缺点对比
  • 基于飞算JavaAI实现学生成绩综合统计分析系统的设计与实现
  • 字节跳动大数据开发面试常见问题及技术解析
  • Python 在 Windows 上的安装与 PyCharm 配置指南
  • C 语言内存管理与动态内存分配
  • Java 四年开发:美团百度阿里面试复盘与心得
  • 鸿蒙系统 PC 版安装与使用指南
  • Faster-Whisper 笔记本 CPU 环境模型模式选择指南
  • VLAC:机器人精准完成任务的 AI 评价新模型
  • Stable Diffusion XL 快速部署与使用指南
  • 2025 年 8-9 月计算机领域 EI 学术会议汇总(人工智能、物联网、信号处理等)
  • Rust 性能优化全流程:从 flamegraph 定位瓶颈到 unsafe 与 SIMD 加速
  • 网络安全基础入门与学习路径指南
  • Hadoop HDFS 核心机制与设计理念
  • AI 大模型从零到就业学习路径指南
  • Stable Diffusion 整合包安装与使用指南
  • 私有化部署 FastGPT+OneAPI 构建大模型知识库
  • Android 开发常用开源库推荐与技术解析
  • 飞算 Java AI 安装与项目生成实战指南
  • C++11 核心特性实战:Lambda、可变参数模板与函数包装器

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online