Sesuaikan LLM menggunakan fine tuning yang diawasi

Dokumen ini menunjukkan cara membuat model jarak jauh BigQuery ML yang mereferensikan semua versi model dasar natural language Vertex AI text-bison dan mengonfigurasi model tersebut untuk menjalankan tuning yang diawasi. Anda kemudian dapat menggunakan model ini bersama dengan fungsi ML.GENERATE_TEXT untuk menganalisis teks dalam tabel BigQuery atau dengan fungsi ML.EVALUATE untuk mengevaluasi model.

Izin yang diperlukan

  • Untuk membuat koneksi, Anda memerlukan keanggotaan dalam peran Identity and Access Management (IAM) berikut:

    • roles/bigquery.connectionAdmin
  • Untuk memberikan izin ke akun layanan koneksi, Anda memerlukan izin berikut:

    • resourcemanager.projects.setIamPolicy
  • Untuk membuat model menggunakan BigQuery ML, Anda memerlukan izin IAM berikut:

    • bigquery.jobs.create
    • bigquery.models.create
    • bigquery.models.getData
    • bigquery.models.updateData
    • bigquery.models.updateMetadata
  • Untuk menjalankan inferensi, Anda memerlukan izin berikut:

    • bigquery.tables.getData pada tabel
    • bigquery.models.getData pada model
    • bigquery.jobs.create

Sebelum memulai

  1. Di konsol Google Cloud, pada halaman pemilih project, pilih atau buat project Google Cloud.

    Buka pemilih project

  2. Pastikan penagihan telah diaktifkan untuk project Google Cloud Anda.

  3. Aktifkan API BigQuery, BigQuery Connection,Vertex AI, and Compute Engine.

    Mengaktifkan API

Membuat koneksi

Buat koneksi resource Cloud dan dapatkan akun layanan koneksi.

Pilih salah satu opsi berikut:

Konsol

  1. Buka halaman BigQuery.

    Buka BigQuery

  2. Untuk membuat koneksi, klik Add, lalu klik Connections to external data sources.

  3. Dalam daftar Connection type, pilih Vertex AI remote models, remote functions and BigLake (Cloud Resource).

  4. Di kolom Connection ID, masukkan nama untuk koneksi Anda.

  5. Klik Create connection.

  6. Klik Go to connection.

  7. Di panel Connection info, salin ID akun layanan untuk digunakan di langkah berikutnya.

bq

  1. Di lingkungan command line, buat koneksi:

    bq mk --connection --location=REGION --project_id=PROJECT_ID \
        --connection_type=CLOUD_RESOURCE CONNECTION_ID
    

    Parameter --project_id akan mengganti project default.

    Ganti kode berikut:

    • REGION: region koneksi Anda
    • PROJECT_ID: project ID Google Cloud Anda
    • CONNECTION_ID: ID untuk koneksi Anda

    Saat Anda membuat resource koneksi, BigQuery akan membuat akun layanan sistem unik dan mengaitkannya dengan koneksi.

    Pemecahan masalah: Jika Anda mendapatkan error koneksi berikut, update Google Cloud SDK:

    Flags parsing error: flag --connection_type=CLOUD_RESOURCE: value should be one of...
    
  2. Ambil dan salin ID akun layanan untuk digunakan di langkah berikutnya:

    bq show --connection PROJECT_ID.REGION.CONNECTION_ID
    

    Outputnya mirip dengan hal berikut ini:

    name                          properties
    1234.REGION.CONNECTION_ID     {"serviceAccountId": "connection-1234-9u56h9@gcp-sa-bigquery-condel.iam.gserviceaccount.com"}
    

Terraform

Tambahkan bagian berikut ke dalam file main.tf Anda.

 ## This creates a cloud resource connection.
 ## Note: The cloud resource nested object has only one output only field - serviceAccountId.
 resource "google_bigquery_connection" "connection" {
    connection_id = "CONNECTION_ID"
    project = "PROJECT_ID"
    location = "REGION"
    cloud_resource {}
}        
Ganti kode berikut:

  • CONNECTION_ID: ID untuk koneksi Anda
  • PROJECT_ID: project ID Google Cloud Anda
  • REGION: region koneksi Anda

Memberikan akses akun layanan koneksi

Berikan izin kepada akun layanan Anda untuk mengakses Vertex AI. Kegagalan dalam memberikan izin akan menghasilkan error. Pilih salah satu opsi berikut:

Konsol

  1. Buka halaman IAM & Admin.

    Buka IAM & Admin

  2. Klik Berikan Akses.

  3. Untuk New principals, masukkan ID akun layanan yang telah Anda salin sebelumnya.

  4. Klik Select a role.

  5. Di Filter, ketik Vertex AI Service Agent, lalu pilih peran tersebut.

  6. Klik Save.

gcloud

Gunakan perintah gcloud projects add-iam-policy-binding:

gcloud projects add-iam-policy-binding 'PROJECT_NUMBER' --member='serviceAccount:MEMBER' --role='roles/aiplatform.serviceAgent' --condition=None

Ganti kode berikut:

  • PROJECT_NUMBER: nomor project Anda.
  • MEMBER: ID akun layanan yang Anda salin sebelumnya.

Akun layanan yang terkait dengan koneksi Anda adalah instance BigQuery Connection Delegation Service Agent, sehingga Anda dapat menetapkan peran agen layanan ke akun tersebut.

Memberikan akses akun layanan default Compute Engine

Saat Anda mengaktifkan Compute Engine API, akun layanan default Compute Engine otomatis diberi peran Editor pada project, kecuali jika Anda telah menonaktifkan perilaku ini untuk project Anda. Jika demikian, Anda harus memberikan kembali peran Editor ke akses akun layanan default Compute Engine agar memiliki izin yang memadai untuk membuat dan menyesuaikan model jarak jauh.

Konsol

  1. Buka halaman IAM & Admin.

    Buka IAM & Admin

  2. Klik Berikan Akses.

  3. Untuk Akun utama baru, masukkan ID akun layanan, yaitu PROJECT_NUMBER-compute@developer.gserviceaccount.com.

  4. Klik Select a role.

  5. Pada bagian Pilih peran, pilih Dasar, lalu pilih Editor.

  6. Klik Save.

gcloud

Gunakan perintah gcloud projects add-iam-policy-binding:

gcloud projects add-iam-policy-binding 'PROJECT_NUMBER' --member='serviceAccount:MEMBER' --role='roles/editor' --condition=None

Ganti kode berikut:

  • PROJECT_NUMBER: nomor project Anda.
  • MEMBER: ID akun layanan, yaitu PROJECT_NUMBER-compute@developer.gserviceaccount.com.

Membuat model dengan penyesuaian yang diawasi

  1. Di konsol Google Cloud, buka halaman BigQuery.

    Buka BigQuery

  2. Di editor kueri, jalankan kueri berikut untuk membuat model jarak jauh:

    CREATE OR REPLACE MODEL
    `PROJECT_ID.DATASET_ID.MODEL_NAME`
    REMOTE WITH CONNECTION `PROJECT_ID.REGION.CONNECTION_ID`
    OPTIONS (
      ENDPOINT = 'ENDPOINT',
      MAX_ITERATIONS = MAX_ITERATIONS,
      EARLY_STOP = EARLY_STOP,
      LEARNING_RATE_MULTIPLIER = LEARNING_RATE_MULTIPLIER,
      ACCELERATOR_TYPE = 'ACCELERATOR_TYPE',
      DATA_SPLIT_METHOD = 'DATA_SPLIT_METHOD',
      DATA_SPLIT_EVAL_FRACTION = DATA_SPLIT_EVAL_FRACTION,
      DATA_SPLIT_COL = 'DATA_SPLIT_COL',
      EVALUATION_TASK = 'EVALUATION_TASK',
      PROMPT_COL = 'INPUT_PROMPT_COL',
      INPUT_LABEL_COLS = INPUT_LABEL_COLS)
    AS SELECT PROMPT_COLUMN, LABEL_COLUMN
    FROM `TABLE_PROJECT_ID.TABLE_DATASET.TABLE_NAME`;
    

    Ganti kode berikut:

    • PROJECT_ID: project ID dari project tempat membuat model.
    • DATASET_ID: ID set data yang akan berisi model. Set data ini harus berada dalam tugas pipeline dan region upload model yang didukung.
    • MODEL_NAME: nama model.
    • REGION: region yang digunakan oleh koneksi.
    • CONNECTION_ID: ID koneksi BigQuery Anda. Koneksi ini harus berada di lokasi yang sama dengan set data yang Anda gunakan.

      Saat Anda melihat detail koneksi di Konsol Google Cloud, ini adalah nilai di bagian terakhir dari ID koneksi yang sepenuhnya memenuhi syarat yang ditampilkan di Connection ID—misalnya, projects/myproject/locations/connection_location/connections/myconnection.

    • ENDPOINT: nilai STRING yang menentukan nama LLM teks yang akan digunakan, yang dalam hal ini harus berupa versi model text-bison apa pun.
    • MAX_ITERATIONS: nilai INT64 yang menentukan jumlah langkah yang akan dijalankan untuk tuning yang diawasi. Nilai MAX_ITERATIONS harus antara 1 dan 2400. Biasanya, 100 langkah akan selesai dalam satu jam. Nilai defaultnya adalah 300.

      Nilai MAX_ITERATIONS yang dikombinasikan dengan nilai ACCELERATOR_TYPE akan memengaruhi ukuran tumpukan yang digunakan dalam pelatihan model. Untuk panduan lebih lanjut dalam memilih jumlah langkah pelatihan, lihat Konfigurasi yang direkomendasikan.

      Untuk mengetahui informasi selengkapnya, lihat MAX_ITERATIONS.

    • EARLY_STOP: nilai BOOL yang menentukan apakah akan menghentikan penyesuaian yang diawasi sebelum menyelesaikan semua langkah penyesuaian. Jika ditetapkan ke TRUE, status ini akan menghentikan penyesuaian yang diawasi jika performa model, yang diukur berdasarkan akurasi token yang diprediksi, tidak cukup meningkat di antara evaluasi berjalan. Jika ditetapkan ke FALSE, penyesuaian yang diawasi akan berlanjut hingga semua langkah penyesuaian selesai. Nilai defaultnya adalah FALSE.
    • LEARNING_RATE_MULTIPLIER: FLOAT64 Pengganda untuk diterapkan ke kecepatan pembelajaran yang direkomendasikan. Nilai defaultnya adalah 1.0.
    • ACCELERATOR_TYPE: nilai STRING yang menentukan jenis akselerator yang akan digunakan untuk penyesuaian yang diawasi. Opsi yang valid adalah sebagai berikut:
      • GPU: menggunakan GPU A100 80 GB untuk tuning yang diawasi.
      • TPU: menggunakan 64 core pod TPU v3 untuk tuning yang diawasi. Jika Anda memilih opsi ini, hal berikut berlaku:
        • Anda harus menjalankan kueri di region europe-west4. Untuk mengetahui informasi tentang cara mengubah opsi kueri seperti lokasi, lihat Menjalankan kueri interaktif.
        • Komputasi tuning Anda yang diawasi akan terjadi di region europe-west4, karena di sanalah resource TPU berada.

      Nilai defaultnya adalah GPU. Apa pun opsi yang digunakan, pastikan Anda memiliki kuota yang cukup.

    • DATA_SPLIT_METHOD: nilai STRING yang menentukan metode yang digunakan untuk membagi data input menjadi set pelatihan dan evaluasi. Opsi yang valid adalah sebagai berikut:
      • AUTO_SPLIT: BigQuery ML membagi data secara otomatis. Cara pembagian data bervariasi, bergantung pada jumlah baris dalam tabel input. Ini adalah nilai defaultnya.
      • RANDOM: data diacak sebelum dibagi menjadi beberapa kumpulan. Untuk menyesuaikan pembagian data, Anda dapat menggunakan opsi ini dengan opsi DATA_SPLIT_EVAL_FRACTION.
      • CUSTOM: data dibagi menggunakan kolom yang disediakan di opsi DATA_SPLIT_COL. Nilai DATA_SPLIT_COL harus berupa nama kolom dengan jenis BOOL. Baris dengan nilai TRUE atau NULL digunakan sebagai data evaluasi, dan baris dengan nilai FALSE digunakan sebagai data pelatihan.
      • SEQ: membagi data menggunakan kolom yang disediakan di opsi DATA_SPLIT_COL. Nilai DATA_SPLIT_COL harus berupa nama kolom dari salah satu jenis berikut:
        • NUMERIC
        • BIGNUMERIC
        • STRING
        • TIMESTAMP

        Data diurutkan dari terkecil ke terbesar berdasarkan kolom yang ditentukan.

        n baris pertama digunakan sebagai data evaluasi, dengan n adalah nilai yang ditentukan untuk DATA_SPLIT_EVAL_FRACTION. Baris yang tersisa digunakan sebagai data pelatihan.

      • NO_SPLIT: tidak ada pembagian data; semua data input digunakan sebagai data pelatihan.

      Untuk mengetahui informasi selengkapnya tentang opsi pemisahan data ini, lihat DATA_SPLIT_METHOD.

    • DATA_SPLIT_EVAL_FRACTION: nilai FLOAT64 yang menentukan fraksi data untuk digunakan sebagai data evaluasi saat melakukan penyesuaian yang diawasi. Harus berupa nilai dalam rentang [0, 1.0]. Nilai defaultnya adalah 0.2.

      Gunakan opsi ini saat Anda menentukan RANDOM atau SEQ sebagai nilai untuk opsi DATA_SPLIT_METHOD. Untuk menyesuaikan pembagian data, Anda dapat menggunakan opsi DATA_SPLIT_METHOD dengan opsi DATA_SPLIT_EVAL_FRACTION.

    • DATA_SPLIT_COL: nilai STRING yang menentukan nama kolom yang akan digunakan untuk mengurutkan data input ke dalam set pelatihan atau evaluasi. Gunakan saat Anda menentukan CUSTOM atau SEQ sebagai nilai untuk opsi DATA_SPLIT_METHOD.
    • EVALUATION_TASK: nilai STRING yang menentukan jenis tugas yang Anda inginkan untuk disesuaikan dengan model. Opsi yang valid adalah:
      • TEXT_GENERATION
      • CLASSIFICATION
      • SUMMARIZATION
      • QUESTION_ANSWERING
      • UNSPECIFIED

      Nilai defaultnya adalah UNSPECIFIED.

    • INPUT_PROMPT_COL: nilai STRING yang berisi nama kolom perintah dalam tabel data pelatihan untuk digunakan saat melakukan penyesuaian yang diawasi. Nilai defaultnya adalah prompt.
    • INPUT_LABEL_COLS: nilai ARRAY<<STRING> yang berisi nama kolom label dalam tabel data pelatihan untuk digunakan dalam tuning yang diawasi. Anda hanya dapat menentukan satu elemen dalam array. Nilai defaultnya adalah array kosong. Hal ini menyebabkan label menjadi nilai default argumen LABEL_COLUMN.
    • PROMPT_COLUMN: kolom dalam tabel data pelatihan yang berisi perintah untuk mengevaluasi konten di kolom LABEL_COLUMN. Kolom ini harus berjenis STRING atau dikonversi menjadi STRING. Jika menentukan nilai untuk opsi INPUT_PROMPT_COL, Anda harus menentukan nilai yang sama untuk PROMPT_COLUMN. Jika tidak, nilai ini harus prompt. Jika tabel Anda tidak memiliki kolom prompt, gunakan alias untuk menentukan kolom tabel yang ada. Misalnya: AS SELECT hint AS prompt, label FROM mydataset.mytable.
    • LABEL_COLUMN: kolom dalam tabel data pelatihan yang berisi contoh untuk melatih model. Kolom ini harus berjenis STRING atau dikonversi menjadi STRING. Jika menentukan nilai untuk opsi INPUT_LABEL_COLS, Anda harus menentukan nilai yang sama untuk LABEL_COLUMN. Jika tidak, nilai ini harus label. Jika tabel Anda tidak memiliki kolom label, gunakan alias untuk menentukan kolom tabel yang ada. Misalnya: AS SELECT prompt, feature AS label FROM mydataset.mytable.
    • TABLE_PROJECT_ID: project ID project yang berisi tabel data pelatihan.
    • TABLE_DATASET: nama set data yang berisi tabel data pelatihan.
    • TABLE_NAME: nama tabel yang berisi data yang akan digunakan untuk melatih model.

Membuat teks

Buat teks dengan fungsi ML.GENERATE_TEXT:

Kolom prompt

Buat teks dengan menggunakan kolom tabel untuk menyediakan prompt.

SELECT *
FROM ML.GENERATE_TEXT(
  MODEL `PROJECT_ID.DATASET_ID.MODEL_NAME`,
  TABLE PROJECT_ID.DATASET_ID.TABLE_NAME,
  STRUCT(TOKENS AS max_output_tokens, TEMPERATURE AS temperature,
  TOP_K AS top_k, TOP_P AS top_p, FLATTEN_JSON AS flatten_json_output,
  STOP_SEQUENCES AS stop_sequences)
);

Ganti kode berikut:

  • PROJECT_ID: project ID Anda.
  • DATASET_ID: ID set data yang berisi model.
  • MODEL_NAME: nama model.
  • TABLE_NAME: nama tabel yang berisi prompt. Tabel ini harus memiliki kolom yang namanya cocok dengan nama kolom fitur dalam LLM yang disesuaikan. Nama kolom fitur dalam LLM dapat ditetapkan menggunakan opsi PROMPT_COL saat membuat model. Jika tidak, nama kolom fitur dalam LLM secara default adalah prompt, atau Anda dapat menggunakan alias untuk menggunakan kolom dengan nama yang berbeda.
  • TOKENS: nilai INT64 yang menetapkan jumlah maksimum token yang dapat dibuat dalam respons. Nilai ini harus berada dalam rentang [1,1024]. Tentukan nilai yang lebih rendah untuk respons yang lebih pendek dan nilai yang lebih tinggi untuk respons yang lebih lama. Defaultnya adalah 128.
  • TEMPERATURE: nilai FLOAT64 dalam rentang [0.0,1.0] yang mengontrol tingkat keacakan dalam pemilihan token. Defaultnya adalah 0.

    Nilai yang lebih rendah untuk temperature cocok untuk prompt yang memerlukan respons yang lebih deterministik dan kurang terbuka atau kreatif, sedangkan nilai yang lebih tinggi untuk temperature dapat memberikan hasil yang lebih beragam atau kreatif. Nilai 0 untuk temperature bersifat deterministik, yang berarti bahwa respons probabilitas tertinggi selalu dipilih.

  • TOP_K: nilai INT64 dalam rentang [1,40] yang menentukan kumpulan awal token yang dipertimbangkan model untuk dipilih. Tentukan nilai yang lebih rendah untuk respons dengan tingkat keacakan lebih rendah, dan nilai yang lebih tinggi untuk respons dengan tingkat keacakan lebih tinggi Defaultnya adalah 40.
  • TOP_P: nilai FLOAT64 dalam rentang [0.0,1.0] membantu menentukan token mana dari kumpulan yang ditentukan oleh TOP_K yang dipilih. Tentukan nilai yang lebih rendah untuk respons dengan tingkat keacakan lebih rendah, dan nilai yang lebih tinggi untuk respons dengan tingkat keacakan lebih tinggi Defaultnya adalah 0.95.
  • FLATTEN_JSON: nilai BOOL yang menentukan apakah akan menampilkan teks yang dihasilkan dan atribut keamanan di kolom terpisah. Defaultnya adalah FALSE.
  • STOP_SEQUENCES: nilai ARRAY<STRING> yang menghapus string yang ditentukan jika string tersebut disertakan dalam respons dari model. String dicocokkan secara persis, termasuk kapitalisasi. Defaultnya adalah array kosong.

Contoh berikut menunjukkan permintaan dengan karakteristik ini:

  • Menggunakan kolom prompt dari tabel prompts untuk prompt.
  • Menampilkan respons singkat dan kemungkinannya sedang.
  • Menampilkan teks yang dihasilkan dan atribut keamanan dalam kolom terpisah.
SELECT *
FROM
  ML.GENERATE_TEXT(
    MODEL `mydataset.llm_model`,
    TABLE mydataset.prompts,
    STRUCT(
      0.4 AS temperature, 100 AS max_output_tokens, 0.5 AS top_p,
      40 AS top_k, TRUE AS flatten_json_output));

Kueri prompt

Buat teks dengan menggunakan kueri untuk menyediakan prompt.

SELECT *
FROM ML.GENERATE_TEXT(
  MODEL `PROJECT_ID.DATASET_ID.MODEL_NAME`,
  (PROMPT_QUERY),
  STRUCT(TOKENS AS max_output_tokens, TEMPERATURE AS temperature,
  TOP_K AS top_k, TOP_P AS top_p, FLATTEN_JSON AS flatten_json_output,
  STOP_SEQUENCES AS stop_sequences)
);

Ganti kode berikut:

  • PROJECT_ID: project ID Anda.
  • DATASET_ID: ID set data yang berisi model.
  • MODEL_NAME: nama model.
  • PROMPT_QUERY: kueri yang menyediakan data prompt.
  • TOKENS: nilai INT64 yang menetapkan jumlah maksimum token yang dapat dibuat dalam respons. Nilai ini harus berada dalam rentang [1,1024]. Tentukan nilai yang lebih rendah untuk respons yang lebih pendek dan nilai yang lebih tinggi untuk respons yang lebih lama. Defaultnya adalah 128.
  • TEMPERATURE: nilai FLOAT64 dalam rentang [0.0,1.0] yang mengontrol tingkat keacakan dalam pemilihan token. Defaultnya adalah 0.

    Nilai yang lebih rendah untuk temperature cocok untuk prompt yang memerlukan respons yang lebih deterministik dan kurang terbuka atau kreatif, sedangkan nilai yang lebih tinggi untuk temperature dapat memberikan hasil yang lebih beragam atau kreatif. Nilai 0 untuk temperature bersifat deterministik, yang berarti bahwa respons probabilitas tertinggi selalu dipilih.

  • TOP_K: nilai INT64 dalam rentang [1,40] yang menentukan kumpulan awal token yang dipertimbangkan model untuk dipilih. Tentukan nilai yang lebih rendah untuk respons dengan tingkat keacakan lebih rendah, dan nilai yang lebih tinggi untuk respons dengan tingkat keacakan lebih tinggi Defaultnya adalah 40.
  • TOP_P: nilai FLOAT64 dalam rentang [0.0,1.0] membantu menentukan token mana dari kumpulan yang ditentukan oleh TOP_K yang dipilih. Tentukan nilai yang lebih rendah untuk respons dengan tingkat keacakan lebih rendah, dan nilai yang lebih tinggi untuk respons dengan tingkat keacakan lebih tinggi Defaultnya adalah 0.95.
  • FLATTEN_JSON: nilai BOOL yang menentukan apakah akan menampilkan teks yang dihasilkan dan atribut keamanan di kolom terpisah. Defaultnya adalah FALSE.
  • STOP_SEQUENCES: nilai ARRAY<STRING> yang menghapus string yang ditentukan jika string tersebut disertakan dalam respons dari model. String dicocokkan secara persis, termasuk kapitalisasi. Defaultnya adalah array kosong.

Contoh 1

Contoh berikut menunjukkan permintaan dengan karakteristik ini:

  • Meminta ringkasan teks di kolom body pada tabel articles.
  • Menampilkan respons yang cukup panjang dan kemungkinannya lebih besar.
  • Menampilkan teks yang dihasilkan dan atribut keamanan dalam kolom terpisah.
SELECT *
FROM
  ML.GENERATE_TEXT(
    MODEL `mydataset.llm_model`,
    (
      SELECT CONCAT('Summarize this text', body) AS prompt
      FROM mydataset.articles
    ),
    STRUCT(
      0.2 AS temperature, 650 AS max_output_tokens, 0.2 AS top_p,
      15 AS top_k, TRUE AS flatten_json_output));

Contoh 2

Contoh berikut menunjukkan permintaan dengan karakteristik ini:

  • Menggunakan kueri untuk membuat data prompt dengan menyambungkan string yang memberikan awalan prompt dengan kolom tabel.
  • Menampilkan respons singkat dan kemungkinannya sedang.
  • Tidak menampilkan teks yang dihasilkan dan atribut keamanan dalam kolom terpisah.
SELECT *
FROM
  ML.GENERATE_TEXT(
    MODEL `mydataset.llm_tuned_model`,
    (
      SELECT CONCAT(question, 'Text:', description, 'Category') AS prompt
      FROM mydataset.input_table
    ),
    STRUCT(
      0.4 AS temperature, 100 AS max_output_tokens, 0.5 AS top_p,
      30 AS top_k, FALSE AS flatten_json_output));