尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

MLflow John Snow Labs 模型集成:`mlflow.johnsnowlabs` Flavor 的日志、加载与部署实战指南

MLflow John Snow Labs 模型集成:`mlflow.johnsnowlabs` Flavor 的日志、加载与部署实战指南 MLflow John Snow Labs 模型集成mlflow.johnsnowlabsFlavor 的日志、加载与部署实战指南【免费下载链接】mlflowThe open source AI engineering platform for agents, LLMs, and ML models. MLflow enables teams of all sizes to debug, evaluate, monitor, and optimize production-quality AI applications while controlling costs and managing access to models and data.项目地址: https://gitcode.com/GitHub_Trending/ml/mlflowmlflow.johnsnowlabs是 MLflow 为 John Snow Labs 企业级 NLP 模型提供的官方模型 Flavor用于在 MLflow 中记录log、保存save与加载load基于 Spark NLP / NLU 的模型。本指南以 mlflow.johnsnowlabs.rst 对应的 API 文档为骨架结合 模块源码、官方示例 与 集成测试完整讲解 License 环境变量的配置、log_model/save_model/load_model的核心用法、pyfunc 部署以及底层实现原理帮助你快速把 John Snow Labs 的医疗、金融、法律等领域预训练模型纳入 MLflow 模型生命周期管理。一、mlflow.johnsnowlabs是什么双 Flavor 模型集成mlflow.johnsnowlabs模块提供了针对Spark NLP 与 NLU 模型的日志与加载 API模块入口见 mlflow/johnsnowlabs/init.py。该模块每次导出模型时都会同时产生两个 FlavorJohnsnowlabs原生格式模型以 Spark MLlib 的 PipelineModel 持久化格式保存可被加载为NluPipeline底层即 Spark MLlib PipelineModel用于在 Spark Session 中以 Spark Transformer 的方式做分布式打分。这是该模块的主 Flavor总是被生成。mlflow.pyfunc格式支持在 Spark 之外部署加载时会实例化一个 SparkContext并把输入数据转为 Spark DataFrame 后进行打分同时也支持在 Spark 内以 Spark UDF 形式部署。带此 Flavor 的模型可以被加载为普通 Python 函数进行推理。该 Flavor 同样总是被生成。借助这一 Flavor你可以访问 John Snow Labs 提供的20000 覆盖 200 语言的 SOTA 企业级 NLP 模型如 LLM、文本摘要、问答、命名实体识别、关系抽取、情感分析、拼写检查、图像分类、自动语音识别等这些模型由 John Snow Labs 提供需要其Enterprise NLP License详见 docs/docs/classic-ml/model/index.mdx。二、前置条件License 环境变量的配置使用mlflow.johnsnowlabs前必须配置 John Snow Labs 的许可证信息。License JSON 中必须包含以下四个 keyKey含义SECRETJohn Snow Labs Enterprise NLP Library 的 secretSPARK_NLP_LICENSE你的 John Snow Labs Enterprise NLP LicenseAWS_ACCESS_KEY_ID访问 John Snow Labs Enterprise Models 的 AWS Secret IDAWS_SECRET_ACCESS_KEY访问 John Snow Labs Enterprise Models 的 AWS Secret key配置方式把原始 license.json 字符串写入名为JOHNSNOWLABS_LICENSE_JSON的环境变量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)从源码看_validate_env_vars()会在每次log_model/save_model/load_model调用前检查该环境变量缺失时直接抛出Exception随后_set_env_vars()会把 JSON 中的每一项解析后写入对应环境变量见 mlflow/johnsnowlabs/init.py。此外模块还涉及两个额外的环境变量源码中的常量定义见 mlflow/johnsnowlabs/init.pyHEALTHCARE_SECRET用于拼接 spark-nlp-jsl医疗版wheel 的下载地址VISUAL_SECRET用于拼接 spark-ocr视觉版wheel 的下载地址在get_default_pip_requirements()中若两个 secret 都未设置会抛出异常设置哪个 secret对应版本的 wheel 就会被追加进模型默认依赖列表详见 mlflow/johnsnowlabs/init.py。测试中还有一种更自动化的方式通过JSL_ACCESS_KEY调用nlp.install(access_token...)自动下载 License 与安装库再把JslSecrets序列化为 JSON 写入环境变量见 tests/johnsnowlabs/test_johnsnowlabs_model_export.py。三、用log_model记录模型到当前 Runlog_model接收一个通过nlp.load()创建的Johnsnowlabs NLUPipeline将其作为 MLflow artifact 记录到当前 run使用 MLlib 持久化格式并生成带johnsnowlabsFlavor 的 MLflow Model。若当前没有活跃 run它会自动创建一个 run 来获得 run_id。完整示例训练并记录一个分类器import os import json import pandas as pd import mlflow from johnsnowlabs import nlp # 1) 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) # 2) Download Install Jars/Wheels if missing and Start a spark Session nlp.start() # 3) 加载可训练模型trainable classifier trainable_classifier nlp.load(train.classifier) # 4) 构造示例训练数据 data pd.DataFrame({ text: [I hate covid , I love covid], y: [negative, positive], }) # 5) Fit 并得到训练好的分类器 trained_classifier trainable_classifier.fit(data) trained_classifier.predict(He hates covid) # 6) Log it mlflow.johnsnowlabs.log_model(trained_classifier, namemy_trained_model)示例出处mlflow/johnsnowlabs/init.pylog_model核心参数说明参数类型 / 默认值说明spark_modelNLUPipeline通过nlp.load()得到的 NLUPipeline必填artifact_pathstr已弃用改用namenamestr模型 artifact 名称conda_envdict 或 yaml 路径模型的 Conda 运行环境描述None时使用默认环境见第四节code_pathslist需要与模型一起打包的代码路径dfs_tmpdirstrDFSHadoop或本地文件系统上的临时目录模型先写入该目录再拷贝到 artifact 目录集群上 Spark ML 模型需经 DFS 读写。默认/tmp/mlflowregistered_model_namestr若指定则创建对应模型版本不存在时先创建注册模型signatureModelSignature描述模型输入输出 Schema可用mlflow.models.infer_signature从数据推断input_exampleModelInputExample模型的输入示例随模型一起保存await_registration_forint等待模型版本进入READY状态的秒数默认等待五分钟传0或None跳过等待pip_requirements/extra_pip_requirementslist / 路径覆盖或追加 pip 依赖metadatadict附加到模型的元数据store_licensebool为True时 License 会随模型一起存储加载时直接使用参数说明详见 mlflow/johnsnowlabs/init.py直接保存到远程 Artifact 的优化路径从源码看mlflow/johnsnowlabs/init.pylog_model内部有一个优化分支若当前 run 的 artifact URI 是远程地址会尝试通过_maybe_save_model用 Spark 把模型直接写入 artifact 仓库否则回退到Model.log()经本地临时目录中转。Databricks 环境下还会根据运行环境决定是否使用mlflowdbfs协议直写测试中对dbfs://、s3://、mlflowdbfs://多种 URI 组合均有断言见 tests/johnsnowlabs/test_johnsnowlabs_model_export.py 被注释的历史用例。四、save_model保存到本地路径save_model将 Spark johnsnowlabs 模型保存到本地路径默认使用 Spark MLlib 持久化机制from johnsnowlabs import nlp import mlflow 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) # 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 model.predict([I hate covid, I love covid])示例出处mlflow/johnsnowlabs/init.py核心参数与log_model基本一致spark_model可以是pyspark.ml.pipeline.PipelineModel或nlu.NLUPipeline每个 johnsnowlabs 模型都是 PipelineModel均可加载为 NLUPipelinepath为本地保存路径同样支持conda_env、code_paths、dfs_tmpdir、signature、input_example、pip_requirements、extra_pip_requirements、metadata、store_license。保存时的底层处理流程从源码可以梳理出save_model的实现链路mlflow/johnsnowlabs/init.py先生成 DFS 临时路径调用_unpack_and_save_model将模型写入临时目录若传入的是PipelineModel直接用write().overwrite().save(dst)若是 NLU pipe会先执行一次predict(Init)初始化再保存其vanilla_transformer_pipe见 mlflow/johnsnowlabs/init.py若运行在 Databricks 集群且支持 DBFS FUSE则用shutil.move把模型从 FUSE 路径移动到本地否则通过_HadoopFileSystem.copy_to_local_file拷贝最后调用_save_model_metadata写入MLmodel文件、conda/python 环境文件、requirements/constraints以及模型的 jars 与可选license。保存后的模型目录中模型数据固定存放在jsl-model子目录下常量_JOHNSNOWLABS_MODEL_PATH_SUB jsl-modeljars 与 license 存放在jsl-model/jars.jsl目录_save_jars_and_lic见 mlflow/johnsnowlabs/init.py。五、load_model加载并做推理load_model从指定 URI 加载 johnsnowlabs MLflow 模型支持多种 URI 形式本地路径/Users/me/path/to/local/model、relative/path/to/local/model对象存储s3://my_bucket/path/to/modelMLflow runruns:/mlflow_run_id/run-relative/path/to/model模型注册表models:/model_name/model_version、models:/model_name/stageimport mlflow from johnsnowlabs import nlp 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) # start a spark session nlp.start() # Load your MLflow Model model mlflow.johnsnowlabs.load_model(johnsnowlabs_model) # Make predictions on test documents prediction model.transform([I love Covid, I hate Covid])示例出处mlflow/johnsnowlabs/init.py返回值为nlu.NLUPipeline。参数方面dfs_tmpdir控制加载时使用的 DFS/本地临时目录默认/tmp/mlflow对应环境变量MLFLOW_DFS_TMP定义见 mlflow/environment_variables.pydst_path可指定本地下载目录必须已存在否则自动创建临时路径。加载实现要点load_model会先解析 root URI 与 artifact 路径、读取johnsnowlabsFlavor 配置并把模型下载到本地mlflow/johnsnowlabs/init.py若运行在 Databricks 集群且有 DBFS FUSE会走_load_model_databricks先把模型拷贝到 FUSE 临时目录因集群开启 passthrough 时shutil.copytree拷贝目录权限位会报 permission-denied故使用shutil_copytree_without_file_permissions再nlp.load见 mlflow/johnsnowlabs/init.py若使用mlflowdbfs协议则直接PipelineModel.load(mlflowdbfs_path)无活跃 SparkSession 时_get_or_create_sparksession会基于模型目录内打包的 jars 和 license 自动启动一个 Spark Session_fetch_deps_from_path从jars.jsl目录收集.jar与license.json见 mlflow/johnsnowlabs/init.py。六、通过 pyfunc 部署本地推理与 Spark UDF由于每次导出都同时生成pyfuncFlavor模型可以脱离 johnsnowlabs API 直接部署。官方示例 examples/johnsnowlabs/export.py 给出了完整流程import json import os import pandas as pd from johnsnowlabs import nlp import mlflow from mlflow.pyfunc import spark_udf # 1) Write your raw license.json string into the JOHNSNOWLABS_LICENSE_JSON env variable for MLflow creds { AWS_ACCESS_KEY_ID: ..., AWS_SECRET_ACCESS_KEY: ..., SPARK_NLP_LICENSE: ..., SECRET: ..., } os.environ[JOHNSNOWLABS_LICENSE_JSON] json.dumps(creds) # 2) Install enterprise libraries nlp.install() # 3) Start a Spark session with enterprise libraries spark nlp.start() # 4) Load a model and test it nlu_model en.classify.bert_sequence.covid_sentiment model_save_path my_model johnsnowlabs_model nlp.load(nlu_model) johnsnowlabs_model.predict([I hate COVID,, I love COVID]) # 5) Export model with pyfunc and johnsnowlabs flavors with mlflow.start_run(): model_info mlflow.johnsnowlabs.log_model(johnsnowlabs_model, namemodel_save_path) # 6) Load model with johnsnowlabs flavor mlflow.johnsnowlabs.load_model(model_info.model_uri) # 7) Load model with pyfunc flavor mlflow.pyfunc.load_model(model_save_path) # 8) Deploy as Spark UDF pandas_df pd.DataFrame({text: [Hello World]}) spark_df spark.createDataFrame(pandas_df).coalesce(1) pyfunc_udf spark_udf( sparkspark, model_urimodel_save_path, env_managervirtualenv, result_typestring, ) new_df spark_df.withColumn(prediction, pyfunc_udf(*pandas_df.columns))加载后还可以直接使用mlflow models serve命令把模型作为 REST 服务对外提供。pyfunc 的底层实现是_PyFuncModelWrapper见 mlflow/johnsnowlabs/init.py它包装 NLUPipeline 与 SparkSessionpredict方法接收 pandas DataFrame 并返回 JSON 格式的预测结果get_raw_model()可拿到底层原始模型。_load_pyfunc作为pyfunc.load_model的回调入口当 pyfunc 作为 UDF 在工作节点执行时会显式传入 SparkContext因为工作节点上无法自行获取这正是spark_udf场景下必须传入spark的原因见 mlflow/johnsnowlabs/init.py。七、环境与依赖管理get_default_pip_requirements()返回该 Flavor 导出的模型默认 pip 依赖源码见 mlflow/johnsnowlabs/init.py最小包含johnsnowlabs_for_databricksversion版本取自 johnsnowlabs 库自身设置固定版本的pyspark经_get_pinned_requirement处理设置HEALTHCARE_SECRET时追加spark-nlp-jsl医疗版 wheelhttps://pypi.johnsnowlabs.com/secret/spark-nlp-jsl/...设置VISUAL_SECRET时追加spark-ocr视觉版 wheelhttps://pypi.johnsnowlabs.com/secret/spark-ocr/...get_default_conda_env()基于上述依赖生成默认 Conda 环境。若自定义conda_env至少应包含默认环境中的依赖例如{ name: mlflow-env, channels: [defaults], dependencies: [ python3.8.15, johnsnowlabs ] }保存模型时_save_model_metadata会把环境统一序列化为conda.yaml、requirements.txt、constraints.txt与python_env.yaml写入模型目录见 mlflow/johnsnowlabs/init.py保证后续部署时环境可复现。测试test_model_export还验证了保存/加载后原模型与重载模型含原生与 pyfunc 两种方式、UDF 打分预测结果的一致性见 tests/johnsnowlabs/test_johnsnowlabs_model_export.py。八、常见使用要点与注意事项License 先行所有导出/加载操作前必须设置JOHNSNOWLABS_LICENSE_JSON否则直接抛异常医疗/视觉模型还需HEALTHCARE_SECRET/VISUAL_SECRET。store_licenseTrue才能随模型携带 License默认 License 不随模型存储跨环境加载时需在目标环境重新配置环境变量开启后 License 会写入jsl-model/jars.jsl/license.json加载时自动读取。Spark Session 自动管理加载模型时若没有活跃 SparkSession会自动用模型自带 jars 启动一个作为 UDF 部署时必须显式传入 SparkContext。签名与示例建议通过infer_signature与input_example记录模型签名和示例便于在 MLflow UI 中预览与校验对应测试见 tests/johnsnowlabs/test_johnsnowlabs_model_export.py。环境变量MLFLOW_DFS_TMP控制 DFS 临时目录默认/tmp/mlflow可在大规模集群场景下按需调整定义见 mlflow/environment_variables.py。九、总结mlflow.johnsnowlabs通过johnsnowlabs 原生 pyfunc双 Flavor 设计把 John Snow Labs 的 20000 企业级 NLP 模型无缝接入 MLflow 的模型记录、注册、版本管理与部署体系原生 Flavor 保留 Spark 分布式能力pyfunc Flavor 让模型可以在任意 MLflow 推理环境本地、Serving、Spark UDF中运行。配置好 License 环境变量后从nlp.load()到log_model/save_model/load_model再到spark_udf与mlflow models serve部署即可完成完整的企业级 NLP 模型生命周期管理。若需继续深入可阅读 模块源码、官方导出示例 与 模型 Flavor 集成测试。【免费下载链接】mlflowThe open source AI engineering platform for agents, LLMs, and ML models. MLflow enables teams of all sizes to debug, evaluate, monitor, and optimize production-quality AI applications while controlling costs and managing access to models and data.项目地址: https://gitcode.com/GitHub_Trending/ml/mlflow创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表