boostcampaitech3 / final-project-level3-cv-14

YOLOX-nano model compression with Nota AI
Apache License 2.0
4 stars 2 forks source link

[버그] hiddenlayer step!=1 에러 #1

Open Chanhook opened 2 years ago

Chanhook commented 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이 아닌 경우를 지원하지 않기 때문에 발생한 에러입니다.

버그 재현 방법

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로 모델 시각화가 구현이 돼서 후순위로 밀려고 합니다.

Devlee247 commented 2 years ago

확실히 슬라이싱이나 구조가 복잡해지는 경우가 있으면 안되는 일이 발생하더라구요. 그냥 torchviz를 가지고, 저희가 구조를 간소화 해봐도 충분할 것 같다는 생각이 들긴 하네요 ㅎㅎ 수고 많으셨어요!