Sari la conținutul principal

Scrie primul tău program Qiskit Serverless

Versiuni de pachete

Codul de pe această pagină a fost dezvoltat folosind cerințele de mai jos. Recomandăm utilizarea acestor versiuni sau a unora mai noi.

qiskit[all]~=1.3.1
qiskit-ibm-runtime~=0.34.0
qiskit-aer~=0.15.1
qiskit-serverless~=0.18.1
qiskit-ibm-catalog~=0.2
qiskit-addon-sqd~=0.8.1
qiskit-addon-utils~=0.1.0
qiskit-addon-mpf~=0.2.0
qiskit-addon-aqc-tensor~=0.1.2
qiskit-addon-obp~=0.1.0
scipy~=1.15.0
pyscf~=2.8.0

Acest exemplu demonstrează cum să folosești instrumentele qiskit-serverless pentru a crea un program de transpilare paralelă, și apoi să implementezi qiskit-ibm-catalog pentru a implementa programul tău pe IBM Quantum Platform și a-l folosi ca serviciu remote reutilizabil.

Exemplu: transpilare la distanță cu Qiskit Serverless

Pornește cu următorul exemplu care transpilează un circuit față de un backend dat și un optimization_level țintă, și adaugă treptat mai multe elemente pentru a implementa volumul de lucru pe Qiskit Serverless.

Pune următoarea celulă de cod în fișierul ./source_files/transpile_remote.py. Acesta este programul care va fi încărcat în Qiskit Serverless.

# Added by doQumentation — required packages for this notebook
!pip install -q qiskit qiskit-ibm-catalog qiskit-ibm-runtime qiskit-serverless
# This cell is hidden from users, it just creates a new folder
from pathlib import Path

Path("./source_files").mkdir(exist_ok=True)
%%writefile ./source_files/transpile_remote.py

from qiskit.transpiler import generate_preset_pass_manager

def transpile_remote(circuit, optimization_level, backend):
"""Transpiles an abstract circuit into an ISA circuit for a given backend."""
pass_manager = generate_preset_pass_manager(
optimization_level=optimization_level,
backend=backend
)
isa_circuit = pass_manager.run(circuit)
return isa_circuit
Writing ./source_files/transpile_remote.py

Configurează-ți fișierele

Qiskit Serverless necesită organizarea fișierelor .py ale volumului tău de lucru într-un director dedicat. Următoarea structură este un exemplu de bună practică:

serverless_program
├── program_uploader.ipynb
└── source_files
├── transpile_remote.py
└── *.py

Serverless încarcă conținutul directorului source_files pentru a rula de la distanță. Odată ce acestea sunt configurate, poți ajusta transpile_remote.py pentru a prelua intrări și a returna ieșiri.

Obține argumentele programului

Fișierul tău inițial transpile_remote.py are trei intrări: circuits, backend_name și optimization_level. Serverless este în prezent limitat să accepte doar intrări și ieșiri serializabile. Din acest motiv, nu poți transmite backend direct, deci folosește backend_name ca șir de caractere în schimb.

%%writefile --append ./source_files/transpile_remote.py

from qiskit_serverless import get_arguments, save_result, distribute_task, get

# Get program arguments
arguments = get_arguments()
circuits = arguments.get("circuits")
backend_name = arguments.get("backend_name")
optimization_level = arguments.get("optimization_level")
Appending to ./source_files/transpile_remote.py

În acest moment, poți obține Backend-ul tău cu QiskitRuntimeService și adăuga programul existent cu codul următor. Codul următor necesită să fi salvat deja acreditările.

%%writefile --append ./source_files/transpile_remote.py

from qiskit_ibm_runtime import QiskitRuntimeService

service = QiskitRuntimeService()
backend = service.backend(backend_name)
Appending to ./source_files/transpile_remote.py

În final, poți rula transpile_remote() pentru toate circuits transmise și returna transpiled_circuits ca rezultat:

%%writefile --append ./source_files/transpile_remote.py

results = [
transpile_remote(circuit, 1, backend)
for circuit in circuits
]

save_result({
"transpiled_circuits": results
})
Appending to ./source_files/transpile_remote.py

Implementează pe IBM Quantum Platform

Secțiunea anterioară a creat un program care va fi rulat de la distanță. Celulele de cod din această secțiune încarcă acel program în Qiskit Serverless.

Folosește qiskit-ibm-catalog pentru a te autentifica la QiskitServerless cu cheia ta API, pe care o găsești pe panoul de control IBM Quantum, și încarcă programul.

Poți folosi save_account() pentru a salva acreditările (vezi secțiunea Configurare pentru utilizarea IBM Cloud). Reține că aceasta scrie acreditările în același fișier ca QiskitRuntimeService.save_account().

from qiskit_ibm_catalog import QiskitServerless, QiskitFunction

# Authenticate to the remote cluster and submit the pattern for remote execution
serverless = QiskitServerless()

Qiskit Serverless comprimă conținutul directorului working_dir (în acest caz, source_files) într-un tar, care este încărcat și curățat ulterior. entrypoint identifică fișierul executabil principal al programului pe care Qiskit Serverless îl va rula. În plus, dacă programul tău are dependențe pip personalizate, le poți adăuga într-un array dependencies:

transpile_remote_demo = QiskitFunction(
title="transpile_remote_serverless",
entrypoint="transpile_remote.py",
working_dir="./source_files/",
)
serverless.upload(transpile_remote_demo)
QiskitFunction(transpile_remote_serverless)

Pentru a verifica dacă a fost încărcat cu succes, folosește serverless.list():

# Get program from serverless.list() that matches the title of the one we uploaded
next(
program
for program in serverless.list()
if program.title == "transpile_remote_serverless"
)
QiskitFunction(transpile_remote_serverless)
# This cell is hidden from users, it checks the program uploaded correctly
assert _.title == "transpile_remote_serverless" # noqa: F821
# This cell is hidden from users, it checks the program executes correctly
from time import sleep
from qiskit import QuantumCircuit

qc = QuantumCircuit(2)
transpile_remote_serverless = serverless.load("transpile_remote_serverless")
job = transpile_remote_serverless.run(
circuits=[qc],
backend="ibm_sherbrooke",
optimization_level=1,
)
while True:
sleep(5)
status = job.status()
if status not in ["QUEUED", "INITIALIZING", "RUNNING", "DONE"]:
raise Exception(
f"Unexpected job status: '{status}'\n"
+ "Here are the logs:\n"
+ job.logs()
)
if status == "DONE":
break

Pașii următori

Recomandări