Exécuter ta première charge de travail Qiskit Serverless à distance
Versions des packages
Le code de cette page a été développé avec les dépendances suivantes. Nous recommandons d'utiliser ces versions ou des versions plus récentes.
qiskit[all]~=1.4.0
qiskit-ibm-runtime~=0.36.1
qiskit-ibm-catalog~=0.4
Cette section explore comment utiliser qiskit-ibm-catalog pour lister les programmes disponibles dans Qiskit Serverless, leur passer des entrées, les exécuter à distance, vérifier leur statut et récupérer les résultats et les journaux.
Assure-toi de t'être authentifié à Qiskit Serverless à l'aide de ta clé API (voir Déployer sur IBM Quantum Platform pour les instructions).
Lister les programmes disponibles
Tu peux utiliser QiskitServerless.list() pour récupérer la liste des programmes disponibles à exécuter avec Qiskit Serverless. Cela inclut le programme transpile_remote_serverless précédemment téléversé.
# 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)
Exécuter un programme téléversé et lui passer des entrées
D'abord, configure tes entrées. Ton programme attend trois entrées : circuits, backend et optimization_level. Tu peux utiliser random_circuit pour créer 30 circuits aléatoires :
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)
Ensuite, utilise QiskitRuntimeService et least_busy pour sélectionner un backend :
from qiskit_ibm_runtime import QiskitRuntimeService
service = QiskitRuntimeService()
backend = service.least_busy(operational=True, simulator=False)
print(backend.name)
Définis ton niveau d'optimisation :
optimization_level = 3
Sélectionne ton programme avec serverless.load('PROGRAM_NAME') :
transpile_remote_serverless = serverless.load("transpile_remote_serverless")
Ensuite, passe tes entrées et exécute-le de manière pythonique comme suit :
job = transpile_remote_serverless.run(
circuits=qc_random,
backend=backend.name,
optimization_level=optimization_level,
)
job.job_id
'118256c5-bbb0-4ea8-9e9f-51aac2220aef'
Vérifier le statut du job
Avec le job_id de ton job Qiskit Serverless, tu peux vérifier le statut des jobs en cours. Cela inclut les statuts suivants :
QUEUED: Le programme distant est dans la file d'attente de Qiskit Serverless. La priorité de la file d'attente est actuellement basée sur ton utilisation de Qiskit ServerlessINITIALIZING: Le programme distant démarre ; cela inclut la configuration de l'environnement distant et l'installation des dépendancesRUNNING: Le programme est en cours d'exécution. À ce stade, si ton programme contient des sortiesprint(), tu peux récupérer les journaux avecjob.logs()DONE: Le programme est terminé, et tu peux récupérer les données enregistrées danssave_result()avecjob.results()
Tu peux également définir des statuts de job plus détaillés dans Gérer les ressources de calcul et de données Qiskit Serverless.
job.status()
'QUEUED'
# This cell is hidden from users, it checks the job status
assert _ in ["QUEUED", "INITIALIZING", "RUNNING", "DONE"] # noqa: F821
Actuellement, le tableau des charges de travail IBM Quantum ne reflète que les charges de travail Qiskit Runtime. Utilise job.status() pour voir le statut actuel de ta charge de travail Qiskit Serverless.
Tu as réussi à exécuter ton premier programme Qiskit Serverless !
Récupérer les journaux et les résultats
Comme mentionné précédemment, une fois qu'un programme est en état RUNNING, tu peux utiliser job.logs() pour récupérer les journaux créés à partir des sorties print() :
logs = job.logs()
print(logs)
No logs yet.
À tout moment, tu peux également annuler un job :
job.stop()
'Job has been stopped.'
Une fois qu'un programme est en état DONE, tu peux utiliser job.results() pour récupérer le résultat enregistré dans 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>]}
Lister les jobs précédemment exécutés avec Qiskit Serverless
Tu peux utiliser jobs() pour lister tous les jobs soumis à 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>]
Prochaines étapes
- Explore les outils de gestion du calcul et des données disponibles pour ton programme, notamment la parallélisation.