Cómo copiar versiones de procesadores y conjuntos de datos entre proyectos

En esta página, se incluyen los pasos para copiar versiones de procesadores entrenados de Document AI de un proyecto a otro junto con el esquema del conjunto de datos y las muestras del procesador fuente al de destino. Estos pasos automatizan el proceso de importar la versión del procesador, implementarla y establecerla como la versión predeterminada en el proyecto de destino.

Antes de comenzar

  • Obtén un ID de proyecto de Google Cloud .
  • Tener el ID del procesador de Document AI
  • Tener Cloud Storage
  • Usa Python: Notebook de Jupyter (Vertex AI).
  • Necesitas permisos para otorgar acceso a la cuenta de servicio en los proyectos de origen y destino.

Procedimiento paso a paso

El procedimiento se describe en los siguientes pasos.

Paso 1: Identifica la cuenta de servicio asociada con el notebook de Vertex AI

!gcloud config list account

Resultado:

[core]
account = example@automl-project.iam.gserviceaccount.com

Your active configuration is: [default]

Paso 2: Otorga los permisos necesarios a la cuenta de servicio

En el proyecto Google Cloud que es el destino previsto para la migración, agrega la cuenta de servicio que se adquirió en el paso anterior como principal y asigna los dos roles siguientes:

  • Administrador de Document AI
  • Administrador de almacenamiento

Consulta Otorga roles a cuentas de servicio y Claves de encriptación administradas por el cliente (CMEK) para obtener más información.

processor-version-migrate-1

Para que la migración funcione, la cuenta de servicio que se usa para ejecutar este notebook debe tener lo siguiente:

  • Roles en los proyectos de origen y destino para crear el bucket del conjunto de datos, o bien crearlo si no existe, así como permisos de lectura y escritura para todos los objetos
  • Rol de editor de Document AI en el proyecto de origen, como se describe en Importa una versión del procesador.

Descarga una clave JSON para la cuenta de servicio, de modo que puedas autenticarte y autorizarte como cuenta de servicio. Para obtener más información, consulta Claves de cuentas de servicio.

Siguiente:

  1. Ve a la cuenta de servicio.
  2. Selecciona la cuenta de servicio que realizará esta tarea.
  3. Ve a la pestaña Claves, haz clic en Add Key y, luego, elige Crear clave nueva.
  4. Selecciona el tipo de clave (preferentemente JSON).
  5. Haz clic en Create y descarga el archivo en una ruta específica. processor-version-migrate-2

  6. Actualiza la ruta de acceso en la variable service_account_key del siguiente fragmento.

service_account_key='path_to_sa_key.json'

from google.oauth2 import service_account
from google.cloud import storage

# Authenticate the service account
credentials = service_account.Credentials.from_service_account_file(
    service_account_key
)

# pass this credentials variable to all client initializations
# storage_client = storage.Client(credentials=credentials)
# docai_client = documentai.DocumentProcessorServiceClient(credentials=credentials)

Paso 3: importa bibliotecas

import time
from pathlib import Path
from typing import Optional, Tuple
from google.cloud.documentai_v1beta3.services.document_service import pagers
from google.api_core.client_options import ClientOptions
from google.api_core.operation import Operation
from google.cloud import documentai_v1beta3 as documentai
from google.cloud import storage
from tqdm import tqdm

Paso 4: Ingresa los detalles

  • source_project_id: Proporciona el ID del proyecto de origen.
  • source_location: Proporciona la ubicación del procesador de origen (us o eu).
  • source_processor_id: Proporciona el Google Cloud ID del procesador de Document AI.
  • source_processor_version_to_import: Proporciona el ID de la versión del procesador de Document AI para la versión entrenada. Google Cloud
  • migrate_dataset: Proporciona este valor como True o False. Si deseas migrar el conjunto de datos del procesador de origen al procesador de destino, proporciona True; de lo contrario, proporciona False. El valor predeterminado es False.
  • source_exported_gcs_path: Proporciona la ruta de acceso de Cloud Storage para almacenar archivos JSON.
  • destination_project_id: Proporciona el ID del proyecto de destino.
  • destination_processor_id: Proporciona el ID del procesador de Document AI, ya sea "" o processor_id, del proyecto de destino. Google Cloud
source_project_id = "source-project-id"
source_location = "processor-location"
source_processor_id = "source-processor-id"
source_processor_version_to_import = "source-processor-version-id"
migrate_dataset = False  # Either True or False
source_exported_gcs_path = (
    "gs://bucket/path/to/export_dataset/"
)
destination_project_id = "< destination-project-id >"
# Give an empty string if you wish to create a new processor
destination_processor_id = ""

Paso 5: Ejecuta el código

import time
from pathlib import Path
from typing import Optional, Tuple
from google.cloud.documentai_v1beta3.services.document_service import pagers
from google.api_core.client_options import ClientOptions
from google.api_core.operation import Operation
from google.cloud import documentai_v1beta3 as documentai
from google.cloud import storage
from tqdm import tqdm

source_project_id = "source-project-id"
source_location = "processor-location"
source_processor_id = "source-processor-id"
source_processor_version_to_import = "source-processor-version-id"
migrate_dataset = False # Either True or False
source_exported_gcs_path = (
    "gs://bucket/path/to/export_dataset/"
)
destination_project_id = "< destination-project-id >"
# Give empty string if you wish to create a new processor
destination_processor_id = ""

exported_bucket_name = source_exported_gcs_path.split("/")[2]
exported_bucket_path_prefix = "/".join(source_exported_gcs_path.split("/")[3:])
destination_location = source_location

def sample_get_processor(project_id: str, processor_id: str, location: str)->Tuple[str, str]:
    """
    This function returns Processor Display Name and Type of Processor from source project

    Args:
        project_id (str): Project ID
        processor_id (str): Document AI Processor ID
        location (str): Processor Location

    Returns:
        Tuple[str, str]: Returns Processor Display name and type
    """
    client = documentai.DocumentProcessorServiceClient()
    print(
        f"Fetching processor({processor_id}) details from source project ({project_id})"
    )
    name = f"projects/{project_id}/locations/{location}/processors/{processor_id}"
    request = documentai.GetProcessorRequest(
        name=name,
    )
    response = client.get_processor(request=request)
    print(f"Processor Name: {response.name}")
    print(f"Processor Display Name: {response.display_name}")
    print(f"Processor Type: {response.type_}")
    return response.display_name, response.type_

def sample_create_processor(project_id: str, location: str, display_name: str, processor_type: str)->documentai.Processor:
    """It will create Processor in Destination project

    Args:
        project_id (str): Project ID
        location (str): Location fo processor
        display_name (str): Processor Display Name
        processor_type (str): Google Cloud Document AI Processor type

    Returns:
        documentai.Processor: Returns details abouts newly created processor
    """

    client = documentai.DocumentProcessorServiceClient()
    request = documentai.CreateProcessorRequest(
        parent=f"projects/{project_id}/locations/{location}",
        processor={
            "type_": processor_type,
            "display_name": display_name,
        },
    )
    print(f"Creating Processor in project: {project_id} in location: {location}")
    print(f"Display Name: {display_name} & Processor Type: {processor_type}")
    res = client.create_processor(request=request)
    return res

def initialize_dataset(project_id: str, processor_id: str, location: str)-> Operation:
    """It will configure dataset for target processor in destination project

    Args:
        project_id (str): Project ID
        processor_id (str): DocuemntAI Processor ID
        location (str): Processor Location

    Returns:
        Operation: An object representing a long-running operation
    """

    # opts = ClientOptions(api_endpoint=f"{location}-documentai.googleapis.com")
    client = documentai.DocumentServiceClient()  # client_options=opts
    dataset = documentai.types.Dataset