Odeslání okruhu pomocí qiskitu do Azure Quantum

Zjistěte, jak odeslat kvantový okruh Qiskit pomocí azure-quantumPython balíčku . Okruhy Qiskit můžete odeslat do Azure Quantum pomocí poznámkového bloku Azure Quantum, který má integrovaný azure-quantumPython balíček, nebo z místního počítače.

Další informace najdete v tématu Kvantové obvody.

Poznámka

Sada Microsoft Quantum Development Kit (Classic QDK) už nebude po 30. červnu 2024 podporována. Pokud jste stávající vývojář sady QDK, doporučujeme přejít na novou sadu Azure Quantum Development Kit (Moderní QDK) a pokračovat ve vývoji kvantových řešení. Další informace najdete v tématu Migrace kódu Q# do moderní sady QDK.

Požadavky

Podrobnosti o instalaci najdete v tématu Instalace moderní sady QDK ve VS Code.

Vytvoření nového Jupyter Notebook

  1. Ve VS Code vyberte Zobrazit > paletu příkazů a vyberte Vytvořit: Nový Jupyter Notebook.
  2. V pravém horním rohu nástroj VS Code rozpozná a zobrazí verzi Python nástroje a virtuální Python prostředí vybrané pro poznámkový blok. Pokud máte více Python prostředí, možná budete muset vybrat jádro pomocí nástroje pro výběr jádra v pravém horním rohu. Pokud se žádné prostředí nezjistilo, informace o nastavení najdete v tématu Poznámkové bloky Jupyter ve VS Code .

Načtení požadovaných importů

V první buňce poznámkového bloku spusťte následující kód, který načte požadované importy:

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

Připojení ke službě Azure Quantum

Pro připojení ke službě Azure Quantum potřebujete ID prostředku a umístění pracovního prostoru Azure Quantum. Přihlaste se ke svému účtu Azure , https://portal.azure.compřejděte do svého pracovního prostoru Azure Quantum a zkopírujte hodnoty z hlavičky.

Načtení ID prostředku a umístění z pracovního prostoru Azure Quantum

Přidejte novou buňku a pomocí informací o účtu vytvořte Workspace objekty a AzureQuantumProvider připojte se k pracovnímu prostoru Azure Quantum.

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

provider = AzureQuantumProvider(workspace)

Vypsat všechny back-endy

Teď můžete vytisknout všechny back-endy kvantových výpočtů, které jsou k dispozici ve vašem pracovním prostoru:

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

Spuštění jednoduchého okruhu

Nejprve vytvořte jednoduchý okruh Qiskit, který se má spustit.

# 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 

Vyberte a target spusťte program.

Spuštění na simulátoru IonQ

Před spuštěním na skutečném hardwaru otestujeme okruh v simulátoru. Slouží get_backend k vytvoření objektu Backend pro připojení k back-endu simulátoru IonQ:

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

Back-endy IonQ podporují brány z definované sady bran, které se kompilují tak, aby běžely optimálně na hardwaru. Pokud váš okruh obsahuje brány, které nejsou v tomto seznamu, musíte pomocí funkce poskytované Qiskit transpilovat do podporovaného gatesettranspile objektu:

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

Funkce transpile vrátí objekt nového okruhu, kde jsou brány rozloženy na brány, které jsou podporovány na zadaném back-endu.

Teď můžete program spustit prostřednictvím služby Azure Quantum a získat výsledek. Následující buňka odešle úlohu, která spustí okruh se 100 snímky:

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

Pokud chcete počkat na dokončení úlohy a vrátit výsledky, spusťte:

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'))])

Vzhledem k tomu, že výsledek je objekt nativní pro balíček Qiskit, můžete k vizualizaci výsledků použít Qiskit result.get_counts a plot_histogram . Abyste měli jistotu, že jsou znázorněné všechny možné popisky bitových řetězců, přidejte je do 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}

Výsledek okruhu Qiskit na simulátoru IonQ

Odhad nákladů na úlohu

Před spuštěním úlohy na QPU můžete odhadnout, kolik stojí spuštění. K odhadu nákladů na spuštění úlohy na QPU můžete použít metodu estimate_cost :

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

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

Tím se zobrazí odhadované náklady v USD.

Nejnovější podrobnosti o cenách najdete v tématu Ceny ionQ nebo vyhledejte svůj pracovní prostor a zobrazte cenové možnosti na kartě Poskytovatel vašeho pracovního prostoru prostřednictvím : aka.ms/aq/myworkspaces.

Spuštění na IonQ QPU

Pokud se chcete připojit ke skutečnému hardwaru ( QPU( Quantum Processor Unit ), jednoduše zadejte název target"ionq.qpu"get_backend metody :

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

Odešlete okruh ke spuštění v Azure Quantum, získejte výsledky a spuštěním vykreslíte plot_histogram výsledky.

Poznámka

Doba potřebná ke spuštění okruhu na QPU se může lišit v závislosti na aktuální době fronty.

# 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}

Výsledek okruhu Qiskit na QPU IonQ

Důležité

Odesílání více okruhů v jedné úloze se v současné době nepodporuje. Jako alternativní řešení můžete volat metodu backend.run , která asynchronně odešle každý okruh a pak načte výsledky jednotlivých úloh. Příklad:

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

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

Požadavky

Vytvoření nového poznámkového bloku v pracovním prostoru

  1. Přihlaste se k Azure Portal a vyberte pracovní prostor, který jste vytvořili v předchozím kroku.
  2. V levém okně vyberte Poznámkové bloky.
  3. Klikněte na Moje poznámkové bloky a pak na Přidat nový.
  4. Zadejte název souboru, například Qiskit.ipynb, a klikněte na Vytvořit soubor.

Když se nový poznámkový blok otevře, automaticky vytvoří kód pro první buňku na základě informací o vašem předplatném a pracovním prostoru.

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

Poznámka

Pokud není uvedeno jinak, měli byste každou buňku spouštět v pořadí, v jakém ji vytváříte, abyste se vyhnuli problémům s kompilací.

Kliknutím na trojúhelníkové ikony "přehrát" nalevo od buňky spusťte kód.

Načtení požadovaných importů

Nejprve budete muset importovat některé další moduly.

Kliknutím na + Kód přidejte novou buňku a pak přidejte a spusťte následující kód:

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

Připojení ke službě Azure Quantum

Dále pomocí AzureQuantumProvider objektu Workspace z předchozí buňky vytvořte objekt pro připojení k pracovnímu prostoru Azure Quantum. Přidejte novou buňku s následujícím kódem:

provider = AzureQuantumProvider(workspace)

Definování jednoduchého okruhu

V nové buňce vytvořte circuit objekt. Tento příklad je jednoduchý kvantový generátor náhodných bitů. Přidejte následující kód pro definování a zobrazení okruhu:

# 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 

Vypsat vše targets

Teď můžete zobrazit všechny kvantové výpočty targetsnebo back-endy, které jsou k dispozici ve vašem pracovním prostoru. Přidejte novou buňku a spusťte následující řádek:

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

Vyberte a spusťte target program.

Pokud chcete kód zkontrolovat před jeho spuštěním na skutečném kvantovém hardwaru, můžete použít kvantový simulátor IonQ. ionq.simulator

Přidejte novou buňku a vytvořte objekt, který bude představovat kvantový simulátor targetIonQ:

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

Spuštění na simulátoru IonQ

Pokud chcete okruh spustit na simulátoru, přidejte následující kód. V tomto příkladu run použijeme metodu target k odeslání úlohy a pak monitoruje stav úlohy.

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

Po úspěšném spuštění úlohy získejte výsledky úlohy a zobrazte je:

# 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'))])

Vzhledem k tomu, že tento result typ je objekt nativní pro balíček Qiskit, můžete k vizualizaci výsledků použít Qiskit result.get_counts a plot_histogram . Abyste měli jistotu, že jsou reprezentovány všechny možné popisky bitstringu, přidejte je do 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}

Výsledek okruhu Qiskit na simulátoru IonQ

Odhad nákladů na úlohu

Před spuštěním úlohy na skutečném kvantovém hardwaru nebo na jednotce kvantového zpracování (QPU) můžete odhadnout, kolik stojí spuštění.

Nejprve znovu získejte seznam dostupných poskytovatelů:

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

Dále vytvořte objekt, který bude představovat kvantový počítač IonQ:

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

Pokud chcete odhadnout náklady na spuštění úlohy na QPU, přidejte a spusťte novou buňku estimate_cost pomocí metody target:

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

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

Zobrazí se odhadované náklady v USD.

Nejnovější podrobnosti o cenách najdete v tématu Ceny IonQ nebo vyhledejte svůj pracovní prostor a zobrazte cenové možnosti v okně Poskytovatelé vašeho pracovního prostoru.

Spuštění na IonQ QPU

Po úspěšném spuštění úlohy na simulátoru IonQ a odhadu nákladů na QPU je čas spustit okruh na hardwaru.

Poznámka

Doba potřebná ke spuštění okruhu na QPU se liší v závislosti na aktuálních časech fronty. Průměrnou dobu fronty můžete zobrazit tak, target že v pracovním prostoru vyberete okno Poskytovatelé .

K odeslání a monitorování úlohy použijte stejnou run metodu a operace, které jste dříve použili s validátorem rozhraní API:

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

Po dokončení úlohy získejte výsledky úlohy jako předtím a zobrazte je v grafu:

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}

Výsledek okruhu Qiskit na IonQ QPU

Důležité

Odesílání více okruhů v jedné úloze se v současné době nepodporuje. Jako alternativní řešení můžete volat metodu backend.run , která asynchronně odešle každý okruh a pak načte výsledky jednotlivých úloh. Příklad:

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

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

Další kroky