Përmbledhje
LiteRT mbështet konvertimin e modeleve TensorFlow RNN në operacionet e shkrira LSTM të LiteRT. Operacionet e shkrira ekzistojnë për të maksimizuar performancën e implementimeve të tyre themelore të bërthamës, si dhe për të ofruar një ndërfaqe të nivelit më të lartë për të përcaktuar transformime komplekse si kuantizimi.
Meqenëse ka shumë variante të API-ve RNN në TensorFlow, qasja jonë ka qenë e dyfishtë:
- Ofron mbështetje native për API-të standarde të TensorFlow RNN si Keras LSTM. Ky është opsioni i rekomanduar.
- Jepni një ndërfaqe në infrastrukturën e konvertimit për implementimet e RNN të përcaktuara nga përdoruesi për t'u lidhur dhe për t'u konvertuar në LiteRT. Ne ofrojmë disa shembuj të gatshëm të një konvertimi të tillë duke përdorur ndërfaqet LSTMCellSimple dhe LayerNormalizedLSTMCellSimple RNN të lingvo-s.
API-ja e konvertuesit
Kjo veçori është pjesë e versionit TensorFlow 2.3. Është gjithashtu e disponueshme përmes tf-nightly pip ose nga head.
Ky funksionalitet konvertimi është i disponueshëm kur konvertohet në LiteRT nëpërmjet një SavedModel ose direkt nga modeli Keras. Shihni shembuj përdorimesh.
Nga modeli i ruajtur
# build a saved model. Here concrete_function is the exported function
# corresponding to the TensorFlow model containing one or more
# Keras LSTM layers.
saved_model, saved_model_dir = build_saved_model_lstm(...)
saved_model.save(saved_model_dir, save_format="tf", signatures=concrete_func)
# Convert the model.
converter = TFLiteConverter.from_saved_model(saved_model_dir)
tflite_model = converter.convert()
Nga modeli i Keras
# build a Keras model
keras_model = build_keras_lstm(...)
# Convert the model.
converter = TFLiteConverter.from_keras_model(keras_model)
tflite_model = converter.convert()
Shembull
Keras LSTM to LiteRT Colab ilustron përdorimin nga fillimi në fund me interpretuesin LiteRT.
API-të e RNN-ve të TensorFlow të mbështetura
Konvertimi i Keras LSTM (i rekomanduar)
Ne mbështesim konvertimin e gatshëm të Keras LSTM në LiteRT. Për detaje se si funksionon kjo, ju lutemi referojuni ndërfaqes Keras LSTM. dhe te logjika e konvertimit këtu .
Gjithashtu e rëndësishme është të theksohet kontrata LSTM e LiteRT në lidhje me përkufizimin e operacionit Keras:
- Dimensioni 0 i tensorit të hyrjes është madhësia e grupit.
- Dimensioni 0 i tensorit recurrent_weight është numri i rezultateve.
- Tensorët e peshës dhe të bërthamës_periodike transpozohen.
- Tensorët e peshës së transpozuar, bërthamës_periodike të transpozuar dhe polarizimit ndahen në 4 tensor me madhësi të barabartë përgjatë dimensionit 0. Këta korrespondojnë me portën hyrëse, portën harruese, qelizën dhe portën dalëse .
Variantet e Keras LSTM
Kohë kryesore
Përdoruesit mund të zgjedhin "time-major" ose "no time-major". Keras LSTM shton një atribut "time-major" në atributet e funksionit def. Për LSTM të sekuencës unidirectional, ne thjesht mund ta lidhim atë me atributin "time major" të unidirecional_sequence_lstm.
LSTM Bidireksionale
LSTM bidireksionale mund të implementohet me dy shtresa Keras LSTM, një për përpara dhe një për prapa, shihni shembujt këtu . Pasi të shohim atributin go_backward, e njohim atë si LSTM prapa, pastaj i grupojmë LSTM përpara dhe prapa së bashku. Kjo është punë e ardhshme. Aktualisht, kjo krijon dy operacione UnidirectionalSequenceLSTM në modelin LiteRT.
Shembuj të konvertimit LSTM të përcaktuar nga përdoruesi
LiteRT gjithashtu ofron një mënyrë për të konvertuar implementimet LSTM të përcaktuara nga përdoruesi. Këtu përdorim LSTM-në e Lingvo-s si një shembull se si mund të implementohet kjo. Për detaje, ju lutemi referojuni ndërfaqes lingvo.LSTMCellSimple dhe logjikës së konvertimit këtu . Ne gjithashtu ofrojmë një shembull për një tjetër nga përkufizimet LSTM të Lingvo-s në ndërfaqen lingvo.LayerNormalizedLSTMCellSimple dhe logjikën e saj të konvertimit këtu .
“Sillni TensorFlow RNN-në tuaj” në LiteRT
Nëse ndërfaqja RNN e një përdoruesi është e ndryshme nga ato standarde të mbështetura, ekzistojnë disa opsione:
Opsioni 1: Shkruani kodin e përshtatësit në TensorFlow python për të përshtatur ndërfaqen RNN në ndërfaqen Keras RNN. Kjo do të thotë një tf.function me shënimin tf_implements në funksionin e ndërfaqes së gjeneruar RNN që është identik me atë të gjeneruar nga shtresa Keras LSTM. Pas kësaj, do të funksionojë i njëjti API konvertimi i përdorur për Keras LSTM.
Opsioni 2: Nëse sa më sipër nuk është e mundur (p.sh., Keras LSTM i mungon një funksionalitet që aktualisht ekspozohet nga normalizimi i shtresave të ngjashme me operacionet LSTM të shkrirë të LiteRT), atëherë zgjerojeni konvertuesin LiteRT duke shkruar kod konvertimi të personalizuar dhe lidheni atë në prepare-composite-functions MLIR-pass këtu . Ndërfaqja e funksionit duhet të trajtohet si një kontratë API dhe duhet të përmbajë argumentet e nevojshme për t'u konvertuar në operacione LSTM të shkrirë të LiteRT - p.sh., input, polarizim, pesha, projeksion, normalizim shtresash, etj. Është e preferueshme që tenzorët e kaluar si argumente në këtë funksion të kenë renditje të njohur (p.sh., RankedTensorType në MLIR). Kjo e bën shumë më të lehtë shkrimin e kodit të konvertimit që mund t'i marrë këta tenzorë si RankedTensorType dhe ndihmon në transformimin e tyre në tenzorë të renditur që korrespondojnë me operandët e operatorit të shkrirë LiteRT.
Një shembull i plotë i një fluksi të tillë konvertimi është konvertimi nga LSTMCellSimple në LiteRT i Lingvo-s.
LSTMCellSimple në Lingvo përcaktohet këtu . Modelet e trajnuara me këtë qelizë LSTM mund të konvertohen në LiteRT si më poshtë:
- Mbështillni të gjitha përdorimet e LSTMCellSimple në një tf.function me një shënim tf_implements që është etiketuar si i tillë (p.sh. lingvo.LSTMCellSimple do të ishte një emër i mirë shënimi këtu). Sigurohuni që tf.function që gjenerohet përputhet me ndërfaqen e funksionit që pritet në kodin e konvertimit. Kjo është një kontratë midis autorit të modelit që shton shënimin dhe kodit të konvertimit.
Zgjero kalimin prepare-composite-functions për të lidhur një operacion të përbërë të personalizuar me konvertimin e operacionit LSTM të shkrirë në LiteRT. Shih kodin e konvertimit LSTMCellSimple .
Kontrata e konvertimit:
Tensorët e peshës dhe të projeksionit transpozohen.
{input, recurrent} në {cell, input gate, forget gate, output gate} nxirren duke prerë tensori i peshës së transpozuar.
{Polarizimi} në {qelizë, portë hyrëse, portë harrese, portë dalëse} nxirren duke prerë tensori i polarizimit.
Projeksioni nxirret duke prerë tensori i projeksionit të transpozuar.
Konvertim i ngjashëm është shkruar për LayerNormalizedLSTMCellSimple .
Pjesa tjetër e infrastrukturës së konvertimit LiteRT, duke përfshirë të gjitha kalimet MLIR të përcaktuara si dhe eksportin përfundimtar në flatbuffer LiteRT, mund të ripërdoret.
Probleme/kufizime të njohura
- Aktualisht mbështetet vetëm konvertimi i Keras LSTM pa shtetësi (sjellja e parazgjedhur në Keras). Konvertimi i Keras LSTM me shtetësi është punë e ardhshme.
- Është ende e mundur të modelohet një shtresë Keras LSTM me gjendje duke përdorur shtresën themelore Keras LSTM pa gjendje dhe duke e menaxhuar gjendjen në mënyrë eksplicite në programin e përdoruesit. Një program i tillë TensorFlow mund të konvertohet ende në LiteRT duke përdorur veçorinë që përshkruhet këtu.
- LSTM bidireksionale aktualisht modelohet si dy operacione UnidirectionalSequenceLSTM në LiteRT. Kjo do të zëvendësohet me një operacion të vetëm BidirectionalSequenceLSTM.