torch.jit.script 与 torch.jit.trace

本文涉及的产品
函数计算FC,每月15万CU 3个月
简介: torch.jit.script 与 torch.jit.trace

torch.jit.script 与 torch.jit.trace

torch.jit.script torch.jit.trace 是 PyTorch 中用于将模型转换为脚本或跟踪模型执行的工具。

它们是 PyTorch 的即时编译(Just-in-Time Compilation)模块的一部分,用于提高模型的执行效率并支持模型的部署。

torch.jit.script

torch.jit.script 是将模型转换为脚本的函数。

它接受一个 PyTorch 模型作为输入,并将其转换为可运行的脚本。转换后的脚本可以像普通的 Python 函数一样调用,也可以保存到磁盘并在没有 PyTorch 依赖的环境中执行。

这种转换的好处是可以减少模型执行过程中的开销,因为它消除了 Python 解释器的开销。

示例:

import torch
# 定义模型
class MyModel(torch.nn.Module):
    def __init__(self):
        super(MyModel, self).__init__()
        self.conv = torch.nn.Conv2d(3, 64, kernel_size=3, padding=1)
        self.fc = torch.nn.Linear(64 * 8 * 8, 10)
    def forward(self, x):
        x = self.conv(x)
        x = torch.nn.functional.relu(x)
        x = x.view(-1, 64 * 8 * 8)
        x = self.fc(x)
        return x
model = MyModel()
# 将模型转换为Torch脚本模块
scripted_model = torch.jit.script(model)
# 调用
output = scripted_model(torch.randn(1, 3, 32, 32))
print(output)
# 保存模型
torch.jit.save(scripted_model, './model/Test/scripted_model.pth')

torch.jit.trace

torch.jit.trace 是跟踪模型执行的函数。

它接受一个模型和一个示例输入,并记录模型在给定输入上的执行过程,然后返回一个跟踪模型。

跟踪模型可以看作是一个具有相同功能的脚本模型,但它还保留了原始模型的动态特性,可以使用更多高级特性,如动态图和控制流。

示例:

import torch
# 定义模型
class MyModel(torch.nn.Module):
    def __init__(self):
        super(MyModel, self).__init__()
        self.conv = torch.nn.Conv2d(3, 64, kernel_size=3, padding=1)
        self.fc = torch.nn.Linear(64 * 8 * 8, 10)
    def forward(self, x):
        x = self.conv(x)
        x = torch.nn.functional.relu(x)
        x = x.view(-1, 64 * 8 * 8)
        x = self.fc(x)
        return x
model = MyModel()
# 将模型转换为Torch脚本模块
traced_model = torch.jit.trace(model, torch.randn(1, 3, 32, 32))
# 调用
output = traced_model(torch.randn(1, 3, 32, 32))
print(output)
# 保存模型
torch.jit.save(traced_model, './model/Test/traced_model.pth')

注意

由于 torch.jit.trace 方法只跟踪了给定输入张量的执行路径,因此在使用转换后的模块对象进行推理时,输入张量的维度和数据类型必须与跟踪时使用的相同。

torch.jit.save

使用 torch.jit.scripttorch.jit.trace 转换后的模块对象可以直接用于推理,也可以使用 torch.jit.save 方法将其保存到文件中,以便在需要时加载模型。

torch.jit.load

使用 torch.jit.load 函数可以加载 PyTorch 模型,该函数可以接收一个模型文件路径或一个文件对象作为输入参数。具体步骤如下:

  • 加载模型文件:
import torch
model = torch.jit.load("model.pt")

这将加载名为 model.pt 的模型文件。

  • 加载模型文件并指定设备:
import torch
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = torch.jit.load("model.pt", map_location=device)

这将加载名为 model.pt 的模型文件,并将其放置在可用的 CUDA 设备上。

  • 加载模型文件并使用 eval 模式:
import torch
model = torch.jit.load("model.pt")
model.eval()

这将加载名为 model.pt 的模型文件,并将其转换为评估模式。

注意:

如果模型使用了特定的设备,例如 CUDA,那么在加载模型时需要确保该设备可用。如果设备不可用,则需要使用 map_location 参数将模型映射到可用的设备上。

Code

import torch
# 定义模型
class MyModel(torch.nn.Module):
    def __init__(self):
        super(MyModel, self).__init__()
        self.conv = torch.nn.Conv2d(3, 64, kernel_size=3, padding=1)
        self.fc = torch.nn.Linear(64 * 8 * 8, 10)
    def forward(self, x):
        x = self.conv(x)
        x = torch.nn.functional.relu(x)
        x = x.view(-1, 64 * 8 * 8)
        x = self.fc(x)
        return x
model = MyModel()
print(model)
# 将模型转换为Torch脚本模块
scripted_model = torch.jit.script(model)
traced_model = torch.jit.trace(model, torch.randn(1, 3, 32, 32))
# 调用
output_scripted = scripted_model(torch.randn(1, 3, 32, 32))
output_traced = traced_model(torch.randn(1, 3, 32, 32))
# 保存模型
torch.jit.save(scripted_model, './model/Test/scripted_model.pth')
torch.jit.save(traced_model, './model/Test/traced_model.pth')
# 加载模型
load_scripted_model = torch.jit.load('./model/Test/scripted_model.pth')
print(load_scripted_model)
load_traced_model = torch.jit.load('./model/Test/traced_model.pth')
print(load_traced_model)
MyModel(
  (conv): Conv2d(3, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
  (fc): Linear(in_features=4096, out_features=10, bias=True)
)
RecursiveScriptModule(
  original_name=MyModel
  (conv): RecursiveScriptModule(original_name=Conv2d)
  (fc): RecursiveScriptModule(original_name=Linear)
)
RecursiveScriptModule(
  original_name=MyModel
  (conv): RecursiveScriptModule(original_name=Conv2d)
  (fc): RecursiveScriptModule(original_name=Linear)
)

说明:

  • RecursiveScriptModule表示一个递归的 TorchScript 模块,类似于一个树形结构。
  • 该模块的原始名称为 MyModel,表示这是一个模型的容器。
  • 该容器包含了两个子模块 convfc,分别是 Conv2dLinear 的递归脚本模块。意味着这两个子模块也是 TorchScript 模块,并可以在 TorchScript 中进行运算。
  • RecursiveScriptModule 可以通过 torch.jit.scripttorch.jit.trace 将 PyTorch 模型转换为 TorchScript 模块。在转换过程中,每个子模块也会被转换为相应的 TorchScript 模块,并嵌套在父模块中。
  • 这种嵌套结构可以很好地表示深度学习模型的层次结构。
  • RecursiveScriptModule中的模块名称和原始名称可以通过original_name属性进行访问。
  • 例如,MyModel 的原始名称是 MyModelconv 模块的原始名称是 Conv2dfc 模块的原始名称是 Linear
相关实践学习
【AI破次元壁合照】少年白马醉春风,函数计算一键部署AI绘画平台
本次实验基于阿里云函数计算产品能力开发AI绘画平台,可让您实现“破次元壁”与角色合照,为角色换背景效果,用AI绘图技术绘出属于自己的少年江湖。
从 0 入门函数计算
在函数计算的架构中,开发者只需要编写业务代码,并监控业务运行情况就可以了。这将开发者从繁重的运维工作中解放出来,将精力投入到更有意义的开发任务上。
目录
相关文章
|
机器学习/深度学习 并行计算 PyTorch
TensorRT部署系列 | 如何将模型从 PyTorch 转换为 TensorRT 并加速推理?
TensorRT部署系列 | 如何将模型从 PyTorch 转换为 TensorRT 并加速推理?
1780 0
|
自然语言处理 物联网 Swift
零一万物开源Yi-VL多模态大模型,魔搭社区推理&微调最佳实践来啦!
近期,零一万物Yi系列模型家族发布了其多模态大模型系列,Yi Vision Language(Yi-VL)多模态语言大模型正式面向全球开源。
|
缓存
MNN 执行推理(九)
MNN 执行推理(九)
173 1
|
机器学习/深度学习 自然语言处理 PyTorch
PyTorch 中的动态图与静态图:理解它们的区别及其应用场景
【8月更文第29天】深度学习框架中的计算图是构建和训练神经网络的基础。PyTorch 支持两种类型的计算图:动态图和静态图。本文旨在阐述这两种计算图的区别、各自的优缺点以及它们在不同场景下的应用。
2900 0
|
机器学习/深度学习 数据可视化
【tensorboard】深度学习的日志信息events.out.tfevents文件可视化工具
【tensorboard】深度学习的日志信息events.out.tfevents文件可视化工具
|
12月前
|
机器学习/深度学习 人工智能 算法框架/工具
NVIDIA Triton系列01-应用概论
NVIDIA Triton推理服务器为AI服务类应用提供全面解决方案,支持多种处理器、框架及模型类型,优化部署与性能,适用于在线推荐、图像分类等场景。文中介绍了Triton在微软Teams、微信视觉应用及腾讯PCG在线推理中的成功案例,展示其在提升性能、降低成本方面的显著效果。
371 0
NVIDIA Triton系列01-应用概论
|
12月前
|
PyTorch TensorFlow API
大模型中 .safetensors 文件、.ckpt文件、.gguf和.pth以及.bin文件区别、加载和保存以及转换方式
本文讨论了大模型中不同文件格式如`.safetensors`、`.ckpt`、`.gguf`、`.pth`和`.bin`的区别、用途以及如何在TensorFlow、PyTorch和ONNX等框架之间进行加载、保存和转换。
3609 2
|
机器学习/深度学习 PyTorch TensorFlow
ONNX 与量化:提高模型效率
【8月更文第27天】随着人工智能技术的广泛应用,模型部署变得越来越重要。为了在资源受限的设备上运行复杂的机器学习模型,模型量化技术成为了一种有效的手段。Open Neural Network Exchange (ONNX) 作为一种开放格式,支持在不同框架之间交换训练好的模型,同时也支持模型量化。本文将探讨如何结合 ONNX 和模型量化技术来提高模型的效率,减少模型大小并加快推理速度。
2021 2
在Linux中,有一堆日志文件,如何删除7天前的日志文件?
在Linux中,有一堆日志文件,如何删除7天前的日志文件?
|
机器学习/深度学习 并行计算 PyTorch
ONNX 优化技巧:加速模型推理
【8月更文第27天】ONNX (Open Neural Network Exchange) 是一个开放格式,用于表示机器学习模型,使模型能够在多种框架之间进行转换。ONNX Runtime (ORT) 是一个高效的推理引擎,旨在加速模型的部署。本文将介绍如何使用 ONNX Runtime 和相关工具来优化模型的推理速度和资源消耗。
5928 4