13

image

科技以懒人为本!

为了省事,为了提高效率,为了节约时间,为了降低成本,我们会想方设法地通过自动化方式来帮助自己「偷懒」。那么当你在从事与机器学习(ML)有关的项目时,不可避免需要创建并训练模型,随后根据情况进行调优,重新训练模型并再次部署,这样的循环一遍一遍进行着……

这种重复性的操作能否更简单点?

随着机器学习在公司核心业务中占据的份量越来越重,缩短从模型创建到部署的时间就变得越来越重要。2019年11月, 亚马逊云科技(Amazon Web Services)布了适用于Amazon SageMaker的Amazon Step Functions Data Science SDK,开发人员可以通过这款开源开发工具包,用Python创建基于Step Functions的机器学习工作流。现在,我们已经可以使用与模型开发所用的同款工具创建可重复使用的模型部署工作流。请访问GitHub仓库的「automate\_model\_retraining\_workflow」文件夹查阅该解决方案的完整手册。

本文将以一个常见的使用案例「模型的定期重新训练和部署」来演示Data Science SDK的功能。在下文中,我们将创建一个基于无服务器架构的工作流,用于训练机器学习模型、使用验证数据集检查模型的性能并在模型准确度超过设定阈值时将模型部署到生产环境中。最后,下文还会介绍如何定期触发工作流。

下图演示了上述Amazon Step Functions无服务器架构工作流。

image

后续操作使用了下列亚马逊云科技服务:

  • Amazon Step Functions使我们能够将多个亚马逊云科技服务整合到一个无服务器架构工作流中。我们可以设计并执行工作流,其中一个步骤的输出作为下一个步骤的输入,并支持将错误处理嵌入到工作流中。
  • Amazon SageMaker是一项完全托管的服务,可为开发人员和数据科学家提供构建、训练和部署不同类型机器学习模型时所需的工具。
  • [Amazon Glue是一项完全托管的提取、转换和加载(ETL)服务。我们可以将[Amazon Glue指向受支持的数据存储,它将会生成代码以从指定的存储中提取数据并加载到目标存储中。[Amazon Glue在分布式Apache Spark环境中运行,这使我们能够充分利用Spark而无需管理基础设施。
  • [Amazon Lambda是一项在运行代码时无需预置或管理服务器的计算服务。仅当被触发时Lambda才会执行代码,并且支持自动扩展,每秒可处理数千个请求。
  • Amazon EventBridge是一项无服务器事件总线服务,通过它可以轻松连接不同的SaaS应用程序、亚马逊云科技服务和应用程序中的数据。

SDK概述

此SDK提供一种新的Amazon Step Functions使用方式。一个Step Function是由多个离散步骤组成的状态机,其中每个步骤都可以执行任务、作出选择、启动并行执行或管理超时。我们可以开发单独的步骤并使用Step Function来处理整个工作流的触发、协调和状态管理。在Data Science SDK诞生前,我们只能使用基于JSON的[Amazon States Language定义Step Function;但现在可以借助此SDK使用Python代码轻松创建、执行和可视化Step Function。

本文提供了此SDK的概述,包括如何创建Step Function步骤、使用参数、集成服务特定的功能以及将这些步骤关联在一起以创建和可视化工作流。大家可以在本文中找到多个示例代码;同时,我们也为整个流程创建了详细的Amazon SageMaker笔记本。更多信息请参阅GitHub仓库

步骤、参数和动态工作流

在Step Function中,每个步骤均会将其输出传递至下一个步骤。我们可以在后续的步骤中使用这些输出来创建动态工作流。此外,还可以在执行Step Function时传入参数,实现工作流的通用性,以便其支持其他项目。

要使用此SDK为工作流定义所需的输入参数,请参阅以下代码:

execution\_input = ExecutionInput(schema={

 'TrainingJobName': str,

 'GlueJobName': str,

 'ModelName': str,

 'EndpointName': str,

 'LambdaFunctionName': str

})

内置服务集成

Data Science SDK可与多项亚马逊云科技服务集成。这些集成使我们能够直接控制受支持的服务,而无需去写API调用代码。本文将会与Amazon Glue、Lambda及Amazon SageMaker服务相集成。更多信息请参阅[[Amazon Step Functions服务集成

在模型重新训练前,首先需要获取到最新的数据。此外,还需要丰富原始数据,同时将其保存到ML模型支持的文件类型和位置。Amazon Glue用于连接大部分数据存储,也支持自定义的Python脚本并且无需管理服务器。作为工作流的第一步,可以用[Amazon Glue读取生产数据并将转换好的数据写入[Amazon S3中。

通过Data Science SDK可以轻松向工作流添加Amazon Glue作业。[Amazon Glue作业本身可指定数据源位置、ETL的Python代码以及目标文件存放位置。此SDK需要的只是[Amazon Glue作业的名称,以此作为GlueStartJobRunStep的参数。更多信息请参阅YouTube上的[Amazon Glue ETL入门

我们可以使用输入参数,在运行的时候选择[Amazon Glue作业:

etl\_step = steps.GlueStartJobRunStep(

 'Extract, Transform, Load',

 parameters={"JobName": execution\_input\['GlueJobName'\]}

)

在提取并保存输入数据之后,可以使用此SDK的TrainingStep来训练模型。Amazon SageMaker会处理底层计算资源,但我们需要为训练指定算法、超参数和数据源。请参阅以下代码:

training\_step = steps.TrainingStep(

 'Model Training',

 estimator=xgb,

 data={

 'train': sagemaker.s3\_input(train\_data, content\_type='csv'),

 'validation': sagemaker.s3\_input(validation\_data, content\_type='csv')},

 job\_name=execution\_input\['TrainingJobName'\]

)

上述代码中的估算器xgb封装了XGBoost算法及其超参数。有关如何定义估算器的更多信息,请参阅GitHub仓库

在模型训练完成前,Step Function工作流将一直停留在该训练步骤。在训练完成后,需要获取训练结果,以便工作流可以根据新模型的准确度选择分支。为了查看Amazon SageMaker的训练作业和返回结果,可使用Step Functions LambdaStep来调用Lambda运行一个简单的Python函数。要通过SDK添加Lambda状态,请指定函数名称和Payload。本文使用JSON路径来选择Lambda函数负载中的TrainingJobName,然后,它才能知道要查询的训练作业是哪个。请参阅以下代码:

lambda\_step = steps.compute.LambdaStep(

 'Query Training Results',

 parameters={"FunctionName": execution\_input\['LambdaFunctionName'\],

 'Payload':{"TrainingJobName.$": "$.TrainingJobName"}

 }

)

要部署训练好的模型,可使用SDK中的ModelStepEndpointConfigStep创建一个模型对象和部署配置。请参阅以下代码:

model\_step = steps.ModelStep(

 'Save Model',

 model=training\_step.get\_expected\_model(),

 model\_name=execution\_input\['ModelName'\],

 result\_path='$.ModelStepResults'

)

endpoint\_config\_step = steps.EndpointConfigStep(

 "Create Model Endpoint Config",

 endpoint\_config\_name=execution\_input\['ModelName'\],

 model\_name=execution\_input\['ModelName'\],

 initial\_instance\_count=1,

 instance\_type='ml.m4.xlarge'

)

最后,工作流使用EndpointStep以托管API终端节点的形式部署新模型。通过update参数可实现更新已有的Amazon SageMaker终端节点,而不是创建新的终端节点。请参阅以下代码:

endpoint\_step = steps.EndpointStep(

 'Update Model Endpoint',

 endpoint\_name=execution\_input\['EndpointName'\],

 endpoint\_config\_name=execution\_input\['ModelName'\],

 update=True

)

控制流和关联状态

Step Functions SDK的Choice状态支持基于前面步骤的输出创建分支逻辑。我们可以通过添加此状态来创建复杂的动态工作流。

下文会创建一个步骤,它可根据我们在Amazon SageMaker训练步骤中得到的结果选择分支。请参阅以下代码:

check\_accuracy\_step = steps.states.Choice(

‘Accuracy > 90%’

)

向步骤添加分支和分支逻辑。Choice状态支持多种数据类型和复合布尔表达式,但是在本文中,我们只需要比较两个数值。第一个值是设置好的阈值0.90,第二个是TrainingStep中的验证数据集上的模型准确度。训练结果的模型错误率计算方式为(错误数)/(总数)。因此如果测得的错误低于10% (0.10),则表示模型准确度高于90%。更多信息请参阅Choice规则

添加以下比较规则:

threshold\_rule = steps.choice\_rule.ChoiceRule.NumericLessThan(variable=lambda\_step.output()\['Payload'\]\['trainingMetrics'\]\[0\]\['Value'\], value=.10)

check\_accuracy\_step.add\_choice(rule=threshold\_rule, next\_step=endpoint\_config\_step)

check\_accuracy\_step.default\_choice(next\_step=fail\_step)

工作流中的Choice规则需要设定当条件被满足时要执行的下一个步骤。到目前为止,我们已创建了多个步骤,但尚未设定他们的执行顺序。此时可借助SDK以两种不同的方式将步骤关联在一起。

方式一:使用next ()方法为单独的步骤指定下一个步骤,代码如下:

endpoint\_config\_step.next(endpoint\_step)

方式二:使用Chain ()方法一次将多个步骤关联在一起,代码如下:

workflow\_definition = steps.Chain(\[

 etl\_step,

 training\_step,

 model\_step,

 lambda\_step,

 check\_accuracy\_step

\])

工作流创建

在确定好所有步骤的定义及执行顺序之后,使用以下代码创建Step Function:

workflow = Workflow(

 name='MyInferenceRoutine\_{}'.format(id),

 definition=workflow\_definition,

 role=workflow\_execution\_role,

 execution\_input=execution\_input

)

workflow.create()

创建工作流之后,workflow.render\_graph ()将返回工作流的示意图,与我们在Step Functions控制台中看到的类似:

image

至此,我们已准备就绪,可随时运行新的部署流程。我们可以使用SDK中的execute ()方法来手动运行模型,也可以通过自动化的方式执行此任务。

使用EventBridge触发器安排工作流

我们可以使用EventBridge触发器设置工作流的执行计划。下文介绍了如何在EventBridge中创建一个规则,以按计划调用Step Function。更多信息请查阅创建一个由AWS资源产生的事件触发的EventBridge规则

请执行以下步骤:

  1. 在亚马逊云科技管理控制台的服务下,选择Amazon EventBridge。
  2. 选择规则。
  3. 选择创建规则。
  4. 在名称和描述下,对于名称,输入规则的名称。本文输入的名称为automate-model-retraining-trigger。
  5. 对于描述,可以输入步骤的描述,也可以留空。
  6. 对于定义模式,选择计划。

image

7.对于固定匹配为每隔,选择1小时。

8.在选择事件总线下,选择亚马逊云科技默认事件总线。

9.选择启用在选定的事件总线上启用该规则。

image

10.在选择目标下,对于目标,选择Step Functions状态机。

11.对于状态机,选择您的状态机。

image

12.依次选择配置输入、常量(JSON文本)。

13.以JSON文本的形式为工作流输入输入参数。

14.选择为此特定资源创建新角色。

15.输入角色名称。如果已有角色,则选择使用现有角色。

16.选择创建。

image

总结

本文介绍了适用于Amazon SageMaker的[Amazon Step Functions Data Science SDK,并展示了使用Python创建可重复使用的模型部署工作流的过程。该工作流中包含:用于提取和转换数据的[Amazon Glue作业、使用新数据训练机器学习模型的训练步骤、通过Lambda查询训练结果的步骤、创建模型构件的步骤、用于定义部署参数的终端节点配置步骤和部署新模型到现有终端节点的步骤。最后,演示了使用EventBridge实现定期触发工作流的方法。

如需与此SDK相关的其他技术文档和示例手册,请参阅适用于Amazon SageMaker的[Amazon Step Functions Data Science SDK公告

image


亚马逊云开发者
2.9k 声望9.6k 粉丝

亚马逊云开发者社区是面向开发者交流与互动的平台。在这里,你可以分享和获取有关云计算、人工智能、IoT、区块链等相关技术和前沿知识,也可以与同行或爱好者们交流探讨,共同成长。