Kapcsolatcsoport elküldése qiskittel az Azure Quantumba

Megtudhatja, hogyan küldhet be egy Qiskit-kvantum-kapcsolatcsoportot a azure-quantumPython csomag használatával. A Qiskit-kapcsolatcsoportokat az Azure Quantum notebook használatával küldheti el az Azure Quantum-ba, amely beépített csomagokkal azure-quantumPython rendelkezik, vagy a helyi gépről.

További információ: Kvantum-kapcsolatcsoportok.

Megjegyzés

A Microsoft Quantum Development Kit (klasszikus QDK) 2024. június 30. után már nem támogatott. Ha Ön meglévő QDK-fejlesztő, javasoljuk, hogy váltson az új Azure Quantum Development Kitre (Modern QDK) a kvantummegoldások fejlesztésének folytatásához. További információ: A Q#-kód migrálása a modern QDK-ba.

Előfeltételek

A telepítés részleteiért lásd : A modern QDK telepítése a VS Code-on.

  • Azure Quantum-munkaterület az Azure-előfizetésben. Munkaterület létrehozásához lásd: Azure Quantum-munkaterület létrehozása.

  • Környezet PythonésPython pip telepítve.

  • VS Code az Azure Quantum Development Kit, Pythonés jupyter bővítményekkel.

  • Az Azure Quantum-csomag azure-quantum a [qiskit] címkével, valamint a és a qsharpipykernel csomagokkal.

    python -m pip install --upgrade azure-quantum[qiskit] qsharp ipykernel 
    

    Megjegyzés

    Ha a Jupyter-kernel Pythonipykernel nem észlelhető, a VS Code kérni fogja a telepítést.

Új Jupyter Notebook létrehozása

  1. A VS Code-ban válassza a Parancspaletta megtekintése>, majd a Létrehozás: Új Jupyter Notebook lehetőséget.
  2. A jobb felső sarokban a VS Code észleli és megjeleníti a jegyzetfüzethez kiválasztott verziót Python és virtuális Python környezetet. Ha több Python környezettel rendelkezik, előfordulhat, hogy ki kell választania egy kernelt a jobb felső sarokban található kernelválasztóval. Ha nem észlelhető környezet, a beállítási információkért tekintse meg a Jupyter Notebooks in VS Code (Jupyter Notebooks in VS Code ) című témakört.

A szükséges importálás betöltése

A jegyzetfüzet első cellájában futtassa a következő kódot a szükséges importálások betöltéséhez:

import azure.quantum
from qiskit import QuantumCircuit
from qiskit.visualization import plot_histogram
from azure.quantum.qiskit import AzureQuantumProvider

Csatlakozás az Azure Quantum szolgáltatáshoz

Az Azure Quantum szolgáltatáshoz való csatlakozáshoz szüksége van az erőforrás-azonosítóra és az Azure Quantum-munkaterület helyére. Jelentkezzen be az Azure-fiókjába, https://portal.azure.comnavigáljon az Azure Quantum-munkaterületre, és másolja az értékeket a fejlécből.

Az erőforrás-azonosító és a hely lekérése egy Azure Quantum-munkaterületről

Adjon hozzá egy új cellát, és használja a fiókadatait az Azure Quantum-munkaterülethez való csatlakozáshoz, és hozzon létre Workspace objektumokat AzureQuantumProvider .

workspace = Workspace(  
    resource_id = "", # Add the resourceID of your workspace
    location = "" # Add the location of your workspace (for example "westus")
    )

provider = AzureQuantumProvider(workspace)

Az összes háttérrendszer listázása

Most már kinyomtathatja a munkaterületen elérhető összes kvantum-számítástechnika-háttérrendszert:

print("This workspace's targets:")
for backend in provider.backends():
    print("- " + backend.name())
This workspace's targets:
- ionq.qpu
- ionq.qpu.aria-1
- ionq.simulator
- microsoft.estimator
- quantinuum.hqs-lt-s1
- quantinuum.hqs-lt-s1-apival
- quantinuum.hqs-lt-s2
- quantinuum.hqs-lt-s2-apival
- quantinuum.hqs-lt-s1-sim
- quantinuum.hqs-lt-s2-sim
- quantinuum.qpu.h1-1
- quantinuum.sim.h1-1sc
- quantinuum.sim.h1-1e
- rigetti.sim.qvm
- rigetti.qpu.ankaa-2

Egyszerű kapcsolatcsoport futtatása

Először hozzon létre egy egyszerű Qiskit-kapcsolatcsoportot a futtatáshoz.

# Create a Quantum Circuit acting on the q register
circuit = QuantumCircuit(3, 3)
circuit.name = "Qiskit Sample - 3-qubit GHZ circuit"
circuit.h(0)
circuit.cx(0, 1)
circuit.cx(1, 2)
circuit.measure([0,1,2], [0, 1, 2])

# Print out the circuit
circuit.draw()
     ┌───┐          ┌─┐      
q_0: ┤ H ├──■───────┤M├──────
     └───┘┌─┴─┐     └╥┘┌─┐   
q_1: ─────┤ X ├──■───╫─┤M├───
          └───┘┌─┴─┐ ║ └╥┘┌─┐
q_2: ──────────┤ X ├─╫──╫─┤M├
               └───┘ ║  ║ └╥┘
c: 3/════════════════╩══╩══╩═
                     0  1  2 

Válasszon egy lehetőséget target a program futtatásához

Futtatás az IonQ-szimulátoron

Mielőtt valódi hardveren fut, teszteljük a áramkört a szimulátorban. Objektum get_backend létrehozása Backend az IonQ-szimulátor háttérrendszeréhez való csatlakozáshoz:

simulator_backend = provider.get_backend("ionq.simulator")

Az IonQ-háttérrendszer egy meghatározott kapukészletből támogatja a kapukat, amelyek úgy vannak lefordítva, hogy optimálisan fussanak a hardveren. Ha a kapcsolatcsoport olyan kapukat tartalmaz, amelyek nem szerepelnek ebben a listában, a Qiskit által biztosított függvénnyel kell áttérnie a transpile támogatottragateset:

from qiskit import transpile
circuit = transpile(circuit, simulator_backend)

A transpile függvény egy új áramköri objektumot ad vissza, ahol a kapuk a megadott háttérrendszeren támogatott kapukra vannak bontva.

Most már futtathatja a programot az Azure Quantum szolgáltatáson keresztül, és lekérheti az eredményt. A következő cella elküld egy feladatot, amely 100 lövéssel futtatja a áramkört:

job = simulator_backend.run(circuit, shots=100)
job_id = job.id()
print("Job id", job_id)
Job id 00000000-0000-0000-0000-000000000000

Ha meg szeretné várni, amíg a feladat befejeződik, és visszaadja az eredményeket, futtassa a következőt:

result = job.result()
print(result)
Result(backend_name='ionq.simulator', backend_version='1', qobj_id='Qiskit Sample - 3-qubit GHZ circuit', job_id='00000000-0000-0000-0000-000000000000', success=True, results=[ExperimentResult(shots=100, success=True, meas_level=2, data=ExperimentResultData(counts={'000': 50, '111': 50}, probabilities={'000': 0.5, '111': 0.5}), header=QobjExperimentHeader(meas_map='[0, 1, 2]', name='Qiskit Sample - 3-qubit GHZ circuit', num_qubits='3', qiskit='True'))])

Mivel az eredmény a Qiskit-csomag natív objektuma, használhatja a Qiskit és result.get_countsplot_histogram az eredményeket. Ha meg szeretné győződni arról, hogy az összes lehetséges bitlánccímke látható, adja hozzá őket a következőhöz counts: .

counts = {format(n, "03b"): 0 for n in range(8)}
counts.update(result.get_counts(circuit))
print(counts)
plot_histogram(counts)
{'000': 50, '001': 0, '010': 0, '011': 0, '100': 0, '101': 0, '110': 0, '111': 50}

Qiskit-kapcsolatcsoport eredménye az IonQ-szimulátoron

Feladat költségének becslése

Mielőtt futtatna egy feladatot a QPU-n, megbecsülheti, hogy mennyibe kerül a futtatás. A feladat QPU-n való futtatásának költségeinek becsléséhez használja a estimate_cost következő módszert:

backend = provider.get_backend("ionq.qpu")
cost = backend.estimate_cost(circuit, shots=1024)

print(f"Estimated cost: {cost.estimated_total}")

Ez a becsült költséget USD-ben nyomtatja ki.

A legfrissebb díjszabási részletekért tekintse meg az IonQ díjszabását, vagy keresse meg a munkaterületet, és tekintse meg a díjszabási beállításokat a munkaterület "Szolgáltató" lapján a következő címen: aka.ms/aq/myworkspaces.

Futtatás IonQ QPU-n

Ha valós hardverhez ( kvantumprocesszor-egységhez (QPU)) szeretne csatlakozni, egyszerűen adja meg a target"ionq.qpu"get_backend metódus nevét:

qpu_backend = provider.get_backend("ionq.qpu")

Küldje el a kapcsolatcsoportot az Azure Quantumon való futtatáshoz, kérje le az eredményeket, és futtassa plot_histogram az eredményt.

Megjegyzés

A kapcsolatcsoport QPU-n való futtatásához szükséges idő az aktuális üzenetsor-időktől függően változhat.

# Submit the circuit to run on Azure Quantum
job = qpu_backend.run(circuit, shots=1024)
job_id = job.id()
print("Job id", job_id)

# Get the job results (this method waits for the Job to complete):
result = job.result()
print(result)
counts = {format(n, "03b"): 0 for n in range(8)}
counts.update(result.get_counts(circuit))
print(counts)
plot_histogram(counts)
Job id 00000000-0000-0000-0000-000000000000
Job Status: job has successfully run
Result(backend_name='ionq.simulator', backend_version='1', qobj_id='Qiskit Sample - 3-qubit GHZ circuit', job_id='00000000-0000-0000-0000-000000000000', success=True, results=[ExperimentResult(shots=1024, success=True, meas_level=2, data=ExperimentResultData(counts={'0': 505, '1': 6, '2': 1, '3': 1, '4': 1, '5': 10, '6': 11, '7': 488}, probabilities={'0': 0.4932, '1': 0.0059, '2': 0.001, '3': 0.001, '4': 0.001, '5': 0.0098, '6': 0.0117, '7': 0.4766}), header=QobjExperimentHeader(name='Qiskit Sample - 3-qubit GHZ circuit', num_qubits='3', qiskit='True'))])
{'000': 505, '001': 6, '010': 1, '011': 1, '100': 1, '101': 10, '110': 11, '111': 488}

Qiskit-kapcsolatcsoport eredménye az IonQ QPU-n

Fontos

A több kapcsolatcsoport egyetlen feladaton való elküldése jelenleg nem támogatott. Áthidaló megoldásként meghívhatja a metódust az backend.run egyes áramkörök aszinkron elküldéséhez, majd lekérheti az egyes feladatok eredményeit. Például:

jobs = []
for circuit in circuits:
    jobs.append(backend.run(circuit, shots=N))

results = []
for job in jobs:
    results.append(job.result())

Előfeltételek

Új jegyzetfüzet létrehozása a munkaterületen

  1. Jelentkezzen be a Azure Portal, és válassza ki az előző lépésben létrehozott munkaterületet.
  2. A bal oldali panelen válassza a Jegyzetfüzetek lehetőséget.
  3. Kattintson a Saját jegyzetfüzetek , majd az Új hozzáadása elemre.
  4. Írja be a fájl nevét (például Qiskit.ipynb), és kattintson a Fájl létrehozása gombra.

Amikor megnyílik az új jegyzetfüzet, automatikusan létrehozza az első cellához tartozó kódot az előfizetés és a munkaterület adatai alapján.

from azure.quantum import Workspace
workspace = Workspace ( 
    resource_id = "", # Add your resource_id 
    location = ""  # Add your workspace location (for example, "westus") 
)

Megjegyzés

Ha másként nem jelezzük, a fordítási problémák elkerülése érdekében az egyes cellákat a létrehozásuk sorrendjében kell futtatnia.

A kód futtatásához kattintson a cella bal oldalán található háromszög alakú "lejátszás" ikonra.

A szükséges importálások betöltése

Először importálnia kell néhány további modult.

Kattintson a + Kód elemre egy új cella hozzáadásához, majd adja hozzá és futtassa a következő kódot:

from qiskit import QuantumCircuit
from qiskit.visualization import plot_histogram
from azure.quantum.qiskit import AzureQuantumProvider

Csatlakozás az Azure Quantum szolgáltatáshoz

Ezután hozzon létre egy AzureQuantumProvider objektumot az Workspace előző cella objektumával az Azure Quantum-munkaterülethez való csatlakozáshoz. Adjon hozzá egy új cellát a következő kóddal:

provider = AzureQuantumProvider(workspace)

Egyszerű kapcsolatcsoport definiálása

Hozzon létre egy objektumot egy circuit új cellában. Ez a példa egy egyszerű kvantum-véletlenszerű bitgenerátor. Adja hozzá a következő kódot a kapcsolatcsoport definiálásához és megjelenítéséhez:

# Create a Quantum Circuit acting on the q register
circuit = QuantumCircuit(3, 3)
circuit.name = "Qiskit Sample - 3-qubit GHZ circuit"
circuit.h(0)
circuit.cx(0, 1)
circuit.cx(1, 2)
circuit.measure([0, 1, 2], [0, 1, 2])

# Print out the circuit
circuit.draw()
     ┌───┐          ┌─┐      
q_0: ┤ H ├──■───────┤M├──────
     └───┘┌─┴─┐     └╥┘┌─┐   
q_1: ─────┤ X ├──■───╫─┤M├───
          └───┘┌─┴─┐ ║ └╥┘┌─┐
q_2: ──────────┤ X ├─╫──╫─┤M├
               └───┘ ║  ║ └╥┘
c: 3/════════════════╩══╩══╩═
                     0  1  2 

Az összes listázása targets

Mostantól megjelenítheti a munkaterületen elérhető összes kvantum-számítástechnikát targetsvagy háttérrendszert. Adjon hozzá egy új cellát, és futtassa a következő sort:

print("This workspace's targets:")
for backend in provider.backends():
    print("- " + backend.name())
This workspace's targets:
- ionq.qpu
- ionq.simulator
- ionq.qpu.aria-1
- microsoft.estimator
- quantinuum.qpu.h1-1
- quantinuum.sim.h1-1sc
- quantinuum.sim.h1-1e
- rigetti.sim.qvm
- rigetti.qpu.ankaa-2

Válasszon ki egy lehetőséget target a program futtatásához

Ha ellenőrizni szeretné a kódot, mielőtt tényleges kvantumhardveren futtatja, használhatja az IonQ kvantumszimulátort( ionq.simulator).

Adjon hozzá egy új cellát, és hozzon létre egy objektumot az IonQ-kvantumszimulátor targetábrázolásához:

# Get IonQ quantum simulator target:
simulator_backend = provider.get_backend("ionq.simulator")

Futtatás az IonQ-szimulátoron

A kapcsolatcsoport szimulátoron való futtatásához adja hozzá a következő kódot. Ez a példa a run metódusával küldi target el a feladatot, majd figyeli a feladat állapotát.

# Submit the circuit to run on Azure Quantum
job = simulator_backend.run(circuit, shots=100)
job_id = job.id()
print("Job id", job_id)

Ha a feladat sikeresen lefut, kérje le a feladat eredményeit, és jelenítse meg azokat:

# Get the job results:
result = job.result()
print(result)
Result(backend_name='ionq.simulator', backend_version='1', qobj_id='Qiskit Sample - 3-qubit GHZ circuit', job_id='7d909574-98d4-11ec-b382-00155d957f5d', success=True, results=[ExperimentResult(shots=100, success=True, meas_level=2, data=ExperimentResultData(counts=defaultdict(<class 'int'>, {'000': 50, '111': 50}), probabilities=defaultdict(<class 'int'>, {'000': 0.5, '111': 0.5})), header=QobjExperimentHeader(meas_map='[0, 1, 2]', name='Qiskit Sample - 3-qubit GHZ circuit', num_qubits='3', qiskit='True'))])

Mivel ez a result típus a Qiskit-csomag natív objektuma, használhatja a Qiskit és plot_histogram objektumát result.get_counts az eredmények megjelenítéséhez. Ha meg szeretné győződni arról, hogy az összes lehetséges bitkaraktercímke látható, adja hozzá őket a következőhöz counts: .

counts = {format(n, "03b"): 0 for n in range(8)}
counts.update(result.get_counts(circuit))
print(counts)
plot_histogram(counts)
{'000': 50, '001': 0, '010': 0, '011': 0, '100': 0, '101': 0, '110': 0, '111': 50}

Qiskit-kapcsolatcsoport eredménye az IonQ-szimulátoron

Feladat költségének becslése

Mielőtt tényleges kvantumhardveren vagy kvantumfeldolgozó egységen (QPU- vagy kvantumfeldolgozó egységen ) futtatna egy feladatot, megbecsülheti, hogy mennyibe kerül a futtatás.

Először is kérje le ismét az elérhető szolgáltatók listáját:

print("This workspace's targets:")
for backend in provider.backends():
    print("- " + backend.name())
This workspace's targets:
- ionq.qpu
- ionq.simulator
- ionq.qpu.aria-1
- microsoft.estimator
- quantinuum.qpu.h1-1
- quantinuum.sim.h1-1sc
- quantinuum.sim.h1-1e
- rigetti.sim.qvm
- rigetti.qpu.ankaa-2

Ezután hozzon létre egy objektumot, amely az IonQ kvantumszámítógépet képviseli:

qpu_backend = provider.get_backend("ionq.qpu")

Ha meg szeretné becsülni egy feladat QPU-n való futtatásának költségeit, adjon hozzá és futtasson egy új cellát a estimate_costtargetmetódusával:

cost = qpu_backend.estimate_cost(circuit, shots=100)

print(f"Estimated cost: {cost.estimated_total}")

Ez a becsült költséget jeleníti meg USD-ben.

A legfrissebb díjszabási részletekért tekintse meg az IonQ díjszabását, vagy keresse meg a munkaterületet, és tekintse meg a díjszabási lehetőségeket a munkaterület Szolgáltatók paneljén.

Futtatás IonQ QPU-n

Miután sikeresen futtatta a feladatot az IonQ-szimulátoron, és megbecsülte a QPU költségeit, ideje futtatni a kapcsolatcsoportot a hardveren.

Megjegyzés

A kapcsolatcsoportok QPU-n való futtatásához szükséges idő az aktuális várakozási időtől függően változik. Az átlagos üzenetsor-időt target a munkaterület Szolgáltatók paneljén tekintheti meg.

A feladat elküldéséhez és figyeléséhez használja ugyanazt run a módszert és műveletet, amelyet korábban az API-érvényesítővel használt:

# Submit the circuit to run on Azure Quantum
job = qpu_backend.run(circuit, shots=1024)
job_id = job.id()
print("Job id", job_id)

Amikor a feladat befejeződött, a korábbiakhoz hasonlóan kérje le a feladat eredményeit, és jelenítse meg őket egy diagramon:

result = job.result()
print(result)
counts = {format(n, "03b"): 0 for n in range(8)}
counts.update(result.get_counts(circuit))
print(counts)
plot_histogram(counts)
Job id 910b5ac8-98cd-11ec-b3ba-00155d5528cf
Job Status: job has successfully run
Result(backend_name='ionq.simulator', backend_version='1', qobj_id='Qiskit Sample - 3-qubit GHZ circuit', job_id='Job id 54e8c740-98d9-11ec-b382-00155d957f5d', success=True, results=[ExperimentResult(shots=1024, success=True, meas_level=2, data=ExperimentResultData(counts={'0': 505, '1': 6, '2': 1, '3': 1, '4': 1, '5': 10, '6': 11, '7': 488}, probabilities={'0': 0.4932, '1': 0.0059, '2': 0.001, '3': 0.001, '4': 0.001, '5': 0.0098, '6': 0.0117, '7': 0.4766}), header=QobjExperimentHeader(name='Qiskit Sample - 3-qubit GHZ circuit', num_qubits='3', qiskit='True'))])
{'000': 505, '001': 6, '010': 1, '011': 1, '100': 1, '101': 10, '110': 11, '111': 488}

Qiskit-kapcsolatcsoport eredménye IonQ QPU-n

Fontos

Egy feladaton jelenleg nem lehet több kapcsolatcsoportot elküldeni. Áthidaló megoldásként meghívhatja a metódust az backend.run egyes kapcsolatcsoportok aszinkron elküldéséhez, majd lekérheti az egyes feladatok eredményeit. Például:

jobs = []
for circuit in circuits:
    jobs.append(backend.run(circuit, shots=N))

results = []
for job in jobs:
    results.append(job.result())

Következő lépések