mlflow.paddle

mlflow.paddle 模块提供了一个用于记录和加载 Paddle 模型的 API。此模块支持以下格式的 Paddle 模型:

Paddle (原生) 格式

这是可以直接加载回 Paddle 的主要格式。

mlflow.pyfunc

为通用的基于 pyfunc 的部署工具和批量推理生成。注意:mlflow.pyfunc 格式仅适用于定义了 predict() 方法的 Paddle 模型,因为 pyfunc 模型推理需要 predict() 方法。

mlflow.paddle.autolog(log_every_n_epoch=1, log_models=True, disable=False, exclusive=False, silent=False, registered_model_name=None, extra_tags=None)[源代码]

注意

自动记录已知与以下软件包版本兼容:2.6.2 <= paddlepaddle <= 3.2.2。在超出此范围的版本中使用自动记录时可能会失败。

启用(或禁用)和配置从 PaddlePaddle 到 MLflow 的自动记录。

调用 paddle.Modelfit 方法时会执行自动记录。

参数
  • log_every_n_epoch – 如果指定,则每 n 个 epoch 记录一次指标。默认情况下,指标在每个 epoch 后记录。

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

  • disable – 如果为 True,则禁用 PaddlePaddle 自动记录集成。如果为 False,则启用 PaddlePaddle 自动记录集成。

  • exclusive – 如果为 True,则自动记录的内容不会记录到用户创建的流畅运行中。如果为 False,则自动记录的内容将记录到活动的流畅运行中,该运行可能是用户创建的。

  • silent – 如果为 True,则在 PyTorch Lightning 自动记录期间抑制 MLflow 的所有事件日志和警告。如果为 False,则在 PaddlePaddle 自动记录期间显示所有事件和警告。

  • registered_model_name – If given, each time a model is trained, it is registered as a new model version of the registered model with this name. The registered model is created if it does not already exist.

  • extra_tags – 要为自动日志记录创建的每个托管运行设置的额外标签的字典。

Example
import paddle
import mlflow
from mlflow import MlflowClient


def show_run_data(run_id):
    run = mlflow.get_run(run_id)
    print(f"params: {run.data.params}")
    print(f"metrics: {run.data.metrics}")
    client = MlflowClient()
    artifacts = [f.path for f in client.list_artifacts(run.info.run_id, "model")]
    print(f"artifacts: {artifacts}")


class LinearRegression(paddle.nn.Layer):
    def __init__(self):
        super().__init__()
        self.fc = paddle.nn.Linear(13, 1)

    def forward(self, feature):
        return self.fc(feature)


train_dataset = paddle.text.datasets.UCIHousing(mode="train")
eval_dataset = paddle.text.datasets.UCIHousing(mode="test")
model = paddle.Model(LinearRegression())
optim = paddle.optimizer.SGD(learning_rate=1e-2, parameters=model.parameters())
model.prepare(optim, paddle.nn.MSELoss(), paddle.metric.Accuracy())
mlflow.paddle.autolog()
with mlflow.start_run() as run:
    model.fit(train_dataset, eval_dataset, batch_size=16, epochs=10)
show_run_data(run.info.run_id)
Output
params: {
    "learning_rate": "0.01",
    "optimizer_name": "SGD",
}
metrics: {
    "loss": 17.482044,
    "step": 25.0,
    "acc": 0.0,
    "eval_step": 6.0,
    "eval_acc": 0.0,
    "eval_batch_size": 6.0,
    "batch_size": 4.0,
    "eval_loss": 24.717455,
}
artifacts: [
    "model/MLmodel",
    "model/conda.yaml",
    "model/model.pdiparams",
    "model/model.pdiparams.info",
    "model/model.pdmodel",
    "model/requirements.txt",
]
mlflow.paddle.get_default_conda_env()[源代码]
返回

调用 mlflow.paddle.save_model()mlflow.paddle.log_model() 生成的 MLflow 模型的默认 Conda 环境。

mlflow.paddle.get_default_pip_requirements()[源代码]
返回

此格式生成的 MLflow 模型的默认 pip 要求列表。调用 mlflow.paddle.save_model()mlflow.paddle.log_model() 会生成一个 pip 环境,该环境至少包含这些要求。

mlflow.paddle.load_model(model_uri, model=None, dst_path=None, **kwargs)[源代码]

从本地文件或运行加载 paddle 模型。

参数
  • model_uri – MLflow 模型的位置,采用 URI 格式,例如: - /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 - models:/<model_name>/<model_version> - models:/<model_name>/<stage>

  • model – 使用 training=True 保存 paddle.Model 模型时必需。

  • dst_path – The local filesystem path to which to download the model artifact. This directory must already exist. If unspecified, a local output path will be created.

  • kwargs – 传递给 paddle.jit.loadmodel.load 的关键字参数。

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

返回

一个 paddle 模型。

Example
import mlflow.paddle

pd_model = mlflow.paddle.load_model("runs:/96771d893a5e46159d9f3b49bf9013e2/pd_models")
# use Pandas DataFrame to make predictions
np_array = ...
predictions = pd_model(np_array)
mlflow.paddle.log_model(pd_model, artifact_path: str | None = None, training=False, conda_env=None, code_paths=None, registered_model_name=None, signature: mlflow.models.signature.ModelSignature = None, input_example: Union[pandas.core.frame.DataFrame, numpy.ndarray, dict, list, csr_matrix, csc_matrix, str, bytes, tuple] = None, await_registration_for=300, pip_requirements=None, extra_pip_requirements=None, metadata=None, name: str | None = None, params: dict[str, typing.Any] | None = None, tags: dict[str, typing.Any] | None = None, model_type: str | None = None, step: int = 0, model_id: str | None = None)[源代码]

将 paddle 模型记录为当前运行的 MLflow 工件。生成一个包含以下格式的 MLflow 模型:

  • mlflow.paddle

  • mlflow.pyfunc。注意:此格式仅包含定义了 predict() 方法的 paddle 模型,因为 pyfunc 模型推理需要 predict() 方法。

参数
  • pd_model – 要保存的 paddle 模型。

  • artifact_path – Deprecated. Use name instead.

  • training – 仅在使用 PaddlePaddle 高级 API 训练模型时有效。如果设置为 True,则保存的模型支持重新训练和推理。如果设置为 False,则仅支持推理。

  • conda_env

    Conda 环境的字典表示形式或 conda 环境 yaml 文件的路径。如果提供,这将描述模型应运行的环境。至少,它应该指定 get_default_conda_env() 中包含的依赖项。如果为 None,则将一个通过 mlflow.models.infer_pip_requirements() 推断出的 pip 要求列表添加到模型中。如果要求推断失败,则回退使用 get_default_pip_requirements。来自 conda_env 的 pip 要求将被写入 pip requirements.txt 文件,完整的 conda 环境将被写入 conda.yaml。下面是一个 conda 环境的字典表示的*示例*:

    {
        "name": "mlflow-env",
        "channels": ["conda-forge"],
        "dependencies": [
            "python=3.8.15",
            {
                "pip": [
                    "paddle==x.y.z"
                ],
            },
        ],
    }
    

  • 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. Files declared as dependencies for a given model should have relative imports declared from a common root path if multiple files are defined with import dependencies between them to avoid import errors when loading the model.

    For a detailed explanation of code_paths functionality, recommended usage patterns and limitations, see the code_paths usage guide.

  • registered_model_name – 如果提供,则在 registered_model_name 下创建一个模型版本,如果给定名称的注册模型不存在,也会创建该注册模型。

  • signature

    ModelSignature 类的实例,描述模型的输入和输出。如果未指定但提供了 input_example,则将根据提供的输入示例和模型自动推断签名。要禁用在提供输入示例时自动推断签名,请将 signature 设置为 False。要手动推断模型签名,请在具有有效模型输入的 数据集上调用 mlflow.models.infer_signature(),例如,省略目标列的训练数据集,以及在训练数据集上做出预测的模型输出,例如:

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

  • input_example – 一个或多个有效的模型输入实例。输入示例用作要馈送给模型的数据的提示。它将被转换为 Pandas DataFrame,然后使用 Pandas 的面向拆分(split-oriented)格式序列化为 json,或者转换为 numpy 数组,其中示例将通过转换为列表来序列化为 json。字节将进行 base64 编码。当 signature 参数为 None 时,输入示例用于推断模型签名。

  • await_registration_for – 等待模型版本完成创建并处于 READY 状态的秒数。默认情况下,函数等待五分钟。指定 0 或 None 可跳过等待。

  • pip_requirements – 一个 pip 要求字符串的可迭代对象(例如 ["paddle", "-r requirements.txt", "-c constraints.txt"])或本地文件系统上 pip 要求文件的字符串路径(例如 "requirements.txt")。如果提供,这将描述模型应运行的环境。如果为 None,则根据用户当前软件环境自动推断的默认要求列表由 mlflow.models.infer_pip_requirements() 推断。如果要求推断失败,则回退使用 get_default_pip_requirements。要求和约束都会被自动解析并分别写入 requirements.txtconstraints.txt 文件,并作为模型的一部分存储。要求也会被写入模型 conda 环境(conda.yaml)文件的 pip 部分。

  • extra_pip_requirements

    一个 pip 要求字符串的可迭代对象(例如 ["pandas", "-r requirements.txt", "-c constraints.txt"])或本地文件系统上 pip 要求文件的字符串路径(例如 "requirements.txt")。如果提供,这将描述附加到根据用户当前软件环境自动生成的默认 pip 要求集中的其他 pip 要求。要求和约束都会被自动解析并分别写入 requirements.txtconstraints.txt 文件,并作为模型的一部分存储。要求也会被写入模型 conda 环境(conda.yaml)文件的 pip 部分。

    警告

    以下参数不能同时指定

    • conda_env

    • pip_requirements

    • extra_pip_requirements

    此示例演示了如何使用 pip_requirementsextra_pip_requirements 指定 pip requirements。

  • metadata – 传递给模型并存储在 MLmodel 文件中的自定义元数据字典。

  • name – 模型名称。

  • params – 要与模型一起记录的参数字典。

  • tags – 要与模型一起记录的标签字典。

  • model_type – 模型的类型。

  • step – 记录模型输出和指标的步骤

  • model_id – 模型的 ID。

返回

一个 ModelInfo 实例,其中包含已记录模型的元数据。

示例
import mlflow.paddle


def load_data(): ...


class Regressor: ...


model = Regressor()
model.train()
training_data, test_data = load_data()
opt = paddle.optimizer.SGD(learning_rate=0.01, parameters=model.parameters())
EPOCH_NUM = 10
BATCH_SIZE = 10
for epoch_id in range(EPOCH_NUM):
    ...
mlflow.log_param("learning_rate", 0.01)
mlflow.paddle.log_model(model, name="model")
sk_path_dir = ...
mlflow.paddle.save_model(model, sk_path_dir)
mlflow.paddle.save_model(pd_model, path, training=False, conda_env=None, code_paths=None, mlflow_model=None, signature: mlflow.models.signature.ModelSignature = None, input_example: Union[pandas.core.frame.DataFrame, numpy.ndarray, dict, list, csr_matrix, csc_matrix, str, bytes, tuple] = None, pip_requirements=None, extra_pip_requirements=None, metadata=None)[源代码]

将 paddle 模型保存到本地文件系统上的一个路径。生成一个包含以下格式的 MLflow 模型:

  • mlflow.paddle

  • mlflow.pyfunc。注意:此格式仅包含定义了 predict() 方法的 paddle 模型,因为 pyfunc 模型推理需要 predict() 方法。

参数
  • pd_model – 要保存的 paddle 模型。

  • path – 要保存模型的本地路径。

  • training – 仅在使用 PaddlePaddle 高级 API 训练模型时有效。如果设置为 True,则保存的模型支持重新训练和推理。如果设置为 False,则仅支持推理。

  • conda_env

    Conda 环境的字典表示形式或 conda 环境 yaml 文件的路径。如果提供,这将描述模型应运行的环境。至少,它应该指定 get_default_conda_env() 中包含的依赖项。如果为 None,则将一个通过 mlflow.models.infer_pip_requirements() 推断出的 pip 要求列表添加到模型中。如果要求推断失败,则回退使用 get_default_pip_requirements。来自 conda_env 的 pip 要求将被写入 pip requirements.txt 文件,完整的 conda 环境将被写入 conda.yaml。下面是一个 conda 环境的字典表示的*示例*:

    {
        "name": "mlflow-env",
        "channels": ["conda-forge"],
        "dependencies": [
            "python=3.8.15",
            {
                "pip": [
                    "paddle==x.y.z"
                ],
            },
        ],
    }
    

  • 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. Files declared as dependencies for a given model should have relative imports declared from a common root path if multiple files are defined with import dependencies between them to avoid import errors when loading the model.

    For a detailed explanation of code_paths functionality, recommended usage patterns and limitations, see the code_paths usage guide.

  • mlflow_model – 要添加此 flavor 的 mlflow.models.Model

  • signature

    ModelSignature 类的实例,描述模型的输入和输出。如果未指定但提供了 input_example,则将根据提供的输入示例和模型自动推断签名。要禁用在提供输入示例时自动推断签名,请将 signature 设置为 False。要手动推断模型签名,请在具有有效模型输入的 数据集上调用 mlflow.models.infer_signature(),例如,省略目标列的训练数据集,以及在训练数据集上做出预测的模型输出,例如:

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

  • input_example – 一个或多个有效的模型输入实例。输入示例用作要馈送给模型的数据的提示。它将被转换为 Pandas DataFrame,然后使用 Pandas 的面向拆分(split-oriented)格式序列化为 json,或者转换为 numpy 数组,其中示例将通过转换为列表来序列化为 json。字节将进行 base64 编码。当 signature 参数为 None 时,输入示例用于推断模型签名。

  • pip_requirements – 一个 pip 要求字符串的可迭代对象(例如 ["paddle", "-r requirements.txt", "-c constraints.txt"])或本地文件系统上 pip 要求文件的字符串路径(例如 "requirements.txt")。如果提供,这将描述模型应运行的环境。如果为 None,则根据用户当前软件环境自动推断的默认要求列表由 mlflow.models.infer_pip_requirements() 推断。如果要求推断失败,则回退使用 get_default_pip_requirements。要求和约束都会被自动解析并分别写入 requirements.txtconstraints.txt 文件,并作为模型的一部分存储。要求也会被写入模型 conda 环境(conda.yaml)文件的 pip 部分。

  • extra_pip_requirements

    一个 pip 要求字符串的可迭代对象(例如 ["pandas", "-r requirements.txt", "-c constraints.txt"])或本地文件系统上 pip 要求文件的字符串路径(例如 "requirements.txt")。如果提供,这将描述附加到根据用户当前软件环境自动生成的默认 pip 要求集中的其他 pip 要求。要求和约束都会被自动解析并分别写入 requirements.txtconstraints.txt 文件,并作为模型的一部分存储。要求也会被写入模型 conda 环境(conda.yaml)文件的 pip 部分。

    警告

    以下参数不能同时指定

    • conda_env

    • pip_requirements

    • extra_pip_requirements

    此示例演示了如何使用 pip_requirementsextra_pip_requirements 指定 pip requirements。

  • metadata – 传递给模型并存储在 MLmodel 文件中的自定义元数据字典。

Example
import mlflow.paddle
import paddle
from paddle.nn import Linear
import paddle.nn.functional as F
import numpy as np
import os
import random
from sklearn.datasets import load_diabetes
from sklearn.model_selection import train_test_split
from sklearn import preprocessing


def load_data():
    # dataset on boston housing prediction
    X, y = load_diabetes(return_X_y=True, as_frame=True)
    min_max_scaler = preprocessing.MinMaxScaler()
    X_min_max = min_max_scaler.fit_transform(X)
    X_normalized = preprocessing.scale(X_min_max, with_std=False)
    X_train, X_test, y_train, y_test = train_test_split(
        X_normalized, y, test_size=0.2, random_state=42
    )
    y_train = y_train.reshape(-1, 1)
    y_test = y_test.reshape(-1, 1)
    return np.concatenate((X_train, y_train), axis=1), np.concatenate(
        (X_test, y_test), axis=1
    )


class Regressor(paddle.nn.Layer):
    def __init__(self):
        super().__init__()
        self.fc = Linear(in_features=13, out_features=1)

    @paddle.jit.to_static
    def forward(self, inputs):
        x = self.fc(inputs)
        return x


model = Regressor()
model.train()
training_data, test_data = load_data()
opt = paddle.optimizer.SGD(learning_rate=0.01, parameters=model.parameters())
EPOCH_NUM = 10
BATCH_SIZE = 10
for epoch_id in range(EPOCH_NUM):
    np.random.shuffle(training_data)
    mini_batches = [
        training_data[k : k + BATCH_SIZE]
        for k in range(0, len(training_data), BATCH_SIZE)
    ]
    for iter_id, mini_batch in enumerate(mini_batches):
        x = np.array(mini_batch[:, :-1]).astype("float32")
        y = np.array(mini_batch[:, -1:]).astype("float32")
        house_features = paddle.to_tensor(x)
        prices = paddle.to_tensor(y)
        predicts = model(house_features)
        loss = F.square_error_cost(predicts, label=prices)
        avg_loss = paddle.mean(loss)
        if iter_id % 20 == 0:
            print(f"epoch: {epoch_id}, iter: {iter_id}, loss is: {avg_loss.numpy()}")
        avg_loss.backward()
        opt.step()
        opt.clear_grad()
mlflow.log_param("learning_rate", 0.01)
mlflow.paddle.log_model(model, name="model")
sk_path_dir = "./test-out"
mlflow.paddle.save_model(model, sk_path_dir)
print("Model saved in run %s" % mlflow.active_run().info.run_id)