Compatibilità degli operatori TensorFlow Lite e TensorFlow

Gli operatori di machine learning (ML) che utilizzi nel tuo modello possono influire sul processo di conversione di un modello TensorFlow nel formato TensorFlow Lite. Il convertitore TensorFlow Lite supporta un numero limitato di operazioni TensorFlow utilizzate nei modelli di inferenza comuni, il che significa che non tutti i modelli sono direttamente convertibili. Lo strumento di conversione ti consente di includere operatori aggiuntivi, ma per convertire un modello in questo modo devi anche modificare l'ambiente di runtime di TensorFlow Lite utilizzato per eseguire il modello, il che può limitare la tua capacità di utilizzare opzioni di deployment del runtime standard, ad esempio Google Play Services.

Il convertitore TensorFlow Lite è progettato per analizzare la struttura del modello e applicare le ottimizzazioni al fine di renderlo compatibile con gli operatori direttamente supportati. Ad esempio, a seconda degli operatori ML nel modello, il convertitore potrebbe elidere o fondere questi operatori per mapparli alle rispettive controparti TensorFlow Lite.

Anche per le operazioni supportate, a volte sono previsti modelli di utilizzo specifici, per motivi di prestazioni. Il modo migliore per capire come creare un modello TensorFlow utilizzabile con TensorFlow Lite è valutare con attenzione le modalità di conversione e ottimizzazione delle operazioni, oltre alle limitazioni imposte da questo processo.

Operatori supportati

Gli operatori integrati di TensorFlow Lite sono un sottoinsieme degli operatori che fanno parte della libreria di base TensorFlow. Il tuo modello TensorFlow può includere anche operatori personalizzati sotto forma di operatori composti o nuovi operatori definiti da te. Il diagramma seguente mostra le relazioni tra questi operatori.

Operatori TensorFlow

In questa gamma di operatori di modelli ML, sono disponibili 3 tipi di modelli supportati dal processo di conversione:

  1. Modelli con solo operatore integrato TensorFlow Lite. (consigliata)
  2. modelli con operatori integrati e operatori principali di TensorFlow selezionati.
  3. Modelli con operatori integrati, operatori TensorFlow core e/o operatori personalizzati.

Se il modello contiene solo operazioni supportate in modo nativo da TensorFlow Lite, non hai bisogno di flag aggiuntivi per convertirlo. Questo è il percorso consigliato perché questo tipo di modello effettua la conversione senza problemi ed è più semplice da ottimizzare ed eseguire utilizzando il runtime predefinito di TensorFlow Lite. Hai anche altre opzioni di deployment per il tuo modello, ad esempio Google Play Services. Puoi iniziare consultando la guida alla conversione di TensorFlow Lite. Consulta la pagina Ops Lite di TensorFlow per un elenco degli operatori integrati.

Se devi includere operazioni TensorFlow selezionate dalla libreria di base, devi specificarlo al momento della conversione e assicurarti che il runtime includa queste operazioni. Per i passaggi dettagliati, consulta l'argomento Selezionare gli operatori TensorFlow.

Se possibile, evita l'ultima opzione di includere operatori personalizzati nel modello convertito. Gli operatori personalizzati sono operatori creati combinando più operatori principali di TensorFlow primitivi o ne definiscono uno completamente nuovo. Quando gli operatori personalizzati vengono convertiti, possono aumentare le dimensioni del modello complessivo generando dipendenze al di fuori della libreria TensorFlow Lite integrata. Le operazioni personalizzate, se non create appositamente per il deployment di dispositivi mobili o dispositivi, possono comportare prestazioni peggiori quando viene eseguito il deployment su dispositivi con risorse limitate rispetto a un ambiente server. Infine, proprio come nel caso dell'inclusione di alcuni operatori principali di TensorFlow, gli operatori personalizzati richiedono di modificare l'ambiente di runtime del modello in modo da non poter utilizzare i servizi di runtime standard come Google Play Services.

Tipi supportati

La maggior parte delle operazioni TensorFlow Lite ha come target l'inferenza sia in virgola mobile (float32) che quantizzata (uint8, int8), ma molte operazioni non lo fanno ancora per altri tipi come tf.float16 e stringhe.

A parte l'utilizzo di una versione diversa delle operazioni, l'altra differenza tra i modelli in virgola mobile e quantiizzati è il modo in cui vengono convertite. La conversione quantificata richiede informazioni sull'intervallo dinamico per i tensori. Ciò richiede la "quantizzazione falsa" durante l'addestramento del modello, il recupero di informazioni sull'intervallo tramite un set di dati di calibrazione o una stima dell'intervallo "al volo". Per ulteriori dettagli, consulta la pagina relativa alla quantizzazione.

Conversioni dirette, pieghevole e fusione costanti

TensorFlow Lite può elaborare diverse operazioni TensorFlow, anche se non hanno un equivalente diretto. Questo è il caso delle operazioni che possono essere semplicemente rimosse dal grafico (tf.identity), sostituite da tensori (tf.placeholder) o integrate in operazioni più complesse (tf.nn.bias_add). A volte anche alcune operazioni supportate possono essere rimosse tramite uno di questi processi.

Di seguito è riportato un elenco non esaustivo delle operazioni di TensorFlow che solitamente vengono rimosse dal grafico:

  • tf.add
  • tf.debugging.check_numerics
  • tf.constant
  • tf.div
  • tf.divide
  • tf.fake_quant_with_min_max_args
  • tf.fake_quant_with_min_max_vars
  • tf.identity
  • tf.maximum
  • tf.minimum
  • tf.multiply
  • tf.no_op
  • tf.placeholder
  • tf.placeholder_with_default
  • tf.realdiv
  • tf.reduce_max
  • tf.reduce_min
  • tf.reduce_sum
  • tf.rsqrt
  • tf.shape
  • tf.sqrt
  • tf.square
  • tf.subtract
  • tf.tile
  • tf.nn.batch_norm_with_global_normalization
  • tf.nn.bias_add
  • tf.nn.fused_batch_norm
  • tf.nn.relu
  • tf.nn.relu6

Operazioni sperimentali

Le seguenti operazioni TensorFlow Lite sono presenti, ma non sono pronte per i modelli personalizzati:

  • CALL
  • CONCAT_EMBEDDINGS
  • CUSTOM
  • EMBEDDING_LOOKUP_SPARSE
  • HASHTABLE_LOOKUP
  • LSH_PROJECTION
  • SKIP_GRAM
  • SVDF