Skip to main content
IBM Quantum Platform

Beispiel für die REST-API

Die Schritte in diesem Abschnitt beschreiben, wie Sie Workloads über die REST-API ausführen und konfigurieren, und zeigen, wie Sie diese in einem Programm Ihrer Wahl aufrufen können.

Note

In dieser Dokumentation wird das Modul requests „ Python “ verwendet, um die REST-API des „ IBM Quantum Compute “-Dienstes zu veranschaulichen. Dieser Workflow kann jedoch mit jeder Sprache oder jedem Framework ausgeführt werden, das die Arbeit mit REST-APIs unterstützt. Weitere Informationen finden Sie in der API-Referenzdokumentation.


1. Konto einrichten

Zunächst müssen Sie Ihr Konto einrichten. Anschließend können Sie das Gerät auswählen, auf dem Sie Ihre Berechnungen durchführen möchten.

Weitere Informationen zur Einrichtung Ihres Kontos, zur Anzeige der verfügbaren Backends und zur Verwendung von Tokens finden Sie unter „ IBM Quantum Platform mit der REST-API einrichten“.


2. Erstellen Sie eine QASM-Schaltung

Du benötigst mindestens einen Schaltkreis als Eingang für die Sampler-Primitive.

Definieren Sie einen QASM-Quantenschaltkreis:

qasm_string='''
OPENQASM 3;
include "stdgates.inc";
qreg q[2];
creg c[2];
x q[0];
cx q[0], q[1];
c[0] = measure q[0];
c[1] = measure q[1];
'''

Die folgenden Codeausschnitte gehen davon aus, dass in eine neue qasm_string Zeichenkette transpiliert resulting_qasm wurde.


3. Führen Sie den Quanten-Schaltkreis mithilfe der Sampler-API von V2 aus

Note

Die folgenden Jobs verwenden die Primitive „ IBM Quantum “ und „ V2 “. SamplerV2 nimmt einen oder mehrere primitive Unified Blocs (PUBs) als Eingabe entgegen. Jedes „ PUB “ ist ein Tupel, das einen Schaltkreis und die an diesen Schaltkreis gesendeten Daten enthält – wobei es sich um mehrere Parameter handeln kann – und gibt pro „ PUB “ ein Ergebnis zurück.

import requests

url = 'https://quantum.cloud.ibm.com/api/v1/jobs'
auth_id = "Bearer <YOUR_BEARER_TOKEN>"
crn = "<SERVICE-CRN>"
backend = "<BACKEND_NAME>"

headers = {
    'Content-Type': 'application/json',
    'Authorization':auth_id,
    'Service-CRN': crn
    }
job_input = {
    'program_id': 'sampler',
    "backend": backend,
    "params": {
        # primitive unified blocs (PUBs) containing one circuit each:
        "pubs": [[resulting_qasm],[resulting_qasm,None,500]] 
}}

response = requests.post(url, headers=headers, json=job_input)

if response.status_code == 200:
    job_id = response.json().get('id')
    print("Job created:",response.text)
else:
    print(f"Error: {response.status_code}")

4. Auftragsstatus prüfen und Ergebnisse abrufen

Geben Sie anschließend die job_id an die API weiter:

response_status_singlejob= requests.get(url+'/'+job_id, headers=headers)
response_status_singlejob.json().get('state')

Ausgabe

>>> Job ID: 58223448-5100-4dec-a47a-942fb30edced
>>> Job Status: JobStatus.RUNNING

Ergebnisse anzeigen:

response_result= requests.get(url+'/'+job_id+'/results', headers=headers)

res_dict=response_result.json()

# Get results for the first PUB
counts=res_dict['results'][0]['data']['c']['samples']

print(counts[:20])

Ausgabe

['0x3', '0x0', '0x2', '0x1', '0x0', '0x3', '0x0', '0x3', '0x1', '0x2', '0x2', '0x0', '0x2', '0x0', '0x3', '0x3', '0x2', '0x0', '0x1', '0x0']

5. Arbeiten mit den Optionen des „ IBM Quantum “-Compute-Dienstes

Mithilfe von Techniken zur Fehlerminderung können Benutzer Schaltungsfehler minimieren, indem sie das Rauschen des Bausteins zum Zeitpunkt der Ausführung modellieren. Dies führt in der Regel zu einem Aufwandsaufwand bei der Quantenvorverarbeitung im Zusammenhang mit dem Modelltraining sowie zu einem Aufwandsaufwand bei der klassischen Nachbearbeitung, um Fehler in den Rohdaten mithilfe des generierten Modells zu beheben.

Die in die Primitive integrierten Techniken zur Fehlerminderung stellen erweiterte Optionen zur Ausfallsicherheit dar. Um diese Optionen festzulegen, verwenden Sie bei der Übermittlung Ihres Auftrags die resilience_level Option. Der Sampler „ V2 “ unterstützt keine Festlegung von Ausfallsicherheitsstufen. Sie können jedoch einzelne Methoden zur Fehlerminderung bzw. -unterdrückung aktivieren oder deaktivieren.

Die folgenden Beispiele veranschaulichen die Standardoptionen für dynamische Entkopplung und Twirling. Weitere Optionen und Details finden Sie im Abschnitt „Techniken zur Fehlerminderung und -unterdrückung “.

Dynamische Entkopplung

import requests

url = 'https://quantum.cloud.ibm.com/api/v1/jobs'
auth_id = "Bearer <YOUR_BEARER_TOKEN>"
crn = "<SERVICE-CRN>"
backend = "<BACKEND_NAME>"

headers = {
    'Content-Type': 'application/json',
    'Authorization':auth_id,
    'Service-CRN': crn
    }
job_input = {
    'program_id': 'sampler',
    "backend": backend,
    "params": {
        # primitive unified blocs (PUBs) containing one circuit each:
        "pubs": [[resulting_qasm]], 
        "options": {
            "dynamical_decoupling": {
                "enable": True,
                "sequence_type": 'XpXm',
                "extra_slack_distribution": 'middle',
                "scheduling_method": 'alap',
            },
        },
    }
}

response = requests.post(url, headers=headers, json=job_input)

if response.status_code == 200:
    job_id = response.json().get('id')
    print("Job created:",response.text)
else:
    print(f"Error: {response.status_code}")

Wirbeln

import requests

url = 'https://quantum.cloud.ibm.com/api/v1/jobs'
auth_id = "Bearer <YOUR_BEARER_TOKEN>"
crn = "<SERVICE-CRN>"
backend = "<BACKEND_NAME>"

headers = {
    'Content-Type': 'application/json',
    'Authorization':auth_id,
    'Service-CRN': crn
    }
job_input = {
    'program_id': 'sampler',
    "backend": backend,
    "params": {
        # primitive unified blocs (PUBs) containing one circuit each:
        "pubs": [[resulting_qasm]], 
        "options": {
            "twirling": {
                "enable_gates": True,
                "enable_measure": True,
                "num_randomizations": "auto",
                "shots_per_randomization": "auto",
                "strategy": "active-accum",
                },
        },
    }
}

response = requests.post(url, headers=headers, json=job_input)

if response.status_code == 200:
    job_id = response.json().get('id')
    print("Job created:",response.text)
else:
    print(f"Error: {response.status_code}")

Parametrisierte Schaltungen

1. Konto einrichten

Zunächst müssen Sie Ihr Konto einrichten. Anschließend können Sie das Gerät auswählen, auf dem Sie Ihre Berechnungen durchführen möchten.

In diesem Abschnitt erfahren Sie, wie Sie Ihr Konto einrichten, verfügbare Backends anzeigen und Tokens ungültig machen können.

2. Parameter festlegen

import requests
import qiskit_ibm_runtime
from qiskit_ibm_runtime import QiskitRuntimeService
from qiskit.transpiler import generate_preset_pass_manager
from qiskit.qasm3 import dumps
from qiskit import QuantumCircuit
from qiskit.circuit import Parameter
from qiskit import transpile

service = QiskitRuntimeService(channel='ibm_quantum')
backend = service.backend("<SPECIFY BACKEND>")

pm = generate_preset_pass_manager(backend=backend, optimization_level=1)

theta = Parameter('theta')
phi = Parameter('phi')
# In case we want to pass a dictionary:
parameter_values = {'theta': 1.57, 'phi': 3.14}   

3. Erstellen Sie einen Quantenschaltkreis und fügen Sie parametrisierte Gatter hinzu

qc = QuantumCircuit(2)

# Add parameterized gates
qc.rx(theta, 0)
qc.ry(phi, 1)
qc.cx(0, 1)
qc.measure_all()

# Draw the original circuit
qc.draw('mpl')

# Get an ISA circuit
isa_circuit = pm.run(qc)

4. QASM-3-Code generieren

qasm_str = dumps(isa_circuit)
print("Generated QASM 3 code:")
print(qasm_str)

5. Führen Sie den Quanten-Schaltkreis mithilfe der Sampler-API unter V2 aus

import requests

url = 'https://quantum.cloud.ibm.com/api/v1/jobs'
auth_id = "Bearer <YOUR_BEARER_TOKEN>"
crn = "<SERVICE-CRN>"
backend = "<BACKEND_NAME>"

headers = {
    'Content-Type': 'application/json',
    'Authorization':auth_id,
    'Service-CRN': crn
    }

job_input = {
    'program_id': 'sampler',
    "backend": backend,
    "params": {
        # Choose one option: direct parameter transfer or through a dictionary
        # # primitive unified blocs (PUBs) containing one circuit each:
        #"pubs": [[qasm_str,[1,2],500]], 

        # primitive unified blocs (PUBs) containing one circuit each:
        "pubs": [[qasm_str,parameter_values,500]], 
}}

response = requests.post(url, headers=headers, json=job_input)

if response.status_code == 200:
    job_id = response.json().get('id')
    print(f"Job created: {response.text}")
else:
    print(f"Error: {response.status_code}")
print(response.text)

6. Auftragsstatus prüfen und Ergebnisse abrufen

Geben Sie anschließend die job_id an die API weiter:

response_status_singlejob = requests.get(f"{url}/{job_id}", headers=headers)
response_status_singlejob.json().get('state')

Ausgabe

{'status': 'Completed'}

Ergebnisse anzeigen:

response_result = requests.get(f"{url}/{job_id}/results", headers=headers)

res_dict=response_result.json()

# Get results for the first PUB
counts=res_dict['results'][0]['data']['c']['samples']

print(counts[:20])

Ausgabe

['0x1', '0x2', '0x1', '0x2', '0x1', '0x2', '0x0', '0x2', '0x1', '0x1', '0x2', '0x2', '0x1', '0x1', '0x1', '0x1', '0x1', '0x1', '0x1', '0x1']

Nächste Schritte

Empfehlungen
  • Je nach Ihren Anforderungen gibt es verschiedene Möglichkeiten, Workloads auszuführen: im Job-Modus, im Sitzungsmodus und im Batch-Modus. Erfahren Sie im Abschnitt „Ausführungsmodi“, wie Sie mit dem Sitzungsmodus und dem Batch-Modus arbeiten. Bitte beachten Sie, dass Nutzer von Open Plan keine Sitzungsaufträge übermitteln können.
  • Erfahren Sie, wie Sie Ihr Konto über die REST-API einrichten.
  • Üben Sie den Umgang mit Primitiven, indem Sie die Lektion zur Cost-Funktion unter IBM Quantum Learning durcharbeiten.
  • Im Abschnitt „Transpile“ erfahren Sie, wie Sie lokal transpilieren können.
War diese Seite hilfreich?
Melden Sie auf GitHub einen Fehler, einen Tippfehler oder fordern Sie Inhalte an.