Saltar al contenido principal

Plugin SPANK para QRMI

El plugin SPANK para la Interfaz de Gestión de Recursos Cuánticos (QRMI) se utiliza para configurar el acceso a recursos cuánticos desde los trabajos de usuario en un entorno de cómputo administrado por el gestor de cargas de trabajo Slurm. Se encarga de la adquisición y liberación del acceso a los recursos cuánticos, y establece las variables de entorno necesarias para ejecutar cargas de trabajo cuánticas. Los recursos cuánticos disponibles se especifican en un archivo qrmi_config.json, que es gestionado por un administrador.

Una vez instalado, este plugin registra la siguiente opción. Un usuario de Slurm puede especificar qué recursos cuánticos se utilizan para el script de trabajo de Slurm.

--qpu=names             Comma separated list of QPU resources to use.

Por ejemplo:

#!/bin/bash

#SBATCH --job-name=sampler_job
#SBATCH --ntasks=1
#SBATCH --cpus-per-task=1
#SBATCH --qpu=ibm_quebec,ibm_sherbrooke

# Your script goes here...

Requisitos y configuración

Las siguientes herramientas son necesarias para el entorno de compilación:

  • Compilador de Rust 1.86 o superior
  • Un compilador de C: por ejemplo, GCC (gcc) en Linux y Clang (clang-tools-extra) para targets desconocidos de Rust/compilaciones cruzadas. QRMI y su plugin SPANK son compatibles con compiladores que cumplan el estándar C11
  • make/cmake (RPM make/cmake para sistemas operativos compatibles con RHEL)
  • openssl (RPM openssl-devel para sistemas operativos compatibles con RHEL)
  • zlib (RPM zlib-devel para sistemas operativos compatibles con RHEL)
  • Los archivos de cabecera de Slurm (slurm/slurm.h y similares) deben estar disponibles en tu host

El entorno de ejecución requiere:

  • gcc (RPM libgcc para sistemas operativos compatibles con RHEL)
  • openssl (RPM openssl-libs para sistemas operativos compatibles con RHEL)
  • zlib (RPM zlib para sistemas operativos compatibles con RHEL)

Configurar los recursos cuánticos disponibles

El repositorio contiene una configuración de ejemplo (qrmi_config.json.example).

El array resources contiene el conjunto de recursos cuánticos disponibles. Cada definición de recurso cuántico incluye lo siguiente:

PropiedadDescripción
nameNombre del recurso cuántico (por ejemplo, nombre del backend)
typeTipo de recurso (direct-access, qiskit-runtime-service y pasqal-cloud)
environmentConjunto de variables de entorno para trabajar con QRMI. Las implementaciones actuales asumen que el endpoint de la API y las credenciales se especifican mediante variables de entorno

Si un usuario especifica un recurso con la opción --qpu que no está definido en el archivo qrmi_config.json, la especificación será ignorada.

Si el usuario establece por su cuenta las variables de entorno necesarias para la ejecución del trabajo, no es obligatorio especificarlas en este archivo. En ese caso, la propiedad environment será {}.

nota

Si estás usando un recurso QPU con el tipo de recurso qiskit-runtime-service, utiliza una cuenta que soporte abrir una sesión, como una cuenta de Plan Premium.

Si usas una cuenta que no admite abrir una sesión, como una cuenta de Plan Open, agrega QRMI_IBM_QRS_SESSION_MODE="batch" a la lista de variables de entorno en qrmi_config.json como solución alternativa.

Instalación

Ejecuta la compilación usando make y cmake:

. ~/.cargo/env
mkdir build
cd build
cmake ..
make

Por defecto, el archivo CMakeLists.txt espera que el archivo de cabecera de Slurm (slurm.h) esté ubicado en /usr/include/slurm, pero esto puede personalizarse como se muestra a continuación.

SLURM_INCLUDE_DIRS=<directory containing slurm/slurm.h> cmake ..

Si el paso de compilación anterior es exitoso, se creará una biblioteca compartida de Linux llamada spank_qrmi.so bajo el directorio build/.

Además, agrega la siguiente línea al archivo /etc/slurm/plugstack.conf en los nodos donde este plugin esté instalado (ten en cuenta que un administrador necesita crear el archivo qrmi_config.json y especificar la ruta como argumento del plugin, como se muestra a continuación):

optional /usr/lib64/slurm/spank_qrmi.so /etc/slurm/qrmi_config.json
nota

Puedes usar los argumentos opcionales disponibles para agregar variables de entorno al proceso de Slurm donde se carga el plugin SPANK. El formato para especificar variables de entorno se define de la siguiente manera.

--env:{variable name}={value}

Por ejemplo, al interactuar con recursos cuánticos a través de un proxy HTTP, se requieren las variables de entorno http_proxy, https_proxy y no_proxy. Estas pueden agregarse como se muestra a continuación.

optional /usr/lib64/slurm/spank_qrmi.so /etc/slurm/qrmi_config.json --env:http_proxy=http://192.168.1.128:3128 --env:https_proxy=http://192.168.1.128:3128

Para el nodo asignador, no necesitas especificar la ruta a qrmi_config.json, como se muestra a continuación.

optional /usr/lib64/slurm/spank_qrmi.so

La siguiente tabla indica a qué nodos de contexto de Slurm deben copiarse estos archivos. Para más detalles sobre cada contexto, consulta la documentación del plugin SPANK.

ArchivosContextos de Slurm
plugstack.conflocal, remote, allocator, slurmd y job_script
qrmi_config.jsonremote (Nodos de cómputo)
spank_qrmi.soallocator y remote (Nodos de inicio de sesión y nodos de cómputo)
nota

Una vez actualizado plugstack.conf, los plugins SPANK se cargarán en tiempo de ejecución durante el próximo lanzamiento de un trabajo, lo que significa que los administradores no necesitan reiniciar el clúster de Slurm.

Una vez completada la instalación, deberías encontrar la opción --qpu=names en el mensaje de ayuda de sbatch.

Options provided by plugins:
--qpu=names Comma-separated list of QPU resources to use.

Registro de eventos

Este plugin utiliza el sistema de registro de Slurm para los logs. Los mensajes de registro de este plugin se pueden encontrar en /var/log/slurm/slurmd.log.

[2025-07-31T09:43:34.019] [21.batch] debug:  spank: /etc/slurm/plugstack.conf:1: Loaded plugin spank_qrmi.so
[2025-07-31T09:43:34.019] [21.batch] debug: spank_qrmi_c(6582, 0): -> slurm_spank_init argc=1 remote=1
[2025-07-31T09:43:34.019] [21.batch] debug: SPANK: appending plugin option "qpu"
[2025-07-31T09:43:34.019] [21.batch] debug: spank_qrmi_c(6582,0): <- slurm_spank_init rc=0
[2025-07-31T09:43:34.019] [21.batch] debug2: spank: spank_qrmi.so: init = 0
[2025-07-31T09:43:34.019] [21.batch] debug: spank_qrmi_c: --qpu=[ibm_sherbrooke,ibm_torino]
[2025-07-31T09:43:34.019] [21.batch] debug: spank_qrmi_c(6582, 0): -> slurm_spank_init_post_opt argc=1 remote=1
[2025-07-31T09:43:34.019] [21.batch] debug: spank_qrmi_c, fffffffb
[2025-07-31T09:43:34.019] [21.batch] debug: spank_qrmi_c: argv[0] = [/etc/slurm/qrmi_config.json]
[2025-07-31T09:43:34.020] [21.batch] debug: spank_qrmi_c: name(ibm_sherbrooke), type(1) found in qrmi_config

Puedes habilitar el registro en tiempo de ejecución de QRMI especificando los siguientes argumentos de srun.

Opción de sbatch/srunNivel de log de Slurm (SRUN_DEBUG)Nivel de log de QRMI (RUST_LOG)
(predeterminado)3info
--quiet2error
--verbose4debug
-vv o más5trace

Consideraciones para múltiples QPUs

En tiempo de ejecución, cada instancia de QRMI está vinculada a un único recurso QPU. Para permitir el uso de múltiples recursos cuánticos dentro de un mismo script de trabajo, este plugin establece variables de entorno con el nombre del recurso como prefijo. Por ejemplo, si se especifica --qpu=qpu1,qpu2, las variables de entorno se establecerán de la siguiente manera:

qpu1_QRMI_IBM_DA_ENDPOINT=http://test1
qpu2_QRMI_IBM_DA_ENDPOINT=http://test2

Esto garantiza que cada instancia de QRMI opere con los parámetros de configuración establecidos para su recurso correspondiente durante la ejecución del trabajo de Slurm.

La configuración de variables de entorno anterior se aplica únicamente a los trabajos en los que se especifica la opción --qpu=names.

Este plugin también establece las siguientes dos variables de entorno, a las que hace referencia el código de las primitivas de QRMI.

Variable de entornoDescripción
SLURM_JOB_QPU_RESOURCESLista separada por comas de los recursos QPU a usar en tiempo de ejecución. Los recursos no documentados serán filtrados. Por ejemplo, qpu1,qpu2
SLURM_JOB_QPU_TYPESLista separada por comas del tipo de recurso (direct-access, qiskit-runtime-service y pasqal-cloud). Por ejemplo, direct-access,pasqal-cloud