网易首页 > 网易号 > 正文 申请入驻

Pytorch的编译新特性TorchDynamo的工作原理和使用示例

0
分享至

在深度学习中,优化模型性能至关重要,特别是对于需要快速执行和实时推断的应用。而PyTorch在平衡动态图执行与高性能方面常常面临挑战。传统的PyTorch优化技术在处理动态计算图时效果有限,导致训练时间延长和模型性能不佳。TorchDynamo是一种为PyTorch设计的即时(JIT)编译器,通过在运行时拦截Python代码、优化它,并编译成高效的机器代码来解决这一问题。本文通过使用合成数据集展示了TorchDynamo的实际应用,包括特征工程、超参数调整、交叉验证和评估指标。

TorchDynamo简介

TorchDynamo 是一个由 PyTorch 团队开发的编译器前端,它旨在自动优化 PyTorch 程序以提高运行效率。TorchDynamo 的工作原理是在运行时动态分析和转换 PyTorch 的代码,然后将其转发给各种后端编译器(如 TorchScript、TVM、Triton 等),从而实现性能的提升。

特别是在需要实时执行的应用中,如自动驾驶或金融预测等,深度学习模型要求快速执行。传统的优化技术经常需要在处理Python的动态特性时进行修订,这正是TorchDynamo的强项所在。它能够即时捕获计算图,针对特定的工作负载和硬件应用优化,从而减少延迟并提高吞吐量。

TorchDynamo的另外一个突出特点是其易于集成。重写整个代码库以集成新工具可能是一项艰巨的任务。但是TorchDynamo仅需要对现有的PyTorch工作流进行最小的更改。它的简单性和强大的优化能力使它成为经验丰富的研究人员和行业专业人士的有力选择。

将 TorchDynamo 集成到现有的 PyTorch 程序中相对简单,只需要在程序中导入 TorchDynamo 并使用它来包装模型的执行部分。

import torch
import torchdynamo
# 定义模型和优化器
model = MyModel()
optimizer = torch.optim.Adam(model.parameters())
# 使用 TorchDynamo 优化模型的训练过程
def training_step(input, target):
optimizer.zero_grad()
output = model(input)
loss = loss_fn(output, target)
loss.backward()
optimizer.step()
return loss
# 使用 torchdynamo.optimize 包装训练步骤
optimized_training_step = torchdynamo.optimize(training_step)
# 训练循环
for input, target in data_loader:
loss = optimized_training_step(input, target)

TorchDynamo的工作原理

TorchDynamo通过追踪PyTorch代码的执行,动态地捕获计算图。这个过程涉及理解代码的依赖关系和流程,使其能够识别优化的机会。 应用优化

一旦捕获了计算图,TorchDynamo就会应用各种优化技术。这些技术包括操作符融合,它将多个操作合并为一个单一操作以减少开销,以及改进内存管理,最小化数据移动并有效地重用资源。

优化计算图口,TorchDynamo将其编译成高效的机器码。这种编译可以针对不同的后端,如TorchScript或NVFuser,以确保代码在可用的硬件上以最佳方式运行。

在最后的执行阶段。与最初的Python代码相比,上面的优化可以显著提高性能。JIT编译确保在运行时期间应用这些优化,使执行适应不同的工作负载和输入数据。

使用示例

下面我们演示了使用一个合成数据集的TorchDynamo示例,包括特征工程,超参数调优,交叉验证,预测和结果解释。

import torch
import torch.nn as nn
import torch.optim as optim
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split, KFold
from sklearn.metrics import mean_squared_error, r2_score
from sklearn.preprocessing import StandardScaler
from torch import _dynamo as torchdynamo
from typing import List
# Generate synthetic dataset
np.random.seed(42)
torch.manual_seed(42)
# Feature engineering: create synthetic data
n_samples = 1000
n_features = 10
X = np.random.rand(n_samples, n_features)
y = X @ np.random.rand(n_features) + np.random.rand(n_samples) * 0.1 # Linear relation with noise
# Split data into train and test sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Standardize the features
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
# Convert to PyTorch tensors
X_train = torch.tensor(X_train, dtype=torch.float32)
y_train = torch.tensor(y_train, dtype=torch.float32).view(-1, 1)
X_test = torch.tensor(X_test, dtype=torch.float32)
y_test = torch.tensor(y_test, dtype=torch.float32).view(-1, 1)
# Define the model
class SimpleNN(nn.Module):
def __init__(self, input_dim):
super(SimpleNN, self).__init__()
self.fc1 = nn.Linear(input_dim, 64)
self.fc2 = nn.Linear(64, 32)
self.fc3 = nn.Linear(32, 1)
def forward(self, x):
x = torch.relu(self.fc1(x))
x = torch.relu(self.fc2(x))
x = self.fc3(x)
return x
# Hyperparameters
input_dim = X_train.shape[1]
learning_rate = 0.001
n_epochs = 100
# Initialize the model, loss function, and optimizer
model = SimpleNN(input_dim)
criterion = nn.MSELoss()
optimizer = optim.Adam(model.parameters(), lr=learning_rate)
# Define custom compiler
def my_compiler(gm: torch.fx.GraphModule, example_inputs: List[torch.Tensor]):
print("my_compiler() called with FX graph:")
gm.graph.print_tabular()
return gm.forward # return a python callable
@torchdynamo.optimize(my_compiler)
def train_and_evaluate(model, criterion, optimizer, X_train, y_train, X_test, y_test, n_epochs):
# Training loop with K-Fold Cross-Validation
kf = KFold(n_splits=5, shuffle=True, random_state=42)
train_losses_per_epoch = np.zeros(n_epochs)
val_losses_per_epoch = np.zeros(n_epochs)
kf_count = 0
for train_idx, val_idx in kf.split(X_train):
X_kf_train, X_kf_val = X_train[train_idx], X_train[val_idx]
y_kf_train, y_kf_val = y_train[train_idx], y_train[val_idx]
for epoch in range(n_epochs):
model.train()
optimizer.zero_grad()
y_pred_train = model(X_kf_train)
train_loss = criterion(y_pred_train, y_kf_train)
train_loss.backward()
optimizer.step()
model.eval()
y_pred_val = model(X_kf_val)
val_loss = criterion(y_pred_val, y_kf_val)
train_losses_per_epoch[epoch] += train_loss.item()
val_losses_per_epoch[epoch] += val_loss.item()
kf_count += 1
# Average losses over K-Folds
train_losses_per_epoch /= kf_count
val_losses_per_epoch /= kf_count
# Evaluate on test data
model.eval()
y_pred_test = model(X_test)
test_loss = criterion(y_pred_test, y_test).item()
test_r2 = r2_score(y_test.detach().numpy(), y_pred_test.detach().numpy())
return train_losses_per_epoch, val_losses_per_epoch, test_loss, test_r2
# Run training and evaluation with TorchDynamo optimization
train_losses, val_losses, test_loss, test_r2 = train_and_evaluate(model, criterion, optimizer, X_train, y_train, X_test, y_test, n_epochs)
# Print metrics
print(f"Test MSE: {test_loss:.4f}")
print(f"Test R^2: {test_r2:.4f}")
# Plot results
epochs = list(range(1, n_epochs + 1))
plt.plot(epochs, train_losses, label='Train Loss')
plt.plot(epochs, val_losses, label='Validation Loss')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend()
plt.title('Training and Validation Loss')
plt.show()

我们使用PyTorch定义了一个具有两个隐藏层的简单神经网络。模型使用K-Fold交叉验证来确保稳健的性能。TorchDynamo用于优化训练循环。在单独的测试集上对模型进行评估,并计算MSE和R²等指标。

最后得到的训练和验证损失如下

我们在代码中my_compiler打印了TorchDynamo相关的内容,我们来看看里面到底是什么:

my_compiler() called with FX graph:
opcode name target args kwargs
------------- ---------------------- ----------------------------------- ------------------------------------------------- --------
call_function train_losses_per_epoch

> (100,) {}
call_function val_losses_per_epoch

> (100,) {}
output output output ((train_losses_per_epoch, val_losses_per_epoch),) {}
my_compiler() called with FX graph:
opcode name target args kwargs
------------- ------------- ------------------------------------------------------- ---------------- --------
placeholder l_x_ L_x_ () {}
call_module l__self___fc1 L__self___fc1 (l_x_,) {}
call_function x

(l__self___fc1,) {}
call_module l__self___fc2 L__self___fc2 (x,) {}
call_function x_1

(l__self___fc2,) {}
call_module x_2 L__self___fc3 (x_1,) {}
output output output ((x_2,),) {}
my_compiler() called with FX graph:
opcode name target args kwargs
------------- ----------------------- -------------------------------------------------------- ------------------------------------------ --------------------------------
placeholder grad L_self_param_groups_0_params_0_grad () {}
placeholder grad_1 L_self_param_groups_0_params_1_grad () {}
placeholder grad_2 L_self_param_groups_0_params_2_grad () {}
placeholder grad_3 L_self_param_groups_0_params_3_grad () {}
placeholder grad_4 L_self_param_groups_0_params_4_grad () {}
placeholder grad_5 L_self_param_groups_0_params_5_grad () {}
get_attr param self___param_groups_0__params___0 () {}
get_attr param_1 self___param_groups_0__params___1 () {}
get_attr param_2 self___param_groups_0__params___2 () {}
get_attr param_3 self___param_groups_0__params___3 () {}

FX图的输出表明了模型的结构和操作是如何组织的:

输入0和L_x_是表示输入数据的占位符。

模型通过全连接层L__self___fc1 , L__self___fc2,L__self___fc3传递输入,这是神经网络的三层。

在前两层之后应用ReLU激活函数。

在第三层完全连接后产生最终输出。

总结

对于研究人员和工程师来说,训练大型和复杂的模型可能很耗时。TorchDynamo通过优化计算图和加速执行来减少这种训练时间,允许在更短的时间内进行更多的迭代和实验。在需要实时处理的应用程序中,如视频流或交互式人工智能系统,延迟是至关重要的。TorchDynamo在运行时优化和编译代码的能力确保了这些系统可以平稳运行并快速响应新数据。

TorchDynamo在支持多个后端和硬件架构方面的灵活性使其非常适合在各种环境中部署。无论是在高性能gpu或边缘设备上运行,TorchDynamo适应提供最佳性能。

https://avoid.overfit.cn/post/5fa68ddfeb024f569da6e09ae06c4ee4

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
如今年轻人不怕绝后?复旦研究揭露真相:80%男性难逃断后问题

如今年轻人不怕绝后?复旦研究揭露真相:80%男性难逃断后问题

抽象派大师
2026-10-28 05:06:19
撤销硕士107天后,蒋方舟病房发文:只谈身体困境,不提那9处重合

撤销硕士107天后,蒋方舟病房发文:只谈身体困境,不提那9处重合

寒士之言本尊
2026-10-28 13:31:33
段睿:我一直寄希望于他还能再撑几年,等到我自由,可他等不及了

段睿:我一直寄希望于他还能再撑几年,等到我自由,可他等不及了

秀语千寻
2026-10-21 17:00:43
赖昌星最狠的一招,就是用天价豢养空姐周兵,攻破了海关关长的防线;私生子降生的那一刻,530亿走私帝国的遮羞布被彻底撕碎

赖昌星最狠的一招,就是用天价豢养空姐周兵,攻破了海关关长的防线;私生子降生的那一刻,530亿走私帝国的遮羞布被彻底撕碎

人生录
2026-10-20 00:05:11
石头科技拒解约:皇马傲慢背后的市场误判与品牌风险

石头科技拒解约:皇马傲慢背后的市场误判与品牌风险

带你逛体坛
2026-10-28 11:15:26
突发!北京一老牌面包房即将闭店!

突发!北京一老牌面包房即将闭店!

大北京早知道
2026-10-28 18:01:07
以色列选情胶着 内塔尼亚胡面临“生死局”

以色列选情胶着 内塔尼亚胡面临“生死局”

看看新闻Knews
2026-10-28 17:58:12
三星目前“大跳水”的3款手机,最高降幅3560元,用四五年不淘汰

三星目前“大跳水”的3款手机,最高降幅3560元,用四五年不淘汰

小柱解说游戏
2026-10-28 07:22:16
福建14岁男孩常年反复梦到被人下药,向父母诉说反遭斥责,妹妹随口一句话,意外揭开埋藏多年的隐秘!

福建14岁男孩常年反复梦到被人下药,向父母诉说反遭斥责,妹妹随口一句话,意外揭开埋藏多年的隐秘!

唠叨说历史
2026-10-26 16:45:24
WTT冠军赛:林诗栋绝地反击!0-6落后11-8逆转,连赢2局冲16强!

WTT冠军赛:林诗栋绝地反击!0-6落后11-8逆转,连赢2局冲16强!

刘姚尧的文字城堡
2026-10-27 21:30:09
全球屏息:静待三大央行“摔杯为号”!

全球屏息:静待三大央行“摔杯为号”!

宋鸿兵
2026-10-27 21:54:48
姆巴佩知道吗?今日之中国,早已不是百年前任人轻慢的模样

姆巴佩知道吗?今日之中国,早已不是百年前任人轻慢的模样

兵国大事
2026-10-28 00:20:05
本想涨油价多收税,结果大家少开车,反而收得更少

本想涨油价多收税,结果大家少开车,反而收得更少

生活魔术专家
2026-10-27 04:25:53
事态已经全面升级!赖清德有可能成为新中国历史上,唯一一位在任台湾地区领导人中出现重大变故的人物

事态已经全面升级!赖清德有可能成为新中国历史上,唯一一位在任台湾地区领导人中出现重大变故的人物

人生录
2026-09-11 00:05:21
大田主帅:J联赛的攻防转换速度已经达到了五大联赛的水平

大田主帅:J联赛的攻防转换速度已经达到了五大联赛的水平

懂球帝
2026-10-28 10:13:10
民主党哈里斯领先纽森仅3点,共和党万斯33%居首,特朗普仅8%

民主党哈里斯领先纽森仅3点,共和党万斯33%居首,特朗普仅8%

阿天爱旅行
2026-10-28 00:08:51
70年代敬一丹在宿舍楼前的留影,她柔美的笑容,整个人干净利索

70年代敬一丹在宿舍楼前的留影,她柔美的笑容,整个人干净利索

大江
2026-10-28 17:45:14
博索纳罗败选后赴美 卢拉称逃离巴西“可耻”

博索纳罗败选后赴美 卢拉称逃离巴西“可耻”

国际在线
2026-10-28 13:21:03
火箭领跑西部,乌度卡把杜兰特按在板凳上,申京正负值+29比肩约基奇

火箭领跑西部,乌度卡把杜兰特按在板凳上,申京正负值+29比肩约基奇

刘哥谈体育
2026-10-28 16:58:41
每体:皇马电视台在凯恩获得金球奖后迅速切断直播

每体:皇马电视台在凯恩获得金球奖后迅速切断直播

懂球帝
2026-10-27 18:30:09
2026-10-28 18:36:49
deephub incentive-icons
deephub
CV NLP和数据挖掘知识
2028文章数 1465关注度
往期回顾 全部

科技要闻

AI世界开口说话!谷歌新模型Genie 4有多神

头条要闻

新郎是孤儿担心婚礼冷清邀网友来撑撑场面 数百人到场

头条要闻

新郎是孤儿担心婚礼冷清邀网友来撑撑场面 数百人到场

体育要闻

0胜4负与篮网国王一桌 热火字母哥赌错了?

娱乐要闻

巾帼不让须眉!章子怡拿下重磅荣誉

财经要闻

iPhone Duo七年等来一场吐槽大会

汽车要闻

电动大掀背+无框车门+激光雷达 一汽-大众ID. AURA L5真能打动年轻家庭

态度原创

家居
亲子
教育
数码
游戏

家居要闻

2026建博会(广州) 公装联探展交流活动

亲子要闻

“真想一头撞死在这儿”,全职宝妈晒厨房:人生都浪费在这里了

教育要闻

接纳平凡,是父母最深的温柔

数码要闻

AI时代的轻薄本怎么选?华硕灵耀16 Air 骁龙版值得加入双十一清单

又一经典PS独占被搬上PC!已可完整通关

无障碍浏览 进入关怀版