Esegui il tuo primo carico di lavoro di Qiskit Serverless in remoto
Il codice di questa pagina è stato sviluppato in base ai seguenti requisiti. Si consiglia di utilizzare queste versioni o versioni più recenti.
qiskit[all]~=1.4.0 qiskit-ibm-runtime~=0.36.1 qiskit-ibm-catalog~=0.4
Qiskit Serverless sta subendo un aggiornamento e le sue caratteristiche stanno cambiando rapidamente. Durante questa fase di sviluppo, è possibile trovare le note di rilascio e la documentazione più recente alla pagina Qiskit ServerlessGitHub.
Questa sezione spiega come utilizzare qiskit-ibm-catalog per elencare i programmi disponibili in Qiskit Serverless, passare gli input a questi programmi, eseguirli in remoto, controllarne lo stato e recuperare i risultati e i log.
Assicurati di aver seguito la procedura descritta nella sezione " Scrivi il tuo primo programma in Qiskit Serverless " prima di iniziare.
Elenco dei programmi disponibili
È possibile utilizzare QiskitServerless.list() per visualizzare l'elenco dei programmi disponibili da eseguire con Qiskit Serverless. Ciò include il file caricato in precedenza transpile_remote_serverless.
from qiskit_ibm_catalog import QiskitServerless
serverless = QiskitServerless()
next(
program
for program in serverless.list()
if program.title == "transpile_remote_serverless"
)Output:
QiskitFunction(transpile_remote_serverless)
Esegui un programma caricato e passa gli input
Per prima cosa, impostate gli ingressi. Il programma ha tre ingressi: circuits, backend, e optimization_level. È possibile utilizzare 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:
Quindi, utilizzare 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)Impostare il livello di ottimizzazione:
optimization_level = 3Selezionare il programma con serverless.load('PROGRAM_NAME'):
transpile_remote_serverless = serverless.load("transpile_remote_serverless")Quindi, passate i vostri input ed eseguiteli in modo pitonico come segue:
job = transpile_remote_serverless.run(
circuits=qc_random,
backend=backend.name,
optimization_level=optimization_level,
)job.job_idOutput:
'118256c5-bbb0-4ea8-9e9f-51aac2220aef'
Controlla lo stato del lavoro
Con il vostro Qiskit Serverless job_id, potete controllare lo stato dei lavori in esecuzione. Questo include i seguenti stati:
QUEUED: Il programma remoto è nella coda di Qiskit Serverless. La priorità della coda è attualmente basata sulla quantità di utilizzo di Qiskit ServerlessINITIALIZING: Il programma remoto si sta avviando; questo include la configurazione dell'ambiente remoto e l'installazione delle dipendenzeRUNNING: Il programma è in esecuzione. A questo punto, se nel programma sono presenti le uscite diprint(), è possibile recuperare i registri usandojob.logs()DONE: Il programma è completo ed è possibile richiamare i dati memorizzati insave_result()conjob.results()
È inoltre possibile impostare stati di lavoro più dettagliati in Manage Qiskit Serverless compute and data resources.
job.status()Output:
'QUEUED'
Attualmente, la tabella dei carichi di lavoro di IBM Quantum riporta solo i carichi di lavoro del servizio di elaborazione IBM Quantum. Utilizza job.status() per visualizzare lo stato attuale del tuo carico di lavoro Qiskit Serverless.
Avete eseguito con successo il vostro primo programma Qiskit Serverless!
Recupera i registri e i risultati
Come già detto, una volta che un programma è RUNNING, si può usare job.logs() per recuperare i registri creati dalle uscite di print() :
logs = job.logs()
print(logs)Output:
No logs yet.
È anche possibile annullare un lavoro in qualsiasi momento:
job.stop()Output:
'Job has been stopped.'
Una volta che un programma è DONE, è possibile utilizzare 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()Output:
{'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 lavori eseguiti in precedenza con Qiskit Serverless
È possibile utilizzare jobs() per elencare tutti i lavori inviati a Qiskit Serverless:
old_jobs = serverless.jobs()
old_jobsOutput:
[<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
- Esplora gli strumenti di elaborazione e gestione dei dati disponibili per il tuo programma, compresa la parallelizzazione.