Отправка канала с помощью Qiskit в Azure Quantum
Узнайте, как отправить квантовую цепь Qiskit с помощью azure-quantum
Python пакета . Вы можете отправлять каналы Qiskit в azure-quantum
Python Azure Quantum с помощью записной книжки Azure Quantum, которая имеет встроенный пакет, или с локального компьютера.
Дополнительные сведения см. в разделе Квантовые цепи.
Примечание
Microsoft Quantum Development Kit (классический QDK) больше не будет поддерживаться после 30 июня 2024 г. Если вы уже являетесь разработчиком QDK, мы рекомендуем перейти на новый пакет средств разработки Azure Quantum (Современный QDK), чтобы продолжить разработку квантовых решений. Дополнительные сведения см. в статье Перенос кода Q# в современный QDK.
Предварительные требования
Сведения об установке см. в статье Установка современного QDK в VS Code.
Рабочая область Azure Quantum по подписке Azure. сведения о создании рабочей области см. в статье Создание рабочей области Azure Quantum;
Среда Python с Python установленными и Pip .
VS Code с установленным пакетом средств разработки Azure Quantum, Pythonрасширениями Jupyter и .
Пакет Azure Quantum
azure-quantum
с тегом [qiskit], аqsharp
также пакеты иipykernel
.python -m pip install --upgrade azure-quantum[qiskit] qsharp ipykernel
Примечание
Если ядро
ipykernel
Jupyter Python не обнаружено, VS Code предложит установить его.
Создание нового Jupyter Notebook
- В VS Code выберите Просмотреть > палитру команд и выберите Создать: создать Jupyter Notebook.
- В правом верхнем углу 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 и скопируйте значения из заголовка.
Добавьте новую ячейку и используйте сведения об учетной записи для создания 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}
Оценка стоимости задания
Перед выполнением задания на 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}
Важно!
Отправка нескольких цепей в одном задании в настоящее время не поддерживается. В качестве обходного решения можно вызвать метод backend.run
для асинхронной отправки каждой цепи, а затем получить результаты каждого задания. Пример:
jobs = []
for circuit in circuits:
jobs.append(backend.run(circuit, shots=N))
results = []
for job in jobs:
results.append(job.result())
Предварительные требования
- Учетная запись Azure с активной подпиской. Если у вас нет учетной записи Azure, зарегистрируйтесь бесплатно и зарегистрируйтесь для получения подписки с оплатой по мере использования.
- Рабочая область Azure Quantum. Дополнительные сведения см. в статье Создание рабочей области Azure Quantum.
Создание записной книжки в рабочей области
- Войдите на портал Azure и выберите рабочую область, созданную на предыдущем шаге.
- В колонке слева выберите элемент Записные книжки.
- Щелкните Мои записные книжки, а затем — Добавить новую.
- Введите имя файла, например 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}
Оценка стоимости задания
Перед выполнением задания на фактическом квантовом оборудовании или на единице квантовой обработки (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}
Важно!
Отправка нескольких цепей в одном задании в настоящее время не поддерживается. В качестве обходного решения можно вызвать метод backend.run
для асинхронной отправки каждой цепи, а затем получить результаты каждого задания. Пример:
jobs = []
for circuit in circuits:
jobs.append(backend.run(circuit, shots=N))
results = []
for job in jobs:
results.append(job.result())
Дальнейшие действия
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по