Example #1
0
 def __init__(self, onnx_data, runtime):
     """
     @param      onnx_data       :epkg:`ONNX` model or data
     @param      runtime         runtime to be used,
                                 mostly :epkg:`onnxruntime`
     """
     if runtime != 'onnxruntime1':
         raise NotImplementedError(
             "runtime '{}' is not implemented.".format(runtime))
     if hasattr(onnx_data, 'SerializeToString'):
         onnx_data = onnx_data.SerializeToString()
     self.runtime = runtime
     sess_options = SessionOptions()
     self.run_options = RunOptions()
     try:
         sess_options.session_log_severity_level = 3
         # sess_options.sessions_log_verbosity_level = 0
     except AttributeError:  # pragma: no cover
         # onnxruntime not recent enough.
         pass
     try:
         self.run_options.run_log_severity_level = 3
         # self.run_options.run_log_verbosity_level = 0
     except AttributeError:  # pragma: no cover
         # onnxruntime not recent enough.
         pass
     self.sess = InferenceSession(onnx_data, sess_options=sess_options)
Example #2
0
    def _init(self, variables=None):
        """
        Initializes the node.

        @param      variables               registered variables created by previous operators

        The current implementation for operator *Scan*
        only works for matrices.
        """
        try:
            self.alg_class = getattr(alg2, 'Onnx' + self.onnx_node.op_type)
        except AttributeError:
            self.alg_class = getattr(alg, 'Onnx' + self.onnx_node.op_type)
        inputs = list(self.onnx_node.input)
        self.mapping, self.inputs = self._name_mapping(inputs)
        self.outputs = list(self.onnx_node.output)

        options = self.options.copy()
        target_opset = options.pop('target_opset', None)
        domain = options.pop('domain', None)
        disable_optimisation = options.pop('disable_optimisation', False)
        ir_version = options.pop('ir_version', None)

        if domain == '' and target_opset < 9:
            # target_opset should be >= 9 not {} for main domain.
            # We assume it was the case when the graph was created.
            pass

        if self.onnx_node.op_type == 'ConstantOfShape':
            for k in options:
                v = options[k]
                if isinstance(v, numpy.ndarray):
                    options[k] = make_tensor(k,
                                             self._guess_proto_type(v.dtype),
                                             v.shape, v.tolist())

            self.inst_ = self.alg_class(*self.inputs,
                                        output_names=self.outputs,
                                        op_version=target_opset,
                                        **options)
            inputs = get_defined_inputs(self.inputs,
                                        variables,
                                        dtype=self.dtype)
            try:
                self.onnx_ = self.inst_.to_onnx(inputs,
                                                target_opset=target_opset,
                                                domain=domain)
                if "dim_value: 0" in str(self.onnx_):
                    raise RuntimeError(  # pragma: no cover
                        "Probable issue as one dimension is null.\n--\n{}".
                        format(self.onnx_))
            except AttributeError as e:  # pragma: no cover
                # older version of skl2onnx
                self.onnx_ = self.inst_.to_onnx(inputs)
                if "dim_value: 0" in str(self.onnx_):
                    raise RuntimeError(
                        "Probable issue as one dimension is null.\n--\n{}".
                        format(self.onnx_)) from e
            forced = False
        elif self.onnx_node.op_type == 'Scan':
            self.inst_ = self.alg_class(*self.inputs,
                                        output_names=self.outputs,
                                        op_version=target_opset,
                                        **options)
            inputs = get_defined_inputs(self.inputs,
                                        variables,
                                        dtype=self.dtype)
            outputs = get_defined_outputs(self.outputs,
                                          self.onnx_node,
                                          inputs,
                                          variables,
                                          dtype=self.dtype)
            inputs = [(name, cl.__class__([None, None]))
                      for (name, cl) in inputs]
            outputs = [(name, cl.__class__([None, None]))
                       for (name, cl) in outputs]
            self.onnx_ = self.inst_.to_onnx(inputs,
                                            outputs=outputs,
                                            target_opset=target_opset,
                                            domain=domain)
            if "dim_value: 0" in str(self.onnx_):
                raise RuntimeError(  # pragma: no cover
                    "Probable issue as one dimension is null.\n--\n{}".format(
                        self.onnx_))
            forced = True
        else:
            self.inst_ = self.alg_class(*self.inputs,
                                        output_names=self.outputs,
                                        op_version=target_opset,
                                        domain=domain,
                                        **options)
            inputs = get_defined_inputs(self.inputs,
                                        variables,
                                        dtype=self.dtype)

            try:
                self.onnx_ = self.inst_.to_onnx(inputs,
                                                target_opset=target_opset,
                                                domain=domain)
                if "dim_value: 0" in str(self.onnx_):
                    raise RuntimeError(  # pragma: no cover
                        "Probable issue as one dimension is null.\n--\n{}\n---\n{}"
                        .format(self.onnx_, inputs))
                forced = False
            except (RuntimeError, ValueError):
                # Let's try again by forcing output types.
                forced = True
                outputs = get_defined_outputs(self.outputs,
                                              self.onnx_node,
                                              inputs,
                                              variables,
                                              dtype=self.dtype)
                self.onnx_ = self.inst_.to_onnx(inputs,
                                                outputs=outputs,
                                                target_opset=target_opset,
                                                domain=domain)
                if "dim_value: 0" in str(self.onnx_):
                    raise RuntimeError(  # pragma: no cover
                        "Probable issue as one dimension is null.\n--\n{}".
                        format(self.onnx_)) from e

        if len(self.onnx_.graph.output) != len(self.outputs):
            # Something is wrong, falls back to default plan.
            forced = True
            outputs = get_defined_outputs(self.outputs,
                                          self.onnx_node,
                                          inputs,
                                          variables,
                                          dtype=self.dtype)
            self.onnx_ = self.inst_.to_onnx(inputs,
                                            outputs=outputs,
                                            target_opset=target_opset,
                                            domain=domain)
            if "dim_value: 0" in str(self.onnx_):
                raise RuntimeError(
                    "Probable issue as one dimension is null.\n--\n{}".format(
                        self.onnx_))
        else:
            lo = list(self.onnx_.graph.output)
            outputs = proto2vars(lo)

        sess_options = SessionOptions()
        self.run_options = RunOptions()

        try:
            sess_options.session_log_severity_level = 3
            # sess_options.sessions_log_verbosity_level = 0
        except AttributeError:
            # onnxruntime not recent enough.
            pass
        try:
            self.run_options.run_log_severity_level = 3
            # self.run_options.run_log_verbosity_level = 0
        except AttributeError:
            # onnxruntime not recent enough.
            pass
        if ir_version is not None:
            self.onnx_.ir_version = ir_version
        if disable_optimisation:
            sess_options.graph_optimization_level = (
                GraphOptimizationLevel.ORT_DISABLE_ALL)
        try:
            self.sess_ = InferenceSession(self.onnx_.SerializeToString(),
                                          sess_options=sess_options)
        except (RuntimeError, OrtNotImplemented, OrtInvalidGraph,
                OrtFail) as e:
            raise RuntimeError(
                "Unable to load node '{}' (output type was {})\n{}".format(
                    self.onnx_node.op_type,
                    "guessed" if forced else "inferred", self.onnx_)) from e
        self.typed_outputs_ = outputs
Example #3
0
    def _init(self, variables=None):
        """
        Initializes the node.

        @param      variables               registered variables created by previous operators

        The current implementation for operator *Scan*
        only works for matrices.
        """
        self.alg_class = getattr(alg, 'Onnx' + self.onnx_node.op_type)
        inputs = list(self.onnx_node.input)
        self.mapping, self.inputs = self._name_mapping(inputs)
        self.outputs = list(self.onnx_node.output)

        options = self.options.copy()
        target_opset = options.pop('target_opset', None)

        if self.onnx_node.op_type == 'ConstantOfShape':
            for k in options:
                v = options[k]
                if isinstance(v, numpy.ndarray):
                    options[k] = make_tensor(k,
                                             self._guess_proto_type(v.dtype),
                                             v.shape, v.tolist())

            self.inst_ = self.alg_class(*self.inputs,
                                        output_names=self.outputs,
                                        op_version=target_opset,
                                        **options)
            inputs = get_defined_inputs(self.inputs,
                                        variables,
                                        dtype=self.dtype)
            self.onnx_ = self.inst_.to_onnx(inputs,
                                            target_opset=target_opset,
                                            dtype=self.dtype)
            forced = False
        elif self.onnx_node.op_type == 'Scan':
            self.inst_ = self.alg_class(*self.inputs,
                                        output_names=self.outputs,
                                        op_version=target_opset,
                                        **options)
            inputs = get_defined_inputs(self.inputs,
                                        variables,
                                        dtype=self.dtype)
            outputs = get_defined_outputs(self.outputs,
                                          self.onnx_node,
                                          inputs,
                                          variables,
                                          dtype=self.dtype)
            inputs = [(name, cl.__class__([None, None]))
                      for (name, cl) in inputs]
            outputs = [(name, cl.__class__([None, None]))
                       for (name, cl) in outputs]
            self.onnx_ = self.inst_.to_onnx(inputs,
                                            outputs=outputs,
                                            target_opset=target_opset,
                                            dtype=self.dtype)
            forced = True
        else:
            self.inst_ = self.alg_class(*self.inputs,
                                        output_names=self.outputs,
                                        op_version=target_opset,
                                        **options)
            inputs = get_defined_inputs(self.inputs,
                                        variables,
                                        dtype=self.dtype)

            try:
                self.onnx_ = self.inst_.to_onnx(inputs,
                                                target_opset=target_opset,
                                                dtype=self.dtype)
                forced = False
            except (RuntimeError, ValueError):
                # Let's try again by forcing output types.
                forced = True
                outputs = get_defined_outputs(self.outputs,
                                              self.onnx_node,
                                              inputs,
                                              variables,
                                              dtype=self.dtype)
                self.onnx_ = self.inst_.to_onnx(inputs,
                                                outputs=outputs,
                                                target_opset=target_opset,
                                                dtype=self.dtype)

        if len(self.onnx_.graph.output) != self.outputs:
            # Something is wrong, falls back to default plan.
            forced = True
            outputs = get_defined_outputs(self.outputs,
                                          self.onnx_node,
                                          inputs,
                                          variables,
                                          dtype=self.dtype)
            self.onnx_ = self.inst_.to_onnx(inputs,
                                            outputs=outputs,
                                            target_opset=target_opset,
                                            dtype=self.dtype)

        sess_options = SessionOptions()
        self.run_options = RunOptions()

        try:
            sess_options.session_log_severity_level = 3
            # sess_options.sessions_log_verbosity_level = 0
        except AttributeError:
            # onnxruntime not recent enough.
            pass
        try:
            self.run_options.run_log_severity_level = 3
            # self.run_options.run_log_verbosity_level = 0
        except AttributeError:
            # onnxruntime not recent enough.
            pass
        try:
            self.sess_ = InferenceSession(self.onnx_.SerializeToString(),
                                          sess_options=sess_options)
        except RuntimeError as e:
            raise RuntimeError(
                "Unable to load node '{}' (output type was {})\n{}".format(
                    self.onnx_node.op_type,
                    "guessed" if forced else "inferred", self.onnx_)) from e
        self.typed_outputs_ = outputs