El conector de Cloud Storage para PyTorch es un producto de código abierto compatible con Google que proporciona una integración directa de Cloud Storage con PyTorch.
Descripción general
Connector for PyTorch proporciona ventajas para la carga de datos en el entrenamiento y para la carga de puntos de control y modelos:
Para la carga de datos en el entrenamiento, Connector for PyTorch proporciona las siguientes ventajas:
- El conector para PyTorch contiene optimizaciones para que el entrenamiento sea hasta tres veces más rápido que PyTorch predeterminado en conjuntos de datos que consisten principalmente en archivos de menos de 1 MB.
- El conector para PyTorch implementa la primitiva de conjunto de datos de PyTorch que se puede usar para ayudar a cargar datos de entrenamiento de forma eficiente desde los buckets de Cloud Storage.
- Compatibilidad con conjuntos de datos de estilo de mapa para patrones de acceso a datos aleatorios y conjuntos de datos de estilo iterativo para patrones de acceso a datos de transmisión.
- La capacidad de transformar los bytes sin procesar descargados de datos en el formato que elijas, lo que permite que PyTorch DataLoader funcione de forma flexible con arrays de NumPy o tensores de PyTorch.
En el caso de los puntos de control y la carga de modelos, Connector for PyTorch proporciona las siguientes ventajas:
- Una interfaz de puntos de control para guardar puntos de control del modelo de forma directa y conveniente en un bucket de Cloud Storage y cargarlos desde el bucket.
- 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 usar con el punto de control distribuido 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 del conector incluye compatibilidad con las cargas de puntos de control asíncronos con Lightning y PyTorch base.
Para obtener más información, consulta la página de destino de GitHub del conector para PyTorch.
Frameworks
Connector for PyTorch es compatible con las siguientes versiones de frameworks:
- Python 3.8 o una versión posterior
- PyTorch Lightning 2.0 o una versión posterior
- PyTorch 2.3.1 o superior
Cómo comenzar
Para usar el Connector for PyTorch, debes tener lo siguiente:
- Un bucket de Cloud Storage que contenga los datos con los que deseas trabajar
- Consulta el uso de objetos compuestos para conocer la configuración recomendada adicional del bucket.
- Los siguientes permisos para trabajar con los datos almacenados en el bucket:
storage.objects.create
storage.objects.list
storage.objects.get
storage.objects.delete
, si deseas usar descargas compuestas
Estos permisos se deben otorgar a la cuenta que el conector para PyTorch usará para la autenticación mediante un rol de IAM, como Usuario de objetos de almacenamiento.
Instalación
Para instalar el conector para PyTorch, usa el siguiente comando:
pip install gcs-torch-dataflux
Configuración
Se debe proporcionar autenticación para usar las credenciales predeterminadas de la aplicación del conector para PyTorch a través de uno de los siguientes métodos:
- Cuando se ejecuta el conector para PyTorch en una VM de Compute Engine, las credenciales predeterminadas de la aplicación usan automáticamente la cuenta de servicio adjunta de la VM de forma predeterminada. Para obtener más información, consulta Elige un método de autenticación de carga de trabajo.
- Las credenciales predeterminadas de la aplicación también se pueden configurar de forma manual. Puedes acceder 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. Los ejemplos incluyen:
- Un notebook de Jupyter básico (alojado en Google Colab).
- Una descripción general de la carga de trabajo de entrenamiento de segmentación de imágenes de extremo a extremo.
- Un ejemplo de extremo a extremo y el notebook para la integración de PyTorch Lightning.
Rendimiento
Connector for PyTorch tiene optimizaciones específicas diseñadas para cargas de trabajo de AA que pueden proporcionar un rendimiento significativamente mejor que las llamadas directas a la API a Cloud Storage:
- Para optimizar el rendimiento de las fichas, el conector para PyTorch usa un algoritmo de lista rápida desarrollado para equilibrar la carga de trabajo de las fichas entre los procesos de creación de fichas de objetos paralelos.
- 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 uno solo más grande. Estos nuevos objetos compuestos se almacenan en el mismo bucket que los objetos de origen y tienen el prefijo
dataflux-composed-objects/
en sus nombres. - La carga multiparte para la escritura de puntos de control permite hasta 10 veces la mejora de rendimiento en comparación con la carga de puntos de control estándar.
Puedes encontrar datos de rendimiento en GitHub para lo siguiente:
- Capacitación basada en texto de Lightning
- Entrenamiento de imágenes Lightning
- Puntos de control de nodo único
- Puntos de control de varios nodos
Consideraciones
Se debe tener en cuenta lo siguiente por carga de trabajo.
Operaciones de lista rápidas
El algoritmo de lista rápida de Connector for PyTorch hace que el conector use más operaciones de lista que una lista secuencial normal. Las operaciones de lista se cobran como operaciones de clase A.
Uso de objetos compuestos
Para evitar cargos de almacenamiento excesivos y cargos de eliminación temprana cuando trabajes con objetos compuestos temporales, debes asegurarte de que tu bucket use la siguiente configuración:
- Eliminación no definitiva inhabilitada
- Bloqueo del bucket inhabilitado
- Control de versiones de objetos inhabilitado
- Almacenamiento estándar como la clase de almacenamiento para el bucket y los objetos
Los objetos compuestos que crea el conector para PyTorch suelen quitarse automáticamente al final del bucle de entrenamiento, pero en algunos casos es posible que no sea así. Para asegurarte de que los objetos se quiten de tu bucket, puedes ejecutar el siguiente comando:
gcloud storage rm gs://<my-bucket>/dataflux-composed-objects/ --recursive
Para inhabilitar el uso de objetos compuestos, incluye disable_compose=True
o max_composite_object_size=0
en la parte de configuración del conjunto de datos que estás construyendo. Sin embargo, desactivar este comportamiento puede hacer que los bucles de entrenamiento demoren mucho más, en especial cuando se trabaja con archivos pequeños.
El uso de objetos compuestos hace que Cloud Storage alcance los límites de QPS y la capacidad de procesamiento a una escala menor que la descarga de archivos directamente. Debes inhabilitar el uso de objetos compuestos cuando se ejecutan en escalas de varios nodos altas en las que alcanzas los límites de QPS o de rendimiento del proyecto, incluso sin usar objetos compuestos.
Errores 429 y rendimiento degradado
Mientras trabajas con el Connector for PyTorch, es posible que recibas errores 429 o tiempos de ejecución más lentos de lo esperado. Existen varios motivos comunes por los que esto ocurre:
- Muchos esfuerzos 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 para 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á extrayendo demasiado ancho de banda de salida de Cloud Storage" o "Esta carga de trabajo activó el límite de ancho de banda de salida de Cloud Storage" indican que la tasa de rendimiento de los datos de tu carga de trabajo supera la capacidad máxima de tu proyecto de Google Cloud. Para solucionar estos problemas, sigue estos pasos:
- Verifica que otras cargas de trabajo de tu proyecto no estén consumiendo ancho de banda en exceso.
- Solicita un aumento de la cuota.
- Ajusta las opciones
list_retry_config
ydownload_retry_config
en la parte de configuración de los conjuntos de datos que estás compilando para ajustar el tiempo de espera de reintento y maximizar el rendimiento.
- Los límites de QPS pueden activar errores 429 con un mensaje de cuerpo que indica
TooManyRequests
, pero, por lo general, se manifiestan en tiempos de ejecución más lentos de lo esperado. Los cuellos de botella de QPS son más comunes cuando se opera en grandes volúmenes de archivos pequeños. Los límites de QPS del bucket se escalan de forma natural con el tiempo, por lo que permitir un período de preparación a menudo puede generar un rendimiento más rápido. Para obtener más detalles sobre el rendimiento de un bucket de destino, consulta la pestaña Observabilidad cuando veas tu bucket desde la consola de Google Cloud. - Si tu carga de trabajo falla con un error
TooManyRequests
que incluye la palabra clavedataflux-composed-objects
en el mensaje de error, inhabilitar el uso de objetos compuestos es el primer paso que debes seguir para solucionar el problema. De esta manera, se puede reducir la carga de QPS que generan las operaciones de composición cuando se usan a gran escala.
Consumo de memoria
Las operaciones de escritura y carga de puntos de control, incluidos los modelos finales para la inferencia, se implementan por completo en la memoria para optimizar el rendimiento de carga y descarga. Cada máquina debe tener suficiente RAM libre para activar su punto de control en la memoria para que pueda aprovechar estas mejoras de rendimiento.
Obtenga asistencia
Puedes obtener asistencia, enviar preguntas generales y solicitar funciones nuevas a través de uno de los canales de asistencia oficiales de Google Cloud. También puedes obtener asistencia si presentas problemas en GitHub.