Správa relací
V tomto článku se dozvíte, jak spravovat relace. Pomocí relací můžete seskupit jednu nebo více úloh do jedné targetúlohy, což umožňuje efektivně spravovat úlohy. Další informace najdete v tématu Začínáme s relacemi.
Požadavky
Účet Azure s aktivním předplatným. Pokud nemáte účet Azure, zaregistrujte se zdarma a zaregistrujte si předplatné s průběžným platbou.
Pracovní prostor Azure Quantum. Další informace najdete v tématu Vytvoření pracovního prostoru Azure Quantum.
Prostředí Pythonu s nainstalovaným Pythonem a Pipem
Balíček Azure Quantum
azure-quantum
. Pokud chcete použít Qiskit nebo Cirq, musíte balíček nainstalovatazure-quantum
se značkami [qiskit] nebo [cirq].pip install --upgrade azure-quantum[qiskit]
Poznámka:
Relace se spravují pomocí Pythonu, i když běží Q# vložený kód.
Monitorování relací
Okno Správa úloh v pracovním prostoru Quantum můžete použít k zobrazení všech odeslaných položek nejvyšší úrovně, včetně relací a jednotlivých úloh, které nejsou přidružené k žádné relaci.
- V pracovním prostoru Quantum vyberte okno Správa úloh.
- Identifikujte úlohy typu Relace. V tomto zobrazení můžete zobrazit jedinečné ID relace ve sloupci ID a sledovat jeho stav. Stavy relace jsou:
- Čekání: Úlohy v rámci relace se spouštějí.
- Úspěšné: Relace byla úspěšně ukončena.
- Časový limit: Pokud během relace po dobu 10 minut není odeslána žádná nová úloha, vyprší časový limit této relace. Další informace naleznete v tématu Vypršení časových limitů relace.
- Selhání: Pokud úloha v rámci relace selže, skončí tato relace a nahlásí stav Selhání. Další informace najdete v tématu Zásady selhání úlohy v rámci relací.
- Kliknutím na název relace zobrazíte další podrobnosti.
- Zobrazí se seznam všech úloh v rámci relace a monitoruje jejich stav.
Načítání a výpis relací
Následující tabulka ukazuje příkazy Pythonu pro získání seznamu všech relací a všech úloh pro danou relaci.
Příkaz | Popis |
---|---|
workspace.list_sessions() nebo session.list_sessions() |
Načte seznam všech relací v pracovním prostoru Quantum. |
workspace.get_session(sessionId) nebo session.get_session(sessionId) |
Načtěte relaci s ID sessionId . Každá relace má jedinečné ID. |
workspace.list_session_jobs(sessionId) nebo session.list_session_jobs(sessionId) |
Načte seznam všech úloh v relaci s ID sessionId . Každá relace má jedinečné ID. |
Například následující kód definuje funkci, která získá relaci s minimálním počtem úloh. V této relaci se pak zobrazí seznam všech úloh, celkový počet úloh a prvních 10 úloh.
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}")
Ruční metody otevírání a zavírání relací
Doporučujeme postupovat podle kroků v části Začínáme s relacemi a vytvořit novou relaci. Relace můžete vytvářet také ručně.
Nejprve vytvořte objekt Session.
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}")
Poznámka:
V tomto okamžiku relace existuje pouze v klientovi a vidíte, že je stav Žádný. Pokud chcete zobrazit stav relace, musíte také vytvořit relaci ve službě.
K vytvoření relace ve službě můžete použít
workspace.open_session(session)
nebosession.open()
.Stav a podrobnosti relace můžete aktualizovat pomocí
session.refresh()
objektu relace nebo získáním nového objektu relace z ID relace.same_session = workspace.get_session(session.id) print(f"Session: {session.details} \n") print(f"Session: {same_session.details} \n")
Relaci můžete zavřít s
session.close()
neboworkspace.close_session(session)
.K připojení relace k target, můžete použít
target.latest_session
.Můžete počkat na dokončení relace:
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)
Předávání argumentů v Q#
Pokud vaše Q# operace přebírá vstupní argumenty, předávají se tyto argumenty během odeslání úlohy, což je kód Pythonu. To znamená, že při formátování argumentů jako Q# objektů musíte být opatrní.
Při předávání argumentů jako parametrů do úlohy jsou při volání qsharp.compile
formátovány jako Q# kód, takže hodnoty z Pythonu musí být formátovány do řetězce jako platné Q# syntaxe.
Zvažte následující Q# program, který jako vstup přebírá celé číslo n
a pole úhlů angle
.
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;
}
Operaci chcete spustit GenerateRandomBits
třikrát s n=2
různými úhly a různými úhly. Pomocí následujícího kódu Pythonu můžete odeslat tři úlohy s různými úhly.
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]
V tomto příkladu jsou pole v Pythonu již vytištěna jako [item0, item1, ...], vstupní argumenty odpovídají Q# formátování. U jiných datových struktur Pythonu možná budete potřebovat více zpracování, abyste získali řetězcové hodnoty vložené do Q# kompatibilního způsobu. Například Q# řazená kolekce členů musí být v závorkách s hodnotami oddělenými čárkami.
Vypršení časových limitů relace
Relace vyprší, pokud se během relace po dobu 10 minut neposílají žádná nová úloha. Relace hlásí stav časového limitu. Chcete-li se této situaci vyhnout, přidejte with
blok using backend.open_session(name="Name")
, takže relace close()
je vyvolána službou na konci bloku kódu.
Poznámka:
Pokud v programu dojde k chybám nebo chybám, může odeslání nové úlohy po dokončení předchozí úlohy v relaci trvat déle než 10 minut.
Následující fragmenty kódu ukazují příklad vypršení časového limitu relace po 10 minutách, protože se neposílají žádné nové úlohy. Aby se tomu zabránilo, další fragment kódu ukazuje, jak pomocí with
bloku vytvořit relaci.
#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()
Zásady selhání úloh v rámci relací
Výchozí zásada relace, když úloha selže, je ukončit tuto relaci. Pokud odešlete další úlohu ve stejné relaci, služba ji odmítne a relace hlásí stav Selhání. Všechny probíhající úlohy se zruší.
Toto chování však může být změněno zadáním zásady job_failure_policy=SessionJobFailurePolicy.CONTINUE
selhání úlohy namísto výchozího SessionJobFailurePolicy.ABORT
nastavení při vytváření relace. Pokud je CONTINUE
zásada selhání úlohy, služba nadále přijímá úlohy. Relace v tomto případě hlásí stav Selhání , které se po zavření relace změní na Neúspěšné .
Pokud relace nikdy není uzavřená a vyprší časový limit, stav je Časový limit , i když úlohy selhaly.
Například následující program vytvoří relaci se třemi úlohami. První úloha selže, protože určuje "garbage"
jako vstupní data. Aby se zabránilo ukončení relace v tomto okamžiku, program ukazuje, jak přidat job_failure_policy=SessionJobFailurePolicy.CONTINUE
při vytváření relace.
#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")