Connector for PyTorch de Cloud Storage es un producto de código abierto compatible con Google que proporciona una integración directa de Cloud Storage con PyTorch.
Información general
Connector for PyTorch ofrece ventajas tanto para la carga de datos en el entrenamiento como para la creación de puntos de control y la carga de modelos:
Para la carga de datos en el entrenamiento, Connector for PyTorch ofrece las siguientes ventajas:
- Connector for PyTorch contiene optimizaciones para que el entrenamiento sea hasta tres veces más rápido que el de PyTorch predeterminado en conjuntos de datos que constan principalmente de archivos de menos de 1 MB.
- El conector de PyTorch implementa el primitivo de conjunto de datos de PyTorch, que se puede usar para cargar de forma eficiente datos de entrenamiento desde segmentos de Cloud Storage.
- Admite conjuntos de datos de estilo de mapa para patrones de acceso a datos aleatorios y conjuntos de datos de estilo iterable para patrones de acceso a datos de streaming.
- La capacidad de transformar los bytes de datos sin procesar descargados al formato que elijas, lo que permite que PyTorch DataLoader funcione de forma flexible con las matrices NumPy o los tensores PyTorch.
Connector for PyTorch ofrece las siguientes ventajas para la creación de puntos de control y la carga de modelos:
- Una interfaz de creación de puntos de control para guardar de forma cómoda y directa los puntos de control de los modelos en un segmento de Cloud Storage y cargar los puntos de control de los modelos desde el segmento.
- Connector for PyTorch admite el registro de puntos de control de PyTorch Lightning mediante la implementación de
DatafluxLightningCheckpoint
deCheckpointIO
de PyTorch Lightning. - Connector for PyTorch proporciona implementaciones de
StorageWriter
yStorageReader
para usarlas con la creación de puntos de control distribuidos de PyTorch. La biblioteca de demostración de Connector for PyTorch incluye código de ejemplo para usarlo en una carga de trabajo de FSDP de PyTorch Lightning. - El registro de puntos de control de conectores incluye la compatibilidad con el guardado de puntos de control asíncronos con Lightning y PyTorch básico.
Para obtener más información, consulta la página de destino de GitHub del conector de PyTorch.
Frameworks
Connector for PyTorch es compatible con las siguientes versiones del framework:
- Python 3.8 o una versión posterior
- PyTorch Lightning 2.0 o una versión posterior
- PyTorch 2.3.1 o una versión posterior
Primeros pasos
Para usar Connector for PyTorch, debes tener lo siguiente:
- Un segmento de Cloud Storage que contenga los datos con los que quieras trabajar.
- Consulta el uso de objetos compuestos para ver otros ajustes recomendados para el cubo.
- Los siguientes permisos para trabajar con los datos almacenados en el segmento:
storage.objects.create
storage.objects.list
storage.objects.get
storage.objects.delete
, si tienes intención de usar descargas compuestas
Estos permisos deben concederse a la cuenta que el conector de PyTorch utilizará para la autenticación mediante un rol de gestión de identidades y accesos, como Usuario de objetos de Storage.
Instalación
Para instalar Connector for PyTorch, usa el siguiente comando:
pip install gcs-torch-dataflux
Configuración
Para usar el conector de PyTorch, debes proporcionar la autenticación mediante credenciales predeterminadas de la aplicación con uno de los siguientes métodos:
- Al ejecutar el conector para PyTorch en una VM de Compute Engine, las credenciales predeterminadas de la aplicación usan automáticamente la cuenta de servicio asociada a la VM de forma predeterminada. Para obtener más información, consulta Elegir un método de autenticación de cargas de trabajo.
- Las credenciales predeterminadas de la aplicación también se pueden configurar manualmente. Puedes iniciar sesión directamente con Google Cloud CLI:
gcloud auth application-default login
Ejemplos
Puedes encontrar un conjunto completo de ejemplos para trabajar con Connector for PyTorch en el directorio de demostración del repositorio de GitHub de Connector for PyTorch. Estos son algunos ejemplos:
- Un cuaderno de Jupyter básico para empezar (alojado en Google Colab).
- Una guía de la carga de trabajo de entrenamiento de segmentación de imágenes de principio a fin.
- Un ejemplo completo y el cuaderno de la integración de PyTorch Lightning.
Rendimiento
Connector for PyTorch tiene optimizaciones específicas diseñadas para cargas de trabajo de aprendizaje automático que pueden proporcionar un rendimiento significativamente mejor que las llamadas directas a la API de Cloud Storage:
- Para optimizar el rendimiento de las listas, el conector de PyTorch utiliza un algoritmo de lista rápida desarrollado para equilibrar la carga de trabajo de las listas entre los procesos de listas de objetos paralelizados.
- Para optimizar el rendimiento de descarga de archivos pequeños, Connector for PyTorch usa la operación de composición para concatenar conjuntos de objetos más pequeños en objetos más grandes. Estos nuevos objetos compuestos se almacenan en el mismo segmento que los objetos de origen y tienen el prefijo
dataflux-composed-objects/
en sus nombres. - La subida multiparte para la escritura de puntos de control permite mejorar el rendimiento hasta 10 veces en comparación con la subida de puntos de control estándar.
Puedes consultar los datos de rendimiento en GitHub para lo siguiente:
- Formación basada en texto de Lightning
- Entrenamiento de imágenes Lightning
- Creación de puntos de control de un solo nodo
- Creación de puntos de control multinodo
Cuestiones importantes
Se deben tener en cuenta los siguientes aspectos en función de cada carga de trabajo.
Operaciones de listado rápidas
El algoritmo de listado rápido de Connector for PyTorch hace que Connector for PyTorch use más operaciones de lista que un listado secuencial normal. Las operaciones de lista se cobran como operaciones de clase A.
Uso de objetos compuestos
Para evitar cargos por exceso de almacenamiento y cargos por eliminación anticipada al trabajar con objetos compuestos temporales, debes asegurarte de que tu segmento use los siguientes ajustes:
- Se ha inhabilitado Eliminación no definitiva
- Bloqueo del segmento inhabilitado
- Gestión de versiones de objetos inhabilitada
- Standard Storage como clase de almacenamiento tanto para el segmento como para los objetos.
Los objetos compuestos creados por Connector for PyTorch suelen eliminarse automáticamente al final del bucle de entrenamiento, pero en algunos casos no se eliminan. Para asegurarte de que los objetos se han eliminado de tu contenedor, puedes ejecutar el siguiente comando:
gcloud storage rm gs://<my-bucket>/dataflux-composed-objects/ --recursive
Puedes inhabilitar el uso de objetos compuestos incluyendo disable_compose=True
o max_composite_object_size=0
en la parte de configuración del conjunto de datos que estés creando. Sin embargo, si desactivas este comportamiento, los bucles de entrenamiento pueden tardar mucho más, sobre todo si trabajas con archivos pequeños.
Si utilizas objetos compuestos, Cloud Storage alcanzará los límites de QPS y de capacidad a una escala inferior que si descargas archivos directamente. Deberías inhabilitar el uso de objetos compuestos cuando se ejecuten a gran escala en varios nodos y alcances los límites de QPS o de rendimiento del proyecto, incluso sin usar objetos compuestos.
Errores 429 y rendimiento degradado
Al trabajar con el conector de PyTorch, es posible que recibas errores 429 o que los tiempos de ejecución sean más lentos de lo esperado. Esto se debe a varios motivos habituales:
- Muchos proyectos de aprendizaje automático optan por un modelo de entrenamiento altamente distribuido que aprovecha herramientas como PyTorch Lightning y Ray. Estos modelos son compatibles con el conector de PyTorch, pero a menudo pueden activar los límites de frecuencia de Cloud Storage.
- Los errores 429 acompañados de mensajes como "Esta carga de trabajo está consumiendo demasiado ancho de banda de salida de Cloud Storage" o "Esta carga de trabajo ha alcanzado el límite de ancho de banda de salida de Cloud Storage" indican que la velocidad de procesamiento de datos de tu carga de trabajo está superando la capacidad máxima de tu proyecto Google Cloud . Para solucionar estos problemas, siga estos pasos:
- Comprueba que otras cargas de trabajo de tu proyecto no estén consumiendo un ancho de banda excesivo.
- Solicita un aumento de cuota.
- Ajusta las opciones
list_retry_config
ydownload_retry_config
en la parte de configuración de los conjuntos de datos que estés creando para optimizar la espera de reintento y maximizar el rendimiento.
- Los límites de QPS pueden activar errores 429 con un mensaje en el cuerpo que indique
TooManyRequests
, pero lo más habitual es que se manifiesten en tiempos de ejecución más lentos de lo esperado. Los cuellos de botella de QPS son más habituales cuando se trabaja con grandes volúmenes de archivos pequeños. Los límites de QPS de los contenedores se escalan de forma natural con el tiempo, por lo que permitir un periodo de calentamiento a menudo puede mejorar el rendimiento. Para obtener más información sobre el rendimiento de un contenedor de destino, consulta la pestaña Observabilidad cuando veas el contenedor desde la Google Cloud consola. - Si tu carga de trabajo falla y aparece un error
TooManyRequests
que incluye la palabra clavedataflux-composed-objects
en el mensaje de error, la mejor medida para solucionar el problema es inhabilitar el uso de objetos compuestos. De esta forma, se puede reducir la carga de QPS provocada por las operaciones de composición cuando se usa a gran escala.
Consumo de memoria
Las escrituras y cargas de puntos de control, incluidos los modelos finales para la inferencia, se almacenan por completo en la memoria para optimizar el rendimiento de las subidas y descargas. Cada máquina debe tener suficiente RAM libre para almacenar su punto de control en la memoria y, de esta forma, aprovechar estas mejoras de rendimiento.
Obtener asistencia
Puedes obtener asistencia, enviar preguntas generales y solicitar nuevas funciones a través de uno de los Google Cloud canales de asistencia oficiales. También puedes obtener asistencia registrando incidencias en GitHub.