returnn 1.20240621.145554__tar.gz → 1.20240621.194850__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of returnn might be problematic. Click here for more details.

Files changed (449) hide show
  1. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/CHANGELOG.md +14 -0
  2. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/PKG-INFO +1 -1
  3. returnn-1.20240621.194850/_setup_info_generated.py +2 -0
  4. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/__main__.py +1 -2
  5. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/datasets/basic.py +20 -1
  6. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/datasets/distrib_files.py +10 -125
  7. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/util/file_cache.py +36 -10
  8. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn.egg-info/PKG-INFO +1 -1
  9. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tests/test_Util.py +11 -3
  10. returnn-1.20240621.145554/_setup_info_generated.py +0 -2
  11. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/.editorconfig +0 -0
  12. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/.gitignore +0 -0
  13. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/.gitmodules +0 -0
  14. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/.kateconfig +0 -0
  15. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/CODEOWNERS +0 -0
  16. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/CONTRIBUTING.md +0 -0
  17. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/LICENSE +0 -0
  18. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/MANIFEST.in +0 -0
  19. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/README.rst +0 -0
  20. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/__init__.py +0 -0
  21. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/demos/12AX.cluster_map +0 -0
  22. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/demos/_setup_returnn_env.py +0 -0
  23. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/demos/demo-fwd.config +0 -0
  24. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/demos/demo-horovod-mpi.py +0 -0
  25. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/demos/demo-horovod-mpi.py.sh +0 -0
  26. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/demos/demo-horovod-mpi.sh +0 -0
  27. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/demos/demo-hyper-param-tuning.config +0 -0
  28. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/demos/demo-iter-dataset.py +0 -0
  29. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/demos/demo-list-devices.py +0 -0
  30. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/demos/demo-lua-torch-layer.config +0 -0
  31. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/demos/demo-pretrain.config +0 -0
  32. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/demos/demo-record-and-push-to-webserver.py +0 -0
  33. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/demos/demo-returnn-as-framework.py +0 -0
  34. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/demos/demo-rf-pt-benchmark.py +0 -0
  35. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/demos/demo-rf.config +0 -0
  36. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/demos/demo-rhn-enwik8.config +0 -0
  37. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/demos/demo-sprint-interface.py +0 -0
  38. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/demos/demo-tf-att-copy.config +0 -0
  39. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/demos/demo-tf-attention.config +0 -0
  40. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/demos/demo-tf-chunking-blstm.12ax.config +0 -0
  41. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/demos/demo-tf-contribrnn-lstm.12ax.config +0 -0
  42. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/demos/demo-tf-enc-dec.config +0 -0
  43. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/demos/demo-tf-hard-att-copy.config +0 -0
  44. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/demos/demo-tf-lstm-benchmark.py +0 -0
  45. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/demos/demo-tf-maxgradnorm-lstm.12ax.config +0 -0
  46. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/demos/demo-tf-native-lstm-lowmem.12ax.config +0 -0
  47. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/demos/demo-tf-native-lstm.12ax.config +0 -0
  48. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/demos/demo-tf-native-lstm2.12ax.config +0 -0
  49. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/demos/demo-tf-native-lstm2.12ax.tuned.config +0 -0
  50. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/demos/demo-tf-neural-transducer.12ax.config +0 -0
  51. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/demos/demo-tf-rec-explicit-lstm.config +0 -0
  52. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/demos/demo-tf-rec-explicit-rnn.config +0 -0
  53. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/demos/demo-tf-rec-self-att.config +0 -0
  54. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/demos/demo-tf-search-compiled-graph.py +0 -0
  55. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/demos/demo-tf-vanilla-lstm.12ax.config +0 -0
  56. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/demos/demo-timit-lstm-ctc.config +0 -0
  57. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/demos/demo-torch.config +0 -0
  58. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/demos/demo-upd-mult-model.lstm.12ax.config +0 -0
  59. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/demos/demo.sh +0 -0
  60. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/demos/mdlstm/IAM/IAM_lines/a01-000u-00.png +0 -0
  61. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/demos/mdlstm/IAM/IAM_lines/a01-007-04.png +0 -0
  62. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/demos/mdlstm/IAM/IAM_lines/a01-007-06.png +0 -0
  63. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/demos/mdlstm/IAM/README.txt +0 -0
  64. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/demos/mdlstm/IAM/chars.txt +0 -0
  65. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/demos/mdlstm/IAM/config_demo +0 -0
  66. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/demos/mdlstm/IAM/config_fwd +0 -0
  67. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/demos/mdlstm/IAM/config_real +0 -0
  68. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/demos/mdlstm/IAM/create_IAM_dataset.py +0 -0
  69. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/demos/mdlstm/IAM/decode.py +0 -0
  70. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/demos/mdlstm/IAM/features/raw/demo.h5 +0 -0
  71. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/demos/mdlstm/IAM/go.sh +0 -0
  72. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/demos/mdlstm/IAM/lines.txt +0 -0
  73. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/demos/mdlstm/IAM/split/eval.txt +0 -0
  74. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/demos/mdlstm/IAM/split/train.txt +0 -0
  75. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/demos/mdlstm/IAM/split/valid.txt +0 -0
  76. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/demos/mdlstm/README.md +0 -0
  77. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/demos/mdlstm/artificial/create_test_h5.py +0 -0
  78. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/demos/mdlstm/artificial/forwardconfig +0 -0
  79. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/demos/mdlstm/artificial/go.sh +0 -0
  80. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/demos/mdlstm/artificial/trainconfig +0 -0
  81. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/demos/mdlstm/artificial_rgb/create_test_h5.py +0 -0
  82. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/demos/mdlstm/artificial_rgb/forwardconfig +0 -0
  83. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/demos/mdlstm/artificial_rgb/go.sh +0 -0
  84. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/demos/mdlstm/artificial_rgb/trainconfig +0 -0
  85. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/pyproject.toml +0 -0
  86. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/requirements.txt +0 -0
  87. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/__init__.py +0 -0
  88. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/__old_mod_loader__.py +0 -0
  89. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/__setup__.py +0 -0
  90. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/config.py +0 -0
  91. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/datasets/__init__.py +0 -0
  92. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/datasets/audio.py +0 -0
  93. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/datasets/bundle_file.py +0 -0
  94. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/datasets/cached.py +0 -0
  95. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/datasets/cached2.py +0 -0
  96. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/datasets/generating.py +0 -0
  97. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/datasets/hdf.py +0 -0
  98. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/datasets/lm.py +0 -0
  99. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/datasets/map.py +0 -0
  100. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/datasets/meta.py +0 -0
  101. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/datasets/multi_proc.py +0 -0
  102. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/datasets/normalization_data.py +0 -0
  103. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/datasets/numpy_dump.py +0 -0
  104. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/datasets/raw_wav.py +0 -0
  105. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/datasets/sprint.py +0 -0
  106. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/datasets/stereo.py +0 -0
  107. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/datasets/util/__init__.py +0 -0
  108. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/datasets/util/feature_extraction.py +0 -0
  109. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/datasets/util/strings.py +0 -0
  110. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/datasets/util/vocabulary.py +0 -0
  111. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/engine/__init__.py +0 -0
  112. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/engine/base.py +0 -0
  113. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/engine/batch.py +0 -0
  114. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/extern/WarpRna/__init__.py +0 -0
  115. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/extern/WarpRna/__main__.py +0 -0
  116. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/extern/WarpRna/warp-rna/.git +0 -0
  117. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/extern/WarpRna/warp-rna/.gitignore +0 -0
  118. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/extern/WarpRna/warp-rna/LICENSE +0 -0
  119. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/extern/WarpRna/warp-rna/README.md +0 -0
  120. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/extern/WarpRna/warp-rna/aligner.gif +0 -0
  121. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/extern/WarpRna/warp-rna/check.png +0 -0
  122. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/extern/WarpRna/warp-rna/core.cu +0 -0
  123. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/extern/WarpRna/warp-rna/core.h +0 -0
  124. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/extern/WarpRna/warp-rna/core_cpu.cpp +0 -0
  125. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/extern/WarpRna/warp-rna/pytorch_binding/LICENSE +0 -0
  126. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/extern/WarpRna/warp-rna/pytorch_binding/MANIFEST.in +0 -0
  127. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/extern/WarpRna/warp-rna/pytorch_binding/README.md +0 -0
  128. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/extern/WarpRna/warp-rna/pytorch_binding/binding.cpp +0 -0
  129. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/extern/WarpRna/warp-rna/pytorch_binding/core.cu +0 -0
  130. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/extern/WarpRna/warp-rna/pytorch_binding/core.h +0 -0
  131. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/extern/WarpRna/warp-rna/pytorch_binding/requirements.txt +0 -0
  132. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/extern/WarpRna/warp-rna/pytorch_binding/setup.py +0 -0
  133. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/extern/WarpRna/warp-rna/pytorch_binding/warp_rna/__init__.py +0 -0
  134. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/extern/WarpRna/warp-rna/pytorch_binding/warp_rna/test.py +0 -0
  135. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/extern/WarpRna/warp-rna/ref_rna.py +0 -0
  136. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/extern/WarpRna/warp-rna/tensorflow_binding/setup.py +0 -0
  137. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/extern/WarpRna/warp-rna/tensorflow_binding/src/warp_rna_op.cc +0 -0
  138. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/extern/WarpRna/warp-rna/tensorflow_binding/src/warp_rna_op_kernel_tmpl.h +0 -0
  139. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/extern/WarpRna/warp-rna/tensorflow_binding/warp_rna/__init__.py +0 -0
  140. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/extern/WarpRna/warp-rna/test.cpp +0 -0
  141. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/extern/__init__.py +0 -0
  142. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/extern/graph_editor/README.md +0 -0
  143. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/extern/graph_editor/__init__.py +0 -0
  144. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/extern/graph_editor/edit.py +0 -0
  145. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/extern/graph_editor/reroute.py +0 -0
  146. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/extern/graph_editor/select.py +0 -0
  147. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/extern/graph_editor/subgraph.py +0 -0
  148. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/extern/graph_editor/transform.py +0 -0
  149. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/extern/graph_editor/util.py +0 -0
  150. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/forward_iface.py +0 -0
  151. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/frontend/__init__.py +0 -0
  152. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/frontend/_backend.py +0 -0
  153. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/frontend/_native/__init__.py +0 -0
  154. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/frontend/_native/backend.cpp +0 -0
  155. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/frontend/_native/backend.hpp +0 -0
  156. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/frontend/_native/module.cpp +0 -0
  157. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/frontend/_native/module.hpp +0 -0
  158. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/frontend/_native/py_utils.hpp +0 -0
  159. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/frontend/_native/tensor_ops.cpp +0 -0
  160. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/frontend/_native/tensor_ops.hpp +0 -0
  161. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/frontend/_numpy_backend.py +0 -0
  162. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/frontend/_random_journal.py +0 -0
  163. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/frontend/_utils.py +0 -0
  164. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/frontend/array_.py +0 -0
  165. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/frontend/attention.py +0 -0
  166. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/frontend/audio/__init__.py +0 -0
  167. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/frontend/audio/mel.py +0 -0
  168. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/frontend/audio/specaugment.py +0 -0
  169. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/frontend/backend.py +0 -0
  170. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/frontend/build_from_dict.py +0 -0
  171. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/frontend/cond.py +0 -0
  172. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/frontend/const.py +0 -0
  173. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/frontend/container.py +0 -0
  174. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/frontend/control_flow_ctx.py +0 -0
  175. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/frontend/conv.py +0 -0
  176. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/frontend/decoder/__init__.py +0 -0
  177. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/frontend/decoder/transformer.py +0 -0
  178. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/frontend/device.py +0 -0
  179. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/frontend/dims.py +0 -0
  180. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/frontend/dropout.py +0 -0
  181. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/frontend/dtype.py +0 -0
  182. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/frontend/encoder/__init__.py +0 -0
  183. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/frontend/encoder/base.py +0 -0
  184. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/frontend/encoder/conformer.py +0 -0
  185. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/frontend/gradient.py +0 -0
  186. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/frontend/graph.py +0 -0
  187. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/frontend/hooks.py +0 -0
  188. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/frontend/init.py +0 -0
  189. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/frontend/label_smoothing.py +0 -0
  190. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/frontend/linear.py +0 -0
  191. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/frontend/loop.py +0 -0
  192. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/frontend/loss.py +0 -0
  193. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/frontend/math_.py +0 -0
  194. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/frontend/matmul.py +0 -0
  195. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/frontend/module.py +0 -0
  196. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/frontend/normalization.py +0 -0
  197. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/frontend/parameter.py +0 -0
  198. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/frontend/piecewise_linear.py +0 -0
  199. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/frontend/rand.py +0 -0
  200. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/frontend/rec.py +0 -0
  201. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/frontend/reduce.py +0 -0
  202. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/frontend/run_ctx.py +0 -0
  203. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/frontend/signal.py +0 -0
  204. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/frontend/state.py +0 -0
  205. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/frontend/stepwise_scheduler.py +0 -0
  206. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/frontend/tensor_array.py +0 -0
  207. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/frontend/types.py +0 -0
  208. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/import_/__init__.py +0 -0
  209. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/import_/common.py +0 -0
  210. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/import_/git.py +0 -0
  211. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/import_/import_.py +0 -0
  212. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/learning_rate_control.py +0 -0
  213. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/log.py +0 -0
  214. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/native_op.cpp +0 -0
  215. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/native_op.py +0 -0
  216. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/pretrain.py +0 -0
  217. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/sprint/__init__.py +0 -0
  218. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/sprint/cache.py +0 -0
  219. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/sprint/control.py +0 -0
  220. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/sprint/error_signals.py +0 -0
  221. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/sprint/extern_interface.py +0 -0
  222. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/sprint/interface.py +0 -0
  223. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/tensor/README.md +0 -0
  224. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/tensor/__init__.py +0 -0
  225. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/tensor/_dim_extra.py +0 -0
  226. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/tensor/_tensor_extra.py +0 -0
  227. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/tensor/_tensor_mixin_base.py +0 -0
  228. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/tensor/_tensor_op_overloads.py +0 -0
  229. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/tensor/control_flow_ctx.py +0 -0
  230. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/tensor/dim.py +0 -0
  231. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/tensor/marked_dim.py +0 -0
  232. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/tensor/tensor.py +0 -0
  233. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/tensor/tensor_dict.py +0 -0
  234. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/tensor/utils.py +0 -0
  235. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/tf/__init__.py +0 -0
  236. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/tf/compat.py +0 -0
  237. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/tf/data_pipeline.py +0 -0
  238. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/tf/distributed.py +0 -0
  239. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/tf/engine.py +0 -0
  240. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/tf/frontend_layers/README.md +0 -0
  241. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/tf/frontend_layers/__init__.py +0 -0
  242. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/tf/frontend_layers/_backend.py +0 -0
  243. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/tf/frontend_layers/_utils.py +0 -0
  244. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/tf/frontend_layers/cond.py +0 -0
  245. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/tf/frontend_layers/config_entry_points.py +0 -0
  246. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/tf/frontend_layers/debug_eager_mode.py +0 -0
  247. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/tf/frontend_layers/dims.py +0 -0
  248. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/tf/frontend_layers/layer.py +0 -0
  249. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/tf/frontend_layers/loop.py +0 -0
  250. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/tf/frontend_layers/make_layer.py +0 -0
  251. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/tf/frontend_layers/masked_computation.py +0 -0
  252. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/tf/frontend_layers/parameter_assign.py +0 -0
  253. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/tf/frontend_layers/prev_tensor_ref.py +0 -0
  254. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/tf/frontend_low_level/__init__.py +0 -0
  255. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/tf/frontend_low_level/_backend.py +0 -0
  256. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/tf/horovod.py +0 -0
  257. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/tf/hyper_param_tuning.py +0 -0
  258. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/tf/layers/__init__.py +0 -0
  259. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/tf/layers/base.py +0 -0
  260. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/tf/layers/basic.py +0 -0
  261. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/tf/layers/rec.py +0 -0
  262. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/tf/layers/segmental_model.py +0 -0
  263. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/tf/layers/signal_processing.py +0 -0
  264. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/tf/layers/variable.py +0 -0
  265. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/tf/native_op.py +0 -0
  266. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/tf/network.py +0 -0
  267. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/tf/sprint.py +0 -0
  268. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/tf/updater.py +0 -0
  269. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/tf/util/__init__.py +0 -0
  270. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/tf/util/basic.py +0 -0
  271. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/tf/util/data.py +0 -0
  272. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/tf/util/gradient_checkpoint.py +0 -0
  273. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/tf/util/ken_lm.py +0 -0
  274. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/tf/util/open_fst.py +0 -0
  275. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/torch/README.md +0 -0
  276. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/torch/__init__.py +0 -0
  277. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/torch/data/__init__.py +0 -0
  278. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/torch/data/extern_data.py +0 -0
  279. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/torch/data/pipeline.py +0 -0
  280. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/torch/data/queued_data_iter.py +0 -0
  281. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/torch/data/returnn_dataset_wrapper.py +0 -0
  282. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/torch/data/tensor_utils.py +0 -0
  283. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/torch/distributed.py +0 -0
  284. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/torch/engine.py +0 -0
  285. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/torch/frontend/__init__.py +0 -0
  286. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/torch/frontend/_backend.py +0 -0
  287. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/torch/frontend/_rand.py +0 -0
  288. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/torch/frontend/bridge.py +0 -0
  289. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/torch/frontend/raw_ops.py +0 -0
  290. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/torch/updater.py +0 -0
  291. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/torch/util/README.md +0 -0
  292. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/torch/util/__init__.py +0 -0
  293. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/torch/util/diagnose_gpu.py +0 -0
  294. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/torch/util/scaled_gradient.py +0 -0
  295. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/util/__init__.py +0 -0
  296. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/util/basic.py +0 -0
  297. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/util/better_exchook.py +0 -0
  298. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/util/bpe.py +0 -0
  299. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/util/debug.py +0 -0
  300. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/util/debug_helpers.py +0 -0
  301. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/util/fsa.py +0 -0
  302. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/util/literal_py_to_pickle.py +0 -0
  303. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/util/math.py +0 -0
  304. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/util/multi_proc_non_daemonic_spawn.py +0 -0
  305. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/util/native_code_compiler.py +0 -0
  306. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/util/pprint.py +0 -0
  307. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/util/py-to-pickle.cpp +0 -0
  308. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/util/py_compat.py +0 -0
  309. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/util/py_ext_mod_compiler.py +0 -0
  310. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/util/result_with_reason.py +0 -0
  311. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/util/sig_proc.py +0 -0
  312. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/util/task_system.py +0 -0
  313. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/util/train_proc_manager.py +0 -0
  314. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn/util/watch_memory.py +0 -0
  315. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn.egg-info/SOURCES.txt +0 -0
  316. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn.egg-info/dependency_links.txt +0 -0
  317. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/returnn.egg-info/top_level.txt +0 -0
  318. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/rnn.py +0 -0
  319. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/setup.cfg +0 -0
  320. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/setup.py +0 -0
  321. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tests/DummySprintExec.py +0 -0
  322. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tests/PyCharm-inspection-profile.xml +0 -0
  323. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tests/PyCharm.idea/.gitignore +0 -0
  324. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tests/PyCharm.idea/.name +0 -0
  325. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tests/PyCharm.idea/codeStyleSettings.xml +0 -0
  326. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tests/PyCharm.idea/codeStyles/Project.xml +0 -0
  327. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tests/PyCharm.idea/codeStyles/codeStyleConfig.xml +0 -0
  328. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tests/PyCharm.idea/inspectionProfiles/Project_Default.xml +0 -0
  329. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tests/PyCharm.idea/inspectionProfiles/profiles_settings.xml +0 -0
  330. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tests/PyCharm.idea/misc.xml +0 -0
  331. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tests/PyCharm.idea/modules.xml +0 -0
  332. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tests/PyCharm.idea/returnn.iml +0 -0
  333. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tests/PyCharm.idea/scopes/scope_settings.xml +0 -0
  334. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tests/_set_num_threads1.py +0 -0
  335. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tests/_setup_returnn_env.py +0 -0
  336. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tests/_setup_test_env.py +0 -0
  337. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tests/bpe-unicode-demo.codes +0 -0
  338. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tests/bpe-unicode-demo.vocab +0 -0
  339. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tests/lexicon_opt.fst +0 -0
  340. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tests/lexicon_opt.isyms +0 -0
  341. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tests/lexicon_opt.jpg +0 -0
  342. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tests/lexicon_opt.osyms +0 -0
  343. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tests/lint_common.py +0 -0
  344. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tests/pycharm-inspect.py +0 -0
  345. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tests/pylint.py +0 -0
  346. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tests/returnn-as-framework.py +0 -0
  347. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tests/rf_utils.py +0 -0
  348. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tests/spelling.dic +0 -0
  349. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tests/test_Config.py +0 -0
  350. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tests/test_Dataset.py +0 -0
  351. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tests/test_Fsa.py +0 -0
  352. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tests/test_GeneratingDataset.py +0 -0
  353. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tests/test_HDFDataset.py +0 -0
  354. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tests/test_LearningRateControl.py +0 -0
  355. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tests/test_Log.py +0 -0
  356. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tests/test_MultiProcDataset.py +0 -0
  357. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tests/test_Pretrain.py +0 -0
  358. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tests/test_ResNet.py +0 -0
  359. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tests/test_SprintDataset.py +0 -0
  360. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tests/test_SprintInterface.py +0 -0
  361. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tests/test_TFEngine.py +0 -0
  362. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tests/test_TFNativeOp.py +0 -0
  363. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tests/test_TFNetworkLayer.py +0 -0
  364. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tests/test_TFNetworkRecLayer.py +0 -0
  365. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tests/test_TFNetworkSigProcLayer.py +0 -0
  366. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tests/test_TFUpdater.py +0 -0
  367. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tests/test_TFUtil.py +0 -0
  368. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tests/test_TF_determinism.py +0 -0
  369. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tests/test_TaskSystem.py +0 -0
  370. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tests/test_TaskSystem_SharedMem.py +0 -0
  371. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tests/test_TranslationDataset.py +0 -0
  372. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tests/test_demos.py +0 -0
  373. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tests/test_fork_exec.py +0 -0
  374. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tests/test_hdf_dump.py +0 -0
  375. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tests/test_rf_array.py +0 -0
  376. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tests/test_rf_attention.py +0 -0
  377. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tests/test_rf_base.py +0 -0
  378. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tests/test_rf_cond.py +0 -0
  379. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tests/test_rf_const.py +0 -0
  380. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tests/test_rf_container.py +0 -0
  381. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tests/test_rf_conv.py +0 -0
  382. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tests/test_rf_encoder_conformer.py +0 -0
  383. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tests/test_rf_gradient.py +0 -0
  384. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tests/test_rf_label_smoothing.py +0 -0
  385. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tests/test_rf_loop.py +0 -0
  386. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tests/test_rf_math.py +0 -0
  387. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tests/test_rf_normalization.py +0 -0
  388. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tests/test_rf_piecewise_linear.py +0 -0
  389. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tests/test_rf_rec.py +0 -0
  390. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tests/test_rf_reduce.py +0 -0
  391. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tests/test_rf_signal.py +0 -0
  392. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tests/test_tensor.py +0 -0
  393. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tests/test_tools.py +0 -0
  394. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tests/test_torch_dataset.py +0 -0
  395. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tests/test_torch_engine.py +0 -0
  396. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tests/test_torch_frontend.py +0 -0
  397. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tests/test_torch_internal_frontend.py +0 -0
  398. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tools/_setup_returnn_env.py +0 -0
  399. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tools/analyze-dataset-batches.py +0 -0
  400. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tools/bliss-collect-seq-lens.py +0 -0
  401. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tools/bliss-dump-text.py +0 -0
  402. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tools/bliss-get-segment-names.py +0 -0
  403. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tools/bliss-to-ogg-zip.py +0 -0
  404. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tools/bpe-create-lexicon.py +0 -0
  405. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tools/calculate-word-error-rate.py +0 -0
  406. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tools/cleanup-old-models.py +0 -0
  407. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tools/collect-orth-symbols.py +0 -0
  408. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tools/collect-words.py +0 -0
  409. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tools/compile_native_op.py +0 -0
  410. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tools/compile_tf_graph.py +0 -0
  411. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tools/debug-dump-search-scores.py +0 -0
  412. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tools/debug-plot-search-scores.py +0 -0
  413. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tools/dump-dataset-raw-strings.py +0 -0
  414. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tools/dump-dataset.py +0 -0
  415. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tools/dump-forward-stats.py +0 -0
  416. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tools/dump-forward.py +0 -0
  417. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tools/dump-network-json.py +0 -0
  418. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tools/dump-pickle.py +0 -0
  419. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tools/extract_state_tying_from_dataset.py +0 -0
  420. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tools/get-attention-weights.py +0 -0
  421. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tools/get-best-model-epoch.py +0 -0
  422. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tools/hdf_dump.py +0 -0
  423. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tools/hdf_dump_translation_dataset.py +0 -0
  424. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tools/import-blocks-mt-model.py +0 -0
  425. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tools/import-t2t-mt-model.py +0 -0
  426. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tools/lattice_rescorer/.gitignore +0 -0
  427. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tools/lattice_rescorer/Makefile +0 -0
  428. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tools/lattice_rescorer/README.md +0 -0
  429. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tools/lattice_rescorer/example/README.md +0 -0
  430. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tools/lattice_rescorer/example/libs_list +0 -0
  431. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tools/lattice_rescorer/example/network.040/i600_m600_m600.sgd_b16_lr0_cl2.newbobabs.config +0 -0
  432. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tools/lattice_rescorer/example/network.040/i600_m600_m600.sgd_b16_lr0_cl2.newbobabs.keep_over_epoch.lstm2.config +0 -0
  433. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tools/lattice_rescorer/example/rescore_lattice.sh +0 -0
  434. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tools/lattice_rescorer/example/state_vars_list +0 -0
  435. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tools/lattice_rescorer/example/tensor_names_list +0 -0
  436. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tools/lattice_rescorer/file.h +0 -0
  437. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tools/lattice_rescorer/htklatticerescorer.cc +0 -0
  438. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tools/lattice_rescorer/htklatticerescorer.h +0 -0
  439. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tools/lattice_rescorer/main.cc +0 -0
  440. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tools/lattice_rescorer/rescorer.h +0 -0
  441. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tools/lattice_rescorer/vocabulary.cc +0 -0
  442. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tools/lattice_rescorer/vocabulary.h +0 -0
  443. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tools/tf_avg_checkpoints.py +0 -0
  444. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tools/tf_inspect_checkpoint.py +0 -0
  445. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tools/tf_inspect_summary_log.py +0 -0
  446. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tools/torch_avg_checkpoints.py +0 -0
  447. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tools/torch_export_to_onnx.py +0 -0
  448. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tools/torch_inspect_checkpoint.py +0 -0
  449. {returnn-1.20240621.145554 → returnn-1.20240621.194850}/tools/torch_inspect_checkpoint_and_opt.py +0 -0
@@ -25,6 +25,11 @@ It also was specifically designed with distributed training in mind.
25
25
  The distributed random_seed_offset method can be used,
26
26
  but sharding is also supported ([PR #1538](https://github.com/rwth-i6/returnn/pull/1538)).
27
27
 
28
+ ## 2023-11-28: [`lovely_tensors`](https://xl0.github.io/lovely-tensors/) support
29
+
30
+ Set `use_lovely_tensors = True` in the config.
31
+ Should always be safe to use, thus can always be enabled.
32
+
28
33
  ## 2023-11-09: `LearningRateControl` saves more meta info in learning-rate-file
29
34
 
30
35
  Like effective learning rate (after `dynamic_learning_rate`),
@@ -33,11 +38,15 @@ training step, GPU, RETURNN version, etc.
33
38
 
34
39
  ## 2024-01-09: [Train proc manager](https://github.com/rwth-i6/returnn/blob/master/returnn/util/train_proc_manager.py)
35
40
 
41
+ Set `use_train_proc_manager = True` (currently PyTorch only).
42
+ Should always be safe to use, thus can always be enabled.
36
43
  Auto restart RETURNN on crashes under certain conditions
37
44
  (e.g. it must have trained at least one epoch successfully since the most recent restart).
38
45
 
39
46
  ## 2023-12-30: PyTorch handle OOM for forwarding, auto-split batch
40
47
 
48
+ Set `forward_auto_split_batch_on_oom = True` in the config (currently PyTorch only).
49
+ Should always be safe to use, thus can always be enabled.
41
50
  This went through several iterations of approaches,
42
51
  stumbling through a number of CPython and PyTorch bugs,
43
52
  e.g. [CPython #113939](https://github.com/python/cpython/issues/113939),
@@ -50,6 +59,9 @@ In the `torch_distributed` config dict: Set `"reduce_type": "param"` and `"param
50
59
 
51
60
  ## 2023-10-24: [`watch_memory`](https://github.com/rwth-i6/returnn/blob/master/returnn/util/watch_memory.py): watches memory of all procs
52
61
 
62
+ Set `watch_memory = True` in the config.
63
+ Should not influence anything, thus can always be enabled.
64
+
53
65
  ## 2023-10-03: RETURNN frontend (RF) native helpers ([PR #1403](https://github.com/rwth-i6/returnn/pull/1403))
54
66
 
55
67
  ## 2023-06-09: PyTorch distributed training ([PR #1335](https://github.com/rwth-i6/returnn/pull/1335), [issue #1332](https://github.com/rwth-i6/returnn/issues/1332))
@@ -200,6 +212,8 @@ and `delay_sample_update=True`.
200
212
 
201
213
  ## 2020-11-06: [PyTorch-to-RETURNN project](https://github.com/rwth-i6/pytorch-to-returnn)
202
214
 
215
+ ## 2020-08-14: GitHub actions CI to replace Travis ([PR #340](https://github.com/rwth-i6/returnn/pull/340), [issue #308](https://github.com/rwth-i6/returnn/issues/308))
216
+
203
217
  ## 2020-08-03: New code structure ([discussion](https://github.com/rwth-i6/returnn/issues/162))
204
218
 
205
219
  `TFEngine` (or `returnn.TFEngine`) becomes `returnn.tf.engine`, etc.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: returnn
3
- Version: 1.20240621.145554
3
+ Version: 1.20240621.194850
4
4
  Summary: The RWTH extensible training framework for universal recurrent neural networks
5
5
  Home-page: https://github.com/rwth-i6/returnn/
6
6
  Author: Albert Zeyer
@@ -0,0 +1,2 @@
1
+ version = '1.20240621.194850'
2
+ long_version = '1.20240621.194850+git.ef9cff9'
@@ -29,8 +29,7 @@ from returnn.log import log
29
29
  from returnn.config import Config, get_global_config
30
30
  from returnn.datasets import Dataset, init_dataset, init_dataset_via_str
31
31
  from returnn.datasets.hdf import HDFDataset
32
- from returnn.util import debug as debug_util
33
- from returnn.util import basic as util
32
+ from returnn.util import basic as util, debug as debug_util
34
33
  from returnn.util.basic import BackendEngine, BehaviorVersion
35
34
 
36
35
  # These imports are not directly used here, but make them available, as other code imports them from here.
@@ -25,6 +25,7 @@ from returnn.log import log
25
25
  from returnn.engine.batch import Batch, BatchSetGenerator
26
26
  from returnn.datasets.util.vocabulary import Vocabulary
27
27
  from returnn.util.basic import try_run, NumbersDict, OptionalNotImplementedError
28
+ from returnn.util import file_cache
28
29
  from returnn.tensor import TensorDict
29
30
 
30
31
  if TYPE_CHECKING:
@@ -195,6 +196,7 @@ class Dataset(object):
195
196
  self.shuffle_frames_of_nseqs = shuffle_frames_of_nseqs
196
197
  self.epoch = None
197
198
  self.zpad = None
199
+ self._file_cache: Optional[file_cache.FileCache] = None
198
200
 
199
201
  def __repr__(self):
200
202
  return "<%s %r epoch=%s>" % (
@@ -282,6 +284,13 @@ class Dataset(object):
282
284
  return returnn.tf.horovod.get_ctx(config=config).rank() * 16127
283
285
  return 0
284
286
 
287
+ def set_file_cache(self, cache: file_cache.FileCache):
288
+ """
289
+ Stores the given file cache with the dataset to unregister the files within
290
+ the cache when the dataset is deinitialized.
291
+ """
292
+ self._file_cache = cache
293
+
285
294
  @staticmethod
286
295
  def _parse_chunking(chunking):
287
296
  """
@@ -1434,7 +1443,13 @@ def init_dataset(
1434
1443
  kwargs.update(default_kwargs)
1435
1444
  if extra_kwargs:
1436
1445
  kwargs.update(extra_kwargs)
1437
- return init_dataset_via_str(config_str=config_str, **kwargs)
1446
+ cache = file_cache.get_instance()
1447
+ kwargs, cached_files = cache.handle_cached_files_in_config(kwargs)
1448
+ obj = init_dataset_via_str(config_str=config_str, **kwargs)
1449
+ assert isinstance(obj, Dataset)
1450
+ if cached_files:
1451
+ obj.set_file_cache(cache)
1452
+ return obj
1438
1453
  assert isinstance(kwargs, dict)
1439
1454
  kwargs = kwargs.copy()
1440
1455
  assert "class" in kwargs
@@ -1448,9 +1463,13 @@ def init_dataset(
1448
1463
  kwargs.setdefault(key, value)
1449
1464
  if extra_kwargs:
1450
1465
  kwargs.update(extra_kwargs)
1466
+ cache = file_cache.get_instance()
1467
+ kwargs, cached_files = cache.handle_cached_files_in_config(kwargs)
1451
1468
  obj = clazz(**kwargs)
1452
1469
  assert isinstance(obj, Dataset)
1453
1470
  obj.initialize()
1471
+ if cached_files:
1472
+ obj.set_file_cache(cache)
1454
1473
  return obj
1455
1474
 
1456
1475
 
@@ -6,7 +6,7 @@ https://github.com/rwth-i6/returnn/issues/1519
6
6
 
7
7
  from __future__ import annotations
8
8
 
9
- from typing import Optional, Any, Dict, Tuple, List, Sequence, Collection, Callable, Union
9
+ from typing import Optional, Any, Dict, Tuple, List, Sequence, Callable, Union
10
10
  import os
11
11
  import sys
12
12
  import numpy
@@ -136,7 +136,6 @@ class DistributeFilesDataset(CachedDataset2):
136
136
  get_sub_epoch_dataset: Callable[[List[FileTree]], Dict[str, Any]],
137
137
  preload_next_n_sub_epochs: int = 1,
138
138
  buffer_size: int = 1,
139
- file_cache_opts: Optional[Dict[str, Any]] = None,
140
139
  distrib_shard_files: bool = False,
141
140
  _meta_info_cache: Optional[Dict[str, Any]] = None,
142
141
  **kwargs,
@@ -157,13 +156,11 @@ class DistributeFilesDataset(CachedDataset2):
157
156
  assert preload_next_n_sub_epochs >= 0
158
157
  self.preload_next_n_sub_epochs = preload_next_n_sub_epochs
159
158
  self.buffer_size = buffer_size
160
- self.file_cache_opts = file_cache_opts or {}
161
159
  self._file_sizes: Optional[Dict[str, int]] = None # key -> size. for equal distribution across sub epochs
162
160
  self._data_keys: Optional[List[str]] = None
163
161
  self._num_seqs: Optional[int] = None
164
162
  self._shard_index, self._num_shards = _get_rank_and_size() if distrib_shard_files else (0, 1)
165
163
 
166
- self._file_cache: Optional[_FileCacheProc] = None
167
164
  self._workers: Dict[int, _WorkerProcParent] = {} # epoch -> worker
168
165
  self._files_order_cache: Dict[int, List[List[FileTree]]] = {} # full epoch (0-indexed) -> files order
169
166
 
@@ -205,15 +202,12 @@ class DistributeFilesDataset(CachedDataset2):
205
202
  return
206
203
  # First, we need to know the num_inputs, num_outputs, total_num_seqs, labels.
207
204
  # Init the dataset with the first file.
208
- dataset_dict, exit_hook = self._get_sub_dataset_dict(files=[self.files[0]])
209
- try:
210
- dataset = init_dataset(dataset_dict, extra_kwargs={"seq_ordering": "default"}, parent_dataset=self)
211
- self.num_inputs = dataset.num_inputs
212
- self.num_outputs = dataset.num_outputs
213
- self.labels = dataset.labels
214
- self._data_keys = dataset.get_data_keys()
215
- finally:
216
- exit_hook()
205
+ dataset_dict = self._get_sub_dataset_dict(files=[self.files[0]])
206
+ dataset = init_dataset(dataset_dict, extra_kwargs={"seq_ordering": "default"}, parent_dataset=self)
207
+ self.num_inputs = dataset.num_inputs
208
+ self.num_outputs = dataset.num_outputs
209
+ self.labels = dataset.labels
210
+ self._data_keys = dataset.get_data_keys()
217
211
 
218
212
  def _lazy_init_file_sizes(self):
219
213
  import tree
@@ -224,17 +218,7 @@ class DistributeFilesDataset(CachedDataset2):
224
218
  _get_key_for_file_tree(t): sum((os.path.getsize(fn) for fn in tree.flatten(t)), 0) for t in self.files
225
219
  }
226
220
 
227
- def _lazy_init_file_cache_proc(self):
228
- if self._file_cache:
229
- return
230
- self._file_cache = _FileCacheProc(
231
- name=f"{self.__class__.__name__} {self.name}", file_cache_opts=self.file_cache_opts
232
- )
233
-
234
221
  def __del__(self):
235
- if self._file_cache:
236
- try_run(self._file_cache.exit, kwargs={"join": False})
237
- self._file_cache = None
238
222
  for k, worker in self._workers.items():
239
223
  try_run(worker.exit, kwargs={"join": False})
240
224
  self._workers.clear()
@@ -256,7 +240,6 @@ class DistributeFilesDataset(CachedDataset2):
256
240
  return True
257
241
 
258
242
  self._lazy_init_file_sizes()
259
- self._lazy_init_file_cache_proc()
260
243
 
261
244
  full_epoch_0idx = (epoch - 1) // self.partition_epoch
262
245
 
@@ -300,21 +283,20 @@ class DistributeFilesDataset(CachedDataset2):
300
283
  files_order: List[List[FileTree]] = self._files_order_cache[full_epoch_0idx_]
301
284
  files_for_subep = files_order[(ep_ - 1) % self.partition_epoch]
302
285
  print(f"{self}: using files for epoch {ep_}: {files_for_subep}", file=log.v4)
303
- dataset_dict, exit_hook = self._get_sub_dataset_dict(files=files_for_subep)
286
+ dataset_dict = self._get_sub_dataset_dict(files=files_for_subep)
304
287
  worker = _WorkerProcParent(
305
288
  name=f"{self.__class__.__name__} {self.name} ep {epoch}",
306
289
  epoch=ep_,
307
290
  full_epoch_0idx=full_epoch_0idx_,
308
291
  dataset_dict=dataset_dict,
309
292
  buffer_size=self.buffer_size,
310
- exit_hook=exit_hook,
311
293
  )
312
294
  self._workers[ep_] = worker
313
295
 
314
296
  self._num_seqs = self._workers[epoch].get_num_seqs()
315
297
  return True
316
298
 
317
- def _get_sub_dataset_dict(self, files: List[FileTree]) -> Tuple[Dict[str, Any], _FileCacheExitHook]:
299
+ def _get_sub_dataset_dict(self, files: List[FileTree]) -> Dict[str, Any]:
318
300
  dataset_dict = self.get_sub_epoch_dataset(files)
319
301
  dataset_dict = extend_dataset_dict_from_parent_dataset(dataset_dict, parent_dataset=self)
320
302
  if dataset_dict.get("partition_epoch", 1) != 1:
@@ -324,9 +306,7 @@ class DistributeFilesDataset(CachedDataset2):
324
306
  f"{self}: sub dataset should have explicit seq_ordering "
325
307
  f"(or seq_order_control_dataset for MetaDataset), got: {dataset_dict}"
326
308
  )
327
- self._lazy_init_file_cache_proc()
328
- dataset_dict, exit_hook = self._file_cache.handle_cached_files_in_config(dataset_dict)
329
- return dataset_dict, exit_hook
309
+ return dataset_dict
330
310
 
331
311
  @staticmethod
332
312
  def _distribute_evenly_by_size(
@@ -417,9 +397,6 @@ class DistributeFilesDataset(CachedDataset2):
417
397
  worker.exit()
418
398
  self._workers.clear()
419
399
  self._files_order_cache.clear()
420
- if self._file_cache:
421
- self._file_cache.exit()
422
- self._file_cache = None
423
400
  else:
424
401
  if self.epoch in self._workers:
425
402
  worker = self._workers.pop(self.epoch)
@@ -647,95 +624,3 @@ def _worker_proc_loop(
647
624
  raise Exception(f"unknown msg {msg!r}")
648
625
  except KeyboardInterrupt: # when parent dies
649
626
  pass
650
-
651
-
652
- class _FileCacheProc:
653
- def __init__(self, *, name: str, file_cache_opts: Dict[str, Any]):
654
- self.file_cache_opts = file_cache_opts
655
-
656
- parent_conn, child_conn = _mp.Pipe()
657
- self.parent_conn: mpConnection = parent_conn
658
-
659
- self.proc = _mp.Process(
660
- name=f"{name} file cache",
661
- target=_file_cache_proc_loop,
662
- args=(file_cache_opts, child_conn),
663
- daemon=True,
664
- )
665
- self.proc.start()
666
- # Make sure the child connection is closed here.
667
- # It stays open in the child, until the child dies.
668
- # When that happens, now any consecutive read on the pipe
669
- # should yield an exception -- which is what we want,
670
- # otherwise it would just hang.
671
- child_conn.close()
672
-
673
- def handle_cached_files_in_config(self, config: Dict[str, Any]) -> Tuple[Dict[str, Any], _FileCacheExitHook]:
674
- """:func:`FileCache.handle_cached_files_in_config`"""
675
- self.parent_conn.send(("handle_cached_files_in_config", {"config": config}))
676
- msg, (res, files) = self.parent_conn.recv()
677
- assert msg == "config_and_cached_files" and isinstance(config, dict) and isinstance(files, list)
678
- return res, _FileCacheExitHook(self, files)
679
-
680
- def release_files(self, filenames: Collection[str]):
681
- """:func:`FileCache.release_files`"""
682
- self.parent_conn.send(("release_files", {"filenames": filenames}))
683
-
684
- def exit(self, *, join: bool = True):
685
- """exit"""
686
- if self.proc.exitcode is not None: # already stopped?
687
- return
688
- self.parent_conn.send(("exit", {}))
689
- if join:
690
- self.proc.join()
691
-
692
- def __del__(self):
693
- # noinspection PyBroadException
694
- try:
695
- self.exit(join=False)
696
- except Exception:
697
- pass
698
- else:
699
- try_run(self.proc.join)
700
-
701
-
702
- class _FileCacheExitHook:
703
- def __init__(self, file_cache_proc: _FileCacheProc, cached_files: List[str]):
704
- self.file_cache_proc = file_cache_proc
705
- self.cached_files = cached_files
706
-
707
- def __call__(self):
708
- if self.file_cache_proc.proc.exitcode is not None:
709
- return
710
- self.file_cache_proc.release_files(self.cached_files)
711
-
712
-
713
- def _file_cache_proc_loop(
714
- file_cache_opts: Dict[str, Any],
715
- parent_conn: mpConnection,
716
- ):
717
- if sys.platform == "linux":
718
- with open("/proc/self/comm", "w") as f:
719
- f.write(f"File cache")
720
-
721
- assert isinstance(file_cache_opts, dict)
722
- assert isinstance(parent_conn, mpConnection)
723
-
724
- from returnn.util.file_cache import FileCache
725
-
726
- file_cache = FileCache(**file_cache_opts)
727
-
728
- try:
729
- while True:
730
- msg, kwargs = parent_conn.recv()
731
- if msg == "exit":
732
- break
733
- elif msg == "handle_cached_files_in_config":
734
- res, files = file_cache.handle_cached_files_in_config(**kwargs)
735
- parent_conn.send(("config_and_cached_files", (res, files)))
736
- elif msg == "release_files":
737
- file_cache.release_files(**kwargs)
738
- else:
739
- raise Exception(f"unknown msg {msg!r}")
740
- except KeyboardInterrupt: # when parent dies
741
- pass
@@ -9,9 +9,10 @@ See https://github.com/rwth-i6/returnn/issues/1519 for initial discussion.
9
9
  Main class is :class:`FileCache`.
10
10
  """
11
11
 
12
- from typing import Any, Collection, List, Tuple
12
+ from typing import Any, Collection, List, Optional, Tuple
13
13
  import errno
14
14
  import os
15
+ import pathlib
15
16
  import time
16
17
  import shutil
17
18
  from dataclasses import dataclass
@@ -19,9 +20,10 @@ from collections import defaultdict
19
20
  from contextlib import contextmanager
20
21
  from threading import Thread, Event
21
22
  from .basic import expand_env_vars, LockFile, human_bytes_size
23
+ from returnn.config import Config, get_global_config
22
24
 
23
25
 
24
- __all__ = ["FileCache", "CachedFile"]
26
+ __all__ = ["FileCache", "CachedFile", "get_instance"]
25
27
 
26
28
 
27
29
  class FileCache:
@@ -78,8 +80,6 @@ class FileCache:
78
80
  assert cleanup_disk_usage_wanted_multiplier >= 1.0
79
81
  self._cleanup_disk_usage_wanted_multiplier = cleanup_disk_usage_wanted_multiplier
80
82
  self._touch_files_thread = _TouchFilesThread(cache_base_dir=self.cache_directory)
81
- self._touch_files_thread.start()
82
- self._recent_full_cleanup_time = float("-inf")
83
83
  assert num_tries > 0
84
84
  self._num_tries = num_tries
85
85
 
@@ -151,13 +151,21 @@ class FileCache:
151
151
  int(self._cleanup_disk_usage_wanted_multiplier * need_at_least_free_space_size),
152
152
  int(self._cleanup_disk_usage_wanted_free_ratio * disk_usage.total),
153
153
  )
154
- # If we have enough free space, and we did a full cleanup recently, we don't need to do anything.
155
- if want_free_space_size <= disk_usage.free and time.monotonic() - self._recent_full_cleanup_time < 60 * 10:
156
- return
157
- # Do a full cleanup, i.e. iterate through all files in cache directory and check their mtime.
154
+ cleanup_timestamp_file = self.cache_directory + "/.recent_full_cleanup"
155
+ try:
156
+ last_full_cleanup = os.stat(cleanup_timestamp_file).st_mtime
157
+ except FileNotFoundError:
158
+ last_full_cleanup = float("-inf")
158
159
  # Get current time now, so that cur_time - mtime is pessimistic,
159
160
  # and does not count the time for the cleanup itself.
160
161
  cur_time = time.time()
162
+ # If we have enough free space, and we did a full cleanup recently, we don't need to do anything.
163
+ if want_free_space_size <= disk_usage.free and cur_time - last_full_cleanup < 60 * 10:
164
+ return
165
+ # immediately update the file's timestamp to reduce racyness between worker processes
166
+ # Path().touch() also creates the file if it doesn't exist yet
167
+ pathlib.Path(cleanup_timestamp_file).touch(exist_ok=True)
168
+ # Do a full cleanup, i.e. iterate through all files in cache directory and check their mtime.
161
169
  all_files = [] # mtime, neg size (better for sorting), filename
162
170
  for root, dirs, files in os.walk(self.cache_directory):
163
171
  for rel_fn in files:
@@ -256,8 +264,6 @@ class FileCache:
256
264
  except Exception as exc:
257
265
  print(f"FileCache: Error while removing empty dir {root}: {type(exc).__name__}: {exc}")
258
266
 
259
- self._recent_full_cleanup_time = time.monotonic()
260
-
261
267
  def handle_cached_files_in_config(self, config: Any) -> Tuple[Any, List[str]]:
262
268
  """
263
269
  :param config: some config, e.g. dict, or any nested structure
@@ -337,6 +343,17 @@ class FileCache:
337
343
  return True
338
344
 
339
345
 
346
+ def get_instance(config: Optional[Config] = None) -> FileCache:
347
+ """
348
+ Returns a file cache instance potentially initialized by the global config.
349
+
350
+ Uses defaults if no global config is set.
351
+ """
352
+ config = config or get_global_config(return_empty_if_none=True)
353
+ kwargs = config.typed_value("file_cache_opts") or {}
354
+ return FileCache(**kwargs)
355
+
356
+
340
357
  def _copy_with_prealloc(src: str, dst: str):
341
358
  """
342
359
  Copies the file at `src` to `dst` preallocating the space at `dst` before the
@@ -387,6 +404,7 @@ class _TouchFilesThread(Thread):
387
404
  self.files = defaultdict(int) # usage counter
388
405
  self.interval = interval
389
406
  self.cache_base_dir = cache_base_dir
407
+ self._is_started = False # careful: `_started` is already a member of the base class
390
408
 
391
409
  def run(self):
392
410
  """thread main loop"""
@@ -400,9 +418,17 @@ class _TouchFilesThread(Thread):
400
418
  if self.stop.wait(self.interval):
401
419
  return
402
420
 
421
+ def start_once(self):
422
+ """reentrant variant of start() that can safely be called multiple times"""
423
+ if self._is_started:
424
+ return
425
+ self._is_started = True
426
+ self.start()
427
+
403
428
  def files_extend(self, files: Collection[str]):
404
429
  """append"""
405
430
  assert isinstance(files, (list, set, tuple))
431
+ self.start_once()
406
432
  for file in files:
407
433
  self.files[file] += 1
408
434
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: returnn
3
- Version: 1.20240621.145554
3
+ Version: 1.20240621.194850
4
4
  Summary: The RWTH extensible training framework for universal recurrent neural networks
5
5
  Home-page: https://github.com/rwth-i6/returnn/
6
6
  Author: Albert Zeyer
@@ -870,7 +870,12 @@ def test_file_cache():
870
870
  # Check cleanup mechanism.
871
871
  cache._cleanup_files_always_older_than_days = 4 / 60 / 60 / 24
872
872
  print("Cache older than secs:", cache._cleanup_files_always_older_than_days * 24 * 60 * 60)
873
- print("Recent cleanup is ago:", time.monotonic() - cache._recent_full_cleanup_time, "secs")
873
+ cleanup_timestamp_file = cache_dir + "/.recent_full_cleanup"
874
+ try:
875
+ last_full_cleanup = os.stat(cleanup_timestamp_file).st_mtime
876
+ except FileNotFoundError:
877
+ last_full_cleanup = float("-inf")
878
+ print("Recent cleanup is ago:", time.time() - last_full_cleanup, "secs")
874
879
  # Note: After the first cleanup, there are still dirs maybe left over, because dirs are only cleaned
875
880
  # when their mtime is a older than some threshold.
876
881
  # However, when we just deleted some file inside, that would have updated the mtime of the dir.
@@ -879,14 +884,17 @@ def test_file_cache():
879
884
  prev_count_dirs = None
880
885
  while True:
881
886
  time.sleep(0.1)
882
- cache._recent_full_cleanup_time = float("-inf") # reset
887
+ os.unlink(cleanup_timestamp_file) # reset
888
+ time.sleep(0.1)
883
889
  cache.cleanup()
884
890
  count_files = 0
885
891
  count_dirs = 0
886
892
  for root, dirs, files in os.walk(cache_dir):
893
+ # ignore cleanup timestamp file
887
894
  for fn in dirs + files:
888
895
  print(f"{root}/{fn}", "age:", time.time() - os.stat(f"{root}/{fn}").st_mtime, "sec")
889
- count_files += len(files)
896
+ leftover_files = [f for f in files if "recent_full_cleanup" not in f]
897
+ count_files += len(leftover_files)
890
898
  count_dirs += len(dirs)
891
899
  print("count files:", count_files, "count dirs:", count_dirs)
892
900
  assert count_files == 0
@@ -1,2 +0,0 @@
1
- version = '1.20240621.145554'
2
- long_version = '1.20240621.145554+git.5fd7cbc'