Es ist ein Fehler in der Schaltung aufgetreten!. Fehler = 'QISkit-Zeitüberschreitung'


8

Ich habe den folgenden Quantencode mit QISKit (basierend auf hello_quantum.py):

import sys, os
from qiskit import QuantumProgram, QISKitError, RegisterSizeError

# Create a QuantumProgram object instance.
Q_program = QuantumProgram()
try:
    import Qconfig
    Q_program.set_api(Qconfig.APItoken, Qconfig.config["url"])
except:
    offline = True
    print("WARNING: There's no connection with IBMQuantumExperience servers.");
print("The backends available for use are: {}\n".format(",".join(Q_program.available_backends())))
backend = 'ibmqx5'
try:
    # Create a Quantum Register called "qr" with 2 qubits.
    qr = Q_program.create_quantum_register("qr", 2)
    # Create a Classical Register called "cr" with 2 bits.
    cr = Q_program.create_classical_register("cr", 2)
    # Create a Quantum Circuit called "qc". involving the Quantum Register "qr"
    # and the Classical Register "cr".
    qc = Q_program.create_circuit("bell", [qr], [cr])

    # Add the H gate in the Qubit 0, putting this qubit in superposition.
    qc.h(qr[0])
    # Add the CX gate on control qubit 0 and target qubit 1, putting 
    # the qubits in a Bell state
    qc.cx(qr[0], qr[1])

    # Add a Measure gate to see the state.
    qc.measure(qr, cr)

    # Compile and execute the Quantum Program.
    result = Q_program.execute(["bell"], backend=backend, shots=1024, seed=1)

    # Show the results.
    print(result)
    print(result.get_data("bell"))

except QISKitError as ex:
    print('There was an error in the circuit!. Error = {}'.format(ex))
except RegisterSizeError as ex:
    print('Error in the number of registers!. Error = {}'.format(ex))

Ich setze meine APItokenein Qconfig.pyals:

APItoken = 'XXX'
config = {
    'url': 'https://quantumexperience.ng.bluemix.net/api',
}

Der Code schlägt jedoch mit folgendem Fehler fehl:

The backends available for use are: ibmqx2,ibmqx5,ibmqx4,ibmqx_hpc_qasm_simulator,ibmqx_qasm_simulator,local_qasm_simulator,local_clifford_simulator,local_qiskit_simulator,local_unitary_simulator

ERROR
There was an error in the circuit!. Error = 'QISkit Time Out'

Ich habe beide ibmqx4und ibmqx5das gleiche Problem getestet . Ich kann sehen, dass sie unter / qx / Geräte aktiv sind .

Was bedeutet das? Bedeutet dies, dass der IBM Q-Server nicht verfügbar ist oder das Programm zu groß für die Ausführung ist? Oder ist noch etwas los? Mit anderen Worten, was soll ich tun, um ein einfaches Hello Quantum-Programm auf einem IBM Quantum Server auszuführen?

Antworten:


6

Das Zeitlimit für Ihren Job ist abgelaufen, wahrscheinlich weil die Warteschlange zu lang ist, um den Job in der standardmäßig für vorgesehenen Zeit abzuschließen .execute().

Aber das wissen Sie natürlich schon, weil Sie bereits eine hervorragende eigene Antwort geschrieben haben . Trotzdem habe ich einige Erkenntnisse aus kampferprobten Erfahrungen hinzuzufügen.

Normalerweise benutze ich dieses Notebook , um zu überprüfen, wie beschäftigt ein Gerät ist und ob es aktiv ist. Dann führe ich Jobs normalerweise folgendermaßen aus.

    noResults = True
    while noResults:
        try: # try to run, and wait if it fails
            executedJob = engine.execute(["script"], backend=backend, shots=shots, max_credits = 5, wait=30, timeout=600)
            resultsVeryRaw = executedJob.get_counts("script")
            if ('status' not in resultsVeryRaw.keys()):
                noResults = False
            else:
                print(resultsVeryRaw)
                print("This is not data, so we'll wait and try again")
                time.sleep(300)
        except:
            print("Job failed. We'll wait and try again")
            time.sleep(600)

Dies wird verwendet try, um eventuell auftretende Ausnahmen zu verwalten. Das Programm wartet nur und versucht es erneut, anstatt abzustürzen.

Wenn wir den Punkt der erfolgreichen Verwendung erreichen .get_counts, prüft das Programm, ob es tatsächlich Ergebnisse enthält. Oder besser gesagt, es prüft, ob der 'status'Schlüssel nicht vorhanden ist, denn er ist der Vorbote des Untergangs. Wenn keine korrekten Ergebnisse vorliegen, wartet das Programm erneut und versucht es erneut.


3

Laut GitHub-Beitrag musste ich das Timeout erhöhen Q_program.execute(), zum Beispiel für:

result = Q_program.execute(["bell"], backend=backend, shots=1024, seed=1, timeout=600)

Der Grund ist wahrscheinlich, dass die Warteschlangen ausgelastet sind. Daher müssen wir QISKit anweisen, bis zu 10 Minuten zu warten. Diese Anweisung blockiert im Grunde den Rest des Skripts und wartet, bis der Job auf dem eigentlichen Backend-Server ausgeführt wird und die Ergebnisse zurückgegeben werden.


Um Details zu den eingereichten Jobs aufzulisten , kann der folgende Code verwendet werden, wie von @ajavadia vorgeschlagen :

from qiskit import QuantumProgram
import Qconfig

qp = QuantumProgram()
qp.set_api(Qconfig.APItoken, Qconfig.config['url'])

# Download details of all the jobs you've ever submitted (the default limit is 50).
my_jobs = qp.get_api().get_jobs(limit=999)

# Filter down to get a list of completed jobs.
done_jobs = [j for j in my_jobs if j['status']=='COMPLETED']

# Print the results for all of your completed jobs.
for j in done_jobs:
    for q in j['qasms']:
        print(q['qasm'])
        print(q['result'])

Der Umgang mit Timeouts ist leider unvermeidlich. Sie können nicht nur die Wartezeit erhöhen, sondern auch die Ausnahmebehandlung verwenden, um es erneut zu versuchen.
James Wootton
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.