Personalizzare i target parametri dello strumento di stima delle risorse
Questo articolo illustra come personalizzare i target parametri dello strumento di stima delle risorse di Azure Quantum in modo che targetcorrispondano alle caratteristiche del computer in uso. Resource Estimator usa questi parametri per stimare le risorse necessarie per eseguire un algoritmo quantistico in un computer quantistico.
Nota
Se si verificano problemi durante l'uso di Resource Estimator, vedere la pagina Risoluzione dei problemi.
Prerequisiti
Un ambiente Python con Python e Pip installato.
La versione più recente di Visual Studio Code o aprire VS Code sul Web.
VS Code con le estensioni Azure Quantum Development Kit, Python e Jupyter installate.
I pacchetti e
qsharp-widgets
Azure Quantumqsharp
più recenti.python -m pip install --upgrade qsharp qsharp-widgets
Parametri relativi alla destinazione
Resource Estimator calcola la stima delle risorse, ad esempio il numero di qubit e il tempo di esecuzione, che sarebbe necessario implementare un algoritmo quantistico specifico usando una determinata tecnologia qubit e con un set fisso di scelte architetturali.
Di conseguenza, Lo strumento di stima delle risorse accetta un set di input, con valori predefiniti per iniziare facilmente:
- Un modello qubit fisico, che definisce le proprietà dei qubit fisici sottostanti.
- Schema QEC (Quantum Error Correction), che è lo schema di correzione degli errori quantistici assunto.
- Un budget di errore, ovvero l'errore complessivo consentito, ovvero il numero di volte in cui il programma può annullare le operazioni.
- Vincoli a livello di componente, ovvero il numero di cicli logici e il numero di copie factory T.
- Unità di classificazione per specificare algoritmi di crittografia T factory.
- Stima delle frontiere Pareto per eseguire più stime del numero di qubit e runtime per lo stesso algoritmo.
Parametri qubit fisici
Quando lo strumento di stima delle risorse modella i presupposti del qubit fisico, usa due diversi set di istruzioni fisiche per operare i qubit. Il set di istruzioni fisiche può essere basato sull'attività di controllo o Majorana. Un set di istruzioni basato sull'attività di controllo fornisce la misurazione a qubit singolo, le attività a qubit singole (inclusi le attività T) e le attività T a due qubit. Un set di istruzioni Majorana fornisce un controllo T fisico, una misurazione a qubit singolo e operazioni di misurazione congiunta a due qubit.
È possibile scegliere tra sei parametri qubit predefiniti, quattro dei quali hanno set di istruzioni basati su gate e due con un set di istruzioni Majorana. Questi modelli qubit coprono una serie di tempi di funzionamento e percentuali di errore, consentendo un'esplorazione sufficiente dei costi delle risorse necessari per abilitare applicazioni quantistice pratiche.
Parametro Qubit | Classe API Python | Descrizione |
---|---|---|
"qubit_gate_ns_e3" , "qubit_gate_ns_e4" |
GATE_NS_E3 , GATE_NS_E4 |
I tempi e le fidelità delle operazioni possono corrispondere alle versioni future dei qubit transconduttori o dei qubit di rotazione, che in genere hanno tempi operativi nel regime nanosecondo. Per questi qubit, si presuppone che le operazioni di controllo e misurazione prendano rispettivamente 50 ns e 100 ns. Si presuppone che i tassi di errore di gate a qubit e a due qubit siano $10^{-3}$ come realistico targete $10^{-4}$ come ottimista target per un sistema con scalabilità orizzontale. |
"qubit_gate_us_e3" , "qubit_gate_us_e4" |
GATE_US_E3 , GATE_US_E4 |
I tempi e le fidelità delle operazioni possono corrispondere alle versioni future dei qubit in base agli ioni, che in genere hanno tempi operativi nel regime del microsecondo. In base ai presupposti tipici per i qubit di ion, si presuppone che le operazioni di controllo e misurazione prendano 100 μs. La frequenza di errore per i cancelli Clifford a qubit singolo è $10^{-3}$ come realistica target e $10^{-4}$ come ottimistica target, mentre la frequenza di errore per i gate non Clifford a qubit singolo (T gate) è $10^{-6}$. Per i gate a due qubit, la velocità di errore è $10^{-3}$ come realistica target e $10^{-4}$ come ottimistica target. |
"qubit_maj_ns_e4" , "qubit_maj_ns_e6" |
MAJ_NS_E4 , MAJ_NS_E6 |
I tempi e le fidelità delle operazioni possono corrispondere alle versioni future migliorate dei qubit Majorana. Per questi qubit, si presuppone che le operazioni di controllo e misurazione prendano 100 ns. Per tenere conto della protezione topologica nell'hardware, si presuppone che i tassi di errore di misurazione congiunta a singolo qubit e a due qubit (tasso di errore Clifford) siano $10^{-4}$ come realistico targete $10^{-6}$ come ottimistico target. Le operazioni non Clifford in questa architettura non hanno protezione topologica, la frequenza di errore per i cancelli T fisici non Clifford è del 5%. |
Nota
A meno che non venga specificato un altro valore, il valore predefinito per il modello qubit è "qubit_gate_ns_e3"
.
Per riferimento, i parametri qubit predefiniti completi sono i seguenti:
{
"qubitParams": {
"name": "qubit_gate_ns_e3",
"instructionSet": "GateBased",
"oneQubitMeasurementTime": "100 ns",
"oneQubitGateTime": "50 ns",
"twoQubitGateTime": "50 ns",
"tGateTime": "50 ns",
"oneQubitMeasurementErrorRate": 1e-3,
"oneQubitGateErrorRate": 1e-3,
"twoQubitGateErrorRate": 1e-3,
"tGateErrorRate": 1e-3
}
}
{
"qubitParams": {
"name": "qubit_gate_ns_e4",
"instructionSet": "GateBased",
"oneQubitMeasurementTime": "100 ns",
"oneQubitGateTime": "50 ns",
"twoQubitGateTime": "50 ns",
"tGateTime": "50 ns",
"oneQubitMeasurementErrorRate": 1e-4,
"oneQubitGateErrorRate": 1e-4,
"twoQubitGateErrorRate": 1e-4,
"tGateErrorRate": 1e-4
}
}
{
"qubitParams": {
"name": "qubit_gate_us_e3",
"instructionSet": "GateBased",
"oneQubitMeasurementTime": "100 µs",
"oneQubitGateTime": "100 µs",
"twoQubitGateTime": "100 µs",
"tGateTime": "100 µs",
"oneQubitMeasurementErrorRate": 1e-3,
"oneQubitGateErrorRate": 1e-3,
"twoQubitGateErrorRate": 1e-3,
"tGateErrorRate": 1e-6
}
}
{
"qubitParams": {
"name": "qubit_gate_us_e4",
"instructionSet": "GateBased",
"oneQubitMeasurementTime": "100 µs",
"oneQubitGateTime": "100 µs",
"twoQubitGateTime": "100 µs",
"tGateTime": "100 µs",
"oneQubitMeasurementErrorRate": 1e-4,
"oneQubitGateErrorRate": 1e-4,
"twoQubitGateErrorRate": 1e-4,
"tGateErrorRate": 1e-6
}
}
{
"qubitParams": {
"name": "qubit_maj_ns_e4",
"instructionSet": "Majorana",
"oneQubitMeasurementTime": "100 ns",
"twoQubitJointMeasurementTime": "100 ns",
"tGateTime": "100 ns",
"oneQubitMeasurementErrorRate": 1e-4,
"twoQubitJointMeasurementErrorRate": 1e-4,
"tGateErrorRate": 0.05
}
}
{
"qubitParams": {
"name": "qubit_maj_ns_e6",
"instructionSet": "Majorana",
"oneQubitMeasurementTime": "100 ns",
"twoQubitJointMeasurementTime": "100 ns",
"tGateTime": "100 ns",
"oneQubitMeasurementErrorRate": 1e-6,
"twoQubitJointMeasurementErrorRate": 1e-6,
"tGateErrorRate": 0.01
}
}
Passaggio di parametri qubit predefiniti
Esistono due modi per specificare parametri qubit predefiniti a livello di codice. È possibile selezionare il nome del modello qubit per la classe durante l'esecuzione qubitParams
di qsharp.estimate
. Ad esempio, per selezionare "qubit_maj_ns_e6"
il parametro qubit, scrivere:
qsharp.estimate("RunProgram()", params=
{"qubitParams": {
"name": "qubit_maj_ns_e6"
},
})
È anche possibile passare i parametri qubit alla EstimatorParams
classe usando QubitParams
. Ad esempio, per selezionare MAJ_NS_E6
il parametro qubit, scrivere:
from qsharp.estimator import EstimatorParams, QubitParams
params = EstimatorParams()
params.qubit_params.name = QubitParams.MAJ_NS_E6 # qubit_maj_ns_e6 qubit parameter
qsharp.estimate("RunProgram()", params=params)
Personalizzare i parametri qubit predefiniti
È possibile personalizzare i parametri qubit predefiniti specificando il nome e quindi aggiornando uno qualsiasi degli altri valori. Ad esempio, per ridurre la frequenza di errore della misurazione congiunta a due qubit in "qubit_maj_ns_e4", scrivere:
qsharp.estimate("RunProgram()", params=
{"qubitParams": {
"name": "qubit_maj_ns_e4",
"twoQubitJointMeasurementErrorRate": 1e-5,
},
})
In alternativa, è possibile passare le istruzioni sotto forma di elenco.
from qsharp.estimator import EstimatorParams, QubitParams
params = MicrosoftEstimatorParams()
params.qubit_params.name = QubitParams.MAJ_NS_E4
params.qubit_params.two_qubit_joint_measurement_error_rate = 1e-5
Parametri qubit per qubit basati su Gate
Identificatore Python | Tipo di dati | Descrizione |
---|---|---|
name |
string | Nome del modello qubit |
instruction_set |
"gate_based" | Tecnologia qubit sottostante |
one_qubit_measurement_time |
stringa di tempo | Tempo dell'operazione per la misurazione a qubit singolo ($t_{\rm meas}$) in ns |
one_qubit_gate_time |
stringa di tempo | Tempo dell'operazione per il gate a qubit singolo ($t_{\rm gate}$) in ns |
two_qubit_gate_time |
stringa di tempo | Tempo di operazione per il gate a due qubit in ns |
t_gate_time |
stringa di tempo | Tempo operativo per il gate non Clifford a qubit singolo in ns |
one_qubit_measurement_error_rate |
float | Frequenza di errore per la misurazione a qubit singolo |
one_qubit_gate_error_rate |
float | Frequenza di errore per il gate Clifford a qubit singolo ($p$) |
two_qubit_gate_error_rate |
float | Frequenza di errore per il gate Clifford a due qubit |
t_gate_error_rate |
float | Frequenza di errore per preparare lo stato non Clifford a qubit singolo ($p_T$) |
idle_error_rate |
float | Frequenza degli errori corrispondente all'inattività |
Il codice seguente illustra come specificare parametri qubit personalizzati per un set di istruzioni basato su gate:
from qsharp.estimator import EstimatorParams, QubitParams,
params = EstimatorParams()
params.qubit_params.name = "your_custom_name"
params.qubit_params.instruction_set = "gate_based"
params.qubit_params.t_gate_error_rate = 0.03
params.qubit_params.t_gate_time = "10 ns"
params.qubit_params.idle_error_rate = 0.02
Nota
Se non specificato, i valori per two_qubit_gate_time
e t_gate_time
per impostazione predefinita sono one_qubit_gate_time
, i valori per e per two_qubit_gate_error_rate
impostazione t_gate_error_rate
predefinita sono e il valore per idle_error_rate
l'impostazione predefinita one_qubit_gate_error_rate
è one_qubit_measurement_error_rate
.
Parametri qubit per qubit Majorana
Identificatore Python | Tipo di dati | Descrizione |
---|---|---|
name |
string | Nome del modello qubit |
instruction_set |
"majorana" | Tecnologia qubit sottostante |
one_qubit_measurement_time |
stringa di tempo | Tempo dell'operazione per la misurazione a qubit singolo ($t_{\rm meas}$) in ns |
two-qubit_joint_measurement_time |
stringa di tempo | Tempo di operazione per la misurazione a due qubit in ns |
t_gate_time |
stringa di tempo | Tempo operativo per il gate non Clifford a qubit singolo in ns |
one_qubit_measurement_error_rate |
float | Frequenza di errore per la misurazione a qubit singolo |
two_qubit_joint_measurement_error_rate |
float | Frequenza di errore per la misurazione a due qubit |
t_gate_error_rate |
float | Frequenza di errore per preparare lo stato non Clifford a qubit singolo ($p_T$) |
idle_error_rate |
float | Frequenza degli errori corrispondente all'inattività |
Un modello minimo per il set di istruzioni basato su Majorana con tutti i valori obbligatori è:
from qsharp.estimator import EstimatorParams, QubitParams,
params = EstimatorParams()
params.qubit_params.name = "your_custom_name"
params.qubit_params.instruction_set = "majorana"
params.qubit_params.one_qubit_measurement_time = "10 ns"
params.qubit_params.one_qubit_measurement_error_rate = 0.01
Nota
Se non specificato, i valori per two_qubitJointMeasurementTime
e t_gate_time
per impostazione predefinita sono one_qubit_measurement_time
, i valori per e per two_qubit_joint_measurement_error_rate
impostazione t_gate_error_rate
predefinita sono e il valore per idle_error_rate
l'impostazione predefinita one_qubit_measurement_error_rate
è one_qubit_measurement_error_rate
.
Per one_qubit_measurement_error_rate
e two_qubit_joint_measurement_error_rate
, è possibile specificare le percentuali di errore corrispondenti ai readout di misurazione, readout
e all'elaborazione delle misurazioni, process
. Questi valori possono essere <double>
numeri o coppie di numeri. Ad esempio:
params.qubit_params.two_qubit_joint_measurement_error_rate = \
MeasurementErrorRate(process=0.00005, readout=0.00007)
Nota
Se si specifica un singolo valore numerico per la frequenza di errore a qubit singolo e a due qubit nella misura del qubit Majorana, le percentuali di errore di lettura e processo possono essere uguali.
Importante
Tutti i valori non specificati accettano un valore predefinito, ad esempio se si specifica "qubit": {"oneQubitGateTime":"200 ns"}
un qubit basato su gate, in cui sia il tempo di gate a due qubit che il tempo di gate a un qubit sono pari a 200 ns. Per le unità, è necessario specificare stringhe temporali, ovvero numeri a virgola mobile a precisione doppia, seguiti da uno spazio e dall'unità di tempo per tali valori, dove possibili suffissi temporali sono ns
, µs
(o us
), ms
e s
.
Schemi di correzione degli errori quantistici
Per eseguire applicazioni quantistice su scala pratica, le operazioni quantistice devono avere basse percentuali di errore. Queste velocità targets di errore superano in genere le funzionalità dei qubit fisici non elaborati. Per superare questa limitazione, la correzione degli errori quantistici (QEC) e il calcolo a tolleranza di errore sono due tecniche cruciali che costituiscono i blocchi predefiniti di computer quantistici su larga scala. Prima di tutto, QEC consente di comporre più qubit fisici soggetti a errori e creare un qubit logico più affidabile che mantenga le informazioni quantistiche meglio dei qubit fisici sottostanti.
La distanza del codice di correzione degli errori (o semplicemente la distanza del codice per brevità) è un parametro che controlla il numero di errori che possono essere corretti. Di conseguenza, la frequenza di errore dei qubit logici e il numero di qubit fisici necessari per codificarli. Sia l'accuratezza che il numero di qubit fisici aumentano con la distanza del codice. L'obiettivo è trovare la distanza minima del codice in grado di raggiungere la frequenza di errore richiesta impostata per una determinata applicazione.
Resource Estimator usa la formula seguente per la modellazione delle frequenze di errore logiche usando un modello esponenziale.
$$ P = a\left(\frac{p}{p^*}\right)^{\frac{d+1}{2}} $$
dove $d$ è la distanza del codice, $p$ è la frequenza degli errori fisici e $p^*$ è la soglia di correzione degli errori quantistici. La frequenza degli errori fisici $p$ viene estratta dai parametri qubit come percentuale di errori peggiore qualsiasi operazione fisica Clifford nel dispositivo.
In particolare, $p = {}$ max(one_qubit_measurement_error_rate
, one_qubit_gate_error_rate
, two_qubit_gate_error_rate
) per i parametri qubit con un set di istruzioni basato su gate e $p = {}$ max(one_qubit_measurement_error_rate
, two_qubit_joint_measurement_error_rate
) per i parametri qubit con un set di istruzioni Majorana. Gli schemi QEC hanno in genere una soglia di frequenza degli errori $p^*$ al di sotto della quale la correzione degli errori elimina gli errori.
Protocollo QEC | Classe API Python | Descrizione |
---|---|---|
"surface_code " |
SURFACE_CODE |
Il codice superficie basato su gate è basato su arXiv:1208.0928 e arXiv:1009.3686. Il codice surface majorana si basa su arXiv:1909.03002 e arXiv:2007.00307. |
"floquet_code " |
FLOQUET_CODE |
Solo per i qubit Majorana. Il codice floquet è basato su arXiv:2202.11829. |
Nota
A meno che non venga specificato un altro valore, il valore predefinito per lo schema QEC è "surface_code".
Di seguito sono riportati i parametri esatti per ogni schema QEC predefinito (incluso un cross-factor $a$, che può essere estratto numericamente per le simulazioni).
{
"qubitParams": {
"instructionSet": "GateBased",
}
"qecScheme": {
"name": "surface_code",
"errorCorrectionThreshold": 0.01,
"crossingPrefactor": 0.03,
"logicalCycleTime": "(4 * twoQubitGateTime + 2 * oneQubitMeasurementTime) * codeDistance",
"physicalQubitsPerLogicalQubit": "2 * codeDistance * codeDistance"
}
}
{
"qubitParams": {
"instructionSet": "Majorana",
}
"qecScheme": {
"name": "surface_code",
"errorCorrectionThreshold": 0.0015,
"crossingPrefactor": 0.08,
"logicalCycleTime": "20 * oneQubitMeasurementTime * codeDistance",
"physicalQubitsPerLogicalQubit": "2 * codeDistance * codeDistance"
}
}
{
"qubitParams": {
"instructionSet": "Majorana",
}
"qecScheme": {
"name": "floquet_code",
"errorCorrectionThreshold": 0.01,
"crossingPrefactor": 0.07,
"logicalCycleTime": "3 * oneQubitMeasurementTime * codeDistance",
"physicalQubitsPerLogicalQubit": "4 * codeDistance * codeDistance + 8 * (codeDistance - 1)"
}
}
Passaggio di schemi QEC predefiniti
Esistono due modi per specificare schemi QEC predefiniti. È possibile selezionare il nome del modello QEC per la classe durante l'esecuzione "qecScheme"
di qsharp.estimate
. Ad esempio, per selezionare il codice floquet, scrivere:
qsharp.estimate("RunProgram()", params=
{"qecScheme": {
"name": "floquet_code"
}
})
È anche possibile passare un elenco di parametri di stima alla EstimatorParams
classe usando la QECScheme
classe . Ad esempio, per selezionare il codice floquet, scrivere:
from qsharp.estimator import EstimatorParams, QubitParams, QECScheme,
params = EstimatorParams()
params.items.qec_scheme.name = QECScheme.FLOQUET_CODE # floquet code QEC scheme
qsharp.estimate("RunProgram()", params=params)
Personalizzare schemi QEC predefiniti
È possibile personalizzare schemi QEC predefiniti specificando il nome e quindi aggiornando uno qualsiasi degli altri valori. Ad esempio, per aumentare il pre-fattore di attraversamento nel codice floquet, scrivere:
qsharp.estimate("RunProgram()", params=
{"qecScheme": {
"name": "floquet_code",
"crossingPrefactor": 0.07,
}
})
Nota
Se non specificato, i valori per "logicalCycleTime"
e "physicalQubitsPerLogicalQubit"
per impostazione predefinita sono "oneQubitMeasurementTime"
, il valore per "errorCorrectionThreshold"
l'impostazione predefinita 0.01
è e il valore per "crossingPrefactor"
l'impostazione predefinita è 0.03
.
Personalizzare gli schemi QEC
Resource Estimator può astrarre uno schema QEC personalizzato basato sulla formula precedente specificando i valori per il "crossingPrefactor"
$a$ e il "errorCorrectionThreshold"
$p^*$. È inoltre necessario specificare , "logicalCycleTime"
ovvero il tempo necessario per eseguire una singola operazione logica, che dipende dalla distanza del codice e dai presupposti del tempo dell'operazione fisica dei qubit fisici sottostanti. Infine, una seconda formula calcola , "physicalQubitsPerLogicalQubit"
ovvero il numero di qubit fisici necessari per codificare un qubit logico in base alla distanza del codice.
È possibile usare il codice seguente come modello per gli schemi QEC:
qsharp.estimate("RunProgram()", params=
{"qecScheme": {
"crossingPrefactor": <double>,
"errorCorrectionThreshold": <double>,
"logicalCycleTime": <formula string>,
"physicalQubitsPerLogicalQubit": <formula string>
}
})
All'interno delle formule è possibile usare le variabili one_qubit_gate_time
, , one_qubit_measurement_time
two_qubit_gate_time
e two_qubit_joint_measurement_time
, i cui valori vengono ricavati dal campo corrispondente dai parametri del qubit fisico, nonché la variabile eccDistance
per la distanza di codice calcolata per il qubit logico, in base alle proprietà del qubit fisico, alla soglia di correzione degli errori e al prefactoring di incrocio. Le variabili temporali e eccDistance
possono essere usate per descrivere la logicalCycleTime
formula. Per la formula physicalQubitsPerLogicalQubit
è possibile utilizzare solo .eccDistance
Budget di errore
Il budget di errore totale $\epsilon$ imposta l'errore tollerato complessivo per l'algoritmo, ovvero la probabilità di errore consentita dell'algoritmo. Il valore globale deve essere compreso tra 0 e 1 e il valore predefinito è 0,001, che corrisponde allo 0,1%. In altre parole, l'algoritmo può non riuscire al massimo una volta in 1000 esecuzioni. Questo parametro è altamente specifico dell'applicazione.
Ad esempio, se si esegue l'algoritmo di Shor per i numeri interi di fattorizzazione, è possibile tollerare un valore elevato per il budget degli errori perché è possibile verificare che gli output siano effettivamente i fattori primi dell'input. D'altra parte, potrebbe essere necessario un budget di errore inferiore per un algoritmo che risolve un problema con una soluzione, che non può essere verificato in modo efficiente.
Il budget degli errori corrisponde alla somma di tre parti:
$$ \epsilon = \epsilon_{\log} + \epsilon_{\rm dis} + \epsilon_{\rm syn} $$
Se non viene specificato ulteriormente, il budget di errore $\epsilon$ viene distribuito in modo uniforme e si applica agli errori $\epsilon_{\log}$ per implementare qubit logici, il budget degli errori $\epsilon_{\rm dis}$ produce stati T tramite la codifica e un budget di errore $\epsilon_{\rm syn}$ per sintetizzare i gate di rotazione con angoli arbitrari.
Si noti che per la sintesi della rotazione e della rotazione, i rispettivi budget di errore $\epsilon_{\rm dis}$ e $\epsilon_{\rm syn}$ vengono distribuiti in modo uniforme tra tutti gli stati T necessari e tutti i gate di rotazione necessari, rispettivamente. Se non sono presenti controlli di rotazione nell'algoritmo di input, il budget degli errori viene distribuito in modo uniforme agli errori logici e agli errori di stato T.
Superamento del budget degli errori
Esistono due modi per specificare il budget degli errori impostando un numero compreso tra 0 e 1. È possibile passare il budget degli errori durante l'esecuzione di qsharp.estimate
. Ad esempio, per selezionare un budget di errore di 1/3, scrivere:
qsharp.estimate("RunProgram()", params=
{'errorBudget': 0.333
})
È anche possibile passare i parametri di budget degli errori alla EstimatorParams
classe .
from qsharp.estimator import EstimatorParams, QubitParams, QECScheme,
params = EstimatorParams()
params.items.error_budget = 0.333 # error budget of 1/3
qsharp.estimate("RunProgram()", params=params)
Inoltre, è possibile specificare singolarmente ogni componente del budget degli errori. La somma di tutti i valori è il budget totale degli errori e deve essere compresa tra 0 e 1. Se un algoritmo quantistico non contiene stati T o rotazioni, i valori di t_states
e rotations
possono essere 0 rispettivamente.
Il codice seguente illustra come specificare il parametro budget degli errori con stati T e rotazioni:
from qsharp.estimator import EstimatorParams, QubitParams,
params = EstimatorParams()
params.error_budget.logical = 0.01
params.error_budget.t_states = 0.02
params.error_budget.rotations = 0.03
Vincoli
È possibile usare la "constraints"
classe per applicare vincoli a livello di componente della factory T . Modificando i vincoli, è possibile ottimizzare le stime per ridurre il numero di qubit o ridurre il runtime.
Parametro | Tipo di dati | Descrizione |
---|---|---|
logical_depth_factor |
float | Controllare il tempo di esecuzione. Se ha un valore maggiore di 1, il numero iniziale di cicli logici, detto anche profondità logica, viene moltiplicato per questo numero. logical_depth_factor Riducendo , è possibile aumentare il numero di chiamate della factory T in un determinato momento, con conseguente minor numero di copie della factory T necessarie per produrre lo stesso numero di stati T. Quando si riduce il numero di copie factory T, il runtime dell'algoritmo aumenta di conseguenza. Il fattore di ridimensionamento per il runtime totale può essere maggiore, perché la frequenza di errore logica richiesta aumenta a causa del numero aggiuntivo di cicli. |
max_t_factories |
numero intero | Numero massimo di copie factory T. Lo strumento di stima delle risorse determina le risorse necessarie selezionando il numero ottimale di copie della factory T che riduce al minimo il numero di qubit fisici usati, senza considerare il sovraccarico del tempo. Il max_t_factories parametro limita il numero massimo di copie e quindi regola il numero di cicli logici di conseguenza. Per altre informazioni, vedere Stima fisica della fabbrica T. |
max_duration |
stringa di tempo | Runtime massimo per l'algoritmo. Resource Estimator accetta solo uno dei max_duration vincoli o max_physical_qubits al momento, ma non due. Se max_duration viene specificato, lo strumento di stima delle risorse tenta di trovare la stima migliore per max_physical_qubits tra le soluzioni vincolate dal numero massimo specificato. |
max_physical_qubits |
numero intero | Numero massimo di qubit fisici per l'algoritmo. Resource Estimator accetta solo uno dei max_duration vincoli o max_physical_qubits al momento, ma non due. Se max_physical_qubits viene specificato, lo strumento di stima delle risorse tenta di trovare la stima migliore per max_duration tra le soluzioni vincolate dal numero massimo specificato. |
Il codice seguente illustra come specificare i vincoli per un algoritmo quantistico:
from qsharp.estimator import EstimatorParams
params = EstimatorParams()
params.constraints.max_duration = "1 s"
params.constraints.logical_depth_factor = 1.5
params.constraints.max_t_factories = 10
Nota
Se il valore fornito a max_duration
o max_physical_qubits
è troppo piccolo per trovare una soluzione fattibile, Lo strumento di stima delle risorse restituisce un errore. Se non vengono specificati né max_duration
max_physical_qubits
vincoli, Lo strumento di stima delle risorse mira a trovare una soluzione con il tempo più breve.
Suggerimento
È possibile usare max_duration
e max_physical_qubits
per influenzare lo spazio della soluzione, potenzialmente trovare soluzioni con runtime più lungo, ma un numero inferiore di qubit rispetto alle soluzioni senza questi vincoli. Esiste un compromesso tra runtime e il numero di qubit e questo compromesso può essere gestito in modo efficiente per alcuni algoritmi, con effetti variabili su algoritmi diversi. La tabella IV in [arXiv:2211.07629] illustra l'utilizzo effettivo del compromesso tra il numero di qubit e il runtime per gli algoritmi di dinamica quantistica. Per altre informazioni, vedere Stima delle risorse quantistiche con il tempo o il numero di vincoli di qubit .
Unità di crittografia
È possibile specificare le specifiche per gli algoritmi di crittografia T factory con la DistillationUnitSpecification
classe . La specifica può essere predefinita o personalizzata. È possibile specificare una specifica predefinita selezionando il nome dell'unità di crittografia: 15-1 RM
o 15-1 space-efficient
.
from qsharp.estimator import EstimatorParams, DistillationUnitSpecification
params = EstimatorParams()
unit = DistillationUnitSpecification()
unit.name = "15-1 RM" # predefined distillation unit
params.distillation_unit_specifications.append(unit)
In entrambi i casi, la notazione 15-1 indica 15 stati T di input e 1 stato T di output. L'unità 15-1 space-efficient
di crittografia usa meno qubit rispetto a 15-1 RM
ma richiede più runtime. Per altre informazioni, vedi Tabella VI.
Suggerimento
L'uso di unità di diagnostica predefinite offre prestazioni migliori rispetto a quelle personalizzate.
Personalizzare le unità di personalizzazione
È possibile personalizzare le proprie unità di compilazione. Di seguito sono riportati i parametri esatti per le unità di simulazione.
qsharp.estimate("RunProgram()", params=
{"distillationUnitSpecifications": {
"displayName": <string>,
"numInputTs": <int>,
"numOutputTs": <int>,
"failureProbabilityFormula": <string>,
"outputErrorRateFormula": <string>,
"physicalQubitSpecification": <protocol specific parameters>,
"logicalQubitSpecification": <protocol specific parameters>,
"logicalQubitSpecificationFirstRoundOverride": <protocol specific parameters>, # Only if "logicalQubitSpecification"
}
})
Tutti i parametri numerici dovrebbero essere positivi. displayName
Specifica la modalità di visualizzazione dell'unità di compilazione nei risultati di output.
Il codice seguente illustra come specificare i parametri dell'unità di codifica per un algoritmo quantistico usando la DistillationUnitSpecification
classe e la ProtocolSpecificDistillationUnitSpecification
classe .
from qsharp.estimator import EstimatorParams, DistillationUnitSpecification, ProtocolSpecificDistillationUnitSpecification
params = EstimatorParams()
unit = DistillationUnitSpecification()
unit.display_name = "T"
unit.failure_probability_formula = "c"
unit.output_error_rate_formula = "r"
unit.num_input_ts = 1
unit.num_output_ts = 2
physical_qubit_specification = ProtocolSpecificDistillationUnitSpecification()
physical_qubit_specification.num_unit_qubits = 1
physical_qubit_specification.duration_in_qubit_cycle_time = 2
unit.physical_qubit_specification = physical_qubit_specification
Le formule per failure_probability_formula
e output_error_rate_formula
sono formule personalizzate con operazioni aritmetiche di base, costanti e solo tre parametri:
clifford_error_rate
, indicato anche comec
.readout_error_rate
, indicato anche comer
.input_error_rate
, indicato anche comez
.
Vedere gli esempi seguenti di formule personalizzate che usano la notazione long e short. Questi esempi illustrano le formule usate per impostazione predefinita nell'implementazione standard.
Parametro | Formula lunga | Formula breve |
---|---|---|
failure_probability_formula |
"15.0 * input_error_rate + 356.0 * clifford_error_rate" | "15.0 * z + 356.0 * c" |
output_error_rate_formula |
"35.0 * input_error_rate ^ 3 + 7.1 * clifford_error_rate" | "35.0 * z ^ 3 + 7.1 * c" |
È necessario specificare almeno uno dei parametri physical_qubit_specification
o logical_qubit_specification
. Se viene fornito solo il primo, l'unità di diagnostica può essere applicata ai qubit fisici. Se viene fornito solo quest'ultimo, l'unità di diagnostica può essere applicata ai qubit logici. Se vengono forniti entrambi, l'unità di diagnostica può essere applicata a entrambi i tipi di qubit.
Il parametro logical_qubit_specification_first_round_override
può essere fornito solo se logical_qubit_specification
è specificato. In tal caso, esegue l'override dei valori di logical_qubit_specification
nel caso se applicato al primo round di topologia. Il valore <protocol specific parameters>
necessario per logical_qubit_specification_first_round_override
deve seguire lo schema:
{
"numUnitQubits": <int>,
"durationInQubitCycleTime": <double>
}
Stima delle frontiere Pareto
Quando si stimano le risorse di un algoritmo, è importante considerare il compromesso tra il numero di qubit fisici e il runtime dell'algoritmo. È possibile considerare l'allocazione del maggior numero possibile di qubit fisici per ridurre il runtime dell'algoritmo. Tuttavia, il numero di qubit fisici è limitato dal numero di qubit fisici disponibili nell'hardware quantistico. Comprendere il compromesso tra runtime e scalabilità di sistema è uno degli aspetti più importanti della stima delle risorse.
La stima di frontiera Pareto fornisce più stime per lo stesso algoritmo, ognuna delle quali mostra compromessi tra il numero di qubit e il runtime.
Nota
Se si esegue Lo strumento di stima delle risorse in Visual Studio Code usando l'opzione Q#: Calculate Resource Estimates , la stima della frontiera Pareto è abilitata per impostazione predefinita.
Se si esegue Resource Estimator in Python, è necessario specificare il "estimateType"
parametro come "frontier"
.
result = qsharp.estimate("RunProgram()", params=
{"qubitParams": { "name": "qubit_maj_ns_e4" },
"qecScheme": { "name": "surface_code" },
"estimateType": "frontier", # Pareto frontier estimation
}
)
Se si desidera visualizzare i risultati della stima delle frontiere Pareto, è possibile usare la EstimatesOverview
funzione . Queste funzioni visualizzano i risultati della stima delle frontiere nella tabella e in un diagramma spazio-tempo. Per altre informazioni, vedere Diagramma spazio-tempo.
from qsharp_widgets import EstimatesOverview
EstimatesOverview(result)
Nota
Se si verificano problemi durante l'utilizzo di Resource Estimator, consultare la pagina Risoluzione dei problemi o contattare AzureQuantumInfo@microsoft.com.
Passaggi successivi
Commenti e suggerimenti
https://aka.ms/ContentUserFeedback.
Presto disponibile: nel corso del 2024 verranno dismessi i problemi di GitHub come meccanismo di feedback per il contenuto e verranno sostituiti con un nuovo sistema di feedback. Per altre informazioni, vedere:Invia e visualizza il feedback per