Diferencia entre las páginas «Cancelación de Tareas» y «Escalamiento»

De NLHPC
(Diferencia entre las páginas)
(Página creada con «== Por uso de CPU == Procederemos a cancelar la tarea en el caso de que la mitad del total de cores reservados muestre un porcentaje de uso menor o igual a un 30% en un lap…»)
 
Sin resumen de edición
 
Línea 1: Línea 1:
== Por uso de CPU ==
== Concepto de Escalamiento ==
Procederemos a cancelar la tarea en el caso de que la mitad del total de cores reservados muestre un porcentaje de uso menor o igual a un 30% en un lapso de 4 horas.
Cuando nos referimos al '''Escalamiento de un programa''', debemos apuntar al comportamiento del programa a medida que se ejecuta de manera paralela al tener mayor cantidad de procesadores para utilizar. De ser así, podemos considerar que el programa a utilizar permite ser escalable y podremos calcular su eficiencia.


== Por uso de Memoria ==
Entonces, el escalamiento de un programa será calculado a razón de un determinado rango de procesadores a utilizar, pero pasado ciertos niveles -según el programa-, no importará la cantidad de procesadores que podamos asignar, ya que su eficiencia no será la óptima, e incluso puede verse afectada de manera negativa.
En el caso de que la memoria reservada por core en los nodos slims sea mayor a 1000MB, se activa el proceso de verificación del uso de memoria RAM para su tarea para garantizar al menos 70% de uso correcto de todo el recurso reservado. Esta condición será revisada desde el inicio de la tarea y si no alcanza el mencionado límite, la tarea será cancelada de forma automática.


Cabe destacar que si su tarea necesita reservar 2300MB por core, usted debe hacer uso de la memoria RAM asignada por cada CPU.
== Importancia del Escalamiento de Programas ==
La importancia respecto a cómo escalan los programas se debe al uso óptimo de recursos disponibles, permitiendo que cada usuario obtenga los resultados esperados en un mejor tiempo en comparación a trabajos secuenciales, como también sabiendo que una incorrecta asignación de recursos puede hacer que los resultados deseados se obtengan un mayor período de tiempo como también que la tarea falle.


Por lo anterior, el siguiente ejemplo muestra el uso de 1 proceso con 1 CPU con 2300M de RAM asignada.
Además, una incorrecta asignación de recursos no solo afectará al usuario que intenta ejecutar una tarea, ya que también afectará a los otros usuarios del Cluster que requieren poder de cómputo.


Un escalamiento adecuado permitirá un uso eficiente de los recursos para la ejecución de nuestras tareas y las de todos.
== Calculando el Speedup y Eficiencia de mi programa ==
Para realizar el escalamiento de un programa, utilizaremos dos métricas: Speedup y Eficiencia.
El Speedup se obtiene calculando el cociente entre el tiempo de ejecución secuencial (1 proceso) y el tiempo de ejecución aumentando la cantidad de procesos asignados a la misma tarea.
<pre>speedup = tiempo 1 proceso / tiempo N procesos</pre>
La Eficiencia se obtiene calculando el cociente entre el Speedup y el Número de Procesos asignados a la tarea.
<pre>eficiencia = speedup / Número de Procesos</pre>
La realización de este ejercicio consta en modificar la cantidad de procesadores a utilizar y comparar sus tiempos de ejecución. Cada tarea ejecutada debe ser planeada según los recursos disponibles en las particiones que necesitamos utilizar, como también considerar la agrupación de tareas.
En nuestro siguiente ejemplo hemos ejecutado una tarea en la partición '''Slims''' y utilizado el software '''LAMMPS'''. Al ejecutarlo por primera vez, asignando un solo proceso( #SBATCH -n 1 ), el tiempo de ejecución alcanzó a 1 hora con 27 segundos.
El script utilizado fue:
<pre>
#!/bin/bash
#SBATCH -J escalamiento
#SBATCH -p slims
#SBATCH -p slims
#SBATCH -n 1
#SBATCH -n 1
#SBATCH -c 1
#SBATCH --ntasks-per-node=1
#SBATCH --mem-per-cpu=2300
#SBATCH --mail-user=$USER@nlhpc.cl
Puede visitar nuestro Generador de Scripts en https://wiki.nlhpc.cl/Generador_Scripts
#SBATCH --mail-type=FAIL
#SBATCH -o escalamiento_%j.out
#SBATCH -e escalamiento_%j.err
 
ml purge
ml intel
ml impi
ml icc
ml LAMMPS/20Nov19
 
srun lmp_intel_cpu_intelmpi -in input-file/in.poly-bench
</pre>
En las siguientes iteraciones, en donde aumentamos el número de procesos, los tiempos de ejecución fueron bajando. Los parámetros que fueron siendo modificados fueron:
 
* Número de procesos (tareas en paralelo): -n X
* Número de tareas por nodo (aumentando según los límetes de la partición Slims): --ntasks-per-node=X
Por ejemplo, el script usado para la prueba con 128 procesos fue:
 
<pre>
#!/bin/bash
#SBATCH -J escalamiento
#SBATCH -p slims
#SBATCH -n 128
#SBATCH --ntasks-per-node=16
#SBATCH --mail-user=$USER@nlhpc.cl
#SBATCH --mail-type=FAIL
#SBATCH -o escalamiento_%j.out
#SBATCH -e escalamiento_%j.err
 
ml purge
ml intel
ml impi
ml icc
ml LAMMPS/20Nov19
 
srun lmp_intel_cpu_intelmpi -in input-file/in.poly-bench
</pre>
 
La siguiente es la tabla de comparación en relación a número de procesos, tiempo de ejecución, Speedup y Eficiencia:
 
<table class="wikitable">
 
<tr>
<th>Procesos <br> <code>-n</code></th>
<th>Tareas por Nodo<br><code>--ntasks-per-node</code></th>
<th>Tiempo</th>
<th>Speedup</th>
<th>Eficiencia
</th></tr>
<tr>
<td>1</td>
<td>1</td>
<td>01:00:27</td>
<td>1</td>
<td>1
</td></tr>
<tr>
<td>2</td>
<td>2</td>
<td>00:33:47</td>
<td>1,8</td>
<td>0,9
</td></tr>
<tr>
<td>4</td>
<td>4</td>
<td>00:18:02</td>
<td>3,4</td>
<td>0,8
</td></tr>
<tr>
<td>8</td>
<td>8</td>
<td>00:09:13</td>
<td>6,6</td>
<td>0,8
</td></tr>
<tr>
<td>16</td>
<td>16</td>
<td>00:05:06</td>
<td>11,9</td>
<td>0,7
</td></tr>
<tr>
<td>32</td>
<td>16</td>
<td>00:02:31</td>
<td>24,0</td>
<td>0,8
</td></tr>
<tr>
<td>64</td>
<td>16</td>
<td>00:01:18</td>
<td>46,5</td>
<td>0,7
</td></tr>
<tr>
<td>128</td>
<td>16</td>
<td>00:00:48</td>
<td>75,6</td>
<td>0,6
</td></tr>
<tr>
<td>256</td>
<td>16</td>
<td>00:00:34</td>
<td>106,7</td>
<td>0,4
</td></tr>
<tr>
<td>500</td>
<td>20</td>
<td>00:00:31</td>
<td>117,0</td>
<td>0,2
</td></tr>
<tr>
<td>600</td>
<td>20</td>
<td>00:00:35</td>
<td>103,6</td>
<td>0,2
</td></tr>
<tr>
<td>700</td>
<td>20</td>
<td>00:00:35</td>
<td>103,6</td>
<td>0,1
</td></tr></table>
 
Una vez que hemos obtenido resultados suficientes, podemos graficar el comportamiento de nuestra tarea, obteniendo una comparativa entre Speedup v/s Eficiencia:
 
 
<gallery widths=500px heights=500px>
Escalamiento-2022.png
</gallery>
 
 
Es recomendable que la eficiencia que se busque siempre sea superior a 0,5 (con un décimal), por lo que el uso de más de 128 procesos o más, según nuestro ejemplo, serán descartados. Incluso podemos agregar que el uso de más de 256 procesos y más no representa una verdadera mejora, e incluso afectará la cola de trabajo evitando que otras tareas entren en ejecución.
 
Ante esto, es recomendable seleccionar 128 o 64 procesadores para optar a un tiempo menor de ejecución y a una mejor eficacia.
 
== Cuentas de Pruebas ==
El NLHPC pone a disposición cuentas para la realización de '''Pruebas de Escalamiento'''.
 
Estas cuentas tienen las siguientes características:
 
* 500 cores
* 6 horas de tiempo de ejecución
* 100Gb de Almacenamiento
* 1 semana de duración
Pueden ser solicitadas desde nuestra página de SOLICITUD DE CUENTAS indicar que realizará la prueba de escalamiento.
 
=== Estudio de Escalamiento ===
Es importante que si va a solicitar una cuenta en el Cluster del NLHPC, realice una prueba de escalamiento como la indicada anteriormente en donde se pueda medir el Speedup y la Eficiencia.
 
Puede descargar la siguiente plantilla para ver un ejemplo y editarla con los datos de su aplicación.
 
=== Ejecución de varias instancias de mi programa ===
Una vez concluido tu estudio de escalamiento, podrás considerar una mayor cantidad de '''procesadores/cores''' a solicitar.
 
Siguiendo nuestro ejemplo anterior, si el valor máximo para una tarea es de '''128 procesos''' en paralelo y teniendo la necesidad de ejecutar '''LAMMPS''' con 3 archivos distintos de entrada, podré solicitar '''384 cores''' al momento de requerir mi cuenta.
 
=== Ejecución de distintos programas que escalen ===
En el caso de que sea necesario ejecutar distintos programas que puedan ser paralelizables, lo ideal es que el cálculo de escalamiento sea realizado en el programa que más recursos requiera.
 
Siempre considera realizar pruebas que sean un reflejo a las tareas reales que ejecutarás de esta manera existirá una correlación con lo que reportes y el comportamiento en producción de tus tareas.


== Ejemplo ==
== Programas secuenciales ==
En el siguiente caso se hace una reserva de 11 cores y 48G de memoria:
Si utilizará programas secuenciales que no soporten paralelización, no es necesario realizar el estudio de escalamiento.


400px-Cpu subutilizacion.png
En el caso de que reserve recursos a modo de intentar paralelizar una tarea secuencial, solo generará una reserva de recursos incorrecta, generando estados ociosos, los que son considerados subutilización y su tarea será cancelada.


Se puede observar que el uso efectivo es de solo 1 core a la vez.
Y por último si necesita ejecutar varias tareas secuenciales, estas se podrán lanzar de manera simultanea aprovechando los recursos disponibles.


400px-Memoria subutilizacion.png
== Pasos a seguir ==
Ya hemos visto el proceso de calcular el escalamiento de un programa, requerido para cuando soliciten cuentas en el Cluster del NLHPC.


Además, SLURM asignó por core al menos (48000/11) 4300M de memoria, cuando el uso de la tarea solo fue de 5M (los valores del gráfico se presentan en bytes).
Recuerda que las tareas de los usuarios son monitoreadas para dar un uso adecueado a los recursos. Si quieres saber más visita nuestra sección sobre Monitoreo De Tareas.


== Referencias ==
== Enlaces de Interés ==
man sbatch
* [https://www.uv.es/varnau/OC_T4.pdf Introducción al paralelismo y al rendimiento]
Monitoreo De Tareas
* [http://www.shodor.org/media/content/petascale/materials/UPModules/beginnersGuideHPC/moduleDocument_pdf.pdf A Begginer's Guide to High-Performance Computing]

Revisión del 15:30 6 sep 2022

Concepto de Escalamiento

Cuando nos referimos al Escalamiento de un programa, debemos apuntar al comportamiento del programa a medida que se ejecuta de manera paralela al tener mayor cantidad de procesadores para utilizar. De ser así, podemos considerar que el programa a utilizar permite ser escalable y podremos calcular su eficiencia.

Entonces, el escalamiento de un programa será calculado a razón de un determinado rango de procesadores a utilizar, pero pasado ciertos niveles -según el programa-, no importará la cantidad de procesadores que podamos asignar, ya que su eficiencia no será la óptima, e incluso puede verse afectada de manera negativa.

Importancia del Escalamiento de Programas

La importancia respecto a cómo escalan los programas se debe al uso óptimo de recursos disponibles, permitiendo que cada usuario obtenga los resultados esperados en un mejor tiempo en comparación a trabajos secuenciales, como también sabiendo que una incorrecta asignación de recursos puede hacer que los resultados deseados se obtengan un mayor período de tiempo como también que la tarea falle.

Además, una incorrecta asignación de recursos no solo afectará al usuario que intenta ejecutar una tarea, ya que también afectará a los otros usuarios del Cluster que requieren poder de cómputo.

Un escalamiento adecuado permitirá un uso eficiente de los recursos para la ejecución de nuestras tareas y las de todos.

Calculando el Speedup y Eficiencia de mi programa

Para realizar el escalamiento de un programa, utilizaremos dos métricas: Speedup y Eficiencia.

El Speedup se obtiene calculando el cociente entre el tiempo de ejecución secuencial (1 proceso) y el tiempo de ejecución aumentando la cantidad de procesos asignados a la misma tarea.

speedup = tiempo 1 proceso / tiempo N procesos


La Eficiencia se obtiene calculando el cociente entre el Speedup y el Número de Procesos asignados a la tarea.

eficiencia = speedup / Número de Procesos

La realización de este ejercicio consta en modificar la cantidad de procesadores a utilizar y comparar sus tiempos de ejecución. Cada tarea ejecutada debe ser planeada según los recursos disponibles en las particiones que necesitamos utilizar, como también considerar la agrupación de tareas.

En nuestro siguiente ejemplo hemos ejecutado una tarea en la partición Slims y utilizado el software LAMMPS. Al ejecutarlo por primera vez, asignando un solo proceso( #SBATCH -n 1 ), el tiempo de ejecución alcanzó a 1 hora con 27 segundos.

El script utilizado fue:

#!/bin/bash
#SBATCH -J escalamiento
#SBATCH -p slims
#SBATCH -n 1
#SBATCH --ntasks-per-node=1
#SBATCH --mail-user=$USER@nlhpc.cl
#SBATCH --mail-type=FAIL
#SBATCH -o escalamiento_%j.out
#SBATCH -e escalamiento_%j.err

ml purge
ml intel
ml impi
ml icc
ml LAMMPS/20Nov19

srun lmp_intel_cpu_intelmpi -in input-file/in.poly-bench

En las siguientes iteraciones, en donde aumentamos el número de procesos, los tiempos de ejecución fueron bajando. Los parámetros que fueron siendo modificados fueron:

  • Número de procesos (tareas en paralelo): -n X
  • Número de tareas por nodo (aumentando según los límetes de la partición Slims): --ntasks-per-node=X

Por ejemplo, el script usado para la prueba con 128 procesos fue:

#!/bin/bash
#SBATCH -J escalamiento
#SBATCH -p slims
#SBATCH -n 128
#SBATCH --ntasks-per-node=16
#SBATCH --mail-user=$USER@nlhpc.cl
#SBATCH --mail-type=FAIL
#SBATCH -o escalamiento_%j.out
#SBATCH -e escalamiento_%j.err

ml purge
ml intel
ml impi
ml icc
ml LAMMPS/20Nov19

srun lmp_intel_cpu_intelmpi -in input-file/in.poly-bench

La siguiente es la tabla de comparación en relación a número de procesos, tiempo de ejecución, Speedup y Eficiencia:

Procesos
-n
Tareas por Nodo
--ntasks-per-node
Tiempo Speedup Eficiencia
1 1 01:00:27 1 1
2 2 00:33:47 1,8 0,9
4 4 00:18:02 3,4 0,8
8 8 00:09:13 6,6 0,8
16 16 00:05:06 11,9 0,7
32 16 00:02:31 24,0 0,8
64 16 00:01:18 46,5 0,7
128 16 00:00:48 75,6 0,6
256 16 00:00:34 106,7 0,4
500 20 00:00:31 117,0 0,2
600 20 00:00:35 103,6 0,2
700 20 00:00:35 103,6 0,1

Una vez que hemos obtenido resultados suficientes, podemos graficar el comportamiento de nuestra tarea, obteniendo una comparativa entre Speedup v/s Eficiencia:



Es recomendable que la eficiencia que se busque siempre sea superior a 0,5 (con un décimal), por lo que el uso de más de 128 procesos o más, según nuestro ejemplo, serán descartados. Incluso podemos agregar que el uso de más de 256 procesos y más no representa una verdadera mejora, e incluso afectará la cola de trabajo evitando que otras tareas entren en ejecución.

Ante esto, es recomendable seleccionar 128 o 64 procesadores para optar a un tiempo menor de ejecución y a una mejor eficacia.

Cuentas de Pruebas

El NLHPC pone a disposición cuentas para la realización de Pruebas de Escalamiento.

Estas cuentas tienen las siguientes características:

  • 500 cores
  • 6 horas de tiempo de ejecución
  • 100Gb de Almacenamiento
  • 1 semana de duración

Pueden ser solicitadas desde nuestra página de SOLICITUD DE CUENTAS indicar que realizará la prueba de escalamiento.

Estudio de Escalamiento

Es importante que si va a solicitar una cuenta en el Cluster del NLHPC, realice una prueba de escalamiento como la indicada anteriormente en donde se pueda medir el Speedup y la Eficiencia.

Puede descargar la siguiente plantilla para ver un ejemplo y editarla con los datos de su aplicación.

Ejecución de varias instancias de mi programa

Una vez concluido tu estudio de escalamiento, podrás considerar una mayor cantidad de procesadores/cores a solicitar.

Siguiendo nuestro ejemplo anterior, si el valor máximo para una tarea es de 128 procesos en paralelo y teniendo la necesidad de ejecutar LAMMPS con 3 archivos distintos de entrada, podré solicitar 384 cores al momento de requerir mi cuenta.

Ejecución de distintos programas que escalen

En el caso de que sea necesario ejecutar distintos programas que puedan ser paralelizables, lo ideal es que el cálculo de escalamiento sea realizado en el programa que más recursos requiera.

Siempre considera realizar pruebas que sean un reflejo a las tareas reales que ejecutarás de esta manera existirá una correlación con lo que reportes y el comportamiento en producción de tus tareas.

Programas secuenciales

Si utilizará programas secuenciales que no soporten paralelización, no es necesario realizar el estudio de escalamiento.

En el caso de que reserve recursos a modo de intentar paralelizar una tarea secuencial, solo generará una reserva de recursos incorrecta, generando estados ociosos, los que son considerados subutilización y su tarea será cancelada.

Y por último si necesita ejecutar varias tareas secuenciales, estas se podrán lanzar de manera simultanea aprovechando los recursos disponibles.

Pasos a seguir

Ya hemos visto el proceso de calcular el escalamiento de un programa, requerido para cuando soliciten cuentas en el Cluster del NLHPC.

Recuerda que las tareas de los usuarios son monitoreadas para dar un uso adecueado a los recursos. Si quieres saber más visita nuestra sección sobre Monitoreo De Tareas.

Enlaces de Interés