Zum Hauptinhalt springen

Circuit Cutting

Circuit Cutting ist eine Technik, um die Größe von Circuits zu erhöhen, die auf Quantenhardware ausgeführt werden können – auf Kosten eines zusätzlichen Sampling-Overheads. Dieses Addon implementiert diese Technik, bei der eine Handvoll Gates, Wires oder beides geschnitten werden, sodass kleinere Circuits entstehen, die besser für die Ausführung auf Hardware geeignet sind. Diese kleineren Circuits werden dann ausgeführt, und die Ergebnisse des ursprünglichen Circuits werden durch klassische Nachverarbeitung rekonstruiert. Der Trade-off besteht darin, dass die Gesamtanzahl der Shots um einen Faktor erhöht werden muss, der von der Anzahl und Art der vorgenommenen Schnitte abhängt (bekannt als Sampling-Overhead). Circuit Cutting kann außerdem verwendet werden, um Gates zwischen weit entfernten Qubits zu realisieren, die andernfalls einen großen SWAP-Overhead erfordern würden.

Wichtige Begriffe

  • Subcircuits: Die Menge der Circuits, die durch das Schneiden von Gates in einem QuantumCircuit und das anschließende Aufteilen der nicht verbundenen Qubit-Teilmengen in kleinere Circuits entstehen. Diese Circuits enthalten SingleQubitQPDGate-Objekte und werden verwendet, um jedes Subexperiment zu instanziieren.

  • Subexperiment: Ein Begriff, der die eindeutigen Circuit-Samples beschreibt, die einem Subcircuit zugeordnet sind und zur Ausführung an eine QPU gesendet werden.

Das Circuit-Cutting-Paket installieren

Es gibt drei Möglichkeiten, das Circuit-Cutting-Paket zu installieren: über PyPI, durch das Bauen aus dem Quellcode und durch die Ausführung in einer containerisierten Umgebung. Es wird empfohlen, diese Pakete in einer virtuellen Umgebung zu installieren, um die Trennung der Paketabhängigkeiten sicherzustellen.

Von PyPI installieren

Der einfachste Weg, das Paket qiskit-addon-cutting zu installieren, ist über PyPI:

pip install qiskit-addon-cutting

Aus dem Quellcode installieren

Hier klicken, um zu erfahren, wie du dieses Paket manuell installierst.

Um zu diesem Paket beizutragen oder es manuell zu installieren, klone zunächst das Repository:

git clone git@github.com:Qiskit/qiskit-addon-cutting.git

und installiere das Paket mit pip. Um die im Paket-Repository enthaltenen Tutorials ausführen zu können, installiere auch die Notebook-Abhängigkeiten. Installiere die dev-Abhängigkeiten, wenn du vorhast, im Repository zu entwickeln.

pip install tox notebook -e '.[notebook-dependencies,dev]'

Mit Docker verwenden

Das im Addon-Repository enthaltene Dockerfile kann verwendet werden, um ein Docker-Image zu bauen. Die enthaltene Datei compose.yaml ermöglicht die Verwendung des Docker-Images mit den folgenden Befehlen.

Hier klicken, um zu erfahren, wie du dieses Paket mit Docker verwendest.

git clone git@github.com:Qiskit/qiskit-addon-cutting.git
cd qiskit-addon-cutting
docker compose build
docker compose up
Hinweis

Wenn du podman und podman-compose anstelle von docker verwendest, lauten die Befehle:

podman machine start
podman-compose --podman-pull-args short-name-mode="permissive" build
podman-compose up

Sobald der Container läuft, solltest du eine Meldung ähnlich der folgenden sehen:

notebook_1  |     To access the server, open this file in a browser:
notebook_1 | file:///home/$USERNAME/.local/share/jupyter/runtime/jpserver-7-open.html
notebook_1 | Or copy and paste one of these URLs:
notebook_1 | http://e4a04564eb39:8888/lab?token=00ed70b5342f79f0a970ee9821c271eeffaf760a7dcd36ec
notebook_1 | or http://127.0.0.1:8888/lab?token=00ed70b5342f79f0a970ee9821c271eeffaf760a7dcd36ec

Die letzte URL in dieser Meldung gibt dir Zugriff auf die Jupyter-Notebook-Oberfläche.

Darüber hinaus enthält das Home-Verzeichnis ein Unterverzeichnis namens persistent-volume. Alle Arbeiten, die du speichern möchtest, solltest du in diesem Verzeichnis ablegen, da es das einzige ist, das über verschiedene Container-Läufe hinweg erhalten bleibt.

Theoretischer Hintergrund

Beim Circuit-Cutting-Prozess gibt es zwei Arten von Schnitten: einen Gate- oder „raumartigen" Schnitt, bei dem ein Schnitt durch ein Gate verläuft, das auf zwei (oder mehr) Qubits wirkt, und einen Wire- oder „zeitartigen" Schnitt, der direkt durch eine Qubit-Wire verläuft (im Wesentlichen ein einzelnes Qubit-Identity-Gate, das in zwei Teile geschnitten wurde).

Das folgende Diagramm zeigt ein Beispiel für das Schneiden von Gates, sodass der Circuit in zwei kleinere Teile mit weniger Qubits aufgeteilt werden kann.

Diagramm des Gate Cutting: ein größerer Circuit wird in zwei kleinere Circuits mit den Bezeichnungen „A" und „B" geschnitten

Bei der Vorbereitung eines Circuit-Cutting-Workflows sind drei Szenarien zu berücksichtigen, die sich um die Verfügbarkeit klassischer Kommunikation zwischen den Circuit-Ausführungen drehen. Das erste ist der Fall, in dem nur lokale Operationen (LO) verfügbar sind, während die anderen beiden klassische Kommunikation zwischen Ausführungen einführen, bekannt als lokale Operationen und klassische Kommunikation (LOCC). Die LOCC-Szenarien werden dann entweder in eine zeitnahe, unidirektionale Kommunikation zwischen Circuit-Ausführungen oder in eine Echtzeit-, bidirektionale Kommunikation eingeteilt (wie sie beispielsweise in einer Multi-QPU-Umgebung vorkommen kann).

Obwohl Circuit Cutting verwendet werden kann, um Quantum Circuits auszuführen, die größer sind als auf aktuell verfügbarer Hardware möglich, ist dies mit Kosten verbunden. Da die Technik als Quasi-Wahrscheinlichkeits-Zerlegungsproblem (QPD) formuliert werden kann, ist ein exponentieller Sampling-Overhead erforderlich, um die Ergebnisse zu rekonstruieren. Dieser Overhead ist der Faktor, um den die Gesamtanzahl der Shots erhöht werden muss, damit die Quasi-Wahrscheinlichkeits-Zerlegung denselben Fehler ϵ\epsilon ergibt wie die Ausführung des ursprünglichen Circuits. Jedes geschnittene Gate trägt zu diesem Overhead bei, und die Höhe des hinzugefügten Overheads hängt vom Typ des geschnittenen Gates ab (weitere Details zum Sampling-Overhead findest du im letzten Anhang von [1]).

Zum Beispiel verursacht ein einzelner geschnittener CNOT-Gate einen Sampling-Overhead von 9 [2,6], und ein Circuit mit nn Wire Cuts verursacht einen Sampling-Overhead von O(16n)\mathcal{O}(16^n), wenn keine klassische Kommunikation verfügbar ist (das LO-Szenario). Dies reduziert sich auf O(4n)\mathcal{O}(4^n), wenn klassische Kommunikation verfügbar wird (LOCC-Szenario) [4]. Wire Cutting mit klassischer Kommunikation (LOCC) wird von diesem Paket jedoch nicht unterstützt.

Formal lässt sich das QPD-Problem des Circuit Cutting wie folgt ausdrücken:

U=iaiFi, \mathcal{U} = \sum_i a_i \mathcal{F}_i,

wobei U\mathcal{U} der Quantenkanal ist, der die gewünschte Operation implementiert, und jedes aia_i ein reeller Koeffizient ist, der einem Kanal Fi\mathcal{F}_i entspricht, der auf Hardware ausführbar ist.

Die Ergebnisse, die dem gewünschten Kanal U\mathcal{U} entsprechen, werden ermittelt, indem zunächst die Koeffizienten aia_i generiert, dann Subexperimente ausgeführt werden, um die Ergebnisse der verschiedenen Kanäle Fi\mathcal{F}_i zu erhalten, und schließlich die Erwartungswerte zu U\mathcal{U} rekonstruiert werden.

Ein kurzes Beispiel: Schneiden eines RZZGate

Als einfaches explizites Beispiel betrachten wir die Zerlegung eines geschnittenen RZZGate (Details sind in [2] zu finden). Ein Quantum Circuit, der einen RZZGate enthält, kann simuliert werden, indem sechs Subexperimente durchgeführt werden, bei denen der RZZGate durch reine Einzelqubit-Operationen ersetzt wurde (dies sind die Fi\mathcal{F}_i's aus der obigen Gleichung). Die Ergebnisse dieses Circuits werden rekonstruiert, indem die Ergebnisse jedes Subexperiments zusammen mit einem Satz von Koeffizienten kombiniert werden (die aia_i's aus der obigen Gleichung), die positiv oder negativ sein können.

Für einen gewählten θ\theta-Parameter des RZZGate sind die sechs Subexperimente wie folgt:

  1. Mit Koeffizient a1=cos2(θ/2)a_1 = \cos^2(\theta/2): nichts tun (III\otimes I)
  2. Mit Koeffizient a2=sin2(θ/2)a_2 = \sin^2(\theta/2): einen ZGate auf jedem Qubit ausführen (ZZZ\otimes Z)
  3. Mit Koeffizient a3=sin(θ)/2a_3 = -\sin(\theta)/2: eine projektive Messung in der ZZ-Basis auf dem ersten Qubit und ein SS auf dem zweiten ausführen (MzSM_z\otimes S). Wenn das Ergebnis der Messung 11 ist, das Vorzeichen des Beitrags dieses Ergebnisses bei der Rekonstruktion umkehren.
  4. Mit Koeffizient a4=sin(θ)/2a_4 = \sin(\theta)/2: eine projektive Messung in der ZZ-Basis auf dem ersten Qubit und ein SS^\dagger auf dem zweiten ausführen (MzSM_z\otimes S^\dagger). Wenn das Ergebnis der Messung 1 ist, das Vorzeichen des Beitrags dieses Ergebnisses bei der Rekonstruktion umkehren.
  5. Wie 3. (a5=a3a_5=a_3), aber die Qubits tauschen (SMzS\otimes M_z statt).
  6. Wie 4. (a6=a4a_6=a_4), aber die Qubits tauschen (SMzS^\dagger\otimes M_z statt).

Referenztabelle für den Sampling-Overhead

Die folgende Tabelle gibt den Sampling-Overhead-Faktor für eine Vielzahl von Zwei-Qubit-Anweisungen an, vorausgesetzt, dass nur eine einzelne Anweisung geschnitten wird.

AnweisungenKAK-ZerlegungswinkelSampling-Overhead-Faktor
CSGate, CSdgGate, CSXGate(π/8,0,0)\left(\pi/8, 0, 0\right)3+2(2)2.8283+2\sqrt(2) \approx 2.828
CXGate, CYGate, CZGate, GHGate, ECRGate(π/4,0,0)\left(\pi/4, 0, 0\right)32=93^2=9
iSwapGate, DCXGate(π/4,π/4,0)\left(\pi/4, \pi/4, 0\right)72=497^2 = 49
SwapGate(π/4,π/4,π/4)\left(\pi/4, \pi/4, \pi/4\right)72=497^2 = 49
RXXGate, RYYGate, RZZGate, RZXGate(θ/2,0,0,)\left(\lvert\theta/2\rvert, 0, 0, \right)(1+2sin(θ))2\left(1 + 2\lvert\sin(\theta)\rvert\right)^2
CRXGate, CRYGate, CRZGate, CPhaseGate(θ/4,0,0)\left(\lvert\theta/4\rvert, 0, 0\right)(1+2sin(θ/2))2\left(1 + 2\lvert\sin(\theta/2)\rvert\right)^2
XXPlusYYGate, XXMinusYYGate(θ/4,θ/4,0)\left(\vert\theta/4\rvert, \lvert\theta/4\rvert, 0\right)(1+4sin(θ/2)+2sin2(θ/2))2\left(1 + 4\lvert\sin(\theta/2)\rvert + 2\sin^2(\theta/2)\right)^2 (unabhängig von β\beta)
Move (Wire Cut im LO-Szenario)N/A42=164^2 = 16

Nächste Schritte

Referenzen

[1] Christophe Piveteau, David Sutter, Circuit knitting with classical communication, https://arxiv.org/abs/2205.00016

[2] Kosuke Mitarai, Keisuke Fujii, Constructing a virtual two-qubit gate by sampling single-qubit operations, https://arxiv.org/abs/1909.07534

[3] Kosuke Mitarai, Keisuke Fujii, Overhead for simulating a non-local channel with local channels by quasiprobability sampling, https://arxiv.org/abs/2006.11174

[4] Lukas Brenner, Christophe Piveteau, David Sutter, Optimal wire cutting with classical communication, https://arxiv.org/abs/2302.03366

[5] K. Temme, S. Bravyi, and J. M. Gambetta, Error mitigation for short-depth quantum circuits, https://arxiv.org/abs/1612.02058

[6] Lukas Schmitt, Christophe Piveteau, David Sutter, Cutting circuits with multiple two-qubit unitaries, https://arxiv.org/abs/2312.11638

[7] Jun Zhang, Jiri Vala, K. Birgitta Whaley, Shankar Sastry, A geometric theory of non-local two-qubit operations, https://arxiv.org/abs/quant-ph/0209120