Hyppää sisältöön

Docs CSC now features an automatic Finnish translation. Click here for more information.

Warning!

Puhti and Mahti will be decommissioned after Roihu becomes available. Users should clean up unnecessary files and move any required data by the end of August 2026. See the Roihu data preparation instructions for details.

Puhti scratch is very full: keep only active data there and move or delete everything else. No new Puhti scratch quota will be granted.

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ä. Jos etsit tietoa töiden ajamisesta fyysisillä kvanttitietokoneilla qiskitin avulla, katso tämä dokumentaatio: Kvanttitöiden ajaminen.

Uutiset

19.05.2026 qiskit/2.3.0 on asennettu singularity-konttiin LUMIin kaikkien tärkeimpien Qiskit-pakettien kanssa, ja tuki monisolmuiselle natiiville Cray MPI GPU -kiihdytykselle on lisätty, 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.

Saatavilla

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==1.1.1
qiskit-aer-gpu>=0.14.2
qiskit-algorithms==0.3.0
qiskit-dynamics==0.5.1
qiskit-experiments==0.7.0
qiskit-finance==0.4.1
qiskit-ibm-experiment==0.4.7
qiskit-machine-learning==0.7.2
qiskit-nature==0.7.2
qiskit-optimization==0.6.1
qiskit==1.1.1
qiskit-aer-gpu>=0.14.2
qiskit-algorithms==0.3.0
qiskit-dynamics==0.5.1
qiskit-experiments==0.7.0
qiskit-finance==0.4.1
qiskit-ibm-experiment==0.4.7
qiskit-machine-learning==0.7.2
qiskit-nature==0.7.2
qiskit-optimization==0.6.1
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 siitä, miten voit asentaa paketteja itse. Jos mielestäsi jokin tärkeä Qiskitiin liittyvä paketti pitäisi sisällyttää CSC:n tarjoamaan moduuliin, ota yhteyttä asiakastukeemme.

Kaikki moduulit perustuvat kontteihin, joissa käytetään Apptaineria (aiemmin tunnettu nimellä Singularity). Tarjolla on wrapper-skriptejä, jotta yleiset komennot kuten python, python3, pip ja pip3 toimivat normaalisti. Lisätietoja on kohdassa 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:

module load qiskit

Jos haluat käyttää tiettyä versiota (katso saatavilla olevat versiot yllä), käytä:

module load qiskit/1.1.1

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 yhdestä solmusta Puhdissa ja Mahdissa sekä kaikkien CPU/GPU-resurssien varaamiseen yhdestä solmusta LUMIn standard-g-osiosta:

#!/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>
#SBATCH --partition=gpusmall
#SBATCH --ntasks=1
#SBATCH --cpus-per-task=2
#SBATCH --time=1:00:00
#SBATCH --gres=gpu:a100: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 yhdessä solmussa. 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 processes
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 natiivia 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 solmun CPU-ytimiä. 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
## Here is an example sbatch script for a 38 qubit quantum volume simulation (myprog_MPI.py) using 16 nodes
#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

## LUST optimizations provided by HPE Cray
## Reference: https://lumi-supercomputer.github.io/LUMI-training-materials/2day-20251020/202-Binding/#mpi-network-adapter-binding-with-cray-mpich
## Reference: 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
## Here is an example sbatch script for a 38 qubit quantum volume simulation (myprog_MPI.py) using 16 nodes
#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

## LUST optimizations provided by HPE Cray
## Reference: https://lumi-supercomputer.github.io/LUMI-training-materials/2day-20251020/202-Binding/#mpi-network-adapter-binding-with-cray-mpich
## Reference: 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ä, jossa käytetään 38 kubittia ja jonka suosittelemme ajamaan 16 solmulla *katso viitteenä 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 processes
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 jokaisen lisätyn kubitin myötä. Oletusarvoisella 16 tavun (double) tarkkuudella LUMI tukee statevector-simulaatioita aina 34 kubittiin yhdessä solmussa 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 lohkokoko asetetaan blocking_qubits-parametrilla, jonka tulisi hyvän käytännön mukaan olla alle 25 % yhden GCD:n VRAM-muistista. LUMIssa tämä tarkoittaa, että blocking_qubits ei saisi olla suurempi kuin 29: double-tarkkuudella blocking_qubits = 29 tuottaa 8 GB:n lohkon (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 simulointiin 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 cache blocking -datan vaihtoon prosessien välillä. 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 ajon nopeammin; vaihtoehtoisesti voit simuloida saman määrän kubitteja noin puolella alla näytetyistä solmuista (ja käyttäen 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 jätettävä erityinen hero run -hakemus.

Enemmän kuin tehokas vähimmäismäärä LUMI-resursseja simulaatiolle

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 tulee harkita 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.

            Statevector memory required for n-qubits = precision*2^n
  Cache memory required for nc-cache-blocking-qubits = precision*2^nc

                                       Max MPI-ranks = (Statevector Memory)/(Cache Memory)
                                       Max MPI-ranks = (precision*2^n)/(precision*2^nc) = 2^(n-nc)

                                           Max Nodes = (Max MPI-Ranks)/(Tasks Per Node)

Lisätietoja

Suomenkielinen tekoälykäännös

Sisällössä voi esiintyä virheellistä tietoa tekoälykäännöksestä johtuen.

Klikkaa tästä antaaksesi palautetta