Criei um servidor para rodar algoritmos quânticos
Olá pessoal, gostaria de compartilhar um projeto que estive trabalhando recentemente.
Sempre fui apaixonado por computação quântica, mas sempre tive um pequeno problema ao fazer experimentos no meu próprio computador.
Para quem nunca mexeu com isso, vou dar uma explicação breve. Computação quântica é uma área relativamente recente que utiliza da mecânica quântica (ou física quântica, como preferir) para realizar certas computações que, teoricamente, levariam milhares de anos para serem executadas em um supercomputador tradicional. Repare que disse certas computações, a computação quântica não é uma máquina milagrosa que faz tudo ficar mais rápido, mas um novo paradigma com um funcionamento muito diferente do que estamos acostumados na computação atual (clássica).
Tais máquinas, são extremamente caras e dificeis de se manter. Por isso, para nós entusiastas, temos algumas alternativas para brincar com algoritmos quânticos.
- Utilizar QPUs (quantum processor unit, CPU quântica, de uma forma mais simples) que estão disponíveis na nuvem, como os da IBM, Quantinumm, IONQ, etc.
- Utilizar simuladores na seu computador atual.
- Ser muito rico e ter um desses em casa💸.
Dentre as 3 alternativas, as duas primeiras são as mais promissoras, sendo a primeira a ideal para rodar os algoritmos, visto que eles serão submetidos para uma máquina real.
Contudo, temos um pequeno problema. Executar um algoritmo em uma QPU pode ser muito demorado. Uma vez que não temos clusters imensos com várias QPUs, como comumente vemos em servidores modernos, cada submissão é adicionada à uma fila de espera, sem nenhum tipo de distinção entre tamanhos de circuito (maneira como o algoritmo é descrito para a máquina) a serem executados. Ou seja, mesmo que vocês esteja fazendo um pequno experimento com 2 qubits (parte fundamental da computação quântica, são os bits que funcionam seguindo as leis da física quântica) e duas operações simples e rápidas, você terá de esperar todos os que estão na sua frente, mesmo que demore dias.
Com isso, a solução mais viável é usar um simulador localmente. Com certeza, essa é a melhor opção, mas temos algumas ressalvas.
Executar em CPU pode ser custoso. Se você não possui uma placa NVIDIA com Compute Capability de pelo menos 7.0, você não poderá executar esse circuito em sua placa de vídeo (mesmo tendo núcleos CUDA). Ou seja, além de tudo que você tem no seu computador rodando por padrão, se você executar um algoritmo quântico em um simulador usando qiskit aer, por exemplo, tudo ficará muito lento, mesmo que teoricamente você possua uma GPU que poderia dar conta do recado.
OBS: estou usando como base o QISKIT, já que é o framework mais usado para isso. Quando digo que você precisa ter GPUs mais recentes com maior poder de computação, é devido ao fato da maioria dos frameworks utilizarem o cuquantum por baixo, do qual necessita dessas especificações. Sendo assim, podem existir casos de frameworks isolados que consigam tirar proveito da GPU com o CUDA por si só, mas aqui estou falando da maioria.
A solução que encontrei para essse problema, foi a criação de um servidor responsável por receber jobs e executa-los.
Ao submeter um job, o servidor retorna um ID, do qual pode ser usado para pegar os resultados posteriormente, assim como feito quando você submete um algoritmo à uma máquina real da IBM, por exemplo.
Fazendo isso, seria possível rodar esse pequeno servidor usando docker na nuvem, ou até mesmo em uma outra máquina local, como um raspberry pi ou um computador velho, e deixar sua máquina principal disponível para uso.
Para tal feito, utilizei tecnologias como: Go, Python, Docker, RabbitMQ, PostgreSQL, GRPC+Protobuf, entre outros. Foi um imenso aprendizado no caminho.
Além do servidor em si, fiz uma biblioteca em python responsável por agir com um cliente e uma coleção de plugins que você pode adicionar ao servidor para expandir o número de simuladores disponíveis.
Para os interessados, seguem os links:
- Servidor: https://github.com/Dpbm/qserver
- Cliente: https://github.com/Dpbm/qserver-connect
- Lista de Plugins: https://github.com/quantum-plugins/plugins-list
O projeto não está 100% testado ainda e precisamos adicionar autenticação. Aos entusiastas, deixo aberto a contribuições.
Em breve, lançarei novo plugins para backends do CIRQ e PennyLane.
Agradeço muito pela sua atenção☺️