Plugin SPANK pour QRMI
Le plugin SPANK pour l'interface de gestion des ressources quantiques (QRMI) permet de configurer l'accès aux ressources quantiques depuis les jobs utilisateurs dans un environnement de calcul administré par le gestionnaire de charges de travail Slurm. Il gère l'acquisition et la libération de l'accès aux ressources quantiques, et définit les variables d'environnement nécessaires à l'exécution des charges de travail quantiques. Les ressources quantiques disponibles sont spécifiées dans un fichier qrmi_config.json, géré par un administrateur.
Une fois installé, ce plugin enregistre l'option suivante. Un utilisateur Slurm peut ainsi spécifier quelles ressources quantiques sont utilisées pour le script de job Slurm.
--qpu=names Comma separated list of QPU resources to use.
Par exemple :
#!/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...
Prérequis et configuration
Les outils suivants sont requis pour l'environnement de compilation :
- Compilateur Rust 1.86 ou supérieur
- Un compilateur C : par exemple, GCC (gcc) sous Linux et Clang (clang-tools-extra) pour les cibles inconnues Rust / compilations croisées. QRMI et son plugin SPANK sont compatibles avec un compilateur conforme à la norme C11
- make/cmake (RPM make/cmake pour les OS compatibles RHEL)
- openssl (RPM openssl-devel pour les OS compatibles RHEL)
- zlib (RPM zlib-devel pour les OS compatibles RHEL)
- Les fichiers d'en-tête Slurm (slurm/slurm.h et autres) doivent être disponibles sur ton hôte
L'environnement d'exécution requiert :
- gcc (RPM libgcc pour les OS compatibles RHEL)
- openssl (RPM openssl-libs pour les OS compatibles RHEL)
- zlib (RPM zlib pour les OS compatibles RHEL)
Configurer les ressources quantiques disponibles
Le dépôt contient un exemple de configuration (qrmi_config.json.example).
Le tableau resources contient un ensemble de ressources quantiques disponibles. Chaque définition de ressource quantique comprend les éléments suivants :
| Propriété | Description |
|---|---|
| name | Nom de la ressource quantique (par exemple, le nom du backend) |
| type | Type de ressource (direct-access, qiskit-runtime-service et pasqal-cloud) |
| environment | Ensemble de variables d'environnement pour travailler avec QRMI. Les implémentations actuelles supposent que le point d'accès API et les identifiants sont spécifiés via des variables d'environnement |
Si un utilisateur spécifie avec l'option --qpu une ressource qui n'est pas définie dans le fichier qrmi_config.json, la spécification sera ignorée.
Si l'utilisateur définit lui-même les variables d'environnement nécessaires à l'exécution du job, il n'est pas obligatoire de les spécifier dans ce fichier. Dans ce cas, la propriété environment sera {}.
Si tu utilises une ressource QPU avec le type de ressource qiskit-runtime-service, utilise un compte qui prend en charge l'ouverture d'une session, comme un compte Plan Premium.
Si tu utilises un compte qui ne prend pas en charge l'ouverture d'une session, comme un compte Plan Open, ajoute QRMI_IBM_QRS_SESSION_MODE="batch" à la liste des variables d'environnement dans qrmi_config.json comme solution de contournement.
Installation
Lance la compilation avec make et cmake :
. ~/.cargo/env
mkdir build
cd build
cmake ..
make
Par défaut, le fichier CMakeLists.txt s'attend à ce que le fichier d'en-tête Slurm (slurm.h) se trouve dans /usr/include/slurm, mais cela peut être personnalisé comme indiqué ci-dessous.
SLURM_INCLUDE_DIRS=<directory containing slurm/slurm.h> cmake ..
Si l'étape de compilation précédente réussit, une bibliothèque partagée Linux nommée spank_qrmi.so sera créée dans le répertoire build/.
De plus, ajoute la ligne suivante au fichier /etc/slurm/plugstack.conf sur les nœuds où ce plugin est installé (note qu'un administrateur doit créer le fichier qrmi_config.json et spécifier son chemin comme argument du plugin, comme ci-dessous) :
optional /usr/lib64/slurm/spank_qrmi.so /etc/slurm/qrmi_config.json
Tu peux utiliser les arguments optionnels disponibles pour ajouter des variables d'environnement au processus Slurm dans lequel le plugin SPANK est chargé. Le format pour spécifier des variables d'environnement est défini comme suit.
--env:{variable name}={value}
Par exemple, lors d'interactions avec des ressources quantiques via un proxy HTTP, les variables d'environnement http_proxy, https_proxy et no_proxy sont requises. Elles peuvent être ajoutées comme indiqué ci-dessous.
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
Pour le nœud allocateur, tu n'as pas besoin de spécifier le chemin vers qrmi_config.json, comme indiqué ci-dessous.
optional /usr/lib64/slurm/spank_qrmi.so
Le tableau suivant indique vers quels nœuds de contexte Slurm ces fichiers doivent être copiés. Pour plus de détails sur chaque contexte, consulte la documentation du plugin SPANK.
| Fichiers | Contextes Slurm |
|---|---|
plugstack.conf | local, remote, allocator, slurmd et job_script |
qrmi_config.json | remote (nœuds de calcul) |
spank_qrmi.so | allocator et remote (nœuds de connexion et nœuds de calcul) |
Une fois plugstack.conf mis à jour, les plugins SPANK seront chargés à l'exécution lors du prochain lancement de job, ce qui signifie que les administrateurs n'ont pas besoin de redémarrer le cluster Slurm.
Une fois l'installation terminée, tu devrais trouver l'option --qpu=names dans le message d'aide de sbatch.
Options provided by plugins:
--qpu=names Comma-separated list of QPU resources to use.
Journalisation
Ce plugin utilise le journaliseur Slurm pour la journalisation. Les messages de log de ce plugin se trouvent dans /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
Tu peux activer le log d'exécution QRMI en spécifiant les arguments srun suivants.
Option sbatch/srun | Niveau de log Slurm (SRUN_DEBUG) | Niveau de log QRMI (RUST_LOG) |
|---|---|---|
| (défaut) | 3 | info |
--quiet | 2 | error |
--verbose | 4 | debug |
-vv ou plus | 5 | trace |
Considérations pour les QPU multiples
À l'exécution, chaque instance QRMI est liée à une seule ressource QPU. Pour permettre l'utilisation de plusieurs ressources quantiques au sein d'un même script de job, ce plugin définit des variables d'environnement avec le nom de la ressource comme préfixe. Par exemple, si --qpu=qpu1,qpu2 est spécifié, les variables d'environnement seront définies comme suit :
qpu1_QRMI_IBM_DA_ENDPOINT=http://test1
qpu2_QRMI_IBM_DA_ENDPOINT=http://test2
Cela garantit que chaque instance QRMI fonctionne avec les paramètres de configuration définis pour sa ressource respective lors de l'exécution du job Slurm.
Les réglages des variables d'environnement ci-dessus ne s'appliquent qu'aux jobs pour lesquels l'option --qpu=names est spécifiée.
Ce plugin définit également les deux variables d'environnement suivantes, référencées par le code des primitives QRMI.
| Variable d'environnement | Description |
|---|---|
SLURM_JOB_QPU_RESOURCES | Liste séparée par des virgules des ressources QPU à utiliser à l'exécution. Les ressources non documentées seront filtrées. Par exemple, qpu1,qpu2 |
SLURM_JOB_QPU_TYPES | Liste séparée par des virgules du type de ressource (direct-access, qiskit-runtime-service et pasqal-cloud). Par exemple, direct-access,pasqal-cloud |