Vai al contenuto principale

Esegui il tuo primo workload Qiskit Serverless da remoto

Versioni dei pacchetti

Il codice in questa pagina è stato sviluppato utilizzando i seguenti requisiti. Si consiglia di usare queste versioni o versioni più recenti.

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

Questa sezione illustra come usare qiskit-ibm-catalog per elencare i programmi disponibili in Qiskit Serverless, passare input a questi programmi, eseguirli da remoto, controllarne lo stato e recuperare risultati e log.

Assicurati di esserti autenticato a Qiskit Serverless usando la tua chiave API (consulta Deploy su IBM Quantum Platform per le istruzioni).

Elenca i programmi disponibili​

Puoi usare QiskitServerless.list() per recuperare un elenco dei programmi disponibili da eseguire con Qiskit Serverless. Questo include il precedentemente caricato transpile_remote_serverless.

# 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)

Esegui un programma caricato e passa gli input​

Prima di tutto, configura i tuoi input. Il tuo programma ha tre input: circuits, backend e optimization_level. Puoi usare random_circuit per creare 30 circuiti casuali:

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)

Output della cella di codice precedente

Successivamente, usa QiskitRuntimeService e least_busy per selezionare un backend:

from qiskit_ibm_runtime import QiskitRuntimeService

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

Imposta il tuo livello di ottimizzazione:

optimization_level = 3

Seleziona il tuo programma con serverless.load('PROGRAM_NAME'):

transpile_remote_serverless = serverless.load("transpile_remote_serverless")

Quindi, passa i tuoi input ed eseguilo in modo pythonico come segue:

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

Controlla lo stato del job​

Con il tuo job_id di Qiskit Serverless, puoi controllare lo stato dei job in esecuzione. Sono previsti i seguenti stati:

  • QUEUED: Il programma remoto è nella coda di Qiskit Serverless. La priorità in coda è attualmente basata su quanto hai utilizzato Qiskit Serverless
  • INITIALIZING: Il programma remoto si sta avviando; questo include la configurazione dell'ambiente remoto e l'installazione delle dipendenze
  • RUNNING: Il programma è in esecuzione. In questa fase, se hai output print() nel tuo programma, puoi recuperare i log usando job.logs()
  • DONE: Il programma è completato, e puoi recuperare i dati memorizzati in save_result() con job.results()

Puoi anche impostare stati del job più dettagliati in Gestisci le risorse di calcolo e dati di Qiskit Serverless.

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

Attualmente, la tabella dei workload di IBM Quantum riflette solo i workload di Qiskit Runtime. Usa job.status() per vedere lo stato attuale del tuo workload Qiskit Serverless.

Hai eseguito con successo il tuo primo programma Qiskit Serverless!

Recupera log e risultati​

Come accennato in precedenza, una volta che un programma è in stato RUNNING, puoi usare job.logs() per recuperare i log creati dagli output print():

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

In qualsiasi momento, puoi anche annullare un job:

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

Una volta che un programma è in stato DONE, puoi usare job.results() per recuperare il risultato memorizzato in 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>]}

Elenca i job eseguiti in precedenza con Qiskit Serverless​

Puoi usare jobs() per elencare tutti i job inviati a 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>]

Passi successivi​

Raccomandazioni