Scegli un profilo di calcolo
I workflow gestiti vengono eseguiti su profili di calcolo. Un profilo di calcolo è una combinazione fissa di vCPU, memoria e GPU, simile alle risorse che richiedi a uno scheduler HPC. Quando carichi un workflow, associ le sue dimensioni, come S e M, ai profili, e ogni esecuzione sceglie una di queste dimensioni. Il job viene quindi eseguito su un proprio nodo con quel profilo e lo mantiene fino alla fine del job.
| Profilo | vCPU | Memoria (GB) | GPU |
|---|---|---|---|
8x32 | 8 | 32 | Nessuna |
16x128 | 16 | 128 | Nessuna |
48x768 | 48 | 768 | Nessuna |
128x1500 | 128 | 1500 | Nessuna |
24x120x1l40s | 24 | 120 | 1 L40S |
20x320x2a100 | 20 | 320 | 2 A100 |
80x1200x8a100 | 80 | 1200 | 8 A100 |
160x1792x8h100 | 160 | 1792 | 8 H100 |
L'ID di un profilo ha la forma {cpu}x{memory}, con la memoria in GB, oppure {cpu}x{memory}x{count}{gpu} per un profilo con GPU. Ad esempio, 24x120x1l40s ha 24 vCPU, 120 GB di memoria e una GPU NVIDIA L40S.
Controlla i profili disponibili
Per vedere quali profili sono disponibili, chiama 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)
Cerca un profilo in base alle sue risorse
Invece di digitare l'ID di un profilo, puoi descrivere le risorse necessarie al tuo workflow con compute_profile() e usare il risultato come valore in sizes_map. Passa cpu e memory in GB e passa gpu per un profilo GPU:
run_workflow_remotely.ipynb
profile = client.compute_profile(cpu=24, memory=120, gpu="1l40s")
print(profile) # 24x120x1l40s
sizes_map = {"S": "8x32", "L": profile}
Un sizes_map accetta ID di profilo e i profili restituiti da compute_profile(), e puoi mescolare entrambi in una sola mappa. Per verificare l'ID di un profilo prima del caricamento, passalo a compute_profile(), ad esempio client.compute_profile("16x128"). Se nessun profilo corrisponde, l'errore elenca i profili disponibili.
compute_profiles() restituisce una lista, quindi puoi anche filtrarla da te. Ad esempio, il codice seguente trova i profili GPU:
run_workflow_remotely.ipynb
gpu_profiles = [p for p in client.compute_profiles() if p.gpu]
Imposta un profilo di calcolo predefinito per il tuo workflow
La maggior parte dei workflow parte con una sola dimensione. Associala a un profilo con sizes_map e rendila quella predefinita con default_size, quando carichi il workflow:
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",
)
)
Ogni esecuzione del workflow usa questo profilo, quindi non devi passare una dimensione quando lo esegui:
run_workflow_remotely.ipynb
job = my_workflow.run(circuits=circuits) # Runs on 16x128
Best practice: abbina le dimensioni alle dimensioni del problema
Un workflow risolve problemi specifici e potrebbe richiedere profili di calcolo diversi man mano che i problemi crescono in scala e complessità. Con un sizes_map per ogni workflow, puoi fare quanto segue:
-
Dare ai problemi grandi risorse di calcolo sufficienti per essere eseguiti fino al completamento.
-
Evitare che i problemi piccoli usino un nodo più grande del necessario.
Puoi basare le dimensioni sui fattori che determinano l'uso di memoria e CPU del tuo workflow, come la dimensione del sottospazio, il numero di batch o il numero di qubit.
Definisci le dimensioni
Puoi associare fino a quattro dimensioni, per problemi piccoli (S), medi (M), grandi (L) ed extra grandi (XL). Ad esempio, il codice seguente definisce un workflow con tre dimensioni:
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",
)
)
Regole sulle dimensioni
Le etichette delle dimensioni devono essere S, M, L o XL, quindi un workflow può definire fino a quattro dimensioni. Un workflow gestito riconosce le etichette in maiuscolo o minuscolo e le memorizza in maiuscolo. Due dimensioni possono essere associate allo stesso profilo.
Un workflow rifiuta il primo caricamento nei casi seguenti:
-
Un'etichetta non è
S,M,LoXL. -
Imposti
sizes_mapsenzadefault_size, oppuredefault_sizesenzasizes_map. -
default_sizenon è una delle etichette insizes_map. -
Un valore in
sizes_mapnon è un profilo di calcolo disponibile.
Cambia le dimensioni a un nuovo caricamento
Quando carichi di nuovo il workflow con lo stesso title, il workflow gestito gestisce le dimensioni come segue:
-
Se imposti
sizes_map, le nuove dimensioni sostituiscono tutte le dimensioni memorizzate. -
Se ometti
sizes_map, il workflow mantiene le dimensioni memorizzate e quella predefinita. -
Per cambiare solo la dimensione predefinita, imposta
default_sizesenzasizes_map. Il valore didefault_sizedeve essere una delle dimensioni memorizzate.
Imposta default_size ogni volta che imposti sizes_map. Un nuovo caricamento non richiede default_size. Se le nuove dimensioni non includono la vecchia dimensione predefinita, il workflow non ha una dimensione predefinita e ogni esecuzione senza function_size fallisce.
Scegli una dimensione per ogni esecuzione
Passa function_size a run() per scegliere una delle dimensioni del workflow per quel job. Se lo ometti, il job usa la dimensione predefinita del workflow:
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() e get_default_size() restituiscono le dimensioni memorizzate quando hai caricato il workflow. Per vedere le dimensioni cambiate dopo il caricamento del workflow, caricalo di nuovo.
Per leggere la dimensione e il profilo di calcolo del job, chiama get_function_size() e get_compute_profile() nel codice del tuo workflow:
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'
Risoluzione dei problemi sulle dimensioni
| Problema | Causa |
|---|---|
Il caricamento fallisce con Invalid size '...'. Valid sizes are: S, M, L, XL. | Un'etichetta in sizes_map non è una delle quattro etichette supportate. |
Il caricamento fallisce con Unknown compute profile '...' for size '...'. | Un valore in sizes_map non è un profilo disponibile. Controlla l'ID con compute_profiles() oppure usa compute_profile() per cercarlo. |
compute_profile() fallisce con No compute profile matches ... | Nessun profilo ha esattamente quelle risorse. Per un profilo GPU, passa anche gpu. Scegli un profilo dall'elenco nell'errore. |
Il caricamento fallisce con 'default_size' is required when 'sizes' is provided. | Il primo caricamento imposta sizes_map senza default_size. |
run() fallisce con Unknown function size '...' for this function. Available sizes: ... | Il workflow non definisce la dimensione che hai passato a function_size. |
run() fallisce con This function has no size. | Un nuovo caricamento ha sostituito le dimensioni e rimosso quella predefinita. Carica di nuovo con default_size, oppure passa function_size. |