コンピュート・プロファイルを選択する
マネージド・ワークフローは、コンピュート・プロファイル上で実行されます。コンピュート・プロファイルは、HPCスケジューラーに要求するリソースと同様に、vCPU、メモリ、GPUの固定された組み合わせです。ワークフローをアップロードするときに、S や M などのサイズをプロファイルに対応付け、各実行はそれらのサイズのいずれかを選びます。ジョブはそのプロファイルを持つ専用のノード上で実行され、ジョブが終了するまでそのプロファイルを保持します。
| プロファイル | vCPU | メモリ (GB) | GPU |
|---|---|---|---|
8x32 | 8 | 32 | なし |
16x128 | 16 | 128 | なし |
48x768 | 48 | 768 | なし |
128x1500 | 128 | 1500 | なし |
24x120x1l40s | 24 | 120 | 1 L40S |
20x320x2a100 | 20 | 320 | 2 A100 |
80x1200x8a100 | 80 | 1200 | 8 A100 |
160x1792x8h100 | 160 | 1792 | 8 H100 |
プロファイルIDの形式は {cpu}x{memory} で、メモリの単位はGBです。GPUを持つプロファイルの場合は {cpu}x{memory}x{count}{gpu} です。たとえば、24x120x1l40s は、24個のvCPU、120 GBのメモリ、1基のNVIDIA L40S GPUを持ちます。
利用可能なプロファイルを確認する
どのプロファイルが利用可能かを確認するには、compute_profiles() を呼び出します。
run_workflow_remotely.ipynb
from qiskit_ibm_catalog import ManagedWorkflowClient
client = ManagedWorkflowClient()
print(client.compute_profiles())
8x32 (8 vCPU / 32 GB)
16x128 (16 vCPU / 128 GB)
48x768 (48 vCPU / 768 GB)
128x1500 (128 vCPU / 1500 GB)
24x120x1l40s (24 vCPU / 120 GB / 1l40s)
20x320x2a100 (20 vCPU / 320 GB / 2a100)
80x1200x8a100 (80 vCPU / 1200 GB / 8a100)
160x1792x8h100 (160 vCPU / 1792 GB / 8h100)
リソースからプロファイルを検索する
プロファイルIDを入力する代わりに、compute_profile() でワークフローに必要なリソースを記述し、その結果を sizes_map の値として使用できます。cpu と memory はGB単位で渡し、GPUプロファイルの場合は gpu も渡します。
run_workflow_remotely.ipynb
profile = client.compute_profile(cpu=24, memory=120, gpu="1l40s")
print(profile) # 24x120x1l40s
sizes_map = {"S": "8x32", "L": profile}
sizes_map は、プロファイルIDと、compute_profile() が返すプロファイルを受け付け、1つのマップ内で両方を混在させることもできます。アップロードする前にプロファイルIDを確認するには、compute_profile() に渡します。たとえば client.compute_profile("16x128") のようにします。一致するプロファイルがない場合、エラーに利用可能なプロファイルが一覧表示されます。
compute_profiles() はリストを返すため、自分でフィルタリングすることもできます。たとえば、次のコードはGPUプロファイルを見つけます。
run_workflow_remotely.ipynb
gpu_profiles = [p for p in client.compute_profiles() if p.gpu]
ワークフローのデフォルトのコンピュート・プロファイルを設定する
ほとんどのワークフローは、1つのサイズから始まります。ワークフローをアップロードするときに、sizes_map でそれをプロファイルに対応付け、default_size でデフォルトにします。
run_workflow_remotely.ipynb
from qiskit_ibm_catalog import ManagedWorkflow, ManagedWorkflowClient
client = ManagedWorkflowClient()
my_workflow = client.upload(
ManagedWorkflow(
title="my-workflow",
entrypoint="my_workflow.py",
working_dir="./source_files/",
sizes_map={"M": "16x128"},
default_size="M",
)
)
ワークフローのすべての実行がこのプロファイルを使用するため、実行時にサイズを渡す必要はありません。
run_workflow_remotely.ipynb
job = my_workflow.run(circuits=circuits) # Runs on 16x128
ベストプラクティス: サイズを問題の規模に合わせる
ワークフローは特定の問題を解き、問題の規模や複雑さが増すにつれて、異なるコンピュート・プロファイルが必要になることがあります。ワークフローごとに sizes_map を用意しておくと、次のことができます。
-
大規模な問題に、最後まで実行できるだけの十分なコンピュート・リソースを与える。
-
小規模な問題が、必要以上に大きなノードを使うのを防ぐ。
サイズは、部分空間のサイズ、バッチの数、量子ビットの数など、ワークフローのメモリとCPUの使用量を決める要因に基づいて決められます。
サイズを定義する
小規模 (S)、中規模 (M)、大規模 (L)、超大規模 (XL) の問題向けに、最大4つのサイズを対応付けられます。たとえば、次のコードは3つのサイズを持つワークフローを定義します。
run_workflow_remotely.ipynb
sizes_map = {"S": "8x32", "M": "16x128", "L": "128x1500"}
my_workflow = client.upload(
ManagedWorkflow(
title="my-workflow",
entrypoint="my_workflow.py",
working_dir="./source_files/",
sizes_map=sizes_map,
default_size="M",
)
)
サイズのルール
サイズのラベルは S、M、L、XL のいずれかである必要があるため、ワークフローは最大4つのサイズを定義できます。マネージド・ワークフローは、大文字と小文字のどちらのラベルも照合し、大文字で保存します。2つのサイズを同じプロファイルに対応付けることもできます。
ワークフローは、次の場合に最初のアップロードを拒否します。
-
ラベルが
S、M、L、XLのいずれでもない。 -
default_sizeなしでsizes_mapを設定した、またはsizes_mapなしでdefault_sizeを設定した。 -
default_sizeがsizes_mapのラベルのいずれでもない。 -
sizes_mapの値が、利用可能なコンピュート・プロファイルではない。
再アップロード時にサイズを変更する
同じ title でワークフローを再度アップロードすると、マネージド・ワークフローは次のようにサイズを処理します。
-
sizes_mapを設定した場合、新しいサイズが、保存されているすべてのサイズに置き換わります。 -
sizes_mapを省略した場合、ワークフローは保存されているサイズとデフォルトを保持します。 -
デフォルトのみを変更するには、
sizes_mapなしでdefault_sizeを設定します。default_sizeの値は、保存されているサイズのいずれかである必要があります。
sizes_map を設定するときは、毎回 default_size も設定してください。再アップロードでは default_size は必須ではありません。新しいサイズに古いデフォルトが含まれていない場合、ワークフローにはデフォルトがなくなり、function_size なしのすべての実行が失敗します。
実行ごとにサイズを選ぶ
run() に function_size を渡すと、そのジョブに使うワークフローのサイズを1つ選べます。省略した場合、ジョブはワークフローのデフォルトのサイズを使用します。
run_workflow_remotely.ipynb
print(my_workflow.sizes()) # {'S': '8x32', 'M': '16x128', 'L': '128x1500'}
print(my_workflow.get_default_size()) # 'M'
job = my_workflow.run(function_size="L", circuits=circuits) # Runs on 128x1500
job = my_workflow.run(circuits=circuits) # Runs on the default size, M
sizes() と get_default_size() は、ワークフローを読み込んだときに保存されていたサイズを返します。ワークフローを読み込んだ後に変更されたサイズを確認するには、ワークフローをもう一度読み込んでください。
ジョブのサイズとコンピュート・プロファイルを読み取るには、ワークフローのコードで get_function_size() と get_compute_profile() を呼び出します。
source_files/my_workflow.py
from qiskit_serverless import get_compute_profile, get_function_size
print(get_function_size()) # 'L'
print(get_compute_profile()) # '128x1500'
サイズのトラブルシューティング
| 問題 | 原因 |
|---|---|
アップロードが Invalid size '...'. Valid sizes are: S, M, L, XL. で失敗する。 | sizes_map のラベルが、サポートされている4つのラベルのいずれでもありません。 |
アップロードが Unknown compute profile '...' for size '...'. で失敗する。 | sizes_map の値が、利用可能なプロファイルではありません。compute_profiles() でIDを確認するか、compute_profile() で検索してください。 |
compute_profile() が No compute profile matches ... で失敗する。 | まったく同じリソースを持つプロファイルがありません。GPUプロファイルの場合は、gpu も渡してください。エラーに表示されたリストからプロファイルを選んでください。 |
アップロードが 'default_size' is required when 'sizes' is provided. で失敗する。 | 最初のアップロードで、default_size なしで sizes_map を設定しています。 |
run() が Unknown function size '...' for this function. Available sizes: ... で失敗する。 | function_size に渡したサイズを、ワークフローが定義していません。 |
run() が This function has no size. で失敗する。 | 再アップロードによってサイズが置き換えられ、デフォルトが削除されました。default_size を指定して再度アップロードするか、function_size を渡してください。 |