docs: def compile_model(self, target_instance_family, input_shape, output_path, framework=None, framework_version=None,
                        compile_max_run=5 * 60, tags=None, **kwargs):
          """Compile a Neo model using the input model.
  
          Args:
              target_instance_family (str): Identifies the device that you want to run your model after compilation, for
                  example: ml_c5. Allowed strings are: ml_c5, ml_m5, ml_c4, ml_m4, jetsontx1, jetsontx2, ml_p2, ml_p3,
                  deeplens, rasp3b
              input_shape (dict): Specifies the name and shape of the expected inputs for your trained model in json
                  dictionary form, for example: {'data':[1,3,1024,1024]}, or {'var1': [1,1,28,28], 'var2':[1,1,28,28]}
              output_path (str): Specifies where to store the compiled model
              framework (str): The framework that is used to train the original model. Allowed values: 'mxnet',
                  'tensorflow', 'pytorch', 'onnx', 'xgboost'
              framework_version (str): The version of the framework
              compile_max_run (int): Timeout in seconds for compilation (default: 3 * 60).
                  After this amount of time Amazon SageMaker Neo terminates the compilation job regardless of its
                  current status.
              tags (list[dict]): List of tags for labeling a compilation job. For more, see
                  https://docs.aws.amazon.com/sagemaker/latest/dg/API_Tag.html.
              **kwargs: Passed to invocation of ``create_model()``. Implementations may customize
                  ``create_model()`` to accept ``**kwargs`` to customize model creation during deploy.
                  For more, see the implementation docs.
          Returns:
              sagemaker.model.Model: A SageMaker ``Model`` object. See :func:`~sagemaker.model.Model` for full details.
          """
          if target_instance_family not in NEO_ALLOWED_TARGET_INSTANCE_FAMILY:
              raise ValueError("Please use valid target_instance_family,"
                               "allowed values: {}".format(NEO_ALLOWED_TARGET_INSTANCE_FAMILY))
          if framework and framework not in NEO_ALLOWED_FRAMEWORKS:
              raise ValueError("Please use valid framework, allowed values: {}".format(NEO_ALLOWED_FRAMEWORKS))
  
          if (framework is None) != (framework_version is None):
              raise ValueError("You should provide framework and framework_version at the same time.")
  
          model = self.create_model(**kwargs)
  
          self._compiled_models[target_instance_family] = model.compile(target_instance_family,
                                                                        input_shape,
                                                                        output_path,
                                                                        self.role,
                                                                        tags,
                                                                        self._compilation_job_name(),
                                                                        compile_max_run,
                                                                        framework=framework,
                                                                        framework_version=framework_version)
          return self._compiled_models[target_instance_family]