Отправка канала с помощью Qiskit в Azure Quantum
Узнайте, как отправить квантовый канал Qiskit с помощью azure-quantum
Python пакета. Каналы Qiskit можно отправлять в Azure Quantum с помощью записной книжки Azure Quantum, встроенной azure-quantum
Python пакета или локального компьютера.
Дополнительные сведения см. в разделе Квантовые цепи.
Необходимые компоненты
Дополнительные сведения об установке см. в разделе "Установка QDK" в VS Code.
Рабочая область Azure Quantum по подписке Azure. Сведения о создании рабочей области см. в статье Создание рабочей области Azure Quantum.
Среда сPython установленной Python программой Pip.
VS Code с установленными расширениями Jupyter для Azure Quantum Development KitPython и Jupyter.
Пакет Azure Quantum
azure-quantum
Python с тегом [qiskit].python -m pip install --upgrade azure-quantum[qiskit] qsharp ipykernel
Внимание
Убедитесь, что у вас установлена последняя версия Qiskit. Дополнительные сведения см. в статье об обновлении пакета Azure-QuantumPython.
Примечание.
Если ядро
ipykernel
Jupyter Python не обнаружено, VS Code предложит установить его.
Создание новой записной книжки Jupyter Notebook
- В VS Code выберите палитру команд view > и нажмите кнопку Create: New Jupyter Notebook.
- В правом верхнем углу VS Code обнаружит и отобразит версию виртуальной Python Python среды, выбранной для записной книжки. Если у вас несколько Python сред, может потребоваться выбрать ядро с помощью средства выбора ядра в правом верхнем углу. Если среда не обнаружена, сведения о настройке см . в записных книжках Jupyter Notebook в VS Code .
Загрузка необходимых объектов импорта
В первой ячейке записной книжки выполните следующий код, чтобы загрузить необходимые импорты:
import azure.quantum
from azure.quantum import Workspace
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
Выполнение простой цепи
Сначала создайте простую цепь 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)
Функция транспиля возвращает новый объект канала, в котором шлюзы разложены в шлюзы, поддерживаемые на указанной серверной части.
Теперь можно запустить программу через службу Azure Quantum и получить результат. Следующая ячейка отправляет задание, которое запускает цепь со 100 снимками:
job = simulator_backend.run(circuit, shots=8)
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=8, success=True, meas_level=2, data=ExperimentResultData(counts={'000': 4, '111': 4}, memory=['000', '000', '000', '000', '111', '111', '111', '111'], probabilities={'000': 0.5, '111': 0.5}), header=QobjExperimentHeader(name='Qiskit Sample - 3-qubit GHZ circuit', num_qubits=3, metadata={}), status=JobStatus.DONE, name='Qiskit Sample - 3-qubit GHZ circuit')], date=None, status=None, header=None, error_data=None)
Так как результатом будет собственный объект пакета 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': 4, '001': 0, '010': 0, '011': 0, '100': 0, '101': 0, '110': 0, '111': 4}
Вы также можете использовать функцию get_memory()
для отображения отдельных данных снимка из задания.
result.get_memory(circuit)
['000', '000', '000', '000', '111', '111', '111', '111']
Примечание.
При отправке задания с нечетным числом снимков IonQ targetsрезультаты будут округляться до следующего четного числа. Например, если указать 9 снимков, результаты будут отображать данные для 8 выстрелов.
Оценка стоимости задания
Перед выполнением задания на ЦП необходимо оценить, сколько стоит выполнить.
Актуальные сведения о ценах см. в статье Цены на IonQ, или найдите рабочую область и просмотрите параметры ценообразования на вкладке "Поставщик" с помощью команды: aka.ms/aq/myworkspaces.
Выполнение на QPU IonQ
Чтобы подключиться к реальному оборудованию ( QPU ), просто укажите имя target"ionq.qpu.aria-1"
get_backend
метода:
qpu_backend = provider.get_backend("ionq.qpu.aria-1")
Отправьте канал для запуска в Azure Quantum, получите результаты и запустите plot_histogram
, чтобы отобразить результаты.
Примечание.
Время, необходимое для выполнения цепи на QPU, может отличаться в зависимости от времени в текущей очереди.
# Submit the circuit to run on Azure Quantum
job = qpu_backend.run(circuit, shots=100)
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.qpu.aria-1', 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
Затем создайте объект с помощью Workspace
объекта из предыдущей AzureQuantumProvider
ячейки для подключения к рабочей области 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.simulator
- ionq.qpu.aria-1
- microsoft.estimator
- quantinuum.qpu.h1-1
- quantinuum.sim.h1-1sc
- quantinuum.sim.h1-1e
- rigetti.sim.qvm
Выберите программу 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=8)
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='00000000-0000-0000-0000-000000000000', success=True, results=[ExperimentResult(shots=8, success=True, meas_level=2, data=ExperimentResultData(counts={'000': 4, '111': 4}, memory=['000', '000', '000', '000', '111', '111', '111', '111'], probabilities={'000': 0.5, '111': 0.5}), header=QobjExperimentHeader(name='Qiskit Sample - 3-qubit GHZ circuit', num_qubits=3, metadata={}), status=JobStatus.DONE, name='Qiskit Sample - 3-qubit GHZ circuit')], date=None, status=None, header=None, error_data=None)
Так как типом 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': 4, '001': 0, '010': 0, '011': 0, '100': 0, '101': 0, '110': 0, '111': 4}
Вы также можете использовать функцию get_memory()
для отображения отдельных данных снимка из задания.
result.get_memory(circuit)
['000', '000', '000', '000', '111', '111', '111', '111']
Примечание.
При отправке задания с нечетным числом снимков IonQ targetsрезультаты будут округляться до следующего четного числа. Например, если указать 9 снимков, результаты будут отображать данные для 8 выстрелов.
Оценка стоимости задания
Перед выполнением задания на фактическом квантовом оборудовании или квантовой единице обработки (QPU) необходимо оценить, сколько стоит выполнить.
Актуальные сведения о ценах можно узнать на странице цен IonQ или найдите свою рабочую область и посмотрите в колонке Поставщики для рабочей области.
Выполнение на QPU IonQ
После успешного запуска задания на симуляторе IonQ и оценки стоимости QPU время запуска канала на оборудовании.
Примечание.
Время, необходимое для выполнения цепи на QPU, отличается в зависимости от времени в текущей очереди. Среднее время target очереди можно просмотреть, выбрав колонку "Поставщики " рабочей области.
Используйте тот же метод run
и операции, которые вы ранее применяли для проверяющего элемента управления API, чтобы отправить и отобразить задание:
# Submit the circuit to run on Azure Quantum
job = qpu_backend.run(circuit, shots=100)
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())