Skip to main content
IBM Quantum Platform

Voreinstellungen und Konfigurationsoptionen für die Transpilierung

  • Der Code auf dieser Seite wurde unter Berücksichtigung der folgenden Anforderungen entwickelt. Wir empfehlen die Verwendung dieser oder neuerer Versionen.

    qiskit[all]~=2.5.2
    qiskit-ibm-runtime~=0.47.0
    

Abstrakte Schaltungen müssen transpiliert werden, da QPUs eine begrenzte Anzahl von Basisgattern haben und keine beliebigen Operationen ausführen können. Der Transpiler hat die Aufgabe, beliebige Schaltungen so zu verändern, dass sie auf einer bestimmten QPU laufen können. Dazu werden die Schaltungen in die unterstützten Basisgatter übersetzt und bei Bedarf SWAP-Gatter eingeführt, so dass die Konnektivität der Schaltung mit der der QPU übereinstimmt.

Wie in Transpilieren mit Pass-Managern erläutert, können Sie einen Pass-Manager mit der Funktion generate_preset_pass_manager funktion erstellen und einen Schaltkreis oder eine Liste von Schaltkreisen an seine Ausführungsmethode übergeben, um sie zu transpilieren. Sie können generate_preset_pass_manager aufrufen und dabei nur die Optimierungsstufe und das Backend angeben und die Standardwerte für alle anderen Optionen verwenden. Sie können der Funktion auch zusätzliche Argumente übergeben, um die Transpilierung fein abzustimmen.


Grundlegende Verwendung ohne Parameter

In diesem Beispiel übergeben wir eine Schaltung und eine Ziel-QPU an den Transpiler, ohne weitere Parameter zu spezifizieren.

Erstellen Sie einen Schaltkreis und sehen Sie sich das Ergebnis an:

from qiskit import QuantumCircuit
from qiskit.circuit.library import grover_operator, DiagonalGate
from qiskit_ibm_runtime.fake_provider import FakeSherbrooke

# Create circuit to test transpiler on
oracle = DiagonalGate([1] * 7 + [-1])
qc = QuantumCircuit(3)
qc.h([0, 1, 2])
qc = qc.compose(grover_operator(oracle))

# Add measurements to the circuit
qc.measure_all()

# View the circuit
qc.draw(output="mpl")

Output:

Output of the previous code cell

Transpilieren Sie die Schaltung und betrachten Sie das Ergebnis:

from qiskit.transpiler import generate_preset_pass_manager

# Specify the QPU to target
backend = FakeSherbrooke()

# Transpile the circuit
pass_manager = generate_preset_pass_manager(
    optimization_level=1, backend=backend
)
transpiled_circ = pass_manager.run(qc)

# View the transpiled circuit
transpiled_circ.draw(output="mpl", idle_wires=False)

Output:

Output of the previous code cell

Alle verfügbaren Parameter

Nachfolgend finden Sie alle verfügbaren Parameter für die generate_preset_pass_manager funktion. Es gibt zwei Klassen von Argumenten: diejenigen, die das Ziel der Kompilierung beschreiben, und diejenigen, die beeinflussen, wie der Transpiler arbeitet.

Alle Parameter außer optimization_level sind optional. Weitere Einzelheiten finden Sie in der Transpiler-API-Dokumentation.

  • optimization_level (int) - Wie stark die Schaltkreise optimiert werden sollen. Ganzzahl im Bereich (0 - 3). Höhere Stufen führen zu optimierteren Schaltkreisen, allerdings auf Kosten einer längeren Umsetzungszeit. Weitere Informationen finden Sie unter Transpiler-Optimierungsstufe festlegen.

Parameter zur Beschreibung des Kompilierungsziels:

Diese Argumente beschreiben die Ziel-QPU für die Schaltkreisausführung, einschließlich Informationen wie die Kopplungskarte der QPU (die die Konnektivität der Qubits beschreibt), die von der QPU unterstützten Basisgatter und die Fehlerraten der Gatter.

Viele dieser Parameter sind unter Häufig verwendete Parameter für die Transpilation detailliert beschrieben.

  • Backend-Parameter - Wenn Sie backend angeben, müssen Sie weder target noch andere Backend-Optionen angeben. Wenn Sie target angeben, brauchen Sie auch backend oder andere Backend-Optionen nicht anzugeben.

    • backend (Backend) - Wenn dies gesetzt ist, kompiliert der Transpiler die Eingangsschaltung zu diesem Gerät. Wenn eine andere Option eingestellt ist, die sich auf diese Einstellungen auswirkt, wie z. B. coupling_map, überschreibt sie die Einstellungen von backend.
    • target (Ziel) - Ein Backend-Transpiler-Ziel. Normalerweise wird dies als Teil des Backend-Arguments angegeben, aber wenn Sie ein Target-Objekt manuell konstruiert haben, können Sie es hier angeben. Damit wird das Ziel von backend außer Kraft gesetzt.
    • backend_properties ( BackendProperties ) - Eigenschaften, die von einer QPU zurückgegeben werden, einschließlich Informationen über Gate-Fehler, Auslesefehler, Qubit-Kohärenzzeiten und so weiter. Suchen Sie eine QPU, die diese Informationen liefert, indem Sie backend.properties() ausführen.
    • timing_constraints (Dictstr[, int] | None) - Eine optionale Hardwarebeschränkung für die Auflösung der Befehlszeit. Diese Informationen werden von der QPU-Konfiguration bereitgestellt. Wenn die QPU keine Beschränkung für die Zuweisung der Befehlszeit hat, ist timing_constraints None und es wird keine Anpassung vorgenommen. Ein QPU könnte eine Reihe von Einschränkungen melden, nämlich:
      • granularity: Ein ganzzahliger Wert, der die minimale Impuls-Tor-Auflösung in Einheiten von dt angibt. Ein benutzerdefiniertes Impulsgatter sollte eine Dauer haben, die ein Vielfaches dieses Granularitätswertes ist.
      • min_length: Ein ganzzahliger Wert, der die minimale Impuls-Torlänge in Einheiten von dt angibt. Ein benutzerdefiniertes Impulstor sollte länger als diese Länge sein.
      • pulse_alignment: Ein ganzzahliger Wert, der die zeitliche Auflösung der Startzeit des Gate-Befehls angibt. Gate-Anweisungen sollten zu einem Zeitpunkt beginnen, der ein Vielfaches dieses Wertes ist.
      • acquire_alignment: Ein ganzzahliger Wert, der die zeitliche Auflösung der Startzeit der Messanweisung angibt. Der Messauftrag sollte zu einem Zeitpunkt beginnen, der ein Vielfaches dieses Wertes ist.
    • basis_gates ( [Liststr] | None) - Liste der Namen der Basistore, zu denen abgewickelt werden soll. Zum Beispiel [„ u1 “, „ u2 “, „ u3 “, „cx“]. Wenn None, nicht abrollen.
    • coupling_map ( CouplingMap | List[ [Listint] ]) - Gerichtete Kopplungskarte (möglicherweise benutzerdefiniert) zum Ziel im Mapping. Wenn die Kopplungskarte symmetrisch ist, müssen beide Richtungen angegeben werden. Diese Formate werden unterstützt:
      • CouplingMap instanz
      • Liste - muss als Adjazenzmatrix angegeben werden, wobei jeder Eintrag alle gerichteten Zwei-Qubit-Wechselwirkungen angibt, die von der QPU unterstützt werden. Zum Beispiel: [[0, 1], [0, 3], [1, 2], [1, 5], [2, 5], [4, 1], [5, 3] ]
    • inst_map ( [ListInstructionScheduleMap] | None) - Zuordnung von Schaltkreisoperationen zu Impulszeitplänen. Wenn None, wird die instruction_schedule_map der QPU verwendet.

Parameter, die die Funktionsweise des Transpilers beeinflussen

Diese Parameter wirken sich auf bestimmte Stufen der Umsetzung aus. Einige von ihnen können sich auf mehrere Stufen auswirken, wurden aber der Einfachheit halber nur unter einer Stufe aufgeführt. Wenn Sie ein Argument angeben, z. B. initial_layout für die zu verwendenden Qubits, hat dieser Wert Vorrang vor allen Übergängen, die ihn ändern könnten. Mit anderen Worten: Der Transpiler wird nichts ändern, was Sie manuell angeben. Einzelheiten zu den einzelnen Stufen finden Sie unter Transpiler-Stufen.

    • hls_config (HLSConfig) - Eine optionale Konfigurationsklasse HLSConfig , die direkt an den HighLevelSynthesis Transformationspass übergeben wird. Mit dieser Konfigurationsklasse können Sie die Listen der Synthesealgorithmen und deren Parameter für verschiedene High-Level-Objekte festlegen.
    • init_method (str) - Der Plugin-Name, der für die Initialisierungsphase verwendet werden soll. Standardmäßig wird ein externes Plugin nicht verwendet. Sie können eine Liste der installierten Plugins anzeigen, indem Sie list_stage_plugins() mit init für das Argument stage name ausführen.
    • unitary_synthesis_method (str) - Der Name der zu verwendenden unitären Synthesemethode. Standardmäßig wird default verwendet. Sie können eine Liste der installierten Plugins sehen, indem Sie unitary_synthesis_plugin_names() aufrufen.
    • unitary_synthesis_plugin_config (dict) - Ein optionales Konfigurationswörterbuch, das direkt an das unitäre Synthese-Plugin übergeben wird. Standardmäßig hat diese Einstellung keine Auswirkung, da die standardmäßige unitäre Synthesemethode keine benutzerdefinierte Konfiguration erfordert. Die Anwendung einer benutzerdefinierten Konfiguration sollte nur notwendig sein, wenn ein unitäres Synthese-Plugin mit dem Argument unitary_synthesis angegeben wird. Da dies für jedes Unitary Synthesis Plugin individuell ist, lesen Sie bitte in der Dokumentation des Plugins nach, wie Sie diese Option verwenden.
    • initial_layout (Layout | Dict | List) – Ausgangsposition virtueller Qubits auf physikalischen Qubits. Wenn dieses Layout den Schaltkreis mit den coupling_map Einschränkungen kompatibel macht, wird es verwendet. Das endgültige Layout muss nicht unbedingt identisch sein, da der Transpiler Qubits durch Vertauschungen oder andere Maßnahmen umordnen kann. Ausführliche Informationen finden Sie im Abschnitt „Anfängliches Layout “.
    • layout_method (str) - Name des Layout-Auswahldurchgangs (default, dense, sabre und trivial). Dies kann auch der Name des externen Plugins sein, das für die Layoutphase verwendet werden soll. Sie können eine Liste der installierten Plugins anzeigen, indem Sie list_stage_plugins() mit layout für das Argument stage_name ausführen. Der Standardwert ist sabre.
    • routing_method (str) - Name des Routing-Passes (basic, lookahead, default, sabre, oder none). Dies kann auch der Name des externen Plugins sein, das für die Routing-Stufe verwendet wird. Sie können eine Liste der installierten Plugins anzeigen, indem Sie list_stage_plugins() mit routing für das Argument stage_name ausführen. Der Standardwert ist sabre.
    • translation_method (str) - Name des Übersetzungsdurchgangs (default, synthesis, translator, ibm_backend, ibm_dynamic_circuits, ibm_fractional) Dies kann auch der Name des externen Plugins sein, das für die Übersetzungsphase verwendet wird. Sie können eine Liste der installierten Plugins anzeigen, indem Sie list_stage_plugins() mit translation für das Argument stage_name ausführen. Der Standardwert ist translator.
    • approximation_degree (Float, im Bereich 0-1 | None) - Heuristische Wahl, die für die Annäherung an den Stromkreis verwendet wird ( 1.0 = keine Annäherung, 0.0 = maximale Annäherung). Der Standardwert ist 1,0. Durch die Angabe von None wird der Näherungsgrad auf die gemeldete Fehlerquote eingestellt. Weitere Einzelheiten finden Sie im Abschnitt Annäherungsgrad.
    • optimization_method (str) - Der Name des Plugins, das für die Optimierungsphase verwendet werden soll. Standardmäßig wird ein externes Plugin nicht verwendet. Sie können eine Liste der installierten Plugins anzeigen, indem Sie list_stage_plugins() mit optimization für das Argument stage_name ausführen.
    • scheduling_method (str) - Name des Zeitplanungsdurchlaufs. Dies kann auch der Name des externen Plugins sein, das für die Planungsphase verwendet wird. Sie können eine Liste der installierten Plugins anzeigen, indem Sie list_stage_plugins() mit scheduling für das Argument stage_name ausführen.
      • so bald wie möglich": Anweisungen so früh wie möglich auf einer Qubit-Ressource einplanen (alias: asap).
      • 'as_late_as_possible': Anweisungen spät einplanen, d.h. Qubits im Grundzustand halten, wenn möglich (alias: alap). Dies ist die Standardeinstellung.
    • seed_transpiler (int) - Setzt zufällige Seeds für die stochastischen Teile des Transpilers.

Die folgenden Standardwerte werden verwendet, wenn Sie keinen der oben genannten Parameter angeben. Weitere Informationen finden Sie in der API-Referenzseite der Methode:

generate_preset_pass_manager(
    optimization_level=1,
    backend=None,
    target=None,
    basis_gates=None,
    coupling_map=None,
    initial_layout=None,
    layout_method=None,
    routing_method=None,
    translation_method=None,
    scheduling_method=None,
    approximation_degree=1.0,
    seed_transpiler=None,
    unitary_synthesis_method="default",
    unitary_synthesis_plugin_config=None,
    hls_config=None,
    init_method=None,
    optimization_method=None,
)

Output:

<qiskit.transpiler.passmanager.StagedPassManager at 0x1403cd250>

Nächste Schritte

Empfehlungen
War diese Seite hilfreich?
Melden Sie auf GitHub einen Fehler, einen Tippfehler oder fordern Sie Inhalte an.