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 呢?
请帮助我理解这两种方法之间的区别
我通过以下方式加载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.Module
为torchscript
,但我没有找到任何以相反方向执行此操作的示例。有没有办法做到这一点?
PS这里给出了加载模型预训练模型的示例: https://github.com/openai/CLIP/blob/main/notebooks/Interacting_with_CLIP.ipynb
我目前正在编写一个 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) 我在 Pytorch C++ 前端使用 TorchScript 模型。
Python 中的模型返回一个output
dict 作为 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) 尝试将 t5 模型转换question-generation
为torchscript
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) 新手问题。我一直在尝试将此 PyTorch 模型转换为 CoreML 模型。我已按照此处的指南进行操作,但无法使其正常工作。我尝试了跟踪和脚本编写,但遇到了错误,这些错误暗示 TorchScript 中可能不支持某个操作:
错误torch.jit.trace
:RuntimeError: PyTorch convert function for op 'pythonop' not implemented
错误torch.jit.script
:RuntimeError: 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) 我正在关注本教程: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) 按照官方 PyTorch教程,我用 Python 创建了模型,通过跟踪将其转换为 Torch 脚本,并将脚本模块保存到文件中.pt
。加载模型和 CMakeLists 的 C++ 代码与教程中的代码相同。
我下载了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\nmkdir build\ncd build\ncmake -DCMAKE_PREFIX_PATH=..\\libtorch ..\nmake\n
Run Code Online (Sandbox Code Playgroud)\n\nCMake 似乎成功了,除了一些警告:
\n\nCMake 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) 我准备将 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) torchscript ×9
pytorch ×7
jit ×3
libtorch ×3
python ×3
c++ ×1
cmake ×1
coreml ×1
coremltools ×1
tensorflow ×1
torch ×1