Sari la conținutul principal

Ghid de început pentru Executor

Versiuni de pachete

Codul de pe această pagină a fost dezvoltat folosind următoarele cerințe. Recomandăm să folosești aceste versiuni sau mai noi.

qiskit[all]~=2.4.0
qiskit-ibm-runtime~=0.46.1
samplomatic~=0.18.0
# Added by doQumentation — required packages for this notebook
!pip install -q qiskit qiskit-ibm-runtime samplomatic

Similar cu primitiva Sampler, Executor eșantionează registrele de ieșire din execuțiile circuitelor cuantice, dar nu are nicio suprimare sau atenuare a erorilor integrată. În schimb, face parte din modelul de execuție direcționată care furnizează ingredientele pentru a capta intențiile de proiectare pe partea de client și transferă generarea costisitoare a variantelor de circuit pe partea de server. Executor urmează directivele furnizate în adnotările și opțiunile circuitului, generează și leagă valorile parametrilor, execută circuitele legate pe hardware și returnează rezultatele și metadatele execuției. Nu ia decizii implicite în locul tău și îți oferă control deplin și transparență.

notă

Pachetul Qiskit nu are încă o clasă de bază pentru primitiva Executor.

Înainte de a începe

Unele exemple de cod de pe această pagină folosesc samplex, care face parte din pachetul Samplomatic. Prin urmare, înainte de a rula acele blocuri de cod, trebuie să instalezi Samplomatic, așa cum se arată în blocul de cod următor. Pentru mai multe informații, consultă documentația Samplomatic.

pip install samplomatic

# For visualization support, include the visualization dependencies.
# pip install samplomatic[vis]

Pași pentru a folosi primitiva Executor

1. Inițializează contul

Deoarece Qiskit Runtime este un serviciu gestionat, trebuie mai întâi să îți inițializezi contul. Poți apoi selecta QPU-ul pe care dorești să îl folosești pentru a calcula valoarea de așteptare.

Urmează pașii din Configurarea contului tău IBM Cloud® dacă nu ai deja un cont.

from qiskit_ibm_runtime import QiskitRuntimeService, Executor
from qiskit_ibm_runtime.quantum_program import QuantumProgram
from qiskit.circuit import QuantumCircuit
from qiskit.transpiler import generate_preset_pass_manager
from samplomatic.transpiler import generate_boxing_pass_manager
from samplomatic import build

# Initialize the service and choose a backend
service = QiskitRuntimeService()
backend = service.least_busy(operational=True, simulator=False)
print(backend)
<IBMBackend('ibm_fez')>

2. Creează și transpilează un circuit

Ai nevoie de cel puțin un circuit pentru a folosi primitiva Executor. Acesta poate avea, opțional, parametri.

# Generate the circuit
circuit = QuantumCircuit(2)
circuit.h(0)
circuit.h(1)
circuit.cz(0, 1)
circuit.h(1)

# Using `measure_all` automatically creates the necessary
# classical registers.
circuit.measure_all()

Circuitul trebuie transformat pentru a folosi doar instrucțiunile suportate de QPU (denumite circuite cu set de instrucțiuni ISA). Folosește transpilerul pentru aceasta.

# Transpile the circuit
preset_pass_manager = generate_preset_pass_manager(
backend=backend, optimization_level=0
)
isa_circuit = preset_pass_manager.run(circuit)

3. Inițializează un QuantumProgram

Inițializează un QuantumProgram cu volumul tău de lucru. Un QuantumProgram este alcătuit din QuantumProgramItems. De obicei, fiecare element constă dintr-un circuit, un set de valori de parametri și, eventual, un samplex pentru a randomiza conținutul circuitului. Pentru detalii complete, consultă Intrările și ieșirile Executor.

Celula următoare inițializează un QuantumProgram și specifică efectuarea a 25 de shot-uri. Apoi adaugă circuitul transpilat target.

# Initialize an empty program
program = QuantumProgram(shots=25)

# Append the circuit to the program
program.append_circuit_item(isa_circuit)

4. Opțional: Grupează porțile și măsurătorile în cutii adnotate

Gruparea instrucțiunilor în cutii și adnotarea acestora este modalitatea principală de a specifica intenția ta. În exemplul următor, folosim generate_boxing_pass_manager și parametrii săi de twirling pentru a grupa porțile cu doi qubiți și măsurătorile în cutii și a aplica adnotarea de twirling.

# Generate a boxing pass manager to group gates
# and measurements into boxes and add
# a`Twirl` annotation.
boxes_pm = generate_boxing_pass_manager(
# Add gate twirling
enable_gates=True,
# Add measurement twirling
enable_measures=True,
)

boxed_circuit = boxes_pm.run(isa_circuit)
boxed_circuit.draw("mpl", idle_wires=False)

Output of the previous code cell

5. Opțional: Construiește un circuit șablon și un samplex și adaugă-le la program

Folosește metoda Samplomatic build pentru a genera perechea circuit șablon și samplex. Circuitul șablon este structural echivalent cu circuitul original. Totuși, porțile sale cu un singur qubit sunt înlocuite cu porți parametrizate pentru a implementa adnotările prescrise (twirling de porți și de măsurători, în acest exemplu). Samplex-ul codifică toate informațiile necesare pentru a genera parametri randomizați pentru circuitul șablon.

După generarea perechii circuit șablon și samplex, folosește metoda append_samplex_item pentru a adăuga perechea la program.

Consultă documentația API Samplomatic pentru detalii complete despre samplomatic.samplex.Samplex și argumentele sale.

# Build the template circuit and the samplex
template_circuit, samplex = build(boxed_circuit)

# Append the template circuit and samplex as a `samplex_item`
program.append_samplex_item(
template_circuit,
samplex=samplex,
shape=(num_randomizations := 20,),
)

6. Invocă Executor și obține rezultate

Rulează QuantumProgram pe un backend IBM® folosind primitiva Executor cu opțiunile implicite. Consultă Opțiunile Executor pentru a afla despre opțiunile disponibile.

# Initialize an Executor with the default options
executor = Executor(mode=backend)

# Submit the job
job = executor.run(program)
job
<RuntimeJobV2('d8286580bvlc73d1vmsg', 'executor')>
# Retrieve the result
result = job.result()

Rezultatul este de tipul QuantumProgramResult. Consultă Intrarea și ieșirea Executor pentru a afla despre obiectul rezultat.

Pașii următori

Recomandări