La función de ajuste adecuado usa las sugerencias de recursos de Apache Beam para personalizar los recursos de trabajador de una canalización. La capacidad de segmentar varios recursos diferentes para pasos de canalización específicos proporciona flexibilidad y capacidad adicionales de la canalización, y posibles ahorros de costos. Puedes aplicar recursos más costosos a los pasos de canalización que los requieran y recursos menos costosos a otros pasos de canalización. Usa el ajuste adecuado para especificar requisitos de recursos para una canalización completa o para pasos de canalización específicos.
Asistencia y limitaciones
- Las sugerencias de recursos son compatibles con los SDK de Java y Python de Apache Beam, versiones 2.31.0 y posteriores.
- El ajuste adecuado es compatible con las canalizaciones por lotes.
El ajuste adecuado es compatible con las canalizaciones de transmisión con el ajuste de escala automático horizontal habilitado.
- Para habilitarlo, establece la opción de canalización
--experiments=enable_streaming_rightfitting.
- Para habilitarlo, establece la opción de canalización
El ajuste adecuado admite Dataflow Prime.
El ajuste adecuado no es compatible con FlexRS.
Cuando uses el ajuste adecuado, no uses la opción de servicio
worker_accelerator.Cuando usas el Ajuste de escala automático vertical, no se admite la selección automática de VMs.
Habilita el ajuste adecuado
Para activar el ajuste adecuado, usa una o más de las sugerencias de recursos disponibles en tu canalización. Cuando usas una sugerencia de recursos en tu canalización, el ajuste adecuado se habilita de forma automática. Para obtener más información, consulta la sección Usa sugerencias de recursos de este documento.
Sugerencias de recursos disponibles
Las siguientes sugerencias de recursos están disponibles.
| Sugerencia de recursos | Descripción |
|---|---|
min_ram |
La cantidad mínima de RAM en gigabytes para asignar a los trabajadores. Dataflow usa este valor como un límite inferior cuando se asigna memoria a trabajadores nuevos (escalamiento horizontal) o a trabajadores existentes (escalamiento vertical). Por ejemplo: min_ram=NUMBERGB
|
cpu_count |
Es la cantidad de CPU virtuales que se asignarán por trabajador. Cuando usas esta sugerencia de recurso, Dataflow selecciona tipos de máquinas que tienen la cantidad especificada de CPU virtuales y cumplen con los requisitos de memoria. Por ejemplo: cpu_count=NUMBER
|
accelerator |
Una asignación de GPU proporcionada por el usuario que te permite controlar el uso y el costo de las GPU en tu canalización y sus pasos. Especifica el tipo y la cantidad de GPU que se adjuntarán a los trabajadores de Dataflow como parámetros para la marca. Por ejemplo: accelerator="type:GPU_TYPE;count:GPU_COUNT;machine_type:MACHINE_TYPE;CONFIGURATION_OPTIONS"
Para obtener más información sobre el uso de GPU, consulta GPU con Dataflow. |
Selección automática de VMs para tipos de máquinas de trabajadores
Cuando usas sugerencias de recursos min_ram o cpu_count para pasos de canalización que no requieren aceleradores, se habilita automáticamente la flexibilidad de instancias (selección automática de VMs). Con la selección automática de VMs, los trabajadores se aprovisionan a partir de una selección de tipos de máquinas que cumplen con tus requisitos de RAM y CPU.
La selección automática de VMs optimiza la selección de VM principalmente para la confiabilidad y no para el rendimiento. Esto significa que es posible que experimentes una reducción del rendimiento mientras usas la Selección automática de VM para mejorar la confiabilidad de algunos de tus trabajos altamente optimizados. Te recomendamos que pruebes la selección automática de VM en un subconjunto de tus trabajos existentes antes de implementarla de forma gradual en un público más amplio.
Si usas reservas de Compute Engine con la selección automática de VM, ten en cuenta lo siguiente:
- Si tienes reservas que se consumen automáticamente, es posible que se usen si Compute Engine aprovisiona VMs de un tipo de máquina coincidente.
- La selección automática de VMs no admite el consumo de instancias de una reserva específica.
- La selección automática de VM no es compatible con el ajuste de escala automático vertical.
Para obtener más información, consulta Flexibilidad y reservas de instancias.
Anidación de sugerencias de recursos
Las sugerencias de recursos se aplican a la jerarquía de transformación de canalizaciones de la siguiente manera:
min_ram: El valor en una transformación se evalúa como el valor de sugerenciamin_rammás grande entre los valores que se establecen en la transformación y en todos sus elementos superiores en la jerarquía de la transformación.- Ejemplo: Si se configura una sugerencia de transformación interna
min_rama 16 GB, y la sugerencia de transformación externa en los conjuntos de jerarquíamin_rama 32 GB, se usa una sugerencia de 32 GB para todos los pasos de toda la transformación. - Ejemplo: Si se configura una sugerencia de transformación interna
min_rama 16 GB, y la sugerencia de transformación externa en los conjuntos de jerarquíamin_rama 8 GB, se usa una sugerencia de 8 GB para todos los pasos de la transformación externa que no están en la transformación interna y se usa una sugerencia de 16 GB para todos los pasos de la transformación interna.
- Ejemplo: Si se configura una sugerencia de transformación interna
accelerator: El valor más interno en la jerarquía de la transformación tiene prioridad.- Ejemplo: Si una sugerencia de transformación interna
acceleratores distinta de una sugerenciaacceleratorde transformación externa en una jerarquía, la sugerenciaacceleratorde la transformación interna se usará para la transformación interna.
- Ejemplo: Si una sugerencia de transformación interna
Las sugerencias configuradas para toda la canalización se tratan como si estuvieran configuradas en una transformación externa.
Usa sugerencias de recursos
Puedes establecer sugerencias de recursos en toda la canalización o en los pasos de canalización.
Sugerencias de recursos en la canalización
Puedes establecer sugerencias de recursos en toda la canalización cuando la ejecutas desde la línea de comandos.
gcloud
Para establecer sugerencias de recursos cuando ejecutas una canalización con una plantilla de Flex, usa la marca --additional-pipeline-options con el comando gcloud dataflow flex-template run.
El nombre de la opción de canalización depende del idioma del SDK. Por ejemplo, para las sugerencias de recursos:
- Para las canalizaciones de Java, usa
resourceHints. - Para las canalizaciones de Python, usa
resource_hints.
En el siguiente ejemplo, se muestra cómo establecer sugerencias de recursos cuando se ejecuta una canalización de plantilla flexible de Java:
gcloud dataflow flex-template run JOB_NAME \
--template-file-gcs-location="gs://TEMPLATE_LOCATION" \
--region="REGION" \
--additional-pipeline-options=resourceHints=min_ram=numberGB \
--additional-pipeline-options=resourceHints=cpu_count=number \
--additional-pipeline-options=resourceHints=accelerator="type:type;count:number;install-nvidia-driver" \
--parameters ...
En el siguiente ejemplo, se muestra cómo establecer sugerencias de recursos cuando se ejecuta una canalización de plantilla de Flex en Python:
gcloud dataflow flex-template run JOB_NAME \
--template-file-gcs-location="gs://TEMPLATE_LOCATION" \
--region="REGION" \
--additional-pipeline-options=resource_hints=min_ram=numberGB \
--additional-pipeline-options=resource_hints=cpu_count=number \
--additional-pipeline-options=resource_hints=accelerator="type:type;count:number;install-nvidia-driver" \
--parameters ...
Python
Para configurar tu entorno de Python, consulta el instructivo de Python.
En el siguiente ejemplo, se muestra cómo establecer sugerencias de recursos cuando se ejecuta una canalización de Python:
python my_pipeline.py \
--runner=DataflowRunner \
--resource_hints=min_ram=numberGB \
--resource_hints=cpu_count=number \
--resource_hints=accelerator="type:type;count:number;install-nvidia-driver" \
...
Sugerencias de recursos en pasos de canalización
Puedes establecer sugerencias de recursos en pasos de canalización (transformaciones) de manera programática.
Java
Si deseas instalar el SDK de Apache Beam para Java, consulta Instala el SDK de Apache Beam.
Puedes establecer sugerencias de recursos de manera programática en transformaciones de canalización mediante la clase ResourceHints.
En el siguiente ejemplo, se muestra cómo establecer sugerencias de recursos de manera programática en transformaciones de canalización.
pcoll.apply(MyCompositeTransform.of(...)
.setResourceHints(
ResourceHints.create()
.withMinRam("15GB")
.withCpuCount(8)
.withAccelerator(
"type:nvidia-l4;count:1;install-nvidia-driver")))
pcoll.apply(ParDo.of(new BigMemFn())
.setResourceHints(
ResourceHints.create()
.withMinRam("30GB")
.withCpuCount(16)))
Para establecer sugerencias de recursos de manera programática en toda la canalización, usa la interfaz ResourceHintsOptions.
Python
Si deseas instalar el SDK de Apache Beam para Python, consulta Instala el SDK de Apache Beam.
Puedes establecer sugerencias de recursos de manera programática en transformaciones de canalización mediante la clase PTransforms.with_resource_hints.
Para obtener más información, consulta la clase ResourceHint.
En el siguiente ejemplo, se muestra cómo establecer sugerencias de recursos de manera programática en transformaciones de canalización.
pcoll | MyPTransform().with_resource_hints(
min_ram="4GB",
cpu_count=8,
accelerator="type:nvidia-tesla-l4;count:1;install-nvidia-driver")
pcoll | beam.ParDo(BigMemFn()).with_resource_hints(
min_ram="30GB",
cpu_count=16)
Para establecer sugerencias de recursos en toda la canalización, usa la opción de canalización --resource_hints cuando ejecutes tu canalización. Para ver un ejemplo, consulta Sugerencias de recursos de canalización.
Go
Las sugerencias de recursos no son compatibles con Go.
Compatibilidad con varios aceleradores
Dentro de una canalización, las diferentes transformaciones pueden tener diferentes configuraciones de acelerador. Esto incluye configuraciones que requieren diferentes tipos de máquinas. Estas configuraciones del acelerador a nivel de la transformación tienen prioridad sobre la configuración a nivel de la canalización, si se proporcionó una.
Ajuste adecuado y fusión
En algunos casos, como parte del proceso de optimización de la fusión, se pueden ejecutar transformaciones configuradas con diferentes sugerencias de recursos en trabajadores que están en el mismo grupo. Cuando las transformaciones se fusionan, Dataflow las ejecuta en un entorno que satisface la unión de las sugerencias de recursos establecida en las transformaciones. En algunos casos, esto incluye toda la canalización.
Cuando no se pueden combinar las sugerencias de recursos, no se produce la fusión. Por ejemplo, las sugerencias de recursos para diferentes GPU no se pueden combinar, por lo que no se combinan esas transformaciones.
Para evitar también la fusión, agrega una operación a la canalización que obligue a Dataflow a materializar una PCollection intermedia. Esto es especialmente útil cuando intentas aislar recursos costosos, como las GPU o las máquinas con mucha memoria, de los pasos lentos o que requieren mucha capacidad de procesamiento y que no necesitan esos recursos especiales. En esos casos, puede ser útil forzar una interrupción de la fusión entre los pasos lentos vinculados a la CPU y los pasos que necesitan las costosas GPUs o las máquinas con alta capacidad de memoria, y pagar el costo de materialización asociado con la interrupción de la fusión. Para obtener más información, consulta Evita la fusión.
Ajuste adecuado de transmisión
En el caso de los trabajos de transmisión, puedes habilitar el ajuste correcto configurando la opción de canalización --experiments=enable_streaming_rightfitting.
El ajuste adecuado puede mejorar el rendimiento de tu canalización si incluye etapas con diferentes requisitos de recursos.
Ejemplo: Canalización con una etapa que requiere mucha CPU y otra que requiere GPU
Un ejemplo de canalización que se puede beneficiar del ajuste adecuado es una que ejecuta una etapa que requiere mucha CPU, seguida de una etapa que requiere GPU. Sin el ajuste adecuado, se deberá configurar un solo grupo de trabajadores con GPU para ejecutar todas las etapas de la canalización, incluida la etapa que requiere mucha CPU. Esto puede provocar un uso deficiente de los recursos de GPU cuando el grupo de trabajadores ejecuta la etapa con uso intensivo de CPU.
Si el ajuste adecuado está habilitado y se aplica una sugerencia de recursos al paso que requiere GPU, la canalización creará dos grupos separados, de modo que el grupo de trabajadores de CPU ejecute la etapa que requiere mucha CPU y el grupo de trabajadores de GPU ejecute la etapa que requiere GPU.
En el caso de esta canalización de ejemplo, la tabla de ajuste de escala automático muestra que el grupo de trabajadores que ejecuta la etapa que requiere mucha CPU, Pool 0, se ajusta inicialmente a 99 trabajadores y, luego, se reduce a 87 trabajadores. El grupo de trabajadores que ejecuta la etapa que requiere GPU, Pool 1, se amplía a 13 trabajadores:
El gráfico Uso de CPU muestra que los trabajadores de ambos grupos de trabajadores demuestran un uso de CPU alto en general:
Soluciona problemas de ajuste adecuado
En esta sección, se proporcionan instrucciones para solucionar problemas habituales relacionados con el ajuste adecuado.
La configuración no es válida
Cuando intentas usar el ajuste adecuado, se produce el siguiente error:
Workflow failed. Causes: One or more operations had an error: 'operation-OPERATION_ID':
[UNSUPPORTED_OPERATION] 'NUMBER vCpus with NUMBER MiB memory is
an invalid configuration for NUMBER count of 'GPU_TYPE' in family 'MACHINE_TYPE'.'.
Este error se produce cuando el tipo de GPU seleccionado no es compatible con el tipo de máquina seleccionado. Para resolver este error, selecciona un tipo de GPU y un tipo de máquina compatibles. Para obtener detalles sobre la compatibilidad, consulta Plataformas de GPU.
Paralelismo inesperado con la selección automática de VMs
Si observas un uso bajo de la CPU o un paralelismo inesperado en las VMs de trabajador cuando usas la selección automática de VMs con ajuste adecuado, es posible que se trate de un problema en el que la cantidad de subprocesos por trabajador no se establece automáticamente para que coincida con el recuento de CPU virtuales del tipo de máquina seleccionado.
Para solucionar este problema, establece explícitamente la opción de canalización numberOfWorkerHarnessThreads y la sugerencia de recursos de canalización cpu_count en el mismo valor. Por ejemplo, si necesitas 2 CPUs virtuales, establece --numberOfWorkerHarnessThreads=2 y --resourceHints=cpu_count=2. Ten en cuenta que la opción numberOfWorkerHarnessThreads se aplica de forma global a todos los grupos de trabajadores de la canalización.
Verifica el ajuste adecuado
Para verificar que el ajuste correcto esté habilitado, consulta las métricas de ajuste de escala automático y verifica que la columna Worker pool esté visible y muestre diferentes grupos:
Rendimiento del ajuste adecuado de la transmisión
Es posible que las canalizaciones de transmisión con el ajuste adecuado habilitado no siempre tengan un mejor rendimiento que las canalizaciones sin el ajuste adecuado habilitado. Por ejemplo:
- La canalización usa más trabajadores
- La latencia del sistema es mayor o la capacidad de procesamiento es menor.
- Los tamaños de los grupos de trabajadores cambian con mayor frecuencia o no se estabilizan.
Si observas esto en tu canalización, puedes inhabilitar el ajuste correcto quitando la opción de canalización --experiments=enable_streaming_rightfitting. Además, las canalizaciones de transmisión con el ajuste adecuado habilitado que usan sugerencias de recursos de aceleradores podrían usar más aceleradores de los deseables. Si observas esto en tu canalización, puedes configurar una cantidad máxima de aceleradores que use la canalización estableciendo la opción de canalización --experiments=max_num_accelerators=NUM.