我正在将一个 scikit-learn 训练的模型保存到我的 Windows 笔记本电脑中的 MLflow 模型注册表中。我正在使用 databricks-connect 连接到 Azure Databricks 集群并从我的本地 Pycharm 在那里训练模型,但是为了开发,我在我的笔记本电脑中启动模型注册表并将训练好的模型保存在其中 - 以避免必须设置远程访问 DBFS .
我在使用 spark_udf 函数时遇到问题。我可以从笔记本电脑的模型注册表中读取模型,但不能将其用作 Databricks 集群中的 UDF:
model_udf = mlflow.pyfunc.spark_udf(spark, "models:/mymodel/production") # this works fine
struct_col = F.struct(*df.columns)
predictions = df.withColumn("pred_spark", model_udf(struct_col))
predictions.show() # throws an exception(see below)
pyspark.sql.utils.PythonException:从 UDF 引发异常:'FileNotFoundError:
[Errno 2] 没有这样的文件或目录:
'/local_disk0/spark-1fa39b20-9d2c-4697-957c-392d80326dee/exectutor-57b039d8-472405-472472-612e912e9b87b87b3ddddddddddd dd/spark-e44242414.4424.44c6 park y44c6e4.4b4c6 aky44.4c6pary7b4.4c6pary7-4c6 pary-4.4 car 0944cc91ef4d/c:\temp\tmpsl4hpeyt.zip'
最后一部分很奇怪,因为它混合了 linux 风格的路由和 Windows 路由(就像我的 Windows 笔记本电脑本地目录中的路由)。我以为驱动程序会从模型注册表中读取模型并将其广播给工作人员以调用 UDF,但看起来工作人员正试图直接从远程模型注册表中获取它,对吗?是否有不需要将模型保存在远程模型注册表中的解决方案 - 或者至少,配置安全性以访问 DBFS?
编辑:设置将模型注册到远程注册表后(没那么难!)我现在可以将注册模型下载为 sklearn 模型并使用它进行预测,但我不能通过 spark_udf 做同样的事情。我得到
- 如果我在函数 spark_udf 中通过 runs:/.... 指定模型,则会出现相同的 FileNotFound 错误
- 如果我在 spark_udf 中通过 model:/... 指定模型,则会出现 SSL 错误(未经验证的自签名证书),即使我已在 .databrickscfg 中明确添加了新行
insecure = True
- 因为这不起作用,所以也添加了os.environ["MLFLOW_TRACKING_INSECURE_TLS"] = "true"
但没有效果。我猜它正在做一些事情,因为至少我可以从注册表中下载模型,当它不是 spark_udf,但看起来像“工人?” 当他们尝试做同样的事情时遇到问题(这是我的猜测,不知道这是否有意义)