Générer des représentations vectorielles continues de texte avec des modèles TensorFlow pré-entraînés

Ce tutoriel explique comment générer des embeddings textuels NNLM, SWIVEL et BERT dans BigQuery à l'aide de modèles TensorFlow pré-entraînés. Un embedding textuel est une représentation vectorielle dense d'un texte dont la particularité est que si deux textes sont sémantiquement similaires, leurs embeddings respectifs sont proches l'un de l'autre dans l'espace d'embedding.

Modèles NNLM, SWIVEL et BERT

La taille, la précision, l'évolutivité et les coûts des modèles NNLM, SWIVEL et BERT sont différents. Utilisez le tableau suivant pour déterminer quel modèle utiliser :

Modèle Taille du modèle Dimension d'embedding Cas d'utilisation Description
NNLM < 150 Mo 50 Phrases courtes, actualités, tweets, avis Modèle de langage de réseau de neurones
SWIVEL < 150 Mo 20 Phrases courtes, actualités, tweets, avis Algorithme d'embeddings vectoriels au niveau de la matrice
BERT ~ 200 Mo 768 Phrases courtes, actualités, tweets, avis, paragraphes courts Représentations d'encodage bidirectionnel à partir de transformateurs

Dans ce tutoriel, les modèles NNLM et SWIVEL sont des modèles TensorFlow importés, et le modèle BERT est un modèle distant sur Vertex AI.

Autorisations requises

  • Pour créer l'ensemble de données, vous devez disposer de l'autorisation Identity and Access Management (IAM) bigquery.datasets.create.

  • Pour créer le bucket, vous devez disposer de l'autorisation IAM storage.buckets.create.

  • Pour importer le modèle dans Cloud Storage, vous devez disposer des autorisations IAM storage.objects.create et storage.objects.get.

  • Pour créer la ressource de connexion, vous devez disposer des autorisations IAM suivantes :

    • bigquery.connections.create
    • bigquery.connections.get
  • Pour charger le modèle dans BigQuery ML, vous devez disposer des autorisations IAM suivantes :

    • bigquery.jobs.create
    • bigquery.models.create
    • bigquery.models.getData
    • bigquery.models.updateData
  • Pour exécuter une inférence, vous devez disposer des autorisations IAM suivantes :

    • bigquery.tables.getData sur la table d'objets
    • bigquery.models.getData sur le modèle
    • bigquery.jobs.create

Coûts

Dans ce document, vous utilisez les composants facturables suivants de 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.

Obtenez une estimation des coûts en fonction de votre utilisation prévue à l'aide du simulateur de coût. Les nouveaux utilisateurs de Google Cloud peuvent bénéficier d'un essai gratuit.

Pour en savoir plus, consultez les ressources suivantes :

Avant de commencer

  1. Connectez-vous à votre compte Google Cloud. Si vous débutez sur Google Cloud, créez un compte pour évaluer les performances de nos produits en conditions réelles. Les nouveaux clients bénéficient également de 300 $ de crédits gratuits pour exécuter, tester et déployer des charges de travail.
  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

Créer un ensemble de données

Pour créer un ensemble de données nommé tf_models_tutorial afin de stocker les modèles que vous créez, sélectionnez l'une des options suivantes :

SQL

Utilisez l'instruction CREATE SCHEMA :

  1. Dans la console Google Cloud, accédez à la page BigQuery.

    Accéder à BigQuery

  2. Dans l'éditeur de requête, saisissez l'instruction suivante :

    CREATE SCHEMA `PROJECT_ID.tf_models_tutorial`;
    

    Remplacez PROJECT_ID par l'ID du projet.

  3. Cliquez sur Exécuter.

Pour en savoir plus sur l'exécution des requêtes, consultez Exécuter une requête interactive.

bq

  1. Dans la console Google Cloud, activez Cloud Shell.

    Activer Cloud Shell

  2. Pour créer l'ensemble de données, exécutez la commande bq mk :

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

    Remplacez PROJECT_ID par l'ID du projet.

Générer et importer un modèle dans Cloud Storage

Pour obtenir des instructions plus détaillées sur la génération d'embeddings textuels à l'aide de modèles TensorFlow pré-entraînés, consultez le notebook Colab. Sinon, sélectionnez l'un des modèles suivants :

NNLM

  1. Installez la bibliothèque bigquery-ml-utils à l'aide de pip :

    pip install bigquery-ml-utils
    
  2. Générez un modèle NNLM. Le code Python suivant charge un modèle NNLM à partir de TensorFlow Hub et le prépare pour 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)
    

    Remplacez OUTPUT_MODEL_PATH par un chemin d'accès à un dossier local dans lequel vous pouvez stocker temporairement le modèle.

  3. Facultatif : imprimez la signature du modèle généré :

    import tensorflow as tf
    
    reload_embedding_model = tf.saved_model.load(OUTPUT_MODEL_PATH)
    print(reload_embedding_model.signatures["serving_default"])
    
  4. Pour copier le modèle généré à partir de votre dossier local dans un bucket Cloud Storage, utilisez la Google Cloud CLI :

    gcloud storage cp OUTPUT_MODEL_PATH gs://BUCKET_PATH/nnlm_model --recursive
    

    Remplacez BUCKET_PATH par le nom du bucket Cloud Storage dans lequel vous copiez le modèle.

SWIVEL

  1. Installez la bibliothèque bigquery-ml-utils à l'aide de pip :

    pip install bigquery-ml-utils
    
  2. Générez un modèle SWIVEL. Le code Python suivant charge un modèle SWIVEL à partir de TensorFlow Hub et le prépare pour 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)
    

    Remplacez OUTPUT_MODEL_PATH par un chemin d'accès à un dossier local dans lequel vous pouvez stocker temporairement le modèle.

  3. Facultatif : imprimez la signature du modèle généré :

    import tensorflow as tf
    
    reload_embedding_model = tf.saved_model.load(OUTPUT_MODEL_PATH)
    print(reload_embedding_model.signatures["serving_default"])
    
  4. Pour copier le modèle généré à partir de votre dossier local dans un bucket Cloud Storage, utilisez la Google Cloud CLI :

    gcloud storage cp OUTPUT_MODEL_PATH gs://BUCKET_PATH/swivel_model --recursive
    

    Remplacez BUCKET_PATH par le nom du bucket Cloud Storage dans lequel vous copiez le modèle.

BERT

  1. Installez la bibliothèque bigquery-ml-utils à l'aide de pip :

    pip install bigquery-ml-utils
    
  2. Générez un modèle BERT. Le code Python suivant charge un modèle BERT à partir de TensorFlow Hub et le prépare pour 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)
    

    Remplacez OUTPUT_MODEL_PATH par un chemin d'accès à un dossier local dans lequel vous pouvez stocker temporairement le modèle.

  3. Facultatif : imprimez la signature du modèle généré :

    import tensorflow as tf
    
    reload_embedding_model = tf.saved_model.load(OUTPUT_MODEL_PATH)
    print(reload_embedding_model.signatures["serving_default"])
    
  4. Pour copier le modèle généré à partir de votre dossier local dans un bucket Cloud Storage, utilisez la Google Cloud CLI :

    gcloud storage cp OUTPUT_MODEL_PATH gs://BUCKET_PATH/bert_model --recursive
    

    Remplacez BUCKET_PATH par le nom du bucket Cloud Storage dans lequel vous copiez le modèle.

Charger le modèle dans BigQuery

Sélectionnez l'un des modèles suivants :

NNLM

Utilisez l'instruction CREATE MODEL :

  1. Dans la console Google Cloud, accédez à la page BigQuery.

    Accéder à BigQuery

  2. Dans l'éditeur de requête, saisissez l'instruction suivante :

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

    Remplacez BUCKET_NAME par le nom du bucket que vous avez créé précédemment.

  3. Cliquez sur Exécuter.

Pour en savoir plus sur l'exécution des requêtes, consultez Exécuter une requête interactive.

SWIVEL

Utilisez l'instruction CREATE MODEL :

  1. Dans la console Google Cloud, accédez à la page BigQuery.

    Accéder à BigQuery

  2. Dans l'éditeur de requête, saisissez l'instruction suivante :

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

    Remplacez BUCKET_NAME par le nom du bucket que vous avez créé précédemment.

  3. Cliquez sur Exécuter.

Pour en savoir plus sur l'exécution des requêtes, consultez Exécuter une requête interactive.

BERT

Pour charger le modèle BERT dans BigQuery, importez le modèle BERT dans Vertex AI, déployez-le sur un point de terminaison Vertex AI, créez une connexion, puis créez un modèle distant dans BigQuery.

Pour importer le modèle BERT dans Vertex AI, procédez comme suit :

  1. Dans la console Google Cloud, accédez à la page Registre de modèles de Vertex AI.

    Accéder à la page "Registre de modèles"

  2. Cliquez sur Importer, puis procédez comme suit :

    • Dans le champ Nom, saisissez BERT.
    • Dans le champ Région, sélectionnez une région correspondant à la région de votre bucket Cloud Storage.
  3. Cliquez sur Continuer, puis procédez comme suit :

    • Dans la liste déroulante Version de framework du modèle, sélectionnez 2.8.
    • Pour Emplacement de l'artefact de modèle, saisissez le chemin d'accès au bucket Cloud Storage dans lequel vous avez stocké le fichier de modèle. Exemple : gs://BUCKET_PATH/bert_model.
  4. Cliquez sur Importer. Une fois l'importation terminée, votre modèle s'affiche sur la page Registre de modèles.

Pour déployer le modèle BERT sur un point de terminaison Vertex AI et le connecter à BigQuery, procédez comme suit :

  1. Dans la console Google Cloud, accédez à la page Registre de modèles de Vertex AI.

    Accéder à la page "Registre de modèles"

  2. Cliquez sur le nom de votre modèle.

  3. Cliquez sur Déployer et tester.

  4. Cliquez sur Déployer sur un point de terminaison.

  5. Dans le champ Nom du point de terminaison, saisissez bert_model_endpoint.

  6. Cliquez sur Continuer.

  7. Sélectionnez vos ressources de calcul.

  8. Cliquez sur Déployer.

  9. Créez une connexion de ressource Cloud BigQuery et accordez l'accès au compte de service de la connexion.

Pour créer un modèle distant basé sur le point de terminaison Vertex AI, utilisez l'instruction CREATE MODEL :

  1. Dans la console Google Cloud, accédez à la page BigQuery.

    Accéder à BigQuery

  2. Dans l'éditeur de requête, saisissez l'instruction suivante :

    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");
    

    Remplacez les éléments suivants :

    • PROJECT_ID : ID du projet
    • CONNECTION_LOCATION : emplacement de votre connexion BigQuery
    • CONNECTION_ID : ID de votre connexion BigQuery.

      Lorsque vous affichez les détails de la connexion dans la console Google Cloud, il s'agit de la valeur de la dernière section de l'ID de connexion complet affiché dans ID de connexion (par exemple, projects/myproject/locations/connection_location/connections/myconnection).

    • ENDPOINT_LOCATION : emplacement de votre point de terminaison Vertex AI Exemple: "us-central1".
    • ENDPOINT_ID : ID du point de terminaison de votre modèle

  3. Cliquez sur Exécuter.

Pour en savoir plus sur l'exécution des requêtes, consultez Exécuter une requête interactive.

Générer des embeddings textuels

Dans cette section, vous utilisez la fonction d'inférence ML.PREDICT() pour générer des embeddings textuels de la colonne review dans l'ensemble de données public bigquery-public-data.imdb.reviews. La requête limite la table à 500 lignes afin de réduire la quantité de données traitées.

NNLM

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

Le résultat ressemble à ce qui suit :

+-----------------------+----------------------------------------+
| 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)
  );

Le résultat ressemble à ce qui suit :

+----------------------+----------------------------------------+
| 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)
  );

Le résultat ressemble à ce qui suit :

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

Effectuer un nettoyage

  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.