Plugin SPANK para QRMI
O plugin SPANK para a Interface de Gerenciamento de Recursos Quânticos (QRMI) é usado para configurar o acesso a recursos quânticos a partir de jobs de usuários em um ambiente de computação administrado pelo gerenciador de cargas de trabalho Slurm. Ele lida com a aquisição e liberação do acesso a recursos quânticos e define as variáveis de ambiente necessárias para executar cargas de trabalho quânticas. Os recursos quânticos disponíveis são especificados em um arquivo qrmi_config.json, que é gerenciado por um administrador.
Após a instalação, este plugin registra a seguinte opção. Um usuário do Slurm pode especificar quais recursos quânticos são utilizados no script de job do Slurm.
--qpu=names Comma separated list of QPU resources to use.
Por exemplo,
#!/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 e configuração
As seguintes ferramentas são necessárias para o ambiente de compilação:
- Compilador Rust 1.86 ou superior
- Um compilador C: por exemplo, GCC (gcc) no Linux e Clang (clang-tools-extra) para alvos desconhecidos do Rust/compilações cruzadas. O QRMI e seu plugin SPANK são compatíveis com compiladores que seguem o padrão C11
- make/cmake (RPM make/cmake para SO compatível com RHEL)
- openssl (RPM openssl-devel para SO compatível com RHEL)
- zlib (RPM zlib-devel para SO compatível com RHEL)
- Os arquivos de cabeçalho do Slurm (slurm/slurm.h e outros) devem estar disponíveis no seu host
O ambiente de execução requer:
- gcc (RPM libgcc para SO compatível com RHEL)
- openssl (RPM openssl-libs para SO compatível com RHEL)
- zlib (RPM zlib para SO compatível com RHEL)
Configurar recursos quânticos disponíveis
O repositório contém um exemplo de configuração (qrmi_config.json.example).
O array resources contém um conjunto de recursos quânticos disponíveis. Cada definição de recurso quântico contém o seguinte:
| Propriedade | Descrição |
|---|---|
| name | Nome do recurso quântico (por exemplo, nome do backend) |
| type | Tipo de recurso (direct-access, qiskit-runtime-service e pasqal-cloud) |
| environment | Um conjunto de variáveis de ambiente para trabalhar com o QRMI. As implementações atuais assumem que o endpoint de API e as credenciais são especificados por meio da definição de variáveis de ambiente |
Se um usuário especificar um recurso com a opção --qpu que não está definido no arquivo qrmi_config.json, a especificação será ignorada.
Se o usuário definir por conta própria as variáveis de ambiente necessárias para a execução do job, não é necessário especificá-las neste arquivo. Nesse caso, a propriedade environment será {}.
Se você estiver usando um recurso QPU com o tipo de recurso qiskit-runtime-service, use uma conta que suporte abertura de sessão, como uma conta do Plano Premium.
Se você estiver usando uma conta que não suporta abertura de sessão, como uma conta do Plano Open, adicione QRMI_IBM_QRS_SESSION_MODE="batch" à lista de variáveis de ambiente no qrmi_config.json como alternativa.
Instalação
Execute o build usando make e cmake:
. ~/.cargo/env
mkdir build
cd build
cmake ..
make
Por padrão, o arquivo CMakeLists.txt espera que o arquivo de cabeçalho do Slurm (slurm.h) esteja localizado em /usr/include/slurm, mas isso pode ser personalizado conforme mostrado abaixo.
SLURM_INCLUDE_DIRS=<directory containing slurm/slurm.h> cmake ..
Se o passo de build acima for bem-sucedido, uma biblioteca compartilhada Linux chamada spank_qrmi.so será criada no diretório build/.
Além disso, adicione a seguinte linha ao /etc/slurm/plugstack.conf nos nós onde este plugin está instalado (observe que um administrador precisa criar o arquivo qrmi_config.json e especificar o caminho como argumento do plugin, conforme mostrado a seguir):
optional /usr/lib64/slurm/spank_qrmi.so /etc/slurm/qrmi_config.json
Você pode usar os argumentos opcionais disponíveis para adicionar variáveis de ambiente ao processo Slurm onde o plugin SPANK é carregado. O formato para especificar variáveis de ambiente é definido da seguinte forma.
--env:{variable name}={value}
Por exemplo, ao interagir com recursos quânticos por meio de um proxy HTTP, as variáveis de ambiente http_proxy, https_proxy e no_proxy são necessárias. Elas podem ser adicionadas conforme mostrado abaixo.
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 o nó alocador, você não precisa especificar o caminho para qrmi_config.json, conforme mostrado a seguir.
optional /usr/lib64/slurm/spank_qrmi.so
A tabela a seguir mostra para quais nós de contexto do Slurm esses arquivos devem ser copiados. Para mais detalhes sobre cada contexto, consulte a documentação do plugin SPANK.
| Arquivos | Contextos Slurm |
|---|---|
plugstack.conf | local, remote, allocator, slurmd e job_script |
qrmi_config.json | remote (Nós de computação) |
spank_qrmi.so | allocator e remote (Nós de login e nós de computação) |
Após a atualização do plugstack.conf, os plugins SPANK serão carregados em tempo de execução durante o próximo lançamento de job, o que significa que os administradores não precisam reiniciar o cluster Slurm.
Após concluir a instalação, você deve encontrar a opção --qpu=names na mensagem de ajuda do sbatch.
Options provided by plugins:
--qpu=names Comma-separated list of QPU resources to use.
Logging
Este plugin usa o logger do Slurm para registro de logs. As mensagens de log deste plugin podem ser encontradas em /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
Você pode habilitar o log de execução do QRMI especificando os seguintes argumentos do srun.
Opção sbatch/srun | Nível de log do Slurm (SRUN_DEBUG) | Nível de log do QRMI (RUST_LOG) |
|---|---|---|
| (padrão) | 3 | info |
--quiet | 2 | error |
--verbose | 4 | debug |
-vv ou mais | 5 | trace |
Considerações para múltiplos QPUs
Em tempo de execução, cada instância QRMI está vinculada a um único recurso QPU. Para permitir o uso de múltiplos recursos quânticos dentro de um único script de job, este plugin define variáveis de ambiente com o nome do recurso como prefixo. Por exemplo, se --qpu=qpu1,qpu2 for especificado, as variáveis de ambiente serão definidas da seguinte forma:
qpu1_QRMI_IBM_DA_ENDPOINT=http://test1
qpu2_QRMI_IBM_DA_ENDPOINT=http://test2
Isso garante que cada instância QRMI opere com os parâmetros de configuração definidos para seu respectivo recurso durante a execução do job Slurm.
As configurações de variáveis de ambiente acima são aplicadas apenas a jobs onde a opção --qpu=names é especificada.
Este plugin também define as duas variáveis de ambiente a seguir, que são referenciadas pelo código primitivo do QRMI.
| Variável de ambiente | Descrição |
|---|---|
SLURM_JOB_QPU_RESOURCES | Lista separada por vírgulas de recursos QPU a serem usados em tempo de execução. Recursos não documentados serão filtrados. Por exemplo, qpu1,qpu2 |
SLURM_JOB_QPU_TYPES | Lista separada por vírgulas do tipo de recurso (direct-access, qiskit-runtime-service e pasqal-cloud). Por exemplo, direct-access,pasqal-cloud |