Driverless AI 独立 Python 评分管道

在成功完成实验后可以使用独立 Python 评分管道。在此包中,包含有导出的模型和 Python 3.8 源代码示例(展示在生产环境中执行利用 H2O Driverless AI 构建的模型)。

此包中的文件让您能以多种不同的方式对新数据进行转换和评分:

  • 从 Python 3.8 版本开始,您可以导入评分模块,然后使用该模块对新数据进行转换和评分。

  • 通过其他语言和平台,您可以使用此包附带的 TCP/HTTP 评分服务,通过远程程序调用 (RPC) 来调用该评分管道模块。

开始前

关于 Python 评分管道的重要信息,请参阅以下说明。

注解

如果您使用 Python 的 virtualenvpip run 评分方法,必须手动安装 CUDA、OpenCL 和 cuDNN。更多信息,请参见 CUDA、OpenCL 和 cuDNN 安装说明.

注解

对于 run_example.sh,如果您使用 pip-virtualenv 模式,请执行以下操作安装 Python 评分的必备组件:

要在 Ubuntu 16.04 上安装所需的必备组件,运行以下命令:

sudo apt-get update
sudo apt-get install software-properties-common # Ubuntu 16.04 only
sudo add-apt-repository ppa:deadsnakes/ppa # Ubuntu 16.04 only
sudo apt-get update
sudo apt-get install python3.8 virtualenv unzip -y
sudo apt-get install libgomp1 libopenblas-base ocl-icd-libopencl1 -y  # required at runtime

如果您需要能够编译,还需运行以下命令:

sudo apt install build-essential libssl-dev libffi-dev python3-dev -y

要在 Ubuntu 18.04 或更高版本上安装所需的必备组件,运行以下命令:

sudo apt-get update
sudo apt-get install python3.8 virtualenv unzip -y
sudo apt-get install libgomp1 libopenblas-base ocl-icd-libopencl1 -y  # required at runtime

如果您需要能够编译,还需运行以下命令:

sudo apt install build-essential libssl-dev libffi-dev python3-dev -y

要在 Red Hat Enterprise Linux 7 或更高版本上安装所需的必备组件,运行以下命令:

sudo yum -y install python3.8 unzip virtualenv openblas libgomp

要在 CentOS 7 或更高版本上安装所需的必备组件,运行以下命令:

sudo dnf -y install python3.8 unzip virtualenv openblas libgomp procps

注解

自定义插件和 Python 评分管道

在默认情况下,如果已将某个自定义插件上传到 Driverless AI 中,但随后在实验中并没有使用该自定义插件,Python 评分管道仍将包含 H2O 插件服务器。如果之后将此管道部署在容器中,H2O 插件服务器会导致管道增大很多。另外,还必须在该容器中安装 Java,这会进一步增大运行时存储和内存需求。解决办法是在运行 Python 评分管道之前设置以下环境变量:

export dai_enable_custom_recipes=0

CUDA、OpenCL 和 cuDNN 安装说明

请参阅以下章节,了解使用 Python 的 virtualenvpip run 评分方法时安装 CUDA、OpenCL 和 cuDNN 的说明。

安装具有 NVIDIA 驱动程序的 CUDA

安装 CUDA 前,确保已安装 wget、gcc、make 和 elfutils-libelf-devel:

sudo yum -y install wget
sudo yum -y install gcc
sudo yum -y install make
sudo yum -y install elfutils-libelf-devel

接下来,请访问 https://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html,获取 CUDA 的安装说明。建议您使用 runfile 方法来安装。

如果系统提示您选择想要安装的工具,仅选择驱动程序即可。

安装 OpenCL

对于使用 yum 和 x86 架构的 Centos7 或 RH7 系统,执行以下操作。

sudo yum -y clean all
sudo yum -y makecache
sudo yum -y update
wget http://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/c/clinfo-2.1.17.02.09-1.el7.x86_64.rpm
wget http://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/o/ocl-icd-2.2.12-1.el7.x86_64.rpm
sudo rpm -if ocl-icd-2.2.12-1.el7.x86_64.rpm
sudo rpm -if clinfo-2.1.17.02.09-1.el7.x86_64.rpm
clinfo

mkdir -p /etc/OpenCL/vendors && \
    echo "libnvidia-opencl.so.1" > /etc/OpenCL/vendors/nvidia.icd

安装 cuDNN

关于在 Linux 上安装 cuDNN 的信息,请参阅 https://docs.nvidia.com/deeplearning/cudnn/install-guide/index.html

注解

需要 cuDNN 8 或更高版本。

Python 评分管道文件

scoring-pipeline 文件夹中包含以下值得注意的文件:

  • example.py :演示如何导入新记录并进行评分的 Python 脚本示例。

  • run_example.sh :运行 example.py(也将通过相关库(先决条件)安装 virtualenv)。更多信息,请参阅 开始前 一节的第二个注释。

  • tcp_server.py :用于托管评分服务的独立 TCP 服务器。

  • http_server.py :用于托管评分服务的独立 HTTP 服务器。

  • run_tcp_server.sh :运行 TCP 评分服务(运行 tcp_server.py)。

  • run_http_server.sh :运行 HTTP 评分服务(运行 http_server.py)。

  • example_client.py :演示如何与评分服务器通信的 Python 脚本示例。

  • run_tcp_client.sh :演示如何通过 TCP 与评分服务通信(运行 example_client.py)。

  • run_http_client.sh :演示如何通过 HTTP(使用 curl)与评分服务通信。

快速入门

有两种用于启动 Python 评分管道 的方法。

快速入门 – 替代方法

本节介绍运行 Python 评分管道的替代方法。此版本要求接入互联网。

先决条件

  • 只有在安装了 Python 3.8 和 OpenBLAS 的 Linux 上才支持评分模块和评分服务。

  • 评分模块和评分服务在安装时会下载其他的包,并要求接入互联网。根据您的网络环境,您可能需要通过代理接入互联网。

  • 有效的 Driverless AI 许可证。Driverless AI 要求指定许可证,以运行 Python 评分管道。

  • Apache Thrift (用于在 TCP 模式下运行评分服务)

  • Linux 环境

  • Python 3.8

  • Libopenblas-dev(H2O4GPU 要求)

  • OpenCL

关于如何安装上述必备组件的信息,请参阅以下示例。

在 Ubuntu 16.10 或更高版本上安装 Python 3.8 和 OpenBLAS

sudo apt install python3.8 python3.8-dev python3-pip python3-dev \
  python-virtualenv python3-virtualenv libopenblas-dev

在 Ubuntu 16.04 上安装 Python 3.8 和 OpenBLAS

sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt-get update
sudo apt-get install python3.8 python3.8-dev python3-pip python3-dev \
  python-virtualenv python3-virtualenv libopenblas-dev

安装 Conda 3.6

您可以使用 Anaconda 或 Miniconda 安装 Conda。更多信息,请点击以下链接:

安装 OpenCL

在 RHEL 上安装 OpenCL:

yum -y clean all
yum -y makecache
yum -y update
wget http://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/c/clinfo-2.1.17.02.09-1.el7.x86_64.rpm
wget http://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/o/ocl-icd-2.2.12-1.el7.x86_64.rpm
rpm -if clinfo-2.1.17.02.09-1.el7.x86_64.rpm
rpm -if ocl-icd-2.2.12-1.el7.x86_64.rpm
clinfo

mkdir -p /etc/OpenCL/vendors && \
    echo "libnvidia-opencl.so.1" > /etc/OpenCL/vendors/nvidia.icd

在 Ubuntu 上安装 OpenCL:

sudo apt install ocl-icd-libopencl1

mkdir -p /etc/OpenCL/vendors && \
    echo "libnvidia-opencl.so.1" > /etc/OpenCL/vendors/nvidia.icd

指定许可证

Driverless AI 要求指定许可证,以运行任何 Python 评分管道。可通过 Python 中的环境变量指定许可证:

# Set DRIVERLESS_AI_LICENSE_FILE, the path to the Driverless AI license file
%env DRIVERLESS_AI_LICENSE_FILE="/home/ubuntu/license/license.sig"


# Set DRIVERLESS_AI_LICENSE_KEY, the Driverless AI license key (Base64 encoded string)
%env DRIVERLESS_AI_LICENSE_KEY="oLqLZXMI0y..."

以下示例使用的是 DRIVERLESS_AI_LICENSE_FILE . 使用 DRIVERLESS_AI_LICENSE_KEY 的情况与此类似。

安装 Thrift 编译器

若要在 TCP 模式下运行评分服务,必须先安装 Thrift,但是如果要运行评分模块,则并不要求。可在 Thrift 文档资料 https://thrift.apache.org/docs/BuildingFromSource 中查看以下步骤。

sudo apt-get install automake bison flex g++ git libevent-dev \
  libssl-dev libtool make pkg-config libboost-all-dev ant
wget https://github.com/apache/thrift/archive/0.10.0.tar.gz
tar -xvf 0.10.0.tar.gz
cd thrift-0.10.0
./bootstrap.sh
./configure
make
sudo make install

运行以下命令,以在安装 Thrift 后刷新共享的运行时:

sudo ldconfig /usr/local/lib

运行 Python 评分管道 – 替代方法

  1. 在“已完成的实验”页面上,点击 下载 Python 评分管道 按钮,将用于此实验的 scorer.zip 文件下载到本地计算机。

Download Python Scoring Pipeline button
  1. 提取评分管道文件。

下载并提取管道后,您可以运行评分模块和评分服务。

通过 Python 程序进行评分

如果您想通过 Python 程序进行评分,可运行评分模块示例。(需要 Linux 和 Python 3.8。)

export DRIVERLESS_AI_LICENSE_FILE="/path/to/license.sig"
bash run_example.sh

使用 Web 服务进行评分

如果您想使用 Web 服务进行评分,可运行 HTTP 评分服务器示例。(需要 Linux x86_64 和 Python 3.8。)

export DRIVERLESS_AI_LICENSE_FILE="/path/to/license.sig"
bash run_http_server.sh
bash run_http_client.sh

使用 Thrift 服务进行评分

如果您想使用 Thrift 服务进行评分,可运行 TCP 评分服务器示例。(需要 Linux x86_64、Python 3.8 和 Thrift。)

export DRIVERLESS_AI_LICENSE_FILE="/path/to/license.sig"
bash run_tcp_server.sh
bash run_tcp_client.sh

请注意:默认情况下,上述 run_*.sh 脚本将通过使用 virtualenv 和 pip 创建虚拟环境,并在其中执行 Python 代码。这些脚本也可以利用 Conda (Anaconda/Mininconda) 创建 Conda 虚拟环境,并安装所需的依赖包。需使用的包管理器将作为参数提供给脚本。

# to use conda package manager
export DRIVERLESS_AI_LICENSE_FILE="/path/to/license.sig"
bash run_example.sh --pm conda

# to use pip package manager
export DRIVERLESS_AI_LICENSE_FILE="/path/to/license.sig"
bash run_example.sh --pm pip

如果在运行以上任何脚本时出现错误,请进行检查以确保系统已经正确安装和配置了 Python 3.8。请参阅 Python 环境故障排除 一节,以了解如何使用纯净版 Ubuntu 16.04 虚拟机设置和测试评分模块。

Python 评分模块

评分模块是被捆绑到独立 wheel 文件(名称为 scoring_*.whl)中的 Python 模块。“requirements.txt”文件中列出了评分模块正常工作所需的全部先决条件。若要使用评分模块,您只需创建一个 Python virtualenv、安装作为先决条件的各种包并按照如下方法导入和使用评分模块:

# See 'example.py' for complete example.
from scoring_487931_20170921174120_b4066 import Scorer
scorer = Scorer()       # Create instance.
score = scorer.score([  # Call score()
    7.416,              # sepal_len
    3.562,              # sepal_wid
    1.049,              # petal_len
    2.388,              # petal_wid
])

评分器实例提供了以下方法(还有其他一些方法):

  • score(list):对某一行进行评分(值列表)。

  • score_batch(df):对 Pandas 数据帧进行评分。

  • Fit_transform_batch(df):对 Pandas 数据帧进行转换。

  • get_target_labels():获取目标列标签(用于分类问题)。

导入和使用评分模块的流程通过 Bash 脚本 run_example.sh 演示,该脚本将有效执行以下步骤:

# See 'run_example.sh' for complete example.
virtualenv -p python3.8 env
source env/bin/activate
pip install --use-deprecated=legacy-resolver -r requirements.txt
export DRIVERLESS_AI_LICENSE_FILE="/path/to/license.sig"
python example.py

评分服务

评分服务将评分模块作为 HTTP 或 TCP 服务托管。这样就能通过远程过程调用 (RPC) 公开评分模块的所有函数。实际上,此机制让您能在相同计算机上通过非 Python 语言调用评分函数,或从共享网络或互联网上的其他计算机调用。

评分服务可通过两种方式启动:

  • 在 TCP 模式下,评分服务将利用二进制线路协议通过 Apache Thrift (https://thrift.apache.org/) 提供高性能的 RPC 调用。

  • 在 HTTP 模式下,评分服务将提供由 Tornado (http://www.tornadoweb.org) 服务的 JSON-RPC 2.0 调用。

可对各行(逐行)或在批处理模式(一次多行)下执行评分操作。

评分服务 – TCP 模式 (Thrift)

TCP 模式让您能通过 Thrift 支持的任何语言使用评分服务,这些语言包括 C、C++、C#、Cocoa、D、Dart、Delphi、Go、Haxe、Java、Node.js、Lua、perl、PHP、Python、Ruby 和 Smalltalk。

若要在 TCP 模式下启动评分服务,您需要一次性生成 Thrift 绑定,然后运行服务器:

# See 'run_tcp_server.sh' for complete example.
thrift --gen py scoring.thrift
python tcp_server.py --port=9090

请注意,只在构建时要求使用 Thrift 编译器。其并不依赖运行时,也就是说一旦构建和测试评分服务,您就不需要在被用于部署评分服务的计算机上重复此安装过程。

若要调用评分服务,需使用您选择的语言生成 Thrift 绑定,然后利用 Thrift 的缓冲传输和其二进制协议通过 TCP 套接字进行 RPC 调用。

# See 'run_tcp_client.sh' for complete example.
thrift --gen py scoring.thrift

# See 'example_client.py' for complete example.
socket = TSocket.TSocket('localhost', 9090)
transport = TTransport.TBufferedTransport(socket)
protocol = TBinaryProtocol.TBinaryProtocol(transport)
client = ScoringService.Client(protocol)
transport.open()
row = Row()
row.sepalLen = 7.416  # sepal_len
row.sepalWid = 3.562  # sepal_wid
row.petalLen = 1.049  # petal_len
row.petalWid = 2.388  # petal_wid
scores = client.score(row)
transport.close()

您可以使用其他语言(如 Java)得到完全相同的结果:

thrift --gen java scoring.thrift

// Dependencies:
// commons-codec-1.9.jar
// commons-logging-1.2.jar
// httpclient-4.4.1.jar
// httpcore-4.4.1.jar
// libthrift-0.10.0.jar
// slf4j-api-1.7.12.jar

import ai.h2o.scoring.Row;
import ai.h2o.scoring.ScoringService;
import org.apache.thrift.TException;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.transport.TSocket;
import org.apache.thrift.transport.TTransport;
import java.util.List;

public class Main {
  public static void main(String[] args) {
    try {
      TTransport transport = new TSocket("localhost", 9090);
      transport.open();

      ScoringService.Client client = new ScoringService.Client(
        new TBinaryProtocol(transport));

      Row row = new Row(7.642, 3.436, 6.721, 1.020);
      List<Double> scores = client.score(row);
      System.out.println(scores);

      transport.close();
    } catch (TException ex) {
      ex.printStackTrace();
    }
  }
}

评分服务 – HTTP 模式 (JSON-RPC 2.0)

HTTP 模式让您能通过利用纯文本 JSON-RPC 调用来使用评分服务。与 Thrift 相比,此方法的性能通常更低,但是有一个优势,即可使用您选择的语言通过任何 HTTP 客户端库使用该评分服务,并不依赖 Thrift。

有关 JSON-RPC 的文档资料,请访问 http://www.jsonrpc.org/specification

在 HTTP 模式下启动评分服务:

# See 'run_http_server.sh' for complete example.
export DRIVERLESS_AI_LICENSE_FILE="/path/to/license.sig"
python http_server.py --port=9090

若要调用评分方法,可编辑 JSON-RPC 消息,并按如下方法向 http://host:port/rpc 发送 HTTP POST 请求:

# See 'run_http_client.sh' for complete example.
curl http://localhost:9090/rpc \
  --header "Content-Type: application/json" \
  --data @- <<EOF
 {
  "id": 1,
  "method": "score",
  "params": {
    "row": [ 7.486, 3.277, 4.755, 2.354 ]
  }
 }
EOF

类似地,您也可以使用任何 HTTP 客户端库重现以上结果。例如,通过 Python,您可以使用如下请求模块:

import requests
row = [7.486, 3.277, 4.755, 2.354]
req = dict(id=1, method='score', params=dict(row=row))
res = requests.post('http://localhost:9090/rpc', data=req)
print(res.json()['result'])

常见问题解答

没有使用 tar 时,我在 Red Hat/CentOS 上遇到 GCC 编译错误 SCORING_PIPELINE_INSTALL_DEPENDENCIES = 0. 我该如何解决此问题?

要解决此问题,运行以下命令:

sudo yum -y install gcc

在我运行 Python 评分管道时,为什么会收到 “TensorFlow is disabled” 消息?

如果在启用 TensorFlow 时运行实验,之后又尝试运行 Python 评分管道,您可能会收到与以下消息类似的消息:

TensorFlow is disabled. To enable, export DRIVERLESS_AI_ENABLE_TENSORFLOW=1 or set enable_tensorflow=true in config.toml.

若要成功运行 Python 评分管道,您必须启用 DRIVERLESS_AI_ENABLE_TENSORFLOW 标志。例如:

export DRIVERLESS_AI_LICENSE_FILE="/path/to/license.sig"
DRIVERLESS_AI_ENABLE_TENSORFLOW=1 bash run_example.sh

Python 环境故障排除

以下说明描述介绍了设置纯净版 Ubuntu 16.04 虚拟机以测试此评分管道是否正常工作。

先决条件

  1. 为 Vagrant 创建配置文件。

    • bootstrap.sh:包含用于设置 Python 3.8 和 OpenBLAS 的命令。

    • Vagrantfile:包含用于 Vagrant 和 VirtualBox 的虚拟机配置指令。

----- bootstrap.sh -----

#!/usr/bin/env bash

sudo apt-get -y update
sudo apt-get -y install apt-utils build-essential python-software-properties software-properties-common zip libopenblas-dev
sudo add-apt-repository -y ppa:deadsnakes/ppa
sudo apt-get update -yqq
sudo apt-get install -y python3.8 python3.8-dev python3-pip python3-dev python-virtualenv python3-virtualenv

# end of bootstrap.sh

----- Vagrantfile -----

# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure(2) do |config|
  config.vm.box = "ubuntu/xenial64"
  config.vm.provision :shell, path: "bootstrap.sh", privileged: false
  config.vm.hostname = "h2o"
  config.vm.provider "virtualbox" do |vb|
    vb.memory = "4096"
  end
end

# end of Vagrantfile
  1. 启动 VM 和 SSH。请注意,我们也将评分管道放置于同一目录中,以便以后可以在 VM 中访问它。

cp /path/to/scorer.zip .
vagrant up
vagrant ssh
  1. 测试虚拟机内的评分管道。

cp /vagrant/scorer.zip .
unzip scorer.zip
cd scoring-pipeline/
export DRIVERLESS_AI_LICENSE_FILE="/path/to/license.sig"
bash run_example.sh

此时,您应能看到终端上打印出的评分。如果没有看到这些评分,请通过 support@h2o.ai 联系我们。