사전 학습된 TensorFlow 모델을 사용하여 텍스트 임베딩

이 튜토리얼에서는 사전 학습된 TensorFlow 모델을 사용하여 BigQuery에서 NNLM, SWIVEL, BERT 텍스트 임베딩을 생성하는 방법을 보여줍니다. 텍스트 임베딩은 2개의 텍스트가 의미론적으로 유사할 때 해당 임베딩이 임베딩 벡터 공간에서 보다 가까이 배치되는 것과 같은 텍스트의 밀집 벡터 표현입니다.

NNLM, SWIVEL, BERT 모델

NNLM, SWIVEL, BERT 모델은 크기, 정확도, 확장성 및 비용이 각기 다릅니다. 다음 표는 사용할 모델을 결정하는 데 도움이 됩니다.

모델 모델 크기 임베딩 차원 사용 사례 설명
NNLM 150MB 미만 50 짧은 문구, 뉴스, 트윗, 리뷰 신경망 언어 모델
SWIVEL 150MB 미만 20 짧은 문구, 뉴스, 트윗, 리뷰 서브행렬 전체 벡터 임베딩 학습자
BERT 200MB 이하 768 짧은 문구, 뉴스, 트윗, 리뷰, 짧은 단락 Transformer의 양방향 인코더 표현

이 튜토리얼에서 NNLM 및 SWIVEL 모델은 가져온 TensorFlow 모델이고 BERT 모델은 Vertex AI의 원격 모델입니다.

필수 권한

  • 데이터 세트를 만들려면 bigquery.datasets.create Identity and Access Management(IAM) 권한이 필요합니다.

  • 버킷을 만들려면 storage.buckets.create IAM 권한이 필요합니다.

  • 모델을 Cloud Storage로 업로드하려면 storage.objects.createstorage.objects.get IAM 권한이 필요합니다.

  • 연결 리소스를 만들려면 다음 IAM 권한이 필요합니다.

    • bigquery.connections.create
    • bigquery.connections.get
  • 모델을 BigQuery ML에 로드하려면 다음 IAM 권한이 필요합니다.

    • bigquery.jobs.create
    • bigquery.models.create
    • bigquery.models.getData
    • bigquery.models.updateData
  • 추론을 실행하려면 다음 IAM 권한이 필요합니다.

    • 객체 테이블에 대한 bigquery.tables.getData
    • 모델에 대한 bigquery.models.getData
    • bigquery.jobs.create

비용

이 문서에서는 비용이 청구될 수 있는 다음과 같은 Google Cloud 구성요소를 사용합니다.

  • BigQuery: BigQuery에서 실행하는 쿼리에 대해 비용이 발생합니다.
  • BigQuery ML: BigQuery ML에서 생성한 모델과 수행한 추론에 대해 비용이 발생합니다.
  • Cloud Storage: Cloud Storage에 저장한 객체에 대해 비용이 발생합니다.
  • Vertex AI: BERT 모델 생성 안내를 따를 경우 모델을 엔드포인트에 배포하는 데 비용이 발생합니다.

프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요. Google Cloud를 처음 사용하는 사용자는 무료 체험판을 사용할 수 있습니다.

자세한 내용은 다음 리소스를 참조하세요.

시작하기 전에

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

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

    Enable the APIs

  5. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  6. Make sure that billing is enabled for your Google Cloud project.

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

    Enable the APIs

데이터 세트 만들기

만든 모델을 저장할 tf_models_tutorial이라는 데이터 세트를 만들려면 다음 옵션 중 하나를 선택합니다.

SQL

CREATE SCHEMA을 사용합니다.

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

    BigQuery로 이동

  2. 쿼리 편집기에서 다음 문을 입력합니다.

    CREATE SCHEMA `PROJECT_ID.tf_models_tutorial`;
    

    PROJECT_ID를 프로젝트 ID로 바꿉니다.

  3. 실행을 클릭합니다.

쿼리를 실행하는 방법에 대한 자세한 내용은 대화형 쿼리 실행을 참조하세요.

bq

  1. Google Cloud 콘솔에서 Cloud Shell을 활성화합니다.

    Cloud Shell 활성화

  2. 데이터 세트를 만들려면 bq mk 명령어를 실행합니다.

    bq mk --dataset --location=us PROJECT_ID:tf_models_tutorial
    

    PROJECT_ID를 프로젝트 ID로 바꿉니다.

모델 생성 및 Cloud Storage에 업로드

사전 학습된 TensorFlow 모델을 사용하여 텍스트 임베딩을 생성하는 방법에 대한 자세한 안내는 Colab 노트북을 참조하세요. 그렇지 않으면 다음 모델 중 하나를 선택합니다.

NNLM

  1. pip를 사용하여 bigquery-ml-utils 라이브러리를 설치합니다.

    pip install bigquery-ml-utils
    
  2. NNLM 모델을 생성합니다. 다음 Python 코드는 TensorFlow 허브에서 NNLM 모델을 로드하고 BigQuery에 사용할 수 있도록 준비합니다.

    from bigquery_ml_utils import model_generator
    
    # Establish an instance of TextEmbeddingModelGenerator.
    text_embedding_model_generator = model_generator.TextEmbeddingModelGenerator()
    
    # Generate an NNLM model.
    text_embedding_model_generator.generate_text_embedding_model('nnlm', OUTPUT_MODEL_PATH)
    

    OUTPUT_MODEL_PATH를 모델을 임시로 저장할 수 있는 로컬 폴더의 경로로 바꿉니다.

  3. 선택사항: 생성된 모델의 서명을 출력합니다.

    import tensorflow as tf
    
    reload_embedding_model = tf.saved_model.load(OUTPUT_MODEL_PATH)
    print(reload_embedding_model.signatures["serving_default"])
    
  4. 생성된 모델을 로컬 폴더에서 Cloud Storage 버킷으로 복사하려면 gsutil 도구를 사용합니다.

    gsutil cp -r OUTPUT_MODEL_PATH gs://BUCKET_PATH/nnlm_model
    

    BUCKET_PATH를 모델을 복사할 Cloud Storage 버킷의 이름으로 바꿉니다.

SWIVEL

  1. pip를 사용하여 bigquery-ml-utils 라이브러리를 설치합니다.

    pip install bigquery-ml-utils
    
  2. SWIVEL 모델을 생성합니다. 다음 Python 코드는 TensorFlow 허브에서 SWIVEL 모델을 로드하고 BigQuery에 맞게 준비합니다.

    from bigquery_ml_utils import model_generator
    
    # Establish an instance of TextEmbeddingModelGenerator.
    text_embedding_model_generator = model_generator.TextEmbeddingModelGenerator()
    
    # Generate a SWIVEL model.
    text_embedding_model_generator.generate_text_embedding_model('swivel', OUTPUT_MODEL_PATH)
    

    OUTPUT_MODEL_PATH를 모델을 임시로 저장할 수 있는 로컬 폴더의 경로로 바꿉니다.

  3. 선택사항: 생성된 모델의 서명을 출력합니다.

    import tensorflow as tf
    
    reload_embedding_model = tf.saved_model.load(OUTPUT_MODEL_PATH)
    print(reload_embedding_model.signatures["serving_default"])
    
  4. 생성된 모델을 로컬 폴더에서 Cloud Storage 버킷으로 복사하려면 gsutil 도구를 사용합니다.

    gsutil cp -r OUTPUT_MODEL_PATH gs://BUCKET_PATH/swivel_model
    

    BUCKET_PATH를 모델을 복사할 Cloud Storage 버킷의 이름으로 바꿉니다.

BERT

  1. pip를 사용하여 bigquery-ml-utils 라이브러리를 설치합니다.

    pip install bigquery-ml-utils
    
  2. BERT 모델을 생성합니다. 다음 Python 코드는 TensorFlow 허브에서 BERT 모델을 로드하고 BigQuery에 사용할 수 있도록 준비합니다.

    from bigquery_ml_utils import model_generator
    
    # Establish an instance of TextEmbeddingModelGenerator.
    text_embedding_model_generator = model_generator.TextEmbeddingModelGenerator()
    
    # Generate a BERT model.
    text_embedding_model_generator.generate_text_embedding_model('bert', OUTPUT_MODEL_PATH)
    

    OUTPUT_MODEL_PATH를 모델을 임시로 저장할 수 있는 로컬 폴더의 경로로 바꿉니다.

  3. 선택사항: 생성된 모델의 서명을 출력합니다.

    import tensorflow as tf
    
    reload_embedding_model = tf.saved_model.load(OUTPUT_MODEL_PATH)
    print(reload_embedding_model.signatures["serving_default"])
    
  4. 생성된 모델을 로컬 폴더에서 Cloud Storage 버킷으로 복사하려면 gsutil 도구를 사용합니다.

    gsutil cp -r OUTPUT_MODEL_PATH gs://BUCKET_PATH/bert_model
    

    BUCKET_PATH를 모델을 복사할 Cloud Storage 버킷의 이름으로 바꿉니다.

BigQuery에 모델 로드

다음 모델 중 하나를 선택합니다.

NNLM

CREATE MODEL을 사용합니다.

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

    BigQuery로 이동

  2. 쿼리 편집기에서 다음 문을 입력합니다.

    CREATE OR REPLACE MODEL tf_models_tutorial.nnlm_model
    OPTIONS (
      model_type = 'TENSORFLOW',
      model_path = 'gs://BUCKET_NAME/nnlm_model/*');
    

    BUCKET_NAME을 이전에 만든 버킷의 이름으로 바꿉니다.

  3. 실행을 클릭합니다.

쿼리를 실행하는 방법에 대한 자세한 내용은 대화형 쿼리 실행을 참조하세요.

SWIVEL

CREATE MODEL을 사용합니다.

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

    BigQuery로 이동

  2. 쿼리 편집기에서 다음 문을 입력합니다.

    CREATE OR REPLACE MODEL tf_models_tutorial.swivel_model
    OPTIONS (
      model_type = 'TENSORFLOW',
      model_path = 'gs://BUCKET_NAME/swivel_model/*');
    

    BUCKET_NAME을 이전에 만든 버킷의 이름으로 바꿉니다.

  3. 실행을 클릭합니다.

쿼리를 실행하는 방법에 대한 자세한 내용은 대화형 쿼리 실행을 참조하세요.

BERT

BERT 모델을 BigQuery에 로드하기 위해 BERT 모델을 Vertex AI로 가져오고, 모델을 Vertex AI 엔드포인트에 배포하고, 연결을 만든 후 BigQuery에서 원격 모델을 만듭니다.

BERT 모델을 Vertex AI로 가져오려면 다음 단계를 수행합니다.

  1. Google Cloud 콘솔에서 Vertex AI Model Registry 페이지로 이동합니다.

    Model Registry로 이동

  2. 가져오기를 클릭한 후 다음을 수행합니다.

    • 이름BERT를 입력합니다.
    • 리전에서 Cloud Storage 버킷의 리전과 일치하는 리전을 선택합니다.
  3. 계속을 클릭한 후 다음을 수행합니다.

    • 모델 프레임워크 버전2.8을 선택합니다.
    • 모델 아티팩트 위치에 모델 파일을 저장한 Cloud Storage 버킷의 경로를 입력합니다. 예를 들면 gs://BUCKET_PATH/bert_model입니다.
  4. 가져오기를 클릭합니다. 가져오기가 완료되면 모델 레지스트리 페이지에 모델이 나타납니다.

BERT 모델을 Vertex AI 엔드포인트에 배포하고 BigQuery에 연결하려면 다음 단계를 수행합니다.

  1. Google Cloud 콘솔에서 Vertex AI Model Registry 페이지로 이동합니다.

    Model Registry로 이동

  2. 모델의 이름을 클릭합니다.

  3. 배포 및 테스트를 클릭합니다.

  4. 엔드포인트에 배포를 클릭합니다.

  5. 엔드포인트 이름bert_model_endpoint를 입력합니다.

  6. 계속을 클릭합니다.

  7. 컴퓨팅 리소스를 선택합니다.

  8. 배포를 클릭합니다.

  9. BigQuery Cloud 리소스 연결을 만들고 연결의 서비스 계정에 액세스 권한을 부여합니다.

Vertex AI 엔드포인트를 기반으로 원격 모델을 만들려면 CREATE MODEL을 사용합니다.

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

    BigQuery로 이동

  2. 쿼리 편집기에서 다음 문을 입력합니다.

    CREATE OR REPLACE MODEL tf_models_tutorial.bert_model
    INPUT(content STRING)
    OUTPUT(embedding ARRAY<FLOAT64>)
    REMOTE WITH CONNECTION `PROJECT_ID.CONNECTION_LOCATION.CONNECTION_ID`
    OPTIONS (
      ENDPOINT = "https://ENDPOINT_LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/ENDPOINT_LOCATION/endpoints/ENDPOINT_ID");
    

    다음을 바꿉니다.

    • PROJECT_ID: 프로젝트 ID입니다.
    • CONNECTION_LOCATION: BigQuery 연결의 위치입니다.
    • CONNECTION_ID: BigQuery 연결 ID

      Google Cloud 콘솔에서 연결 세부정보를 볼 때, 이 값은 연결 ID에 표시되는 정규화된 연결 ID의 마지막 섹션에 있는 값입니다(예: projects/myproject/locations/connection_location/connections/myconnection).

    • ENDPOINT_LOCATION: Vertex AI 엔드포인트의 위치입니다. 예를 들면 'us-central1'입니다.
    • ENDPOINT_ID: 모델 엔드포인트의 ID입니다.

  3. 실행을 클릭합니다.

쿼리를 실행하는 방법에 대한 자세한 내용은 대화형 쿼리 실행을 참조하세요.

텍스트 임베딩 생성

이 섹션에서는 ML.PREDICT() 추론 함수를 사용하여 공개 데이터 세트 bigquery-public-data.imdb.reviews에서 review 열의 텍스트 임베딩을 생성합니다. 이 쿼리는 처리되는 데이터 양을 제한하기 위해 테이블을 500개 행으로 제한합니다.

NNLM

SELECT
  *
FROM
  ML.PREDICT(
    MODEL `tf_models_tutorial.nnlm_model`,
    (
    SELECT
      review AS content
    FROM
      `bigquery-public-data.imdb.reviews`
    LIMIT
      500)
  );

결과는 다음과 비슷합니다.

+-----------------------+----------------------------------------+
| embedding             | content                                |
+-----------------------+----------------------------------------+
|  0.08599445223808289  | Isabelle Huppert must be one of the... |
| -0.04862852394580841  |                                        |
| -0.017750458791851997 |                                        |
|  0.8658871650695801   |                                        |
| ...                   |                                        |
+-----------------------+----------------------------------------+

SWIVEL

SELECT
  *
FROM
  ML.PREDICT(
    MODEL `tf_models_tutorial.swivel_model`,
    (
    SELECT
      review AS content
    FROM
      `bigquery-public-data.imdb.reviews`
    LIMIT
      500)
  );

결과는 다음과 비슷합니다.

+----------------------+----------------------------------------+
| embedding            | content                                |
+----------------------+----------------------------------------+
|  2.5952553749084473  | Isabelle Huppert must be one of the... |
| -4.015787601470947   |                                        |
|  3.6275434494018555  |                                        |
| -6.045154333114624   |                                        |
| ...                  |                                        |
+----------------------+----------------------------------------+

BERT

SELECT
  *
FROM
  ML.PREDICT(
    MODEL `tf_models_tutorial.bert_model`,
    (
    SELECT
      review AS content
    FROM
      `bigquery-public-data.imdb.reviews`
    LIMIT
      500)
  );

결과는 다음과 비슷합니다.

+--------------+---------------------+----------------------------------------+
| embedding    | remote_model_status | content                                |
+--------------+---------------------+----------------------------------------+
| -0.694072425 | null                | Isabelle Huppert must be one of the... |
|  0.439208865 |                     |                                        |
|  0.99988997  |                     |                                        |
| -0.993487895 |                     |                                        |
| ...          |                     |                                        |
+--------------+---------------------+----------------------------------------+

삭제

  1. In the Google 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.