coremltools icon indicating copy to clipboard operation
coremltools copied to clipboard

Error Converting max_pool2d

Open TobyRoseman opened this issue 10 months ago • 0 comments

🐞Describing the bug

import coremltools as ct
import torch
import torch.nn.functional as F


class Model(torch.nn.Module):
    def __init__(self, window_size=3):
        super().__init__()
        self.window_size = window_size

    def forward(self, image):
        _, ixs = F.max_pool2d(
            image,
            kernel_size=self.window_size,
            stride=1,
            padding=self.window_size // 2,
            return_indices=True,
        )
        return ixs

pytorch_model = Model()
example = torch.rand(1, 3, 224, 224)

pytorch_model.eval()
traced = torch.jit.trace(pytorch_model, example)

model = ct.convert(traced, inputs=[ct.TensorType(shape=example.shape)])

Stack Trace

----> 1 model = ct.convert(traced, inputs=[ct.TensorType(shape=example.shape)])

File ~/miniconda3/envs/prod/lib/python3.10/site-packages/coremltools/converters/_converters_entry.py:635, in convert(model, source, inputs, outputs, classifier_config, minimum_deployment_target, convert_to, compute_precision, skip_model_load, compute_units, package_dir, debug, pass_pipeline, states)
    632 if len(states) > 0 and exact_source != "pytorch":
    633     raise ValueError("'states' can only be passed with pytorch source model.")
--> 635 mlmodel = mil_convert(
    636     model,
    637     convert_from=exact_source,
    638     convert_to=exact_target,
    639     inputs=inputs,
    640     outputs=outputs_as_tensor_or_image_types,  # None or list[ct.ImageType/ct.TensorType]
    641     classifier_config=classifier_config,
    642     skip_model_load=skip_model_load,
    643     compute_units=compute_units,
    644     package_dir=package_dir,
    645     debug=debug,
    646     specification_version=specification_version,
    647     main_pipeline=pass_pipeline,
    648     use_default_fp16_io=use_default_fp16_io,
    649     states=states,
    650 )
    652 if exact_target == "mlprogram" and mlmodel._input_has_infinite_upper_bound():
    653     raise ValueError(
    654         "For mlprogram, inputs with infinite upper_bound is not allowed. Please set upper_bound"
    655         ' to a positive value in "RangeDim()" for the "inputs" param in ct.convert().'
    656     )

File ~/miniconda3/envs/prod/lib/python3.10/site-packages/coremltools/converters/mil/converter.py:186, in mil_convert(model, convert_from, convert_to, compute_units, **kwargs)
    147 @_profile
    148 def mil_convert(
    149     model,
   (...)
    153     **kwargs
    154 ):
    155     """
    156     Convert model from a specified frontend `convert_from` to a specified
    157     converter backend `convert_to`.
   (...)
    184         See `coremltools.converters.convert`
    185     """
--> 186     return _mil_convert(
    187         model,
    188         convert_from,
    189         convert_to,
    190         ConverterRegistry,
    191         ct.models.MLModel,
    192         compute_units,
    193         **kwargs,
    194     )

File ~/miniconda3/envs/prod/lib/python3.10/site-packages/coremltools/converters/mil/converter.py:218, in _mil_convert(model, convert_from, convert_to, registry, modelClass, compute_units, **kwargs)
    215     weights_dir = _tempfile.TemporaryDirectory()
    216     kwargs["weights_dir"] = weights_dir.name
--> 218 proto, mil_program = mil_convert_to_proto(
    219                         model,
    220                         convert_from,
    221                         convert_to,
    222                         registry,
    223                         **kwargs
    224                      )
    226 _reset_conversion_state()
    228 if convert_to == 'milinternal':

File ~/miniconda3/envs/prod/lib/python3.10/site-packages/coremltools/converters/mil/converter.py:294, in mil_convert_to_proto(model, convert_from, convert_to, converter_registry, main_pipeline, **kwargs)
    289 frontend_pipeline, backend_pipeline = _construct_other_pipelines(
    290     main_pipeline, convert_from, convert_to
    291 )
    293 frontend_converter = frontend_converter_type()
--> 294 prog = frontend_converter(model, **kwargs)
    295 PassPipelineManager.apply_pipeline(prog, frontend_pipeline)
    297 PassPipelineManager.apply_pipeline(prog, main_pipeline)

File ~/miniconda3/envs/prod/lib/python3.10/site-packages/coremltools/converters/mil/converter.py:106, in TorchFrontend.__call__(self, *args, **kwargs)
    103 def __call__(self, *args, **kwargs):
    104     from .frontend.torch.load import load
--> 106     return load(*args, **kwargs)

File ~/miniconda3/envs/prod/lib/python3.10/site-packages/coremltools/converters/mil/frontend/torch/load.py:88, in load(spec, inputs, specification_version, debug, outputs, cut_at_symbols, use_default_fp16_io, states, **kwargs)
     76     model = _torchscript_from_spec(spec)
     78 converter = TorchConverter(
     79     model,
     80     inputs,
   (...)
     85     states,
     86 )
---> 88 return _perform_torch_convert(converter, debug)

File ~/miniconda3/envs/prod/lib/python3.10/site-packages/coremltools/converters/mil/frontend/torch/load.py:151, in _perform_torch_convert(converter, debug)
    149 def _perform_torch_convert(converter: TorchConverter, debug: bool) -> Program:
    150     try:
--> 151         prog = converter.convert()
    152     except RuntimeError as e:
    153         if debug and "convert function" in str(e):

File ~/miniconda3/envs/prod/lib/python3.10/site-packages/coremltools/converters/mil/frontend/torch/converter.py:1402, in TorchConverter.convert(self)
   1397             cast_value = mb.cast(
   1398                 x=output_var, dtype=builtin_to_string(buffer_var.dtype)
   1399             )
   1400             mb.coreml_update_state(state=buffer_var, value=cast_value)
-> 1402 graph_outputs = [self.context[name] for name in self.graph.outputs]
   1404 # An output can be None when it's a None constant, which happens
   1405 # in Fairseq MT.
   1406 for g in graph_outputs:

File ~/miniconda3/envs/prod/lib/python3.10/site-packages/coremltools/converters/mil/frontend/torch/converter.py:1402, in <listcomp>(.0)
   1397             cast_value = mb.cast(
   1398                 x=output_var, dtype=builtin_to_string(buffer_var.dtype)
   1399             )
   1400             mb.coreml_update_state(state=buffer_var, value=cast_value)
-> 1402 graph_outputs = [self.context[name] for name in self.graph.outputs]
   1404 # An output can be None when it's a None constant, which happens
   1405 # in Fairseq MT.
   1406 for g in graph_outputs:

File ~/miniconda3/envs/prod/lib/python3.10/site-packages/coremltools/converters/mil/frontend/torch/converter.py:485, in TranscriptionContext.__getitem__(self, torch_name)
    483     if torch_name in current_graph:
    484         return self._current_graph[idx][torch_name]
--> 485 raise ValueError(f"Torch var {torch_name} not found in context {self.name}")

ValueError: Torch var 16 not found in context 

TobyRoseman avatar Feb 24 '25 23:02 TobyRoseman