Elegir un perfil de cómputo
Los workflows gestionados se ejecutan en perfiles de cómputo. Un perfil de cómputo es una combinación fija de vCPU, memoria y GPU, similar a los recursos que solicitas a un planificador de HPC. Cuando subes un workflow, asocias sus tamaños, como S y M, a perfiles, y cada ejecución elige uno de esos tamaños. Después, el trabajo se ejecuta en su propio nodo con ese perfil y lo conserva hasta que el trabajo termina.
| Perfil | vCPU | Memoria (GB) | GPU |
|---|---|---|---|
8x32 | 8 | 32 | Ninguna |
16x128 | 16 | 128 | Ninguna |
48x768 | 48 | 768 | Ninguna |
128x1500 | 128 | 1500 | Ninguna |
24x120x1l40s | 24 | 120 | 1 L40S |
20x320x2a100 | 20 | 320 | 2 A100 |
80x1200x8a100 | 80 | 1200 | 8 A100 |
160x1792x8h100 | 160 | 1792 | 8 H100 |
Un ID de perfil tiene la forma {cpu}x{memory}, con la memoria en GB, o {cpu}x{memory}x{count}{gpu} para un perfil con GPU. Por ejemplo, 24x120x1l40s tiene 24 vCPU, 120 GB de memoria y una GPU NVIDIA L40S.
Comprobar los perfiles disponibles
Para ver qué perfiles están disponibles, llama a 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)
Buscar un perfil por sus recursos
En lugar de escribir un ID de perfil, puedes describir los recursos que necesita tu workflow con compute_profile() y usar el resultado como valor en sizes_map. Pasa cpu y memory en GB, y pasa gpu para un perfil con 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 acepta ID de perfil y los perfiles que devuelve compute_profile(), y puedes mezclar ambos en un mismo mapa. Para comprobar un ID de perfil antes de subir, pásalo a compute_profile(), por ejemplo client.compute_profile("16x128"). Si ningún perfil coincide, el error lista los perfiles disponibles.
compute_profiles() devuelve una lista, así que también puedes filtrarla tú mismo. Por ejemplo, el siguiente código encuentra los perfiles con GPU:
run_workflow_remotely.ipynb
gpu_profiles = [p for p in client.compute_profiles() if p.gpu]
Establecer un perfil de cómputo predeterminado para tu workflow
La mayoría de los workflows empiezan con un solo tamaño. Asócialo a un perfil con sizes_map y conviértelo en el predeterminado con default_size cuando subas el 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",
)
)
Todas las ejecuciones del workflow usan este perfil, así que no necesitas pasar un tamaño cuando lo ejecutas:
run_workflow_remotely.ipynb
job = my_workflow.run(circuits=circuits) # Runs on 16x128
Buena práctica: ajusta los tamaños a los tamaños de los problemas
Un workflow resuelve problemas específicos y puede requerir distintos perfiles de cómputo a medida que los problemas crecen en escala y complejidad. Con un sizes_map para cada workflow, puedes hacer lo siguiente:
-
Dar a los problemas grandes recursos de cómputo suficientes para que se ejecuten hasta el final.
-
Evitar que los problemas pequeños usen un nodo mayor del que necesitan.
Puedes basar los tamaños en los factores que determinan el uso de memoria y CPU de tu workflow, como el tamaño del subespacio, el número de batches o el número de qubits.
Definir los tamaños
Puedes asociar hasta cuatro tamaños, para problemas pequeños (S), medianos (M), grandes (L) y extragrandes (XL). Por ejemplo, el siguiente código define un workflow con tres tamaños:
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",
)
)
Reglas de tamaño
Las etiquetas de tamaño deben ser S, M, L o XL, así que un workflow puede definir hasta cuatro tamaños. Un workflow gestionado reconoce las etiquetas en mayúsculas o minúsculas y las almacena en mayúsculas. Dos tamaños pueden asociarse al mismo perfil.
Un workflow rechaza la primera subida en los siguientes casos:
-
Una etiqueta no es
S,M,LniXL. -
Estableces
sizes_mapsindefault_size, odefault_sizesinsizes_map. -
default_sizeno es una de las etiquetas desizes_map. -
Un valor de
sizes_mapno es un perfil de cómputo disponible.
Cambiar los tamaños al volver a subir
Cuando vuelves a subir el workflow con el mismo title, el workflow gestionado trata los tamaños de la siguiente manera:
-
Si estableces
sizes_map, los nuevos tamaños reemplazan todos los tamaños almacenados. -
Si omites
sizes_map, el workflow conserva los tamaños almacenados y el predeterminado. -
Para cambiar solo el predeterminado, establece
default_sizesinsizes_map. El valor dedefault_sizedebe ser uno de los tamaños almacenados.
Establece default_size cada vez que establezcas sizes_map. Una nueva subida no exige default_size. Si los nuevos tamaños no incluyen el predeterminado anterior, el workflow no tiene predeterminado y toda ejecución sin function_size falla.
Elegir un tamaño para cada ejecución
Pasa function_size a run() para elegir uno de los tamaños del workflow para ese trabajo. Si lo omites, el trabajo usa el tamaño predeterminado 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() y get_default_size() devuelven los tamaños que se almacenaron cuando cargaste el workflow. Para ver los tamaños que cambiaron después de cargar el workflow, cárgalo de nuevo.
Para leer el tamaño y el perfil de cómputo del trabajo, llama a get_function_size() y get_compute_profile() en el código de tu 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'
Solucionar problemas de tamaños
| Problema | Causa |
|---|---|
La subida falla con Invalid size '...'. Valid sizes are: S, M, L, XL. | Una etiqueta de sizes_map no es una de las cuatro etiquetas admitidas. |
La subida falla con Unknown compute profile '...' for size '...'. | Un valor de sizes_map no es un perfil disponible. Comprueba el ID con compute_profiles() o usa compute_profile() para buscarlo. |
compute_profile() falla con No compute profile matches ... | Ningún perfil tiene exactamente esos recursos. Para un perfil con GPU, pasa también gpu. Elige un perfil de la lista del error. |
La subida falla con 'default_size' is required when 'sizes' is provided. | La primera subida establece sizes_map sin default_size. |
run() falla con Unknown function size '...' for this function. Available sizes: ... | El workflow no define el tamaño que pasaste a function_size. |
run() falla con This function has no size. | Una nueva subida reemplazó los tamaños y eliminó el predeterminado. Sube de nuevo con default_size o pasa function_size. |