Оголошення залежностей
Керований робочий процес виконується в середовищі Python, яке він готує заздалегідь. Завдання не має доступу до інтернету, тому не може виконати pip install для пакетів. Натомість Qiskit і список підтримуваних пакетів уже встановлені, а для будь-якого іншого потрібного пакета можна завантажити wheel-файли.
Перевір, які пакети встановлено
Кожне завдання виконується з Python 3.12 на Linux (x86_64) зі встановленими такими пакетами:
-
qiskit,qiskit-ibm-runtime,qiskit-serverlessта їхні залежності, наприкладnumpy. -
Підтримувані пакети, такі як
qiskit-aer,qiskit-addon-sqd,qiskit-addon-utils,qiskit-mitigation,qiskit-addon-slc,qiskit-paulice,ffsimіpyscf. Кожен встановлено в одній фіксованій версії.
Щоб побачити підтримувані пакети та їхні версії, виклич dependencies_versions() зі свого локального ноутбука:
run_workflow_remotely.ipynb
from qiskit_ibm_catalog import ManagedWorkflowClient
client = ManagedWorkflowClient()
client.dependencies_versions()
Твій робочий процес може імпортувати будь-який із цих пакетів без налаштування. Робочий процес встановлює їх під час створення середовища, а не під час запуску завдання, тому вони не збільшують час запуску завдання.
Робочий процес не читає файли requirements.txt чи pyproject.toml, тому не встановлює пакети, перелічені в них. Аргумент dependencies класу ManagedWorkflow застарілий і ігнорується, тому він також не встановлює пакети. Видали його з коду завантаження й натомість завантаж wheel-файли.
Пакети в обчислювальних профілях із GPU
Завдання, що виконуються в обчислювальному профілі з GPU, також мають встановлені такі пакети CUDA. Ці пакети працюють лише в профілі з GPU, а dependencies_versions() їх не перелічує. Не завантажуй власні wheel-файли CUDA, бо вони конфліктують із цими версіями.
| Пакет | Версія |
|---|---|
gpu4pyscf-cuda12x | 1.8.1 |
gpu4pyscf-libxc-cuda12x | 0.8.1 |
cupy-cuda12x | 14.2.0 |
cutensor-cu12 | 2.8.0 |
cuda-pathfinder | 1.8.5 |
nvidia-cublas-cu12 | 12.9.3.13 |
nvidia-cuda-nvrtc-cu12 | 12.9.86 |
nvidia-cuda-runtime-cu12 | 12.9.79 |
nvidia-cufft-cu12 | 11.4.1.4 |
nvidia-curand-cu12 | 10.3.10.19 |
nvidia-cusolver-cu12 | 11.7.5.82 |
nvidia-cusparse-cu12 | 12.5.10.65 |
nvidia-nvjitlink-cu12 | 12.9.86 |
Версії nvidia-*-cu12 можуть змінитися, коли середовище перебудовують. Код, що залежить від точної версії бібліотеки CUDA, може потребувати оновлення після нового релізу.
Запит пакета
Якщо пакет потрібен і іншим користувачам, надішли запит на GitHub. Прийнятий пакет додають до середовища в одному з наступних релізів. До того часу, а також для приватного пакета, додай його як wheel-файл.
Додавання власних пакетів
Щоб використати пакет, який не встановлено, збери його wheel-файли на своєму комп'ютері, завантаж їх у файлове сховище робочого процесу та встанови на початку робочого процесу. Завантажувати їх повторно потрібно лише тоді, коли вони змінюються.
Збирання wheel-файлів
Завдання встановлює wheel-файли без підключення до інтернету, тому кожен wheel-файл має працювати з Python 3.12 на Linux (x86_64). Збери wheel-файли в одній теці:
Local terminal
# Your own package
pip wheel --no-deps --wheel-dir wheels ./mypkg
# A package from PyPI, for the job's platform
pip download --only-binary=:all: --platform manylinux_2_28_x86_64 \
--python-version 3.12 --dest wheels pendulum==3.1.0
З параметрами --platform і --python-version команда pip download отримує wheel-файли для платформи завдання, навіть якщо ти запускаєш її на macOS чи Windows. Вона також завантажує залежності пакета, наприклад python-dateutil, six і tzdata для pendulum. Оскільки завдання встановлює кожен wheel-файл без його залежностей, завантаж wheel-файл для кожної залежності, якої бракує в середовищі, а решту wheel-файлів видали з теки.
Чисто Python-овий wheel-файл (py3-none-any.whl) працює на будь-якій платформі. Якщо для пакета зі скомпільованим кодом на PyPI немає wheel-файлу для Linux x86_64, збери його на Linux, наприклад у контейнері python:3.12. Зберігай оригінальні назви файлів, бо pip зчитує з них назву пакета, версію та платформу.
Завантаження wheel-файлів
Завантаж wheel-файли зі свого локального ноутбука за допомогою add_wheels():
run_workflow_remotely.ipynb
from qiskit_ibm_catalog import ManagedWorkflowClient
client = ManagedWorkflowClient()
my_workflow = client.load("my-workflow")
client.add_wheels(my_workflow, ["wheels/*.whl"])
print(client.list_wheels(my_workflow))
Кожен шлях може бути назвою файлу або glob-шаблоном, а add_wheels() повертає назви завантажених wheel-файлів. Якщо шаблону не відповідає жоден файл або відповідає файл, що не є файлом .whl, add_wheels() викликає QiskitServerlessException.
Завантаж робочий процес до того, як додаватимеш wheel-файли, бо вони зберігаються разом із ним. Вони потрапляють у теку wheels у файловому сховищі робочого процесу, окремо від твоїх інших файлів.
Заміна або видалення wheel-файлів
Щоб побачити wheel-файли, завантажені в робочий процес, виклич list_wheels(). Щоб видалити wheel-файли, передай їхні назви в remove_wheels():
run_workflow_remotely.ipynb
client.list_wheels(my_workflow)
# ['mypkg-1.0-py3-none-any.whl']
client.remove_wheels(my_workflow, ["mypkg-1.0-py3-none-any.whl"])
Щоб оновити пакет, видали старий wheel-файл, а потім додай новий. Нова версія має іншу назву файлу, тож якщо залишити старий wheel-файл, install_uploaded_wheels() встановить обидві версії.
run_workflow_remotely.ipynb
client.remove_wheels(my_workflow, ["mypkg-1.0-py3-none-any.whl"])
client.add_wheels(my_workflow, ["wheels/mypkg-1.1-*.whl"])
Встановлення wheel-файлів у твоєму робочому процесі
Зміни код робочого процесу так, щоб він викликав install_uploaded_wheels() перед імпортом пакетів:
source_files/my_workflow.py
from qiskit_serverless import install_uploaded_wheels
install_uploaded_wheels()
import pendulum # Installed from an uploaded wheel
install_uploaded_wheels() встановлює кожен wheel-файл у теці wheels. Якщо в робочого процесу немає wheel-файлів, виклик нічого не робить. Wheel-файли встановлюються знову під час кожного запуску, тому великий набір wheel-файлів збільшує час запуску кожного завдання.
Рекомендована практика: додавай лише відсутні пакети
Як рекомендовану практику, завантажуй wheel-файли лише для пакетів, яких бракує в середовищі. Wheel-файл для вже встановленого пакета, такого як numpy, встановлює другу копію, і код, що його імпортує, може отримати будь-яку з копій. Помилки через невідповідність виявляються лише під час виконання завдання.
Перед завантаженням перевір свої вимоги за допомогою dependency_report() зі свого локального ноутбука:
run_workflow_remotely.ipynb
print(client.dependency_report(["pendulum==3.1.0", "qiskit-aer", "qiskit-addon-sqd==0.10.0"]))
requirement status note
pendulum==3.1.0 bring not in image — upload a wheel
qiskit-aer baked already in image (qiskit-aer==0.17.2)
qiskit-addon-sqd==0.10.0 clash image ships qiskit-addon-sqd==0.13.1
Звіт присвоює кожній вимозі один із таких статусів:
-
baked: середовище вже містить цей пакет. Не завантажуй для нього wheel-файл. -
bring: у середовищі немає цього пакета. Завантаж для нього wheel-файл. -
clash: середовище містить іншу версію. Змін версію, яку вимагає твій код, або перебудуй свій пакет під встановлену версію.
Звіт перевіряє лише підтримувані пакети, тому показує qiskit, qiskit-ibm-runtime, qiskit-serverless і numpy як bring. Середовище їх містить, тому не завантажуй для них wheel-файли. Звіт показує clash лише для точної версії з ==. Діапазон, наприклад >=0.10, він показує як baked. Звіт не завантажує жодних файлів.
Усунення проблем із залежностями
| Проблема | Причина |
|---|---|
pip install завершується помилкою всередині робочого процесу. | Завдання не має доступу до інтернету. Натомість завантаж wheel-файл. |
ModuleNotFoundError для пакета, який ти завантажив. | Робочий процес імпортує пакет до виклику install_uploaded_wheels(). |
ModuleNotFoundError для залежності пакета, який ти завантажив. | Wheel-файли встановлюються без своїх залежностей. Завантаж wheel-файл для відсутньої залежності. |
Помилка повідомляє, що wheel-файл is not a supported wheel on this platform. | Wheel-файл призначений для іншої операційної системи або версії Python. Отримай wheel-файл для Python 3.12 на Linux x86_64. |
install_uploaded_wheels() завершується помилкою ResolutionImpossible. | У теці wheels є дві версії того самого пакета. Видали старий wheel-файл за допомогою remove_wheels(). |
Пакет CUDA, наприклад cupy, дає збій в обчислювальному профілі з GPU після завантаження wheel-файлів. | Wheel-файл замінив один із пакетів CUDA, що надаються середовищем. Видали цей wheel-файл за допомогою remove_wheels(). |
Встановлений пакет, наприклад numpy, дає збій після завантаження wheel-файлів. | Wheel-файл встановив другу копію пакета, який надає середовище. Видали цей wheel-файл за допомогою remove_wheels(). |