我正在研究将 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 的故障)
非常感谢任何反馈或建议!