标签: torchscript

torchscript中的torch.jit.trace和torch.jit.script有什么区别?

Torchscript 提供了 torch.jit.trace 和 torch.jit.script 将 pytorch 代码从 eager 模式转换为 script 模型。从文档中,我可以理解 torch.jit.trace 无法处理 python 中存在的控制流和其他数据结构。因此,开发了 torch.jit.script 来克服 torch.jit.trace 中的问题。

但看起来 torch.jit.script 适用于所有情况,那么为什么我们需要 torch.jit.trace 呢?

请帮助我理解这两种方法之间的区别

jit pytorch torchscript

7
推荐指数
1
解决办法
4394
查看次数

如何将PyTorch中的torchscript模型转换为普通的nn.Module?

我通过以下方式加载torchscript模型:

model = torch.jit.load("model.pt").to(device)
Run Code Online (Sandbox Code Playgroud)

该模型的子模块被标识为RecursiveScriptModule。我想微调上传的权重,为了使其更简单并将它们转换为torch.float32最好将所有这些东西转换为普通的PyTorch nn.Module

在官方文档https://pytorch.org/docs/stable/jit.html中,告知如何转换nn.Moduletorchscript,但我没有找到任何以相反方向执行此操作的示例。有没有办法做到这一点?

PS这里给出了加载模型预训练模型的示例: https://github.com/openai/CLIP/blob/main/notebooks/Interacting_with_CLIP.ipynb

python pytorch torchscript

7
推荐指数
1
解决办法
6077
查看次数

如何从 jit::script::module 访问模块属性,例如卷积步幅

我目前正在编写一个 C++ 程序,需要对 torchScript 格式的 CNN 模型的结构进行一些分析。我按照 torch.org 上显示的方式使用 C++ torch 库,加载到模型中,如下所示:

#include <torch/script.h>
#include <torch/torch.h>

#include <iostream>
#include <memory>

int main(int argc, const char* argv[]) {
    if (argc != 2) {
        std::cerr << "usage: example-app <path-to-exported-script-module>\n";
        return -1;
    }

    torch::jit::script::Module module;
    try {
        // Deserialize the ScriptModule from a file using torch::jit::load().
        module = torch::jit::load(argv[1]);
    }
    catch (const c10::Error& e) {
        std::cerr << "error loading the model\n";
        return -1;
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

据我所知,module由一组嵌套的集合组成,torch::jit::script::Module其中最低的代表内置函数。我按如下方式访问这些最低模块:

void …
Run Code Online (Sandbox Code Playgroud)

jit pytorch torchscript libtorch

6
推荐指数
0
解决办法
923
查看次数

从 Pytorch C++ 中的 c10::Dict&lt;c10::IValue, c10::IValue&gt; 获取值

我在 Pytorch C++ 前端使用 TorchScript 模型。

Python 中的模型返回一个outputdict 作为 Dict[str, List[torch.Tensor]].

当我在 C++ 中使用它时,它返回一个c10::Dict<c10::IValue, c10::IValue>. 这段 Python 代码的等价物是什么:

value_a = output['key_a']
value_b = output['key_b']
Run Code Online (Sandbox Code Playgroud)

在 C++ 中从中获取值c10::Dict

我已经尝试过了,但它不起作用。

torch::IValue key_a("key_a");
torch::IValue key_b("key_b");
c10::IValue value_a = output[key_a];
c10::IValue value_b = output[key_b];
std::cout << value_a << std::endl;
std::cout << value_b << std::endl;
Run Code Online (Sandbox Code Playgroud)

和错误:

error: type 'c10::Dict<c10::IValue, c10::IValue>' does not provide a subscript operator
Run Code Online (Sandbox Code Playgroud)

c++ torch pytorch torchscript libtorch

5
推荐指数
1
解决办法
2633
查看次数

ValueError:您必须指定decoder_input_ids或decoder_inputs_embeds

尝试将 t5 模型转换question-generationtorchscript model,同时执行此操作时遇到此错误

ValueError:您必须指定decoder_input_ids或decoder_inputs_embeds

这是我在 colab 上运行的代码。

!pip install -U transformers==3.0.0
!python -m nltk.downloader punkt

from transformers import AutoTokenizer, AutoModelForSeq2SeqLM
import torch

model = AutoModelForSeq2SeqLM.from_pretrained('valhalla/t5-base-qg-hl')

t_input =  'Python is a programming language. It is developed by <hl> Guido Van Rossum <hl>. </s>'

tokenizer = AutoTokenizer.from_pretrained('valhalla/t5-base-qg-hl', return_tensors = 'pt')

def _tokenize(
    inputs,
    padding=True,
    truncation=True,
    add_special_tokens=True,
    max_length=64
):
    inputs = tokenizer.batch_encode_plus(
        inputs, 
        max_length=max_length,
        add_special_tokens=add_special_tokens,
        truncation=truncation,
        padding="max_length" if padding else False,
        pad_to_max_length=padding,
        return_tensors="pt"
    )
    return inputs

token = …
Run Code Online (Sandbox Code Playgroud)

python deep-learning torchscript huggingface-transformers

5
推荐指数
1
解决办法
1万
查看次数

“运行时错误:未实现 op 'pythonop' 的 PyTorch 转换函数”并且“Torchscript 目前不支持 Python 内置函数”

新手问题。我一直在尝试将此 PyTorch 模型转换为 CoreML 模型。我已按照此处的指南进行操作,但无法使其正常工作。我尝试了跟踪和脚本编写,但遇到了错误,这些错误暗示 TorchScript 中可能不支持某个操作:

错误torch.jit.traceRuntimeError: PyTorch convert function for op 'pythonop' not implemented

错误torch.jit.scriptRuntimeError: Python builtin <built-in method apply of FunctionMeta object at 0x7fa37e2ad600> is currently not supported in Torchscript

我怀疑可能无法将任何 PyTorch 模型转换为 CoreML 模型。是这样吗?我可以在不深入 PyTorch 操作和层的情况下以某种方式克服这些错误吗?

我的 python 脚本以防万一(模型在本地加载):

import warnings
import torch
import torch.nn as nn
import coremltools as ct

from efficientnet_pytorch import EfficientNet
from torchvision import datasets, models, transforms
from PIL import Image

# …
Run Code Online (Sandbox Code Playgroud)

pytorch coreml coremltools torchscript

5
推荐指数
0
解决办法
717
查看次数

Torch JIT Trace = TracerWarning:将张量转换为 Python 布尔值可能会导致跟踪不正确

我正在关注本教程:https : //huggingface.co/transformers/torchscript.html 来创建我的自定义 BERT 模型的跟踪,但是在运行完全相同的模型时,dummy_input我收到一个错误:

TracerWarning: Converting a tensor to a Python boolean might cause the trace to be incorrect. 
We cant record the data flow of Python values, so this value will be treated as a constant in the future. 
Run Code Online (Sandbox Code Playgroud)

在我的模型和标记器中加载后,创建跟踪的代码如下:

text = "[CLS] Who was Jim Henson ? [SEP] Jim Henson was a puppeteer [SEP]"
tokenized_text = tokenizer.tokenize(text)

# Masking one of the input tokens
masked_index = 8
tokenized_text[masked_index] = '[MASK]'
indexed_tokens = tokenizer.convert_tokens_to_ids(tokenized_text) …
Run Code Online (Sandbox Code Playgroud)

tensorflow pytorch torchscript huggingface-transformers

4
推荐指数
1
解决办法
1724
查看次数

在 Windows 上的 C++ 应用程序中使用 PyTorch 模型

按照官方 PyTorch教程,我用 Python 创建了模型,通过跟踪将其转换为 Torch 脚本,并将脚本模块保存到文件中.pt。加载模型和 CMakeLists 的 C++ 代码与教程中的代码相同。

\n\n

我下载了LibTorch 1.3(稳定版,Windows,无CUDA,发布版)并解压,所以我的目录结构是:

\n\n
\n\xe2\x94\x82\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80artifact\n\xe2\x94\x82 Traced_resnet_model.pt\n\xe2\ x94\x82\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80cmakeapp\n\xe2\x94\x82\xe2\x94\x82 CMakeLists.txt\n\xe2 \x94\x82 \xe2\x94\x82 示例-app.cpp\n\xe2\x94\x82 \xe2\x94\x82 \n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\ xe2\x94\x80libtorch\n\xe2\x94\x82 \xe2\x94\x82 构建哈希 \n\xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2 \x94\x80bin\n\xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80cmake\n\xe2\x94\x82 \xe2\x94\x9c \xe2\x94\x80\xe2\x94\x80\xe2\x94\x80include\n\xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80lib \n\xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80share\n\xe2\x94\x82 \xe2\x94\x94\xe2\x94 \x80\xe2\x94\x80\xe2\x94\x80test\n\n
\n\n

我安装了 Visual Studio 2019,并将 CMake 作为组件安装,因此我运行了 VS2019 的开发人员命令提示符并cd运行到项目目录 (cmakeapp)。

\n\n

根据指南,我运行了以下命令来构建应用程序:

\n\n
mkdir build\ncd build\ncmake -DCMAKE_PREFIX_PATH=..\\libtorch ..\nmake\n
Run Code Online (Sandbox Code Playgroud)\n\n

CMake 似乎成功了,除了一些警告:

\n\n
CMake Warning (dev) at D:/dox/projects/AI/torchscript/libtorch/share/cmake/Caffe\n2/public/utils.cmake:57 (if):\n  Policy CMP0054 is not set: Only interpret if() arguments …
Run Code Online (Sandbox Code Playgroud)

cmake visual-studio torchscript libtorch

3
推荐指数
1
解决办法
4562
查看次数

如何在torchscript中使用自定义python对象

我准备将 pytorch 模块转换为 ScriptModule,然后在 c++ 中加载它?但是我被这个错误阻止了This attribute exists on the Python module, but we failed to convert Python type: 'Vocab' to a TorchScript type,这Vocab是我定义的一个 python 对象。演示代码在这里:

import torch
class Vocab(object):
    def __init__(self, name):
        self.name = name

    def show(self):
        print("dict:" + self.name)

class Model(torch.nn.Module):
    def __init__(self, ):
        super(Model, self).__init__()
        self.layers = torch.nn.Linear(2, 3)
        self.encoder = 4
        self.vocab = Vocab("vocab")

    def forward(self, x):
        name = self.vocab.name
        print("forward show encoder:" + str(self.encoder))
        print("vocab:" + name)
        enc_hidden = []
        step …
Run Code Online (Sandbox Code Playgroud)

python jit pytorch torchscript

2
推荐指数
1
解决办法
1686
查看次数