|
|
Línea 1: |
Línea 1: |
| == Concepto de Escalamiento ==
| | Login filezilla |
| 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.
| |
| <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 -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
| |
| </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=600px heights=400px >
| |
| 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.
| |
| | |
| == 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 ==
| |
| * [https://www.uv.es/varnau/OC_T4.pdf Introducción al paralelismo y al rendimiento]
| |
| * [http://www.shodor.org/media/content/petascale/materials/UPModules/beginnersGuideHPC/moduleDocument_pdf.pdf A Begginer's Guide to High-Performance Computing]
| |