Pular para o conteúdo principal

Executando circuitos quânticos

Assista ao vídeo sobre circuitos quânticos e primitivas por Olivia Lanes, ou abra o vídeo em uma janela separada no YouTube.

Visão geral da aula

Esta aula será uma visão geral dos fundamentos para executar uma computação quântica em escala de utilidade, desde o hardware quântico utilizado até os princípios a considerar ao projetar um circuito quântico. Idealmente, ao final desta aula, você vai saber:

  1. O que os computadores quânticos da IBM® realmente são. Você vai precisar conhecer o básico das características do hardware para projetar seus circuitos quânticos de forma otimizada para rodá-los nele.

  2. O que é o Qiskit, o que são primitivas e como podemos usá-los para criar e executar circuitos quânticos.

  3. O fluxo de trabalho típico que seguimos para executar experimentos em escala. Isso inclui selecionar as melhores primitivas para seu caso de uso, mapear um problema para um circuito quântico e aplicar mitigação e supressão de erros, que nos permitem extrair o máximo de poder dessas máquinas.

Hardware — processadores quânticos IBM

Para entender como podemos fazer escolhas ótimas no design de circuitos quânticos de grande escala, precisamos saber um pouco sobre o hardware real que vai executar esses circuitos. Então vamos discutir brevemente os qubits físicos e os processadores quânticos IBM.

Os processadores quânticos IBM são construídos usando qubits transmon supercondutores, que são circuitos elétricos compostos de uma junção Josephson e um capacitor conectados em paralelo. A junção Josephson é um indutor não linear criado a partir de duas camadas sobrepostas de metal supercondutor com uma barreira isolante entre elas. Em temperaturas muito baixas, os elétrons em supercondutores se emparelham para formar o que é conhecido como um par de Cooper. Os pares de Cooper podem tunelizar espontaneamente pela barreira isolante de um lado da junção para o outro. Esse comportamento de tunelamento dá origem às propriedades não lineares que criam nosso qubit.

Linhas de transmissão de micro-ondas são fabricadas no chip para entregar sinais de micro-ondas aos qubits. Quando aplicamos pulsos de micro-ondas altamente calibrados — com frequência, amplitude, forma e duração específicas — às linhas, podemos fazer os qubits fazerem coisas específicas. Isso forma a base de nossas portas quânticas. Fabricamos o chip de modo que os qubits vizinhos estejam conectados em uma estrutura de rede específica chamada rede hexagonal pesada. Essa conectividade — a chamada topologia — de nossos processadores é um fator importante a considerar ao projetar um circuito, como vamos discutir mais adiante na aula.

As instruções para o pulso de micro-ondas vão do seu computador, pela nuvem, e chegam à eletrônica de controle à temperatura ambiente, que interpreta essas instruções e gera fisicamente os pulsos. Depois que as caixas de controle à temperatura ambiente criam os pulsos, eles viajam por cabos até um refrigerador de diluição e, eventualmente, chegam ao chip quântico. O sinal entra nos ressonadores, passa por um fio de ligação e então flui pela linha de transmissão até nossos qubits.

A IBM tem dezenas de computadores quânticos em todo o mundo, e recentemente atualizamos nossa frota para ter exclusivamente processadores maiores que 100 qubits. Alguns deles estão localizados em um data center quântico IBM no norte de Nova York e disponibilizados pela nuvem para uso de todos — e alguns deles são sistemas dedicados em premissas que apoiam parceiros na IBM Quantum® Network. Você pode fazer login em quantum.cloud.ibm.com para ver a quais processadores você tem acesso.

Cada processador lista três métricas de desempenho, que discutimos na aula anterior, mas como lembrete, são: contagem de qubits, EPLG e CLOPS.

  • Contagem de qubits. Isso é autoexplicativo: é o número total de qubits disponíveis para uso em um único processador quântico. Para um problema relativamente grande em escala de utilidade, você vai precisar garantir que está usando um processador com qubits suficientes para conseguir abordar o problema. Mas a contagem de qubits por si só não é a única coisa que importa.

  • EPLG, ou "erros por porta em camadas" (errors per layered gate). Esta é uma medida da qualidade dos qubits e portas quânticas. Ela mede o erro médio que cada porta introduz em um circuito que entrelaça qubits vizinhos em uma cadeia de 100 qubits. Você quer que isso seja o menor possível.

  • CLOPS, ou "operações de camada de circuito por segundo" (circuit layer operations per second). Isso quantifica a velocidade do processador. Ele mede quantas camadas de um certo circuito de benchmarking chamado circuito de volume quântico uma unidade de processamento quântico (QPU) pode executar por unidade de tempo. Quanto maior o número, mais rápido podemos computar.

A importância de cada uma dessas métricas varia dependendo da aplicação específica, e em futuras aulas, vamos ver exemplos reais para ver como cada um desses fatores pode afetar o resultado de um cálculo.

Software: Qiskit e Qiskit Runtime

Para transformar seu problema quântico em instruções para um computador quântico, você vai usar o Qiskit, o kit de desenvolvimento de software de código aberto projetado para trabalho em computadores quânticos, desenvolvido pela IBM. Há também o Ecossistema Qiskit — uma coleção de tutoriais de software e funções que constroem ou ampliam as funcionalidades principais do Qiskit — e o Qiskit Runtime — um serviço de computação quântica e modelo de programação que permite aos usuários projetar e otimizar suas cargas de trabalho quânticas e executá-las eficientemente usando as Primitivas do Qiskit Runtime.

Uma primitiva é um pequeno bloco de construção que você pode usar para projetar um circuito ou job maior. As duas primitivas mais importantes para nós são o sampler e o estimator, que vamos discutir com mais profundidade em breve.

Com o lançamento recente do Qiskit v1.0, o Qiskit se tornou mais eficiente e estável do que nunca. Então, para aqueles que estão começando agora, você entrou na hora certa! Para aqueles que já estão familiarizados com o Qiskit, você vai precisar baixar e reinstalar a versão mais nova. Para um guia completo de instalação, visite o guia Instalar o Qiskit.

Circuitos quânticos

Agora estamos prontos para discutir o fundamento dos programas quânticos: os circuitos quânticos. Esta seção servirá apenas como uma revisão — se você não está familiarizado com circuitos quânticos, recomendamos aprender sobre eles com mais profundidade visitando a aula de Circuitos Quânticos no curso "Fundamentos de informação quântica" antes de continuar.

Um circuito quântico é uma rede de portas quânticas e medições ligadas por fios que representam qubits, como mostrado abaixo. Os circuitos quânticos podem ser lidos como partituras musicais, da esquerda para a direita, começando no tempo 0 à esquerda. Qubits virtuais — aqueles que ainda não foram atribuídos a um qubit físico em um processador — são listados em ordem crescente de cima para baixo.

As portas são representadas por símbolos diferentes nos fios do(s) qubit(s) envolvido(s). Portas de qubit único — como uma porta Hadamard, representada abaixo (a caixa com o H) — afetam apenas o qubit em cujo fio estão colocadas. Portas de múltiplos qubits — como uma porta CNOT, também mostrada abaixo (o sinal de mais no círculo com uma linha conectada ao q0) — afetam dois ou mais qubits. Na porta CNOT representada, o estado do q1 muda de acordo com o estado do q0. Depois que todas as portas são executadas, podemos medir os qubits, indicado pelas portas pretas com o símbolo de medição. Os resultados das medições são escritos nos registros clássicos, o barramento "meas" com linha dupla abaixo.

Exemplo de circuito quântico simples

Uma característica importante de um circuito é sua profundidade. A profundidade de um circuito quântico é o número mínimo de "camadas" de portas quânticas, executadas em paralelo, necessárias para completar o circuito. As portas quânticas podem ser executadas em paralelo (ao mesmo tempo) sempre que não têm qubits em comum. Mas se duas ou mais portas atuam no mesmo qubit, não podemos executá-las em paralelo — elas devem ser executadas em duas camadas separadas, uma depois da outra.

Há outra forma, menos óbvia, de determinar a profundidade de um circuito, jogando uma espécie de jogo. As regras são simples: começando de qualquer fio de qubit à esquerda, você deve viajar para a direita e contar o número de portas que encontra em seu caminho. Você pode saltar para um fio vizinho somente quando ele está conectado ao seu fio atual por uma porta de múltiplos qubits. O objetivo é maximizar o número de portas que você encontra ao longo do seu caminho. Esse número máximo também é a profundidade do circuito.

Exemplo de circuito de nove camadas

Como as portas quânticas levam tempo para serem implementadas, a profundidade de um circuito corresponde aproximadamente à quantidade de tempo necessária para um computador quântico executar o circuito. Algumas máquinas são mais adequadas para circuitos de grande profundidade do que outras, devido aos tempos de decoerência dos qubits no processador. Portanto, precisamos conhecer a profundidade de um circuito para saber se ele pode ser executado em um determinado dispositivo.

Projetando um circuito quântico: padrões Qiskit

Então, como procedemos para projetar e executar um circuito quântico? A forma mais fácil de entender um fluxo de trabalho típico de computação quântica é por meio dos padrões Qiskit. Os padrões Qiskit são um framework conceitual que permite aos usuários executar cargas de trabalho quânticas implementando certas etapas com ferramentas modulares. Isso permite que as tarefas de computação quântica sejam executadas por uma infraestrutura de computação heterogênea e poderosa (CPU/GPU/QPU). As etapas podem ser executadas como serviço e podem incorporar gerenciamento de recursos, o que permite a composabilidade perfeita de novas capacidades à medida que são desenvolvidas.

Aqui estão as etapas principais, que usuários experientes do Qiskit provavelmente vão reconhecer.

  1. Mapear. Esta etapa formaliza como pegamos um problema geral de interesse e descobrimos como mapeá-lo em um computador quântico na forma de um circuito quântico.

  2. Otimizar. Nesta etapa, usamos o transpilador do Qiskit para rotear e dispor o circuito em hardware de qubit físico real. Isso inclui traduzir as portas quânticas individuais em sequências de operações que são executadas no hardware, bem como uma otimização no layout das portas.

  3. Executar. As primitivas do Qiskit Runtime fornecem a interface para o hardware do IBM Quantum que permite que circuitos transpilados sejam executados. Esta etapa também inclui o uso de técnicas de supressão e mitigação de erros, que em grande parte podem ser abstraídas do usuário.

  4. Pós-processar. Nesta etapa, os dados do próprio processador quântico são processados, fornecendo ao usuário resultados úteis sobre o problema original. Basicamente, isso abrange qualquer análise adicional dos dados adquiridos.

Mapear

A etapa de Mapeamento essencialmente faz a pergunta: "Como traduzo meu problema em um circuito quântico que possa razoavelmente ser executado em hardware quântico?" Não há dúvida: mapear é um problema difícil e uma área ativa de pesquisa. Não há um método infalível que garanta sucesso, mas existem diretrizes recomendadas e exemplos de problemas que já sabemos como mapear.

A primeira diretriz é deixar os computadores clássicos fazerem o trabalho em que são melhores. As tarefas que são fáceis para os computadores clássicos provavelmente não se beneficiarão de um computador quântico. Os computadores quânticos são para problemas que são classicamente difíceis. Claro, se esta é a sua primeira vez usando o Qiskit ou um computador quântico, não se preocupe em encontrar um problema computacionalmente complexo. Divida-o em problemas menores e mais manejáveis que você possa aprender a abordar antes de ir direto para um projeto em escala de utilidade.

Em seguida, traduza os resultados para o seu problema que você deseja medir ou entender em um valor de expectativa ou função de custo. Uma função de custo é uma função específica do problema que define o objetivo do problema como algo a ser minimizado ou maximizado. Ela pode ser usada para ver o quão bem um estado ou solução de teste está se saindo em relação a esse objetivo. Essa noção pode ser aplicada a várias aplicações em química, aprendizado de máquina, finanças, otimização e assim por diante — não importa necessariamente de qual assunto você está abordando o problema.

Também tenha em mente que o hardware que você vai usar tem uma topologia específica, como discutimos na seção de hardware. Alguns qubits estão conectados, e outros não — você vai precisar mapear seu problema em um circuito que respeite a topologia hexagonal pesada dos processadores quânticos IBM.

Por enquanto, a coisa mais importante a ter em mente é que esta etapa requer prática. Você precisa ter uma boa compreensão não só do seu problema, mas também das capacidades do hardware — e vamos passar por exemplos e casos de uso específicos em futuras aulas para ver como equilibrar todas essas considerações.

Otimizar

Em seguida, precisamos escolher um processador quântico que tenha qubits suficientes de qualidade alta o suficiente para podermos executar nosso circuito quântico. Tome essas decisões guiado pelas três métricas que discutimos na seção de hardware: contagem de qubits, EPLG e CLOPS.

Então otimizamos nosso circuito para o hardware selecionado. Primeiro, precisamos dispor e rotear nosso circuito eficientemente. Layout refere-se ao mapeamento dos qubits virtuais no circuito para os qubits físicos no processador. Roteamento refere-se a ajustar o circuito para que a conectividade entre qubits virtuais no circuito corresponda à conectividade dos qubits físicos no processador. Há algumas coisas a ter em mente durante a etapa de layout e roteamento.

  1. Nem todos os qubits estão conectados. Alguns estão muito distantes uns dos outros no chip, e precisamos reduzir ou eliminar interações de longa distância onde quer que seja possível. Você poderia aplicar uma sequência de portas SWAP entre qubits vizinhos para mover a informação dos qubits, mas as portas SWAP são custosas e propensas a erros, então pode haver formas melhores de fazer isso. Tente evitar muitas portas SWAP custosas.

  2. Layout e roteamento são processos iterativos. Você pode fazer isso manualmente, mas há também uma ferramenta Qiskit chamada mapomatic, que pode fazer recomendações para um layout físico de qubits com base em taxas de erro aproximadas. O transpilador (que vamos discutir em breve) também pode fazer uma sugestão informada.

Em seguida, podemos compor sequências de portas de um qubit atuando no mesmo qubit em portas únicas — e às vezes também podemos nos livrar de portas desnecessárias ou combinações de portas. Por exemplo, algumas combinações de portas podem ser reduzidas a combinações mais simples — e de fato, às vezes uma combinação de portas pode equivaler à operação de identidade, então podemos simplesmente eliminá-las. Você pode fazer isso automaticamente usando o transpilador Qiskit — mas também pode fazê-lo manualmente porta a porta se quiser mais controle.

Depois de melhorar o layout, o roteamento e as contagens de portas do circuito — seja manualmente ou usando o transpilador — normalmente queremos visualizar nosso circuito para garantir que o tempo de todas as portas faça sentido. Há um argumento que você pode sinalizar no transpilador para visualizar o cronograma do seu circuito e garantir que tudo está alinhado da forma que você esperaria.

Transpilador Qiskit

Como mencionado anteriormente, o Transpilador Qiskit pode ser usado para ajudar nas etapas iniciais do fluxo de trabalho de padrões. Agora vamos nos aprofundar em suas capacidades com mais detalhes. Ele pode reescrever um dado circuito de entrada para que corresponda à topologia de um dispositivo quântico específico e otimizar o circuito para execução e resiliência contra ruído. Ele também reescreve um dado circuito nas portas base do processador quântico específico que você selecionou para usar.

O Qiskit tem quatro pipelines de transpilação integrados correspondendo a diferentes níveis de otimização, e a menos que você já esteja familiarizado com a otimização de circuitos quânticos, recomendamos usar um deles. Por padrão, o processo de transpilação inclui estas seis etapas:

  1. Inicialização. Esta etapa executa todas as passagens iniciais necessárias antes de começarmos a embutir o circuito no backend. Isso normalmente envolve desdobrar instruções personalizadas e converter o circuito apenas para portas de um e dois qubits.

  2. Layout. Esta etapa mapeia os qubits virtuais no circuito para os qubits físicos em um backend. Veja a Etapa de Layout para mais detalhes.

  3. Roteamento. Esta etapa é executada depois que um layout foi aplicado e injeta portas (como portas swap) no circuito original para torná-lo compatível com a conectividade do backend. Veja a Etapa de Roteamento para mais detalhes.

  4. Tradução. Esta etapa traduz as portas no circuito para o conjunto de bases do backend alvo. Veja a Etapa de Tradução para mais detalhes.

  5. Otimização. Esta etapa executa o loop de otimização principal repetidamente até que uma condição (como atingir uma determinada profundidade alvo) seja alcançada. Temos quatro níveis de otimização diferentes para escolher, descritos abaixo.

  6. Agendamento. Esta etapa é para qualquer passagem de agendamento ciente do hardware. Em alto nível, o agendamento pode ser pensado como a inserção de atrasos no circuito para contabilizar o tempo ocioso dos qubits entre a execução de instruções.

Existem quatro níveis de otimização variando de 0 a 3, onde níveis de otimização mais altos levam mais tempo e esforço computacional, mas podem produzir um circuito melhor. O nível de otimização 0 é destinado a experimentos de caracterização de dispositivos e, como tal, apenas mapeia o circuito de entrada para as restrições do backend alvo, sem realizar nenhuma otimização. O nível de otimização 3 é o que mais se esforça para otimizar o circuito. No entanto, como muitas das técnicas de otimização no transpilador são baseadas em heurísticas, gastar mais esforço computacional nem sempre resulta em uma melhoria na qualidade do circuito de saída. Se isso for de maior interesse, veja a documentação do transpilador na documentação do Qiskit.

Supressão de erros

O primeiro passo para reduzir erros em um circuito é otimizar o layout, o roteamento e minimizar a contagem de portas, o que já fizemos, usando o transpilador ou por conta própria. Agora vamos falar sobre métodos mais sofisticados de supressão de erros.

A supressão de erros refere-se a uma classe de técnicas que transformam um circuito durante a compilação para minimizar erros. É distinta da mitigação de erros, que vamos discutir mais tarde na seção "Executar" abaixo. As duas formas mais comuns de supressão de erros que usamos são o desacoplamento dinâmico e o twirling de Pauli:

  1. O desacoplamento dinâmico é usado para efetivamente cancelar parte do ruído ambiental introduzido quando um qubit fica ocioso. Ao aplicar uma série de portas em momentos específicos, você pode fazer com que o ruído acumulado em uma parte do período ocioso cancele aproximadamente o ruído da outra parte.
  2. O twirling de Pauli é uma forma de inserir portas aleatórias não para cancelar o ruído, como no desacoplamento dinâmico, mas para simplificá-lo. Ao inserir portas aleatórias, impede que os efeitos de diferentes erros se acumulem tão rapidamente, e torna o ruído mais fácil de caracterizar, já que agora tem uma natureza estocástica. Este método também forma a base de uma poderosa técnica de mitigação de erros, que vamos discutir abaixo.

Executar

Agora estamos prontos para executar o programa quântico. As primitivas do Qiskit Runtime fornecem uma interface para o hardware do IBM Quantum, e elas também abstraem a supressão e a mitigação de erros do usuário. Há duas primitivas para escolher: o Sampler e o Estimator.

O Sampler do Qiskit Runtime executa o circuito várias vezes em um dispositivo quântico, realizando medições em cada execução, e reconstruindo a distribuição de probabilidade a partir das strings de bits recuperadas. Quanto mais execuções (ou shots) ele realiza, mais precisos serão os resultados, mas isso requer mais tempo e recursos quânticos. Especificamente, ele calcula a probabilidade de obter cada possível estado de base padrão medindo o estado preparado pelo circuito.

O Estimator do Qiskit Runtime usa um processo algébrico complexo para estimar o valor de expectativa em um dispositivo quântico real, decompondo o observável em uma combinação de outros observáveis com autobase conhecida.

A etapa de Execução também é quando podemos selecionar a estratégia de mitigação de erros. A mitigação de erros refere-se a técnicas que permitem aos usuários reduzir os erros do circuito modelando o ruído do dispositivo que estava presente no momento da execução. Normalmente, isso resulta em sobrecarga de pré-processamento quântico relacionada ao treinamento do modelo e sobrecarga de pós-processamento clássico para mitigar erros nos resultados brutos usando o modelo gerado. Em troca dessa sobrecarga, somos capazes de obter resultados muito mais precisos.

Existem várias técnicas que podemos implementar para mitigação de erros. Vamos discutir três, em ordem crescente de resiliência a erros, mas também, consequentemente, em ordem crescente de custo computacional. Esteja ciente, no entanto, de que esta é uma área ativa de pesquisa — então provavelmente continuaremos inventando novas e melhorando as antigas.

No nível de resiliência 0, o transpilador não faz nada ao seu circuito.

No nível 1, ele introduz um método chamado Twirled Readout Error eXtinction (T-REX). O T-REX usa o twirling de Pauli, como foi discutido na seção de supressão de erros. Como mencionado, inserir portas aleatórias no circuito pode fazer até mesmo ruído muito complicado e difícil de modelar parecer estocástico, e muito mais fácil de contabilizar ou subtrair no pós-processamento.

No nível de resiliência 2, a Extrapolação de Ruído Zero (ZNE) é adicionada. Esta é uma técnica popular com a qual tivemos muito sucesso recente. A ideia por trás do ZNE pode ser um pouco surpreendente — na verdade, adicionamos ruído em cima do que já existe! Mas isso nos permite extrapolar na direção inversa, para prever como os resultados seriam se houvesse menos e menos ruído.

Adicionar ruído pode ser realizado de algumas formas diferentes. Por exemplo, podemos estender as portas para torná-las mais longas e, portanto, mais propensas a erros, ou executar mais portas que resultam em uma operação de identidade, de modo que o circuito não muda funcionalmente, mas amostramos propositalmente mais ruído. Você tem que fazer isso para cada circuito e cada valor de expectativa que queira acompanhar, porém — então você pode ver como pode acabar sendo computacionalmente caro.

Um tipo específico de ZNE é chamado de Amplificação Probabilística de Erros (PEA). Depois de aprendermos um modelo de ruído para uma porta, o PEA funciona amostrando erros desse modelo de ruído e injetando-os deliberadamente no circuito. Isso ainda não está disponível no Qiskit, mas estará disponível mais tarde este ano.

A forma final de mitigação de erros que vamos discutir é o Cancelamento Probabilístico de Erros (PEC). Em vez de estar no 3º nível de resiliência, o PEC é uma capacidade especial que você deve ativar manualmente no Qiskit, porque os recursos computacionais necessários não escalam muito bem em comparação com as outras técnicas de mitigação de erros. Você começa aprendendo sobre o ruído que está afetando seu circuito — execute circuitos de aprendizado de ruído ou caracterização de ruído para cada camada única de portas de dois qubits no seu circuito. Esses resultados permitem descrever o ruído em termos de operadores de Pauli. Uma vez que você conhece esses termos de ruído, pode modificar seus circuitos para que eles tenham efetivamente as portas de Pauli opostas integradas para cancelar esses canais de ruído. De certa forma, o processo é semelhante à forma como os fones de ouvido com cancelamento de ruído funcionam. No entanto, essa forma de desfazer o ruído é muito custosa, com um tempo de execução que cresce rapidamente e exponencialmente no número de portas, então pode não ser a melhor escolha para um circuito muito grande.

Pós-processar

A etapa de pós-processamento é onde visualizamos e analisamos a saída do nosso circuito quântico. Existem várias ferramentas Qiskit disponíveis para você fazer isso, como os módulos de visualização e quantum-info. Não vamos cobri-los aqui, mas veremos esses módulos em ação à medida que mergulhamos em alguns exemplos de aplicações em futuras aulas.

Conclusão

Esperamos que esta aula tenha lhe dado um tour rápido das principais considerações e do fluxo de trabalho que usamos quando queremos executar uma computação quântica em escala de utilidade. Estava repleta de informações, e muito disso não vai entrar na cabeça até que vejamos alguns exemplos reais onde esses conceitos teóricos são colocados em prática. Então, é isso que será o restante do curso. Afinal, este curso não se chama Computação Quântica na Prática à toa!

Na próxima vez, vamos ver um exemplo específico de como usar o fluxo de trabalho de padrões Qiskit para projetar e executar um circuito quântico que resolve o problema clássico da teoria dos grafos chamado MaxCut.