¡Hubo un error en el circuito !. Error = 'Tiempo de espera de QISkit'

8

Tengo el siguiente código cuántico usando QISKit (basado en 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))

Me puse mi APItokenen Qconfig.pycomo:

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

Sin embargo, el código falla con el siguiente error:

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'

He probado ambos ibmqx4y ibmqx5el mismo problema. Puedo ver que están activos en / qx / devices .

Qué significa eso? ¿Significa que el servidor IBM Q está inactivo o que el programa es demasiado grande para ejecutarse? ¿O hay algo más pasando? En otras palabras, ¿qué debo hacer para ejecutar un simple programa Hello Quantum en el servidor cuántico de IBM?

kenorb
fuente

Respuestas:

6

Su trabajo agotó el tiempo de espera, probablemente debido a que la cola es demasiado larga para que el trabajo se complete en el tiempo permitido por defecto .execute().

Pero ya lo sabe, por supuesto, porque ya ha escrito una excelente respuesta propia . Sin embargo, tengo algunas ideas para agregar de la experiencia de batalla endurecida.

Usualmente uso esta computadora portátil para verificar qué tan ocupado está un dispositivo y si está activo. Luego, normalmente ejecuto trabajos de la siguiente manera.

    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)

Esto se usa trypara administrar cualquier excepción que pueda resultar. El programa solo esperará e intentará nuevamente en lugar de bloquearse.

Si llegamos al punto de usarlo con éxito .get_counts, el programa verifica si realmente contiene resultados. O más bien, comprueba que la 'status'clave no está presente, ya que es el presagio de la fatalidad. Si no hay resultados adecuados, el programa nuevamente espera e intenta nuevamente.

James Wootton
fuente
3

Según la publicación de GitHub , tuve que aumentar el tiempo de espera para Q_program.execute(), por ejemplo:

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

Probablemente, la razón es que las colas están ocupadas, por lo que debemos decirle a QISKit que espere hasta 10 minutos. Básicamente, esta instrucción bloquea el resto del script y espera hasta que el trabajo se ejecute en el servidor de fondo real y se devuelvan los resultados.


Para enumerar los detalles de los trabajos que se han enviado, se puede usar el siguiente código según lo propuesto por @ajavadia :

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'])
kenorb
fuente
Lidiar con los tiempos de espera es algo inevitable, desafortunadamente. Además de aumentar cuánto tiempo esperará, puede usar el manejo de excepciones para que vuelva a intentarlo.
James Wootton