メインコンテンツへスキップ
このプロジェクトはベータ版です。バグを見つけましたか?GitHub Issueを開く。質問やアイデアがありますか?Discussionsで質問する — フィードバックをお待ちしています!
このページの翻訳品質はいかがですか?

依存関係を宣言する

マネージド・ワークフローは、あらかじめ準備された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-cuda12x1.8.1
gpu4pyscf-libxc-cuda12x0.8.1
cupy-cuda12x14.2.0
cutensor-cu122.8.0
cuda-pathfinder1.8.5
nvidia-cublas-cu1212.9.3.13
nvidia-cuda-nvrtc-cu1212.9.86
nvidia-cuda-runtime-cu1212.9.79
nvidia-cufft-cu1211.4.1.4
nvidia-curand-cu1210.3.10.19
nvidia-cusolver-cu1211.7.5.82
nvidia-cusparse-cu1212.5.10.65
nvidia-nvjitlink-cu1212.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() でそのホイールを削除してください。