2

我正在研究将 MLflow 用作我们数据科学计划的一部分,并且我希望在 Windows 上的数据块上建立一个远程执行的最小工作示例。

但是,当我执行远程执行时,会在 MLflow 包中的 Windows 上本地创建一个路径,并将其发送到 databricks。此路径指定与包含 MLflow 项目的 Github 存储库相对应的“.tar.gz”文件的上传位置。在 cmd 中,它具有 '\' 和 '/' 的组合,但在 databricks 上,此路径中根本没有分隔符,这会引发 'rsync: No such file or directory (2)' 错误。

更笼统地说,我使用 MLflow 标准示例并遵循 databricks 中的本指南重现了该错误。MLflow 示例是sklearn_elasticnet_wine ,但我必须为参数添加默认值,因此我对其进行了分叉,并且可以在 ( forked repo )中找到可以远程执行的 MLproject 。

该项目可以通过以下命令远程执行(假设已经设置了databricks实例)

mlflow run https://github.com/aestene/mlflow#examples/sklearn_elasticnet_wine -b databricks -c db-clusterconfig.json --experiment-id <insert-id-here>

其中“db-clusterconfig.json”对应于要在 databricks 中设置的集群,在此示例中设置为

{
    "autoscale": {
        "min_workers": 1,
        "max_workers": 2
    },
    "spark_version": "5.5.x-scala2.11",
    "node_type_id": "Standard_DS3_v2",
    "driver_node_type_id": "Standard_DS3_v2",
    "ssh_public_keys": [],
    "custom_tags": {},
    "spark_env_vars": {
        "PYSPARK_PYTHON": "/databricks/python3/bin/python3"
    }
}

远程运行项目时,cmd中的输出如下:

2019/10/04 10:09:50 INFO mlflow.projects: === Fetching project from https://github.com/aestene/mlflow#examples/sklearn_elasticnet_wine into C:\Users\ARNTS\AppData\Local\Temp\tmp2qzdyq9_ ===
2019/10/04 10:10:04 INFO mlflow.projects.databricks: === Uploading project to DBFS path /dbfs\mlflow-experiments\3947403843428882\projects-code\aa5fbb4769e27e1be5a983751eb1428fe998c3e65d0e66eb9b4c77355076f524.tar.gz ===
2019/10/04 10:10:05 INFO mlflow.projects.databricks: === Finished uploading project to /dbfs\mlflow-experiments\3947403843428882\projects-code\aa5fbb4769e27e1be5a983751eb1428fe998c3e65d0e66eb9b4c77355076f524.tar.gz ===
2019/10/04 10:10:05 INFO mlflow.projects.databricks: === Running entry point main of project https://github.com/aestene/mlflow#examples/sklearn_elasticnet_wine on Databricks ===
2019/10/04 10:10:06 INFO mlflow.projects.databricks: === Launched MLflow run as Databricks job run with ID 8. Getting run status page URL... ===
2019/10/04 10:10:18 INFO mlflow.projects.databricks: === Check the run's status at https://<region>.azuredatabricks.net/?o=<databricks-id>#job/8/run/1 ===

DBFS 路径有一个前导“/”,其余为“\”。

该命令在 databricks 中启动集群并准备执行作业,但在 databricks 端出现以下错误消息:

rsync: link_stat "/dbfsmlflow-experiments3947403843428882projects-codeaa5fbb4769e27e1be5a983751eb1428fe998c3e65d0e66eb9b4c77355076f524.tar.gz" failed: No such file or directory (2)
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1183) [sender=3.1.1]

我们可以看到相同的路径但没有插入“\”。我在 MLflow Github存储库中缩小了此文件路径的创建范围,其中以下代码创建了路径(第 133 行):

dbfs_path = os.path.join(DBFS_EXPERIMENT_DIR_BASE, str(experiment_id),
                                     "projects-code", "%s.tar.gz" % tarfile_hash)
dbfs_fuse_uri = os.path.join("/dbfs", dbfs_path)

我目前的假设是,os.path.join()在第一行中,以“windows 方式”将字符串连接在一起,使得它们具有反斜杠。然后下面的调用os.path.join()添加一个'/'。然后,databricks 文件系统无法处理此路径,并且某些原因导致“tar.gz”文件无法正确上传或在错误的路径下访问。

还应该提到的是,该项目在本地运行良好。

我正在运行以下版本:

视窗 10

Python 3.6.8

MLflow 1.3.0(也复制了 1.2.0 的故障)

非常感谢任何反馈或建议!

4

2 回答 2

1

感谢您的发现,您说得对,os.path.join在使用 DBFS 路径时使用不正确,导致路径格式错误,从而中断项目执行。我已经提交到https://github.com/mlflow/mlflow/issues/1926跟踪这个,如果您有兴趣制作一个错误修复 PR(有关如何执行此操作的信息,请参阅 MLflow 贡献者指南)以替换os.path.join此处我很os.posixpath.join乐意复习:)

于 2019-10-11T00:00:25.483 回答
1

感谢您提出这个问题。我在 Windows 10 上也遇到了同样的情况。

我解决了这个问题,将“databricks.py”文件中的所有“os.path”替换为“posixpath”。它对我来说非常好。

于 2019-10-24T10:58:32.073 回答