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

Вступ до Qiskit Functions

Примітки
  • Qiskit Functions — це експериментальна функція, доступна лише користувачам планів IBM Quantum® Premium Plan, Flex Plan та On-Prem (через IBM Quantum Platform API). Вона перебуває у статусі попереднього релізу та може змінюватися.
Версії пакетів

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

qiskit[all]~=1.4.1
qiskit-ibm-runtime~=0.37.0
qiskit-ibm-catalog~=0.4

Qiskit Functions спрощують і прискорюють пошук алгоритмів та розробку застосунків масштабу utility, абстрагуючи окремі частини робочого процесу квантової розробки програмного забезпечення. Таким чином, Qiskit Functions вивільняють час, який зазвичай витрачається на написання коду вручну та тонке налаштування експериментів.

Огляд Qiskit Functions Функції існують у двох формах:

ТипЩо вона робить?Приклади входів та виходівДля кого?
Circuit functionСпрощений інтерфейс для запуску Circuit. Абстрагує транспіляцію, придушення та пом'якшення помилокВхід: Абстрактні об'єкти PUB
Вихід: Пом'якшені значення математичного сподівання
Дослідники, що використовують Qiskit для відкриття нових алгоритмів і застосунків, без необхідності зосереджуватись на оптимізації під апаратне забезпечення чи обробці помилок. Circuit functions можна використовувати для побудови власних application functions.
Application functionОхоплює завдання вищого рівня, наприклад, дослідження алгоритмів і предметно-специфічні сценарії використання. Абстрагує квантовий робочий процес для вирішення задач з класичними входами та виходамиВхід: Молекули, графи
Вихід: Енергії основного та збудженого стану, оптимальні значення для цільової функції
Дослідники в неквантових галузях, які інтегрують квантові обчислення у наявні великомасштабні класичні робочі процеси, без необхідності відображати класичні дані на квантові Circuit.
# Added by doQumentation — required packages for this notebook
!pip install -q qiskit qiskit-ibm-catalog qiskit-ibm-runtime

Функції надаються IBM® та сторонніми партнерами. Кожна з них ефективна для певних характеристик робочого навантаження та має унікальні параметри налаштування продуктивності.

Огляд доступних функцій

Circuit functions

НазваПостачальникРекомендоване використанняУнікальні переваги
Tensor-Network Error MitigationAlgorithmiqРобочі навантаження з малими за вагою спостережуваними та Circuit без циклів.Знижує накладні витрати на вимірювання та дисперсію, перевершуючи стандартні базові методи пом'якшення помилок, такі як Zero Noise Extrapolation (ZNE) та Probabilistic Error Cancellation (PEC) для відповідних класів Circuit.
QESEM: Error Suppression and Error MitigationQedmaРобочі навантаження, що включають Circuit з дробовими або параметризованими Gate, важкими за вагою спостережуваними, а також робочі процеси, що вимагають незміщених значень математичного сподівання та точних оцінок часу виконання.Видає незміщені значення математичного сподівання з меншою дисперсією та витратами ресурсів, перевершуючи ZNE та PEC для відповідних класів Circuit.
Performance ManagementQ-CTRLРобочі навантаження, що містять параметричні Circuit, глибокі Circuit або вимагають багатьох виконань Circuit.Автоматично застосовує придушення помилок на основі ШІ до квантових алгоритмів, максимізуючи продуктивність пристроїв IBM для досягнення точних результатів при зменшенні кількості shots, часу обчислень та витрат.

Метод без накладних витрат, що підвищує точність виконання для примітивів Sampler та Estimator, сумісний з будь-якою вагою спостережуваних.

Application functions

НазваПостачальникРекомендоване використанняУнікальні переваги
QUICK-PDEColibriTDВикористання квантових обчислень для мультифізичних диференціальних рівнянь у частинних похідних (PDE).

Підготовка робочих процесів симуляції для квантового апаратного забезпечення зі збереженням повного контролю над параметрами квантового та фізичного моделювання.
Пропонує надійну гібридну VQA-структуру, яка надає точні, масштабовані рішення PDE завдяки просунутому кодуванню рішень та спектральним методам, що робить її ідеальною відправною точкою для команд, які прагнуть розвивати можливості квантово-готової симуляції.
Quantum Portfolio OptimizerGlobal Data QuantumРобочі навантаження для фінансової оптимізації: пошук оптимальних портфельних стратегій з часом при мінімізації ризику та максимізації прибутку, що забезпечує зворотне тестування торгових стратегій.Вирішує комбінаторні задачі оптимізації через вузькоспеціалізовану адаптацію квантового алгоритму VQE для цього фінансового сценарію, використовуючи оптимізовані стратегії виконання та оптимізатори, а також шумоврахувальні методи пом'якшення помилок, адаптовані до портфельної оптимізації.
HI-VQE ChemistryQunova ComputingРобочі навантаження в обчислювальній хімії, молекулярному моделюванні, матеріалознавстві або будь-якій симуляції гамільтоніана, що вимагають вирішення задач електронної структури багатьох тіл.Вирішує задачі електронної структури молекул за допомогою вдосконаленого SQD, досягаючи хімічної точності (1 ккал/моль, 1,6 мГа) для задач, змодельованих з 40 до 60 Qubit, перевершуючи деякі класичні рішення на суперкомп'ютерах або стандартний SQD за швидкістю збіжності чи точністю відповідно на порядки величин.
Iskay Quantum OptimizerKipu QuantumЗадачі оптимізації, такі як планування, логістика, маршрутизація та QUBO/HUBO задачі.

Інтегровані налаштовувані класичні методи попередньої та постобробки для процедури квантової оптимізації.

Забезпечує перевагу у часі виконання над класичними вирішувачами (CPLEX, simulated annealing та tabu search) на вибраних HUBO-бенчмарках.

Market Split ms_5_100, складна задача, розв'язана за години (дивись цей туторіал).
Singularity Machine LearningMultiverse ComputingКласичні робочі процеси класифікації машинного навчання, які можуть отримати користь від підвищеної точності або обчислювальної ефективності завдяки використанню квантової оптимізації, що виконується на апаратному забезпеченні IBM.Забезпечує точність, порівнянну з класичними моделями або таку, що їх перевершує, наприклад, Random Forest або XGBoost, при цьому працюючи зі значно меншою кількістю учнів та більш компактним ансамблем.

Завдяки квантово-оптимізованому голосуванню відбирає найбільш інформативних учнів та уточнює межі рішень, що призводить до вищої ефективності, зниження складності моделі та більш надійної продуктивності.
Optimization SolverQ-CTRLЗадачі бінарної оптимізації або будь-яка комбінаторна задача, що може бути відображена на бінарну цільову функцію.

Підтримуються цільові функції будь-якого порядку та розміри задач до максимального масштабу пристрою.
Шумоврахувальне наскрізне квантове рішення оптимізації, що дозволяє подавати визначення задач високого рівня та автоматично знаходить точні рішення класично складних комбінаторних задач на квантовому апаратному забезпеченні масштабу utility.

Абстрагує складність, обробляючи придушення помилок, ефективне відображення та гібридну квантово-класичну оптимізацію для вирішення задач оптимізації в повному масштабі пристрою без глибоких квантових знань.

Початок роботи з Qiskit Functions

Користувачі планів Premium, Flex та On-Prem (через IBM Quantum Platform API) можуть безкоштовно розпочати роботу з IBM Qiskit Functions або придбати ліцензію в одного з партнерів, які додали функцію до каталогу.

Запит безкоштовного пробного доступу до сторонніх Qiskit Functions

Щоб запросити новий безкоштовний пробний доступ, перейди до Qiskit Functions Catalog і відкрий панель деталей. Натисни Request a free trial та заповни інформацію, яку вимагає партнер Functions, включаючи IBM Cloud AccessGroupId:

  1. Перейди до IBM Cloud IAM.
  2. Перевір відповідність вимогам.
    • Переключи свій акаунт у верхній панелі на такий, що має формат: XXXXXXX - [Назва організації]
    • Переконайся, що організація збігається з тією, що пов'язана з твоїм Premium-акаунтом.
    • Якщо ти бачиш "[Твоє ім'я]'s Account", то використовуєш особистий акаунт, який не має права на преміум-доступ.
  3. Знайди ID своєї групи доступу.
    • Натисни на назву групи.
    • Натисни Details.
    • Скопіюй ID групи доступу. Він має починатися з AccessGroup-.

Встановлення клієнта Qiskit Functions Catalog

  1. Щоб почати використовувати Qiskit Functions, встанови клієнт IBM Qiskit Functions Catalog:

    pip install qiskit-ibm-catalog
  2. Отримай свій API ключ з панелі управління IBM Quantum Platform та активуй своє віртуальне середовище Python. Перегляньте інструкції з встановлення, якщо у тебе ще немає налаштованого віртуального середовища.

    Якщо ти працюєш у надійному середовищі Python (наприклад, на особистому ноутбуці або робочій станції), використай метод save_account(), щоб зберегти свої облікові дані локально. (Перейди до наступного кроку, якщо ти не використовуєш надійне середовище, наприклад, на спільному або публічному комп'ютері, для автентифікації в IBM Quantum Platform.)

    Щоб використати save_account(), запусти python у своїй оболонці, а потім введи таке:

    from qiskit_ibm_catalog import QiskitFunctionsCatalog

    QiskitFunctionsCatalog.save_account(channel="ibm_quantum_platform", token="<your-token>", instance="<instance-crn>")

    Введи exit(). Відтепер, щоразу коли тобі потрібно автентифікуватись у сервісі, ти можеш завантажити свої облікові дані за допомогою

    from qiskit_ibm_catalog import QiskitFunctionsCatalog
    catalog = QiskitFunctionsCatalog()
# Load saved credentials
from qiskit_ibm_catalog import QiskitFunctionsCatalog

catalog = QiskitFunctionsCatalog(channel="ibm_quantum_platform")
  1. Уникай виконання коду на ненадійній машині або у зовнішньому хмарному середовищі Python, щоб мінімізувати ризики безпеки. Якщо тобі все ж потрібно використати ненадійне середовище (наприклад, на публічному комп'ютері), змінюй свій API ключ після кожного використання, видаляючи його на сторінці IBM Cloud API keys, щоб знизити ризик. Дізнайся більше у розділі Managing user API keys. Щоб ініціалізувати сервіс у цій ситуації, розгорни наступний розділ для перегляду коду, який можна використати:

    Ініціалізація сервісу у ненадійному середовищі
    from qiskit_ibm_catalog import QiskitFunctionsCatalog

    # After using the following code, delete your API key on the IBM Quantum Platform home dashboard
    catalog = QiskitFunctionsCatalog(token="<YOUR_API_KEY>") # Use the 44-character API_KEY you created and saved from the IBM Quantum Platform Home dashboard
    обережно

    Захищай свій API ключ! Ніколи не включай свій ключ у вихідний код, Python-скрипт або файл notebook. Ділячись кодом з іншими, переконайся, що твій API ключ не вбудований безпосередньо у Python-скрипт. Натомість поділись скриптом без ключа та надай інструкції для його безпечного налаштування.

    Якщо ти випадково поділився своїм ключем з кимось або включив його у систему контролю версій, наприклад Git, негайно відкликай свій ключ, видаливши його на сторінці IBM Cloud API keys, щоб знизити ризик. Дізнайся більше у розділі Managing user API keys.

  2. Після автентифікації ти можеш переглянути список функцій з Qiskit Functions Catalog, до яких маєш доступ:

catalog.list()
[QiskitFunction(qunova/hivqe-chemistry),
QiskitFunction(global-data-quantum/quantum-portfolio-optimizer),
QiskitFunction(algorithmiq/tem),
QiskitFunction(qedma/qesem),
QiskitFunction(multiverse/singularity),
QiskitFunction(ibm/circuit-function),
QiskitFunction(q-ctrl/optimization-solver),
QiskitFunction(colibritd/quick-pde),
QiskitFunction(q-ctrl/performance-management),
QiskitFunction(kipu-quantum/iskay-quantum-optimizer)]

Запуск увімкнених функцій

Після створення об'єкта каталогу ти можеш вибрати функцію за допомогою catalog.load(provider/function-name):

ibm_cf = catalog.load("ibm/circuit-function")

Кожна Qiskit Function має власні входи, параметри та виходи. Перевір конкретні сторінки документації для функції, яку хочеш запустити, щоб отримати більше інформації. За замовчуванням усі користувачі можуть запускати лише одне завдання функції одночасно:

# This cell is hidden from users
# It gets these details programmatically so we can test this notebook
from qiskit_ibm_runtime import QiskitRuntimeService
from qiskit.circuit.random import random_circuit

service = QiskitRuntimeService()
instance = service.active_account()["instance"]
backend_name = service.least_busy().name

circuit = random_circuit(num_qubits=2, depth=2, seed=42)
observable = "Z" * circuit.num_qubits
job = ibm_cf.run(
pubs=[(circuit, observable)],
instance=instance,
backend_name=backend_name, # E.g. "ibm_fez"
)

job.job_id
'7f08c9d5-471b-4da2-92e7-4f2cb94c23a8'

Перевірка статусу завдання

порада

Наразі таблиця робочих навантажень IBM Quantum відображає лише робочі навантаження Qiskit Runtime. Використовуй job.status() для перегляду поточного статусу свого робочого навантаження Qiskit Function.

За наявності job_id своєї Qiskit Function ти можеш перевірити статус запущених завдань. Він включає такі стани:

  • QUEUED: Віддалена програма перебуває в черзі Qiskit Function. Пріоритет черги визначається тим, скільки ти вже використовував Qiskit Functions.
  • INITIALIZING: Віддалена програма запускається; це включає налаштування віддаленого середовища та встановлення залежностей.
  • RUNNING: Програма виконується. Це також включає кілька більш детальних статусів, якщо вони підтримуються конкретними функціями:
    • RUNNING: MAPPING": Функція наразі відображає твої класичні входи на квантові входи
    • RUNNING: OPTIMIZING_FOR_HARDWARE": Функція оптимізується для вибраного QPU. Це може включати транспіляцію Circuit, характеризацію QPU, зворотне поширення спостережуваних тощо
    • RUNNING: WAITING_FOR_QPU: Функція надіслала завдання до Qiskit Runtime та очікує в черзі
    • RUNNING: EXECUTING_QPU: Функція має активне завдання Qiskit Runtime
    • RUNNING: POST_PROCESSING: Функція виконує постобробку результатів. Це може включати пом'якшення помилок, відображення квантових результатів на класичні тощо
  • DONE: Програма завершена, і ти можеш отримати дані результатів за допомогою job.results().
  • ERROR: Програма зупинила виконання через проблему. Використай job.result(), щоб отримати повідомлення про помилку.
  • CANCELED: Програму було скасовано: користувачем, сервісом або сервером.
job.status()
'QUEUED'

Отримання результатів

Після того як програма набуде стану DONE, ти можеш використати job.results() для отримання результату. Формат виводу відрізняється для кожної функції, тому обов'язково дотримуйся конкретної документації:

result = job.result()
print(result)
PrimitiveResult([PubResult(data=DataBin(evs=np.ndarray(<shape=(), dtype=float64>), stds=np.ndarray(<shape=(), dtype=float64>), ensemble_standard_error=np.ndarray(<shape=(), dtype=float64>)), metadata={'shots': 4096, 'target_precision': 0.015625, 'circuit_metadata': {}, 'resilience': {}, 'num_randomizations': 32})], metadata={'dynamical_decoupling': {'enable': True, 'sequence_type': 'XX', 'extra_slack_distribution': 'middle', 'scheduling_method': 'alap'}, 'twirling': {'enable_gates': False, 'enable_measure': True, 'num_randomizations': 'auto', 'shots_per_randomization': 'auto', 'interleave_randomizations': True, 'strategy': 'active-accum'}, 'resilience': {'measure_mitigation': True, 'zne_mitigation': False, 'pec_mitigation': False}, 'version': 2})

Ти також можеш скасувати завдання в будь-який час:

job.stop()
'Job has been stopped.'

Список раніше запущених завдань через Qiskit Functions

Ти можеш використати jobs(), щоб переглянути список усіх завдань, надісланих до Qiskit Functions:

old_jobs = catalog.jobs()
old_jobs
[<Job | f6c29f49-4d5f-4fff-aca6-2e9a115b9763>,
<Job | 7f08c9d5-471b-4da2-92e7-4f2cb94c23a8>,
<Job | 62fe9176-d1e5-467e-b2bd-7a3f3c7be4e5>,
<Job | af525b2e-16b1-45a1-80bb-dbd94ce30258>,
<Job | b95a7a57-c1ad-4958-b7ac-953e4e1ee824>,
<Job | 7bfa33da-0f17-4e67-84b6-f556f7eeb436>,
<Job | ca46c191-9eb9-4de6-bfa7-b60d7eb29b5e>,
<Job | 6ac0ba93-3831-43fb-9fb9-760da2225e06>,
<Job | f0e38071-060d-47e8-988d-9cc1f69358e3>,
<Job | 629cf110-e490-4675-8a07-f6d298d166b0>]

Якщо у тебе вже є ID завдання для певного завдання, ти можеш отримати його за допомогою catalog.get_job_by_id():

# First, get the most recent job that has been executed.
latest_job = old_jobs[0]

# We can also get that same job with get_job_by_id
job_by_id = catalog.get_job_by_id(latest_job.job_id)

# Verify that the job is the same using both retrieval methods.
assert job_by_id.job_id == latest_job.job_id

# Print the job_id for this job.
print(job_by_id.job_id)
f6c29f49-4d5f-4fff-aca6-2e9a115b9763

Отримання повідомлень про помилки

Якщо статус програми — ERROR, використай job.error_message() для отримання повідомлення про помилку таким чином:

job.error_message()
qiskit.exceptions.QiskitError: 'Workflow execution failed -- https://docs.quantum.ibm.com/errors#9999'

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

Рекомендації
  • Досліджуй circuit functions, щоб будувати нові алгоритми та застосунки без необхідності керувати транспіляцією або обробкою помилок.
  • Досліджуй application functions, щоб вирішувати предметно-специфічні задачі з класичними входами та виходами.