我目前正在尝试在 Azure Databricks 上使用 Hyperopt 和 MLflow 进行超参数调整。在 Databricks 中使用默认跟踪 URI 没有错误,但在切换到本地(文件)MLflow 后端后,我遇到了一个烦人的问题。为了清楚起见,我已经切换到:
mlflow.set_tracking_uri('file://dbfs/mnt/my_experiments/')
我运行以下代码块,用于使用 Hyperopt 和 SparkTrials 并行化运行:
with mlflow.start_run():
trials = SparkTrials(parallelism=parallelism)
fmin_objective = cross_validation_func
best = fmin(
fn=fmin_objective,
space=search_space,
algo=algo,
trials=trials,
max_evals=n_iters
)
...并以错误告终:
Hyperopt 无法在跟踪 URI 处登录 MLflow 服务器:file://dbfs/mnt/my_experiments/ 异常:标记值 {插入搜索空间} 的长度为 9393,超过了 5000 的长度限制
我开始明白这可以使用 Databricks MLflow 后端而不是本地后端,因为标签值大小有不同的限制(来自https://www.mlflow.org/docs/latest/rest-api.html) :
{tag value:} 正在记录的标签的字符串值。最大大小取决于存储后端。所有存储后端都保证支持最大 5000 字节的键值。这是必填栏。
由于 MLflow 在运行时会自动记录搜索空间fmin()
,因此我很难在这里找到解决方法。我已经尝试过从自动记录中禁用 MLflow,但还没有运气。那里有任何提示吗?
编辑:还是我误解了 Hyperopt 应该如何与 SparkTrials 一起使用?它可以与本地 MLflow 后端一起使用吗?我尝试减小搜索空间的大小,虽然上面提到的错误消失了,但运行fmin()
其中一个algo = tpe.suggest
或algo = rand.suggest
导致奇怪的行为和一条错误消息,指出不支持此操作...