Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
W Azure Quantumprogramie można grupować wiele zadań względem jednego obiektu docelowego, aby efektywnie zarządzać zadaniami. Jest to nazywane sesją. Aby uzyskać więcej informacji, zobacz Wprowadzenie do sesji.
Z tego artykułu dowiesz się, jak używać sesji do ręcznego zarządzania zadaniami. Dowiesz się również o zasadach dotyczących niepowodzenia zadań oraz o sposobach unikania przekroczenia limitu czasu sesji.
Wymagania wstępne
Konto platformy Azure z aktywną subskrypcją. Jeśli nie masz konta platformy Azure, zarejestruj się bezpłatnie i wybierz subskrypcję typu "płać za użycie".
Obszar Azure Quantum roboczy. Aby uzyskać więcej informacji, zobacz Tworzenie obszaru roboczegoAzure Quantum.
Środowisko Python z zainstalowanym Python i Pip.
Biblioteka
qdkPython . Jeśli chcesz użyć Qiskit lub Cirq, musisz zainstalować dodatkiazureiqiskit.pip install --upgrade "qdk[azure,qiskit]"
Uwaga
Sesje są zarządzane za pomocą programu Python, nawet w przypadku uruchamiania Q# kodu wbudowanego.
Monitorowanie sesji
Możesz użyć bloku zarządzania zadaniami w obszarze roboczym usługi Quantum, aby wyświetlić wszystkie przesłane elementy najwyższego poziomu, w tym sesje i poszczególne zadania, które nie są skojarzone z żadną sesją.
- Wybierz blok Zarządzanie zadaniami w obszarze roboczym Quantum.
- Zidentyfikuj zadania typu Sesja. W tym widoku można znaleźć unikatowy identyfikator sesji w kolumnie Id i monitorować stan sesji. Sesje mogą mieć następujące stany:
- Oczekiwanie: zadania w ramach sesji są obecnie uruchomione.
- Powodzenie: sesja została zakończona pomyślnie.
- Limit czasu: jeśli w sesji nie zostanie przesłane żadne nowe zadanie przez 10 minut, limit czasu tej sesji zostanie przekroczony. Aby uzyskać więcej informacji, zobacz Limity czasu sesji.
- Niepowodzenie: jeśli zadanie w ramach sesji zakończy się niepowodzeniem, ta sesja zakończy się i zgłosi stan Niepowodzenie. Aby uzyskać więcej informacji, zobacz zasady niepowodzenia zadania w ramach sesji.
- Kliknij nazwę sesji, aby uzyskać więcej szczegółów.
- Możesz wyświetlić listę Wszystkie zadania w ramach sesji i monitorować ich stany.
Pobieranie i wyświetlanie listy sesji
W poniższej tabeli przedstawiono Python polecenia umożliwiające pobranie listy wszystkich sesji i wszystkich zadań dla danej sesji.
| Komenda | Opis |
|---|---|
workspace.list_sessions() lub session.list_sessions() |
Pobierz listę wszystkich sesji w obszarze roboczym kwantowym. |
workspace.get_session(sessionId) lub session.get_session(sessionId) |
Pobierz sesję z identyfikatorem sessionId. Każda sesja ma unikatowy identyfikator. |
workspace.list_session_jobs(sessionId) lub session.list_session_jobs(sessionId) |
Pobierz listę wszystkich zadań w sesji z identyfikatorem sessionId. Każda sesja ma unikatowy identyfikator. |
Na przykład poniższy kod definiuje funkcję, która pobiera sesję z najmniejszą liczbą zadań. Następnie dla tej sesji wyświetla listę wszystkich zadań, łączną liczbę zadań i pierwsze 10 zadań.
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}")
Ręczne otwieranie lub zamykanie sesji
Aby utworzyć nową sesję, najlepszym rozwiązaniem jest wykonanie kroków opisanych w temacie Rozpoczynanie pracy z sesjami. Jeśli zamiast tego chcesz ręcznie utworzyć sesje, wybierz kartę dla środowiska deweloperskiego.
Utwórz obiekt Sesja.
from qdk.azure.job 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}")Uwaga
W tym momencie sesja istnieje tylko na kliencie i widać, że stan to None. Aby wyświetlić stan sesji, należy również utworzyć sesję w usłudze.
Aby utworzyć sesję w usłudze, możesz użyć
workspace.open_session(session)lubsession.open().Możesz odświeżyć stan i szczegóły sesji przy użyciu
session.refresh()lub uzyskać nowy obiekt sesji z identyfikatora sesji.same_session = workspace.get_session(session.id) print(f"Session: {session.details} \n") print(f"Session: {same_session.details} \n")Możesz zamknąć sesję przy użyciu
session.close()lubworkspace.close_session(session).Aby dołączyć sesję do obiektu docelowego, możesz użyć polecenia
target.latest_session.Możesz poczekać na ukończenie sesji.
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)
Przekazywanie argumentów w Q#
Q# Jeśli operacja przyjmuje argumenty wejściowe, te argumenty są przekazywane podczas przesyłania zadania, czyli koduPython. Oznacza to, że należy sformatować argumenty jako Q# obiekty.
Po przekazaniu argumentów jako parametrów do zadania, argumenty są formatowane jako kod Q#, gdy qsharp.compile jest wywoływany, więc wartości z Python muszą być sformatowane jako ciąg znaków zgodnie z prawidłową składnią Q#.
Rozważmy następujący program Q#, który przyjmuje liczbę całkowitą, ni tablicę kątów, angle, jako dane wejściowe.
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;
}
Chcesz uruchomić operację GenerateRandomBits trzy razy z n=2 i różnymi kątami. Możesz użyć następującego Python kodu, aby przesłać trzy zadania z różnymi kątami.
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]
W tym przykładzie, ponieważ tablice w elemencie Python są już drukowane jako [item0, item1, ...], argumenty wejściowe są zgodne z formatowaniem Q# . W przypadku innych Python struktur danych może być potrzebna dodatkowa obsługa, aby umieścić wartości ciągów w Q# w zgodny sposób. Na przykład krotka Q# musi być umieszczona w nawiasach, a jej wartości powinny być rozdzielone przecinkami.
Przekroczenia czasu sesji
Sesja wygaśnie, jeśli w ciągu 10 minut nie zostanie przesłane żadne nowe zadanie. Sesja zgłasza status Przekroczenie limitu czasu. Aby uniknąć tej sytuacji, dodaj blok with przy użyciu backend.open_session(name="Name"), więc sesja close() jest wywoływana przez usługę na końcu bloku kodu.
Uwaga
Jeśli w twoim programie występują błędy lub usterki, przesłanie nowego zadania po zakończeniu poprzednich zadań w sesji może potrwać ponad 10 minut.
Poniższe fragmenty kodu pokazują przykład zakończenia sesji po 10 minutach, ponieważ nie przesłano żadnych nowych zadań. Aby tego uniknąć, następny fragment kodu pokazuje, jak utworzyć sesję przy użyciu bloku with.
#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()
Zasady niepowodzenia zadania w ramach sesji
Domyślne zasady dla sesji, gdy zadanie zakończy się niepowodzeniem, to zakończenie tej sesji. Jeśli przesyłasz dodatkowe zadanie w ramach tej samej sesji, usługa ją odrzuca, a sesja zgłasza stan Niepowodzenie. Wszystkie zadania w toku są anulowane.
To zachowanie można jednak zmienić, określając politykę niepowodzenia zadania job_failure_policy=SessionJobFailurePolicy.CONTINUEzamiast domyślnej SessionJobFailurePolicy.ABORTpodczas tworzenia sesji. Gdy polityka niepowodzenia zadania jest CONTINUE, usługa nadal akceptuje zadania. Sesja zgłasza stan Niepowodzenie(a) w tym przypadku, który zmieni się na Niepowodzenie po zamknięciu sesji.
Jeśli sesja nigdy nie zostanie zamknięta i czas wygaśnie, stan to TimedOut nawet wtedy, gdy zadania zakończyły się niepowodzeniem.
Na przykład poniższy program tworzy sesję z trzema zadaniami. Pierwsze zadanie kończy się niepowodzeniem, ponieważ określa "garbage" jako dane wejściowe. Aby uniknąć zakończenia sesji w tym momencie, program pokazuje, jak dodać job_failure_policy=SessionJobFailurePolicy.CONTINUE podczas tworzenia sesji.
#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")