最佳做法:通过 Hyperopt 进行超参数优化

最佳实践

  • 贝叶斯方法比网格搜索和随机搜索要有效得多。 因此,使用 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 时如何将不同数量级的数据集移动到工作器节点。

处理不同数量级笔记本的数据集

获取笔记本