사전 학습된 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.create
및storage.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: You incur costs for the queries that you run in BigQuery.
- BigQuery ML: You incur costs for the model that you create and the inference that you perform in BigQuery ML.
- Cloud Storage: You incur costs for the objects that you store in Cloud Storage.
- Vertex AI: If you follow the instructions for generating the BERT model, then you incur costs for deploying the model to an endpoint.
프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요.
자세한 내용은 다음 리소스를 참조하세요.
시작하기 전에
- 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.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the BigQuery, BigQuery Connection, and Vertex AI APIs.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the BigQuery, BigQuery Connection, and Vertex AI APIs.
데이터 세트 만들기
만든 모델을 저장할 tf_models_tutorial
이라는 데이터 세트를 만들려면 다음 옵션 중 하나를 선택합니다.
SQL
CREATE SCHEMA
문을 사용합니다.
Google Cloud 콘솔에서 BigQuery 페이지로 이동합니다.
쿼리 편집기에서 다음 문을 입력합니다.
CREATE SCHEMA `PROJECT_ID.tf_models_tutorial`;
PROJECT_ID
를 프로젝트 ID로 바꿉니다.실행을 클릭합니다.
쿼리를 실행하는 방법에 대한 자세한 내용은 대화형 쿼리 실행을 참조하세요.
bq
Google Cloud 콘솔에서 Cloud Shell을 활성화합니다.
데이터 세트를 만들려면
bq mk
명령어를 실행합니다.bq mk --dataset --location=us PROJECT_ID:tf_models_tutorial
PROJECT_ID
를 프로젝트 ID로 바꿉니다.
모델 생성 및 Cloud Storage에 업로드
사전 학습된 TensorFlow 모델을 사용하여 텍스트 임베딩을 생성하는 방법에 대한 자세한 안내는 Colab 노트북을 참조하세요. 그렇지 않으면 다음 모델 중 하나를 선택합니다.
NNLM
pip를 사용하여
bigquery-ml-utils
라이브러리를 설치합니다.pip install bigquery-ml-utils
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
를 모델을 임시로 저장할 수 있는 로컬 폴더의 경로로 바꿉니다.선택사항: 생성된 모델의 서명을 출력합니다.
import tensorflow as tf reload_embedding_model = tf.saved_model.load(OUTPUT_MODEL_PATH) print(reload_embedding_model.signatures["serving_default"])
생성된 모델을 로컬 폴더에서 Cloud Storage 버킷으로 복사하려면 Google Cloud CLI를 사용합니다.
gcloud storage cp OUTPUT_MODEL_PATH gs://BUCKET_PATH/nnlm_model --recursive
BUCKET_PATH
를 모델을 복사할 Cloud Storage 버킷의 이름으로 바꿉니다.
SWIVEL
pip를 사용하여
bigquery-ml-utils
라이브러리를 설치합니다.pip install bigquery-ml-utils
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
를 모델을 임시로 저장할 수 있는 로컬 폴더의 경로로 바꿉니다.선택사항: 생성된 모델의 서명을 출력합니다.
import tensorflow as tf reload_embedding_model = tf.saved_model.load(OUTPUT_MODEL_PATH) print(reload_embedding_model.signatures["serving_default"])
생성된 모델을 로컬 폴더에서 Cloud Storage 버킷으로 복사하려면 Google Cloud CLI를 사용합니다.
gcloud storage cp OUTPUT_MODEL_PATH gs://BUCKET_PATH/swivel_model --recursive
BUCKET_PATH
를 모델을 복사할 Cloud Storage 버킷의 이름으로 바꿉니다.
BERT
pip를 사용하여
bigquery-ml-utils
라이브러리를 설치합니다.pip install bigquery-ml-utils
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
를 모델을 임시로 저장할 수 있는 로컬 폴더의 경로로 바꿉니다.선택사항: 생성된 모델의 서명을 출력합니다.
import tensorflow as tf reload_embedding_model = tf.saved_model.load(OUTPUT_MODEL_PATH) print(reload_embedding_model.signatures["serving_default"])
생성된 모델을 로컬 폴더에서 Cloud Storage 버킷으로 복사하려면 Google Cloud CLI를 사용합니다.
gcloud storage cp OUTPUT_MODEL_PATH gs://BUCKET_PATH/bert_model --recursive
BUCKET_PATH
를 모델을 복사할 Cloud Storage 버킷의 이름으로 바꿉니다.
BigQuery에 모델 로드
다음 모델 중 하나를 선택합니다.
NNLM
CREATE MODEL
문을 사용합니다.
Google Cloud 콘솔에서 BigQuery 페이지로 이동합니다.
쿼리 편집기에서 다음 문을 입력합니다.
CREATE OR REPLACE MODEL
tf_models_tutorial.nnlm_model
OPTIONS ( model_type = 'TENSORFLOW', model_path = 'gs://BUCKET_NAME/nnlm_model/*');BUCKET_NAME
을 이전에 만든 버킷의 이름으로 바꿉니다.실행을 클릭합니다.
쿼리를 실행하는 방법에 대한 자세한 내용은 대화형 쿼리 실행을 참조하세요.
SWIVEL
CREATE MODEL
문을 사용합니다.
Google Cloud 콘솔에서 BigQuery 페이지로 이동합니다.
쿼리 편집기에서 다음 문을 입력합니다.
CREATE OR REPLACE MODEL
tf_models_tutorial.swivel_model
OPTIONS ( model_type = 'TENSORFLOW', model_path = 'gs://BUCKET_NAME/swivel_model/*');BUCKET_NAME
을 이전에 만든 버킷의 이름으로 바꿉니다.실행을 클릭합니다.
쿼리를 실행하는 방법에 대한 자세한 내용은 대화형 쿼리 실행을 참조하세요.
BERT
BERT 모델을 BigQuery에 로드하기 위해 BERT 모델을 Vertex AI로 가져오고, 모델을 Vertex AI 엔드포인트에 배포하고, 연결을 만든 후 BigQuery에서 원격 모델을 만듭니다.
BERT 모델을 Vertex AI로 가져오려면 다음 단계를 수행합니다.
Google Cloud 콘솔에서 Vertex AI Model Registry 페이지로 이동합니다.
가져오기를 클릭한 후 다음을 수행합니다.
- 이름에
BERT
를 입력합니다. - 리전에서 Cloud Storage 버킷의 리전과 일치하는 리전을 선택합니다.
- 이름에
계속을 클릭한 후 다음을 수행합니다.
- 모델 프레임워크 버전에
2.8
을 선택합니다. - 모델 아티팩트 위치에 모델 파일을 저장한 Cloud Storage 버킷의 경로를 입력합니다. 예를 들면
gs://BUCKET_PATH/bert_model
입니다.
- 모델 프레임워크 버전에
가져오기를 클릭합니다. 가져오기가 완료되면 모델 레지스트리 페이지에 모델이 나타납니다.
BERT 모델을 Vertex AI 엔드포인트에 배포하고 BigQuery에 연결하려면 다음 단계를 수행합니다.
Google Cloud 콘솔에서 Vertex AI Model Registry 페이지로 이동합니다.
모델의 이름을 클릭합니다.
배포 및 테스트를 클릭합니다.
엔드포인트에 배포를 클릭합니다.
엔드포인트 이름에
bert_model_endpoint
를 입력합니다.계속을 클릭합니다.
컴퓨팅 리소스를 선택합니다.
배포를 클릭합니다.
BigQuery Cloud 리소스 연결을 만들고 연결의 서비스 계정에 액세스 권한을 부여합니다.
Vertex AI 엔드포인트를 기반으로 원격 모델을 만들려면 CREATE MODEL
문을 사용합니다.
Google Cloud 콘솔에서 BigQuery 페이지로 이동합니다.
쿼리 편집기에서 다음 문을 입력합니다.
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 연결의 IDGoogle Cloud 콘솔에서 연결 세부정보를 볼 때, 이 값은 연결 ID에 표시되는 정규화된 연결 ID의 마지막 섹션에 있는 값입니다(예:
projects/myproject/locations/connection_location/connections/myconnection
).ENDPOINT_LOCATION
: Vertex AI 엔드포인트의 위치입니다. 예를 들면 'us-central1'입니다.ENDPOINT_ID
: 모델 엔드포인트의 ID입니다.
실행을 클릭합니다.
쿼리를 실행하는 방법에 대한 자세한 내용은 대화형 쿼리 실행을 참조하세요.
텍스트 임베딩 생성
이 섹션에서는 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 | | | | ... | | | +--------------+---------------------+----------------------------------------+
삭제
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.