Membuat dan menelusuri embedding multimodal

Tutorial ini menunjukkan cara membuat embedding multimodal untuk gambar dan teks menggunakan BigQuery dan Vertex AI, lalu menggunakan embedding ini untuk melakukan penelusuran semantik teks ke gambar.

Tutorial ini membahas tugas-tugas berikut:

Tutorial ini menggunakan gambar seni domain publik dari The Metropolitan Museum of Art yang tersedia di bucket Cloud Storage gcs-public-data--met publik.

Peran yang diperlukan

Untuk menjalankan tutorial ini, Anda memerlukan peran Identity and Access Management (IAM) berikut:

  • Membuat dan menggunakan set data, koneksi, model, dan notebook BigQuery: Admin BigQuery Studio (roles/bigquery.studioAdmin).
  • Memberikan izin ke akun layanan koneksi: Project IAM Admin (roles/resourcemanager.projectIamAdmin).

Peran yang telah ditetapkan ini berisi izin yang diperlukan untuk melakukan tugas dalam dokumen ini. Untuk melihat izin yang benar-benar diperlukan, luaskan bagian Izin yang diperlukan:

Izin yang diperlukan

  • Buat set data: bigquery.datasets.create
  • Membuat, mendelegasikan, dan menggunakan koneksi: bigquery.connections.*
  • Menetapkan koneksi default: bigquery.config.*
  • Tetapkan izin akun layanan: resourcemanager.projects.getIamPolicy dan resourcemanager.projects.setIamPolicy
  • Buat tabel objek: bigquery.tables.create dan bigquery.tables.update
  • Buat model dan jalankan inferensi:
    • bigquery.jobs.create
    • bigquery.models.create
    • bigquery.models.getData
    • bigquery.models.updateData
    • bigquery.models.updateMetadata
  • Membuat dan menggunakan notebook:
    • resourcemanager.projects.get
    • resourcemanager.projects.list
    • bigquery.config.get
    • bigquery.jobs.create
    • bigquery.readsessions.create
    • bigquery.readsessions.getData
    • bigquery.readsessions.update
    • dataform.locations.get
    • dataform.locations.list
    • dataform.repositories.create

      .
    • dataform.repositories.list
    • dataform.collections.create
    • dataform.collections.list
    • aiplatform.notebookRuntimeTemplates.apply
    • aiplatform.notebookRuntimeTemplates.get
    • aiplatform.notebookRuntimeTemplates.list
    • aiplatform.notebookRuntimeTemplates.getIamPolicy
    • aiplatform.notebookRuntimes.assign
    • aiplatform.notebookRuntimes.get
    • aiplatform.notebookRuntimes.list
    • aiplatform.operations.list
    • aiplatform.notebookRuntimeTemplates.apply

Anda mungkin juga bisa mendapatkan izin ini dengan peran khusus atau peran bawaan lainnya.

Biaya

Dalam dokumen ini, Anda akan menggunakan komponen Trusted Cloud by S3NSyang dapat ditagih berikut:

  • BigQuery ML: You incur costs for the data that you process in BigQuery.
  • Vertex AI: You incur costs for calls to the Vertex AI service that's represented by the remote model.

Untuk membuat perkiraan biaya berdasarkan proyeksi penggunaan Anda, gunakan kalkulator harga.

Pengguna Trusted Cloud baru mungkin memenuhi syarat untuk mendapatkan uji coba gratis.

Untuk mengetahui informasi selengkapnya tentang harga BigQuery, lihat harga BigQuery dalam dokumentasi BigQuery.

Untuk mengetahui informasi selengkapnya tentang harga Vertex AI, lihat halaman harga Vertex AI.

Sebelum memulai

  1. In the Trusted Cloud console, on the project selector page, select or create a Trusted Cloud project.

    Go to project selector

  2. Verify that billing is enabled for your Trusted Cloud project.

  3. Enable the BigQuery, BigQuery Connection, and Vertex AI APIs.

    Enable the APIs

Membuat set data

Buat set data BigQuery untuk menyimpan model ML Anda.

Konsol

  1. Di Trusted Cloud konsol, buka halaman BigQuery.

    Buka halaman BigQuery

  2. Di panel Explorer, klik nama project Anda.

  3. Klik View actions > Create dataset.

    Opsi menu Create dataset.

  4. Di halaman Create dataset, lakukan hal berikut:

    • Untuk Dataset ID, masukkan bqml_tutorial.

    • Untuk Location type, pilih Multi-region, lalu pilih US (multiple regions in United States).

    • Jangan ubah setelan default yang tersisa, lalu klik Create dataset.

bq

Untuk membuat set data baru, gunakan perintah bq mk dengan flag --location. Untuk daftar lengkap kemungkinan parameter, lihat referensi perintah bq mk --dataset.

  1. Buat set data bernama bqml_tutorial dengan lokasi data yang ditetapkan ke US dan deskripsi BigQuery ML tutorial dataset:

    bq --location=US mk -d \
     --description "BigQuery ML tutorial dataset." \
     bqml_tutorial

    Perintah ini menggunakan pintasan -d, bukan flag --dataset. Jika Anda menghapus -d dan --dataset, perintah defaultnya adalah membuat set data.

  2. Pastikan set data telah dibuat:

    bq ls

API

Panggil metode datasets.insert dengan resource set data yang ditentukan.

{
  "datasetReference": {
     "datasetId": "bqml_tutorial"
  }
}

DataFrame BigQuery

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan BigQuery DataFrames di Panduan memulai BigQuery menggunakan BigQuery DataFrames. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi BigQuery DataFrames.

Untuk melakukan autentikasi ke BigQuery, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan ADC untuk lingkungan pengembangan lokal.

import google.cloud.bigquery

bqclient = google.cloud.bigquery.Client()
bqclient.create_dataset("bqml_tutorial", exists_ok=True)

Membuat tabel objek

Buat tabel objek di atas gambar seni dalam bucket Cloud Storage gcs-public-data--met publik. Tabel objek memungkinkan Anda menganalisis gambar tanpa memindahkannya dari Cloud Storage.

  1. Di Trusted Cloud konsol, buka halaman BigQuery.

    Buka BigQuery

  2. Di editor kueri, jalankan kueri berikut:

    CREATE OR REPLACE EXTERNAL TABLE `bqml_tutorial.met_images`
    WITH CONNECTION DEFAULT
    OPTIONS
      ( object_metadata = 'SIMPLE',
        uris = ['gs://gcs-public-data--met/*']
      );

Mempelajari data gambar

Buat notebook Colab Enterprise di BigQuery untuk menjelajahi data gambar.

  1. Di Trusted Cloud konsol, buka halaman BigQuery.

    Buka BigQuery

  2. Buat notebook menggunakan editor BigQuery.

  3. Hubungkan notebook ke runtime default.

  4. Siapkan notebook:

    1. Tambahkan sel kode ke notebook.
    2. Salin dan tempel kode berikut ke dalam sel kode:

      #@title Set up credentials
      
      from google.colab import auth
      auth.authenticate_user()
      print('Authenticated')
      
      PROJECT_ID='PROJECT_ID'
      from google.cloud import bigquery
      client = bigquery.Client(PROJECT_ID)
      

      Ganti PROJECT_ID dengan nama project yang Anda gunakan untuk tutorial ini.

    3. Jalankan sel kode.

  5. Aktifkan tampilan tabel:

    1. Tambahkan sel kode ke notebook.
    2. Salin dan tempel kode berikut ke dalam sel kode:

      #@title Enable data table display
      %load_ext google.colab.data_table
      
    3. Jalankan sel kode.

  6. Buat fungsi untuk menampilkan gambar:

    1. Tambahkan sel kode ke notebook.
    2. Salin dan tempel kode berikut ke dalam sel kode:

      #@title Util function to display images
      import io
      from PIL import Image
      import matplotlib.pyplot as plt
      import tensorflow as tf
      
      def printImages(results):
       image_results_list = list(results)
       amt_of_images = len(image_results_list)
      
       fig, axes = plt.subplots(nrows=amt_of_images, ncols=2, figsize=(20, 20))
       fig.tight_layout()
       fig.subplots_adjust(hspace=0.5)
       for i in range(amt_of_images):
         gcs_uri = image_results_list[i][0]
         text = image_results_list[i][1]
         f = tf.io.gfile.GFile(gcs_uri, 'rb')
         stream = io.BytesIO(f.read())
         img = Image.open(stream)
         axes[i, 0].axis('off')
         axes[i, 0].imshow(img)
         axes[i, 1].axis('off')
         axes[i, 1].text(0, 0, text, fontsize=10)
       plt.show()
      
    3. Jalankan sel kode.

  7. Menampilkan gambar:

    1. Tambahkan sel kode ke notebook.
    2. Salin dan tempel kode berikut ke dalam sel kode:

      #@title Display Met images
      
      inspect_obj_table_query = """
      SELECT uri, content_type
      FROM bqml_tutorial.met_images
      WHERE content_type = 'image/jpeg'
      Order by uri
      LIMIT 10;
      """
      printImages(client.query(inspect_obj_table_query))
      
    3. Jalankan sel kode.

      Hasilnya akan terlihat seperti berikut:

      Gambar yang menampilkan objek dari Metropolitan Museum of Art.

  8. Simpan notebook sebagai met-image-analysis.

Membuat model jarak jauh

Buat model jarak jauh yang merepresentasikan model embedding multimodal Vertex AI yang dihosting:

  1. Di Trusted Cloud konsol, buka halaman BigQuery.

    Buka BigQuery

  2. Di editor kueri, jalankan kueri berikut:

    CREATE OR REPLACE MODEL `bqml_tutorial.multimodal_embedding_model`
      REMOTE WITH CONNECTION DEFAULT
      OPTIONS (ENDPOINT = 'multimodalembedding@001');

    Kueri memerlukan waktu beberapa detik untuk diselesaikan, setelah itu model multimodal_embedding_model akan muncul di set data bqml_tutorial di panel Explorer. Karena kueri menggunakan pernyataan CREATE MODEL untuk membuat model, tidak akan ada hasil kueri.

Membuat embedding gambar

Buat embedding dari gambar dalam tabel objek menggunakan fungsi ML.GENERATE_EMBEDDING, lalu tulis ke tabel untuk digunakan pada langkah berikutnya. Pembuatan embedding adalah operasi yang mahal, sehingga kueri menggunakan subkueri yang menyertakan klausa LIMIT untuk membatasi pembuatan embedding hingga 10.000 gambar, bukan menyematkan seluruh set data yang terdiri dari 601.294 gambar. Hal ini juga membantu menjaga jumlah gambar di bawah batas 25.000 untuk fungsi ML.GENERATE_EMBEDDING. Kueri ini membutuhkan waktu sekitar 40 menit untuk dijalankan.

  1. Di Trusted Cloud konsol, buka halaman BigQuery.

    Buka BigQuery

  2. Di editor kueri, jalankan kueri berikut:

    CREATE OR REPLACE TABLE `bqml_tutorial.met_image_embeddings`
    AS
    SELECT *
    FROM
      ML.GENERATE_EMBEDDING(
        MODEL `bqml_tutorial.multimodal_embedding_model`,
        (SELECT * FROM `bqml_tutorial.met_images` WHERE content_type = 'image/jpeg' LIMIT 10000))

Memperbaiki error pembuatan sematan

Periksa dan perbaiki error pembuatan sematan. Pembuatan embedding dapat gagal karena kuota AI Generatif di Vertex AI atau layanan tidak tersedia.

Fungsi ML.GENERATE_EMBEDDING menampilkan detail error di kolom ml_generate_embedding_status. Kolom ini kosong jika pembuatan sematan berhasil, atau berisi pesan error jika pembuatan sematan gagal.

  1. Di Trusted Cloud konsol, buka halaman BigQuery.

    Buka BigQuery

  2. Di editor kueri, jalankan kueri berikut untuk melihat apakah ada kegagalan pembuatan sematan:

    SELECT DISTINCT(ml_generate_embedding_status),
      COUNT(uri) AS num_rows
    FROM bqml_tutorial.met_image_embeddings
    GROUP BY 1;
  3. Jika baris yang berisi error ditampilkan, hapus baris yang gagal membuat sematan:

    DELETE FROM `bqml_tutorial.met_image_embeddings`
    WHERE ml_generate_embedding_status = 'A retryable error occurred: RESOURCE_EXHAUSTED error from remote service/endpoint.';

Membuat indeks vektor

Anda dapat secara opsional menggunakan pernyataan CREATE VECTOR INDEX untuk membuat indeks vektor met_images_index di kolom ml_generate_embedding_result tabel met_images_embeddings. Indeks vektor memungkinkan Anda melakukan penelusuran vektor dengan lebih cepat, dengan trade-off berupa pengurangan perolehan sehingga menampilkan hasil yang lebih mendekati.

  1. Di Trusted Cloud konsol, buka halaman BigQuery.

    Buka BigQuery

  2. Di editor kueri, jalankan kueri berikut:

    CREATE OR REPLACE
      VECTOR INDEX `met_images_index`
    ON
      bqml_tutorial.met_image_embeddings(ml_generate_embedding_result)
      OPTIONS (
        index_type = 'IVF',
        distance_type = 'COSINE');
  3. Indeks vektor dibuat secara asinkron. Untuk memeriksa apakah indeks vektor telah dibuat, kueri tampilan INFORMATION_SCHEMA.VECTOR_INDEXES dan konfirmasi bahwa nilai coverage_percentage lebih besar dari 0, dan nilai last_refresh_time bukan NULL:

    SELECT table_name, index_name, index_status,
      coverage_percentage, last_refresh_time, disable_reason
    FROM bqml_tutorial.INFORMATION_SCHEMA.VECTOR_INDEXES
    WHERE index_name = 'met_images_index';

Buat embedding untuk teks penelusuran

Untuk menelusuri gambar yang sesuai dengan string penelusuran teks tertentu, Anda harus membuat embedding teks untuk string tersebut terlebih dahulu. Gunakan model jarak jauh yang sama untuk membuat embedding teks yang Anda gunakan untuk membuat embedding gambar, lalu tulis embedding teks ke tabel untuk digunakan pada langkah berikutnya. String penelusurannya adalah pictures of white or cream colored dress from victorian era.

  1. Di Trusted Cloud konsol, buka halaman BigQuery.

    Buka BigQuery

  2. Di editor kueri, jalankan kueri berikut:

    CREATE OR REPLACE TABLE `bqml_tutorial.search_embedding`
    AS
    SELECT * FROM ML.GENERATE_EMBEDDING(
      MODEL `bqml_tutorial.multimodal_embedding_model`,
      (
        SELECT 'pictures of white or cream colored dress from victorian era' AS content
      )
    );

Gunakan fungsi VECTOR_SEARCH untuk melakukan penelusuran semantik gambar yang paling sesuai dengan string penelusuran yang diwakili oleh embedding teks.

  1. Di Trusted Cloud konsol, buka halaman BigQuery.

    Buka BigQuery

  2. Di editor kueri, jalankan kueri berikut untuk melakukan penelusuran semantik dan menulis hasilnya ke tabel:

    CREATE OR REPLACE TABLE `bqml_tutorial.vector_search_results` AS
    SELECT base.uri AS gcs_uri, distance
    FROM
      VECTOR_SEARCH(
        TABLE `bqml_tutorial.met_image_embeddings`,
        'ml_generate_embedding_result',
        TABLE `bqml_tutorial.search_embedding`,
        'ml_generate_embedding_result',
        top_k => 3);

Memvisualisasikan hasil penelusuran semantik

Visualisasikan hasil penelusuran semantik menggunakan notebook.

  1. Di Trusted Cloud konsol, buka halaman BigQuery.

    Buka BigQuery

  2. Buka notebook met-image-analysis yang Anda buat sebelumnya.

  3. Visualisasikan hasil penelusuran vektor:

    1. Tambahkan sel kode ke notebook.
    2. Salin dan tempel kode berikut ke dalam sel kode:

      query = """
        SELECT * FROM `bqml_tutorial.vector_search_results`
        ORDER BY distance;
      """
      
      printImages(client.query(query))
      
    3. Jalankan sel kode.

      Hasilnya akan terlihat seperti berikut:

      Gambar yang ditampilkan dari kueri penelusuran vektor multimodal.

Pembersihan

  1. In the Trusted Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.