mlflow.fastai

The mlflow.fastai module provides an API for logging and loading fast.ai models. This module exports fast.ai models with the following flavors:

fastai (native) format

This is the main flavor that can be loaded back into fastai.

mlflow.pyfunc

Produced for use by generic pyfunc-based deployment tools and batch inference.

mlflow.fastai.autolog(log_models=True, disable=False, exclusive=False, disable_for_unsupported_versions=False, silent=False)[source]

Note

Experimental: This method may change or be removed in a future release without warning.

Note

Autologging is known to be compatible with the following package versions: 1.0.60 <= fastai <= 1.0.61. Autologging may not succeed when used with package versions outside of this range.

Enable automatic logging from Fastai to MLflow. Logs loss and any other metrics specified in the fit function, and optimizer data as parameters. Model checkpoints are logged as artifacts to a ‘models’ directory.

MLflow will also log the parameters of the EarlyStoppingCallback and OneCycleScheduler callbacks

Parameters
  • log_models – If True, trained models are logged as MLflow model artifacts. If False, trained models are not logged.

  • disable – If True, disables the Fastai autologging integration. If False, enables the Fastai autologging integration.

  • exclusive – If True, autologged content is not logged to user-created fluent runs. If False, autologged content is logged to the active fluent run, which may be user-created.

  • disable_for_unsupported_versions – If True, disable autologging for versions of fastai that have not been tested against this version of the MLflow client or are incompatible.

  • silent – If True, suppress all event logs and warnings from MLflow during Fastai autologging. If False, show all events and warnings during Fastai autologging.

Example
# This is a modified example from
# https://github.com/mlflow/mlflow/tree/master/examples/fastai
# demonstrating autolog capabilites.

import fastai.vision as vis
import mlflow.fastai
from mlflow.tracking import MlflowClient

def print_auto_logged_info(r):
    tags = {k: v for k, v in r.data.tags.items() if not k.startswith("mlflow.")}
    artifacts = [f.path for f in MlflowClient().list_artifacts(r.info.run_id, "model")]
    print("run_id: {}".format(r.info.run_id))
    print("artifacts: {}".format(artifacts))
    print("params: {}".format(r.data.params))
    print("metrics: {}".format(r.data.metrics))
    print("tags: {}".format(tags))

def main(epochs=5, learning_rate=0.01):
    # Download and untar the MNIST data set
    path = vis.untar_data(vis.URLs.MNIST_SAMPLE)

    # Prepare, transform, and normalize the data
    data = vis.ImageDataBunch.from_folder(path, ds_tfms=(vis.rand_pad(2, 28), []), bs=64)
    data.normalize(vis.imagenet_stats)

    # Create CNN the Learner model
    model = vis.cnn_learner(data, vis.models.resnet18, metrics=vis.accuracy)

    # Enable auto logging
    mlflow.fastai.autolog()

    # Start MLflow session
    with mlflow.start_run() as run:
        model.fit(epochs, learning_rate)

    # fetch the auto logged parameters, metrics, and artifacts
    print_auto_logged_info(mlflow.get_run(run_id=run.info.run_id))

main()
output
run_id: 5a23dcbcaa334637814dbce7a00b2f6a
artifacts: ['model/MLmodel', 'model/conda.yaml', 'model/model.fastai']
params: {'wd': 'None',
         'bn_wd': 'True',
         'opt_func': 'Adam',
         'epochs': '5', '
         train_bn': 'True',
         'num_layers': '60',
         'lr': '0.01',
         'true_wd': 'True'}
metrics: {'train_loss': 0.024,
          'accuracy': 0.99214,
          'valid_loss': 0.021}
# Tags model summary omitted too long
tags: {...}
../_images/fastai_autolog.png

Fastai autologged MLflow entities

mlflow.fastai.get_default_conda_env(include_cloudpickle=False)[source]
Returns

The default Conda environment as a dictionary for MLflow Models produced by calls to save_model() and log_model().

Example
import mlflow.fastai

# Start MLflow session and log the fastai learner model
with mlflow.start_run():
   model.fit(epochs, learning_rate)
   mlflow.fastai.log_model(model, "model")

# Fetch the default conda environment
env = mlflow.fastai.get_default_conda_env()
print("conda environment: {}".format(env))
Output
conda environment: {'name': 'mlflow-env',
                    'channels': ['defaults', 'conda-forge'],
                    'dependencies': ['python=3.7.5', 'fastai=1.0.61',
                                     'pip', {'pip': ['mlflow']}]}
mlflow.fastai.load_model(model_uri)[source]

Load a fastai model from a local file or a run.

Parameters

model_uri

The location, in URI format, of the MLflow model. For example:

  • /Users/me/path/to/local/model

  • relative/path/to/local/model

  • s3://my_bucket/path/to/model

  • runs:/<mlflow_run_id>/run-relative/path/to/model

For more information about supported URI schemes, see Referencing Artifacts.

Returns

A fastai model (an instance of fastai.Learner).

Example
import mlflow.fastai

# Define the Learner model
model = ...

# log the fastai Leaner model
with mlflow.start_run() as run:
    model.fit(epochs, learning_rate)
    mlflow.fastai.log_model(model, "model")

# Load the model for scoring
model_uri = "runs:/{}/model".format(run.info.run_id)
loaded_model = mlflow.fastai.load_model(model_uri)
results = loaded_model.predict(predict_data)
mlflow.fastai.log_model(fastai_learner, artifact_path, conda_env=None, registered_model_name=None, signature: Optional[mlflow.models.signature.ModelSignature] = None, input_example: Optional[Union[pandas.core.frame.DataFrame, numpy.ndarray, dict, list]] = None, await_registration_for=300, **kwargs)[source]

Log a fastai model as an MLflow artifact for the current run.

Parameters
  • fastai_learner – Fastai model (an instance of fastai.Learner) to be saved.

  • artifact_path – Run-relative artifact path.

  • conda_env

    Either a dictionary representation of a Conda environment or the path to a Conda environment yaml file. If provided, this describes the environment this model should be run in. At minimum, it should specify the dependencies contained in get_default_conda_env(). If None, the default get_default_conda_env() environment is added to the model. The following is an example dictionary representation of a Conda environment:

    {
        'name': 'mlflow-env',
        'channels': ['defaults'],
        'dependencies': [
            'python=3.7.0',
            'fastai=1.0.60',
        ]
    }
    

  • registered_model_name – Note:: Experimental: This argument may change or be removed in a future release without warning. If given, create a model version under registered_model_name, also creating a registered model if one with the given name does not exist.

  • signature

    (Experimental) ModelSignature 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:

    from mlflow.models.signature import infer_signature
    train = df.drop_column("target_label")
    predictions = ... # compute model predictions
    signature = infer_signature(train, predictions)
    

  • input_example – (Experimental) Input example provides one or several instances of valid model input. The example can be used as a hint of what data to feed the model. The given example will be converted to a Pandas DataFrame and then serialized to json using the Pandas split-oriented format. Bytes are base64-encoded.

  • kwargs – kwargs to pass to fastai.Learner.export method.

  • await_registration_for – Number of seconds to wait for the model version to finish being created and is in READY status. By default, the function waits for five minutes. Specify 0 or None to skip waiting.

Example
import fastai.vision as vis
import mlflow.fastai
from mlflow.tracking import MlflowClient

def main(epochs=5, learning_rate=0.01):
    # Download and untar the MNIST data set
    path = vis.untar_data(vis.URLs.MNIST_SAMPLE)

   # Prepare, transform, and normalize the data
   data = vis.ImageDataBunch.from_folder(path, ds_tfms=(vis.rand_pad(2, 28), []), bs=64)
   data.normalize(vis.imagenet_stats)

   # Create the CNN Learner model
   model = vis.cnn_learner(data, vis.models.resnet18, metrics=vis.accuracy)

   # Start MLflow session and log model
   with mlflow.start_run() as run:
        model.fit(epochs, learning_rate)
        mlflow.fastai.log_model(model, 'model')

   # fetch the logged model artifacts
   artifacts = [f.path for f in MlflowClient().list_artifacts(run.info.run_id, 'model')]
   print("artifacts: {}".format(artifacts))

main()
Output
artifacts: ['model/MLmodel', 'model/conda.yaml', 'model/model.fastai']
mlflow.fastai.save_model(fastai_learner, path, conda_env=None, mlflow_model=None, signature: Optional[mlflow.models.signature.ModelSignature] = None, input_example: Optional[Union[pandas.core.frame.DataFrame, numpy.ndarray, dict, list]] = None, **kwargs)[source]

Save a fastai Learner to a path on the local file system.

Parameters
  • fastai_learner – fastai Learner to be saved.

  • path – Local path where the model is to be saved.

  • conda_env

    Either a dictionary representation of a Conda environment or the path to a Conda environment yaml file. If provided, this describes the environment this model should be run in. At minimum, it should specify the dependencies contained in get_default_conda_env(). If None, the default get_default_conda_env() environment is added to the model. The following is an example dictionary representation of a Conda environment:

    {
        'name': 'mlflow-env',
        'channels': ['defaults'],
        'dependencies': [
            'python=3.7.0',
            'fastai=1.0.60',
        ]
    }
    

  • mlflow_model – MLflow model config this flavor is being added to.

  • signature

    (Experimental) ModelSignature 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:

    from mlflow.models.signature import infer_signature
    train = df.drop_column("target_label")
    predictions = ... # compute model predictions
    signature = infer_signature(train, predictions)
    

  • input_example – (Experimental) Input example provides one or several instances of valid model input. The example can be used as a hint of what data to feed the model. The given example will be converted to a Pandas DataFrame and then serialized to json using the Pandas split-oriented format. Bytes are base64-encoded.

  • kwargs – kwargs to pass to Learner.save method.

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)