依存関係を宣言する
マネージド・ワークフローは、あらかじめ準備されたPython環境で実行されます。ジョブはインターネットにアクセスできないため、パッケージを pip install できません。代わりに、Qiskitとサポートされているパッケージのリストがすでにインストールされており、ワークフローに必要なその他のパッケージについては、ホイールをアップロードできます。
インストールされているパッケージを確認する
すべてのジョブは、Linux (x86_64) 上のPython 3.12で、次のパッケージがインストールされた状態で実行されます。
-
qiskit、qiskit-ibm-runtime、qiskit-serverless、およびそれらの依存関係 (numpyなど)。 -
qiskit-aer、qiskit-addon-sqd、qiskit-addon-utils、qiskit-mitigation、qiskit-addon-slc、qiskit-paulice、ffsim、pyscfなどのサポートされているパッケージ。それぞれ、固定された1つのバージョンでインストールされています。
サポートされているパッケージとそのバージョンを確認するには、ローカルのノートブックから dependencies_versions() を呼び出します。
run_workflow_remotely.ipynb
from qiskit_ibm_catalog import ManagedWorkflowClient
client = ManagedWorkflowClient()
client.dependencies_versions()
ワークフローは、これらのパッケージのいずれも、セットアップなしでインポートできます。ワークフローは、ジョブの開始時ではなく環境の構築時にそれらをインストールするため、ジョブの開始時間は長くなりません。
ワークフローは requirements.txt ファイルや pyproject.toml ファイルを読み取らないため、これらのファイルに記載されたパッケージはインストールされません。ManagedWorkflow の dependencies 引数は非推奨で無視されるため、これもパッケージをインストールしません。アップロード用のコードから削除し、代わりにホイールをアップロードしてください。
GPUコンピュート・プロファイルのパッケージ
GPUコンピュート・プロファイルで実行されるジョブには、次のCUDAパッケージもインストールされます。これらのパッケージはGPUプロファイルでのみ動作し、dependencies_versions() には一覧表示されません。これらのバージョンと競合するため、独自の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でリクエストしてください。承認されたパッケージは、後のリリースで環境に追加されます。それまでの間、またはプライベートなパッケージの場合は、ホイールとして追加してください。
独自のパッケージを追加する
インストールされていないパッケージを使うには、そのホイール・ファイルをコンピューター上に集め、ワークフローのファイルストレージにアップロードし、ワークフローの開始時にインストールします。再アップロードが必要なのは、ホイールが変更されたときだけです。
ホイールをビルドする
ジョブはインターネット接続なしでホイールをインストールするため、各ホイールはLinux (x86_64) 上のPython 3.12で動作する必要があります。ホイールを1つのフォルダーに集めてください。
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 を指定すると、macOSやWindowsで実行しても、pip download はジョブのプラットフォーム向けのホイールを取得します。また、パッケージの依存関係もダウンロードします。たとえば pendulum の場合は、python-dateutil、six、tzdata です。ジョブは各ホイールを依存関係なしでインストールするため、環境にないすべての依存関係についてホイールをアップロードし、それ以外のホイールはフォルダーから削除してください。
純粋なPythonのホイール (py3-none-any.whl) は、どのプラットフォームでも動作します。コンパイル済みコードを含むパッケージにPyPI上のLinux x86_64向けホイールがない場合は、たとえば python:3.12 コンテナーなどのLinux上でビルドしてください。pip はファイル名からパッケージ名、バージョン、プラットフォームを読み取るため、元のファイル名を維持してください。
ホイールをアップロードする
ローカルのノートブックから 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() はアップロードされたホイールの名前を返します。パターンに一致するファイルがない場合、または .whl ファイルではないファイルに一致する場合、add_wheels() は QiskitServerlessException を発生させます。
ホイールを追加する前に、ワークフローをアップロードしてください。ホイールはワークフローと一緒に保存されるためです。ホイールは、ワークフローのファイルストレージ内の wheels フォルダーに、他のファイルとは別に保存されます。
ホイールの置き換えまたは削除
ワークフローにアップロードされているホイールを確認するには、list_wheels() を呼び出します。ホイールを削除するには、そのファイル名を 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"])
パッケージをアップグレードするには、古いホイールを削除してから、新しいホイールを追加します。新しいバージョンはファイル名が異なるため、古いホイールを残したままにすると、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"])
ワークフローでのホイールのインストール
パッケージをインポートする前に 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() は、wheels フォルダー内のすべてのホイールをインストールします。ワークフローにホイールがない場合、この呼び出しは何も行いません。ホイールは実行のたびに再インストールされるため、ホイールの数が多いと、各ジョブの開始時間が長くなります。
ベストプラクティス:不足しているパッケージだけを持ち込む
ベストプラクティスとして、環境に存在しないパッケージについてのみホイールをアップロードしてください。numpy など、すでにインストールされているパッケージのホイールをアップロードすると、2つ目のコピーがインストールされ、それをインポートするコードはどちらのコピーも取得する可能性があります。不一致によるエラーは、ジョブの実行時にのみ表示されます。
アップロードする前に、ローカルのノートブックから 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:環境にすでにそのパッケージが含まれています。ホイールはアップロードしないでください。 -
bring:環境にそのパッケージがありません。そのホイールをアップロードしてください。 -
clash:環境には異なるバージョンが含まれています。コードが要求するバージョンを変更するか、インストール済みのバージョンに合わせてパッケージをビルドし直してください。
レポートはサポートされているパッケージのみを確認するため、qiskit、qiskit-ibm-runtime、qiskit-serverless、numpy は bring と表示されます。これらは環境に含まれているため、ホイールをアップロードしないでください。レポートが clash を表示するのは、厳密な == バージョンの場合のみです。>=0.10 のような範囲指定は baked と表示されます。レポートはファイルをアップロードしません。
依存関係のトラブルシューティング
| 問題 | 原因 |
|---|---|
ワークフロー内で pip install が失敗する。 | ジョブがインターネットに接続できません。代わりにホイールをアップロードしてください。 |
アップロードしたパッケージで ModuleNotFoundError が発生する。 | ワークフローが、install_uploaded_wheels() を呼び出す前にパッケージをインポートしています。 |
アップロードしたパッケージの依存関係で ModuleNotFoundError が発生する。 | ホイールは依存関係なしでインストールされます。不足している依存関係のホイールをアップロードしてください。 |
ホイールが is not a supported wheel on this platform というエラーになる。 | ホイールが別のオペレーティングシステムまたは Python バージョン向けです。Linux x86_64 上の Python 3.12 用のホイールを入手してください。 |
install_uploaded_wheels() が ResolutionImpossible で失敗する。 | wheels フォルダーに同じパッケージの2つのバージョンがあります。remove_wheels() で古いホイールを削除してください。 |
ホイールをアップロードした後、cupy などの CUDA パッケージが GPU コンピュートプロファイルで失敗する。 | ホイールが、環境が提供するCUDA パッケージの1つを置き換えました。remove_wheels() でそのホイールを削除してください。 |
ホイールをアップロードした後、numpy などのインストール済みパッケージが失敗する。 | ホイールが、環境が提供するパッケージの2つ目のコピーをインストールしました。remove_wheels() でそのホイールを削除してください。 |