Guida utente del plugin SPANK
Il plugin SPANK per l'interfaccia di gestione delle risorse quantistiche (QRMI) viene utilizzato per configurare l'accesso alle risorse quantistiche dai job utente in un ambiente di calcolo amministrato dal gestore del carico di lavoro Slurm. Questa è una guida per gli utenti del plugin per configurare l'allocazione delle risorse QPU durante la creazione di job Slurm.
Le definizioni delle risorse QPU di Slurm determinano quali risorse fisiche possono essere utilizzate dai job Slurm in ambienti di calcolo ad alte prestazioni (HPC). Il codice sorgente dell'utente dovrebbe essere indipendente da specifiche istanze di backend, e anche dai tipi di backend quando possibile. Questo mantiene il codice sorgente portabile, mentre i criteri di selezione del QPU fanno parte della definizione della risorsa (considerata configurazione e non codice sorgente).
Configurare le risorse QPU nella creazione di job​
Nota che questo plugin è in fase di sviluppo attivo e la sintassi esatta è soggetta a modifiche.
Ambito dell'amministratore​
Gli amministratori HPC configurano il plugin SPANK per specificare quali risorse fisiche possono essere fornite ai job Slurm. Questa configurazione contiene tutte le informazioni necessarie affinché i job Slurm accedano alle risorse fisiche, come endpoint e credenziali di accesso.
Leggi il file qrmi_config.json.example per un esempio di configurazione completo.
In slurm.conf, le risorse QPU possono essere assegnate ad alcuni o a tutti i nodi per l'utilizzo:
...
GresTypes=qpu,name
NodeName=node[1-5000] Gres=qpu,name:ibm_fez
...
Ambito dell'utente​
Gli utenti HPC inviano job utilizzando risorse QPU collegate alle risorse QPU di Slurm. L'attributo name fa riferimento a ciò che l'amministratore HPC ha definito. Durante il runtime di un job Slurm, la selezione del backend può basarsi su criteri diversi da un nome predefinito che fa riferimento a un backend specifico (ad esempio, tramite qualificatori di capacità e tasso di errore, per aiutare a selezionare tra l'insieme di backend definiti).
Potrebbero essere richieste variabili d'ambiente aggiuntive, a seconda del tipo di backend.
I parametri SBATCH punteranno a una o più risorse QPU assegnate all'applicazione come risorse generiche.
Le variabili d'ambiente fornite tramite il plugin forniranno le informazioni necessarie all'applicazione (consulta la sezione Ambito dell'applicazione HPC per i dettagli).
#SBATCH --time=100
#SBATCH --output=<LOGS_PATH>
#SBATCH --gres=qpu:1
#SBATCH --qpu=ibm_fez
#SBATCH --... # other options
srun ...
Per utilizzare più risorse QPU, aggiungi altri QPU al parametro --qpu:
#SBATCH --time=100
#SBATCH --output=<LOGS_PATH>
#SBATCH --gres=qpu:3
#SBATCH --qpu=my_local_qpu,ibm_fez,ibm_marrakesh
#SBATCH --... # other options
srun ...
Ambito dell'applicazione HPC​
Le applicazioni HPC utilizzano le risorse QPU di Slurm assegnate al job Slurm.
Le variabili d'ambiente forniscono ulteriori dettagli per l'utilizzo da parte dell'applicazione; ad esempio, SLURM_JOB_QPU_RESOURCES elenca i nomi delle risorse quantistiche (separati da virgola se ne vengono forniti diversi).
Queste variabili saranno utilizzate da QRMI. (Consulta i file README nelle varie directory QRMI (IBM, pasqal) per ulteriori dettagli.)
from qiskit import QuantumCircuit
# Using an IBM QRMI flavor:
from qrmi.primitives import QRMIService
from qrmi.primitives.ibm import SamplerV2, get_backend
# define circuit
circuit = QuantumCircuit(2)
circuit.h(0)
circuit.cx(0, 1)
circuit.measure_all()
# instantiate QRMI service and get quantum resource (we'll take the first one should there be several of them)
# inject credentials needed for accessing the service at this point
load_dotenv()
service = QRMIService()
resources = service.resources()
qrmi = resources[0]
# Generate transpiler target from backend configuration & properties and transpile
backend = get_backend(qrmi)
pm = generate_preset_pass_manager(
optimization_level=1,
backend=backend,
)
isa_circuit = pm.run(circuit)
# Run the circuit
options = {}
sampler = SamplerV2(qrmi, options=options)
job = sampler.run([(isa_circuit, isa_observable, param_values)])
print(f">>> Job ID: {job.job_id()}")
result = job.result()
if job.done():
pub_result = result[0]
print(f"Counts for the 'meas' output register: {pub_result.data.meas.get_counts()}")
elif job.cancelled():
print("Cancelled")
elif job.errored():
print(qrmi.task_logs(job.job_id()))
Consulta la directory degli esempi per i file di esempio.
Specifiche del backend​
IBM Direct Access API​
Ambito dell'amministratore​
La configurazione dei backend Direct Access API (ambito admin HPC) include endpoint e credenziali per l'endpoint Direct Access e i servizi di autenticazione, nonché per l'endpoint S3. In particolare, include:
- Chiave API di IBM Cloud® per la creazione di bearer token
- Endpoint della Direct Access API
- Bucket S3 e dettagli di accesso
Le credenziali di accesso non devono essere visibili agli utenti HPC o ad altri utenti non privilegiati del sistema. Pertanto, i dati sensibili possono essere inseriti in file separati, che possono essere protetti dall'accesso di conseguenza.
Nota che Slurm ha pieno accesso al backend. Questo ha diverse implicazioni:
- Il plugin Slurm è responsabile della multi-tenancy (garantire che gli utenti non vedano i risultati dei job di altri utenti)
- Il lato del cluster HPC è responsabile della verifica degli utenti (chi è autorizzato ad accedere al QPU) e di garantire l'accesso appropriato
- La capacità e la priorità dell'utilizzo del QPU sono gestite esclusivamente tramite Slurm; non è prevista nessun'altra pianificazione degli utenti al di fuori di Slurm
Ambito dell'utente​
Le corsie di esecuzione non sono esposte direttamente all'amministratore o all'utente HPC. Invece, durante il runtime, gli utenti HPC possono specificare due diverse modalità :
exclusive=truespecifica che nessun altro job può utilizzare la risorsa contemporaneamente. Un job in modalità esclusiva ottiene tutte le corsie di esecuzione e non può essere eseguito contemporaneamente a un job non esclusivoexclusive=falseconsente l'esecuzione di altri job in parallelo. In questo caso, possono esserci tanti job quante sono le corsie di esecuzione, tutti in esecuzione contemporaneamente, e al job viene assegnata una corsia