Membuat rutinitas prediksi kustom dengan scikit-learn

Logo Colab Jalankan tutorial ini sebagai notebook di Colab Logo GitHub Lihat notebook di GitHub

Ringkasan

Tutorial ini menunjukkan cara men-deploy model scikit-learn terlatih ke AI Platform Prediction dan menayangkan prediksi menggunakan rutinitas prediksi kustom. Dengan demikian, Anda dapat menyesuaikan cara AI Platform Prediction merespons setiap permintaan prediksi.

Dalam contoh ini, Anda akan menggunakan rutinitas prediksi kustom untuk memproses input prediksi dengan menskalakannya, dan memproses output prediksi secara pasca-pemrosesan dengan mengonversi angka class menjadi string label.

Tutorial ini membahas beberapa langkah:

  • Melatih model scikit-learn sederhana secara lokal (di notebook ini)
  • Membuat dan men-deploy rutinitas prediksi kustom ke AI Platform Prediction
  • Menayangkan permintaan prediksi dari deployment tersebut

Set data

Tutorial ini menggunakan set data Iris R.A. Fisher, set data kecil yang populer untuk mencoba teknik machine learning. Setiap instance memiliki empat fitur numerik, yang merupakan pengukuran bunga yang berbeda, dan label target yang menandainya sebagai salah satu dari tiga jenis iris: Iris setosa, Iris versicolour, atau Iris virginica.

Tutorial ini menggunakan salinan set data Iris yang disertakan dalam library scikit-learn.

Tujuan

Tujuannya adalah melatih model yang menggunakan pengukuran bunga sebagai input untuk memprediksi jenis iris.

Tutorial ini lebih berfokus pada penggunaan model ini dengan AI Platform Prediction daripada desain model itu sendiri.

Biaya

Tutorial ini menggunakan komponen Google Cloud yang dapat ditagih:

  • AI Platform Prediction
  • Cloud Storage

Pelajari harga AI Platform Prediction dan harga Cloud Storage, serta gunakan Kalkulator Harga untuk membuat perkiraan biaya berdasarkan penggunaan yang Anda perkirakan.

Sebelum memulai

Anda harus melakukan beberapa hal sebelum dapat melatih dan men-deploy model di AI Platform Prediction:

  • Siapkan lingkungan pengembangan lokal Anda.
  • Siapkan project Google Cloud dengan penagihan dan API yang diperlukan diaktifkan.
  • Buat bucket Cloud Storage untuk menyimpan paket pelatihan dan model terlatih Anda.

Menyiapkan lingkungan pengembangan lokal Anda

Anda memerlukan hal berikut untuk menyelesaikan tutorial ini:

  • Python 3
  • virtualenv
  • Google Cloud SDK

Panduan Google Cloud untuk Menyiapkan lingkungan pengembangan Python memberikan petunjuk mendetail untuk memenuhi persyaratan ini. Langkah-langkah berikut memberikan kumpulan petunjuk ringkas:

  1. Instal Python 3.

  2. Instal virtualenv dan buat lingkungan virtual yang menggunakan Python 3.

  3. Aktifkan lingkungan tersebut.

  4. Selesaikan langkah-langkah di bagian berikut untuk menginstal Google Cloud SDK.

Menyiapkan project Google Cloud

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the AI Platform Training & Prediction and Compute Engine APIs.

    Enable the APIs

  5. Install the Google Cloud CLI.
  6. To initialize the gcloud CLI, run the following command:

    gcloud init
  7. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  8. Make sure that billing is enabled for your Google Cloud project.

  9. Enable the AI Platform Training & Prediction and Compute Engine APIs.

    Enable the APIs

  10. Install the Google Cloud CLI.
  11. To initialize the gcloud CLI, run the following command:

    gcloud init

Mengautentikasi akun GCP Anda

Untuk menyiapkan autentikasi, Anda perlu membuat kunci akun layanan dan menetapkan variabel lingkungan untuk jalur file ke kunci akun layanan.

  1. Buat akun layanan:

    1. Di konsol Google Cloud, buka halaman Buat akun layanan.

      Buka Buat akun layanan

    2. Di kolom Nama akun layanan, masukkan nama.
    3. Opsional: Di kolom Deskripsi akun layanan, masukkan deskripsi.
    4. Klik Buat.
    5. Klik kolom Pilih peran. Di bagian Semua peran, pilih AI Platform > AI Platform Admin.
    6. Klik Add another role.
    7. Klik kolom Pilih peran. Di bagian Semua peran, pilih Storage > Storage Object Admin.

    8. Klik Selesai untuk membuat akun layanan.

      Jangan tutup jendela browser Anda. Anda akan menggunakannya pada langkah berikutnya.

  2. Membuat kunci akun layanan untuk autentikasi:

    1. Di konsol Google Cloud, klik alamat email untuk akun layanan yang telah dibuat.
    2. Klik Kunci.
    3. Klik Tambahkan kunci, lalu Buat kunci baru.
    4. Klik Buat. File kunci JSON akan didownload ke komputer Anda.
    5. Klik Close.
  3. Tetapkan variabel lingkungan GOOGLE_APPLICATION_CREDENTIALS ke jalur file JSON yang berisi kunci akun layanan Anda. Variabel ini hanya berlaku untuk sesi shell Anda saat ini. Jadi, jika Anda membuka sesi baru, tetapkan variabel kembali.

Membuat bucket Cloud Storage

Untuk men-deploy rutinitas prediksi kustom, Anda harus mengupload artefak model yang dilatih dan kode kustom ke Cloud Storage.

Tetapkan nama bucket Cloud Storage Anda sebagai variabel lingkungan. Nama harus unik di semua bucket Cloud Storage:

BUCKET_NAME="your-bucket-name"

Pilih region tempat AI Platform Prediction tersedia dan buat variabel lingkungan lainnya.

REGION="us-central1"

Buat bucket Cloud Storage di region ini, lalu gunakan region yang sama untuk pelatihan dan prediksi. Jalankan perintah berikut untuk membuat bucket jika belum ada:

gcloud storage buckets create gs://$BUCKET_NAME --location=$REGION

Mem-build dan melatih model scikit-learn

Sering kali, Anda tidak dapat menggunakan data dalam bentuk mentah untuk melatih model machine learning. Meskipun Anda dapat melakukannya, prapemrosesan data sebelum menggunakannya untuk pelatihan terkadang dapat meningkatkan model Anda.

Dengan asumsi bahwa Anda mengharapkan input untuk prediksi memiliki format yang sama dengan data pelatihan, Anda harus menerapkan pra-pemrosesan yang identik selama pelatihan dan prediksi untuk memastikan model Anda membuat prediksi yang konsisten.

Di bagian ini, buat modul pra-pemrosesan dan gunakan sebagai bagian dari pelatihan. Kemudian, ekspor preprocessor dengan karakteristik yang dipelajari selama pelatihan untuk digunakan nanti dalam rutinitas prediksi kustom Anda.

Menginstal dependensi untuk pelatihan lokal

Pelatihan secara lokal memerlukan beberapa dependensi:

pip install numpy>=1.16.0 scikit-learn==0.20.2

Menulis preprocessor

Menskalakan data pelatihan sehingga setiap kolom fitur numerik memiliki nilai rata-rata 0 dan deviasi standar 1 dapat meningkatkan kualitas model Anda.

Buat preprocess.py, yang berisi class untuk melakukan penskalaan ini:

import numpy as np

class MySimpleScaler(object):
  def __init__(self):
    self._means = None
    self._stds = None

  def preprocess(self, data):
    if self._means is None: # during training only
      self._means = np.mean(data, axis=0)

    if self._stds is None: # during training only
      self._stds = np.std(data, axis=0)
      if not self._stds.all():
        raise ValueError('At least one column has standard deviation of 0.')

    return (data - self._means) / self._stds

Perhatikan bahwa instance MySimpleScaler menyimpan mean dan deviasi standar setiap kolom fitur pada penggunaan pertama. Kemudian, statistik ringkasan ini digunakan untuk menskalakan data yang ditemukan setelahnya.

Dengan demikian, Anda dapat menyimpan karakteristik distribusi pelatihan dan menggunakannya untuk pra-pemrosesan yang identik pada waktu prediksi.

Melatih model Anda

Selanjutnya, gunakan preprocess.MySimpleScaler untuk memproses data iris, lalu latih model menggunakan scikit-learn.

Pada akhirnya, ekspor model yang dilatih sebagai file joblib (.joblib) dan ekspor instance MySimpleScaler sebagai file pickle (.pkl):

import pickle

from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestClassifier
from sklearn.externals import joblib

from preprocess import MySimpleScaler

iris = load_iris()
scaler = MySimpleScaler()
X = scaler.preprocess(iris.data)
y = iris.target

model = RandomForestClassifier()
model.fit(X, y)

joblib.dump(model, 'model.joblib')
with open ('preprocessor.pkl', 'wb') as f:
  pickle.dump(scaler, f)

Men-deploy rutinitas prediksi kustom

Untuk men-deploy rutinitas prediksi kustom guna menayangkan prediksi dari model terlatih, lakukan hal berikut:

  • Membuat prediktor kustom untuk menangani permintaan
  • Memaketkan prediktor dan modul prapemrosesan
  • Mengupload artefak model dan kode kustom Anda ke Cloud Storage
  • Men-deploy rutinitas prediksi kustom ke AI Platform Prediction

Membuat prediktor kustom

Untuk men-deploy rutinitas prediksi kustom, Anda harus membuat class yang mengimplementasikan antarmuka Predictor. Hal ini memberi tahu AI Platform Prediction cara memuat model Anda dan cara menangani permintaan prediksi.

Tulis kode berikut ke predictor.py:

import os
import pickle

import numpy as np
from sklearn.datasets import load_iris
from sklearn.externals import joblib

class MyPredictor(object):
  def __init__(self, model, preprocessor):
    self._model = model
    self._preprocessor = preprocessor
    self._class_names = load_iris().target_names

  def predict(self, instances, **kwargs):
    inputs = np.asarray(instances)
    preprocessed_inputs = self._preprocessor.preprocess(inputs)
    if kwargs.get('probabilities'):
      probabilities = self._model.predict_proba(preprocessed_inputs)
      return probabilities.tolist()
    else:
      outputs = self._model.predict(preprocessed_inputs)
      return [self._class_names[class_num] for class_num in outputs]

  @classmethod
  def from_path(cls, model_dir):
    model_path = os.path.join(model_dir, 'model.joblib')
    model = joblib.load(model_path)

    preprocessor_path = os.path.join(model_dir, 'preprocessor.pkl')
    with open(preprocessor_path, 'rb') as f:
      preprocessor = pickle.load(f)

    return cls(model, preprocessor)

Perhatikan bahwa, selain menggunakan preprocessor yang Anda tentukan selama pelatihan, prediktor ini melakukan langkah pascapemrosesan yang mengonversi output prediksi dari indeks class (0, 1, atau 2) menjadi string label (nama jenis bunga).

Namun, jika prediktor menerima argumen kata kunci probabilities dengan nilai True, prediktor akan menampilkan array probabilitas, yang menunjukkan probabilitas bahwa setiap dari tiga class adalah label yang benar (sesuai dengan model). Bagian terakhir tutorial ini menunjukkan cara memberikan argumen kata kunci selama prediksi.

Mengemas kode kustom

Anda harus memaketkan predictor.py dan preprocess.py sebagai paket distribusi sumber .tar.gz dan memberikan paket tersebut ke AI Platform Prediction agar dapat menggunakan kode kustom Anda untuk menayangkan prediksi.

Tulis setup.py berikut untuk menentukan paket Anda:

from setuptools import setup

setup(
    name='my_custom_code',
    version='0.1',
    scripts=['predictor.py', 'preprocess.py'])

Kemudian, jalankan perintah berikut untuk membuatdist/my_custom_code-0.1.tar.gz:

python setup.py sdist --formats=gztar

Mengupload artefak model dan kode kustom ke Cloud Storage

Sebelum Anda dapat men-deploy model untuk ditayangkan, AI Platform Prediction memerlukan akses ke file berikut di Cloud Storage:

  • model.joblib (artefak model)
  • preprocessor.pkl (artefak model)
  • my_custom_code-0.1.tar.gz (kode kustom)

Artefak model harus disimpan bersama dalam direktori model, yang dapat diakses oleh Predictor Anda sebagai argumen model_dir dalam metode class from_path-nya. Kode kustom tidak perlu berada di direktori yang sama. Jalankan perintah berikut untuk mengupload file Anda:

gcloud storage cp ./dist/my_custom_code-0.1.tar.gz gs://$BUCKET_NAME/custom_prediction_routine_tutorial/my_custom_code-0.1.tar.gz
gcloud storage cp model.joblib preprocessor.pkl gs://$BUCKET_NAME/custom_prediction_routine_tutorial/model/

Men-deploy rutinitas prediksi kustom

Buat resource model dan resource versi untuk men-deploy rutinitas prediksi kustom Anda. Pertama, tentukan variabel lingkungan dengan nama resource Anda:

MODEL_NAME='IrisPredictor'
VERSION_NAME='v1'

Kemudian, buat model Anda:

gcloud ai-platform models create $MODEL_NAME \
  --regions $REGION

Selanjutnya, buat versi. Pada langkah ini, berikan jalur ke artefak dan kode kustom yang Anda upload ke Cloud Storage:

gcloud components install beta

gcloud beta ai-platform versions create $VERSION_NAME \
  --model $MODEL_NAME \
  --runtime-version 1.13 \
  --python-version 3.5 \
  --origin gs://$BUCKET_NAME/custom_prediction_routine_tutorial/model/ \
  --package-uris gs://$BUCKET_NAME/custom_prediction_routine_tutorial/my_custom_code-0.1.tar.gz \
  --prediction-class predictor.MyPredictor

Pelajari lebih lanjut opsi yang harus Anda tentukan saat men-deploy rutinitas prediksi kustom.

Menayangkan prediksi online

Coba deployment Anda dengan mengirimkan permintaan prediksi online. Pertama, instal Library Klien Google API untuk Python:

pip install --upgrade google-api-python-client

Kemudian, kirim dua instance data iris ke versi yang di-deploy dengan menjalankan kode Python berikut:

import googleapiclient.discovery

instances = [
  [6.7, 3.1, 4.7, 1.5],
  [4.6, 3.1, 1.5, 0.2],
]

service = googleapiclient.discovery.build('ml', 'v1')
name = 'projects/{}/models/{}/versions/{}'.format(PROJECT_ID, MODEL_NAME, VERSION_NAME)

response = service.projects().predict(
    name=name,
    body={'instances': instances}
).execute()

if 'error' in response:
    raise RuntimeError(response['error'])
else:
  print(response['predictions'])
['versicolor', 'setosa']

Mengirim argumen kata kunci

Saat mengirim permintaan prediksi ke rutinitas prediksi kustom, Anda dapat memberikan kolom tambahan pada isi permintaan. Metode predict Prediktor menerimanya sebagai kolom kamus **kwargs.

Kode berikut mengirimkan permintaan yang sama seperti sebelumnya, tetapi kali ini menambahkan kolom probabilities ke isi permintaan:

response = service.projects().predict(
    name=name,
    body={'instances': instances, 'probabilities': True}
).execute()

if 'error' in response:
    raise RuntimeError(response['error'])
else:
  print(response['predictions'])
[[0.0, 1.0, 0.0], [1.0, 0.0, 0.0]]

Pembersihan

Untuk membersihkan semua resource GCP yang digunakan dalam project ini, Anda dapat menghapus project GCP yang digunakan untuk tutorial.

Atau, Anda dapat mengosongkan resource individual dengan menjalankan perintah berikut:

# Delete version resource
gcloud ai-platform versions delete $VERSION_NAME --quiet --model $MODEL_NAME

# Delete model resource
gcloud ai-platform models delete $MODEL_NAME --quiet

# Delete Cloud Storage objects that were created
gcloud storage rm gs://$BUCKET_NAME/custom_prediction_routine_tutorial --recursive

Langkah selanjutnya