DeepMind libero el código fuente de S6, un compilador JIT para Python
DeepMind, conocida por sus desarrollos en el campo de la inteligencia artificial, dio a conocer recientemente que ha tomado la decisión de liberar el código fuente del proyecto S6, que es él desarrolló de un compilador JIT para el lenguaje Python.
El proyecto es interesante porque está diseñado como una biblioteca de extensión que se puede integrar con CPython estándar, lo que brinda compatibilidad total con CPython y no requiere la modificación del código del intérprete. El proyecto se ha estado desarrollando desde 2019, pero desafortunadamente se redujo y ya no se está desarrollando.
S6 fue un proyecto que comenzó dentro de DeepMind en 2019 para acelerar CPython con compilación justo a tiempo («JIT»). Estas funciones se proporcionarían como una biblioteca de Python normal y no sería necesario realizar cambios en el intérprete de CPython. S6 pretendía hacer por Python lo que V8 hizo por Javascript (el nombre es un homenaje a V8). El trabajo se basó en CPython versión 3.7. Dependiendo de la carga de trabajo, vimos aceleraciones de hasta 9.5x en puntos de referencia comunes.
La razón principal del porqué se decidió liberar el código fuente, una de ellas y como ya se mencionó fue que el proyecto dejo de tener soporte, otra de las razones principales fue dado que con base en los desarrollos creados, estos aún pueden ser útiles para mejorar Python.
Hemos dejado de trabajar en S6 internamente. Como tal, este repositorio ha sido archivado y no estamos aceptando solicitudes de extracción o problemas. Abrimos el código y proporcionamos una descripción general del diseño a continuación para estimular las conversaciones dentro de la comunidad de Python e inspirar el trabajo futuro para mejorar Python.
En cuanto al funcionamiento de S6, debemos mencionar que S6 para Python se compara con el motor V8 para JavaScript en términos de tareas que resuelve. La biblioteca reemplaza el controlador del intérprete de código de bytes ceval.c existente con su propia implementación que utiliza la compilación JIT para acelerar la ejecución.
S6 verifica si la función actual ya se ha compilado y, de ser así, ejecuta el código compilado y, de no ser así, ejecuta la función en un modo de interpretación de bytecode similar al intérprete de CPython. La interpretación cuenta el número de instrucciones ejecutadas y llamadas asociadas con la función que se está procesando.
Después de alcanzar un determinado hito, se inicia el proceso de compilación para acelerar el código que se ejecuta con frecuencia. La compilación se realiza en la representación intermedia de strongjit, que, después de la optimización, se convierte en instrucciones de máquina del sistema de destino utilizando la biblioteca asmjit..
Dependiendo de la naturaleza de la carga, en condiciones óptimas, S6 demuestra un aumento en la velocidad de ejecución de la prueba de hasta 9,5 veces en comparación con el CPython habitual.
Cuando se ejecutan 100 iteraciones del conjunto de pruebas de Richards, hay una aceleración de 7 veces, y cuando se ejecuta la prueba Raytrace, que contiene una gran cantidad de cálculos matemáticos, es de 3 a 4,5 veces más rápida.
Las tareas que son difíciles de optimizar con S6 son los proyectos que usan la API de C, como NumPy, así como las operaciones relacionadas con la necesidad de verificar los tipos de una gran cantidad de valores.
También se observa un rendimiento deficiente para llamadas únicas de funciones que consumen muchos recursos debido al uso de la implementación no optimizada del intérprete de Python de S6 (el desarrollo no ha alcanzado la etapa de optimización del modo de interpretación).
Por ejemplo, en el test Unpack Sequence, que desempaqueta grandes conjuntos de arrays/tuplas, con una sola llamada se observa una ralentización de hasta 5 veces, y con una llamada cíclica el rendimiento es de 0,97 desde CPython.
Finalmente para quienes estén interesados en poder conocer más al respecto, deben saber que el código del compilador JIT está escrito en C++ y actualmente está basado en CPython 3.7, ademas de qué el código fuente ya está abierto bajo la licencia Apache 2.0 y se puede consultar desde el siguiente enlace.