我正在研究将MLflow用作我们的数据科学计划的一部分,并希望为从Windows的数据块建立远程执行的最小工作示例。
但是,当我执行远程执行时,会在MLflow包中的Windows本地创建一个路径,该路径会发送到databricks。此路径指定与包含MLflow项目的Github存储库相对应的'.tar.gz'文件的上传位置。在cmd中,它具有'\'和'/'的组合,但是在数据块上,此路径中根本没有分隔符,这引发了'rsync:无此类文件或目录(2)'错误。
更笼统地说,我使用MLflow标准示例并根据databricks的guide重现了该错误。 MLflow的示例是sklearn_elasticnet_wine,但是我必须在参数中添加默认值,因此我对其进行了分叉,可以在(forked repo)上找到可以远程执行的MLproject。
可以通过以下命令远程执行该项目(假设已经设置了数据砖实例)
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-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存储库中将此路径的创建范围缩小到此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方式”将字符串连接在一起,从而使它们带有反斜杠。然后对os.path.join()
的以下调用添加了一个'/'。然后,databricks文件系统无法处理此路径,并且某些原因导致“ tar.gz”文件无法正确上载或在错误的路径下被访问。
还应该提到该项目在本地运行良好。
我正在运行以下版本:
Windows 10
Python 3.6.8
MLflow 1.3.0(也用1.2.0复制了故障)
任何反馈或建议,我们将不胜感激!
答案 0 :(得分:1)
非常感谢您,使用DBFS路径时使用os.path.join
是不正确的,这会导致路径格式错误,从而影响项目执行,这是正确的。如果您有兴趣制作错误修正PR(https://github.com/mlflow/mlflow/issues/1926),以便将os.path.join
替换为os.posixpath.join
,我已提交see the MLflow contributor guide for info on how to do this跟踪,我很乐意评论:)
答案 1 :(得分:0)
感谢您提出此问题。 我在Windows 10上也遇到了同样的情况。
我解决了此问题,将“ databricks.py”文件中的所有“ os.path”替换为“ posixpath”。 对我来说效果很好。