Acelerando aplicaciones paralelas en Python: Numba vs. Cython
Aceptada
En esta charla, se explicarán las limitaciones de Python para obtener alto rendimiento en aplicaciones multi-hiladas y se describirán las principales características de Cython y Numba, destacando fortalezas y debilidades de cada uno. Adicionalmente, mediante un problema numérico sencillo, se mostrará un caso práctico de cómo utilizar ambas herramientas, y se analizará el costo de programación y el rendimiento de cada una ellas utilizando un procesador Intel Xeon Platinum 8276 de 56 núcleos (2 hilos hw por núcleo) y 256 GB de memoria RAM.
Tipo: Charla estandard, 25 minutos
Nivel: Avanzado
Disertantes: Enzo Rucci, Andrés Milla.
Biografiá del Disertante: Enzo Rucci: Doctor en Ciencias Informáticas. Profesor e investigador de la Facultad de Informática en la UNLP. Andrés Milla: Docente adscripto del seminario de Python en la UNLP y estudiante de 5º año de Licenciatura en Informática en la UNLP.
Horario: 13:30 - 14:00 - 29/10/2021
Sala: Main
Etiquetas/Tags: cython numba aplicaciones paralelas multithreading.
Descripción completa
En la última década, el procesamiento concurrente y paralelo ha tomado mayor relevancia debido a la constante necesidad de disminuir el tiempo de respuesta y al crecimiento vertiginoso de los datos a procesar. Por su parte, Python no ha sido ajeno a esta cuestión, existiendo diferentes alternativas que permiten explotar capacidades de concurrencia y paralelismo. El intérprete oficial de Python, conocido como CPython, presenta limitaciones al momento de implementar soluciones paralelas de memoria compartida, es decir, aplicaciones multi-hiladas. En particular, el principal problema es la utilización de un componente llamado Global Interpreter Lock (GIL), el cual permite que solo un hilo se ejecute a la vez. Esta característica afecta fuertemente a las aplicaciones cpu-bound, ya que llevan a que su ejecución sea prácticamente de forma secuencial. Para solucionar esta limitación, se suele utilizar procesos en vez de hilos, pero hay que tener en cuenta que el consumo de recursos es mayor y que aumenta el costo de programación por tener un espacio de direcciones distribuido. Lamentablemente, intérpretes alternativos a CPython que están orientados a la optimización de los programas, como PyPy y Pyston, también presentan el mismo problema. Afortunadamente, existen hoy 2 propuestas de traductores que permiten dar respuesta a esta problemática: Numba y Cython. Si bien ambas optan por desactivar el GIL y dan la posibilidad de paralelizar los algoritmos, tienen filosofías de desarrollo diferentes: 1. Numba, un compilador Just-In-Time que traduce Python en código de máquina optimizado. El mismo, utiliza una característica de Python conocida como decoradores para intervenir lo menos posible en el código del programador. Además, permite utilizar librerías como NumPy para manejar la organización de la memoria y emplear operaciones vectoriales sobre los datos. Esto último, resulta de sumo interés para disminuir las líneas de código y por consiguiente, el esfuerzo de programación empleado. 2. Cython, un compilador estático que permite transpilar Python a C y luego compilarlo a código objeto. A partir del uso de librerías de C como OpenMP, resulta posible desarrollar programas multi-hilados, pero a diferencia de Numba, requiere que el programador tenga conocimientos sobre C para poder optimizar la solución. Sabiendo esto, al momento de implementar una aplicación multi-hilada en Python, se debe seleccionar qué traductor utilizar. Esta elección es fundamental ya que no sólo impactará en el rendimiento del programa sino también en el tiempo requerido para desarrollo como también en el costo de mantenerlo a futuro. En esta charla, se explicarán las limitaciones de Python para obtener alto rendimiento en aplicaciones multi-hiladas y se describirán las principales características de Cython y Numba, destacando fortalezas y debilidades de cada uno. Adicionalmente, mediante un problema numérico sencillo, se mostrará un caso práctico de cómo utilizar ambas herramientas, y se analizará el costo de programación y el rendimiento de cada una ellas utilizando un procesador Intel Xeon Platinum 8276 de 56 núcleos (2 hilos hw por núcleo) y 256 GB de memoria RAM.