Driverless AI 독립형 Python Scoring Pipeline

실험을 성공적으로 완료한 후에 독립 실행형 스코어링 파이프라인을 사용할 수 있습니다. 이 패키지에는 H2O Driverless AI를 사용하여 구축한 모델의 생산화를 위해 내보낸 모델과 Python 3.8 소스 코드 예시가 포함되어 있습니다.

이 패키지의 파일을 사용해 다음과 같은 몇 가지 방법으로 새 데이터를 변형하고 채점할 수 있습니다.

  • Python 3.8부터는 스코어링 모듈을 가져오고 이를 사용하여 새로운 데이터를 변환하고 채점할 수 있습니다.

  • 다른 언어 및 플랫폼에서, 이 패키지에 포함된 TCP/HTTP 스코어링 서비스를 사용하여 RPC(원격 프로시저 호출)를 통해 스코어링 파이프라인 모듈을 호출할 수 있습니다.

시작하기 전

Python Scoring Pipeline에 대한 중요한 정보는 다음 참고 사항을 참조하십시오.

참고

Python 채점의 virtualenv 또는 pip 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

참고

Custom Recipes and the Python Scoring Pipeline

기본적으로,사용자 정의 레시피가 Driverless AI에 업로드되었고 그 후에 실험에 사용되지 않은 경우, Python Scoring Pipeline에는 여전히 H2O 레시피 서버가 포함되어 있습니다. 이 파이프라인이 이후 컨테이너에 배포되면, H2O 레시피 서버로 인해 파이프라인의 크기가 훨씬 커집니다. 또한 컨테이너에 Java를 설치해야 하는데, 이로 인해 런타임 스토리지 및 메모리 요구 사항이 더욱 증가합니다. 해결 방법은 Python Scoring Pipeline을 실행하기 전에 다음 환경 변수를 설정하는 것입니다.

export dai_enable_custom_recipes=0

CUDA, OpenCL, 및 cuDNN 설치 지침

Python 채점의 virtualenv 또는 pip 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 기반 시스템에 대한 OpenCL을 설치합니다.

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 파일

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 Scoring Pipeline을 시작하는 방법에는 두 가지가 있습니다.

빠른 시작 - 대안 방법

이 섹션에서는 Python Scoring Pipeline를 실행하는 대안적인 방법을 설명합니다. 이 버전을 사용하려면 인터넷 액세스가 필요합니다.

전제 조건

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

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

  • 유효한 Driverless AI 라이선스. Driverless AI에서 Python Scoring Pipeline을 실행하려면 라이선스를 지정해야 합니다.

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

  • Linux 환경

  • Python 3.8

  • libopenblas-dev(H2O4GPU에 필요함)

  • OpenCL

이 필수 구성 요소를 설치 방법에 대한 정보는 다음 예시를 참조하십시오.

Ubuntu 16.10 이상에 Python 3.8 및 OpenBLAS on 설치하기:

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

License Specification

Driverless AI에서 Python Scoring Pipeline을 실행하려면 라이선스를 지정해야 합니다. 라이선스는 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 를 사용하는 것도 유사합니다.

Installing the Thrift Compiler

Thrift는 TCP 모드에서 스코어링 서비스를 실행하기 위해 필요하지만 스코어링 모듈 실행에는 필요 없습니다. 다음 단계는 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 Scoring Pipeline 실행하기 - 대안 방법

  1. 완료된 Experiment 페이지에서 Download Python Scoring Pipeline 버튼을 클릭하여 이 실험의 scorer.zip 파일을 로컬 컴퓨터에 다운로드합니다.

Download Python Scoring Pipeline button
  1. 스코어링 파이프라인을 추출합니다.

파이프라인을 다운로드하고 추출한 후 스코어링 모듈 및 스코어링 서비스를 실행할 수 있습니다.

Score from a Python Program

Python 프로그램에서 채점하려면 스코어링 모듈 예시를 실행합니다(Linux 및 Python 3.8이 필요함).

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

Score Using a Web Service

웹 서비스를 사용해 채점하려면 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

Score Using a Thrift Service

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

Note: 위에 설명한 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이 올바르게 설치 및 구성되어 있는지 확인하십시오. 클린룸 Ubuntu 16.04 가상 머신을 사용하여 스코어링 모듈을 설정하고 테스트하는 방법을 보려면 이어지는 Troubleshooting Python Environment Issues 섹션을 참조하십시오.

Python 스코어링 모듈

스코어링 모듈은 독립형 휠 파일(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 dataframe 채점하기

  • fit_transform_batch(df): Pandas dataframe 변환하기

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

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

자주 하는 질문

SCORING_PIPELINE_INSTALL_DEPENDENCIES = 0tar을 사용하지 않을 때 Red Hat/CentOS에서 GCC 컴파일 에러가 발생합니다 . 어떻게 해결하나요?

이 문제를 해결하려면 다음 명령을 실행하십시오.

sudo yum -y install gcc

Python Scoring Pipeline 실행 중 왜 《TensorFlow is disabled》 메시지가 나타납니까?

TensorFlow가 활성화된 상태에서 실험을 실행한 다음 Python Scoring Pipeline을 실행하려고 하면 다음과 비슷한 메시지가 나타날 수 있습니다.

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

Python Scoring Pipeline을 성공적으로 실행하려면, 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 가상 머신을 설정하는 방법을 설명합니다.

Prerequisites

  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 로 문의하시기 바랍니다.