背景
大规模的分布式数据已经成为大多数企业的分析和知情决策过程的基础。大量的这些数据也被用于预测性建模和建立机器学习模型。
提供机器学习和建模能力以及数据存储和处理的hyperscaler平台的数量和种类都在增加。使用这些平台进行数据存储的企业现在可以无缝地利用它们来有效地训练和部署机器学习模型。
如果训练数据驻留在各自的hyperscaler原生数据存储中,在大多数hyperscaler平台上训练机器学习模型就相对更顺利。机器学习服务与本地数据存储的紧密耦合导致需要从非本地数据存储中迁移或复制数据。从非原生数据存储迁移数据是一个复杂而耗时的过程。此外,将数据复制到hyperscaler原生数据存储,以访问其机器学习功能,会导致冗余存储,从而产生存储成本和确保数据一致性的开销。
建议的解决方案
Federated-ML或FedML是一个为解决这些挑战而建立的库。该库将数据联盟架构与SAP数据仓库云结合起来,从数据存储中实时智能地获取数据。该库提供的功能使企业和数据科学家能够在超大规模上建立、训练和部署机器学习模型,而无需从原始数据存储中复制或迁移数据的麻烦。该库还提供了通过实时采购存储在多个数据存储空间的数据来建立机器学习模型的能力。
通过抽象化数据连接、数据加载、模型训练和在这些超大规模上的部署,FedML库只需几行代码就能提供端到端的整合。

FedML解决方案图
在这篇博客中,我们使用FedML Azure库,用SAP数据仓库云的数据训练模型,并将模型部署到Azure Compute Targets和SAP BTP Kyma环境。我们还对部署的模型进行推理,并将推理数据存储回SAP数据仓库云,以便进一步分析。
数据可以从许多数据源联合到SAP数据仓库云,包括SAP和非SAP数据源。来自不同数据源的数据也可以合并创建一个视图,该视图可用于FedML实验。请确保用于FedML实验的视图已经打开了消费。
用于Azure ML的Federated ML 库的先决条件
- 通过参考 链接创建一个新的 Azure订阅 ,或 从 Azure门户访问现有的订阅信息 。
- 参照指南创建一个 AzureML 工作区 。一旦创建了工作空间,请注意 config.json 文件 中的工作空间配置 ,该文件可以通过 参考 本 指南 下载 。
- 参照本指南创建 AzureML 笔记本并进行计算 。
使用 FedML Azure库 训练和部署模型 。
关于FedML Azure库 中的类和方法的信息 ,请 参考文档。
1.1. 安装 FedML Azure库。
pip install fedml-azure --force-reinstall
2.2.导入所需的库
from fedml_azure import create_workspace,create_compute,create_environment
from fedml_azure import DwcAzureTrain
from fedml_azure import DbConnection
from fedml_azure import register_model,deploy,predict
FedML Azure库第一版功能。
3.初始化 培训所需的AzureML 资源 。
3.1.初始化 AzureML 工作区。
workspace=create_workspace(workspace_args={
"subscription_id": "<subscription_id>",
"resource_group": "<resource_group>",
"workspace_name": "<workspace_name>"
})
在上述单元格 中,你需要 将 "subscription_id"、 "resource_group" 和 "workspace_name"替换 为从 预设条件第2步中获得的 工作区配置 。
3.2创建所需的计算 目标以运行培训工作。
你可以使用 FedML Azure 库创建不同类型的Azure计算目标 。这里有一个创建计算目标的通用语法。
compute=create_compute(workspace=workspace,
compute_type='<compute_type>', # Type of compute to be created
compute_args={<compute_configurations>} # Configurations for compute
) # provisioning
关于如何创建不同类型的计算 目标 的细节 和例子可以 在这里 找到 。
3.3创建一个环境,指定训练工作所需的依赖关系。
你可以通过传递 软件包、 whl 文件或 conda 依赖文件来创建一个指定依赖关系的环境 。 下面是一个创建 环境的通用语法 。
environment=create_environment(workspace=workspace,
environment_type='<way_to_create_the_environment>',
environment_args={<environment_arguments>} # dependencies required for
) # the training job
在创建环境时,记得要传递pip包 "fedml-azure" 。
关于创建环境的不同方法和例子的细节可以 在这里 找到 。
4.训练模型。
实例化训练类, 为 训练工作分配所需的资源 。
train=DwcAzureTrain(workspace=workspace,
environment=environment,
experiment_args={'name':'<experiment_name>'},
compute=compute)
在这里, 通过 使用上述创建的资源,一个新的实验 被启动 ,其名称在 *"experiment_name "*中指定 。
关于如何使用DWCAzureTrain类的文档和例子可以 在这里找到 。
5.5.从SAP数据仓库云读取数据用于训练工作。
你需要 在 Azure机器学习工作室中 创建一个训练文件夹 ,并将 训练脚本放在训练文件夹内,其中包含训练模型的代码。 这里 有一个训练脚本的样本。
然后,需要 在 Azure机器学习工作室 中 创建一个 config.json 文件 , 其中包含访问SAP 数据仓库云视图的凭证。请 参考 文档 来设置 config.json 文件。
一旦 设置好 config.json 文件,在 训练脚本 中使用下面的代码片段 , 从SAP数据仓库云读取训练数据。
import pandas as pd
dwc = DbConnection()
data = dwc.get_data_with_headers(table_name='<view_name>',size=<data_size_in_float>)
training_data = pd.DataFrame(data[0], columns=data[1])
以下代码片断可用于更灵活地从 SAP 数据仓库云查询数据 。
import pandas as pd
dwc = DbConnection()
data = dwc.execute_query('<query_to_fetch_the_data>')
training_data = pd.DataFrame(data[0], columns=data[1])
6.指定 训练工作所需的配置 并开始训练运行。
src=train.generate_run_config(
config_file_path='<path_to_config.json_file>',# Path of config.json file to connect to
# DWC
config_args={
'source_directory':'<path_to_training_folder>',
'script':'<training_script_name>',
'arguments':[
'--model_file_name','<model_file_name>.pkl', # Name of the pickle file
# to be created
'--table_name','<view_to_be_queried_from dwc>'
]})
指定 步骤4中创建的 config.json 文件路径,以及 上述单元格中 训练 运行的配置。
run=train.submit_run(src)
上述单元格启动训练工作。
关于 如何生成运行配置 的详细信息 可以 在这里找到 , 关于如何提交训练运行 的 更多 信息可以 在这里 找到 。
7.注册用于部署的模型/模式
7.1注册用于部署的训练过的模型/模式。
model=train.register_model(
run=run,
model_args={
'model_name':'<model_name>', # Name of the model to register
'model_path':'<model_path>' # Path where the model pickle file is
# stored
},
resource_config_args={'cpu':1, 'memory_in_gb':0.5}, # Optional Resource config
# in case of deployment to ACI
is_sklearn_model=True) # Indicates a sklearn model and model framework and
# framework version is set
关于 注册 训练好的模型进行 部署的细节 和例子可以 在这里找到 。
FedML Azure第二版功能。
7.2如果 你需要注册没有经过训练运行的模型/模式,你可以使用 下面的代码片断来注册模型/模式进行部署。
model=register_model(
model_args={'workspace':workspace, # Workspace for model registration
'model_name':'<model_name>', # Name of the model to register
'model_path':'<model_path>'},# Path where the model pickle file is stored
resource_config_args={'cpu':<cpu-cores>, 'memory_in_gb':<memory-in-gb>},# Optional Resource
# config in case of deployment to ACI
is_sklearn_model=True # Indicates a sklearn model and model framework and framework version
# is set
)
关于 文档 和例子 的详细信息 可以 在这里 找到 。
8.将模型/模式部署为网络服务。
8.1.将模型/模型作为Webservice部署到Azure Compute Targets。
你可以将模型/模式作为网络服务部署到各种Azure计算目标 ,如Azure容器实例(ACI)、Azure Kubernetes服务(AKS),或者 使用FedML Azure 库将模型部署到本地,用于测试/调试目的 。
在 开始部署过程之前,记得要创建适当的Azure Compute进行部署 。
你需要向 下面单元格中的 'entry_script' 参数传递 一个包含推理代码的推理脚本 。这里 有一个推理脚本的样本。
下面的代码片段显示了将模型/ 模式部署到Azure Compute Targets 的通用语法 。
endpoint,api_key,service=deploy(compute_type='<compute_type_for_deployment>',
inference_config_args={'entry_script':'<entry-script-path>', 'environment':
environment},
deploy_config_args={<optional_deploy_configurations_for_computes>},
deploy_args={'workspace':workspace,'name':'<service-name>','models':<list-of-
models>}
)
关于部署到Azure Compute Targets的详细文档和例子 可以 在这里 找到 。
8.2将模型/模式作为webservice部署到SAP BTP Kyma环境中
您可以将模型/模式作为webservice部署到SAP BTP Kyma环境。
在开始部署过程之前,需要创建一个服务委托人来 验证Azure Container Registry(ACR)。创建服务 委托人 的步骤 可以 在这里 找到 。
将服务委托人的证书存储在一个json文件中,并将json文件路径传递给 下面单元格中 的'sp_config_path' 参数。该库 为服务委托人 分配了一个ACR Pull 角色,以便将容器镜像从ACR拉到SAP BTP Kyma Kubernetes。
你还需要创建一个 kubeconfig.yaml 来验证SAP BTP Kyma 环境。创建 kubeconfig.yaml的步骤 可以 在这里 找到 。 在 下面的单元格中提供 kubeconfig.yaml 文件路径到 'kubeconfig_path' 参数。
现在,我们准备将模型/模型作为网络服务部署到SAP BTP Kyma Kubernetes。使用下面的代码片断。
kyma_endpoint=deploy(compute_type='Kyma',
inference_config_args={'entry_script':'<entry-script-path>', 'environment':
environment},
deploy_args={'workspace':workspace,
'name':'<service-name>',
'models':<list-of-models>,
'num_replicas':<num-replicas>,
'kubeconfig_path':'<path-to-kubeconfig.yaml>',
'sp_config_path':'<path-to-sp_config.json>'
})
提供给 'entry_script' 参数 的推理脚本 将被用于 推理。 这里 是一个推理脚本的样本。
你可以通过注册模型 并将模型列表传递给 'models' 参数 ,将多个模型部署为一个webservice 。
如果你希望用更新的模型来更新或替换已部署的网络服务, 将*'overwrite_service'* 参数设置为True 。你也可以用 'num_replicas' 参数 控制 Kyma Kubernetes pod复制 的 数量 。
如果你希望将包含 推理 所需的额外文件的整个源目录 复制到容器中,你可以 向 'source_directory' 参数 提供源目录的路径 。记住,在这种情况下,入口脚本 (推理脚本)路径必须是相对于源目录的。
关于部署到SAP BTP Kyma Kubernetes的详细文档和 例子可以 在这里 找到 。
9.推断 部署的web服务端点
由于模型被部署到Azure Compute Target或SAP BTP Kyma Kubernetes, 现在你可以通过传递测试数据对webservice端点进行推断。
使用下面 的代码片段,通过传递 从部署方法获得的 端点网址 、测试数据和所需的计算目标类型来执行 推理。
import json
test_data = json.dumps({
'data': <pandas-dataframe-containing-inferencing-data>.values.tolist()
}) #test data in the form of a serialized json format
inference_result=predict(endpoint_url='<endpoint-url>',
data=test_data,compute_type='<compute_type>')
对于部署在Azure Compute Target上的模型/模式,您也可以 通过 传递从部署方法获得的webservice对象和测试数据来执行 推 断。
import json
test_data = json.dumps({
'data': <pandas-dataframe-containing-inferencing-data>.values.tolist()
}) # test data in the form of a serialized json format
inference_result=predict(service=<webservice-object>,data=<test-data>)
关于如何执行 推理的详细信息 和例子可以 在这里 找到 。
10.在SAP数据仓库云中存储推断数据。
现在您已经运行了预测,您可以将推断数据存储在SAP 数据仓库云中,以执行进一步分析。
首先,在SAP数据仓库云中创建一个表来存储数据。
dwc.create_table("CREATE TABLE <table_name> (ID INTEGER PRIMARY KEY, <column_name> <data_type>,..)")
现在,您可以重组数据,以您 想要的 格式 写回SAP数据仓库云 。然后,你可以通过使用 下面的代码 片断 在创建的表中插入数据
dwc.insert_into_table('<table_name>',<pandas_dataframe_containing_dwc_data>)
现在,数据被插入到SAP数据仓库云的本地表中,您可以 创建一个视图并将其部署到SAP数据仓库云中。然后,您可以使用该视图, 使用SAC进行进一步的分析。
您也可以使用下面的代码片断放弃该表。
dwc.drop_table('<table_name>')
更多关于使用该库的信息以及带有相应训练和推理脚本的样本笔记本可以 在这里找到 。
总之,联合机器学习库提供了一种有效和方便的方式来联合来自多个数据存储的数据,执行跨平台的ETL,训练和部署机器学习模型,而没有任何数据迁移或复制的开销。通过第二版库,您可以有效地将模型部署到Azure Compute Targets和SAP BTP Kyma环境,对部署的网络服务进行推理,并将推理数据存储回SAP数据仓库云,以进行进一步分析。