Si tienes problemas para ejecutar tu trabajo de Dataflow con TPU, sigue estos pasos para solucionar el problema.
Soluciona problemas de tu imagen de contenedor
Puede ser útil depurar el software de tu contenedor y de la TPU en una VM independiente. Puedes depurar con una VM creada por un grupo de nodos de GKE o en una VM de trabajador de Dataflow en ejecución.
Depura con una VM independiente
Para depurar tu contenedor en una VM independiente, puedes crear un grupo de nodos de GKE que use la misma VM de TPU para la experimentación local.
Por ejemplo, crear un grupo de nodos de GKE con un dispositivo TPU V5 Lite en us-west1-c
se vería de la siguiente manera:
Crear un clúster de GKE
gcloud container clusters create TPU_CLUSTER_NAME \ --project PROJECT_ID \ --release-channel=stable \ --scopes=cloud-platform \ --enable-ip-alias \ --location us-west1-c
Crea un grupo de nodos de GKE.
gcloud container node-pools create TPU_NODE_POOL_NAME \ --project PROJECT_ID \ --location=us-west1-c \ --cluster=TPU_CLUSTER_NAME \ --node-locations=us-west1-c \ --machine-type=ct5lp-hightpu-1t \ --num-nodes=1 \ [ --reservation RESERVATION_NAME \ --reservation-affinity=specific ]
Busca el nombre de la VM del nodo TPU en el grupo de nodos en la IU de GKE o con el siguiente comando.
gcloud compute instances list --filter='metadata.kube-labels:"cloud.google.com/gke-nodepool=TPU_NODEPOOL_NAME"'
Conéctate a una VM creada por el grupo de nodos de GKE con SSH:
gcloud compute ssh --zone "us-west1-c" "VM_NAME" --project PROJECT_ID
Después de conectarte a una VM con SSH, configura Docker para el registro de Artifact Registry que usas.
docker-credential-gcr configure-docker --registries=us-west1-docker.pkg.dev
Luego, inicia un contenedor desde la imagen que usas.
docker run --privileged --network=host -it --rm --entrypoint=/bin/bash IMAGE_NAME
Dentro del contenedor, prueba que se pueda acceder a las TPU.
Por ejemplo, si tienes una imagen que usa PyTorch para utilizar TPUs, abre un intérprete de Python:
python3
Luego, realiza un cálculo en un dispositivo de TPU:
import torch import torch_xla.core.xla_model as xm dev = xm.xla_device() t1 = torch.randn(3,3,device=dev) t2 = torch.randn(3,3,device=dev) print(t1 + t2)
Resultado de muestra:
>>> tensor([[ 0.3355, -1.4628, -3.2610], >>> [-1.4656, 0.3196, -2.8766], >>> [ 0.8667, -1.5060, 0.7125]], device='xla:0')
Si falla el cálculo, es posible que la imagen no esté configurada correctamente.
Por ejemplo, es posible que debas configurar las variables de entorno necesarias en el Dockerfile de la imagen. Para confirmar, vuelve a intentar el cálculo después de configurar las variables de entorno de forma manual de la siguiente manera:
export TPU_SKIP_MDS_QUERY=1 # Don't query metadata export TPU_HOST_BOUNDS=1,1,1 # There's only one host export TPU_CHIPS_PER_HOST_BOUNDS=1,1,1 # 1 chips per host export TPU_WORKER_HOSTNAMES=localhost export TPU_WORKER_ID=0 # Always 0 for single-host TPUs export TPU_ACCELERATOR_TYPE=v5litepod-1 # Since we use v5e 1x1 accelerator.
Si faltan dependencias de PyTorch o LibTPU, puedes volver a intentar el cálculo después de instalarlas con el siguiente comando:
# Install PyTorch with TPU support pip install torch torch_xla[tpu] torchvision -f https://storage.googleapis.com/libtpu-releases/index.html
Depura con una VM de Dataflow
Como alternativa, puedes conectarte a la instancia de VM de trabajador de Dataflow con SSH mientras se ejecuta un trabajo. Dado que las VMs de trabajador de Dataflow se apagan después de que se completa la canalización, es posible que debas aumentar artificialmente el tiempo de ejecución realizando un cálculo que espere durante un período prolongado.
Dado que un dispositivo TPU no se puede compartir entre varios procesos, es posible que debas ejecutar una canalización que no realice ningún cálculo en una TPU.
Para encontrar una VM para el trabajo de TPU en ejecución, busca el ID del trabajo de Dataflow en la barra de búsqueda de la consola de Google Cloud o usa el siguiente comando de
gcloud
:gcloud compute instances list --project PROJECT_ID --filter "STATUS='RUNNING' AND description ~ 'Created for Dataflow job: JOB_ID'"
Después de conectarte a una VM con TPU a través de SSH, inicia un contenedor desde la imagen que usas. Para ver un ejemplo, consulta Depura con una VM independiente.
Dentro del contenedor, vuelve a configurar los parámetros de la TPU y, luego, instala las bibliotecas necesarias para probar tu configuración. Para ver un ejemplo, consulta Depura con una VM independiente.
Los trabajadores no inician
Antes de solucionar problemas, verifica que las siguientes opciones de canalización estén configuradas correctamente:
- la opción
--dataflow_service_option=worker_accelerator
- la opción
--worker_zone
- la opción
--machine_type
Verifica si los registros de la consola muestran que los trabajadores se están iniciando, pero el trabajo falla con un mensaje similar al siguiente:
Workflow failed. Causes: The Dataflow job appears to be stuck because no worker
activity has been seen in the last 25m.
La causa de estos problemas puede estar relacionada con la capacidad o con problemas de inicio de los trabajadores.
Capacidad: Si usas capacidad de TPU a pedido o una reserva agotada, es posible que no se inicien nuevas canalizaciones hasta que haya capacidad disponible. Si usas una reserva, verifica su capacidad restante en la página Compute Reservations de laGoogle Cloud consola o con el siguiente comando:
gcloud compute reservations describe RESERVATION_NAME --zone ZONE
Verifica si tu trabajo inició alguna VM de trabajador. Cuando tu trabajo inicia un trabajador, los registradores como
worker
,worker_startup
,kubelet
y otros suelen proporcionar resultados. Además, en la página Job metrics de la consola de Google Cloud , la cantidad de trabajadores actuales debe ser mayor que cero.Inicio del trabajador: Verifica los registros de
job-message
ylauncher
. Si tu canalización inicia trabajadores, pero estos no pueden arrancar, es posible que tengas errores en tu contenedor personalizado.Espacio en disco: Verifica que haya suficiente espacio en disco disponible para tu trabajo. Para aumentar el espacio del disco, usa la opción
--disk_size_gb
.
El trabajo falla con un error
Sigue estas sugerencias para solucionar problemas cuando tu trabajo falle con un error.
No se pudo iniciar el grupo de trabajadores
Si ves el siguiente error, verifica que tu canalización especifique --worker_zone
y que la zona coincida con la de tu reserva.
JOB_MESSAGE_ERROR: Startup of the worker pool in zone ZONE failed to bring up any of the desired 1 workers. [...] INVALID_FIELD_VALUE: Instance 'INSTANCE_NAME' creation failed: Invalid value for field 'resource.reservationAffinity': '{ "consumeReservationType": "SPECIFIC_ALLOCATION", "key": "compute.googleapis.com/RESERVATION_NAME...'. Specified reservations [RESERVATION_NAME] do not exist.
Los grupos de instancias administrados no admiten Cloud TPU
Si ves el siguiente error, comunícate con tu equipo de cuentas para verificar si tu proyecto se inscribió para usar TPUs o envía un error con el Google Issue Tracker.
apache_beam.runners.dataflow.dataflow_runner.DataflowRuntimeException: Dataflow pipeline failed. State: FAILED, Error: Workflow failed. Causes: One or more operations had an error [...]: [INVALID_FIELD_VALUE] 'Invalid value for field 'resource.instanceTemplate': Managed Instance Groups do not support Cloud TPUs. '.
Valor no válido para el campo
Si ves el siguiente error, verifica que la invocación de tu canalización establezca la opción de servicio worker_accelerator
de Dataflow.
JOB_MESSAGE_ERROR: Workflow failed. Causes: One or more operations had an error: 'operation-[...]': [INVALID_FIELD_VALUE] 'Invalid value for field 'resource.instanceTemplate': 'projects/[...]-harness'. Regional Managed Instance Groups do not support Cloud TPUs.'
El dispositivo o recurso está ocupado
Si ves el siguiente error, es probable que un trabajador de Dataflow que procesa tu canalización esté ejecutando más de un proceso que accede a la TPU al mismo tiempo. Esta opción no es compatible. Para obtener más información, consulta Paralelismo de trabajadores y TPU.
RuntimeError: TPU initialization failed: open(/dev/vfio/0): Device or resource busy: Device or resource busy; Couldn't open iommu group /dev/vfio/0
Si ves el error anterior mientras depuras tu canalización en una VM, puedes inspeccionar y finalizar el proceso que está deteniendo la TPU con los siguientes comandos:
apt update ; apt install lsof
lsof -w /dev/vfio/0
kill -9 PROCESS_ID # to terminate the process.
Las instancias con aceleradores invitados no admiten la migración en vivo
Si ves el siguiente error, es probable que la canalización se haya iniciado con un tipo de máquina establecido de forma explícita que tiene aceleradores, pero no se especificó la configuración del acelerador correctamente. Verifica que la invocación de tu canalización establezca la opción de servicio worker_accelerator
de Dataflow y asegúrate de que el nombre de la opción no contenga errores tipográficos.
JOB_MESSAGE_ERROR: Startup of the worker pool in zone ZONE failed to bring up any of the desired 1 workers. [...] UNSUPPORTED_OPERATION: Instance INSTANCE_ID creation failed: Instances with guest accelerators do not support live migration.
El servicio rechazó automáticamente el flujo de trabajo.
También pueden aparecer los siguientes errores si faltan algunas de las opciones de canalización obligatorias o son incorrectas:
The workflow was automatically rejected by the service. The requested accelerator type tpu-v5-lite-podslice;topology:1x1 requires setting the worker machine type to ct5lp-hightpu-1t. Learn more at: https://cloud.google.com/dataflow/docs/guides/configure-worker-vm
Se agotó el tiempo de espera para una actualización del trabajador
Si inicias canalizaciones en VMs de TPU con muchas CPU virtuales y no reduces la cantidad predeterminada de subprocesos de trabajadores, es posible que el trabajo encuentre errores como los siguientes:
Workflow failed. Causes WORK_ITEM failed. The job failed because a work item has failed 4 times. Root cause: Timed out waiting for an update from the worker.
Para evitar este error, reduce la cantidad de subprocesos. Por ejemplo, podrías establecer lo siguiente:
--number_of_worker_harness_threads=50
.
No hay uso de TPU
Si tu canalización se ejecuta correctamente, pero no se usan los dispositivos de TPU o no se puede acceder a ellos, verifica que los frameworks que usas, como JAX o PyTorch, puedan acceder a los dispositivos conectados. Para solucionar problemas relacionados con tu imagen de contenedor en una sola VM, consulta Depura con una VM independiente.