returnn 1.20240719.111324__tar.gz → 1.20240719.172149__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 (455) hide show
  1. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/PKG-INFO +1 -1
  2. returnn-1.20240719.172149/_setup_info_generated.py +2 -0
  3. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/frontend/_numpy_backend.py +29 -1
  4. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/frontend/dims.py +20 -19
  5. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/torch/frontend/_backend.py +11 -15
  6. returnn-1.20240719.172149/returnn/torch/util/array_.py +54 -0
  7. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn.egg-info/PKG-INFO +1 -1
  8. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn.egg-info/SOURCES.txt +1 -0
  9. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tests/test_rf_base.py +37 -0
  10. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tests/test_torch_frontend.py +158 -2
  11. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tests/torch_utils.py +130 -26
  12. returnn-1.20240719.111324/_setup_info_generated.py +0 -2
  13. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/.editorconfig +0 -0
  14. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/.gitignore +0 -0
  15. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/.gitmodules +0 -0
  16. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/.kateconfig +0 -0
  17. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/CHANGELOG.md +0 -0
  18. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/CODEOWNERS +0 -0
  19. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/CONTRIBUTING.md +0 -0
  20. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/LICENSE +0 -0
  21. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/MANIFEST.in +0 -0
  22. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/README.rst +0 -0
  23. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/__init__.py +0 -0
  24. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/demos/12AX.cluster_map +0 -0
  25. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/demos/_setup_returnn_env.py +0 -0
  26. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/demos/demo-fwd.config +0 -0
  27. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/demos/demo-horovod-mpi.py +0 -0
  28. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/demos/demo-horovod-mpi.py.sh +0 -0
  29. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/demos/demo-horovod-mpi.sh +0 -0
  30. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/demos/demo-hyper-param-tuning.config +0 -0
  31. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/demos/demo-iter-dataset.py +0 -0
  32. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/demos/demo-list-devices.py +0 -0
  33. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/demos/demo-lua-torch-layer.config +0 -0
  34. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/demos/demo-pretrain.config +0 -0
  35. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/demos/demo-record-and-push-to-webserver.py +0 -0
  36. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/demos/demo-returnn-as-framework.py +0 -0
  37. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/demos/demo-rf-pt-benchmark.py +0 -0
  38. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/demos/demo-rf.config +0 -0
  39. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/demos/demo-rhn-enwik8.config +0 -0
  40. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/demos/demo-sprint-interface.py +0 -0
  41. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/demos/demo-tf-att-copy.config +0 -0
  42. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/demos/demo-tf-attention.config +0 -0
  43. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/demos/demo-tf-chunking-blstm.12ax.config +0 -0
  44. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/demos/demo-tf-contribrnn-lstm.12ax.config +0 -0
  45. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/demos/demo-tf-enc-dec.config +0 -0
  46. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/demos/demo-tf-hard-att-copy.config +0 -0
  47. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/demos/demo-tf-lstm-benchmark.py +0 -0
  48. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/demos/demo-tf-maxgradnorm-lstm.12ax.config +0 -0
  49. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/demos/demo-tf-native-lstm-lowmem.12ax.config +0 -0
  50. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/demos/demo-tf-native-lstm.12ax.config +0 -0
  51. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/demos/demo-tf-native-lstm2.12ax.config +0 -0
  52. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/demos/demo-tf-native-lstm2.12ax.tuned.config +0 -0
  53. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/demos/demo-tf-neural-transducer.12ax.config +0 -0
  54. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/demos/demo-tf-rec-explicit-lstm.config +0 -0
  55. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/demos/demo-tf-rec-explicit-rnn.config +0 -0
  56. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/demos/demo-tf-rec-self-att.config +0 -0
  57. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/demos/demo-tf-search-compiled-graph.py +0 -0
  58. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/demos/demo-tf-vanilla-lstm.12ax.config +0 -0
  59. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/demos/demo-timit-lstm-ctc.config +0 -0
  60. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/demos/demo-torch.config +0 -0
  61. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/demos/demo-upd-mult-model.lstm.12ax.config +0 -0
  62. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/demos/demo.sh +0 -0
  63. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/demos/mdlstm/IAM/IAM_lines/a01-000u-00.png +0 -0
  64. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/demos/mdlstm/IAM/IAM_lines/a01-007-04.png +0 -0
  65. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/demos/mdlstm/IAM/IAM_lines/a01-007-06.png +0 -0
  66. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/demos/mdlstm/IAM/README.txt +0 -0
  67. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/demos/mdlstm/IAM/chars.txt +0 -0
  68. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/demos/mdlstm/IAM/config_demo +0 -0
  69. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/demos/mdlstm/IAM/config_fwd +0 -0
  70. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/demos/mdlstm/IAM/config_real +0 -0
  71. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/demos/mdlstm/IAM/create_IAM_dataset.py +0 -0
  72. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/demos/mdlstm/IAM/decode.py +0 -0
  73. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/demos/mdlstm/IAM/features/raw/demo.h5 +0 -0
  74. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/demos/mdlstm/IAM/go.sh +0 -0
  75. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/demos/mdlstm/IAM/lines.txt +0 -0
  76. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/demos/mdlstm/IAM/split/eval.txt +0 -0
  77. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/demos/mdlstm/IAM/split/train.txt +0 -0
  78. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/demos/mdlstm/IAM/split/valid.txt +0 -0
  79. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/demos/mdlstm/README.md +0 -0
  80. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/demos/mdlstm/artificial/create_test_h5.py +0 -0
  81. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/demos/mdlstm/artificial/forwardconfig +0 -0
  82. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/demos/mdlstm/artificial/go.sh +0 -0
  83. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/demos/mdlstm/artificial/trainconfig +0 -0
  84. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/demos/mdlstm/artificial_rgb/create_test_h5.py +0 -0
  85. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/demos/mdlstm/artificial_rgb/forwardconfig +0 -0
  86. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/demos/mdlstm/artificial_rgb/go.sh +0 -0
  87. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/demos/mdlstm/artificial_rgb/trainconfig +0 -0
  88. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/pyproject.toml +0 -0
  89. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/requirements.txt +0 -0
  90. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/__init__.py +0 -0
  91. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/__main__.py +0 -0
  92. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/__old_mod_loader__.py +0 -0
  93. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/__setup__.py +0 -0
  94. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/config.py +0 -0
  95. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/datasets/__init__.py +0 -0
  96. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/datasets/audio.py +0 -0
  97. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/datasets/basic.py +0 -0
  98. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/datasets/bundle_file.py +0 -0
  99. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/datasets/cached.py +0 -0
  100. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/datasets/cached2.py +0 -0
  101. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/datasets/distrib_files.py +0 -0
  102. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/datasets/generating.py +0 -0
  103. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/datasets/hdf.py +0 -0
  104. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/datasets/lm.py +0 -0
  105. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/datasets/map.py +0 -0
  106. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/datasets/meta.py +0 -0
  107. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/datasets/multi_proc.py +0 -0
  108. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/datasets/normalization_data.py +0 -0
  109. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/datasets/numpy_dump.py +0 -0
  110. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/datasets/raw_wav.py +0 -0
  111. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/datasets/sprint.py +0 -0
  112. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/datasets/stereo.py +0 -0
  113. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/datasets/util/__init__.py +0 -0
  114. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/datasets/util/feature_extraction.py +0 -0
  115. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/datasets/util/strings.py +0 -0
  116. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/datasets/util/vocabulary.py +0 -0
  117. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/engine/__init__.py +0 -0
  118. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/engine/base.py +0 -0
  119. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/engine/batch.py +0 -0
  120. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/extern/WarpRna/__init__.py +0 -0
  121. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/extern/WarpRna/__main__.py +0 -0
  122. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/extern/WarpRna/warp-rna/.git +0 -0
  123. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/extern/WarpRna/warp-rna/.gitignore +0 -0
  124. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/extern/WarpRna/warp-rna/LICENSE +0 -0
  125. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/extern/WarpRna/warp-rna/README.md +0 -0
  126. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/extern/WarpRna/warp-rna/aligner.gif +0 -0
  127. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/extern/WarpRna/warp-rna/check.png +0 -0
  128. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/extern/WarpRna/warp-rna/core.cu +0 -0
  129. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/extern/WarpRna/warp-rna/core.h +0 -0
  130. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/extern/WarpRna/warp-rna/core_cpu.cpp +0 -0
  131. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/extern/WarpRna/warp-rna/pytorch_binding/LICENSE +0 -0
  132. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/extern/WarpRna/warp-rna/pytorch_binding/MANIFEST.in +0 -0
  133. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/extern/WarpRna/warp-rna/pytorch_binding/README.md +0 -0
  134. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/extern/WarpRna/warp-rna/pytorch_binding/binding.cpp +0 -0
  135. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/extern/WarpRna/warp-rna/pytorch_binding/core.cu +0 -0
  136. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/extern/WarpRna/warp-rna/pytorch_binding/core.h +0 -0
  137. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/extern/WarpRna/warp-rna/pytorch_binding/requirements.txt +0 -0
  138. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/extern/WarpRna/warp-rna/pytorch_binding/setup.py +0 -0
  139. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/extern/WarpRna/warp-rna/pytorch_binding/warp_rna/__init__.py +0 -0
  140. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/extern/WarpRna/warp-rna/pytorch_binding/warp_rna/test.py +0 -0
  141. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/extern/WarpRna/warp-rna/ref_rna.py +0 -0
  142. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/extern/WarpRna/warp-rna/tensorflow_binding/setup.py +0 -0
  143. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/extern/WarpRna/warp-rna/tensorflow_binding/src/warp_rna_op.cc +0 -0
  144. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/extern/WarpRna/warp-rna/tensorflow_binding/src/warp_rna_op_kernel_tmpl.h +0 -0
  145. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/extern/WarpRna/warp-rna/tensorflow_binding/warp_rna/__init__.py +0 -0
  146. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/extern/WarpRna/warp-rna/test.cpp +0 -0
  147. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/extern/__init__.py +0 -0
  148. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/extern/graph_editor/README.md +0 -0
  149. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/extern/graph_editor/__init__.py +0 -0
  150. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/extern/graph_editor/edit.py +0 -0
  151. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/extern/graph_editor/reroute.py +0 -0
  152. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/extern/graph_editor/select.py +0 -0
  153. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/extern/graph_editor/subgraph.py +0 -0
  154. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/extern/graph_editor/transform.py +0 -0
  155. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/extern/graph_editor/util.py +0 -0
  156. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/forward_iface.py +0 -0
  157. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/frontend/__init__.py +0 -0
  158. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/frontend/_backend.py +0 -0
  159. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/frontend/_native/__init__.py +0 -0
  160. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/frontend/_native/backend.cpp +0 -0
  161. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/frontend/_native/backend.hpp +0 -0
  162. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/frontend/_native/module.cpp +0 -0
  163. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/frontend/_native/module.hpp +0 -0
  164. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/frontend/_native/py_utils.hpp +0 -0
  165. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/frontend/_native/tensor_ops.cpp +0 -0
  166. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/frontend/_native/tensor_ops.hpp +0 -0
  167. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/frontend/_random_journal.py +0 -0
  168. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/frontend/_utils.py +0 -0
  169. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/frontend/array_.py +0 -0
  170. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/frontend/attention.py +0 -0
  171. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/frontend/audio/__init__.py +0 -0
  172. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/frontend/audio/mel.py +0 -0
  173. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/frontend/audio/specaugment.py +0 -0
  174. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/frontend/backend.py +0 -0
  175. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/frontend/build_from_dict.py +0 -0
  176. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/frontend/cond.py +0 -0
  177. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/frontend/const.py +0 -0
  178. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/frontend/container.py +0 -0
  179. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/frontend/control_flow_ctx.py +0 -0
  180. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/frontend/conv.py +0 -0
  181. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/frontend/decoder/__init__.py +0 -0
  182. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/frontend/decoder/transformer.py +0 -0
  183. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/frontend/device.py +0 -0
  184. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/frontend/dropout.py +0 -0
  185. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/frontend/dtype.py +0 -0
  186. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/frontend/encoder/__init__.py +0 -0
  187. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/frontend/encoder/base.py +0 -0
  188. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/frontend/encoder/conformer.py +0 -0
  189. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/frontend/gradient.py +0 -0
  190. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/frontend/graph.py +0 -0
  191. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/frontend/hooks.py +0 -0
  192. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/frontend/init.py +0 -0
  193. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/frontend/label_smoothing.py +0 -0
  194. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/frontend/linear.py +0 -0
  195. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/frontend/loop.py +0 -0
  196. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/frontend/loss.py +0 -0
  197. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/frontend/math_.py +0 -0
  198. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/frontend/matmul.py +0 -0
  199. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/frontend/module.py +0 -0
  200. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/frontend/normalization.py +0 -0
  201. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/frontend/parameter.py +0 -0
  202. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/frontend/parametrizations.py +0 -0
  203. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/frontend/parametrize.py +0 -0
  204. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/frontend/piecewise_linear.py +0 -0
  205. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/frontend/rand.py +0 -0
  206. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/frontend/rec.py +0 -0
  207. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/frontend/reduce.py +0 -0
  208. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/frontend/run_ctx.py +0 -0
  209. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/frontend/signal.py +0 -0
  210. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/frontend/state.py +0 -0
  211. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/frontend/stepwise_scheduler.py +0 -0
  212. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/frontend/tensor_array.py +0 -0
  213. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/frontend/types.py +0 -0
  214. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/import_/__init__.py +0 -0
  215. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/import_/common.py +0 -0
  216. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/import_/git.py +0 -0
  217. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/import_/import_.py +0 -0
  218. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/learning_rate_control.py +0 -0
  219. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/log.py +0 -0
  220. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/native_op.cpp +0 -0
  221. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/native_op.py +0 -0
  222. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/pretrain.py +0 -0
  223. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/sprint/__init__.py +0 -0
  224. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/sprint/cache.py +0 -0
  225. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/sprint/control.py +0 -0
  226. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/sprint/error_signals.py +0 -0
  227. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/sprint/extern_interface.py +0 -0
  228. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/sprint/interface.py +0 -0
  229. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/tensor/README.md +0 -0
  230. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/tensor/__init__.py +0 -0
  231. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/tensor/_dim_extra.py +0 -0
  232. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/tensor/_tensor_extra.py +0 -0
  233. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/tensor/_tensor_mixin_base.py +0 -0
  234. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/tensor/_tensor_op_overloads.py +0 -0
  235. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/tensor/control_flow_ctx.py +0 -0
  236. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/tensor/dim.py +0 -0
  237. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/tensor/marked_dim.py +0 -0
  238. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/tensor/tensor.py +0 -0
  239. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/tensor/tensor_dict.py +0 -0
  240. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/tensor/utils.py +0 -0
  241. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/tf/__init__.py +0 -0
  242. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/tf/compat.py +0 -0
  243. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/tf/data_pipeline.py +0 -0
  244. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/tf/distributed.py +0 -0
  245. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/tf/engine.py +0 -0
  246. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/tf/frontend_layers/README.md +0 -0
  247. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/tf/frontend_layers/__init__.py +0 -0
  248. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/tf/frontend_layers/_backend.py +0 -0
  249. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/tf/frontend_layers/_utils.py +0 -0
  250. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/tf/frontend_layers/cond.py +0 -0
  251. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/tf/frontend_layers/config_entry_points.py +0 -0
  252. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/tf/frontend_layers/debug_eager_mode.py +0 -0
  253. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/tf/frontend_layers/dims.py +0 -0
  254. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/tf/frontend_layers/layer.py +0 -0
  255. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/tf/frontend_layers/loop.py +0 -0
  256. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/tf/frontend_layers/make_layer.py +0 -0
  257. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/tf/frontend_layers/masked_computation.py +0 -0
  258. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/tf/frontend_layers/parameter_assign.py +0 -0
  259. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/tf/frontend_layers/prev_tensor_ref.py +0 -0
  260. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/tf/frontend_low_level/__init__.py +0 -0
  261. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/tf/frontend_low_level/_backend.py +0 -0
  262. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/tf/horovod.py +0 -0
  263. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/tf/hyper_param_tuning.py +0 -0
  264. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/tf/layers/__init__.py +0 -0
  265. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/tf/layers/base.py +0 -0
  266. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/tf/layers/basic.py +0 -0
  267. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/tf/layers/rec.py +0 -0
  268. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/tf/layers/segmental_model.py +0 -0
  269. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/tf/layers/signal_processing.py +0 -0
  270. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/tf/layers/variable.py +0 -0
  271. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/tf/native_op.py +0 -0
  272. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/tf/network.py +0 -0
  273. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/tf/sprint.py +0 -0
  274. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/tf/updater.py +0 -0
  275. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/tf/util/__init__.py +0 -0
  276. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/tf/util/basic.py +0 -0
  277. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/tf/util/data.py +0 -0
  278. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/tf/util/gradient_checkpoint.py +0 -0
  279. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/tf/util/ken_lm.py +0 -0
  280. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/tf/util/open_fst.py +0 -0
  281. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/torch/README.md +0 -0
  282. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/torch/__init__.py +0 -0
  283. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/torch/data/__init__.py +0 -0
  284. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/torch/data/extern_data.py +0 -0
  285. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/torch/data/pipeline.py +0 -0
  286. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/torch/data/queued_data_iter.py +0 -0
  287. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/torch/data/returnn_dataset_wrapper.py +0 -0
  288. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/torch/data/tensor_utils.py +0 -0
  289. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/torch/distributed.py +0 -0
  290. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/torch/engine.py +0 -0
  291. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/torch/frontend/__init__.py +0 -0
  292. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/torch/frontend/_rand.py +0 -0
  293. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/torch/frontend/bridge.py +0 -0
  294. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/torch/frontend/raw_ops.py +0 -0
  295. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/torch/updater.py +0 -0
  296. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/torch/util/README.md +0 -0
  297. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/torch/util/__init__.py +0 -0
  298. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/torch/util/diagnose_gpu.py +0 -0
  299. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/torch/util/gradient_checkpoint.py +0 -0
  300. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/torch/util/scaled_gradient.py +0 -0
  301. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/util/__init__.py +0 -0
  302. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/util/basic.py +0 -0
  303. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/util/better_exchook.py +0 -0
  304. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/util/bpe.py +0 -0
  305. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/util/debug.py +0 -0
  306. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/util/debug_helpers.py +0 -0
  307. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/util/file_cache.py +0 -0
  308. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/util/fsa.py +0 -0
  309. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/util/literal_py_to_pickle.py +0 -0
  310. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/util/math.py +0 -0
  311. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/util/multi_proc_non_daemonic_spawn.py +0 -0
  312. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/util/native_code_compiler.py +0 -0
  313. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/util/pprint.py +0 -0
  314. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/util/py-to-pickle.cpp +0 -0
  315. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/util/py_compat.py +0 -0
  316. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/util/py_ext_mod_compiler.py +0 -0
  317. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/util/result_with_reason.py +0 -0
  318. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/util/sig_proc.py +0 -0
  319. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/util/task_system.py +0 -0
  320. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/util/train_proc_manager.py +0 -0
  321. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn/util/watch_memory.py +0 -0
  322. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn.egg-info/dependency_links.txt +0 -0
  323. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/returnn.egg-info/top_level.txt +0 -0
  324. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/rnn.py +0 -0
  325. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/setup.cfg +0 -0
  326. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/setup.py +0 -0
  327. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tests/DummySprintExec.py +0 -0
  328. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tests/PyCharm-inspection-profile.xml +0 -0
  329. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tests/PyCharm.idea/.gitignore +0 -0
  330. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tests/PyCharm.idea/.name +0 -0
  331. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tests/PyCharm.idea/codeStyleSettings.xml +0 -0
  332. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tests/PyCharm.idea/codeStyles/Project.xml +0 -0
  333. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tests/PyCharm.idea/codeStyles/codeStyleConfig.xml +0 -0
  334. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tests/PyCharm.idea/inspectionProfiles/Project_Default.xml +0 -0
  335. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tests/PyCharm.idea/inspectionProfiles/profiles_settings.xml +0 -0
  336. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tests/PyCharm.idea/misc.xml +0 -0
  337. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tests/PyCharm.idea/modules.xml +0 -0
  338. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tests/PyCharm.idea/returnn.iml +0 -0
  339. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tests/PyCharm.idea/scopes/scope_settings.xml +0 -0
  340. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tests/_set_num_threads1.py +0 -0
  341. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tests/_setup_returnn_env.py +0 -0
  342. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tests/_setup_test_env.py +0 -0
  343. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tests/bpe-unicode-demo.codes +0 -0
  344. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tests/bpe-unicode-demo.vocab +0 -0
  345. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tests/lexicon_opt.fst +0 -0
  346. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tests/lexicon_opt.isyms +0 -0
  347. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tests/lexicon_opt.jpg +0 -0
  348. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tests/lexicon_opt.osyms +0 -0
  349. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tests/lint_common.py +0 -0
  350. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tests/pycharm-inspect.py +0 -0
  351. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tests/pylint.py +0 -0
  352. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tests/returnn-as-framework.py +0 -0
  353. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tests/rf_utils.py +0 -0
  354. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tests/spelling.dic +0 -0
  355. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tests/test_Config.py +0 -0
  356. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tests/test_Dataset.py +0 -0
  357. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tests/test_Fsa.py +0 -0
  358. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tests/test_GeneratingDataset.py +0 -0
  359. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tests/test_HDFDataset.py +0 -0
  360. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tests/test_LearningRateControl.py +0 -0
  361. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tests/test_Log.py +0 -0
  362. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tests/test_MultiProcDataset.py +0 -0
  363. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tests/test_Pretrain.py +0 -0
  364. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tests/test_ResNet.py +0 -0
  365. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tests/test_SprintDataset.py +0 -0
  366. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tests/test_SprintInterface.py +0 -0
  367. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tests/test_TFEngine.py +0 -0
  368. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tests/test_TFNativeOp.py +0 -0
  369. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tests/test_TFNetworkLayer.py +0 -0
  370. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tests/test_TFNetworkRecLayer.py +0 -0
  371. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tests/test_TFNetworkSigProcLayer.py +0 -0
  372. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tests/test_TFUpdater.py +0 -0
  373. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tests/test_TFUtil.py +0 -0
  374. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tests/test_TF_determinism.py +0 -0
  375. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tests/test_TaskSystem.py +0 -0
  376. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tests/test_TaskSystem_SharedMem.py +0 -0
  377. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tests/test_TranslationDataset.py +0 -0
  378. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tests/test_Util.py +0 -0
  379. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tests/test_demos.py +0 -0
  380. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tests/test_fork_exec.py +0 -0
  381. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tests/test_hdf_dump.py +0 -0
  382. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tests/test_rf_array.py +0 -0
  383. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tests/test_rf_attention.py +0 -0
  384. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tests/test_rf_cond.py +0 -0
  385. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tests/test_rf_const.py +0 -0
  386. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tests/test_rf_container.py +0 -0
  387. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tests/test_rf_conv.py +0 -0
  388. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tests/test_rf_encoder_conformer.py +0 -0
  389. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tests/test_rf_gradient.py +0 -0
  390. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tests/test_rf_label_smoothing.py +0 -0
  391. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tests/test_rf_loop.py +0 -0
  392. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tests/test_rf_math.py +0 -0
  393. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tests/test_rf_normalization.py +0 -0
  394. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tests/test_rf_piecewise_linear.py +0 -0
  395. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tests/test_rf_rec.py +0 -0
  396. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tests/test_rf_reduce.py +0 -0
  397. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tests/test_rf_signal.py +0 -0
  398. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tests/test_tensor.py +0 -0
  399. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tests/test_tools.py +0 -0
  400. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tests/test_torch_dataset.py +0 -0
  401. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tests/test_torch_engine.py +0 -0
  402. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tests/test_torch_internal_frontend.py +0 -0
  403. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tests/test_torch_util.py +0 -0
  404. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tools/_setup_returnn_env.py +0 -0
  405. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tools/analyze-dataset-batches.py +0 -0
  406. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tools/bliss-collect-seq-lens.py +0 -0
  407. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tools/bliss-dump-text.py +0 -0
  408. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tools/bliss-get-segment-names.py +0 -0
  409. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tools/bliss-to-ogg-zip.py +0 -0
  410. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tools/bpe-create-lexicon.py +0 -0
  411. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tools/calculate-word-error-rate.py +0 -0
  412. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tools/cleanup-old-models.py +0 -0
  413. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tools/collect-orth-symbols.py +0 -0
  414. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tools/collect-words.py +0 -0
  415. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tools/compile_native_op.py +0 -0
  416. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tools/compile_tf_graph.py +0 -0
  417. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tools/debug-dump-search-scores.py +0 -0
  418. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tools/debug-plot-search-scores.py +0 -0
  419. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tools/dump-dataset-raw-strings.py +0 -0
  420. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tools/dump-dataset.py +0 -0
  421. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tools/dump-forward-stats.py +0 -0
  422. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tools/dump-forward.py +0 -0
  423. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tools/dump-network-json.py +0 -0
  424. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tools/dump-pickle.py +0 -0
  425. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tools/extract_state_tying_from_dataset.py +0 -0
  426. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tools/get-attention-weights.py +0 -0
  427. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tools/get-best-model-epoch.py +0 -0
  428. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tools/hdf_dump.py +0 -0
  429. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tools/hdf_dump_translation_dataset.py +0 -0
  430. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tools/import-blocks-mt-model.py +0 -0
  431. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tools/import-t2t-mt-model.py +0 -0
  432. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tools/lattice_rescorer/.gitignore +0 -0
  433. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tools/lattice_rescorer/Makefile +0 -0
  434. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tools/lattice_rescorer/README.md +0 -0
  435. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tools/lattice_rescorer/example/README.md +0 -0
  436. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tools/lattice_rescorer/example/libs_list +0 -0
  437. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tools/lattice_rescorer/example/network.040/i600_m600_m600.sgd_b16_lr0_cl2.newbobabs.config +0 -0
  438. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tools/lattice_rescorer/example/network.040/i600_m600_m600.sgd_b16_lr0_cl2.newbobabs.keep_over_epoch.lstm2.config +0 -0
  439. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tools/lattice_rescorer/example/rescore_lattice.sh +0 -0
  440. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tools/lattice_rescorer/example/state_vars_list +0 -0
  441. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tools/lattice_rescorer/example/tensor_names_list +0 -0
  442. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tools/lattice_rescorer/file.h +0 -0
  443. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tools/lattice_rescorer/htklatticerescorer.cc +0 -0
  444. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tools/lattice_rescorer/htklatticerescorer.h +0 -0
  445. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tools/lattice_rescorer/main.cc +0 -0
  446. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tools/lattice_rescorer/rescorer.h +0 -0
  447. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tools/lattice_rescorer/vocabulary.cc +0 -0
  448. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tools/lattice_rescorer/vocabulary.h +0 -0
  449. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tools/tf_avg_checkpoints.py +0 -0
  450. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tools/tf_inspect_checkpoint.py +0 -0
  451. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tools/tf_inspect_summary_log.py +0 -0
  452. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tools/torch_avg_checkpoints.py +0 -0
  453. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tools/torch_export_to_onnx.py +0 -0
  454. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tools/torch_inspect_checkpoint.py +0 -0
  455. {returnn-1.20240719.111324 → returnn-1.20240719.172149}/tools/torch_inspect_checkpoint_and_opt.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: returnn
3
- Version: 1.20240719.111324
3
+ Version: 1.20240719.172149
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.20240719.172149'
2
+ long_version = '1.20240719.172149+git.1ef2033'
@@ -10,6 +10,7 @@ import numpy
10
10
  from returnn.tensor import Tensor, Dim
11
11
  import returnn.frontend as rf
12
12
  from ._backend import Backend
13
+ from returnn.frontend import RawTensorTypes
13
14
 
14
15
 
15
16
  # We do not expect that we will ever implement all the methods of the Backend interface.
@@ -75,6 +76,27 @@ class NumpyBackend(Backend[numpy.ndarray]):
75
76
  """
76
77
  return raw_tensor.shape
77
78
 
79
+ @staticmethod
80
+ def convert_to_tensor(
81
+ value: Union[Tensor, numpy.ndarray, RawTensorTypes],
82
+ *,
83
+ dims: Sequence[Dim],
84
+ dtype: str,
85
+ sparse_dim: Optional[Dim] = None,
86
+ device: Optional[str] = None,
87
+ name: Optional[str] = None,
88
+ ) -> Tensor[numpy.ndarray]:
89
+ """convert to tensor"""
90
+ if isinstance(value, Tensor):
91
+ return value
92
+ if isinstance(value, numpy.ndarray):
93
+ name = name or "raw_tensor"
94
+ else:
95
+ name = name or "const"
96
+ value = numpy.array(value, dtype=NumpyBackend.as_dtype_raw(dtype))
97
+ assert isinstance(value, numpy.ndarray)
98
+ return Tensor(name, dims=dims, dtype=dtype, sparse_dim=sparse_dim, raw_tensor=value)
99
+
78
100
  @staticmethod
79
101
  def expand_dims_raw(raw_tensor: numpy.ndarray, axis: int) -> numpy.ndarray:
80
102
  """
@@ -114,6 +136,8 @@ class NumpyBackend(Backend[numpy.ndarray]):
114
136
  op = getattr(numpy, kind) # e.g. numpy.equal
115
137
  return op(a, b)
116
138
 
139
+ _CombineKindMap = {"mul": numpy.multiply}
140
+
117
141
  @staticmethod
118
142
  def combine_raw(a: numpy.ndarray, kind: str, b: numpy.ndarray) -> numpy.ndarray:
119
143
  """
@@ -124,7 +148,11 @@ class NumpyBackend(Backend[numpy.ndarray]):
124
148
  :return: a `kind` b
125
149
  """
126
150
  assert a.ndim == b.ndim or a.ndim == 0 or b.ndim == 0
127
- op = getattr(numpy, kind) # e.g. numpy.add
151
+ op = getattr(numpy, kind, None) # e.g. numpy.add
152
+ if not op:
153
+ op = NumpyBackend._CombineKindMap.get(kind)
154
+ if not op:
155
+ raise ValueError(f"RF NumpyBackend: combine kind {kind!r} not supported")
128
156
  return op(a, b)
129
157
 
130
158
  @staticmethod
@@ -141,25 +141,26 @@ def num_elements_of_shape(dims: Union[Dim, Sequence[Dim]], *, use_mask: bool = T
141
141
  n *= dim.dimension
142
142
  return n
143
143
 
144
- n = 1
145
- dims = list(dims)
146
- dims.sort(key=lambda dim__: -dim__.dyn_size_ext.batch_ndim if dim__.dyn_size_ext else 0)
147
- while dims:
148
- dim = dims.pop(0)
149
- if dim.is_static():
150
- n *= dim.dimension
151
- continue
152
- # E.g. dyn_size_ext is shape [B], and self has shape [B,T].
153
- # Due to the sorting of dims above, dims will be [T,B], and we will first process T.
154
- # We want to sum over dyn_size_ext, but then we need to remove the other dims it covers.
155
- dims_to_reduce = []
156
- for dim_ in dim.dyn_size_ext.dims:
157
- if dim_ in dims:
158
- assert not dim_.need_masking() # not implemented
159
- dims.remove(dim_)
160
- dims_to_reduce.append(dim_)
161
- n_ = rf.reduce_sum(dim.dyn_size_ext, axis=dims_to_reduce) if dims_to_reduce else dim.dyn_size_ext
162
- n *= n_
144
+ n: Union[int, Tensor] = 1
145
+ postponed_dims = []
146
+ for i, dim in enumerate(dims):
147
+ # E.g. if dim==B, and some other dim dyn_size_ext has B, then we need to postpone this.
148
+ related_dims = []
149
+ for j, dim_ in enumerate(dims):
150
+ if i == j:
151
+ continue
152
+ if dim_.dyn_size_ext and dim in dim_.dyn_size_ext.dims:
153
+ related_dims.append(dim_)
154
+ if not related_dims:
155
+ if dim.is_static():
156
+ n *= dim.dimension
157
+ else:
158
+ n *= dim.dyn_size_ext
159
+ else:
160
+ postponed_dims.append(dim)
161
+ if postponed_dims:
162
+ n: Tensor
163
+ n = rf.reduce_sum(n, axis=postponed_dims)
163
164
  return n
164
165
 
165
166
 
@@ -1578,36 +1578,32 @@ class TorchBackend(Backend[torch.Tensor]):
1578
1578
  the new dim is also returned.
1579
1579
  if mask==True for all elements, the returned tensor would be simply the flattened input tensor.
1580
1580
  """
1581
+ from returnn.torch.util.array_ import masked_select
1582
+
1581
1583
  assert mask.dtype == "bool"
1582
1584
  assert set(mask.dims) == set(dims)
1583
1585
  remaining_dims = [d for d in tensor.dims if d not in mask.dims]
1584
1586
  tensor_templ_dims = tuple(dims) + tuple(remaining_dims)
1585
1587
  in_raw = tensor.copy_compatible_to_dims_raw(tensor_templ_dims)
1586
- mask_raw = mask.copy_compatible_to_dims_raw(tensor_templ_dims)
1587
- # We have a very strange problem with the gradient of masked_select,
1588
- # when used together with some specific other operations before that,
1589
- # like convolution.
1590
- # This clone() with contiguous_format seems to fix the problem.
1591
- # https://github.com/pytorch/pytorch/issues/99638
1592
- in_raw = in_raw.clone(memory_format=torch.contiguous_format)
1593
- if mask_raw.device.type == "meta":
1588
+ if mask.raw_tensor.device.type == "meta":
1594
1589
  # This is not supported, but also, we would anyway not know the out shape.
1595
1590
  # However, instead of erroring, just assume some dummy mask.
1596
1591
  # https://github.com/pytorch/pytorch/issues/109871
1597
1592
  out_raw = in_raw.flatten()
1598
1593
  else:
1599
- out_raw = torch.masked_select(in_raw, mask_raw)
1600
- remaining_shape = [d.get_dim_value() for d in remaining_dims]
1601
- remaining_num_elements = numpy.prod(remaining_shape) if remaining_shape else 1
1602
- assert out_raw.numel() % remaining_num_elements == 0
1603
- flattened_num_elements = out_raw.numel() // remaining_num_elements
1604
- out_raw = torch.reshape(out_raw, [flattened_num_elements] + remaining_shape)
1594
+ mask_raw = mask.copy_compatible_to_dims_raw(dims)
1595
+ known_mask_len = (
1596
+ out_dim.get_dim_value()
1597
+ if out_dim and out_dim.dyn_size_ext is not None and out_dim.dyn_size_ext.raw_tensor is not None
1598
+ else None
1599
+ )
1600
+ out_raw = masked_select(in_raw, mask_raw, mask_len=known_mask_len)
1605
1601
  if not out_dim:
1606
1602
  out_dim = Dim(None, name="masked_select")
1607
1603
  if not out_dim.dyn_size_ext:
1608
1604
  out_dim.dyn_size_ext = Tensor("masked_select_size", dims=(), dtype="int64")
1609
1605
  if out_dim.dyn_size_ext.raw_tensor is None:
1610
- out_dim.dyn_size_ext.raw_tensor = torch.tensor(flattened_num_elements, dtype=torch.int64)
1606
+ out_dim.dyn_size_ext.raw_tensor = torch.tensor(out_raw.shape[0], dtype=torch.int64)
1611
1607
  out = Tensor(
1612
1608
  "masked_select",
1613
1609
  dims=(out_dim,) + tuple(remaining_dims),
@@ -0,0 +1,54 @@
1
+ """
2
+ Array (Tensor) functions
3
+ """
4
+
5
+ from __future__ import annotations
6
+ from typing import Optional, Union
7
+ import torch
8
+
9
+
10
+ # noinspection PyShadowingBuiltins
11
+ def masked_select(input: torch.Tensor, mask: torch.Tensor, *, mask_len: Optional[Union[int, torch.Tensor]] = None):
12
+ """
13
+ Like :func:`torch.masked_select` but much more efficient,
14
+ both in terms of memory and computation time,
15
+ both on CPU and GPU.
16
+
17
+ See here for the issues with :func:`torch.masked_select`:
18
+ https://github.com/rwth-i6/returnn/issues/1584
19
+ https://github.com/pytorch/pytorch/issues/30246
20
+ https://github.com/pytorch/pytorch/issues/56896
21
+
22
+ :param input: [mask_dims..., remaining_dims...]
23
+ :param mask: [mask_dims...], binary mask to index with. if it has less dims than ``input``,
24
+ the remaining dims are broadcasted.
25
+ :param mask_len: if given, the length of the mask. this avoids a CUDA synchronization.
26
+ :return: selected elements, shape [mask_len, remaining_dims...]
27
+ """
28
+ assert input.ndim >= mask.ndim
29
+ assert all(input.shape[i] == mask.shape[i] for i in range(mask.ndim))
30
+ mask_flat = mask.flatten()
31
+ if mask_len is not None:
32
+ indices = nonzero(mask_flat, out_len=mask_len) # [out_len]
33
+ else:
34
+ indices = torch.nonzero(mask_flat).squeeze(1) # [out_len]
35
+ input_flat = input.flatten(end_dim=mask.ndim - 1)
36
+ return input_flat[indices]
37
+
38
+
39
+ def nonzero(mask: torch.Tensor, *, out_len: Union[int, torch.Tensor]) -> torch.Tensor:
40
+ """
41
+ This has the advantage over :func:`torch.nonzero`
42
+ that we do not need to perform a CUDA synchronization.
43
+ We can avoid that when we know the output length in advance.
44
+
45
+ :param mask: flattened (dim() == 1) mask, bool
46
+ :param out_len:
47
+ :return: indices of True elements, shape [out_len].
48
+ like ``mask.nonzero().flatten()``
49
+ """
50
+ assert mask.dim() == 1 and mask.dtype == torch.bool
51
+ # Sort currently does not support bool dtype on CUDA, thus cast to int.
52
+ idx = torch.argsort(mask.to(torch.int8), stable=True, descending=True) # [in_len]
53
+ idx = idx[:out_len] # [out_len]
54
+ return idx
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: returnn
3
- Version: 1.20240719.111324
3
+ Version: 1.20240719.172149
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
@@ -293,6 +293,7 @@ returnn/torch/frontend/bridge.py
293
293
  returnn/torch/frontend/raw_ops.py
294
294
  returnn/torch/util/README.md
295
295
  returnn/torch/util/__init__.py
296
+ returnn/torch/util/array_.py
296
297
  returnn/torch/util/diagnose_gpu.py
297
298
  returnn/torch/util/gradient_checkpoint.py
298
299
  returnn/torch/util/scaled_gradient.py
@@ -14,6 +14,13 @@ from rf_utils import run_model, run_model_torch_train
14
14
  # Keep test_linear_direct and test_linear first here to have some very canonical examples.
15
15
 
16
16
 
17
+ def _setup():
18
+ rf.select_backend_torch() # enables some of the native optimizations
19
+
20
+
21
+ _setup()
22
+
23
+
17
24
  def test_linear_direct():
18
25
  time_dim = Dim(Tensor("time", [batch_dim], dtype="int32"))
19
26
  in_dim, out_dim = Dim(7, name="in"), Dim(13, name="out")
@@ -289,6 +296,36 @@ def test_dim_mask():
289
296
  run_model(extern_data, lambda *, epoch, step: _Net(), _forward_step)
290
297
 
291
298
 
299
+ def test_num_elements_of_shape():
300
+ import numpy as np
301
+
302
+ batch_dim_ = Dim(5, name="batch")
303
+ enc_dim = Dim(Tensor("enc", dims=[batch_dim_], dtype="int64"))
304
+ dec_dim = Dim(Tensor("dec", dims=[batch_dim_], dtype="int64"))
305
+ enc_dim.dyn_size_ext.raw_tensor = np.array([17, 16, 15, 13, 12])
306
+ dec_dim.dyn_size_ext.raw_tensor = np.array([11, 10, 8, 7, 5])
307
+ calc_n_enc = sum(enc_dim.dyn_size_ext.raw_tensor)
308
+ calc_n_dec = sum(dec_dim.dyn_size_ext.raw_tensor)
309
+ calc_n_prod = sum(enc_dim.dyn_size_ext.raw_tensor * dec_dim.dyn_size_ext.raw_tensor)
310
+ assert rf.num_elements_of_shape([batch_dim_]) == batch_dim_.dimension
311
+ n_b_enc = rf.num_elements_of_shape([batch_dim_, enc_dim])
312
+ assert calc_n_enc == n_b_enc.raw_tensor.item()
313
+ n_b_dec = rf.num_elements_of_shape([dec_dim, batch_dim_])
314
+ assert calc_n_dec == n_b_dec.raw_tensor.item()
315
+ n_prod = rf.num_elements_of_shape([batch_dim_, enc_dim, dec_dim])
316
+ assert calc_n_prod == n_prod.raw_tensor.item()
317
+
318
+
319
+ def test_convert_to_tensor_numpy_backend():
320
+ import numpy as np
321
+ from returnn.frontend._numpy_backend import NumpyBackend
322
+
323
+ x = rf.convert_to_tensor(1, dims=(), dtype="int32", _backend=NumpyBackend)
324
+ assert isinstance(x.raw_tensor, np.ndarray)
325
+ assert x.raw_tensor.dtype == np.int32
326
+ assert x.raw_tensor.item() == 1
327
+
328
+
292
329
  def test_param_assign():
293
330
  time_dim = Dim(Tensor("time", [batch_dim], dtype="int32"))
294
331
  in_dim = Dim(7, name="in")
@@ -4,19 +4,39 @@ tests for returnn.torch.frontend
4
4
 
5
5
  import _setup_test_env # noqa
6
6
 
7
+ from typing import Any, Dict, List
7
8
  import numpy.testing
8
9
  import torch
9
10
  import pytest
10
11
  import math
11
12
  import sys
12
13
  import unittest
14
+ from pprint import pprint
15
+
16
+ from torch_utils import (
17
+ report_profile,
18
+ get_remaining_allocs_from_profile,
19
+ get_allocs_from_profile,
20
+ get_peak_alloc_from_profile,
21
+ )
13
22
 
14
23
  from returnn.util import better_exchook
15
24
  from returnn.tensor import Tensor, Dim
16
25
  import returnn.frontend as rf
17
26
 
18
27
 
19
- rf.select_backend_torch()
28
+ def _setup():
29
+ rf.select_backend_torch()
30
+ dev = None
31
+ if torch.cuda.is_available():
32
+ dev = "cuda"
33
+ elif hasattr(torch.backends, "mps") and torch.backends.mps.is_available() and torch.backends.mps.is_built():
34
+ dev = "mps"
35
+ if dev:
36
+ torch.set_default_device(dev)
37
+
38
+
39
+ _setup()
20
40
 
21
41
 
22
42
  def test_dot_scalar_multiplication():
@@ -343,7 +363,7 @@ def test_cross_entropy_dense_target():
343
363
  assert cross_entropy_list[1] == pytest.approx(-0.3 * math.log(5 / 7) - 0.7 * math.log(1 / 7))
344
364
 
345
365
 
346
- def test_pack_padded():
366
+ def test_pack_padded_wrong_grad():
347
367
  # https://github.com/pytorch/pytorch/issues/99638
348
368
 
349
369
  # noinspection PyShadowingNames
@@ -431,6 +451,142 @@ def test_pack_padded():
431
451
  prev_bias_grad = bias_grad
432
452
 
433
453
 
454
+ @unittest.skipIf(torch.__version__ < (2,), "report_profile needs PyTorch >= 2.0")
455
+ def test_pack_padded_memory():
456
+ import numpy as np
457
+ import torch
458
+ from returnn.tensor import Dim
459
+
460
+ rnd = np.random.RandomState(42)
461
+ batch_dim_ = Dim(5, name="batch")
462
+ batch_dims = [batch_dim_]
463
+ vocab_dim = Dim(7, name="vocab")
464
+ enc_dim = Dim(rf.convert_to_tensor(torch.tensor([17, 16, 15, 13, 12], device="cpu"), dims=[batch_dim_]), name="enc")
465
+ dec_dim = Dim(rf.convert_to_tensor(torch.tensor([11, 10, 8, 7, 5], device="cpu"), dims=[batch_dim_]), name="dec")
466
+ logits = rf.convert_to_tensor(
467
+ torch.tensor(
468
+ rnd.randn(
469
+ batch_dim_.dimension,
470
+ enc_dim.dyn_size_ext.raw_tensor.max(),
471
+ dec_dim.dyn_size_ext.raw_tensor.max(),
472
+ vocab_dim.dimension,
473
+ ).astype(np.float32)
474
+ ),
475
+ dims=[batch_dim_, enc_dim, dec_dim, vocab_dim],
476
+ )
477
+ print("dev:", logits.device)
478
+ sizeof_float = 4
479
+
480
+ def _get_rf_pack_packed() -> torch.Tensor:
481
+ logits_packed, pack_dim = rf.pack_padded(
482
+ logits, dims=batch_dims + [enc_dim, dec_dim], enforce_sorted=False
483
+ ) # [B * T * (S+1), D]
484
+ return logits_packed.raw_tensor
485
+
486
+ def _get_naive_pack_padded() -> torch.Tensor:
487
+ logits_raw = logits.copy_transpose(batch_dims + [enc_dim, dec_dim, vocab_dim]).raw_tensor
488
+ enc_lens = enc_dim.dyn_size_ext.raw_tensor
489
+ non_blank_lens = dec_dim.dyn_size_ext.raw_tensor
490
+ vocab_len = vocab_dim.dimension
491
+
492
+ batch_tensors = []
493
+
494
+ for b in range(logits_raw.shape[0]):
495
+ enc_len = enc_lens[b]
496
+ non_blank_len = non_blank_lens[b]
497
+ combined_len = enc_len * non_blank_len
498
+ logits_single = logits_raw[b, :enc_len, :non_blank_len]
499
+ logits_single = torch.reshape(logits_single, (combined_len, vocab_len))
500
+ batch_tensors.append(logits_single)
501
+
502
+ return torch.cat(batch_tensors, dim=0)
503
+
504
+ from torch.profiler import profile, ProfilerActivity
505
+
506
+ with profile(
507
+ activities=[ProfilerActivity.CPU, ProfilerActivity.CUDA],
508
+ profile_memory=True,
509
+ with_stack=True,
510
+ record_shapes=True,
511
+ ) as prof_rf:
512
+ rf_pack_padded_res = _get_rf_pack_packed()
513
+
514
+ with profile(
515
+ activities=[ProfilerActivity.CPU, ProfilerActivity.CUDA],
516
+ profile_memory=True,
517
+ with_stack=True,
518
+ record_shapes=True,
519
+ ) as prof_naive:
520
+ naive_pack_padded_res = _get_naive_pack_padded()
521
+
522
+ print("result shape:", rf_pack_padded_res.shape, "numel:", rf_pack_padded_res.numel())
523
+ assert rf_pack_padded_res.shape == naive_pack_padded_res.shape
524
+ assert rf_pack_padded_res.device == naive_pack_padded_res.device
525
+ assert torch.eq(rf_pack_padded_res, naive_pack_padded_res).all()
526
+
527
+ print("*** RF ***")
528
+ report_profile(prof_rf, allow_remaining_allocs=True)
529
+ print("*** Naive ***")
530
+ report_profile(prof_naive, allow_remaining_allocs=True)
531
+ print("***")
532
+
533
+ def _filter_rf_alloc(alloc: Dict[str, Any]) -> bool:
534
+ # Filter some RF internal caches which will get created.
535
+ return "/sequence_mask/get_mask/" not in alloc["name"]
536
+
537
+ def _filter_rf_allocs_dict(allocs: Dict[int, Dict[str, Any]]):
538
+ return {k: v for k, v in allocs.items() if _filter_rf_alloc(v)}
539
+
540
+ def _filter_rf_allocs_list(allocs: List[Dict[str, Any]]) -> List[Dict[str, Any]]:
541
+ return [v for v in allocs if _filter_rf_alloc(v)]
542
+
543
+ print("inputs shape:", logits.raw_tensor.shape, "numel:", logits.raw_tensor.numel())
544
+ print(" byte size:", logits.raw_tensor.numel() * sizeof_float)
545
+ print("result shape:", rf_pack_padded_res.shape, "numel:", rf_pack_padded_res.numel())
546
+ print(" byte size:", rf_pack_padded_res.numel() * sizeof_float)
547
+ enc_lens = enc_dim.dyn_size_ext.raw_tensor
548
+ non_blank_lens = dec_dim.dyn_size_ext.raw_tensor
549
+ print("Mask size:", batch_dim_.dimension * max(enc_lens) * max(non_blank_lens))
550
+ total_num_el = 0
551
+ for b in range(batch_dim_.dimension):
552
+ enc_len = enc_lens[b]
553
+ non_blank_len = non_blank_lens[b]
554
+ total_num_el += enc_len * non_blank_len
555
+ print("Expected total num elements:", total_num_el, "with vocab:", total_num_el * vocab_dim.dimension)
556
+ print("Size:", total_num_el * vocab_dim.dimension * sizeof_float)
557
+
558
+ print("Remaining allocs:")
559
+ allocs_rf = get_remaining_allocs_from_profile(prof_rf)
560
+ allocs_rf = _filter_rf_allocs_dict(allocs_rf)
561
+ print("RF:", allocs_rf)
562
+ allocs_naive = get_remaining_allocs_from_profile(prof_naive)
563
+ print("Naive:", allocs_naive)
564
+ assert len(allocs_rf) == len(allocs_naive) == 1
565
+ assert (
566
+ list(allocs_rf.values())[0]["size"]
567
+ == list(allocs_naive.values())[0]["size"]
568
+ # On CPU, it should match, but on GPU, it will allocate more.
569
+ # == rf_pack_padded_res.numel() * sizeof_float
570
+ )
571
+
572
+ print("All allocs RF:")
573
+ for alloc in _filter_rf_allocs_list(get_allocs_from_profile(prof_rf)):
574
+ alloc["name"] = alloc["name"][alloc["name"].find("/_get_rf_pack_packed/") + len("/_get_rf_pack_packed/") :]
575
+ print(" ", alloc)
576
+ print("All allocs naive:")
577
+ for alloc in get_allocs_from_profile(prof_naive):
578
+ alloc["name"] = alloc["name"][
579
+ alloc["name"].find("/_get_naive_pack_padded/") + len("/_get_naive_pack_padded/") :
580
+ ]
581
+ print(" ", alloc)
582
+
583
+ print("Peak alloc:")
584
+ print("RF:", get_peak_alloc_from_profile(prof_rf))
585
+ print("Naive:", get_peak_alloc_from_profile(prof_naive))
586
+
587
+ print("dev:", rf_pack_padded_res.device)
588
+
589
+
434
590
  def test_Data_copy_compatible_to_match_priority():
435
591
  feat_dim = Dim(2, name="feature")
436
592
  in_dim = feat_dim.copy(match_priority=1)
@@ -3,7 +3,7 @@ Utilities for PyTorch tests
3
3
  """
4
4
 
5
5
  from __future__ import annotations
6
- from typing import Optional, Any, Sequence, Tuple, Dict
6
+ from typing import Optional, Any, Sequence, Tuple, List, Dict
7
7
  import torch
8
8
 
9
9
 
@@ -69,7 +69,7 @@ def report_profile(
69
69
  ev_name = "alloc"
70
70
  assert ex.alloc_size > 0
71
71
  assert ev.parent
72
- name = _ctx(ev.parent)
72
+ name = _ev_ctx(ev.parent)
73
73
  _allocs[ex.allocation_id] = {"size": ex.alloc_size, "name": name}
74
74
  opts = {"id": ex.allocation_id, "name": name, "size": ex.alloc_size, "total_alloc": ex.total_allocated}
75
75
  elif ev.typed[0] == _EventType.TorchOp:
@@ -161,30 +161,6 @@ def report_profile(
161
161
  else:
162
162
  print(f"{prefix}({ev_name} {opts})")
163
163
 
164
- def _ctx(ev) -> str:
165
- stack = [None]
166
- parent = ev
167
- while parent and parent.typed[0] == _EventType.TorchOp: # go to top torch op
168
- stack[-1] = parent.typed[1].name
169
- parent = parent.parent
170
- if not stack[-1] and parent.typed[0] == _EventType.PyCCall:
171
- stack[-1] = parent.typed[1].caller.function_name
172
- parent = parent.parent
173
- if not stack[-1]:
174
- stack.pop(-1)
175
- while parent:
176
- if parent.typed[0] == _EventType.PyCall:
177
- ex0 = parent.typed[1].caller # torch._C._profiler._PyFrameState
178
- ex1 = parent.typed[1].callsite # torch._C._profiler._PyFrameState
179
- if (
180
- _pycall_filter_fn(ex1.file_name)
181
- or (_pycall_filter_fn(ex0.file_name) and ex1.function_name == "backward")
182
- ) and ex1.function_name not in {"__torch_dispatch__"}:
183
- stack.append(ex1.function_name)
184
- parent = parent.parent
185
- stack.reverse()
186
- return "/".join(stack) or "unknown"
187
-
188
164
  for ev_ in sorted(
189
165
  traverse_dfs(prof.profiler.kineto_results.experimental_event_tree()), key=lambda ev: ev.start_time_ns
190
166
  ):
@@ -199,6 +175,107 @@ def report_profile(
199
175
  assert not check_events, f"Remaining check events: {check_events}"
200
176
 
201
177
 
178
+ def get_remaining_allocs_from_profile(prof: torch.profiler.profiler) -> Dict[int, Dict[str, Any]]:
179
+ """
180
+ Get remaining allocs from profile.
181
+
182
+ :param prof: via torch.profiler.profile.
183
+ :return: allocs dict: id -> dict with "size", "name"
184
+ """
185
+ # noinspection PyProtectedMember
186
+ from torch.profiler._utils import traverse_dfs
187
+ from torch._C._profiler import _EventType # noqa
188
+
189
+ _allocs = {} # id -> dict with "size", "name"
190
+
191
+ for ev in sorted(
192
+ traverse_dfs(prof.profiler.kineto_results.experimental_event_tree()), key=lambda ev: ev.start_time_ns
193
+ ):
194
+ # ev: torch._C._profiler._ProfilerEvent
195
+ if ev.typed[0] == _EventType.Allocation:
196
+ ex = ev.typed[1] # torch._C._profiler._ExtraFields_Allocation
197
+ # ex.id/ex.allocation_id/ex.ptr redundant?
198
+ if ex.allocation_id in _allocs:
199
+ # expect deallocation
200
+ assert _allocs[ex.allocation_id]["size"] == -ex.alloc_size
201
+ del _allocs[ex.allocation_id]
202
+ else:
203
+ # allocation
204
+ assert ex.alloc_size > 0
205
+ assert ev.parent
206
+ name = _ev_ctx(ev.parent)
207
+ _allocs[ex.allocation_id] = {"size": ex.alloc_size, "name": name}
208
+
209
+ return _allocs
210
+
211
+
212
+ def get_allocs_from_profile(prof: torch.profiler.profiler) -> List[Dict[str, Any]]:
213
+ """
214
+ Get allocs from profile.
215
+
216
+ :param prof: via torch.profiler.profile.
217
+ :return: allocs dict: id -> dict with "size", "name"
218
+ """
219
+ # noinspection PyProtectedMember
220
+ from torch.profiler._utils import traverse_dfs
221
+ from torch._C._profiler import _EventType # noqa
222
+
223
+ _allocs = [] # dict with "id", "size", "name"
224
+
225
+ for ev in sorted(
226
+ traverse_dfs(prof.profiler.kineto_results.experimental_event_tree()), key=lambda ev: ev.start_time_ns
227
+ ):
228
+ # ev: torch._C._profiler._ProfilerEvent
229
+ if ev.typed[0] == _EventType.Allocation:
230
+ ex = ev.typed[1] # torch._C._profiler._ExtraFields_Allocation
231
+ if ex.alloc_size > 0:
232
+ assert ev.parent
233
+ name = _ev_ctx(ev.parent)
234
+ _allocs.append({"id": ex.allocation_id, "size": ex.alloc_size, "name": name})
235
+
236
+ return _allocs
237
+
238
+
239
+ def get_peak_alloc_from_profile(prof: torch.profiler.profiler) -> int:
240
+ """
241
+ Get remaining allocs from profile.
242
+
243
+ :param prof: via torch.profiler.profile.
244
+ :return: peak alloc size
245
+ """
246
+ # noinspection PyProtectedMember
247
+ from torch.profiler._utils import traverse_dfs
248
+ from torch._C._profiler import _EventType # noqa
249
+
250
+ _allocs = {} # id -> dict with "size", "name"
251
+ peak_alloc = 0
252
+
253
+ for ev in sorted(
254
+ traverse_dfs(prof.profiler.kineto_results.experimental_event_tree()), key=lambda ev: ev.start_time_ns
255
+ ):
256
+ # ev: torch._C._profiler._ProfilerEvent
257
+ # ev: torch._C._profiler._ProfilerEvent
258
+ if ev.typed[0] == _EventType.Allocation:
259
+ ex = ev.typed[1] # torch._C._profiler._ExtraFields_Allocation
260
+ # ex.id/ex.allocation_id/ex.ptr redundant?
261
+ if ex.allocation_id in _allocs:
262
+ # expect deallocation
263
+ assert _allocs[ex.allocation_id]["size"] == -ex.alloc_size
264
+ del _allocs[ex.allocation_id]
265
+ else:
266
+ # allocation
267
+ assert ex.alloc_size > 0
268
+ assert ev.parent
269
+ name = _ev_ctx(ev.parent)
270
+ _allocs[ex.allocation_id] = {"size": ex.alloc_size, "name": name}
271
+
272
+ cur_total_alloc = sum(alloc["size"] for alloc in _allocs.values())
273
+ if cur_total_alloc > peak_alloc:
274
+ peak_alloc = cur_total_alloc
275
+
276
+ return peak_alloc
277
+
278
+
202
279
  def _pycall_filter_fn(filename: str) -> bool:
203
280
  assert not filename.startswith("/") # currently the case...
204
281
  if filename.startswith("test_"):
@@ -209,6 +286,33 @@ def _pycall_filter_fn(filename: str) -> bool:
209
286
  return False
210
287
 
211
288
 
289
+ def _ev_ctx(ev) -> str:
290
+ from torch._C._profiler import _EventType # noqa
291
+
292
+ stack = [None]
293
+ parent = ev
294
+ while parent and parent.typed[0] == _EventType.TorchOp: # go to top torch op
295
+ stack[-1] = parent.typed[1].name
296
+ parent = parent.parent
297
+ if not stack[-1] and parent.typed[0] == _EventType.PyCCall:
298
+ stack[-1] = parent.typed[1].caller.function_name
299
+ parent = parent.parent
300
+ if not stack[-1]:
301
+ stack.pop(-1)
302
+ while parent:
303
+ if parent.typed[0] == _EventType.PyCall:
304
+ ex0 = parent.typed[1].caller # torch._C._profiler._PyFrameState
305
+ ex1 = parent.typed[1].callsite # torch._C._profiler._PyFrameState
306
+ if (
307
+ _pycall_filter_fn(ex1.file_name)
308
+ or (_pycall_filter_fn(ex0.file_name) and ex1.function_name == "backward")
309
+ ) and ex1.function_name not in {"__torch_dispatch__"}:
310
+ stack.append(ex1.function_name)
311
+ parent = parent.parent
312
+ stack.reverse()
313
+ return "/".join(stack) or "unknown"
314
+
315
+
212
316
  def _repr_tensor_metadata(x) -> Any:
213
317
  """
214
318
  :param x: torch._C._profiler._TensorMetadata or int
@@ -1,2 +0,0 @@
1
- version = '1.20240719.111324'
2
- long_version = '1.20240719.111324+git.12f2abc'