Vështrim i përgjithshëm
LiteRT mbështet konvertimin e modeleve TensorFlow RNN në operacionet e bashkuara LSTM të LiteRT. Operacionet e bashkuara ekzistojnë për të maksimizuar performancën e zbatimeve të tyre themelore të kernelit, si dhe për të siguruar një ndërfaqe të nivelit më të lartë për të përcaktuar transformimet komplekse si kuantizimi.
Meqenëse ka shumë variante të API-ve RNN në TensorFlow, qasja jonë ka qenë e dyfishtë:
- Siguroni mbështetje vendase për API-të standarde të TensorFlow RNN si Keras LSTM. Ky është opsioni i rekomanduar.
- Siguroni një ndërfaqe në infrastrukturën e konvertimit për implementimet RNN të përcaktuara nga përdoruesi për t'u futur dhe për t'u konvertuar në LiteRT. Ne ofrojmë disa shembuj jashtë kutisë të një konvertimi të tillë duke përdorur ndërfaqet LSTMCellSimple dhe LayerNormalizedLSTMCellSimple RNN të lingvo.
API-ja e konvertuesit
Veçoria është pjesë e lëshimit të TensorFlow 2.3. Ai është gjithashtu i disponueshëm përmes pip tf-natë ose nga kreu.
Ky funksion konvertimi është i disponueshëm kur konvertohet në LiteRT nëpërmjet një SavedModel ose drejtpërdrejt nga modeli Keras. Shihni shembuj të përdorimit.
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 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 në LiteRT Colab ilustron përdorimin nga fundi në fund me interpretuesin LiteRT.
Mbështeten API-të e TensorFlow RNN
Konvertimi Keras LSTM (rekomandohet)
Ne mbështesim konvertimin jashtë kutisë së 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 hyrës është madhësia e grupit.
- Dimensioni 0 i tensorit recurrent_weight është numri i daljeve.
- Pesha dhe tensorët e_kernelit të përsëritur janë transpozuar.
- Pesha e transpozuar, kerneli recurrent i transpozuar dhe tensorët e paragjykimit ndahen në 4 tensorë me madhësi të barabartë përgjatë dimensionit 0. Këta korrespondojnë me portën hyrëse, portën e harresës, qelizën dhe portën e daljes .
Variantet Keras LSTM
Koha e madhe
Përdoruesit mund të zgjedhin kohë-major ose jo-major. Keras LSTM shton një atribut të madh kohor në atributet e funksionit def. Për sekuencën njëdrejtimëshe LSTM, ne thjesht mund të hartojmë me atributin kryesor të kohës së unidirecional_sequence_lstm.
LSTM BiDirectional
LSTM dydrejtimëshe mund të zbatohet me dy shtresa Keras LSTM, një për përpara dhe një për prapa, shikoni shembujt këtu . Pasi të shohim atributin go_backward, ne e njohim atë si LSTM prapa, pastaj grupojmë LSTM përpara dhe prapa. Kjo është puna e së ardhmes. Aktualisht, kjo krijon dy operacione UnidirectionalSequenceLSTM në modelin LiteRT.
Shembuj të konvertimit LSTM të përcaktuara nga përdoruesi
LiteRT ofron gjithashtu një mënyrë për të konvertuar implementimet LSTM të përcaktuara nga përdoruesi. Këtu ne përdorim LSTM të Lingvo si një shembull se si mund të zbatohet. Për detaje ju lutemi referojuni ndërfaqes lingvo.LSTMCellSimple dhe logjikës së konvertimit këtu . Ne ofrojmë gjithashtu një shembull për një tjetër nga përkufizimet LSTM të Lingvo në ndërfaqen lingvo.LayerNormalizedLSTMCellSimple dhe logjikën e saj të konvertimit këtu .
"Sillni TensorFlow RNN tuaj" në LiteRT
Nëse ndërfaqja RNN e një përdoruesi është e ndryshme nga ato të mbështetura standarde, ekzistojnë disa opsione:
Opsioni 1: Shkruani kodin e përshtatësit në TensorFlow python për të përshtatur ndërfaqen RNN me ndërfaqen Keras RNN. Kjo do të thotë një funksion tf. me shënim tf_implements në funksionin e ndërfaqes së gjeneruar RNN që është identik me atë të krijuar nga shtresa Keras LSTM. Pas kësaj, e njëjta API e konvertimit e përdorur për Keras LSTM do të funksionojë.
Opsioni 2: Nëse sa më sipër nuk është e mundur (p.sh. Keras LSTM-së i mungon disa funksionalitete që ekspozohen aktualisht nga normalizimi i shtresave të funksioneve të bashkuara LSTM të LiteRT), atëherë zgjeroni konvertuesin LiteRT duke shkruar kodin e personalizimit të konvertimit dhe futeni atë në MLIR-pass me funksion të përgatitur-përbërës 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 të bashkuara LiteRT LSTM - p.sh. hyrje, paragjykim, pesha, projeksion, normalizimi i shtresës, etj. Preferohet që tensorët e kaluar si argumente në këtë funksion të kenë një renditje të njohur (dmth. RankedTensorType në MLIR). Kjo e bën shumë më të lehtë shkrimin e kodit të konvertimit që mund t'i supozojë këta tensorë si RankedTensorType dhe ndihmon në transformimin e tyre në tensorë të renditur që korrespondojnë me operandët e operatorit LiteRT të shkrirë.
Një shembull i plotë i një rrjedhe të tillë konvertimi është konvertimi LSTMCellSimple në LiteRT i Lingvo.
LSTMCellSimple në Lingvo është përcaktuar 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ë funksioni tf. që gjenerohet përputhet me ndërfaqen e funksionit të pritur në kodin e konvertimit. Kjo është një kontratë midis autorit të modelit që shton shënimin dhe kodin e konvertimit.
Zgjatni kalimin e funksioneve përgatitore për të futur një konvertim të kompozuar të personalizuar në LiteRT të bashkuar LSTM op. Shih kodin e konvertimit LSTMCellSimple .
Kontrata e konvertimit:
Pesha dhe tensorët e projeksionit janë transpozuar.
{input, recurrent} në {cell, input gate, harroj gate, output gate} nxirren duke prerë tensorin e peshës së transpozuar.
{Bias} në {qelizë, porta hyrëse, porta e harresës, porta e daljes} nxirren duke prerë tensorin e paragjykimit.
Projeksioni nxirret duke prerë tensorin e transpozuar të projeksionit.
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 eksporti përfundimtar në flatbuffer LiteRT mund të ripërdoret.
Çështje/kufizime të njohura
- Aktualisht ka mbështetje vetëm për konvertimin e Keras LSTM pa shtetësi (sjellja e parazgjedhur në Keras). Konvertimi shtetëror Keras LSTM është punë e ardhshme.
- Është ende e mundur të modelohet një shtresë Keras LSTM me gjendje duke përdorur shtresën bazë Keras LSTM pa shtet dhe duke menaxhuar gjendjen në mënyrë eksplicite në programin e përdoruesit. Një program i tillë TensorFlow ende mund të konvertohet në LiteRT duke përdorur veçorinë që përshkruhet këtu.
- LSTM me dy drejtime aktualisht është modeluar si dy operacione UnidirectionalSequenceLSTM në LiteRT. Kjo do të zëvendësohet me një të vetme BidirectionalSequenceLSTM op.