Pular para o conteúdo principal

Execute sua primeira carga de trabalho do Qiskit Serverless remotamente

Versões dos pacotes

O código nesta página foi desenvolvido usando os seguintes requisitos. Recomendamos usar estas versões ou versões mais recentes.

qiskit[all]~=1.4.0
qiskit-ibm-runtime~=0.36.1
qiskit-ibm-catalog~=0.4

Esta seção explora como usar qiskit-ibm-catalog para listar programas disponíveis no Qiskit Serverless, passar entradas para esses programas, executá-los remotamente, verificar o status e recuperar resultados e logs.

Certifique-se de que você se autenticou no Qiskit Serverless usando sua chave de API (consulte Implantar na IBM Quantum Platform para obter instruções).

Listar programas disponíveis

Você pode usar QiskitServerless.list() para buscar uma lista dos programas disponíveis para executar com o Qiskit Serverless. Isso inclui o transpile_remote_serverless enviado anteriormente.

# Added by doQumentation — required packages for this notebook
!pip install -q qiskit qiskit-ibm-catalog qiskit-ibm-runtime
from qiskit_ibm_catalog import QiskitServerless

serverless = QiskitServerless()
next(
program
for program in serverless.list()
if program.title == "transpile_remote_serverless"
)
QiskitFunction(transpile_remote_serverless)

Executar um programa enviado e passar entradas

Primeiro, configure suas entradas. Seu programa tem três entradas: circuits, backend e optimization_level. Você pode usar random_circuit para criar 30 circuitos aleatórios:

from qiskit.circuit.random import random_circuit

qc_random = [(random_circuit(4, 4, measure=True, seed=i)) for i in range(10)]
qc_random[0].draw(output="mpl", idle_wires=False)

Saída da célula de código anterior

Em seguida, use QiskitRuntimeService e least_busy para selecionar um backend:

from qiskit_ibm_runtime import QiskitRuntimeService

service = QiskitRuntimeService()
backend = service.least_busy(operational=True, simulator=False)
print(backend.name)

Defina seu nível de otimização:

optimization_level = 3

Selecione seu programa com serverless.load('PROGRAM_NAME'):

transpile_remote_serverless = serverless.load("transpile_remote_serverless")

Em seguida, passe suas entradas e execute-o de forma pythônica conforme mostrado abaixo:

job = transpile_remote_serverless.run(
circuits=qc_random,
backend=backend.name,
optimization_level=optimization_level,
)
job.job_id
'118256c5-bbb0-4ea8-9e9f-51aac2220aef'

Verificar o status do job

Com o job_id do seu Qiskit Serverless, você pode verificar o status dos jobs em execução. Isso inclui os seguintes status:

  • QUEUED: O programa remoto está na fila do Qiskit Serverless. A prioridade da fila é baseada atualmente em quanto você usou o Qiskit Serverless
  • INITIALIZING: O programa remoto está iniciando; isso inclui a configuração do ambiente remoto e a instalação de dependências
  • RUNNING: O programa está em execução. Neste estágio, se você tiver saídas print() no seu programa, pode recuperar os logs usando job.logs()
  • DONE: O programa foi concluído e você pode recuperar os dados armazenados em save_result() com job.results()

Você também pode definir status de job mais detalhados em Gerenciar recursos de computação e dados do Qiskit Serverless.

job.status()
'QUEUED'
# This cell is hidden from users, it checks the job status
assert _ in ["QUEUED", "INITIALIZING", "RUNNING", "DONE"] # noqa: F821
dica

Atualmente, a tabela de cargas de trabalho da IBM Quantum reflete apenas as cargas de trabalho do Qiskit Runtime. Use job.status() para ver o status atual da sua carga de trabalho do Qiskit Serverless.

Você executou com sucesso seu primeiro programa do Qiskit Serverless!

Recuperar logs e resultados

Como mencionado anteriormente, assim que um programa estiver em RUNNING, você pode usar job.logs() para buscar os logs criados a partir das saídas de print():

logs = job.logs()
print(logs)
No logs yet.

A qualquer momento, você também pode cancelar um job:

job.stop()
'Job has been stopped.'

Assim que um programa estiver DONE, você pode usar job.results() para buscar o resultado armazenado em save_result():

# We can't get results from a cancelled job, so we'll fetch a completed one instead
completed_job = next(
job for job in serverless.jobs() if job.status() == "DONE"
)
completed_job.result()
{'transpiled_circuits': [<qiskit.circuit.quantumcircuit.QuantumCircuit at 0x7f93eca64810>,
<qiskit.circuit.quantumcircuit.QuantumCircuit at 0x7f93ec5e5310>,
<qiskit.circuit.quantumcircuit.QuantumCircuit at 0x7f93ec5d5310>,
<qiskit.circuit.quantumcircuit.QuantumCircuit at 0x7f93ec58b490>,
<qiskit.circuit.quantumcircuit.QuantumCircuit at 0x7f93ec57d310>,
<qiskit.circuit.quantumcircuit.QuantumCircuit at 0x7f93ec535950>,
<qiskit.circuit.quantumcircuit.QuantumCircuit at 0x7f93ec523c90>,
<qiskit.circuit.quantumcircuit.QuantumCircuit at 0x7f93ec60a990>,
<qiskit.circuit.quantumcircuit.QuantumCircuit at 0x7f93ec5527d0>,
<qiskit.circuit.quantumcircuit.QuantumCircuit at 0x7f93ec4152d0>]}

Listar jobs executados anteriormente com o Qiskit Serverless

Você pode usar jobs() para listar todos os jobs enviados ao Qiskit Serverless:

old_jobs = serverless.jobs()
old_jobs
[<Job | 118256c5-bbb0-4ea8-9e9f-51aac2220aef>,
<Job | e9a36469-7d6b-4f00-bf91-78709ebdbbff>,
<Job | 4efd601b-8f61-4c8e-b14a-0b8a9c649dc0>,
<Job | 87cd22c7-8eb9-4606-bdb4-befe946e9e9b>,
<Job | be9a6dfd-0830-4250-aa60-acdd05bb8818>,
<Job | 479513dd-6a76-4c3e-ba49-bb21351b9a05>,
<Job | f9c20c31-be46-41b3-97ac-99f7be61f89e>,
<Job | 37fa2489-4449-4bfb-974e-9d9a9ec3cc21>,
<Job | b754c4e8-6817-48db-9bb9-74c151d6349a>,
<Job | 78bc6744-b417-48cb-8e01-59bb63bcc2be>]

Próximas etapas

Recomendações