Un tutorial oficial sobre @tf.function
dice:
Para obtener el máximo rendimiento y hacer que su modelo sea desplegable en cualquier lugar, use tf.function para hacer gráficos de sus programas. Gracias a AutoGraph, una sorprendente cantidad de código de Python simplemente funciona con tf.function, pero todavía hay dudas de las que debemos tener cuidado.
Las principales conclusiones y recomendaciones son:
- No confíe en los efectos secundarios de Python como la mutación de objetos o los anexos de listas.
- La función tf funciona mejor con operaciones TensorFlow, en lugar de operaciones NumPy o primitivas Python.
- En caso de duda, utilice el idioma for x in y.
Solo menciona cómo implementar @tf.function
funciones anotadas, pero no cuándo usarlo.
¿Hay una heurística sobre cómo decidir si al menos debería intentar anotar una función tf.function
? Parece que no hay razones para no hacerlo, a menos que sea demasiado flojo para eliminar los efectos secundarios o cambiar algunas cosas como range()
-> tf.range()
. Pero si estoy dispuesto a hacer esto ...
¿Hay alguna razón para no usar @tf.function
para todas las funciones?
tf.function
guía dice "Decorar funciones a nivel de módulo y métodos de clases a nivel de módulo, y evitar decorar funciones o métodos locales". Me parece recordar una redacción más explícita, como "no decorar todas las funciones, usar tf.function
en funciones de nivel superior, como un ciclo de entrenamiento", pero puedo recordar mal (o tal vez se ha eliminado). OTOH, esta discusión tiene una entrada interesante de los desarrolladores, al final parece estar bien usarla en cualquier función para tensores / variables.
@tf.function
funciones anotadas de @jdehesa AFAIK también compilan las funciones que ellos mismos llaman gráficos. Por lo tanto, solo necesitaría anotar el punto de entrada al módulo que sea coherente con lo que describe. Pero tampoco estaría de más anotar manualmente las funciones más bajas en la pila de llamadas.
tf.function
se llama a varias veces, no puede evitar la "duplicación de código" en el gráfico, por lo que parece recomendable su uso generalizado.
tensorflow0.1
,tensorflow0.2
,tensorflow0.3
,tensorflow0.4
,tensorflow0.5
y así sucesivamente, así como una etiqueta para cada uno de estostf
módulos y clases luego. Además, ¿por qué no agregar una etiqueta para cada uno de los módulos estándar de Python y sus funciones y clases?