来自 windows 的数据块上的 MLflow 远程执行创建了无效的 dbfs 路径

MLflow remote execution on databricks from windows creates an invalid dbfs path

我正在研究 MLflow 的使用作为我们数据科学计划的一部分,我希望在来自 windows.

的数据块上设置一个远程执行的最小工作示例

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

更一般地说,我使用 MLflow 标准示例并遵循此 guide from databricks. The MLflow example is the sklearn_elasticnet_wine, but I had to add a default value to a parameter so I forked it and the MLproject which can be executed remotely can be found at (forked repo).

重现了错误

项目可以通过以下命令远程执行(假设已经设置了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" 对应于要在数据块中设置的集群,在此示例中设置为

{
    "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-experiments47403843428882\projects-code\aa5fbb4769e27e1be5a983751eb1428fe998c3e65d0e66eb9b4c77355076f524.tar.gz ===
2019/10/04 10:10:05 INFO mlflow.projects.databricks: === Finished uploading project to /dbfs\mlflow-experiments47403843428882\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 存储库中将创建此路径的范围缩小到此 file,其中以下代码创建路径(第 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 fashion",这样它们就有反斜杠。然后下面对 os.path.join() 的调用添加了一个“/”。然后,databricks 文件系统无法处理此路径,并且某些原因导致 'tar.gz' 文件无法正确上传或在错误的路径上被访问。

还需要说明的是项目在本地运行良好

我是运行以下版本:

Windows 10

Python 3.6.8

MLflow 1.3.0(也用1.2.0复制了错误)

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

感谢您的关注,您说得对,在使用 DBFS 路径时使用 os.path.join 是不正确的,会导致路径格式错误,从而中断项目执行。我已向 https://github.com/mlflow/mlflow/issues/1926 track this, if you're interested in making a bugfix PR (see the MLflow contributor guide for info on how to do this) 申请将此处的 os.path.join 替换为 os.posixpath.join 我很乐意查看 :)

感谢您提出这个问题。 我在 windows 10.

也遇到了同样的情况

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