torch.compile用法

简介

torch.compile 通过 JIT 将 PyTorch 代码编译成优化的内核,使 PyTorch 代码运行得更快。加速主要来自减少了 Python 开销和 GPU 读/写,因此观察到的加速可能因模型架构和批量大小等因素而异。例如,如果一个模型的架构很简单并且数据量很大,那么瓶颈将是 GPU 计算并且观察到的加速可能不那么显着。

要求torch>2.0,还需要安装torchtriton。

用法

编译函数

import torch

def foo(x, y):
    a = torch.sin(x)
    b = torch.cos(x)
    return a + b

opt_foo1 = torch.compile(foo)
print(opt_foo1(torch.randn(10, 10), torch.randn(10, 10)))

#直接用装饰器的方式也可以
@torch.compile
def opt_foo2(x, y):
    a = torch.sin(x)
    b = torch.cos(x)
    return a + b
print(opt_foo2(torch.randn(10, 10), torch.randn(10, 10)))

编译类

class MyModule(torch.nn.Module):
    def __init__(self):
        super().__init__()
        self.lin = torch.nn.Linear(100, 10)

    def forward(self, x):
        return torch.nn.functional.relu(self.lin(x))

mod = MyModule()
opt_mod = torch.compile(mod)
print(opt_mod(torch.randn(10, 100)))

优化案例

def timed(fn):
    start = torch.cuda.Event(enable_timing=True)
    end = torch.cuda.Event(enable_timing=True)
    start.record()
    result = fn()
    end.record()
    torch.cuda.synchronize()
    return result, start.elapsed_time(end) / 1000

# Generates random input and targets data for the model, where `b` is
# batch size.
def generate_data(b):
    return (
        torch.randn(b, 3, 128, 128).to(torch.float32).cuda(),
        torch.randint(1000, (b,)).cuda(),
    )

N_ITERS = 10

from torchvision.models import resnet18
def init_model():
    return resnet18().to(torch.float32).cuda()

def evaluate(mod, inp):
    return mod(inp)

model = init_model()

# Reset since we are using a different mode.
import torch._dynamo
torch._dynamo.reset()

evaluate_opt = torch.compile(evaluate, mode="reduce-overhead")

inp = generate_data(16)[0]
print("eager:", timed(lambda: evaluate(model, inp))[1])
print("compile:", timed(lambda: evaluate_opt(model, inp))[1])

#eager: 4.2023056640625
#compile: 10.3568037109375

注意,torch.compile 与 eager 相比,好像需要更长的时间才能完成,这是因为 torch.compile 在执行时需要将模型编译成优化的内核。在这个示例中,模型的结构没有改变,因此不需要重新编译,多次运行优化的模型再与 eager 相比,应该会看到显着的改进。

eager_times = []
compile_times = []
for i in range(N_ITERS):
    inp = generate_data(16)[0]
    _, eager_time = timed(lambda: evaluate(model, inp))
    eager_times.append(eager_time)
    print(f"eager eval time {i}: {eager_time}")

print("~" * 10)

compile_times = []
for i in range(N_ITERS):
    inp = generate_data(16)[0]
    _, compile_time = timed(lambda: evaluate_opt(model, inp))
    compile_times.append(compile_time)
    print(f"compile eval time {i}: {compile_time}")
print("~" * 10)

import numpy as np
eager_med = np.median(eager_times)
compile_med = np.median(compile_times)
speedup = eager_med / compile_med
print(f"(eval) eager median: {eager_med}, compile median: {compile_med}, speedup: {speedup}x")
print("~" * 10)

根据所选的 mode 参数,您还可能会看到不同的加速结果。由于这里的模型和数据都很小,如果希望尽可能减少开销,所以选择选择了 "reduce-overhead". 对于您自己的模型,您可能需要尝试不同的模式以最大化加速。torch.compile 支持三种模式:

  • 默认模式是一种预设,它会尝试在不花费太长时间编译或使用额外内存的情况下高效编译。
  • reduce-overhead 可以大大减少框架的开销,但会消耗少量的额外内存。
  • max-autotune 编译很长时间,试图为您提供它可以生成的最快代码。
<think>好的,用户的问题是关于如何解决PyTorch中的DeprecationWarning,特别是用torch.compile替代TorchScript的功能优化器。首先,我需要确认用户提到的警告具体是什么样子的,可能是在使用旧版的TorchScript功能优化器时出现的。根据PyTorch的更新,TorchScript的功能优化器已经被弃用,推荐使用torch.compile来替代。 接下来,我需要回忆PyTorch的文档和相关资料,了解torch.compile的使用方法。TorchScript的功能优化器可能指的是之前通过torch.jit.script或者类似的方法来优化模型执行效率,但现在PyTorch引入了torch.compile作为更高效且易用的替代方案。 用户需要的是具体的替换方案和示例代码。首先,应该解释为什么会出现这个警告,然后说明如何修改代码。例如,原来的代码可能使用了torch.jit.script来编译模型,现在应该改用torch.compile。同时,可能需要调整一些参数,比如设置mode参数为'default'、'reduce-overhead'或'max-autotune',以优化性能。 另外,用户可能关心如何验证替换后的效果,比如提升运行速度或减少警告。需要提供示例代码,展示旧方法和新方法的对比,并说明如何测试性能差异。例如,使用timeit模块测量执行时间,或者检查警告是否消失。 还需要注意用户提到的环境配置,比如引用了XTuner和相关库的安装命令,这可能意味着用户在使用特定的深度学习框架或工具,需要确保torch.compile与这些工具兼容。可能需要提醒用户检查PyTorch的版本是否满足要求,因为torch.compile是在PyTorch 2.0及更高版本中引入的。 最后,总结步骤:识别弃用警告的来源,替换旧代码为torch.compile,调整参数优化性能,验证结果,并处理可能的兼容性问题。同时,生成相关问题帮助用户进一步理解,比如如何选择mode参数,调试编译后的模型,或处理其他弃用警告。</think>在 PyTorch 中遇到与 TorchScript 功能优化器相关的弃用警告时,可以通过以下步骤替换为 $torch.compile$ 进行优化: 1. **警告原因分析** TorchScript 的功能优化器(如基于脚本的静态图优化)已被标记为弃用,推荐使用动态图优化工具 $torch.compile$。该工具通过即时编译(JIT)技术实现更高效的执行[^1]。 2. **代码改造示例** ```python # 旧方法(触发警告) model = torch.jit.script(model) # 新方法(使用 torch.compile) model = torch.compile(model, mode="reduce-overhead") # 模式可选:default/reduce-overhead/max-autotune ``` 3. **性能优化验证** ```python # 测试编译效果 with torch.no_grad(): compiled_model = torch.compile(model) # 首次运行触发编译(耗时较长) output = compiled_model(input_tensor) # 后续运行使用优化后的计算图 start_time = time.time() for _ in range(100): output = compiled_model(input_tensor) print(f"Average time: {(time.time()-start_time)/100:.6f}s") ``` 4. **兼容性处理** 若遇到动态控制流(如循环、条件分支),建议添加装饰器 $@torch.compile(backend="eager")$ 逐步调试。注意需要 PyTorch ≥ 2.0 版本支持该特性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值