opensportslib 0.2.0.dev5__tar.gz → 0.2.0.dev7__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.
Files changed (182) hide show
  1. {opensportslib-0.2.0.dev5/opensportslib.egg-info → opensportslib-0.2.0.dev7}/PKG-INFO +21 -6
  2. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/README.md +19 -4
  3. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/apis/localization.py +97 -5
  4. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/apis/vqa.py +59 -25
  5. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/configs/default.yaml +1 -1
  6. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/configs/localization/h5_header_distance_speed_angle.yaml +3 -3
  7. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/configs/vqa/default.yaml +1 -1
  8. opensportslib-0.2.0.dev7/opensportslib/configs/vqa/qwen3_vl_native.yaml +81 -0
  9. opensportslib-0.2.0.dev7/opensportslib/configs/vqa/qwen_lora.yaml +69 -0
  10. opensportslib-0.2.0.dev7/opensportslib/configs/vqa/qwen_sngar_frames.yaml +133 -0
  11. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/core/config/accessors.py +86 -0
  12. opensportslib-0.2.0.dev7/opensportslib/core/trainer/vqa_trainer.py +1726 -0
  13. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/datasets/vqa_dataset.py +145 -17
  14. opensportslib-0.2.0.dev7/opensportslib/models/base/qwen_vl_native.py +620 -0
  15. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/models/base/qwen_xvars.py +108 -11
  16. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/models/base/xvars_videochatgpt.py +57 -15
  17. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/models/builder.py +9 -1
  18. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/tools/__init__.py +3 -0
  19. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7/opensportslib.egg-info}/PKG-INFO +21 -6
  20. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib.egg-info/SOURCES.txt +9 -1
  21. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib.egg-info/requires.txt +1 -1
  22. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/pyproject.toml +2 -2
  23. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/tests/conftest.py +1 -1
  24. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/tests/test_config_architecture.py +14 -0
  25. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/tests/test_config_utils_smoke.py +37 -1
  26. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/tests/test_task_model_api_contract.py +77 -0
  27. opensportslib-0.2.0.dev7/tests/test_vqa_api.py +595 -0
  28. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/tests/test_vqa_qwen_xvars.py +79 -1
  29. opensportslib-0.2.0.dev7/tests/test_vqa_training_lora.py +1229 -0
  30. opensportslib-0.2.0.dev7/tools/convert/build_sn_vqa_2026_vqa.py +7 -0
  31. opensportslib-0.2.0.dev7/tools/convert/build_soccernet_gar_vqa.py +7 -0
  32. opensportslib-0.2.0.dev7/tools/training/vqa.py +79 -0
  33. opensportslib-0.2.0.dev7/tools/upload/upload_model_hf.py +223 -0
  34. opensportslib-0.2.0.dev5/opensportslib/core/trainer/vqa_trainer.py +0 -797
  35. opensportslib-0.2.0.dev5/tests/test_vqa_api.py +0 -240
  36. opensportslib-0.2.0.dev5/tests/test_vqa_training_lora.py +0 -563
  37. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/LICENSE +0 -0
  38. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/LICENSE-COMMERCIAL +0 -0
  39. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/MANIFEST.in +0 -0
  40. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/examples/quickstart/basic_classification.py +0 -0
  41. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/examples/quickstart/basic_localization.py +0 -0
  42. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/examples/quickstart/basic_vqa.py +0 -0
  43. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/__init__.py +0 -0
  44. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/apis/__init__.py +0 -0
  45. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/apis/base_task_model.py +0 -0
  46. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/apis/classification.py +0 -0
  47. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/cli.py +0 -0
  48. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/configs/classification/default.yaml +0 -0
  49. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/configs/classification/sngar_frames.yaml +0 -0
  50. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/configs/classification/sngar_tracking.yaml +0 -0
  51. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/configs/classification/video.yaml +0 -0
  52. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/configs/localization/calf_resnetpca512.yaml +0 -0
  53. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/configs/localization/default.yaml +0 -0
  54. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/configs/localization/h5_header_distance.yaml +0 -0
  55. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/configs/localization/h5_header_distance_angle.yaml +0 -0
  56. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/configs/localization/h5_header_distance_speed.yaml +0 -0
  57. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/configs/localization/h5_header_rule.yaml +0 -0
  58. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/configs/localization/netvladpp_resnetpca512.yaml +0 -0
  59. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/configs/localization/video_dali.yaml +0 -0
  60. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/configs/localization/video_ocv.yaml +0 -0
  61. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/configs/vqa/qwen.yaml +0 -0
  62. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/configs/vqa/xvars.yaml +0 -0
  63. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/core/__init__.py +0 -0
  64. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/core/config/__init__.py +0 -0
  65. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/core/config/conflicts.py +0 -0
  66. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/core/config/loader.py +0 -0
  67. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/core/config/migrate.py +0 -0
  68. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/core/config/migrations/__init__.py +0 -0
  69. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/core/config/migrations/legacy_to_canonical.py +0 -0
  70. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/core/config/runtime_adapter.py +0 -0
  71. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/core/config/schema.py +0 -0
  72. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/core/config/schemas/__init__.py +0 -0
  73. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/core/config/schemas/schema_canonical.py +0 -0
  74. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/core/config/schemas/schema_legacy.py +0 -0
  75. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/core/config/validate.py +0 -0
  76. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/core/loss/__init__.py +0 -0
  77. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/core/loss/builder.py +0 -0
  78. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/core/loss/calf.py +0 -0
  79. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/core/loss/ce.py +0 -0
  80. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/core/loss/combine.py +0 -0
  81. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/core/loss/nll.py +0 -0
  82. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/core/optimizer/__init__.py +0 -0
  83. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/core/optimizer/builder.py +0 -0
  84. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/core/sampler/weighted_sampler.py +0 -0
  85. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/core/scheduler/__init__.py +0 -0
  86. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/core/scheduler/builder.py +0 -0
  87. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/core/trainer/__init__.py +0 -0
  88. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/core/trainer/classification_trainer.py +0 -0
  89. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/core/trainer/localization_trainer.py +0 -0
  90. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/core/utils/checkpoint.py +0 -0
  91. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/core/utils/config.py +0 -0
  92. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/core/utils/config_normalize.py +0 -0
  93. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/core/utils/data.py +0 -0
  94. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/core/utils/ddp.py +0 -0
  95. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/core/utils/default_args.py +0 -0
  96. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/core/utils/hf_runtime.py +0 -0
  97. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/core/utils/lightning.py +0 -0
  98. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/core/utils/load_annotations.py +0 -0
  99. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/core/utils/seed.py +0 -0
  100. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/core/utils/video_processing.py +0 -0
  101. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/core/utils/wandb.py +0 -0
  102. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/datasets/__init__.py +0 -0
  103. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/datasets/builder.py +0 -0
  104. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/datasets/classification_dataset.py +0 -0
  105. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/datasets/localization_dataset.py +0 -0
  106. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/datasets/utils/__init__.py +0 -0
  107. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/datasets/utils/h5_tracking.py +0 -0
  108. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/datasets/utils/tracking.py +0 -0
  109. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/legacy_config/classification.yaml +0 -0
  110. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/legacy_config/localization-e2e-ocv.yaml +0 -0
  111. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/legacy_config/localization-json_calf_resnetpca512.yaml +0 -0
  112. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/legacy_config/localization-json_netvlad++_resnetpca512.yaml +0 -0
  113. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/legacy_config/localization.yaml +0 -0
  114. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/legacy_config/sngar-frames.yaml +0 -0
  115. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/legacy_config/sngar-tracking.yaml +0 -0
  116. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/metrics/classification_metric.py +0 -0
  117. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/metrics/localization_metric.py +0 -0
  118. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/metrics/vqa_metric.py +0 -0
  119. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/models/__init__.py +0 -0
  120. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/models/backbones/builder.py +0 -0
  121. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/models/base/contextaware.py +0 -0
  122. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/models/base/e2e.py +0 -0
  123. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/models/base/learnablepooling.py +0 -0
  124. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/models/base/rule_based.py +0 -0
  125. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/models/base/tracking.py +0 -0
  126. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/models/base/vars.py +0 -0
  127. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/models/base/video.py +0 -0
  128. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/models/base/video_chatgpt_compat.py +0 -0
  129. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/models/base/video_mae.py +0 -0
  130. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/models/heads/builder.py +0 -0
  131. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/models/neck/builder.py +0 -0
  132. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/models/utils/common.py +0 -0
  133. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/models/utils/impl/__init__.py +0 -0
  134. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/models/utils/impl/asformer.py +0 -0
  135. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/models/utils/impl/calf.py +0 -0
  136. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/models/utils/impl/gsm.py +0 -0
  137. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/models/utils/impl/gtad.py +0 -0
  138. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/models/utils/impl/tsm.py +0 -0
  139. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/models/utils/litebase.py +0 -0
  140. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/models/utils/modules.py +0 -0
  141. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/models/utils/shift.py +0 -0
  142. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/models/utils/utils.py +0 -0
  143. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/models/utils/vqa_prediction_priors.py +0 -0
  144. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/models/utils/vqa_prompting.py +0 -0
  145. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/models/utils/xvars_clip_index.py +0 -0
  146. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/setup/setup.py +0 -0
  147. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/tools/_common.py +0 -0
  148. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/tools/hf_transfer.py +0 -0
  149. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/tools/osl_json_to_parquet.py +0 -0
  150. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/tools/parquet_to_osl_json.py +0 -0
  151. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib.egg-info/dependency_links.txt +0 -0
  152. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib.egg-info/entry_points.txt +0 -0
  153. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib.egg-info/top_level.txt +0 -0
  154. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/scripts/run_h5_header_rule_inference.py +0 -0
  155. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/setup.cfg +0 -0
  156. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/tests/test_classification_dataset_paths.py +0 -0
  157. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/tests/test_classification_trainer_dataloader.py +0 -0
  158. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/tests/test_config_split_override_sync.py +0 -0
  159. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/tests/test_conversion_tools.py +0 -0
  160. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/tests/test_extract_xvars_features.py +0 -0
  161. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/tests/test_h5_header_rule_spotter.py +0 -0
  162. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/tests/test_h5_tracking_dataset.py +0 -0
  163. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/tests/test_hf_transfer_tools.py +0 -0
  164. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/tests/test_localization_dali_filenames.py +0 -0
  165. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/tests/test_package_smoke.py +0 -0
  166. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/tests/test_pretrained_config_merge_policy.py +0 -0
  167. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/tests/test_public_apis_smoke.py +0 -0
  168. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/tests/test_setup_cli.py +0 -0
  169. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/tests/test_subset_train_infer_integration.py +0 -0
  170. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/tests/test_vqa_metrics_semantic.py +0 -0
  171. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/tests/test_vqa_xvars_videochatgpt.py +0 -0
  172. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/tools/convert/build_soccernet_gar.py +0 -0
  173. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/tools/convert/build_soccernet_gar_action_spotting.py +0 -0
  174. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/tools/convert/build_xvars_indexes.py +0 -0
  175. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/tools/convert/extract_xvars_clip_features.py +0 -0
  176. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/tools/convert/osl_json_to_parquet_webdataset.py +0 -0
  177. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/tools/convert/parquet_webdataset_to_osl_json.py +0 -0
  178. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/tools/download/download_hf_repo.py +0 -0
  179. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/tools/download/download_osl_hf.py +0 -0
  180. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/tools/download/upload_osl_hf.py +0 -0
  181. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/tools/training/classification.py +0 -0
  182. {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/tools/training/localization.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: opensportslib
3
- Version: 0.2.0.dev5
3
+ Version: 0.2.0.dev7
4
4
  Summary: OpenSportsLib is the professional library, designed for advanced video understanding in sports. It provides state-of-the-art tools for action recognition, spotting, retrieval, and captioning, making it ideal for researchers, analysts, and developers working with sports video data.
5
5
  Author: Jeet Vora
6
6
  Requires-Python: >=3.12
@@ -26,7 +26,7 @@ Requires-Dist: tabulate
26
26
  Requires-Dist: pytorch-lightning
27
27
  Requires-Dist: pandas
28
28
  Requires-Dist: pyarrow
29
- Requires-Dist: h5py
29
+ Requires-Dist: h5py==3.16.0
30
30
  Requires-Dist: huggingface_hub
31
31
  Requires-Dist: easydict
32
32
  Provides-Extra: test
@@ -317,10 +317,25 @@ single_prediction = my_model.infer(
317
317
  ```
318
318
 
319
319
  Use `opensportslib/configs/vqa/xvars.yaml` with `opensportslib setup --vqa_xvars`
320
- for the X-VARS-compatible backend, or `opensportslib/configs/vqa/qwen.yaml` with
321
- `opensportslib setup --vqa_qwen` for the Qwen-compatible backend. The Qwen
322
- backend currently supports `Qwen/Qwen2.5-7B-Instruct` and
323
- `Qwen/Qwen3.5-9B-Base`.
320
+ for the X-VARS backend. OpenSportsLib supports three VQA options:
321
+
322
+ - `opensportslib/configs/vqa/xvars.yaml`
323
+ Original X-VARS / Video-ChatGPT path.
324
+ - CLIP features + Qwen
325
+ Use `opensportslib/configs/vqa/qwen.yaml` for inference and
326
+ `opensportslib/configs/vqa/qwen_lora.yaml` for LoRA training.
327
+ - `opensportslib/configs/vqa/qwen3_vl_native.yaml`
328
+ Full end-to-end native QwenVL path. This is the single canonical QwenVL
329
+ config; change `MODEL.components.llm_decoder.params.repo_id` to switch model
330
+ IDs.
331
+
332
+ Use `opensportslib setup --vqa_qwen` for both the CLIP+Qwen and native QwenVL
333
+ paths. The CLIP+Qwen configs support `Qwen/Qwen2.5-7B-Instruct` and
334
+ `Qwen/Qwen3.5-9B-Base`. The native QwenVL config defaults to
335
+ `Qwen/Qwen3-VL-8B-Instruct` and supports:
336
+
337
+ - `Qwen/Qwen3-VL-8B-Instruct`
338
+ - `Qwen/Qwen2.5-VL-7B-Instruct`
324
339
 
325
340
  For X-VARS, `feature_source: indexed_or_raw_clip` prefers indexed CLIP features
326
341
  when available and falls back to extracting CLIP features from raw video during
@@ -281,10 +281,25 @@ single_prediction = my_model.infer(
281
281
  ```
282
282
 
283
283
  Use `opensportslib/configs/vqa/xvars.yaml` with `opensportslib setup --vqa_xvars`
284
- for the X-VARS-compatible backend, or `opensportslib/configs/vqa/qwen.yaml` with
285
- `opensportslib setup --vqa_qwen` for the Qwen-compatible backend. The Qwen
286
- backend currently supports `Qwen/Qwen2.5-7B-Instruct` and
287
- `Qwen/Qwen3.5-9B-Base`.
284
+ for the X-VARS backend. OpenSportsLib supports three VQA options:
285
+
286
+ - `opensportslib/configs/vqa/xvars.yaml`
287
+ Original X-VARS / Video-ChatGPT path.
288
+ - CLIP features + Qwen
289
+ Use `opensportslib/configs/vqa/qwen.yaml` for inference and
290
+ `opensportslib/configs/vqa/qwen_lora.yaml` for LoRA training.
291
+ - `opensportslib/configs/vqa/qwen3_vl_native.yaml`
292
+ Full end-to-end native QwenVL path. This is the single canonical QwenVL
293
+ config; change `MODEL.components.llm_decoder.params.repo_id` to switch model
294
+ IDs.
295
+
296
+ Use `opensportslib setup --vqa_qwen` for both the CLIP+Qwen and native QwenVL
297
+ paths. The CLIP+Qwen configs support `Qwen/Qwen2.5-7B-Instruct` and
298
+ `Qwen/Qwen3.5-9B-Base`. The native QwenVL config defaults to
299
+ `Qwen/Qwen3-VL-8B-Instruct` and supports:
300
+
301
+ - `Qwen/Qwen3-VL-8B-Instruct`
302
+ - `Qwen/Qwen2.5-VL-7B-Instruct`
288
303
 
289
304
  For X-VARS, `feature_source: indexed_or_raw_clip` prefers indexed CLIP features
290
305
  when available and falls back to extracting CLIP features from raw video during
@@ -1,6 +1,7 @@
1
1
  import logging
2
2
  import os
3
3
  import time
4
+ from types import SimpleNamespace
4
5
 
5
6
  from opensportslib.apis.base_task_model import BaseTaskModel
6
7
  from opensportslib.core.config.accessors import (
@@ -14,6 +15,7 @@ from opensportslib.core.config.accessors import (
14
15
  get_split_annotation_path,
15
16
  get_split_cfg,
16
17
  set_split_annotation_path,
18
+ set_loader_backend,
17
19
  get_model_family,
18
20
  )
19
21
  from opensportslib.core.utils.config import expand
@@ -22,6 +24,17 @@ from opensportslib.core.utils.config import expand
22
24
  class LocalizationModel(BaseTaskModel):
23
25
  """Top-level task wrapper for localization / spotting."""
24
26
 
27
+ _HF_BACKEND_SPLIT_TYPES = {
28
+ "dali": {
29
+ "VideoGameWithOpencv": "VideoGameWithDali",
30
+ "VideoGameWithOpencvVideo": "VideoGameWithDaliVideo",
31
+ },
32
+ "opencv": {
33
+ "VideoGameWithDali": "VideoGameWithOpencv",
34
+ "VideoGameWithDaliVideo": "VideoGameWithOpencvVideo",
35
+ },
36
+ }
37
+
25
38
  # def __init__(self, config=None, weights=None):
26
39
  # super().__init__(config=config, weights=None)
27
40
  # if weights is not None:
@@ -62,6 +75,82 @@ class LocalizationModel(BaseTaskModel):
62
75
  device,
63
76
  )
64
77
 
78
+ @staticmethod
79
+ def _device_type(device) -> str:
80
+ device_type = getattr(device, "type", device)
81
+ return str(device_type).split(":", 1)[0].lower()
82
+
83
+ @staticmethod
84
+ def _is_hf_repo_weights(weights: str | None) -> bool:
85
+ if not weights:
86
+ return False
87
+ from opensportslib.core.utils.config import is_local_path
88
+
89
+ return not is_local_path(weights)
90
+
91
+ @staticmethod
92
+ def _iter_split_items(splits):
93
+ if splits is None:
94
+ return []
95
+ if isinstance(splits, dict):
96
+ return list(splits.items())
97
+ return list(vars(splits).items())
98
+
99
+ @staticmethod
100
+ def _ensure_namespace(parent, attr: str):
101
+ current = getattr(parent, attr, None)
102
+ if current is None:
103
+ current = SimpleNamespace()
104
+ setattr(parent, attr, current)
105
+ return current
106
+
107
+ def _normalize_opencv_dataloader(self, split_name: str, split_cfg) -> None:
108
+ dataloader = getattr(split_cfg, "dataloader", None)
109
+ if dataloader is None:
110
+ dataloader = SimpleNamespace()
111
+ setattr(split_cfg, "dataloader", dataloader)
112
+
113
+ if getattr(dataloader, "batch_size", None) is None:
114
+ dataloader.batch_size = 1
115
+ if getattr(dataloader, "shuffle", None) is None:
116
+ dataloader.shuffle = split_name == "train"
117
+ if getattr(dataloader, "num_workers", None) is None:
118
+ dataloader.num_workers = 0
119
+ if getattr(dataloader, "pin_memory", None) is None:
120
+ dataloader.pin_memory = False
121
+
122
+ def _adapt_hf_backend_for_device(self, weights: str | None) -> None:
123
+ if not self._is_hf_repo_weights(weights):
124
+ return
125
+
126
+ from opensportslib.core.utils.config import select_device
127
+
128
+ device = select_device(self.config.SYSTEM)
129
+ backend = "dali" if self._device_type(device) == "cuda" else "opencv"
130
+ current_backend = get_loader_backend(self.config)
131
+ set_loader_backend(self.config, backend)
132
+
133
+ common = getattr(getattr(self.config, "DATA", None), "common", None)
134
+ if common is None:
135
+ return
136
+ splits = self._ensure_namespace(common, "splits")
137
+ remap = self._HF_BACKEND_SPLIT_TYPES[backend]
138
+
139
+ for split_name, split_cfg in self._iter_split_items(splits):
140
+ split_type = getattr(split_cfg, "type", None)
141
+ if split_type in remap:
142
+ setattr(split_cfg, "type", remap[split_type])
143
+ if backend == "opencv":
144
+ self._normalize_opencv_dataloader(split_name, split_cfg)
145
+
146
+ if current_backend != backend:
147
+ logging.info(
148
+ "HF localization runtime backend override: %s -> %s for weights=%s",
149
+ current_backend,
150
+ backend,
151
+ weights,
152
+ )
153
+
65
154
  def load_weights(
66
155
  self,
67
156
  weights: str | None = None,
@@ -80,6 +169,7 @@ class LocalizationModel(BaseTaskModel):
80
169
  if weights is None:
81
170
  raise ValueError("`weights` must be provided to load_weights().")
82
171
 
172
+ self._adapt_hf_backend_for_device(weights)
83
173
  device = select_device(self.config.SYSTEM)
84
174
  self._gate_multi_gpu_by_device(device)
85
175
  if self.model is None:
@@ -183,8 +273,10 @@ class LocalizationModel(BaseTaskModel):
183
273
  # E2E validation mAP uses the `valid_data_frames` split; keep it in sync
184
274
  # with explicit valid annotation overrides.
185
275
  self._set_split_path("valid_data_frames", valid_set)
186
-
276
+
187
277
  self.config = resolve_config_omega(self.config, weights=weights)
278
+ effective_weights = weights if weights is not None else self.last_loaded_weights
279
+ self._adapt_hf_backend_for_device(effective_weights)
188
280
  check_config(self.config, split="train")
189
281
  init_wandb(
190
282
  self.config_path,
@@ -196,8 +288,6 @@ class LocalizationModel(BaseTaskModel):
196
288
  logging.info("Configuration:")
197
289
  logging.info(self.config)
198
290
 
199
- effective_weights = weights if weights is not None else self.last_loaded_weights
200
-
201
291
  def set_seed(seed):
202
292
  random.seed(seed)
203
293
  np.random.seed(seed)
@@ -298,6 +388,8 @@ class LocalizationModel(BaseTaskModel):
298
388
  self._set_split_path("test", test_set)
299
389
 
300
390
  self.config = resolve_config_omega(self.config, weights=weights)
391
+ effective_weights = weights if weights is not None else self.last_loaded_weights
392
+ self._adapt_hf_backend_for_device(effective_weights)
301
393
  check_config(self.config, split="test")
302
394
  self.config.infer_split = whether_infer_split(get_split_cfg(self.config, "test"))
303
395
 
@@ -313,8 +405,6 @@ class LocalizationModel(BaseTaskModel):
313
405
 
314
406
  start = time.time()
315
407
 
316
- effective_weights = weights if weights is not None else self.last_loaded_weights
317
-
318
408
  if effective_weights is not None:
319
409
  if self.model is None or self.last_loaded_weights != effective_weights:
320
410
  self.load_weights(weights=effective_weights)
@@ -368,6 +458,8 @@ class LocalizationModel(BaseTaskModel):
368
458
  test_set = self._resolve_split_path("test", test_set)
369
459
  self._set_split_path("test", test_set)
370
460
  self.config = resolve_config_omega(self.config, weights=weights)
461
+ effective_weights = weights if weights is not None else self.last_loaded_weights
462
+ self._adapt_hf_backend_for_device(effective_weights)
371
463
  check_config(self.config, split="test")
372
464
  self.config.infer_split = whether_infer_split(get_split_cfg(self.config, "test"))
373
465
 
@@ -51,6 +51,7 @@ class VQAModel(BaseTaskModel):
51
51
  return_queue=None,
52
52
  train_set=None,
53
53
  valid_set=None,
54
+ resume_from_checkpoint=None,
54
55
  use_wandb=False,
55
56
  ):
56
57
  import torch
@@ -97,14 +98,10 @@ class VQAModel(BaseTaskModel):
97
98
  train_data = build_dataset(config, train_set, None, split="train")
98
99
  valid_data = build_dataset(config, valid_set, None, split="valid")
99
100
  trainer = Trainer_VQA(config)
100
- ckpt = trainer.train(
101
- None,
102
- train_data,
103
- valid_data,
104
- rank=rank,
105
- world_size=world_size,
106
- use_wandb=use_wandb,
107
- )
101
+ train_kwargs = {"rank": rank, "world_size": world_size, "use_wandb": use_wandb}
102
+ if resume_from_checkpoint is not None:
103
+ train_kwargs["resume_from_checkpoint"] = resume_from_checkpoint
104
+ ckpt = trainer.train(None, train_data, valid_data, **train_kwargs)
108
105
  if rank == 0 and return_queue is not None:
109
106
  return_queue.put(ckpt)
110
107
  finally:
@@ -139,37 +136,73 @@ class VQAModel(BaseTaskModel):
139
136
  train_set: str | None = None,
140
137
  valid_set: str | None = None,
141
138
  weights: str | None = None,
139
+ resume_from_checkpoint: str | None = None,
140
+ use_ddp: bool | None = None,
142
141
  use_wandb: bool = True,
143
142
  **kwargs,
144
143
  ) -> str | None:
145
144
  del kwargs
145
+
146
+ self.config = resolve_config_omega(self.config, weights=weights)
147
+ execution = get_train_execution(self.config)
148
+ backend = str(execution.get("training_backend", "placeholder")).lower()
149
+ vqa_backend = get_vqa_backend(self.config)
150
+ if vqa_backend == "qwen_xvars_infer" and backend != "qwen_xvars_lora":
151
+ raise ValueError(
152
+ "The 'qwen_xvars_infer' backend requires TRAIN.execution.training_backend='qwen_xvars_lora' for train()."
153
+ )
154
+ if vqa_backend == "qwen_vl_native_infer" and backend != "qwen_vl_native_lora":
155
+ raise ValueError(
156
+ "The 'qwen_vl_native_infer' backend requires TRAIN.execution.training_backend='qwen_vl_native_lora' for train()."
157
+ )
146
158
  import torch
147
159
  import torch.multiprocessing as mp
148
160
 
149
- self.config = resolve_config_omega(self.config, weights=weights)
150
- if get_vqa_backend(self.config) == "qwen_xvars_infer":
151
- raise ValueError("The 'qwen_xvars_infer' backend is inference-only and does not support train().")
152
161
  train_set = self._resolve_split_path("train", train_set)
153
162
  valid_set = self._resolve_split_path("valid", valid_set)
154
- execution = get_train_execution(self.config)
155
- backend = str(execution.get("training_backend", "placeholder")).lower()
156
- if backend == "xvars_videochatgpt_lora":
157
- world_size = torch.cuda.device_count() or get_system_gpu_count(self.config)
163
+ if backend in {"xvars_videochatgpt_lora", "qwen_xvars_lora", "qwen_vl_native_lora"}:
158
164
  requested_gpus = get_system_gpu_count(self.config)
159
- use_ddp = world_size > 1 and int(requested_gpus) > 1
165
+ available_gpus = int(torch.cuda.device_count() or 0)
166
+ if requested_gpus > 0:
167
+ world_size = min(available_gpus, int(requested_gpus)) if available_gpus > 0 else int(requested_gpus)
168
+ else:
169
+ world_size = available_gpus
170
+ effective_world_size = max(int(world_size), 1)
171
+ if use_ddp is None:
172
+ launch_ddp = effective_world_size > 1
173
+ else:
174
+ launch_ddp = bool(use_ddp) and effective_world_size > 1
175
+ if requested_gpus > 0 and available_gpus > 0 and requested_gpus != available_gpus:
176
+ logging.info(
177
+ "VQA train GPU selection | requested=%s | available=%s | launching=%s",
178
+ requested_gpus,
179
+ available_gpus,
180
+ effective_world_size if launch_ddp else 1,
181
+ )
160
182
  logging.info(
161
- "VQA train launch | mode=%s | world_size=%s",
162
- "ddp" if use_ddp else "single",
163
- world_size if use_ddp else 1,
183
+ "VQA train launch | mode=%s | requested_gpus=%s | available_gpus=%s | world_size=%s",
184
+ "ddp" if launch_ddp else "single",
185
+ requested_gpus,
186
+ available_gpus,
187
+ effective_world_size if launch_ddp else 1,
164
188
  )
165
189
 
166
190
  ctx = mp.get_context("spawn")
167
191
  queue = ctx.SimpleQueue()
168
- if use_ddp:
192
+ if launch_ddp:
169
193
  mp.spawn(
170
194
  VQAModel._worker_ddp,
171
- args=(world_size, self.config_path, self.config, queue, train_set, valid_set, use_wandb),
172
- nprocs=world_size,
195
+ args=(
196
+ effective_world_size,
197
+ self.config_path,
198
+ self.config,
199
+ queue,
200
+ train_set,
201
+ valid_set,
202
+ resume_from_checkpoint,
203
+ use_wandb,
204
+ ),
205
+ nprocs=effective_world_size,
173
206
  )
174
207
  else:
175
208
  VQAModel._worker_ddp(
@@ -180,6 +213,7 @@ class VQAModel(BaseTaskModel):
180
213
  return_queue=queue,
181
214
  train_set=train_set,
182
215
  valid_set=valid_set,
216
+ resume_from_checkpoint=resume_from_checkpoint,
183
217
  use_wandb=use_wandb,
184
218
  )
185
219
  ckpt = queue.get()
@@ -189,7 +223,7 @@ class VQAModel(BaseTaskModel):
189
223
 
190
224
  raise ValueError(
191
225
  f"Unsupported VQA training backend '{backend}'. "
192
- "Only 'xvars_videochatgpt_lora' is supported."
226
+ "Only 'xvars_videochatgpt_lora' and 'qwen_xvars_lora' are supported."
193
227
  )
194
228
 
195
229
  def infer(
@@ -216,8 +250,6 @@ class VQAModel(BaseTaskModel):
216
250
  self.config = resolve_config_omega(self.config, weights=weights)
217
251
  backend = get_vqa_backend(self.config)
218
252
  effective_weights = weights if weights is not None else self.last_loaded_weights
219
- if backend == "qwen_xvars_infer" and effective_weights is not None:
220
- raise ValueError("The 'qwen_xvars_infer' backend does not support adapter weights for infer().")
221
253
  _set_model_checkpoint_path(self.config, effective_weights)
222
254
  self.trainer = Trainer_VQA(self.config)
223
255
  if effective_weights is not None:
@@ -237,6 +269,8 @@ class VQAModel(BaseTaskModel):
237
269
  "question": str(question).strip(),
238
270
  "references": [],
239
271
  "video_path": resolved_video_path,
272
+ "frame_paths": [],
273
+ "video_frames": [],
240
274
  "video_spatio_temporal_features": None,
241
275
  "prior_prediction_text": "",
242
276
  "labels": {},
@@ -2,7 +2,7 @@ SYSTEM:
2
2
  paths:
3
3
  log_dir: ./logs
4
4
  save_dir: ./checkpoints
5
- device: cuda
5
+ device: auto
6
6
  gpu:
7
7
  id: 0
8
8
  reproducibility:
@@ -11,14 +11,14 @@ SYSTEM:
11
11
  DATA:
12
12
  common:
13
13
  dataset_name: h5_headers
14
- data_root: ./data
14
+ data_root: /home/vorajv/dataset/silvio-h5/
15
15
  classes:
16
16
  - header
17
17
  splits:
18
18
  test:
19
19
  type: H5OSLJsonSpotting
20
- annotation_path: ./data/h5.json
21
- source_path: ./data
20
+ annotation_path: /home/vorajv/dataset/silvio-h5/h5_tiny.json
21
+ source_path: /home/vorajv/dataset/silvio-h5/
22
22
  dataloader:
23
23
  batch_size: 1
24
24
  shuffle: false
@@ -5,7 +5,7 @@ SYSTEM:
5
5
  paths:
6
6
  save_dir: ./checkpoints_vqa
7
7
  work_dir: ${SYSTEM.paths.save_dir}
8
- device: cuda
8
+ device: auto
9
9
  gpu:
10
10
  count: 1
11
11
  id: 0
@@ -0,0 +1,81 @@
1
+ SYSTEM:
2
+ paths:
3
+ save_dir: ./checkpoints_vqa_qwen3_vl_native
4
+ gpu:
5
+ count: 4
6
+ id: null
7
+
8
+ MODEL:
9
+ topology: []
10
+ components:
11
+ video_encoder:
12
+ kind: encoder
13
+ source:
14
+ provider: opensportslib
15
+ name: qwen_vl_native
16
+ params:
17
+ feature_source: raw_video
18
+ native_vl:
19
+ visual_input_mode: frames
20
+ num_frames: 8
21
+ min_pixels: 50176 # 28*28*64
22
+ max_pixels: 401408 # 28*28*512
23
+ overrides: {}
24
+ llm_decoder:
25
+ kind: decoder
26
+ source:
27
+ provider: huggingface
28
+ # Canonical end-to-end QwenVL config.
29
+ # Swap this model ID if you want another supported QwenVL checkpoint.
30
+ # - Qwen/Qwen3-VL-8B-Instruct
31
+ # - Qwen/Qwen2.5-VL-7B-Instruct
32
+ name: Qwen/Qwen3-VL-8B-Instruct
33
+ params:
34
+ # Supported examples:
35
+ # - Qwen/Qwen3-VL-8B-Instruct
36
+ # - Qwen/Qwen2.5-VL-7B-Instruct
37
+ repo_id: Qwen/Qwen3-VL-8B-Instruct
38
+ overrides: {}
39
+ metadata:
40
+ backend: qwen_vl_native_infer
41
+
42
+ TRAIN:
43
+ optimizer:
44
+ type: adamw_torch
45
+ lr: 0.0002
46
+ weight_decay: 0.001
47
+ execution:
48
+ acc_grad_iter: 4
49
+ training_backend: qwen_vl_native_lora
50
+ prompt:
51
+ system_prompt: You are a football video assistant. Answer the VQA question using the provided visual evidence and referee priors.
52
+ native_vl:
53
+ visual_input_mode: frames
54
+ num_frames: 8
55
+ min_pixels: 50176 # 28*28*64
56
+ max_pixels: 401408 # 28*28*512
57
+ hf:
58
+ tokenizer_id: ${MODEL.components.llm_decoder.params.repo_id}
59
+ prefer_cuda: true
60
+ local_files_only: false
61
+ device_map: null
62
+ sft:
63
+ per_device_train_batch_size: 1
64
+ per_device_eval_batch_size: 1
65
+ max_seq_length: 1024
66
+ max_grad_norm: 1.0
67
+ memory_cache_rows: 0
68
+ gradient_checkpointing: true
69
+ ddp_find_unused_parameters: false
70
+ ddp_broadcast_buffers: false
71
+ resume_optimizer_state: false
72
+ cache_tokenized_rows: false
73
+ disable_tqdm: false
74
+ save_strategy: epoch
75
+ # save_steps: 100
76
+ # save_total_limit: 3
77
+ evaluation_strategy: "no"
78
+ lora:
79
+ prepare_kbit: false
80
+ quantization:
81
+ enabled: false
@@ -0,0 +1,69 @@
1
+ SYSTEM:
2
+ paths:
3
+ save_dir: ./checkpoints_vqa_qwen_lora
4
+ gpu:
5
+ count: 4
6
+
7
+ MODEL:
8
+ components:
9
+ video_encoder:
10
+ kind: encoder
11
+ source:
12
+ provider: opensportslib
13
+ name: xvars_clip_features
14
+ load:
15
+ weights_path: /home/vorajv/X-VARS/weights/14_model.pth.tar
16
+ params:
17
+ feature_source: indexed_or_raw_clip
18
+ vision_tower: openai/clip-vit-large-patch14
19
+ feature_dim: 1024
20
+ overrides: {}
21
+ mm_projector:
22
+ kind: projector
23
+ source:
24
+ provider: opensportslib
25
+ params:
26
+ input_dim: 1024
27
+ overrides: {}
28
+ llm_decoder:
29
+ kind: decoder
30
+ source:
31
+ provider: huggingface
32
+ name: Qwen/Qwen3.5-9B-Base
33
+ params:
34
+ repo_id: Qwen/Qwen3.5-9B-Base
35
+ overrides: {}
36
+ metadata:
37
+ backend: qwen_xvars_infer
38
+
39
+ TRAIN:
40
+ execution:
41
+ training_backend: qwen_xvars_lora
42
+ prompt:
43
+ system_prompt: You are a football video assistant. Answer the VQA question using the provided video context and referee priors.
44
+ hf:
45
+ tokenizer_id: ${MODEL.components.llm_decoder.params.repo_id}
46
+ prefer_cuda: true
47
+ local_files_only: false
48
+ sft:
49
+ per_device_train_batch_size: 1
50
+ per_device_eval_batch_size: 1
51
+ gradient_accumulation_steps: 8
52
+ max_seq_length: 480
53
+ gradient_checkpointing: true
54
+ disable_tqdm: true
55
+ save_strategy: epoch
56
+ evaluation_strategy: "no"
57
+ lora:
58
+ r: 16
59
+ alpha: 32
60
+ dropout: 0.05
61
+ bias: none
62
+ prepare_kbit: false
63
+ target_modules: [q_proj, v_proj, k_proj, o_proj]
64
+ quantization:
65
+ enabled: false
66
+ load_in_4bit: true
67
+ bnb_4bit_quant_type: nf4
68
+ compute_dtype: float16
69
+ bnb_4bit_use_double_quant: true