动手学 - 13.深度学习计算性能优化:编译器 vs 解释器


深度学习计算性能优化:编译器 vs 解释器

本节是《动手学深度学习》第 13 章《计算性能》的起点,我们从一个简单但重要的主题出发——理解命令式编程与符号编程的区别,并引出 PyTorch 中混合编程的实践意义。


13.1 编译器和解释器:从计算图看本质

在深度学习模型的训练与推理过程中,性能瓶颈往往不在算子本身,而在于:

  • 代码结构是否可编译?

  • 数据流是否明确?

  • 是否频繁涉及 Python 的解释执行?

让我们从一个最简单的例子开始:

def add(a, b):
    return a + b

def fancy_func(a, b, c, d):
    e = add(a, b)
    f = add(c, d)
    g = add(e, f)
    return g

print(fancy_func(1, 2, 3, 4))  # 输出:10

从图 13.1.1 中可以看出,这段代码构建了一个明确的数据流图:

a, b → e = a + b
c, d → f = c + d
e, f → g = e + f

这是一种典型的**命令式编程(Imperative Programming)**方式。


13.1.1 命令式 vs 符号式编程

✅ 命令式编程的特点:

  • 执行即求值:一行代码执行一行,执行顺序清晰。

  • 调试友好:支持 print、pdb 等传统调试手段。

  • 开发者体验好,适合快速实验和原型设计。

❌ 命令式编程的缺点:

  • 运行时解释成本高:每次调用都走 Python 解释器,容易成为性能瓶颈;

  • 优化难度大:无法提前知道数据流依赖,影响自动图优化(如内存复用、张量融合等);

  • 不可移植性:依赖 Python 环境,不易部署至嵌入式端或其他平台。


✅ 符号式编程(Symbolic Programming)的优势:

  • 定义 + 编译 + 执行的三段式流程;

  • 预先构建完整计算图,可做图优化、自动并行、图融合等高级编译优化;

  • 更容易导出为中间格式,如 ONNX 或 TensorRT。

典型框架:TensorFlow(1.x)、Theano、MXNet HybridBlock


13.1.2 混合编程的理想世界

为了结合两者优势,现代深度学习框架逐步引入了“混合编程”能力。比如:

  • PyTorch → torch.jit.script

  • MXNet → HybridSequential + hybridize()

  • TensorFlow 2.x → @tf.function

🚀 案例:PyTorch 中的 JIT 编译器

import torch
from torch import nn

net = nn.Sequential(
    nn.Linear(512, 256),
    nn.ReLU(),
    nn.Linear(256, 128),
    nn.ReLU(),
    nn.Linear(128, 2)
)

net = torch.jit.script(net)  # 开启符号图模式
x = torch.randn(1, 512)
y = net(x)

在保持原有接口的同时,JIT 编译器能将你的模型转化为 TorchScript IR(中间表示),大幅提高执行效率并支持序列化部署。


13.1.3 编译器优化与运行时加速

混合模式的关键收益:

  • ✅ 将 Python 转化为低层图表达;

  • ✅ 提前内联中间变量;

  • ✅ 避免 Python for-loop,自动向量化;

  • ✅ 支持跨平台序列化与部署。

Benchmark 对比:

# 非编译模式下:单线程执行 1000 次 MLP
Without torchscript: 2.1447 sec

# 编译后执行:同样 1000 次
With torchscript: 0.4512 sec

显然,TorchScript 模型执行速度提升数倍,尤其在多 GPU、推理部署、延迟敏感场景中表现突出。


13.1.4 小结

特性命令式编程符号式编程
编写难度简单,接近原生 Python较复杂,需提前构建图结构
调试体验非常友好较差
性能较低,解释器开销大高,可编译优化
部署可移植性差,依赖 Python 运行环境好,可导出 ONNX、TorchScript
场景适用研究实验、调试阶段工业部署、嵌入式推理

在实际应用中,我们推荐开发阶段使用命令式编程以提升开发效率;而在部署或性能优化阶段,切换为符号图编译模式,从而获得可调试 + 高性能的统一体验。


📌 下一节预告:
在 13.2 节中我们将进入异步计算的世界,探讨深度学习中如何通过任务重排、延迟执行等策略,进一步提升吞吐与响应能力。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏驰和徐策

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值