<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 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]