使用 Kubeflow Pipelines 基准脚本

如何使用 Kubeflow Pipelines 基准脚本

本指南解释了 Kubeflow Pipelines 基准脚本,并演示如何使用它们收集特定 Kubeflow Pipelines 实例的基本性能数据。

关于 Kubeflow Pipelines 基准脚本

Kubeflow Pipelines基准脚本模拟典型工作负载并记录性能指标,例如服务器延迟和管道运行持续时间。为了模拟典型工作负载,基准脚本将管道清单文件作为管道或管道版本上传到Kubeflow Pipelines实例,并同时创建多个运行。

您可以指定在基准脚本中使用的管道清单,或者您可以使用其中一个预加载的示例管道。例如,可以使用Kubeflow管道中的预加载示例。此外,使用一个代表您特定用例的管道清单也是一个好的做法。例如,如果您的Kubeflow管道集群主要用于图像识别任务的管道,那么在基准脚本中使用图像识别管道将是可取的。

在选择合适的管道后,基准脚本将同时多次运行它,如前所述。在Kubeflow Pipelines可以执行的所有操作中,运行管道无疑是最不可预测和成本最高的操作。其他操作,如创建管道(版本)或创建实验,通常会产生可预测且适中的成本。例如,创建一个管道版本将导致管道版本表中出现一行新记录,并在minio服务器中生成一个新文件。新文件的大小取决于管道版本的清单。如果我们排除极少数的极大清单的情况,并假设每个创建的管道版本的清单平均大小,则创建管道版本的总成本会随着管道版本数量的增加而线性增长。然而,另一方面,运行管道或管道版本的成本涉及更多的不确定性,有时费用相当高。一个管道或管道版本可以有任意的组件,因此运行管道或管道版本可能会产生任意的时间和空间复杂度。例如,管道中的一个步骤可以使用自定义的容器镜像,该镜像执行一个非常昂贵的训练任务。此外,Kubeflow Pipelines实例中的运行消耗的数据库空间也比管道、管道版本、实验等要多。因此,为了理解Kubeflow Pipelines实例中的性能和可扩展性痛点,更有效的方式是专注于工作负载中的运行操作。

运行基准脚本的先决条件

要运行提供的基准测试脚本,您需要以下内容:

  • 一个具有访问您Kubeflow Pipelines集群的Kubeflow Pipelines API的Jupyter notebook环境。例如,您必须能够从Jupyter notebook环境中调用CREATEGETDELETELIST方法,涉及管道、管道版本、运行、作业和实验服务。
  • 一个 Kubeflow Pipelines 集群。如果您没有 Kubeflow Pipelines 集群,请了解有关您 安装 Kubeflow Pipelines 的选项
  • 一个管道清单。例如,本指南使用 taxi_updated_pool.yaml 管道清单文件。

下面展示了一种设置所有内容并运行基准脚本的方法,作为示例。

运行基准测试脚本

使用以下说明在您的 Kubeflow Pipelines 集群上运行基准测试脚本。

  1. 在您的 Jupyter notebook 环境中下载 run_service_api.ipynb 基准脚本。

  2. 在本地 Jupyter notebook 中打开 run_service_api.ipynb。此基准脚本:

    1. 创建一个新的管道。
    2. 使用此管道的默认管道版本创建多个运行。
    3. 记录成功运行的次数。
    4. 记录每一次成功运行的持续时间。
    5. 记录 CREATEGETDELETE 的延迟。
    6. 清理管道及其默认管道版本、实验和运行。
  3. 在基准测试脚本中,为主机、pipeline_file_urlnum_runsrun_status_polling_interval_sec 输入正确的值,

    • host: 您的 Kubeflow Pipelines 集群中 API 服务器的 URL。

    • pipeline_file_url: 用于您的基准测试的管道清单文件的 URL。 taxi_updated_pool.yaml 在这个示例中使用。这个示例管道利用 nodeSelector 将此管道的运行明确调度到名为 pool-1 的节点池上。如果您在基准测试中使用 taxi_updated_pool.yaml 管道清单,请确保在您的集群中存在名为 pool-1 的节点池。

      注意: 在运行您的基准测试时,请勿使用值 https://storage.cloud.google.com/ml-pipeline/sample-benchmark/taxi_updated_pool.yaml。以 storage.cloud.google.com 开头的地址会产生重定向,而这与 Kubeflow Pipelines 的兼容性较差。

    • num_runs: 指定基准测试脚本中将创建多少次运行,并且是模拟工作负载的直接指标。

      注意: 在云服务上运行基准测试脚本会因消耗云资源而产生费用。

    • run_status_polling_interval_sec: 设置两个相邻的运行状态轮询之间的时间间隔。当一个运行达到成功状态时,记录运行持续时间。仅记录成功运行的持续时间。

  4. 在参数正确设置之后,您可以在笔记本中运行基准测试脚本。

以下快照显示了运行基准脚本 run_service_api.ipynb 使用taxi_updated_pool.yaml 在具有两个节点池的Kubernetes集群上进行50次运行的管道清单的结果。 每个节点池有三个类型为n1-standard-8的节点。

Benchmark Sample Output Plots

解读结果

在上述示例输出中,有两种类型的图。一个是 分布图,用于延迟和持续时间的测量;另一个是计数图, 用于计算成功和失败的运行。这些图的解读通常很简单。

在计数图中,x轴表示可能的运行状态:成功或失败;y轴显示分别有多少次运行属于某种状态。

在分布图中,显示了直方图和小地毯图。此外,还可以显示KDE(核密度估计)图。如果希望显示KDE图,请在distplot()方法中使用kde=True

使用不同配置进行调优

上述示例展示了通过运行基准脚本获得的一个性能报告。实际上,有多种方法可以调整管道和/或Kubernetes集群以获取性能报告。常见的方法是尝试

  • 不同的集群大小/区域,集群中池的数量不同, 每个池中节点的数量不同, 节点配置不同(例如,每个节点的RAM和磁盘配置,每个节点的CPU或GPU配置)

  • 不同的运行次数

  • 管道的不同大小/复杂性,例如,管道中的步骤数量

  • 不同的运行配置,例如,指定用于运行组件或管道的节点池

  • 等等。

局限性和未来工作

当基准测试脚本调整为生成适中的工作负载时,例如,上述示例中的50次运行,延迟和运行时长的测量可以正确进行。然而,看看Kubeflow Pipelines实例在一些极重负载下的表现或故障也很有趣,换句话说,就是探测Kubeflow Pipelines实例。示例基准测试脚本也可以用于这个目的。在这种情况下,基准测试脚本的测量图不再是预期的输出。相反,错误和错误日志提供了关于Kubeflow Pipelines部署的性能和可扩展性的信息。通过它们,可以发现并修复错误和痛点。此外,在用极重负载探测Kubeflow Pipelines实例时,为服务器代码添加内部监控以跟踪服务器性能将非常有帮助。例如,在未来,使用 Prometheus 跟踪和可视化Kubeflow Pipelines服务器的指标是可取的。

服务器内部的性能监控与客户端的性能测量是相辅相成的。当示例基准脚本从客户端测量延迟时,得到的测量结果依赖于Kubeflow Pipelines实例和网络传输。另一方面,内部监控关注的是在特定请求下,服务器内部的实际处理成本。因此,拥有客户端测量和服务器端监控对于准确分析Kubeflow Pipelines的性能和可扩展性是有帮助的。

联系

如果您在基准脚本中遇到任何问题,并且对Kubeflow Pipelines的性能和可扩展性有任何建议,请与我们反馈一个问题

反馈

此页面有帮助吗?