将 Driverless AI 模型部署到生产

默认情况下,每个完成的 Driverless AI 实验(显式禁用或由于专家设置修改而不可用除外)都会创建至少一个 scoring pipeline 来在 Python、C++、Java 和 R 中进行评分。

本文档列出了几个部署选项和示例,可用于为生产目的部署 Driverless AI MOJO(Java 和带 Python/R 包装器的 C ++)以及 Python 评分管道。可从 here 访问 部署模板文档 。更多定制要求,请联系 support@h2o.ai

使用 Java 运行时的 MOJO 部署选项

以下是用于使用 Java 运行时部署 Driverless AI MOJO 的几个选项。图中的链接指向代码示例和模板。

Driverless AI MOJO Java Runtime Deployment Options

Driverless AI MOJO Java 运行时部署选项

还可从 Driverless AI GUI 内部署 Java MOJO 评分管道。更多信息,请参见 Deployment options from within Driverless AI GUI.

使用 C++ 运行时的 MOJO 部署选项

这里我们列出了用于使用 C++ 运行时部署 Driverless AI Mojo 的一些示例场景和平台。还可直接从 R/Python 终端运行 Mojo C++ 运行时。更多信息,请参见 Driverless AI MOJO 评分管道 – 带有 Python 和 R 包装器 C++ 运行时.

Driverless AI MOJO C++ Runtime Deployment Options

Driverless AI MOJO C++ 运行时部署选项

独立 Python 评分管道部署选项

Driverless AI Python Scoring Pipeline Deployment Options

Driverless AI Python 评分管道部署选项

Driverless AI GUI 中可用的部署

在 Driverless AI GUI 中可执行以下部署。而 Driverless AI 内仅支持 MOJO Java 运行时部署。

所有现有的 MOJO 评分管道部署均会在“部署概述”页面中显示,可在顶部菜单中找到。此页面列出了所有活动部署和访问各个端点所需的信息。此外,您还可以在此页面中终止任何不再需要的部署。

Deployments Overview Page

Amazon Lambda 部署

Driverless AI 可将训练后的 MOJO 评分管道作为 AWS Lambda 函数 进行部署,即,作为在 Amazon Cloud 中运行的无服务器评分器,并按实际使用情况收费。

其他资源

请参阅 dai-deployment-templates 质量库中的 aws-lambda-scorer 文件夹,查看适用于 AWS Lambda 评分器的不同部署模板。

Driverless AI 先决条件

  • Driverless AI MOJO 评分管道:若要将 MOJO 评分管道作为 AWS Lambda 函数部署,必须先通过选择“已完成的实验”页面上的 构建 MOJO 评分管道 选项创建 MOJO 管道存档文件。请参阅 MOJO 评分管道 一节,了解更多关于如何构建 MOJO 评分管道的信息。

  • 有效的 Driverless AI 许可证。AWS Lambdas 的 Driverless AI 部署管道将许可证密钥显式设置为环境变量。如果您的 Driverless AI 许可证已过期,将无法使用 MOJO。如果许可证已过期,您可以手动更新许可证,以用于 AWS 中的每个 MOJO 模型,或者您也可以使用脚本更新部署区域的所有 MOJO。更多信息,请参阅 在 AWS Lambda 上更新 Driverless AI 许可证.

AWS 先决条件

使用计划

必须在目标 AWS 区域启用使用计划,以便在通过其 REST API 访问 AWS Lambda 时使用 API 密钥。更多信息,请访问 https://aws.amazon.com/blogs/aws/new-usage-plans-for-amazon-api-gateway/

访问权限

需为角色提供以下 AWS 访问权限,以成功部署 Driverless AI Lambda。

  • AWSLambdaFullAccess

  • IAMFullAccess

  • AmazonAPIGatewayAdministrator

AWS permissions

通过使用如下所示的 JSON 策略定义,可进一步精简此策略,以限制 Lambda 和 S3 的权限。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "iam:GetPolicyVersion",
                "iam:DeletePolicy",
                "iam:CreateRole",
                "iam:AttachRolePolicy",
                "iam:ListInstanceProfilesForRole",
                "iam:PassRole",
                "iam:DetachRolePolicy",
                "iam:ListAttachedRolePolicies",
                "iam:GetRole",
                "iam:GetPolicy",
                "iam:DeleteRole",
                "iam:CreatePolicy",
                "iam:ListPolicyVersions"
            ],
            "Resource": [
                "arn:aws:iam::*:role/h2oai*",
                "arn:aws:iam::*:policy/h2oai*"
            ]
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": "apigateway:*",
            "Resource": "*"
        },
        {
            "Sid": "VisualEditor2",
            "Effect": "Allow",
            "Action": [
                "lambda:CreateFunction",
                "lambda:ListFunctions",
                "lambda:InvokeFunction",
                "lambda:GetFunction",
                "lambda:UpdateFunctionConfiguration",
                "lambda:DeleteFunctionConcurrency",
                "lambda:RemovePermission",
                "lambda:UpdateFunctionCode",
                "lambda:AddPermission",
                "lambda:ListVersionsByFunction",
                "lambda:GetFunctionConfiguration",
                "lambda:DeleteFunction",
                "lambda:PutFunctionConcurrency",
                "lambda:GetPolicy"
            ],
            "Resource": "arn:aws:lambda:*:*:function:h2oai*"
        },
        {
            "Sid": "VisualEditor3",
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::h2oai*/*",
                "arn:aws:s3:::h2oai*"
            ]
        }
    ]
}

在 Amazon Lambda 上部署

MOJO 管道存档文件准备就绪后,Driverless AI 将在“已完成的实验”页面提供 部署(本地和云端) 选项。

请注意:构建 MOJO 评分管道后,方可使用此按钮。

Deploy Model from Experiment Overview

此选项将打开一个新对话框,用于设置 AWS 帐户凭据(或使用 Driverless AI 配置文件或环境变量中提供的凭据)、AWS 区域和所需的部署名称(每个 Driverless AI 用户和 AWS 帐户必须使用唯一的部署名称)。

AWS Lambda Deployment Dialog

Amazon Lambda 部署参数

  • 部署名称:部署的唯一名称。默认情况下,Driverless AI 将根据实验名称和部署类型提供一个名称。此名称必须是 Driverless AI 用户和 AWS 帐户所使用的唯一名称。

  • 区域:要部署 MOJO 评分管道的 AWS 区域。合理选择地理位置上靠近调用端点的任何客户端代码的区域,以尽可能地减小请求延迟。(另请参阅 AWS 区域和可用区.)

  • 使用 AWS 环境变量:如果启用,则将从 Driverless AI 配置文件(请参阅记录 deployment_aws_access_key_iddeployment_aws_secret_access_key)或环境变量 (DRIVERLESS_AI_DEPLOYMENT_AWS_ACCESS_KEY_ID``和 ``DRIVERLESS_AI_DEPLOYMENT_AWS_SECRET_ACCESS_KEY)中获取 AWS 凭据。此凭据通常由 Driverless AI 安装管理员输入。

  • AWS 访问密钥 IDAWS 秘密访问密钥:访问 AWS 帐户的凭据。此密钥对用于识别 AWS 用户和帐户,可从 AWS 帐户控制台中获取。

测试 Lambda 部署

成功部署后,将打印访问新端点所需的所有信息(URL 和 API 密钥),而且点击部署行后,可在 部署概述页面 获取相同信息。

Deployments Overview Page

请注意,实际评分端点位于路径 /score 下。此外,若需防止 DDoS 和其他恶意活动,可使用 API 密钥来保护生成的 AWS lambda,即,必须使用 x-api-key HTTP 标头来将密钥作为请求的一部分传入。

此请求是 JSON 对象,包含以下属性:

  • fields:应与训练数据列一致的输入列名称列表。

  • rows:行列表,反过来又是用于预测目标值的单元值列表。

  • (可选) includeFieldsInOutput :输出结果中应包含的输入列列表。

在以下示例中,请求提供 2 个输入列,并要求将其中一列复制到输出结果中:

{
  "fields": [
    "age", "salary"
  ],
  "includeFieldsInOutput": [
    "salary"
  ],
  "rows": [
    [
      "48.0", "15000.0"
    ],
    [
      "35.0", "35000.0"
    ],
    [
      "18.0", "22000.0"
    ]
  ]
}

假设将此请求存储于一个命名为 test.json 的本地文件中,则可通过使用 curl 实用工具等方式将请求发送至端点,如下所示:

URL={place the endpoint URL here}
API_KEY={place the endpoint API key here}
curl \
  -d @test.json \
  -X POST \
  -H "x-api-key: ${API_KEY}" \
  ${URL}/score

此响应是带有单个属性 score 的 JSON 对象,包含具有复制的输入值和预测结果(可选)的行列表。

对于以上有两个类目标字段的示例,结果可能会类似于以下代码片段。当然,特定值将取决于评分管道:

{
  "score": [
    [
      "48.0",
      "0.6240277982943945",
      "0.045458571508101536",
    ],
    [
      "35.0",
      "0.7209441819603676",
      "0.06299909138586585",
    ],
    [
      "18.0",
      "0.7209441819603676",
      "0.06299909138586585",
    ]
  ]
}

AWS 部署问题

我们将为每个 AWS Lambda 部署创建一个新的 S3 存储桶。存储桶的名称在整个 AWS S3 中必须是唯一的,并且一个用户最多可创建 100 个存储桶。因此,我们建议通过 deployment_aws_bucket_name 配置选项来设置用于部署的存储桶名称。

REST 服务器部署

本节介绍如何将训练后的 MOJO 评分管道作为本地表征状态转移 (REST) 服务器进行部署。

请注意 :关于 REST 服务器部署限制的信息,请参见 REST 服务器部署限制.

其他资源

REST 服务器部署支持 API 端点,例如,模型元数据、文件/CSV 评分等。其使用 SpringFox 以编程的方式以及手动方式检查 API。请参阅 dai-deployment-templates 资料库中的 local-rest-scorer 文件夹,查看用于本地 REST 评分器的不同部署模板。

先决条件

  • Driverless AI MOJO 评分管道:若要将 MOJO 评分管道作为本地 REST 服务器部署,必须先通过选择“已完成的实验”页面上的 构建 MOJO 评分管道 选项创建 MOJO 管道存档文件。请参阅 MOJO 评分管道 一节,了解更多关于如何构建 MOJO 评分管道的信息。

  • 当使用防火墙或者虚拟私有云 (VPC) 时,必须公开 REST 服务器所使用的端口。

  • 请确保您有足够的内存和 CPU 运行 REST 评分器。一般而言,所需内存量至少要达到 pipeline.mojo 文件大小的 12 倍左右。例如,一个 100MB 的 pipeline.mojo 文件将需要大约 1200MB RAM。(请注意:若要在 Driverless AI 中查看关于系统的详细信息,可点击屏幕上方的 资源 ,然后点击 系统信息 。)

  • 当在 Docker 容器中运行 Driverless AI 时,您必须公开 Docker 上的端口,用于在 Driverless AI Docker 容器内部署 REST 服务。例如,以下示例公开了 Driverless AI Docker 容器,以侦听端口 8094 上是否有送达主端口 18094 的请求。

 docker run \
   -d \
   --pid=host \
   --init \
   --rm \
   --shm-size=256m \
   -u `id -u`:`id -g` \
   -p 12181:12345 \
   -p 18094:8094 \
   -v `pwd`/data:/data \
   -v `pwd`/log:/log \
   -v `pwd`/license:/license \
   -v `pwd`/tmp:/tmp \
   h2oai/<dai-image-name>:1.10.1-cuda11.2.2.xx

在 REST 服务器上部署

MOJO 管道存档文件准备就绪后,Driverless AI 将在“已完成的实验”页面提供 部署(本地和云端) 选项。

请注意

  • 构建 MOJO 评分管道后,方可使用此按钮。

  • 此按钮在 PPC64LE 环境中不可用。

Deploy Model from Experiment Overview

此选项将打开一个新对话框,以设置 REST 服务器部署名称、端口号和最大堆大小(可选)。

Rest Server Deployment Dialog
  1. 指定 REST 评分器的名称,以帮助跟踪已部署的 REST 评分器。

  2. 提供一个用于运行 REST 评分器端口号。例如,如果选择端口号 8081,则可在 http://my-ip-address:8081/models 中使用此评分器。

  3. 可选择指定运行 REST 评分器的 Java 虚拟机 (JVM) 的最大堆大小。这有助于限制 REST 评分器,使其不会过度消耗虚拟机的内存。因为 REST 评分器和 Driverless AI 在同一个虚拟机上运行,所以限制分配给 REST 评分器的内存可能会有所帮助。此选项将限制 REST 评分器可使用的内存,但是如果为其分配的内存不足以运行评分器,则会产生错误。(所需内存主要取决于 MOJO 的大小。更多信息,请参阅 先决条件 。)

测试 REST 服务器部署

REST Deployment Endpoint Info

请注意,实际评分端点位于路径 /score 下。

此请求是 JSON 对象,包含以下属性:

  • fields:应与训练数据列一致的输入列名称列表。

  • rows:行列表,反过来又是用于预测目标值的单元值列表。

  • (可选) includeFieldsInOutput :输出结果中应包含的输入列列表。

在以下示例中,请求提供 2 个输入列,并要求将其中一列复制到输出结果中:

{
  "fields": [
    "age", "salary"
  ],
  "includeFieldsInOutput": [
    "salary"
  ],
  "rows": [
    [
      "48.0", "15000.0"
    ],
    [
      "35.0", "35000.0"
    ],
    [
      "18.0", "22000.0"
    ]
  ]
}

假设将此请求存储于一个命名为 test.json 的本地文件中,则可通过使用 curl 实用工具等方式将请求发送至端点,如下所示:

URL={place the endpoint URL here}
curl \
  -X POST \
  -d {"fields": ['age', 'salary', 'education'], "rows": [1, 2, 3], "includeFieldsInOutput": ["education"]}\
  -H "Content-Type: application/json" \
  ${URL}/score

此响应是带有单个属性 score 的 JSON 对象,包含具有复制的输入值和预测结果(可选)的行列表。

对于以上有两个类目标字段的示例,结果可能会类似于以下代码片段。当然,特定值将取决于评分管道:

{
  "score": [
    [
      "48.0",
      "0.6240277982943945",
      "0.045458571508101536",
    ],
    [
      "35.0",
      "0.7209441819603676",
      "0.06299909138586585",
    ],
    [
      "18.0",
      "0.7209441819603676",
      "0.06299909138586585",
    ]
  ]
}

REST 服务器部署限制

  • 本地 REST 服务器部署有助于确定用于部署的 MOJO 的行为特性。然而,不建议使用 REST 服务器部署作为生产级评分服务。REST 服务器部署与 Driverless AI 核心在同一台虚拟机上运行,因此需要与所有其他 Driverless AI 进程共享系统资源。这可能会导致出现意外情况,在这种情况下,对计算资源的竞争可能使 REST 服务器出现故障。

此外,鉴于 REST 评分器和对 MOJO 进行评分所需的内存和 CPU 资源通常小于训练需求,一般情况下,将 MOJO 部署在较小的实例/主机中会更划算。可在资料库:https://github.com/h2oai/dai-deployment-templates 中轻松找到/创建模板。

  • 如果重启 Driverless AI,将关闭 REST 服务器。