zeromodels 1.2.6__py3-none-any.whl

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 (794) hide show
  1. zeromodels/__init__.py +13 -0
  2. zeromodels/base/__init__.py +43 -0
  3. zeromodels/base/base_attention.py +116 -0
  4. zeromodels/base/base_audio_feature_extractor.py +49 -0
  5. zeromodels/base/base_config.py +233 -0
  6. zeromodels/base/base_generation.py +388 -0
  7. zeromodels/base/base_generation_layers.py +121 -0
  8. zeromodels/base/base_image_processor.py +402 -0
  9. zeromodels/base/base_mixin.py +1097 -0
  10. zeromodels/base/base_model.py +99 -0
  11. zeromodels/base/base_processor.py +162 -0
  12. zeromodels/base/base_quantization.py +67 -0
  13. zeromodels/base/base_seq2seq_generation.py +162 -0
  14. zeromodels/base/base_tokenizer.py +162 -0
  15. zeromodels/conversion/__init__.py +28 -0
  16. zeromodels/conversion/converted_cache.py +278 -0
  17. zeromodels/conversion/equivalence_tester.py +589 -0
  18. zeromodels/conversion/exceptions.py +63 -0
  19. zeromodels/conversion/file_downloader.py +174 -0
  20. zeromodels/conversion/hf_download_utils.py +244 -0
  21. zeromodels/conversion/weight_split_util.py +224 -0
  22. zeromodels/conversion/weight_transfer_util.py +616 -0
  23. zeromodels/conversion/zm_config.py +231 -0
  24. zeromodels/models/__init__.py +126 -0
  25. zeromodels/models/bert/__init__.py +23 -0
  26. zeromodels/models/bert/bert_config.py +55 -0
  27. zeromodels/models/bert/bert_layers.py +212 -0
  28. zeromodels/models/bert/bert_model.py +1150 -0
  29. zeromodels/models/bert/bert_tokenizer.py +107 -0
  30. zeromodels/models/bert/convert_bert_hf_to_keras.py +272 -0
  31. zeromodels/models/cait/__init__.py +4 -0
  32. zeromodels/models/cait/cait_config.py +44 -0
  33. zeromodels/models/cait/cait_layers.py +733 -0
  34. zeromodels/models/cait/cait_model.py +548 -0
  35. zeromodels/models/cait/convert_cait_timm_to_keras.py +257 -0
  36. zeromodels/models/clip/__init__.py +33 -0
  37. zeromodels/models/clip/clip_config.py +112 -0
  38. zeromodels/models/clip/clip_image_processor.py +250 -0
  39. zeromodels/models/clip/clip_layers.py +553 -0
  40. zeromodels/models/clip/clip_model.py +1437 -0
  41. zeromodels/models/clip/clip_processor.py +85 -0
  42. zeromodels/models/clip/clip_tokenizer.py +111 -0
  43. zeromodels/models/clip/convert_clip_hf_to_keras.py +359 -0
  44. zeromodels/models/convmixer/__init__.py +7 -0
  45. zeromodels/models/convmixer/convert_convmixer_timm_to_keras.py +153 -0
  46. zeromodels/models/convmixer/convmixer_config.py +47 -0
  47. zeromodels/models/convmixer/convmixer_model.py +434 -0
  48. zeromodels/models/convnext/__init__.py +7 -0
  49. zeromodels/models/convnext/convert_convnext_timm_to_keras.py +339 -0
  50. zeromodels/models/convnext/convnext_config.py +38 -0
  51. zeromodels/models/convnext/convnext_layers.py +101 -0
  52. zeromodels/models/convnext/convnext_model.py +514 -0
  53. zeromodels/models/convnextv2/__init__.py +7 -0
  54. zeromodels/models/convnextv2/convert_convnextv2_timm_to_keras.py +260 -0
  55. zeromodels/models/convnextv2/convnextv2_config.py +52 -0
  56. zeromodels/models/convnextv2/convnextv2_model.py +208 -0
  57. zeromodels/models/deberta/__init__.py +19 -0
  58. zeromodels/models/deberta/convert_deberta_hf_to_keras.py +231 -0
  59. zeromodels/models/deberta/deberta_config.py +59 -0
  60. zeromodels/models/deberta/deberta_layers.py +247 -0
  61. zeromodels/models/deberta/deberta_model.py +688 -0
  62. zeromodels/models/deberta/deberta_tokenizer.py +107 -0
  63. zeromodels/models/deberta_v2/__init__.py +21 -0
  64. zeromodels/models/deberta_v2/convert_deberta_v2_hf_to_keras.py +255 -0
  65. zeromodels/models/deberta_v2/deberta_v2_config.py +70 -0
  66. zeromodels/models/deberta_v2/deberta_v2_layers.py +361 -0
  67. zeromodels/models/deberta_v2/deberta_v2_model.py +885 -0
  68. zeromodels/models/deberta_v2/deberta_v2_tokenizer.py +107 -0
  69. zeromodels/models/deberta_v3/__init__.py +21 -0
  70. zeromodels/models/deberta_v3/convert_deberta_v3_hf_to_keras.py +147 -0
  71. zeromodels/models/deberta_v3/deberta_v3_config.py +29 -0
  72. zeromodels/models/deberta_v3/deberta_v3_model.py +725 -0
  73. zeromodels/models/deberta_v3/deberta_v3_tokenizer.py +15 -0
  74. zeromodels/models/deeplabv3/__init__.py +10 -0
  75. zeromodels/models/deeplabv3/convert_deeplabv3_torch_to_keras.py +210 -0
  76. zeromodels/models/deeplabv3/deeplabv3_config.py +42 -0
  77. zeromodels/models/deeplabv3/deeplabv3_image_processor.py +193 -0
  78. zeromodels/models/deeplabv3/deeplabv3_model.py +489 -0
  79. zeromodels/models/deepseek_v2/__init__.py +11 -0
  80. zeromodels/models/deepseek_v2/convert_deepseek_v2_hf_to_keras.py +87 -0
  81. zeromodels/models/deepseek_v2/deepseek_v2_config.py +140 -0
  82. zeromodels/models/deepseek_v2/deepseek_v2_layers.py +568 -0
  83. zeromodels/models/deepseek_v2/deepseek_v2_model.py +404 -0
  84. zeromodels/models/deepseek_v2/deepseek_v2_tokenizer.py +55 -0
  85. zeromodels/models/deepseek_v3/__init__.py +11 -0
  86. zeromodels/models/deepseek_v3/convert_deepseek_v3_hf_to_keras.py +128 -0
  87. zeromodels/models/deepseek_v3/deepseek_v3_config.py +64 -0
  88. zeromodels/models/deepseek_v3/deepseek_v3_layers.py +578 -0
  89. zeromodels/models/deepseek_v3/deepseek_v3_model.py +421 -0
  90. zeromodels/models/deepseek_v3/deepseek_v3_tokenizer.py +55 -0
  91. zeromodels/models/deepseek_v4/__init__.py +11 -0
  92. zeromodels/models/deepseek_v4/convert_deepseek_v4_hf_to_keras.py +220 -0
  93. zeromodels/models/deepseek_v4/deepseek_v4_config.py +89 -0
  94. zeromodels/models/deepseek_v4/deepseek_v4_layers.py +1029 -0
  95. zeromodels/models/deepseek_v4/deepseek_v4_model.py +665 -0
  96. zeromodels/models/deepseek_v4/deepseek_v4_tokenizer.py +55 -0
  97. zeromodels/models/deepseek_vl/__init__.py +27 -0
  98. zeromodels/models/deepseek_vl/convert_deepseek_vl_hf_to_keras.py +166 -0
  99. zeromodels/models/deepseek_vl/deepseek_vl_config.py +123 -0
  100. zeromodels/models/deepseek_vl/deepseek_vl_image_processor.py +104 -0
  101. zeromodels/models/deepseek_vl/deepseek_vl_layers.py +429 -0
  102. zeromodels/models/deepseek_vl/deepseek_vl_model.py +547 -0
  103. zeromodels/models/deepseek_vl/deepseek_vl_processor.py +157 -0
  104. zeromodels/models/deepseek_vl/deepseek_vl_tokenizer.py +78 -0
  105. zeromodels/models/deepseek_vl_hybrid/__init__.py +31 -0
  106. zeromodels/models/deepseek_vl_hybrid/convert_deepseek_vl_hybrid_hf_to_keras.py +218 -0
  107. zeromodels/models/deepseek_vl_hybrid/deepseek_vl_hybrid_config.py +179 -0
  108. zeromodels/models/deepseek_vl_hybrid/deepseek_vl_hybrid_image_processor.py +132 -0
  109. zeromodels/models/deepseek_vl_hybrid/deepseek_vl_hybrid_layers.py +276 -0
  110. zeromodels/models/deepseek_vl_hybrid/deepseek_vl_hybrid_model.py +585 -0
  111. zeromodels/models/deepseek_vl_hybrid/deepseek_vl_hybrid_processor.py +84 -0
  112. zeromodels/models/deepseek_vl_hybrid/deepseek_vl_hybrid_tokenizer.py +17 -0
  113. zeromodels/models/deit/__init__.py +4 -0
  114. zeromodels/models/deit/convert_deit_timm_to_keras.py +396 -0
  115. zeromodels/models/deit/deit_config.py +54 -0
  116. zeromodels/models/deit/deit_model.py +293 -0
  117. zeromodels/models/densenet/__init__.py +7 -0
  118. zeromodels/models/densenet/convert_densenet_timm_to_keras.py +162 -0
  119. zeromodels/models/densenet/densenet_config.py +41 -0
  120. zeromodels/models/densenet/densenet_model.py +499 -0
  121. zeromodels/models/depth_anything_v1/__init__.py +13 -0
  122. zeromodels/models/depth_anything_v1/convert_depth_anything_v1_hf_to_keras.py +169 -0
  123. zeromodels/models/depth_anything_v1/depth_anything_v1_config.py +59 -0
  124. zeromodels/models/depth_anything_v1/depth_anything_v1_image_processor.py +154 -0
  125. zeromodels/models/depth_anything_v1/depth_anything_v1_model.py +974 -0
  126. zeromodels/models/depth_anything_v2/__init__.py +13 -0
  127. zeromodels/models/depth_anything_v2/convert_depth_anything_v2_hf_to_keras.py +140 -0
  128. zeromodels/models/depth_anything_v2/depth_anything_v2_config.py +27 -0
  129. zeromodels/models/depth_anything_v2/depth_anything_v2_image_processor.py +154 -0
  130. zeromodels/models/depth_anything_v2/depth_anything_v2_model.py +73 -0
  131. zeromodels/models/detr/__init__.py +12 -0
  132. zeromodels/models/detr/convert_detr_hf_to_keras.py +465 -0
  133. zeromodels/models/detr/detr_config.py +113 -0
  134. zeromodels/models/detr/detr_image_processor.py +159 -0
  135. zeromodels/models/detr/detr_layers.py +600 -0
  136. zeromodels/models/detr/detr_model.py +912 -0
  137. zeromodels/models/dfine/__init__.py +10 -0
  138. zeromodels/models/dfine/convert_dfine_hf_to_keras.py +596 -0
  139. zeromodels/models/dfine/dfine_config.py +90 -0
  140. zeromodels/models/dfine/dfine_image_processor.py +230 -0
  141. zeromodels/models/dfine/dfine_layers.py +727 -0
  142. zeromodels/models/dfine/dfine_model.py +1987 -0
  143. zeromodels/models/dino/__init__.py +11 -0
  144. zeromodels/models/dino/convert_dino_torch_to_keras.py +231 -0
  145. zeromodels/models/dino/dino_config.py +107 -0
  146. zeromodels/models/dino/dino_image_processor.py +196 -0
  147. zeromodels/models/dino/dino_model.py +284 -0
  148. zeromodels/models/dino_v2/__init__.py +9 -0
  149. zeromodels/models/dino_v2/convert_dino_v2_hf_to_keras.py +258 -0
  150. zeromodels/models/dino_v2/dino_v2_config.py +69 -0
  151. zeromodels/models/dino_v2/dino_v2_image_processor.py +166 -0
  152. zeromodels/models/dino_v2/dino_v2_model.py +193 -0
  153. zeromodels/models/dino_v3/__init__.py +11 -0
  154. zeromodels/models/dino_v3/convert_dino_v3_hf_to_keras.py +329 -0
  155. zeromodels/models/dino_v3/dino_v3_config.py +126 -0
  156. zeromodels/models/dino_v3/dino_v3_image_processor.py +116 -0
  157. zeromodels/models/dino_v3/dino_v3_layers.py +286 -0
  158. zeromodels/models/dino_v3/dino_v3_model.py +574 -0
  159. zeromodels/models/efficientformer/__init__.py +13 -0
  160. zeromodels/models/efficientformer/convert_efficientformer_timm_to_keras.py +201 -0
  161. zeromodels/models/efficientformer/efficientformer_config.py +44 -0
  162. zeromodels/models/efficientformer/efficientformer_layers.py +255 -0
  163. zeromodels/models/efficientformer/efficientformer_model.py +723 -0
  164. zeromodels/models/efficientnet/__init__.py +11 -0
  165. zeromodels/models/efficientnet/convert_efficientnet_timm_to_keras.py +350 -0
  166. zeromodels/models/efficientnet/efficientnet_config.py +47 -0
  167. zeromodels/models/efficientnet/efficientnet_model.py +654 -0
  168. zeromodels/models/efficientnet_lite/__init__.py +13 -0
  169. zeromodels/models/efficientnet_lite/convert_efficientnet_lite_timm_to_keras.py +180 -0
  170. zeromodels/models/efficientnet_lite/efficientnet_lite_config.py +47 -0
  171. zeromodels/models/efficientnet_lite/efficientnet_lite_model.py +634 -0
  172. zeromodels/models/efficientnetv2/__init__.py +13 -0
  173. zeromodels/models/efficientnetv2/convert_efficientnetv2_timm_to_keras.py +300 -0
  174. zeromodels/models/efficientnetv2/efficientnetv2_config.py +50 -0
  175. zeromodels/models/efficientnetv2/efficientnetv2_model.py +1122 -0
  176. zeromodels/models/electra/__init__.py +21 -0
  177. zeromodels/models/electra/convert_electra_hf_to_keras.py +187 -0
  178. zeromodels/models/electra/electra_config.py +61 -0
  179. zeromodels/models/electra/electra_layers.py +209 -0
  180. zeromodels/models/electra/electra_model.py +927 -0
  181. zeromodels/models/electra/electra_tokenizer.py +108 -0
  182. zeromodels/models/eomt/__init__.py +10 -0
  183. zeromodels/models/eomt/convert_eomt_hf_to_keras.py +204 -0
  184. zeromodels/models/eomt/eomt_config.py +79 -0
  185. zeromodels/models/eomt/eomt_image_processor.py +452 -0
  186. zeromodels/models/eomt/eomt_layers.py +450 -0
  187. zeromodels/models/eomt/eomt_model.py +709 -0
  188. zeromodels/models/flexivit/__init__.py +7 -0
  189. zeromodels/models/flexivit/convert_flexivit_timm_to_keras.py +139 -0
  190. zeromodels/models/flexivit/flexivit_config.py +47 -0
  191. zeromodels/models/flexivit/flexivit_model.py +305 -0
  192. zeromodels/models/gemma/__init__.py +5 -0
  193. zeromodels/models/gemma/convert_gemma_hf_to_keras.py +35 -0
  194. zeromodels/models/gemma/gemma_config.py +56 -0
  195. zeromodels/models/gemma/gemma_layers.py +318 -0
  196. zeromodels/models/gemma/gemma_model.py +311 -0
  197. zeromodels/models/gemma/gemma_tokenizer.py +72 -0
  198. zeromodels/models/gemma2/__init__.py +5 -0
  199. zeromodels/models/gemma2/convert_gemma2_hf_to_keras.py +37 -0
  200. zeromodels/models/gemma2/gemma2_config.py +68 -0
  201. zeromodels/models/gemma2/gemma2_layers.py +360 -0
  202. zeromodels/models/gemma2/gemma2_model.py +379 -0
  203. zeromodels/models/gemma2/gemma2_tokenizer.py +72 -0
  204. zeromodels/models/gemma3/__init__.py +29 -0
  205. zeromodels/models/gemma3/convert_gemma3_hf_to_keras.py +100 -0
  206. zeromodels/models/gemma3/gemma3_config.py +139 -0
  207. zeromodels/models/gemma3/gemma3_image_processor.py +75 -0
  208. zeromodels/models/gemma3/gemma3_layers.py +451 -0
  209. zeromodels/models/gemma3/gemma3_model.py +761 -0
  210. zeromodels/models/gemma3/gemma3_processor.py +129 -0
  211. zeromodels/models/gemma3/gemma3_tokenizer.py +86 -0
  212. zeromodels/models/gemma3n/__init__.py +39 -0
  213. zeromodels/models/gemma3n/convert_gemma3n_hf_to_keras.py +177 -0
  214. zeromodels/models/gemma3n/gemma3n_audio_feature_extractor.py +197 -0
  215. zeromodels/models/gemma3n/gemma3n_config.py +278 -0
  216. zeromodels/models/gemma3n/gemma3n_image_processor.py +85 -0
  217. zeromodels/models/gemma3n/gemma3n_layers.py +1694 -0
  218. zeromodels/models/gemma3n/gemma3n_model.py +1563 -0
  219. zeromodels/models/gemma3n/gemma3n_processor.py +206 -0
  220. zeromodels/models/gemma3n/gemma3n_tokenizer.py +99 -0
  221. zeromodels/models/gemma4/__init__.py +39 -0
  222. zeromodels/models/gemma4/convert_gemma4_hf_to_keras.py +101 -0
  223. zeromodels/models/gemma4/gemma4_audio_feature_extractor.py +235 -0
  224. zeromodels/models/gemma4/gemma4_config.py +268 -0
  225. zeromodels/models/gemma4/gemma4_image_processor.py +183 -0
  226. zeromodels/models/gemma4/gemma4_layers.py +1399 -0
  227. zeromodels/models/gemma4/gemma4_model.py +1640 -0
  228. zeromodels/models/gemma4/gemma4_processor.py +212 -0
  229. zeromodels/models/gemma4/gemma4_tokenizer.py +103 -0
  230. zeromodels/models/gemma4_unified/__init__.py +39 -0
  231. zeromodels/models/gemma4_unified/convert_gemma4_unified_hf_to_keras.py +57 -0
  232. zeromodels/models/gemma4_unified/gemma4_unified_audio_feature_extractor.py +95 -0
  233. zeromodels/models/gemma4_unified/gemma4_unified_config.py +110 -0
  234. zeromodels/models/gemma4_unified/gemma4_unified_image_processor.py +183 -0
  235. zeromodels/models/gemma4_unified/gemma4_unified_layers.py +91 -0
  236. zeromodels/models/gemma4_unified/gemma4_unified_model.py +585 -0
  237. zeromodels/models/gemma4_unified/gemma4_unified_processor.py +197 -0
  238. zeromodels/models/gemma4_unified/gemma4_unified_tokenizer.py +14 -0
  239. zeromodels/models/glm/__init__.py +10 -0
  240. zeromodels/models/glm/convert_glm_hf_to_keras.py +34 -0
  241. zeromodels/models/glm/glm_config.py +38 -0
  242. zeromodels/models/glm/glm_layers.py +312 -0
  243. zeromodels/models/glm/glm_model.py +286 -0
  244. zeromodels/models/glm/glm_tokenizer.py +48 -0
  245. zeromodels/models/glm4/__init__.py +10 -0
  246. zeromodels/models/glm4/convert_glm4_hf_to_keras.py +32 -0
  247. zeromodels/models/glm4/glm4_config.py +41 -0
  248. zeromodels/models/glm4/glm4_layers.py +310 -0
  249. zeromodels/models/glm4/glm4_model.py +287 -0
  250. zeromodels/models/glm4/glm4_tokenizer.py +48 -0
  251. zeromodels/models/glm4_moe/__init__.py +13 -0
  252. zeromodels/models/glm4_moe/convert_glm4_moe_hf_to_keras.py +133 -0
  253. zeromodels/models/glm4_moe/glm4_moe_config.py +59 -0
  254. zeromodels/models/glm4_moe/glm4_moe_layers.py +540 -0
  255. zeromodels/models/glm4_moe/glm4_moe_model.py +338 -0
  256. zeromodels/models/glm4_moe/glm4_moe_tokenizer.py +48 -0
  257. zeromodels/models/glm4_moe_lite/__init__.py +15 -0
  258. zeromodels/models/glm4_moe_lite/convert_glm4_moe_lite_hf_to_keras.py +128 -0
  259. zeromodels/models/glm4_moe_lite/glm4_moe_lite_config.py +55 -0
  260. zeromodels/models/glm4_moe_lite/glm4_moe_lite_layers.py +582 -0
  261. zeromodels/models/glm4_moe_lite/glm4_moe_lite_model.py +426 -0
  262. zeromodels/models/glm4_moe_lite/glm4_moe_lite_tokenizer.py +16 -0
  263. zeromodels/models/glm4v/__init__.py +21 -0
  264. zeromodels/models/glm4v/convert_glm4v_hf_to_keras.py +87 -0
  265. zeromodels/models/glm4v/glm4v_config.py +62 -0
  266. zeromodels/models/glm4v/glm4v_image_processor.py +103 -0
  267. zeromodels/models/glm4v/glm4v_model.py +658 -0
  268. zeromodels/models/glm4v/glm4v_processor.py +167 -0
  269. zeromodels/models/glm4v/glm4v_tokenizer.py +50 -0
  270. zeromodels/models/glm4v/glm4v_vision_layers.py +446 -0
  271. zeromodels/models/glm4v_moe/__init__.py +17 -0
  272. zeromodels/models/glm4v_moe/convert_glm4v_moe_hf_to_keras.py +175 -0
  273. zeromodels/models/glm4v_moe/glm4v_moe_config.py +80 -0
  274. zeromodels/models/glm4v_moe/glm4v_moe_model.py +727 -0
  275. zeromodels/models/glm4v_moe/glm4v_moe_processor.py +166 -0
  276. zeromodels/models/glm4v_moe/glm4v_moe_tokenizer.py +48 -0
  277. zeromodels/models/glm5_moe/__init__.py +11 -0
  278. zeromodels/models/glm5_moe/convert_glm5_moe_hf_to_keras.py +144 -0
  279. zeromodels/models/glm5_moe/glm5_moe_config.py +57 -0
  280. zeromodels/models/glm5_moe/glm5_moe_layers.py +629 -0
  281. zeromodels/models/glm5_moe/glm5_moe_model.py +371 -0
  282. zeromodels/models/glm5_moe/glm5_moe_tokenizer.py +48 -0
  283. zeromodels/models/gpt/__init__.py +5 -0
  284. zeromodels/models/gpt/convert_gpt_hf_to_keras.py +102 -0
  285. zeromodels/models/gpt/gpt_config.py +51 -0
  286. zeromodels/models/gpt/gpt_layers.py +161 -0
  287. zeromodels/models/gpt/gpt_model.py +218 -0
  288. zeromodels/models/gpt/gpt_tokenizer.py +79 -0
  289. zeromodels/models/gpt2/__init__.py +5 -0
  290. zeromodels/models/gpt2/convert_gpt2_hf_to_keras.py +148 -0
  291. zeromodels/models/gpt2/gpt2_config.py +51 -0
  292. zeromodels/models/gpt2/gpt2_layers.py +166 -0
  293. zeromodels/models/gpt2/gpt2_model.py +221 -0
  294. zeromodels/models/gpt2/gpt2_tokenizer.py +80 -0
  295. zeromodels/models/gpt_oss/__init__.py +5 -0
  296. zeromodels/models/gpt_oss/convert_gpt_oss_hf_to_keras.py +101 -0
  297. zeromodels/models/gpt_oss/gpt_oss_config.py +87 -0
  298. zeromodels/models/gpt_oss/gpt_oss_layers.py +455 -0
  299. zeromodels/models/gpt_oss/gpt_oss_model.py +446 -0
  300. zeromodels/models/gpt_oss/gpt_oss_tokenizer.py +108 -0
  301. zeromodels/models/granite_speech/__init__.py +31 -0
  302. zeromodels/models/granite_speech/convert_granite_speech_hf_to_keras.py +195 -0
  303. zeromodels/models/granite_speech/granite_speech_config.py +198 -0
  304. zeromodels/models/granite_speech/granite_speech_feature_extractor.py +158 -0
  305. zeromodels/models/granite_speech/granite_speech_layers.py +1079 -0
  306. zeromodels/models/granite_speech/granite_speech_model.py +771 -0
  307. zeromodels/models/granite_speech/granite_speech_processor.py +109 -0
  308. zeromodels/models/granite_speech/granite_speech_tokenizer.py +83 -0
  309. zeromodels/models/granite_speech_plus/__init__.py +23 -0
  310. zeromodels/models/granite_speech_plus/convert_granite_speech_plus_hf_to_keras.py +75 -0
  311. zeromodels/models/granite_speech_plus/granite_speech_plus_config.py +26 -0
  312. zeromodels/models/granite_speech_plus/granite_speech_plus_model.py +44 -0
  313. zeromodels/models/granite_speech_plus/granite_speech_plus_processor.py +16 -0
  314. zeromodels/models/granite_speech_plus/granite_speech_plus_tokenizer.py +18 -0
  315. zeromodels/models/grounding_dino/__init__.py +31 -0
  316. zeromodels/models/grounding_dino/convert_grounding_dino_hf_to_keras.py +381 -0
  317. zeromodels/models/grounding_dino/grounding_dino_config.py +112 -0
  318. zeromodels/models/grounding_dino/grounding_dino_image_processor.py +85 -0
  319. zeromodels/models/grounding_dino/grounding_dino_layers.py +770 -0
  320. zeromodels/models/grounding_dino/grounding_dino_model.py +746 -0
  321. zeromodels/models/grounding_dino/grounding_dino_processor.py +156 -0
  322. zeromodels/models/grounding_dino/grounding_dino_swin.py +396 -0
  323. zeromodels/models/grounding_dino/grounding_dino_text.py +152 -0
  324. zeromodels/models/grounding_dino/grounding_dino_tokenizer.py +70 -0
  325. zeromodels/models/inception_next/__init__.py +13 -0
  326. zeromodels/models/inception_next/convert_inception_next_timm_to_keras.py +190 -0
  327. zeromodels/models/inception_next/inception_next_config.py +50 -0
  328. zeromodels/models/inception_next/inception_next_model.py +576 -0
  329. zeromodels/models/inception_resnetv2/__init__.py +13 -0
  330. zeromodels/models/inception_resnetv2/convert_inceptionresnetv2_timm_to_keras.py +174 -0
  331. zeromodels/models/inception_resnetv2/inception_resnetv2_config.py +35 -0
  332. zeromodels/models/inception_resnetv2/inceptionresnetv2_model.py +657 -0
  333. zeromodels/models/inceptionv3/__init__.py +11 -0
  334. zeromodels/models/inceptionv3/convert_inceptionv3_timm_to_keras.py +134 -0
  335. zeromodels/models/inceptionv3/inceptionv3_config.py +35 -0
  336. zeromodels/models/inceptionv3/inceptionv3_model.py +682 -0
  337. zeromodels/models/inceptionv4/__init__.py +11 -0
  338. zeromodels/models/inceptionv4/convert_inceptionv4_timm_to_keras.py +141 -0
  339. zeromodels/models/inceptionv4/inceptionv4_config.py +34 -0
  340. zeromodels/models/inceptionv4/inceptionv4_model.py +848 -0
  341. zeromodels/models/internvl/__init__.py +29 -0
  342. zeromodels/models/internvl/convert_internvl_hf_to_keras.py +163 -0
  343. zeromodels/models/internvl/internvl_config.py +119 -0
  344. zeromodels/models/internvl/internvl_image_processor.py +157 -0
  345. zeromodels/models/internvl/internvl_layers.py +749 -0
  346. zeromodels/models/internvl/internvl_model.py +865 -0
  347. zeromodels/models/internvl/internvl_processor.py +166 -0
  348. zeromodels/models/internvl/internvl_tokenizer.py +56 -0
  349. zeromodels/models/janus/__init__.py +25 -0
  350. zeromodels/models/janus/convert_janus_hf_to_keras.py +173 -0
  351. zeromodels/models/janus/janus_config.py +120 -0
  352. zeromodels/models/janus/janus_image_processor.py +104 -0
  353. zeromodels/models/janus/janus_layers.py +427 -0
  354. zeromodels/models/janus/janus_model.py +507 -0
  355. zeromodels/models/janus/janus_processor.py +165 -0
  356. zeromodels/models/janus/janus_tokenizer.py +80 -0
  357. zeromodels/models/kimi_k25/__init__.py +29 -0
  358. zeromodels/models/kimi_k25/convert_kimi_k25_hf_to_keras.py +255 -0
  359. zeromodels/models/kimi_k25/kimi_k25_config.py +87 -0
  360. zeromodels/models/kimi_k25/kimi_k25_image_processor.py +154 -0
  361. zeromodels/models/kimi_k25/kimi_k25_layers.py +46 -0
  362. zeromodels/models/kimi_k25/kimi_k25_model.py +592 -0
  363. zeromodels/models/kimi_k25/kimi_k25_processor.py +81 -0
  364. zeromodels/models/kimi_k25/kimi_k25_tokenizer.py +151 -0
  365. zeromodels/models/kimi_k25/kimi_k25_vision.py +311 -0
  366. zeromodels/models/llama/__init__.py +4 -0
  367. zeromodels/models/llama/convert_llama_hf_to_keras.py +35 -0
  368. zeromodels/models/llama/llama_config.py +239 -0
  369. zeromodels/models/llama/llama_layers.py +340 -0
  370. zeromodels/models/llama/llama_model.py +396 -0
  371. zeromodels/models/llama/llama_tokenizer.py +68 -0
  372. zeromodels/models/llama2/__init__.py +4 -0
  373. zeromodels/models/llama2/convert_llama2_hf_to_keras.py +35 -0
  374. zeromodels/models/llama2/llama2_config.py +175 -0
  375. zeromodels/models/llama2/llama2_layers.py +339 -0
  376. zeromodels/models/llama2/llama2_model.py +303 -0
  377. zeromodels/models/llama2/llama2_tokenizer.py +82 -0
  378. zeromodels/models/llama4/__init__.py +4 -0
  379. zeromodels/models/llama4/convert_llama4_hf_to_keras.py +57 -0
  380. zeromodels/models/llama4/llama4_config.py +129 -0
  381. zeromodels/models/llama4/llama4_layers.py +581 -0
  382. zeromodels/models/llama4/llama4_model.py +559 -0
  383. zeromodels/models/llama4/llama4_tokenizer.py +67 -0
  384. zeromodels/models/locateanything/__init__.py +37 -0
  385. zeromodels/models/locateanything/convert_locateanything_hf_to_keras.py +160 -0
  386. zeromodels/models/locateanything/locateanything_config.py +134 -0
  387. zeromodels/models/locateanything/locateanything_generation.py +384 -0
  388. zeromodels/models/locateanything/locateanything_image_processor.py +85 -0
  389. zeromodels/models/locateanything/locateanything_model.py +502 -0
  390. zeromodels/models/locateanything/locateanything_processor.py +225 -0
  391. zeromodels/models/locateanything/locateanything_tokenizer.py +168 -0
  392. zeromodels/models/locateanything/locateanything_vision.py +307 -0
  393. zeromodels/models/mask2former/__init__.py +10 -0
  394. zeromodels/models/mask2former/convert_mask2former_hf_to_keras.py +438 -0
  395. zeromodels/models/mask2former/mask2former_config.py +74 -0
  396. zeromodels/models/mask2former/mask2former_image_processor.py +130 -0
  397. zeromodels/models/mask2former/mask2former_layers.py +573 -0
  398. zeromodels/models/mask2former/mask2former_model.py +684 -0
  399. zeromodels/models/mask2former/mask2former_swin_layers.py +576 -0
  400. zeromodels/models/maskformer/__init__.py +16 -0
  401. zeromodels/models/maskformer/convert_maskformer_hf_to_keras.py +339 -0
  402. zeromodels/models/maskformer/maskformer_config.py +71 -0
  403. zeromodels/models/maskformer/maskformer_image_processor.py +353 -0
  404. zeromodels/models/maskformer/maskformer_layers.py +236 -0
  405. zeromodels/models/maskformer/maskformer_model.py +716 -0
  406. zeromodels/models/maskformer/maskformer_swin_layers.py +572 -0
  407. zeromodels/models/maxvit/__init__.py +4 -0
  408. zeromodels/models/maxvit/convert_maxvit_timm_to_keras.py +385 -0
  409. zeromodels/models/maxvit/maxvit_config.py +47 -0
  410. zeromodels/models/maxvit/maxvit_layers.py +503 -0
  411. zeromodels/models/maxvit/maxvit_model.py +725 -0
  412. zeromodels/models/metaclip2/__init__.py +35 -0
  413. zeromodels/models/metaclip2/convert_metaclip2_hf_to_keras.py +350 -0
  414. zeromodels/models/metaclip2/metaclip2_config.py +120 -0
  415. zeromodels/models/metaclip2/metaclip2_image_processor.py +85 -0
  416. zeromodels/models/metaclip2/metaclip2_model.py +1063 -0
  417. zeromodels/models/metaclip2/metaclip2_mt5_tokenizer.py +138 -0
  418. zeromodels/models/metaclip2/metaclip2_processor.py +116 -0
  419. zeromodels/models/metaclip2/metaclip2_tokenizer.py +110 -0
  420. zeromodels/models/minimax/__init__.py +8 -0
  421. zeromodels/models/minimax/convert_minimax_hf_to_keras.py +96 -0
  422. zeromodels/models/minimax/minimax_config.py +35 -0
  423. zeromodels/models/minimax/minimax_layers.py +594 -0
  424. zeromodels/models/minimax/minimax_model.py +392 -0
  425. zeromodels/models/minimax/minimax_tokenizer.py +68 -0
  426. zeromodels/models/minimax_m2/__init__.py +11 -0
  427. zeromodels/models/minimax_m2/convert_minimax_m2_hf_to_keras.py +118 -0
  428. zeromodels/models/minimax_m2/minimax_m2_config.py +24 -0
  429. zeromodels/models/minimax_m2/minimax_m2_layers.py +380 -0
  430. zeromodels/models/minimax_m2/minimax_m2_model.py +294 -0
  431. zeromodels/models/minimax_m2/minimax_m2_tokenizer.py +50 -0
  432. zeromodels/models/minimax_m3_vl/__init__.py +21 -0
  433. zeromodels/models/minimax_m3_vl/convert_minimax_m3_vl_hf_to_keras.py +205 -0
  434. zeromodels/models/minimax_m3_vl/minimax_m3_vl_config.py +51 -0
  435. zeromodels/models/minimax_m3_vl/minimax_m3_vl_image_processor.py +138 -0
  436. zeromodels/models/minimax_m3_vl/minimax_m3_vl_layers.py +776 -0
  437. zeromodels/models/minimax_m3_vl/minimax_m3_vl_model.py +825 -0
  438. zeromodels/models/minimax_m3_vl/minimax_m3_vl_processor.py +234 -0
  439. zeromodels/models/mistral/__init__.py +4 -0
  440. zeromodels/models/mistral/convert_mistral_hf_to_keras.py +35 -0
  441. zeromodels/models/mistral/mistral_config.py +167 -0
  442. zeromodels/models/mistral/mistral_layers.py +333 -0
  443. zeromodels/models/mistral/mistral_model.py +322 -0
  444. zeromodels/models/mistral/mistral_tokenizer.py +72 -0
  445. zeromodels/models/mistral3/__init__.py +21 -0
  446. zeromodels/models/mistral3/convert_mistral3_hf_to_keras.py +98 -0
  447. zeromodels/models/mistral3/mistral3_config.py +59 -0
  448. zeromodels/models/mistral3/mistral3_image_processor.py +108 -0
  449. zeromodels/models/mistral3/mistral3_layers.py +525 -0
  450. zeromodels/models/mistral3/mistral3_model.py +786 -0
  451. zeromodels/models/mistral3/mistral3_processor.py +181 -0
  452. zeromodels/models/mistral3/mistral3_tokenizer.py +58 -0
  453. zeromodels/models/mit/__init__.py +4 -0
  454. zeromodels/models/mit/convert_mit_hf_to_keras.py +169 -0
  455. zeromodels/models/mit/mit_config.py +63 -0
  456. zeromodels/models/mit/mit_layers.py +259 -0
  457. zeromodels/models/mit/mit_model.py +566 -0
  458. zeromodels/models/mixtral/__init__.py +4 -0
  459. zeromodels/models/mixtral/convert_mixtral_hf_to_keras.py +118 -0
  460. zeromodels/models/mixtral/mixtral_config.py +85 -0
  461. zeromodels/models/mixtral/mixtral_layers.py +428 -0
  462. zeromodels/models/mixtral/mixtral_model.py +317 -0
  463. zeromodels/models/mixtral/mixtral_tokenizer.py +68 -0
  464. zeromodels/models/mlp_mixer/__init__.py +7 -0
  465. zeromodels/models/mlp_mixer/convert_mlpmixer_timm_to_keras.py +165 -0
  466. zeromodels/models/mlp_mixer/mlp_mixer_config.py +44 -0
  467. zeromodels/models/mlp_mixer/mlp_mixer_model.py +480 -0
  468. zeromodels/models/mobilenetv2/__init__.py +11 -0
  469. zeromodels/models/mobilenetv2/convert_mobilenetv2_timm_to_keras.py +180 -0
  470. zeromodels/models/mobilenetv2/mobilenetv2_config.py +45 -0
  471. zeromodels/models/mobilenetv2/mobilenetv2_model.py +539 -0
  472. zeromodels/models/mobilenetv3/__init__.py +11 -0
  473. zeromodels/models/mobilenetv3/convert_mobilenetv3_timm_to_keras.py +273 -0
  474. zeromodels/models/mobilenetv3/mobilenetv3_config.py +69 -0
  475. zeromodels/models/mobilenetv3/mobilenetv3_model.py +814 -0
  476. zeromodels/models/mobilenetv4/__init__.py +11 -0
  477. zeromodels/models/mobilenetv4/convert_mobilenetv4_timm_to_keras.py +148 -0
  478. zeromodels/models/mobilenetv4/mobilenetv4_config.py +43 -0
  479. zeromodels/models/mobilenetv4/mobilenetv4_layers.py +456 -0
  480. zeromodels/models/mobilenetv4/mobilenetv4_model.py +642 -0
  481. zeromodels/models/mobilevit/__init__.py +17 -0
  482. zeromodels/models/mobilevit/convert_mobilevit_hf_to_keras.py +267 -0
  483. zeromodels/models/mobilevit/convert_mobilevit_timm_to_keras.py +187 -0
  484. zeromodels/models/mobilevit/mobilevit_config.py +71 -0
  485. zeromodels/models/mobilevit/mobilevit_image_processor.py +237 -0
  486. zeromodels/models/mobilevit/mobilevit_layers.py +454 -0
  487. zeromodels/models/mobilevit/mobilevit_model.py +1030 -0
  488. zeromodels/models/mobilevitv2/__init__.py +17 -0
  489. zeromodels/models/mobilevitv2/convert_mobilevitv2_hf_to_keras.py +243 -0
  490. zeromodels/models/mobilevitv2/convert_mobilevitv2_timm_to_keras.py +197 -0
  491. zeromodels/models/mobilevitv2/mobilevitv2_config.py +58 -0
  492. zeromodels/models/mobilevitv2/mobilevitv2_image_processor.py +23 -0
  493. zeromodels/models/mobilevitv2/mobilevitv2_model.py +852 -0
  494. zeromodels/models/modernbert/__init__.py +21 -0
  495. zeromodels/models/modernbert/convert_modernbert_hf_to_keras.py +150 -0
  496. zeromodels/models/modernbert/modernbert_config.py +67 -0
  497. zeromodels/models/modernbert/modernbert_layers.py +260 -0
  498. zeromodels/models/modernbert/modernbert_model.py +1112 -0
  499. zeromodels/models/modernbert/modernbert_tokenizer.py +108 -0
  500. zeromodels/models/moonshine/__init__.py +20 -0
  501. zeromodels/models/moonshine/convert_moonshine_hf_to_keras.py +253 -0
  502. zeromodels/models/moonshine/moonshine_config.py +124 -0
  503. zeromodels/models/moonshine/moonshine_feature_extractor.py +62 -0
  504. zeromodels/models/moonshine/moonshine_layers.py +262 -0
  505. zeromodels/models/moonshine/moonshine_model.py +642 -0
  506. zeromodels/models/moonshine/moonshine_processor.py +69 -0
  507. zeromodels/models/moonshine/moonshine_tokenizer.py +112 -0
  508. zeromodels/models/nextvit/__init__.py +4 -0
  509. zeromodels/models/nextvit/convert_nextvit_timm_to_keras.py +231 -0
  510. zeromodels/models/nextvit/nextvit_config.py +49 -0
  511. zeromodels/models/nextvit/nextvit_layers.py +121 -0
  512. zeromodels/models/nextvit/nextvit_model.py +867 -0
  513. zeromodels/models/oneformer/__init__.py +19 -0
  514. zeromodels/models/oneformer/convert_oneformer_hf_to_keras.py +342 -0
  515. zeromodels/models/oneformer/oneformer_config.py +80 -0
  516. zeromodels/models/oneformer/oneformer_layers.py +573 -0
  517. zeromodels/models/oneformer/oneformer_model.py +712 -0
  518. zeromodels/models/oneformer/oneformer_processor.py +208 -0
  519. zeromodels/models/oneformer/oneformer_swin_layers.py +576 -0
  520. zeromodels/models/oneformer/oneformer_tokenizer.py +72 -0
  521. zeromodels/models/owlv2/__init__.py +31 -0
  522. zeromodels/models/owlv2/convert_owlv2_hf_to_keras.py +411 -0
  523. zeromodels/models/owlv2/owlv2_config.py +107 -0
  524. zeromodels/models/owlv2/owlv2_image_processor.py +264 -0
  525. zeromodels/models/owlv2/owlv2_layers.py +341 -0
  526. zeromodels/models/owlv2/owlv2_model.py +988 -0
  527. zeromodels/models/owlv2/owlv2_processor.py +137 -0
  528. zeromodels/models/owlv2/owlv2_tokenizer.py +44 -0
  529. zeromodels/models/owlvit/__init__.py +31 -0
  530. zeromodels/models/owlvit/convert_owlvit_hf_to_keras.py +353 -0
  531. zeromodels/models/owlvit/owlvit_config.py +107 -0
  532. zeromodels/models/owlvit/owlvit_image_processor.py +176 -0
  533. zeromodels/models/owlvit/owlvit_layers.py +341 -0
  534. zeromodels/models/owlvit/owlvit_model.py +961 -0
  535. zeromodels/models/owlvit/owlvit_processor.py +132 -0
  536. zeromodels/models/owlvit/owlvit_tokenizer.py +44 -0
  537. zeromodels/models/pit/__init__.py +4 -0
  538. zeromodels/models/pit/convert_pit_timm_to_keras.py +267 -0
  539. zeromodels/models/pit/pit_config.py +53 -0
  540. zeromodels/models/pit/pit_model.py +613 -0
  541. zeromodels/models/poolformer/__init__.py +11 -0
  542. zeromodels/models/poolformer/convert_poolformer_timm_to_keras.py +173 -0
  543. zeromodels/models/poolformer/poolformer_config.py +44 -0
  544. zeromodels/models/poolformer/poolformer_model.py +596 -0
  545. zeromodels/models/qwen2/__init__.py +5 -0
  546. zeromodels/models/qwen2/convert_qwen2_hf_to_keras.py +67 -0
  547. zeromodels/models/qwen2/qwen2_config.py +55 -0
  548. zeromodels/models/qwen2/qwen2_layers.py +332 -0
  549. zeromodels/models/qwen2/qwen2_model.py +296 -0
  550. zeromodels/models/qwen2/qwen2_tokenizer.py +55 -0
  551. zeromodels/models/qwen2_5_vl/__init__.py +27 -0
  552. zeromodels/models/qwen2_5_vl/convert_qwen2_5_vl_hf_to_keras.py +7 -0
  553. zeromodels/models/qwen2_5_vl/qwen2_5_vl_config.py +156 -0
  554. zeromodels/models/qwen2_5_vl/qwen2_5_vl_layers.py +520 -0
  555. zeromodels/models/qwen2_5_vl/qwen2_5_vl_model.py +834 -0
  556. zeromodels/models/qwen2_moe/__init__.py +13 -0
  557. zeromodels/models/qwen2_moe/convert_qwen2_moe_hf_to_keras.py +91 -0
  558. zeromodels/models/qwen2_moe/qwen2_moe_config.py +78 -0
  559. zeromodels/models/qwen2_moe/qwen2_moe_layers.py +431 -0
  560. zeromodels/models/qwen2_moe/qwen2_moe_model.py +331 -0
  561. zeromodels/models/qwen2_moe/qwen2_moe_tokenizer.py +55 -0
  562. zeromodels/models/qwen2_vl/__init__.py +29 -0
  563. zeromodels/models/qwen2_vl/convert_qwen2_vl_hf_to_keras.py +134 -0
  564. zeromodels/models/qwen2_vl/qwen2_vl_config.py +144 -0
  565. zeromodels/models/qwen2_vl/qwen2_vl_image_processor.py +124 -0
  566. zeromodels/models/qwen2_vl/qwen2_vl_layers.py +497 -0
  567. zeromodels/models/qwen2_vl/qwen2_vl_model.py +1034 -0
  568. zeromodels/models/qwen2_vl/qwen2_vl_processor.py +184 -0
  569. zeromodels/models/qwen2_vl/qwen2_vl_tokenizer.py +59 -0
  570. zeromodels/models/qwen3/__init__.py +5 -0
  571. zeromodels/models/qwen3/convert_qwen3_hf_to_keras.py +37 -0
  572. zeromodels/models/qwen3/qwen3_config.py +43 -0
  573. zeromodels/models/qwen3/qwen3_layers.py +350 -0
  574. zeromodels/models/qwen3/qwen3_model.py +298 -0
  575. zeromodels/models/qwen3/qwen3_tokenizer.py +55 -0
  576. zeromodels/models/qwen3_5/__init__.py +28 -0
  577. zeromodels/models/qwen3_5/convert_qwen3_5_hf_to_keras.py +202 -0
  578. zeromodels/models/qwen3_5/qwen3_5_config.py +89 -0
  579. zeromodels/models/qwen3_5/qwen3_5_layers.py +636 -0
  580. zeromodels/models/qwen3_5/qwen3_5_model.py +388 -0
  581. zeromodels/models/qwen3_5/qwen3_5_processor.py +32 -0
  582. zeromodels/models/qwen3_5/qwen3_5_tokenizer.py +74 -0
  583. zeromodels/models/qwen3_5/qwen3_5_vl_model.py +795 -0
  584. zeromodels/models/qwen3_5_moe/__init__.py +25 -0
  585. zeromodels/models/qwen3_5_moe/convert_qwen3_5_moe_hf_to_keras.py +173 -0
  586. zeromodels/models/qwen3_5_moe/qwen3_5_moe_config.py +212 -0
  587. zeromodels/models/qwen3_5_moe/qwen3_5_moe_model.py +900 -0
  588. zeromodels/models/qwen3_5_moe/qwen3_5_moe_processor.py +32 -0
  589. zeromodels/models/qwen3_5_moe/qwen3_5_moe_tokenizer.py +16 -0
  590. zeromodels/models/qwen3_moe/__init__.py +13 -0
  591. zeromodels/models/qwen3_moe/convert_qwen3_moe_hf_to_keras.py +89 -0
  592. zeromodels/models/qwen3_moe/qwen3_moe_config.py +63 -0
  593. zeromodels/models/qwen3_moe/qwen3_moe_layers.py +438 -0
  594. zeromodels/models/qwen3_moe/qwen3_moe_model.py +322 -0
  595. zeromodels/models/qwen3_moe/qwen3_moe_tokenizer.py +55 -0
  596. zeromodels/models/qwen3_next/__init__.py +13 -0
  597. zeromodels/models/qwen3_next/convert_qwen3_next_hf_to_keras.py +132 -0
  598. zeromodels/models/qwen3_next/qwen3_next_config.py +85 -0
  599. zeromodels/models/qwen3_next/qwen3_next_layers.py +796 -0
  600. zeromodels/models/qwen3_next/qwen3_next_model.py +419 -0
  601. zeromodels/models/qwen3_next/qwen3_next_tokenizer.py +62 -0
  602. zeromodels/models/qwen3_vl/__init__.py +25 -0
  603. zeromodels/models/qwen3_vl/convert_qwen3_vl_hf_to_keras.py +77 -0
  604. zeromodels/models/qwen3_vl/qwen3_vl_config.py +170 -0
  605. zeromodels/models/qwen3_vl/qwen3_vl_layers.py +460 -0
  606. zeromodels/models/qwen3_vl/qwen3_vl_model.py +1002 -0
  607. zeromodels/models/qwen3_vl/qwen3_vl_processor.py +25 -0
  608. zeromodels/models/qwen3_vl_moe/__init__.py +25 -0
  609. zeromodels/models/qwen3_vl_moe/convert_qwen3_vl_moe_hf_to_keras.py +132 -0
  610. zeromodels/models/qwen3_vl_moe/qwen3_vl_moe_config.py +191 -0
  611. zeromodels/models/qwen3_vl_moe/qwen3_vl_moe_model.py +770 -0
  612. zeromodels/models/qwen3_vl_moe/qwen3_vl_moe_processor.py +17 -0
  613. zeromodels/models/qwen3_vl_moe/qwen3_vl_moe_tokenizer.py +18 -0
  614. zeromodels/models/res2net/__init__.py +4 -0
  615. zeromodels/models/res2net/convert_res2net_timm_to_keras.py +183 -0
  616. zeromodels/models/res2net/res2net_config.py +41 -0
  617. zeromodels/models/res2net/res2net_model.py +575 -0
  618. zeromodels/models/resmlp/__init__.py +4 -0
  619. zeromodels/models/resmlp/convert_resmlp_timm_to_keras.py +199 -0
  620. zeromodels/models/resmlp/resmlp_config.py +47 -0
  621. zeromodels/models/resmlp/resmlp_layers.py +94 -0
  622. zeromodels/models/resmlp/resmlp_model.py +473 -0
  623. zeromodels/models/resnet/__init__.py +4 -0
  624. zeromodels/models/resnet/convert_resnet_timm_to_keras.py +136 -0
  625. zeromodels/models/resnet/resnet_config.py +38 -0
  626. zeromodels/models/resnet/resnet_model.py +704 -0
  627. zeromodels/models/resnetv2/__init__.py +7 -0
  628. zeromodels/models/resnetv2/convert_resnetv2_timm_to_keras.py +248 -0
  629. zeromodels/models/resnetv2/resnetv2_config.py +46 -0
  630. zeromodels/models/resnetv2/resnetv2_layers.py +167 -0
  631. zeromodels/models/resnetv2/resnetv2_model.py +564 -0
  632. zeromodels/models/resnext/__init__.py +13 -0
  633. zeromodels/models/resnext/convert_resnext_timm_to_keras.py +146 -0
  634. zeromodels/models/resnext/resnext_config.py +41 -0
  635. zeromodels/models/resnext/resnext_model.py +321 -0
  636. zeromodels/models/rf_detr/__init__.py +12 -0
  637. zeromodels/models/rf_detr/convert_rf_detr_hf_to_keras.py +546 -0
  638. zeromodels/models/rf_detr/rf_detr_config.py +200 -0
  639. zeromodels/models/rf_detr/rf_detr_image_processor.py +389 -0
  640. zeromodels/models/rf_detr/rf_detr_layers.py +872 -0
  641. zeromodels/models/rf_detr/rf_detr_model.py +2030 -0
  642. zeromodels/models/roberta/__init__.py +21 -0
  643. zeromodels/models/roberta/convert_roberta_hf_to_keras.py +254 -0
  644. zeromodels/models/roberta/roberta_config.py +56 -0
  645. zeromodels/models/roberta/roberta_layers.py +220 -0
  646. zeromodels/models/roberta/roberta_model.py +1027 -0
  647. zeromodels/models/roberta/roberta_tokenizer.py +107 -0
  648. zeromodels/models/rt_detr/__init__.py +10 -0
  649. zeromodels/models/rt_detr/convert_rt_detr_hf_to_keras.py +466 -0
  650. zeromodels/models/rt_detr/rt_detr_config.py +96 -0
  651. zeromodels/models/rt_detr/rt_detr_image_processor.py +223 -0
  652. zeromodels/models/rt_detr/rt_detr_layers.py +543 -0
  653. zeromodels/models/rt_detr/rt_detr_model.py +1497 -0
  654. zeromodels/models/rt_detr_v2/__init__.py +10 -0
  655. zeromodels/models/rt_detr_v2/convert_rt_detr_v2_hf_to_keras.py +450 -0
  656. zeromodels/models/rt_detr_v2/rt_detr_v2_config.py +96 -0
  657. zeromodels/models/rt_detr_v2/rt_detr_v2_image_processor.py +223 -0
  658. zeromodels/models/rt_detr_v2/rt_detr_v2_layers.py +435 -0
  659. zeromodels/models/rt_detr_v2/rt_detr_v2_model.py +1594 -0
  660. zeromodels/models/sam/__init__.py +16 -0
  661. zeromodels/models/sam/convert_sam_hf_to_keras.py +371 -0
  662. zeromodels/models/sam/sam_config.py +54 -0
  663. zeromodels/models/sam/sam_image_processor.py +1079 -0
  664. zeromodels/models/sam/sam_layers.py +1355 -0
  665. zeromodels/models/sam/sam_model.py +702 -0
  666. zeromodels/models/sam2/__init__.py +16 -0
  667. zeromodels/models/sam2/convert_sam2_hf_to_keras.py +368 -0
  668. zeromodels/models/sam2/sam2_config.py +63 -0
  669. zeromodels/models/sam2/sam2_image_processor.py +527 -0
  670. zeromodels/models/sam2/sam2_layers.py +1627 -0
  671. zeromodels/models/sam2/sam2_model.py +956 -0
  672. zeromodels/models/sam3/__init__.py +35 -0
  673. zeromodels/models/sam3/convert_sam3_hf_to_keras.py +432 -0
  674. zeromodels/models/sam3/sam3_clip_tokenizer.py +86 -0
  675. zeromodels/models/sam3/sam3_config.py +112 -0
  676. zeromodels/models/sam3/sam3_image_processor.py +99 -0
  677. zeromodels/models/sam3/sam3_layers.py +1229 -0
  678. zeromodels/models/sam3/sam3_model.py +2142 -0
  679. zeromodels/models/sam3/sam3_processor.py +454 -0
  680. zeromodels/models/sam3/sam3_utils.py +381 -0
  681. zeromodels/models/segformer/__init__.py +10 -0
  682. zeromodels/models/segformer/convert_segformer_hf_to_keras.py +196 -0
  683. zeromodels/models/segformer/segformer_config.py +48 -0
  684. zeromodels/models/segformer/segformer_image_processor.py +250 -0
  685. zeromodels/models/segformer/segformer_model.py +349 -0
  686. zeromodels/models/senet/__init__.py +4 -0
  687. zeromodels/models/senet/convert_senet_timm_to_keras.py +106 -0
  688. zeromodels/models/senet/senet_config.py +48 -0
  689. zeromodels/models/senet/senet_model.py +229 -0
  690. zeromodels/models/siglip/__init__.py +29 -0
  691. zeromodels/models/siglip/convert_siglip_hf_to_keras.py +410 -0
  692. zeromodels/models/siglip/siglip_config.py +108 -0
  693. zeromodels/models/siglip/siglip_image_processor.py +248 -0
  694. zeromodels/models/siglip/siglip_layers.py +562 -0
  695. zeromodels/models/siglip/siglip_model.py +1354 -0
  696. zeromodels/models/siglip/siglip_processor.py +116 -0
  697. zeromodels/models/siglip/siglip_tokenizer.py +166 -0
  698. zeromodels/models/siglip2/__init__.py +29 -0
  699. zeromodels/models/siglip2/convert_siglip2_hf_to_keras.py +149 -0
  700. zeromodels/models/siglip2/siglip2_config.py +49 -0
  701. zeromodels/models/siglip2/siglip2_image_processor.py +37 -0
  702. zeromodels/models/siglip2/siglip2_model.py +349 -0
  703. zeromodels/models/siglip2/siglip2_processor.py +101 -0
  704. zeromodels/models/siglip2/siglip2_tokenizer.py +171 -0
  705. zeromodels/models/speech2text/__init__.py +20 -0
  706. zeromodels/models/speech2text/convert_speech2text_hf_to_keras.py +237 -0
  707. zeromodels/models/speech2text/speech2text_config.py +132 -0
  708. zeromodels/models/speech2text/speech2text_feature_extractor.py +175 -0
  709. zeromodels/models/speech2text/speech2text_layers.py +198 -0
  710. zeromodels/models/speech2text/speech2text_model.py +599 -0
  711. zeromodels/models/speech2text/speech2text_processor.py +85 -0
  712. zeromodels/models/speech2text/speech2text_tokenizer.py +193 -0
  713. zeromodels/models/swin/__init__.py +4 -0
  714. zeromodels/models/swin/convert_swin_timm_to_keras.py +296 -0
  715. zeromodels/models/swin/swin_config.py +47 -0
  716. zeromodels/models/swin/swin_layers.py +515 -0
  717. zeromodels/models/swin/swin_model.py +793 -0
  718. zeromodels/models/swinv2/__init__.py +4 -0
  719. zeromodels/models/swinv2/convert_swinv2_timm_to_keras.py +324 -0
  720. zeromodels/models/swinv2/swinv2_config.py +50 -0
  721. zeromodels/models/swinv2/swinv2_layers.py +671 -0
  722. zeromodels/models/swinv2/swinv2_model.py +811 -0
  723. zeromodels/models/t5/__init__.py +21 -0
  724. zeromodels/models/t5/convert_t5_hf_to_keras.py +220 -0
  725. zeromodels/models/t5/t5_config.py +77 -0
  726. zeromodels/models/t5/t5_layers.py +228 -0
  727. zeromodels/models/t5/t5_model.py +943 -0
  728. zeromodels/models/t5/t5_tokenizer.py +98 -0
  729. zeromodels/models/tipsv2/__init__.py +25 -0
  730. zeromodels/models/tipsv2/convert_tipsv2_hf_to_keras.py +137 -0
  731. zeromodels/models/tipsv2/tipsv2_config.py +158 -0
  732. zeromodels/models/tipsv2/tipsv2_image_processor.py +117 -0
  733. zeromodels/models/tipsv2/tipsv2_layers.py +202 -0
  734. zeromodels/models/tipsv2/tipsv2_model.py +594 -0
  735. zeromodels/models/tipsv2/tipsv2_processor.py +90 -0
  736. zeromodels/models/tipsv2/tipsv2_tokenizer.py +135 -0
  737. zeromodels/models/tipsv2_dpt/__init__.py +17 -0
  738. zeromodels/models/tipsv2_dpt/convert_tipsv2_dpt_hf_to_keras.py +87 -0
  739. zeromodels/models/tipsv2_dpt/tipsv2_dpt_config.py +89 -0
  740. zeromodels/models/tipsv2_dpt/tipsv2_dpt_image_processor.py +13 -0
  741. zeromodels/models/tipsv2_dpt/tipsv2_dpt_layers.py +148 -0
  742. zeromodels/models/tipsv2_dpt/tipsv2_dpt_model.py +543 -0
  743. zeromodels/models/vgg/__init__.py +4 -0
  744. zeromodels/models/vgg/convert_vgg_timm_to_keras.py +332 -0
  745. zeromodels/models/vgg/vgg_config.py +51 -0
  746. zeromodels/models/vgg/vgg_model.py +406 -0
  747. zeromodels/models/vit/__init__.py +4 -0
  748. zeromodels/models/vit/convert_vit_timm_to_keras.py +455 -0
  749. zeromodels/models/vit/vit_config.py +53 -0
  750. zeromodels/models/vit/vit_layers.py +604 -0
  751. zeromodels/models/vit/vit_model.py +628 -0
  752. zeromodels/models/whisper/__init__.py +25 -0
  753. zeromodels/models/whisper/convert_whisper_hf_to_keras.py +345 -0
  754. zeromodels/models/whisper/whisper_config.py +111 -0
  755. zeromodels/models/whisper/whisper_feature_extractor.py +150 -0
  756. zeromodels/models/whisper/whisper_layers.py +291 -0
  757. zeromodels/models/whisper/whisper_model.py +907 -0
  758. zeromodels/models/whisper/whisper_processor.py +120 -0
  759. zeromodels/models/whisper/whisper_tokenizer.py +115 -0
  760. zeromodels/models/xception/__init__.py +7 -0
  761. zeromodels/models/xception/convert_xception_timm_to_keras.py +201 -0
  762. zeromodels/models/xception/xception_config.py +41 -0
  763. zeromodels/models/xception/xception_model.py +741 -0
  764. zeromodels/models/xlm_roberta/__init__.py +21 -0
  765. zeromodels/models/xlm_roberta/convert_xlm_roberta_hf_to_keras.py +176 -0
  766. zeromodels/models/xlm_roberta/xlm_roberta_config.py +31 -0
  767. zeromodels/models/xlm_roberta/xlm_roberta_model.py +896 -0
  768. zeromodels/models/xlm_roberta/xlm_roberta_tokenizer.py +107 -0
  769. zeromodels/quantization/__init__.py +73 -0
  770. zeromodels/quantization/fp8_quantize.py +48 -0
  771. zeromodels/quantization/int4_quantize.py +111 -0
  772. zeromodels/quantization/int8_quantize.py +41 -0
  773. zeromodels/quantization/mxfp4_quantize.py +159 -0
  774. zeromodels/quantization/quant_config.py +212 -0
  775. zeromodels/quantization/quantize.py +513 -0
  776. zeromodels/quantization/quantized_layers.py +730 -0
  777. zeromodels/quantization/zm_quantizer.py +132 -0
  778. zeromodels/samplers/__init__.py +12 -0
  779. zeromodels/samplers/greedy_sampler.py +12 -0
  780. zeromodels/samplers/sampler.py +41 -0
  781. zeromodels/samplers/top_k_sampler.py +31 -0
  782. zeromodels/samplers/top_p_sampler.py +38 -0
  783. zeromodels/utils/__init__.py +22 -0
  784. zeromodels/utils/image_util.py +203 -0
  785. zeromodels/utils/labels_util.py +528 -0
  786. zeromodels/utils/video_util.py +426 -0
  787. zeromodels/utils/visualization_util.py +534 -0
  788. zeromodels/version.py +5 -0
  789. zeromodels-1.2.6.dist-info/METADATA +324 -0
  790. zeromodels-1.2.6.dist-info/RECORD +794 -0
  791. zeromodels-1.2.6.dist-info/WHEEL +5 -0
  792. zeromodels-1.2.6.dist-info/entry_points.txt +2 -0
  793. zeromodels-1.2.6.dist-info/licenses/LICENSE +201 -0
  794. zeromodels-1.2.6.dist-info/top_level.txt +1 -0
zeromodels/__init__.py ADDED
@@ -0,0 +1,13 @@
1
+ from zeromodels import conversion, models, samplers, utils
2
+ from zeromodels.version import version
3
+
4
+ __version__ = "1.2.6"
5
+
6
+ __all__ = [
7
+ "models",
8
+ "samplers",
9
+ "utils",
10
+ "conversion",
11
+ "version",
12
+ "__version__",
13
+ ]
@@ -0,0 +1,43 @@
1
+ from zeromodels.base.base_attention import fused_attention
2
+ from zeromodels.base.base_audio_feature_extractor import BaseAudioFeatureExtractor
3
+ from zeromodels.base.base_config import BaseConfig
4
+ from zeromodels.base.base_generation import BaseGeneration, TextOnlyGeneration
5
+ from zeromodels.base.base_generation_layers import (
6
+ CausalMask,
7
+ MediaMerge,
8
+ TiedHead,
9
+ merge_media,
10
+ )
11
+ from zeromodels.base.base_image_processor import BaseImageProcessor
12
+ from zeromodels.base.base_mixin import CheckpointSource, PreprocessorMixin
13
+ from zeromodels.base.base_model import BaseModel
14
+ from zeromodels.base.base_processor import BaseProcessor
15
+ from zeromodels.base.base_quantization import (
16
+ BaseQuantizer,
17
+ normalize_axes,
18
+ single_axis,
19
+ )
20
+ from zeromodels.base.base_seq2seq_generation import BaseSeq2SeqGeneration
21
+ from zeromodels.base.base_tokenizer import BaseTokenizer
22
+
23
+ __all__ = [
24
+ "fused_attention",
25
+ "BaseConfig",
26
+ "CheckpointSource",
27
+ "BaseModel",
28
+ "BaseGeneration",
29
+ "TextOnlyGeneration",
30
+ "CausalMask",
31
+ "TiedHead",
32
+ "MediaMerge",
33
+ "merge_media",
34
+ "BaseSeq2SeqGeneration",
35
+ "PreprocessorMixin",
36
+ "BaseTokenizer",
37
+ "BaseImageProcessor",
38
+ "BaseAudioFeatureExtractor",
39
+ "BaseProcessor",
40
+ "BaseQuantizer",
41
+ "normalize_axes",
42
+ "single_axis",
43
+ ]
@@ -0,0 +1,116 @@
1
+ import keras
2
+ from keras import ops
3
+
4
+ VALID_ATTN_IMPL = ("sdpa", "flash")
5
+ ATTN_IMPLEMENTATION = "sdpa"
6
+
7
+
8
+ def _fused_op_available():
9
+ backend = keras.config.backend()
10
+ if backend == "jax":
11
+ try:
12
+ from jax.nn import dot_product_attention # noqa: F401
13
+
14
+ return True
15
+ except ImportError:
16
+ return False
17
+ if backend == "torch":
18
+ try:
19
+ from torch.backends.cuda import can_use_flash_attention # noqa: F401
20
+
21
+ return True
22
+ except ImportError:
23
+ return False
24
+ return False
25
+
26
+
27
+ def fused_attention(
28
+ query,
29
+ key,
30
+ value,
31
+ scale,
32
+ attention_mask=None,
33
+ soft_cap=None,
34
+ dropout=None,
35
+ training=None,
36
+ attn_implementation=None,
37
+ ):
38
+ """Scaled dot-product attention with a selectable implementation.
39
+
40
+ Computes ``softmax(soft_cap(QKᵀ · scale) + mask) V``. The implementation is
41
+ chosen by ``attn_implementation`` (falling back to the module-level
42
+ ``ATTN_IMPLEMENTATION`` default, which ``Model.from_weights`` sets):
43
+
44
+ * ``"sdpa"`` -- hand-written matmul/softmax math. Portable across every
45
+ backend, dtype and device. This is the default.
46
+ * ``"flash"`` -- :func:`keras.ops.dot_product_attention` with
47
+ ``flash_attention=True`` (the real flash kernel). Used only when the
48
+ backend supports it and there is no attention dropout or logit soft-cap;
49
+ otherwise it transparently falls back to the ``"sdpa"`` math (and the
50
+ flash op itself raises if the GPU/dtype cannot support flash).
51
+
52
+ All tensors are ``(batch, num_heads, seq, head_dim)`` with the key/value
53
+ heads already repeated to ``num_heads`` (GQA expansion is the caller's
54
+ responsibility). The result is returned in the same layout.
55
+
56
+ Args:
57
+ query: ``(batch, num_heads, q_len, head_dim)``.
58
+ key: ``(batch, num_heads, kv_len, head_dim)``.
59
+ value: ``(batch, num_heads, kv_len, head_dim)``.
60
+ scale: Query/key scaling factor (e.g. ``head_dim**-0.5``).
61
+ attention_mask: Additive mask broadcastable to
62
+ ``(batch, num_heads, q_len, kv_len)``, or ``None``.
63
+ soft_cap: Optional tanh logit soft-cap value (e.g. Gemma's ``50.0``);
64
+ ``None`` disables it. Forces the ``"sdpa"`` path.
65
+ dropout: Optional ``keras.layers.Dropout`` applied to the attention
66
+ probabilities. Only active during training with a positive rate, in
67
+ which case the ``"sdpa"`` path is used so it can be applied.
68
+ training: Whether the call is in training mode.
69
+ attn_implementation: ``"sdpa"`` / ``"flash"`` / ``None`` (use the global
70
+ default).
71
+
72
+ Returns:
73
+ ``(batch, num_heads, q_len, head_dim)``.
74
+ """
75
+ impl = attn_implementation or ATTN_IMPLEMENTATION
76
+ if impl not in VALID_ATTN_IMPL:
77
+ raise ValueError(
78
+ f"attn_implementation must be one of {VALID_ATTN_IMPL}, got {impl!r}"
79
+ )
80
+
81
+ use_dropout = (
82
+ bool(training) and dropout is not None and getattr(dropout, "rate", 0.0) > 0.0
83
+ )
84
+ use_flash = (
85
+ impl == "flash"
86
+ and _fused_op_available()
87
+ and not use_dropout
88
+ and soft_cap is None
89
+ )
90
+ # Match the additive mask to the compute dtype: torch / jax auto-promote a
91
+ # float32 mask against bf16 logits, but tensorflow raises on the mismatch.
92
+ if attention_mask is not None:
93
+ attention_mask = ops.cast(attention_mask, query.dtype)
94
+ if use_flash:
95
+ q = ops.transpose(query, (0, 2, 1, 3))
96
+ k = ops.transpose(key, (0, 2, 1, 3))
97
+ v = ops.transpose(value, (0, 2, 1, 3))
98
+ out = ops.dot_product_attention(
99
+ q,
100
+ k,
101
+ v,
102
+ bias=attention_mask,
103
+ scale=scale,
104
+ flash_attention=True,
105
+ )
106
+ return ops.transpose(out, (0, 2, 1, 3))
107
+
108
+ logits = ops.matmul(query, ops.transpose(key, (0, 1, 3, 2))) * scale
109
+ if soft_cap is not None:
110
+ logits = soft_cap * ops.tanh(logits / soft_cap)
111
+ if attention_mask is not None:
112
+ logits = logits + attention_mask
113
+ probs = ops.cast(ops.softmax(ops.cast(logits, "float32"), axis=-1), query.dtype)
114
+ if use_dropout:
115
+ probs = dropout(probs, training=True)
116
+ return ops.matmul(probs, value)
@@ -0,0 +1,49 @@
1
+ from zeromodels.base.base_mixin import PreprocessorMixin
2
+
3
+ HF_FEATURE_EXTRACTOR_ALIASES = {"feature_size": ("n_mels", "num_mel_bins")}
4
+
5
+
6
+ class BaseAudioFeatureExtractor(PreprocessorMixin):
7
+ """Abstract base for zeromodels audio feature extractors.
8
+
9
+ Subclasses implement ``call(raw_speech, ...)`` returning the spectrogram /
10
+ feature tensor. The loading API (``from_weights`` / ``from_variant``) and
11
+ the ``__call__`` -> ``call`` forwarder are inherited from
12
+ :class:`PreprocessorMixin`; ``from_hf`` is overridden here to map the
13
+ repo's ``preprocessor_config.json`` scalars (``sampling_rate``, ``n_fft``,
14
+ ``hop_length``, ``chunk_length``, ``feature_size`` -> ``n_mels`` /
15
+ ``num_mel_bins``, …) onto same-named constructor params. Explicit caller
16
+ kwargs always win; a missing config falls back to the subclass defaults.
17
+ Concrete subclasses define their own constructor kwargs (sampling rate,
18
+ FFT size, mel bin count, chunk length, …) and ``get_config`` payload: the
19
+ base bakes in no defaults.
20
+ """
21
+
22
+ def call(self, raw_speech, *args, **kwargs):
23
+ raise NotImplementedError(
24
+ f"{type(self).__name__} must implement `call(raw_speech, ...)`."
25
+ )
26
+
27
+ @classmethod
28
+ def from_hf(cls, repo, **kwargs):
29
+ import inspect
30
+ import json
31
+
32
+ params = set(inspect.signature(cls).parameters)
33
+ try:
34
+ from huggingface_hub import hf_hub_download
35
+
36
+ with open(
37
+ hf_hub_download(repo, "preprocessor_config.json"), encoding="utf-8"
38
+ ) as f:
39
+ hf = json.load(f)
40
+ except Exception:
41
+ return cls(**kwargs)
42
+ for key, value in hf.items():
43
+ if value is None or isinstance(value, (list, dict)):
44
+ continue
45
+ for param in (key, *HF_FEATURE_EXTRACTOR_ALIASES.get(key, ())):
46
+ if param in params:
47
+ kwargs.setdefault(param, value)
48
+ break
49
+ return cls(**kwargs)
@@ -0,0 +1,233 @@
1
+ """Typed model configuration base, in the spirit of a transformers config.
2
+
3
+ A ``BaseConfig`` subclass declares each hyperparameter as an annotated class
4
+ attribute with its default. Model constructors stay **flat** (every field is a
5
+ keyword), but a config **serializes nested**, mirroring upstream configs. There are
6
+ two ways to declare the nesting:
7
+
8
+ * **Composite (transformers-style)** ``sub_configs``: the config holds real
9
+ sub-config objects (``text_config`` / ``vision_config``), each its own
10
+ ``BaseConfig`` with native field names. ``to_dict`` recurses into them; global
11
+ fields (``image_token_id``) stay top-level. ``sub_config_prefixes`` says how each
12
+ sub-config's fields flatten to the (flat) model constructor ("" for the primary
13
+ tower, ``"vision_"`` for a vision tower); ``group_extras`` lists a sub-config's
14
+ fields that keep their own name in the flat constructor. This is the preferred
15
+ form for multi-tower models.
16
+
17
+ * **Prefix auto-grouping** ``config_groups``: a flat config whose fields sharing a
18
+ prefix collapse into a nested sub-config on serialize (``"vision_"`` moves
19
+ ``vision_embed_dim`` -> ``vision_config: {"embed_dim": ...}``). Lighter for a
20
+ single optional group.
21
+
22
+ Either way the primary block is ``text_config`` (a config with a token
23
+ ``vocab_size``) or ``vision_config`` (a pure-vision model). Parsing accepts the
24
+ nested (v2) form and the older flat (v1) form, so existing repos keep loading.
25
+ """
26
+
27
+ import typing
28
+
29
+
30
+ def _is_tuple_type(annotation):
31
+ """True when ``annotation`` is ``tuple`` / ``tuple[...]`` / ``tuple | None``."""
32
+ if annotation is tuple or typing.get_origin(annotation) is tuple:
33
+ return True
34
+ return any(
35
+ arg is tuple or typing.get_origin(arg) is tuple
36
+ for arg in typing.get_args(annotation)
37
+ )
38
+
39
+
40
+ class BaseConfig:
41
+ """Base for typed zeromodels model configs: flat constructor, nested serialize."""
42
+
43
+ model_type = None
44
+ sub_configs = {}
45
+ sub_config_prefixes = {}
46
+ optional_sub_configs = ()
47
+ config_groups = {}
48
+ group_extras = {}
49
+ top_level_fields = ()
50
+ main_config_key = None
51
+
52
+ def __init__(self, **kwargs):
53
+ annotations = self._annotations()
54
+ for name in annotations:
55
+ value = kwargs.pop(name, getattr(type(self), name, None))
56
+ setattr(self, name, self._coerce(name, value, annotations[name]))
57
+ for key, value in kwargs.items():
58
+ setattr(self, key, value)
59
+ for key, sub_cls in self.sub_configs.items():
60
+ value = getattr(self, key, None)
61
+ if isinstance(value, dict):
62
+ setattr(self, key, sub_cls(**value))
63
+ elif value is None and key not in self.optional_sub_configs:
64
+ setattr(self, key, sub_cls())
65
+
66
+ @classmethod
67
+ def _annotations(cls):
68
+ merged = {}
69
+ for klass in reversed(cls.__mro__):
70
+ merged.update(getattr(klass, "__annotations__", {}) or {})
71
+ return merged
72
+
73
+ @classmethod
74
+ def field_names(cls):
75
+ return list(cls._annotations().keys())
76
+
77
+ @classmethod
78
+ def _defaults(cls):
79
+ return {name: getattr(cls, name, None) for name in cls._annotations()}
80
+
81
+ @classmethod
82
+ def _main_key(cls):
83
+ if cls.main_config_key is not None:
84
+ return cls.main_config_key
85
+ if cls.sub_configs:
86
+ for key, prefix in cls.sub_config_prefixes.items():
87
+ if prefix == "":
88
+ return key
89
+ if "text_config" in cls.sub_configs:
90
+ return "text_config"
91
+ return next(iter(cls.sub_configs))
92
+ return "text_config" if "vocab_size" in cls._annotations() else "vision_config"
93
+
94
+ @classmethod
95
+ def _sub_flat_name(cls, key, field):
96
+ """Flat-constructor kwarg name for ``field`` of sub-config ``key``."""
97
+ prefix = cls.sub_config_prefixes.get(key, "")
98
+ if not prefix or field in cls.group_extras.get(key, ()):
99
+ return field
100
+ return prefix + field
101
+
102
+ @staticmethod
103
+ def _coerce(name, value, annotation):
104
+ if isinstance(value, list) and _is_tuple_type(annotation):
105
+ return tuple(value)
106
+ return value
107
+
108
+ def constructor_kwargs(self):
109
+ if self.sub_configs:
110
+ flat = {
111
+ name: getattr(self, name)
112
+ for name in self.field_names()
113
+ if name not in self.sub_configs
114
+ }
115
+ for key in self.sub_configs:
116
+ obj = getattr(self, key)
117
+ if obj is None:
118
+ continue
119
+ for field in obj.field_names():
120
+ flat[self._sub_flat_name(key, field)] = getattr(obj, field)
121
+ return flat
122
+ return {name: getattr(self, name) for name in self.field_names()}
123
+
124
+ def _group_members(self, key):
125
+ """``{sub_field_name: flat_field}`` for a ``config_groups`` group."""
126
+ prefix = self.config_groups[key]
127
+ members = {
128
+ f[len(prefix) :]: f for f in self.field_names() if f.startswith(prefix)
129
+ }
130
+ for f in self.group_extras.get(key, ()):
131
+ members[f] = f
132
+ return members
133
+
134
+ def _composite_to_dict(self):
135
+ data = {}
136
+ if self.model_type is not None:
137
+ data["model_type"] = self.model_type
138
+ main = self._main_key()
139
+ active_secondary = False
140
+ for key, sub_cls in self.sub_configs.items():
141
+ obj = getattr(self, key)
142
+ if obj is None:
143
+ continue # absent optional tower (kept as None)
144
+ sub = {f: getattr(obj, f) for f in obj.field_names()}
145
+ if key == main:
146
+ data[key] = sub
147
+ continue
148
+ all_default = sub == {
149
+ f: getattr(sub_cls, f, None) for f in sub_cls.field_names()
150
+ }
151
+ if key in self.optional_sub_configs and all_default:
152
+ continue # optional tower left all-default (legacy sentinel style)
153
+ data[key] = sub
154
+ active_secondary = True
155
+ if active_secondary: # glue only present alongside a secondary tower
156
+ for name in self.field_names():
157
+ if name not in self.sub_configs:
158
+ data[name] = getattr(self, name)
159
+ return data
160
+
161
+ def to_dict(self):
162
+ if self.sub_configs:
163
+ return self._composite_to_dict()
164
+ grouped = set()
165
+ active = {}
166
+ for key in self.config_groups:
167
+ members = self._group_members(key)
168
+ grouped.update(members.values())
169
+ active[key] = {sub: getattr(self, f) for sub, f in members.items()}
170
+
171
+ data = {}
172
+ if self.model_type is not None:
173
+ data["model_type"] = self.model_type
174
+ main_key = self._main_key()
175
+ main_fields = [
176
+ f
177
+ for f in self.field_names()
178
+ if f not in grouped and f not in self.top_level_fields
179
+ ]
180
+ if main_key not in self.config_groups:
181
+ data[main_key] = {f: getattr(self, f) for f in main_fields}
182
+ for key, sub in active.items():
183
+ data[key] = sub
184
+ if active: # glue only makes sense alongside an active group
185
+ for f in self.top_level_fields:
186
+ data[f] = getattr(self, f)
187
+ return data
188
+
189
+ @classmethod
190
+ def _composite_from_dict(cls, data):
191
+ if any(key in data for key in cls.sub_configs): # nested input
192
+ init = {key: data[key] for key in cls.sub_configs if key in data}
193
+ for name in cls.field_names():
194
+ if name not in cls.sub_configs and name in data:
195
+ init[name] = data[name]
196
+ return cls(**init)
197
+ init = {}
198
+ for key, sub_cls in cls.sub_configs.items():
199
+ sub = {}
200
+ for field in sub_cls.field_names():
201
+ flat_name = cls._sub_flat_name(key, field)
202
+ if flat_name in data:
203
+ sub[field] = data[flat_name]
204
+ if sub or key not in cls.optional_sub_configs:
205
+ init[key] = sub
206
+ for name in cls.field_names():
207
+ if name not in cls.sub_configs and name in data:
208
+ init[name] = data[name]
209
+ return cls(**init)
210
+
211
+ @classmethod
212
+ def from_dict(cls, data):
213
+ if cls.sub_configs:
214
+ return cls._composite_from_dict(data)
215
+ fields = set(cls.field_names())
216
+ main_key = cls._main_key()
217
+ if main_key in data or "text_config" in data or "vision_config" in data:
218
+ flat = {k: v for k, v in data.items() if k in fields}
219
+ if main_key not in cls.config_groups:
220
+ main = data.get(main_key) or {}
221
+ flat.update({k: v for k, v in main.items() if k in fields})
222
+ for key, prefix in cls.config_groups.items():
223
+ extras = set(cls.group_extras.get(key, ()))
224
+ for sub, value in (data.get(key) or {}).items():
225
+ flat_name = sub if sub in extras else prefix + sub
226
+ if flat_name in fields:
227
+ flat[flat_name] = value
228
+ return cls(**flat)
229
+ return cls(**{k: v for k, v in data.items() if k in fields})
230
+
231
+ def __repr__(self):
232
+ inner = ", ".join(f"{k}={v!r}" for k, v in self.constructor_kwargs().items())
233
+ return f"{type(self).__name__}({inner})"