如何配置实验

用于超参数调优的 Katib Experiment 规范

本指南介绍了如何配置用于超参数 (HP) 调优的 Katib Experiment。

创建训练代码镜像

如果您不使用 Katib Python SDK 中的 tune API,您必须将您的训练代码打包到 Docker 容器镜像中,并将该镜像上传到仓库中。请查阅Docker 文档Kubernetes 文档了解更多信息。

配置实验

您可以在 Katib Experiment YAML 文件中配置 HP 调优任务。YAML 文件定义了您想要优化的 HP 的潜在值范围(搜索空间)、用于确定最优值的目标指标、优化期间使用的搜索算法以及其他配置。

作为参考,您可以使用随机搜索算法示例的 YAML 文件。

下面的列表描述了 Experiment YAML 文件中的字段。

  • objective:您想在超参数调优任务中优化的指标。您应该指定是希望 Katib 最大化还是最小化该指标。

    Katib 使用 objectiveMetricNameadditionalMetricNames 来监控超参数在模型上的表现。Katib 会记录最佳 objectiveMetricName 指标的值(根据 type 进行最大化或最小化)以及 Experiment 的 .status.currentOptimalTrial.parameterAssignments 中相应的超参数集。如果一组超参数的 objectiveMetricName 指标达到 goal,Katib 将停止尝试更多的超参数组合。

    您可以运行 Experiment 而无需指定 goal。在这种情况下,Katib 将一直运行 Experiment,直到相应的成功试验达到 maxTrialCountmaxTrialCount 参数将在下面描述。

    计算 Experiment 目标的默认方法是

    • 当目标 typemaximize 时,Katib 比较所有最大指标值。

    • 当目标 typeminimize 时,Katib 比较所有最小指标值。

    要更改此默认设置,请使用各种规则(minmaxlatest)定义 metricStrategies,以从 Experiment 的 objectiveMetricNameadditionalMetricNames 中提取每个指标的值。Experiment 的目标值将根据所选策略计算。

    例如,您可以在 Experiment 中按如下方式设置参数

    . . .
    objectiveMetricName: accuracy
    type: maximize
    metricStrategies:
      - name: accuracy
        value: latest
    . . .
    

    在这种情况下,Katib 控制器会从每个试验报告的所有最新 accuracy 指标中寻找最佳最大值。请查阅指标策略示例

    每个指标的默认策略类型等于目标的 type

  • algorithm:您希望 Katib 用于寻找最佳 HP 的搜索算法。示例包括随机搜索、网格搜索、贝叶斯优化等。请查阅HP 调优算法了解如何配置它们。

  • parallelTrialCount:Katib 应并行训练的最大 HP 集数量。默认值为 3。

  • maxTrialCount:要运行的最大试验数量。这相当于 Katib 应生成用于测试模型的 HP 集数量。如果省略 maxTrialCount 值,您的 Experiment 将一直运行,直到达到目标 goal 或 Experiment 达到最大失败试验数量。

  • maxFailedTrialCount:允许失败的最大试验数量。这相当于 Katib 应测试的失败 HP 集数量。Katib 将状态为 FailedMetricsUnavailable 的试验视为 Failed 试验,如果失败试验数量达到 maxFailedTrialCount,Katib 将停止 Experiment 并将其状态设为 Failed

  • parameters:您希望为机器学习 (ML) 模型调优的 HP 范围。这些参数定义了搜索空间,也称为可行集解空间。在规范的这一部分,您可以定义 HP 的名称、分布和类型:int(整数)、double(双精度浮点数)或 categorical(类别)。Katib 根据您指定的 HP 调优算法在此范围内生成 HP 组合。

  • trialTemplate:定义试验的模板。您必须将您的 ML 训练代码打包到 Docker 镜像中,如上文所述。trialTemplate.trialSpec 是您的非结构化模板,包含模型参数,这些参数将从 trialTemplate.trialParameters 中替换。例如,您的训练容器可以接收 HP 作为命令行参数或环境变量。您必须在 trialTemplate.primaryContainerName 中设置训练容器的名称。

    遵循试验模板指南,了解如何使用任何 Kubernetes 资源作为 Katib Trial 以及如何将 ConfigMap 用于 Trial 模板。

使用 Istio 运行 Katib 实验

来自此目录的 Katib Experiment 不适用于Istio sidecar 注入,因为试验需要访问互联网以下载数据集。如果您使用 Kubeflow 平台部署 Katib,则可以禁用 Istio sidecar 注入。在您的 Experiment 试验的模板中指定此注解:sidecar.istio.io/inject: "false" 来禁用 Istio sidecar 注入。

trialSpec:
  apiVersion: batch/v1
  kind: Job
  spec:
    template:
      metadata:
        annotations:
          "sidecar.istio.io/inject": "false"

如果您在试验模板中使用 PyTorchJob 或其他 Training Operator 任务,请在此处查看如何设置注解。

运行实验

您可以使用随机搜索示例的 YAML 文件创建超参数调优 Experiment。

Experiment 的试验使用 PyTorch 模型来训练 FashionMNIST 数据集的图像分类模型。您可以查看训练容器源代码注意:由于此训练容器会下载 FashionMNIST 数据集,如果您使用 Kubeflow 平台部署 Katib,则需要禁用 Istio sidecar 注入

部署 Experiment

kubectl create -f https://raw.githubusercontent.com/kubeflow/katib/master/examples/v1beta1/hp-tuning/random.yaml

此示例随机生成以下超参数

  • --lr:学习率。类型:double。
  • --momentum:PyTorch 优化器的动量。类型:double。

您可以在 status 规范中检查 Experiment 的结果。

$ kubectl -n kubeflow get experiment random -o yaml

apiVersion: kubeflow.org/v1beta1
kind: Experiment
metadata:
  ...
  name: random
  namespace: kubeflow
  ...
spec:
  ...
status:
  currentOptimalTrial:
    bestTrialName: random-hpsrsdqp
    observation:
      metrics:
        - latest: "0.11513"
          max: "0.53415"
          min: "0.01235"
          name: loss
    parameterAssignments:
      - name: lr
        value: "0.024736875661534784"
      - name: momentum
        value: "0.6612351235123"
  runningTrialList:
    - random-2dwxbwcg
    - random-6jd8hmnd
    - random-7gks8bmf
  startTime: "2021-10-07T21:12:06Z"
  succeededTrialList:
    - random-xhpcrt2p
    - random-hpsrsdqp
    - random-kddxqqg9
    - random-4lkr5cjp
  trials: 7
  trialsRunning: 3
  trialsSucceeded: 4

status.currentOptimalTrial 参数中查看关于最佳试验的信息。此外,status 显示了 Experiment 的试验及其当前状态。例如,运行此命令获取最优试验的信息

$ kubectl get experiment random -n kubeflow -o=jsonpath='{.status.currentOptimalTrial}'

{
  "bestTrialName": "random-hpsrsdqp",
  "observation": {
    "metrics": [
      {
        "latest": "0.11513",
        "max": "0.53415",
        "min": "0.01235",
        "name": "loss"
      }
    ]
  },
  "parameterAssignments": [
    {
      "name": "lr",
      "value": "0.024736875661534784",
    },
    {
      "name": "momentum",
      "value": "0.6612351235123"
    }
  ]
}

下一步

反馈

此页面有帮助吗?