Delen via


Uw sessies beheren

In dit artikel leert u hoe u uw sessies beheert. Met sessies kunt u een of meer taken groeperen op één target, zodat u taken effectief kunt beheren. Zie Aan de slag met sessies voor meer informatie.

Vereisten

  • Een Azure-account met een actief abonnement. Als u geen Azure-account hebt, registreert u zich gratis en registreert u zich voor een abonnement op basis van betalen per gebruik.

  • Een Azure Quantum-werkruimte. Zie Een Azure Quantum-werkruimte maken voor meer informatie.

  • Een Python-omgeving waarop Python en Pip zijn geïnstalleerd.

  • Het Azure Quantum-pakket azure-quantum . Als u Qiskit of Cirq wilt gebruiken, moet u het azure-quantum pakket installeren met de tags [qiskit] of [cirq].

    pip install --upgrade azure-quantum[qiskit] 
    

Notitie

Sessies worden beheerd met Python, zelfs wanneer inlinecode wordt uitgevoerd Q# .

Bewakingssessies

U kunt de blade Taakbeheer in uw Kwantumwerkruimte gebruiken om alle verzonden items op het hoogste niveau weer te geven, inclusief sessies en afzonderlijke taken die niet aan een sessie zijn gekoppeld.

  1. Selecteer de blade Taakbeheer in uw Quantum-werkruimte.
  2. Identificeer de taken van het type Sessie. In deze weergave ziet u de unieke id van een sessie in kolom-id en controleert u de status. De statussen van een sessie zijn:
    • Wachtend: taken binnen de sessie worden uitgevoerd.
    • Geslaagd: sessie is beëindigd.
    • Time-out: Als er gedurende 10 minuten geen nieuwe taak binnen de sessie wordt verzonden, treedt er een time-out op voor die sessie. Zie Sessietime-outs voor meer informatie.
    • Mislukt: Als een taak binnen een sessie mislukt, wordt die sessie beëindigd en wordt de status Mislukt gerapporteerd. Zie Beleid voor taakfouten in sessies voor meer informatie.
  3. Klik op de naam van een sessie voor meer informatie.
  4. U kunt de lijst met alle taken in de sessie bekijken en de status ervan controleren.

Sessies ophalen en weergeven

In de volgende tabel ziet u de Python-opdrachten om de lijst met alle sessies en alle taken voor een bepaalde sessie op te halen.

Opdracht Beschrijving
workspace.list_sessions() of session.list_sessions() Haal een lijst op met alle sessies in een Kwantumwerkruimte.
workspace.get_session(sessionId) of session.get_session(sessionId) Haal de sessie op met id sessionId. Elke sessie heeft een unieke id.
workspace.list_session_jobs(sessionId) of session.list_session_jobs(sessionId) Haal een lijst op met alle taken in de sessie met id sessionId. Elke sessie heeft een unieke id.

Met de volgende code wordt bijvoorbeeld een functie gedefinieerd waarmee een sessie met een minimum aantal taken wordt uitgevoerd. Vervolgens worden voor die sessie alle taken, het totale aantal taken en de eerste 10 taken weergegeven.

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}")

Handmatige methoden voor het openen/sluiten van sessies

U wordt aangeraden de stappen in Aan de slag met sessies te volgen om een nieuwe sessie te maken. U kunt ook handmatig sessies maken.

  1. Maak eerst een sessieobject.

    from azure.quantum.job.session 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}")
    

    Notitie

    Op dit moment bestaat de sessie alleen op de client en kunt u zien dat de status Geen is. Als u de status van de sessie wilt bekijken, moet u ook de sessie in de service maken.

  2. Als u een sessie in de service wilt maken , kunt u deze gebruiken workspace.open_session(session) of session.open().

  3. U kunt de status en de sessiedetails vernieuwen met session.refresh(), of door een nieuw sessieobject op te halen uit een sessie-id.

    same_session = workspace.get_session(session.id) 
    print(f"Session: {session.details} \n")
    print(f"Session: {same_session.details} \n")
    
  4. U kunt een sessie sluiten met session.close() of workspace.close_session(session).

  5. Als u de sessie aan een targetwilt koppelen, kunt u gebruikentarget.latest_session.

  6. U kunt wachten totdat een sessie is voltooid:

    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)
    

Argumenten doorgeven in Q#

Als uw Q# bewerking invoerargumenten gebruikt, worden deze argumenten doorgegeven tijdens het verzenden van de taak. Dit is Python-code. Dit betekent dat u voorzichtig moet zijn met het opmaken van uw argumenten als Q# objecten.

Bij het doorgeven van argumenten als parameters aan de taak, worden ze opgemaakt als Q# code bij het aanroepen qsharp.compile, zodat de waarden uit Python moeten worden opgemaakt in een tekenreeks als geldige Q# syntaxis.

Houd rekening met het volgende Q# programma, waarbij een geheel getal, nen een matrix met hoeken, angleals invoer wordt gebruikt.

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;
}

U wilt de bewerking drie keer uitvoeren GenerateRandomBits met n=2 en verschillende hoeken. U kunt de volgende Python-code gebruiken om drie taken met verschillende hoeken in te dienen.

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]

Omdat matrices in Python al zijn afgedrukt als [item0, item1, ...], komen de invoerargumenten overeen met de Q# opmaak. Voor andere Python-gegevensstructuren hebt u mogelijk meer verwerking nodig om de tekenreekswaarden op een compatibele manier in te Q# voegen. Een tuple moet bijvoorbeeld Q# tussen haakjes staan met door komma's gescheiden waarden.

Sessietime-outs

Er treedt een time-out op als er gedurende 10 minuten geen nieuwe taak binnen de sessie wordt verzonden. De sessie rapporteert een status van TimedOut. Om deze situatie te voorkomen, voegt u een with blok toe met behulp van backend.open_session(name="Name"), zodat de sessie close() wordt aangeroepen door de service aan het einde van het codeblok.

Notitie

Als er fouten of fouten in uw programma zijn, kan het meer dan tien minuten duren voordat een nieuwe taak wordt ingediend nadat de vorige taken in de sessie zijn voltooid.

In de volgende codefragmenten ziet u een voorbeeld van een time-out voor een sessie na 10 minuten, omdat er geen nieuwe taken worden verzonden. Om dat te voorkomen, ziet u in het volgende codefragment hoe u een with blok gebruikt om een sessie te maken.

#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()

Beleid voor taakfouten binnen sessies

Het standaardbeleid voor een sessie wanneer een taak mislukt, is het beëindigen van die sessie. Als u een extra taak binnen dezelfde sessie indient, weigert de service deze en rapporteert de sessie de status Mislukt. Alle actieve taken worden geannuleerd.

Dit gedrag kan echter worden gewijzigd door een beleid voor taakfouten op te geven van job_failure_policy=SessionJobFailurePolicy.CONTINUE, in plaats van de standaardinstelling SessionJobFailurePolicy.ABORT, bij het maken van de sessie. Wanneer het beleid voor taakfouten is CONTINUE, blijft de service taken accepteren. De sessie rapporteert in dit geval een of meer mislukte fouten , die worden gewijzigd in Mislukt zodra de sessie is gesloten.

Als de sessie nooit wordt gesloten en er een time-out optreedt, is de status TimedOut , zelfs als taken zijn mislukt.

Met het volgende programma wordt bijvoorbeeld een sessie met drie taken gemaakt. De eerste taak mislukt omdat deze opgeeft "garbage" als invoergegevens. Om het einde van de sessie op dit moment te voorkomen, laat het programma zien hoe u deze toevoegt job_failure_policy=SessionJobFailurePolicy.CONTINUE bij het maken van de sessie.

#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")