Membuat prediksi dengan model PyTorch 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 PyTorch 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 melatih model dengan PyTorch.
  • Mengonversi model ke format ONNX menggunakan torch.onnx.
  • Mengimpor model ONNX ke BigQuery dan membuat prediksi.

Membuat model visi PyTorch untuk klasifikasi gambar

Impor resnet18 PyTorch terlatih yang menerima data gambar dari hasil dekode BigQuery ML ML.DECODE_IMAGE dan fungsi ML.RESIZE_IMAGE.

import torch
import torch.nn as nn

# Define model input format to match the output format of
# ML.DECODE_IMAGE function: [height, width, channels]
dummy_input = torch.randn(1, 224, 224, 3, device="cpu")

# Load a pretrained pytorch model for image classification
model = torch.hub.load('pytorch/vision:v0.10.0', 'resnet18', pretrained=True)

# Reshape input format from [batch_size, height, width, channels]
# to [batch_size, channels, height, width]
class ReshapeLayer(nn.Module):
    def __init__(self):
        super().__init__()

    def forward(self, x):
        x = x.permute(0, 3, 1, 2)  # reorder dimensions
        return x

class ArgMaxLayer(nn.Module):
    def __init__(self):
        super().__init__()

    def forward(self, x):
       return torch.argmax(x, dim=1)

final_model = nn.Sequential(
    ReshapeLayer(),
    model,
    nn.Softmax(),
    ArgMaxLayer()
)

Konversi model ke format ONNX dan simpan

Gunakan torch.onnx untuk mengekspor model visi PyTorch ke file ONNX bernama resnet18.onnx.

torch.onnx.export(final_model,            # model being run
                  dummy_input,            # model input
                  "resnet18.onnx",        # where to save the model
                  opset_version=10,       # the ONNX version to export the model to
                  input_names = ['input'],         # the model's input names
                  output_names = ['class_label'])  # the model's output names

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/resnet18.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/resnet18.onnx')
    

    Kueri sebelumnya mengimpor model ONNX yang terletak di gs://cloud-samples-data/bigquery/ml/onnx/resnet18.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/resnet18.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 tabel objek di BigQuery untuk mengakses data gambar

Untuk mengakses data tidak terstruktur di BigQuery, Anda perlu membuat tabel objek. Lihat Membuat tabel objek untuk petunjuk mendetail.

Buat tabel objek bernama goldfish_image_table pada gambar ikan mas yang tersimpan di gs://mybucket/goldfish.jpg.

CREATE EXTERNAL TABLE `example_dataset.goldfish_image_table`
WITH CONNECTION `us.my-connection`
OPTIONS(
  object_metadata = 'SIMPLE',
  uris = ['gs://mybucket/goldfish.jpg'],
  max_staleness = INTERVAL 1 DAY,
  metadata_cache_mode = 'AUTOMATIC');

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
       class_label
     FROM
       ML.PREDICT(MODEL example_dataset.imported_onnx_model,
         (
         SELECT
           ML.RESIZE_IMAGE(ML.DECODE_IMAGE(DATA),
             224,
             224,
             FALSE) AS input
         FROM
           example_dataset.goldfish_image_table) )
     

    Kueri sebelumnya menggunakan model bernama imported_onnx_model dalam set data example_dataset di project saat ini untuk membuat prediksi dari data gambar di tabel objek input goldfish_image_table. Fungsi ML.DECODE_IMAGE diperlukan untuk mendekode data gambar agar dapat diinterpretasikan oleh ML.PREDICT. Selain itu, fungsi ML.RESIZE_IMAGE digunakan untuk mengubah ukuran gambar agar sesuai dengan ukuran input model (224*224). Untuk informasi selengkapnya tentang menjalankan inferensi pada tabel objek gambar, lihat Menjalankan inferensi pada tabel objek gambar.

    Kueri ini menghasilkan label class yang diprediksi dari gambar input berdasarkan kamus label ImageNet.

    Hasil kueri

bq

Untuk membuat prediksi dari data input di 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))'

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