Wykorzystanie zasobów obliczeniowych
Wykorzystanie zasobów reprezentuje zużycie usługi Qiskit Runtime i jest określane przez czas, przez jaki QPU jest zablokowany w celu wykonania workloadów.
- Wykorzystanie Session jest mierzone jako czas, który upływa, gdy sesja pozostaje aktywna, ponieważ pojemność QPU jest zarezerwowana na czas trwania sesji, niezależnie od tego, czy workloady są aktywnie uruchomione. Więcej informacji o przejściach między stanami sesji znajdziesz w artykule Długość sesji.
- Wykorzystanie Batch jest mierzone jako łączny czas, przez jaki QPU jest zablokowany w celu wykonania wszystkich zadań w batchu.
- Wykorzystanie pojedynczego zadania jest mierzone jako czas, przez jaki QPU jest zablokowany w celu wykonania zadania.
Pamiętaj, że nieudane lub anulowane zadania w pewnych okolicznościach wliczają się do twojego wykorzystania — szczegóły znajdziesz w sekcji Nieudane i anulowane zadania.
Użytkownicy planu Pay-As-You-Go mogą zapoznać się z artykułem Zarządzanie kosztami, aby uzyskać szczegółowe informacje o ustawianiu limitu kosztów.
Wykorzystanie zasobów dla nieudanych i anulowanych zadań
Gdy zadanie zakończy się błędem lub zostanie anulowane, raportowane wykorzystanie wygląda następująco:
-
Tryb zadania lub batch: Jeśli niepowodzenie lub anulowanie nastąpiło z powodu błędu systemowego, raportowane wykorzystanie wynosi zero. W przypadku zadań, które zakończyły się błędem z powodu błędu użytkownika lub gdy użytkownik anulował zadanie, raportowane wykorzystanie obejmuje wszelkie zużycie, które nastąpiło do tego momentu, w tym narzut poniesiony w celu przygotowania QPU do uruchomienia zadania.
-
Tryb Session: Raportowane wykorzystanie to czas zegarowy, przez który sesja jest aktywna, niezależnie od liczby zadań zakończonych błędem lub anulowanych.
Sprawdzanie rzeczywistego wykorzystania workloadu
Po zakończeniu workloadu istnieje kilka sposobów na sprawdzenie jego rzeczywistego wykorzystania:
- Uruchom
batch.usage()lubsession.usage()wqiskit-ibm-runtimew wersji 0.30 lub nowszej. Jeśli używasz starszej wersjiqiskit-ibm-runtime(>= 0.23 i < 0.30), wykorzystanie nadal można znaleźć wsession.details()["usage_time"]ibatch.details()["usage_time"]. - Użyj
GET /sessions/{id}, aby zobaczyć wykorzystanie dla konkretnego batchu lub sesji. - Użyj
GET /jobs/{id}, aby zobaczyć wykorzystanie dla pojedynczego zadania.
Przeglądanie wykorzystania instancji
Możesz sprawdzić wykorzystanie instancji na stronie Instancje lub — dla osób z odpowiednimi uprawnieniami — na stronie Analityka. Pamiętaj, że strony te mogą wyświetlać różne wartości wykorzystania, ponieważ obliczają je w odmienny sposób.
Strona Instancje pokazuje wykorzystanie w czasie rzeczywistym z ostatnich 28 dni (kroczące), aż do bieżącej chwili w bieżącym dniu. Dane o wykorzystaniu na stronie Analityka są przeliczane co godzinę i obejmują ostatnie 28 pełnych dni, czyli pokazują wykorzystanie od godz. 00:00 sprzed 28 dni do dziś, do pełnej godziny.
Szacowanie wykorzystania przed przesłaniem zadania
Chociaż dokładne lokalne oszacowanie jest skomplikowane przez dodatkowe operacje wykonywane w ramach tłumienia i łagodzenia błędów, możesz użyć poniższego bazowego wzoru, aby uzyskać przybliżone szacowane wykorzystanie:
<per sub-job overhead> + (rep_delay + <circuit length>) * <num executions>
<per sub-job overhead>to narzut wynoszący około 2 s na podzadanie. Obejmuje on operacje takie jak ładowanie ładunku do elektroniki sterującej. Twoje zadanie prymitywu może zostać podzielone na wiele podzadań, jeśli jest zbyt duże, aby silnik wykonawczy przetworzył je jednorazowo.rep_delayto opcja konfigurowalna przez użytkownika, a jej domyślna wartość jest podawana przezbackend.default_rep_delay, która na większości backendów IBM Quantum wynosi 250 mikrosekund. Pamiętaj, że zmniejszenierep_delayskraca całkowity czas wykonania QPU, ale kosztem zwiększonego współczynnika błędów przygotowania stanu — więcej informacji znajdziesz w przewodniku Wykonanie z dynamiczną częstotliwością powtórzeń.<circuit length>to całkowita długość instrukcji. Każda instrukcja zajmuje inną ilość czasu na QPU, więc całkowita długość różni się w zależności od Circuit. Na przykład pomiar może trwać 56 razy dłużej niż bramkax. Do znalezienia dokładnego czasu trwania każdej instrukcji można użyćbackend.target[<instruction>][<qubit>].duration. Typowa długość Circuit wynosi prawdopodobnie od 50 do 100 mikrosekund. Jeśli używasz technik tłumienia lub łagodzenia błędów w prymitywach, do obwód mogą zostać wstawione dodatkowe instrukcje, co zwiększy całkowitą długość Circuit.uwagaEksperymentalna opcja
scheduler_timingzwraca całkowity czas Circuit, ale NIE jest to czas używany do rozliczeń.<num executions>to całkowita liczba układów pomnożona przez liczbę strzałów, gdzie układy to te wygenerowane po rozgłoszeniu elementów PUB.- Jeśli używasz technik łagodzenia błędów w prymitywach, w ramach procesu łagodzenia mogą zostać uruchomione dodatkowe układy, co zwiększy całkowitą liczbę wykonań. Ponadto zaawansowane techniki łagodzenia błędów, takie jak PEA i PEC, wiążą się ze znacznie wyższym narzutem, ponieważ wymagają uruchomienia układów do uczenia szumu.
- Estimator grupuje obserwable komutujące bitwowo, co zmniejsza liczbę wykonań.
Jeśli nie używasz żadnych zaawansowanych technik łagodzenia błędów ani niestandardowego rep_delay, możesz skorzystać z szybkiego wzoru 2+0.00035*<num executions>.
Szacowanie wykorzystania lokalnie przy użyciu Qiskit
Ten przykład kodu pokazuje, jak używać Qiskit do obliczania czasu układu:
# Schedule the circuit to get more accurate timing
pm = generate_preset_pass_manager(
target=backend.target,
optimization_level=0,
scheduling_method="alap"
)
scheduled_circuits = pm.run(isa_circuits)
init_duration = backend.target["reset"][(0,)].duration
rep_delay = sampler.options.execution.rep_delay or backend.default_rep_delay
circuit_duration = 0
for circuit in scheduled_circuits:
# Estimate circuit length
circuit_duration += circuit.estimate_duration(backend.target)
# Add INIT time
if sampler.options.execution.init_qubits:
circuit_duration += init_duration
# Add rep_delay
circuit_duration += rep_delay
total_time = 2 + (circuit_duration*shots)
print(f"Total estimated usage is {math.ceil(total_time)} seconds")
Następne kroki
- Zapoznaj się z tymi wskazówkami: Minimalizacja czasu wykonywania zadania.
- Ustaw Maksymalny czas wykonania.
- Dowiedz się, jak transpilować lokalnie, w sekcji Transpiler.
- Wypróbuj przewodnik Porównywanie ustawień Transpilera.