Facebook libero el código fuente de Cinder el cual es utilizado por Instagram
Facebook dio a conocer recientemente mediante una publicación, la liberación del código fuente del proyecto Cinder, la cual es una bifurcación de la rama de CPython y la principal implementación de referencia del lenguaje de programación Python.
Cinder se utiliza en la infraestructura de producción de Facebook para impulsar Instagram e incluye optimizaciones para mejorar el rendimiento. El código se ha publicado para discutir la posibilidad de migrar optimizaciones preparadas a la corriente principal de CPython y para ayudar a otros proyectos de mejora del rendimiento de CPython.
Facebook menciona que no va a admitir Cinder como un proyecto de código abierto separado y el código se presenta en la forma en que se usa en la infraestructura de la empresa, sin documentación adicional.
Cinder tampoco se está promocionando como una alternativa a CPython: el principal objetivo de desarrollo es mejorar el propio CPython.
El código de Cinder se considera razonablemente confiable y probado en entornos de producción, pero si se identifican problemas, deberán resolverse por sí mismos, ya que Facebook no garantiza que responderá a mensajes de error externos y solicitudes de extracción.
Al mismo tiempo, Facebook no excluye la cooperación constructiva con la comunidad y está listo para discutir ideas sobre cómo hacer que Cinder sea aún más rápido o cómo acelerar la transferencia de cambios preparados a la estructura principal de CPython.
Las principales optimizaciones implementadas en Cinder son:
- Almacenamiento en caché en línea del código de bytes: La esencia del método es identificar situaciones de ejecución de un código de operación típico que se puede optimizar y reemplazar dinámicamente dicho código de operación con opciones especializadas más rápidas.
- Evaluación de rutina: Para las llamadas a funciones asíncronas que se procesan inmediatamente, el resultado de dichas funciones se sustituye directamente sin crear una corrutina y sin invocar un bucle de eventos. En el código utilizado por Facebook, que utiliza en gran medida, la optimización conduce a una aceleración de aproximadamente un 5%.
- Compilación selectiva de JIT a nivel de métodos y funciones individuales: se habilita mediante la opción «-X jit» o la variable de entorno PYTHONJIT=1 y permite acelerar muchas pruebas de rendimiento entre 1,5 y 4 veces.
La lista de funciones para las que se debe habilitar JIT se puede determinar en función de los resultados del perfil. En el futuro, se espera soporte para la compilación dinámica de JIT basado en el análisis interno de la frecuencia de llamadas a funciones, pero teniendo en cuenta las características específicas de los procesos de lanzamiento en Instagram, la compilación de JIT también es adecuada para Facebook en la etapa inicial.
El JIT primero convierte el código de bytes de Python en una representación intermedia de alto nivel (HIR), que está razonablemente cerca del código de bytes de Python, pero está diseñado para usar una máquina virtual basada en registros en lugar de una máquina virtual basada en pila, y también usa información de tipo y detalles adicionales relevantes para el desempeño. Luego, el HIR se convierte en un formulario de asignación única estática ( SSA) y se somete a etapas de optimización basadas en el recuento de referencias y los datos de uso de la memoria. Como resultado, se genera una representación intermedia de bajo nivel (LIR), que se acerca al lenguaje ensamblador. - Modo estricto para módulos:La funcionalidad tiene tres componentes: El tipo StrictModule. Un analizador estático capaz de determinar que la ejecución de un módulo no afecta el código fuera de ese módulo.
- Static Python: es un compilador de código de bytes experimental que utiliza anotaciones de tipo para generar código de bytes que es específico para cada tipo y se ejecuta más rápido a través de la compilación JIT. En algunas pruebas, la combinación de Static Python y JIT demuestra una mejora del rendimiento de hasta 7 veces superior al CPython típico. En muchas situaciones, los resultados se evalúan como si se usaran los compiladores MyPyC y Cython.
Finalmente si estás interesado en poder obtener el código de Cinder o conocer más al respecto, puedes consultar los detalles en el siguiente enlace.