Share via


Sessies beheren

In dit artikel leert u hoe u met sessies kunt werken. Met sessies kunt u een of meer taken groeperen op basis van één target, zodat u taken effectief kunt beheren. Zie Interactieve kwantumcomputing: sessies voor meer informatie.

Notitie

Sessies worden beheerd met Python, zelfs bij het uitvoeren van Q# inlinecode. Zie de sectie 'Q# + Python' van Aan de slag met sessies voor meer informatie.

Sessies ophalen, sessies weergeven en taken van sessies weergeven

In de volgende tabel ziet u de Python-opdrachten voor het ophalen van de lijst met alle sessies en alle taken voor een bepaalde sessie.

Opdracht Beschrijving
workspace.list_sessions() of session.list_sessions() Een lijst met alle sessies in een Quantum-werkruimte ophalen.
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 met alle taken in de sessie op met id sessionId. Elke sessie heeft een unieke id.

Met de volgende code wordt bijvoorbeeld een functie gedefinieerd waarmee een sessie wordt uitgevoerd met een minimum aantal taken. 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 echter 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 weergeven, moet u ook de sessie in de service maken.

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

  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 wilt koppelen aan een target, kunt u gebruiken target.latest_session.

  6. U kunt wachten tot 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.

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

Overweeg het volgende Q# programma, dat een geheel getal, nen een matrix van hoeken, angle, als invoer gebruikt.

open Microsoft.Quantum.Measurement;
open Microsoft.Quantum.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 verschillende hoeken. U kunt de volgende Python-code gebruiken om drie taken met verschillende hoeken te verzenden.

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 in dit voorbeeld matrices in Python al worden 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 voor een sessie als er gedurende 10 minuten geen nieuwe taak binnen de sessie wordt verzonden. De sessie rapporteert de status 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 opgetreden, kan het meer dan 10 minuten duren voordat een nieuwe taak is ingediend nadat de vorige taken in de sessie allemaal 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, laat het volgende codefragment zien 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()

Taakfoutbeleid 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 bij het maken van job_failure_policy=SessionJobFailurePolicy.CONTINUEde sessie een beleid voor taakfouten op te geven, in plaats van de standaardinstelling SessionJobFailurePolicy.ABORT. Wanneer het beleid voor taakfouten is CONTINUE, blijft de service taken accepteren. De sessie rapporteert in dit geval een of meer 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.

Het volgende programma maakt bijvoorbeeld een sessie met drie taken. De eerste taak mislukt omdat deze opgeeft "garbage" als invoergegevens. Om het einde van de sessie op dit punt te voorkomen, laat het programma zien hoe u 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 beacuse of CONTINUE policy
    target.submit(input_data=quil_program, name="Job 3")

Volgende stap