Перейти до основного вмісту

Напиши свою першу програму Qiskit Serverless

Версії пакетів

Код на цій сторінці розроблявся з використанням таких залежностей. Рекомендуємо використовувати ці або новіші версії.

qiskit[all]~=1.3.1
qiskit-ibm-runtime~=0.34.0
qiskit-aer~=0.15.1
qiskit-serverless~=0.18.1
qiskit-ibm-catalog~=0.2
qiskit-addon-sqd~=0.8.1
qiskit-addon-utils~=0.1.0
qiskit-addon-mpf~=0.2.0
qiskit-addon-aqc-tensor~=0.1.2
qiskit-addon-obp~=0.1.0
scipy~=1.15.0
pyscf~=2.8.0

У цьому прикладі показано, як за допомогою інструментів qiskit-serverless створити програму паралельної транспіляції, а потім використати qiskit-ibm-catalog, щоб розгорнути її на IBM Quantum Platform як багаторазовий віддалений сервіс.

Приклад: віддалена транспіляція з Qiskit Serverless

Почнемо з такого прикладу, що транспілює circuit для заданого backend і цільового optimization_level, поступово додаючи елементи для розгортання робочого навантаження у Qiskit Serverless.

Помісти наведений нижче блок коду у файл ./source_files/transpile_remote.py. Це і є програма, яку потрібно завантажити до Qiskit Serverless.

# Added by doQumentation — required packages for this notebook
!pip install -q qiskit qiskit-ibm-catalog qiskit-ibm-runtime qiskit-serverless
# This cell is hidden from users, it just creates a new folder
from pathlib import Path

Path("./source_files").mkdir(exist_ok=True)
%%writefile ./source_files/transpile_remote.py

from qiskit.transpiler import generate_preset_pass_manager

def transpile_remote(circuit, optimization_level, backend):
"""Transpiles an abstract circuit into an ISA circuit for a given backend."""
pass_manager = generate_preset_pass_manager(
optimization_level=optimization_level,
backend=backend
)
isa_circuit = pass_manager.run(circuit)
return isa_circuit
Writing ./source_files/transpile_remote.py

Налаштуй файли

Qiskit Serverless вимагає організувати .py-файли робочого навантаження в окремий каталог. Наступна структура є прикладом хорошої практики:

serverless_program
├── program_uploader.ipynb
└── source_files
├── transpile_remote.py
└── *.py

Serverless завантажує вміст source_files для віддаленого запуску. Після налаштування можна скоригувати transpile_remote.py для отримання вхідних даних і повернення результатів.

Отримай аргументи програми

Початковий transpile_remote.py має три вхідні параметри: circuits, backend_name і optimization_level. Serverless наразі підтримує лише серіалізовані вхідні й вихідні дані. З цієї причини не можна передати backend безпосередньо — замість цього використовуй backend_name як рядок.

%%writefile --append ./source_files/transpile_remote.py

from qiskit_serverless import get_arguments, save_result, distribute_task, get

# Get program arguments
arguments = get_arguments()
circuits = arguments.get("circuits")
backend_name = arguments.get("backend_name")
optimization_level = arguments.get("optimization_level")
Appending to ./source_files/transpile_remote.py

На цьому етапі можна отримати бекенд через QiskitRuntimeService і додати існуючу програму з таким кодом. Наведений нижче код передбачає, що ти вже зберіг свої облікові дані.

%%writefile --append ./source_files/transpile_remote.py

from qiskit_ibm_runtime import QiskitRuntimeService

service = QiskitRuntimeService()
backend = service.backend(backend_name)
Appending to ./source_files/transpile_remote.py

Нарешті, можна запустити transpile_remote() для всіх переданих circuits і повернути transpiled_circuits як результат:

%%writefile --append ./source_files/transpile_remote.py

results = [
transpile_remote(circuit, 1, backend)
for circuit in circuits
]

save_result({
"transpiled_circuits": results
})
Appending to ./source_files/transpile_remote.py

Розгортання на IBM Quantum Platform

У попередньому розділі була створена програма для віддаленого запуску. Блоки коду в цьому розділі завантажують цю програму до Qiskit Serverless.

Використовуй qiskit-ibm-catalog для автентифікації в QiskitServerless за допомогою свого API-ключа, який можна знайти на дашборді IBM Quantum, і завантаж програму.

Можна використати save_account() для збереження облікових даних (див. розділ Налаштування IBM Cloud). Зверни увагу, що це записує облікові дані в той самий файл, що й QiskitRuntimeService.save_account().

from qiskit_ibm_catalog import QiskitServerless, QiskitFunction

# Authenticate to the remote cluster and submit the pattern for remote execution
serverless = QiskitServerless()

Qiskit Serverless стискає вміст working_dir (у цьому випадку source_files) у tar-архів, який завантажується, а після цього очищається. entrypoint визначає головний виконуваний файл програми для Qiskit Serverless. Крім того, якщо програма має власні залежності pip, їх можна додати до масиву dependencies:

transpile_remote_demo = QiskitFunction(
title="transpile_remote_serverless",
entrypoint="transpile_remote.py",
working_dir="./source_files/",
)
serverless.upload(transpile_remote_demo)
QiskitFunction(transpile_remote_serverless)

Щоб перевірити успішність завантаження, використовуй serverless.list():

# Get program from serverless.list() that matches the title of the one we uploaded
next(
program
for program in serverless.list()
if program.title == "transpile_remote_serverless"
)
QiskitFunction(transpile_remote_serverless)
# This cell is hidden from users, it checks the program uploaded correctly
assert _.title == "transpile_remote_serverless" # noqa: F821
# This cell is hidden from users, it checks the program executes correctly
from time import sleep
from qiskit import QuantumCircuit

qc = QuantumCircuit(2)
transpile_remote_serverless = serverless.load("transpile_remote_serverless")
job = transpile_remote_serverless.run(
circuits=[qc],
backend="ibm_sherbrooke",
optimization_level=1,
)
while True:
sleep(5)
status = job.status()
if status not in ["QUEUED", "INITIALIZING", "RUNNING", "DONE"]:
raise Exception(
f"Unexpected job status: '{status}'\n"
+ "Here are the logs:\n"
+ job.logs()
)
if status == "DONE":
break

Наступні кроки

Рекомендації