Используйте пакет Microsoft Quantum Development Kit (Q#) OpenQASM для отправки программ Cirq, Qiskit, PennyLane, Azure Quantum и Python в QDK.
В этой статье приведены примеры отправки заданий для каждого поддерживаемого квантового языка или платформы. Сведения об интерактивном рабочем процессе Python или QDK, не требующем кода VS Code, см. в разделе Q#.
Необходимые условия
Учетная запись Azure с активной подпиской.
Одна Azure Quantum рабочая область. Чтобы создать ее, см. статью Azure Quantum "Создание рабочей области".
Python 3.10 или более поздней версии.
Если вы используете ноутбук Jupyter, среду Jupyter, например расширение Jupyter для VS Code и пакет ipykernel.
Установите Azure CLI с расширениемquantum.
az extension add --upgrade --name quantum
Установите последнюю версию пакета qdkPython с дополнительными модулями azure и jupyter.
pip install --upgrade "qdk[azure,jupyter]"
Если вы хотите отправить программу Cirq или Qiskit, установите дополнительные компоненты cirq и qiskit.
pip install --upgrade "qdk[qiskit,cirq]"
Подключитесь к Azure Quantum рабочей области
Прежде чем отправить задание, необходимо подключиться к рабочей области Azure Quantum. Модуль qdk.azure предоставляет объект Workspace для подключения к рабочим областям Azure Quantum. Чтобы подключиться к рабочей области, выполните следующие действия.
Вход с помощью Azure CLI
Если вы еще не сделали этого, войдите в Azure из терминала перед открытием записной книжки Jupyter.
az login
Если вы не выполняете вход через терминал, вам нужно проходить аутентификацию каждый раз при подключении к рабочей области Quantum через Python. Если у вашей учетной записи есть доступ к нескольким подпискам, выберите подписку, которая содержит вашу рабочую область Azure Quantum.
az account set --subscription <subscription-id>
Запустите az login снова, когда истекает срок действия сеанса или когда вы хотите использовать другую учетную запись Azure.
Получите идентификатор ресурса рабочей области
- Войдите на портал Azure.
- Перейдите в рабочую область Quantum, в которую вы хотите отправить задание.
- На странице обзора найдите и скопируйте идентификатор ресурса.
Подключение к рабочей области
Чтобы подключиться к рабочей области Quantum, создайте Workspace объект с идентификатором ресурса, скопированным вами.
from qdk.azure import Workspace
workspace = Workspace(resource_id="") # Add your resource ID
Проверьте подключение и просмотрите targets доступное в рабочей области.
for target in workspace.get_targets():
print(target.name)
Дополнительные сведения о подключении и проверке подлинности см. в разделе "Подключение к Azure Quantum рабочей области".
Note
В следующих примерах задания передаются в симулятор targets. Доступность targets в рабочей области зависит от настроенных поставщиков.
Подготовка и отправка программы
Выберите вкладку для квантового языка или платформы.
Используйте модуль qdk.qsharp для определения или загрузки кода Q#, компиляции точки входа в QIR и отправки QIR в Azure Quantumtarget.
Определение и компиляция Q# программы
Инициализируйте Q# с профилем targetQIR, который поддерживает targetAzure Quantum.
from qdk import qsharp, TargetProfile
qsharp.init(target_profile=TargetProfile.Base)
Дополнительные сведения о профилях QIRtarget см. в разделе Azure QuantumQIRtarget профили в QDK.
Определите операцию Q#. Например, используйте следующую RandomBit операцию.
qsharp.eval("""
operation RandomBit() : Result {
use q = Qubit();
H(q);
return MResetZ(q);
}
""")
Проверьте операцию на локальном симуляторе.
print(qsharp.run("RandomBit()", shots=10))
Скомпилируйте операцию в QIR.
from qdk.qsharp import compile
program = compile("RandomBit()")
Q# Отправка задания
Выберите совместимый target в рабочей области.
target = workspace.get_targets("rigetti.sim.qvm")
Отправьте скомпилированную программу.
job = target.submit(program, "qsharp-job", shots=100)
print("Job ID:", job.id)
Дождитесь завершения задания и получения результатов.
job.wait_until_completed()
print("Status:", job.details.status)
results = job.get_results()
print(results)
Используйте модуль qdk.openqasm для компиляции исходного кода OpenQASM 3 в QIR, а затем отправьте QIR в Azure Quantumtarget.
Определение и компиляция OpenQASM программы
Определите схему OpenQASM в виде строки Python.
qasm_source = """
OPENQASM 3.0;
include "stdgates.inc";
bit[2] c;
qubit[2] q;
h q[0];
cx q[0], q[1];
c = measure q;
"""
Скомпилируйте программу в QIR.
from qdk.openqasm import compile
program = compile(qasm_source)
OpenQASM Отправка задания
Выберите target, который принимает скомпилированную программу.
target = workspace.get_targets("ionq.simulator")
Отправьте скомпилированную программу.
job = target.submit(program, "openqasm-job", shots=100)
print("Job ID:", job.id)
Дождитесь завершения задания и получения результатов.
job.wait_until_completed()
print("Status:", job.details.status)
results = job.get_results()
print(results)
Для параметризованных OpenQASM программ необходимо привязать входные значения перед отправкой задания. Дополнительные сведения о OpenQASM в QDK см. в разделе QDK.
Используйте AzureQuantumProvider из qdk.azure модуля для отправки Qiskit заданий поставщику Azure Quantum . Объект поставщика перечисляет совместимые Azure Quantumtargets и возвращает Qiskit задания и результаты.
Создайте Qiskit схему
from qiskit import QuantumCircuit
circuit = QuantumCircuit(3, 3)
circuit.h(0)
circuit.cx(0, 1)
circuit.cx(1, 2)
circuit.measure([0, 1, 2], [0, 1, 2])
Qiskit Отправка задания
Создайте объект-поставщик Azure Quantum из рабочей области.
from qdk.azure.qiskit import AzureQuantumProvider
provider = AzureQuantumProvider(workspace)
Перечислите бэкенды, принимающие Qiskit схемы.
for backend in provider.backends():
print(backend.name)
Выберите сервер и отправьте схему.
backend = provider.get_backend("rigetti.sim.qvm")
job = backend.run(circuit, shots=100)
print("Job ID:", job.job_id())
print("Status:", job.status())
Дождитесь завершения задания и получения Qiskit результатов.
result = job.result()
counts = result.get_counts(circuit)
print(counts)
Адаптер Qiskit обрабатывает входной Azure Quantum формат и преобразует ответ поставщика в Qiskit результат.
Qiskit Результаты задания для программ с потерей кубитов
Некоторые квантовые аппаратные средства могут столкнуться с потерей кубитов при выполнении программы. Если потеря кубита происходит в любой момент при выполнении отдельного запуска программы Qiskit, то этот запуск удаляется из результатов задания Azure Quantum. Например, если потеря кубита происходит в 10 из 200 запусков, то общее число отсчётов измерений в результатах задачи составляет 190.
Необработанные результаты для всех выстрелов, включая выстрелы, в которых произошла потеря кубитов, по-прежнему доступны в объекте results . Следующий код получает оба набора результатов.
# Get results only for shots without qubit loss
print('Counts:', result.results[0].data.counts)
print('Probabilities:', result.results[0].data.probabilities)
print('Memory:', result.results[0].data.memory)
# Get the raw total shot results
print('Raw counts:', result.results[0].data.raw_counts)
print('Raw probabilities:', result.results[0].data.raw_probabilities)
print('Raw memory:', result.results[0].data.raw_memory)
Для заданий или targets без потери кубитов результаты по умолчанию и необработанные результаты идентичны.
Note
Атрибут memory для Qiskit результатов задания — это список результатов измерения для каждого снимка.
Используйте AzureQuantumService из qdk.azure модуля для отправки Cirq заданий поставщику Azure Quantum . Сервисный объект перечисляет совместимые Azure Quantumtargets и возвращает результаты в собственном формате Cirq или в собственном формате поставщика.
Создайте Cirq схему
import cirq
q0, q1 = cirq.LineQubit.range(2)
circuit = cirq.Circuit(
cirq.H(q0),
cirq.CX(q0, q1),
cirq.measure(q0, q1, key="result"),
)
Cirq Отправка задания
Azure Quantum Создайте объект службы.
from qdk.azure.cirq import AzureQuantumService
service = AzureQuantumService(workspace)
Перечислите targets, которые поддерживают цепи Cirq.
for target in service.targets():
print(target.name)
Создание асинхронного задания.
job = service.create_job(
program=circuit,
repetitions=100,
target="ionq.simulator",
)
print("Status:", job.status())
Дождитесь завершения задания и получения результатов.
result = job.results()
print(result)
Формат результатов зависит от поставщика и target. Некоторые объекты результатов поставщика можно преобразовать в cirq.Result объект.
Преобразуйте OpenQASM квантовый узел в QIR, скомпилируйте QIR в target и отправьте Azure Quantum в OpenQASMPennyLane.
Создайте PennyLane схему
Следующий канал является параметризованным каналом. Эффект RY ворот зависит от угла theta.
import pennylane as qml
device = qml.device("default.qubit", wires=2)
@qml.qnode(device)
def circuit(theta):
qml.Hadamard(wires=0)
qml.CNOT(wires=[0, 1])
qml.RY(theta, wires=1)
return qml.expval(qml.PauliZ(1))
Преобразуйте цепь в QIR
Преобразуйте параметризованную схему в OpenQASM для конкретного значения параметра.
theta = 0.3
qasm_source = qml.to_openqasm(circuit)(theta)
Скомпилируйте OpenQASM в QIR с использованием совместимого профиля target.
from qdk import TargetProfile
from qdk.openqasm import compile
program = compile(qasm_source, TargetProfile.Base)
PennyLane Отправка задания
Выберите совместимую target версию и отправьте файл QIR.
target = workspace.get_targets("rigetti.sim.qvm")
job = target.submit(program, "pennylane-job", shots=100)
print("Job ID:", job.id)
Дождитесь завершения задания и получения результатов.
job.wait_until_completed()
print("Status:", job.details.status)
results = job.get_results()
print(results)
Формат результатов зависит от поставщика и target.
Azure Quantum не возвращает PennyLane результаты квантового узла от отправленного QIR.
Связанные материалы