-
Qiskit
Qiskit
Qiskit on avoimen lähdekoodin ohjelmisto kvanttitietokoneiden kanssa työskentelyyn piirien, pulssien ja algoritmien tasolla. Tämä sivu sisältää tietoa kvanttisimulaatioiden ajamisesta qiskitillä singularity-kontin sisällä. Lisätietoja töiden ajamisesta fyysisillä kvanttitietokoneilla qiskitillä löytyy tästä dokumentaatiosta: Kvanttitöiden ajaminen.
Uutiset
19.05.2026 Asennettiin qiskit/2.3.0 singularity-konttiin LUMIssa kaikkien tärkeimpien Qiskit-pakettien kanssa ja
lisättiin tuki monisolmuiselle Native Cray MPI GPU -kiihdytykselle, mikä mahdollistaa suorituskykyiset monisolmuiset simulaatiot
jopa 44* kubittiin asti. Myös Qiskit-aer on päivitetty versioon 0.17.2. Yksittäistarkkuus on nyt tuettu qiskit-aerissa.
Saatavuus
Tällä hetkellä tuetut Qiskit-versiot:
| Version | Module | Puhti | Mahti | LUMI | Notes |
|---|---|---|---|---|---|
| 1.1.1 | qiskit/1.1.1 |
X | X | ||
| 2.3.0 | container only |
X | Native Cray MPI with GPU support |
Sisältää kaikki tärkeimmät Qiskit-paketit (Terra, Nature, Aer jne.) sekä GPU-kiihdytyksen. Paketit qiskit/1.1.1 ja qiskit/2.3.0 sisältävät seuraavat qiskit-liitännäiset:
qiskit==2.3.0
qiskit-aer-gpu-rocm==0.17.2
qiskit-dynamics==0.5.1
qiskit-experiments==0.13.0
qiskit-finance==0.4.1
qiskit-ibm-runtime==0.46.1
qiskit-machine-learning==0.9.0
qiskit-nature==0.7.2
qiskit-optimization==0.7.0
qiskit_qasm3_import==0.6.0
qiskit_sphinx_theme==2.0.0
asv==0.6.5
black==26.3.0
click==8.3.2
cmake==4.2.3
conan==1.66.0
cotengra==0.7.5
cotengrust==0.2.0
cvxpy==1.8.1
Cython==0.29.37
ddt==1.7.2
h5py==3.16.0
ipympl==0.10.0
ipywidgets==8.1.8
isort==8.0.1
jsonschema==4.26.0
jupyter==1.1.1
jupyter-sphinx==0.5.3
jupyterlab==4.5.5
kahypar==1.3.7
line_profiler==5.0.2
matplotlib==3.10.8
memory_profiler==0.61.0
mitiq==1.0.0
mpi4py==4.0.3
mypy==1.19.1
nbconvert==7.17.0
nbsphinx==0.9.8
ninja==1.13.0
numba==0.64.0
numpy==2.2.6
opt-einsum==3.4.0
optuna==3.6.2
pandas==2.3.3
Pillow==12.2.0
pipdeptree==2.31.0
plotly==6.6.0
psutil==7.2.2
pyarrow==23.0.1
pybind11==3.0.2
pydantic==2.13.1
pylatexenc==2.10
pylint==4.0.5
pymatching==2.3.1
pymetis==2025.2.2
PySCF==2.12.1
pytest==9.0.2
pytest-cov==7.0.0
QCut==1.1.1
reno==4.1.0
rich==15.0.0
rustworkx==0.17.1
scalene==2.1.4
scikit-build==0.19.0
scikit-learn==1.8.0
scipy==1.17.1
seaborn==0.13.2
setuptools==68.1.2
sparse==0.18.0
Sphinx==8.2.3
sphinx-design==0.7.0
stestr==4.2.1
stim==1.15.0
sympy==1.14.0
tox==4.49.1
tqdm==4.67.3
zarr==3.1.5
qiskit==2.3.0
qiskit-aer-gpu-rocm==0.17.2
qiskit-dynamics==0.5.1
qiskit-experiments==0.13.0
qiskit-finance==0.4.1
qiskit-ibm-runtime==0.45.1
qiskit-machine-learning==0.9.0
qiskit-nature==0.7.2
qiskit-optimization==0.7.0
qiskit_qasm3_import==0.6.0
qiskit_sphinx_theme==2.0.0
asv==0.6.5
black==26.3.0
click==8.3.2
cmake==4.2.3
conan==1.66.0
cotengra==0.7.5
cotengrust==0.2.0
cvxpy==1.8.1
Cython==0.29.37
ddt==1.7.2
duckdb==1.5.2
gymnasium==1.2.3
h5py==3.16.0
hdbscan==0.8.42
ipympl==0.10.0
ipywidgets==8.1.8
isort==8.0.1
jsonschema==4.26.0
jupyter==1.1.1
jupyter-sphinx==0.5.3
jupyterlab==4.5.5
kahypar==1.3.7
lightgbm==4.6.0
line_profiler==5.0.2
matplotlib==3.10.8
memory_profiler==0.61.0
mitiq==1.0.0
mpi4py==4.0.3
mypy==1.19.1
nbconvert==7.17.0
nbsphinx==0.9.8
ninja==1.13.0
numba==0.64.0
numpy==2.2.6
onnxruntime==1.25.0
opt-einsum==3.4.0
optuna==3.6.2
pandas==2.3.3
pennylane==0.44.1
pennylane-qiskit==0.44.1
Pillow==12.2.0
pipdeptree==2.31.0
plotly==6.6.0
polars==1.40.1
psutil==7.2.2
pyarrow==23.0.1
pybind11==3.0.2
pydantic==2.13.1
pylatexenc==2.10
pylint==4.0.5
pymatching==2.3.1
pymetis==2025.2.2
PySCF==2.12.1
pytest==9.0.2
pytest-cov==7.0.0
QCut==1.1.1
reno==4.1.0
rich==15.0.0
rustworkx==0.17.1
scalene==2.1.4
scikit-build==0.19.0
scikit-learn==1.8.0
scipy==1.17.1
seaborn==0.13.2
setuptools==68.1.2
sparse==0.18.0
Sphinx==8.2.3
sphinx-design==0.7.0
stable-baselines3==2.8.0
statsmodels==0.14.6
stestr==4.2.1
stim==1.15.0
sympy==1.13.1
torch==2.5.1+rocm6.2
torch-geometric==2.7.0
torchaudio==2.5.1+rocm6.2
torchinfo==1.8.0
torchvision==0.20.1+rocm6.2
tox==4.49.1
tqdm==4.67.3
umap-learn==0.5.12
wandb==0.26.1
xgboost==3.2.0
zarr==3.1.5
Jos huomaat, että jokin paketti puuttuu, voit usein asentaa sen itse komennolla pip install --user.
Katso Pythonin käyttöoppaastamme
lisätietoja pakettien asentamisesta itse. Jos mielestäsi jokin tärkeä
Qiskitiin liittyvä paketti pitäisi sisällyttää CSC:n tarjoamaan moduuliin, ota
yhteyttä servicedeskiimme.
Kaikki moduulit perustuvat kontteihin, jotka käyttävät Apptaineria (aiemmin tunnettu nimellä Singularity).
Tarjolla on wrapper-skriptit, jotta yleiset komennot kuten python,
python3, pip ja pip3 toimivat normaalisti. Lisätietoja löytyy kohdasta
CSC:n yleiset ohjeet Apptainer-konttien ajamiseen.
Lisenssi
Qiskit on lisensoitu Apache License 2.0 -lisenssillä.
Käyttö
Jos haluat käyttää Qiskitin oletusversiota Puhdissa tai Mahdissa, alusta se komennolla:
Jos haluat käyttää tiettyä versiota (katso saatavilla olevat versiot yllä), käytä:
Esimerkki sbatch- ja python-skriptistä – yksisolmuiset simulaatiot Puhdissa, Mahdissa ja LUMIssa
Esimerkki <sbatch_script_name>.sh-skriptistä yhden GPU:n ja kahden CPU-ytimen varaamiseen yhdellä solmulla Puhdissa ja Mahdissa sekä kaikkien CPU/GPU-resurssien varaamiseen yhdellä solmulla LUMIn standard-g-osiolla:
#!/bin/bash
#SBATCH --job-name=aer_job
#SBATCH --output=aer_job.o%j
#SBATCH --error=aer_job.e%j
#SBATCH --account=<project>
#SBATCH --partition=gpu
#SBATCH --ntasks=1
#SBATCH --cpus-per-task=2
#SBATCH --mem=8G
#SBATCH --time=1:00:00
#SBATCH --gres=gpu:v100:1
module load qiskit
srun python myprog.py <options>
#!/bin/bash
#SBATCH --job-name=aer_job
#SBATCH --output=aer_job.o%j
#SBATCH --error=aer_job.e%j
#SBATCH --account=<project_id>
#SBATCH --time=2:00:00
#SBATCH --partition=standard-g
#SBATCH --nodes=1
#SBATCH --gpus-per-node=8
#SBATCH --ntasks-per-node=1
#SBATCH --cpus-per-task=56
export LUMI_QISKIT_SINGULARITY_CONTAINER_PATH=/appl/local/quantum/qiskit/qiskit_2.3.0_csc.sif
export WRAPPER_PATH=/appl/local/quantum/qiskit/run-singularity
echo "NODES : ${SLURM_NNODES}"
echo "TASKS PER NODE : ${SLURM_NTASKS_PER_NODE}"
echo "CPUS PER TASK : ${SLURM_CPUS_PER_TASK}"
echo "GPUS PER NODE : ${SLURM_GPUS_PER_NODE}"
echo "GPUS PER TASK : ${SLURM_GPUS_PER_TASK}"
mask=mask_cpu:0xfe000000000000,0xfe00000000000000,0xfe0000,0xfe000000,0xfe,0xfe00,0xfe00000000,0xfe0000000000
## HPE Crayn tarjoamat LUST-optimoinnit
## Viite: https://lumi-supercomputer.github.io/LUMI-training-materials/2day-20251020/202-Binding/#mpi-network-adapter-binding-with-cray-mpich
## Viite: https://cpe.ext.hpe.com/docs/25.03/mpt/mpich/intro_mpi.html
export MPICH_GPU_SUPPORT_ENABLED=1
export MPICH_GPU_IPC_CACHE_MAX_SIZE=100
export MPICH_GPU_IPC_THRESHOLD=524288
export MPICH_OFI_NIC_POLICY=GPU
srun --cpu-bind=$mask $WRAPPER_PATH $LUMI_QISKIT_SINGULARITY_CONTAINER_PATH python myprog.py
#!/bin/bash
#SBATCH --job-name=aer_job
#SBATCH --output=aer_job.o%j
#SBATCH --error=aer_job.e%j
#SBATCH --account=<project_id>
#SBATCH --time=2:00:00
#SBATCH --partition=standard-g
#SBATCH --nodes=1
#SBATCH --gpus-per-node=8
#SBATCH --ntasks-per-node=1
#SBATCH --cpus-per-task=56
export LUMI_QISKIT_SINGULARITY_CONTAINER_PATH=/appl/local/quantum/qiskit/qiskit_2.3.0_hpcqc-ml-training_csc.sif
export WRAPPER_PATH=/appl/local/quantum/qiskit/run-singularity
echo "NODES : ${SLURM_NNODES}"
echo "TASKS PER NODE : ${SLURM_NTASKS_PER_NODE}"
echo "CPUS PER TASK : ${SLURM_CPUS_PER_TASK}"
echo "GPUS PER NODE : ${SLURM_GPUS_PER_NODE}"
echo "GPUS PER TASK : ${SLURM_GPUS_PER_TASK}"
mask=mask_cpu:0xfe000000000000,0xfe00000000000000,0xfe0000,0xfe000000,0xfe,0xfe00,0xfe00000000,0xfe0000000000
## HPE Crayn tarjoamat LUST-optimoinnit
## Viite: https://lumi-supercomputer.github.io/LUMI-training-materials/2day-20251020/202-Binding/#mpi-network-adapter-binding-with-cray-mpich
## Viite: https://cpe.ext.hpe.com/docs/25.03/mpt/mpich/intro_mpi.html
export MPICH_GPU_SUPPORT_ENABLED=1
export MPICH_GPU_IPC_CACHE_MAX_SIZE=100
export MPICH_GPU_IPC_THRESHOLD=524288
export MPICH_OFI_NIC_POLICY=GPU
srun --cpu-bind=$mask $WRAPPER_PATH $LUMI_QISKIT_SINGULARITY_CONTAINER_PATH python myprog.py
Esimerkki <myprog>.py-python-skriptistä yksisolmuisiin simulaatioihin. Huomaa, että tämä koodi on tarkoitettu vain syntaksin havainnollistamiseen ja toimii vain yhdellä solmulla. LUMI-simulaatioissa katso alla olevasta taulukosta resurssivaatimukset suhteessa simuloitavien kubittien määrään.
from qiskit import QuantumCircuit
from qiskit_aer import AerSimulator
## CHOOSE PARAMETERS
num_qubits = 5 # Number of qubits in the circuit
num_shots = 1000 # How many times we sample the circuit
## CREATE CIRCUIT FOR N-QUBIT GHZ-STATE
circuit = QuantumCircuit(num_qubits)
circuit.h(0)
for i in range(1,num_qubits):
circuit.cx(0,i)
circuit.measure_all()
## INITIALIZE SIMULATOR BACKEND THAT RUNS ON GPU
simulator = AerSimulator(method="statevector", device="GPU")
## RUN THE CIRCUIT WITH CUSTATEVEC ENABLED
result_statevec = simulator.run(circuit, shots=num_shots, seed_simulator=12345, cuStateVec_enable=True).result()
## PRINT RESULTS
counts = result_statevec.get_counts()
print(f"Counts:, {counts}")
from qiskit import QuantumCircuit
from qiskit_aer import AerSimulator
## CHOOSE PARAMETERS
num_qubits = 5 # Number of qubits in the circuit
num_shots = 1000 # How many times we sample the circuit
## CREATE CIRCUIT FOR N-QUBIT GHZ-STATE
circuit = QuantumCircuit(num_qubits)
circuit.h(0)
for i in range(1,num_qubits):
circuit.cx(0,i)
circuit.measure_all()
## INITIALIZE SIMULATOR BACKEND THAT RUNS ON GPU
simulator = AerSimulator(method="statevector", device="GPU")
## RUN THE CIRCUIT WITH CUSTATEVEC ENABLED
result_statevec = simulator.run(circuit, shots=num_shots, seed_simulator=12345, cuStateVec_enable=True).result()
## PRINT RESULTS
counts = result_statevec.get_counts()
print(f"Counts:, {counts}")
from qiskit import transpile
from qiskit_aer import AerSimulator
from qiskit.circuit.library import quantum_volume
## CHOOSE PARAMETERS
num_qubits = 34 # Number of qubits in the circuit
circuit_depth = 30 # Layers in quantum volume circuit
num_shots = 1000 # How many times we sample the circuit
sim_method = 'statevector' # Choosing simulation method
sim_device = 'GPU' # Choose whether simulation is run on CPUs or GPUs
sim_precision = 'double' # 'single' (8 bytes/amplitude) or 'double' (16 bytes/amplitude, default).
# Single halves memory and can improve GPU performance, at the cost of accuracy.
use_cache_blocking = True # Cache blocking technique parallelizes simulation by distributing quantum states into distributed memory space
num_blocking_qubits = 29 # Defines chunk size for cache blocking. Must be smaller than "qubits-log2(number-of-processes)".
# Use 28 with single precision; use 29 with double precision (see notes below).
use_batched_shots = True # Distributing shots to multiple processess
num_parallel_experiments = 1 # Does not seem to do anything when running with MPI, probably intended to be used with multithreading
## INITIALIZE SIMULATOR BACKEND
# fusion_enable combines consecutive gates into single multi-qubit gate operations,
# reducing the total number of gate applications.
simulator = AerSimulator(
method=sim_method,
device=sim_device,
batched_shots_gpu=use_batched_shots,
fusion_enable=True,
fusion_max_qubit=5,
)
simulator.set_options(precision=sim_precision)
## CREATE QUANTUM VOLUME CIRCUIT
# Note: the QuantumVolume class was deprecated in Qiskit 2.x and removed in 3.0.
# Use the quantum_volume function instead.
circuit = quantum_volume(num_qubits, circuit_depth, seed=0)
circuit.measure_all()
## TRANSPILE THE CIRCUIT
# Note: in Qiskit 2.x, do NOT pass the AerSimulator backend to transpile() — it triggers
# coupling map validation that rejects circuits with more than 34 qubits. MPI distribution
# and cache blocking are handled at sim.run() time, not at transpile time.
transpiled_circuit = transpile(circuit, optimization_level=0)
## RUN THE SIMULATION
result_statevec = simulator.run(transpiled_circuit, shots=num_shots, seed_simulator=12345, blocking_enable=use_cache_blocking, blocking_qubits=num_blocking_qubits, max_parallel_experiments=num_parallel_experiments).result()
## GATHER THE RESULTS AND SOME ADDITIONAL METADATA
counts = result_statevec.get_counts()
result_dict = result_statevec.to_dict()
metadata = result_dict['metadata']
input_data = {'Circuit' : 'Quantum Volume', 'Qubits' : num_qubits, 'Depth' : circuit_depth, 'Shots' : num_shots, 'Batched Shots' : use_batched_shots, 'Device' : sim_device, 'Simulation Method' : sim_method, 'Precision' : sim_precision}
if (use_cache_blocking):
num_chunks = 2**(num_qubits - num_blocking_qubits)
input_data['Blocking Qubits'] = num_blocking_qubits
input_data['Number of Chunks'] = num_chunks
## PRINT FOR ONE MPI RANK
if (metadata['mpi_rank'] == 0):
print()
print(f"Input data: {input_data}")
print(f"Metadata: {metadata}")
#print(f"Results: {counts}")
print(f"-------------------- \n")
## PRINT ALL MPI PROCESSES
#print(f"Input data: {input_data}")
#print(f"Metadata: {metadata}")
#print(f"-------------------- \n")
Lähetä skripti komennolla sbatch <sbatch_script_name>.sh
Esimerkki sbatch- ja python-skriptistä – monisolmuiset simulaatiot, jotka hyödyntävät Native HPE Cray MPI:tä GPU-kiihdytyksellä LUMIssa
Esimerkki <sbatch_MPI_script_name>.sh-skriptistä simulaation ajamiseen usealla LUMI-solmulla standard-g-osiossa käyttäen kaikkia GPU:ita ja kaikkia CPU-ytimiä solmua kohden. Tämä on tarkoitettu simulaatioille, joissa on 35 kubittia tai enemmän (enintään 44* kubittia – katso alla olevasta taulukosta suositellut resurssivaraukset simuloitavien kubittien määrän perusteella):
#!/bin/bash
## Tässä on esimerkki sbatch-skriptistä 38 kubitin quantum volume -simulaatiolle (myprog_MPI.py), jossa käytetään 16 solmua
#SBATCH --job-name=aer_job
#SBATCH --output=aer_job.o%j
#SBATCH --error=aer_job.e%j
#SBATCH --account=<project_id>
#SBATCH --time=2:00:00
#SBATCH --partition=standard-g
#SBATCH --nodes=16
#SBATCH --gpus-per-node=8
#SBATCH --ntasks-per-node=8
#SBATCH --cpus-per-task=7
export LUMI_QISKIT_SINGULARITY_CONTAINER_PATH=/appl/local/quantum/qiskit/qiskit_2.3.0_csc.sif
export GPU_WRAPPER_PATH=/appl/local/quantum/qiskit/run-singularity-with-gpu-affinity
mask=mask_cpu:0xfe000000000000,0xfe00000000000000,0xfe0000,0xfe000000,0xfe,0xfe00,0xfe00000000,0xfe0000000000
## HPE Crayn tarjoamat LUST-optimoinnit
## Viite: https://lumi-supercomputer.github.io/LUMI-training-materials/2day-20251020/202-Binding/#mpi-network-adapter-binding-with-cray-mpich
## Viite: https://cpe.ext.hpe.com/docs/25.03/mpt/mpich/intro_mpi.html
export MPICH_GPU_SUPPORT_ENABLED=1
export MPICH_GPU_IPC_CACHE_MAX_SIZE=100
export MPICH_GPU_IPC_THRESHOLD=524288
export MPICH_OFI_NIC_POLICY=GPU
srun --cpu-bind=$mask $GPU_WRAPPER_PATH $LUMI_QISKIT_SINGULARITY_CONTAINER_PATH python myprog_MPI.py
#!/bin/bash
## Tässä on esimerkki sbatch-skriptistä 38 kubitin quantum volume -simulaatiolle (myprog_MPI.py), jossa käytetään 16 solmua
#SBATCH --job-name=aer_job
#SBATCH --output=aer_job.o%j
#SBATCH --error=aer_job.e%j
#SBATCH --account=<project_id>
#SBATCH --time=2:00:00
#SBATCH --partition=standard-g
#SBATCH --nodes=16
#SBATCH --gpus-per-node=8
#SBATCH --ntasks-per-node=8
#SBATCH --cpus-per-task=7
export LUMI_QISKIT_SINGULARITY_CONTAINER_PATH=/appl/local/quantum/qiskit/qiskit_2.3.0_hpcqc-ml-training_csc.sif
export GPU_WRAPPER_PATH=/appl/local/quantum/qiskit/run-singularity-with-gpu-affinity
mask=mask_cpu:0xfe000000000000,0xfe00000000000000,0xfe0000,0xfe000000,0xfe,0xfe00,0xfe00000000,0xfe0000000000
## HPE Crayn tarjoamat LUST-optimoinnit
## Viite: https://lumi-supercomputer.github.io/LUMI-training-materials/2day-20251020/202-Binding/#mpi-network-adapter-binding-with-cray-mpich
## Viite: https://cpe.ext.hpe.com/docs/25.03/mpt/mpich/intro_mpi.html
export MPICH_GPU_SUPPORT_ENABLED=1
export MPICH_GPU_IPC_CACHE_MAX_SIZE=100
export MPICH_GPU_IPC_THRESHOLD=524288
export MPICH_OFI_NIC_POLICY=GPU
srun --cpu-bind=$mask $GPU_WRAPPER_PATH $LUMI_QISKIT_SINGULARITY_CONTAINER_PATH python myprog_MPI.py
Pieni koodiesimerkki <myprog_MPI>.py-python-skriptistä, joka käyttää 38 kubittia ja jota suosittelemme ajettavaksi 16 solmulla
*katso alla oleva suositeltu resurssivaraustaulukko
from qiskit import transpile
from qiskit_aer import AerSimulator
from qiskit.circuit.library import quantum_volume
## CHOOSE PARAMETERS
num_qubits = 38 # Number of qubits in the circuit
circuit_depth = 30 # Layers in quantum volume circuit
num_shots = 1000 # How many times we sample the circuit
sim_method = 'statevector' # Choosing simulation method
sim_device = 'GPU' # Choose whether simulation is run on CPUs or GPUs
sim_precision = 'double' # 'single' (8 bytes/amplitude) or 'double' (16 bytes/amplitude, default).
# Single halves memory and can improve GPU performance, at the cost of accuracy.
use_cache_blocking = True # Cache blocking technique parallelizes simulation by distributing quantum states into distributed memory space
num_blocking_qubits = 29 # Defines chunk size for cache blocking. Must be smaller than "qubits-log2(number-of-processes)".
# Use 28 with single precision; use 29 with double precision (see notes below).
use_batched_shots = True # Distributing shots to multiple processess
num_parallel_experiments = 1 # Does not seem to do anything when running with MPI, probably intended to be used with multithreading
## INITIALIZE SIMULATOR BACKEND
# fusion_enable combines consecutive gates into single multi-qubit gate operations,
# reducing the total number of gate applications.
simulator = AerSimulator(
method=sim_method,
device=sim_device,
batched_shots_gpu=use_batched_shots,
fusion_enable=True,
fusion_max_qubit=5,
)
simulator.set_options(precision=sim_precision)
## CREATE QUANTUM VOLUME CIRCUIT
# Note: the QuantumVolume class was deprecated in Qiskit 2.x and removed in 3.0.
# Use the quantum_volume function instead.
circuit = quantum_volume(num_qubits, circuit_depth, seed=0)
circuit.measure_all()
## TRANSPILE THE CIRCUIT
# Note: in Qiskit 2.x, do NOT pass the AerSimulator backend to transpile() — it triggers
# coupling map validation that rejects circuits with more than 34 qubits. MPI distribution
# and cache blocking are handled at sim.run() time, not at transpile time.
transpiled_circuit = transpile(circuit, optimization_level=0)
## RUN THE SIMULATION
result_statevec = simulator.run(transpiled_circuit, shots=num_shots, seed_simulator=12345, blocking_enable=use_cache_blocking, blocking_qubits=num_blocking_qubits, max_parallel_experiments=num_parallel_experiments).result()
## GATHER THE RESULTS AND SOME ADDITIONAL METADATA
counts = result_statevec.get_counts()
result_dict = result_statevec.to_dict()
metadata = result_dict['metadata']
input_data = {'Circuit' : 'Quantum Volume', 'Qubits' : num_qubits, 'Depth' : circuit_depth, 'Shots' : num_shots, 'Batched Shots' : use_batched_shots, 'Device' : sim_device, 'Simulation Method' : sim_method, 'Precision' : sim_precision}
if (use_cache_blocking):
num_chunks = 2**(num_qubits - num_blocking_qubits)
input_data['Blocking Qubits'] = num_blocking_qubits
input_data['Number of Chunks'] = num_chunks
## PRINT FOR ONE MPI RANK
if (metadata['mpi_rank'] == 0):
print()
print(f"Input data: {input_data}")
print(f"Metadata: {metadata}")
#print(f"Results: {counts}")
print(f"-------------------- \n")
## PRINT ALL MPI PROCESSES
#print(f"Input data: {input_data}")
#print(f"Metadata: {metadata}")
#print(f"-------------------- \n")
Lähetä skripti komennolla sbatch <sbatch_MPI_script_name>.sh
Muistivaatimukset ja esimerkkiparametrit
Statevector-simulaation vaatima muisti kaksinkertaistuu jokaisella lisätyllä kubitilla. Oletusarvoisella 16 tavun (double) tarkkuudella LUMI tukee statevector-simulaatioita aina 34 kubittiin yhdellä solmulla asti ja jopa 44* kubittiin 1024 solmulla cache blocking -tekniikkaa käyttäen. Cache blocking jakaa kvanttitilan hajautettuun GPU-muistiin simulaation rinnakkaistamiseksi; kunkin MPI-rankin chunk-koko asetetaan parametrilla blocking_qubits, jonka hyvän käytännön mukaan tulisi olla alle 25 % yhden GCD:n VRAM-muistista. LUMIssa tämä tarkoittaa, että blocking_qubits ei saa olla suurempi kuin 29: double-tarkkuudella blocking_qubits = 29 tuottaa 8 GB:n chunkin (16 × 2²⁹ tavua), mikä on 12,5 % 64 GB:n MI250X GCD:stä — selvästi alle 25 %:n rajan.
Alla oleva taulukko näyttää esimerkkiparametreja Quantum Volume -piirin simuloimiseen double-tarkkuudella. Statevector-muisti riippuu vain kubittien määrästä, ei piirin syvyydestä, joten muistisarake ei riipu syvyydestä. Suositellut solmumäärät vastaavat noin kaksinkertaista statevector-muistia, jolloin jää pelivaraa prosessien väliseen cache-blocking-datan vaihtoon. Nämä arvot benchmarkattiin Quantum Volume -piireillä syvyyksillä 10, 30, 100 ja 300, ja ne toimivat kaikilla niistä — katso LUMI quantum simulations with qiskit-aer täydet tiedot. Muut piiriperheet tai saman piirin ajaminen eri solmumäärällä voivat silti vaatia erilaisia blocking-qubit-arvoja.
Yksittäistarkkuudella samat resurssit suorittavat työn nopeammin; vaihtoehtoisesti voit simuloida saman määrän kubitteja noin puolella alla näytetyistä solmuista (ja käyttää blocking_qubits = 28 arvon 29 sijaan).
| # of Qubits | # of Blocking Qubits | Recommended # of nodes | # gpus-per-node | # tasks-per-node | # gpus-per-task | # cpus-per-task | Qubit memory requirements |
|---|---|---|---|---|---|---|---|
| 1 | 0 | 1 | 8 | 1 | 8 | 56 | 32 Bytes |
| 2 | 0 | 1 | 8 | 1 | 8 | 56 | 64 |
| 3 | 0 | 1 | 8 | 1 | 8 | 56 | 128 |
| 4 | 0 | 1 | 8 | 1 | 8 | 56 | 256 |
| 5 | 0 | 1 | 8 | 1 | 8 | 56 | 512 |
| 6 | 0 | 1 | 8 | 1 | 8 | 56 | 1024 |
| 7 | 0 | 1 | 8 | 1 | 8 | 56 | 2 Kilobytes |
| 8 | 0 | 1 | 8 | 1 | 8 | 56 | 4 |
| 9 | 0 | 1 | 8 | 1 | 8 | 56 | 8 |
| 10 | 0 | 1 | 8 | 1 | 8 | 56 | 16 |
| 11 | 0 | 1 | 8 | 1 | 8 | 56 | 32 |
| 12 | 0 | 1 | 8 | 1 | 8 | 56 | 64 |
| 13 | 0 | 1 | 8 | 1 | 8 | 56 | 128 |
| 14 | 0 | 1 | 8 | 1 | 8 | 56 | 256 |
| 15 | 0 | 1 | 8 | 1 | 8 | 56 | 512 |
| 16 | 0 | 1 | 8 | 1 | 8 | 56 | 1024 |
| 17 | 0 | 1 | 8 | 1 | 8 | 56 | 2 Megabytes |
| 18 | 0 | 1 | 8 | 1 | 8 | 56 | 4 |
| 19 | 0 | 1 | 8 | 1 | 8 | 56 | 8 |
| 20 | 0 | 1 | 8 | 1 | 8 | 56 | 16 |
| 21 | 0 | 1 | 8 | 1 | 8 | 56 | 32 |
| 22 | 0 | 1 | 8 | 1 | 8 | 56 | 64 |
| 23 | 0 | 1 | 8 | 1 | 8 | 56 | 128 |
| 24 | 0 | 1 | 8 | 1 | 8 | 56 | 256 |
| 25 | 0 | 1 | 8 | 1 | 8 | 56 | 512 |
| 26 | 0 | 1 | 8 | 1 | 8 | 56 | 1024 |
| 27 | 0 | 1 | 8 | 1 | 8 | 56 | 2 Gigabytes |
| 28 | 0 | 1 | 8 | 1 | 8 | 56 | 4 |
| 29 | 0 | 1 | 8 | 1 | 8 | 56 | 8 |
| 30 | 29 | 1 | 8 | 1 | 8 | 56 | 16 |
| 31 | 29 | 1 | 8 | 1 | 8 | 56 | 32 |
| 32 | 29 | 1 | 8 | 1 | 8 | 56 | 64 |
| 33 | 29 | 1 | 8 | 1 | 8 | 56 | 128 |
| 34 | 29 | 1 | 8 | 1 | 8 | 56 | 256 |
| 35 | 29 | 2 | 8 | 8 | 1 | 7 | 512 |
| 36 | 29 | 4 | 8 | 8 | 1 | 7 | 1024 |
| 37 | 29 | 8 | 8 | 8 | 1 | 7 | 2 Terabytes |
| 38 | 29 | 16 | 8 | 8 | 1 | 7 | 4 |
| 39 | 29 | 32 | 8 | 8 | 1 | 7 | 8 |
| 40 | 29 | 64 | 8 | 8 | 1 | 7 | 16 |
| 41 | 29 | 128 | 8 | 8 | 1 | 7 | 32 |
| 42 | 29 | 256 | 8 | 8 | 1 | 7 | 64 |
| 43 | 29 | 512 | 8 | 8 | 1 | 7 | 128 |
| 44 | 29 | 1024 | 8 | 8 | 1 | 7 | 256 |
- Jos LUMIin lähetetty työ vaatii yli 1024 solmua, resurssien varaamista varten on tehtävä erityinen hero run -hakemus.
Käytetään enemmän kuin simulaation tehokas vähimmäismäärä LUMI-resursseja
Simulaation suoritusaikaa on mahdollista nopeuttaa kasvattamalla resurssien määrää tehokkaan vähimmäissolmujen määrän yli, joka vastaa kaksinkertaisia statevector-muistivaatimuksia. Tällaisissa tapauksissa hajautettujen prosessien (MPI_Ranks) määrä ja varatut resurssit on harkittava huolellisesti. Blocking qubits tulee määrittää niin, ettei MPI-rankkeja ole enempää kuin välimuisteja. Työn enimmäissolmujen määrän arvioimiseksi alla olevat kaavat toimivat ohjeena.
Lisätietoja
- * LUMI Full Machine Runs
- LUMI Slurm binding options for MPI jobs
- LUMI quantum simulations with qiskit-aer — benchmarks across multiple QV depths
- Qiskit-Aer Running with multiple-GPUs and/or multiple nodes
- Qiskit-Aer AerSimulator API reference (blocking_qubits memory rule)
- Cache Blocking Technique to Large Scale Quantum Computing Simulation on Supercomputers
- Qiskit documentation
- Qiskit-aer documentation