E a DeepMind liberou o código fonte do compilador JIT para Python S6 para acelerar o CPython com compilação just-in-time (“JIT”).
A DeepMind, conhecida por seus desenvolvimentos no campo da inteligência artificial, anunciou recentemente que tomou a decisão de liberar o código-fonte do projeto S6, que é o desenvolvimento de um compilador JIT para a linguagem Python.
DeepMind liberou o código fonte do compilador JIT para Python S6
S6, é uma biblioteca de compilador JIT independente para CPython. O projeto é interessante porque foi concebido como uma biblioteca de extensão que pode ser integrada com o CPython padrão, fornecendo compatibilidade total com o CPython e não exigindo modificação do código do interpretador.
Esse projeto está em desenvolvimento desde 2019, mas infelizmente foi reduzido e não está mais em desenvolvimento.
“O S6 foi um projeto iniciado no DeepMind em 2019 para acelerar o CPython com compilação just-in-time (“JIT”). Essas funções seriam fornecidas como uma biblioteca Python normal e nenhuma alteração no interpretador CPython seria necessária. O S6 pretendia fazer pelo Python o que o V8 fez pelo Javascript (o nome é uma homenagem ao V8). O trabalho foi baseado no CPython versão 3.7. Dependendo da carga de trabalho, vimos acelerações de até 9,5x em benchmarks comuns.”
O principal motivo pelo qual foi decidido liberar o código fonte, um deles e como já mencionado foi que o projeto deixou de ter suporte, outro dos principais motivos foi dado que com base nos desenvolvimentos criados, estes ainda podem ser úteis para melhorar o python .
“Paramos de trabalhar no S6 internamente. Como tal, este repositório foi arquivado e não estamos aceitando solicitações de pull ou problemas. Abrimos o código e fornecemos uma visão geral do design abaixo para estimular conversas na comunidade Python e inspirar trabalhos futuros para melhorar o Python.”
Em relação ao desempenho do S6, devemos mencionar que o S6 para Python se compara ao mecanismo V8 para JavaScript em termos de tarefas que ele resolve.
A biblioteca substitui o driver interpretador de bytecode ceval.c existente por sua própria implementação que usa a compilação JIT para acelerar a execução.
S6 verifica se a função atual já foi compilada e, em caso afirmativo, executa o código compilado e, caso contrário, executa a função em um modo de interpretação de bytecode semelhante ao interpretador CPython.
A interpretação conta o número de instruções executadas e chamadas associadas à função que está sendo processada.
Depois que um determinado marco é alcançado, o processo de compilação é iniciado para acelerar o código executado com frequência.
A compilação é realizada na representação intermediária do strongjit, que, após a otimização, é convertida em instruções de máquina do sistema de destino usando a biblioteca asmjit.
Dependendo da natureza da carga, em condições ideais, o S6 demonstra um aumento na velocidade de execução do teste de até 9,5 vezes em comparação com o CPython normal.
Ao executar 100 iterações do conjunto de testes Richards, há uma aceleração de 7 vezes, e ao executar o teste Raytrace, que contém muita matemática, é 3-4,5 vezes mais rápido.
Tarefas difíceis de otimizar com S6 são projetos que usam a API C, como NumPy, bem como operações relacionadas à necessidade de verificar os tipos de um grande número de valores.
O desempenho ruim também é observado para chamadas de função únicas e intensivas em recursos devido ao uso da implementação não otimizada do interpretador S6 Python (o desenvolvimento não atingiu o estágio de otimização do modo de interpretação).
Por exemplo, no teste Unpack Sequence, que descompacta grandes conjuntos de arrays/tuplas, uma única chamada mostra uma desaceleração de até 5 vezes e uma chamada cíclica produz 0,97 do CPython.
Por fim, para quem estiver interessado em saber mais sobre o assunto, deve saber que o código do compilador JIT é escrito em C++ e atualmente é baseado em CPython 3.7, além do fato de o código-fonte já estar aberto sob a licença Apache 2.0 e pode ser consultado no seguinte endereço.