In contrast to a backend configuration that remains static on the timescale of typical experiments, the properties of a backend are dynamical quantities that update at device calibration. Devices are nominally calibrated once over a 24-hour period, and the backend properties update once this calibration sequence is complete. The properties play a critical role in quantum circuit execution, as the parameters within the properties are utilized for noise-aware circuit mapping and optimization (transpilation). Additionally, backend properties are used for constructing noise models of a device for use in classical simulation techniques.
You can most easily obtain a quantum system’s properties with Qiskit, but you can also obtain them by downloading the “calibrations” CSV file for a given system on IBM Quantum Experience.
backend name -
backend.properties().backend_namegives the name of the system.
backend version -
backend.properties().backend_versionspecifies the version of the system, as described in the Backend versioning section.
last update date -
backend.properties().last_update_dategives the UTC time at which the properties information was last updated. This is the time at which the full properties file was returned from the device. Individual elements in the properties give the times at which they were computed. Depending on the device calibration schedule, these times can be markedly different than the last update date.
backend.properties().qubitscontains information on the physical attributes of the qubits. This includes the qubit frequency in GHz, T1 and T2 times in µs, and readout error. As shown below, the readout_error is further partitioned into
prob_meas1_prep0, indicating the probability of preparing a given computational basis state, but measuring the orthogonal state. The readout error is taken to be the average of these two values. Note that
prob_meas0_prep1is usually the dominant factor in the readout error due to relaxation during the measurement process. The qubits field is a list indexed by the qubit number.
[Nduv('2020-06-05T08:59:55Z', T1, µs, 72.75657779304275), Nduv('2020-06-05T09:01:05Z', T2, µs, 131.16634823903556), Nduv('2020-06-05T10:16:38Z', frequency, GHz, 4.968918179746842), Nduv('2020-06-05T08:55:52Z', readout_error, , 0.016666666666666607), Nduv('2020-06-05T08:55:52Z', prob_meas0_prep1, , 0.030000000000000027), Nduv('2020-06-05T08:55:52Z', prob_meas1_prep0, , 0.0033333333333333335)]
We see that each qubit parameter is expressed as an
Nduv(name, date, unit value) object containing the UTC time at which the parameter was updated, the parameter name, parameter units, and the actual numerical parameter value.
backend.properties().gatesgives detailed information on each gate that the system supports executing. For every single-qubit gate listed in the system basis gates, there exists an entry in the properties that gives the details of that gate, for each qubit on which the gate can be applied. Each entry is in the form of a
Gate(gate='u2', name='u2_0', parameters=[Nduv('2020-06-06T09:06:46Z', gate_error, , 0.00022436814887248838), Nduv('2020-06-06T10:03:18Z', gate_length, ns, 35.55555555555556)], qubits=)
and lists the kind of gate (
u2in the example), its name, a list specifying the qubits on which the gate acts, and a
[Nduv('2020-06-06T09:06:46Z', gate_error, , 0.00022436814887248838), Nduv('2020-06-06T10:03:18Z', gate_length, ns, 35.55555555555556)]
Nduvobjects specifying the gate error and gate length.
The same holds for multi-qubit gates, where there is an entry for each directed edge in the system coupling map. For symmetric coupling maps, the directionality of the underlying gate is still important. For example,
Gate(gate='cx', name='cx3_4', parameters=[Nduv('2020-06-06T10:03:18Z', gate_error, , 0.009793933588297388), Nduv('2020-06-06T10:03:18Z', gate_length, ns, 327.1111111111111)], qubits=[3, 4])
Gate(gate='cx', name='cx4_3', parameters=[Nduv('2020-06-06T10:03:18Z', gate_error, , 0.009793933588297388), Nduv('2020-06-06T10:03:18Z', gate_length, ns, 362.66666666666663)], qubits=[4, 3])