使用SAP数据仓库云和Amazon SageMaker V2的联合机器学习

210 阅读8分钟

背景介绍

大规模的分布式数据已经成为大多数企业分析和知情决策过程的基础。大量的这些数据也被用于预测性建模和建立机器学习模型。

提供机器学习和建模能力以及数据存储和处理的hyperscaler平台在数量和种类上都有增加。使用这些平台进行数据存储的企业现在可以无缝地利用它们来有效地训练和部署机器学习模型。

如果训练数据驻留在各自的平台原生数据存储中,在大多数这些平台上训练机器学习模型会相对更顺利。这带来了一个新的挑战,因为这些功能与原生数据存储紧密耦合。将数据从一个数据源提取并迁移到另一个数据源既昂贵又耗时。

建议的解决方案

SAP Federated-ML或FedML是一个为解决这个问题而建立的库。该库应用了SAP数据仓库云的数据联盟架构,并提供了一些功能,使企业和数据科学家能够在超大规模上建立、训练和部署机器学习模型,从而消除了从原始来源复制或迁移数据的需要。

通过对这些超大规模上的数据连接、数据加载和模型训练进行抽象,FedML库只需几行代码就能提供端到端的整合。

FedML%20Architecture%20Diagram

FedML AWS架构图

用FedML AWS在AWS Sagemaker上训练一个模型

在这篇博文中,我们将使用FedML AWS建立和部署一个机器学习模型,其数据来自SAP数据仓库云的本地表。一旦部署完毕,我们将在我们的模型上运行预测。请注意,本地表可以换成存储在SAP和非SAP来源的数据。

如果你选择使用来自SAP和非SAP来源的数据来运行这个实验,你将不得不联合这些数据源。使用这些联合的数据源,你可以在DWC中连接这些表来创建一个视图,或者你可以在你的笔记本中连接这些表,创建一个连接的DataFrame来运行你的FedML实验。

请确保在DWC中为这个实验创建的任何视图都已打开了消费。

前提条件

你必须设置好你的环境。请参考 这里的步骤来完成这一要求。

  1. 你必须有一个AWS账户。
  2. 你必须有一个Amazon SageMaker Notebook Instance,并设置了适当的IAM角色和权限。

使用FedML AWS

要了解所有可能的功能和参数,请参考 这里的FedML AWS READ.ME。

1.安装 fedml_aws

pip install fedml-aws --force-reinstall

2.导入需要的库

from fedml_aws import DwcSagemaker

from fedml_aws import DbConnection

如果你在你的笔记本中使用以下东西,导入它们也可能是有用的

import numpy as np

import pandas as pd

3.创建一个DwcSagemaker实例来访问类的功能

dwcs = DwcSagemaker(prefix='<insert your bucket prefix here>', bucket_name='<insert your bucket name here>')

4.创建一个DbConnection实例,从DWC获取数据。

这一步需要你在AWS笔记本实例内有一个config.json。config.json提供了DbConnection访问DWC中的视图所需的凭证。请参考DbConnection 文档 以了解如何设置。

一旦你设置好config.json,你就可以运行下面的片段来从DWC中获取数据。

db = DbConnection()

train_data = db.get_data_with_headers(table_name='<VIEW_NAME>', size=1)

data = pd.DataFrame(train_data[0], columns=train_data[1])

data

你也可以使用下面的代码段,以使你对DWC的查询更加灵活。

db = DbConnection()

train_data = db.execute_query('SELECT * FROM <SCHEMA_NAME>.<VIEW_NAME>')

data = pd.DataFrame(train_data[0], columns=train_data[1])

data

5.如果你想在训练脚本之外对数据进行任何操作,你现在就可以这样做。如果你愿意,这也包括将你的数据分成训练和测试数据集。

6.接下来,我们将把我们的训练数据发送到我们的训练脚本,这将在AWS SageMaker中启动一个训练工作。

如果你没有测试数据可以传递,请省略test_data参数。

clf = dwcs.train_sklearn_model(train_data=train_data,

                               test_data=test_data,

                               content_type='text/csv',

                               train_script='<training script .py file>',

                               instance_count=1,

                               instance_type='ml.c4.xlarge',

                               wait=True,

                               base_job_name='<optional name of job>'

                              )

7.现在我们已经使用FedML AWS拟合了一个模型,我们现在可以部署这个模型了。

FedML AWS提供了2种部署的选择。你可以部署到AWS SageMaker环境,或者你可以部署到你的SAP BTP Kyma环境。我们将在本博客中介绍这两种方法。

选项1:部署到AWS SageMaker环境

这个选项是直接的,只需要运行下面的片段。

predictor = dwcs.deploy(clf, initial_instance_count=1, instance_type="ml.c4.xlarge", endpoint_name='<endpoint name>')

选项2:部署到SAP BTP Kyma环境

这个选项需要你提供一些关于Kyma环境和一些IAM权限的信息。这将确保库可以访问您的亚马逊ECR,并可以将模型部署到您的Kyma环境。

首先,你必须有一个没有启用MFA的IAM用户,并且有EC2容器注册表的访问权限,以便推送和拉动到亚马逊ECR。 有关如何创建IAM用户的信息,请参考 这里

接下来,你必须在AWS SageMaker Notebook中使用aws cli创建一个配置文件,连接到具有EC2容器注册表访问权限的IAM用户。请确保此配置文件的区域与AWS SageMaker Notebook Jupyter实例的区域相同。

!aws configure set aws_access_key_id '<aws_access_key_id>' –profile '<name of profile>'

!aws configure set aws_secret_access_key '<aws_secret_access_key>' --profile '<name of profile>'

!aws configure set region '<region>' --profile '<name of profile>'

现在,你还需要一个kubeconfig.yml,指定你的Kyma账户的凭证。

  • 按照本 教程中的步骤进行操作,但是对于步骤2.1和4.1,请同时按照以下步骤操作。
    • 在教程的第2.1步,添加以下字段。
      • 在yaml文件的'rules -> resources'部分添加'namespaces'。
      • 在yaml文件的'rules -> verbs'部分添加'watch'。
    • 在教程的第4.1步中,替换以下内容。
      • 用Kyma Kubernetes集群的集群名称替换'cluster'部分的'name'的值。
      • 用 "OIDCUser "用户替换 "users "部分的 "name "和 "contexts"->"context "部分的 "user "的值。
    • 用Kyma Kubernetes集群的集群名称替换 "contexts "部分的 "name"、"context-> cluster "的值。
    • 用Kyma Kubernetes集群的名称替换 "current-context "的值。
  • 请注意,如果你使用的是Windows,而教程中的第2步没有创建适当的kubeconfig,你可能需要手动运行每个命令来获得这些值,然后自己在kubeconfig中替换它们。

最后,我们现在可以运行deploy_to_kyma()函数。请注意,我们之前创建的aws cli配置文件的名称将作为profile_name传递给该函数。kubeconfig.yml必须位于你的笔记本的根目录下(不在任何子文件夹中)。根据终端的完整路径是'/home/ec2-user/SageMaker'。

dwcs.deploy_to_kyma(clf, initial_instance_count=1, profile_name='<name of profile>')

为了提供更大的灵活性,如果你最近没有运行train函数,我们也允许你将训练工作名称传递给函数参数 clf。

请注意,由于我们使用的是AWS SageMaker的训练作业,这也意味着任何需要的函数(model_fn)和允许覆盖的函数(input_fn,predict_fn,output_fn)都保持相同的规则。如果没有提供model_fn,模型将无法部署。如果在传递给train_sklearn_model()的训练脚本中提供了input_fn、predict_fn和/或output_fn,模型将使用你提供的函数。

该单元使用预构建的SageMaker SKLearn图像来构建你的模型的docker图像,并将图像推送到ECR。然后,Kyma拉出这个镜像并使用它进行部署。一旦部署,就会提供一个端点,其中有/invocations用于预测,/ping用于可用性检查。

8.由于我们现在已经在AWS SageMaker或SAP BTP Kyma上部署了我们的模型,我们现在可以在我们的端点上运行预测。

用于运行预测的功能取决于您部署模型的地方。如果您部署到AWS SageMaker,请遵循这些步骤。

result = dwcs.predict(endpoint_name=predictor,

             body=df.to_csv(header=False, index=False).encode('utf-8'),

             content_type='text/csv')

如果您将模型部署到SAP BTP Kyma,请按照以下步骤进行。

result = dwcs.invoke_kyma_endpoint(api='<endpoint with /invocations as printed from deploy_to_kyma() console logs>',

             payload=X.to_json(),

             content_type='application/json')
result = result.content.decode()

9.最后,现在既然我们有了一个有效的模型,并且可以运行预测,我们可以将预测结果写回DWC,以便进一步使用和分析。

首先,你需要创建一个表

db.create_table("CREATE TABLE <table_name> (ID INTEGER PRIMARY KEY, <column_name> <datatype>, …)")

然后,你要准备好你的预测结果,以遵循上述创建表语句的格式,确保适当的数据类型和列名。

一旦你的数据集准备好了,你就可以开始把它插入到你的表中。基于你的数据集的大小,插入可能需要一些时间。

db.insert_into_table('<table_name>', dwc_data)

你也可以像这样删除表。

db.drop_table('<table_name>')

一旦表被创建并且插入完成,你将在DWC中拥有一个本地表,上面有你插入的数据。如果你愿意,你可以在DWC中部署这个表,创建一个视图,并使用SAC对其进行进一步分析。

关于使用该库的更多信息以及一些带有相应训练脚本的样本笔记本,请参考 这里

总之,FedML使数据科学家和开发人员非常方便地在超大规模上进行跨平台ETL和训练机器学习模型,而不必关注数据复制和迁移的麻烦。V2的新功能包括在AWS SageMaker上部署AWS SageMaker模型,在SAP BTP Kyma上部署AWS SageMaker模型,在这些部署的模型上运行预测,并将预测结果写入DWC的表格。

谢谢您!