code: def save_model(
      fastai_learner,
      path,
      conda_env=None,
      code_paths=None,
      mlflow_model=None,
      signature: ModelSignature = None,
      input_example: ModelInputExample = None,
      pip_requirements=None,
      extra_pip_requirements=None,
      metadata=None,
      **kwargs,
  ):
      """Save a fastai Learner to a path on the local file system.
  
      Args:
          fastai_learner: fastai Learner to be saved.
          path: Local path where the model is to be saved.
          conda_env: {{ conda_env }}
          code_paths: A list of local filesystem paths to Python file dependencies (or directories
              containing file dependencies). These files are *prepended* to the system
              path when the model is loaded.
          mlflow_model: MLflow model config this flavor is being added to.
          signature: Describes model input and output Schema. The model signature can be inferred
              from datasets with valid model input (e.g. the training dataset with target
              column omitted) and valid model output (e.g. model predictions generated on
              the training dataset), for example:
  
              .. code-block:: python
  
                  from mlflow.models import infer_signature
  
                  train = df.drop_column("target_label")
                  predictions = ...  # compute model predictions
                  signature = infer_signature(train, predictions)
  
          input_example: {{ input_example }}
          pip_requirements: {{ pip_requirements }}
          extra_pip_requirements: {{ extra_pip_requirements }}
          metadata: Custom metadata dictionary passed to the model and stored in the MLmodel file.
  
              .. Note:: Experimental: This parameter may change or be removed in a future
                  release without warning.
  
          kwargs: kwargs to pass to ``Learner.save`` method.
  
      .. code-block:: python
          :caption: Example
  
          import os
  
          import mlflow.fastai
  
          # Create a fastai Learner model
          model = ...
  
          # Start MLflow session and save model to current working directory
          with mlflow.start_run():
              model.fit(epochs, learning_rate)
              mlflow.fastai.save_model(model, "model")
  
          # Load saved model for inference
          model_uri = "{}/{}".format(os.getcwd(), "model")
          loaded_model = mlflow.fastai.load_model(model_uri)
          results = loaded_model.predict(predict_data)
      """
      import fastai
      from fastai.callback.all import ParamScheduler
  
      _validate_env_arguments(
          conda_env, pip_requirements, extra_pip_requirements
      )
  
      path = os.path.abspath(path)
      _validate_and_prepare_target_save_path(path)
      model_data_subpath = "model.fastai"
      model_data_path = os.path.join(path, model_data_subpath)
      model_data_path = Path(model_data_path)
      code_dir_subpath = _validate_and_copy_code_paths(code_paths, path)
  
      if mlflow_model is None:
          mlflow_model = Model()
      if signature is not None:
          mlflow_model.signature = signature
      if input_example is not None:
          _save_example(mlflow_model, input_example, path)
      if metadata is not None:
          mlflow_model.metadata = metadata
  
      # ParamScheduler currently is not pickable
      # hence it is been removed before export and added again after export
      cbs = [
          c for c in fastai_learner.cbs if isinstance(c, ParamScheduler)
      ]
      fastai_learner.remove_cbs(cbs)
      fastai_learner.export(model_data_path, **kwargs)
      fastai_learner.add_cbs(cbs)
  
      pyfunc.add_to_model(
          mlflow_model,
          loader_module="mlflow.fastai",
          data=model_data_subpath,
          code=code_dir_subpath,
          conda_env=_CONDA_ENV_FILE_NAME,
          python_env=_PYTHON_ENV_FILE_NAME,
      )
      mlflow_model.add_flavor(
          FLAVOR_NAME,
          fastai_version=fastai.__version__,
          data=model_data_subpath,
          code=code_dir_subpath,
      )
      if size := get_total_file_size(path):
          mlflow_model.model_size_bytes = size
      mlflow_model.save(os.path.join(path, MLMODEL_FILE_NAME))
  
      if conda_env is None:
          if pip_requirements is None:
              default_reqs = get_default_pip_requirements()
              # To ensure `_load_pyfunc` can successfully load the model during the dependency
              # inference, `mlflow_model.save` must be called beforehand to save an MLmodel file.
              inferred_reqs = mlflow.models.infer_pip_requirements(
                  path,
                  FLAVOR_NAME,
                  fallback=default_reqs,
              )
              default_reqs = sorted(
                  set(inferred_reqs).union(default_reqs)
              )
          else:
              default_reqs = None
          (
              conda_env,
              pip_requirements,
              pip_constraints,
          ) = _process_pip_requirements(
              default_reqs,
              pip_requirements,
              extra_pip_requirements,
          )
      else:
          (
              conda_env,
              pip_requirements,
              pip_constraints,
          ) = _process_conda_env(conda_env)
  
      with open(os.path.join(path, _CONDA_ENV_FILE_NAME), "w") as f:
          yaml.safe_dump(conda_env, stream=f, default_flow_style=False)
  
      # Save `constraints.txt` if necessary
      if pip_constraints:
          write_to(
              os.path.join(path, _CONSTRAINTS_FILE_NAME),
              "\n".join(pip_constraints),
          )
  
      # Save `requirements.txt`
      write_to(
          os.path.join(path, _REQUIREMENTS_FILE_NAME),
          "\n".join(pip_requirements),
      )
  
      _PythonEnv.current().to_yaml(
          os.path.join(path, _PYTHON_ENV_FILE_NAME)
      )
  
imports: import logging
  import os
  import tempfile
  from pathlib import Path
  from typing import Any, Dict, Optional
  import numpy
  import pandas
  import yaml
  import mlflow.tracking
  from mlflow import pyfunc
  from mlflow.models import Model, ModelInputExample, ModelSignature
  from mlflow.models.model import MLMODEL_FILE_NAME
  from mlflow.models.utils import _save_example
  from mlflow.tracking._model_registry import DEFAULT_AWAIT_MAX_SLEEP_SECONDS
  from mlflow.tracking.artifact_utils import _download_artifact_from_uri
  from mlflow.utils.autologging_utils import autologging_integration, batch_metrics_logger, log_fn_args_as_params, safe_patch
  from mlflow.utils.docstring_utils import LOG_MODEL_PARAM_DOCS, format_docstring
  from mlflow.utils.environment import _CONDA_ENV_FILE_NAME, _CONSTRAINTS_FILE_NAME, _PYTHON_ENV_FILE_NAME, _REQUIREMENTS_FILE_NAME, _mlflow_conda_env, _process_conda_env, _process_pip_requirements, _PythonEnv, _validate_env_arguments
  from mlflow.utils.file_utils import get_total_file_size, write_to
  from mlflow.utils.model_utils import _add_code_from_conf_to_system_path, _get_flavor_configuration, _validate_and_copy_code_paths, _validate_and_prepare_target_save_path
  from mlflow.utils.requirements_utils import _get_pinned_requirement
label_desc: Use image node_id 3 for calling a global function with example usage: save_model(fastai_learner, path, conda_env, code_paths, mlflow_model, signature, input_example, pip_requirements, extra_pip_requirements, metadata) without return types