Отправка канала с помощью Qiskit в Azure Quantum

Узнайте, как отправить квантовую цепь Qiskit с помощью azure-quantumPython пакета . Вы можете отправлять каналы Qiskit в azure-quantumPython Azure Quantum с помощью записной книжки Azure Quantum, которая имеет встроенный пакет, или с локального компьютера.

Дополнительные сведения см. в разделе Квантовые цепи.

Примечание

Microsoft Quantum Development Kit (классический QDK) больше не будет поддерживаться после 30 июня 2024 г. Если вы уже являетесь разработчиком QDK, мы рекомендуем перейти на новый пакет средств разработки Azure Quantum (Современный QDK), чтобы продолжить разработку квантовых решений. Дополнительные сведения см. в статье Перенос кода Q# в современный QDK.

Предварительные требования

Сведения об установке см. в статье Установка современного QDK в VS Code.

Создание нового Jupyter Notebook

  1. В VS Code выберите Просмотреть > палитру команд и выберите Создать: создать Jupyter Notebook.
  2. В правом верхнем углу VS Code обнаружит и отобразит версию Python и виртуальную Python среду, выбранную для записной книжки. Если у вас несколько Python сред, может потребоваться выбрать ядро с помощью средства выбора ядра в правом верхнем углу. Если среда не обнаружена, см. сведения о настройке записных книжек Jupyter Notebook в VS Code .

Загрузка необходимых объектов импорта

В первой ячейке записной книжки выполните следующий код, чтобы загрузить необходимые импорты:

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

Подключение к службе Azure Quantum

Чтобы подключиться к службе Azure Quantum, вам потребуется идентификатор ресурса и расположение рабочей области Azure Quantum. Войдите в учетную запись Azure, https://portal.azure.com, перейдите в рабочую область Azure Quantum и скопируйте значения из заголовка.

Получение идентификатора ресурса и расположения из рабочей области Azure Quantum

Добавьте новую ячейку и используйте сведения об учетной записи для создания Workspace объектов и AzureQuantumProvider для подключения к рабочей области 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)

Вывод списка всех серверных компонентов

Теперь можно распечатать все серверные компоненты квантовых вычислений, доступные в рабочей области.

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

Выполнение простой цепи

Сначала создайте простую цепь Qiskit для выполнения.

# 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 

Выберите для target запуска программы

Запуск в симуляторе IonQ

Перед запуском на реальном оборудовании давайте протестируем цепь в симуляторе. Используйте get_backend для создания Backend объекта для подключения к серверной части симулятора IonQ:

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

Серверная часть IonQ поддерживает шлюзы из определенного набора шлюзов, которые компилируются для оптимального выполнения на оборудовании. Если канал содержит шлюзы, которых нет в этом списке, необходимо транспилировать в поддерживаемый gateset с помощью transpile функции Qiskit:

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

Функция transpile возвращает новый объект цепи, в котором шлюзы разбиваются на шлюзы, поддерживаемые указанной серверной частью.

Теперь можно запустить программу через службу Azure Quantum и получить результат. Следующая ячейка отправляет задание, которое запускает цепь со 100 снимками:

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

Чтобы дождаться завершения задания и вернуть результаты, выполните:

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

Так как результатом будет собственный объект пакета Qiskit, можно использовать result.get_counts и plot_histogram Qiskit для визуализации результатов. Чтобы гарантировать представление всех возможных меток в виде последовательности битов, добавьте их в 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 в симуляторе IonQ

Оценка стоимости задания

Перед выполнением задания на QPU можно оценить стоимость выполнения. Чтобы оценить затраты на выполнение задания в QPU, можно использовать метод estimate_cost:

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

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

Это действие выводит оценочные затраты в долларах США (USD).

Актуальные сведения о ценах см. в статье Цены на IonQ, или найдите рабочую область и просмотрите параметры ценообразования на вкладке "Поставщик" с помощью команды: aka.ms/aq/myworkspaces.

Выполнение на QPU IonQ

Чтобы подключиться к реальному оборудованию ( квантовая процессорная единица (QPU)), просто укажите имя target"ionq.qpu"get_backend метода :

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

Отправьте канал для запуска в Azure Quantum, получите результаты и выполните команду plot_histogram , чтобы отобразить результаты.

Примечание

Время, необходимое для выполнения цепи на QPU, может отличаться в зависимости от времени в текущей очереди.

# 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 на QPU IonQ

Важно!

Отправка нескольких цепей в одном задании в настоящее время не поддерживается. В качестве обходного решения можно вызвать метод backend.run для асинхронной отправки каждой цепи, а затем получить результаты каждого задания. Пример:

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

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

Предварительные требования

Создание записной книжки в рабочей области

  1. Войдите на портал Azure и выберите рабочую область, созданную на предыдущем шаге.
  2. В колонке слева выберите элемент Записные книжки.
  3. Щелкните Мои записные книжки, а затем — Добавить новую.
  4. Введите имя файла, например Qiskit.ipynb, и щелкните Создать файл.

Когда откроется новая записная книжка, она автоматически создает код для первой ячейки на основе сведений о подписке и рабочей области.

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

Примечание

Если не указано иное, следует выполнять ячейки в порядке их создания, чтобы избежать проблем компиляции.

Щелкните треугольный значок воспроизведения слева от ячейки, чтобы выполнить размещенный в ней код.

Загрузка необходимых объектов импорта

Сначала необходимо импортировать несколько дополнительных модулей.

Щелкните + Код, чтобы добавить новую ячейку, а затем добавьте и выполните следующий код:

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

Подключение к службе Azure Quantum

Затем создайте AzureQuantumProvider объект, используя Workspace объект из предыдущей ячейки для подключения к рабочей области Azure Quantum. Добавьте новую ячейку со следующим кодом:

provider = AzureQuantumProvider(workspace)

Настройка простой цепи

В новой ячейке создайте объект circuit. В этом примере используется простой квантовый генератор случайных битов. Добавьте следующий код для определения и отображения цепи:

# 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 

Перечисление всех targets

Теперь можно отобразить все квантовые вычисления targetsили серверные компоненты, доступные в рабочей области. Добавьте новую ячейку и выполните следующую строку:

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

Выберите для target запуска программы

Для проверки кода перед запуском на реальном квантовом оборудовании можно применить квантовый симулятор IonQ ionq.simulator.

Добавьте новую ячейку и создайте объект для представления квантового симулятора targetIonQ:

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

Запуск в симуляторе IonQ

Чтобы запустить канал в симуляторе, добавьте следующий код. В этом примере используется run метод объекта для target отправки задания, а затем отслеживается его состояние.

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

После успешного выполнения задания получите результаты задания и отобразите их:

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

Так как типом result будет собственный объект пакета Qiskit, можно использовать result.get_counts и plot_histogram Qiskit для визуализации результатов. Чтобы гарантировать представление всех возможных меток в виде последовательности битов, добавьте их в 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 в симуляторе IonQ

Оценка стоимости задания

Перед выполнением задания на фактическом квантовом оборудовании или на единице квантовой обработки (QPU) можно оценить стоимость выполнения.

Сначала еще раз получите список доступных поставщиков:

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

Затем создайте объект для представления квантового компьютера IonQ:

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

Чтобы оценить стоимость выполнения задания на QPU, добавьте и запустите новую ячейку estimate_cost с помощью метода target:

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

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

Это действие отобразит оценочные затраты в долларах США (USD).

Актуальные сведения о ценах можно узнать на странице цен IonQ или найдите свою рабочую область и посмотрите в колонке Поставщики для рабочей области.

Выполнение на QPU IonQ

После успешного выполнения задания в симуляторе IonQ и оценки затрат на QPU пришло время запустить канал на оборудовании.

Примечание

Время, необходимое для выполнения цепи на QPU, отличается в зависимости от времени в текущей очереди. Среднее время очереди для target можно просмотреть, выбрав колонку Поставщики в рабочей области.

Используйте тот же метод run и операции, которые вы ранее применяли для проверяющего элемента управления 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)

По завершении задания получите результаты задания, как и раньше, и отобразите их на диаграмме:

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 на QPU IonQ

Важно!

Отправка нескольких цепей в одном задании в настоящее время не поддерживается. В качестве обходного решения можно вызвать метод backend.run для асинхронной отправки каждой цепи, а затем получить результаты каждого задания. Пример:

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

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

Дальнейшие действия