使用 ONNX 格式的 Transformer 模型生成嵌入

在本教學課程中,您將使用 Hugging Face Optimum CLI,將 sentence-transformers/all-MiniLM-L6-v2 模型匯出為 Open Neural Network Exchange (ONNX) 格式。您可以使用 CREATE MODEL 陳述式 將 ONNX 模型匯入 BigQuery。最後,您可以使用 ML.PREDICT 函式,透過匯入的 ONNX 模型產生嵌入。

本教學課程使用 sentence-transformers/all-MiniLM-L6-v2模型。這個句子 Transformer 模型以快速且有效率地生成句子嵌入而聞名。句子嵌入可擷取文字的深層含義,因此能執行語意搜尋、分群和句子相似度等工作。

ONNX 提供統一格式,可用於表示任何機器學習 (ML) 架構。BigQuery ML 支援 ONNX,因此您可以執行下列操作:

  • 使用您喜愛的架構訓練模型。
  • 將模型轉換為 ONNX 模型格式。
  • 將 ONNX 模型匯入 BigQuery,並使用 BigQuery ML 進行預測。

目標

  • sentence-transformers/all-MiniLM-L6-v2 模型匯出至 ONNX。
  • 將 ONNX 模型匯入 BigQuery。
  • 使用 ML.PREDICT 函式,透過匯入的 ONNX 模型生成嵌入。

費用

在本文件中,您會使用下列 Cloud de Confiance by S3NS的計費元件:

完成本文所述工作後,您可以刪除建立的資源,避免繼續計費,詳情請參閱「清除所用資源」。

事前準備

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

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  2. 確認專案已啟用計費功能 Cloud de Confiance

  3. 啟用 BigQuery 和 Cloud Storage API。

    啟用 API 時所需的角色

    如要啟用 API,您必須具備 serviceusage.services.enable 權限。如果您建立了專案,可能已透過「擁有者」角色 (roles/owner) 取得這項權限。否則,您可以透過「服務使用情形管理員」角色 (roles/serviceusage.serviceUsageAdmin) 取得這項權限。瞭解如何授予角色

    啟用 API

  4. 請確認您具備必要權限,可執行本文件中的工作。

必要的角色

如要取得完成本教學課程所需的權限,請要求管理員在專案中授予您下列 IAM 角色:

  • 建立資料集、資料表和模型,並執行 BigQuery 工作: BigQuery Studio 管理員 (roles/bigquery.studioAdmin)
  • 建立 Cloud Storage bucket,並建立儲存空間物件 (如果您要手動將 Transformer 模型檔案轉換為 ONNX): Storage Admin (roles/storage.admin)

如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和組織的存取權」。

您或許也能透過自訂角色或其他預先定義的角色,取得必要權限。

如果您建立新專案,您就是專案擁有者,並已獲得完成本教學課程所需的所有 Identity and Access Management (IAM) 權限。

如要進一步瞭解 BigQuery 中的 IAM 權限,請參閱 IAM 權限

選用:手動將 Transformer 模型檔案轉換為 ONNX

如要手動將 sentence-transformers/all-MiniLM-L6-v2 模型和權杖化工具轉換為 ONNX,請按照下列各節的步驟操作。或者,您也可以使用 gs://cloud-samples-data Cloud Storage bucket 中的範例檔案。這個 bucket 中的檔案已轉換完畢。如果使用範例檔案,請跳至「建立資料集」。

如要手動轉換檔案,您必須具備已安裝 Python 的本機指令列環境。如要進一步瞭解如何安裝 Python,請參閱 Python 下載頁面

將 Transformer 模型匯出為 ONNX

使用 Hugging Face Optimum CLI 將 sentence-transformers/all-MiniLM-L6-v2 模型匯出至 ONNX。如要進一步瞭解如何使用 Optimum CLI 匯出模型,請參閱「使用 optimum.exporters.onnx 將模型匯出為 ONNX 格式」。

如要匯出模型,請開啟指令列環境並按照下列步驟操作:

  1. 安裝 Optimum CLI:

    pip install optimum[onnx]
    
  2. 匯出模型:

    optimum-cli export onnx \
        --model sentence-transformers/all-MiniLM-L6-v2 \
        --task sentence-similarity \
        --opset 17 all-MiniLM-L6-v2/
    

    --model 引數會指定 Hugging Face 模型 ID。--opset 引數會指定 ONNXRuntime 程式庫版本,並設為 17,以維持與 BigQuery 支援的 ONNXRuntime 程式庫相容。

模型檔案會匯出至 all-MiniLM-L6-v2 目錄,並命名為 model.onnx

對 Transformer 模型套用量化

使用 Optimum CLI 將量子化套用至匯出的 Transformer 模型,以縮減模型大小並加快推論速度。詳情請參閱「量化」一節。

如要對模型套用量化,請執行下列指令:

optimum-cli onnxruntime quantize \
    --onnx_model all-MiniLM-L6-v2/ \
    --avx512_vnni -o all-MiniLM-L6-v2_quantized

量化模型檔案會匯出至 all-MiniLM-L6-v2_quantized 目錄,並命名為 model_quantized.onnx

將權杖化工具轉換為 ONNX

如要使用 ONNX 格式的 Transformer 模型生成嵌入,通常會使用權杖化工具產生模型的兩個輸入內容:input_idsattention_mask

如要產生這些輸入內容,請使用 onnxruntime-extensions 程式庫,將 sentence-transformers/all-MiniLM-L6-v2 模型的分詞器轉換為 ONNX 格式。轉換權杖化工具後,您就能直接對原始文字輸入內容執行權杖化,以產生 ONNX 預測結果。

如要轉換權杖化工具,請在指令列上按照下列步驟操作:

  1. 安裝 Optimum CLI:

    pip install optimum[onnx]
    
  2. 使用您選擇的文字編輯器,建立名為 convert-tokenizer.py 的檔案。以下範例使用 nano 文字編輯器:

    nano convert-tokenizer.py
    
  3. 複製下列 Python 指令碼,並貼到 convert-tokenizer.py 檔案中:

    from onnxruntime_extensions import gen_processing_models
    
    # Load the Huggingface tokenizer
    tokenizer = AutoTokenizer.from_pretrained("sentence-transformers/all-MiniLM-L6-v2")
    
    # Export the tokenizer to ONNX using gen_processing_models
    onnx_tokenizer_path = "tokenizer.onnx"
    
    # Generate the tokenizer ONNX model, and set the maximum token length.
    # Ensure 'max_length' is set to a value less than the model's maximum sequence length, failing to do so will result in error during inference.
    tokenizer_onnx_model = gen_processing_models(tokenizer, pre_kwargs={'max_length': 256})[0]
    
    # Modify the tokenizer ONNX model signature.
    # This is because certain tokenizers don't support batch inference.
    tokenizer_onnx_model.graph.input[0].type.tensor_type.shape.dim[0].dim_value = 1
    
    # Save the tokenizer ONNX model
    with open(onnx_tokenizer_path, "wb") as f:
      f.write(tokenizer_onnx_model.SerializeToString())
    
  4. 儲存 convert-tokenizer.py 檔案。

  5. 如要轉換權杖化工具,請執行 Python 指令碼:

    python convert-tokenizer.py
    

轉換後的權杖化工具會匯出至 all-MiniLM-L6-v2_quantized 目錄,並命名為 tokenizer.onnx

將轉換後的模型檔案上傳至 Cloud Storage

轉換 Transformer 模型和權杖化工具後,請執行下列操作:

建立資料集

如要建立 BigQuery 資料集,請選取下列任一選項:

控制台

  1. 前往 Cloud de Confiance 控制台的「BigQuery」頁面。

    前往「BigQuery」

  2. 點選左側窗格中的 「Explorer」

    醒目顯示的「Explorer」窗格按鈕。

    如果沒有看到左側窗格,請按一下 「Expand left pane」(展開左側窗格),開啟窗格。

  3. 在「Explorer」中展開專案,然後按一下「Datasets」

  4. 在「資料集」頁面,按一下 「建立資料集」

  5. 在「建立資料集」窗格中,執行下列操作:

    • 在「Dataset ID」(資料集 ID) 中輸入 bqml_tutorial

    • 選取「資料位置」的「美國」

    其餘預設設定均保留原樣。

  6. 點選「建立資料集」

bq

如要建立新的資料集,請使用 bq mk --dataset 指令

  1. 建立名為 bqml_tutorial 的資料集,並將資料位置設為 US

    bq mk --dataset \
      --location=US \
      --description "BigQuery ML tutorial dataset." \
      bqml_tutorial
  2. 確認資料集已建立完成:

    bq ls

API

使用已定義的資料集資源呼叫 datasets.insert 方法:

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

BigQuery DataFrames

在嘗試這個範例之前,請按照使用 BigQuery DataFrames 的 BigQuery 快速入門導覽課程,完成 BigQuery DataFrames 設定。詳情請參閱 BigQuery DataFrames 參考文件

如要向 BigQuery 進行驗證,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定 ADC」。

import google.cloud.bigquery

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

將 ONNX 模型匯入 BigQuery

將轉換後的權杖化工具和句子轉換器模型匯入為 BigQuery ML 模型。

選取下列選項之一:

控制台

  1. 前往 Cloud de Confiance 控制台的「BigQuery Studio」頁面。

    前往 Studio

  2. 在查詢編輯器中執行下列 CREATE MODEL 陳述式,建立 tokenizer 模型:

     CREATE OR REPLACE MODEL `bqml_tutorial.tokenizer`
      OPTIONS (MODEL_TYPE='ONNX',
       MODEL_PATH='TOKENIZER_BUCKET_PATH');

    請將 TOKENIZER_BUCKET_PATH 改成您上傳至 Cloud Storage 的模型路徑。如果您使用範例模型,請將 TOKENIZER_BUCKET_PATH 替換為下列值:gs://cloud-samples-data/bigquery/ml/onnx/all-MiniLM-L6-v2/tokenizer.onnx

    作業完成後,「查詢結果」窗格中會顯示類似以下的訊息:Successfully created model named tokenizer

  3. 如要開啟「詳細資料」窗格,請按一下「前往模型」

  4. 如要在「標籤資料欄」中查看模型輸入和模型輸出,請查看「特徵資料欄」部分:

    `tokenizer` 模型的「詳細資料」窗格

  5. 如要建立 all-MiniLM-L6-v2 模型,請在查詢編輯器中執行下列 CREATE MODEL 陳述式:

     CREATE OR REPLACE MODEL `bqml_tutorial.all-MiniLM-L6-v2`
      OPTIONS (MODEL_TYPE='ONNX',
       MODEL_PATH='TRANSFORMER_BUCKET_PATH');

    請將 TRANSFORMER_BUCKET_PATH 改成您上傳至 Cloud Storage 的模型路徑。如果您使用範例模型,請將 TRANSFORMER_BUCKET_PATH 替換為下列值:gs://cloud-samples-data/bigquery/ml/onnx/all-MiniLM-L6-v2/model_quantized.onnx

    作業完成後,「查詢結果」窗格中會顯示類似以下的訊息:Successfully created model named all-MiniLM-L6-v2

  6. 如要開啟「詳細資料」窗格,請按一下「前往模型」

  7. 如要在「標籤資料欄」中查看模型輸入和模型輸出,請查看「特徵資料欄」部分:

    `all-MiniLM-L6-v2` 模型的「詳細資料」窗格

bq

使用 bq 指令列工具 query 指令執行 CREATE MODEL 陳述式。

  1. 建立 tokenizer 模型:

    bq query --use_legacy_sql=false \
    "CREATE OR REPLACE MODEL
    `bqml_tutorial.tokenizer`
    OPTIONS
    (MODEL_TYPE='ONNX',
      MODEL_PATH='TOKENIZER_BUCKET_PATH')"

    請將 TOKENIZER_BUCKET_PATH 改成您上傳至 Cloud Storage 的模型路徑。如果您使用範例模型,請將 TOKENIZER_BUCKET_PATH 替換為下列值:gs://cloud-samples-data/bigquery/ml/onnx/all-MiniLM-L6-v2/tokenizer.onnx

    作業完成後,您會看到類似以下的訊息:Successfully created model named tokenizer

  2. 建立 all-MiniLM-L6-v2 模型:

    bq query --use_legacy_sql=false \
    "CREATE OR REPLACE MODEL
      `bqml_tutorial.all-MiniLM-L6-v2`
    OPTIONS
      (MODEL_TYPE='ONNX',
        MODEL_PATH='TRANSFORMER_BUCKET_PATH')"

    請將 TRANSFORMER_BUCKET_PATH 改成您上傳至 Cloud Storage 的模型路徑。如果您使用範例模型,請將 TRANSFORMER_BUCKET_PATH 替換為下列值:gs://cloud-samples-data/bigquery/ml/onnx/all-MiniLM-L6-v2/model_quantized.onnx

    作業完成後,畫面上會顯示類似如下的訊息:Successfully created model named all-MiniLM-L6-v2

  3. 匯入模型後,請確認模型是否顯示在資料集中。

    bq ls -m bqml_tutorial

    輸出結果會與下列內容相似:

    tableId            Type
    ------------------------
    tokenizer          MODEL
    all-MiniLM-L6-v2   MODEL

API

使用 jobs.insert 方法匯入模型。在要求主體中,使用 CREATE MODEL 陳述式填入 QueryRequest 資源query 參數。

  1. 如要建立 tokenizer 模型,請使用下列 query 參數:

    {
      "query": "CREATE MODEL `PROJECT_ID :bqml_tutorial.tokenizer` OPTIONS(MODEL_TYPE='ONNX' MODEL_PATH='TOKENIZER_BUCKET_PATH')"
    }

    更改下列內容:

    • PROJECT_ID:您的專案 ID。
    • TOKENIZER_BUCKET_PATH:您上傳至 Cloud Storage 的模型路徑。如果您使用範例模型,請將 TOKENIZER_BUCKET_PATH 替換為下列值:gs://cloud-samples-data/bigquery/ml/onnx/all-MiniLM-L6-v2/tokenizer.onnx
  2. 如要建立 all-MiniLM-L6-v2 模型,請使用下列 query 參數值:

    {
      "query": "CREATE MODEL `PROJECT_ID :bqml_tutorial.all-MiniLM-L6-v2` OPTIONS(MODEL_TYPE='ONNX' MODEL_PATH='TRANSFORMER_BUCKET_PATH')"
    }

    更改下列內容:

    • PROJECT_ID:您的專案 ID。
    • TRANSFORMER_BUCKET_PATH:您上傳至 Cloud Storage 的模型路徑。如果您使用範例模型,請將 TRANSFORMER_BUCKET_PATH 替換為下列值:gs://cloud-samples-data/bigquery/ml/onnx/all-MiniLM-L6-v2/model_quantized.onnx

BigQuery DataFrames

在嘗試這個範例之前,請按照使用 BigQuery DataFrames 的 BigQuery 快速入門導覽課程,完成 BigQuery DataFrames 設定。詳情請參閱 BigQuery DataFrames 參考文件

如要向 BigQuery 進行驗證,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定 ADC」。

使用 ONNXModel 物件匯入權杖化工具和句子轉換器模型。

import bigframes
from bigframes.ml.imported import ONNXModel

bigframes.options.bigquery.project = PROJECT_ID

bigframes.options.bigquery.location = "US"

tokenizer = ONNXModel(
  model_path= "TOKENIZER_BUCKET_PATH"
)
imported_onnx_model = ONNXModel(
  model_path="TRANSFORMER_BUCKET_PATH"
)

更改下列內容:

  • PROJECT_ID:您的專案 ID。
  • TOKENIZER_BUCKET_PATH:您上傳至 Cloud Storage 的模型路徑。如果您使用範例模型,請將 TOKENIZER_BUCKET_PATH 替換為下列值:gs://cloud-samples-data/bigquery/ml/onnx/all-MiniLM-L6-v2/tokenizer.onnx
  • TRANSFORMER_BUCKET_PATH:您上傳至 Cloud Storage 的模型路徑。如果您使用範例模型,請將 TRANSFORMER_BUCKET_PATH 替換為下列值:gs://cloud-samples-data/bigquery/ml/onnx/all-MiniLM-L6-v2/model_quantized.onnx

使用匯入的 ONNX 模型生成嵌入

使用匯入的權杖化工具和句子轉換器模型,根據bigquery-public-data.imdb.reviews公開資料集的資料生成嵌入。

選取下列選項之一:

控制台

使用 ML.PREDICT 函式,透過模型生成嵌入。

這項查詢會使用巢狀 ML.PREDICT 呼叫,直接透過權杖化工具和嵌入模型處理原始文字,如下所示:

  • 權杖化 (內部查詢):內部 ML.PREDICT 呼叫會使用 bqml_tutorial.tokenizer 模型。並以 bigquery-public-data.imdb.reviews 公開資料集的 title 欄做為 text 輸入內容。tokenizer 模型會將原始文字字串轉換為主要模型所需的數值權杖輸入內容,包括 input_idsattention_mask 輸入內容。
  • 生成嵌入 (外部查詢):外部 ML.PREDICT 呼叫會使用 bqml_tutorial.all-MiniLM-L6-v2 模型。這項查詢會將內部查詢輸出內容中的 input_idsattention_mask 資料欄做為輸入內容。

SELECT 陳述式會擷取 sentence_embedding 資料欄,這是代表文字語意嵌入的 FLOAT 值陣列。

如要生成嵌入內容,請按照下列步驟操作:

  1. 前往 Cloud de Confiance 控制台的「BigQuery Studio」頁面。

    前往 Studio

  2. 在查詢編輯器中執行下列查詢。

    SELECT
    sentence_embedding
    FROM
    ML.PREDICT (MODEL `bqml_tutorial.all-MiniLM-L6-v2`,
      (
      SELECT
        input_ids, attention_mask
      FROM
        ML.PREDICT(MODEL `bqml_tutorial.tokenizer`,
          (
          SELECT
            title AS text
          FROM
            `bigquery-public-data.imdb.reviews` limit 10))));

    結果大致如下:

    +-----------------------+
    | sentence_embedding    |
    +-----------------------+
    | -0.02361682802438736  |
    | 0.02025664784014225   |
    | 0.005168713629245758  |
    | -0.026361213997006416 |
    | 0.0655381828546524    |
    | ...                   |
    +-----------------------+
    

bq

使用 bq 指令列工具的 query 指令執行查詢。這項查詢會使用 ML.PREDICT 函式,透過模型生成嵌入。

這項查詢會使用巢狀 ML.PREDICT 呼叫,直接透過權杖化工具和嵌入模型處理原始文字,如下所示:

  • 權杖化 (內部查詢):內部 ML.PREDICT 呼叫會使用 bqml_tutorial.tokenizer 模型。並以 bigquery-public-data.imdb.reviews 公開資料集的 title 欄做為 text 輸入內容。tokenizer 模型會將原始文字字串轉換為主要模型所需的數值權杖輸入內容,包括 input_idsattention_mask 輸入內容。
  • 生成嵌入 (外部查詢):外部 ML.PREDICT 呼叫會使用 bqml_tutorial.all-MiniLM-L6-v2 模型。這項查詢會將內部查詢輸出內容中的 input_idsattention_mask 資料欄做為輸入內容。

SELECT 陳述式會擷取 sentence_embedding 資料欄,這是代表文字語意嵌入的 FLOAT 值陣列。

在指令列中執行下列指令,即可執行查詢。

bq query --use_legacy_sql=false \
'SELECT
sentence_embedding
FROM
ML.PREDICT (MODEL `bqml_tutorial.all-MiniLM-L6-v2`,
  (
  SELECT
    input_ids, attention_mask
  FROM
    ML.PREDICT(MODEL `bqml_tutorial.tokenizer`,
      (
      SELECT
        title AS text
      FROM
        `bigquery-public-data.imdb.reviews` limit 10))))'

結果大致如下:

+-----------------------+
| sentence_embedding    |
+-----------------------+
| -0.02361682802438736  |
| 0.02025664784014225   |
| 0.005168713629245758  |
| -0.026361213997006416 |
| 0.0655381828546524    |
| ...                   |
+-----------------------+

BigQuery DataFrames

在嘗試這個範例之前,請按照使用 BigQuery DataFrames 的 BigQuery 快速入門導覽課程,完成 BigQuery DataFrames 設定。詳情請參閱 BigQuery DataFrames 參考文件

如要向 BigQuery 進行驗證,請設定應用程式預設憑證。 詳情請參閱「為本機開發環境設定 ADC」。

使用 predict 方法,透過 ONNX 模型生成嵌入。

import bigframes.pandas as bpd

df = bpd.read_gbq("bigquery-public-data.imdb.reviews", max_results=10)
df_pred = df.rename(columns={"title": "text"})
tokens = tokenizer.predict(df_pred)
predictions = imported_onnx_model.predict(tokens)
predictions.peek(5)

輸出結果會與下列內容相似:

Transformer 模型的輸出內容。

清除所用資源

為避免因為本教學課程所用資源,導致系統向 Google Cloud 收取費用,請刪除含有相關資源的專案,或者保留專案但刪除個別資源。

刪除專案

控制台

  1. 前往 Cloud de Confiance 控制台的「Manage resources」(管理資源) 頁面。

    前往「Manage resources」(管理資源)

  2. 在專案清單中選取要刪除的專案,然後點選「Delete」(刪除)
  3. 在對話方塊中輸入專案 ID,然後按一下 [Shut down] (關閉) 以刪除專案。

gcloud

    刪除 Cloud de Confiance 專案:

    gcloud projects delete PROJECT_ID

刪除個別資源

如要保留專案,但刪除本教學課程中使用的資源,請按照下列步驟操作:

  1. 前往 Cloud de Confiance 控制台的「BigQuery Studio」頁面。

    前往 Studio

  2. 在左側窗格中展開專案,然後按一下「資料集」

  3. 針對 bqml_tutorial 資料集,依序點按 「Open actions」(開啟動作) >「Delete」(刪除)

  4. 在「Delete dataset」(刪除資料集) 對話方塊中,按一下「Delete」(刪除) 進行確認。

  5. 如果您按照步驟手動將 Transformer 模型檔案轉換為 ONNX,請刪除 Cloud Storage bucket

後續步驟