使用 MLFlow 跟踪 SageMaker Estimator

Tracking SageMaker Estimator with MLFlow

我正在为 ML 项目开发版本跟踪系统,并希望使用 MLflow 来完成这项工作。我的项目使用 AWS Sagemaker 的 DeepAR 进行预测。

我想做的很简单。我正在尝试使用 MLFlow 记录 Sagemaker DeepAR 模型(Sagemaker Estimator)。因为它的 "mlflow.sagemaker" 模块中没有 "log_model" 函数,所以我尝试使用 "mlflow.pyfunc" 模块来做日志。不幸的是它没有用。如何登录 Sagemaker 模型并获取 MLFlow 生成的 cloudpickle 和 yaml 文件?

我现在的代码:

mlflow.pyfunc.log_model(model)

其中模型是一个 sagemaker.estimator.Estimator 对象,我从代码中得到的错误是

mlflow.exceptions.MlflowException: Either `loader_module` or `python_model` must be specified. A `loader_module` should be a python module. A `python_model` should be a subclass of PythonModel

我知道 AWS Sagemaker 会记录我的模型,但对我的项目来说,使用 MLFlow 记录日志也非常重要。

您不能使用 pyfunc 来存储任何类型的对象。

您应该指定 loader_module 之一,如下例所示,或者您必须编写实现 PythonModel 接口的包装器,并提供从先前存储的工件中反序列化模型的逻辑,如此处所述 https://www.mlflow.org/docs/latest/models.html#example-saving-an-xgboost-model-in-mlflow-format

加载器示例:

    model_uri = 'model.pkl'

    with open(model_uri, 'wb') as f:
        pickle.dump(model, f)

    mlflow.log_artifact(model_uri, 'model')

    mlflow.pyfunc.log_model(
        'model', loader_module='mlflow.sklearn', data_path='model.pkl', code_path=['src'], conda_env='environment.yml'
    )

我认为 PythonModel 更适合您,因为 mlflow 没有用于 SageMaker DeepAR 模型的内置加载器。

尽管如此,您必须了解如何从工件中恢复 SageMaker 模型,因为我不确定这是否可能,因为一些内置的 SageMaker 算法是黑盒。

您可能还对允许您在 Sagemaker 中 运行 任何 MLFlow 项目的容器感兴趣:https://github.com/odahu/sagemaker-mlflow-container