I was trying to use qiskit with cuQuantum. And was able to build Qiskit Aer with cuQuantum without any errors, but cuStateVec is still not used for simulations.
When I pass the cuStateVec_enable=True
parameter in AerSimulator, I get an error.
sim = AerSimulator()
sim.set_options(method='statevector', device='GPU',cuStateVec_enable=True)
The Error -
Input In [9], in <cell line: 6>()
4
5 sim = AerSimulator()
----> 6 sim.set_options(method='statevector', device='GPU',cuStateVec_enable=True)
9
File ~/anaconda3/envs/qis1/lib/python3.8/site-packages/qiskit/providers/aer/backends/aerbackend.py:551, in AerBackend.set_options(self, **fields)
549 """Set the simulator options"""
550 for key, value in fields.items():
--> 551 self.set_option(key, value)
File ~/anaconda3/envs/qis1/lib/python3.8/site-packages/qiskit/providers/aer/backends/aer_simulator.py:644, in AerSimulator.set_option(self, key, value)
640 raise AerError(
641 "Invalid simulation method {}. Available methods"
642 " are: {}".format(value, self.available_methods()))
643 self._set_method_config(value)
--> 644 super().set_option(key, value)
645 if key in ["method", "noise_model", "basis_gates"]:
646 self._cached_basis_gates = self._basis_gates()
File ~/anaconda3/envs/qis1/lib/python3.8/site-packages/qiskit/providers/aer/backends/aerbackend.py:538, in AerBackend.set_option(self, key, value)
536 else:
537 if not hasattr(self._options, key):
--> 538 raise AerError("Invalid option %s" % key)
539 if value is not None:
540 # Only add an option if its value is not None
541 setattr(self._options, key, value)
AerError: 'Invalid option cuStateVec_enable'
But, if I pass cuStateVec_enable=True
in the execute()
method instead of passing it to AerSimulator(), the program runs without throwing an error. However, cuStateVec is never invoked.
result = execute(circuit,sim,shots=shots,seed_simulator=12345, cuStateVec_enable=True).result()
I tried running the following program - (taken from this medium article)
from qiskit import *
from qiskit.circuit.library import *
from qiskit.providers.aer import *
sim = AerSimulator()
sim.set_options(method='statevector', device='GPU')
qubits = 15
depth=10
shots = 10
circuit = QuantumVolume(qubits, depth, seed=0)
circuit.measure_all()
circuit = transpile(circuit, sim)
result = execute(circuit,sim,shots=shots,seed_simulator=12345, cuStateVec_enable=True).result()
metadata = result.to_dict()['results'][0]['metadata']
print(metadata)
if 'cuStateVec_enable' in metadata and metadata['cuStateVec_enable']:
print("cuStateVector is used for the simulation")
print("{0} qubits, Time = {1} sec".format(qubits,result.to_dict()['results'][0]['time_taken']))
counts = result.get_counts()
print(counts)
Here's the output -
{'parallel_state_update': 40, 'noise': 'ideal', 'batched_shots_optimization': False, 'measure_sampling': True, 'device': 'GPU',
'num_qubits': 15, 'parallel_shots': 1, 'remapped_qubits': False, 'method': 'statevector', 'active_input_qubits': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14], 'num_clbits': 15,
'input_qubit_map': [[14, 14], [13, 13], [12, 12], [11, 11], [10, 10], [9, 9], [8, 8], [7, 7], [6, 6], [1, 1], [0, 0], [2, 2], [3, 3], [4, 4], [5, 5]],
'fusion': {'time_taken': 0.001813286, 'applied': True, 'threshold': 14, 'max_fused_qubits': 5, 'method': 'unitary',
'parallelization': 1, 'enabled': True, 'cost_factor': 1.8}}
========================================================================
15 qubits, Time = 0.004057602 sec
{'010111001000001': 1, '011010000111101': 1, '100100010100111': 1, '011110101110001': 1, '101100010110011': 1, '000001110000100': 1, '001101110011000': 1, '001101110000100': 1, '101100010101010': 1, '100101001000001': 1}
And as evident from the metadata printed cuStateVec is never invoked. I have tried building qiskit-aer with cuQuantum multiple times in multiple conda environvemts and I don't get any errors while building. But every time I have the same issue.
What am I missing here? Any help would be appreciated.