如何在 torchscript 中使用自定义 python 对象
how to use custom python object in torchscript
我准备将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 = len(x) // 2
for i in range(step):
enc_hidden.append((x[2*i] + x[2*i + 1])/2)
enc_hidden = torch.stack(enc_hidden, 0)
enc_hidden = self.__show(enc_hidden)
return self.layers(enc_hidden)
@torch.jit.export
def __show(self, x):
return x + 1
model = Model()
data = torch.randn(10, 2)
script_model = torch.jit.script(model)
print(script_model)
r1 = model(data)
print(r1)
错误消息:
Traceback (most recent call last):
File "/mnt/d/python_projects/pytorch_deploy/model4.py", line 47, in <module>
script_model = torch.jit.script(model)
File "/mnt/d/anaconda3/lib/python3.6/site-packages/torch/jit/__init__.py", line 1261, in script
return torch.jit._recursive.create_script_module(obj, torch.jit._recursive.infer_methods_to_compile)
File "/mnt/d/anaconda3/lib/python3.6/site-packages/torch/jit/_recursive.py", line 305, in create_script_module
return create_script_module_impl(nn_module, concrete_type, stubs_fn)
File "/mnt/d/anaconda3/lib/python3.6/site-packages/torch/jit/_recursive.py", line 361, in create_script_module_impl
create_methods_from_stubs(concrete_type, stubs)
File "/mnt/d/anaconda3/lib/python3.6/site-packages/torch/jit/_recursive.py", line 279, in create_methods_from_stubs
concrete_type._create_methods(defs, rcbs, defaults)
RuntimeError:
Module 'Model' has no attribute 'vocab' (This attribute exists on the Python module, but we failed to convert Python type: 'Vocab' to a TorchScript type.):
File "/mnt/d/python_projects/pytorch_deploy/model4.py", line 26
def forward(self, x):
name = self.vocab.name
~~~~~~~~~~ <--- HERE
print("forward show encoder:" + str(self.encoder))
print("vocab:" + name)
那么如何在 torchscript 中使用我自己的 python 对象?
您必须像这样用 torchscript.jit
注释您的 Vocab
:
@torch.jit.script
class Vocab(object):
def __init__(self, name: str):
self.name = name
def show(self):
print("dict:" + self.name)
还要注意规范 name: str
,因为 torchscript 也需要它来推断它的类型(PyTorch 支持 >=Python3.6
类型注释,您也可以使用注释,但不太清楚)。
请在那边查看 Torchscript classes and Default Types 和其他相关 torchscript
信息。
我准备将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 = len(x) // 2
for i in range(step):
enc_hidden.append((x[2*i] + x[2*i + 1])/2)
enc_hidden = torch.stack(enc_hidden, 0)
enc_hidden = self.__show(enc_hidden)
return self.layers(enc_hidden)
@torch.jit.export
def __show(self, x):
return x + 1
model = Model()
data = torch.randn(10, 2)
script_model = torch.jit.script(model)
print(script_model)
r1 = model(data)
print(r1)
错误消息:
Traceback (most recent call last):
File "/mnt/d/python_projects/pytorch_deploy/model4.py", line 47, in <module>
script_model = torch.jit.script(model)
File "/mnt/d/anaconda3/lib/python3.6/site-packages/torch/jit/__init__.py", line 1261, in script
return torch.jit._recursive.create_script_module(obj, torch.jit._recursive.infer_methods_to_compile)
File "/mnt/d/anaconda3/lib/python3.6/site-packages/torch/jit/_recursive.py", line 305, in create_script_module
return create_script_module_impl(nn_module, concrete_type, stubs_fn)
File "/mnt/d/anaconda3/lib/python3.6/site-packages/torch/jit/_recursive.py", line 361, in create_script_module_impl
create_methods_from_stubs(concrete_type, stubs)
File "/mnt/d/anaconda3/lib/python3.6/site-packages/torch/jit/_recursive.py", line 279, in create_methods_from_stubs
concrete_type._create_methods(defs, rcbs, defaults)
RuntimeError:
Module 'Model' has no attribute 'vocab' (This attribute exists on the Python module, but we failed to convert Python type: 'Vocab' to a TorchScript type.):
File "/mnt/d/python_projects/pytorch_deploy/model4.py", line 26
def forward(self, x):
name = self.vocab.name
~~~~~~~~~~ <--- HERE
print("forward show encoder:" + str(self.encoder))
print("vocab:" + name)
那么如何在 torchscript 中使用我自己的 python 对象?
您必须像这样用 torchscript.jit
注释您的 Vocab
:
@torch.jit.script
class Vocab(object):
def __init__(self, name: str):
self.name = name
def show(self):
print("dict:" + self.name)
还要注意规范 name: str
,因为 torchscript 也需要它来推断它的类型(PyTorch 支持 >=Python3.6
类型注释,您也可以使用注释,但不太清楚)。
请在那边查看 Torchscript classes and Default Types 和其他相关 torchscript
信息。