Partilhar via


Como enviar um circuito com o Cirq para o Azure Quantum

Saiba como enviar um circuito quântico Cirq usando o azure-quantumPython pacote. Você pode enviar circuitos Cirq para o Azure Quantum usando o Kit de Desenvolvimento Quântico do Azure (QDK) e o Jupyter Notebook no Visual Studio Code (VS Code) de sua máquina local.

Para obter mais informações, consulte Circuitos quânticos.

Pré-requisitos

Para obter detalhes da instalação, consulte Configurar a extensão QDK.

  • Um espaço de trabalho do Azure Quantum em sua assinatura do Azure. Para criar um espaço de trabalho, consulte Criar um espaço de trabalho do Azure Quantum.

  • Um Python ambiente com Python e Pip instalado.

  • VS Code com o Azure Quantum Development Kit e Pythonextensões Jupyter instaladas.

  • O pacote Azure Quantum azure-quantum com o cirq extra e o qdk e os ipykernel pacotes.

    python -m pip install --upgrade "azure-quantum[cirq]" qdk ipykernel 
    

    Nota

    Se o kernel Python do Jupyter ipykernel não for detetado, o VS Code solicitará que você o instale.

Criar um novo Jupyter Notebook

  1. No VS Code, abra o menu Exibir e escolha Paleta de comandos.
  2. Insira e selecione Criar: Novo Bloco de Anotações Jupyter.
  3. O VS Code deteta e exibe a versão de Python e o ambiente virtual Python que foi selecionado para o notebook. Se você tiver vários Python ambientes, talvez seja necessário selecionar um kernel usando o seletor de kernel no canto superior direito. Se nenhum ambiente foi detetado, consulte Jupyter Notebooks no VS Code para obter informações de configuração.

Carregue as importações necessárias

Na primeira célula do seu bloco de notas, execute o seguinte código para carregar as importações necessárias:

import azure.quantum
from azure.quantum.cirq import AzureQuantumService

Conectar-se ao serviço Azure Quantum

Para se conectar ao serviço Azure Quantum, seu programa precisará da ID do recurso e do local do seu espaço de trabalho do Azure Quantum.

  1. Inicie sessão na sua conta do Azure, https://portal.azure.com,
  2. Selecione seu espaço de trabalho do Azure Quantum e navegue até Visão geral.
  3. Copie os parâmetros nos campos.

Adicione uma nova célula e use as informações da sua conta para criar Workspace e AzureQuantumService objetos para se conectar ao seu espaço de trabalho do Azure Quantum.

workspace = Workspace(  
    resource_id = "", # Add the resourceID of your workspace
    location = "" # Add the location of your workspace (for example "westus")
    )

service = AzureQuantumService(workspace)

Listar tudo targets

Use o targets()método para listar todos os targets itens em seu espaço de trabalho que podem executar seu circuito, incluindo o tempo de fila atual e a disponibilidade.

Nota

Todos os targets que estão no seu espaço de trabalho podem não estar listados - apenas os targets que podem aceitar um circuito Cirq ou OpenQASM serão listados aqui.

print(service.targets())
[<Target name="quantinuum.qpu.h2-1", avg. queue time=0 s, Degraded>,
<Target name="quantinuum.sim.h2-1sc", avg. queue time=1 s, Available>,
<Target name="quantinuum.sim.h2-1e", avg. queue time=40 s, Available>,
<Target name="ionq.simulator", avg. queue time=3 s, Available>,
<Target name="ionq.qpu.aria-1", avg. queue time=1136774 s, Available>]

Crie um circuito simples

Em seguida, crie um circuito Cirq simples para executar. Este circuito usa a raiz quadrada do portão X, nativa do sistema de hardware IonQ.

import cirq

q0, q1 = cirq.LineQubit.range(2)
circuit = cirq.Circuit(
    cirq.X(q0)**0.5,             # Square root of X
    cirq.CX(q0, q1),              # CNOT
    cirq.measure(q0, q1, key='b') # Measure both qubits
)
print(circuit)
0: ───X^0.5───@───M────────
              │   │
1: ───────────X───M────────

Selecione um target para executar o seu programa

Executar no simulador da IonQ

Agora você pode executar o programa por meio do serviço Azure Quantum e obter o resultado. A célula a seguir envia um trabalho (para o simulador IonQ padrão) que executa o circuito com 100 disparos, aguarda até que o trabalho seja concluído e retorna os resultados.

result = service.run(program=circuit, repetitions=100, target="ionq.simulator")

Isso retorna um cirq.Result objeto.

print(result)
    b=1001100101100001000011011101000011010100010111100011001000100100010000001110010010101110110000011010, 1001100101100001000011011101000011010100010111100011001000100100010000001110010010101110110000011010

Estimar o custo do trabalho

Antes de executar um trabalho na QPU, você deve estimar quanto custará para ser executado.

Para obter os detalhes de preços mais atuais, consulte Preços IonQ ou encontre seu espaço de trabalho e veja as opções de preços na guia "Provedor" do seu espaço de trabalho via: aka.ms/aq/myworkspaces.

Executar em IonQ QPU

O trabalho anterior foi executado no simulador padrão, "ionq.simulator". No entanto, você também pode executá-lo no processador de hardware do IonQ (uma unidade de processador quântico (QPU)). Para executar na QPU IonQ, forneça "ionq.qpu.aria-1" como argumento target :

result = service.run(
    program=circuit,
    repetitions=100,
    target="ionq.qpu.aria-1",
    timeout_seconds=500 # Set timeout to accommodate queue time on QPU
)

Novamente, isso retorna um cirq.Result objeto.

print(result)
b=0101011011011111100001011101101011011110100010000000011110111000100100110110101100110001001111101111, 0101011011011111100001011101101011011110100010000000011110111000100100110110101100110001001111101111

Modelo assíncrono usando tarefas

Para circuitos de longa duração, pode ser útil executá-los de forma assíncrona. O service.create_job método retorna um Job objeto, que você pode usar para obter os resultados depois que o trabalho foi executado com êxito.

job = service.create_job(
    program=circuit,
    repetitions=100,
    target="ionq.simulator"
)

Para verificar o status do trabalho, use job.status():

print(job.status())
'completed'

Para aguardar a conclusão do trabalho e, em seguida, obter os resultados, use a chamada de bloqueio job.results().

result = job.results()
print(result)
00: 0.5
11: 0.5

Observe que isso não retorna um cirq.Result objeto. Em vez disso, retorna um objeto de resultado que é específico para o simulador IonQ e utiliza probabilidades de estado em lugar de dados de disparo.

type(result)
cirq_ionq.results.SimulatorResult

Para convertê-lo em um cirq.Result objeto, use result.to_cirq_result():

print(result.to_cirq_result())
b=1110101111111110111000011101011111001100010000001011011101001111001111001101100111010000001100011100, 1110101111111110111000011101011111001100010000001011011101001111001111001101100111010000001100011100