mlflow.johnsnowlabs

The mlflow.johnsnowlabs 模块提供用于记录和加载 Spark NLP 和 NLU 模型的 API。 该模块导出以下 flavors:

Johnsnowlabs (native) format

允许将模型作为 Spark Transformers 加载,以便在 Spark session 中进行评分。 具有此 flavor 的模型可以作为 NluPipelines 加载,底层为 Spark MLlib PipelineModel 这是主要的 flavor 并且始终会生成。

mlflow.pyfunc

支持在 Spark 之外进行部署,方法是实例化 SparkContext 并在评分之前将输入数据读取为 Spark DataFrame。也支持作为 Spark UDF 在 Spark 中部署。具有此 flavor 的模型可以作为 Python 函数加载以执行推理。该 flavor 始终会被生成。

该 flavor 可让您访问 20.000+ state-of-the-art enterprise NLP models in 200+ languages,适用于医疗、金融、法律及更多领域。 功能包括:LLM、文本摘要、问答、命名实体识别、关系抽取、情感分析、拼写检查、图像分类、自动语音识别等多种能力,由最新的 Transformer 架构驱动。模型由 John Snow Labs 提供,并需要一个 John Snow Labs Enterprise NLP License。You can reach out to us 获取研究或行业许可证。

这些键必须出现在您的许可证 JSON 中:

  1. SECRET: 用于 John Snow Labs Enterprise NLP Library 的密钥

  2. SPARK_NLP_LICENSE: 您的 John Snow Labs 企业级 NLP 许可证

  3. AWS_ACCESS_KEY_ID: 用于访问 John Snow Labs 企业模型的 AWS 密钥 ID

  4. AWS_SECRET_ACCESS_KEY: 用于访问 John Snow Labs Enterprise Models 的 AWS Secret 密钥

您可以使用以下代码设置它们:

import os
import json

# Write your raw license.json string into the 'JOHNSNOWLABS_LICENSE_JSON' env variable
creds = {
    "AWS_ACCESS_KEY_ID": "...",
    "AWS_SECRET_ACCESS_KEY": "...",
    "SPARK_NLP_LICENSE": "...",
    "SECRET": "...",
}
os.environ["JOHNSNOWLABS_LICENSE_JSON"] = json.dumps(creds)
mlflow.johnsnowlabs.get_default_conda_env()[source]
Returns

默认的 Conda 环境,用于由调用 save_model()log_model() 生成的 MLflow 模型。

mlflow.johnsnowlabs.get_default_pip_requirements()[source]
Returns

该列表列出了由此 flavor 生成的 MLflow Models 的默认 pip 依赖项。 对 save_model()log_model() 的调用会生成一个 pip 环境,该环境至少包含这些依赖项。

mlflow.johnsnowlabs.load_model(model_uri, dfs_tmpdir=None, dst_path=None)[source]

从路径加载Johnsnowlabs MLflow 模型。

Parameters
  • 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>

    有关受支持的 URI 方案的更多信息,请参见 Referencing Artifacts.

  • dfs_tmpdir – 临时目录路径,位于分布式(Hadoop)文件系统(DFS)或在本地模式下的本地文件系统。模型从该位置加载。默认值为 /tmp/mlflow

  • dst_path – 要将模型工件下载到的本地文件系统路径。该目录必须已存在。如果未指定,将创建一个本地输出路径。

Returns

一个 nlu.NLUPipeline.

Example
import mlflow
from johnsnowlabs import nlp
import os

# Write your raw license.json string into the 'JOHNSNOWLABS_LICENSE_JSON' env variable
creds = {
    "AWS_ACCESS_KEY_ID": "...",
    "AWS_SECRET_ACCESS_KEY": "...",
    "SPARK_NLP_LICENSE": "...",
    "SECRET": "...",
}
os.environ["JOHNSNOWLABS_LICENSE_JSON"] = json.dumps(creds)

# start a spark session
nlp.start()
# Load you MLflow Model
model = mlflow.johnsnowlabs.load_model("johnsnowlabs_model")

# Make predictions on test documents
# supports datatypes defined in https://nlp.johnsnowlabs.com/docs/en/jsl/predict_api#supported-data-types
prediction = model.transform(["I love Covid", "I hate Covid"])
mlflow.johnsnowlabs.log_model(spark_model, artifact_path: str | None = None, conda_env=None, code_paths=None, dfs_tmpdir=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, store_license=False, 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)[source]

Johnsnowlabs NLUPipeline(通过 nlp.load() 创建)记录为当前运行的 MLflow 工件。它使用 MLlib 持久化格式,并生成具有 johnsnowlabs flavor 的 MLflow 模型。

注意:如果没有活动的 run,它将实例化一个 run 来获取 run_id。

Parameters
  • spark_model

    NLUPipeline 通过 nlp.load() 获得

  • artifact_path – 已弃用。请改用 name

  • conda_env

    可以是 Conda 环境的字典表示或指向 Conda 环境 yaml 文件的路径。如果提供,则描述应在其中运行此模型的环境。至少,它应指定包含在 get_default_conda_env() 中的依赖项。如果 None,默认的 get_default_conda_env() 环境将被添加到模型。以下是一个 示例 的 Conda 环境的字典表示:

    {
        'name': 'mlflow-env',
        'channels': ['defaults'],
        'dependencies': [
            'python=3.8.15',
            'johnsnowlabs'
        ]
    }
    

  • code_paths

    本地文件系统中指向 Python 文件依赖(或包含文件依赖的目录)路径的列表。这些文件在模型加载时会被预先添加到系统路径中。如果为某个模型声明了依赖文件且多个文件之间存在导入依赖关系,那么这些文件应从一个共同的根路径声明相对导入,以避免在加载模型时发生导入错误。

    有关 code_paths 功能、推荐的使用模式和限制的详细说明,请参阅 code_paths usage guide

  • dfs_tmpdir – 分布式(Hadoop)文件系统(DFS)上的临时目录路径;如果以本地模式运行,则为本地文件系统。模型先写入该目的地,然后再复制到模型的 artifact 目录。当在集群上运行时这是必要的,因为 Spark ML 模型会从 DFS 读取并写入到 DFS。如果此操作成功完成,所有在 DFS 上创建的临时文件将被移除。默认为 /tmp/mlflow

  • registered_model_name – 如果提供,将在 registered_model_name 下创建一个模型版本,并在不存在同名的注册模型时创建该注册模型。

  • signature

    ModelSignature 描述模型的输入和输出 Schema。 模型的 signature 可以从具有有效模型输入(例如省略目标列的训练数据集)和有效模型输出(例如在训练数据集上生成的模型预测)的数据集中 inferred,例如:

    from mlflow.models.signature import infer_signature
    
    train = df.drop_column("target_label")
    predictions = ...  # 计算模型预测结果
    signature = infer_signature(train, predictions)
    

  • input_example – 一个或多个有效模型输入实例。输入示例用于提示应向模型提供何种数据。它将被转换为一个 Pandas DataFrame,然后使用 Pandas 的 split-oriented 格式序列化为 json,或者转换为一个 numpy array,其中示例将通过将其转换为列表的方式序列化为 json。字节使用 base64 编码。当 signature 参数为 None 时,输入示例用于推断模型签名。

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

  • pip_requirements – 要么是可迭代的 pip 依赖字符串(例如 ["johnsnowlabs", "-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 文件的字符串路径(例如 "requirements.txt")。如果提供,该参数描述了附加的 pip 依赖,这些依赖会被追加到基于用户当前软件环境自动生成的默认 pip 依赖集合中。requirements 和 constraints 会被自动解析并分别写入 requirements.txtconstraints.txt 文件,并作为模型的一部分存储。依赖项也会被写入模型的 conda 环境(conda.yaml)文件的 pip 部分。

    警告

    以下参数不能同时指定:

    • conda_env

    • pip_requirements

    • extra_pip_requirements

    This example 演示了如何使用 pip_requirementsextra_pip_requirements 指定 pip 依赖。

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

  • store_license – 如果为 True,许可证将随模型一起存储,并在重新加载模型时使用。

  • name – 模型名称。

  • params – 一个用于与模型一同记录的参数字典。

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

  • model_type – 模型的类型。

  • step – 在该步记录模型输出和指标

  • model_id – 模型的 ID。

Returns

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

Example
import os
import json
import pandas as pd
import mlflow
from johnsnowlabs import nlp

# Write your raw license.json string into the 'JOHNSNOWLABS_LICENSE_JSON' env variable
creds = {
    "AWS_ACCESS_KEY_ID": "...",
    "AWS_SECRET_ACCESS_KEY": "...",
    "SPARK_NLP_LICENSE": "...",
    "SECRET": "...",
}
os.environ["JOHNSNOWLABS_LICENSE_JSON"] = json.dumps(creds)

# Download & Install Jars/Wheels if missing and Start a spark Session
nlp.start()

# For more details on trainable models and parameterization like embedding choice see
# https://nlp.johnsnowlabs.com/docs/en/jsl/training
trainable_classifier = nlp.load("train.classifier")

# Create a sample training dataset
data = pd.DataFrame(
    {"text": ["I hate covid ", "I love covid"], "y": ["negative", "positive"]}
)

# Fit and get a trained classifier
trained_classifier = trainable_classifier.fit(data)
trained_classifier.predict("He hates covid")

# Log it
mlflow.johnsnowlabs.log_model(trained_classifier, name="my_trained_model")
mlflow.johnsnowlabs.save_model(spark_model, path, mlflow_model=None, conda_env=None, code_paths=None, dfs_tmpdir=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, store_license=False)[source]

将 Spark johnsnowlabs Model 保存到本地路径。

默认情况下,此函数使用 Spark MLlib 的持久化机制保存模型。

Parameters
  • spark_model – 要保存的对象,可以是 pyspark.ml.pipeline.PipelineModel 或 nlu.NLUPipeline 对象。 Every johnsnowlabs model 是一个 PipelineModel,并且可作为 nlu.NLUPipeline 加载。

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

  • mlflow_model – MLflow 模型配置,此 flavor 正在被添加到该配置。

  • conda_env

    要么是 Conda 环境的字典表示,要么是指向 Conda 环境 yaml 文件的路径。如果提供,则描述了运行该模型应使用的环境。至少,它应指定包含在 get_default_conda_env() 中的依赖项。如果 None,则会将默认的 get_default_conda_env() 环境添加到模型中。以下是一个 示例 的 Conda 环境字典表示:

    {
        'name': 'mlflow-env',
        'channels': ['defaults'],
        'dependencies': [
            'python=3.8.15',
            'johnsnowlabs'
        ]
    }
    

  • code_paths

    本地文件系统中指向 Python 文件依赖(或包含文件依赖的目录)路径的列表。这些文件在模型加载时会被预先添加到系统路径中。如果为某个模型声明了依赖文件且多个文件之间存在导入依赖关系,那么这些文件应从一个共同的根路径声明相对导入,以避免在加载模型时发生导入错误。

    有关 code_paths 功能、推荐的使用模式和限制的详细说明,请参阅 code_paths usage guide

  • dfs_tmpdir – 在分布式(Hadoop)文件系统(DFS)上的临时目录路径,或在本地模式下运行时的本地文件系统路径。模型将写入此目的地,然后复制到请求的本地路径。这是必要的,因为在集群上运行时,Spark ML 模型会从并写入 DFS。如果此操作成功完成,所有在 DFS 上创建的临时文件都将被移除。默认值为 /tmp/mlflow

  • signature

    ModelSignature 描述模型输入和输出 Schema。 模型签名可以从具有有效模型输入(例如省略目标列的训练数据集)和有效模型输出(例如在训练数据集上生成的模型预测)的数据集中inferred,例如:

    from mlflow.models.signature import infer_signature
    
    train = df.drop_column("target_label")
    predictions = ...  # 计算模型预测
    signature = infer_signature(train, predictions)
    

  • input_example – 一个或多个有效模型输入实例。输入示例用于提示应向模型提供何种数据。它将被转换为一个 Pandas DataFrame,然后使用 Pandas 的 split-oriented 格式序列化为 json,或者转换为一个 numpy array,其中示例将通过将其转换为列表的方式序列化为 json。字节使用 base64 编码。当 signature 参数为 None 时,输入示例用于推断模型签名。

  • pip_requirements – 要么是一个可迭代的 pip 依赖字符串(例如 ["johnsnowlabs", "-r requirements.txt", "-c constraints.txt"])或本地文件系统上 pip requirements 文件的字符串路径(例如 "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 文件的字符串路径(例如 "requirements.txt")。如果提供,该参数描述了附加的 pip 依赖,这些依赖会被追加到基于用户当前软件环境自动生成的默认 pip 依赖集合中。requirements 和 constraints 会被自动解析并分别写入 requirements.txtconstraints.txt 文件,并作为模型的一部分存储。依赖项也会被写入模型的 conda 环境(conda.yaml)文件的 pip 部分。

    警告

    以下参数不能同时指定:

    • conda_env

    • pip_requirements

    • extra_pip_requirements

    This example 演示了如何使用 pip_requirementsextra_pip_requirements 指定 pip 依赖。

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

  • store_license – 如果为 True,许可证将随模型一起存储,并在重新加载时使用。

Example
from johnsnowlabs import nlp
import mlflow
import os

# Write your raw license.json string into the 'JOHNSNOWLABS_LICENSE_JSON' env variable
creds = {
    "AWS_ACCESS_KEY_ID": "...",
    "AWS_SECRET_ACCESS_KEY": "...",
    "SPARK_NLP_LICENSE": "...",
    "SECRET": "...",
}
os.environ["JOHNSNOWLABS_LICENSE_JSON"] = json.dumps(creds)

# Download & Install Jars/Wheels if missing and Start a spark Session
nlp.start()

# load a model
model = nlp.load("en.classify.bert_sequence.covid_sentiment")
model.predict(["I hate covid", "I love covid"])

# Save model as pyfunc and johnsnowlabs format
mlflow.johnsnowlabs.save_model(model, "saved_model")
model = mlflow.johnsnowlabs.load_model("saved_model")
# Predict with reloaded model,
# supports datatypes defined in https://nlp.johnsnowlabs.com/docs/en/jsl/predict_api#supported-data-types
model.predict(["I hate covid", "I love covid"])