Houve um erro no circuito !. Erro = 'Tempo limite do QISkit'

8

Eu tenho o seguinte código quântico usando o QISKit (com base em 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))

Eu defini o meu APItokenem Qconfig.pycomo:

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

No entanto, o código falha com o seguinte erro:

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'

Eu testei ambos ibmqx4e ibmqx5, o mesmo problema. Percebo que eles estão ativos em / qx / devices .

O que isso significa? Isso significa que o servidor IBM Q está inoperante ou o programa é grande demais para ser executado? Ou há algo mais acontecendo? Em outras palavras, o que devo fazer para executar um simples programa Hello Quantum no servidor IBM quantum?

kenorb
fonte

Respostas:

6

O tempo limite do seu trabalho expirou, provavelmente devido à fila ser muito longa para o trabalho ser concluído no tempo permitido por padrão .execute().

Mas você já sabe disso, é claro, porque já escreveu uma excelente resposta . No entanto, tenho algumas idéias a acrescentar da experiência de batalha.

Normalmente, uso este notebook para verificar como um dispositivo está ocupado e se está ativo. Normalmente, eu executo trabalhos da seguinte maneira.

    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)

Isso é usado trypara gerenciar quaisquer exceções que possam resultar. O programa irá apenas esperar e tentar novamente, em vez de travar.

Se chegarmos ao ponto de usá-lo com sucesso .get_counts, o programa verificará se ele realmente contém resultados. Ou melhor, verifica que a 'status'chave não está presente, pois é a precursora da destruição. Se não houver resultados adequados, o programa aguarda e tenta novamente.

James Wootton
fonte
3

De acordo com a postagem do GitHub , tive que aumentar o tempo limite Q_program.execute(), por exemplo:

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

Provavelmente, o motivo é que as filas estão ocupadas; portanto, precisamos dizer ao QISKit que aguarde até 10 minutos. Esta instrução está basicamente bloqueando o restante do script e aguarde até que o trabalho seja executado no servidor de back-end real e os resultados sejam retornados.


Para listar detalhes dos trabalhos que foram enviados, o código a seguir pode ser usado conforme proposto 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
fonte
Lidar com tempos limite é um tanto inevitável, infelizmente. Além de aumentar o tempo de espera, você pode usar o tratamento de exceções para tentar novamente.
precisa