Qibo
Qibo is an open-source middleware for quantum computing. An end-to-end open source platform for quantum simulation, self-hosted quantum hardware control, calibration and characterization. It has a comprehensive, flexible ecosystem of tools, libraries and community resources that lets researchers and users to quickly deploy quantum powered applications.
Qibo can run circuits in CPU and GPU backends.
IMPORTANT: If you make use of GPU queues, it is mandatory to select a minimum number of CPU cores given by 16 cores/GPU multiplied by the amount of nodes selected and the number of selected GPUs (16 cores/gpu * num. GPUs * num. nodes).
Usage
Example script : testQibo.sh
#!/bin/bash
#SBATCH -e qibo_test%j.err
#SBATCH -o qibo_test%j.msg
#SBATCH -p thin
#SBATCH -N 4
#SBATCH --ntasks-per-node=24
module load qibo/0.1.2
python qibo-test.py
Submit with :
sbatch --account=your_project_ID testQibo.sh
Example script : qibo-test.py
import numpy as np
from qibo import gates
from qibo.models import Circuit
import qibo
qibo.set_device("/CPU:0")
# Construct the circuit
c = Circuit(2)
# Add some gates
c.add(gates.H(0))
c.add(gates.H(1))
# Define an initial state (optional - default initial state is |00>)
initial_state = np.ones(4) / 2.0
# Execute the circuit and obtain the final state
result = c(initial_state) # c.execute(initial_state) also works
print(result.state())
# should print `tf.Tensor([1, 0, 0, 0])`
Qibo also runs Quantum circuits on GPUs with NVIDIA support via CuPy backend:
Example script : testQiboGPU.sh
#!/bin/bash
#SBATCH -e qibogpu-errors%j.err
#SBATCH -o qibogpu-infos%j.msg
#SBATCH -p hopper # H100 queue
#SBATCH -N 2
#SBATCH --gres=gpu:1 # launch in 1-GPUs
#SBATCH --cpus-per-task=32 # 16 cores por GPU * 1 GPU * 2 nodos
module load nvidia-hpc-sdk/24.5
module load qibo/0.2.12-gpu
nvcc --version
python test-qibogpu.py
Submit with :
sbatch --account=your_project_ID testQiboGPU.sh
Example script : test-qibogpu.py
# Minimize energy for the 6-qubits XXZ Heisenberg hamiltonian
# using VQE and Powell optimizer
import numpy as np
from qibo import models, gates, hamiltonians
import qibo
qibo.set_device("/GPU:0") # select GPU backend
nqubits = 6
nlayers = 1
# Create variational circuit
circuit = models.Circuit(nqubits)
for l in range(nlayers):
circuit.add((gates.RY(q, theta=0) for q in range(nqubits)))
circuit.add((gates.CZ(q, q+1) for q in range(0, nqubits-1, 2)))
circuit.add((gates.RY(q, theta=0) for q in range(nqubits)))
circuit.add((gates.CZ(q, q+1) for q in range(1, nqubits-2, 2)))
circuit.add(gates.CZ(0, nqubits-1))
circuit.add((gates.RY(q, theta=0) for q in range(nqubits)))
# Create XXZ Hamiltonian
hamiltonian = hamiltonians.XXZ(nqubits=nqubits)
# Create VQE model
vqe = models.VQE(circuit, hamiltonian)
# Optimize starting from a random guess for the variational parameters
initial_parameters = np.random.uniform(0, 2*np.pi, 2*nqubits*nlayers + nqubits)
best, params, extra = vqe.minimize(initial_parameters, method='Powell', compile=False)
print("Best value:", best)
print("Optimized params:", params)
print(extra)
More info :