Driverless AI MLI 독립형 Python 스코어링 패키지

이 패키지에는 H2O Driverless AI MLI(머신 러닝 해석 가능성) 도구를 사용하여 구축한 모델의 생산화를 위해 내보낸 모델과 Python 3.8 소스 코드 예시가 포함되어 있습니다. 이는 해석된 모델에서만 사용할 수 있으며, 해석 모형 페이지에서 Scoring Pipeline 버튼을 클릭하여 다운로드할 수 있습니다.

이 패키지의 파일을 사용하면 다음과 같은 몇 가지 방법으로 주어진 데이터 행에 대한 이유 코드를 얻을 수 있습니다.

  • 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를 통해 MLI 서비스와 통신하는 방법을 보여줍니다(curl 사용).

빠른 시작

MLI Standalone 스코어링 파이프라인을 시작하는 방법에는 두 가지가 있습니다.

빠른 시작 - 대안 방법

이 섹션에서는 MLI Standalone 스코어링 파이프라인를 실행하는 대안적인 방법을 설명합니다. 이 버전을 사용하려면 인터넷 액세스가 필요합니다

전제 조건

  • 유효한 Driverless AI 라이선스.

  • 스코어링 모듈 및 스코어링 서비스는 Python 3.8 및 OpenBLAS가 설치된 Linux에서만 지원됩니다.

  • 스코어링 모듈 및 스코어링 서비스는 설치 시 추가 패키지를 다운로드하므로 인터넷 액세스가 필요합니다. 네트워크 환경에 따라 프록시를 통해 인터넷 액세스를 설정해야 할 수 있습니다.

  • Apache Thrift(TCP 모드에서 스코어링 서비스를 실행하는 경우)

아래는 이러한 필수 구성 요소의 설치 예시입니다.

Installing Python 3.8 on Ubuntu 16.10 or Later:

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

Installing Python 3.8 on Ubuntu 16.04:

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

Installing Conda 3.6:

Anaconda 또는 Miniconda를 사용하여 Conda를 설치할 수 있습니다. 자세한 내용은 아래 링크를 참조하십시오.

Installing the Thrift Compiler

자세한 내용은 https://thrift.apache.org/docs/BuildingFromSource 의 Thrift 관련 문서를 참조하십시오.

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

MLI 스코어링 파이프라인 실행하기 - 대안 방법

  1. MLI 페이지에서 Scoring Pipeline 버튼을 클릭합니다.

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

Note: 위에 설명한 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 스코어링 모듈은 독립형 휠 파일 (name 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
])

scorer 인스턴스는 다음 메서드를 제공합니다.

  • score_reason_codes(list): 한 행에 대한 K-LIME 이유 코드 가져오기(값 목록).

  • score_reason_codes_batch(dataframe): Pandas Dataframe을 사용해 출력하기

  • 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 vs Shapley 이유 코드 비교

K-LIME 모델 점수와 Driverless AI 모델 점수가 크게 차이 나는 경우가 있습니다. 이 경우 Driverless AI 모델에서 Shapley 방법을 적용한 이유 코드를 사용하는 것이 더 나을 수 있습니다. Shapley의 이유 코드가 변형된 기능 영역에 있다는 것을 참고하십시오.

동일한 Python 세션에서 K-LIME 및 Driverless AI Shapley 이유 코드를 모두 사용한 예를 보려면 다음을 실행하십시오.

bash run_example_shapley.sh

이 배치 스크립트가 성공하려면 MLI를 Driverless AI 모델에서 실행해야 합니다. MLI를 독립형(외부 모델) 모드로 실행한 경우 Driverless AI scoring 파이프라인이 없습니다.

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 모드를 사용하면 C, C++, C#, Cocoa, D, Dart, Delphi, Go, Haxe, Java, Node.js, Lua, perl, PHP, Python, Ruby, Smalltalk를 포함하여 Thrift가 지원하는 모든 언어에서 스코어링 서비스를 사용할 수 있습니다.

TCP 모드에서 스코어링 서비스를 시작하려면, 일단 Thrift 바인딩을 생성한 다음 서버를 실행해야 합니다.

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

Thrift compiler는 빌드 시에만 필요합니다. 이는 런타임 종속성이 아닙니다. 즉 스코어링 서비스를 빌드하여 테스트하고 나면, 스코어링 서비스를 배치할 시스템에 이 설치 프로세스를 반복할 필요가 없습니다.

스코어링 서비스를 호출하려면, 선택한 언어에 대한 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보다 성능이 낮지만, Thrift에 대한 종속성 없이 선택한 언어로 모든 HTTP 클라이언트 라이브러리에서 사용할 수 있다는 장점이 있습니다.

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'])