Sdílet prostřednictvím


Postup odeslání okruhu s Cirq do Azure Quantum

Zjistěte, jak odeslat kvantový okruh Cirq pomocí azure-quantumPython balíčku. Okruhy Cirq 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.

Požadavky

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

  • Pracovní prostor Azure Quantum ve vašem předplatném Azure Pokud chcete vytvořit pracovní prostor, přečtěte si téma Vytvoření pracovního prostoru Azure Quantum.

  • Prostředí Python s nainstalovaným Python nástrojem Pip .

  • VS Code s nainstalovanou sadou Azure Quantum Development KitPython a rozšířeními Jupyter.

  • Balíček Azure Quantum azure-quantum se značkou [cirq] a qsharp balíčky.ipykernel

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

    Poznámka:

    Pokud se nerozpoznalo jádro ipykernel JupyterPython, nástroj VS Code vás vyzve k jeho instalaci.

Vytvoření nového poznámkového bloku Jupyter

  1. Ve VS Code vyberte paletu Zobrazit > příkaz a vyberte Vytvořit: Nový poznámkový blok Jupyter.
  2. V pravém horním rohu nástroj VS Code rozpozná a zobrazí verzi Python 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 nebylo zjištěno žádné prostředí, informace o nastavení najdete v poznámkových blocích Jupyter v editoru 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 azure.quantum.cirq import AzureQuantumService

Připojení ke službě Azure Quantum

Pokud se chcete připojit ke službě Azure Quantum, bude váš program potřebovat ID prostředku a umístění pracovního prostoru Azure Quantum.

  1. Přihlaste se ke svému účtu Azure, https://portal.azure.com

  2. Vyberte pracovní prostor Azure Quantum a přejděte na Přehled.

  3. Zkopírujte parametry v polích.

    Snímek obrazovky editoru Visual Studio Code znázorňující, jak rozbalit podokno přehledu pracovního prostoru Quantum

Přidejte novou buňku a pomocí informací o účtu vytvořte Workspace a AzureQuantumService objekty pro připojení 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")
    )

service = AzureQuantumService(workspace)

Zobrazit seznam všech targets

targets()Pomocí této metody můžete zobrazit seznam všech pracovních prostorůtargets, které můžou spouštět váš okruh, včetně aktuálního času fronty a dostupnosti.

Poznámka:

targets V seznamu nemusí být uvedena všechna data ve vašem pracovním prostoru – tady bude uvedený jenom targets okruh Cirq nebo OpenQASM.

print(service.targets())
[<Target name="quantinuum.qpu.h1-1", avg. queue time=0 s, Degraded>,
<Target name="quantinuum.sim.h1-1sc", avg. queue time=1 s, Available>,
<Target name="quantinuum.sim.h1-1e", avg. queue time=40 s, Available>,
<Target name="ionq.simulator", avg. queue time=3 s, Available>,
<Target name="ionq.qpu.aria-1", avg. queue time=1136774 s, Available>]

Vytvoření jednoduchého okruhu

Dále vytvořte jednoduchý okruh Cirq, který se má spustit. Tento okruh používá druhou odmocninu brány X nativní pro hardwarový systém IonQ.

import cirq

q0, q1 = cirq.LineQubit.range(2)
circuit = cirq.Circuit(
    cirq.X(q0)**0.5,             # Square root of X
    cirq.CX(q0, q1),              # CNOT
    cirq.measure(q0, q1, key='b') # Measure both qubits
)
print(circuit)
0: ───X^0.5───@───M────────
              │   │
1: ───────────X───M────────

Vyberte program, který target chcete spustit.

Spuštění v simulátoru IonQ

Program teď můžete spustit prostřednictvím služby Azure Quantum a získat výsledek. Následující buňka odešle úlohu (do výchozího simulátoru IonQ), která spouští okruh s 100 snímky, čeká na dokončení úlohy a vrátí výsledky.

result = service.run(program=circuit, repetitions=100, target="ionq.simulator")

Tím se cirq.Result vrátí objekt.

print(result)
    b=1001100101100001000011011101000011010100010111100011001000100100010000001110010010101110110000011010, 1001100101100001000011011101000011010100010111100011001000100100010000001110010010101110110000011010

Odhad nákladů na úlohu

Před spuštěním úlohy v QPU byste měli odhadnout, kolik bude stát spuštění.

Nejaktuálně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í v QPU IonQ

Předchozí úloha se spustila ve výchozím simulátoru "ionq.simulator". Můžete ho ale spustit také na hardwarovém procesoru IonQ (QPU (Quantum Processor Unit ). Pokud chcete spustit na QPU IonQ, zadejte "ionq.qpu.aria-1" jako target argument:

result = service.run(
    program=circuit,
    repetitions=100,
    target="ionq.qpu.aria-1",
    timeout_seconds=500 # Set timeout to accommodate queue time on QPU
)

Opět se vrátí cirq.Result objekt.

print(result)
b=0101011011011111100001011101101011011110100010000000011110111000100100110110101100110001001111101111, 0101011011011111100001011101101011011110100010000000011110111000100100110110101100110001001111101111

Asynchronní model s využitím úloh

U dlouhotrvajících okruhů může být užitečné je spouštět asynchronně. Metoda service.create_job vrátí Job objekt, který můžete použít k získání výsledků po úspěšném spuštění úlohy.

job = service.create_job(
    program=circuit,
    repetitions=100,
    target="ionq.simulator"
)

Pokud chcete zkontrolovat stav úlohy, použijte job.status():

print(job.status())
'completed'

Pokud chcete počkat na dokončení úlohy a pak získat výsledky, použijte blokující volání job.results():

result = job.results()
print(result)
00: 0.5
11: 0.5

Všimněte si, že to nevrací cirq.Result objekt. Místo toho vrátí výsledný objekt, který je specifický pro simulátor IonQ a místo zastřeleného dat používá pravděpodobnosti stavu.

type(result)
cirq_ionq.results.SimulatorResult

Chcete-li tento objekt převést na cirq.Result objekt, použijte result.to_cirq_result():

print(result.to_cirq_result())
b=1110101111111110111000011101011111001100010000001011011101001111001111001101100111010000001100011100, 1110101111111110111000011101011111001100010000001011011101001111001111001101100111010000001100011100

Požadavky

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

  1. Přihlaste se k webu Azure Portal a vyberte pracovní prostor z předchozího kroku.
  2. V levém okně vyberte Poznámkové bloky.
  3. Klikněte na Moje poznámkové bloky a klikněte na Přidat nový.
  4. Zadejte název souboru, například Cirq.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 při vytváření spustit každou buňku, abyste se vyhnuli problémům s kompilací.

Kliknutím na trojúhlou ikonu "přehrát" vlevo od buňky spusťte kód.

Načtení požadovaných importů

Nejprve budete muset importovat další modul.

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

from azure.quantum.cirq import AzureQuantumService

Připojení ke službě Azure Quantum

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

provider = AzureQuantumService(workspace)

Definování jednoduchého okruhu

Dále vytvořte jednoduchý okruh Cirq, který se má spustit. Tento okruh používá druhou odmocninu brány X nativní pro hardwarový systém IonQ.

import cirq

q0, q1 = cirq.LineQubit.range(2)
circuit = cirq.Circuit(
    cirq.X(q0)**0.5,             # Square root of X
    cirq.CX(q0, q1),              # CNOT
    cirq.measure(q0, q1, key='b') # Measure both qubits
)
print(circuit)
0: ───X^0.5───@───M────────
              │   │
1: ───────────X───M────────

Zobrazit seznam všech targets

targets()Pomocí této metody můžete zobrazit seznam všech pracovních prostorůtargets, které můžou spouštět váš okruh, včetně aktuálního času fronty a dostupnosti.

Poznámka:

targets V seznamu nemusí být uvedena všechna data ve vašem pracovním prostoru – tady bude uvedený jenom targets okruh Cirq nebo OpenQASM.

print("This workspace's targets:")
for target in service.targets():
     print(target)
This workspace's targets:
<Target name="quantinuum.qpu.h1-1", avg. queue time=0 s, Degraded>
<Target name="quantinuum.sim.h1-1sc", avg. queue time=1 s, Available>
<Target name="quantinuum.sim.h1-1e", avg. queue time=40 s, Available>
<Target name="ionq.simulator", avg. queue time=3 s, Available>
<Target name="ionq.qpu.aria-1", avg. queue time=1136774 s, Available>

Poznámka:

Úplný seznam target může být pro váš pracovní prostor jiný.

Vyberte program, který target chcete spustit.

Spuštění na simulátoru IonQ

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

Následující buňka odešle úlohu, která spustí okruh s 100 snímky, počká na dokončení úlohy a vrátí výsledky.

result = service.run(
    program=circuit,
    repetitions=100,
    target="ionq.simulator"
)

Tím se cirq.Result vrátí objekt.

print(result)
    b=1001100101100001000011011101000011010100010111100011001000100100010000001110010010101110110000011010, 1001100101100001000011011101000011010100010111100011001000100100010000001110010010101110110000011010

Výsledky můžete vykreslit v histogramu:

import pylab as pl

pl.hist(result.data)
pl.ylabel("Counts")
pl.xlabel("Result")

Odhad nákladů na úlohu

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

Nejaktuálnější podrobnosti o cenách najdete v tématu Ceny IonQ nebo si v okně Poskytovatelé vašeho pracovního prostoru prohlédněte cenové možnosti. Pokud chcete zobrazit aktuální stav kreditu a využití, vyberte Kredity a kvóty.

Spuštění v QPU IonQ

Předchozí úloha se spustila ve výchozím simulátoru ionq.simulator. Můžete ho ale spustit také na hardwarovém procesoru IonQ nebo v QPU (Quantum Processor Unit ). Pokud chcete spustit na QPU IonQ, zadejte ionq.qpu.aria-1 jako target argument:

result = service.run(
    program=circuit,
    repetitions=100,
    target="ionq.qpu.aria-1",
    timeout_seconds=500 # Set timeout to accommodate queue time on QPU
)

Poznámka:

Doba potřebná ke spuštění okruhu na QPU závisí na aktuálních časech fronty. Průměrnou dobu target fronty můžete zobrazit výběrem okna Poskytovatelé vašeho pracovního prostoru.

Opět se vrátí cirq.Result objekt.

print(result)
    b=1001100101100001000011011101000011010100010111100011001000100100010000001110010010101110110000011010, 1001100101100001000011011101000011010100010111100011001000100100010000001110010010101110110000011010

Asynchronní model s využitím úloh

U dlouhotrvajících okruhů může být užitečné je spouštět asynchronně. Metoda service.create_job vrátí Job objekt, který můžete použít k získání výsledků po úspěšném spuštění úlohy.

job = service.create_job(
    program=circuit,
    repetitions=100,
    target="ionq.simulator"
)

Pokud chcete zkontrolovat stav úlohy, použijte job.status():

print(job.status())
'completed'

Pokud chcete počkat na dokončení úlohy a pak získat výsledky, použijte blokující volání job.results():

result = job.results()
print(result)
00: 0.5
11: 0.5

Poznámka:

Funkce job.results() nevrací cirq.Result objekt. Místo toho vrátí výsledný objekt, který je specifický pro simulátor IonQ a místo zastřeleného dat používá pravděpodobnosti stavu.

type(result)
cirq_ionq.results.SimulatorResult

Chcete-li tento objekt převést na cirq.Result objekt, použijte result.to_cirq_result():

print(result.to_cirq_result())
b=1110101111111110111000011101011111001100010000001011011101001111001111001101100111010000001100011100, 1110101111111110111000011101011111001100010000001011011101001111001111001101100111010000001100011100

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 pro asynchronní odeslání každého okruhu a pak načíst výsledky každé úlohy. Příklad:

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

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