Vai al contenuto principale

Utilizzo del workload

L'utilizzo rappresenta il consumo del servizio Qiskit Runtime ed è determinato dalla quantità di tempo in cui un QPU è bloccato per eseguire i workload.

  • L'utilizzo della sessione viene misurato come il tempo trascorso mentre la sessione rimane attiva, poiché la capacità del QPU è riservata per tutta la durata della sessione, indipendentemente dal fatto che vi siano workload attivamente in esecuzione. Consulta Durata della sessione per ulteriori informazioni sulle transizioni di stato della sessione.
  • L'utilizzo del batch viene misurato come il tempo cumulativo in cui il QPU è bloccato per eseguire tutti i job nel batch.
  • L'utilizzo di un singolo job viene misurato come il tempo in cui il QPU è bloccato per eseguire il job.

Tieni presente che i job falliti o annullati vengono conteggiati nel tuo utilizzo in determinate circostanze — consulta la sezione Job falliti e annullati per i dettagli.

Per gli utenti del Piano Pay-As-You-Go, consulta Gestisci i costi per i dettagli su come impostare un limite di costo.

Utilizzo per job falliti e annullati

Quando un job è fallito o annullato, l'utilizzo riportato è il seguente:

  • Modalità job o batch: Se il fallimento o l'annullamento si è verificato a causa di un errore di sistema, l'utilizzo riportato è zero. Per i job falliti a causa di un errore dell'utente o quando un utente ha annullato un job, l'utilizzo riportato è qualsiasi consumo già avvenuto fino a quel momento.

  • Modalità sessione: L'utilizzo riportato è il tempo reale (wall-clock) in cui la sessione è attiva, indipendentemente dal numero di job che falliscono o vengono annullati.

Interrogare l'utilizzo effettivo di un workload

Dopo che un workload è stato completato, esistono diversi modi per visualizzare il suo utilizzo effettivo:

  • Esegui batch.usage() o session.usage() in qiskit-ibm-runtime 0.30 o versioni successive. Se stai usando una versione precedente di qiskit-ibm-runtime (>= 0.23 e < 0.30), l'utilizzo può comunque essere trovato in session.details()["usage_time"] e batch.details()["usage_time"].
  • Usa GET /sessions/{id} per vedere l'utilizzo di un batch o di una sessione specifici.
  • Usa GET /jobs/{id} per vedere l'utilizzo di un singolo job.

Visualizzare l'utilizzo dell'istanza

Puoi visualizzare l'utilizzo di un'istanza nella pagina Istanze oppure, per chi dispone delle autorizzazioni appropriate, nella pagina Analytics. Tieni presente che le pagine potrebbero mostrare numeri di utilizzo diversi perché calcolano l'utilizzo in modo differente.

La pagina Istanze mostra l'utilizzo in tempo reale degli ultimi 28 giorni (a finestra mobile), fino all'ora corrente del giorno corrente. L'utilizzo nella pagina Analytics viene ricalcolato ogni ora e include gli ultimi 28 giorni completi; cioè, mostra l'utilizzo dalle 00:00 di 28 giorni fa ad oggi, all'inizio dell'ora.

Stimare l'utilizzo prima di inviare un job

Sebbene ottenere una stima locale accurata sia complicato dalle operazioni aggiuntive eseguite per la soppressione e la mitigazione degli errori, puoi usare questa formula di base per ottenere un'approssimazione dell'utilizzo stimato:

<per sub-job overhead> + (rep_delay + <circuit length>) * <num executions>

  • <per sub-job overhead> è un overhead di circa 2s per sub-job. Questo include operazioni come il caricamento del payload nell'elettronica di controllo. Il tuo job primitiva potrebbe essere suddiviso in più sub-job se è troppo grande perché il motore di esecuzione lo possa elaborare tutto in una volta.
  • rep_delay è un'opzione personalizzabile dall'utente, e il valore predefinito è dato da backend.default_rep_delay, che è 250 microsecondi sulla maggior parte dei backend IBM Quantum. Tieni presente che abbassare rep_delay riduce il tempo di esecuzione totale del QPU, ma a scapito di un aumento del tasso di errore nella preparazione degli stati; consulta la guida Esecuzione con tasso di ripetizione dinamico per ulteriori informazioni.
  • <circuit length> è la lunghezza totale delle istruzioni. Ogni istruzione richiede un tempo diverso sul QPU, quindi la lunghezza totale varia da circuito a circuito. Una misurazione, ad esempio, può richiedere 56 volte più tempo di un gate x. backend.target[<instruction>][<qubit>].duration può essere usato per trovare la durata esatta di ogni istruzione. Una lunghezza tipica del circuito è probabilmente compresa tra 50 e 100 microsecondi. Se stai usando tecniche di soppressione o mitigazione degli errori con le primitive, istruzioni aggiuntive potrebbero essere inserite nel tuo circuito, il che aumenterebbe la lunghezza totale del circuito.
    nota

    L'opzione sperimentale scheduler_timing restituisce il tempo totale del circuito, ma questo NON è il tempo usato per la fatturazione.

  • <num executions> è il numero totale di circuito moltiplicato per il numero di shot, dove i circuiti sono quelli generati dopo la trasmissione degli elementi PUB.
    • Se stai usando tecniche di mitigazione degli errori con le primitive, circuito aggiuntivi potrebbero essere eseguiti come parte del processo di mitigazione, il che aumenterebbe il numero totale di esecuzioni. Inoltre, le tecniche avanzate di mitigazione degli errori come PEA e PEC hanno un overhead molto più elevato perché richiedono l'esecuzione di circuito per l'apprendimento del rumore.
    • L'Estimator raggruppa gli osservabili che commutano qubit per qubit, il che riduce il numero di esecuzioni.

Se non stai usando tecniche avanzate di mitigazione degli errori né un rep_delay personalizzato, puoi usare 2+0.00035*<num executions> come formula rapida.

Stima l'utilizzo in locale con Qiskit

Questo esempio di codice mostra come usare Qiskit per calcolare il tempo del circuito:


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

Passi successivi

Raccomandazioni