Deklaruj závislosti
Spravovaný workflow běží v prostředí Pythonu, které se připraví předem. Úloha nemá přístup k internetu, takže nemůže provést pip install balíčků. Místo toho jsou Qiskit a seznam podporovaných balíčků již nainstalovány a pro jakýkoli další balíček, který tvůj workflow potřebuje, můžeš nahrát wheely.
Zkontroluj, které balíčky jsou nainstalovány
Každá úloha běží s Pythonem 3.12 na Linuxu (x86_64) s nainstalovanými následujícími balíčky:
-
qiskit,qiskit-ibm-runtime,qiskit-serverlessa jejich závislosti, napříkladnumpy. -
Podporované balíčky, například
qiskit-aer,qiskit-addon-sqd,qiskit-addon-utils,qiskit-mitigation,qiskit-addon-slc,qiskit-paulice,ffsimapyscf. Každý z nich je nainstalován v jedné pevně dané verzi.
Podporované balíčky a jejich verze zobrazíš zavoláním dependencies_versions() z lokálního notebooku:
run_workflow_remotely.ipynb
from qiskit_ibm_catalog import ManagedWorkflowClient
client = ManagedWorkflowClient()
client.dependencies_versions()
Tvůj workflow může importovat kterýkoli z těchto balíčků bez dalšího nastavení. Workflow je instaluje při sestavování prostředí, nikoli při spuštění jobu, takže nezvyšují dobu startu jobu.
Workflow nečte soubor requirements.txt ani pyproject.toml, takže balíčky uvedené v těchto souborech neinstaluje. Argument dependencies třídy ManagedWorkflow je zastaralý a ignoruje se, takže ani on balíčky neinstaluje. Odstraň ho z kódu pro nahrávání a místo toho nahraj wheely.
Balíčky na GPU výpočetních profilech
Na jobech, které běží na GPU výpočetním profilu, jsou navíc nainstalovány následující balíčky CUDA. Tyto balíčky fungují pouze na GPU profilu a dependencies_versions() je neuvádí. Nenahrávej vlastní wheely CUDA, protože by byly v konfliktu s těmito verzemi.
| Balíček | Verze |
|---|---|
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 |
Verze nvidia-*-cu12 se mohou změnit při opětovném sestavení prostředí. Kód, který závisí na přesné verzi knihovny CUDA, může po novém vydání vyžadovat úpravy.
Požádej o balíček
Pokud by balíček potřebovali i další uživatelé, požádej o něj na GitHubu. Schválený balíček bude přidán do prostředí v pozdějším vydání. Do té doby, nebo pokud jde o soukromý balíček, přidej ho jako wheel.
Přidej vlastní balíčky
Chceš-li použít balíček, který není nainstalován, shromáždi jeho soubory wheel na svém počítači, nahraj je do souborového úložiště workflow a nainstaluj je na začátku workflow. Znovu je nahráváš jen tehdy, když se změní.
Sestav wheely
Job instaluje wheely bez připojení k internetu, takže každý wheel musí fungovat s Pythonem 3.12 na Linuxu (x86_64). Shromáždi wheely do jedné složky:
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
S --platform a --python-version stáhne pip download wheely pro platformu jobu, i když ho spouštíš na macOS nebo Windows. Stáhne také závislosti balíčku, například python-dateutil, six a tzdata pro pendulum. Protože job instaluje každý wheel bez jeho závislostí, nahraj wheel pro každou závislost, kterou prostředí nemá, a ostatní wheely ze složky smaž.
Čistě pythonový wheel (py3-none-any.whl) funguje na jakékoli platformě. Pokud balíček s kompilovaným kódem nemá na PyPI wheel pro Linux x86_64, sestav ho na Linuxu, například v kontejneru python:3.12. Zachovej původní názvy souborů, protože pip z nich čte název balíčku, verzi a platformu.
Nahraj wheely
Wheely nahraješ z lokálního notebooku pomocí 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))
Každá cesta může být název souboru nebo vzor glob a add_wheels() vrací názvy nahraných wheelů. Pokud vzor neodpovídá žádnému souboru nebo odpovídá souboru, který není soubor .whl, add_wheels() vyvolá QiskitServerlessException.
Nahraj workflow dříve, než přidáš wheely, protože wheely se ukládají společně s ním. Ukládají se do složky wheels v souborovém úložišti workflow, odděleně od tvých ostatních souborů.
Nahraď nebo odstraň wheely
Wheely nahrané do workflow zobrazíš zavoláním list_wheels(). Chceš-li wheely odstranit, předej jejich názvy souborů funkci 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"])
Chceš-li balíček aktualizovat, odstraň starý wheel a pak přidej nový. Nová verze má jiný název souboru, takže pokud starý wheel ponecháš, install_uploaded_wheels() nainstaluje obě verze.
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"])
Nainstaluj wheely ve svém workflow
Uprav kód workflow tak, aby volal install_uploaded_wheels() dříve, než importuje balíčky:
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() nainstaluje každý wheel ve složce wheels. Pokud workflow žádné wheely nemá, volání nic neudělá. Wheely se instalují znovu při každém běhu, takže velká sada wheelů prodlužuje start každého jobu.
Osvědčený postup: přinášej jen chybějící balíčky
Jako osvědčený postup nahrávej wheely jen pro balíčky, které prostředí nemá. Wheel pro již nainstalovaný balíček, například numpy, nainstaluje druhou kopii a kód, který ji importuje, může dostat kteroukoli z kopií. Chyby způsobené nesouladem se projeví až při běhu jobu.
Před nahráním zkontroluj své požadavky pomocí dependency_report() z lokálního notebooku:
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
Report přiřadí každému požadavku jeden z následujících stavů:
-
baked: Prostředí už balíček poskytuje. Nenahrávej pro něj wheel. -
bring: Prostředí balíček nemá. Nahraj pro něj wheel. -
clash: Prostředí poskytuje jinou verzi. Změň verzi, kterou tvůj kód vyžaduje, nebo svůj balíček znovu sestav pro nainstalovanou verzi.
Report kontroluje pouze podporované balíčky, a proto u qiskit, qiskit-ibm-runtime, qiskit-serverless a numpy zobrazí bring. Prostředí je obsahuje, takže pro ně wheely nenahrávej. Report zobrazí clash pouze pro přesnou verzi zadanou pomocí ==. Rozsah, například >=0.10, zobrazí jako baked. Report nenahrává žádné soubory.
Řešení potíží se závislostmi
| Problém | Příčina |
|---|---|
pip install selže uvnitř workflow. | Job se nemůže připojit k internetu. Místo toho nahraj wheel. |
ModuleNotFoundError pro balíček, který jsi nahrál. | Workflow importuje balíček dříve, než zavolá install_uploaded_wheels(). |
ModuleNotFoundError pro závislost balíčku, který jsi nahrál. | Wheely se instalují bez svých závislostí. Nahraj wheel pro chybějící závislost. |
Chyba říká, že wheel is not a supported wheel on this platform. | Wheel je určen pro jiný operační systém nebo verzi Pythonu. Získej wheel pro Python 3.12 na Linuxu x86_64. |
install_uploaded_wheels() selže s ResolutionImpossible. | Složka wheels obsahuje dvě verze stejného balíčku. Odstraň starý wheel pomocí remove_wheels(). |
Balíček CUDA, například cupy, selže na GPU výpočetním profilu po nahrání wheelů. | Wheel nahradil jeden z balíčků CUDA, které prostředí poskytuje. Odstraň tento wheel pomocí remove_wheels(). |
Nainstalovaný balíček, například numpy, selže po nahrání wheelů. | Wheel nainstaloval druhou kopii balíčku, který prostředí poskytuje. Odstraň tento wheel pomocí remove_wheels(). |