![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/f284f9b109dd438d92fd5fec914aa126.webp#pic_center)
在Kubeflow中自动化和编排监督调整管道
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通过编排复杂的机器学习工作流,实现自动化。它确保了一致性和可重复性,因为管道定义了明确的数据流和组件之间的交互,使得整个过程可追踪且易于复制。
-
描述Kubeflow Pipelines SDK中dsl和compiler模块的功能。
dsl
模块提供了定义管道组件和管道本身的装饰器和函数;compiler
模块负责将定义好的管道编译成YAML文件,以便在Kubeflow环境中执行。
-
如何管理与Kubeflow Pipelines相关的未来警告,以保持输出的可读性而不忽略重要的更新?
- 可以使用Python的
warnings
模块来过滤掉未来的警告,例如通过设置warnings.filterwarnings("ignore", category=FutureWarning)
。
- 可以使用Python的
-
为什么设计机器学习管道组件时需要考虑清晰的接口和重用性?
- 清晰的接口和重用性使得组件易于理解和集成到不同的管道中,提高了代码的可维护性和可扩展性。
-
解释
@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可以实现工作流的自动化,提高效率,但同时也面临着诸如管道定义的复杂性和资源管理等挑战。
实践问题
-
设置Kubeflow Pipelines SDK
- 写一个Python脚本来导入Kubeflow Pipelines SDK中的必要模块(
dsl
和compiler
)。使用warnings
模块抑制来自Kubeflow Pipelines SDK的FutureWarning
警告。
- 写一个Python脚本来导入Kubeflow Pipelines SDK中的必要模块(
-
定义一个简单的管道组件
- 使用Kubeflow Pipelines SDK定义一个名为
add_numbers
的简单组件,该组件接受两个整数作为输入并返回它们的和。使用@dsl.component
装饰器来定义这个组件。
- 使用Kubeflow Pipelines SDK定义一个名为
-
抑制特定警告
- 修改Python脚本以抑制
DeprecationWarning
类型的警告,无论其来源。使用warnings
模块完成此任务。
- 修改Python脚本以抑制
-
在管道中链接组件
- 创建两个Kubeflow Pipeline组件,其中一个组件生成一个数字(例如返回一个固定的整数),另一个组件接收这个数字并将其加倍。定义一个管道,链接这两个组件,展示如何将一个组件的输出传递给另一个组件。
-
编译和准备管道以供执行
- 给定一个简单的管道定义(如上一个任务所示),编写一个Python脚本来使用Kubeflow Pipelines的
compiler
模块将该管道编译成YAML文件。
- 给定一个简单的管道定义(如上一个任务所示),编写一个Python脚本来使用Kubeflow Pipelines的
-
处理
PipelineTask
对象- 编写一个Python函数来演示如何调用一个Kubeflow Pipeline组件,捕获其返回值(
PipelineTask
对象),并访问其输出。该函数不需要是管道的一部分,只需要展示概念即可。
- 编写一个Python函数来演示如何调用一个Kubeflow Pipeline组件,捕获其返回值(
-
在管道定义中的错误处理
- 编写一个Python脚本尝试以不正确的方式定义一个Kubeflow Pipeline(例如,尝试直接从管道函数返回一个
PipelineTask
对象),然后纠正错误。包括注释解释为什么最初的尝试会失败以及如何修正问题。
- 编写一个Python脚本尝试以不正确的方式定义一个Kubeflow Pipeline(例如,尝试直接从管道函数返回一个
-
为模型训练自动化数据准备
- 创建一个Python脚本,模拟为机器学习模型准备数据的过程。该脚本应从JSON文件读取数据,执行简单的转换(例如过滤或映射),并将结果保存到另一个JSON文件中。这个任务模仿了Kubeflow Pipeline中数据预处理步骤中可能使用的组件。
-
在管道中实现模型版本控制
- 编写一个Python函数,通过在基本模型名称字符串后面附加当前日期和时间来生成一个唯一的模型名称。这个函数说明了在MLOps中版本化模型的实践。
-
参数化并执行Kubeflow Pipeline
- 假设存在一个编译好的Kubeflow Pipeline YAML文件,编写一个Python脚本来定义管道参数(例如,对于问候管道的
recipient_name
),并演示如何使用假设的执行环境的API提交该管道以供执行。
- 假设存在一个编译好的Kubeflow Pipeline YAML文件,编写一个Python脚本来定义管道参数(例如,对于问候管道的