Driverless AI MLI 独立 Python 评分包

在此包中,包含了导出的模型和 Python 3.8 源代码示例(展示在生产环境中执行利用 H2O Driverless AI 机器学习可解释性 (MLI) 工具构建的模型)。此包只可用于已解释的模型,可在“已解释模型”页面上点击 评分管道 按钮下载此包。

此包中的文件让您能以多种不同的方法获得与特定行的数据相关的原因码:

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

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

MLI Python 评分包文件

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

  • example.py:演示如何导入和解释新记录的 Python 脚本示例。

  • run_example.sh:运行 example.py(这也将通过相关库(先决条件)安装 virtualenv。)

  • run_example_shapley.sh:运行 example_shapley.py。这将比较 K-LIME 原因码与 Driverless AI Shapley 原因码。

  • tcp_server.py:用于存储 MLI 服务的独立 TCP 服务器。

  • http_server.py:用于存储 MLI 服务的独立 HTTP 服务器。

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

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

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

  • example_shapley.py:演示如何比较 K-LIME 原因码与 Driverless AI Shapley 原因码的 Python 脚本示例。

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

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

快速入门

有两种用于启动 MLI 独立评分管道的方法。

快速入门 – 替代方法

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

先决条件

  • 有效的 Driverless AI 许可证。

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

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

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

以下是为满足上述先决条件而需进行的安装示例:

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

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

在 Ubuntu 16.04 上安装 Python 3.8

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

安装 Conda 3.6

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

安装 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 zhihou 刷新共享的运行时。

sudo ldconfig /usr/local/lib

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

  1. 在“MLI”页面上,点击 评分管道 按钮。

Scoring Pipeline - MLI
  1. 解压评分管道文件,并运行 scoring-pipeline-mli 文件夹中的以下示例。

运行评分管道示例。(要求有 Linux 和 Python 3.8。)

bash run_example.sh

运行 TCP 评分服务器示例。使用两个终端窗口。(要求有 Linux、Python 3.8 和 Thrift。)

bash run_tcp_server.sh
bash run_tcp_client.sh

运行 HTTP 评分服务器示例。使用两个终端窗口。(需要 Linux、Python 3.8 和 Thrift。)

bash run_http_server.sh
bash run_http_client.sh

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

# to use conda package manager
bash run_example.sh --pm conda

# to use pip package manager
bash run_example.sh --pm pip

MLI Python 评分模块

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

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

评分器实例提供了以下方法:

  • Score_reason_codes(list): 为某一行(数值列表)获取 K-LIME 原因码。

  • score_reason_codes_batch(dataframe): 接受和输出 Pandas 数据帧。

  • get_column_names(): 获取输入列名称。

  • get_reason_code_column_names(): 获取输出列名称。

导入和使用评分模块的流程通过 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
python example.py

K-LIME 和 Shapley 原因码

K-LIME 模型评分有时与 Driverless AI 模型评分并不接近。在这种情况下,更好的办法可能是利用 Shapley 方法对 Driverless AI 模型使用原因码。注意,来自 Shapley 的原因码将在转换特征空间中。

若要在同一 Python 会话中查看 K-LIME 和 Driverless AI Shapley 原因码使用示例,可运行:

bash run_example_shapley.sh

为了确保此批处理脚本成功运行,必须在 Driverless AI 模型上运行 MLI。如果您已经在独立(外部模型)模式下运行了 MLI,将不会有 Driverless AI 评分管道。

如果使用转换特征运行 MLI,将不会导出 Shapley 示例脚本。您可以直接通过 Driverless AI 模型评分管道生成原因码。

MLI 评分服务概述

MLI 评分服务将评分模块作为 HTTP 或 TCP 服务托管。这样做能通过远程过程调用 (RPC) 公开评分模块的所有函数。

实际上,此机制让您能在相同计算机上通过非 Python 语言调用评分函数,或从共享网络或互联网上的其他计算机调用。

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

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

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

可利用 score 或在批处理模式(一次多行)下使用 score_batch 对各行(逐行)执行评分操作。这两个函数让您能指定 pred_contribs=[True|False],以获得新数据集的 MLI 预测结果 (KLime/Shapley)。更多信息,请参见 example_shapley.py 文件。

MLI 评分服务 – 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_reason_codes(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_reason_codes(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. -----
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_reason_codes",
  "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_reason_codes', params=dict(row=row))
res = requests.post('http://localhost:9090/rpc', data=req)
print(res.json()['result'])