【问题标题】:MLflow FileNotFound when calling spark_udf from pycharm with databricks-connect使用 databricks-connect 从 pycharm 调用 spark_udf 时的 MLflow FileNotFound
【发布时间】:2021-12-20 16:44:21
【问题描述】:

我正在将经过 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 / EXECUTOR-57B039D8-7405-47C4-B072-612CA2B8B3DD / SPARK-E442241D-4007-4C6E-8ACD-BF2A35B1A455 / SECORATSPARKFILES / 044CD765-F5F7-46B3 -9efb-0944cc91ef4d/c:\temp\tmpsl4hpeyt.zip'

最后一部分很奇怪,因为它混合了 linux 风格的路由和 Windows 路由(就像我的 Windows 笔记本电脑本地目录中的路由)。我以为驱动程序会从模型注册表中读取模型并将其广播给工作人员以调用 UDF,但看起来工作人员正试图直接从远程模型注册表中获取它,对吗?是否有不需要将模型保存在远程模型注册表中的解决方案 - 或者至少配置安全性以访问 DBFS?

编辑: 设置将模型注册到远程注册表 (not that difficult!) 后,我现在可以将注册模型下载为 sklearn 模型并使用它进行预测,但我无法做到通过 spark_udf 相同。我得到了

  • 如果我在函数 spark_udf 中通过 runs:/.... 指定模型,则会出现相同的 FileNotFound 错误
  • 如果我在 spark_udf 中通过 model:/... 指定模型,则会出现 SSL 错误(未经验证的自签名证书),即使我在 .databrickscfg 中明确添加了新行 insecure = True - 因为那是不起作用,还添加了os.environ["MLFLOW_TRACKING_INSECURE_TLS"] = "true",但没有效果。我猜它正在做某事,因为至少我可以从注册表中下载模型,当它不是 spark_udf 时,但看起来像“工人?”当他们尝试做同样的事情时遇到问题(这是我的猜测,不知道这是否有意义)

【问题讨论】:

    标签: apache-spark pyspark mlflow databricks-connect


    【解决方案1】:

    Databricks 的构造几乎可以在本机函数中的任何地方使用 dbfs。 当您在驱动程序或执行程序上指定一些本地路径或本地路径时,它无论如何都会在 DBFS 上查找。这就是为什么 /local_disk0/ 这是默认的 tempt dbfs 位置,它在其他地方添加了您指定的子目录。我想在 spark 驱动程序上使用文件夹并放弃了,因为它总是添加 /local_disk0/ 前缀。

    【讨论】:

    • 谢谢 Hubert,实际上,如果它以 file:/// 开头,或者即使您将开头留空,您也可以指定一个本地路径,就好像它是您在 python 中的工作目录的相对路径一样。至少,这对我来说很好。 Spark 通过查看您的路径如何开始就知道您指的是什么。
    • spark 是的,但在这种情况下是云版本 - databricks
    猜你喜欢
    • 1970-01-01
    • 2022-01-04
    • 2022-01-14
    • 1970-01-01
    • 2021-02-19
    • 2019-09-20
    • 2021-09-26
    • 1970-01-01
    • 2020-11-15
    相关资源
    最近更新 更多