使用 Kubeflow Pipelines 基准脚本
旧版本
本页面是关于 Kubeflow Pipelines V1,有关最新信息,请参见 V2 documentation。
注意,虽然V2后端能够运行由V1 SDK提交的管道,我们强烈建议迁移到V2 SDK。作为参考,V1 SDK的最终版本是kfp==1.8.22,其参考文档在这里可用。
本指南解释了 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环境中调用
CREATE、GET、DELETE和LIST方法,涉及管道、管道版本、运行、作业和实验服务。 - 一个 Kubeflow Pipelines 集群。如果您没有 Kubeflow Pipelines 集群,请了解有关您 安装 Kubeflow Pipelines 的选项。
- 一个管道清单。例如,本指南使用 taxi_updated_pool.yaml 管道清单文件。
下面展示了一种设置所有内容并运行基准脚本的方法,作为示例。
运行基准测试脚本
使用以下说明在您的 Kubeflow Pipelines 集群上运行基准测试脚本。
在您的 Jupyter notebook 环境中下载
run_service_api.ipynb基准脚本。在本地 Jupyter notebook 中打开
run_service_api.ipynb。此基准脚本:- 创建一个新的管道。
- 使用此管道的默认管道版本创建多个运行。
- 记录成功运行的次数。
- 记录每一次成功运行的持续时间。
- 记录
CREATE、GET、DELETE的延迟。 - 清理管道及其默认管道版本、实验和运行。
在基准测试脚本中,为主机、
pipeline_file_url、num_runs、run_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: 设置两个相邻的运行状态轮询之间的时间间隔。当一个运行达到成功状态时,记录运行持续时间。仅记录成功运行的持续时间。
在参数正确设置之后,您可以在笔记本中运行基准测试脚本。
以下快照显示了运行基准脚本
run_service_api.ipynb
使用taxi_updated_pool.yaml
在具有两个节点池的Kubernetes集群上进行50次运行的管道清单的结果。
每个节点池有三个类型为n1-standard-8的节点。

解读结果
在上述示例输出中,有两种类型的图。一个是 分布图,用于延迟和持续时间的测量;另一个是计数图, 用于计算成功和失败的运行。这些图的解读通常很简单。
在计数图中,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的性能和可扩展性有任何建议,请与我们反馈一个问题。