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 aazure-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.
- Válassza ki a Feladatkezelés panelt a Quantum-munkaterületen.
- 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.
- További részletekért kattintson a munkamenet nevére.
- 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.
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.
Ha munkamenetet szeretne létrehozni a szolgáltatásban, használhatja
workspace.open_session(session)
vagysession.open()
.Az állapotot és a munkamenet részleteit frissítheti a munkamenet-azonosítóval
session.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")
Bezárhat egy munkamenetet a vagy
workspace.close_session(session)
asession.close()
.A munkamenet egyhez targetvaló csatolásához használhatja
target.latest_session
a következőt: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 n
egy szögtömböt angle
vesz 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.ABORT
helyett egy feladathiba-szabályzatot job_failure_policy=SessionJobFailurePolicy.CONTINUE
ad 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")