Si tienes problemas al ejecutar tu trabajo de Dataflow con TPUs, sigue estos pasos para solucionarlos.
Solucionar problemas con una imagen de contenedor
Puede ser útil depurar el software de tu contenedor y TPU en una máquina virtual independiente. Puedes depurar con una VM creada por un grupo de nodos de GKE o puedes depurar en una VM de trabajador de Dataflow en ejecución.
Depurar con una VM independiente
Para depurar tu contenedor en una VM independiente, puedes crear un pool de nodos de GKE que use la misma VM de TPU para hacer experimentos locales.
Por ejemplo, para crear un grupo de nodos de GKE con un dispositivo TPU v5 Lite en us-west1-c
, se usaría el siguiente comando:
Crea 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 de TPU en el grupo de nodos en la interfaz de usuario 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 mediante SSH:
gcloud compute ssh --zone "us-west1-c" "VM_NAME" --project PROJECT_ID
Después de conectarte a una VM mediante SSH, configura Docker para el registro de artefactos que estés usando.
docker-credential-gcr configure-docker --registries=us-west1-docker.pkg.dev
A continuación, inicia un contenedor a partir de la imagen que utilices.
docker run --privileged --network=host -it --rm --entrypoint=/bin/bash IMAGE_NAME
Dentro del contenedor, comprueba que se puede acceder a las TPUs.
Por ejemplo, si tienes una imagen que usa PyTorch para utilizar las TPUs, abre un intérprete de Python:
python3
A continuación, realiza un cálculo en un dispositivo 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)
Ejemplo de salida:
>>> tensor([[ 0.3355, -1.4628, -3.2610], >>> [-1.4656, 0.3196, -2.8766], >>> [ 0.8667, -1.5060, 0.7125]], device='xla:0')
Si el cálculo falla, es posible que la imagen no esté configurada correctamente.
Por ejemplo, puede que tengas que definir las variables de entorno necesarias en el Dockerfile de la imagen. Para confirmarlo, vuelve a intentar el cálculo después de definir las variables de entorno manualmente 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
Depurar mediante una VM de Dataflow
También puedes conectarte a la instancia de VM de trabajador de Dataflow mediante SSH mientras se ejecuta un trabajo. Como las VMs de los trabajadores de Dataflow se cierran cuando se completa la canalización, es posible que tengas que aumentar artificialmente el tiempo de ejecución haciendo un cálculo que espere durante un periodo prolongado.
Como un dispositivo TPU no se puede compartir entre varios procesos, es posible que tengas que ejecutar una canalización que no realice ningún cálculo en una TPU.
Para encontrar una VM para la tarea de TPU en ejecución, busca el ID de la tarea de Dataflow en la barra de búsqueda de la consola Google Cloud o usa el siguiente comando
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 TPUs mediante SSH, inicia un contenedor desde la imagen que utilices. Para ver un ejemplo, consulta Depurar con una máquina virtual independiente.
Dentro del contenedor, vuelve a configurar los ajustes de la TPU e instala las bibliotecas necesarias para probar la configuración. Para ver un ejemplo, consulta Depurar con una máquina virtual independiente.
Los trabajadores no empiezan
Antes de solucionar el problema, comprueba que las siguientes opciones de la canalización estén configuradas correctamente:
- la opción
--dataflow_service_option=worker_accelerator
- la opción
--worker_zone
- la opción
--machine_type
Comprueba si los registros de la consola muestran que los workers se están iniciando, pero la tarea falla y se muestra 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 utilizas capacidad de TPU bajo demanda o una reserva que se ha agotado, es posible que no se inicien nuevas canalizaciones hasta que haya capacidad disponible. Si usas una reserva, comprueba su capacidad restante en la página Reservas de Compute de la consolaGoogle Cloud o con el siguiente comando:
gcloud compute reservations describe RESERVATION_NAME --zone ZONE
Comprueba si tu trabajo ha iniciado 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 Métricas de trabajos de la consola Google Cloud , el número de trabajadores actuales debe ser superior a cero.Inicio del trabajador: consulta los registros
job-message
ylauncher
. Si tu pipeline inicia trabajadores, pero estos no pueden arrancar, es posible que haya errores en tu contenedor personalizado.Espacio en disco: comprueba que haya suficiente espacio en disco para tu trabajo. Para aumentar el espacio en disco, usa la opción
--disk_size_gb
.
La tarea falla y se produce un error
Sigue estos consejos para solucionar problemas cuando un trabajo falle y devuelva un error.
No se ha podido iniciar el grupo de trabajadores
Si ves el siguiente error, comprueba que tu canalización especifica --worker_zone
y que la zona coincide 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 gestionados no admiten las TPUs de Cloud
Si ves el siguiente error, ponte en contacto con tu equipo de cuenta para verificar si tu proyecto se ha registrado para usar las TPUs o registra un error mediante 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 aparece el siguiente error, compruebe que la invocación de la canalización establece la opción de servicio de Dataflow worker_accelerator
.
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.'
Dispositivo o recurso ocupado
Si ves el siguiente error, es probable que un trabajador de Dataflow que esté procesando tu canalización esté ejecutando más de un proceso que acceda a la TPU al mismo tiempo. Esta opción no está disponible. Para obtener más información, consulta TPUs y paralelismo de los trabajadores.
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 al depurar tu canalización en una VM, puedes inspeccionar y finalizar el proceso que está bloqueando 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 tiempo real
Si ves el siguiente error, es probable que la canalización se haya iniciado con un tipo de máquina definido explícitamente que tiene aceleradores, pero no se haya especificado correctamente la configuración del acelerador. Verifica que la invocación de la canalización defina la opción de servicio worker_accelerator
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 ha rechazado automáticamente el flujo de trabajo
También pueden aparecer los siguientes errores si faltan algunas de las opciones de canalización obligatorias o no son correctas:
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 ha agotado el tiempo de espera de una actualización del trabajador
Si inicias canalizaciones en máquinas virtuales de TPU con muchas vCPUs y no reduces el número predeterminado de subprocesos de trabajador, es posible que la tarea genere 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 el número de hilos. Por ejemplo, puedes definir lo siguiente:
--number_of_worker_harness_threads=50
.
No se usa ninguna TPU
Si tu canalización se ejecuta correctamente, pero no se usan los dispositivos TPU o no se puede acceder a ellos, comprueba que los frameworks que estés usando, como JAX o PyTorch, puedan acceder a los dispositivos conectados. Para solucionar problemas con tu imagen de contenedor en una sola VM, consulta Depurar con una VM independiente.