65.9K
CodeProject 正在变化。 阅读更多。
Home

通过 SAP HANA 和 Amazon SageMaker 实现云 AI

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.57/5 (9投票s)

2019 年 8 月 31 日

CPOL

16分钟阅读

viewsIcon

26445

使用 SAP HANA 和 Amazon SageMaker 在云中享受 AI 的乐趣!

本教程是 SAP HANA 和 Amazon SageMaker 云 AI 挑战赛 的一部分。比赛现已结束,因此本文中关于连接 SAP 实例的说明将不再有效。

引言

数据科学、机器学习和大数据分析是热门话题。它们似乎总是在新闻中出现,各公司都利用这些技术来争取超越竞争对手的优势。

但这些对我们开发者来说意味着什么呢?关于这些话题,充斥着大量令人兴奋的炒作和营销辞令,让人感觉没有实质内容。幸运的是,事实并非如此。这个领域有一些出色的工具,开发者可以利用它们快速交付出色的应用程序,我们将学习如何将其中两个工具结合使用:SAP HANA 和 Amazon SageMaker。

在本教程中,您将学习如何从 SAP HANA 加载数据集,并使用 Amazon SageMaker 笔记本进行探索。然后,您将学习如何将数据复制到 Amazon S3,并使用 SageMaker 训练机器学习模型。最后,您将学习如何查询 HANA 中从 Tensorflow Serving 模型导入的数据。

什么是 SAP HANA?

SAP 将 HANA 描述为“一个业务数据平台,可以同时处理任何类型数据的事务和分析”。这听起来不错,但并没有告诉我们 HANA 能做什么或如何使用它。

HANA 本质上是一个高速内存数据库,提供多种访问其存储数据的方式。HANA 的 SQL 接口允许您将其视为关系数据库,这是大多数开发者都熟悉的。您甚至可以使用 .NET 中的 Entity Framework 或 Java 中的 JPA 等 ORM 来访问它。

HANA 不仅能处理关系数据。它还支持空间查询,并可以充当 Neo4J 等图数据库或 MongoDB 等文档数据库。它还可以处理全文搜索和时间序列分析。

听起来可能像是“万金油,但都不是精通”。虽然专业工具有时是正确的选择,但 HANA 的优势在于速度快——非常快。作为一个内存数据库,HANA 可以对大量数据进行实时流式分析。

更好的是,HANA 与 Python 和 Tensorflow 具有非常酷的内置集成,这有助于它很好地融入数据科学工作流程。由于我们不希望本教程耗费 10 小时才能完成,因此我们将把自己限制在 HANA 的相对较小的功能子集内。但是,如果您有兴趣深入研究,我强烈建议安装 HANA Express Edition 并探索其功能。

什么是 Amazon SageMaker?

Amazon SageMaker 是一个 AWS 服务,可帮助开发人员和数据科学家分析数据,然后利用这些数据在云中构建、训练和部署机器学习模型。

SageMaker 可以帮助您自动标记训练数据,这通常是一项耗时的活动。然后,借助内置的 Jupyter 笔记本,可以轻松地分析和可视化数据,以确定您想要创建哪种模型。

接下来,您可以轻松地从笔记本中启动训练实例。您甚至可以要求 SageMaker 同时使用多个实例——甚至多个 GPU——以减少等待模型训练的时间。

然后,通过从笔记本中调用几个 SageMaker SDK 函数,您可以启动一个服务实例,该实例允许您从 AWS Lambda 函数和其他 AWS 服务调用您的训练模型。

总而言之,与更传统的数据科学工作流程相比,此工作流程可从原始数据到分析再到模型训练和部署的进展速度要快得多。

它们如何协同工作?

到目前为止,SAP HANA 和 Amazon SageMaker 作为独立的工具听起来都很棒,但您可能想知道如何将它们一起使用。毕竟,它们似乎服务于不同的目的。

幸运的是,我之前提到的一些 HANA 功能——与 Python 和 Tensorflow 的集成——在这里很有用。

HANA 的 Python 库包含一个数据框,它与 Pandas 数据框兼容。这很棒,因为大多数 Python 机器学习工具都知道如何处理 Pandas 数据框。我们将使用此功能直接从 HANA 实例读取数据,并在 SageMaker 笔记本中进行探索。

我们还将查看 HANA 的 Tensorflow 集成生成的。虽然我们将使用只读 HANA 实例,并且在本教程中无法自行调用 Tensorflow,但我会向您展示在 HANA 中运行以调用 Tensorflow 模型并请求其对数据集执行推理所需的查询。我认为您会对它的简单性印象深刻。

创建 SageMaker 笔记本

我们 SageMaker + HANA 之旅的第一步是创建 SageMaker 笔记本。为此,您需要一个 AWS 账户。如果您还没有,请访问 https://aws.amazon.com/,然后点击页面顶部的“创建 AWS 账户”大橙色按钮。

接下来,登录到您的 AWS 账户并打开 AWS 管理控制台。点击“所有服务”下拉菜单以展开它并查看完整的服务列表。您会在“机器学习”标题下找到 Amazon SageMaker。我在下面用红色标出了它。

点击 Amazon SageMaker,您将进入 SageMaker 仪表板。在仪表板上,点击笔记本实例。

然后,点击“创建笔记本实例”按钮。

在下一个屏幕上,输入笔记本实例名称,然后选择 ml.t2.medium 实例类型。务必选择此实例类型,因为如果您是 SageMaker 新用户,可以免费使用 250 小时。另外,请务必在完成 SageMaker 笔记本后关闭并删除它。

完成后,点击屏幕底部的“创建笔记本实例”。此时,您需要等待几分钟,SageMaker 才能启动您的笔记本实例。在此过程中,笔记本的状态将显示为“待处理”。

这是去拿杯咖啡的绝佳时机,为您的大脑提供额外的动力来完成本教程的其余部分。

现在我们已经休息过咖啡了,让我们检查一下 SageMaker 笔记本的状态。当它准备好时,您会看到其状态已更改为“正在运行”。

接下来,点击“打开 JupyterLab”链接。您会看到一个漂亮的旋转的 JupyterLab 加载屏幕几秒钟,然后您将进入启动器屏幕。

您可能会注意到 JupyterLab UI 在这里不是很有帮助,因为它截断了笔记本类型的名称,所以您实际上无法读取它们。

幸运的是,如果您将鼠标悬停在每个笔记本类型上,就会弹出完整的名称。您要选择的名称是“conda_tensorflow_p36”。在上图所示的屏幕截图中,它是 R (Beta) 之前的最后一个选项。找到“conda_tensorflow_p36”后,点击它,您将进入一个空的 Python 笔记本。

如果您以前从未使用过 Jupyter 笔记本,您可能会想知道这到底是什么。幸运的是,它简单易懂。Jupyter 笔记本提供了一个交互式环境来编写和运行代码。在笔记本中,您在单元格中输入代码。您的新笔记本包含一个空白单元格,可供您使用。

让我们通过输入和运行一些代码来尝试一下。点击单元格,然后输入以下代码。

然后点击 按钮运行您的代码,您将看到以下结果。

这真酷!我们的笔记本运行了我们的代码,内联显示了结果,然后创建了一个新单元格供我们运行更多代码。

我们快速的 Jupyter 教程完成后,让我们继续,让我们的笔记本能够连接到 SAP HANA 实例。我们只需告诉我们的笔记本下载并安装一个 Python 库,它就可以让我们将 HANA 数据导入到 Pandas 兼容的数据框中。

在菜单栏上,选择 **文件** > **新建** > **终端**。

在打开的终端中,粘贴以下代码。

mkdir -p ~/SageMaker/downloads/hanaclient
cd ~/SageMaker/downloads
wget --no-cookies \
  --header "Cookie: eula_3_1_agreed=tools.hana.ondemand.com/developer-license-3_1.txt" \
  "https://tools.hana.ondemand.com/additional/hanaclient-2.4.162-linux-x64.tar.gz" \
  -P ~/SageMaker/downloads
tar -xvf ~/SageMaker/downloads/hanaclient-*-linux-x64.tar.gz
rm -f ~/SageMaker/downloads/hanaclient-*-linux-x64.tar.gz

请注意,您必须按 **Ctrl-Shift-V** 才能粘贴到终端;**Ctrl-V** 将不起作用。这些命令将下载并解压 HANA 客户端。接下来,我们将粘贴以下命令来安装 HANA Python 客户端库。

mkdir -p ~/SageMaker/sap/hdbclient

cd ~/SageMaker/downloads/client
./hdbinst --path=/home/ec2-user/SageMaker/sap/hdbclient/

cd ~
rm -Rf ~/SageMaker/downloads/client

source activate tensorflow_p36
pip install /home/ec2-user/SageMaker/sap/hdbclient/hdbcli-*.tar.gz

最后,运行这些命令来安装 HANA 机器学习 Python 库。

source activate tensorflow_p36 
pip install /home/ec2-user/SageMaker/sap/hdbclient/hana_ml-*.tar.gz

这样,我们的笔记本就可以连接到 SAP HANA 了。我们可以继续在 Jupyter 笔记本中分析数据集了。

探索数据

在 JupyterLab 中,点击包含您的笔记本的选项卡——它应该名为“Untitled.ipynb”。如果您想给您的笔记本起一个更花哨的名字,可以在文件菜单中找到“重命名笔记本”。如果不行,也没关系。我们可以仅使用一个未命名的笔记本。

首先,点击包含我们上面添加的 print 函数调用的单元格。然后,点击剪刀图标删除此单元格。这样做将留给您一个全新的空白单元格来编写新代码。在您的新单元格中,输入或粘贴以下代码。

!pip install -q /home/ec2-user/SageMaker/sap/hdbclient/hdbcli-*.tar.gz
!pip install -q /home/ec2-user/SageMaker/sap/hdbclient/hana_ml-*.tar.gz

import os
import pandas as pd
import seaborn as sns
import numpy as np

from hana_ml import dataframe
from matplotlib import pyplot as plt

%matplotlib inline

此代码可确保 HANA 库已准备好使用,然后导入一些依赖项。如前所述,Pandas 是一个数据处理库。Seaborn 和 matplotlib 都是数据可视化库,Numpy 是一个科学计算库。添加代码后,点击 **运行** 按钮执行它。

接下来,我们将从 HANA 导入 Iris 数据。将以下代码添加到新单元格中。

col_features = ['SEPALLENGTH', 'SEPALWIDTH', 'PETALLENGTH', 'PETALWIDTH']
col_label = 'SPECIES'
col_label_class = ['setosa', 'versicolor', 'virginica']

# Instantiate the Connection Object (conn)
host = "54.208.22.69"
port = 39015
user = "CONTEST_USER"
pswd = "CodeProject2019"
conn = dataframe.ConnectionContext(host, port, user, pswd)

# Create the HANA Dataframe (df_train) and point to the training table.
training_data = conn.table("IRIS_TRAINING", schema="ML_DATA").collect()
training_data.SPECIES.replace(sorted(training_data.SPECIES.unique()), 
                                     col_label_class, inplace=True)
print(type(training_data))

此代码将数据从 HANA 加载到 Pandas 数据框,然后将标签列的数字值替换为其相应的字符串值。最后,我们打印 Pandas 返回的类别类型。

接下来,将以下代码粘贴到单元格中并运行它。

training_data.head(5)

您会得到以下结果。

真不错!在这里,我们看到我们可以显示的输出不仅限于文本。我们还可以获得漂亮的表格。正如我们很快就会看到的,我们可以做得更好!

接下来,我们来看看每个鸢尾花特征的分布情况。将此粘贴到新单元格中并运行它。

features_data = training_data.loc[:, col_features]
fig, axes = plt.subplots(figsize=(10,10),
    nrows=2,
    ncols=2,
)

for i, ax in enumerate(axes.flat):
    features_data[col_features[i]].value_counts().sort_index().plot
                                  (kind='line', legend=True, ax=ax)

plt.show()

您将看到这一系列图表。

真有趣!花萼宽度似乎呈正态分布,而其他特征似乎有一个峰值然后逐渐减弱。

为了完成对数据集的分析,我们将创建散点图,将每种鸢尾花的三种物种两两比较。在新单元格中运行此代码。

fig, axes = plt.subplots(figsize=(15,15),
    nrows=len(col_features),
    ncols=len(col_features),
    sharex='col',
    sharey='row'
)

fig.suptitle("Edgar Anderson's Iris Data", fontsize=18)
plot_colors = ['blue', 'white', 'red']

for x in range(len(col_features)):
    for y in range(len(col_features)):
        ax = axes[x,y]
        if x == y:
            ax.text(0.5, 0.5, col_features[x],
                transform = ax.transAxes,
                horizontalalignment = 'center',
                verticalalignment = 'center',
                fontsize = 18
            )
        else:
            for idx_label, color in zip(range(len(col_label_class)), plot_colors):
                idx = np.where(training_data.SPECIES == idx_label)                
                ax.scatter(
                    training_data.loc[training_data.SPECIES == col_label_class[idx_label], 
                                                               col_features[x]],
                    training_data.loc[training_data.SPECIES == col_label_class[idx_label], 
                                                               col_features[y]],
                    c = color,
                    cmap = plt.cm.RdYlBu,
                    label = col_label_class[idx_label],
                    edgecolor = 'black',
                    s = 20
                )
                ax.legend()

plt.show()

此代码将产生以下结果。

再次,一个非常有趣的结果!在查看两个特征时,有许多情况每个物种都形成一个相当明显的簇。这是一个好迹象;这意味着我们很有可能构建一个机器学习模型,该模型可以根据鸢尾花的瓣长、瓣宽和萼片宽度来学习确定鸢尾花属于哪个物种。

我强烈建议您查阅 matplotlibseaborn 的文档和示例部分。看看您还可以用这个数据集创建哪些其他有趣的可视化图!

此时,我想快速总结一下。只需很少的代码,我们就能直接从 HANA 读取数据到 Pandas 数据框,然后在 Jupyter 笔记本中进行处理。这可能看起来不是一项巨大的成就,但我们能够轻松完成它,这一点很棒。通常,从数据库获取数据到数据框需要更多的工作。

请记住,由于空间限制,我们只关注 HANA 功能的一小部分。在典型使用场景中,您在 HANA 中已经拥有大量数据集,因为 HANA 可以轻松地对大数据进行切片、切块和快速分析。鉴于您的数据已在 HANA 中进行分析,能够直接将其插入 SageMaker 笔记本进行进一步探索是一个巨大的优势。

插曲 - 使用 SageMaker 训练模型

由于空间限制,我们将不详细介绍使用 SageMaker 训练机器学习模型的整个过程。并不是说这个过程很难。实际上,它非常简单!我们只想确保您能在不到一小时的时间内完成本教程。

SageMaker 中训练的基本过程包括

  • 将数据保存到 AWS S3 存储桶
  • 设置您的 ML 分类器
  • 要求 SageMaker 训练您的模型

所有这些步骤都可以通过在 SageMaker 笔记本中运行一些代码来完成。要了解使用我们一直在查看的相同鸢尾花数据集训练 Tensorflow 模型是什么样子,请查看 SAP 的 这个很棒的教程

SageMaker 还提供将模型部署并通过 REST API 调用它的选项。有关教授您如何训练模型并部署它的完整端到端教程,我推荐 SageMaker 的 入门指南

HANA 中的 Tensorflow 数据

我们现在将跳过一点。使用我们之前在 SageMaker 笔记本中分析的数据,我在 SageMaker 中训练了一个模型,然后使用 Tensorflow Serving Amazon 的 Elastic Container Service 进行了部署。

HANA 内置机器学习支持的一个很酷的功能是,它可以通过 gRPC 连接访问 Tensorflow Serving 实例。然后,它可以直接从 HANA 将测试数据传递给 Tensorflow 进行分类,然后将结果写入 HANA 中的新表。

由于我们使用的是共享的只读 HANA 实例,因此您无法亲自执行此操作。相反,我已经预先填充了一个 HANA 表,其中包含从 Tensorflow 收到的结果,以便您可以看到结果的样子。

为了完整起见,让我们看一下您将需要执行的调用,以将数据从 HANA 发送到 Tensorflow。您无需在任何地方输入此代码;仅供参考。

-- Define table types

CREATE TYPE TT_IRIS_FEATURES  AS TABLE (
  SEPALLENGTH FLOAT,
  SEPALWIDTH FLOAT,
  PETALLENGTH FLOAT,
  PETALWIDTH FLOAT
);

CREATE TYPE TT_IRIS_PARAMS    AS TABLE (
  "Parameter" VARCHAR(100),
  "Value" VARCHAR(100)
);

CREATE TYPE TT_IRIS_RESULTS   AS TABLE (
  PREDICTED_CLASS_ID INTEGER,
  CLASSES VARCHAR(100),
  BIAS_0 FLOAT, BIAS_1 FLOAT, BIAS_2 FLOAT,
  PROBABILITY_0 FLOAT, PROBABILITY_1 FLOAT, PROBABILITY_2 FLOAT
);

-- Create description table for procedure wrapper creation
CREATE COLUMN TABLE IRIS_PROC_PARAM_TABLE (
    POSITION        INTEGER,
    SCHEMA_NAME     NVARCHAR(256),
    TYPE_NAME       NVARCHAR(256),
    PARAMETER_TYPE  VARCHAR(7)
);

-- Populate the wrapper procedure parameter table
INSERT INTO IRIS_PROC_PARAM_TABLE VALUES (1, CURRENT_SCHEMA, 'TT_IRIS_PARAMS'    , 'in');
INSERT INTO IRIS_PROC_PARAM_TABLE VALUES (2, CURRENT_SCHEMA, 'TT_IRIS_FEATURES'  , 'in');
INSERT INTO IRIS_PROC_PARAM_TABLE VALUES (3, CURRENT_SCHEMA, 'TT_IRIS_RESULTS'   , 'out');

-- Drop the wrapper procedure
CALL SYS.AFLLANG_WRAPPER_PROCEDURE_DROP(CURRENT_SCHEMA, 'MY_IRIS');

-- Create the wrapper procedure
CALL SYS.AFLLANG_WRAPPER_PROCEDURE_CREATE_
 ('EML', 'PREDICT', CURRENT_SCHEMA, 'MY_IRIS', IRIS_PROC_PARAM_TABLE);

-- Create the result table
CREATE TABLE IRIS_RESULTS  LIKE TT_IRIS_RESULTS;

-- Create and populate the parameter table
CREATE TABLE IRIS_PARAMS    LIKE TT_IRIS_PARAMS;

INSERT INTO IRIS_PARAMS   VALUES ('Model', 'iris%predict');
INSERT INTO IRIS_PARAMS   VALUES ('RemoteSource', 'TensorFlow');
INSERT INTO IRIS_PARAMS   VALUES ('Deadline', '10000');

-- Call the TensorFlow model
CALL MY_IRIS (IRIS_PARAMS, IRIS_TEST, IRIS_RESULTS) WITH OVERVIEW;

这看起来代码量很大,但都相当容易理解。我们定义了一些新类型,创建了一个包装器过程,创建了一个用于存储结果的表,然后运行了导致 HANA 调用 Tensorflow 的过程。

正如我们所见,HANA 被要求将结果保存在 IRIS_RESULTS 表中。这是我们共享 HANA 数据库中的预填充结果的表,所以让我们执行一些查询来探索数据。

这里有一个小陷阱:要连接到我们的 HANA 实例,我们必须在 HOSTS 文件中添加一个条目。HANA 的所有基于 Web 的工具都期望在 hxehost 上运行——所以我们需要在 HOSTS 文件中添加一个条目,将所有对 hxehost 的调用映射到 HANA 实例的 IP 地址。

在 Windows 上,您可以在 _C:\Windows\System32\drivers\etc\HOSTS_ 中找到您的 HOSTS 文件。在 Linux 和 MacOS 上,您可以在 _/etc/hosts_ 中找到它。无论您使用的是哪个操作系统,都需要管理员或 root 权限才能编辑该文件。打开 _HOSTS_ 文件后,添加以下行。

54.208.22.69 hxehost

要连接到我们的只读 HANA 实例,请打开 Web 浏览器并导航到 _https://hxehost:53075_。您的浏览器可能会发出安全警告,因为 HANA 使用自签名 TLS 证书。通常,当您收到此类警报时,您应该尽快远离。

在这种情况下,没有风险。即使证书**确实**被泄露,我们也**不会**传输任何机密信息。我在这里发布登录凭据供大家查看,并且数据库中的只读信息可供任何希望登录查看的人在互联网上自由访问。

在登录提示符处,使用以下凭据。

  • 用户名: CONTEST_USER
  • 密码: CodeProject2019

HANA Web IDE 可能需要 30 秒左右才能完全加载。完成后,您会在左侧看到一个面板,列出了一个数据库:HXE@localhost。右键单击数据库,然后在出现的菜单中,选择“打开 SQL 控制台”。

现在,我们将执行一个查询来查看 HANA 从我们的 Tensorflow 模型检索到的结果。在 HANA Web IDE 中运行以下查询。

SET SCHEMA ML_DATA;

SELECT
  D.SPECIES AS "CURRENT_SPECIES",
  R.PREDICTED_CLASS_ID AS "PREDICTED_SPECIES",
  CASE WHEN D.SPECIES != R.PREDICTED_CLASS_ID THEN 'INCORRECT' _
       ELSE 'CORRECT' END AS "STATUS",
  ROUND (PROBABILITY_0, 5) AS "PROBABILITY_0",
  ROUND (PROBABILITY_1, 5) AS "PROBABILITY_1",
  ROUND (PROBABILITY_2, 5) AS "PROBABILITY_2"
FROM
  (SELECT *, ROW_NUMBER() OVER() AS RN FROM IRIS_RESULTS) R
JOIN
  (SELECT *, ROW_NUMBER() OVER() AS RN FROM IRIS_TEST) D ON R.RN = D.RN;

此查询将 Tensorflow 的 IRIS_RESULTS 表数据与包含提交给 Tensorflow 的测试数据的 IRIS_TEST 表连接起来。这使我们能够同时显示测试数据**和** Tensorflow 预测结果。

为了方便起见,我们还添加了一个额外的“Status”字段,该字段将告诉我们 Tensorflow 预测是正确还是错误。

就这样!通过一个简单的查询,我们就能够探索 HANA 直接从 Tensorflow 导入的数据。请记住,HANA 是一个高速内存数据库。现在数据已进入 HANA,您可以进行大量的进一步转换和分析。我们所看的内容仅仅是一个起点。

考虑一下这有多方便:没有内置的 ML 工具,您通常需要编写一个单独的程序来读取测试数据,将其发送给 Tensorflow,接收结果,然后将结果写入您的数据库。HANA 在这里为您节省了大量时间;您不必花费时间编写额外的代码,而是可以花时间处理您的数据。

报名代码

要为此部分挑战创建报名代码,请在 HANA Web IDE 中运行以下代码。

CALL GENERATE_ENTRY_CODE(123456789);

但是请将 123456789 替换为您的 CodeProject 会员编号。您可以在您的 CodeProject 个人资料页面上找到您的会员编号,就在您的头像图片上方。

生成报名代码后,请访问 比赛报名页面。在下拉框中选择第二轮比赛,输入您的报名代码,然后点击提交

结论

哇!我们对 SAP HANA 和 AWS SageMaker 进行了一次真正的旋风之旅,所以让我们暂停一下,喘口气。

我们在短时间内涵盖了很多内容:我们创建了自己的 SageMaker 笔记本,然后使用它来可视化直接从 HANA 拉取的数据。然后,我们介绍了将这些数据放入 S3 并使用 SageMaker 自动训练的简便性。接下来,我们探讨了如何部署此模型,以便可以轻松地从 AWS Lambda、AWS EC2 和 AWS Lightsail 等服务使用它。最后,我们回到了 HANA,看看让 HANA 发送数据到 Tensorflow、将推理结果存储在新表中,然后使用 SQL 查询探索结果有多么简单。

既然我们只是触及了 HANA 和 SageMaker 的可能性,我强烈建议您更深入地尝试它们。

对于 SageMaker,入门文档是一个很好的起点。它为您提供了易于理解的概述,介绍了如何在典型数据科学项目的整个生命周期中使用 AWS SageMaker。

对于 HANA,我推荐 HANA Express Edition 官方教程。这些教程将引导您完成 HANA 的设置,然后指导您创建几种不同类型的应用程序,以帮助您探索 HANA 的所有功能。

历史

  • 2019 年 8 月 31 日:初始版本
© . All rights reserved.