Open Chanhook opened 2 years ago
hl_graph = hl.build_graph(model, torch.zeros([1, 3, 64, 64]).to(device)) dot=hl_graph.build_dot() dot.attr("graph", rankdir="TD") --------------------------------------------------------------------------- RuntimeError Traceback (most recent call last) /tmp/ipykernel_9123/3932652035.py in <module> ----> 1 hl_graph = hl.build_graph(model, torch.zeros([1, 3, 64, 64]).to(device)) 2 dot=hl_graph.build_dot() 3 dot.attr("graph", rankdir="TD") /opt/conda/envs/nota-env/lib/python3.7/site-packages/hiddenlayer/graph.py in build_graph(model, args, input_names, transforms, framework_transforms) 141 from .pytorch_builder import import_graph, FRAMEWORK_TRANSFORMS 142 assert args is not None, "Argument args must be provided for Pytorch models." --> 143 import_graph(g, model, args) 144 elif framework == "tensorflow": 145 from .tf_builder import import_graph, FRAMEWORK_TRANSFORMS /opt/conda/envs/nota-env/lib/python3.7/site-packages/hiddenlayer/pytorch_builder.py in import_graph(hl_graph, model, args, input_names, verbose) 69 # Run the Pytorch graph to get a trace and generate a graph from it 70 trace, out = torch.jit._get_trace_graph(model, args) ---> 71 torch_graph = torch.onnx._optimize_trace(trace, torch.onnx.OperatorExportTypes.ONNX) 72 73 # Dump list of nodes (DEBUG only) /opt/conda/envs/nota-env/lib/python3.7/site-packages/torch/onnx/__init__.py in _optimize_trace(graph, operator_export_type) 243 def _optimize_trace(graph, operator_export_type): 244 from torch.onnx import utils --> 245 return utils._optimize_graph(graph, operator_export_type) 246 247 /opt/conda/envs/nota-env/lib/python3.7/site-packages/torch/onnx/utils.py in _optimize_graph(graph, operator_export_type, _disable_torch_constant_prop, fixed_batch_size, params_dict, use_new_jit_passes, dynamic_axes, input_names) 201 dynamic_axes = {} if dynamic_axes is None else dynamic_axes 202 torch._C._jit_pass_onnx_set_dynamic_input_shape(graph, dynamic_axes, input_names) --> 203 graph = torch._C._jit_pass_onnx(graph, operator_export_type) 204 torch._C._jit_pass_lint(graph) 205 /opt/conda/envs/nota-env/lib/python3.7/site-packages/torch/onnx/__init__.py in _run_symbolic_function(*args, **kwargs) 261 def _run_symbolic_function(*args, **kwargs): 262 from torch.onnx import utils --> 263 return utils._run_symbolic_function(*args, **kwargs) 264 265 /opt/conda/envs/nota-env/lib/python3.7/site-packages/torch/onnx/utils.py in _run_symbolic_function(g, n, inputs, env, operator_export_type) 932 return None 933 attrs = {k: n[k] for k in n.attributeNames()} --> 934 return symbolic_fn(g, *inputs, **attrs) 935 936 elif ns == "prim": /opt/conda/envs/nota-env/lib/python3.7/site-packages/torch/onnx/symbolic_opset9.py in slice(g, self, *args) 1658 step = _parse_arg(step, 'i') 1659 if step != 1: -> 1660 raise RuntimeError("step!=1 is currently not supported") 1661 if start.node().kind() != 'onnx::Constant' or \ 1662 end.node().kind() != 'onnx::Constant' or dim.node().kind() != 'onnx::Constant': RuntimeError: step!=1 is currently not supported
모델 시각화를 진행하려 했지만 해당 에러가 발생하였습니다. 이 에러를 알아보니까 https://stackoverflow.com/questions/65496349/cannot-export-pytorch-model-to-onnx 에서 알 수 있었고, 간단히 말씀드리면, self.model2(conv1_2[:,:,::2,::2]) 처럼 슬라이싱 하는 부분이 있을 경우, onnx가 step이 1이 아닌 경우를 지원하지 않기 때문에 발생한 에러입니다.
self.model2(conv1_2[:,:,::2,::2])
exps/default/ 로 yolox_voc_nano.py를 옮기시고 해당 디렉토리에 노트북을 만들어 진행해주시면 됩니다. 다른 yolox 파일을 사용해도 됩니다!
import torch import yolox_voc_nano import hiddenlayer as hl
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") print("device = ", device) # 모델 생성 model= yolox_voc_nano.Exp().get_model().to(device) model.eval()
hl_graph = hl.build_graph(model, torch.zeros([1, 3, 64, 64]).to(device)) dot=hl_graph.build_dot() dot.attr("graph", rankdir="TD")
모델을 다 뜯어봐서 슬라이싱 부분을 위 링크의 방법처럼 고치는 수 밖에는 없을거 같긴한데 일단 torchviz로 모델 시각화가 구현이 돼서 후순위로 밀려고 합니다.
확실히 슬라이싱이나 구조가 복잡해지는 경우가 있으면 안되는 일이 발생하더라구요. 그냥 torchviz를 가지고, 저희가 구조를 간소화 해봐도 충분할 것 같다는 생각이 들긴 하네요 ㅎㅎ 수고 많으셨어요!
버그 내용
모델 시각화를 진행하려 했지만 해당 에러가 발생하였습니다. 이 에러를 알아보니까 https://stackoverflow.com/questions/65496349/cannot-export-pytorch-model-to-onnx 에서 알 수 있었고, 간단히 말씀드리면,
self.model2(conv1_2[:,:,::2,::2])
처럼 슬라이싱 하는 부분이 있을 경우, onnx가 step이 1이 아닌 경우를 지원하지 않기 때문에 발생한 에러입니다.버그 재현 방법
exps/default/ 로 yolox_voc_nano.py를 옮기시고 해당 디렉토리에 노트북을 만들어 진행해주시면 됩니다. 다른 yolox 파일을 사용해도 됩니다!
해결 방향
모델을 다 뜯어봐서 슬라이싱 부분을 위 링크의 방법처럼 고치는 수 밖에는 없을거 같긴한데 일단 torchviz로 모델 시각화가 구현이 돼서 후순위로 밀려고 합니다.