Membuat prediksi dengan model scikit-learn dalam format ONNX

Ringkasan

Open Neural Network Exchange (ONNX) menyediakan format seragam yang dirancang untuk merepresentasikan framework machine learning mana pun. Dengan dukungan ML BigQuery untuk ONNX, Anda dapat:

  • Melatih model menggunakan framework favorit Anda.
  • Mengonversi model ke format model ONNX. Untuk informasi selengkapnya, lihat Mengonversi ke format ONNX.
  • Impor model ONNX ke BigQuery dan buat prediksi menggunakan BigQuery ML.

Tutorial ini menunjukkan cara mengimpor model ONNX yang dilatih dengan scikit-learn ke dalam set data BigQuery dan menggunakannya untuk membuat prediksi dari kueri SQL. Anda dapat mengimpor model ONNX menggunakan antarmuka ini:

Untuk mengetahui informasi selengkapnya tentang cara mengimpor model ONNX ke BigQuery, termasuk persyaratan format dan penyimpanan, lihat Pernyataan CREATE MODEL untuk mengimpor model ONNX.

Tujuan

Dalam tutorial ini, Anda akan:

  • Membuat dan latih model dengan scikit-learn.
  • Mengonversi model ke format ONNX menggunakan sklearn-onnx.
  • Mengimpor model ONNX ke BigQuery dan membuat prediksi.

Melatih model klasifikasi dengan scikit-learn

Buat dan latih pipeline scikit-learn di set data Iris:

import numpy
from sklearn.datasets import load_iris
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.ensemble import RandomForestClassifier

data = load_iris()
X = data.data[:, :4]
y = data.target

ind = numpy.arange(X.shape[0])
numpy.random.shuffle(ind)
X = X[ind, :].copy()
y = y[ind].copy()

pipe = Pipeline([('scaler', StandardScaler()),
                ('clr', RandomForestClassifier())])
pipe.fit(X, y)

Mengonversi model ke format ONNX dan menyimpan

Gunakan sklearn-onnx untuk mengonversi pipeline scikit-learn menjadi model ONNX bernama pipeline_rf.onnx:

from skl2onnx import convert_sklearn
from skl2onnx.common.data_types import FloatTensorType

# Disable zipmap as it is not supported in BigQuery ML.
options = {id(pipe): {'zipmap': False}}

# Define input features. scikit-learn does not store information about the
# training dataset. It is not always possible to retrieve the number of features
# or their types. That's why the function needs another argument called initial_types.
initial_types = [
   ('sepal_length', FloatTensorType([None, 1])),
   ('sepal_width', FloatTensorType([None, 1])),
   ('petal_length', FloatTensorType([None, 1])),
   ('petal_width', FloatTensorType([None, 1])),
]

# Convert the model.
model_onnx = convert_sklearn(
   pipe, 'pipeline_rf', initial_types=initial_types, options=options
)

# And save.
with open('pipeline_rf.onnx', 'wb') as f:
 f.write(model_onnx.SerializeToString())

Mengupload model ONNX ke Cloud Storage

Buat bucket Cloud Storage untuk menyimpan file model ONNX, lalu upload file model ONNX yang tersimpan ke bucket Cloud Storage Anda. Untuk informasi selengkapnya, lihat Mengupload objek dari sistem file.

Mengimpor model ONNX ke BigQuery

Langkah ini mengasumsikan bahwa Anda telah mengupload model ONNX ke bucket Cloud Storage. Contoh model disimpan di gs://cloud-samples-data/bigquery/ml/onnx/pipeline_rf.onnx.

Konsol

  1. Di konsol Google Cloud, buka halaman BigQuery.

    Buka halaman BigQuery

  2. Di editor kueri, masukkan pernyataan CREATE MODEL seperti berikut.

     CREATE OR REPLACE MODEL `mydataset.mymodel`
      OPTIONS (MODEL_TYPE='ONNX',
       MODEL_PATH='gs://bucket/path/to/onnx_model/*')

    Contoh:

     CREATE OR REPLACE MODEL `example_dataset.imported_onnx_model`
      OPTIONS (MODEL_TYPE='ONNX',
       MODEL_PATH='gs://cloud-samples-data/bigquery/ml/onnx/pipeline_rf.onnx')

    Kueri sebelumnya mengimpor model ONNX yang terletak di gs://cloud-samples-data/bigquery/ml/onnx/pipeline_rf.onnx sebagai model BigQuery bernama imported_onnx_model.

  3. Model baru Anda kini akan muncul di panel Resource. Seiring Anda memperluas setiap set data di sebuah project, model akan dicantumkan bersama dengan resource BigQuery lainnya di set data tersebut. Model ditunjukkan dengan ikon model: ikon model .

  4. Jika Anda memilih model baru di panel Resources, informasi tentang model akan muncul di bawah Query editor.

    info model onnx

bq

Untuk mengimpor model ONNX dari Cloud Storage, jalankan kueri batch dengan memasukkan perintah seperti berikut:

bq query \
--use_legacy_sql=false \
"CREATE MODEL
  `mydataset.mymodel`
OPTIONS
  (MODEL_TYPE='ONNX',
   MODEL_PATH='gs://bucket/path/to/onnx_model/*')"

Contoh:

bq query --use_legacy_sql=false \
"CREATE OR REPLACE MODEL
  `example_dataset.imported_onnx_model`
OPTIONS
  (MODEL_TYPE='ONNX',
   MODEL_PATH='gs://cloud-samples-data/bigquery/ml/onnx/pipeline_rf.onnx')"

Setelah diimpor, model akan muncul dalam output bq ls [dataset_name]:

$ bq ls example_dataset

       tableId          Type    Labels   Time Partitioning
 --------------------- ------- -------- -------------------
  imported_onnx_model   MODEL

API

Masukkan tugas baru dan isi properti jobs#configuration.query sesuai isi permintaan berikut:

{
  "query": "CREATE MODEL project_id:mydataset.mymodel OPTIONS(MODEL_TYPE='ONNX' MODEL_PATH='gs://bucket/path/to/onnx_model/*')"
}

Membuat prediksi dengan model ONNX yang diimpor

Konsol

  1. Di konsol Google Cloud, buka halaman BigQuery.

    Buka halaman BigQuery

  2. Di editor kueri, masukkan kueri menggunakan ML.PREDICT seperti berikut.

     SELECT *
       FROM ML.PREDICT(MODEL example_dataset.imported_onnx_model,
         (
          SELECT * FROM bigquery-public-data.ml_datasets.iris
         )
     )
     

    Kueri sebelumnya menggunakan model bernama imported_onnx_model dalam set data example_dataset dalam project saat ini untuk membuat prediksi dari data input dalam tabel publik iris dari set data ml_datasets dalam project bigquery-public-data. Dalam hal ini, model ONNX mengharapkan empat input float: sepal_length, sepal_width, petal_length, petal_width yang cocok dengan initial_types yang ditentukan dalam langkah 2 , sehingga subkueri melakukan SELECT pada keseluruhan tabel bigquery-public-data yang berisi 4 kolom input ini.

    Model ini menghasilkan kolom label dan probabilities, serta kolom dari tabel input.

    • label merepresentasikan label class yang diprediksi.
    • probabilities adalah array probabilitas yang mewakili probabilitas untuk setiap class.

    Hasil kuerinya mirip dengan berikut ini:

    Hasil kueri

bq

Untuk membuat prediksi dari data input dalam tabel input_data, masukkan perintah seperti berikut, menggunakan model ONNX yang diimpor my_model:

bq query \
--use_legacy_sql=false \
'SELECT *
 FROM ML.PREDICT(
   MODEL `my_project.my_dataset.my_model`,
   (SELECT * FROM input_data))'

Contoh:

bq query \
--use_legacy_sql=false \
'SELECT *
FROM ML.PREDICT(
  MODEL `example_dataset.imported_onnx_model`,
  (SELECT * FROM `bigquery-public-data.ml_datasets.iris`))'

API

Masukkan tugas baru dan isi properti jobs#configuration.query sesuai isi permintaan berikut:

{
  "query": "SELECT * FROM ML.PREDICT(MODEL `my_project.my_dataset.my_model`, (SELECT * FROM input_data))"
}

Langkah selanjutnya