Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save blakejohnson/9d0d7aa8c50350f869ed3eeca185f8f0 to your computer and use it in GitHub Desktop.
Save blakejohnson/9d0d7aa8c50350f869ed3eeca185f8f0 to your computer and use it in GitHub Desktop.
A look at the effects of various compiler options on the performance of Bernstein-Vazirani on ibmq_jakarta
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"from qiskit import *\n",
"from qiskit import IBMQ\n",
"from qiskit.tools.monitor import job_monitor\n",
"import matplotlib.pyplot as plt\n",
"\n",
"%matplotlib inline"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"IBMQ.load_account()\n",
"\n",
"# lagos is down this morning, so we will look at jakarta instead, which is a QV16 processor (lagos is QV32)\n",
"provider = IBMQ.get_provider(hub='ibm-q-internal', group='deployed', project='default')\n",
"backend = provider.backend.ibmq_jakarta"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# BV Benchmark"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"These functions are grabbed from the QED-C application benchmark code at: \n",
"https://github.com/SRI-International/QC-App-Oriented-Benchmarks/blob/master/bernstein-vazirani/qiskit/bv_benchmark.py\n",
"\n",
"I've simplified the `bernstein_vazirani` method by removing the mid-circuit measurement version"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"def create_oracle(num_qubits, input_size, secret_int):\n",
" # Initialize first n qubits and single ancilla qubit\n",
" qc = QuantumCircuit(num_qubits, name=f\"Uf\")\n",
"\n",
" # perform CX for each qubit that matches a bit in secret string\n",
" s = ('{0:0' + str(input_size) + 'b}').format(secret_int)\n",
" for i_qubit in range(input_size):\n",
" if s[input_size - 1 - i_qubit] == '1':\n",
" qc.cx(i_qubit, input_size)\n",
" return qc\n",
"\n",
"\n",
"def bernstein_vazirani(num_qubits, secret_int):\n",
" \n",
" # size of input is one less than available qubits\n",
" input_size = num_qubits - 1\n",
"\n",
" # setup circuit\n",
" qc = QuantumCircuit(num_qubits, input_size, name=\"main\")\n",
"\n",
" # put ancilla in |1> state\n",
" qc.x(input_size)\n",
"\n",
" # start with Hadamard on all qubits, including ancilla\n",
" for i_qubit in range(num_qubits):\n",
" qc.h(i_qubit)\n",
"\n",
" qc.barrier()\n",
"\n",
" # generate Uf oracle\n",
" Uf = create_oracle(num_qubits, input_size, secret_int)\n",
" qc.append(Uf, range(num_qubits))\n",
"\n",
" qc.barrier()\n",
"\n",
" # Hadamard again on all non-ancilla qubits,\n",
" for i_qubit in range(input_size):\n",
" qc.h(i_qubit)\n",
"\n",
" qc.barrier()\n",
"\n",
" # measure all data qubits\n",
" for i in range(input_size):\n",
" qc.measure(i, i)\n",
"\n",
" return qc"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAkMAAAExCAYAAAB/O6bMAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nO3de1wU9f4/8NcuIKB4Q1IUI0VQAbkoaHosd00r07RSJD3KLzVDEeukXbTwkmneDoqXk5aeLmZ5TMDUEks7wWpHU/FS3jEvBzFS8pKicl1+f/B1j5vILrQzn9mZ1/Px6PHAYWbnxfvBwKuZYVZXUVFRASIiIiKN0osOQERERCQSyxARERFpGssQERERaRrLEBEREWkayxARERFpGssQERERaRrLEBEREWkayxARERFpGssQERERaRrLEBEREWkayxARERFpGssQERERaRrLEBEREWkayxARERFpGssQERERaRrLEBEREWkayxARERFpGssQERERaRrLEBEREWkayxARERFpmqvoAET2OH78uM11/vGPf2D8+PHVrtO+fXtHRVItzlo+nDWRMvDMEKnGu+++KzqCZnDW8uGsiaTHMkRERESaxjJEREREmsYyRKqRlpYmOoJmcNby4ayJpMcyRERERJrGMkSqERMTIzqCZnDW8uGsiaTHP623YX02cP6KmH37NQYGRovZN9nvxHfA9Yvy77d+U6DdI/LvVyRRx6PWjsWXX34ZBw8eFLLvyMhILFq0SMi+SbtYhmw4fwU4JeAXHTmP6xeBq3miU2gDj0d5HDx4ECaTSXQMItnwMhmpRmJiougImsFZy4ezJpIeyxCphq2n9JLjcNby4ayJpMcyRKrRo0cP0RE0g7OWD2dNJD2WIVKNgoIC0RE0g7OWD2dNJD2WISIiItI0liFSjZCQENERNIOzlg9nTSQ9/mk9qUZ6erroCJrBWcvHGWZdv359PPTQQ4iOjkarVq3g4uKCy5cv48CBA9i5cydOnTp11zYBAQH4/PPP8dxzz+Ho0aMCUhP9D88MkWpMmzZNdATN4Kzlo+RZt27dGsuXL8cvv/yCjIwMvP322xg1ahSee+45TJgwAZ988gl+/vlnZGZmYsCAAZbtAgICkJmZiejoaMycOVPgV0BUSdFlyGw2Izk5GUFBQfDw8EBERARMJhPa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\n",
"text/plain": [
"<Figure size 748.797x385.28 with 1 Axes>"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# the resulting circuits look like you would expect\n",
"bv_circuit = bernstein_vazirani(5, int('1101', 2))\n",
"bv_circuit.draw(output='mpl')"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'1101': 1}"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# let's quickly verify that our circuits operates as intended by running against a simulator\n",
"from qiskit.providers.aer import QasmSimulator\n",
"sim_backend = QasmSimulator()\n",
"\n",
"sim_job = sim_backend.run(transpile(bv_circuit, sim_backend), shots=1)\n",
"sim_result = sim_job.result()\n",
"sim_result.get_counts()"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [],
"source": [
"# Which matches the oracle we chose."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 5-qubit circuits"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [],
"source": [
"# Now, let's try running against hardware. In the Q-CTRL blog post they compare results for the most difficult\n",
"# oracle, which is the \"all 1\" oracle.\n",
"# First, we try with the default compilation options, which corresponds to optimization_level=1:\n",
"bv_circuit = bernstein_vazirani(5, int('1111', 2))\n",
"bv_transpiled = transpile(bv_circuit, backend=backend)\n",
"\n",
"job1 = backend.run(bv_transpiled, shots=1024)"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.255859375"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"job_opt_level1_counts = job1.result().get_counts()\n",
"\n",
"# giving the success probability of\n",
"job_opt_level1_counts['1111'] / 1024"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [],
"source": [
"# The Q-CTRL blog post reported about 0.05 success probability with this oracle, so we already have a gap.\n",
"# But, can we do better still using IBM's default gates? It turns out we can by using compiler options.\n",
"# We can start by just increasing the optimization level (default is 1).\n",
"bv_transpiled = transpile(bv_circuit, backend=backend, optimization_level=3)\n",
"\n",
"job2 = backend.run(bv_transpiled, shots=1024)"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.427734375"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"job_opt_level3_counts = job2.result().get_counts()\n",
"\n",
"# giving the success probability of\n",
"job_opt_level3_counts['1111'] / 1024"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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qrfDBTAQaXKUBImIiDSSTVerRXwizGN/CtO+JV6kJEhERKSRPE/OwnWiJuI1VZMgnbaK9zT4mSARERGpdF2rOC5u0QKALhERAY5GpOm4L6kN34uLBzQSJN6lJEhERKSREmw2Emz6J1XE29qGh9M2PDzQYUgT5JcjdkpKij+KqVFYmH/j8Hd5gSpTQo/6SeiJjo52v1abiYiIeI9urhQRERERkWZFSZCIiIiIiDQrSoJERERERKRZURIkIiIiIiLNipIgERERERFpVoImCercuTMtWrQgOjoaq9WKzWYjOjqalJQUfvSjH1FcXBzoEEVEvK6uY98///lPysrKAh2iiIhIkxM0SRDA0qVLKS4upm3btnTs2JFp06aRmZnJ9u3bmTNnTqDDExHxidqOfdnZ2axevTrQ4YmIiDQ5QfnLblarlUGDBpGZmUlKSgrXXnstixYtok2bNgBMmzYtwBGKiHif69jnOt4ZhsGuXbtITEzUcU9ERMSLgmokyMXhcLBlyxa6d+/O4cOHycjIICkpKdBhiYj4lOvYl5SURH5+PidPniQmJibQYYmIiDQ5QTUSdNNNN2EYBsXFxVitVl577TVeeOEFrrzySq666qpAhyci4hPVj31Hjhxh7dq1tGrVij59+gQ6PBERkSYnqEaCFi1aRFFREcnJycTFxbF9+3bWrFnDnj17KCkpCXR4IiI+Uf3YN2PGDKZMmUJ5eTm9evVi6NChgQ5RRESkSQmqJMglMjKSa665hunTpzNy5Ehuv/125s2bx4svvsjjjz9O9+7dSUtLo0OHDjz//POBDldExCtcx77FixfTvXt3Onbs6D72tWvXTsc+ERERLwnKJAhgwoQJrFq1iszMTGbOnIndbmfIkCH07t2bL7/8kjlz5jB27FimTJkS6FBFRLxmwoQJ7N27l8OHD9OrVy/3sW/cuHE69omIiHhJ0CZBcXFx3H333Tz55JO0bt2anj17kpGRwS233MLWrVt55ZVXWLBgAVarNdChioh4TVxcHIMGDWLlypVERka6j30LFizQsU9ERMRLgmZihKysrO+8dk2GsHXrViIjI/nVr37FkSNHWLhwIS+99BI2W9CELyLSIDUd+z7//HMAli9f7j72ffbZZzr2iYiIeEnQjgR5Gj9+PMePH2fBggW8+OKL7N27l6uvvlq/myEiTdratWvdx74rrrhC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\n",
"text/plain": [
"<Figure size 1008x460.8 with 1 Axes>"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Which is already a nice boost. It turns out that we can stil do a lot better because\n",
"# Bernstein-Vazirani is a very sparse circuit, where qubits have long idle periods.\n",
"# Consequently, dynamical decoupling can echo away static ZZ errors during those idling\n",
"# periods.\n",
"\n",
"# Qiskit makes it easy to add dynamical decoupling to a circuit. First we need a couple\n",
"# more imports\n",
"from qiskit.transpiler import PassManager, InstructionDurations\n",
"from qiskit.transpiler.passes import ALAPSchedule, DynamicalDecoupling\n",
"from qiskit.visualization import timeline_drawer\n",
"from qiskit.circuit.library import XGate\n",
"\n",
"# and then we set up a pass manager to add the decoupling pulses\n",
"durations = InstructionDurations.from_backend(backend)\n",
"dd_sequence = [XGate(), XGate()]\n",
"pm = PassManager([ALAPSchedule(durations),\n",
" DynamicalDecoupling(durations, dd_sequence)])\n",
"\n",
"# transpile and view the resulting schedule\n",
"circ_dd = pm.run(bv_transpiled)\n",
"timeline_drawer(circ_dd)"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [],
"source": [
"job3 = backend.run(circ_dd, shots=1024)"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.654296875"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"job_decoupled_counts = job3.result().get_counts()\n",
"\n",
"# giving the success probability of\n",
"job_decoupled_counts['1111'] / 1024"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [],
"source": [
"# So, with roughly 4 lines of code we have found a big boost in the success probability.\n",
"\n",
"# A final optimization that is straightforward is to add measurement error migitation.\n",
"# This is now quite easy with the 'sampler' program in the Qiskit Runtime.\n",
"sampler_inputs = {\n",
" 'circuits': circ_dd,\n",
" 'run_config': {'shots': 1024},\n",
" 'skip_transpilation': True,\n",
" 'use_measurement_mitigation': True\n",
"}\n",
"job_runtime = provider.runtime.run(program_id='sampler',\n",
" options = {'backend_name': 'ibmq_jakarta'},\n",
" inputs=sampler_inputs)"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [],
"source": [
"# grab the quasiprobabilities from the sampler result\n",
"job_runtime_quasiprobabilities = job_runtime.result()[1][0]"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.7864368354771869"
]
},
"execution_count": 20,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"job_runtime_quasiprobabilities[hex(int('1111', 2))]"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# So, by using a higher optimization level, adding a dynamical decoupling pass, and enabling measurement\n",
"# error mitigation, we have increased the success probability from 0.25 to 0.78.\n",
"\n",
"# Note that Q-CTRL reported a success probability on lagos of about 0.55 with their custom gates on this\n",
"# size oracle."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 7-qubit circuits"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Nominally the largest improvement Q-CTRL saw was on 7-qubit circuits, so let's try the same optimizations there.\n",
"# Let's again find the baseline performance"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [],
"source": [
"bv_circuit = bernstein_vazirani(7, int('111111', 2))\n",
"bv_transpiled = transpile(bv_circuit, backend=backend)\n",
"\n",
"job_opt_level1 = backend.run(bv_transpiled, shots=1024)"
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.0107421875"
]
},
"execution_count": 33,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# success probability with default compiler options\n",
"job_opt_level1_counts = job_opt_level1.result().get_counts()\n",
"job_opt_level1_counts['111111'] / 1024"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [],
"source": [
"# Which corresponds well to what Q-CTRL saw of almost negligible success probability.\n",
"# Let's again the higher optimization level and dynamical decoupling\n",
"bv_transpiled = transpile(bv_circuit, backend=backend, optimization_level=3)\n",
"circ_dd = pm.run(bv_transpiled)\n",
"job_decoupled = backend.run(circ_dd, shots=1024)"
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.369140625"
]
},
"execution_count": 37,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# success probability\n",
"job_decoupled_counts = job_decoupled.result().get_counts()\n",
"job_decoupled_counts['111111'] / 1024"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {},
"outputs": [],
"source": [
"# which now looks very similar to Q-CTRL's reported success probability. Let's try to push further with\n",
"# measurement error mitigation\n",
"sampler_inputs = {\n",
" 'circuits': circ_dd,\n",
" 'run_config': {'shots': 1024},\n",
" 'skip_transpilation': True,\n",
" 'use_measurement_mitigation': True\n",
"}\n",
"job_runtime2 = provider.runtime.run(program_id='sampler',\n",
" options = {'backend_name': 'ibmq_jakarta'},\n",
" inputs=sampler_inputs)"
]
},
{
"cell_type": "code",
"execution_count": 40,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.49049535719641724"
]
},
"execution_count": 40,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"job_quasiprobabilities = job_runtime2.result()[1][0]\n",
"job_quasiprobabilities[hex(int('111111', 2))]"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# So, using built-in tooling we were able to raise the success probability from 0.01 to 0.49.\n",
"\n",
"# Note that the success probability reported by Q-CTRL for this same oracle was about 0.3."
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.4"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment