Поделиться через


Как отправить схему с помощью Cirq в Azure Quantum

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

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

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

Дополнительные сведения об установке см. в разделе Настройка расширения QDK.

  • Рабочая область Azure Quantum в вашей подписке Azure. Сведения о создании рабочей области см. в статье Создание рабочей области Azure Quantum.

  • Среда с установленными PythonPython и программой Pip.

  • VS Code с установленными расширениями Azure Quantum Development Kit, Python, и Jupyter.

  • Пакет Azure Quantum azure-quantum с тегом [cirq], а также пакеты qsharp и ipykernel.

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

    Примечание.

    Если ядро Python Jupyter ipykernel не обнаружено, VS Code предложит установить его.

Создать новую тетрадь Jupyter

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

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

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

import azure.quantum
from azure.quantum.cirq import AzureQuantumService

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

Для подключения к службе Azure Quantum программе потребуются идентификатор ресурса и расположение рабочей области Azure Quantum.

  1. Вход в учетную запись Azure, https://portal.azure.com

  2. Выберите рабочую область Azure Quantum и перейдите к обзору.

  3. Скопируйте параметры в полях.

    Снимок экрана в Visual Studio Code, показывающий, как развернуть область обзора в рабочем пространстве Quantum.

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

Список всех targets

Используйте метод targets(), чтобы перечислить все targets в вашей рабочей области, которые могут запускать вашу схему, включая текущее время ожидания в очереди и доступность.

Примечание.

В вашей рабочей области могут быть не указаны все targets — будут перечислены только те targets, которые могут принимать схему Cirq или 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>]

Создайте простую схему

Затем создайте простую цепь Cirq для выполнения. Эта цепь использует квадратный корень из гейта X, встроенного в аппаратную систему 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────────

Выберите target, чтобы запустить вашу программу

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

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

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

Возвращается объект cirq.Result.

print(result)
    b=1001100101100001000011011101000011010100010111100011001000100100010000001110010010101110110000011010, 1001100101100001000011011101000011010100010111100011001000100100010000001110010010101110110000011010

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

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

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

Запуск на IonQ QPU

Предыдущее задание выполнялось в симуляторе по умолчанию "ionq.simulator". Однако его также можно запустить на аппаратном процессоре IonQ (единице квантового процессора (QPU)). Для выполнения на QPU IonQ укажите "ionq.qpu.aria-1" в качестве аргумента target:

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

Снова возвращается объект cirq.Result.

print(result)
b=0101011011011111100001011101101011011110100010000000011110111000100100110110101100110001001111101111, 0101011011011111100001011101101011011110100010000000011110111000100100110110101100110001001111101111

Асинхронная модель, использующая задания

Асинхронное выполнение длительных схем может быть полезным. Метод service.create_job возвращает объект Job, который можно использовать для получения результатов после успешного выполнения задания.

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

Чтобы проверить состояние задания, используйте job.status():

print(job.status())
'completed'

Чтобы дождаться завершения задания, а затем получить результаты, используйте блокирующий вызов job.results():

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

Обратите внимание, что объект cirq.Result при этом не возвращается. Вместо этого возвращается результирующий объект, относящийся к симулятору IonQ; при этом вместо данных снимков используются вероятности состояния.

type(result)
cirq_ionq.results.SimulatorResult

Чтобы преобразовать его в объект cirq.Result, используйте result.to_cirq_result():

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

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

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

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

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

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

Примечание.

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

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

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

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

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

from azure.quantum.cirq import AzureQuantumService

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

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

provider = AzureQuantumService(workspace)

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

Затем создайте простую цепь Cirq для выполнения. Эта цепь использует квадратный корень из гейта X, встроенного в аппаратную систему 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────────

Список всех targets

Используйте метод targets(), чтобы перечислить все targets в вашей рабочей области, которые могут запускать вашу схему, включая текущее время ожидания в очереди и доступность.

Примечание.

В вашей рабочей области могут быть не указаны все targets — будут перечислены только те targets, которые могут принимать схему Cirq или 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>

Примечание.

Полный список target может отличаться в вашей рабочей области.

Выберите target, чтобы запустить вашу программу

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

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

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

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

Возвращается объект cirq.Result.

print(result)
    b=1001100101100001000011011101000011010100010111100011001000100100010000001110010010101110110000011010, 1001100101100001000011011101000011010100010111100011001000100100010000001110010010101110110000011010

Результаты можно представить в виде гистограммы:

import pylab as pl

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

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

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

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

Запуск на IonQ QPU

Предыдущее задание выполнялось в симуляторе по умолчанию ionq.simulator. Однако его также можно запустить на аппаратном процессоре IonQ (единице квантового процессора (QPU)). Для выполнения на QPU IonQ укажите ionq.qpu.aria-1 в качестве аргумента target:

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

Примечание.

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

Снова возвращается объект cirq.Result.

print(result)
    b=1001100101100001000011011101000011010100010111100011001000100100010000001110010010101110110000011010, 1001100101100001000011011101000011010100010111100011001000100100010000001110010010101110110000011010

Асинхронная модель, использующая задания

Асинхронное выполнение длительных схем может быть полезным. Метод service.create_job возвращает объект Job, который можно использовать для получения результатов после успешного выполнения задания.

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

Чтобы проверить состояние задания, используйте job.status():

print(job.status())
'completed'

Чтобы дождаться завершения задания, а затем получить результаты, используйте блокирующий вызов job.results():

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

Примечание.

Функция job.results() не возвращает объект cirq.Result. Вместо этого возвращается результирующий объект, относящийся к симулятору IonQ; при этом вместо данных снимков используются вероятности состояния.

type(result)
cirq_ionq.results.SimulatorResult

Чтобы преобразовать его в объект cirq.Result, используйте result.to_cirq_result():

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

Внимание

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

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

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