Kubeflow Pipelines的核心在于其编排复杂工作流的能力。在本例中,我们将探索如何使用Kubeflow Pipelines自动和编排监督调整管道,针对由Google提供的基础模型PaLM 2进行参数高效微调(PEFT)。这种方法强调了重用现有管道以加速机器学习模型开发和部署的实用性,特别是对于像PaLM 2这样的大型复杂模型。
重用现有的管道可以显著减少开发时间和努力,通过利用预建的工作流。这不仅加快了实验过程,而且确保了嵌入原始管道的最佳实践得以保持。在这个场景中,我们将重点放在PaLM 2的参数高效微调(PEFT)管道上,由Google提供。这使我们能够在特定的数据集上对模型进行微调,而无需从头开始。
为了进行微调,我们使用两个包含训练和评估数据的JSONL文件。移除文件中的时间戳以确保所有学习者的一致性,并简化数据准备过程。
TRAINING_DATA_URI = "./tune_data_stack_overflow_python_qa.jsonl"
EVALUATION_DATA_URI = "./tune_eval_data_stack_overflow_python_qa.jsonl"
模型版本控制是机器学习操作(MLOps)中的关键实践,它使得实验可重复、可审计,并支持回滚。在这个例子中,我们将当前日期和时间附加到模型名称上,以创建一个唯一的版本标识符。
import datetime
date = datetime.datetime.now().strftime("%H:%d:%m:%Y")
MODEL_NAME = f"deep-learning-ai-model-{date}"
然后,我们为PaLM模型的调整指定关键参数:
TRAINING_STEPS
: 定义训练步骤数。对于抽取式问答,推荐范围为100-500步。EVALUATION_INTERVAL
: 设置模型在训练过程中被评估的频率。默认每20步进行一次评估。TRAINING_STEPS = 200
EVALUATION_INTERVAL = 20
身份验证和项目设置是访问Google Cloud资源和服务的必要步骤。authenticate
函数从实用程序脚本中提供所需的凭证和项目ID以配置管道执行环境。
from utils import authenticate
credentials, PROJECT_ID = authenticate()
REGION = "us-central1"
下一步涉及定义管道参数。这些参数指定了管道的输入和配置,根据我们的具体需求定制微调过程。
pipeline_arguments = {
"model_display_name": MODEL_NAME,
"location": REGION,
"large_model_reference": "text-bison@001",
"project": PROJECT_ID,
"train_steps": TRAINING_STEPS,
"dataset_uri": TRAINING_DATA_URI,
"evaluation_interval": EVALUATION_INTERVAL,
"evaluation_data_uri": EVALUATION_DATA_URI,
}
最后,我们设置并提交管道作业以供执行,使用PipelineJob
类。这一步包括指定可重用的管道YAML文件的路径、作业的显示名称、管道参数、执行区域以及用于临时文件的管道根目录。启用缓存通过重用未更改的组件的输出来优化执行。
pipeline_root = "./"
job = PipelineJob(
template_path=template_path,
display_name=f"deep_learning_ai_pipeline-{date}",
parameter_values=pipeline_arguments,
location=REGION,
pipeline_root=pipeline_root,
enable_caching=True,
)
job.submit()
print(job.state)
本例说明了如何使用Kubeflow Pipelines自动化和编排监督调整管道,以微调基础模型。通过重用现有的管道、指定关键参数,并在管理环境中执行管道,我们可以有效地对像PaLM 2这样的大型模型进行微调。这种方法不仅加速了模型开发的过程,而且还融入了MLOps的最佳实践,包括版本控制、可重复性和高效资源利用。
解释Kubeflow Pipelines在自动化机器学习工作流中的作用及其确保实验一致性与可重复性的重要性。
描述Kubeflow Pipelines SDK中dsl和compiler模块的功能。
dsl
模块提供了定义管道组件和管道本身的装饰器和函数;compiler
模块负责将定义好的管道编译成YAML文件,以便在Kubeflow环境中执行。如何管理与Kubeflow Pipelines相关的未来警告,以保持输出的可读性而不忽略重要的更新?
warnings
模块来过滤掉未来的警告,例如通过设置warnings.filterwarnings("ignore", category=FutureWarning)
。为什么设计机器学习管道组件时需要考虑清晰的接口和重用性?
解释@dsl.component
装饰器在定义Kubeflow Pipeline组件中的用途。
@dsl.component
装饰器用于标记一个函数作为Kubeflow Pipeline的一个组件,使得该函数可以被管道编译器识别并在管道中使用。描述当在一个管道内调用一个带有@dsl.component
装饰器的函数时,PipelineTask
对象的行为和效用。
@dsl.component
装饰器的函数会返回一个PipelineTask
对象,该对象代表管道中即将执行的任务。PipelineTask
对象的.output
属性可用于传递组件的输出给其他组件。如何将一个Kubeflow Pipeline组件的输出作为另一个组件的输入?
PipelineTask
对象的.output
属性来实现。使用关键字参数调用Kubeflow Pipeline组件函数有何重要性?
概述在Kubeflow Pipelines中链接组件的过程及传递.output
属性以实现数据流的重要性。
PipelineTask
对象的.output
属性来完成。这确保了数据按照预定的顺序从一个组件流动到下一个组件。如何定义一个Kubeflow管道,并确保其正确执行和输出处理的关键考虑因素是什么?
描述编译、查看和执行Kubeflow Pipeline的过程,包括YAML文件在编译过程中的作用。
compiler
模块将定义好的管道转化为YAML文件。查看YAML文件有助于理解编译后的管道结构。执行管道则通过PipelineJob
类完成。解释如何通过重用现有的管道(如PaLM 2的监督调整管道)来提高机器学习项目的效率和最佳实践。
讨论数据和模型版本控制在MLOps中的重要性,并提供一个创建唯一模型版本标识符的例子。
如何定义和使用Kubeflow Pipeline中的管道参数?
反思使用Kubeflow Pipelines自动化和编排复杂的机器学习工作流的好处和挑战,特别是在对大型模型如PaLM 2进行微调的上下文中。
设置Kubeflow Pipelines SDK
dsl
和compiler
)。使用warnings
模块抑制来自Kubeflow Pipelines SDK的FutureWarning
警告。定义一个简单的管道组件
add_numbers
的简单组件,该组件接受两个整数作为输入并返回它们的和。使用@dsl.component
装饰器来定义这个组件。抑制特定警告
DeprecationWarning
类型的警告,无论其来源。使用warnings
模块完成此任务。在管道中链接组件
编译和准备管道以供执行
compiler
模块将该管道编译成YAML文件。处理PipelineTask
对象
PipelineTask
对象),并访问其输出。该函数不需要是管道的一部分,只需要展示概念即可。在管道定义中的错误处理
PipelineTask
对象),然后纠正错误。包括注释解释为什么最初的尝试会失败以及如何修正问题。为模型训练自动化数据准备
在管道中实现模型版本控制
参数化并执行Kubeflow Pipeline
recipient_name
),并演示如何使用假设的执行环境的API提交该管道以供执行。