Megosztás a következőn keresztül:


Munkamenetek kezelése

Ebből a cikkből megtudhatja, hogyan kezelheti a munkameneteket. Munkamenetek esetén egyetlen feladathoz targetcsoportosíthat egy vagy több feladatot, így hatékonyan kezelheti a feladatokat. További információ: Ismerkedés a munkamenetekkel.

Előfeltételek

  • Egy Azure-fiók, aktív előfizetéssel. Ha nem rendelkezik Azure-fiókkal, regisztráljon ingyenesen, és regisztráljon használatalapú fizetéses előfizetésre.

  • Egy Azure Quantum-munkaterület. További információ: Azure Quantum-munkaterület létrehozása.

  • Python-környezet, amelyen telepítve van a Python és a Pip .

  • Az Azure Quantum-csomag azure-quantum . Ha qiskitet vagy Cirqot szeretne használni, telepítenie kell a azure-quantum csomagot a [qiskit] vagy a [cirq] címkékkel.

    pip install --upgrade azure-quantum[qiskit] 
    

Feljegyzés

A munkameneteket a Python kezeli, még beágyazott kód futtatásakor Q# is.

Figyelési munkamenetek

A Quantum-munkaterület Feladatkezelési paneljén megtekintheti az összes legfelső szintű elküldött elemet, beleértve a munkamenetekhez és a munkamenetekhez nem társított egyes feladatokat.

  1. Válassza ki a Feladatkezelés panelt a Quantum-munkaterületen.
  2. Azonosítsa a munkamenet típusú feladatokat. Ebben a nézetben megtekintheti egy munkamenet egyedi azonosítóját az Oszlopazonosító oszlopban, és figyelheti annak állapotát. A munkamenet állapotai a következők:
    • Várakozás: A munkameneten belüli feladatok végrehajtása folyamatban van.
    • Sikeres: A munkamenet sikeresen befejeződött.
    • Időtúllépés: Ha a munkameneten belül 10 percig nem küld el új feladatot, a munkamenet túllépi az időkorlátot. További információ: Munkamenet-időtúllépések.
    • Sikertelen: Ha egy munkameneten belüli feladat meghiúsul, az a munkamenet véget ér, és sikertelen állapotot jelez. További információ: Feladathiba-szabályzat a munkameneteken belül.
  3. További részletekért kattintson a munkamenet nevére.
  4. Megtekintheti a munkamenet összes feladatának listáját, és figyelheti azok állapotát.

Munkamenetek beolvasása és listázása

Az alábbi táblázat a Python-parancsokat mutatja be, hogy lekérje az adott munkamenet összes munkamenetének és feladatának listáját.

Parancs Leírás
workspace.list_sessions() vagy session.list_sessions() A Quantum Workspace összes munkamenetének listájának lekérése.
workspace.get_session(sessionId) vagy session.get_session(sessionId) A munkamenet lekérése azonosítóval sessionId. Minden munkamenet egyedi azonosítóval rendelkezik.
workspace.list_session_jobs(sessionId) vagy session.list_session_jobs(sessionId) A munkamenet összes feladatának listájának lekérése azonosítóval sessionId. Minden munkamenet egyedi azonosítóval rendelkezik.

Az alábbi kód például egy olyan függvényt határoz meg, amely minimális számú feladattal rendelkező munkamenetet kap. Ezután az adott munkamenetben felsorolja az összes feladatot, a feladatok teljes számát és az első 10 feladatot.

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

A munkamenetek megnyitásának/bezárásának manuális módszerei

Javasoljuk, hogy kövesse a munkamenetek használatának első lépéseit egy új munkamenet létrehozásához. Manuálisan is létrehozhat munkameneteket.

  1. Először hozzon létre egy munkamenet-objektumot.

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

    Feljegyzés

    Ezen a ponton a munkamenet csak az ügyfélen létezik, és láthatja, hogy az állapot Nincs. A munkamenet állapotának megtekintéséhez létre kell hoznia a munkamenetet a szolgáltatásban is.

  2. Ha munkamenetet szeretne létrehozni a szolgáltatásban, használhatja workspace.open_session(session) vagy session.open().

  3. Az állapotot és a munkamenet részleteit frissítheti a munkamenet-azonosítóvalsession.refresh(), vagy egy új munkamenet-objektumot is leküldhet egy munkamenet-azonosítóból.

    same_session = workspace.get_session(session.id) 
    print(f"Session: {session.details} \n")
    print(f"Session: {same_session.details} \n")
    
  4. Bezárhat egy munkamenetet a vagy workspace.close_session(session)a session.close() .

  5. A munkamenet egyhez targetvaló csatolásához használhatja target.latest_sessiona következőt:

  6. Megvárhatja a munkamenet befejezését:

    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)
    

Argumentumok átadása a következőben: Q#

Ha a Q# művelet bemeneti argumentumokat használ, ezeket az argumentumokat a rendszer a feladat beküldése során adja át, ami Python-kód. Ez azt jelenti, hogy körültekintően kell formáznia az argumentumokat objektumként Q# .

Amikor paraméterekként ad át argumentumokat a feladatnak, a rendszer kódként Q# formázza őket híváskor qsharp.compile, így a Python értékeit érvényes Q# szintaxisként sztringbe kell formázni.

Vegye figyelembe a következő Q# programot, amely egy egész számot és negy szögtömböt anglevesz fel bemenetként.

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

A műveletet háromszor, különböző szögekkel n=2 szeretné futtatniGenerateRandomBits. A következő Python-kóddal három különböző szögű feladatot küldhet be.

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]

Ebben a példában, mivel a Python tömbjei már [item0, item1, ...] formátumban vannak nyomtatva, a bemeneti argumentumok megegyeznek a Q# formázási értékekkel. Más Python-adatstruktúrák esetében több kezelésre lehet szükség a sztringértékek kompatibilis módon való beszúrásához Q# . Egy vesszőnek például Q# zárójelben kell lennie vesszővel elválasztott értékekkel.

Munkamenet időtúllépései

A munkamenet túllépi az időkorlátot, ha a munkameneten belül 10 percig nem küld el új feladatot. A munkamenet a TimedOut állapotot jelenti. A helyzet elkerülése érdekében adjon hozzá egy with blokkot a használatával backend.open_session(name="Name"), így a szolgáltatás meghívja a munkamenetet close() a kódblokk végén.

Feljegyzés

Ha hibák vagy hibák lépnek fel a programban, több mint 10 percet vehet igénybe egy új feladat elküldése, miután a munkamenet korábbi feladatai mind befejeződtek.

Az alábbi kódrészletek egy példát mutatnak arra, hogy a munkamenet 10 perc elteltével túllépi az időkorlátot, mert nem küld el új feladatokat. Ennek elkerülése érdekében a következő kódrészlet bemutatja, hogyan használható blokk egy with munkamenet létrehozásához.

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

Feladathiba-szabályzat a munkameneteken belül

A feladat meghiúsulása esetén a munkamenet alapértelmezett házirendje az adott munkamenet befejezése. Ha ugyanazon a munkameneten belül küld el egy további feladatot, a szolgáltatás elutasítja azt, és a munkamenet sikertelen állapotot jelez. A folyamatban lévő feladatok megszakadnak.

Ez a viselkedés azonban módosítható úgy, hogy a munkamenet létrehozásakor az alapértelmezett SessionJobFailurePolicy.ABORThelyett egy feladathiba-szabályzatot job_failure_policy=SessionJobFailurePolicy.CONTINUEad meg. Ha a feladathiba-szabályzat az CONTINUE, a szolgáltatás továbbra is fogadja a feladatokat. A munkamenet ebben az esetben hiba(ok) állapotot jelez, amely a munkamenet bezárása után sikertelen lesz.

Ha a munkamenet soha nem zárul le, és időtúllépés történik, akkor is időtúllépési állapotú, ha a feladatok sikertelenek.

A következő program például létrehoz egy munkamenetet három feladattal. Az első feladat meghiúsul, mert bemeneti adatként van megadva "garbage" . A munkamenet ezen a ponton történő befejezésének elkerülése érdekében a program bemutatja, hogyan lehet hozzáadni job_failure_policy=SessionJobFailurePolicy.CONTINUE a munkamenet létrehozásakor.

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