Jak przesłać obwód za pomocą platformy Cirq do usługi Azure Quantum
Dowiedz się, jak przesłać obwód kwantowy Cirq przy użyciu azure-quantum
Python pakietu. Obwody Cirq można przesyłać do usługi Azure Quantum przy użyciu notesu usługi Azure Quantum, który ma wbudowany azure-quantum
Python pakiet lub z komputera lokalnego.
Aby uzyskać więcej informacji, zobacz Quantum circuits (Obwody kwantowe).
Wymagania wstępne
Aby uzyskać szczegółowe informacje na temat instalacji, zobacz Instalowanie zestawu QDK w programie VS Code.
Obszar roboczy usługi Azure Quantum w ramach subskrypcji platformy Azure. Aby utworzyć obszar roboczy, zobacz Tworzenie obszaru roboczego usługi Azure Quantum.
Środowisko Python z zainstalowanym programem Python i programem .
Program VS Code z zainstalowanym zestawem Azure Quantum Development Kit i Pythonrozszerzeniami Jupyter.
Pakiet Azure Quantum
azure-quantum
z tagiem [cirq] oraz pakietamiqsharp
iipykernel
.python -m pip install --upgrade azure-quantum[cirq] qsharp ipykernel
Uwaga
Jeśli nie wykryto jądra
ipykernel
JupyterPython, program VS Code wyświetli monit o jego zainstalowanie.
Tworzenie nowego notesu Jupyter
- W programie VS Code wybierz pozycję Wyświetl paletę poleceń i wybierz pozycję Utwórz: nowy notes Jupyter.>
- W prawym górnym rogu program VS Code wykryje i wyświetli wersję środowiska wirtualnego Python Python wybranego dla notesu. Jeśli masz wiele Python środowisk, może być konieczne wybranie jądra przy użyciu selektora jądra w prawym górnym rogu. Jeśli środowisko nie zostało wykryte, zobacz Jupyter Notebooks in VS Code (Notesy Jupyter Notebooks w programie VS Code ), aby uzyskać informacje o konfiguracji.
Ładowanie wymaganych importów
W pierwszej komórce notesu uruchom następujący kod, aby załadować wymagane importy:
import azure.quantum
from azure.quantum.cirq import AzureQuantumService
Nawiązywanie połączenia z usługą Azure Quantum
Aby nawiązać połączenie z usługą Azure Quantum, program będzie potrzebować identyfikatora zasobu i lokalizacji obszaru roboczego usługi Azure Quantum.
Zaloguj się do konta platformy Azure, https://portal.azure.com,
Wybierz obszar roboczy usługi Azure Quantum i przejdź do obszaru Przegląd.
Skopiuj parametry w polach.
Dodaj nową komórkę i użyj informacji o koncie, aby utworzyć Workspace
obiekty i AzureQuantumService
połączyć się z obszarem roboczym usługi 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)
Wyświetl listę wszystkich targets
targets()
Użyj metody , aby wyświetlić listę wszystkich targets elementów w obszarze roboczym, które mogą uruchamiać obwód, w tym bieżący czas kolejki i dostępność.
Uwaga
targets Wszystkie elementy w obszarze roboczym mogą nie być wyświetlane — tylko targets te, które mogą akceptować obwód Cirq lub OpenQASM, zostaną wymienione tutaj.
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>]
Tworzenie prostego obwodu
Następnie utwórz prosty obwód Cirq do uruchomienia. Ten obwód używa pierwiastek kwadratowy bramy X natywny dla systemu sprzętowego 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────────
Wybierz element target , aby uruchomić program
Uruchamianie w symulatorze IonQ
Teraz możesz uruchomić program za pośrednictwem usługi Azure Quantum i uzyskać wynik. Poniższa komórka przesyła zadanie (do domyślnego symulatora IonQ), które uruchamia obwód z 100 strzałami, czeka na zakończenie zadania i zwraca wyniki.
result = service.run(program=circuit, repetitions=100, target="ionq.simulator")
Spowoduje to zwrócenie cirq.Result
obiektu.
print(result)
b=1001100101100001000011011101000011010100010111100011001000100100010000001110010010101110110000011010, 1001100101100001000011011101000011010100010111100011001000100100010000001110010010101110110000011010
Szacowanie kosztu zadania
Przed uruchomieniem zadania w QPU należy oszacować, ile będzie kosztować uruchomienie.
Aby uzyskać najbardziej aktualne szczegóły cennika, zobacz Cennik IonQ lub znajdź obszar roboczy i wyświetl opcje cennika na karcie "Dostawca" obszaru roboczego za pośrednictwem: aka.ms/aq/myworkspaces.
Uruchamianie na QPU IonQ
Poprzednie zadanie zostało uruchomione w symulatorze domyślnym. "ionq.simulator"
Można jednak również uruchomić go na procesorze sprzętowym IonQ (jednostka procesora kwantowego (QPU)). Aby uruchomić na QPU IonQ, podaj "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
)
Ponownie zwraca cirq.Result
to obiekt.
print(result)
b=0101011011011111100001011101101011011110100010000000011110111000100100110110101100110001001111101111, 0101011011011111100001011101101011011110100010000000011110111000100100110110101100110001001111101111
Model asynchroniczny przy użyciu zadań
W przypadku długotrwałych obwodów może być przydatne ich asynchroniczne uruchamianie.
Metoda service.create_job
zwraca Job
obiekt, którego można użyć, aby uzyskać wyniki po pomyślnym uruchomieniu zadania.
job = service.create_job(
program=circuit,
repetitions=100,
target="ionq.simulator"
)
Aby sprawdzić stan zadania, użyj polecenia job.status()
:
print(job.status())
'completed'
Aby poczekać na ukończenie zadania, a następnie uzyskać wyniki, użyj wywołania job.results()
blokującego :
result = job.results()
print(result)
00: 0.5
11: 0.5
Należy pamiętać, że nie zwraca cirq.Result
to obiektu. Zamiast tego zwraca obiekt wynikowy specyficzny dla symulatora IonQ i używa prawdopodobieństwa stanu zamiast danych strzałów.
type(result)
cirq_ionq.results.SimulatorResult
Aby przekonwertować to na cirq.Result
obiekt, użyj polecenia result.to_cirq_result()
:
print(result.to_cirq_result())
b=1110101111111110111000011101011111001100010000001011011101001111001111001101100111010000001100011100, 1110101111111110111000011101011111001100010000001011011101001111001111001101100111010000001100011100
Wymagania wstępne
- Konto platformy Azure z aktywną subskrypcją. Jeśli nie masz konta platformy Azure, zarejestruj się bezpłatnie i zarejestruj się w celu korzystania z subskrypcji z płatnością zgodnie z rzeczywistym użyciem.
- Obszar roboczy usługi Azure Quantum. Aby uzyskać więcej informacji, zobacz Tworzenie obszaru roboczego usługi Azure Quantum.
Tworzenie nowego notesu w obszarze roboczym
- Zaloguj się do witryny Azure Portal i wybierz obszar roboczy z poprzedniego kroku.
- W bloku po lewej stronie wybierz pozycję Notesy.
- Kliknij pozycję Moje notesy i kliknij pozycję Dodaj nowy.
- Wpisz nazwę pliku, na przykład Cirq.ipynb, a następnie kliknij przycisk Utwórz plik.
Po otwarciu nowego notesu automatycznie tworzy kod dla pierwszej komórki na podstawie informacji o subskrypcji i obszarze roboczym.
from azure.quantum import Workspace
workspace = Workspace (
resource_id = "", # Add your resource_id
location = "" # Add your workspace location (for example, "westus")
)
Uwaga
O ile nie określono inaczej, należy uruchomić każdą komórkę w kolejności tworzenia, aby uniknąć problemów z kompilacją.
Kliknij trójkątną ikonę "odtwórz" po lewej stronie komórki, aby uruchomić kod.
Ładowanie wymaganych importów
Najpierw należy zaimportować dodatkowy moduł.
Kliknij pozycję + Kod , aby dodać nową komórkę, a następnie dodaj i uruchom następujący kod:
from azure.quantum.cirq import AzureQuantumService
Nawiązywanie połączenia z usługą Azure Quantum
Następnie utwórz AzureQuantumService
obiekt przy użyciu workspace
obiektu z poprzedniej komórki, aby nawiązać połączenie z obszarem roboczym usługi Azure Quantum. Dodaj nową komórkę z następującym kodem:
provider = AzureQuantumService(workspace)
Definiowanie prostego obwodu
Następnie utwórz prosty obwód Cirq do uruchomienia. Ten obwód używa pierwiastek kwadratowy bramy X natywny dla systemu sprzętowego 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────────
Wyświetl listę wszystkich targets
targets()
Użyj metody , aby wyświetlić listę wszystkich targets elementów w obszarze roboczym, które mogą uruchamiać obwód, w tym bieżący czas kolejki i dostępność.
Uwaga
targets Wszystkie elementy w obszarze roboczym mogą nie być wyświetlane — tylko targets te, które mogą akceptować obwód Cirq lub OpenQASM, zostaną wymienione tutaj.
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>
Uwaga
Pełna lista target może być inna dla obszaru roboczego.
Wybierz element target , aby uruchomić program
Uruchamianie w symulatorze IonQ
Aby sprawdzić obwód przed uruchomieniem go na rzeczywistym sprzęcie kwantowym, możesz użyć symulatora IonQ, ionq.simulator
.
Poniższa komórka przesyła zadanie, które uruchamia obwód z 100 strzałami, czeka na zakończenie zadania i zwraca wyniki.
result = service.run(
program=circuit,
repetitions=100,
target="ionq.simulator"
)
Spowoduje to zwrócenie cirq.Result
obiektu.
print(result)
b=1001100101100001000011011101000011010100010111100011001000100100010000001110010010101110110000011010, 1001100101100001000011011101000011010100010111100011001000100100010000001110010010101110110000011010
Wyniki można wykreślić na histogramie:
import pylab as pl
pl.hist(result.data)
pl.ylabel("Counts")
pl.xlabel("Result")
Szacowanie kosztu zadania
Przed uruchomieniem zadania na rzeczywistym sprzęcie kwantowym lub kwantowej jednostki przetwarzania (QPU) należy oszacować, ile będzie kosztować uruchomienie.
Aby uzyskać najbardziej aktualne szczegóły cennika, zobacz Cennik IonQ lub wyświetl opcje cennika w bloku Dostawcy obszaru roboczego. Aby wyświetlić bieżący stan i użycie środków, wybierz pozycję Środki i limity przydziału.
Uruchamianie na QPU IonQ
Poprzednie zadanie zostało uruchomione w symulatorze domyślnym. ionq.simulator
Można jednak również uruchomić go na procesorze sprzętowym IonQ lub jednostce procesora kwantowego (QPU). Aby uruchomić na QPU IonQ, podaj 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
)
Uwaga
Czas wymagany do uruchomienia obwodu na QPU zależy od bieżących czasów kolejki. Średni czas kolejki dla elementu target można wyświetlić, wybierając blok Dostawcy obszaru roboczego.
Ponownie zwraca cirq.Result
to obiekt.
print(result)
b=1001100101100001000011011101000011010100010111100011001000100100010000001110010010101110110000011010, 1001100101100001000011011101000011010100010111100011001000100100010000001110010010101110110000011010
Model asynchroniczny przy użyciu zadań
W przypadku długotrwałych obwodów może być przydatne ich asynchroniczne uruchamianie.
Metoda service.create_job
zwraca Job
obiekt, którego można użyć, aby uzyskać wyniki po pomyślnym uruchomieniu zadania.
job = service.create_job(
program=circuit,
repetitions=100,
target="ionq.simulator"
)
Aby sprawdzić stan zadania, użyj polecenia job.status()
:
print(job.status())
'completed'
Aby poczekać na ukończenie zadania, a następnie uzyskać wyniki, użyj wywołania job.results()
blokującego :
result = job.results()
print(result)
00: 0.5
11: 0.5
Uwaga
Funkcja job.results()
nie zwraca cirq.Result
obiektu. Zamiast tego zwraca obiekt wynikowy specyficzny dla symulatora IonQ i używa prawdopodobieństwa stanu zamiast danych strzałów.
type(result)
cirq_ionq.results.SimulatorResult
Aby przekonwertować to na cirq.Result
obiekt, użyj polecenia result.to_cirq_result()
:
print(result.to_cirq_result())
b=1110101111111110111000011101011111001100010000001011011101001111001111001101100111010000001100011100, 1110101111111110111000011101011111001100010000001011011101001111001111001101100111010000001100011100
Ważne
Przesyłanie wielu obwodów w jednym zadaniu nie jest obecnie obsługiwane. Aby obejść ten problem, możesz wywołać backend.run
metodę , aby przesłać każdy obwód asynchronicznie, a następnie pobrać wyniki każdego zadania. Na przykład:
jobs = []
for circuit in circuits:
jobs.append(backend.run(circuit, shots=N))
results = []
for job in jobs:
results.append(job.result())