Перейти до основного вмісту
Цей проєкт у бета-версії. Знайшов(-ла) помилку? Відкрити issue на GitHub. Є запитання чи ідея? Запитати в Discussions — будемо раді твоєму відгуку!
Яка якість перекладу на цій сторінці?

Розгорни свій перший керований робочий процес

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

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

qiskit[all]~=2.6.1
qiskit-serverless~=0.38.0

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

Перш ніж почати, встанови клієнтський пакет і пройди автентифікацію.

Використовуй навички ШІ (необов'язково)

Щоб розгорнути власний код за допомогою ШІ-асистента, використовуй навички ШІ з репозиторію шаблонів Qiskit Function.

# Added by doQumentation — installs the packages this notebook needs if they are missing
import importlib.util

_needed = {"qiskit": "qiskit", "qiskit_ibm_catalog": "qiskit-ibm-catalog", "qiskit_serverless": "qiskit-serverless"}
_missing = [pip for module, pip in _needed.items()
if importlib.util.find_spec(module) is None]
# One at a time, so a package that fails to install does not block the others
for _pip in _missing:
%pip install -q {_pip}
if not _missing:
print("\u2713 All required packages are installed")

Напиши робочий процес​

Створи структуру папок​

Керований робочий процес — це папка з файлами Python і одним файлом точки входу. Керований робочий процес завантажує все, що є в папці, до 50 МБ, і запускає точку входу як скрипт. Оскільки робочий процес завантажує всю папку, тримай свої локальні файли, як-от deploy.ipynb, поза папкою. Створи таку структуру:

hello_world_project/
├── deploy.ipynb # Your local notebook: upload and run the workflow
└── source_files/ # The working directory that you upload
└── hello_world.py # The entrypoint

Напиши точку входу hello world​

Точка входу читає коло, оптимізує й симулює його та зберігає лічильники й двокубітну глибину. Збережи такий код як source_files/hello_world.py:

примітка

Якщо ти читаєш цю сторінку як блокнот, комірка з кодом для hello_world.py починається з магічної команди %%writefile. Коли ти запускаєш цю комірку, вона зберігає код у файл замість того, щоб виконувати його.

# This cell is hidden from users. It creates the working directory.
from pathlib import Path

Path("./source_files").mkdir(exist_ok=True)
%%writefile ./source_files/hello_world.py
from qiskit.primitives import StatevectorSampler
from qiskit.transpiler import generate_preset_pass_manager
from qiskit_serverless import Job, get_arguments, save_result, update_status

# Read the arguments that you pass to run()
arguments = get_arguments()
circuit = arguments["circuit"]
shots = arguments.get("shots", 1024)

# Optimize the circuit. Printed text goes to the job's logs.
update_status(Job.OPTIMIZING_HARDWARE)
pass_manager = generate_preset_pass_manager(
optimization_level=1, basis_gates=["cz", "rz", "sx", "x"]
)
isa_circuit = pass_manager.run(circuit)
two_qubit_depth = isa_circuit.depth(lambda instruction: instruction.operation.num_qubits == 2)
print(f"Two-qubit depth after optimization: {two_qubit_depth}", flush=True)

# Simulate the circuit and return the counts
sampler = StatevectorSampler(seed=1234)
pub_result = sampler.run([isa_circuit], shots=shots).result()[0]
save_result({"counts": pub_result.data.meas.get_counts(), "two_qubit_depth": two_qubit_depth})
Writing ./source_files/hello_world.py

Точка входу використовує три функції з qiskit_serverless:

  • get_arguments() повертає іменовані аргументи, які ти передаєш у run(), у вигляді словника. Кожне значення має бути серіалізовним у JSON або об'єктом, який клієнт може закодувати, наприклад QuantumCircuit. Закодовані об'єкти надходять як ті самі об'єкти, що ти передав.

  • update_status(Job.OPTIMIZING_HARDWARE) встановлює детальний статус RUNNING: OPTIMIZING_FOR_HARDWARE, який ти можеш побачити під час виконання завдання. Див. Звітування про прогрес за допомогою update_status().

  • save_result() зберігає серіалізовне у JSON значення, яке ти пізніше читаєш за допомогою job.result(). Робочий процес повертає лічильники як словник, а двокубітну глибину оптимізованого кола — як ціле число.

Усе, що робочий процес записує в стандартний вивід, наприклад двокубітна глибина, потрапляє в журнали завдання. Щоб додати часові мітки та рівні журналювання, використовуй модуль logging. Див. Запис журналів і обробка помилок.

Завантаж робочий процес​

У своєму локальному блокноті запусти наведений нижче код із папки hello_world_project. Код підключається за допомогою твого збереженого облікового запису, визначає робочий процес і завантажує його. entrypoint — це файл, який запускає робочий процес, а working_dir — папка, яку ти завантажуєш:

from qiskit_ibm_catalog import ManagedWorkflow, ManagedWorkflowClient

client = ManagedWorkflowClient()

hello_world = ManagedWorkflow(
title="hello-world",
entrypoint="hello_world.py",
working_dir="./source_files/",
)

hello_world = client.upload(hello_world)

Запусти робочий процес із вхідними даними​

Побудуй трикубітне коло GHZ, щоб передати його в hello_world як вхідні дані:

from qiskit import QuantumCircuit

circuit = QuantumCircuit(3)
circuit.h(0)
circuit.cx(0, 1)
circuit.cx(1, 2)
circuit.measure_all()

Запусти hello_world із колом і кількістю шотів як іменованими аргументами. Назви аргументів збігаються з ключами, які точка входу читає за допомогою get_arguments():

job = hello_world.run(circuit=circuit, shots=1024)
print(job.job_id)
54705348-5117-44b7-935b-e6986ef182fa

run() повертає Job після того, як робочий процес ставить завдання в чергу. Він не чекає, поки завдання виконається. Завдання продовжує виконуватися в хмарі після закриття твоєї сесії Python. Щоб знайти його пізніше, переглянь список своїх недавніх завдань за допомогою client.jobs().

Отримай статус, результат і журнали​

Одразу після виклику run() статус зазвичай QUEUED:

job.status()
'QUEUED'

Статус змінюється з QUEUED на INITIALIZING, RUNNING, а потім DONE.

job.result() чекає, поки завдання завершиться, а потім повертає значення, яке робочий процес передав у save_result():

job.result()
{'counts': {'111': 514, '000': 510}, 'two_qubit_depth': 2}
# This cell is hidden from users. It checks the result.
assert set(_["counts"]) <= {"000", "111"} # noqa: F821
assert sum(_["counts"].values()) == 1024 # noqa: F821
from qiskit.visualization import plot_histogram

plot_histogram(job.result()["counts"])

Output of the previous code cell

Ти можеш читати журнали, поки завдання виконується. Робочий процес завантажує нові рядки приблизно кожні 15 секунд. Журнали містять рядок, який вивів робочий процес:

print(job.logs())
Two-qubit depth after optimization: 2
# This cell is hidden from users. It checks the logs.
assert "Two-qubit depth after optimization" in job.logs()

Онови робочий процес​

Щоб змінити робочий процес, відредагуй його файли та знову виклич upload() з тим самим title. Нове завантаження замінює попереднє, а завдання, які вже запустилися, не зазнають змін.

Поля, як-от arguments_schema і sizes_map, зберігають свої збережені значення, якщо ти пропускаєш їх у новому завантаженні.

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

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