Freigeben über


So verwalten Sie Ihre Sitzungen

In Azure Quantum, können Sie mehrere Aufträge nach einem einzigen Ziel gruppieren, um Ihre Aufträge effektiv zu verwalten. Dies wird als Sitzung bezeichnet. Weitere Informationen finden Sie unter "Erste Schritte mit Sitzungen".

In diesem Artikel erfahren Sie, wie Sie Ihre Aufträge mithilfe von Sitzungen manuell verwalten können. Sie lernen auch die Richtlinien für Jobfehler kennen und erfahren, wie Sie Sitzungstimeouts vermeiden können.

Voraussetzungen

  • Ein Azure-Konto mit einem aktiven Abonnement. Wenn Sie nicht über ein Azure-Konto verfügen, melden Sie sich kostenlos an und registrieren Sie sich für ein Abonnement mit nutzungsabhängiger Abrechnung.

  • Ein Azure Quantum Arbeitsbereich. Weitere Informationen finden Sie unter Erstellen eines Azure Quantum Arbeitsbereichs.

  • Eine Python-Umgebung mit installiertem Python und Pip.

  • Die qdkPython Bibliothek. Wenn Sie Qiskit oder Cirq verwenden möchten, dann müssen Sie die azure und qiskit Extras installieren.

    pip install --upgrade "qdk[azure,qiskit]"
    

Hinweis

Sitzungen werden auch dann mit Python verwaltet, wenn Sie Inlinecode Q# ausführen.

Überwachen Sie Ihre Sitzungen

Sie können das Blatt "Auftragsverwaltung " in Ihrem Quantum-Arbeitsbereich verwenden, um alle übermittelten Elemente der obersten Ebene anzuzeigen, einschließlich Sitzungen und einzelnen Aufträgen, die keiner Sitzung zugeordnet sind.

  1. Wählen Sie im Quantum-Arbeitsbereich das Auftragsverwaltungsblatt aus.
  2. Identifizieren Sie die Aufträge des Typs "Session". In dieser Ansicht finden Sie die eindeutige ID einer Sitzung in der Spalte "ID " und überwachen den Status der Sitzung. Sitzungen können die folgenden Status aufweisen:
    • Warten: Aufträge innerhalb der Sitzung werden derzeit ausgeführt.
    • Erfolgreich: Sitzung wurde erfolgreich beendet.
    • TimeOut: Wenn in den nächsten 10 Minuten innerhalb der Sitzung kein neuer Auftrag übermittelt wird, läuft die Sitzung ab. Weitere Informationen finden Sie unter Sitzungstimeouts.
    • Fehler: Wenn ein Auftrag innerhalb einer Sitzung fehlschlägt, wird diese Sitzung beendet und meldet den Status "Fehlgeschlagen". Weitere Informationen finden Sie in der Richtlinie für Auftragsfehler innerhalb von Sitzungen.
  3. Klicken Sie auf den Namen einer Sitzung, um weitere Details anzuzeigen.
  4. Sie können die Liste aller Aufträge innerhalb der Sitzung anzeigen und deren Status überwachen.

Abrufen und Auflisten von Sitzungen

Die folgende Tabelle zeigt die Python Befehle zum Abrufen der Liste aller Sitzungen und aller Aufträge für eine bestimmte Sitzung.

Command Description
workspace.list_sessions() oder session.list_sessions() Dient zum Abrufen einer Liste aller Sitzungen in einem Quantum Workspace.
workspace.get_session(sessionId) oder session.get_session(sessionId) Rufen Sie die Sitzung mit der ID sessionId ab. Jede Sitzung verfügt über eine eindeutige ID.
workspace.list_session_jobs(sessionId) oder session.list_session_jobs(sessionId) Dient zum Abrufen einer Liste aller Aufträge in der Sitzung mit der ID sessionId. Jede Sitzung verfügt über eine eindeutige ID.

Der folgende Code definiert beispielsweise eine Funktion, die eine Sitzung mit einer minimalen Anzahl von Aufträgen erhält. Anschließend werden für diese Sitzung alle Aufträge, die Gesamtzahl der Aufträge und die ersten 10 Aufträge aufgelistet.

def get_a_session_with_jobs(min_jobs):
    all_sessions = workspace.list_sessions() # list of all sessions
    for session in all_sessions:
        if len(workspace.list_session_jobs(session.id)) >= min_jobs:
            return session

session = get_a_session_with_jobs(min_jobs=3) # Get a Session with at least 3 jobs

session_jobs = workspace.list_session_jobs(session.id) # List of all jobs within Session ID

print(f"Job count: {len(session_jobs)} \n")
print(f"First 10 jobs for session {session.id}:")
for job in session_jobs[0:10]:
    print(f"Id: {job.id}, Name={job.details.name}")

Manuelles Öffnen oder Schließen von Sitzungen

Um eine neue Sitzung zu erstellen, empfiehlt es sich, die Schritte in " Erste Schritte mit Sitzungen" auszuführen. Wenn Sie stattdessen Sitzungen manuell erstellen möchten, wählen Sie die Registerkarte für Ihre Entwicklungsumgebung aus.

  1. Erstellen Sie ein Session-Objekt.

    from qdk.azure.job import Session, SessionDetails, SessionJobFailurePolicy
    import uuid
    
    session = Session(
        workspace=workspace, # required
        id=f"{uuid.uuid1()}", # optional, if not passed will use uuid.uuid1()
        name="", # optional, will be blank if not passed
        provider_id="ionq", # optional, if not passed will try to parse from the target
        target="ionq.simulator", # required
        job_failure_policy=SessionJobFailurePolicy.ABORT # optional, defaults to abort
        )
    
    print(f"Session status: {session.details.status}")
    

    Hinweis

    An diesem Punkt ist die Sitzung nur auf dem Client vorhanden, und Sie können sehen, dass der Status "Keine" lautet. Um den Status der Sitzung anzuzeigen, müssen Sie auch die Sitzung im Dienst erstellen.

  2. Um im Dienst eine Sitzung zu erstellen, können Sie workspace.open_session(session) oder session.open() verwenden.

  3. Sie können den Status und die Sitzungsdetails mit session.refresh()oder durch Abrufen eines neuen Sitzungsobjekts aus einer Sitzungs-ID aktualisieren.

    same_session = workspace.get_session(session.id) 
    print(f"Session: {session.details} \n")
    print(f"Session: {same_session.details} \n")
    
  4. Sie können eine Sitzung schließen mit session.close() oder workspace.close_session(session).

  5. Um die Sitzung an ein Ziel anzufügen, können Sie dies verwenden target.latest_session.

  6. Sie können warten , bis eine Sitzung abgeschlossen ist:

    session_jobs = session.list_jobs()
    [session_job.id for session_job in session_jobs]
    
    import time
    while (session.details.status != "Succeeded" and session.details.status != "Failed" and session.details.status != "TimedOut"):
      session.refresh()
      time.sleep(5)
    

Argumente übergeben in Q#

Wenn der Q# Vorgang Eingabeargumente verwendet, werden diese Argumente während der Auftragsübermittlung übergeben, was Python Code ist. Dies bedeutet, dass Sie Ihre Argumente als Q# Objekte formatieren müssen.

Wenn Sie Argumente als Parameter an den Auftrag übergeben, werden die Argumente beim Q# Aufrufen als qsharp.compile Code formatiert, sodass die Werte aus Python einer Zeichenfolge als gültige Q# Syntax formatiert werden müssen.

Betrachten Sie das folgende Q# Programm, das eine ganze Zahl nund ein Array von Winkeln angleals Eingabe akzeptiert.

import Std.Measurement.*;
import Std.Arrays.*;

operation GenerateRandomBits(n: Int, angle: Double[]) : Result[] {
   use qubits = Qubit[n]; // n parameter as the size of the qubit array
   for q in qubits {
       H(q);
   }
   R(PauliZ, angle[0], qubits[0]); // arrays as entry-points parameters
   R(PauliZ, angle[1], qubits[1]);
   let results = MeasureEachZ(qubits);
   ResetAll(qubits);
   return results;
}

Sie möchten den Vorgang dreimal mit GenerateRandomBits und unterschiedlichen Winkeln ausführenn=2. Mit dem folgenden Python Code können Sie drei Aufträge mit unterschiedlichen Winkeln übermitteln.

angle = [0.0, 0.0]
with target.open_session(name="Q# session of three jobs") as session:
    target.submit(input_data=qsharp.compile(f"GenerateRandomBits(2, {angle})"), name="Job 1", shots=100) # First job submission
    angle[0] += 1
    target.submit(input_data=qsharp.compile(f"GenerateRandomBits(2, {angle})"), name="Job 2", shots=100) # Second job submission
    angle[1] += 1
    target.submit(input_data=qsharp.compile(f"GenerateRandomBits(2, {angle})"), name="Job 3", shots=100) # Third job submission

session_jobs = session.list_jobs()
[session_job.details.name for session_job in session_jobs]

In diesem Beispiel, da Arrays Python bereits als [Element0, Element1, ...] gedruckt werden, stimmen die Eingabeargumente mit der Q# Formatierung überein. Bei anderen Python Datenstrukturen benötigen Sie möglicherweise mehr Aufwand, um die Zeichenfolgenwerte auf kompatible Weise in Q# einzufügen. Ein Q# Tupel muss beispielsweise in Klammern mit kommagetrennten Werten enthalten sein.

Sitzungstimeouts

Wenn innerhalb einer Sitzung 10 Minuten lang kein neuer Auftrag eingereicht wird, läuft die Sitzung ab. Die Sitzung meldet einen Status von TimedOut. Um diese Situation zu vermeiden, fügen Sie mit with einen backend.open_session(name="Name") Block hinzu, sodass die Sitzung close() vom Dienst am Ende des Codeblocks aufgerufen wird.

Hinweis

Wenn in Ihrem Programm Fehler oder Bugs auftreten, kann es mehr als 10 Minuten dauern, bis ein neuer Auftrag eingereicht wird, nachdem die vorherigen Aufträge in der Sitzung abgeschlossen sind.

Die folgenden Codeausschnitte zeigen ein Beispiel für eine Sitzung, die nach 10 Minuten auszeit, da keine neuen Aufträge übermittelt werden. Um dies zu vermeiden, zeigt der nächste Codeausschnitt, wie ein with Block zum Erstellen einer Sitzung verwendet wird.

#Example of a session that times out 

session = backend.open_session(name="Qiskit circuit session") # Session times out because only contains one job
backend.run(circuit=circuit, shots=100, job_name="Job 1")
#Example of a session that includes a with block to avoid timeout

with backend.open_session(name="Qiskit circuit session") as session:  # Use a with block to submit multiple jobs within a session
    job1 = backend.run(circuit=circuit, shots=100, job_name="Job 1") # First job submission
    job1.wait_for_final_state()
    job2 = backend.run(circuit=circuit, shots=100, job_name="Job 2") # Second job submission
    job2.wait_for_final_state()
    job3 = backend.run(circuit=circuit, shots=100, job_name="Job 3") # Third job submission
    job3.wait_for_final_state()

Richtlinie für Ausfall von Aufgaben innerhalb von Sitzungen

Die Standardrichtlinie für eine Sitzung, wenn ein Auftrag fehlschlägt, besteht darin, diese Sitzung zu beenden. Wenn Sie einen zusätzlichen Auftrag innerhalb derselben Sitzung übermitteln, lehnt der Dienst ihn ab, und die Sitzung meldet den Status "Fehlgeschlagen". Alle laufenden Aufträge werden abgebrochen.

Dieses Verhalten kann jedoch durch die Angabe einer Auftragsfehlerrichtlinie job_failure_policy=SessionJobFailurePolicy.CONTINUE anstelle der Standardeinstellung SessionJobFailurePolicy.ABORT beim Erstellen der Sitzung geändert werden. Wenn die Auftragsfehlerrichtlinie lautet CONTINUE, akzeptiert der Dienst weiterhin Aufträge. In diesem Fall meldet die Sitzung den Status " Fehler" , der nach dem Schließen der Sitzung in "Fehlgeschlagen " geändert wird.

Wenn die Sitzung nie geschlossen wird und ein Time-out auftritt, ist der Status TimedOut, auch wenn Aufträge fehlgeschlagen sind.

Das folgende Programm erstellt beispielsweise eine Sitzung mit drei Aufträgen. Der erste Auftrag schlägt fehl, da er als Eingabedaten angibt "garbage" . Um das vorzeitige Beenden der Sitzung zu vermeiden, zeigt das Programm, wie job_failure_policy=SessionJobFailurePolicy.CONTINUE hinzugefügt wird, wenn Sie die Sitzung erstellen.

#Example of a session that does not close but reports Failure(s) when a jobs fails

with target.open_session(name="JobFailurePolicy Continue", job_failure_policy=SessionJobFailurePolicy.CONTINUE) as session:
    target.submit(input_data="garbage", name="Job 1") #Input data is missing, this job fails
    target.submit(input_data=quil_program, name="Job 2") #Subsequent jobs are accepted because of CONTINUE policy
    target.submit(input_data=quil_program, name="Job 3")