Jak działa tf.app.run ()?

148

Jak tf.app.run()działa w Tensorflow tłumaczyć demo?

W tensorflow/models/rnn/translate/translate.py, jest wezwanie tf.app.run(). Jak to jest obsługiwane?

if __name__ == "__main__":
    tf.app.run() 
Anurag Ranjan
źródło

Odpowiedzi:

134
if __name__ == "__main__":

oznacza, że ​​bieżący plik jest wykonywany w powłoce, a nie importowany jako moduł.

tf.app.run()

Jak widać w pliku app.py

def run(main=None, argv=None):
  """Runs the program with an optional 'main' function and 'argv' list."""
  f = flags.FLAGS

  # Extract the args from the optional `argv` list.
  args = argv[1:] if argv else None

  # Parse the known flags from that list, or from the command
  # line otherwise.
  # pylint: disable=protected-access
  flags_passthrough = f._parse_flags(args=args)
  # pylint: enable=protected-access

  main = main or sys.modules['__main__'].main

  # Call the main function, passing through any arguments
  # to the final program.
  sys.exit(main(sys.argv[:1] + flags_passthrough))

Przełammy linię po linii:

flags_passthrough = f._parse_flags(args=args)

Gwarantuje to, że argument, który przekazujesz w wierszu poleceń, jest prawidłowy, np. python my_model.py --data_dir='...' --max_iteration=10000W rzeczywistości ta funkcja jest zaimplementowana w oparciu o standardowy argparsemoduł Pythona .

main = main or sys.modules['__main__'].main

Pierwszy mainpo prawej stronie =jest pierwszym argumentem bieżącej funkcji run(main=None, argv=None) . Podczas gdy sys.modules['__main__']oznacza aktualnie uruchomiony plik (np my_model.py.).

Są więc dwa przypadki:

  1. Nie masz mainfunkcji my_model.pyW takim razie musisz zadzwonićtf.app.run(my_main_running_function)

  2. masz mainfunkcję w my_model.py. (Tak jest głównie).

Ostatnia linia:

sys.exit(main(sys.argv[:1] + flags_passthrough))

zapewnia prawidłowe wywołanie funkcji main(argv)lub my_main_running_function(argv)z przeanalizowanymi argumentami.

lei du
źródło
67
Brakujący element układanki dla początkujących użytkowników Tensorflow: Tensorflow ma wbudowany mechanizm obsługi flag w linii poleceń. Możesz zdefiniować swoje flagi na przykład, tf.flags.DEFINE_integer('batch_size', 128, 'Number of images to process in a batch.')a następnie, jeśli tf.app.run()go użyjesz , skonfigurujesz rzeczy tak, abyś mógł globalnie uzyskać dostęp do przekazanych wartości flag, które zdefiniowałeś, na przykład tf.flags.FLAGS.batch_sizez dowolnego miejsca w swoim kodzie.
isarandi
1
Moim zdaniem jest to lepsza odpowiedź z (obecnych) trzech. Wyjaśnia "Jak działa tf.app.run ()", podczas gdy pozostałe dwie odpowiedzi mówią tylko, co robi.
Thomas Fauskanger
Wygląda na to, że obsługiwane są flagi, przez abseilktóre TF musiał wchłonąć abseil.io/docs/python/guides/flags
CpILL
75

To tylko bardzo szybkie opakowanie, które obsługuje parsowanie flag, a następnie wysyła je do własnego pliku main. Zobacz kod .

dga
źródło
12
co to znaczy „obsługuje analizowanie flag”? Może mógłbyś dodać link, aby poinformować początkujących, co to oznacza?
Pinokio,
4
Analizuje argumenty wiersza poleceń dostarczone do programu przy użyciu pakietu flag. (która używa standardowej biblioteki „argparse” pod okładkami, z pewnymi opakowaniami). Jest powiązany z kodem, do którego dałem link w mojej odpowiedzi.
dga
1
Co masz na myśli main = main or sys.modules['__main__'].maini co sys.exit(main(sys.argv[:1] + flags_passthrough))oznacza w app.py ?
hAcKnRoCk
3
wydaje mi się to dziwne, po co w tym wszystkim zawijać główną funkcję, jeśli można ją po prostu wywołać bezpośrednio main()?
Charlie Parker
2
hAcKnRoCk: jeśli nie ma main w pliku, zamiast tego używa tego, co jest w sys.modules [' main '] .main. Plik sys.exit oznacza uruchomienie tak znalezionego polecenia main przy użyciu argumentów i wszelkich przepuszczonych flag oraz wyjście z wartością zwracaną przez main. @CharlieParker - dla zgodności z istniejącymi bibliotekami aplikacji Pythona Google, takimi jak gflags i google-apputils. Zobacz na przykład github.com/google/google-apputils
dga
8

Nie ma w tym nic specjalnego tf.app. To tylko ogólny skrypt punktu wejścia , który

Uruchamia program z opcjonalną funkcją „main” i listą „argv”.

Nie ma to nic wspólnego z sieciami neuronowymi i po prostu wywołuje funkcję główną, przekazując do niej wszelkie argumenty.

Salvador Dali
źródło
5

Mówiąc najprościej, zadaniem programu tf.app.run()jest najpierw ustawienie flag globalnych do późniejszego użycia, takich jak:

from tensorflow.python.platform import flags
f = flags.FLAGS

a następnie uruchom niestandardową funkcję główną z zestawem argumentów.

Na przykład w bazie kodu TensorFlow NMT pierwszy punkt wejścia do wykonywania programu w celu uczenia / wnioskowania zaczyna się w tym miejscu (patrz poniższy kod)

if __name__ == "__main__":
  nmt_parser = argparse.ArgumentParser()
  add_arguments(nmt_parser)
  FLAGS, unparsed = nmt_parser.parse_known_args()
  tf.app.run(main=main, argv=[sys.argv[0]] + unparsed)

Po przeanalizowaniu argumentów za pomocą argparse, tf.app.run()uruchom funkcję "main", która jest zdefiniowana następująco:

def main(unused_argv):
  default_hparams = create_hparams(FLAGS)
  train_fn = train.train
  inference_fn = inference.inference
  run_main(FLAGS, default_hparams, train_fn, inference_fn)

Tak więc, po ustawieniu flag do użytku globalnego, tf.app.run()po prostu uruchamia tę mainfunkcję, którą przekazujesz mu argvjako parametry.

PS: Jak mówi odpowiedź Salvadora Dali , wydaje mi się, że jest to po prostu dobra praktyka inżynierska oprogramowania, chociaż nie jestem pewien, czy TensorFlow wykonuje zoptymalizowane uruchomienie mainfunkcji niż ta, która była uruchamiana przy użyciu zwykłego CPythona.

kmario23
źródło
2

Kod Google zależy w dużej mierze od globalnych flag dostępnych w bibliotekach / plikach binarnych / skryptach Pythona, dlatego tf.app.run () analizuje te flagi, aby utworzyć stan globalny w zmiennej FLAG (lub podobnej), a następnie wywołuje python main ( ) jak powinno.

Jeśli nie mieli wywołania tf.app.run (), użytkownicy mogliby zapomnieć o parsowaniu plików FLAG, co prowadzi do tego, że te biblioteki / pliki binarne / skrypty nie mają dostępu do potrzebnych im grup FLAG.

Mudit Jain
źródło
1

Zgodna odpowiedź 2.0 : Jeśli chcesz użyć tf.app.run()w Tensorflow 2.0, powinniśmy użyć polecenia,

tf.compat.v1.app.run()lub możesz użyć tf_upgrade_v2do konwersji 1.xkodu na 2.0.

Wsparcie Tensorflow
źródło