Hatékony TensorFlow 2.0: Legjobb gyakorlatok és változások

A TensorFlow csapata

Egy nemrégiben írt cikkben megemlítettük, hogy a TensorFlow 2.0-t úgy alakították át, hogy a fejlesztői termelékenységre, az egyszerűségre és a könnyű felhasználásra összpontosítson.

A változások részletesebb megismerése és a bevált gyakorlatok megismerése érdekében olvassa el az új Effective TensorFlow 2.0 útmutatót (közzétett a GitHub-on). Ez a cikk rövid összefoglalót nyújt az ott található tartalomról. Ha ezeknek a témáknak valamelyike ​​érdekli Önt, látogasson el az útmutatóba további információkért!

A főbb változások rövid összefoglalása

A TensorFlow 2.0-ban sok változás történt a felhasználók termelékenyebbé tétele érdekében, ideértve a redundáns API-k eltávolítását, az API-k következetesebbé tételét (Unified RNN, Unified Optimizer) és a Python futási idejének jobb integrálását az Eager végrehajtással.

Számos RFC (nézd meg őket, ha még nem ismered őket) magyarázta el a változásokat és a gondolkodást, amelyek a TensorFlow 2.0 elkészítéséhez vezettek. Ez az útmutató egy elképzelést mutat be a TensorFlow 2.0 fejlesztésének. Feltételezzük, hogy ismeri valamit a TensorFlow 1.x-ről.

API-tisztítás

Számos API megszűnt vagy átkerült a TF 2.0 verziójában, és néhányat felváltottak a 2.0 megfelelőjükkel - tf.summary, tf.keras.metrics és tf.keras.optimizers. Ezen átnevezések automatikus alkalmazásának legegyszerűbb módja a v2 frissítő szkript használata.

Lelkes végrehajtás

A TensorFlow 1.X megköveteli a felhasználóktól, hogy kézzel összefűzzenek egy absztrakt szintaxis fát (grafikon) tf. * API hívások végrehajtásával. Ezután megköveteli a felhasználóktól, hogy manuálisan állítsák össze az absztrakt szintaxis fát azáltal, hogy egy kimeneti tenzor és bemeneti tenzor sorozatát továbbítják a session.run () hívásra. Ezzel szemben a TensorFlow 2.0 lelkesen hajt végre (mint a Python általában), és a 2.0-ban a grafikonoknak és a munkameneteknek a végrehajtás részleteinek kell lennie.

Nincs több globális

A TensorFlow 1.X nagymértékben támaszkodott a közvetett globális névterekre. A tf.Variable () hívásakor az alapértelmezett gráfba kerül, és ott marad, még akkor is, ha elveszíti a rá mutató Python változó nyomon követését. Ezután visszaállíthatja azt a tf.Mariable-t, de csak akkor, ha tudta a nevet, amellyel létrehozta. Ezt nehéz volt megtenni, ha nem a kezedben volt a változó létrehozása. Ennek eredményeként mindenféle mechanizmus elterjedt, hogy megkíséreljék segíteni a felhasználókat a változóik újbóli megtalálásában.

A TensorFlow 2.0 kiküszöböli ezeket a mechanizmusokat (Változók 2.0 RFC) az alapértelmezett mechanizmus javára: Kövesse nyomon a változókat! Ha elveszíti a tf.Variable nyomon követését, akkor szemetet gyűjt össze. További részletek az útmutatóban találhatók.

Funkciók, nem ülések

A session.run () hívás szinte olyan, mint egy funkcionális hívás: Megadja a bemeneteket és a meghívandó funkciót, és visszatér egy sor kimenetet. A TensorFlow 2.0 alkalmazásban a Pyf függvényt a tf.function () használatával díszítheti, hogy megjelölje azt a JIT fordításhoz, így a TensorFlow egyetlen grafikonként futtatja azt (Funkciók 2.0 RFC).

Ez a mechanizmus lehetővé teszi a TensorFlow 2.0 számára, hogy a grafikus mód összes előnyeit kihasználja:

  • Teljesítmény: A funkció optimalizálható (csomópont-metszés, kernel-fúzió, stb.)
  • Hordozhatóság: A funkció exportálható / újraimportálható (SavedModel 2.0 RFC), lehetővé téve a felhasználók számára a moduláris TensorFlow funkciók újbóli felhasználását és megosztását.

A Python és a TensorFlow kód szabadon átterjedő képességével teljes mértékben kihasználhatja a Python kifejezőképességének előnyeit. De a hordozható TensorFlow környezetben, Python-tolmács nélkül futtatható - mobil, C ++ és JS. Annak érdekében, hogy a felhasználóknak ne kelljen átírniuk kódjukat a @ tf.function hozzáadásakor, az AutoGraph a Python konstrukciók egy részhalmazát TensorFlow ekvivalenseikké konvertálja.

További részletek az útmutatóban találhatók.

Ajánlások az idiomatikus TensorFlow 2.0-hoz

Refaktorálja a kódját kisebb funkciókba

A TensorFlow 1.X általános használati mintája a „konyhai mosogató” stratégia volt, amelyben minden lehetséges számítás egységét előzetesen lefektették, majd a kiválasztott tenzorokat a session.run () segítségével értékelték. A TensorFlow 2.0-ban a felhasználóknak újra kell osztaniuk kódjukat kisebb funkciókra, amelyeket szükség szerint hívnak. Általában nem szükséges mindegyik kisebb funkciót díszíteni a tf.function funkcióval; kizárólag a tf.function funkciót használhatja a magas szintű számítások díszítéséhez - például egy képzési lépéshez vagy a modell továbbításához.

Használjon Keras rétegeket és modelleket a változók kezeléséhez

A Keras modellek és rétegek kényelmes változókat és trainable_variables tulajdonságokat kínálnak, amelyek rekurzív módon összegyűjtik az összes függő változót. Ez megkönnyíti a változók kezelését a felhasználás helyén.

A Keras rétegek / modellek a tf.train.Checkpointable webhelyről örökölnek, és integrálva vannak a @ tf.function funkcióval, amely lehetővé teszi a SavedModels közvetlen ellenőrzőpontjának ellenőrzését vagy exportálását a Keras objektumokból. Nem feltétlenül kell a Keras'sfit () API-t használnia ezen integrációk előnyeinek kihasználásához.

További részletek az útmutatóban találhatók.

Kombinálja a tf.data.Datasets és a @ tf.function fájlokat

Amikor a memóriába illeszkedő edzésadatokon át iterál, nyugodtan használja a rendszeres Python iterációt. Ellenkező esetben a tf.data.Dataset a legjobb módja az edzési adatok streamről történő lefolytatásához. Az adatkészletek iterable (nem iteratorok), és ugyanúgy működnek, mint más Python iterables Eager módban. Az adatkészlet async előfeltöltési / streaming szolgáltatásait teljes mértékben kihasználhatja, ha a kódot a tf.function () -be csomagolja, amely helyettesíti a Python iterációt az AutoGraph alkalmazásával egyenértékű gráfműveletekkel.

@ tf.function
def vonat (modell, adatkészlet, optimalizáló):
 x, y esetén az adatkészletben:
  tf.GradientTape () szalaggal:
   előrejelzés = modell (x)
   veszteség = loss_fn (előrejelzés, y)
  színátmenetek = tape.gradients (veszteség, model.trainable_variables)
  optimizer.apply_gradients (színátmenetek, model.trainable_variables)

Ha a Keras .fit () API-t használja, akkor nem kell aggódnia az adatkészlet iterációja miatt.

model.compile (optimalizáló = optimalizáló, veszteség = loss_fn)
model.fit (adatbázisba)

Használja ki az AutoGraph előnyeit a Python vezérlőáramlással

Az AutoGraph lehetővé teszi az adatoktól függő vezérlőáramlás átalakítását gráf módú ekvivalensekké, például tf.cond és tf.while_loop.

Az egyik általános hely, ahol az adattól függő vezérlőáramlás megjelenik, a szekvenciamodellek. A tf.keras.layers.RNN egy RNN cellát tekercsel, így statikusan vagy dinamikusan tekercselheti meg a visszatérést. A demonstráció kedvéért a következők szerint újra beépítheti a dinamikus gördítést:

osztály DynamicRNN (tf.keras.Model):
def __init __ (saját, rnn_cell):
 szuper (DynamicRNN, önálló) .__ init __ (ön)
 self.cell = rnn_cell
def hívás (önálló, input_data):
 # [tétel, idő, szolgáltatások] -> [idő, tétel, szolgáltatások]
 input_data = tf.transpose (input_data, [1, 0, 2])
 output = tf.TensorArray (tf.float32, input_data.shape [0])
 state = self.cell.zero_state (input_data.shape [1], dtype = tf.float32)
 az i számára a tf.range-ban (input_data.shape [0]):
  output, state = self.cell (input_data [i], state)
  output = output output.write (i, output)
 return tf.transpose (output.stack (), [1, 0, 2]), állapot

További részletek az útmutatóban találhatók.

Használja a tf.metrics adatgyűjtést, a tf.summary pedig az naplózáshoz

Végül, hamarosan megjelenik a tf.summary szimbólumok teljes halmaza. A tf.summary 2.0 verzióját elérheti a következővel:

a tensorflow.python.ops webhelyről importálja az összefoglaló_ops_v2 fájlt

További részletek az útmutatóban találhatók.

Következő lépések

Ez a cikk röviden összefoglalta a Hatékony TF 2.0 útmutatót (ha érdeklődik ezekben a témákban, menjen tovább, ha többet szeretne megtudni!) A TensorFlow 2.0-ról szóló további tudnivalókhoz a következő legújabb cikkeket is javasoljuk:

  • Hozzájárulás a TensorFlow-hoz: SIG, RFC, tesztelés és dokumentumok.
  • Melyek a szimbolikus és kötelező API-k a TensorFlow 2.0-ban?
  • Szabványosítás a Kerason: Útmutató a magas szintű API-khoz a TensorFlow 2.0-ban

És kérjük, csatlakozzon a TensorFlow fejlesztői csúcstalálkozóra, március 6-án és 7-én. Mint mindig, az összes beszélgetést feltölti a YouTube-ra azok számára, akik nem tudják személyesen megtenni.