Hyperopt 最佳做法和排除故障
注意
不再维护 Hyperopt 的开源版本。
Hyperopt 将在下一个主要 DBR ML 版本中被删除。 Azure Databricks 建议使用 Optuna,以便获得类似的体验,并访问最新的超参数优化算法。
最佳做法
- 贝叶斯方法比网格搜索和随机搜索要有效得多。 因此,使用 Hyperopt Tree of Parzen Estimators (TPE) 算法可以探索更多的超参数和更大的范围。 使用域知识限制搜索域可以优化调整并产生更好的结果。
- 使用
hp.choice()
时,Hyperopt 将返回选择列表的索引。 因此,登录到 MLflow 中的参数也是索引。 使用hyperopt.space_eval()
检索参数值。 - 对于训练时间较长的模型,请首先试验小型数据集和大量的超参数。 使用 MLflow 识别表现最好的模型,并确定哪些超参数可修复。 这样,在准备大规模优化时可以减小参数空间。
- 利用 Hyperopt 对条件维度和超参数的支持。 例如,评估梯度下降的多种形式时,可以让 Hyperopt 包含仅适用于部分形式的条件超参数,而不是将超参数空间限制为常见的超参数。 有关使用条件参数的详细信息,请参阅定义搜索空间。
- 使用
SparkTrials
时,请为只有 CPU 的群集和支持 GPU 的群集适当配置并行度。 在 Azure Databricks 中,CPU 和 GPU 群集在每个工作器节点上使用不同数量的执行程序线程。 CPU 群集为每个节点使用多个执行程序线程。 GPU 群集仅为每个节点使用一个执行程序线程,以避免尝试使用同一 GPU 的多个 Spark 任务之间发生冲突。 虽然通常这最适用于为 GPU 编写的库,但这意味着 GPU 群集上的最大并行度减少了,因此请注意在选择 GPU 实例类型时每个试验可使用的 GPU 数量。 有关详细信息,请参阅支持 GPU 的群集。 - 在自动缩放群集上不要使用
SparkTrials
。 Hyperopt 在执行开始时会选择并行度值。 如果群集稍后自动缩放,则 Hyperopt 将无法利用新的群集大小。
故障排除
- 报告的 NaN(非数值)损失通常表示传递给返回了 NaN 的
fmin()
的目标函数。 这不影响其他运行,可以放心地忽略它。 为了防止出现这种结果,请尝试调整超参数空间或修改目标函数。 - 由于 Hyperopt 使用随机搜索算法,这种损失通常不会随每次运行而单调降低。 但是,这些方法通常能够比使用其他方法更快地找到最佳的超参数。
- Hyperopt 和 Spark 都会产生开销,在较短试运行(数十秒)的持续时间内,这些开销可能占主导。 观测到的加速效果可能很小,甚至为零。
示例笔记本:不同大小的数据集的最佳做法
SparkTrials
在 Spark 工作器节点上运行试用。 本笔记本指导了在使用 SparkTrials
时如何将不同数量级的数据集移动到工作器节点。