ONNX 형식의 트랜스포머 모델로 임베딩 생성

이 튜토리얼에서는 변환기 모델을 Open Neural Network Exchange (ONNX) 형식으로 내보내고, ONNX 모델을 BigQuery 데이터 세트로 가져온 후, 모델을 사용하여 SQL 쿼리에서 임베딩을 생성하는 방법을 보여줍니다.

이 튜토리얼에서는 sentence-transformers/all-MiniLM-L6-v2 모델을 사용합니다. 이 문장 트랜스포머 모델은 문장 임베딩을 생성할 때 빠르고 효과적인 성능으로 알려져 있습니다. 문장 임베딩은 텍스트의 기본 의미를 포착하여 시맨틱 검색, 클러스터링, 문장 유사성과 같은 작업을 지원합니다.

ONNX는 모든 머신러닝(ML) 프레임워크를 나타내도록 설계된 균일한 형식을 제공합니다. ONNX에 대한 BigQuery ML 지원을 통해 다음을 수행할 수 있습니다.

  • 원하는 프레임워크를 사용하여 모델을 학습시키기
  • ONNX 모델 형식으로 모델 변환
  • ONNX 모델을 BigQuery로 가져오고 BigQuery ML을 사용하여 예측 수행

트랜스포머 모델 파일을 ONNX로 변환

원하는 경우 이 섹션의 단계에 따라 sentence-transformers/all-MiniLM-L6-v2 모델과 토큰화 도구를 ONNX로 수동으로 변환할 수 있습니다. 그렇지 않은 경우 이미 변환된 공개 gs://cloud-samples-data Cloud Storage 버킷의 샘플 파일을 사용할 수 있습니다.

파일을 수동으로 변환하려면 Python이 설치된 로컬 명령줄 환경이 있어야 합니다. Python 설치에 관한 자세한 내용은 Python 다운로드를 참고하세요.

트랜스포머 모델을 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. 모델 내보내기 --model 인수는 Hugging Face 모델 ID를 지정합니다. --opset 인수는 ONNXRuntime 라이브러리 버전을 지정하며 BigQuery에서 지원하는 ONNXRuntime 라이브러리와의 호환성을 유지하기 위해 17로 설정됩니다.

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

모델 파일이 all-MiniLM-L6-v2 디렉터리에 model.onnx으로 내보내집니다.

트랜스포머 모델에 양자화 적용

Optimum CLI를 사용하여 내보낸 트랜스포머 모델에 양자화를 적용하여 모델 크기를 줄이고 추론 속도를 높입니다. 자세한 내용은 양자화를 참고하세요.

모델에 양자화를 적용하려면 명령줄에서 다음 명령어를 실행합니다.

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 형식의 트랜스포머 모델을 사용하여 임베딩을 생성하려면 일반적으로 토큰화 도구를 사용하여 모델에 대한 두 입력인 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에 업로드

트랜스포머 모델과 토큰 변환기를 변환한 후 다음을 실행합니다.

데이터 세트 만들기

ML 모델을 저장할 BigQuery 데이터 세트를 만듭니다.

콘솔

  1. Google Cloud 콘솔에서 BigQuery 페이지로 이동합니다.

    BigQuery 페이지로 이동

  2. 탐색기 창에서 프로젝트 이름을 클릭합니다.

  3. 작업 보기 > 데이터 세트 만들기를 클릭합니다.

  4. 데이터 세트 만들기 페이지에서 다음을 수행합니다.

    • 데이터 세트 IDbqml_tutorial를 입력합니다.

    • 위치 유형에 대해 멀티 리전을 선택한 다음 US(미국 내 여러 리전)를 선택합니다.

    • 나머지 기본 설정은 그대로 두고 데이터 세트 만들기를 클릭합니다.

bq

새 데이터 세트를 만들려면 --location 플래그와 함께 bq mk 명령어를 실행합니다. 사용할 수 있는 전체 파라미터 목록은 bq mk --dataset 명령어 참조를 확인하세요.

  1. 데이터 위치가 US로 설정되고 설명이 BigQuery ML tutorial datasetbqml_tutorial 데이터 세트를 만듭니다.

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

    --dataset 플래그를 사용하는 대신 이 명령어는 -d 단축키를 사용합니다. -d--dataset를 생략하면 이 명령어는 기본적으로 데이터 세트를 만듭니다.

  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. Google Cloud 콘솔에서 BigQuery Studio를 엽니다.

    BigQuery 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_PATHgs://cloud-samples-data/bigquery/ml/onnx/all-MiniLM-L6-v2/tokenizer.onnx로 바꿉니다.

    작업이 완료되면 쿼리 결과 창에 Successfully created model named tokenizer과 유사한 메시지가 표시됩니다.

  3. 모델로 이동을 클릭하여 세부정보 창을 엽니다.

  4. 특성 열 섹션을 검토하여 모델 입력을 확인하고 라벨 열을 검토하여 모델 출력을 확인합니다.

    `토큰화 도구 모델

  5. 쿼리 편집기에서 다음 CREATE MODEL 문을 실행하여 all-MiniLM-L6-v2 모델을 만듭니다.

     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_PATHgs://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_PATHgs://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_PATHgs://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 메서드를 사용하여 모델을 가져옵니다.요청 본문의 QueryRequest 리소스query 매개변수를 CREATE MODEL 문으로 채웁니다.

  1. 다음 query 매개변수 값을 사용하여 tokenizer 모델을 만듭니다.

    {
    "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_PATHgs://cloud-samples-data/bigquery/ml/onnx/all-MiniLM-L6-v2/tokenizer.onnx로 바꿉니다.
  2. 다음 query 매개변수 값을 사용하여 all-MiniLM-L6-v2 모델을 만듭니다.

    {
    "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_PATHgs://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_PATHgs://cloud-samples-data/bigquery/ml/onnx/all-MiniLM-L6-v2/tokenizer.onnx로 바꿉니다.
  • TRANSFORMER_BUCKET_PATH를 Cloud Storage에 업로드한 모델의 경로로 바꿉니다. 샘플 모델을 사용하는 경우 TRANSFORMER_BUCKET_PATHgs://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 문은 텍스트의 시맨틱 삽입을 나타내는 FLOAT 값의 배열인 sentence_embedding 열을 가져옵니다.

  1. Google Cloud 콘솔에서 BigQuery Studio를 엽니다.

    BigQuery 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 문은 텍스트의 시맨틱 삽입을 나타내는 FLOAT 값의 배열인 sentence_embedding 열을 가져옵니다.

명령줄에서 다음 명령어를 실행하여 쿼리를 실행합니다.

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)

출력은 다음과 비슷합니다.

트랜스포머 모델의 출력입니다.