[
  {
    "path": ".dockerignore",
    "content": "# Docker-specific:\n**/Dockerfile\nsetup_bolt.sh\n.git\n.gitignore\n.dockerignore\n\n# Mirroring .gitignore\n# Note: dockerignore matches paths only from the root dir, while gitignore matches \n# paths from any nested directory. Thus, you'll need to add **/<path> for some paths.\n.vscode/\n.coverage\n*.pyc\n**/*.pyc\n__pycache__\n**/__pycache__\n.DS_STORE\n**/.DS_STORE\n.idea\n\n*.swp\n.pytest_cache\n.mypy_cache\n.corenet_data_cache\n\nbuild/\n\nresults*\nvision_datasets/\nexp_results/\nexp_results*\nresults_*\n\n*.so\n**/*.so\nmodel_zoo\nmodel_zoo/*\npipeline.yaml\n\n*.egg-info\n**/*.egg-info\n\nvenv/\n\ntrash/\nmlx_model/\n.tox/\n\n# The playground_* files get generated by tutorials/train_new_model_on_new_dataset_from_scratch.ipynb\n**/playground_*\n"
  },
  {
    "path": ".flake8",
    "content": "[flake8]\nmax-line-length = 88\nextend-ignore = E203\n"
  },
  {
    "path": ".gitattributes",
    "content": "*.tar filter=lfs diff=lfs merge=lfs -text\n*.gz filter=lfs diff=lfs merge=lfs -text\n*.zip filter=lfs diff=lfs merge=lfs -text\n*.zst filter=lfs diff=lfs merge=lfs -text\n*.zstd filter=lfs diff=lfs merge=lfs -text\n*.ipynb filter=lfs diff=lfs merge=lfs -text\n*.png filter=lfs diff=lfs merge=lfs -text\n*.jpeg filter=lfs diff=lfs merge=lfs -text\n*.jpg filter=lfs diff=lfs merge=lfs -text\n*.whl filter=lfs diff=lfs merge=lfs -text\n*.npy filter=lfs diff=lfs merge=lfs -text\n*.npz filter=lfs diff=lfs merge=lfs -text\n*.pt filter=lfs diff=lfs merge=lfs -text\n*.mov filter=lfs diff=lfs merge=lfs -text\n*.mp4 filter=lfs diff=lfs merge=lfs -text\n*.pdf filter=lfs diff=lfs merge=lfs -text\n*.tif filter=lfs diff=lfs merge=lfs -text\n*.tiff filter=lfs diff=lfs merge=lfs -text\n*.model filter=lfs diff=lfs merge=lfs -text\n*.parquet filter=lfs diff=lfs merge=lfs -text\n*.pkl filter=lfs diff=lfs merge=lfs -text\n*.safetensors filter=lfs diff=lfs merge=lfs -text\n"
  },
  {
    "path": ".gitignore",
    "content": "# Note: please mirror changes of this file to .dockerignore.\n\n.vscode/\n.coverage\n*.pyc\n__pycache__\n.DS_STORE\n.idea\n*.swp\n.pytest_cache\n.mypy_cache\n.corenet_data_cache\n\nbuild/\n\n/results*\nvision_datasets/\nexp_results/\nexp_results*\nresults_*\n\n*.so\nmodel_zoo\nmodel_zoo/*\npipeline.yaml\n\n*.egg-info\n\nvenv/\n\ntrash\n\nmlx_model/\n.tox/\n\n# The playground_* files get generated by tutorials/train_new_model_on_new_dataset_from_scratch.ipynb\nplayground_*\n"
  },
  {
    "path": "ACKNOWLEDGEMENTS",
    "content": "Acknowledgements\nPortions of this Software may utilize the following copyrighted material, the use of which is hereby acknowledged.\n\nFacebook (Fairseq)\n    MIT License\n\n    Copyright (c) Facebook, Inc. and its affiliates.\n\n    Permission is hereby granted, free of charge, to any person obtaining a copy\n    of this software and associated documentation files (the \"Software\"), to deal\n    in the Software without restriction, including without limitation the rights\n    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n    copies of the Software, and to permit persons to whom the Software is\n    furnished to do so, subject to the following conditions:\n\n    The above copyright notice and this permission notice shall be included in all\n    copies or substantial portions of the Software.\n\n    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n    SOFTWARE.\n\nEleuther AI (LM Eval Harness)\n   MIT License\n\n   Copyright (c) 2020 EleutherAI\n\n   Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\n   The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\n   THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nHao Gao (pytorch-ssd)\n    MIT License\n\n    Copyright (c) 2019 Hao Gao\n\n    Permission is hereby granted, free of charge, to any person obtaining a copy\n    of this software and associated documentation files (the \"Software\"), to deal\n    in the Software without restriction, including without limitation the rights\n    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n    copies of the Software, and to permit persons to whom the Software is\n    furnished to do so, subject to the following conditions:\n\n    The above copyright notice and this permission notice shall be included in all\n    copies or substantial portions of the Software.\n\n    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n    SOFTWARE.\n\nHuggingFace (PEFT)\n\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n\nMax deGroot, Ellis Brown (ssd.pytorch)\n    MIT License\n\n    Copyright (c) 2017 Max deGroot, Ellis Brown\n\n    Permission is hereby granted, free of charge, to any person obtaining a copy\n    of this software and associated documentation files (the \"Software\"), to deal\n    in the Software without restriction, including without limitation the rights\n    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n    copies of the Software, and to permit persons to whom the Software is\n    furnished to do so, subject to the following conditions:\n\n    The above copyright notice and this permission notice shall be included in all\n    copies or substantial portions of the Software.\n\n    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n    SOFTWARE.\n\nSachin Mehta (EdgeNets)\n    MIT License\n\n    Copyright (c) 2021 Sachin Mehta\n\n    Permission is hereby granted, free of charge, to any person obtaining a copy\n    of this software and associated documentation files (the \"Software\"), to deal\n    in the Software without restriction, including without limitation the rights\n    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n    copies of the Software, and to permit persons to whom the Software is\n    furnished to do so, subject to the following conditions:\n\n    The above copyright notice and this permission notice shall be included in all\n    copies or substantial portions of the Software.\n\n    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n    SOFTWARE.\n\nOpenMMLab (mmSegmentation)\n    Copyright 2020 The MMSegmentation Authors. All rights reserved.\n\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright 2020 The MMSegmentation Authors.\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n\nPyTorch (Torchvision)\n    BSD 3-Clause License\n\n    Copyright (c) Soumith Chintala 2016,\n    All rights reserved.\n\n    Redistribution and use in source and binary forms, with or without\n    modification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright notice, this\n      list of conditions and the following disclaimer.\n\n    * Redistributions in binary form must reproduce the above copyright notice,\n      this list of conditions and the following disclaimer in the documentation\n      and/or other materials provided with the distribution.\n\n    * Neither the name of the copyright holder nor the names of its\n      contributors may be used to endorse or promote products derived from\n      this software without specific prior written permission.\n\n    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n    AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n    DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n    FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n    SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n    CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n    OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\nCLIP (OpenAI)\n    MIT License\n\n    Copyright (c) 2021 OpenAI\n\n    Permission is hereby granted, free of charge, to any person obtaining a copy\n    of this software and associated documentation files (the \"Software\"), to deal\n    in the Software without restriction, including without limitation the rights\n    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n    copies of the Software, and to permit persons to whom the Software is\n    furnished to do so, subject to the following conditions:\n\n    The above copyright notice and this permission notice shall be included in all\n    copies or substantial portions of the Software.\n\n    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n    SOFTWARE.\n\nTIMM Library (PyTorch Image Models)\n                                     Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"{}\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright 2019 Ross Wightman\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n\nForked-PDB (Lightning AI)\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n\nZhiqiang Hu (LLM Adapters)\n                                Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright 2023 Rohan Taori, Ishaan Gulrajani, Tianyi Zhang, Yann Dubois, Xuechen Li\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "content": "# Code of Conduct\n\n## Our Pledge\n\nIn the interest of fostering an open and welcoming environment, we as\ncontributors and maintainers pledge to making participation in our project and\nour community a harassment-free experience for everyone, regardless of age, body\nsize, disability, ethnicity, sex characteristics, gender identity and expression,\nlevel of experience, education, socio-economic status, nationality, personal\nappearance, race, religion, or sexual identity and orientation.\n\n## Our Standards\n\nExamples of behavior that contributes to creating a positive environment\ninclude:\n\n* Using welcoming and inclusive language\n* Being respectful of differing viewpoints and experiences\n* Gracefully accepting constructive criticism\n* Focusing on what is best for the community\n* Showing empathy towards other community members\n\nExamples of unacceptable behavior by participants include:\n\n* The use of sexualized language or imagery and unwelcome sexual attention or\n  advances\n* Trolling, insulting/derogatory comments, and personal or political attacks\n* Public or private harassment\n* Publishing others' private information, such as a physical or electronic\n  address, without explicit permission\n* Other conduct which could reasonably be considered inappropriate in a\n  professional setting\n\n## Our Responsibilities\n\nProject maintainers are responsible for clarifying the standards of acceptable\nbehavior and are expected to take appropriate and fair corrective action in\nresponse to any instances of unacceptable behavior.\n\nProject maintainers have the right and responsibility to remove, edit, or\nreject comments, commits, code, wiki edits, issues, and other contributions\nthat are not aligned to this Code of Conduct, or to ban temporarily or\npermanently any contributor for other behaviors that they deem inappropriate,\nthreatening, offensive, or harmful.\n\n## Scope\n\nThis Code of Conduct applies within all project spaces, and it also applies when\nan individual is representing the project or its community in public spaces.\nExamples of representing a project or community include using an official\nproject e-mail address, posting via an official social media account, or acting\nas an appointed representative at an online or offline event. Representation of\na project may be further defined and clarified by project maintainers.\n\n## Enforcement\n\nInstances of abusive, harassing, or otherwise unacceptable behavior may be\nreported by contacting the open source team at [opensource-conduct@group.apple.com](mailto:opensource-conduct@group.apple.com). All\ncomplaints will be reviewed and investigated and will result in a response that\nis deemed necessary and appropriate to the circumstances. The project team is\nobligated to maintain confidentiality with regard to the reporter of an incident.\nFurther details of specific enforcement policies may be posted separately.\n\nProject maintainers who do not follow or enforce the Code of Conduct in good\nfaith may face temporary or permanent repercussions as determined by other\nmembers of the project's leadership.\n\n## Attribution\n\nThis Code of Conduct is adapted from the [Contributor Covenant](https://www.contributor-covenant.org), version 1.4,\navailable at [https://www.contributor-covenant.org/version/1/4/code-of-conduct.html](https://www.contributor-covenant.org/version/1/4/code-of-conduct.html)\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "# Contribution Guide\n\nThanks for your interest in contributing. This project was released to accompany a research paper for purposes of reproducibility, and beyond its publication there are limited plans for future development of the repository.\n\nWhile we welcome new pull requests and issues please note that our response may be limited. Forks and out-of-tree improvements are strongly encouraged.\n\n## Before you get started\n\nBy submitting a pull request, you represent that you have the right to license your contribution to Apple and the community, and agree by submitting the patch that your contributions are licensed under the [LICENSE](LICENSE).\n\nWe ask that all community members read and observe our [Code of Conduct](CODE_OF_CONDUCT.md).\n"
  },
  {
    "path": "LICENSE",
    "content": "Copyright (C) 2024 Apple Inc. All Rights Reserved.\n\nDisclaimer: IMPORTANT:  This Apple software is supplied to you by Apple\nInc. (\"Apple\") in consideration of your agreement to the following\nterms, and your use, installation, modification or redistribution of\nthis Apple software constitutes acceptance of these terms.  If you do\nnot agree with these terms, please do not use, install, modify or\nredistribute this Apple software.\n\nIn consideration of your agreement to abide by the following terms, and\nsubject to these terms, Apple grants you a personal, non-exclusive\nlicense, under Apple's copyrights in this original Apple software (the\n\"Apple Software\"), to use, reproduce, modify and redistribute the Apple\nSoftware, with or without modifications, in source and/or binary forms;\nprovided that if you redistribute the Apple Software in its entirety and\nwithout modifications, you must retain this notice and the following\ntext and disclaimers in all such redistributions of the Apple Software.\nNeither the name, trademarks, service marks or logos of Apple Inc. may\nbe used to endorse or promote products derived from the Apple Software\nwithout specific prior written permission from Apple.  Except as\nexpressly stated in this notice, no other rights or licenses, express or\nimplied, are granted by Apple herein, including but not limited to any\npatent rights that may be infringed by your derivative works or by other\nworks in which the Apple Software may be incorporated.\n\nThe Apple Software is provided by Apple on an \"AS IS\" basis.  APPLE\nMAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION\nTHE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS\nFOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND\nOPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.\n\nIN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL\nOR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\nINTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION,\nMODIFICATION AND/OR DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED\nAND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),\nSTRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGE.\n\n\n-------------------------------------------------------------------------------\nSOFTWARE DISTRIBUTED IN THIS REPOSITORY:\n\nThis software includes a number of subcomponents with separate\ncopyright notices and license terms - please see the file ACKNOWLEDGEMENTS.\n-------------------------------------------------------------------------------\n"
  },
  {
    "path": "Makefile",
    "content": "SHELL := /bin/bash\nYEAR = $$(date +%Y)\nLAST_YEAR = $$(($(YEAR) - 1))\nCOLOR_LOG = \\033[34m\nCOLOR_INFO = \\033[32m\nCOLOR_WARNING = \\033[33m\nCOLOR_ERROR = \\033[31m\nCOLOR_END = \\033[0m\n\nSRC_DIRS = corenet tests\n\n.PHONY: format install-githooks prepush-check update-copyright-year\n\nupdate-copyright-year:\n\t@if [[ \"$$CHECK_ONLY\" == \"\" ]]; then \\\n\t\tif ! command -v rg &>/dev/null; then \\\n\t\t\tprintf \"$(COLOR_INFO)Installing ripgrep ...$(COLOR_END)\\n\"; \\\n\t\t\tif [[ \"$$OSTYPE\" == \"darwin\"* ]]; then \\\n\t\t\t\tbrew install ripgrep; \\\n\t\t\telse \\\n\t\t\t\tsudo --preserve-env apt-get install ripgrep; \\\n\t\t\tfi; \\\n\t\tfi; \\\n\t\trg -l \"\\(C\\) $(LAST_YEAR)\" \\\n\t\t\t| grep -v \"ACKNOWLEDGEMENTS\" \\\n\t\t\t| xargs -r -n1 -P 10 sed -i.bak.copyright \"s/(C) $(LAST_YEAR) Apple/(C) $(YEAR) Apple/g\" \\\n\t\t\t&& find . -name '*.bak.copyright' \\\n\t\t\t| xargs -r -n1 -P 10 rm; \\\n\tfi\n\nformat: format-init-files format-license-headers format-eof-new-lines format-isort format-black format-conventions\n\t# Formatting checks succeeded.\n\n# The existence of __init__.py files is necessary for the inclusion of packages in the setup.py (i.e. pip-instsallable) package.\nformat-init-files:\n\t# Checking missing __init__.py files...\n\t@python_files=$$(find $(SRC_DIRS) -iname \"*.py\"); \\\n\tfor dir_name in $$(find $(SRC_DIRS) -type d -not -name __pycache__); do \\\n\t    grep -q \"^$$dir_name/\" <(echo \"$$python_files\") || continue; \\\n\t    init_file=\"$$dir_name/__init__.py\"; \\\n\t    [[ -f \"$$init_file\" ]] && continue; \\\n\t\tif [[ \"$$CHECK_ONLY\" == \"1\" ]]; then \\\n\t\t\tprintf \"$(COLOR_ERROR)Missing $$init_file. $(COLOR_END)\\n\"; \\\n\t\telse \\\n\t\t\ttouch \"$$init_file\"; \\\n\t\t\tprintf \"$(COLOR_LOG)Added $$init_file. $(COLOR_END)\\n\"; \\\n\t\tfi \\\n\tdone\n\nformat-license-headers: update-copyright-year\n\t# Checking missing license headers files...\n# Read the first 4 lines of each file to check if the Copyright notice header exists. \n# The Copyright note is usually found on line 3, but some files may have an additional \n# '#/bin/bash' or '#/usr/bin/env python' header line, hence reading 3+1 lines.\n\t@for f in $$(find . -iname \"*.py\"); do \\\n\t    [ -s \"$$f\" ] || continue; \\\n\t\tgit check-ignore -q \"$$f\" && continue; \\\n\t    export COPYRIGHT_NOTICE_LINES=4; \\\n\t    (head -$$COPYRIGHT_NOTICE_LINES $$f | grep -q \"# *Copyright (C) $(YEAR) Apple Inc. All Rights Reserved.\") && continue; \\\n\t    [[ \"$$CHECK_ONLY\" == \"1\" ]] && exit 1; \\\n\t    sed -i '' -e \"1s/^/#\\n# For licensing see accompanying LICENSE file.\\n# Copyright (C) $(YEAR) Apple Inc. All Rights Reserved.\\n#\\n\\n/\" $$f; \\\n\t    printf \"$(COLOR_LOG)Added license header for $$f$(COLOR_END)\\n\"; \\\n\tdone\n\nformat-eof-new-lines:\n\t# Ensure newline at the end of all files...\n# Inspired by https://unix.stackexchange.com/a/161853/55814\n\t@if [[ \"$$CHECK_ONLY\" == \"\" ]]; then \\\n\t    git ls-files -z | while IFS= read -rd '' f; do \\\n\t        if [[ -f \"$$f\" ]] && (file --mime-encoding \"$$f\" | grep -qv binary); then \\\n\t            tail -c1 < \"$$f\" | read -r _ || (echo >> \"$$f\" && printf \"$(COLOR_LOG) Added newline at the end of $$f$(COLOR_END)\\n\"); \\\n\t        fi; \\\n\t    done; \\\n\tfi\n\nformat-isort:\n\t# Running isort...\n\t@if [[ \"$$CHECK_ONLY\" == \"1\" ]]; then \\\n\t    isort --check-only .; \\\n\telse \\\n\t    isort .; \\\n\tfi\n\nformat-black:\n\t# Running black formatter...\n\t@if [[ \"$$CHECK_ONLY\" == \"1\" ]]; then \\\n\t    black --check .; \\\n\telse \\\n\t    black .; \\\n\tfi\n\nformat-conventions:\n\t@if [[ \"$$CHECK_ONLY\" == \"1\" ]]; then \\\n\t    echo \"# Checking coding conventions...\"; \\\n\t    convention_test_files=(tests/test_conventions.py); \\\n\t    [[ -d tests/internal ]] && convention_test_files+=(tests/internal/test_internal_conventions.py); \\\n\t\texport _parallel_args=\"$$( (python -c \"import xdist.plugin\" 2>/dev/null && echo '-n 4') || true)\"; \\\n\t    if ! pytest --junit-xml=\"\" -q \"$${convention_test_files[@]}\" $$_parallel_args; then \\\n\t        printf \"$(COLOR_ERROR) Please manually fix the above convention errors. $(COLOR_END)\\n\"; \\\n\t        exit 1; \\\n\t    fi; \\\n\tfi\n\n\nprepush-check:\n\t@printf \"$(COLOR_LOG)[pre-push hook]$(COLOR_END)\\n\"\n\t@CHECK_ONLY=1 make format || (printf \"$(COLOR_ERROR)Formatting checks failed.$(COLOR_END) Please run '$(COLOR_INFO)make format$(COLOR_END)' command, commit, and push again.\\n\" && exit 1);\n\t@if [ -n \"$$(git status --porcelain)\" ]; then \\\n\t    printf \"$(COLOR_WARNING)Formatting checks succeeded, but please consider committing UNCOMMITTED changes to the following files:$(COLOR_END)\\n\"; \\\n\t    git status --short; \\\n\telse \\\n\t    printf \"$(COLOR_INFO)Formatting checks succeeded.$(COLOR_END)\\n\"; \\\n\tfi\n\ninstall-githooks:\n\t@echo -e \"#!/usr/bin/env bash\\n\" '\\\nset -euo pipefail\\n\\\n# Check if Git LFS is installed\\n\\\nif ! command -v git-lfs >/dev/null 2>&1; then\\n\\\n\techo >&2 \"Error: Git LFS is not installed. Please install Git LFS to continue.\"\\n\\\n\texit 1\\n\\\nfi\\n\\\n\\n\\\ngit lfs pre-push \"$$@\"\\n\\n\\\nprintf \"$(COLOR_LOG)[pre-push hook]$(COLOR_END) Running formatting checks and fixes... To skip this hook, please run \\\"git push --no-verify\\\".\\\\n\";\\n\\\nif grep -q \"^prepush-check:\" Makefile 2>/dev/null; then\\n\\\n\t\tmake prepush-check;\\n\\\nelse\\n\\\n\t\tprintf \"$(COLOR_WARNING)WARNING:$(COLOR_END) Skipping the pre-push formatting checks and fixes. The git hook is installed (probably on a different git branch), but Makefile is either missing or old on this branch.\\\\n\";\\n\\\nfi \\\n\t' > \"$$(git rev-parse --git-path hooks)/pre-push\"\n\tchmod +x \"$$(git rev-parse --git-path hooks)/pre-push\"\n\t# Successfully installed the pre-push hook.\n\ntest-all:\n##\n# Notes:\n# * Run all tests and set OMP/MKL threads 1 to allow pytest parallelization\n# * The number of parallel tests will be 10 by default, which is good for running tests\n#   locally. Larger numbers may cause OOM error. If PYTEST_WORKERS environment variable\n#   is already set, the existing value gets used.\n# * Currently, our tests fail when DDP is enabled. Hence, we set disable gpus for test\n#   by setting CUDA_VISIBLE_DEVICES=\"\".\n##\n\tPYTEST_WORKERS=\"$${PYTEST_WORKERS:=10}\"; CUDA_VISIBLE_DEVICES=\"\" MKL_NUM_THREADS=1 NUMEXPR_NUM_THREADS=1 OMP_NUM_THREADS=1 pytest . -n $$PYTEST_WORKERS $(extra_args)\n\ncoverage-test-all:\n\tPYTEST_WORKERS=\"$${PYTEST_WORKERS:=10}\"; CUDA_VISIBLE_DEVICES=\"\" MKL_NUM_THREADS=1 NUMEXPR_NUM_THREADS=1 OMP_NUM_THREADS=1 coverage run -m pytest . -n $$PYTEST_WORKERS $(extra_args)\n"
  },
  {
    "path": "README.md",
    "content": "# CoreNet: A library for training deep neural networks\n\nCoreNet is a deep neural network toolkit that allows researchers and engineers to train standard and novel small and large-scale models for variety of tasks, including foundation models (e.g., CLIP and LLM), object classification, object detection, and semantic segmentation.\n\n## Table of contents\n\n   * [What's new?](#whats-new)\n   * [Research efforts at Apple using CoreNet](#research-efforts-at-apple-using-corenet)\n   * [Installation](#installation)\n   * [Directory Structure](#directory-structure)\n   * [Maintainers](#maintainers)\n   * [Contributing to CoreNet](#contributing-to-corenet)\n   * [License](#license)\n   * [Relationship with CVNets](#relationship-with-cvnets)\n   * [Citation](#citation)\n\n## What's new?\n\n   * ***October 2024***: Version 0.1.1 of the CoreNet library includes\n      * [KV Prediction](./projects/kv-prediction/)\n\n## Research efforts at Apple using CoreNet\n\nBelow is the list of publications from Apple that uses CoreNet. Also, training and evaluation recipes, as well as links to pre-trained models, can be found inside the [projects](./projects/) folder. Please refer to it for further details.\n\n   * [KV Prediction for Improved Time to First Token](https://arxiv.org/abs/2410.08391)\n   * [OpenELM: An Efficient Language Model Family with Open Training and Inference Framework](https://arxiv.org/abs/2404.14619)\n   * [CatLIP: CLIP-level Visual Recognition Accuracy with 2.7x Faster Pre-training on Web-scale Image-Text Data](https://arxiv.org/abs/2404.15653)\n   * [Reinforce Data, Multiply Impact: Improved Model Accuracy and Robustness with Dataset Reinforcement](https://arxiv.org/abs/2303.08983)\n   * [CLIP meets Model Zoo Experts: Pseudo-Supervision for Visual Enhancement](https://arxiv.org/abs/2310.14108)\n   * [FastVit: A Fast Hybrid Vision Transformer using Structural Reparameterization](https://arxiv.org/abs/2303.14189)\n   * [Bytes Are All You Need: Transformers Operating Directly on File Bytes](https://arxiv.org/abs/2306.00238)\n   * [MobileOne: An Improved One millisecond Mobile Backbone](https://arxiv.org/abs/2206.04040)\n   * [RangeAugment: Efficient Online Augmentation with Range Learning](https://arxiv.org/abs/2212.10553)\n   * [Separable Self-attention for Mobile Vision Transformers (MobileViTv2)](https://arxiv.org/abs/2206.02680)\n   * [CVNets: High performance library for Computer Vision, ACM MM'22](https://arxiv.org/abs/2206.02002)\n   * [MobileViT: Light-weight, General-purpose, and Mobile-friendly Vision Transformer, ICLR'22](https://arxiv.org/abs/2110.02178)\n\n## Installation\n\nYou will need Git LFS (instructions below) to run tests and Jupyter notebooks \n([instructions](https://jupyter.org/install)) in this repository,\nand to contribute to it so we recommend that you install and activate it first.\n\nOn Linux we recommend to use Python 3.10+ and PyTorch (version >= v2.1.0), on\nmacOS system Python 3.9+ should be sufficient.\n\nNote that the optional dependencies listed below are required if you'd like to\nmake contributions and/or run tests.\n\nFor Linux (substitute `apt` for your package manager):\n\n```bash\nsudo apt install git-lfs\n\ngit clone git@github.com:apple/corenet.git\ncd corenet\ngit lfs install\ngit lfs pull\n# The following venv command is optional, but recommended. Alternatively, you can create and activate a conda environment.\npython3 -m venv venv && source venv/bin/activate\npython3 -m pip install --editable .\n```\n\nTo install optional dependencies for audio and video processing:\n\n```bash\nsudo apt install libsox-dev ffmpeg\n```\n\nFor macOS, assuming you use Homebrew:\n\n```bash\nbrew install git-lfs\n\ngit clone git@github.com:apple/corenet.git\ncd corenet\ncd \\$(pwd -P)  # See the note below.\ngit lfs install\ngit lfs pull\n# The following venv command is optional, but recommended. Alternatively, you can create and activate a conda environment.\npython3 -m venv venv && source venv/bin/activate\npython3 -m pip install --editable .\n```\n\nTo install optional dependencies for audio and video processing:\n\n```bash\nbrew install sox ffmpeg\n```\n\nNote that on macOS the file system is case insensitive, and case sensitivity\ncan cause issues with Git. You should access the repository on disk as if the\npath were case sensitive, i.e. with the same capitalization as you see when you\nlist the directories `ls`. You can switch to such a path with the `cd $(pwd -P)`\ncommand.\n\n\n## Directory Structure\n\nThis section provides quick access and a brief description for important CoreNet directories.\n\n<table>\n<thead>\n<tr>\n<th> Description </th>\n<th> Quick Access </th>\n</tr>\n</thead>\n<tbody>\n<!-- Row boilerplate (copy-paste the following commented snippet for adding a new row to the table.)\n<tr> <td> <h3> title </h3> \ndescription\n</td> <td> <pre>\nfolders\n</pre> </td> </tr>\n-->\n<tr> <td> <h3> Getting Started </h3> \nWorking with the examples is an easy way to get started with CoreNet. \n</td> <td> <pre>\n└── tutorials\n    ├── <a href=\"tutorials/train_a_new_model_on_a_new_dataset_from_scratch.ipynb\">train_a_new_model_on_a_new_dataset_from_scratch.ipynb</a>\n    ├── <a href=\"tutorials/guide_slurm_and_multi_node_training.md\">guide_slurm_and_multi_node_training.md</a>\n    ├── <a href=\"tutorials/clip.ipynb\">clip.ipynb</a>\n    ├── <a href=\"tutorials/semantic_segmentation.ipynb\">semantic_segmentation.ipynb</a>\n    └── <a href=\"tutorials/object_detection.ipynb\">object_detection.ipynb</a>\n</pre> </td> </tr>\n\n\n<tr> <td> <h3> Training Recipes </h3>\nCoreNet provides reproducible training recipes, in addition to the pretrained model \nweights and checkpoints for the publications that are listed in <code>projects/</code> directory.\n\nPublication project directories generally contain the following contents:\n\n* `README.md` provides documentation, links to the pretrained weights, and citations.\n* `<task_name>/<model_name>.yaml` provides configuration for reproducing the trainings and evaluations.\n</td> <td> <pre>\n└── projects\n    ├── <a href=\"projects/kv-prediction\">kv-prediction</a> (*)\n    ├── <a href=\"projects/byteformer\">byteformer</a>\n    ├── <a href=\"projects/catlip\">catlip</a>\n    ├── <a href=\"projects/clip\">clip</a>\n    ├── <a href=\"projects/fastvit\">fastvit</a>\n    ├── <a href=\"projects/mobilenet_v1\">mobilenet_v1</a>\n    ├── <a href=\"projects/mobilenet_v2\">mobilenet_v2</a>\n    ├── <a href=\"projects/mobilenet_v3\">mobilenet_v3</a>\n    ├── <a href=\"projects/mobileone\">mobileone</a>\n    ├── <a href=\"projects/mobilevit\">mobilevit</a>\n    ├── <a href=\"projects/mobilevit_v2\">mobilevit_v2</a>\n    ├── <a href=\"projects/openelm\">openelm</a>\n    ├── <a href=\"projects/range_augment\">range_augment</a>\n    ├── <a href=\"projects/resnet\">resnet</a>\n    └── <a href=\"projects/vit\">vit</a>\n<br>\n(*) Newly released.\n</pre> </td> </tr>\n\n\n<tr> <td> <h3> MLX Examples </h3>\nMLX examples demonstrate how to run CoreNet models efficiently on Apple Silicon.\nPlease find further information in the <code>README.md</code> file within the corresponding example directory.\n\n</td> <td> <pre>\n└──mlx_example\n    ├── <a href=\"mlx_examples/clip\">clip</a>\n    └── <a href=\"mlx_examples/open_elm\">open_elm</a>\n</pre> </td> </tr>\n\n\n<tr> <td> <h3> Model Implementations </h3> \nModels are organized by tasks (e.g. \"classification\"). You can find all model implementations for each\ntask in the corresponding task folder. \n\nEach model class is decorated by a \n`@MODEL_REGISTRY.register(name=\"<model_name>\", type=\"<task_name>\")` decorator. \nTo use a model class in CoreNet training or evaluation,\nassign `models.<task_name>.name = <model_name>` in the YAML configuration.\n\n</td> <td> <pre>\n└── corenet\n    └── modeling\n        └── <a href=\"corenet/modeling/models\">models</a>\n            ├── <a href=\"corenet/modeling/models/audio_classification\">audio_classification</a>\n            ├── <a href=\"corenet/modeling/models/classification\">classification</a>\n            ├── <a href=\"corenet/modeling/models/detection\">detection</a>\n            ├── <a href=\"corenet/modeling/models/language_modeling\">language_modeling</a>\n            ├── <a href=\"corenet/modeling/models/multi_modal_img_text\">multi_modal_img_text</a>\n            └── <a href=\"corenet/modeling/models/segmentation\">segmentation</a>\n</pre> </td> </tr>\n\n\n<tr> <td> <h3> Datasets </h3> \nSimilarly to the models, datasets are also categorized by tasks.\n</td> <td> <pre>\n└── corenet\n    └── data\n        └── <a href=\"corenet/data/datasets\">datasets</a>\n            ├── <a href=\"corenet/data/datasets/audio_classification\">audio_classification</a>\n            ├── <a href=\"corenet/data/datasets/classification\">classification</a>\n            ├── <a href=\"corenet/data/datasets/detection\">detection</a>\n            ├── <a href=\"corenet/data/datasets/language_modeling\">language_modeling</a>\n            ├── <a href=\"corenet/data/datasets/multi_modal_img_text\">multi_modal_img_text</a>\n            └── <a href=\"corenet/data/datasets/segmentation\">segmentation</a>\n</pre> </td> </tr>\n\n\n<tr> <td> <h3> Other key directories </h3> \nIn this section, we have highlighted the rest of the key directories that implement \nclasses corresponding to the names that are referenced in the YAML configurations.\n</td> <td> <pre>\n└── corenet\n    ├── <a href=\"corenet/loss_fn\">loss_fn</a>\n    ├── <a href=\"corenet/metrics\">metrics</a>\n    ├── <a href=\"corenet/optims\">optims</a>\n    │   └── <a href=\"corenet/optims/scheduler\">scheduler</a>\n    ├── <a href=\"corenet/train_eval_pipelines\">train_eval_pipelines</a>\n    ├── <a href=\"corenet/data\">data</a>\n    │   ├── <a href=\"corenet/data/collate_fns\">collate_fns</a>\n    │   ├── <a href=\"corenet/data/sampler\">sampler</a>\n    │   ├── <a href=\"corenet/data/text_tokenizer\">text_tokenizer</a>\n    │   ├── <a href=\"corenet/data/transforms\">transforms</a>\n    │   └── <a href=\"corenet/data/video_reader\">video_reader</a>\n    └── <a href=\"corenet/modeling\">modeling</a>\n        ├── <a href=\"corenet/modeling/layers\">layers</a>\n        ├── <a href=\"corenet/modeling/modules\">modules</a>\n        ├── <a href=\"corenet/modeling/neural_augmentor\">neural_augmentor</a>\n        └── <a href=\"corenet/modeling/text_encoders\">text_encoders</a>\n</pre> </td> </tr>\n\n</tbody>\n</table>\n\n## Maintainers\nThis code is developed and maintained by <a href=\"https://mchorton.com\" target=\"_blank\">Maxwell Horton</a>, <a href=\"https://www.mohammad.pro\" target=\"_blank\">Mohammad Sekhavat</a> Yanzi Jin, and <a href=\"https://huggingface.co/depthwise\" target=\"_blank\">Dmitry Belenko</a>.\n\n### Previous Maintainers\n* <a href=\"https://sacmehta.github.io\" target=\"_blank\">Sachin Mehta</a>\n* <a href=\"https://farzadab.github.io\" target=\"_blank\">Farzad Abdolhosseini</a>\n\n## Contributing to CoreNet\n\nWe welcome PRs from the community! You can find information about contributing to CoreNet in our [contributing](CONTRIBUTING.md) document. \n\nPlease remember to follow our [Code of Conduct](CODE_OF_CONDUCT.md).\n\n## License\n\nFor license details, see [LICENSE](LICENSE). \n\n## Relationship with CVNets\n\nCoreNet evolved from CVNets, to encompass a broader range of applications beyond computer vision. Its expansion facilitated the training of foundational models, including LLMs.\n\n## Citation\n\nIf you find our work useful, please cite the following paper:\n\n``` \n@inproceedings{mehta2022cvnets, \n     author = {Mehta, Sachin and Abdolhosseini, Farzad and Rastegari, Mohammad}, \n     title = {CVNets: High Performance Library for Computer Vision}, \n     year = {2022}, \n     booktitle = {Proceedings of the 30th ACM International Conference on Multimedia}, \n     series = {MM '22} \n}\n```\n"
  },
  {
    "path": "conftest.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport os\nimport sys\n\n# NOTE: This environment variable should be set before any corenet import.\nos.environ[\"CORENET_ENTRYPOINT\"] = \"pytest\"\n\nif sys.platform == \"darwin\":\n    # Necessary to find sox when pytest is run in multiprocess mode. macOS\n    # normally strips DYLD_LIBRARY_PATH when starting subprocesses, as a\n    # security measure.\n    os.environ[\"DYLD_LIBRARY_PATH\"] = \"/opt/homebrew/lib\"\n\nimport random\nimport signal\nfrom types import FrameType\nfrom typing import Optional\n\nimport numpy as np\nimport pytest\nimport torch\n\nfrom corenet import suppress_known_warnings\n\nsession_timed_out = False\n\n\ndef handle_timeout(signum: int, frame: Optional[FrameType] = None) -> None:\n    global session_timed_out\n    session_timed_out = True\n    # Not calling pytest.exit() directly to capture the output of the test. See: https://stackoverflow.com/a/59234261/1139196\n    pytest.fail(\"timeout\")\n\n\ndef pytest_sessionstart():\n    suppress_known_warnings()\n    timeout = os.environ.get(\"PYTEST_GLOBAL_TIMEOUT\", \"\")\n    if not timeout:\n        return\n    if timeout.endswith(\"s\"):\n        timeout = int(timeout[:-1])\n    elif timeout.endswith(\"m\"):\n        timeout = int(timeout[:-1]) * 60\n    else:\n        raise ValueError(\n            f\"Timeout value {timeout} should either end with 'm' (minutes) or 's' (seconds).\"\n        )\n\n    signal.signal(signal.SIGALRM, handle_timeout)\n    signal.setitimer(signal.ITIMER_REAL, timeout)\n\n\ndef pytest_runtest_logfinish(nodeid, location):\n    if session_timed_out:\n        pytest.exit(\"timeout\")\n\n\n@pytest.fixture(autouse=True)\ndef set_random_seed(request):\n    seed = 1\n    random.seed(seed)\n    torch.manual_seed(seed)\n    np.random.seed(seed)\n"
  },
  {
    "path": "corenet/__init__.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport warnings\n\nfrom corenet.constants import is_external_env, is_test_env\nfrom corenet.utils.logger import match_warning_message\n\nKNOWN_WARNINGS = [\n    ##\n    # Torchtext deprecation warning:\n    ##\n    match_warning_message(\n        \" /!\\\\ IMPORTANT WARNING ABOUT TORCHTEXT STATUS /!\\\\ Torchtext is deprecated\"\n        \" and the last released version will be 0.18 (this one).\"\n    ),\n    ##\n    # The following warnings are raised by tests/metrics/test_coco_map.py:\n    ##\n    match_warning_message(\n        \"Creating a tensor from a list of numpy.ndarrays is extremely slow. Please\"\n        \" consider converting the list to a single numpy.ndarray with numpy.array()\"\n        \" before converting to a tensor.\"\n    ),\n    match_warning_message(\"unclosed file <\"),\n    ##\n    # The following warnings are raised by tests/loss_fns/test_class_weighting.py:\n    ##\n    match_warning_message(\n        \"`torch.testing.assert_allclose()` is deprecated since 1.12 and will be removed\"\n        \" in a future release. Please use `torch.testing.assert_close()` instead. You\"\n        \" can find detailed upgrade instructions in\"\n        \" https://github.com/pytorch/pytorch/issues/61844.\"\n    ),\n    ##\n    # The following warnings are raised by \"import torchvision.datasets\":\n    ##\n    match_warning_message(\n        \"torch.utils._pytree._register_pytree_node is deprecated. Please use\"\n        \" torch.utils._pytree.register_pytree_node instead.\"\n    ),\n    ##\n    # The following warnings are raised by \"import coremltools\" (macOS only):\n    ##\n    match_warning_message(\n        \"Call to deprecated create function\",\n        \"Note: Create unlinked descriptors is going to go away. Please use get/find\"\n        \" descriptors from generated code or query the descriptor_pool.\",\n    ),\n]\n\n\ndef suppress_known_warnings() -> None:\n    \"\"\"\n    Suppresses warnings that are known to be safe for corenet, to avoid overwhelming\n    the standard error outputs (especially with multiple subprocesses).\n\n    Notes:\n    - We should invoke this function as early as possible (i.e. in corenet/__init__.py)\n        because some of the warnings are during the execution of the import statements.\n        We should suppress the known warnings before importing other modules.\n    - We SHOULD NOT invoke this function when corenet is imported from external\n        libraries because it enters the `warnings.catch_warnings(record=True)` context\n        manager without invoking its __exit__() method. This is only safe when we are\n        not already inside a `with warnings.catch_warnings():` context, which is the\n        case for corenet entrypoints.\n    \"\"\"\n    try:\n        # Importing corenet.internal inside the function to avoid cyclic dependency.\n        from corenet.internal import KNOWN_WARNINGS_INTERNAL\n    except ModuleNotFoundError:\n        KNOWN_WARNINGS_INTERNAL = []\n\n    known_warnings = KNOWN_WARNINGS + KNOWN_WARNINGS_INTERNAL\n    if len(known_warnings) == 0:\n        return\n\n    if is_test_env():\n        # In the test env, convert unsuppressed/unhandled warnings to errors.\n        # Filters listed later take precedence over those listed before them. Invoking\n        # filterwarnings(\"error\") first so that it becomes the default when warning is\n        # no handled by other filters.\n        warnings.filterwarnings(\"error\")\n\n    warnings.catch_warnings(record=True).__enter__()\n    for known_warning in known_warnings:\n        warnings.filterwarnings(\"ignore\", message=known_warning)\n\n\nif not is_external_env():\n    suppress_known_warnings()\n"
  },
  {
    "path": "corenet/__main__.py",
    "content": ""
  },
  {
    "path": "corenet/__version__.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\nversion = \"0.1.1\"\n"
  },
  {
    "path": "corenet/cli/__init__.py",
    "content": ""
  },
  {
    "path": "corenet/cli/entrypoints.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom typing import Dict, Tuple\n\n# Entrypoints is a mapping from shell executable name to (module, function) pair.\n# Having too many entrypoints in setup.py limits us our ability to add features or\n# refactor the code, because users who pull the latest changes will have to re-install\n# corenet in order for `setup.py` changes to apply.\n# A better practice is to stop introducing new entrypoints, and add subcommands to the\n# main `corenet` entrypoint. Currently, `corenet train` is identical to `corenet-train`.\nentrypoints: Dict[str, Tuple[str, str]] = {\n    \"corenet-train\": (\"corenet.cli.main_train\", \"main_worker\"),\n    \"corenet-eval\": (\"corenet.cli.main_eval\", \"main_worker\"),\n    \"corenet-eval-llmadapters\": (\n        \"corenet.cli.main_eval_llmadapters\",\n        \"main_eval_llmadapters\",\n    ),\n    \"corenet-eval-seg\": (\"corenet.cli.main_eval\", \"main_worker_segmentation\"),\n    \"corenet-eval-det\": (\"corenet.cli.main_eval\", \"main_worker_detection\"),\n    \"corenet-convert\": (\"corenet.cli.main_conversion\", \"main_worker_conversion\"),\n    \"corenet\": (\"corenet.cli.main\", \"main\"),\n}\n\nconsole_scripts = [\n    f\"{entrypoint} = {module}:{func}\"\n    for entrypoint, (module, func) in entrypoints.items()\n]\n"
  },
  {
    "path": "corenet/cli/main.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nimport importlib\nfrom itertools import chain\nfrom typing import Dict, List, Optional, Tuple\n\nfrom corenet.cli.entrypoints import entrypoints as oss_entrypoints\n\ntry:\n    from corenet.internal.cli.entrypoints import entrypoints as internal_entrypoints\nexcept ModuleNotFoundError:\n    internal_entrypoints = {}\n\n\ndef main(args: Optional[List[str]] = None) -> None:\n    \"\"\"\n    We are planning to deprecate `corenet-train`, `corenet-eval`, ... commands for\n    `corenet train` (the dash is removed), `corenet eval`, ... because adding/renaming\n    entrypoints will require `pip install -e .`. Most users don't reinstall corenet\n    after pulling the git repo. Hence, relying on a single entrypoint `corenet` with\n    subcommands is more future proof.\n    \"\"\"\n    entrypoints = {\n        k.replace(\"corenet-\", \"\"): v\n        for k, v in chain(oss_entrypoints.items(), internal_entrypoints.items())\n    }\n    parser = argparse.ArgumentParser()\n    parser.add_argument(\"entrypoint\", choices=list(entrypoints.keys()))\n    entrypoint_opts, args = parser.parse_known_args(args)\n    module_name, func_name = entrypoints[entrypoint_opts.entrypoint]\n    getattr(importlib.import_module(module_name), func_name)(args)\n"
  },
  {
    "path": "corenet/cli/main_benchmark.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport time\nfrom typing import Optional\n\nimport torch\nfrom torch.cuda.amp import autocast\n\nfrom corenet.engine.utils import autocast_fn\nfrom corenet.modeling import get_model\nfrom corenet.options.opts import get_benchmarking_arguments\nfrom corenet.utils import logger\nfrom corenet.utils.common_utils import device_setup\nfrom corenet.utils.pytorch_to_coreml import convert_pytorch_to_coreml\nfrom corenet.utils.tensor_utils import create_rand_tensor\n\n\ndef cpu_timestamp(*args, **kwargs):\n    # perf_counter returns time in seconds\n    return time.perf_counter()\n\n\ndef cuda_timestamp(cuda_sync=False, device=None, *args, **kwargs):\n    if cuda_sync:\n        torch.cuda.synchronize(device=device)\n    # perf_counter returns time in seconds\n    return time.perf_counter()\n\n\ndef step(\n    time_fn,\n    model,\n    example_inputs,\n    autocast_enable: False,\n    amp_precision: Optional[str] = \"float16\",\n):\n    start_time = time_fn()\n    with autocast_fn(enabled=autocast_enable, amp_precision=amp_precision):\n        model(example_inputs)\n    end_time = time_fn(cuda_sync=True)\n    return end_time - start_time\n\n\ndef main_benchmark():\n    # set-up\n    opts = get_benchmarking_arguments()\n    # device set-up\n    opts = device_setup(opts)\n\n    norm_layer = getattr(opts, \"model.normalization.name\", \"batch_norm\")\n    if norm_layer.find(\"sync\") > -1:\n        norm_layer = norm_layer.replace(\"sync_\", \"\")\n        setattr(opts, \"model.normalization.name\", norm_layer)\n    device = getattr(opts, \"dev.device\", torch.device(\"cpu\"))\n    if torch.cuda.device_count() == 0:\n        device = torch.device(\"cpu\")\n    time_fn = cpu_timestamp if device == torch.device(\"cpu\") else cuda_timestamp\n    warmup_iterations = getattr(opts, \"benchmark.warmup_iter\", 10)\n    iterations = getattr(opts, \"benchmark.n_iter\", 50)\n    batch_size = getattr(opts, \"benchmark.batch_size\", 1)\n    mixed_precision = (\n        False\n        if device == torch.device(\"cpu\")\n        else getattr(opts, \"common.mixed_precision\", False)\n    )\n    mixed_precision_dtype = getattr(opts, \"common.mixed_precision_dtype\", \"float16\")\n\n    # load the model\n    model = get_model(opts)\n    model.eval()\n    # print model information\n    model.info()\n\n    example_inp = create_rand_tensor(opts=opts, device=\"cpu\", batch_size=batch_size)\n\n    # cool down for 5 seconds\n    time.sleep(5)\n\n    if getattr(opts, \"benchmark.use_jit_model\", False):\n        converted_models_dict = convert_pytorch_to_coreml(\n            opts=None,\n            pytorch_model=model,\n            input_tensor=example_inp,\n            jit_model_only=True,\n        )\n        model = converted_models_dict[\"jit\"]\n    model = model.to(device=device)\n    example_inp = example_inp.to(device=device)\n    model.eval()\n\n    with torch.no_grad():\n        # warm-up\n        for i in range(warmup_iterations):\n            step(\n                time_fn=time_fn,\n                model=model,\n                example_inputs=example_inp,\n                autocast_enable=mixed_precision,\n                amp_precision=mixed_precision_dtype,\n            )\n\n        n_steps = n_samples = 0.0\n\n        # run benchmark\n        for i in range(iterations):\n            step_time = step(\n                time_fn=time_fn,\n                model=model,\n                example_inputs=example_inp,\n                autocast_enable=mixed_precision,\n                amp_precision=mixed_precision_dtype,\n            )\n            n_steps += step_time\n            n_samples += batch_size\n\n        logger.info(\n            \"Number of samples processed per second: {:.3f}\".format(n_samples / n_steps)\n        )\n\n\nif __name__ == \"__main__\":\n    main_benchmark()\n"
  },
  {
    "path": "corenet/cli/main_conversion.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport os\nfrom typing import List, Optional\n\nimport coremltools as ct\nimport torch\n\nfrom corenet.constants import TMP_RES_FOLDER\nfrom corenet.modeling import get_model\nfrom corenet.options.opts import get_conversion_arguments\nfrom corenet.utils import logger\nfrom corenet.utils.checkpoint_utils import CHECKPOINT_EXTN\nfrom corenet.utils.pytorch_to_coreml import convert_pytorch_to_coreml\n\n\ndef main_worker_conversion(args: Optional[List[str]] = None):\n    opts = get_conversion_arguments(args=args)\n\n    # set coreml conversion flag to true\n    setattr(opts, \"common.enable_coreml_compatible_module\", True)\n\n    norm_layer = getattr(opts, \"model.normalization.name\", \"batch_norm\")\n    if norm_layer.find(\"sync\") > -1:\n        norm_layer = norm_layer.replace(\"sync_\", \"\")\n        setattr(opts, \"model.normalization.name\", norm_layer)\n\n    model = get_model(opts)\n    model_name = model.__class__.__name__\n\n    model.eval()\n\n    coreml_extn = getattr(opts, \"conversion.coreml_extn\", \"mlmodel\")\n\n    results_folder = getattr(opts, \"common.results_loc\", TMP_RES_FOLDER)\n    if not os.path.isdir(results_folder):\n        os.makedirs(results_folder)\n\n    model_dst_loc = \"{}/{}.{}\".format(results_folder, model_name, coreml_extn)\n\n    if os.path.isfile(model_dst_loc):\n        os.remove(model_dst_loc)\n\n    try:\n        convert_to = \"mlprogram\" if coreml_extn == \"mlpackage\" else \"neuralnetwork\"\n        minimum_deployment_target = getattr(\n            opts, \"conversion.minimum_deployment_target\"\n        )\n        if minimum_deployment_target is not None:\n            minimum_deployment_target = ct.target[minimum_deployment_target]\n        compute_precision = getattr(opts, \"conversion.compute_precision\")\n        if compute_precision is not None:\n            compute_precision = ct.precision[compute_precision]\n\n        converted_models_dict = convert_pytorch_to_coreml(\n            opts=opts,\n            pytorch_model=model,\n            convert_to=convert_to,\n            minimum_deployment_target=minimum_deployment_target,\n            compute_precision=compute_precision,\n        )\n        coreml_model = converted_models_dict[\"coreml\"]\n        jit_model = converted_models_dict[\"jit\"]\n        jit_optimized = converted_models_dict[\"jit_optimized\"]\n\n        coreml_model.save(model_dst_loc)\n\n        torch.jit.save(\n            jit_model,\n            model_dst_loc.replace(f\".{coreml_extn}\", f\"_jit.{CHECKPOINT_EXTN}\"),\n        )\n        jit_optimized._save_for_lite_interpreter(\n            model_dst_loc.replace(f\".{coreml_extn}\", f\"_jit_opt.{CHECKPOINT_EXTN}\")\n        )\n\n        logger.log(\"PyTorch model converted to CoreML successfully.\")\n        logger.log(\"CoreML model location: {}\".format(model_dst_loc))\n    except Exception as e:\n        logger.error(\n            \"PyTorch to CoreML conversion failed. See below for error details:\\n {}\".format(\n                e\n            )\n        )\n\n\nif __name__ == \"__main__\":\n    main_worker_conversion()\n"
  },
  {
    "path": "corenet/cli/main_eval.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\nfrom typing import List, Optional\n\nfrom corenet.options.opts import get_training_arguments\nfrom corenet.train_eval_pipelines import (\n    TRAIN_EVAL_PIPELINE_REGISTRY,\n    BaseTrainEvalPipeline,\n)\n\n\ndef main(train_eval_pipeline: BaseTrainEvalPipeline):\n    \"\"\"\n    This function will be invoked on each gpu worker process.\n\n    Args:\n        train_eval_pipeline: Provides major pipeline components. The class to be used is\n            configurable by \"--train-eval-pipeline.name\" opt. By default, an instance of\n            ``train_eval_pipelines.TrainEvalPipeline`` will be passed to this function.\n    \"\"\"\n    evaluation_engine = train_eval_pipeline.evaluation_engine\n    evaluation_engine.run()\n\n\ndef main_worker(args: Optional[List[str]] = None):\n    opts = get_training_arguments(args=args)\n    pipeline_name = getattr(opts, \"train_eval_pipeline.name\")\n    train_eval_pipeline = TRAIN_EVAL_PIPELINE_REGISTRY[pipeline_name](opts=opts)\n    launcher = train_eval_pipeline.launcher\n    launcher(main)\n\n\n# for segmentation and detection, we follow a different evaluation pipeline that allows to save the results too\ndef main_worker_segmentation(args: Optional[List[str]] = None, **kwargs):\n    from corenet.engine.eval_segmentation import main_segmentation_evaluation\n\n    main_segmentation_evaluation(args=args, **kwargs)\n\n\ndef main_worker_detection(args: Optional[List[str]] = None, **kwargs):\n    from corenet.engine.eval_detection import main_detection_evaluation\n\n    main_detection_evaluation(args=args, **kwargs)\n\n\nif __name__ == \"__main__\":\n    main_worker()\n"
  },
  {
    "path": "corenet/cli/main_eval_llmadapters.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\n\"\"\"\nEvaluate commonsense reasoning performance on 8 commonsense reasoning tasks,\ncollectively called \"CommonSense 170k\" in LLM-Adapters <https://arxiv.org/abs/2304.01933>.\n\nCode is adapted from https://github.com/AGI-Edgerunners/LLM-Adapters\n\nIn addition to the generation-style evaluation used by LLM-Adapters, we add a\nmultiple-choice-style evaluation. This massively improves results for small\nmodels.\n\nCurrently, this only supports the LLama tokenizer. We may add support for\nother tokenizers in the future.\n\"\"\"\n\nimport collections\nimport copy\nimport json\nimport os\nimport random\nimport re\nfrom typing import Any, Dict, List, Optional, Tuple\n\nimport numpy as np\nfrom tqdm import tqdm\n\nfrom corenet.data.datasets.language_modeling import commonsense_170k\nfrom corenet.data.text_tokenizer import build_tokenizer\n\n# Needs to be imported in a special way due to the hyphenated name.\ntry:\n    llmadapters = __import__(\"LLM-Adapters.commonsense_evaluate\")\nexcept:\n    llmadapters = None\nimport argparse\nimport torch\n\nfrom corenet.options.opts import get_lm_eval_arguments\nfrom corenet.utils import hf_adapter_utils, logger\nfrom corenet.utils.download_utils import get_local_path\n\ntry:\n    # For multiple-choice-style evaluation.\n    from lm_eval.models.huggingface import HFLM\n\nexcept:\n    HFLM = object\n\ntry:\n    from transformers import AutoTokenizer, GenerationConfig, LlamaTokenizer\nexcept ModuleNotFoundError as mnfe:\n    LlamaTokenizer = None\n    AutoTokenizer = None\n    GenerationConfig = None\n\n\nclass CoreNetLMEvalWrapper(HFLM):\n    \"\"\"\n    A wrapper to build a CoreNet model that inherits the HFLM API.\n\n    Args:\n        opts: The global arguments object.\n    \"\"\"\n\n    def __init__(self, opts: argparse.Namespace) -> None:\n\n        device = \"cuda\" if torch.cuda.is_available() else \"cpu\"\n        hf_config = hf_adapter_utils.CorenetToHFPretrainedConfig(**vars(opts))\n        tokenizer_path = getattr(opts, f\"text_tokenizer.sentence_piece.model_path\")\n        tokenizer_path = get_local_path(opts, tokenizer_path)\n        # Currently, we only support LLamaTokenizer for this evaluation.\n        hf_tokenizer = LlamaTokenizer.from_pretrained(tokenizer_path)\n        vocab_size = hf_tokenizer.vocab_size\n        hf_model = hf_adapter_utils.CorenetToHFPretrainedModel(hf_config, vocab_size)\n        hf_model.to(device=device)\n        # To ensure padding and batching don't cause issues, for now we only support\n        # a batch_size of 1. In some cases, our code handles position ids differently\n        # than other codebases, so we are extra cautious.\n        batch_size = 1\n\n        super().__init__(\n            pretrained=hf_model,\n            tokenizer=hf_tokenizer,\n            batch_size=batch_size,\n            max_length=getattr(opts, \"dataset.language_modeling.sequence_length\"),\n            trust_remote_code=True,\n            add_bos_token=getattr(opts, \"lm_eval_wrapper.add_sot_token\"),\n        )\n\n        self.opts = opts\n\n\ndef main_eval_llmadapters(args: Optional[List[str]] = None) -> None:\n    \"\"\"Main entry point for evaluation using LLM Adapters.\n\n    This differs from the lm-eval-harness because it uses a different prompting strategy.\n    We currently only support commonsense reasoning tasks.\n\n    Args:\n      args: A list of strings, as input on the command line.\n    \"\"\"\n    opts = get_lm_eval_arguments(args=args)\n    model_eval_wrapper = CoreNetLMEvalWrapper(opts)\n    tasks = getattr(opts, \"llmadapters_evaluation.datasets\")\n    dataset_dir = getattr(opts, \"llmadapters_evaluation.dataset_dir\")\n    device = \"cuda\" if torch.cuda.is_available() else \"cpu\"\n    results_loc = getattr(opts, \"common.results_loc\")\n    limit = getattr(opts, \"llmadapters_evaluation.limit\")\n    if limit is None:\n        limit = int(1e9)\n    multiple_choice = getattr(opts, \"llmadapters_evaluation.multiple_choice\")\n    os.makedirs(results_loc, exist_ok=True)\n\n    if multiple_choice:\n        main_func = main_multiple_choice\n    else:\n        main_func = main_generation\n\n    results = {}\n    for task in tasks:\n        save_file = f\"{results_loc}/{task}.json\"\n        results[task] = main_func(\n            task,\n            dataset_dir,\n            save_file,\n            model_eval_wrapper,\n            model_eval_wrapper.tokenizer,\n            device,\n            limit=limit,\n        )\n    with open(f\"{results_loc}/results.json\", \"w+\") as f:\n        json.dump(results, f, indent=4)\n\n\n### Functions for generation-style evaluation.\ndef main_generation(\n    dataset_name: str,\n    dataset_dir: str,\n    save_file: str,\n    model: CoreNetLMEvalWrapper,\n    tokenizer: AutoTokenizer,\n    device: str,\n    limit: int = 1e9,\n) -> None:\n    \"\"\"\n    Run generation-style evaluation for the given dataset and model.\n\n    Adapted from LLM-Adapters: https://github.com/AGI-Edgerunners/LLM-Adapters\n\n    Args:\n        dataset_name: The name of the dataset. E.g. \"boolq\" or \"piqa\".\n        dataset_dir: The directory which contains a dataset with the given name.\n        save_file: The path to which to save the results.\n        model: The model to evaluate.\n        tokenizer: The tokenizer to use with the model.\n        device: The device on which to evaluate.\n        limit: The maximum number of samples to process.\n    \"\"\"\n    dataset = json.load(open(os.path.join(dataset_dir, dataset_name, \"test.json\"), \"r\"))\n    # Shuffle the data. This is mainly useful if the ``limit''\n    # option is used. This way, results will be sampled from\n    # throughout the validation set.\n    random.seed(83652)\n    random.shuffle(dataset)\n    dataset = dataset[:limit]\n\n    total = len(dataset)\n    correct = 0\n    seen = 0\n    output_data = []\n    pbar = tqdm(total=total)\n    for idx, elem in enumerate(dataset):\n        seen += 1\n        instruction = elem.get(\"instruction\")\n\n        output = evaluate_sample_with_generation(model, tokenizer, instruction, device)\n\n        label = elem.get(\"answer\")\n        is_correct = False\n        predict = extract_answer_from_generation(dataset_name, output)\n        if label == predict:\n            correct += 1\n            is_correct = True\n        new_elem = copy.deepcopy(elem)\n        new_elem[\"output_pred\"] = output\n        new_elem[\"pred\"] = predict\n        new_elem[\"is_correct\"] = is_correct\n        output_data.append(new_elem)\n        logger.info(f\"EXAMPLE:\")\n        logger.info(f'> INSTRUCTION: {elem[\"instruction\"]}')\n        logger.info(f\"> OUTPUT: {output}\")\n        logger.info(f\"> PREDICTION: {predict}\")\n        logger.info(f\"> LABEL: {label}\")\n        logger.info(\"---------------\")\n        logger.info(f\"\\rtest:{idx + 1}/{total} | accuracy: {correct / seen}\")\n        logger.info(\"---------------\")\n        with open(save_file, \"w+\") as f:\n            json.dump(output_data, f, indent=4)\n        pbar.update(1)\n    pbar.close()\n    logger.info(\"\\n\")\n    logger.info(\"Test finished.\")\n    return {\"acc\": correct / seen}\n\n\ndef evaluate_sample_with_generation(\n    model: CoreNetLMEvalWrapper,\n    tokenizer: AutoTokenizer,\n    instruction: str,\n    device: str,\n    temperature: float = 0.1,\n    top_p: float = 0.75,\n    top_k: int = 40,\n    num_beams: int = 4,\n    max_new_tokens: int = 32,\n    **kwargs: Dict[str, Any],\n) -> str:\n    \"\"\"\n    Evaluate a sample with the given model.\n\n    Adapted from LLM-Adapters.\n\n    Args:\n        model: The model to evaluate.\n        tokenizer: The tokenizer to use with the model.\n        instruction: A common sense reasoning input.\n        device: The device on which to run.\n        temperature: The temperature parameter for generation.\n        top_p: The top_p parameter for generation.\n        top_k: The top_k parameter for generation.\n        num_beams: The number of beams to use in generation.\n        max_new_tokens: The maximum number of tokens to generate.\n        kwargs: Additional kwargs to pass to the GenerationConfig.\n    \"\"\"\n    prompt = llmadapters.commonsense_evaluate.generate_prompt(instruction)\n    tokenized_inputs = tokenizer(prompt, return_tensors=\"pt\", padding=True)\n    input_ids = tokenized_inputs[\"input_ids\"].to(device)\n    generation_config = GenerationConfig(\n        temperature=temperature,\n        top_p=top_p,\n        top_k=top_k,\n        num_beams=num_beams,\n        **kwargs,\n    )\n    with torch.no_grad():\n        generation_output = model._model.generate(\n            input_ids=input_ids,\n            generation_config=generation_config,\n            return_dict_in_generate=True,\n            output_scores=True,\n            max_new_tokens=max_new_tokens,\n            use_cache=False,\n        )\n    # The batch size is 1. We remove the batch dimension.\n    (s,) = generation_output.sequences\n    output = tokenizer.decode(s, skip_special_tokens=True)\n    output = output.split(\"### Response:\")[1].strip()\n    return output\n\n\ndef extract_answer_from_generation(dataset: str, sentence: str) -> str:\n    \"\"\"\n    Extract the multiple-choice answer from a sentence output by the model.\n\n    Adapted from LLM-Adapters: https://github.com/AGI-Edgerunners/LLM-Adapters\n\n    Args:\n        dataset: The name of the dataset.\n        sentence: The sentence from which to extract the answer.\n    Returns:\n        A string representing the answer.\n    \"\"\"\n    if dataset == \"boolq\":\n        sentence_ = sentence.strip()\n        pred_answers = re.findall(r\"true|false\", sentence_)\n        if not pred_answers:\n            return \"\"\n        return pred_answers[0]\n    elif dataset == \"piqa\":\n        sentence_ = sentence.strip()\n        pred_answers = re.findall(r\"solution1|solution2\", sentence_)\n        if not pred_answers:\n            return \"\"\n        return pred_answers[0]\n    elif dataset in [\"social_i_qa\", \"ARC-Challenge\", \"ARC-Easy\", \"openbookqa\"]:\n        sentence_ = sentence.strip()\n        pred_answers = re.findall(r\"answer1|answer2|answer3|answer4|answer5\", sentence_)\n        if not pred_answers:\n            return \"\"\n        return pred_answers[0]\n    elif dataset == \"hellaswag\":\n        sentence_ = sentence.strip()\n        pred_answers = re.findall(r\"ending1|ending2|ending3|ending4\", sentence_)\n        if not pred_answers:\n            return \"\"\n        return pred_answers[0]\n    elif dataset == \"winogrande\":\n        sentence_ = sentence.strip()\n        pred_answers = re.findall(r\"option1|option2\", sentence_)\n        if not pred_answers:\n            return \"\"\n        return pred_answers[0]\n    else:\n        raise ValueError(f\"Invalid dataset {dataset}.\")\n\n\n### Functions for MC-style evaluation.\ndef main_multiple_choice(\n    dataset_name: str,\n    dataset_dir: str,\n    save_file: str,\n    model: CoreNetLMEvalWrapper,\n    tokenizer: AutoTokenizer,\n    device: str,\n    limit: int = 1e9,\n) -> None:\n    \"\"\"\n    Run multiple-choice style evaluation.\n\n    NOTE: The tokenizer and device are unused, but are passed to make\n    the API consistent with @main_generation.\n\n    Args:\n        dataset_name: The name of the dataset. E.g. \"boolq\" or \"piqa\".\n        dataset_dir: The directory which contains a dataset with the given name.\n        save_file: The path to which to save the results.\n        model: The model to evaluate.\n        tokenizer: The tokenizer to use with the model.\n        device: The device on which to evaluate.\n        limit: The maximum number of samples to process.\n\n    \"\"\"\n    dataset = json.load(open(os.path.join(dataset_dir, dataset_name, \"test.json\"), \"r\"))\n    # Shuffle the data. This is mainly useful if the ``limit''\n    # option is used. This way, results will be sampled from\n    # throughout the validation set.\n    random.seed(83652)\n    random.shuffle(dataset)\n    dataset = dataset[:limit]\n\n    total = len(dataset)\n    correct = 0\n    correct_norm = 0\n    seen = 0\n    output_data = []\n    pbar = tqdm(total=total)\n    for idx, elem in enumerate(dataset):\n        seen += 1\n\n        chosen_value, chosen_norm_value = evaluate_likelihood(model, elem)\n\n        label = elem.get(\"answer\")\n        is_correct = False\n        is_correct_norm = False\n        if label == chosen_value:\n            correct += 1\n            is_correct = True\n        if label == chosen_norm_value:\n            correct_norm += 1\n            is_correct_norm = True\n        new_elem = copy.deepcopy(elem)\n        new_elem[\"output_pred\"] = chosen_value\n        new_elem[\"output_norm_pred\"] = chosen_norm_value\n        new_elem[\"is_correct\"] = is_correct\n        new_elem[\"is_correct_norm\"] = is_correct_norm\n        output_data.append(new_elem)\n        logger.info(\"EXAMPLE:\")\n        logger.info(f\"INSTRUCTION: {elem['instruction']}\")\n        logger.info(f\"OUTPUT: {chosen_value}\")\n        logger.info(f\"OUTPUT NORM: {chosen_norm_value}\")\n        logger.info(f\"LABEL: {label}\")\n        logger.info(\"---------------\")\n        logger.info(\n            f\"\\rtest:{idx + 1}/{total} | accuracy: {correct / seen} | accuracy norm {correct_norm / seen}\"\n        )\n        logger.info(\"---------------\")\n        with open(save_file, \"w+\") as f:\n            json.dump(output_data, f, indent=4)\n        pbar.update(1)\n    pbar.close()\n    logger.info(\"\\n\")\n    logger.info(\"Test finished.\")\n    return {\"acc\": correct / seen, \"acc_norm\": correct_norm / seen}\n\n\ndef evaluate_likelihood(\n    model: CoreNetLMEvalWrapper, data: Dict[str, str]\n) -> Tuple[str, str]:\n    \"\"\"\n    Evaluate the likelihood of all possible answers for a prompt. Return\n    the most likely one.\n\n    Args:\n        model: The model to use for evaluation.\n        data: The data point to use. It contains the prompt and all\n            possible answers. It contains the following keys: \"instruction\",\n            \"input\", \"output\", \"answer\".\n    Returns:\n        A tuple containing the strings representing the most likely answers\n        as measured by maximum loglikelihood and maximum normalized\n        loglikelihood.\n    \"\"\"\n    # Generate the set of possible instructions.\n    requests = get_loglikelihood_inputs(data)\n    model_outputs = model.loglikelihood(requests)\n\n    # Get the log likelihoods and the most likely answer..\n    likelihoods = [o[0] for o in model_outputs]\n    index = np.argmax(likelihoods)\n    output = requests[index].args[1].split(\" \")[-1]\n\n    # Get the log likelihoods (normalized by response length)\n    # and the most likely answer.\n    normalized_likelihoods = [\n        likelihoods[i] / len(requests[i].args[1]) for i in range(len(requests))\n    ]\n    index = np.argmax(normalized_likelihoods)\n    output_norm = requests[index].args[1].split(\" \")[-1]\n\n    return output, output_norm\n\n\nRequest = collections.namedtuple(\"Request\", \"args\")\n\n\ndef get_loglikelihood_inputs(data: Dict[str, str]) -> List[Request]:\n    \"\"\"\n    Helper function to create the inputs to the model's loglikelihood function.\n\n    Args:\n        data: The data point to use. It contains the prompt and all\n            possible answers. It contains the following keys: \"instruction\",\n            \"input\", \"output\", \"answer\".\n\n    Returns:\n        A list of Requests for the loglikelihood function.\n    \"\"\"\n\n    def generate_response(response_value):\n        return f\"the correct answer is {response_value}\"\n\n    possible_answers = []\n    instruction = data[\"instruction\"]\n    instruction_end = instruction.split(\"\\n\")[-1]\n    if re.match(\".*Answer format: true/false\", instruction_end):\n        possible_answers = [\"true\", \"false\"]\n    else:\n        for word in [\"answer\", \"ending\", \"option\", \"solution\"]:\n            if re.match(rf\".*Answer format: .*{word}(\\d)$\", instruction_end):\n                num_answers = int(instruction_end[-1])\n                possible_answers = [f\"{word}{num}\" for num in range(1, num_answers + 1)]\n\n    if len(possible_answers) == 0:\n        raise ValueError(f\"Could not find answer type.\")\n\n    context = commonsense_170k.generate_prompt_and_response(\n        {\"instruction\": instruction, \"output\": \"\", \"input\": \"\"}\n    )\n    request = []\n    for elem in possible_answers:\n        obj = Request(((context, generate_response(elem))))\n        request.append(obj)\n    return request\n\n\nif __name__ == \"__main__\":\n    main_eval_llmadapters()\n"
  },
  {
    "path": "corenet/cli/main_train.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom typing import List, Optional\n\nfrom torch.distributed.elastic.multiprocessing import errors\n\nfrom corenet.options.opts import get_training_arguments\nfrom corenet.train_eval_pipelines import (\n    TRAIN_EVAL_PIPELINE_REGISTRY,\n    BaseTrainEvalPipeline,\n)\n\n\n@errors.record\ndef callback(train_eval_pipeline: BaseTrainEvalPipeline) -> None:\n    \"\"\"\n    This function will be invoked on each gpu worker process.\n\n    Args:\n        train_eval_pipeline: Provides major pipeline components. The class to be used is\n            configurable by \"--train-eval-pipeline.name\" opt. By default, an instance of\n            ``train_eval_pipelines.TrainEvalPipeline`` will be passed to this function.\n    \"\"\"\n    train_sampler = train_eval_pipeline.train_sampler\n    train_eval_pipeline.training_engine.run(train_sampler=train_sampler)\n\n\ndef main_worker(args: Optional[List[str]] = None):\n    opts = get_training_arguments(args=args)\n    pipeline_name = getattr(opts, \"train_eval_pipeline.name\")\n    train_eval_pipeline = TRAIN_EVAL_PIPELINE_REGISTRY[pipeline_name](opts=opts)\n    launcher = train_eval_pipeline.launcher\n    launcher(callback)\n\n\nif __name__ == \"__main__\":\n    main_worker()\n"
  },
  {
    "path": "corenet/constants.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\nimport os\nimport re\nimport sys\nfrom pathlib import Path\nfrom typing import Any, Literal\n\n# LIBRARY_ROOT is the folder that contains `corenet/` module.\nLIBRARY_ROOT = Path(__file__).parent.parent\n\nMIN_TORCH_VERSION = \"1.11.0\"\n\nSUPPORTED_IMAGE_EXTNS = [\".png\", \".jpg\", \".jpeg\"]  # Add image formats here\nSUPPORTED_VIDEO_CLIP_VOTING_FN = [\"sum\", \"max\"]\nSUPPORTED_VIDEO_READER = [\"pyav\", \"decord\"]\n\nDEFAULT_IMAGE_WIDTH = DEFAULT_IMAGE_HEIGHT = 256\nDEFAULT_IMAGE_CHANNELS = 3\nDEFAULT_VIDEO_FRAMES = 8\nDEFAULT_LOG_FREQ = 500\n\nDEFAULT_ITERATIONS = 300000\nDEFAULT_EPOCHS = 300\nDEFAULT_MAX_ITERATIONS = DEFAULT_MAX_EPOCHS = 10000000\n\nDEFAULT_RESULTS_DIR = \"results\"\nDEFAULT_LOGS_DIR = \"results/logs\"\n\nTMP_RES_FOLDER = \"results_tmp\"\n\nTMP_CACHE_LOC = \"/tmp/corenet\"\n\nPath(TMP_CACHE_LOC).mkdir(parents=True, exist_ok=True)\n\nDATA_CACHE_DIR = \".corenet_data_cache\"\n\nPath(DATA_CACHE_DIR).mkdir(parents=True, exist_ok=True)\n\n\ndef get_corenet_env() -> Literal[\"pytest\", \"default\", \"external\"]:\n    \"\"\"\n    Returns:\n        One of the following values:\n        * \"pytest\" iff corenet is loaded by pytest. For further details, please read\n            the documentation of @is_test_env function.\n        * \"external\" iff corenet is imported by modules other than the corenet itself\n            and pytest.\n        * \"default\" iff corenet is imported by one of its own entrypoints.\n\n    Note: Please do not move this function to any module that has imports from corenet\n        or imports for third-party non-builtin modules. The reason is that we invoke\n        this function in corenet/__init__.py in order to suppress warnings *before*\n        importing third-party libraries.\n    \"\"\"\n    result = os.environ.get(\"CORENET_ENTRYPOINT\")\n    if result in (None, \"\"):\n        # We fallback to \"external\", unless we detect corenet's default entrypoints\n        # in sys.argv.\n        result = \"external\"\n\n        if len(sys.argv) > 0 and Path(sys.argv[0]).name.startswith(\"corenet-\"):\n            # This branch activates when running \"corenet-train\", etc. in commandline.\n            os.environ[\"CORENET_ENTRYPOINT\"] = \"default\"\n            result = \"default\"\n        elif len(sys.argv) > 1 and any(\n            re.match(r\"corenet[./](internal[./])?cli[./]\", arg) for arg in sys.argv[1:]\n        ):\n            # This branch activates when running \"python corenet/cli/main_train.py\"\n            # or running \"python -m corenet.cli.main_train.\"\n            os.environ[\"CORENET_ENTRYPOINT\"] = \"default\"\n            result = \"default\"\n\n    if result not in (\"pytest\", \"default\", \"external\"):\n        raise ValueError(\n            f\"Got invalid value for environment variable CORENET_ENTRYPOINT={result}.\"\n        )\n    return result\n\n\ndef is_test_env() -> bool:\n    \"\"\"\n    Returns:\n        True iff the corenet module is loaded by pytest.\n\n    Note:\n        - `CORENET_ENTRYPOINT=pytest` environment variable is set by `conftest.py` file.\n\n        - Previously, we used to rely on the existence of \"PYTEST_CURRENT_TEST\" env var,\n        which is set automatically by pytest, rather than CORENET_ENTRYPOINT=pytest.\n        But the issue was that the `conftest.py` itself and some fixtures are run before\n        \"PYTEST_CURRENT_TEST\" gets set.\n    \"\"\"\n    return get_corenet_env() == \"pytest\"\n\n\ndef is_external_env() -> bool:\n    \"\"\"\n    Returns:\n        True iff the corenet module is loaded by modules other than the corenet itself\n            and pytest\n    \"\"\"\n    return get_corenet_env() == \"external\"\n\n\ndef if_test_env(then: Any, otherwise: Any) -> Any:\n    return then if get_corenet_env() == \"pytest\" else otherwise\n"
  },
  {
    "path": "corenet/data/__init__.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom corenet.data.data_loaders import create_test_loader, create_train_val_loader\n"
  },
  {
    "path": "corenet/data/collate_fns/__init__.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\n\nfrom corenet.utils import logger\nfrom corenet.utils.registry import Registry\n\nCOLLATE_FN_REGISTRY = Registry(\n    \"collate_fn\",\n    lazy_load_dirs=[\"corenet/data/collate_fns\"],\n    internal_dirs=[\"corenet/internal\", \"corenet/internal/projects/*\"],\n)\n\n\ndef arguments_collate_fn(parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n    \"\"\"Add arguments related to collate function\"\"\"\n    group = parser.add_argument_group(\"Collate function arguments\")\n    group.add_argument(\n        \"--dataset.collate-fn-name-train\",\n        type=str,\n        default=\"pytorch_default_collate_fn\",\n        help=\"Name of collate function for training. Defaults to pytorch_default_collate_fn.\",\n    )\n    group.add_argument(\n        \"--dataset.collate-fn-name-val\",\n        type=str,\n        default=\"pytorch_default_collate_fn\",\n        help=\"Name of collate function for validation. Defaults to pytorch_default_collate_fn.\",\n    )\n    group.add_argument(\n        \"--dataset.collate-fn-name-test\",\n        type=str,\n        default=\"pytorch_default_collate_fn\",\n        help=\"Name of collate function used for evaluation. \"\n        \"Default is pytorch_default_collate_fn.\",\n    )\n    return parser\n\n\ndef build_collate_fn(opts, *args, **kwargs):\n    collate_fn_name_train = getattr(opts, \"dataset.collate_fn_name_train\")\n\n    if collate_fn_name_train is None:\n        logger.error(\n            \"Please specify collate function for training dataset using \"\n            \"--dataset.collate-fn-name-train\"\n        )\n\n    collate_fn_name_val = getattr(opts, \"dataset.collate_fn_name_val\")\n    if collate_fn_name_val is None:\n        logger.error(\n            \"Please specify collate function for training dataset using \"\n            \"--dataset.collate-fn-name-val\"\n        )\n\n    collate_fn_train = COLLATE_FN_REGISTRY[collate_fn_name_train]\n    collate_fn_val = COLLATE_FN_REGISTRY[collate_fn_name_val]\n    return collate_fn_train, collate_fn_val\n\n\ndef build_test_collate_fn(opts, *args, **kwargs):\n    collate_fn_name_test = getattr(opts, \"dataset.collate_fn_name_test\")\n    # for test time\n    if collate_fn_name_test is not None:\n        return COLLATE_FN_REGISTRY[collate_fn_name_test]\n    return None\n"
  },
  {
    "path": "corenet/data/collate_fns/byteformer_collate_functions.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\n\"\"\"This file contains collate functions used by ByteFormer.\n\nSince the model operates on a variety of input types, these collate functions\nare not associated with a particular dataset.\n\nThese transforms are applied before the model (rather than inside the model) to\ntake advantage of parallelism, and to avoid the need to move tensors from the\nGPU, back to the CPU, then back to GPU (since these transforms cannot be done\non GPU).\n\"\"\"\n\nimport argparse\nfrom typing import Dict, List, Mapping, Optional, Union\n\nimport torch\nfrom torch import Tensor\nfrom torch.nn import functional\n\nfrom corenet.data.collate_fns import COLLATE_FN_REGISTRY, collate_functions\nfrom corenet.data.transforms import audio_bytes, image_bytes\n\n\n@COLLATE_FN_REGISTRY.register(name=\"byteformer_image_collate_fn\")\ndef byteformer_image_collate_fn(\n    batch: List[Mapping[str, Tensor]], opts: argparse.Namespace\n) -> Mapping[str, Tensor]:\n    \"\"\"\n    Apply augmentations specific to `ByteFormer <https://arxiv.org/abs/2306.00238>`_\n    image training, then perform padded collation.\n\n    Args:\n        batch: The batch of data.\n        opts: The global arguments.\n\n    Returns:\n        The modified batch.\n    \"\"\"\n    batch = apply_pil_save(batch, opts)\n    batch = apply_shuffle_bytes(batch, opts)\n    batch = apply_mask_positions(batch, opts)\n    batch = apply_random_uniform_noise(batch, opts)\n    batch = apply_byte_permutation(batch, opts)\n    batch = apply_padding(batch, opts)\n    batch = collate_functions.pytorch_default_collate_fn(batch, opts)\n    return batch\n\n\ndef apply_padding(\n    batch: List[Mapping[str, Union[Dict[str, Tensor], Tensor]]],\n    opts: argparse.Namespace,\n    key: Optional[str] = None,\n) -> List[Mapping[str, Tensor]]:\n    \"\"\"\n    Apply padding to make samples the same length.\n\n    The input is a list of dictionaries of the form:\n        [{\"samples\": @entry, ...}, ...].\n    If @key is specified, @entry has the form {@key: @value}, where @value\n    corresponds to the entry that should be padded. Otherwise, @entry is assumed\n    to be a tensor.\n\n    The tensor mentioned in the above paragraph will have shape [batch_size,\n        sequence_length, ...].\n\n    Args:\n        batch: The batch of data.\n        opts: The global arguments.\n        key: The key of the sample element to pad. If @key is None, the entry\n            is assumed to be a tensor.\n\n    Returns:\n        The modified batch of size [batch_size, padded_sequence_length, ...].\n    \"\"\"\n\n    def get_entry(\n        entry: Union[Dict[str, Tensor], Tensor], key: Optional[str]\n    ) -> Tensor:\n        \"\"\"\n        Helper function to deal with the cases where entries in the samples.\n\n        Args:\n            entry: Either a tensor of shape [batch_size, sequence_length, ...],\n                or a dictionary containing {@key: tensor of shape\n                [batch_size, sequence_length, ...]}.\n        Returns:\n            A tensor of shape [batch_size, ...].\n        \"\"\"\n        if isinstance(entry, dict):\n            return entry[key]\n        if key is not None:\n            raise ValueError(f\"Key should not be specified if entries are not dicts.\")\n        return entry\n\n    if get_entry(batch[0][\"samples\"], key).dim() != 1:\n        # Padding only applies to 1d tensors.\n        return batch\n    padding_idx = getattr(opts, \"model.classification.byteformer.padding_index\")\n    # Tensors have shape [batch_size, sequence_length, ...]. Get the maximum\n    # sequence length.\n    padded_seq_len = max(get_entry(be[\"samples\"], key).shape[0] for be in batch)\n    for elem in batch:\n        sample = get_entry(elem[\"samples\"], key)  # [batch_size, sequence_length, ...].\n        sample = functional.pad(\n            sample, (0, padded_seq_len - sample.shape[0]), value=padding_idx\n        )  # [batch_size, padded_sequence_length, ...].\n        if isinstance(elem[\"samples\"], dict):\n            elem[\"samples\"][key] = sample\n        else:\n            elem[\"samples\"] = sample\n    return batch\n\n\ndef apply_pil_save(\n    batch: List[Mapping[str, Tensor]],\n    opts: argparse.Namespace,\n) -> List[Mapping[str, Tensor]]:\n    \"\"\"\n    Apply the PILSave transform to each batch element.\n\n    Args:\n        batch: The batch of data.\n        opts: The global arguments.\n\n    Returns:\n        The modified batch.\n    \"\"\"\n    if getattr(opts, \"image_augmentation.pil_save.enable\"):\n        transform = image_bytes.PILSave(opts)\n        for i, elem in enumerate(batch):\n            batch[i] = transform(elem)\n    return batch\n\n\ndef apply_shuffle_bytes(\n    batch: List[Mapping[str, Tensor]],\n    opts: argparse.Namespace,\n) -> List[Mapping[str, Tensor]]:\n    \"\"\"\n    Apply the ShuffleBytes transform to each batch element.\n\n    Args:\n        batch: The batch of data.\n        opts: The global arguments.\n\n    Returns:\n        The modified batch.\n    \"\"\"\n    if getattr(opts, \"image_augmentation.shuffle_bytes.enable\"):\n        transform = image_bytes.ShuffleBytes(opts)\n        for i, elem in enumerate(batch):\n            batch[i] = transform(elem)\n    return batch\n\n\ndef apply_mask_positions(\n    batch: List[Mapping[str, Tensor]], opts: argparse.Namespace\n) -> List[Mapping[str, Tensor]]:\n    \"\"\"\n    Apply the MaskPositions transform to each batch element.\n\n    Args:\n        batch: The batch of data.\n        opts: The global arguments.\n\n    Returns:\n        The modified batch.\n    \"\"\"\n    if getattr(opts, \"image_augmentation.mask_positions.enable\"):\n        transform = image_bytes.MaskPositions(opts)\n        for i, elem in enumerate(batch):\n            batch[i] = transform(elem)\n    return batch\n\n\ndef apply_random_uniform_noise(\n    batch: List[Mapping[str, Tensor]], opts: argparse.Namespace\n) -> List[Mapping[str, Tensor]]:\n    \"\"\"\n    Apply the RandomUniformNoise transform to each batch element.\n\n    Args:\n        batch: The batch of data.\n        opts: The global arguments.\n\n    Returns:\n        The modified batch.\n    \"\"\"\n    if getattr(opts, \"image_augmentation.random_uniform.enable\"):\n        transform = image_bytes.RandomUniformNoise(opts)\n        for i, elem in enumerate(batch):\n            batch[i] = transform(elem)\n    return batch\n\n\ndef apply_byte_permutation(\n    batch: List[Mapping[str, Tensor]], opts: argparse.Namespace\n) -> List[Mapping[str, Tensor]]:\n    \"\"\"\n    Apply the BytePermutation transform to each batch element.\n\n    Args:\n        batch: The batch of data.\n        opts: The global arguments.\n\n    Returns:\n        The modified batch.\n    \"\"\"\n    if getattr(opts, \"image_augmentation.byte_permutation.enable\"):\n        transform = image_bytes.BytePermutation(opts)\n        for i, elem in enumerate(batch):\n            batch[i] = transform(elem)\n    return batch\n\n\ndef apply_torchaudio_save(\n    batch: List[Mapping[str, Tensor]], opts: argparse.Namespace\n) -> List[Mapping[str, Tensor]]:\n    \"\"\"\n    Apply the TorchaudioSave transform to each batch element.\n\n    Args:\n        batch: The batch of data.\n        opts: The global arguments.\n\n    Returns:\n        The modified batch.\n    \"\"\"\n    if getattr(opts, \"audio_augmentation.torchaudio_save.enable\"):\n        transform = audio_bytes.TorchaudioSave(opts)\n        for i, elem in enumerate(batch):\n            batch[i] = transform(elem)\n    return batch\n\n\n@COLLATE_FN_REGISTRY.register(name=\"byteformer_audio_collate_fn\")\ndef byteformer_audio_collate_fn(\n    batch: List[Mapping[str, Tensor]], opts: argparse.Namespace\n) -> Mapping[str, Tensor]:\n    \"\"\"\n    Apply augmentations specific to ByteFormer audio training, then perform\n    padded collation.\n\n    Args:\n        batch: The batch of data.\n        opts: The global arguments.\n\n    Returns:\n        The modified batch.\n    \"\"\"\n    batch = apply_torchaudio_save(batch, opts)\n    batch = apply_padding(batch, opts, \"audio\")\n    # Remove the metadata, which is no longer needed.\n    for elem in batch:\n        del elem[\"metadata\"]\n    batch = collate_functions.pytorch_default_collate_fn(batch, opts)\n    return batch\n"
  },
  {
    "path": "corenet/data/collate_fns/collate_functions.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\nimport argparse\nfrom typing import Any, List, Mapping\n\nimport torch\nfrom torch import Tensor\nfrom torch.utils.data import default_collate\n\nfrom corenet.data.collate_fns import COLLATE_FN_REGISTRY\nfrom corenet.utils import logger\n\n\n@COLLATE_FN_REGISTRY.register(name=\"pytorch_default_collate_fn\")\ndef pytorch_default_collate_fn(batch: Any, *args, **kwargs) -> Any:\n    \"\"\"A wrapper around PyTorch's default collate function.\"\"\"\n    batch = default_collate(batch)\n    return batch\n\n\n@COLLATE_FN_REGISTRY.register(name=\"unlabeled_image_data_collate_fn\")\ndef unlabeled_image_data_collate_fn(\n    batch: List[Mapping[str, Any]], opts: argparse.Namespace\n) -> Mapping[str, Any]:\n    \"\"\"\n    Combines a list of dictionaries into a single dictionary by concatenating matching fields.\n\n    Each input dictionary is expected to have items with `samples` and `sample_id` as keys. The value for\n    `samples` is expected to be a tensor and the value for `sample_id` is expected to be an integer.\n\n    This function adds `targets` field to the output dictionary with dummy values to meet the expectations of\n    training engine.\n\n    Args:\n        batch: A list of dictionaries\n        opts: An argparse.Namespace instance.\n\n    Returns:\n        A dictionary with `samples`, `sample_id` and `targets` as keys.\n    \"\"\"\n    batch_size = len(batch)\n    sample_size = [batch_size, *batch[0][\"samples\"].shape]\n    img_dtype = batch[0][\"samples\"].dtype\n\n    samples = torch.zeros(size=sample_size, dtype=img_dtype)\n    sample_ids = torch.zeros(size=[batch_size], dtype=torch.long)\n    for i, batch_i in enumerate(batch):\n        samples[i] = batch_i[\"samples\"]\n        sample_ids[i] = batch_i[\"sample_id\"]\n\n    channels_last = getattr(opts, \"common.channels_last\")\n    if channels_last:\n        samples = samples.to(memory_format=torch.channels_last)\n\n    # Add dummy labels to meet the expectations of training engine.\n    dummy_labels = torch.full(size=[batch_size], fill_value=0, dtype=torch.long)\n\n    return {\"samples\": samples, \"sample_id\": sample_ids, \"targets\": dummy_labels}\n\n\n@COLLATE_FN_REGISTRY.register(name=\"image_classification_data_collate_fn\")\ndef image_classification_data_collate_fn(\n    batch: List[Mapping[str, Any]], opts: argparse.Namespace\n) -> Mapping[str, Any]:\n    \"\"\"Combines a list of dictionaries into a single dictionary by concatenating matching fields.\n\n    Each input dictionary is expected  to have items with `samples`,`sample_id` and `targets` as keys. The value for\n    `samples` is expected to be a tensor and the values for `sample_id` and `targets` are expected to be integers.\n\n    Args:\n        batch: A list of dictionaries\n        opts: An argparse.Namespace instance.\n\n    Returns:\n        A dictionary with `samples`, `sample_id` and `targets` as keys.\n    \"\"\"\n    batch_size = len(batch)\n    img_size = [batch_size, *batch[0][\"samples\"].shape]\n    img_dtype = batch[0][\"samples\"].dtype\n\n    images = torch.zeros(size=img_size, dtype=img_dtype)\n    sample_ids = torch.zeros(size=[batch_size], dtype=torch.long)\n    labels = torch.full(size=[batch_size], fill_value=-1, dtype=torch.long)\n    valid_indexes = []\n    for i, batch_i in enumerate(batch):\n        images[i] = batch_i[\"samples\"]\n        sample_ids[i] = batch_i[\"sample_id\"]\n\n        label_i = batch_i[\"targets\"]\n        labels[i] = label_i\n        if label_i != -1:\n            valid_indexes.append(i)\n\n    valid_indexes = torch.tensor(valid_indexes, dtype=torch.long)\n    images = torch.index_select(images, dim=0, index=valid_indexes)\n    sample_ids = torch.index_select(sample_ids, dim=0, index=valid_indexes)\n    labels = torch.index_select(labels, dim=0, index=valid_indexes)\n\n    channels_last = getattr(opts, \"common.channels_last\")\n    if channels_last:\n        images = images.to(memory_format=torch.channels_last)\n\n    return {\"samples\": images, \"targets\": labels, \"sample_id\": sample_ids}\n\n\n@COLLATE_FN_REGISTRY.register(name=\"default_collate_fn\")\ndef default_collate_fn(\n    batch: List[Mapping[str, Tensor]], opts: argparse.Namespace\n) -> Mapping[str, Tensor]:\n    \"\"\"Combines a list of dictionaries into a single dictionary by concatenating matching fields.\n\n    Args:\n        batch: A list of dictionaries\n        opts: An argparse.Namespace instance.\n\n    Returns:\n        A dictionary with the same keys as batch[0].\n    \"\"\"\n    batch_size = len(batch)\n\n    # get the keys for first element in the list, assuming all elements have the same keys\n    keys = list(batch[0].keys())\n\n    new_batch = {k: [] for k in keys}\n    for b in range(batch_size):\n        for k in keys:\n            new_batch[k].append(batch[b][k])\n\n    # stack the keys\n    for k in keys:\n        batch_elements = new_batch.pop(k)\n\n        if isinstance(batch_elements[0], (int, float)):\n            # list of ints or floats\n            batch_elements = torch.as_tensor(batch_elements)\n        else:\n            # stack tensors (including 0-dimensional)\n            try:\n                batch_elements = torch.stack(batch_elements, dim=0).contiguous()\n            except Exception as e:\n                logger.error(\"Unable to stack the tensors. Error: {}\".format(e))\n\n        new_batch[k] = batch_elements\n\n    return new_batch\n"
  },
  {
    "path": "corenet/data/data_loaders.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nfrom functools import partial\nfrom typing import Mapping, Optional, Tuple, Union\n\nfrom torch.utils.data import IterableDataset\nfrom torch.utils.data.sampler import Sampler\n\nfrom corenet.data.collate_fns import build_collate_fn, build_test_collate_fn\nfrom corenet.data.datasets import BaseDataset, get_test_dataset, get_train_val_datasets\nfrom corenet.data.loader.dataloader import CoreNetDataLoader\nfrom corenet.data.sampler import build_sampler\nfrom corenet.utils import logger\nfrom corenet.utils.ddp_utils import is_master\nfrom corenet.utils.tensor_utils import image_size_from_opts\n\n\ndef create_test_loader(opts: argparse.Namespace) -> CoreNetDataLoader:\n    \"\"\"Helper function to create and return a dataset loader for test dataset from command-line arguments\"\"\"\n    is_master_node = is_master(opts)\n    test_dataset = get_test_dataset(opts)\n    if isinstance(test_dataset, IterableDataset):\n        test_sampler = None\n        batch_size = getattr(opts, \"dataset.eval_batch_size0\")\n        assert batch_size > 0, (\n            f\"For iterable datasets, we need batch size > 0 but got {batch_size}. \"\n            f\"Please specify batch size using 'dataset.eval_batch_size0' argument in the config file.\"\n        )\n    else:\n        n_test_samples = get_num_data_samples_as_int_or_mapping(test_dataset)\n\n        # The sampler reads the batch size for validation/test jobs using 'dataset.val_batch_size0'\n        # So, we override the value of validation batch size argument with evaluation batch size argument.\n        setattr(\n            opts,\n            \"dataset.val_batch_size0\",\n            getattr(opts, \"dataset.eval_batch_size0\"),\n        )\n\n        # we don't need variable batch sampler for evaluation\n        sampler_name = getattr(opts, \"sampler.name\", \"batch_sampler\")\n        crop_size_h, crop_size_w = image_size_from_opts(opts)\n        if sampler_name.find(\"var\") > -1:\n            setattr(opts, \"sampler.name\", \"batch_sampler\")\n            setattr(opts, \"sampler.bs.crop_size_width\", crop_size_w)\n            setattr(opts, \"sampler.bs.crop_size_height\", crop_size_h)\n\n        test_sampler = build_sampler(\n            opts=opts,\n            n_data_samples=n_test_samples,\n            is_training=False,\n            get_item_metadata=test_dataset.get_item_metadata,\n        )\n        # for non-iterable dataset, batch size is handled inside the sampler.\n        batch_size = 1\n        if is_master_node:\n            logger.log(f\"Evaluation sampler details: {test_sampler}\")\n\n    collate_fn_test = build_test_collate_fn(opts=opts)\n\n    data_workers = getattr(opts, \"dataset.workers\")\n    persistent_workers = getattr(opts, \"dataset.persistent_workers\") and (\n        data_workers > 0\n    )\n    pin_memory = getattr(opts, \"dataset.pin_memory\")\n\n    test_loader = CoreNetDataLoader(\n        dataset=test_dataset,\n        batch_size=batch_size,\n        batch_sampler=test_sampler,\n        num_workers=data_workers,\n        pin_memory=pin_memory,\n        persistent_workers=persistent_workers,\n        collate_fn=(\n            partial(collate_fn_test, opts=opts) if collate_fn_test is not None else None\n        ),\n    )\n    return test_loader\n\n\ndef create_train_val_loader(\n    opts: argparse.Namespace,\n) -> Tuple[CoreNetDataLoader, Optional[CoreNetDataLoader], Sampler]:\n    \"\"\"Helper function to create training and validation data loaders.\n\n    Args:\n        opts: Command-line arguments\n\n    Returns:\n        A tuple containing training data loader, (optional) validation data loader, and training data sampler.\n    \"\"\"\n    is_master_node = is_master(opts)\n    train_dataset, valid_dataset = get_train_val_datasets(opts)\n\n    if isinstance(train_dataset, IterableDataset):\n        train_sampler = None\n        train_batch_size = getattr(opts, \"dataset.train_batch_size0\")\n        assert train_batch_size > 0, (\n            f\"For iterable datasets, we need batch size > 0 but got {train_batch_size}. \"\n            f\"Please specify batch size using 'dataset.train_batch_size0' argument in the config file.\"\n        )\n    else:\n        n_train_samples = get_num_data_samples_as_int_or_mapping(train_dataset)\n        train_sampler = build_sampler(\n            opts=opts,\n            n_data_samples=n_train_samples,\n            is_training=True,\n            get_item_metadata=train_dataset.get_item_metadata,\n        )\n        # for non-iterable dataset, batch size is handled inside the sampler.\n        train_batch_size = 1\n\n    if valid_dataset is None:\n        # Validation is disabled.\n        valid_sampler = None\n        val_batch_size = 1\n    elif isinstance(valid_dataset, IterableDataset):\n        # validation dataset is iterable\n        valid_sampler = None\n        val_batch_size = getattr(opts, \"dataset.val_batch_size0\")\n        assert val_batch_size > 0, (\n            f\"For iterable datasets, we need batch size > 0 but got {val_batch_size}. \"\n            f\"Please specify batch size using 'dataset.val_batch_size0' argument in the config file.\"\n        )\n    else:\n        # validation dataset is map-style\n        n_valid_samples = get_num_data_samples_as_int_or_mapping(valid_dataset)\n        valid_sampler = build_sampler(\n            opts=opts,\n            n_data_samples=n_valid_samples,\n            is_training=False,\n            get_item_metadata=valid_dataset.get_item_metadata,\n        )\n        # for non-iterable dataset, batch size is handled inside the sampler.\n        val_batch_size = 1\n\n    data_workers = getattr(opts, \"dataset.workers\")\n    persistent_workers = getattr(opts, \"dataset.persistent_workers\") and (\n        data_workers > 0\n    )\n    pin_memory = getattr(opts, \"dataset.pin_memory\")\n    prefetch_factor = getattr(opts, \"dataset.prefetch_factor\")\n\n    collate_fn_train, collate_fn_val = build_collate_fn(opts=opts)\n\n    train_loader = CoreNetDataLoader(\n        dataset=train_dataset,\n        batch_size=train_batch_size,\n        num_workers=data_workers,\n        pin_memory=pin_memory,\n        batch_sampler=train_sampler,\n        persistent_workers=persistent_workers,\n        collate_fn=(\n            partial(collate_fn_train, opts=opts)\n            if collate_fn_train is not None\n            else None\n        ),\n        prefetch_factor=prefetch_factor,\n    )\n\n    if valid_dataset is not None:\n        val_loader = CoreNetDataLoader(\n            dataset=valid_dataset,\n            batch_size=val_batch_size,\n            batch_sampler=valid_sampler,\n            num_workers=data_workers,\n            pin_memory=pin_memory,\n            persistent_workers=persistent_workers,\n            collate_fn=(\n                partial(collate_fn_val, opts=opts)\n                if collate_fn_val is not None\n                else None\n            ),\n        )\n    else:\n        val_loader = None\n\n    if is_master_node:\n        if train_sampler is not None:\n            logger.log(f\"Training sampler details: {train_sampler}\")\n\n        if valid_sampler is not None:\n            logger.log(f\"Validation sampler details: {valid_sampler}\")\n\n        logger.log(\"Number of data workers: {}\".format(data_workers))\n\n    return train_loader, val_loader, train_sampler\n\n\ndef get_num_data_samples_as_int_or_mapping(\n    dataset: BaseDataset,\n) -> Union[int, Mapping[str, int]]:\n    \"\"\"Return the number of samples in the dataset.\n\n    The dataset can be a single or composition of multiple datasets (as in multi-task learning). For a single\n    dataset, the number of samples is integer while for multiple datasets, a dictionary is returned with task name and\n    number of samples per task.\n\n    Args:\n        dataset: An instance of `corenet.data.datasets.BaseDataset` class\n\n    Returns:\n        An integer for single dataset and mapping for composite datasets.\n\n    \"\"\"\n    if hasattr(dataset, \"get_dataset_length_as_mapping\"):\n        return dataset.get_dataset_length_as_mapping()\n    else:\n        return len(dataset)\n"
  },
  {
    "path": "corenet/data/datasets/__init__.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nfrom typing import Optional, Tuple\n\nfrom corenet.constants import if_test_env\nfrom corenet.data.datasets.classification.base_image_classification_dataset import (\n    BaseImageClassificationDataset,\n)\nfrom corenet.data.datasets.classification.base_imagenet_shift_dataset import (\n    BaseImageNetShiftDataset,\n)\nfrom corenet.data.datasets.dataset_base import (\n    BaseDataset,\n    BaseImageDataset,\n    BaseIterableDataset,\n    BaseVideoDataset,\n)\nfrom corenet.data.datasets.detection.base_detection import BaseDetectionDataset\nfrom corenet.data.datasets.language_modeling.base_lm import BaseLMIterableDataset\nfrom corenet.data.datasets.multi_modal_img_text import arguments_multi_modal_img_text\nfrom corenet.data.datasets.segmentation.base_segmentation import (\n    BaseImageSegmentationDataset,\n)\nfrom corenet.utils import logger\nfrom corenet.utils.ddp_utils import is_master\nfrom corenet.utils.registry import Registry\n\nDATASET_REGISTRY = Registry(\n    registry_name=\"dataset_registry\",\n    base_class=BaseDataset,\n    lazy_load_dirs=[\"corenet/data/datasets\"]\n    + if_test_env(\n        then=[\"tests/data/datasets\"],\n        otherwise=[],\n    ),\n    internal_dirs=[\"corenet/internal\", \"corenet/internal/projects/*\"],\n)\n\n\ndef build_dataset_from_registry(\n    opts: argparse.Namespace,\n    is_training: bool = True,\n    is_evaluation: bool = False,\n    *args,\n    **kwargs,\n) -> BaseDataset:\n    \"\"\"Helper function to build a dataset from dataset registry\n\n    Args:\n        opts: Command-line arguments\n        is_training: Training mode or not. Defaults to True.\n        is_evaluation: Evaluation mode or not. Defaults to False.\n\n    Returns:\n        An instance of BaseDataset\n\n\n    ...note:\n        `is_training` is used to indicate whether the dataset is used for training or validation\n        On the other hand, `is_evaluation` mode is used to indicate the dataset is used for testing.\n\n        Theoretically, `is_training=False` and `is_evaluation=True` should be the same. However, for some datasets\n        (especially segmentation), validation dataset transforms are different from\n        test transforms because each image has different resolution, making it difficult to construct\n        batches. Therefore, we treat these two modes different. For datasets, where validation and testing\n        transforms are the same, we set evaluation transforms the same as the validation transforms (e.g., in ImageNet\n        object classification).\n    \"\"\"\n\n    dataset_category = getattr(opts, \"dataset.category\")\n\n    if dataset_category is None:\n        logger.error(\"Please specify dataset category using --dataset.category\")\n\n    dataset_name = getattr(opts, f\"dataset.name\")\n    if dataset_name is None:\n        logger.error(\"Please specify dataset name using --dataset.name\")\n\n    dataset = DATASET_REGISTRY[dataset_name, dataset_category](\n        opts=opts, is_training=is_training, is_evaluation=is_evaluation, *args, **kwargs\n    )\n    return dataset\n\n\ndef get_test_dataset(opts: argparse.Namespace, *args, **kwargs) -> BaseDataset:\n    \"\"\"Helper function to build a dataset for testing.\n\n    Args:\n        opts: Command-line arguments\n\n    Returns:\n        An instance of BaseDataset\n    \"\"\"\n\n    test_dataset = build_dataset_from_registry(\n        opts, is_training=False, is_evaluation=True, *args, **kwargs\n    )\n\n    if is_master(opts):\n        logger.log(\"Evaluation dataset details: \")\n        print(\"{}\".format(test_dataset))\n\n    return test_dataset\n\n\ndef get_train_val_datasets(\n    opts: argparse.Namespace, *args, **kwargs\n) -> Tuple[BaseDataset, Optional[BaseDataset]]:\n    \"\"\"Helper function to build a dataset for training and validation.\n\n    Args:\n        opts: Command-line arguments\n\n    Returns:\n        Training and (optionally) validation datasets.\n    \"\"\"\n\n    disable_val = getattr(opts, \"dataset.disable_val\")\n    is_master_node = is_master(opts)\n    train_dataset = build_dataset_from_registry(\n        opts, is_training=True, is_evaluation=False, *args, **kwargs\n    )\n    if is_master_node:\n        logger.log(\"Training dataset details are given below\")\n        print(train_dataset)\n\n    valid_dataset = None\n    if not disable_val:\n        valid_dataset = build_dataset_from_registry(\n            opts, is_training=False, is_evaluation=False, *args, **kwargs\n        )\n        if is_master_node:\n            logger.log(\"Validation dataset details are given below\")\n            print(valid_dataset)\n\n    return train_dataset, valid_dataset\n\n\ndef arguments_dataset(parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n    \"\"\"Add dataset-specific arguments from BaseDataset, BaseImageDataset,\n    BaseImageClassificationDataset, BaseImageNetShiftDataset,\n    BaseVideoDataset, zero-shot datasets, and DATASET_REGISTRY.\n    \"\"\"\n    parser = BaseDataset.add_arguments(parser)\n    parser = BaseImageDataset.add_arguments(parser)\n    parser = BaseImageSegmentationDataset.add_arguments(parser)\n    parser = BaseVideoDataset.add_arguments(parser)\n    parser = BaseImageClassificationDataset.add_arguments(parser)\n    parser = BaseImageNetShiftDataset.add_arguments(parser)\n    parser = BaseDetectionDataset.add_arguments(parser)\n    parser = BaseLMIterableDataset.add_arguments(parser)\n\n    try:\n        from corenet.internal.utils.server_utils import dataset_server_args\n\n        parser = dataset_server_args(parser)\n    except ImportError:\n        pass\n\n    # add multi-modal and zero-shot arguments\n    parser = arguments_multi_modal_img_text(parser=parser)\n\n    # add dataset specific arguments\n    parser = DATASET_REGISTRY.all_arguments(parser)\n    return parser\n"
  },
  {
    "path": "corenet/data/datasets/audio_classification/__init__.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n"
  },
  {
    "path": "corenet/data/datasets/audio_classification/speech_commands_v2.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nimport json\nimport os\nimport random\nfrom typing import Dict, Tuple, Union\n\nimport torch\nimport torchaudio\nfrom torch import Tensor\nfrom torch.nn import functional as F\n\nfrom corenet.data.datasets import DATASET_REGISTRY, dataset_base\nfrom corenet.data.transforms.audio import Noise, Roll, SetFixedLength\nfrom corenet.data.transforms.common import Compose\nfrom corenet.data.transforms.image_pil import BaseTransformation\n\n\n@DATASET_REGISTRY.register(name=\"speech_commands_v2\", type=\"audio_classification\")\nclass SpeechCommandsv2Dataset(dataset_base.BaseDataset):\n    \"\"\"\n    Google's Speech Commands dataset for keyword spotting (https://arxiv.org/abs/1804.03209).\n\n    This contains the \"v2\" version for 12-way classification (10 commands,\n    plus unknown and background categories).\n\n    Args:\n        opts: Command-line arguments\n    \"\"\"\n\n    def __init__(\n        self,\n        opts: argparse.Namespace,\n        *args,\n        **kwargs,\n    ) -> None:\n        super().__init__(opts=opts, *args, **kwargs)\n        mode_str = self.mode\n        if self.mode == \"val\":\n            # This value is needed to calculate the correct annotation .json paths.\n            mode_str = \"validation\"\n\n        self.dataset_config = os.path.join(self.root, f\"{mode_str}_manifest.json\")\n\n        self._process_dataset_config()\n        self.mixup = getattr(opts, \"dataset.speech_commands_v2.mixup\")\n\n    def _process_dataset_config(self) -> None:\n        \"\"\"\n        Process the dataset .json files to set up the dataset.\n\n        The .json configs contain:\n        [\n            {\n                \"audio_filepath\": relative path to audio from the dataset root directory,\n                \"duration\": floating point duration in seconds,\n                \"command\": the label of the spoken command.\n            },\n            ...\n        ]\n        \"\"\"\n        with open(self.dataset_config) as f:\n            lines = f.readlines()\n\n        self.dataset_entries = []\n        for line in lines:\n            self.dataset_entries.append(json.loads(line))\n\n        for elem in self.dataset_entries:\n            audio_path = elem[\"audio_filepath\"]\n            new_path = os.path.join(self.root, audio_path)\n            elem[\"audio_filepath\"] = new_path\n\n        all_labels = sorted(set([elem[\"command\"] for elem in self.dataset_entries]))\n        self.label_to_index = {l: i for i, l in enumerate(all_labels)}\n\n        if getattr(self.opts, \"audio_augmentation.noise.enable\"):\n            # Cache this, since it loads files on initialization.\n            background_dir = os.path.join(self.root, \"_background_noise_\")\n            self.noise = Noise(self.opts, noise_files_dir=background_dir)\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        group = parser.add_argument_group(cls.__name__)\n        group.add_argument(\n            \"--dataset.speech-commands-v2.mixup\",\n            action=\"store_true\",\n            help=\"If set, apply mixup inside the dataset.\",\n        )\n        return parser\n\n    def _training_transforms(self, *args, **kwargs) -> BaseTransformation:\n        \"\"\"\n        Returns transformations applied to the input in training mode.\n        \"\"\"\n        aug_list = [\n            SetFixedLength(self.opts),\n        ]\n\n        if getattr(self.opts, \"audio_augmentation.noise.enable\"):\n            aug_list.append(self.noise)\n        if getattr(self.opts, \"audio_augmentation.roll.enable\"):\n            aug_list.append(Roll(self.opts))\n        return Compose(self.opts, aug_list)\n\n    def _validation_transforms(self, *args, **kwargs) -> BaseTransformation:\n        \"\"\"\n        Returns transformations applied to the input in validation mode.\n        \"\"\"\n        aug_list = [SetFixedLength(self.opts)]\n        return Compose(self.opts, aug_list)\n\n    def get_sample(self, index: int) -> Tuple[Tensor, float, Tensor]:\n        \"\"\"\n        Get the dataset sample at the given index.\n        \"\"\"\n        dataset_entry = self.dataset_entries[index]\n        waveform, audio_fps = torchaudio.load(dataset_entry[\"audio_filepath\"])\n\n        label = torch.tensor(\n            self.label_to_index[dataset_entry[\"command\"]], dtype=torch.long\n        )\n        return waveform, audio_fps, label\n\n    def __getitem__(\n        self, batch_indexes_tup: Tuple\n    ) -> Dict[str, Union[Dict[str, Tensor], Tensor, int]]:\n        \"\"\"\n        Returns the sample corresponding to the input sample index and applies\n        transforms.\n\n        If the class uses mixup, and is in training mode, this will additionally\n        apply mixup.\n\n        Args:\n            batch_indexes_tup: Tuple of the form (crop_size_h, crop_size_w, sample_index).\n                The first two parts are not needed, and are ignored by this function.\n\n        Returns:\n            A sample as a dictionary. It contains:\n                {\n                    \"samples\":\n                        {\n                            \"audio\": A [C, N] tensor, where C is the number of\n                                channels, and N is the length.\n                        }\n                    \"targets\": an integer class label.\n                    \"sample_id\": an integer giving the sample index.\n                    \"metadata\":\n                        {\n                            \"audio_fps\": The sampling rate of the audio.\n                        }\n                }\n        \"\"\"\n        _, _, index = batch_indexes_tup\n        data = self.get_transformed_sample(index)\n\n        if self.mixup and self.is_training:\n            index = random.randint(0, len(self) - 1)\n            data2 = self.get_transformed_sample(index)\n\n            if data[\"metadata\"][\"audio_fps\"] != data2[\"metadata\"][\"audio_fps\"]:\n                raise ValueError(\n                    f\"Inconsistent audio_fps ({data['metadata']['audio_fps']} and {data2['metadata']['audio_fps']})\"\n                )\n\n            coefficient = torch.rand(1)\n            data[\"samples\"][\"audio\"] = data[\"samples\"][\"audio\"] * coefficient + data2[\n                \"samples\"\n            ][\"audio\"] * (1.0 - coefficient)\n\n            def to_onehot(targets: Tensor) -> Tensor:\n                return F.one_hot(targets, num_classes=len(self.label_to_index))\n\n            data[\"targets\"] = to_onehot(data[\"targets\"]) * coefficient + to_onehot(\n                data2[\"targets\"]\n            ) * (1.0 - coefficient)\n\n        return data\n\n    def get_transformed_sample(\n        self, index: int\n    ) -> Dict[str, Union[Dict[str, Tensor], Tensor, int]]:\n        \"\"\"\n        Get the sample at the index specified by @index.\n\n        Args:\n            index: The index of the sample.\n\n        Returns:\n            A sample as a dictionary. It contains:\n                {\n                    \"samples\":\n                        {\n                            \"audio\": A [C, N] tensor, where C is the number of\n                                channels, and N is the length.\n                        }\n                    \"targets\": an integer class label.\n                    \"sample_id\": an integer giving the sample index.\n                    \"metadata\":\n                        {\n                            \"audio_fps\": The sampling rate of the audio.\n                        }\n                }\n        \"\"\"\n        waveform, audio_fps, label = self.get_sample(index)\n\n        data = {\n            \"samples\": {\"audio\": waveform},\n            \"targets\": label,\n            \"sample_id\": index,\n            \"metadata\": {\"audio_fps\": audio_fps},\n        }\n\n        transform_fn = self.get_augmentation_transforms()\n        data = transform_fn(data)\n\n        return data\n\n    def __len__(self) -> int:\n        return len(self.dataset_entries)\n"
  },
  {
    "path": "corenet/data/datasets/classification/__init__.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n"
  },
  {
    "path": "corenet/data/datasets/classification/base_image_classification_dataset.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\nimport argparse\nfrom typing import Any, Dict, Tuple, Union\n\nimport torch\nfrom torchvision.datasets import ImageFolder\n\nfrom corenet.data.datasets.dataset_base import BaseImageDataset\nfrom corenet.data.datasets.utils.common import select_samples_by_category\nfrom corenet.data.transforms import image_pil\nfrom corenet.data.transforms.common import Compose\nfrom corenet.utils import logger\nfrom corenet.utils.ddp_utils import is_master\n\n\nclass BaseImageClassificationDataset(BaseImageDataset, ImageFolder):\n    \"\"\"Image Classification Dataset.\n\n\n    This base class can be used to represent any image classification dataset which is stored in a way that meets the\n    expectations of `torchvision.datasets.ImageFolder`. New image classification datasets can be derived from this\n    similar to ImageNetDataset (imagenet.py) or Places365Dataset (places365.py) and overwrite the data transformations\n    as needed. This dataset also supports sampling a random subset of the training set to be used for training. The\n    subset size is determined by the arguments `dataset.num_samples_per_category` and `dataset.percentage_of_samples`\n    in the input `opts`. Only one of these two should be specified. When `dataset.percentage_of_samples` is specified,\n    data is sampled from all classes according to this percentage such that the distribution of classes does not change.\n     The randomness in sampling is controlled by the `dataset.sample_selection_random_seed` in the input `opts`.\n\n    Args:\n        opts: An argparse.Namespace instance.\n    \"\"\"\n\n    def __init__(\n        self,\n        opts: argparse.Namespace,\n        *args,\n        **kwargs,\n    ) -> None:\n        BaseImageDataset.__init__(\n            self,\n            opts=opts,\n            *args,\n            **kwargs,\n        )\n        root = self.root\n        ImageFolder.__init__(\n            self,\n            root=root,\n            transform=None,\n            target_transform=None,\n            is_valid_file=None,\n        )\n\n        self.n_classes = len(list(self.class_to_idx.keys()))\n\n        master = is_master(self.opts)\n        if master:\n            logger.log(\"Number of categories: {}\".format(self.n_classes))\n            logger.log(\"Total number of samples: {}\".format(len(self.samples)))\n\n        num_samples_per_category = getattr(\n            self.opts, \"dataset.num_samples_per_category\"\n        )\n        percentage_of_samples = getattr(self.opts, \"dataset.percentage_of_samples\")\n\n        if self.is_training and (\n            num_samples_per_category > 0 or (0 < percentage_of_samples < 100)\n        ):\n            if num_samples_per_category > 0 and (0 < percentage_of_samples < 100):\n                raise ValueError(\n                    \"Both `dataset.num_samples_per_category` and `dataset.percentage_of_samples` are specified. \"\n                    \"Please specify only one.\"\n                )\n\n            random_seed = getattr(self.opts, \"dataset.sample_selection_random_seed\")\n            if num_samples_per_category > 0:\n                selected_sample_indices = select_samples_by_category(\n                    sample_category_labels=self.targets,\n                    random_seed=random_seed,\n                    num_samples_per_category=num_samples_per_category,\n                )\n                if master:\n                    logger.log(\n                        \"Using {} samples per category.\".format(\n                            num_samples_per_category\n                        )\n                    )\n            else:\n                selected_sample_indices = select_samples_by_category(\n                    sample_category_labels=self.targets,\n                    random_seed=random_seed,\n                    percentage_of_samples_per_category=percentage_of_samples,\n                )\n                if master:\n                    logger.log(\n                        \"Using {} percentage of samples per category.\".format(\n                            percentage_of_samples\n                        )\n                    )\n\n            self.samples = [self.samples[ind] for ind in selected_sample_indices]\n            self.imgs = [self.imgs[ind] for ind in selected_sample_indices]\n            self.targets = [self.targets[ind] for ind in selected_sample_indices]\n        elif master:\n            logger.log(\"Using all samples in the dataset.\")\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        \"\"\"\n        Adds dataset related arguments to the parser.\n\n        Args:\n            parser: An argparse.Namespace instance\n\n        Returns:\n            Input argparse.Namespace instance with additional arguments.\n        \"\"\"\n        if cls != BaseImageClassificationDataset:\n            # Don't re-register arguments in subclasses that don't override `add_arguments()`.\n            return parser\n        group = parser.add_argument_group(title=cls.__name__)\n\n        group.add_argument(\n            \"--dataset.num-samples-per-category\",\n            type=int,\n            default=-1,\n            help=\"Number of samples to use per category. If set to -1, all samples will be used.\",\n        )\n        return parser\n\n    def _training_transforms(\n        self, size: Union[Tuple[int, int], int], *args, **kwargs\n    ) -> image_pil.BaseTransformation:\n        \"\"\"\n        Returns transformations applied to the input in training mode.\n\n        Order of transformations: RandomResizedCrop, RandomHorizontalFlip, One of AutoAugment or RandAugment or\n        TrivialAugmentWide, RandomErasing\n\n        Batch-based augmentations such as Mixup and CutMix are implemented in trainer.\n\n        Args:\n            size: Size for resizing the input image. Expected to be an integer (width=height) or a tuple (height, width)\n\n        Returns:\n            An instance of `corenet.data.transforms.image_pil.BaseTransformation.`\n        \"\"\"\n        if not getattr(self.opts, \"image_augmentation.random_resized_crop.enable\"):\n            raise ValueError(\n                \"`image_augmentation.random_resized_crop.enable` must be set to True in input options.\"\n            )\n\n        aug_list = [image_pil.RandomResizedCrop(opts=self.opts, size=size)]\n\n        if getattr(self.opts, \"image_augmentation.random_horizontal_flip.enable\"):\n            aug_list.append(image_pil.RandomHorizontalFlip(opts=self.opts))\n\n        auto_augment = getattr(self.opts, \"image_augmentation.auto_augment.enable\")\n        rand_augment = getattr(self.opts, \"image_augmentation.rand_augment.enable\")\n        trivial_augment_wide = getattr(\n            self.opts, \"image_augmentation.trivial_augment_wide.enable\"\n        )\n        if bool(auto_augment) + bool(rand_augment) + bool(trivial_augment_wide) > 1:\n            logger.error(\n                \"Only one of AutoAugment, RandAugment and TrivialAugmentWide should be used.\"\n            )\n        elif auto_augment:\n            aug_list.append(image_pil.AutoAugment(opts=self.opts))\n        elif rand_augment:\n            if getattr(self.opts, \"image_augmentation.rand_augment.use_timm_library\"):\n                aug_list.append(image_pil.RandAugmentTimm(opts=self.opts))\n            else:\n                aug_list.append(image_pil.RandAugment(opts=self.opts))\n        elif trivial_augment_wide:\n            aug_list.append(image_pil.TrivialAugmentWide(opts=self.opts))\n\n        aug_list.append(image_pil.ToTensor(opts=self.opts))\n\n        if getattr(self.opts, \"image_augmentation.random_erase.enable\"):\n            aug_list.append(image_pil.RandomErasing(opts=self.opts))\n\n        return Compose(opts=self.opts, img_transforms=aug_list)\n\n    def _validation_transforms(self, *args, **kwargs) -> image_pil.BaseTransformation:\n        \"\"\"\n        Returns transformations applied to the input in validation mode.\n\n        Order of augmentations: Resize followed by CenterCrop\n        \"\"\"\n\n        if not getattr(self.opts, \"image_augmentation.resize.enable\"):\n            raise ValueError(\n                \"`image_augmentation.resize.enable` must be set to True in input options.\"\n            )\n        aug_list = [image_pil.Resize(opts=self.opts)]\n\n        if not getattr(self.opts, \"image_augmentation.center_crop.enable\"):\n            raise ValueError(\n                \"`image_augmentation.center_crop.enable` must be set to True in input options.\"\n            )\n\n        aug_list.append(image_pil.CenterCrop(opts=self.opts))\n        aug_list.append(image_pil.ToTensor(opts=self.opts))\n\n        return Compose(opts=self.opts, img_transforms=aug_list)\n\n    def __getitem__(\n        self, sample_size_and_index: Tuple[int, int, int]\n    ) -> Dict[str, Any]:\n        \"\"\"Returns the sample corresponding to the input sample index.\n\n        Returned sample is transformed into the size specified by the input.\n\n        Args:\n            sample_size_and_index: Tuple of the form (crop_size_h, crop_size_w, sample_index)\n\n        Returns:\n            A dictionary with `samples`, `sample_id` and `targets` as keys corresponding to input, index and label of\n            a sample, respectively.\n\n        Shapes:\n            The output data dictionary contains three keys (samples, sample_id, and target). The values of these\n            keys has the following shapes:\n                data[\"samples\"]: Shape is [Channels, Height, Width]\n                data[\"sample_id\"]: Shape is 1\n                data[\"targets\"]: Shape is 1\n        \"\"\"\n        crop_size_h, crop_size_w, sample_index = sample_size_and_index\n        transform_fn = self.get_augmentation_transforms(size=(crop_size_h, crop_size_w))\n\n        img_path, target = self.samples[sample_index]\n        input_img = self.read_image_pil(img_path)\n        if input_img is None:\n            # Sometimes images are corrupt\n            # Skip such images\n            logger.log(\"Img index {} is possibly corrupt.\".format(sample_index))\n            input_tensor = torch.zeros(\n                size=(3, crop_size_h, crop_size_w), dtype=torch.float\n            )\n            target = -1\n            data = {\"image\": input_tensor}\n        else:\n            data = {\"image\": input_img}\n            data = transform_fn(data)\n\n        data[\"samples\"] = data.pop(\"image\")\n        data[\"targets\"] = target\n        data[\"sample_id\"] = sample_index\n\n        return data\n\n    def __len__(self) -> int:\n        return len(self.samples)\n\n    def extra_repr(self) -> str:\n        extra_repr_str = super().extra_repr()\n        return extra_repr_str + f\"\\n\\t num_classes={self.n_classes}\"\n"
  },
  {
    "path": "corenet/data/datasets/classification/base_imagenet_shift_dataset.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\"\"\"Base class for ImageNet distribution shift datasets.\"\"\"\nimport argparse\nfrom typing import Any, Dict, Tuple\n\nfrom corenet.data.datasets.classification.base_image_classification_dataset import (\n    BaseImageClassificationDataset,\n)\n\n\nclass BaseImageNetShiftDataset(BaseImageClassificationDataset):\n    \"\"\"ImageNet Distribution Shift Dataset.\n\n    This base class supports ImageNet out-of-distribution datasets. The class names for\n    datasets are a subset of ImageNet. The `__getitem__` method projects the\n    labels to the classes of ImageNet to allow zero-shot evaluation.\n\n    Args:\n        opts: An argparse.Namespace instance.\n    \"\"\"\n\n    def __init__(\n        self,\n        opts: argparse.Namespace,\n        *args,\n        **kwargs,\n    ) -> None:\n        \"\"\"Initialize BaseImageNetShiftDataset.\"\"\"\n        BaseImageClassificationDataset.__init__(\n            self,\n            opts=opts,\n            *args,\n            **kwargs,\n        )\n        # The class ids are converted to their equivalent ImageNet class ids\n        # We manually set the n_classes and overwrite the n_classes set by\n        # ImageFolder\n        self.n_classes = 1000\n\n        self.post_init_checks()\n\n    def post_init_checks(self) -> None:\n        \"\"\"Verify the dataset is correctly initialized. Also called in testing.\"\"\"\n        if self.is_training:\n            raise Exception(\n                \"{} can only be used for evaluation\".format(self.__class__.__name__)\n            )\n        model_classes = getattr(self.opts, \"model.classification.n_classes\")\n        # Note: ImageNet distribution shift subsets can have classes less than 1000\n        # In such a case, a proper mapping from ImageNet classes to ImageNet distribution shift dataset needs to be done.\n        assert (\n            self.n_classes <= model_classes\n        ), f\"The dataset expects {self.n_classes} unique labels, but the model is trained on {model_classes} unique labels. \"\n\n    @staticmethod\n    def class_id_to_imagenet_class_id(class_id: int) -> int:\n        \"\"\"Return the corresponding class index from ImageNet given a class index.\"\"\"\n        raise NotImplementedError(\n            \"Subclasses should implement the mapping to imagenet class ids.\"\n        )\n\n    def __getitem__(\n        self, sample_size_and_index: Tuple[int, int, int]\n    ) -> Dict[str, Any]:\n        \"\"\"Return the sample corresponding to the input sample index.\n\n        Returned sample is transformed into the size specified by the input.\n\n        Args:\n            sample_size_and_index: Tuple of the form (crop_size_h, crop_size_w,\n                sample_index)\n\n        Returns:\n            A dictionary with `samples`, `sample_id` and `targets` as keys corresponding\n            to input, index and label of a sample, respectively.\n\n        Shapes:\n            The output data dictionary contains three keys (samples, sample_id, and\n            target). The values of these keys has the following shapes:\n                data[\"samples\"]: Shape is [Channels, Height, Width]\n                data[\"sample_id\"]: Shape is 1\n                data[\"targets\"]: Shape is 1\n        \"\"\"\n        data = BaseImageClassificationDataset.__getitem__(self, sample_size_and_index)\n        data[\"targets\"] = self.class_id_to_imagenet_class_id(data[\"targets\"])\n\n        return data\n"
  },
  {
    "path": "corenet/data/datasets/classification/coco.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nimport os\nfrom functools import cached_property\nfrom typing import Any, Dict, List, Tuple, Union\n\nimport torch\nfrom pycocotools.coco import COCO\n\nfrom corenet.data.datasets import DATASET_REGISTRY\nfrom corenet.data.datasets.classification.base_image_classification_dataset import (\n    BaseImageClassificationDataset,\n    BaseImageDataset,\n)\nfrom corenet.data.transforms.image_pil import BaseTransformation\n\n\n@DATASET_REGISTRY.register(name=\"coco\", type=\"classification\")\nclass COCOClassification(BaseImageDataset):\n    \"\"\"`COCO <https://cocodataset.org/#home>`_ dataset for multi-label object classification.\n\n    Args:\n        opts: Command-line arguments.\n    \"\"\"\n\n    def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None:\n        super().__init__(opts=opts, *args, **kwargs)\n        year = 2017\n        split = \"train\" if self.is_training else \"val\"\n        ann_file = os.path.join(\n            self.root, \"annotations/instances_{}{}.json\".format(split, year)\n        )\n        self.img_dir = os.path.join(self.root, \"images/{}{}\".format(split, year))\n        self.coco = COCO(ann_file)\n        self.ids = list(self.coco.imgs.keys())\n        self.cat2cat = dict()\n        for cat in self.coco.cats.keys():\n            self.cat2cat[cat] = len(self.cat2cat)\n\n    def __len__(self) -> int:\n        \"\"\"Number of samples in the dataset.\"\"\"\n        return len(self.ids)\n\n    def _training_transforms(\n        self, size: Union[int, Tuple[int, int]]\n    ) -> BaseTransformation:\n        \"\"\"Returns transformations applied to the input image in training mode.\n\n        These transformations are the same as the 'BaseImageClassificationDataset'.\n\n        Args:\n            size: Size for resizing the input image. Expected to be an integer (width=height) or a tuple (height, width)\n\n        Returns:\n            An instance of `corenet.data.transforms.image_pil.BaseTransformation.`\n        \"\"\"\n        return BaseImageClassificationDataset._training_transforms(self, size)\n\n    def _validation_transforms(\n        self, *unused_args, **unused_kwargs\n    ) -> BaseTransformation:\n        \"\"\"Returns transformations applied to the input in validation mode.\n\n        These transformations are the same as the 'BaseImageClassificationDataset'.\n\n        Returns:\n            An instance of `corenet.data.transforms.image_pil.BaseTransformation.`\n        \"\"\"\n        return BaseImageClassificationDataset._validation_transforms(self)\n\n    def __getitem__(\n        self, sample_size_and_index: Tuple[int, int, int]\n    ) -> Dict[str, Any]:\n        \"\"\"Returns the sample corresponding to the input sample index.\n\n        Returned sample is transformed into the size specified by the input.\n\n        Args:\n            sample_size_and_index: Tuple of the form (crop_size_h, crop_size_w, sample_index).\n\n        Returns:\n            A dictionary with `samples`, `sample_id` and `targets` as keys corresponding to input, index, and label of\n            a sample, respectively.\n\n        Shapes:\n            The output data dictionary contains three keys (samples, sample_id, and target). The values of these\n            keys has the following shapes:\n                data[\"samples\"]: Shape is [image_channels, image_height, image_width]\n                data[\"sample_id\"]: Shape is 1\n                data[\"targets\"]: Shape is [num_classes]\n        \"\"\"\n\n        crop_size_h, crop_size_w, img_index = sample_size_and_index\n\n        coco = self.coco\n        img_id = self.ids[img_index]\n\n        ann_ids = coco.getAnnIds(imgIds=img_id)\n        annotations = coco.loadAnns(ann_ids)\n\n        target = torch.zeros((3, self.n_classes), dtype=torch.long)\n        # Steps to produce multi-label classification labels\n        # Step 1: Group the target labels into three categories based on object area\n        # Step 2: Produce the binary label for each class by computing maximum value\n        #   along the first dimension (i.e., dim=0).\n\n        # Step 1\n        for obj in annotations:\n            if obj[\"area\"] < 32 * 32:  # small objects\n                target[0][self.cat2cat[obj[\"category_id\"]]] = 1\n            elif obj[\"area\"] < 96 * 96:  # medium objects\n                target[1][self.cat2cat[obj[\"category_id\"]]] = 1\n            else:  # large objects\n                target[2][self.cat2cat[obj[\"category_id\"]]] = 1\n        # Step 2\n        target = target.amax(dim=0)\n\n        img_path = os.path.join(self.img_dir, coco.loadImgs(img_id)[0][\"file_name\"])\n        input_img = self.read_image_pil(img_path)\n\n        transform_fn = self.get_augmentation_transforms(size=(crop_size_h, crop_size_w))\n\n        data = transform_fn({\"image\": input_img})\n\n        data[\"samples\"] = data.pop(\"image\")\n        data[\"targets\"] = target\n        data[\"sample_id\"] = img_index\n        return data\n\n    @cached_property\n    def n_classes(self):\n        return len(self.class_names)\n\n    @cached_property\n    def class_names(self) -> List[str]:\n        \"\"\"Returns the names of object classes in the COCO dataset.\"\"\"\n        return [\n            \"person\",\n            \"bicycle\",\n            \"car\",\n            \"motorcycle\",\n            \"airplane\",\n            \"bus\",\n            \"train\",\n            \"truck\",\n            \"boat\",\n            \"traffic light\",\n            \"fire\",\n            \"hydrant\",\n            \"stop sign\",\n            \"parking meter\",\n            \"bench\",\n            \"bird\",\n            \"cat\",\n            \"dog\",\n            \"horse\",\n            \"sheep\",\n            \"cow\",\n            \"elephant\",\n            \"bear\",\n            \"zebra\",\n            \"giraffe\",\n            \"backpack\",\n            \"umbrella\",\n            \"handbag\",\n            \"tie\",\n            \"suitcase\",\n            \"frisbee\",\n            \"skis\",\n            \"snowboard\",\n            \"sports ball\",\n            \"kite\",\n            \"baseball bat\",\n            \"baseball glove\",\n            \"skateboard\",\n            \"surfboard\",\n            \"tennis racket\",\n            \"bottle\",\n            \"wine glass\",\n            \"cup\",\n            \"fork\",\n            \"knife\",\n            \"spoon\",\n            \"bowl\",\n            \"banana\",\n            \"apple\",\n            \"sandwich\",\n            \"orange\",\n            \"broccoli\",\n            \"carrot\",\n            \"hot dog\",\n            \"pizza\",\n            \"donut\",\n            \"cake\",\n            \"chair\",\n            \"couch\",\n            \"potted plant\",\n            \"bed\",\n            \"dining table\",\n            \"toilet\",\n            \"tv\",\n            \"laptop\",\n            \"mouse\",\n            \"remote\",\n            \"keyboard\",\n            \"cell phone\",\n            \"microwave oven\",\n            \"toaster\",\n            \"sink\",\n            \"refrigerator\",\n            \"book\",\n            \"clock\",\n            \"vase\",\n            \"scissors\",\n            \"teddy bear\",\n            \"hair drier\",\n            \"toothbrush\",\n        ]\n"
  },
  {
    "path": "corenet/data/datasets/classification/imagenet.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\n\nfrom corenet.data.datasets import DATASET_REGISTRY\nfrom corenet.data.datasets.classification.base_image_classification_dataset import (\n    BaseImageClassificationDataset,\n)\n\n\n@DATASET_REGISTRY.register(name=\"imagenet\", type=\"classification\")\nclass ImageNetDataset(BaseImageClassificationDataset):\n    \"\"\"\n    ImageNet dataset that follows the structure of ImageClassificationDataset.\n\n    \"ImageNet: A large-scale hierarchical image database\"\n    Jia Deng; Wei Dong; Richard Socher; Li-Jia Li; Kai Li; Li Fei-Fei\n    2009 IEEE Conference on Computer Vision and Pattern Recognition\n    \"\"\"\n\n    def __init__(\n        self,\n        opts: argparse.Namespace,\n        *args,\n        **kwargs,\n    ) -> None:\n        BaseImageClassificationDataset.__init__(\n            self,\n            opts=opts,\n            *args,\n            **kwargs,\n        )\n"
  },
  {
    "path": "corenet/data/datasets/classification/imagenet_a.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\"\"\"ImageNetA dataset, a distribution shift of ImageNet.\"\"\"\nimport argparse\n\nfrom corenet.data.datasets import DATASET_REGISTRY\nfrom corenet.data.datasets.classification.base_imagenet_shift_dataset import (\n    BaseImageNetShiftDataset,\n)\nfrom corenet.data.datasets.classification.imagenet_synsets import (\n    IMAGENET_A_SYNSETS,\n    IMAGENET_SYNSETS,\n)\n\nIMAGENET_A_CLASS_SUBLIST = [\n    IMAGENET_SYNSETS.index(IMAGENET_A_SYNSETS[synset])\n    for synset in range(len(IMAGENET_A_SYNSETS))\n]\n\n\n@DATASET_REGISTRY.register(name=\"imagenet_a\", type=\"classification\")\nclass ImageNetADataset(BaseImageNetShiftDataset):\n    \"\"\"ImageNetA dataset, a distribution shift of ImageNet.\n\n    ImageNet-A contains real-world, unmodified natural images that cause model accuracy\n    to substantially degrade.\n\n    @article{hendrycks2021nae,\n    title={Natural Adversarial Examples},\n    author={Dan Hendrycks and Kevin Zhao and Steven Basart and Jacob Steinhardt and Dawn\n    Song},\n    journal={CVPR},\n    year={2021}\n    }\n    \"\"\"\n\n    def __init__(\n        self,\n        opts: argparse.Namespace,\n        *args,\n        **kwargs,\n    ) -> None:\n        \"\"\"Initialize ImageNetA.\"\"\"\n        BaseImageNetShiftDataset.__init__(self, opts=opts, *args, **kwargs)\n\n    @staticmethod\n    def class_id_to_imagenet_class_id(class_id: int) -> int:\n        \"\"\"Return the mapped class index using precomputed mapping.\"\"\"\n        return IMAGENET_A_CLASS_SUBLIST[class_id]\n"
  },
  {
    "path": "corenet/data/datasets/classification/imagenet_r.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\"\"\"ImageNetR dataset, a distribution shift of ImageNet.\"\"\"\nimport argparse\n\nfrom corenet.data.datasets import DATASET_REGISTRY\nfrom corenet.data.datasets.classification.base_imagenet_shift_dataset import (\n    BaseImageNetShiftDataset,\n)\nfrom corenet.data.datasets.classification.imagenet_synsets import (\n    IMAGENET_R_SYNSETS,\n    IMAGENET_SYNSETS,\n)\n\nIMAGENET_R_CLASS_SUBLIST = [\n    IMAGENET_SYNSETS.index(IMAGENET_R_SYNSETS[synset])\n    for synset in range(len(IMAGENET_R_SYNSETS))\n]\n\n\n@DATASET_REGISTRY.register(name=\"imagenet_r\", type=\"classification\")\nclass ImageNetRDataset(BaseImageNetShiftDataset):\n    \"\"\"ImageNetR dataset, a distribution shift of ImageNet.\n\n    ImageNet-R(endition) contains art, cartoons, deviantart, graffiti, embroidery,\n    graphics, origami, paintings, patterns, plastic objects, plush objects, sculptures,\n    sketches, tattoos, toys, and video game renditions of ImageNet classes.\n\n    @article{hendrycks2021many,\n    title={The Many Faces of Robustness: A Critical Analysis of Out-of-Distribution\n    Generalization},\n    author={Dan Hendrycks and Steven Basart and Norman Mu and Saurav Kadavath and Frank\n    Wang and Evan Dorundo and Rahul Desai and Tyler Zhu and Samyak Parajuli and Mike Guo\n    and Dawn Song and Jacob Steinhardt and Justin Gilmer},\n    journal={ICCV},\n    year={2021}\n    }\n\n    \"\"\"\n\n    def __init__(\n        self,\n        opts: argparse.Namespace,\n        *args,\n        **kwargs,\n    ) -> None:\n        \"\"\"Initialize ImageNetR.\"\"\"\n        BaseImageNetShiftDataset.__init__(self, opts=opts, *args, **kwargs)\n\n    @staticmethod\n    def class_id_to_imagenet_class_id(class_id: int) -> int:\n        \"\"\"Return the mapped class index using precomputed mapping.\"\"\"\n        return IMAGENET_R_CLASS_SUBLIST[class_id]\n"
  },
  {
    "path": "corenet/data/datasets/classification/imagenet_sketch.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\"\"\"ImageNetSketch dataset, a distribution shift of ImageNet.\"\"\"\nimport argparse\n\nfrom corenet.data.datasets import DATASET_REGISTRY\nfrom corenet.data.datasets.classification.base_imagenet_shift_dataset import (\n    BaseImageNetShiftDataset,\n)\n\n\n@DATASET_REGISTRY.register(name=\"imagenet_sketch\", type=\"classification\")\nclass ImageNetSketchDataset(BaseImageNetShiftDataset):\n    \"\"\"ImageNetSketch dataset, a distribution shift of ImageNet.\n\n    Data set is created from Google Image queries \"sketch of __\", where __ is the\n    standard class name. Search is only within the \"black and white\" color scheme.\n\n    @inproceedings{wang2019learning,\n        title={Learning Robust Global Representations by Penalizing Local Predictive\n        Power},\n        author={Wang, Haohan and Ge, Songwei and Lipton, Zachary and Xing, Eric P},\n        booktitle={Advances in Neural Information Processing Systems},\n        pages={10506--10518},\n        year={2019}\n    }\n    \"\"\"\n\n    def __init__(\n        self,\n        opts: argparse.Namespace,\n        *args,\n        **kwargs,\n    ) -> None:\n        \"\"\"Initialize ImageNetSketchDataset.\"\"\"\n        BaseImageNetShiftDataset.__init__(self, opts=opts, *args, **kwargs)\n\n    @staticmethod\n    def class_id_to_imagenet_class_id(class_id: int) -> int:\n        \"\"\"Return `class_id` as the ImageNet Sketch classes are the same as ImageNet.\"\"\"\n        return class_id\n"
  },
  {
    "path": "corenet/data/datasets/classification/imagenet_synsets.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\n# Folder names/class IDs in ImageNet-1k\nIMAGENET_SYNSETS = [\n    \"n01440764\",\n    \"n01443537\",\n    \"n01484850\",\n    \"n01491361\",\n    \"n01494475\",\n    \"n01496331\",\n    \"n01498041\",\n    \"n01514668\",\n    \"n01514859\",\n    \"n01518878\",\n    \"n01530575\",\n    \"n01531178\",\n    \"n01532829\",\n    \"n01534433\",\n    \"n01537544\",\n    \"n01558993\",\n    \"n01560419\",\n    \"n01580077\",\n    \"n01582220\",\n    \"n01592084\",\n    \"n01601694\",\n    \"n01608432\",\n    \"n01614925\",\n    \"n01616318\",\n    \"n01622779\",\n    \"n01629819\",\n    \"n01630670\",\n    \"n01631663\",\n    \"n01632458\",\n    \"n01632777\",\n    \"n01641577\",\n    \"n01644373\",\n    \"n01644900\",\n    \"n01664065\",\n    \"n01665541\",\n    \"n01667114\",\n    \"n01667778\",\n    \"n01669191\",\n    \"n01675722\",\n    \"n01677366\",\n    \"n01682714\",\n    \"n01685808\",\n    \"n01687978\",\n    \"n01688243\",\n    \"n01689811\",\n    \"n01692333\",\n    \"n01693334\",\n    \"n01694178\",\n    \"n01695060\",\n    \"n01697457\",\n    \"n01698640\",\n    \"n01704323\",\n    \"n01728572\",\n    \"n01728920\",\n    \"n01729322\",\n    \"n01729977\",\n    \"n01734418\",\n    \"n01735189\",\n    \"n01737021\",\n    \"n01739381\",\n    \"n01740131\",\n    \"n01742172\",\n    \"n01744401\",\n    \"n01748264\",\n    \"n01749939\",\n    \"n01751748\",\n    \"n01753488\",\n    \"n01755581\",\n    \"n01756291\",\n    \"n01768244\",\n    \"n01770081\",\n    \"n01770393\",\n    \"n01773157\",\n    \"n01773549\",\n    \"n01773797\",\n    \"n01774384\",\n    \"n01774750\",\n    \"n01775062\",\n    \"n01776313\",\n    \"n01784675\",\n    \"n01795545\",\n    \"n01796340\",\n    \"n01797886\",\n    \"n01798484\",\n    \"n01806143\",\n    \"n01806567\",\n    \"n01807496\",\n    \"n01817953\",\n    \"n01818515\",\n    \"n01819313\",\n    \"n01820546\",\n    \"n01824575\",\n    \"n01828970\",\n    \"n01829413\",\n    \"n01833805\",\n    \"n01843065\",\n    \"n01843383\",\n    \"n01847000\",\n    \"n01855032\",\n    \"n01855672\",\n    \"n01860187\",\n    \"n01871265\",\n    \"n01872401\",\n    \"n01873310\",\n    \"n01877812\",\n    \"n01882714\",\n    \"n01883070\",\n    \"n01910747\",\n    \"n01914609\",\n    \"n01917289\",\n    \"n01924916\",\n    \"n01930112\",\n    \"n01943899\",\n    \"n01944390\",\n    \"n01945685\",\n    \"n01950731\",\n    \"n01955084\",\n    \"n01968897\",\n    \"n01978287\",\n    \"n01978455\",\n    \"n01980166\",\n    \"n01981276\",\n    \"n01983481\",\n    \"n01984695\",\n    \"n01985128\",\n    \"n01986214\",\n    \"n01990800\",\n    \"n02002556\",\n    \"n02002724\",\n    \"n02006656\",\n    \"n02007558\",\n    \"n02009229\",\n    \"n02009912\",\n    \"n02011460\",\n    \"n02012849\",\n    \"n02013706\",\n    \"n02017213\",\n    \"n02018207\",\n    \"n02018795\",\n    \"n02025239\",\n    \"n02027492\",\n    \"n02028035\",\n    \"n02033041\",\n    \"n02037110\",\n    \"n02051845\",\n    \"n02056570\",\n    \"n02058221\",\n    \"n02066245\",\n    \"n02071294\",\n    \"n02074367\",\n    \"n02077923\",\n    \"n02085620\",\n    \"n02085782\",\n    \"n02085936\",\n    \"n02086079\",\n    \"n02086240\",\n    \"n02086646\",\n    \"n02086910\",\n    \"n02087046\",\n    \"n02087394\",\n    \"n02088094\",\n    \"n02088238\",\n    \"n02088364\",\n    \"n02088466\",\n    \"n02088632\",\n    \"n02089078\",\n    \"n02089867\",\n    \"n02089973\",\n    \"n02090379\",\n    \"n02090622\",\n    \"n02090721\",\n    \"n02091032\",\n    \"n02091134\",\n    \"n02091244\",\n    \"n02091467\",\n    \"n02091635\",\n    \"n02091831\",\n    \"n02092002\",\n    \"n02092339\",\n    \"n02093256\",\n    \"n02093428\",\n    \"n02093647\",\n    \"n02093754\",\n    \"n02093859\",\n    \"n02093991\",\n    \"n02094114\",\n    \"n02094258\",\n    \"n02094433\",\n    \"n02095314\",\n    \"n02095570\",\n    \"n02095889\",\n    \"n02096051\",\n    \"n02096177\",\n    \"n02096294\",\n    \"n02096437\",\n    \"n02096585\",\n    \"n02097047\",\n    \"n02097130\",\n    \"n02097209\",\n    \"n02097298\",\n    \"n02097474\",\n    \"n02097658\",\n    \"n02098105\",\n    \"n02098286\",\n    \"n02098413\",\n    \"n02099267\",\n    \"n02099429\",\n    \"n02099601\",\n    \"n02099712\",\n    \"n02099849\",\n    \"n02100236\",\n    \"n02100583\",\n    \"n02100735\",\n    \"n02100877\",\n    \"n02101006\",\n    \"n02101388\",\n    \"n02101556\",\n    \"n02102040\",\n    \"n02102177\",\n    \"n02102318\",\n    \"n02102480\",\n    \"n02102973\",\n    \"n02104029\",\n    \"n02104365\",\n    \"n02105056\",\n    \"n02105162\",\n    \"n02105251\",\n    \"n02105412\",\n    \"n02105505\",\n    \"n02105641\",\n    \"n02105855\",\n    \"n02106030\",\n    \"n02106166\",\n    \"n02106382\",\n    \"n02106550\",\n    \"n02106662\",\n    \"n02107142\",\n    \"n02107312\",\n    \"n02107574\",\n    \"n02107683\",\n    \"n02107908\",\n    \"n02108000\",\n    \"n02108089\",\n    \"n02108422\",\n    \"n02108551\",\n    \"n02108915\",\n    \"n02109047\",\n    \"n02109525\",\n    \"n02109961\",\n    \"n02110063\",\n    \"n02110185\",\n    \"n02110341\",\n    \"n02110627\",\n    \"n02110806\",\n    \"n02110958\",\n    \"n02111129\",\n    \"n02111277\",\n    \"n02111500\",\n    \"n02111889\",\n    \"n02112018\",\n    \"n02112137\",\n    \"n02112350\",\n    \"n02112706\",\n    \"n02113023\",\n    \"n02113186\",\n    \"n02113624\",\n    \"n02113712\",\n    \"n02113799\",\n    \"n02113978\",\n    \"n02114367\",\n    \"n02114548\",\n    \"n02114712\",\n    \"n02114855\",\n    \"n02115641\",\n    \"n02115913\",\n    \"n02116738\",\n    \"n02117135\",\n    \"n02119022\",\n    \"n02119789\",\n    \"n02120079\",\n    \"n02120505\",\n    \"n02123045\",\n    \"n02123159\",\n    \"n02123394\",\n    \"n02123597\",\n    \"n02124075\",\n    \"n02125311\",\n    \"n02127052\",\n    \"n02128385\",\n    \"n02128757\",\n    \"n02128925\",\n    \"n02129165\",\n    \"n02129604\",\n    \"n02130308\",\n    \"n02132136\",\n    \"n02133161\",\n    \"n02134084\",\n    \"n02134418\",\n    \"n02137549\",\n    \"n02138441\",\n    \"n02165105\",\n    \"n02165456\",\n    \"n02167151\",\n    \"n02168699\",\n    \"n02169497\",\n    \"n02172182\",\n    \"n02174001\",\n    \"n02177972\",\n    \"n02190166\",\n    \"n02206856\",\n    \"n02219486\",\n    \"n02226429\",\n    \"n02229544\",\n    \"n02231487\",\n    \"n02233338\",\n    \"n02236044\",\n    \"n02256656\",\n    \"n02259212\",\n    \"n02264363\",\n    \"n02268443\",\n    \"n02268853\",\n    \"n02276258\",\n    \"n02277742\",\n    \"n02279972\",\n    \"n02280649\",\n    \"n02281406\",\n    \"n02281787\",\n    \"n02317335\",\n    \"n02319095\",\n    \"n02321529\",\n    \"n02325366\",\n    \"n02326432\",\n    \"n02328150\",\n    \"n02342885\",\n    \"n02346627\",\n    \"n02356798\",\n    \"n02361337\",\n    \"n02363005\",\n    \"n02364673\",\n    \"n02389026\",\n    \"n02391049\",\n    \"n02395406\",\n    \"n02396427\",\n    \"n02397096\",\n    \"n02398521\",\n    \"n02403003\",\n    \"n02408429\",\n    \"n02410509\",\n    \"n02412080\",\n    \"n02415577\",\n    \"n02417914\",\n    \"n02422106\",\n    \"n02422699\",\n    \"n02423022\",\n    \"n02437312\",\n    \"n02437616\",\n    \"n02441942\",\n    \"n02442845\",\n    \"n02443114\",\n    \"n02443484\",\n    \"n02444819\",\n    \"n02445715\",\n    \"n02447366\",\n    \"n02454379\",\n    \"n02457408\",\n    \"n02480495\",\n    \"n02480855\",\n    \"n02481823\",\n    \"n02483362\",\n    \"n02483708\",\n    \"n02484975\",\n    \"n02486261\",\n    \"n02486410\",\n    \"n02487347\",\n    \"n02488291\",\n    \"n02488702\",\n    \"n02489166\",\n    \"n02490219\",\n    \"n02492035\",\n    \"n02492660\",\n    \"n02493509\",\n    \"n02493793\",\n    \"n02494079\",\n    \"n02497673\",\n    \"n02500267\",\n    \"n02504013\",\n    \"n02504458\",\n    \"n02509815\",\n    \"n02510455\",\n    \"n02514041\",\n    \"n02526121\",\n    \"n02536864\",\n    \"n02606052\",\n    \"n02607072\",\n    \"n02640242\",\n    \"n02641379\",\n    \"n02643566\",\n    \"n02655020\",\n    \"n02666196\",\n    \"n02667093\",\n    \"n02669723\",\n    \"n02672831\",\n    \"n02676566\",\n    \"n02687172\",\n    \"n02690373\",\n    \"n02692877\",\n    \"n02699494\",\n    \"n02701002\",\n    \"n02704792\",\n    \"n02708093\",\n    \"n02727426\",\n    \"n02730930\",\n    \"n02747177\",\n    \"n02749479\",\n    \"n02769748\",\n    \"n02776631\",\n    \"n02777292\",\n    \"n02782093\",\n    \"n02783161\",\n    \"n02786058\",\n    \"n02787622\",\n    \"n02788148\",\n    \"n02790996\",\n    \"n02791124\",\n    \"n02791270\",\n    \"n02793495\",\n    \"n02794156\",\n    \"n02795169\",\n    \"n02797295\",\n    \"n02799071\",\n    \"n02802426\",\n    \"n02804414\",\n    \"n02804610\",\n    \"n02807133\",\n    \"n02808304\",\n    \"n02808440\",\n    \"n02814533\",\n    \"n02814860\",\n    \"n02815834\",\n    \"n02817516\",\n    \"n02823428\",\n    \"n02823750\",\n    \"n02825657\",\n    \"n02834397\",\n    \"n02835271\",\n    \"n02837789\",\n    \"n02840245\",\n    \"n02841315\",\n    \"n02843684\",\n    \"n02859443\",\n    \"n02860847\",\n    \"n02865351\",\n    \"n02869837\",\n    \"n02870880\",\n    \"n02871525\",\n    \"n02877765\",\n    \"n02879718\",\n    \"n02883205\",\n    \"n02892201\",\n    \"n02892767\",\n    \"n02894605\",\n    \"n02895154\",\n    \"n02906734\",\n    \"n02909870\",\n    \"n02910353\",\n    \"n02916936\",\n    \"n02917067\",\n    \"n02927161\",\n    \"n02930766\",\n    \"n02939185\",\n    \"n02948072\",\n    \"n02950826\",\n    \"n02951358\",\n    \"n02951585\",\n    \"n02963159\",\n    \"n02965783\",\n    \"n02966193\",\n    \"n02966687\",\n    \"n02971356\",\n    \"n02974003\",\n    \"n02977058\",\n    \"n02978881\",\n    \"n02979186\",\n    \"n02980441\",\n    \"n02981792\",\n    \"n02988304\",\n    \"n02992211\",\n    \"n02992529\",\n    \"n02999410\",\n    \"n03000134\",\n    \"n03000247\",\n    \"n03000684\",\n    \"n03014705\",\n    \"n03016953\",\n    \"n03017168\",\n    \"n03018349\",\n    \"n03026506\",\n    \"n03028079\",\n    \"n03032252\",\n    \"n03041632\",\n    \"n03042490\",\n    \"n03045698\",\n    \"n03047690\",\n    \"n03062245\",\n    \"n03063599\",\n    \"n03063689\",\n    \"n03065424\",\n    \"n03075370\",\n    \"n03085013\",\n    \"n03089624\",\n    \"n03095699\",\n    \"n03100240\",\n    \"n03109150\",\n    \"n03110669\",\n    \"n03124043\",\n    \"n03124170\",\n    \"n03125729\",\n    \"n03126707\",\n    \"n03127747\",\n    \"n03127925\",\n    \"n03131574\",\n    \"n03133878\",\n    \"n03134739\",\n    \"n03141823\",\n    \"n03146219\",\n    \"n03160309\",\n    \"n03179701\",\n    \"n03180011\",\n    \"n03187595\",\n    \"n03188531\",\n    \"n03196217\",\n    \"n03197337\",\n    \"n03201208\",\n    \"n03207743\",\n    \"n03207941\",\n    \"n03208938\",\n    \"n03216828\",\n    \"n03218198\",\n    \"n03220513\",\n    \"n03223299\",\n    \"n03240683\",\n    \"n03249569\",\n    \"n03250847\",\n    \"n03255030\",\n    \"n03259280\",\n    \"n03271574\",\n    \"n03272010\",\n    \"n03272562\",\n    \"n03290653\",\n    \"n03291819\",\n    \"n03297495\",\n    \"n03314780\",\n    \"n03325584\",\n    \"n03337140\",\n    \"n03344393\",\n    \"n03345487\",\n    \"n03347037\",\n    \"n03355925\",\n    \"n03372029\",\n    \"n03376595\",\n    \"n03379051\",\n    \"n03384352\",\n    \"n03388043\",\n    \"n03388183\",\n    \"n03388549\",\n    \"n03393912\",\n    \"n03394916\",\n    \"n03400231\",\n    \"n03404251\",\n    \"n03417042\",\n    \"n03424325\",\n    \"n03425413\",\n    \"n03443371\",\n    \"n03444034\",\n    \"n03445777\",\n    \"n03445924\",\n    \"n03447447\",\n    \"n03447721\",\n    \"n03450230\",\n    \"n03452741\",\n    \"n03457902\",\n    \"n03459775\",\n    \"n03461385\",\n    \"n03467068\",\n    \"n03476684\",\n    \"n03476991\",\n    \"n03478589\",\n    \"n03481172\",\n    \"n03482405\",\n    \"n03483316\",\n    \"n03485407\",\n    \"n03485794\",\n    \"n03492542\",\n    \"n03494278\",\n    \"n03495258\",\n    \"n03496892\",\n    \"n03498962\",\n    \"n03527444\",\n    \"n03529860\",\n    \"n03530642\",\n    \"n03532672\",\n    \"n03534580\",\n    \"n03535780\",\n    \"n03538406\",\n    \"n03544143\",\n    \"n03584254\",\n    \"n03584829\",\n    \"n03590841\",\n    \"n03594734\",\n    \"n03594945\",\n    \"n03595614\",\n    \"n03598930\",\n    \"n03599486\",\n    \"n03602883\",\n    \"n03617480\",\n    \"n03623198\",\n    \"n03627232\",\n    \"n03630383\",\n    \"n03633091\",\n    \"n03637318\",\n    \"n03642806\",\n    \"n03649909\",\n    \"n03657121\",\n    \"n03658185\",\n    \"n03661043\",\n    \"n03662601\",\n    \"n03666591\",\n    \"n03670208\",\n    \"n03673027\",\n    \"n03676483\",\n    \"n03680355\",\n    \"n03690938\",\n    \"n03691459\",\n    \"n03692522\",\n    \"n03697007\",\n    \"n03706229\",\n    \"n03709823\",\n    \"n03710193\",\n    \"n03710637\",\n    \"n03710721\",\n    \"n03717622\",\n    \"n03720891\",\n    \"n03721384\",\n    \"n03724870\",\n    \"n03729826\",\n    \"n03733131\",\n    \"n03733281\",\n    \"n03733805\",\n    \"n03742115\",\n    \"n03743016\",\n    \"n03759954\",\n    \"n03761084\",\n    \"n03763968\",\n    \"n03764736\",\n    \"n03769881\",\n    \"n03770439\",\n    \"n03770679\",\n    \"n03773504\",\n    \"n03775071\",\n    \"n03775546\",\n    \"n03776460\",\n    \"n03777568\",\n    \"n03777754\",\n    \"n03781244\",\n    \"n03782006\",\n    \"n03785016\",\n    \"n03786901\",\n    \"n03787032\",\n    \"n03788195\",\n    \"n03788365\",\n    \"n03791053\",\n    \"n03792782\",\n    \"n03792972\",\n    \"n03793489\",\n    \"n03794056\",\n    \"n03796401\",\n    \"n03803284\",\n    \"n03804744\",\n    \"n03814639\",\n    \"n03814906\",\n    \"n03825788\",\n    \"n03832673\",\n    \"n03837869\",\n    \"n03838899\",\n    \"n03840681\",\n    \"n03841143\",\n    \"n03843555\",\n    \"n03854065\",\n    \"n03857828\",\n    \"n03866082\",\n    \"n03868242\",\n    \"n03868863\",\n    \"n03871628\",\n    \"n03873416\",\n    \"n03874293\",\n    \"n03874599\",\n    \"n03876231\",\n    \"n03877472\",\n    \"n03877845\",\n    \"n03884397\",\n    \"n03887697\",\n    \"n03888257\",\n    \"n03888605\",\n    \"n03891251\",\n    \"n03891332\",\n    \"n03895866\",\n    \"n03899768\",\n    \"n03902125\",\n    \"n03903868\",\n    \"n03908618\",\n    \"n03908714\",\n    \"n03916031\",\n    \"n03920288\",\n    \"n03924679\",\n    \"n03929660\",\n    \"n03929855\",\n    \"n03930313\",\n    \"n03930630\",\n    \"n03933933\",\n    \"n03935335\",\n    \"n03937543\",\n    \"n03938244\",\n    \"n03942813\",\n    \"n03944341\",\n    \"n03947888\",\n    \"n03950228\",\n    \"n03954731\",\n    \"n03956157\",\n    \"n03958227\",\n    \"n03961711\",\n    \"n03967562\",\n    \"n03970156\",\n    \"n03976467\",\n    \"n03976657\",\n    \"n03977966\",\n    \"n03980874\",\n    \"n03982430\",\n    \"n03983396\",\n    \"n03991062\",\n    \"n03992509\",\n    \"n03995372\",\n    \"n03998194\",\n    \"n04004767\",\n    \"n04005630\",\n    \"n04008634\",\n    \"n04009552\",\n    \"n04019541\",\n    \"n04023962\",\n    \"n04026417\",\n    \"n04033901\",\n    \"n04033995\",\n    \"n04037443\",\n    \"n04039381\",\n    \"n04040759\",\n    \"n04041544\",\n    \"n04044716\",\n    \"n04049303\",\n    \"n04065272\",\n    \"n04067472\",\n    \"n04069434\",\n    \"n04070727\",\n    \"n04074963\",\n    \"n04081281\",\n    \"n04086273\",\n    \"n04090263\",\n    \"n04099969\",\n    \"n04111531\",\n    \"n04116512\",\n    \"n04118538\",\n    \"n04118776\",\n    \"n04120489\",\n    \"n04125021\",\n    \"n04127249\",\n    \"n04131690\",\n    \"n04133789\",\n    \"n04136333\",\n    \"n04141076\",\n    \"n04141327\",\n    \"n04141975\",\n    \"n04146614\",\n    \"n04147183\",\n    \"n04149813\",\n    \"n04152593\",\n    \"n04153751\",\n    \"n04154565\",\n    \"n04162706\",\n    \"n04179913\",\n    \"n04192698\",\n    \"n04200800\",\n    \"n04201297\",\n    \"n04204238\",\n    \"n04204347\",\n    \"n04208210\",\n    \"n04209133\",\n    \"n04209239\",\n    \"n04228054\",\n    \"n04229816\",\n    \"n04235860\",\n    \"n04238763\",\n    \"n04239074\",\n    \"n04243546\",\n    \"n04251144\",\n    \"n04252077\",\n    \"n04252225\",\n    \"n04254120\",\n    \"n04254680\",\n    \"n04254777\",\n    \"n04258138\",\n    \"n04259630\",\n    \"n04263257\",\n    \"n04264628\",\n    \"n04265275\",\n    \"n04266014\",\n    \"n04270147\",\n    \"n04273569\",\n    \"n04275548\",\n    \"n04277352\",\n    \"n04285008\",\n    \"n04286575\",\n    \"n04296562\",\n    \"n04310018\",\n    \"n04311004\",\n    \"n04311174\",\n    \"n04317175\",\n    \"n04325704\",\n    \"n04326547\",\n    \"n04328186\",\n    \"n04330267\",\n    \"n04332243\",\n    \"n04335435\",\n    \"n04336792\",\n    \"n04344873\",\n    \"n04346328\",\n    \"n04347754\",\n    \"n04350905\",\n    \"n04355338\",\n    \"n04355933\",\n    \"n04356056\",\n    \"n04357314\",\n    \"n04366367\",\n    \"n04367480\",\n    \"n04370456\",\n    \"n04371430\",\n    \"n04371774\",\n    \"n04372370\",\n    \"n04376876\",\n    \"n04380533\",\n    \"n04389033\",\n    \"n04392985\",\n    \"n04398044\",\n    \"n04399382\",\n    \"n04404412\",\n    \"n04409515\",\n    \"n04417672\",\n    \"n04418357\",\n    \"n04423845\",\n    \"n04428191\",\n    \"n04429376\",\n    \"n04435653\",\n    \"n04442312\",\n    \"n04443257\",\n    \"n04447861\",\n    \"n04456115\",\n    \"n04458633\",\n    \"n04461696\",\n    \"n04462240\",\n    \"n04465501\",\n    \"n04467665\",\n    \"n04476259\",\n    \"n04479046\",\n    \"n04482393\",\n    \"n04483307\",\n    \"n04485082\",\n    \"n04486054\",\n    \"n04487081\",\n    \"n04487394\",\n    \"n04493381\",\n    \"n04501370\",\n    \"n04505470\",\n    \"n04507155\",\n    \"n04509417\",\n    \"n04515003\",\n    \"n04517823\",\n    \"n04522168\",\n    \"n04523525\",\n    \"n04525038\",\n    \"n04525305\",\n    \"n04532106\",\n    \"n04532670\",\n    \"n04536866\",\n    \"n04540053\",\n    \"n04542943\",\n    \"n04548280\",\n    \"n04548362\",\n    \"n04550184\",\n    \"n04552348\",\n    \"n04553703\",\n    \"n04554684\",\n    \"n04557648\",\n    \"n04560804\",\n    \"n04562935\",\n    \"n04579145\",\n    \"n04579432\",\n    \"n04584207\",\n    \"n04589890\",\n    \"n04590129\",\n    \"n04591157\",\n    \"n04591713\",\n    \"n04592741\",\n    \"n04596742\",\n    \"n04597913\",\n    \"n04599235\",\n    \"n04604644\",\n    \"n04606251\",\n    \"n04612504\",\n    \"n04613696\",\n    \"n06359193\",\n    \"n06596364\",\n    \"n06785654\",\n    \"n06794110\",\n    \"n06874185\",\n    \"n07248320\",\n    \"n07565083\",\n    \"n07579787\",\n    \"n07583066\",\n    \"n07584110\",\n    \"n07590611\",\n    \"n07613480\",\n    \"n07614500\",\n    \"n07615774\",\n    \"n07684084\",\n    \"n07693725\",\n    \"n07695742\",\n    \"n07697313\",\n    \"n07697537\",\n    \"n07711569\",\n    \"n07714571\",\n    \"n07714990\",\n    \"n07715103\",\n    \"n07716358\",\n    \"n07716906\",\n    \"n07717410\",\n    \"n07717556\",\n    \"n07718472\",\n    \"n07718747\",\n    \"n07720875\",\n    \"n07730033\",\n    \"n07734744\",\n    \"n07742313\",\n    \"n07745940\",\n    \"n07747607\",\n    \"n07749582\",\n    \"n07753113\",\n    \"n07753275\",\n    \"n07753592\",\n    \"n07754684\",\n    \"n07760859\",\n    \"n07768694\",\n    \"n07802026\",\n    \"n07831146\",\n    \"n07836838\",\n    \"n07860988\",\n    \"n07871810\",\n    \"n07873807\",\n    \"n07875152\",\n    \"n07880968\",\n    \"n07892512\",\n    \"n07920052\",\n    \"n07930864\",\n    \"n07932039\",\n    \"n09193705\",\n    \"n09229709\",\n    \"n09246464\",\n    \"n09256479\",\n    \"n09288635\",\n    \"n09332890\",\n    \"n09399592\",\n    \"n09421951\",\n    \"n09428293\",\n    \"n09468604\",\n    \"n09472597\",\n    \"n09835506\",\n    \"n10148035\",\n    \"n10565667\",\n    \"n11879895\",\n    \"n11939491\",\n    \"n12057211\",\n    \"n12144580\",\n    \"n12267677\",\n    \"n12620546\",\n    \"n12768682\",\n    \"n12985857\",\n    \"n12998815\",\n    \"n13037406\",\n    \"n13040303\",\n    \"n13044778\",\n    \"n13052670\",\n    \"n13054560\",\n    \"n13133613\",\n    \"n15075141\",\n]\n\n# ImageNet-R folder names/class IDs. Subset of ImageNet-1k classes\nIMAGENET_R_SYNSETS = [\n    \"n01443537\",\n    \"n01484850\",\n    \"n01494475\",\n    \"n01498041\",\n    \"n01514859\",\n    \"n01518878\",\n    \"n01531178\",\n    \"n01534433\",\n    \"n01614925\",\n    \"n01616318\",\n    \"n01630670\",\n    \"n01632777\",\n    \"n01644373\",\n    \"n01677366\",\n    \"n01694178\",\n    \"n01748264\",\n    \"n01770393\",\n    \"n01774750\",\n    \"n01784675\",\n    \"n01806143\",\n    \"n01820546\",\n    \"n01833805\",\n    \"n01843383\",\n    \"n01847000\",\n    \"n01855672\",\n    \"n01860187\",\n    \"n01882714\",\n    \"n01910747\",\n    \"n01944390\",\n    \"n01983481\",\n    \"n01986214\",\n    \"n02007558\",\n    \"n02009912\",\n    \"n02051845\",\n    \"n02056570\",\n    \"n02066245\",\n    \"n02071294\",\n    \"n02077923\",\n    \"n02085620\",\n    \"n02086240\",\n    \"n02088094\",\n    \"n02088238\",\n    \"n02088364\",\n    \"n02088466\",\n    \"n02091032\",\n    \"n02091134\",\n    \"n02092339\",\n    \"n02094433\",\n    \"n02096585\",\n    \"n02097298\",\n    \"n02098286\",\n    \"n02099601\",\n    \"n02099712\",\n    \"n02102318\",\n    \"n02106030\",\n    \"n02106166\",\n    \"n02106550\",\n    \"n02106662\",\n    \"n02108089\",\n    \"n02108915\",\n    \"n02109525\",\n    \"n02110185\",\n    \"n02110341\",\n    \"n02110958\",\n    \"n02112018\",\n    \"n02112137\",\n    \"n02113023\",\n    \"n02113624\",\n    \"n02113799\",\n    \"n02114367\",\n    \"n02117135\",\n    \"n02119022\",\n    \"n02123045\",\n    \"n02128385\",\n    \"n02128757\",\n    \"n02129165\",\n    \"n02129604\",\n    \"n02130308\",\n    \"n02134084\",\n    \"n02138441\",\n    \"n02165456\",\n    \"n02190166\",\n    \"n02206856\",\n    \"n02219486\",\n    \"n02226429\",\n    \"n02233338\",\n    \"n02236044\",\n    \"n02268443\",\n    \"n02279972\",\n    \"n02317335\",\n    \"n02325366\",\n    \"n02346627\",\n    \"n02356798\",\n    \"n02363005\",\n    \"n02364673\",\n    \"n02391049\",\n    \"n02395406\",\n    \"n02398521\",\n    \"n02410509\",\n    \"n02423022\",\n    \"n02437616\",\n    \"n02445715\",\n    \"n02447366\",\n    \"n02480495\",\n    \"n02480855\",\n    \"n02481823\",\n    \"n02483362\",\n    \"n02486410\",\n    \"n02510455\",\n    \"n02526121\",\n    \"n02607072\",\n    \"n02655020\",\n    \"n02672831\",\n    \"n02701002\",\n    \"n02749479\",\n    \"n02769748\",\n    \"n02793495\",\n    \"n02797295\",\n    \"n02802426\",\n    \"n02808440\",\n    \"n02814860\",\n    \"n02823750\",\n    \"n02841315\",\n    \"n02843684\",\n    \"n02883205\",\n    \"n02906734\",\n    \"n02909870\",\n    \"n02939185\",\n    \"n02948072\",\n    \"n02950826\",\n    \"n02951358\",\n    \"n02966193\",\n    \"n02980441\",\n    \"n02992529\",\n    \"n03124170\",\n    \"n03272010\",\n    \"n03345487\",\n    \"n03372029\",\n    \"n03424325\",\n    \"n03452741\",\n    \"n03467068\",\n    \"n03481172\",\n    \"n03494278\",\n    \"n03495258\",\n    \"n03498962\",\n    \"n03594945\",\n    \"n03602883\",\n    \"n03630383\",\n    \"n03649909\",\n    \"n03676483\",\n    \"n03710193\",\n    \"n03773504\",\n    \"n03775071\",\n    \"n03888257\",\n    \"n03930630\",\n    \"n03947888\",\n    \"n04086273\",\n    \"n04118538\",\n    \"n04133789\",\n    \"n04141076\",\n    \"n04146614\",\n    \"n04147183\",\n    \"n04192698\",\n    \"n04254680\",\n    \"n04266014\",\n    \"n04275548\",\n    \"n04310018\",\n    \"n04325704\",\n    \"n04347754\",\n    \"n04389033\",\n    \"n04409515\",\n    \"n04465501\",\n    \"n04487394\",\n    \"n04522168\",\n    \"n04536866\",\n    \"n04552348\",\n    \"n04591713\",\n    \"n07614500\",\n    \"n07693725\",\n    \"n07695742\",\n    \"n07697313\",\n    \"n07697537\",\n    \"n07714571\",\n    \"n07714990\",\n    \"n07718472\",\n    \"n07720875\",\n    \"n07734744\",\n    \"n07742313\",\n    \"n07745940\",\n    \"n07749582\",\n    \"n07753275\",\n    \"n07753592\",\n    \"n07768694\",\n    \"n07873807\",\n    \"n07880968\",\n    \"n07920052\",\n    \"n09472597\",\n    \"n09835506\",\n    \"n10565667\",\n    \"n12267677\",\n]\n\n# ImageNet-A folder names/class IDs. Subset of ImageNet-1k classes\nIMAGENET_A_SYNSETS = [\n    \"n01498041\",\n    \"n01531178\",\n    \"n01534433\",\n    \"n01558993\",\n    \"n01580077\",\n    \"n01614925\",\n    \"n01616318\",\n    \"n01631663\",\n    \"n01641577\",\n    \"n01669191\",\n    \"n01677366\",\n    \"n01687978\",\n    \"n01694178\",\n    \"n01698640\",\n    \"n01735189\",\n    \"n01770081\",\n    \"n01770393\",\n    \"n01774750\",\n    \"n01784675\",\n    \"n01819313\",\n    \"n01820546\",\n    \"n01833805\",\n    \"n01843383\",\n    \"n01847000\",\n    \"n01855672\",\n    \"n01882714\",\n    \"n01910747\",\n    \"n01914609\",\n    \"n01924916\",\n    \"n01944390\",\n    \"n01985128\",\n    \"n01986214\",\n    \"n02007558\",\n    \"n02009912\",\n    \"n02037110\",\n    \"n02051845\",\n    \"n02077923\",\n    \"n02085620\",\n    \"n02099601\",\n    \"n02106550\",\n    \"n02106662\",\n    \"n02110958\",\n    \"n02119022\",\n    \"n02123394\",\n    \"n02127052\",\n    \"n02129165\",\n    \"n02133161\",\n    \"n02137549\",\n    \"n02165456\",\n    \"n02174001\",\n    \"n02177972\",\n    \"n02190166\",\n    \"n02206856\",\n    \"n02219486\",\n    \"n02226429\",\n    \"n02231487\",\n    \"n02233338\",\n    \"n02236044\",\n    \"n02259212\",\n    \"n02268443\",\n    \"n02279972\",\n    \"n02280649\",\n    \"n02281787\",\n    \"n02317335\",\n    \"n02325366\",\n    \"n02346627\",\n    \"n02356798\",\n    \"n02361337\",\n    \"n02410509\",\n    \"n02445715\",\n    \"n02454379\",\n    \"n02486410\",\n    \"n02492035\",\n    \"n02504458\",\n    \"n02655020\",\n    \"n02669723\",\n    \"n02672831\",\n    \"n02676566\",\n    \"n02690373\",\n    \"n02701002\",\n    \"n02730930\",\n    \"n02777292\",\n    \"n02782093\",\n    \"n02787622\",\n    \"n02793495\",\n    \"n02797295\",\n    \"n02802426\",\n    \"n02814860\",\n    \"n02815834\",\n    \"n02837789\",\n    \"n02879718\",\n    \"n02883205\",\n    \"n02895154\",\n    \"n02906734\",\n    \"n02948072\",\n    \"n02951358\",\n    \"n02980441\",\n    \"n02992211\",\n    \"n02999410\",\n    \"n03014705\",\n    \"n03026506\",\n    \"n03124043\",\n    \"n03125729\",\n    \"n03187595\",\n    \"n03196217\",\n    \"n03223299\",\n    \"n03250847\",\n    \"n03255030\",\n    \"n03291819\",\n    \"n03325584\",\n    \"n03355925\",\n    \"n03384352\",\n    \"n03388043\",\n    \"n03417042\",\n    \"n03443371\",\n    \"n03444034\",\n    \"n03445924\",\n    \"n03452741\",\n    \"n03483316\",\n    \"n03584829\",\n    \"n03590841\",\n    \"n03594945\",\n    \"n03617480\",\n    \"n03666591\",\n    \"n03670208\",\n    \"n03717622\",\n    \"n03720891\",\n    \"n03721384\",\n    \"n03724870\",\n    \"n03775071\",\n    \"n03788195\",\n    \"n03804744\",\n    \"n03837869\",\n    \"n03840681\",\n    \"n03854065\",\n    \"n03888257\",\n    \"n03891332\",\n    \"n03935335\",\n    \"n03982430\",\n    \"n04019541\",\n    \"n04033901\",\n    \"n04039381\",\n    \"n04067472\",\n    \"n04086273\",\n    \"n04099969\",\n    \"n04118538\",\n    \"n04131690\",\n    \"n04133789\",\n    \"n04141076\",\n    \"n04146614\",\n    \"n04147183\",\n    \"n04179913\",\n    \"n04208210\",\n    \"n04235860\",\n    \"n04252077\",\n    \"n04252225\",\n    \"n04254120\",\n    \"n04270147\",\n    \"n04275548\",\n    \"n04310018\",\n    \"n04317175\",\n    \"n04344873\",\n    \"n04347754\",\n    \"n04355338\",\n    \"n04366367\",\n    \"n04376876\",\n    \"n04389033\",\n    \"n04399382\",\n    \"n04442312\",\n    \"n04456115\",\n    \"n04482393\",\n    \"n04507155\",\n    \"n04509417\",\n    \"n04532670\",\n    \"n04540053\",\n    \"n04554684\",\n    \"n04562935\",\n    \"n04591713\",\n    \"n04606251\",\n    \"n07583066\",\n    \"n07695742\",\n    \"n07697313\",\n    \"n07697537\",\n    \"n07714990\",\n    \"n07718472\",\n    \"n07720875\",\n    \"n07734744\",\n    \"n07749582\",\n    \"n07753592\",\n    \"n07760859\",\n    \"n07768694\",\n    \"n07831146\",\n    \"n09229709\",\n    \"n09246464\",\n    \"n09472597\",\n    \"n09835506\",\n    \"n11879895\",\n    \"n12057211\",\n    \"n12144580\",\n    \"n12267677\",\n]\n"
  },
  {
    "path": "corenet/data/datasets/classification/imagenet_v2.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nimport tarfile\nfrom pathlib import Path\nfrom typing import Dict, Tuple\n\nimport torch\n\nfrom corenet.data.datasets import DATASET_REGISTRY\nfrom corenet.data.datasets.dataset_base import BaseImageDataset\nfrom corenet.data.transforms import image_pil as T\nfrom corenet.data.transforms.common import Compose\nfrom corenet.utils import logger\nfrom corenet.utils.download_utils import get_local_path\n\nIMAGENETv2_SPLIT_LINK_MAP = {\n    \"matched_frequency\": {\n        \"url\": \"https://s3-us-west-2.amazonaws.com/imagenetv2public/imagenetv2-matched-frequency.tar.gz\",\n        \"extracted_folder_name\": \"imagenetv2-matched-frequency-format-val\",\n    },\n    \"threshold_0.7\": {\n        \"url\": \"https://s3-us-west-2.amazonaws.com/imagenetv2public/imagenetv2-threshold0.7.tar.gz\",\n        \"extracted_folder_name\": \"imagenetv2-threshold0.7-format-val\",\n    },\n    \"top_images\": {\n        \"url\": \"https://s3-us-west-2.amazonaws.com/imagenetv2public/imagenetv2-top-images.tar.gz\",\n        \"extracted_folder_name\": \"imagenetv2-top-images-format-val\",\n    },\n}\n\n\n@DATASET_REGISTRY.register(name=\"imagenet_v2\", type=\"classification\")\nclass Imagenetv2Dataset(BaseImageDataset):\n    \"\"\"\n    `ImageNetv2 Dataset <https://arxiv.org/abs/1902.10811>`_ for studying the robustness of models trained on ImageNet dataset\n\n    Args:\n        opts: command-line arguments\n    \"\"\"\n\n    def __init__(\n        self,\n        opts,\n        *args,\n        **kwargs,\n    ) -> None:\n\n        super().__init__(opts=opts, *args, **kwargs)\n        if self.is_training:\n            logger.error(\n                \"{} can only be used for evaluation\".format(self.__class__.__name__)\n            )\n\n        split = getattr(opts, \"dataset.imagenet_v2.split\", None)\n        if split is None or split not in IMAGENETv2_SPLIT_LINK_MAP.keys():\n            logger.error(\n                \"Please specify split for ImageNetv2. Supported ImageNetv2 splits are: {}\".format(\n                    IMAGENETv2_SPLIT_LINK_MAP.keys()\n                )\n            )\n\n        split_path = get_local_path(opts, path=IMAGENETv2_SPLIT_LINK_MAP[split][\"url\"])\n        with tarfile.open(split_path) as tf:\n            tf.extractall(self.root)\n\n        root = Path(\n            \"{}/{}\".format(\n                self.root,\n                IMAGENETv2_SPLIT_LINK_MAP[split][\"extracted_folder_name\"],\n            )\n        )\n        file_names = list(root.glob(\"**/*.jpeg\"))\n        self.file_names = file_names\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        \"\"\"Add dataset-specific arguments to the parser.\"\"\"\n        if cls != Imagenetv2Dataset:\n            # Don't re-register arguments in subclasses that don't override `add_arguments()`.\n            return parser\n        group = parser.add_argument_group(title=cls.__name__)\n        group.add_argument(\n            \"--dataset.imagenet-v2.split\",\n            type=str,\n            default=\"matched-frequency\",\n            help=\"ImageNetv2 dataset. Possible choices are: {}\".format(\n                [\n                    f\"{i + 1}: {split_name}\"\n                    for i, split_name in enumerate(IMAGENETv2_SPLIT_LINK_MAP.keys())\n                ]\n            ),\n            choices=IMAGENETv2_SPLIT_LINK_MAP.keys(),\n        )\n        return parser\n\n    def _validation_transforms(self, *args, **kwargs):\n        \"\"\"Data transforms during validation\n\n        Order of transform is Resize, CenterCrop, ToTensor\n\n        Returns:\n            An instance of `corenet.data.transforms.image_pil.BaseTransformation.`\n        \"\"\"\n        aug_list = [\n            T.Resize(opts=self.opts),\n            T.CenterCrop(opts=self.opts),\n            T.ToTensor(opts=self.opts),\n        ]\n\n        return Compose(opts=self.opts, img_transforms=aug_list)\n\n    def __getitem__(self, sample_size_and_index: Tuple) -> Dict:\n        \"\"\"Returns the sample corresponding to the input sample index.\n\n        Returned sample is transformed into the size specified by the input.\n\n        Args:\n            sample_size_and_index: Tuple of the form (crop_size_h, crop_size_w, sample_index)\n\n        Shapes:\n            The output data dictionary contains three keys (samples, sample_id, and target). The values of these\n            keys has the following shapes:\n                data[\"samples\"]: Shape is [Channels, Height, Width]\n                data[\"sample_id\"]: Shape is 1\n                data[\"targets\"]: Shape is 1\n\n        Returns:\n            A dictionary with `samples`, `sample_id` and `targets` as keys corresponding to input, index and label of\n            a sample, respectively.\n        \"\"\"\n        crop_size_h, crop_size_w, img_index = sample_size_and_index\n\n        # same for validation and evaluation\n        transform_fn = self.get_augmentation_transforms(size=(crop_size_h, crop_size_w))\n\n        # infer target label from the file name\n        # file names are organized as SPLIT_NAME-format-val/class_idx/*.jpg\n        # Example: All images in this folder (imagenetv2-matched-frequency-format-val/0/*.jpg) belong to class 0\n        img_path = str(self.file_names[img_index])\n        target = int(self.file_names[img_index].parent.name)\n\n        input_img = self.read_image_pil(img_path)\n        if input_img is None:\n            # Sometimes images are corrupt\n            # Skip such images\n            logger.log(\"Img index {} is possibly corrupt.\".format(img_index))\n            input_tensor = torch.zeros(\n                size=(3, crop_size_h, crop_size_w), dtype=torch.float\n            )\n            target = -1\n            data = {\"image\": input_tensor}\n        else:\n            data = {\"image\": input_img}\n            data = transform_fn(data)\n\n        data[\"samples\"] = data[\"image\"]\n        data[\"targets\"] = target\n        data[\"sample_id\"] = img_index\n\n        return data\n\n    def __len__(self) -> int:\n        return len(self.file_names)\n"
  },
  {
    "path": "corenet/data/datasets/classification/places365.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\n\nfrom corenet.data.datasets import DATASET_REGISTRY\nfrom corenet.data.datasets.classification.base_image_classification_dataset import (\n    BaseImageClassificationDataset,\n)\n\n\n@DATASET_REGISTRY.register(name=\"places365\", type=\"classification\")\nclass Places365Dataset(BaseImageClassificationDataset):\n    \"\"\"\n    Places365 dataset that follows the structure of ImageClassificationDataset.\n\n    \"Places: A 10 million Image Database for Scene Recognition\"\n    B. Zhou, A. Lapedriza, A. Khosla, A. Oliva, and A. Torralba\n    IEEE Transactions on Pattern Analysis and Machine Intelligence, 2017\n    \"\"\"\n\n    def __init__(\n        self,\n        opts: argparse.Namespace,\n        *args,\n        **kwargs,\n    ) -> None:\n        BaseImageClassificationDataset.__init__(\n            self,\n            opts=opts,\n            *args,\n            **kwargs,\n        )\n"
  },
  {
    "path": "corenet/data/datasets/classification/wordnet_tagged_classification.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nimport fcntl\nimport glob\nimport io\nimport os\nimport pickle\nimport random\nimport shutil\nimport tarfile\nfrom pathlib import Path\nfrom typing import Any, List, Mapping, Tuple\nfrom urllib.parse import urlsplit\n\nimport pybase64\nimport torch\nfrom PIL import Image, ImageFile\n\ntry:\n    import nltk\n    from nltk.corpus import wordnet as wn\n    from nltk.corpus.reader.wordnet import Synset\n    from nltk.stem import WordNetLemmatizer\n\n    NLTK_INSTALLED = True\nexcept ModuleNotFoundError:\n    wn = None\n    Synset = None\n    WordNetLemmatizer = None\n\n    NLTK_INSTALLED = False\n\nfrom corenet.constants import DATA_CACHE_DIR\nfrom corenet.data.datasets import DATASET_REGISTRY\nfrom corenet.data.datasets.classification.base_image_classification_dataset import (\n    BaseImageClassificationDataset,\n)\nfrom corenet.data.datasets.dataset_base import BaseImageDataset\nfrom corenet.data.datasets.utils.text import caption_preprocessing\nfrom corenet.data.io.transfer_clients import BaseClient, get_transfer_client\nfrom corenet.data.transforms import BaseTransformation\nfrom corenet.utils import logger\nfrom corenet.utils.download_utils import get_local_path\n\n# To enable reading truncated images, we update the default values of following variables in PIL\n# TODO: Investigate later if below Image flags can be moved to where Image is read.\nImage.MAX_IMAGE_PIXELS = None\nImageFile.LOAD_TRUNCATED_IMAGES = True\n\nTAR_FILE_EXTN = \"tar.gz\"\nTAR_FILE_EXTRACTION_CODE = \"r:gz\"\nSAMPLE_FILE_EXTN = \"pkl\"\n\n\ndef extract_pos_offset_info_from_synset(synset: Synset) -> str:\n    \"\"\"Extracts part-of-speech and offset information from the input @synset.\n\n    Args:\n        synset: WordNet synset.\n\n    Returns:\n        A string containing part-of-speech and offset information about the synset.\n    \"\"\"\n    offset = synset.offset()\n    pos = synset.pos()\n    return f\"{pos}{offset}\"\n\n\ndef check_valid_noun_synset(synset: Synset, word: str) -> bool:\n    \"\"\"Check if input synset and word are the same.\n\n    Args:\n        synset: Input synset.\n        word: Input word.\n\n    Returns:\n        A boolean indicating if input synset and word are the same or not.\n    \"\"\"\n    return synset.name() == f\"{word}.n.01\"\n\n\n@DATASET_REGISTRY.register(name=\"wordnet_tagged_classification\", type=\"classification\")\nclass WordnetTaggedClassificationDataset(BaseImageDataset):\n    \"\"\"WordNet tagged classification dataset.\n\n    This class converts the image-text dataset into multi-label classification dataset. The expected data structure of\n    the input data should be the same as 'corenet.data.datasets.multi_modal_img_text.img_text_tar_dataset.ImgTextTarDataset'\n\n    Args:\n        opts: Command-line arguments.\n    \"\"\"\n\n    def __init__(\n        self,\n        opts: argparse.Namespace,\n        *args,\n        **kwargs,\n    ) -> None:\n        if not NLTK_INSTALLED:\n            logger.error(\n                \"Please install NLTK library using 'pip install nltk==3.8.1' and 'python3 -m nltk.downloader all' commands.\"\n            )\n\n        super().__init__(opts=opts, *args, **kwargs)\n        self._transfer_client = None\n        self.vocab = self._get_vocab()\n        self.__post_init__()\n\n    def __post_init__(self) -> None:\n        \"\"\"Post init checks.\"\"\"\n        if not self.is_training:\n            raise NotImplementedError(\"Only training is supported for now.\")\n\n    def _get_vocab(self) -> List[str]:\n        \"\"\"Retrieves the vocabulary as a list.\n\n        The vocabulary is structured as a dictionary where synsets are represented as keys in pos-offset format,\n        and their corresponding frequencies in the dataset are stored as values. The key-value pairs are arranged\n        in descending order based on the frequencies. An example is shown below:\n\n        {\n            \"n5928118\": 52418327,\n            \"n13333833\": 46393897,\n            \"n4960277\": 38781582,\n            \"n7947958\": 36532096,\n            \"n9638875\": 34564013,\n            \"n928077\": 30290822,\n            \"n7996689\": 28076676,\n            \"n10787470\": 24182531,\n            \"n5938976\": 23817664,\n            \"n8559508\": 23476398\n        }\n\n        Returns:\n            A list containing the name of top-k synsets. The value of 'k' is specified using\n            'dataset.wordnet_tagged_classification.vocab_size' argument.\n        \"\"\"\n        vocab_file_path = getattr(\n            self.opts, \"dataset.wordnet_tagged_classification.vocab_file\"\n        )\n        if vocab_file_path is None:\n            logger.error(f\"Vocab path can't be None in {self.__class__.__name__}.\")\n\n        vocab_file_path = get_local_path(\n            self.opts,\n            path=vocab_file_path,\n            force_delete=False,\n            use_start_rank=True,\n            sync_ranks=False,\n        )\n\n        with open(vocab_file_path, \"rb\") as f:\n            vocab = pickle.load(f)\n\n        vocab_size = getattr(\n            self.opts, \"dataset.wordnet_tagged_classification.vocab_size\"\n        )\n        if vocab_size is None or vocab_size < 0:\n            logger.error(\n                f\"Vocabulary size should be a positive number. Got: {vocab_size}. Please specify by 'dataset.wordnet_tagged_classification.vocab_size' argument.\"\n            )\n        return list(vocab.keys())[:vocab_size]\n\n    def _metadata_file_path(self) -> str:\n        \"\"\"Returns metadata file path from command-line arguments.\"\"\"\n        opts = self.opts\n\n        metadata_file_path = getattr(\n            opts, f\"dataset.wordnet_tagged_classification.metadata_file\"\n        )\n\n        if not metadata_file_path:\n            logger.error(\n                f\"Please specify metadata file path using 'dataset.wordnet_tagged_classification.metadata_file'.\"\n            )\n        return metadata_file_path\n\n    def _metadata(self):\n        \"\"\"Reads the metadata content.\n\n        ...note:\n            The metadata file is expected to have following keys:\n            1. total_tar_files: Total number of tar files in the dataset.\n            2. max_files_per_tar: Maximum number of files inside each tar.\n            3. tar_file_names: List containing names of the tar files.\n        \"\"\"\n        opts = self.opts\n        metadata_file_path = self._metadata_file_path()\n\n        # download the metadata file\n        metadata_file_local_path = get_local_path(\n            opts,\n            path=metadata_file_path,\n            force_delete=False,\n            use_start_rank=True,\n            sync_ranks=False,\n        )\n\n        with open(metadata_file_local_path, \"rb\") as handle:\n            metadata = pickle.load(handle)\n\n        if not {\"total_tar_files\", \"max_files_per_tar\", \"tar_file_names\"}.issubset(\n            metadata.keys()\n        ):\n            logger.error(\n                f\"Metadata file in {self.__class__.__name__} should have following keys: \\\n                    total_tar_files, max_files_per_tar, tar_file_names\"\n            )\n        return metadata\n\n    def _download_and_extract_tar_file(self, sample_index: int) -> int:\n        \"\"\"Downloads and extracts the tar file.\n\n        The tar files are pre-assumably stored in remote location (e.g., S3 bucket) and, if required, are downloaded and\n        extracted to local directory @self.cache_loc. Because of distributed and multi-process training, we first extract\n        them in the same location as downloaded, and then move to @self.cache_loc.\n\n        Args:\n            sample_index: Sample index.\n\n        Returns:\n            Index of the folder in which sample may be present.\n\n        ...note:\n            Each tar file may have samples less than @self.max_files_per_tar because of filtering criteria.\n        \"\"\"\n        # Retrieve the folder index that may contain the sample.\n        folder_idx = sample_index // self.max_files_per_tar\n\n        metadata_file_path = self._metadata_file_path()\n        remote_directory = os.path.dirname(metadata_file_path)\n        remote_file_path = f\"{remote_directory}/{folder_idx}.{TAR_FILE_EXTN}\"\n\n        with open(\n            f\"{self.cache_loc}/{folder_idx}.{TAR_FILE_EXTN}.lock\", \"a\"\n        ) as lock_file:\n            try:\n                fcntl.flock(lock_file, fcntl.LOCK_EX)\n                if os.path.isdir(f\"{self.cache_loc}/{folder_idx}\"):\n                    return folder_idx\n\n                transfer_client = self._get_transfer_client(\n                    file_path=metadata_file_path\n                )\n\n                local_tar_file_path = transfer_client.download(\n                    remote_file_paths=remote_file_path, dst_dir=self.cache_loc\n                )\n\n                # extract the tar file in the same location where tar file is downloaded\n                tar_file_basename = os.path.basename(local_tar_file_path)\n                with tarfile.open(local_tar_file_path, TAR_FILE_EXTRACTION_CODE) as tar:\n                    tar.extractall(\n                        path=local_tar_file_path.replace(tar_file_basename, \"\")\n                    )\n\n                # move extracted tar file to @self.cache_loc\n                shutil.move(\n                    local_tar_file_path.replace(f\".{TAR_FILE_EXTN}\", \"\"), self.cache_loc\n                )\n\n                # Delete the tar file\n                if os.path.exists(local_tar_file_path):\n                    os.remove(local_tar_file_path)\n            finally:\n                fcntl.flock(lock_file, fcntl.LOCK_UN)\n\n        return folder_idx\n\n    def _convert_caption_to_labels(self, captions_str: str) -> List[int]:\n        \"\"\"Converts the caption into multi-class labels.\n\n        The input caption is tokenized into words, and noun synsets are extracted for each word. Subsequently, the\n        parts of speech (POS) and offsets of the extracted noun synsets are compared with those in the vocabulary\n        to generate a list of multi-class labels.\n\n        Args:\n            captions_str: Input caption as a string.\n\n        Returns:\n            A list of integers, where each integer corresponds to the index of the matching synset in the vocabulary.\n            In case there are no matching synsets, an empty list is returned.\n        \"\"\"\n        captions_str = caption_preprocessing(captions_str)\n        # process caption and find synsets\n\n        tagged_words = nltk.pos_tag(nltk.word_tokenize(captions_str))\n        lemmatzr = WordNetLemmatizer()\n        labels = []\n        for word, pos in tagged_words:\n            # use lemmatizer to reduce text ambiguity.\n            # words like bicycle and bicycles are converted to bicycle\n            try:\n                word = lemmatzr.lemmatize(word)\n                noun_synset = wn.synset(f\"{word}.n.01\")\n            except Exception as e:\n                # No lemma 'is' with part of speech 'n', then nltk.corpus.reader.wordnet.WordNetError is raised.\n                # Skip such cases\n                continue\n\n            if not check_valid_noun_synset(noun_synset, word):\n                continue\n            noun_synset = extract_pos_offset_info_from_synset(noun_synset)\n            if noun_synset in self.vocab:\n                # add the indices of the labels\n                labels.append(self.vocab.index(noun_synset))\n        return labels\n\n    def _read_sample_with_wordnet_label_mining(\n        self, sample_index: int\n    ) -> Tuple[Image.Image, List[str]]:\n        \"\"\"Reads the sample with WordNet derived labels.\n\n        The function extracts the image and caption corresponding to input @sample_index. It then\n        converts the caption into multi-class labels.\n\n        Args:\n            sample_index: Sample index.\n\n        Returns:\n            Returns a tuple of image and mult-class labels for a given sample index.\n        \"\"\"\n\n        # Check if this folder exists. If not, then download the tar file and extract it.\n        folder_idx = self._download_and_extract_tar_file(sample_index=sample_index)\n\n        file_name = f\"{self.cache_loc}/{folder_idx}/{sample_index}.{SAMPLE_FILE_EXTN}\"\n        if not Path(file_name).exists():\n            # Each tar file is supposed to have certain number of samples, but\n            # it may not have all samples (because some samples may be corrupted and are filtered).\n            # Therefore, if file does not exist, we randomly sample the file from a folder and return its content.\n            # This helps in avoiding errors related to tensor mismatch shapes (usually arises when each GPU has different batch size)\n            # when gathering the image and text embeddings from all GPUs in contrastive loss.\n            files_in_folder = glob.glob(\n                f\"{self.cache_loc}/{folder_idx}/*.{SAMPLE_FILE_EXTN}\"\n            )\n            assert len(files_in_folder) > 0\n            file_name = random.choice(files_in_folder)\n\n        with open(file_name, \"rb\") as handle:\n            data = pickle.load(handle)\n        img_bytes = pybase64.b64decode(data[\"image\"], validate=True)\n        image = Image.open(io.BytesIO(img_bytes)).convert(\"RGBA\").convert(\"RGB\")\n        if \"texts\" in data:\n            caption_str = data[\"texts\"]\n        elif \"text\" in data:\n            caption_str = data[\"text\"]\n        else:\n            raise NotImplementedError(\"Text key not found.\")\n\n        labels = self._convert_caption_to_labels(captions_str=caption_str)\n        return image, labels\n\n    def _training_transforms(self, *args, **kwargs) -> BaseTransformation:\n        \"\"\"Image transformations to be applied on input image during training.\n\n        See 'BaseImageClassificationDataset' for the supported transformations for the classification task.\n        \"\"\"\n        return BaseImageClassificationDataset._training_transforms(\n            self, *args, **kwargs\n        )\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        \"\"\"Add dataset-specific arguments to the parser.\"\"\"\n        if cls == WordnetTaggedClassificationDataset:\n            group = parser.add_argument_group(title=cls.__name__)\n\n            group.add_argument(\n                \"--dataset.wordnet-tagged-classification.vocab-file\",\n                type=str,\n                default=None,\n                help=\"Location of vocab pickle file. Defaults to None.\",\n            )\n\n            group.add_argument(\n                \"--dataset.wordnet-tagged-classification.metadata-file\",\n                type=str,\n                default=None,\n                help=\"Metadata file containing information about img-text pairs. Defaults to None.\",\n            )\n\n            group.add_argument(\n                \"--dataset.wordnet-tagged-classification.vocab-size\",\n                type=int,\n                default=None,\n                help=\"Vocabulary threshold. Synsets in the ordered vocabulary dictionary beyond this threshold will not be used. Defaults to None (i.e., user needs to specify the value).\",\n            )\n        return parser\n\n    def _get_transfer_client(self, file_path: str) -> BaseClient:\n        \"\"\"Get transfer client for a given file path.\n\n        Args:\n            file_path: File path.\n\n        Returns:\n            An instance of BaseClient.\n\n        ...note:\n            Some of the clients are not pickle-able (e.g., S3). Therefore, this function should not be\n            called inside the '__init__' function.\n        \"\"\"\n        if self._transfer_client is None:\n            opts = self.opts\n            client_name = urlsplit(file_path).scheme.lower()\n\n            self._transfer_client = get_transfer_client(\n                opts,\n                transfer_client_name=client_name,\n                force_delete=False,\n                only_download_on_start_rank=False,\n                synchronize_distributed_ranks=False,\n                parallel_download=False,\n            )\n        return self._transfer_client\n\n    def __getitem__(\n        self, sample_size_and_index: Tuple[int, int, int]\n    ) -> Mapping[str, Any]:\n        \"\"\"Returns the sample corresponding to the input sample index.\n\n        Returned sample is transformed into the size specified by the input.\n\n        Args:\n            sample_size_and_index: Tuple of the form (crop_size_h, crop_size_w, sample_index).\n\n        Returns:\n            A dictionary with 'samples', 'targets', and 'sample_id' as keys corresponding to input,\n             label, and index of a sample, respectively.\n\n        Shapes:\n            The shape of values in output dictionary, output_data, are as follows:\n\n            output_data[\"samples\"]: Shape is [Channels, Height, Width]\n            output_data[\"targets\"]: Shape is [vocab_size]\n            output_data[\"sample_id\"]: Shape is [1]\n        \"\"\"\n\n        crop_size_h, crop_size_w, sample_index = sample_size_and_index\n        transform_fn = self.get_augmentation_transforms(size=(crop_size_h, crop_size_w))\n\n        image, labels = self._read_sample_with_wordnet_label_mining(sample_index)\n\n        # convert labels to one hot vector\n        targets = torch.zeros((self.vocab_size), dtype=torch.long)\n        if labels is not None and len(labels) > 0:\n            targets[labels] = 1\n\n        output_data = {\n            \"samples\": transform_fn({\"image\": image})[\"image\"],\n            \"targets\": targets,\n            \"sample_id\": sample_index,\n        }\n        return output_data\n\n    def __len__(self) -> int:\n        return self.total_tar_files * self.max_files_per_tar\n\n    @property\n    def cache_loc(self) -> str:\n        return DATA_CACHE_DIR\n\n    @property\n    def vocab_size(self):\n        return len(self.vocab)\n\n    @property\n    def total_tar_files(self) -> int:\n        \"\"\"Total number of tar files in the dataset.\"\"\"\n        metadata = self._metadata()\n        return metadata[\"total_tar_files\"]\n\n    @property\n    def max_files_per_tar(self) -> int:\n        \"\"\"Maximum number of files inside each tar file.\"\"\"\n        metadata = self._metadata()\n        return metadata[\"max_files_per_tar\"]\n\n    def extra_repr(self) -> str:\n        return super().extra_repr() + (\n            f\"\\n\\ttotal_tar_files={self.total_tar_files}\"\n            f\"\\n\\tmax_files_per_tar={self.max_files_per_tar}\"\n            f\"\\n\\tnum_synsets={self.vocab_size}\"\n        )\n"
  },
  {
    "path": "corenet/data/datasets/dataset_base.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom __future__ import annotations\n\nimport argparse\nfrom abc import ABC\nfrom functools import cached_property\nfrom typing import Any, Dict, Optional, TypedDict\n\nimport torch\nfrom PIL import Image\nfrom torch.utils import data\n\nfrom corenet.data.transforms import BaseTransformation\nfrom corenet.data.video_reader import get_video_reader\nfrom corenet.utils import logger\nfrom corenet.utils.ddp_utils import (\n    get_node_rank,\n    get_world_size,\n    is_master,\n    is_start_rank_node,\n)\n\n\nclass BaseDataset(data.Dataset, ABC):\n    \"\"\"Base class for creating datasets. Sub-classes must implement __getitem__,\n    _training_transforms, and _validation_transforms functions.\n\n    Args:\n        opts: Command-line arguments\n        is_training: Training mode or not. Defaults to True.\n        is_evaluation: Evaluation mode or not. Defaults to False.\n\n    ...note::\n        `is_training` is used to indicate whether the dataset is used for training or\n        validation. On the other hand, `is_evaluation` mode is used to indicate the\n        dataset is used for testing.\n\n        Theoretically, `is_training=False` and `is_evaluation=True` should be the same.\n        However, for some datasets (especially segmentation), validation dataset\n        transforms are different from test transforms because each image has different\n        resolution, making it difficult to construct batches. Therefore, we treat these\n        two modes different.\n\n        For datasets, where validation and testing transforms are the same, we set\n        evaluation transforms the same as the validation transforms.\n    \"\"\"\n\n    def __init__(\n        self,\n        opts: argparse.Namespace,\n        is_training: bool = True,\n        is_evaluation: bool = False,\n        *args,\n        **kwargs,\n    ) -> None:\n        # Do not remove the default value here.\n        if getattr(opts, \"dataset.trove.enable\", False):\n            opts = self.load_from_server(\n                opts=opts, is_training=is_training, is_evaluation=is_evaluation\n            )\n\n        assert (\n            not is_training or not is_evaluation\n        ), \"is_training and is_evaluation cannot be both True\"\n        if is_training:\n            self.mode = \"train\"\n        elif is_evaluation:\n            self.mode = \"test\"\n        else:\n            self.mode = \"val\"\n\n        self.root = getattr(opts, f\"dataset.root_{self.mode}\")\n        if self.mode == \"test\" and not getattr(opts, f\"dataset.root_test\"):\n            # Only use root_test when applicable. Most datasets only define root_val.\n            self.root = getattr(opts, f\"dataset.root_val\")\n\n        self.is_training = is_training\n        self.is_evaluation = is_evaluation\n        self.opts = opts\n\n        self.device = getattr(self.opts, \"dev.device\", torch.device(\"cpu\"))\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        \"\"\"Add dataset-specific arguments\"\"\"\n        if cls != BaseDataset:\n            # Don't re-register arguments in subclasses that don't override\n            # `add_arguments()`.\n            return parser\n\n        group = parser.add_argument_group(cls.__name__)\n        group.add_argument(\n            \"--dataset.root-train\",\n            type=str,\n            default=\"\",\n            help=\"Root location of train dataset\",\n        )\n        group.add_argument(\n            \"--dataset.root-val\",\n            type=str,\n            default=\"\",\n            help=\"Root location of valid dataset\",\n        )\n        group.add_argument(\n            \"--dataset.root-test\",\n            type=str,\n            default=\"\",\n            help=\"Root location of test dataset\",\n        )\n        group.add_argument(\n            \"--dataset.disable-val\",\n            action=\"store_true\",\n            default=False,\n            help=\"Disable validation during training\",\n        )\n\n        group.add_argument(\n            \"--dataset.name\",\n            type=str,\n            default=None,\n            help=\"Dataset name (e.g., imagenet). Defaults to None.\",\n        )\n        group.add_argument(\n            \"--dataset.category\",\n            type=str,\n            default=None,\n            help=\"Dataset category (e.g., segmentation, classification). Defaults to None.\",\n        )\n        group.add_argument(\n            \"--dataset.percentage-of-samples\",\n            type=float,\n            default=100.0,\n            help=\"Percentage of samples to use from the dataset.\",\n        )\n        group.add_argument(\n            \"--dataset.sample-selection-random-seed\",\n            type=int,\n            default=0,\n            help=\"Random seed for selecting a subset of samples to use from the dataset.\",\n        )\n        group.add_argument(\n            \"--dataset.train-batch-size0\",\n            default=128,\n            type=int,\n            help=\"Training batch size on GPU-0. Defaults to 128. \"\n            \"Note that we scale it depending on total GPUs available for training. For\"\n            \" example, if 2 GPUs are available and value of `dataset.train_batch_size0`\"\n            \" is 128, then effective batch size will be 256.\",\n        )\n        group.add_argument(\n            \"--dataset.val-batch-size0\",\n            default=1,\n            type=int,\n            help=\"Batch size on GPU-0 for validation. Defaults to 1. \"\n            \"Note that we scale it depending on total GPUs available for training. For\"\n            \" example, if 2 GPUs are available and value of `dataset.val_batch_size0`\"\n            \" is 128, then effective batch size will be 256.\",\n        )\n        group.add_argument(\n            \"--dataset.eval-batch-size0\",\n            default=1,\n            type=int,\n            help=\"Batch size on GPU-0 for testing or evaluation. Defaults to 1.\"\n            \"Note that we scale it automatically depending on total number of GPUs\"\n            \" available. We recommend to run evaluation on a single GPU machine.\",\n        )\n        group.add_argument(\n            \"--dataset.workers\",\n            default=-1,\n            type=int,\n            help=\"Number of data workers. Defaults to -1.\"\n            \"When number of workers are specified as -1, then total number of workers\"\n            \" is equal to the number of available CPUs.\",\n        )\n\n        group.add_argument(\n            \"--dataset.persistent-workers\",\n            action=\"store_true\",\n            default=False,\n            help=\"Enabling this argument allows us to use same workers for loading data\"\n            \" throughout the training. Defaults to False.\",\n        )\n        group.add_argument(\n            \"--dataset.pin-memory\",\n            action=\"store_true\",\n            default=False,\n            help=\"Enabling this allows us to use pin memory option in data loader. \"\n            \"Defaults to False.\",\n        )\n        group.add_argument(\n            \"--dataset.prefetch-factor\",\n            type=int,\n            default=2,\n            help=\"Number of samples loaded in advance by each data worker. Defaults to 2.\",\n        )\n\n        group.add_argument(\n            \"--dataset.padding-index\",\n            type=int,\n            default=None,\n            help=\"Padding index for text vocabulary. Defaults to None.\",\n        )\n\n        group.add_argument(\n            \"--dataset.text-vocab-size\",\n            type=int,\n            default=-1,\n            help=\"Text vocabulary size. Defaults to -1.\",\n        )\n        group.add_argument(\n            \"--dataset.text-context-length\",\n            type=int,\n            default=None,\n            help=\"Context length for text encoder. Defaults to None.\",\n        )\n\n        return parser\n\n    @staticmethod\n    def load_from_server(\n        opts: argparse.Namespace, is_training: bool, is_evaluation: bool\n    ) -> Optional[argparse.Namespace]:\n        \"\"\"Helper function to load dataset from server.\"\"\"\n        try:\n            from corenet.internal.utils.server_utils import load_from_data_server\n\n            opts = load_from_data_server(\n                opts=opts, is_training=is_training, is_evaluation=is_evaluation\n            )\n            return opts\n\n        except ImportError as e:\n            import traceback\n\n            traceback.print_exc()\n            logger.error(\n                \"Unable to load data. Please load data manually. Error: {}\".format(e)\n            )\n\n    def _training_transforms(self, *args, **kwargs) -> BaseTransformation:\n        \"\"\"Data transforms for training\"\"\"\n        raise NotImplementedError\n\n    def _validation_transforms(self, *args, **kwargs) -> BaseTransformation:\n        \"\"\"Data transforms for validation\"\"\"\n        raise NotImplementedError\n\n    def _evaluation_transforms(self, *args, **kwargs) -> BaseTransformation:\n        \"\"\"Data transforms for evaluation/testing\"\"\"\n        return self._validation_transforms(*args, **kwargs)\n\n    def get_augmentation_transforms(self, *args, **kwargs) -> BaseTransformation:\n        \"\"\"Helper function to get data transforms depending on the\n        mode (training, evaluation, or validation)\"\"\"\n        if self.is_training:\n            transform = self._training_transforms(*args, **kwargs)\n        elif self.is_evaluation:\n            transform = self._evaluation_transforms(*args, **kwargs)\n        else:\n            transform = self._validation_transforms(*args, **kwargs)\n        return transform\n\n    def share_dataset_arguments(self) -> Dict[str, Any]:\n        \"\"\"Function that can be used by sub-classes to share dataset-specific options.\n        It returns a mapping. An example is {\"model.classification.n_classes\", 1000}\n\n        By default, we return an empty dictionary\n        \"\"\"\n        return {}\n\n    def __len__(self) -> int:\n        raise NotImplementedError\n\n    def __getitem__(self, sample_size_and_index: Any) -> Any:\n        \"\"\"Returns the sample corresponding to the input sample index.\"\"\"\n        raise NotImplementedError\n\n    def extra_repr(self) -> str:\n        r\"\"\"Extra information to be represented in __repr__. Each line in the output\n        string should be prefixed with ``\\t``.\n        \"\"\"\n\n        return f\"\\n\\tnum_samples={len(self)}\"\n\n    def __repr__(self) -> str:\n        return (\n            f\"{self.__class__.__name__}(\"\n            f\"\\n\\troot={self.root} \"\n            f\"\\n\\tis_training={self.is_training} \"\n            f\"{self.extra_repr()}\"\n            f\"\\n)\"\n        )\n\n    def get_item_metadata(self, item_idx: int) -> Dict:\n        \"\"\"Returns the metadata for given @item_idx. This method could be used by\n        samplers for sampling dynamic batches based on the metadata of the items.\n\n        Args:\n            item_idx: The index of sample to provide metadata for. The indexing\n                should be aligned with how ``self.__getitem__(item_idx)`` sequences the\n                dataset items.\n\n        Returns: A dict containing the metadata. Each sampler may require a specific\n            schema to be returned by this function.\n        \"\"\"\n        raise NotImplementedError()\n\n    @property\n    def worker_id(self) -> int:\n        \"\"\"Returns the current worker id when loading data with multiple workers in dataloader.\n\n        ...note:\n            When 'get_worker_info' is None, '0' is returned to indicate it's a single process.\n\n        ...warning:\n            This function should be called after dataset is wrapped inside dataloader.\n        \"\"\"\n        worker_info = torch.utils.data.get_worker_info()\n        if worker_info is not None:\n            return worker_info.id\n        return 0\n\n    @property\n    def num_workers(self) -> int:\n        \"\"\"Returns the number of workers used to load data with multi-processing in dataloader.\n\n        ...note:\n            When 'get_worker_info' is None, '1' is returned to indicate it's a single process.\n\n        ...warning:\n            This function should be called after dataset is wrapped inside dataloader.\n        \"\"\"\n        worker_info = torch.utils.data.get_worker_info()\n        if worker_info is not None:\n            return worker_info.num_workers\n        return 1\n\n    @property\n    def is_master_node(self) -> bool:\n        \"\"\"Check if the current node is the master node in the distributed system.\n\n        Returns:\n            True if the current node is the master node, False otherwise.\n\n        ...warning:\n            This function should be used with distributed training.\n        \"\"\"\n        return is_master(self.opts)\n\n    @property\n    def is_start_rank_node(self) -> bool:\n        \"\"\"Check if the GPU in a node is the first GPU or not during distributed training.\n\n        Returns:\n            True if the current GPU is the first GPU on each node. False otherwise.\n\n        ...warning:\n            This function should be used with distributed training.\n        \"\"\"\n        return is_start_rank_node(self.opts)\n\n    @property\n    def world_size(self) -> int:\n        \"\"\"Returns the number of processes in the current process group in distributed training.\n\n        ...warning:\n            This function should be used with distributed training.\n        \"\"\"\n        return max(1, getattr(self.opts, \"ddp.world_size\"))\n\n    @property\n    def rank(self) -> int:\n        \"\"\"Returns the rank of the current process in distributed training.\n\n        ...note:\n            Rank is a unique identifier assigned to each process within a distributed\n            process group, and are always consecutive integers ranging from 0 to 'world_size'.\n\n        ...warning:\n            This function should be used with distributed training.\n        \"\"\"\n        return max(0, getattr(self.opts, \"ddp.rank\"))\n\n\nclass BaseImageDataset(BaseDataset, ABC):\n    \"\"\"Base Dataset class for Image datasets.\"\"\"\n\n    @staticmethod\n    def read_image_pil(path: str) -> Optional[Image.Image]:\n        \"\"\"Reads a PIL image.\n\n        Args:\n            path: Path of image file.\n\n        Returns:\n            If there are no exceptions (e.g., because of corrupted images), PIL Image is\n            returned. Otherwise, None.\n        \"\"\"\n        try:\n            return Image.open(path).convert(\"RGB\")\n        except:\n            # for any runtime exception while reading an image (typically arises from\n            # corrupted images), we return None.\n            return None\n\n    def extra_repr(self) -> str:\n        r\"\"\"Extra information to be represented in __repr__. Each line in the output\n        string should be prefixed with ``\\t``.\n        \"\"\"\n        from corenet.utils.tensor_utils import image_size_from_opts\n\n        return (\n            super().extra_repr()\n            + f\"\\n\\ttransforms={self.get_augmentation_transforms(size=image_size_from_opts(self.opts))}\"\n        )\n\n\nclass BaseVideoDataset(BaseDataset, ABC):\n    \"\"\"Base Dataset class for video datasets.\n\n    Args:\n        opts: Command-line arguments\n    \"\"\"\n\n    def __init__(\n        self,\n        opts: argparse.Namespace,\n        *args,\n        **kwargs,\n    ) -> None:\n        super().__init__(opts, *args, **kwargs)\n\n        self.video_reader = get_video_reader(opts=opts, is_training=self.is_training)\n\n        self._deprecated_clips_per_video = getattr(opts, \"dataset.clips_per_video\")\n        self._deprecated_n_frames_per_clip = getattr(opts, \"dataset.n_frames_per_clip\")\n\n    @property\n    def clips_per_video(self) -> int:\n        logger.warning(\n            DeprecationWarning(\n                \"The --dataset.clips-per-video argument is deprecated. Please use\"\n                \" VideoClipBatchSampler and its corresponding arguments.\"\n            )\n        )\n        return self._deprecated_clips_per_video\n\n    @clips_per_video.setter\n    def _deprecated_set_clips_per_video(self, value: int) -> None:\n        self._deprecated_clips_per_video = value\n\n    @property\n    def n_frames_per_clip(self) -> int:\n        logger.warning(\n            DeprecationWarning(\n                \"The --dataset.n-frames-per-clip argument is deprecated. Please use\"\n                \" VideoClipBatchSampler and its corresponding arguments.\"\n            )\n        )\n        return self._deprecated_n_frames_per_clip\n\n    @n_frames_per_clip.setter\n    def _deprecated_set_n_frames_per_clip(self, value: int) -> None:\n        self._deprecated_n_frames_per_clip = value\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        if cls != BaseVideoDataset:\n            # Don't re-register arguments in subclasses that don't override `add_arguments()`.\n            return parser\n\n        group = parser.add_argument_group(cls.__name__)\n        group.add_argument(\n            \"--dataset.clips-per-video\",\n            type=int,\n            default=1,\n            help=\"The number of clips that each video file gets split into. Default\"\n            \" value is 1, i.e., we don't split videos into multiple clips.\",\n        )\n        group.add_argument(\n            \"--dataset.n-frames-per-clip\",\n            type=int,\n            default=64,\n            help=\"The number of frames to read from the video file into each clip.\"\n            \" Defaults to 64.\",\n        )\n\n        return parser\n\n    def get_item_metadata(self, item_idx: int) -> VideoMetadataDict:\n        \"\"\"Returns the metadata for given @item_idx. This method is used by\n        VideoClipSampler for sampling dynamic clips based on the duration of the items.\n\n        Subclasses should override this method if they use VideoClipSampler.\n\n        Args:\n            item_idx: The index of video file to provide metadata. The indexing\n                should be aligned with how ``self.__getitem__(item_idx)`` sequences the\n                dataset items.\n\n        Returns: A dict containing the metadata. Please see @VideoMetadataDict\n        documentation.\n        \"\"\"\n        raise NotImplementedError()\n\n    def get_item_local_path(self, item_idx: int) -> str:\n        \"\"\"Returns the local video path for given @item_idx. Implementing this method is\n        optional, but having a unified interface reduces the cost of adding features.\n\n        Args:\n            item_idx: The index of video file to provide metadata. The indexing\n                should be aligned with how ``self.__getitem__(item_idx)`` sequences the\n                dataset items.\n\n        Returns:\n            str: The local path (downloaded if required) to the video file.\n        \"\"\"\n        raise NotImplementedError()\n\n\n# The ``total=False`` annotation marks all dict entries as NotRequired.\nclass VideoMetadataDict(TypedDict, total=False):\n    \"\"\"\n    This class is an alias of Dict, in addition to optional standard key names and\n    value types. The fields will be required or optional depending on the Sampler.\n    \"\"\"\n\n    video_fps: float  # (Required for VideoClipBatchSampler)\n    total_video_frames: int  # (Required for VideoClipBatchSampler)\n    video_duration: (\n        float  # video_fps * total_video_frames  (Required for VideoClipBatchSampler)\n    )\n    audio_fps: float\n\n\nclass BaseIterableDataset(BaseDataset, data.IterableDataset):\n    \"\"\"Base class for Iterable datasets.\"\"\"\n\n    pass\n"
  },
  {
    "path": "corenet/data/datasets/detection/__init__.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n"
  },
  {
    "path": "corenet/data/datasets/detection/base_detection.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\n\nfrom corenet.data.datasets import BaseImageDataset\n\n\nclass BaseDetectionDataset(BaseImageDataset):\n    \"\"\"Base Dataset class for object detection datasets.\"\"\"\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        if cls != BaseDetectionDataset:\n            # Don't re-register arguments in subclasses that don't override `add_arguments()`.\n            return parser\n\n        group = parser.add_argument_group(cls.__name__)\n\n        group.add_argument(\n            \"--evaluation.detection.save-overlay-boxes\",\n            action=\"store_true\",\n            help=\"enable this flag to visualize predicted masks on top of input image\",\n        )\n        group.add_argument(\n            \"--evaluation.detection.mode\",\n            type=str,\n            default=\"validation_set\",\n            required=False,\n            choices=[\"single_image\", \"image_folder\", \"validation_set\"],\n            help=\"Contribution of mask when overlaying on top of RGB image.\",\n        )\n        group.add_argument(\n            \"--evaluation.detection.path\",\n            type=str,\n            default=None,\n            help=\"Path of the image or image folder (only required for single_image and image_folder modes).\",\n        )\n        group.add_argument(\n            \"--evaluation.detection.num-classes\",\n            type=int,\n            default=None,\n            help=\"Number of segmentation classes used during training.\",\n        )\n        group.add_argument(\n            \"--evaluation.detection.resize-input-images\",\n            action=\"store_true\",\n            default=False,\n            help=\"Resize input images to fixed size during detection evaluation.\",\n        )\n\n        return parser\n"
  },
  {
    "path": "corenet/data/datasets/detection/coco_base.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nimport os\nfrom typing import Any, Dict, List, Mapping, Optional, Tuple, Union\n\nimport numpy as np\nimport torch\nfrom pycocotools import mask as coco_mask\nfrom pycocotools.coco import COCO\nfrom torch import Tensor\n\nfrom corenet.data.datasets import DATASET_REGISTRY\nfrom corenet.data.datasets.detection.base_detection import BaseDetectionDataset\nfrom corenet.data.transforms import image_pil as T\nfrom corenet.data.transforms.common import Compose\nfrom corenet.utils import logger\n\n\n@DATASET_REGISTRY.register(name=\"coco\", type=\"detection\")\nclass COCODetection(BaseDetectionDataset):\n    \"\"\"Base class for the MS COCO Object Detection Dataset. Sub-classes should implement\n    training and validation transform functions.\n\n    Args:\n        opts: command-line arguments\n\n    .. note::\n        This class implements basic functions (e.g., reading image and annotations), and does not implement\n        training/validation transforms. Detector specific sub-classes should extend this class and implement those\n        methods. See `coco_ssd.py` as an example for SSD.\n    \"\"\"\n\n    def __init__(\n        self,\n        opts,\n        *args,\n        **kwargs,\n    ) -> None:\n        super().__init__(opts=opts, *args, **kwargs)\n\n        split = \"train\" if self.is_training else \"val\"\n        year = 2017\n        ann_file = os.path.join(\n            self.root, \"annotations/instances_{}{}.json\".format(split, year)\n        )\n\n        # disable printing, so that pycocotools print statements are not printed\n        logger.disable_printing()\n\n        self.coco = COCO(ann_file)\n        self.img_dir = os.path.join(self.root, \"images/{}{}\".format(split, year))\n        self.ids = (\n            list(self.coco.imgToAnns.keys())\n            if self.is_training\n            else list(self.coco.imgs.keys())\n        )\n\n        coco_categories = sorted(self.coco.getCatIds())\n        background_idx = 0 if getattr(opts, \"dataset.detection.no_background_id\") else 1\n        self.coco_id_to_contiguous_id = {\n            coco_id: i + background_idx for i, coco_id in enumerate(coco_categories)\n        }\n        self.contiguous_id_to_coco_id = {\n            v: k for k, v in self.coco_id_to_contiguous_id.items()\n        }\n        self.num_classes = len(self.contiguous_id_to_coco_id.keys()) + background_idx\n\n        # enable printing\n        logger.enable_printing()\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        if cls != COCODetection:\n            # Don't re-register arguments in subclasses that don't override `add_arguments()`.\n            return parser\n        group = parser.add_argument_group(title=cls.__name__)\n        group.add_argument(\n            \"--dataset.detection.no-background-id\",\n            action=\"store_true\",\n            default=False,\n            help=\"Do not include background id in detection class labels. Defaults to False.\",\n        )\n        return parser\n\n    def _evaluation_transforms(\n        self, size: tuple, *args, **kwargs\n    ) -> T.BaseTransformation:\n        \"\"\"Evaluation or Inference transforms (Resize (Optional) --> Tensor).\n\n        .. note::\n            Resizing the input to the same resolution as the detector's input is not enabled by default.\n            It can be enabled by passing **--evaluation.detection.resize-input-images** flag.\n\n        \"\"\"\n        aug_list = []\n        if getattr(self.opts, \"evaluation.detection.resize_input_images\"):\n            aug_list.append(T.Resize(opts=self.opts, img_size=size))\n\n        aug_list.append(T.ToTensor(opts=self.opts))\n        return Compose(opts=self.opts, img_transforms=aug_list)\n\n    def __getitem__(\n        self, sample_size_and_index: Tuple[int, int, int], *args, **kwargs\n    ) -> Mapping[str, Union[Tensor, Mapping[str, Tensor]]]:\n        \"\"\"Returns the sample corresponding to the input sample index. Returned sample is transformed\n        into the size specified by the input.\n\n        Args:\n            sample_size_and_index: Tuple of the form (crop_size_h, crop_size_w, sample_index)\n\n        Returns:\n            A dictionary with `samples` and `targets` as keys corresponding to input and labels of\n            a sample, respectively.\n\n        Shapes:\n            The shape of values in output dictionary, output_data, are as follows:\n\n            output_data[\"samples\"][\"image\"]: Shape is [Channels, Height, Width]\n            output_data[\"targets\"][\"box_labels\"]: Shape is [Num of boxes]\n            output_data[\"targets\"][\"box_coordinates\"]: Shape is [Num of boxes, 4]\n            output_data[\"targets\"][\"image_id\"]: Shape is [1]\n            output_data[\"targets\"][\"image_width\"]: Shape is [1]\n            output_data[\"targets\"][\"image_height\"]: Shape is [1]\n        \"\"\"\n\n        crop_size_h, crop_size_w, img_index = sample_size_and_index\n\n        transform_fn = self.get_augmentation_transforms(size=(crop_size_h, crop_size_w))\n\n        image_id = self.ids[img_index]\n\n        image, img_name = self.get_image(image_id=image_id)\n        im_width, im_height = image.size\n\n        boxes, labels, mask = self.get_boxes_and_labels(\n            image_id=image_id,\n            image_width=im_width,\n            image_height=im_height,\n            include_masks=True,\n        )\n\n        data = {\n            \"image\": image,\n            \"box_labels\": labels,\n            \"box_coordinates\": boxes,\n            \"mask\": mask,\n        }\n\n        if transform_fn is not None:\n            data = transform_fn(data)\n\n        output_data = {\n            \"samples\": {\n                \"image\": data[\"image\"],\n            },\n            \"targets\": {\n                \"box_labels\": data[\"box_labels\"],\n                \"box_coordinates\": data[\"box_coordinates\"],\n                \"mask\": data[\"mask\"],\n                \"image_id\": torch.tensor(image_id),\n                \"image_width\": torch.tensor(im_width),\n                \"image_height\": torch.tensor(im_height),\n            },\n        }\n\n        return output_data\n\n    def __len__(self):\n        return len(self.ids)\n\n    def get_boxes_and_labels(\n        self,\n        image_id: int,\n        image_width: int,\n        image_height: int,\n        *args,\n        include_masks=False,\n        **kwargs,\n    ) -> Tuple[np.ndarray, np.ndarray, Optional[np.ndarray]]:\n        \"\"\"Get the boxes and label information for a given image_id\n\n        Args:\n            image_id: Image ID\n            image_width: Width of the image\n            image_height: Height of the image\n            include_masks: Return instance masks or not\n\n        Returns:\n            A tuple of length 3:\n                * Numpy array containing bounding box information in xyxy format.\n                    The shape of array is [Num_of_boxes, 4].\n                * Numpy array containing labels for each of the box. The shape of array is [Num_of_boxes]\n                * When include_masks is enabled, a numpy array of instance masks is returned. The shape of the\n                    array is [Num_of_boxes, image_height, image_width]\n\n        \"\"\"\n        ann_ids = self.coco.getAnnIds(imgIds=image_id)\n        ann = self.coco.loadAnns(ann_ids)\n\n        # filter crowd annotations\n        ann = [obj for obj in ann if obj[\"iscrowd\"] == 0]\n        boxes = np.array(\n            [self._xywh2xyxy(obj[\"bbox\"], image_width, image_height) for obj in ann],\n            np.float32,\n        ).reshape((-1, 4))\n        labels = np.array(\n            [self.coco_id_to_contiguous_id[obj[\"category_id\"]] for obj in ann],\n            np.int64,\n        ).reshape((-1,))\n        # remove invalid boxes\n        keep = (boxes[:, 3] > boxes[:, 1]) & (boxes[:, 2] > boxes[:, 0])\n        boxes = boxes[keep]\n        labels = labels[keep]\n\n        masks = None\n        if include_masks:\n            masks = []\n            for obj in ann:\n                rle = coco_mask.frPyObjects(\n                    obj[\"segmentation\"], image_height, image_width\n                )\n                m = coco_mask.decode(rle)\n                if len(m.shape) < 3:\n                    mask = m.astype(np.uint8)\n                else:\n                    mask = (np.sum(m, axis=2) > 0).astype(np.uint8)\n                masks.append(mask)\n\n            if len(masks) > 0:\n                masks = np.stack(masks, axis=0)\n            else:\n                masks = np.zeros(shape=(0, image_height, image_width), dtype=np.uint8)\n            masks = masks.astype(np.uint8)\n            masks = torch.from_numpy(masks)\n            masks = masks[keep]\n            assert len(boxes) == len(labels) == len(masks)\n            return boxes, labels, masks\n        else:\n            return boxes, labels, None\n\n    def _xywh2xyxy(\n        self, box: List[int], image_width: int, image_height: int\n    ) -> List[int]:\n        \"\"\"Convert boxes from xywh format to xyxy format\"\"\"\n        x1, y1, w, h = box\n        return [\n            max(0, x1),\n            max(0, y1),\n            min(x1 + w, image_width),\n            min(y1 + h, image_height),\n        ]\n\n    def get_image(self, image_id: int) -> Tuple:\n        \"\"\"Return the PIL image for a given image id\"\"\"\n        file_name = self.coco.loadImgs(image_id)[0][\"file_name\"]\n        image_file = os.path.join(self.img_dir, file_name)\n        image = self.read_image_pil(image_file)\n        return image, file_name\n\n    def extra_repr(self) -> str:\n        return super().extra_repr() + f\"\\n\\t num_classes={self.num_classes}\"\n\n    @staticmethod\n    def class_names() -> List[str]:\n        \"\"\"Name of the classes in the COCO dataset\"\"\"\n        return [\n            \"background\",\n            \"person\",\n            \"bicycle\",\n            \"car\",\n            \"motorcycle\",\n            \"airplane\",\n            \"bus\",\n            \"train\",\n            \"truck\",\n            \"boat\",\n            \"traffic light\",\n            \"fire hydrant\",\n            \"stop sign\",\n            \"parking meter\",\n            \"bench\",\n            \"bird\",\n            \"cat\",\n            \"dog\",\n            \"horse\",\n            \"sheep\",\n            \"cow\",\n            \"elephant\",\n            \"bear\",\n            \"zebra\",\n            \"giraffe\",\n            \"backpack\",\n            \"umbrella\",\n            \"handbag\",\n            \"tie\",\n            \"suitcase\",\n            \"frisbee\",\n            \"skis\",\n            \"snowboard\",\n            \"sports ball\",\n            \"kite\",\n            \"baseball bat\",\n            \"baseball glove\",\n            \"skateboard\",\n            \"surfboard\",\n            \"tennis racket\",\n            \"bottle\",\n            \"wine glass\",\n            \"cup\",\n            \"fork\",\n            \"knife\",\n            \"spoon\",\n            \"bowl\",\n            \"banana\",\n            \"apple\",\n            \"sandwich\",\n            \"orange\",\n            \"broccoli\",\n            \"carrot\",\n            \"hot dog\",\n            \"pizza\",\n            \"donut\",\n            \"cake\",\n            \"chair\",\n            \"couch\",\n            \"potted plant\",\n            \"bed\",\n            \"dining table\",\n            \"toilet\",\n            \"tv\",\n            \"laptop\",\n            \"mouse\",\n            \"remote\",\n            \"keyboard\",\n            \"cell phone\",\n            \"microwave\",\n            \"oven\",\n            \"toaster\",\n            \"sink\",\n            \"refrigerator\",\n            \"book\",\n            \"clock\",\n            \"vase\",\n            \"scissors\",\n            \"teddy bear\",\n            \"hair drier\",\n            \"toothbrush\",\n        ]\n"
  },
  {
    "path": "corenet/data/datasets/detection/coco_mask_rcnn.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nfrom typing import List, Mapping, Tuple, Union\n\nimport torch\nfrom torch import Tensor\n\nfrom corenet.data.collate_fns import COLLATE_FN_REGISTRY\nfrom corenet.data.datasets import DATASET_REGISTRY\nfrom corenet.data.datasets.detection.coco_base import COCODetection\nfrom corenet.data.transforms import image_pil as T\nfrom corenet.data.transforms.common import Compose\n\n\n@DATASET_REGISTRY.register(name=\"coco_mask_rcnn\", type=\"detection\")\nclass COCODetectionMaskRCNN(COCODetection):\n    \"\"\"Dataset class for the MS COCO Object Detection using Mask RCNN .\"\"\"\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        if cls != COCODetectionMaskRCNN:\n            # Don't re-register arguments in subclasses that don't override `add_arguments()`.\n            return parser\n\n        group = parser.add_argument_group(title=cls.__name__)\n        group.add_argument(\n            \"--dataset.detection.coco-mask-rcnn.use-lsj-aug\",\n            action=\"store_true\",\n            help=\"Use large scale jitter augmentation for training Mask RCNN model\",\n        )\n\n        return parser\n\n    def _training_transforms(\n        self, size: Tuple[int, int], *args, **kwargs\n    ) -> T.BaseTransformation:\n        \"\"\"Data augmentation during training.\n\n        Default order of transformation is Resize, RandomHorizontalFlip, ToTensor.\n        When large-scale jittering is enabled, Resize is replaced with ScaleJitter and FixedSizeCrop\n\n        Args:\n            size: Size for resizing the input image. Expected to be a tuple (height, width)\n\n        Returns:\n            An instance of `corenet.data.transforms.image_pil.BaseTransformation.`\n        \"\"\"\n\n        if getattr(self.opts, \"dataset.detection.coco_mask_rcnn.use_lsj_aug\"):\n            # Apply large scale jittering, following https://arxiv.org/abs/2012.07177\n            aug_list = [\n                T.ScaleJitter(opts=self.opts),\n                T.FixedSizeCrop(opts=self.opts),\n                T.RandomHorizontalFlip(opts=self.opts),\n                T.ToTensor(opts=self.opts),\n            ]\n        else:\n            # standard augmentation for Mask-RCNN\n            aug_list = [\n                T.Resize(opts=self.opts, img_size=size),\n                T.RandomHorizontalFlip(opts=self.opts),\n                T.ToTensor(opts=self.opts),\n            ]\n\n        return Compose(opts=self.opts, img_transforms=aug_list)\n\n    def _validation_transforms(\n        self, size: Tuple[int, int], *args, **kwargs\n    ) -> T.BaseTransformation:\n        \"\"\"Data augmentation during validation or evaluation.\n\n        Default order of transformation is Resize, ToTensor.\n\n        Args:\n            size: Size for resizing the input image. Expected to be a tuple (height, width)\n\n        Returns:\n            An instance of `corenet.data.transforms.image_pil.BaseTransformation.`\n        \"\"\"\n        aug_list = [\n            T.Resize(opts=self.opts),\n            T.ToTensor(opts=self.opts),\n        ]\n        return Compose(opts=self.opts, img_transforms=aug_list)\n\n    def __getitem__(\n        self, sample_size_and_index: Tuple[int, int, int], *args, **kwargs\n    ) -> Mapping[str, Union[Tensor, Mapping[str, Tensor]]]:\n        \"\"\"Returns the sample corresponding to the input sample index. Returned sample is transformed\n        into the size specified by the input.\n\n        Args:\n            sample_size_and_index: Tuple of the form (crop_size_h, crop_size_w, sample_index)\n\n        Returns:\n            A dictionary with `samples` and `targets` as keys corresponding to input and labels of\n            a sample, respectively.\n\n        Shapes:\n            The shape of values in output dictionary, output_data, are as follows:\n\n            output_data[\"samples\"][\"image\"]: Shape is [Channels, Height, Width]\n            output_data[\"samples\"][\"label][\"labels\"]: Shape is [Num of boxes]\n            output_data[\"samples\"][\"label\"][\"boxes\"]: Shape is [Num of boxes, 4]\n            output_data[\"samples\"][\"label\"][\"masks\"]: Shape is [Num of boxes, Height, Width]\n            output_data[\"targets\"][\"image_id\"]: Shape is [1]\n            output_data[\"targets\"][\"image_width\"]: Shape is [1]\n            output_data[\"targets\"][\"image_height\"]: Shape is [1]\n        \"\"\"\n        crop_size_h, crop_size_w, img_index = sample_size_and_index\n\n        transform_fn = self.get_augmentation_transforms(size=(crop_size_h, crop_size_w))\n\n        image_id = self.ids[img_index]\n\n        image, img_name = self.get_image(image_id=image_id)\n        im_width, im_height = image.size\n\n        boxes, labels, mask = self.get_boxes_and_labels(\n            image_id=image_id,\n            image_width=im_width,\n            image_height=im_height,\n            include_masks=True,\n        )\n\n        data = {\n            \"image\": image,\n            \"box_labels\": labels,\n            \"box_coordinates\": boxes,\n            \"mask\": mask,\n        }\n\n        if transform_fn is not None:\n            data = transform_fn(data)\n\n        output_data = {\n            \"samples\": {\n                \"image\": data[\"image\"],\n                # PyTorch Mask RCNN implementation expect labels as an input. Because we do not want to change\n                # the training infrastructure, we pass labels as part of image key and\n                # handle it in the model.\n                \"label\": {\n                    \"labels\": data[\"box_labels\"],\n                    \"boxes\": data[\"box_coordinates\"],\n                    \"masks\": data[\"mask\"],\n                },\n            },\n            \"targets\": {\n                \"image_id\": torch.tensor(image_id),\n                \"image_width\": torch.tensor(im_width),\n                \"image_height\": torch.tensor(im_height),\n            },\n        }\n\n        return output_data\n\n\n@COLLATE_FN_REGISTRY.register(name=\"coco_mask_rcnn_collate_fn\")\ndef coco_mask_rcnn_collate_fn(\n    batch: List[Mapping[str, Union[Tensor, Mapping[str, Tensor]]]],\n    opts: argparse.Namespace,\n    *args,\n    **kwargs\n) -> Mapping[str, Union[List[Tensor], Mapping[str, List[Tensor]]]]:\n    \"\"\"Combines a list of dictionaries into a single dictionary by concatenating matching fields.\n\n    For expected keys, see the keys in the output of `__getitem__` function of COCODetectionMaskRCNN class.\n\n    Args:\n        batch: A list of dictionaries\n        opts: Command-line arguments\n\n    Returns:\n        A dictionary with `samples` and `targets` as keys.\n    \"\"\"\n    new_batch = {\"samples\": {\"image\": [], \"label\": []}, \"targets\": []}\n\n    for b_id, batch_ in enumerate(batch):\n        new_batch[\"samples\"][\"image\"].append(batch_[\"samples\"][\"image\"])\n        new_batch[\"samples\"][\"label\"].append(batch_[\"samples\"][\"label\"])\n        new_batch[\"targets\"].append(batch_[\"targets\"])\n\n    return new_batch\n"
  },
  {
    "path": "corenet/data/datasets/detection/coco_ssd.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nimport math\nfrom typing import List, Mapping, Tuple, Union\n\nimport torch\nfrom torch import Tensor\n\nfrom corenet.data.collate_fns import COLLATE_FN_REGISTRY\nfrom corenet.data.datasets import DATASET_REGISTRY\nfrom corenet.data.datasets.detection.coco_base import COCODetection\nfrom corenet.data.transforms import image_pil as T\nfrom corenet.data.transforms.common import Compose\nfrom corenet.modeling.anchor_generator import build_anchor_generator\nfrom corenet.modeling.matcher_det import build_matcher\nfrom corenet.utils import logger\n\n\n@DATASET_REGISTRY.register(name=\"coco_ssd\", type=\"detection\")\nclass COCODetectionSSD(COCODetection):\n    \"\"\"Dataset class for the MS COCO Object Detection using Single Shot Object Detector (SSD).\n\n    Args:\n        opts: Command-line arguments\n    \"\"\"\n\n    def __init__(\n        self,\n        opts: argparse.Namespace,\n        *args,\n        **kwargs,\n    ) -> None:\n        if getattr(opts, \"matcher.name\") != \"ssd\":\n            logger.error(\"For SSD, we need --matcher.name as ssd\")\n\n        anchor_gen_name = getattr(opts, \"anchor_generator.name\")\n        if anchor_gen_name is None or anchor_gen_name != \"ssd\":\n            logger.error(\"For SSD, we need --anchor-generator.name to be ssd\")\n\n        super().__init__(opts=opts, *args, **kwargs)\n\n        # we build the anchor generator and matching inside the dataset\n        # so that we can use it with variable batch samplers.\n        self.anchor_box_generator = build_anchor_generator(opts=opts, is_numpy=True)\n        self.match_prior = build_matcher(opts=opts)\n\n        # output strides for generating anchors\n        self.output_strides = self.anchor_box_generator.output_strides\n\n    def _training_transforms(self, size: Tuple[int, int], *args, **kwargs) -> Compose:\n        \"\"\"Data augmentation during training.\n\n        Order of transformation is SSDCroping, PhotometricDistort, RandomHorizontalFlip, Resize,\n            BoxPercentCoords, ToTensor\n\n        Args:\n            size: Size for resizing the input image. Expected to be a tuple (height, width)\n\n        Returns:\n            An instance of `corenet.data.transforms.common.Compose.`\n        \"\"\"\n        aug_list = [\n            T.SSDCroping(opts=self.opts),\n            T.PhotometricDistort(opts=self.opts),\n            T.RandomHorizontalFlip(opts=self.opts),\n            T.Resize(opts=self.opts, img_size=size),\n            T.BoxPercentCoords(opts=self.opts),\n            T.ToTensor(opts=self.opts),\n        ]\n\n        return Compose(opts=self.opts, img_transforms=aug_list)\n\n    def _validation_transforms(self, size: Tuple[int, int], *args, **kwargs) -> Compose:\n        \"\"\"Data augmentation during validation or evaluation.\n\n        Default order of transformation is Resize, BoxPercentCoords, ToTensor.\n\n        Args:\n            size: Size for resizing the input image. Expected to be a tuple (height, width)\n\n        Returns:\n            An instance of `corenet.data.transforms.common.Compose.`\n        \"\"\"\n        aug_list = [\n            T.Resize(opts=self.opts),\n            T.BoxPercentCoords(opts=self.opts),\n            T.ToTensor(opts=self.opts),\n        ]\n        return Compose(opts=self.opts, img_transforms=aug_list)\n\n    def generate_anchors(self, height: int, width: int) -> Tensor:\n        \"\"\"Given the height and width of the input to the SSD model, generate anchors\n\n        Args:\n            height: Height of the input image to the SSD model\n            width: Width of the input image to the SSD model\n\n        Returns:\n            Tensor containing anchor locations\n        \"\"\"\n        anchors = []\n        for output_stride in self.output_strides:\n            if output_stride == -1:\n                fm_width = fm_height = 1\n            else:\n                fm_width = int(math.ceil(width / output_stride))\n                fm_height = int(math.ceil(height / output_stride))\n            fm_anchor = self.anchor_box_generator(\n                fm_height=fm_height,\n                fm_width=fm_width,\n                fm_output_stride=output_stride,\n            )\n            anchors.append(fm_anchor)\n        anchors = torch.cat(anchors, dim=0)\n        return anchors\n\n    def __getitem__(\n        self, sample_size_and_index: Tuple[int, int, int], *args, **kwargs\n    ) -> Mapping[str, Union[Tensor, Mapping[str, Tensor]]]:\n        \"\"\"Returns the sample corresponding to the input sample index. Returned sample is transformed\n        into the size specified by the input.\n\n        Args:\n            sample_size_and_index: Tuple of the form (crop_size_h, crop_size_w, sample_index)\n\n        Returns:\n            A dictionary with `samples` and `targets` as keys corresponding to input and labels of\n            a sample, respectively.\n\n        Shapes:\n            The shape of values in output dictionary, output_data, are as follows:\n\n            output_data[\"samples\"][\"image\"]: Shape is [Channels, Height, Width]\n            output_data[\"targets\"][\"box_labels\"]: Shape is [Num of matched boxes]\n            output_data[\"targets\"][\"box_coordinates\"]: Shape is [Num of matched boxes, 4]\n            output_data[\"targets\"][\"image_id\"]: Shape is [1]\n            output_data[\"targets\"][\"image_width\"]: Shape is [1]\n            output_data[\"targets\"][\"image_height\"]: Shape is [1]\n\n        \"\"\"\n        crop_size_h, crop_size_w, img_index = sample_size_and_index\n\n        transform_fn = self.get_augmentation_transforms(size=(crop_size_h, crop_size_w))\n\n        image_id = self.ids[img_index]\n\n        image, img_fname = self.get_image(image_id=image_id)\n        im_width, im_height = image.size\n        boxes, labels, _ = self.get_boxes_and_labels(\n            image_id=image_id, image_width=im_width, image_height=im_height\n        )\n\n        data = {\"image\": image, \"box_labels\": labels, \"box_coordinates\": boxes}\n\n        data = transform_fn(data)\n\n        # convert to priors\n        anchors = self.generate_anchors(height=crop_size_h, width=crop_size_w)\n\n        gt_coordinates, gt_labels = self.match_prior(\n            gt_boxes=data[\"box_coordinates\"],\n            gt_labels=data[\"box_labels\"],\n            anchors=anchors,\n        )\n\n        output_data = {\n            \"samples\": {\"image\": data.pop(\"image\")},\n            \"targets\": {\n                \"box_labels\": gt_labels,\n                \"box_coordinates\": gt_coordinates,\n                \"image_id\": torch.tensor(image_id),\n                \"image_width\": torch.tensor(im_width),\n                \"image_height\": torch.tensor(im_height),\n            },\n        }\n\n        return output_data\n\n    def extra_repr(self) -> str:\n        extra_repr_str = super().extra_repr()\n        extra_repr_str += (\n            f\"\\n\\tmatcher={self.match_prior}\"\n            f\"\\n\\tanchor_generator={self.anchor_box_generator}\"\n        )\n        return extra_repr_str\n\n\n@COLLATE_FN_REGISTRY.register(name=\"coco_ssd_collate_fn\")\ndef coco_ssd_collate_fn(\n    batch: List[Mapping[str, Union[Tensor, Mapping[str, Tensor]]]],\n    opts: argparse.Namespace,\n) -> Mapping[str, Union[Tensor, Mapping[str, Tensor]]]:\n    \"\"\"Combines a list of dictionaries into a single dictionary by concatenating matching fields.\n\n    For expected keys, see the keys in the output of `__getitem__` function of COCODetectionSSD class.\n\n    Args:\n        batch: A list of dictionaries\n        opts: Command-line arguments\n\n    Returns:\n        A dictionary with `samples` and `targets` as keys.\n    \"\"\"\n    new_batch = {\n        \"samples\": {\"image\": []},\n        \"targets\": {\n            \"box_labels\": [],\n            \"box_coordinates\": [],\n            \"image_id\": [],\n            \"image_width\": [],\n            \"image_height\": [],\n        },\n    }\n\n    for b_id, batch_ in enumerate(batch):\n        # prepare inputs\n        new_batch[\"samples\"][\"image\"].append(batch_[\"samples\"][\"image\"])\n\n        # prepare outputs\n        new_batch[\"targets\"][\"box_labels\"].append(batch_[\"targets\"][\"box_labels\"])\n        new_batch[\"targets\"][\"box_coordinates\"].append(\n            batch_[\"targets\"][\"box_coordinates\"]\n        )\n        new_batch[\"targets\"][\"image_id\"].append(batch_[\"targets\"][\"image_id\"])\n        new_batch[\"targets\"][\"image_width\"].append(batch_[\"targets\"][\"image_width\"])\n        new_batch[\"targets\"][\"image_height\"].append(batch_[\"targets\"][\"image_height\"])\n\n    # stack inputs\n    new_batch[\"samples\"][\"image\"] = torch.stack(new_batch[\"samples\"][\"image\"], dim=0)\n\n    # stack outputs\n    new_batch[\"targets\"][\"box_labels\"] = torch.stack(\n        new_batch[\"targets\"][\"box_labels\"], dim=0\n    )\n\n    new_batch[\"targets\"][\"box_coordinates\"] = torch.stack(\n        new_batch[\"targets\"][\"box_coordinates\"], dim=0\n    )\n\n    new_batch[\"targets\"][\"image_id\"] = torch.stack(\n        new_batch[\"targets\"][\"image_id\"], dim=0\n    )\n\n    new_batch[\"targets\"][\"image_width\"] = torch.stack(\n        new_batch[\"targets\"][\"image_width\"], dim=0\n    )\n\n    new_batch[\"targets\"][\"image_height\"] = torch.stack(\n        new_batch[\"targets\"][\"image_height\"], dim=0\n    )\n\n    return new_batch\n"
  },
  {
    "path": "corenet/data/datasets/language_modeling/__init__.py",
    "content": ""
  },
  {
    "path": "corenet/data/datasets/language_modeling/base_lm.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nimport random\nimport re\nimport string\nfrom typing import Dict, Iterator, Optional\n\nimport torch\nfrom torch import Tensor\n\nfrom corenet.data.datasets.dataset_base import BaseIterableDataset\nfrom corenet.data.text_tokenizer import build_tokenizer\n\n\ndef _process_text(text: str) -> str:\n    \"\"\"Process text to identify low-length content.\n\n    This processing step follows SlimPajama.\n\n    Citation:\n        @misc{cerebras2023slimpajama,\n            author = {Soboleva, Daria and Al-Khateeb, Faisal and Myers, Robert and Steeves, Jacob R and Hestness, Joel and Dey, Nolan},\n            title = {{SlimPajama: A 627B token cleaned and deduplicated version of RedPajama}},\n            month = June,\n            year = 2023,\n            url = {https://huggingface.co/datasets/cerebras/SlimPajama-627B},\n            howpublished = {https://www.cerebras.net/blog/slimpajama-a-627b-token-cleaned-and-deduplicated-version-of-redpajama},\n        }\n\n    Args:\n        text: Input text sequence.\n\n    Returns:\n        Processed text sequence.\n    \"\"\"\n    text = text.lower()\n    text = text.translate(str.maketrans(\"\", \"\", string.punctuation))\n    text = re.sub(r\"\\s+\", \" \", text.strip())\n    return text\n\n\nclass BaseLMIterableDataset(BaseIterableDataset):\n    \"\"\"Base class for language modeling datasets.\n\n    Args:\n        opts: Command-line arguments.\n    \"\"\"\n\n    def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None:\n        super().__init__(opts, *args, **kwargs)\n        self.shuffle_data = getattr(opts, \"dataset.language_modeling.shuffle_data\")\n        self._rng = random.Random(self.seed)\n\n        self.sequence_length = getattr(\n            opts, \"dataset.language_modeling.sequence_length\"\n        )\n        self.min_tokens_per_text = getattr(\n            opts, \"dataset.language_modeling.min_tokens_per_text\"\n        )\n        self.min_characters_per_text = getattr(\n            opts, \"dataset.language_modeling.min_characters_per_text\"\n        )\n\n        self.tokenizer = build_tokenizer(opts)\n\n    @property\n    def pad_token_id(self) -> int:\n        \"\"\"Index corresponding to padding token.\"\"\"\n        return self.tokenizer.pad_token_id\n\n    @property\n    def vocab_size(self) -> int:\n        \"\"\"Vocabulary size.\"\"\"\n        return self.tokenizer.vocab_size\n\n    @property\n    def seed(self) -> int:\n        \"\"\"Seed for initializing random state.\"\"\"\n        opts = self.opts\n        return getattr(opts, \"dataset.language_modeling.random_seed\")\n\n    def _tokenize_text(self, text: str) -> Optional[Dict[str, Tensor]]:\n        \"\"\"Convert input text into tokens.\n\n        Args:\n            text: Input text sequence.\n\n        Returns:\n            For valid sequences, dictionary containing 1D tensors with token indices for\n            input samples and target labels. The shape of tensors is [sequence length]. Otherwise,\n            None is returned.\n\n        ...note:\n            To study the effect of multiple tokenizations, we do 'on-the-fly' tokenization.\n            Pre-training text corpora are often noisy and may contain low-length sequences.\n            To deal such text sequences, we apply two filtering methods:\n                1. We process the text and check if the number of characters in the text sequence\n                    are less than the specified threshold or not. If it is, then we skip such sequences.\n                2. After tokenizing the sequence, we check for the number of tokens. If they are smaller\n                    than the pre-defined threshold, then such sequences are skipped.\n        \"\"\"\n        if len(_process_text(text)) < self.min_characters_per_text:\n            return None\n\n        tokenized_text = self.tokenizer(text)\n        n_tokens = tokenized_text.shape[0]\n\n        if n_tokens < self.min_tokens_per_text:\n            return None\n\n        # In language modeling, the target sequence is generated by shifting the input sequence by one position.\n        valid_seq_length = min(n_tokens, self.sequence_length + 1)\n        content_tensor = torch.full(\n            size=(self.sequence_length + 1,),\n            fill_value=self.pad_token_id,\n            dtype=torch.long,\n        )\n\n        content_tensor[:valid_seq_length] = tokenized_text[:valid_seq_length]\n        return {\n            \"samples\": content_tensor[:-1],\n            \"targets\": content_tensor[1:],\n        }\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        if cls == BaseLMIterableDataset:\n            group = parser.add_argument_group(cls.__name__)\n            group.add_argument(\n                \"--dataset.language-modeling.sequence-length\",\n                type=int,\n                default=2048,\n                help=\"Tokenized sequence length. Defaults to 2048.\",\n            )\n            group.add_argument(\n                \"--dataset.language-modeling.min-tokens-per-text\",\n                type=int,\n                default=0,\n                help=\"Minimum number of tokens per text after tokenization. \"\n                \"This flag allows us to skip short text sequences and avoid excessive padding. Defaults to 0.\",\n            )\n            group.add_argument(\n                \"--dataset.language-modeling.min-characters-per-text\",\n                type=int,\n                default=0,\n                help=\"Minimum number of characters in a text sequence before tokenization. \"\n                \"This flag allows us to skip short text sequences. Defaults to 0.\",\n            )\n            group.add_argument(\n                \"--dataset.language-modeling.shuffle-data\",\n                action=\"store_true\",\n                default=False,\n                help=\"The pre-training corpora consist of multiple text files. \"\n                \"This flag can be utilized to enable shuffling of these data files. It defaults to False, \"\n                \"with the note that the user is responsible for implementing the shuffling operation.\",\n            )\n            group.add_argument(\n                \"--dataset.language-modeling.random-seed\",\n                type=int,\n                default=0,\n                help=\"Random seed for shuffling data files. Defaults to 0.\",\n            )\n        return parser\n\n    def generate_sample(\n        self, scaled_rank: int, scaled_world_size: int\n    ) -> Iterator[Dict[str, Tensor]]:\n        \"\"\"Generate input and labels.\n\n        Args:\n            scaled_rank: Scaled rank. It represents the unique identifier assigned to each process within a\n                distributed system. The total number of processes is determined by multiplying the number\n                of available GPUs by the number of dataset workers. This scaling ensures that each process\n                has a distinct and consistent identification, preventing duplicated data sampling and\n                facilitating efficient coordination across the distributed environment.\n            scaled_world_size: Scaled world size. It represents the combined count of processes involved in\n                distributed system. It is determined by multiplying the number of available GPUs (a.k.a., world size)\n                by the number of dataset workers.\n\n        Yields:\n            This function should yield a dictionary containing 'samples' and 'targets' as keys corresponding to\n            the input and label of a sample, respectively. The shape of input and label tensors is [sequence length].\n\n        ...note:\n            Iterable datasets can generate duplicate content across different multi-processing workers. To avoid this,\n            the rank and world size are scaled, so each worker can process a different content file.\n\n            Child classes must implement 'generate_sample' function correctly.\n        \"\"\"\n        raise NotImplementedError(\n            \"Child class must implement 'generate_sample' function.\"\n        )\n\n    def __iter__(self) -> Iterator[Dict[str, Tensor]]:\n        \"\"\"Returns an iterator over the dataset.\n\n        Yields:\n            A dictionary containing 'samples' and 'targets' as keys corresponding to\n            the input and label of a sample, respectively. The shape of input and label tensors is [sequence length].\n        \"\"\"\n\n        # scale the rank and world size to deal with multiprocessing and distributed training.\n        scaled_world_size = self.world_size * self.num_workers\n        scaled_rank = self.rank * self.num_workers + self.worker_id\n        yield from self.generate_sample(\n            scaled_rank=scaled_rank, scaled_world_size=scaled_world_size\n        )\n\n    def extra_repr(self) -> str:\n        return (\n            f\"\\n\\tvocab_size={self.vocab_size}\"\n            f\"\\n\\tpad_token_id={self.pad_token_id}\"\n            f\"\\n\\tmin_characters_per_text={self.min_characters_per_text}\"\n            f\"\\n\\tmin_tokens_per_text={self.min_tokens_per_text}\"\n            f\"\\n\\tshuffle={self.shuffle_data}\"\n        )\n"
  },
  {
    "path": "corenet/data/datasets/language_modeling/commonsense_170k.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\n\nimport argparse\nimport fcntl\nimport os\nfrom typing import Dict, Iterator\n\nimport pandas as pd\nfrom torch import Tensor\n\nfrom corenet.constants import DATA_CACHE_DIR\nfrom corenet.data.datasets import DATASET_REGISTRY\nfrom corenet.data.datasets.language_modeling.base_lm import BaseLMIterableDataset\nfrom corenet.utils.common_utils import construct_local_path_from_remote\nfrom corenet.utils.download_utils import get_local_path\n\n\n@DATASET_REGISTRY.register(name=\"commonsense_170k\", type=\"language_modeling\")\nclass CommonSense170k(BaseLMIterableDataset):\n    \"\"\"\n    The CommonSense 170k dataset, as defined in LLM-Adapters (https://arxiv.org/pdf/2304.01933.pdf).\n\n    This is a simple concatenation of:\n      - boolq\n      - piqa\n      - social_i_qa\n      - hellaswag\n      - winogrande\n      - ARC-Easy\n      - ARC-Challenge\n      - openbookqa\n\n    CommonSense170k processes prompts uniformly for all of its sub-datasets.\n    See @generate_prompt_and_response.\n    \"\"\"\n\n    def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None:\n        super().__init__(opts, *args, **kwargs)\n\n        self.json_path = getattr(\n            opts, \"dataset.language_modeling.commonsense_170k.path\"\n        )\n        if self.json_path is None:\n            raise ValueError(\n                \"--dataset.language-modeling.commonsense-170k.path \" \"is required.\"\n            )\n        json_path = self._download_if_required(self.json_path)\n        self.data = pd.read_json(json_path)\n\n    def generate_sample(\n        self, scaled_rank: int, scaled_world_size: int\n    ) -> Iterator[Dict[str, Tensor]]:\n        num_elems = len(self.data)\n        chosen_elems = list(range(scaled_rank, num_elems, scaled_world_size))\n        self._rng.shuffle(chosen_elems)\n        shuffled_data = self.data.loc[chosen_elems]\n\n        for sample in shuffled_data.iterrows():\n            sample = sample[1].to_dict()\n            sample = generate_prompt_and_response(sample)\n            tokenized_sample = self._tokenize_text(sample)\n            yield tokenized_sample\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        if cls == CommonSense170k:\n            group = parser.add_argument_group(cls.__name__)\n            group.add_argument(\n                \"--dataset.language-modeling.commonsense-170k.path\",\n                default=None,\n                help=\"Path to the commonsense 170k json dataset file. \"\n                \"Default is None. Note, the dataset file is currently \"\n                \"available in the LLM-Adapters repository at \"\n                \"https://github.com/AGI-Edgerunners/LLM-Adapters/blob/main\"\n                \"/ft-training_set/commonsense_170k.json.\",\n            )\n        return parser\n\n    def _download_if_required(self, remote_file_path: str) -> str:\n        \"\"\"\n        Download @remote_file_path if it isn't already downloaded.\n\n        Args:\n            remote_file_path: The file to possibly download.\n        Returns:\n            The local path to the file.\n        \"\"\"\n        local_file_path = construct_local_path_from_remote(\n            remote_path=remote_file_path, local_dir=DATA_CACHE_DIR\n        )\n\n        with open(local_file_path + \".lock\", \"a\") as lock_file:\n            try:\n                fcntl.flock(lock_file.fileno(), fcntl.LOCK_EX)\n                if os.path.isfile(local_file_path):\n                    return local_file_path\n\n                local_file_path = get_local_path(\n                    opts=self.opts,\n                    path=remote_file_path,\n                    cache_loc=DATA_CACHE_DIR,\n                    max_retries=20,\n                    force_delete=False,\n                    use_start_rank=False,\n                    sync_ranks=False,\n                )\n            finally:\n                fcntl.flock(lock_file.fileno(), fcntl.LOCK_UN)\n\n        return local_file_path\n\n\ndef generate_prompt_and_response(data_point: Dict[str, str]) -> str:\n    \"\"\"\n    Generate the prompt and response for a given data point.\n\n    Adapted from LLM-Adapters: https://github.com/AGI-Edgerunners/LLM-Adapters\n\n    Args:\n        data_point: A data point with the following keys: \"instruction\",\n            \"input\", \"output\", and \"answer\". The \"input\" field can contain\n            an empty string if an input is not used by the evaluation.\n    \"\"\"\n    if data_point[\"input\"]:\n        return f\"\"\"Below is an instruction that describes a task, paired with an input that provides further context. Write a response that appropriately completes the request. \n\n                ### Instruction:\n                {data_point[\"instruction\"]}\n                \n                ### Input:\n                {data_point[\"input\"]}\n                \n                ### Response:\n                {data_point[\"output\"]}\"\"\"  # noqa: E501\n    else:\n        return f\"\"\"Below is an instruction that describes a task. Write a response that appropriately completes the request.  \n\n                ### Instruction:\n                {data_point[\"instruction\"]}\n                \n                ### Response:\n                {data_point[\"output\"]}\"\"\"  # noqa: E501\n"
  },
  {
    "path": "corenet/data/datasets/language_modeling/general_lm.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\n\nimport argparse\nimport fcntl\nimport math\nimport os\nimport pickle\nimport time\nfrom functools import partial\nfrom pathlib import Path\nfrom typing import Any, Callable, Dict, Iterable, Iterator, List, Optional, Tuple\n\nimport pandas as pd\nfrom pyarrow import parquet as pq\nfrom torch import Tensor\n\nfrom corenet.constants import DATA_CACHE_DIR\nfrom corenet.data.datasets import DATASET_REGISTRY\nfrom corenet.data.datasets.language_modeling.base_lm import BaseLMIterableDataset\nfrom corenet.options.parse_args import JsonValidator\nfrom corenet.utils import logger\nfrom corenet.utils.common_utils import construct_local_path_from_remote\nfrom corenet.utils.download_utils import get_local_path\n\n\ndef check_list_of_dicts_with_mandatory_keys(\n    data: List[Dict], mandatory_keys: List[str]\n) -> None:\n    \"\"\"\n    Check if a variable is a list of dictionaries, and each dictionary contains mandatory keys.\n\n    Args:\n        data: The data to check.\n        mandatory_keys: The list of mandatory keys that must be present in each dictionary.\n\n    Raises:\n        Raises an error if the data is not a list of dictionaries or if any dictionary is missing mandatory keys.\n    \"\"\"\n    if not isinstance(data, list):\n        logger.error(f\"Expected type of data is list. Got: {type(data)}.\")\n\n    for item in data:\n        if not isinstance(item, dict):\n            logger.error(f\"Item in the list is not a dictionary. Got: {item}.\")\n        item_keys = set(item.keys())\n        if not item_keys.intersection(mandatory_keys):\n            logger.error(\n                f\"Dictionary is missing mandatory keys. Got: {item_keys}, expected: {mandatory_keys}.\"\n            )\n\n\n@DATASET_REGISTRY.register(name=\"general_lm\", type=\"language_modeling\")\nclass GeneralLMDataset(BaseLMIterableDataset):\n    \"\"\"\n    A dataset class for general language modeling tasks.\n\n    The class can read and yield data from variety of file formats. Currently supported formats are\n    '.parquet', '.jsonl', and '.json.gz'.\n\n    Args:\n        opts: Command-line arguments.\n\n    \"\"\"\n\n    _dataset_name = \"general_lm\"\n\n    def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None:\n        super().__init__(opts, *args, **kwargs)\n\n        data_info = self._prepare_dataset()\n        self.data_info = data_info\n\n        # During training, we will store the data state. This helps in resuming\n        # training in case of failures.\n        self._state = None\n        self._target_state = None\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        \"\"\"Arguments related to General LM dataset.\"\"\"\n        if cls == GeneralLMDataset:\n            group = parser.add_argument_group(cls.__name__)\n            for mode in [\"train\", \"val\", \"test\"]:\n                group.add_argument(\n                    f\"--dataset.language-modeling.general-lm.{mode}-data-info\",\n                    type=JsonValidator(List[Dict[str, Any]]),\n                    default=None,\n                    nargs=\"+\",\n                    help=f\"Name of the parquet files for the {mode} set. Defaults to None (i.e., user needs to specify the value).\",\n                )\n            group.add_argument(\n                \"--dataset.language-modeling.general-lm.data-state\",\n                default=None,\n                type=str,\n                nargs=\"+\",\n                help=\"A list containing the filenames that each process was processing before crash. Defaults to None.\",\n            )\n            group.add_argument(\n                \"--dataset.language-modeling.general-lm.reader-chunk-size\",\n                type=int,\n                default=1024,\n                help=\"Number of documents to read from a dataset file at a time. Defaults to 1024.\",\n            )\n            group.add_argument(\n                \"--dataset.language-modeling.general-lm.document-split-size\",\n                default=2048,\n                type=int,\n                help=\"The length of each sequence when splitting a larger document. Defaults to 2048 words.\",\n            )\n            group.add_argument(\n                \"--dataset.language-modeling.general-lm.data-state-save-interval\",\n                default=15,\n                type=int,\n                help=\"Data state save interval in minutes. Defaults to 15 minutes.\",\n            )\n\n        return parser\n\n    def _reset_data_state(self) -> None:\n        \"\"\"Reset the data state.\n\n        The data state has following keys:\n            1. epoch: It stores the current epoch index.\n            2. file: Name of the file it is currently processing.\n            3. chunk: Chunk index. Note that each file may contains multiple documents, and for efficiency,\n                we read them in chunks.\n            4. _time: Time (in seconds) at which state is saved.\n        \"\"\"\n        self._state = {\n            \"epoch\": 0,\n            \"file\": None,\n            \"chunk\": 0,\n            \"_time\": 0,\n        }\n        self._target_state = {\n            \"epoch\": 0,\n            \"file\": None,\n            \"chunk\": 0,\n            \"_time\": 0,\n        }\n\n    def extra_repr(self) -> str:\n        return super().extra_repr() + (\n            f\"\\n\\tnum_files={self.num_files}\"\n            f\"\\n\\tdocument_split_size={self.document_split_size}\"\n            f\"\\n\\treader_chunk_size={self.reader_chunk_size}\"\n        )\n\n    @property\n    def reader_chunk_size(self) -> int:\n        \"\"\"Number of documents to read from a dataset file at a time.\"\"\"\n        return getattr(\n            self.opts, \"dataset.language_modeling.general_lm.reader_chunk_size\"\n        )\n\n    @property\n    def save_loc(self) -> str:\n        \"\"\"Location path where artifacts (e.g., data state) will be stored.\"\"\"\n        save_dir = getattr(self.opts, \"common.results_loc\")\n        run_label = getattr(self.opts, \"common.run_label\")\n        res_dir = \"{}/{}\".format(save_dir, run_label)\n        Path(res_dir).mkdir(exist_ok=True, parents=True)\n        return res_dir\n\n    @property\n    def num_files(self) -> int:\n        \"\"\"Total number of files.\"\"\"\n        return len(self.data_info[\"file_paths\"])\n\n    @property\n    def document_split_size(self) -> int:\n        \"\"\"The length of each sequence when splitting a larger document.\"\"\"\n        return getattr(\n            self.opts, \"dataset.language_modeling.general_lm.document_split_size\"\n        )\n\n    def _load_data_state(self) -> None:\n        \"\"\"Load data state.\n\n        The data state file is read using 'dataset.language_modeling.general_lm.data_state' argument. The\n        values for this argument are expected as a list, and can be specified in a configuration file or via command line.\n        Recommended way to specify this argument is using configuration file as the number of state files could be\n        large.\n        \"\"\"\n        data_state_file_paths = getattr(\n            self.opts, \"dataset.language_modeling.general_lm.data_state\"\n        )\n        if data_state_file_paths is not None:\n            for data_state_fpath in data_state_file_paths:\n                if not data_state_fpath.endswith(\n                    f\"data_state_{self.rank}_{self.worker_id}.pkl\"\n                ):\n                    continue\n\n                # Load only for the current process\n                data_state_fpath = get_local_path(\n                    self.opts,\n                    path=data_state_fpath,\n                    force_delete=False,\n                    use_start_rank=False,\n                    sync_ranks=False,\n                )\n                with open(data_state_fpath, \"rb\") as fh:\n                    self._target_state = pickle.load(fh)\n\n                logger.info(\n                    f\"Loaded dataset state {self._target_state} from {data_state_fpath} for {self.worker_id} worker on {self.rank}.\"\n                )\n                break\n\n    def _save_data_state(self, **kwargs) -> None:\n        \"\"\"Save data state.\n\n        The data states are saved for each worker on each rank. These states help us resume the\n        training in case it crashes.\n        \"\"\"\n        ((key, value),) = kwargs.items()\n        state = self._state\n        # The time is in seconds, so minutes are converted to seconds by multiplying with 60\n        save_every_k_seconds = (\n            getattr(\n                self.opts,\n                \"dataset.language_modeling.general_lm.data_state_save_interval\",\n            )\n            * 60\n        )\n        if key == \"chunk\":\n            # We read files in chunks since each file could contain millions of documents.\n            # Saving the chunk index allows us to resume training from nearly the same document in case of a failure.\n            if time.time() < state[\"_time\"] + save_every_k_seconds:\n                return\n            state[\"chunk\"] = value\n        elif key == \"file\":\n            # The pre-training corpora consists of multiple files, each containing several documents.\n            # We save the file name to resume training from the same file in case of a failure.\n            state[\"chunk\"] = 0\n            state[\"file\"] = value\n        elif key == \"epoch\":\n            # As workers or processes may complete iteration over files at different rates due to varying content lengths,\n            # we store the epoch index to ensure correct shuffling and enable seamless resuming of training in case of failure.\n            state[\"chunk\"] = 0\n            state[\"file\"] = None\n            state[\"epoch\"] = value\n        else:\n            raise KeyError(f\"Got unexpected key={key}.\")\n\n        state[\"_time\"] = time.time()\n\n        # save the file information in a file so that we can use it to resume training (if it fails)\n        Path(f\"{self.save_loc}/data_states\").mkdir(exist_ok=True, parents=True)\n        local_file_path = (\n            f\"{self.save_loc}/data_states/data_state_{self.rank}_{self.worker_id}.pkl\"\n        )\n        with open(local_file_path + \".lock\", \"a\") as lock_file:\n            try:\n                fcntl.flock(lock_file.fileno(), fcntl.LOCK_EX)\n                with open(\n                    f\"{self.save_loc}/data_states/data_state_{self.rank}_{self.worker_id}.pkl\",\n                    \"wb\",\n                ) as fh:\n                    pickle.dump(self._state, fh)\n            finally:\n                fcntl.flock(lock_file.fileno(), fcntl.LOCK_UN)\n\n    def _prepare_dataset(self) -> Dict[str, List[str]]:\n        \"\"\"Prepare the dataset.\n\n        Each dataset contains multiple files and each file could contain several documents. Specifying\n        each file for each dataset is cubersome. To address this, we use file identifier in each dataset.\n\n        Let's say that dataset, 'dummy_dataset', contain 26 files with a format '.json.gz' and it's structure\n        is similar to below structure\n\n        dummy_dataset/\n        ├── dummy_0000.json.gz\n        ├── dummy_0001.json.gz\n        ├── dummy_0002.json.gz\n        ├── ...\n        ├── dummy_0025.json.gz\n\n        Instead of individually specifying each file, we use a dictionary with three keys:\n            1. \"file_name\": This contains the base name of the files. If multiple files are present,\n                each filename is expected to include a file identifier.\n            2. \"text_key\": Documents within each file are stored as dictionaries with various keys\n                for different information, including text content and metadata. This parameter\n                specifies the key within each document that corresponds to the text content.\n            3. \"file_id_range\": This specifies the range of file identifiers present in the dataset.\n\n        An example for above dummy dataset is given below:\n        {\n            \"file_name\": \"dummy_dataset/dummy_{file_id:04d}.json.gz,\n            \"text_key\": \"text\",\n            \"file_id_range\": [0, 26]\n        }\n\n        Returns:\n            A dictionary with the following information:\n                1. 'file_paths': A list containing file paths.\n                2. 'text_keys': A list containing text keys.\n\n        ...note:\n            Some datasets may have single file. In such a case, we do not need to specify 'file_id' as\n            part of the 'file_name'. However, we still need to pass 'file_id_range' as it is an expected key.\n            An example of specifying such datasets is shown below:\n                {\n                    \"file_name\": \"dummy_book.jsonl,\n                    \"text_key\": \"text\",\n                    \"file_id_range\": [0, 1]\n                }\n        \"\"\"\n        opts = self.opts\n        mode = self.mode\n        assert mode in (\n            \"train\",\n            \"val\",\n            \"test\",\n        ), f\"Mode should be either train or test or val. Got {mode}.\"\n        data_info = getattr(\n            opts,\n            f\"dataset.language_modeling.{self._dataset_name}.{mode}_data_info\",\n        )\n        if data_info is None:\n            logger.error(\n                f\"Please specify dataset information using 'dataset.language_modeling.{self._dataset_name}.{mode}_data_info' variable in config file. Got None.\"\n            )\n        mandatory_keys = [\"file_name\", \"text_key\", \"file_id_range\"]\n        check_list_of_dicts_with_mandatory_keys(data_info, mandatory_keys)\n\n        file_names = []\n        text_keys = []\n        for item in data_info:\n            file_id_range = item[\"file_id_range\"]\n            if isinstance(file_id_range, list) and len(file_id_range) == 2:\n                file_names_i = []\n                for file_id in range(file_id_range[0], file_id_range[1]):\n                    file_name = item[\"file_name\"].format(file_id=file_id)\n                    file_names_i.append(file_name)\n\n                file_names.extend(file_names_i)\n                # each file is expected to have the same text key.\n                text_keys.extend([item[\"text_key\"]] * len(file_names_i))\n            else:\n                logger.error(\n                    f\"File id range is expected as a list of 2 elements. Got: {file_id_range}.\"\n                )\n\n        if len(file_names) != len(text_keys):\n            logger.error(\n                f\"The number of file names does not match the number of text keys. Got: {len(file_names)} and {len(text_keys)}.\"\n            )\n\n        if self.shuffle_data:\n            file_names, text_keys = self._shuffle_fn(\n                file_names=file_names, text_keys=text_keys\n            )\n\n        return {\n            \"file_paths\": file_names,\n            \"text_keys\": text_keys,\n        }\n\n    def _download_if_required(self, remote_file_path: str) -> str:\n        \"\"\"Optionally download the files.\n\n        This function allows us to download files from remote location (e.g., S3).\n\n        Args:\n            remote_file_path: Remote file path.\n\n        Return:\n            The local file path of the downloaded file.\n\n        ...note:\n            This repository has implemented standard transfer clients such as HTTP, HTTPS, and S3.\n            However, users may utilize other data storage clients. In such cases, custom clients\n            should be implemented and registered to ensure proper functionality of this function\n        \"\"\"\n\n        local_file_path = construct_local_path_from_remote(\n            remote_path=remote_file_path, local_dir=DATA_CACHE_DIR\n        )\n\n        with open(local_file_path + \".lock\", \"a\") as lock_file:\n            try:\n                fcntl.flock(lock_file.fileno(), fcntl.LOCK_EX)\n                if os.path.isfile(local_file_path):\n                    return local_file_path\n\n                local_file_path = get_local_path(\n                    opts=self.opts,\n                    path=remote_file_path,\n                    cache_loc=DATA_CACHE_DIR,\n                    max_retries=20,\n                    force_delete=False,\n                    use_start_rank=False,\n                    sync_ranks=False,\n                )\n            finally:\n                fcntl.flock(lock_file.fileno(), fcntl.LOCK_UN)\n\n        return local_file_path\n\n    def _skip_document_chunks(self, chunks: Iterable[Any]) -> Iterator[Any]:\n        \"\"\"Yield chunks of data from an iterable, optionally skipping chunks based on a resume chunk index.\n\n        Args:\n            chunks: An iterable containing data to be chunked.\n\n        Yields:\n            Chunks of the data.\n        \"\"\"\n        for chunk_counter, chunk in enumerate(chunks):\n            if chunk_counter < self._target_state[\"chunk\"]:\n                continue\n            else:\n                self._target_state[\"chunk\"] = 0\n            self._save_data_state(chunk=chunk_counter)\n            yield chunk\n\n    def _split_document_into_sequences(\n        self, documents: List[str], word_separator: str = \" \"\n    ) -> Iterator[Any]:\n        \"\"\"Split document into sequences.\n\n        Some documents may be very large and contain millions of words. Tokenizing such documents\n        is very slow and slows down the training. To deal with such large documents, we divide them\n        into small sequences and process each sequence independently.\n\n        Args:\n            documents: List of text documents.\n            word_separator: The delimiter used to separate individual words. Defaults to space.\n\n        Yields:\n            A text sequence with desired number of words.\n        \"\"\"\n        for document in documents:\n            words = document.split(word_separator)\n            for i in range(0, len(words), self.document_split_size):\n                text = word_separator.join(words[i : i + self.document_split_size])\n                yield text\n\n    def _read_data_from_parquet(\n        self, file_path: str, text_key: str, **reader_kwargs\n    ) -> Iterator[Dict[str, Tensor]]:\n        \"\"\"Read data from the parquet file.\n\n        Args:\n            file_path: Path of the parquet file.\n            text_key: Key name corresponding to content in the parquet file.\n\n        Yields:\n            A dictionary containing 1D tensors with token indices for input samples and target labels.\n            The shape of the tensors matches that of the output from the '_tokenize_text' function.\n        \"\"\"\n\n        pq_table = pq.ParquetFile(file_path, **reader_kwargs)\n        for document_chunks in self._skip_document_chunks(\n            pq_table.iter_batches(\n                batch_size=self.reader_chunk_size,\n                columns=[text_key],\n            )\n        ):\n            document_chunks_pd = document_chunks.to_pandas()[text_key]\n            for text in self._split_document_into_sequences(document_chunks_pd):\n                tokenized_text = self._tokenize_text(text)\n                if tokenized_text is not None:\n                    yield tokenized_text\n\n    def _read_data_from_json(\n        self, file_path: str, text_key: str, **reader_kwargs\n    ) -> Iterator[Dict[str, Tensor]]:\n        \"\"\"Read data from the jsonl and json.gz files.\n\n        When the format is 'json.gz', then reader_kwargs contain 'compression' as a key with value 'gzip'.\n        See '_get_file_reader' function for reader_kwargs.\n\n        Args:\n            file_path: Path of the parquet file.\n\n        Yields:\n            A dictionary containing 1D tensors with token indices for input samples and target labels.\n            The shape of the tensors matches that of the output from the '_tokenize_text' function.\n        \"\"\"\n        document_chunks = pd.read_json(\n            file_path, lines=True, chunksize=self.reader_chunk_size, **reader_kwargs\n        )\n        for documents in self._skip_document_chunks(document_chunks):\n            # each chunk contains multiple text\n            for text in self._split_document_into_sequences(documents[text_key]):\n                tokenized_text = self._tokenize_text(text)\n                if tokenized_text is not None:\n                    yield tokenized_text\n\n    def _get_file_reader(self, file_path: str) -> Callable:\n        \"\"\"Returns the function used to read a file based on its extension.\"\"\"\n        reader_kwargs = {}\n        if file_path.endswith(\"parquet\"):\n            reader = self._read_data_from_parquet\n        elif file_path.endswith(\"json.gz\"):\n            reader = self._read_data_from_json\n            reader_kwargs[\"compression\"] = \"gzip\"\n        elif file_path.endswith(\"jsonl\"):\n            reader = self._read_data_from_json\n        else:\n            raise NotImplementedError(f\"File format is not supported.\")\n        return partial(reader, **reader_kwargs)\n\n    def generate_sample(\n        self, scaled_rank: int, scaled_world_size: int\n    ) -> Iterator[Any]:\n        \"\"\"Generate input and labels.\n\n        Args:\n            scaled_rank: Scaled rank.\n            scaled_world_size: Scaled world size.\n\n        Yields:\n            Yields a dictionary containing 'samples' and 'targets' as keys corresponding to\n            the input and label of a sample, respectively. The shape of the tensors matches that\n            of the output from the '_tokenize_text' function.\n        \"\"\"\n        self._reset_data_state()\n        self._load_data_state()\n\n        file_paths = self.data_info[\"file_paths\"]\n        text_keys = self.data_info[\"text_keys\"]\n\n        total_files = len(file_paths)\n        if total_files % scaled_world_size != 0:\n            padding = (\n                math.ceil(total_files / scaled_world_size) * scaled_world_size\n            ) - total_files\n\n            padd_file_paths, padd_text_keys = self._shuffle_fn(\n                file_names=file_paths, text_keys=text_keys, k=padding\n            )\n\n            file_paths += padd_file_paths\n            text_keys += padd_text_keys\n            total_files = len(file_paths)\n\n        # split files among each node\n        file_paths_process_i = file_paths[scaled_rank:total_files:scaled_world_size]\n        text_keys_process_i = text_keys[scaled_rank:total_files:scaled_world_size]\n\n        prev_file_path = None\n\n        # some of the files may have fewer tokens compared to other files.\n        # Therefore, some processes may finish before other processes. To deal with such\n        # scenarios, sample data indefinitely.\n        epoch_counter = -1\n        while True:\n            epoch_counter += 1\n            if epoch_counter > 0:\n                # shuffle\n                file_paths_process_i, text_keys_process_i = self._shuffle_fn(\n                    file_names=file_paths_process_i, text_keys=text_keys_process_i\n                )\n            if epoch_counter < self._target_state[\"epoch\"]:\n                # increment the epoch counter till we reach the point where current process crashed.\n                continue\n            else:\n                self._target_state[\"epoch\"] = 0\n\n            for remote_file_path, text_key in zip(\n                file_paths_process_i, text_keys_process_i\n            ):\n                if (\n                    self._target_state[\"file\"] is not None\n                    and self._target_state[\"file\"] in file_paths_process_i\n                ):\n                    if remote_file_path != self._target_state[\"file\"]:\n                        # skip the files till we reach the current file path that was being used before training crashed.\n                        continue\n                    else:\n                        # We reached the file that was fully iterated before training crashed.\n                        # Skip this file and reset the state\n                        self._target_state[\"file\"] = None\n                        continue\n\n                local_file_path = self._download_if_required(remote_file_path)\n\n                logger.info(\n                    f\"Processing {local_file_path} on worker {self.worker_id} of rank {self.rank}\"\n                )\n\n                if prev_file_path is None:\n                    prev_file_path = local_file_path\n\n                reader = self._get_file_reader(file_path=local_file_path)\n\n                yield from reader(file_path=local_file_path, text_key=text_key)\n                self._save_data_state(file=remote_file_path)\n\n            self._save_data_state(epoch=epoch_counter + 1)\n\n    def _shuffle_fn(\n        self, file_names: List[str], text_keys: List[str], k: Optional[int] = None\n    ) -> Tuple[List[str], List[str]]:\n        \"\"\"Shuffle the file names and text keys.\n\n        Args:\n            file_names: List of file names.\n            text_keys: List of text keys.\n            k: Number of files to randomly select.\n\n        Returns:\n            A tuple containing file names and text keys. When 'k' is specified, a tuple containing k-sized list of\n            file names and text keys is returned.\n\n        ...note:\n            This shuffling function is only applicable during training mode or when k is specified. For validation\n            and testing when k is not specified, it does not perform any operation.\n        \"\"\"\n        if self.is_training or k is not None:\n            _temp = list(zip(file_names, text_keys))\n            if k is not None:\n                _temp = self._rng.choices(_temp, k=k)\n            else:\n                self._rng.shuffle(_temp)\n            return zip(*_temp)\n        return file_names, text_keys\n"
  },
  {
    "path": "corenet/data/datasets/multi_modal_img_text/__init__.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\n\nfrom corenet.data.datasets.multi_modal_img_text.base_multi_modal_img_text import (\n    BaseMultiModalImgText,\n)\nfrom corenet.data.datasets.multi_modal_img_text.zero_shot_image_classification import (\n    arguments_zero_shot_image_classification_dataset,\n)\n\n\ndef arguments_multi_modal_img_text(\n    parser: argparse.ArgumentParser,\n) -> argparse.ArgumentParser:\n\n    parser = arguments_zero_shot_image_classification_dataset(parser)\n    parser = BaseMultiModalImgText.add_arguments(parser)\n    return parser\n"
  },
  {
    "path": "corenet/data/datasets/multi_modal_img_text/base_multi_modal_img_text.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nfrom typing import Any, List, Mapping, Optional, Tuple, Union\nfrom urllib.parse import urlsplit\n\nimport torch\nfrom PIL import Image\nfrom torch import Tensor\n\nfrom corenet.constants import DATA_CACHE_DIR\nfrom corenet.data.collate_fns import COLLATE_FN_REGISTRY\nfrom corenet.data.datasets.dataset_base import BaseImageDataset\nfrom corenet.data.datasets.multi_modal_img_text.zero_shot_image_classification import (\n    build_zero_shot_image_classification_dataset,\n)\nfrom corenet.data.datasets.utils.text import caption_preprocessing\nfrom corenet.data.io.transfer_clients import BaseClient, get_transfer_client\nfrom corenet.data.text_tokenizer import build_tokenizer\nfrom corenet.data.transforms import image_pil as T\nfrom corenet.data.transforms.common import Compose\nfrom corenet.utils import logger\n\n\nclass BaseMultiModalImgText(BaseImageDataset):\n    \"\"\"\n    Base class for Image-Text multi-modal learning.\n\n    Args:\n        opts: Command-line arguments.\n\n    ...note:\n        As a standard practice, we use web image-text datasets for pre-training and measure the zero-shot performance on\n        standard image classification datasets for validation/evaluation purposes.\n    \"\"\"\n\n    def __init__(\n        self,\n        opts,\n        *args,\n        **kwargs,\n    ) -> None:\n\n        super().__init__(\n            opts=opts,\n            *args,\n            **kwargs,\n        )\n        self.text_tokenizer = build_tokenizer(opts=opts)\n        self.cache_loc = DATA_CACHE_DIR\n        self._transfer_client = None\n\n        if not self.is_training:\n            self.cached_zero_shot_captions = None\n            self.cached_max_seq_length = None\n            self.dataset = build_zero_shot_image_classification_dataset(\n                self.opts, *args, **kwargs\n            )\n        else:\n            self.dataset = self.get_image_text_dataset()\n\n    def get_image_text_dataset(self) -> Optional[Any]:\n        \"\"\"Helper function to download or process image-text dataset.\n\n        Recommended way for downloading image-text datasets is to download on-the-fly. In such a case, we do not need\n        to implement this function and return None. See 'corenet/data/datasets/multi_modal_img_text/img_text_tar_dataset.py' as an example.\n\n        However, for small datasets (e.g., Flickr), we can download the dataset before training is started. In such a case, we\n        need to implement this function. See 'corenet/data/datasets/multi_modal_img_text/flickr.py' as an example.\n        \"\"\"\n        raise NotImplementedError(\"Child classes must implement this function.\")\n\n    def _get_transfer_client(self, file_path: str) -> BaseClient:\n        \"\"\"Get transfer client for a given file path.\n\n        Args:\n            opts: Command-line arguments.\n            file_path: File path.\n\n        Returns:\n            An instance of BaseTransferClient.\n\n        ...note:\n            1. Some of the clients are not pickle-able (e.g., S3). Therefore, this function should not be\n            called inside the '__init__' function.\n            2. This function is added as a class function so that we can re-use it in future sub-classes.\n        \"\"\"\n\n        if self._transfer_client is None:\n            opts = self.opts\n            client_name = urlsplit(file_path).scheme.lower()\n\n            self._transfer_client = get_transfer_client(\n                opts,\n                transfer_client_name=client_name,\n                force_delete=False,\n                only_download_on_start_rank=False,\n                synchronize_distributed_ranks=False,\n                parallel_download=False,\n            )\n        return self._transfer_client\n\n    @property\n    def vocab_size(self) -> int:\n        \"\"\"Vocabulary size.\"\"\"\n        return self.text_tokenizer.vocab_size\n\n    @property\n    def padding_index(self) -> Optional[int]:\n        \"\"\"Padding index.\n\n        ...note:\n            If padding index is specified and the length of tokenized caption is less than desired context length,\n            then tokenized caption is padded with the value of padding index.\n        \"\"\"\n        return getattr(self.opts, \"dataset.multi_modal_img_text.padding_index\")\n\n    @property\n    def context_length(self) -> int:\n        \"\"\"Context length for text encoder.\"\"\"\n        opts = self.opts\n        context_length = getattr(opts, \"dataset.multi_modal_img_text.context_length\")\n        assert context_length is not None\n        return context_length\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        \"\"\"Add dataset-specific arguments to the parser.\"\"\"\n\n        if cls == BaseMultiModalImgText:\n            group = parser.add_argument_group(cls.__name__)\n\n            group.add_argument(\n                \"--dataset.multi-modal-img-text.context-length\",\n                type=int,\n                default=77,\n                help=\"Context length for the text model. Defaults to 77, the same as in the CLIP paper.\",\n            )\n            group.add_argument(\n                \"--dataset.multi-modal-img-text.padding-index\",\n                type=int,\n                default=None,\n                help=\"Padding index. Defaults to None.\",\n            )\n\n            group.add_argument(\n                \"--dataset.multi-modal-img-text.trunc-seq-len\",\n                action=\"store_true\",\n                default=False,\n                help=\"Many sequences in a batch do not have lengths equal to specified context length. Enabling this flag \"\n                \"allows us to truncate the sequences such that the sequence length of a batch is equal to sequence \"\n                \"with max. non-padded tokens. Defaults to False.\",\n            )\n\n        return parser\n\n    def _transform_text(self, text_tensor: Tensor) -> Tuple[Tensor, int]:\n        \"\"\"Helper function to transform the text tensor. If the text tensor is smaller\n        than the context length, it pads it with zeros and replaces the last token with EOT token.\n\n        Args:\n            text_tensor: Text tensor with N tokens. Shape is (N,).\n\n        Returns:\n            A Tuple of text tensor (whole length is equal to context length) and length of the tensor.\n\n        ...note:\n            1. If length of tokenized text is greater than context length, then it will be truncated.\n            2. If length of tokenized text is smaller than context length, then it is padded.\n        \"\"\"\n        captions_tensor = torch.zeros(size=(self.context_length,), dtype=torch.long)\n\n        text_len = text_tensor.shape[0]\n        if text_len > self.context_length:\n            text_tensor = text_tensor[: self.context_length]\n            text_tensor[-1] = self.text_tokenizer.eot_token_id\n            text_len = self.context_length\n        captions_tensor[:text_len] = text_tensor[:text_len]\n        return captions_tensor, text_len\n\n    def _training_transforms(\n        self, size: Tuple[int, int], *args, **kwargs\n    ) -> T.BaseTransformation:\n        \"\"\"Data augmentation during training.\n\n        The default order is RandomResizedCrop, Optional[RandAugment or AutoAugment], ToTensor, Optional[RandomErase]\n\n        Args:\n            size: Size for resizing the input image. Expected to be a tuple (height, width)\n\n        Returns:\n            An instance of `corenet.data.transforms.image_pil.BaseTransformation.`\n\n        .. note::\n            1. AutoAugment and RandAugment are mutually exclusive.\n            2. Mixup and CutMix are applied on batches are implemented in trainer.\n        \"\"\"\n        aug_list = [\n            T.RandomResizedCrop(opts=self.opts, size=size),\n        ]\n        auto_augment = getattr(\n            self.opts, \"image_augmentation.auto_augment.enable\", False\n        )\n        rand_augment = getattr(\n            self.opts, \"image_augmentation.rand_augment.enable\", False\n        )\n        if auto_augment and rand_augment:\n            logger.error(\n                \"AutoAugment and RandAugment are mutually exclusive. Use either of them, but not both\"\n            )\n        elif auto_augment:\n            aug_list.append(T.AutoAugment(opts=self.opts))\n        elif rand_augment:\n            aug_list.append(T.RandAugment(opts=self.opts))\n\n        aug_list.append(T.ToTensor(opts=self.opts))\n\n        if getattr(self.opts, \"image_augmentation.random_erase.enable\", False):\n            aug_list.append(T.RandomErasing(opts=self.opts))\n\n        return Compose(opts=self.opts, img_transforms=aug_list)\n\n    def _validation_transforms(\n        self, size: Union[Tuple, int], *args, **kwargs\n    ) -> T.BaseTransformation:\n        \"\"\"Data transforms during validation or evaluation\n         The order is Resize, CenterCrop, ToTensor\n\n         Args:\n            size: Size for resizing the input image. Expected to be an integer (width=height) or a tuple (height, width)\n\n        Returns:\n            An instance of `corenet.data.transforms.image_pil.BaseTransformation.`\n        \"\"\"\n        aug_list = [\n            T.Resize(opts=self.opts),\n            T.CenterCrop(opts=self.opts),\n            T.ToTensor(opts=self.opts),\n        ]\n\n        return Compose(opts=self.opts, img_transforms=aug_list)\n\n    def _process_img_caption(\n        self,\n        input_img: Image.Image,\n        captions_str: Union[str, List[str], List[List[str]]],\n        img_transform_fn: T.BaseTransformation,\n    ) -> Tuple[Tensor, Tensor, int]:\n        \"\"\"Apply data augmentation to images and pre-processing to text captions\n\n        Args:\n            input_img: Input PIL Image\n            captions_str: Text captions\n            img_transform_fn: Image transform functions\n\n        Returns:\n            A tuple of image tensor, caption tensor, and max. sequence length of a sequence in caption tensor.\n\n        ...note:\n            Zero-shot captions are the same for all images, so we cache them after tokenization during evaluation.\n            If tokenized cached captions are available, they are returned.\n        \"\"\"\n\n        data = {\"image\": input_img}\n        img_tensor = img_transform_fn(data)[\"image\"]\n\n        if (\n            hasattr(self, \"cached_zero_shot_captions\")\n            and self.cached_zero_shot_captions is not None\n        ):\n            # return the tokenized cached captions\n            return (\n                img_tensor,\n                self.cached_zero_shot_captions,\n                self.cached_max_seq_length,\n            )\n\n        max_seq_len = 0\n        # process caption\n        if isinstance(captions_str, str):\n            captions_tensor, max_seq_len = self._transform_text(\n                self.text_tokenizer(caption_preprocessing(captions_str))\n            )\n        elif isinstance(captions_str, List):\n            captions_tensor = []\n            for captions_str_i in captions_str:\n                if isinstance(captions_str_i, List):\n                    # captions_str is [ [Num_templates_per_class] * Num_classes]\n                    captions_tensor_i = []\n                    for captions_str_i_j in captions_str_i:\n                        seq, seq_len = self._transform_text(\n                            self.text_tokenizer(caption_preprocessing(captions_str_i_j))\n                        )\n                        captions_tensor_i.append(seq)\n                        max_seq_len = max(max_seq_len, seq_len)\n                    captions_tensor_i = torch.stack(captions_tensor_i, dim=0)\n                    captions_tensor.append(captions_tensor_i)\n                elif isinstance(captions_str_i, str):\n                    # captions_str is [Num_templates_per_image]\n                    seq, seq_len = self._transform_text(\n                        self.text_tokenizer(caption_preprocessing(captions_str_i))\n                    )\n                    captions_tensor.append(seq)\n                    max_seq_len = max(max_seq_len, seq_len)\n                else:\n                    logger.error(\n                        \"Got captions_str of type {}: {} from {}\".format(\n                            type(captions_str_i), captions_str_i, captions_str\n                        )\n                    )\n            # the shape of tensor is [Num_classes, captions_per_class, caption_length]\n            # or [Captions_per_image, caption_length]\n            captions_tensor = torch.stack(captions_tensor, dim=0)\n        else:\n            captions_tensor = None\n            logger.error(\n                \"Captions should be either string, List[String] or List[List[str]]\"\n            )\n\n        if (\n            hasattr(self, \"cached_zero_shot_captions\")\n            and self.cached_zero_shot_captions is None\n        ):\n            # Cache the tokenized captions during evaluation because they are the same for all images.\n            self.cached_zero_shot_captions = captions_tensor\n            self.cached_max_seq_length = max_seq_len\n\n        return img_tensor, captions_tensor, max_seq_len\n\n    def get_zero_shot_image_text_pair(\n        self, sample_index: int\n    ) -> Tuple[Image.Image, Union[str, List[str], List[List[str]]], int]:\n        \"\"\"Get image-text pair for zero-shot dataset along with classification label.\n\n        Args:\n            sample_index: Sample index\n\n        Returns:\n            A tuple of PIL image, captions, and class label\n        \"\"\"\n        assert (\n            self.dataset is not None\n        ), f\"For zero-shot image-classification datasets, {self.dataset} should not be None.\"\n        img_path, captions_str, class_label = self.dataset[sample_index]\n        input_img = self.read_image_pil(img_path)\n        return input_img, captions_str, class_label\n\n    def get_image_text_dataset_pair(self, sample_index: int) -> Tuple[Image.Image, str]:\n        \"\"\"Get image and text caption pair from the noisy image-text dataset. Sub-classes may implement\n        this method to use '__getitem__' of BaseMultiModalImgText class.\"\"\"\n        raise NotImplementedError(\n            f\"Child classes may implement this function to use '__getitem__' of {self.__class__.__name__}.\"\n        )\n\n    def __getitem__(\n        self, sample_size_and_index: Tuple[int, int, int]\n    ) -> Mapping[str, Union[Tensor, Mapping[str, Tensor]]]:\n        \"\"\"Returns the sample corresponding to the input sample index.\n\n        Returned sample is transformed into the size specified by the input.\n\n        Args:\n            sample_size_and_index: Tuple of the form (crop_size_h, crop_size_w, sample_index)\n\n        Returns:\n            A dictionary with `samples` and `targets` as keys corresponding to input and label of\n            a sample, respectively.\n\n        Shapes:\n            The shape of values in output dictionary, output_data, are as follows:\n\n            output_data[\"samples\"][\"image\"]: Shape is [Channels, Height, Width]\n            output_data[\"samples\"][\"text\"]: Shape is\n                * [Context_Length] (single caption, as in CLIP datasets)\n                * [Num_classes, Num_Captions, Context_length] (multiple captions per class, as in 0-shot Imagenet dataset)\n            output_data[\"samples\"][\"padding_mask\"]: Same as output_data[\"samples\"][\"text\"]\n            output_data[\"samples\"][\"max_seq_len\"]: Shape is [1]\n            output_data[\"targets\"]: Shape is [1]\n        \"\"\"\n        crop_size_h, crop_size_w, sample_index = sample_size_and_index\n        transform_fn = self.get_augmentation_transforms(size=(crop_size_h, crop_size_w))\n\n        if self.is_training:\n            # read captions and image path from image-text dataset.\n            input_img, captions_str = self.get_image_text_dataset_pair(sample_index)\n            # for image-text datasets, we do not have class labels. So, we set to -1.\n            class_label = -1\n        else:\n            # read captions and image path from zero-shot image classification dataset\n            input_img, captions_str, class_label = self.get_zero_shot_image_text_pair(\n                sample_index\n            )\n\n        (\n            img_tensor,\n            captions_tensor,\n            max_seq_len,\n        ) = self._process_img_caption(\n            input_img=input_img,\n            captions_str=captions_str,\n            img_transform_fn=transform_fn,\n        )\n\n        padding_mask = None\n        if self.padding_index is not None:\n            padding_mask = captions_tensor == self.padding_index\n\n        data = {\n            \"samples\": {\n                \"image\": img_tensor,\n                \"text\": captions_tensor,\n                \"padding_mask\": padding_mask,\n                \"max_seq_len\": max_seq_len,\n            },\n            \"targets\": class_label,\n            \"zero_shot\": not self.is_training,\n        }\n\n        return data\n\n    def __len__(self) -> int:\n        return len(self.dataset)\n\n    def __repr__(self) -> str:\n        if self.is_training:\n            return super().__repr__()\n        return self.dataset.__repr__()\n\n\n@COLLATE_FN_REGISTRY.register(name=\"multi_modal_img_text_collate_fn\")\ndef multi_modal_img_text_collate_fn(\n    batch: List[Mapping[str, Union[Tensor, Mapping[str, Tensor]]]],\n    opts: argparse.Namespace,\n) -> Mapping[str, Union[Tensor, Mapping[str, Tensor]]]:\n    \"\"\"Combines a list of dictionaries into a single dictionary by concatenating matching fields.\"\"\"\n    images = []\n    text_tokens = []\n    padding_mask = []\n    labels = []\n\n    truncate_seq_len = getattr(opts, \"dataset.multi_modal_img_text.trunc_seq_len\")\n\n    zero_shot = batch[0].pop(\"zero_shot\")\n\n    max_seq_len_in_batch = 1  # at least one token is required in the sequence\n    for i, batch_i in enumerate(batch):\n        inputs_i = batch_i.pop(\"samples\")\n        img_tensor = inputs_i.pop(\"image\")\n        if img_tensor is None:\n            continue\n        images.append(img_tensor)\n        labels.append(batch_i.pop(\"targets\"))\n\n        text_data = inputs_i.pop(\"text\")\n        pad_mask = inputs_i.pop(\"padding_mask\")\n        max_seq_len_in_batch = max(max_seq_len_in_batch, inputs_i.pop(\"max_seq_len\", 0))\n        if not zero_shot or (zero_shot and i == 0):\n            # For zero-shot, all text captions are the same\n            # so, we only aggregate for one batch element\n            text_tokens.append(text_data)\n            if pad_mask is not None:\n                padding_mask.append(pad_mask)\n\n    images = torch.stack(images, dim=0)\n    text_tokens = torch.stack(text_tokens, dim=0)\n\n    # truncate tokens based on the max. seq length\n    if not truncate_seq_len:\n        max_seq_len_in_batch = text_tokens.shape[-1]\n    text_tokens = text_tokens[..., :max_seq_len_in_batch]\n\n    if len(padding_mask) != 0:\n        padding_mask = torch.stack(padding_mask, dim=0)\n        padding_mask = padding_mask[..., :max_seq_len_in_batch]\n    else:\n        padding_mask = None\n\n    labels = torch.tensor(labels, dtype=torch.long)\n\n    channels_last = getattr(opts, \"common.channels_last\")\n    if channels_last:\n        images = images.to(memory_format=torch.channels_last)\n\n    return {\n        \"samples\": {\n            \"image\": images,\n            \"text\": text_tokens,\n            \"padding_mask\": padding_mask,\n        },\n        \"targets\": labels,\n    }\n"
  },
  {
    "path": "corenet/data/datasets/multi_modal_img_text/flickr.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport json\nimport os\nfrom typing import Dict, List, Tuple\n\nfrom corenet.data.datasets import DATASET_REGISTRY\nfrom corenet.data.datasets.multi_modal_img_text.base_multi_modal_img_text import (\n    BaseMultiModalImgText,\n)\n\n\n@DATASET_REGISTRY.register(name=\"flickr\", type=\"multi_modal_image_text\")\nclass FlickrDataset(BaseMultiModalImgText):\n    \"\"\"\n    Dataset loader for Flickr-30k and Flickr-8k datasets.\n\n    For more info see:\n        http://hockenmaier.cs.illinois.edu/8k-pictures.html\n        https://shannon.cs.illinois.edu/DenotationGraph/\n\n    Splits: train, val, and test\n        Also known in literature as Karpathy splits\n        https://cs.stanford.edu/people/karpathy/deepimagesent/\n\n    Tracking license info:\n        Captions have CC BY 3.0 license (see links above).\n        Splits are under BSD License (see Github of NeuralTalk by Karpathy et. al.).\n        Images are from Flickr. We do not own them and are only used for research purposes.\n    \"\"\"\n\n    def get_image_text_dataset(self) -> List[Dict[str, str]]:\n        \"\"\"\n        The data under `self.root` is expected to consist of:\n\n            dataset.json   # Karpathy splits + captions\n            images/        # Raw images\n\n        The metdatadata cap be downloaded from:\n            https://cs.stanford.edu/people/karpathy/deepimagesent/flickr30k.zip\n\n        Images can be obtained from:\n            Flickr-8k:  http://hockenmaier.cs.illinois.edu/8k-pictures.html\n            Flickr-30k: https://shannon.cs.illinois.edu/DenotationGraph/\n        \"\"\"\n        metadata_path = os.path.join(self.root, \"dataset.json\")\n        with open(metadata_path, \"r\") as metadata_file:\n            metadata = json.load(metadata_file)[\"images\"]\n\n        split = self.mode\n\n        samples = [\n            {\n                \"image_name\": sample[\"filename\"],\n                \"captions\": [x[\"raw\"] for x in sample[\"sentences\"]],\n            }\n            for sample in metadata\n            if sample[\"split\"] == split\n        ]\n\n        if self.is_training:\n            # For training, flatten the captions by copying each image multiple times\n            # This way at each epoch, each caption will be seen 1 time but each image\n            # will be seen #num_captions (= 5) times.\n            samples = [\n                {\"image_name\": sample[\"image_name\"], \"captions\": caption}\n                for sample in samples\n                for caption in sample[\"captions\"]\n            ]\n            # No need for shuffling, since dataloader takes care of it\n        return samples\n\n    def __getitem__(\n        self, sample_size_and_index: Tuple[int, int, int]\n    ) -> Dict[str, Dict]:\n        \"\"\"Return the sample given an index, a pre-specified height and width.\n\n        Args:\n            sample_size_and_index: Tuple of (crop size height, crop size width, image index)\n\n        Returns:\n            A dict like:\n            {\n                \"samples\": {\n                    \"image\": FloatTensor of shape [C, H, W] -> [B, C, H, W] after collate\n                    \"text\": LongTensor of shape\n                        if is_training: [num_tokens]  -> [B, T] after collate\n                        o.w.:           [num_captions, num_tokens] -> [B, N, T] after collate\n                    \"padding_mask\": Optional; same size as text\n                    \"max_seq_len\": int indicating the maximum caption length (T)\n                        Gets removed after collate\n                },\n                \"targets\": -1\n            }\n        \"\"\"\n        crop_size_h, crop_size_w, img_index = sample_size_and_index\n        crop_size = (crop_size_h, crop_size_w)\n\n        transform_fn = self.get_augmentation_transforms(size=crop_size)\n\n        sample = self.dataset[img_index]\n\n        img_path = os.path.join(self.root, \"images\", sample[\"image_name\"])\n        captions = sample[\"captions\"]\n\n        input_img = self.read_image_pil(img_path)\n\n        img_tensor, captions_tensor, max_seq_len = self._process_img_caption(\n            input_img=input_img,\n            captions_str=captions,\n            img_transform_fn=transform_fn,\n            zero_shot=self.zero_shot_dataset is not None,\n        )\n\n        data = {\n            \"samples\": {\n                \"image\": img_tensor,\n                \"text\": captions_tensor,\n                \"padding_mask\": (\n                    (captions_tensor == self.padding_index)\n                    if self.padding_index is not None\n                    else None\n                ),\n                \"max_seq_len\": max_seq_len,\n            },\n            \"targets\": -1,\n        }\n\n        return data\n"
  },
  {
    "path": "corenet/data/datasets/multi_modal_img_text/img_text_tar_dataset.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nimport fcntl\nimport glob\nimport io\nimport os\nimport pickle\nimport random\nimport shutil\nimport tarfile\nimport time\nfrom pathlib import Path\nfrom typing import Tuple\n\nimport pybase64\nfrom PIL import Image, ImageFile\n\nfrom corenet.data.datasets import DATASET_REGISTRY\nfrom corenet.data.datasets.multi_modal_img_text.base_multi_modal_img_text import (\n    BaseMultiModalImgText,\n)\nfrom corenet.utils import logger\nfrom corenet.utils.download_utils import get_local_path\n\n# To enable reading truncated images, we update the default values of following variables in PIL\nImage.MAX_IMAGE_PIXELS = None\nImageFile.LOAD_TRUNCATED_IMAGES = True\n\nTAR_FILE_EXTN = \"tar.gz\"\nTAR_FILE_EXTRACTION_CODE = \"r:gz\"\nSAMPLE_FILE_EXTN = \"pkl\"\n\n\n@DATASET_REGISTRY.register(name=\"img_text_tar\", type=\"multi_modal_image_text\")\nclass ImgTextTarDataset(BaseMultiModalImgText):\n    \"\"\"ImgTextTarDataset class for datasets that store Image-Text pairs as tar files, each tar file with multiple image-text pairs.\n\n    Assuming that dataset has 10M image-text pairs and each tar file can contains 10000 files, then we can create\n    1000 tar files. The first tar file, 0.tar.gz, would contain files from 0 to 9999, the second tar file, 1.tar.gz,\n    would contain files from 10000 to 19999, and so on.\n\n    With 'image_text_data' as the root directory, the expected structure for the training data would be:\n\n        image_text_data/\n        ├── metadata.pkl\n        ├── 0.tar.gz\n        ├── 1.tar.gz\n        ├── 2.tar.gz\n        ├── 3.tar.gz\n        ....\n        ├── 1000.tar.gz\n\n\n    The metadata is a dictionary containing information about the dataset, and is stored as a pickle file.\n    It should have following keys:\n        1. total_tar_files: Total number of tar files in the dataset\n        2. max_files_per_tar: Maximum number of files inside each tar file.\n        3. tar_file_names: List containing names of the tar files.\n\n    Each tar file contains the information about image-text files in the pickle format. For example, the content\n    after extracting '0.tar.gz' (assuming it contains 1000 pickle files) would look like this.\n\n        0/\n        ├── 0.pkl\n        │   ├── image\n        │   ├── text\n        ├── 1.pkl\n        ├── ...\n        ├── 9999.pkl\n\n    Each image-text pair is stored as a dictionary with 'image' and 'text' as keys in a pickle file. The value corresponding to key 'image' corresponds\n    to an image in binary format and the value corresponding to key 'text' corresponds to text caption.\n\n    ...note:\n        1. Recommended size of each tar file is about 1GB.\n        2. Metadata should be stored in the same folder as the tar files.\n        3. Metadata should be stored as a pickle file.\n        4. We assume that data is stored in S3. Please make appropriate changes for other storage clients.\n        5. We generally expect the same number of files per tar. However, due to filtering, the number of files\n           in a given tar could be below the expected number of files. In such cases, we over-sample from that tar file.\n\n    ...note:\n        For evaluation, we use standard image classification dataset. Please see 'BaseImageClassificationDataset' for expected dataset structure for classification datasets.\n    \"\"\"\n\n    def _metadata_file_path(self) -> str:\n        \"\"\"Read metadata file path from command-line arguments.\"\"\"\n        opts = self.opts\n\n        metadata_file_path = getattr(\n            opts, f\"dataset.multi_modal_img_text.img_text_tar.metadata_file\"\n        )\n\n        if not metadata_file_path:\n            logger.error(\n                f\"Please specify metadata file path using 'dataset.multi_modal_img_text.img_text_tar.metadata_file'.\"\n            )\n        return metadata_file_path\n\n    def _metadata(self):\n        \"\"\"Read the metadata content.\n\n        ...note:\n            The metadata file is expected to have following keys:\n            1. total_tar_files: Total number of tar files in the dataset\n            2. max_files_per_tar: Maximum number of files inside each tar file.\n            3. tar_file_names: List containing names of the tar files.\n        \"\"\"\n        opts = self.opts\n        metadata_file_path = self._metadata_file_path()\n\n        # download the metadata file\n        metadata_file_local_path = get_local_path(\n            opts,\n            path=metadata_file_path,\n            force_delete=False,\n            use_start_rank=True,\n            sync_ranks=False,\n        )\n\n        with open(metadata_file_local_path, \"rb\") as handle:\n            metadata = pickle.load(handle)\n\n        if not {\"total_tar_files\", \"max_files_per_tar\", \"tar_file_names\"}.issubset(\n            metadata.keys()\n        ):\n            logger.error(\n                f\"Metadata file in {self.__class__.__name__} should have following keys: \\\n                    total_tar_files, max_files_per_tar, tar_file_names\"\n            )\n        return metadata\n\n    @property\n    def total_tar_files(self) -> int:\n        \"\"\"Total number of tar files in the dataset.\"\"\"\n        metadata = self._metadata()\n        return metadata[\"total_tar_files\"]\n\n    @property\n    def max_files_per_tar(self) -> int:\n        \"\"\"Maximum number of files inside each tar file.\"\"\"\n        metadata = self._metadata()\n        return metadata[\"max_files_per_tar\"]\n\n    def get_image_text_dataset(self) -> None:\n        \"\"\"Override the parent class function to return nothing.\n\n        Because tar files are downloaded on-the-fly, so any dataset specific pre-processings are skipped here.\n        \"\"\"\n        pass\n\n    def _get_folder_index(self, sample_index) -> int:\n        \"\"\"Returns the index of the folder containing the file corresponding to the given sample index.\n\n        Args:\n            sample_index: Sample index.\n\n        Returns:\n            Folder index.\n\n        ...note:\n            Each folder is expected to contain a maximum of `max_files_per_tar` files.\n        \"\"\"\n        return sample_index // self.max_files_per_tar\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        \"\"\"Add ImgTextTarDataset dataset-specific arguments to the parser.\"\"\"\n        if cls == ImgTextTarDataset:\n            group = parser.add_argument_group(title=cls.__name__)\n\n            group.add_argument(\n                \"--dataset.multi-modal-img-text.img-text-tar.metadata-file\",\n                type=str,\n                default=None,\n                help=\"Location of the metadata file storing information about file indices and corresponding tar files. \"\n                \"Defaults to None.\",\n            )\n        return parser\n\n    def _download_and_extract_tar_file(self, sample_index: int) -> int:\n        \"\"\"Download and extract the tar file.\n\n        The tar files are pre-assumably stored in remote location (e.g., S3 bucket) and, if required, are downloaded and\n        extracted to local directory @self.cache_loc. Because of distributed and multi-process training, we first extract\n        them in the same location as downloaded, and then move to @self.cache_loc.\n\n        Args:\n            sample_index: Sample index.\n\n        Returns:\n            Index of the folder in which sample may be present.\n\n        ...note:\n            Each tar file may have samples less than @self.max_files_per_tar because of filtering criteria.\n        \"\"\"\n        # Retrieve the folder index that may contain the sample.\n        folder_idx = self._get_folder_index(sample_index)\n\n        metadata_file_path = self._metadata_file_path()\n        remote_directory = os.path.dirname(metadata_file_path)\n        remote_file_path = f\"{remote_directory}/{folder_idx}.{TAR_FILE_EXTN}\"\n\n        with open(\n            f\"{self.cache_loc}/{folder_idx}.{TAR_FILE_EXTN}.lock\", \"a\"\n        ) as lock_file:\n            try:\n                fcntl.flock(lock_file, fcntl.LOCK_EX)\n                if os.path.isdir(f\"{self.cache_loc}/{folder_idx}\"):\n                    return folder_idx\n\n                transfer_client = self._get_transfer_client(\n                    file_path=metadata_file_path\n                )\n\n                local_tar_file_path = transfer_client.download(\n                    remote_file_paths=remote_file_path, dst_dir=self.cache_loc\n                )\n\n                # extract the tar file in the same location where tar file is downloaded\n                tar_file_basename = os.path.basename(local_tar_file_path)\n                with tarfile.open(local_tar_file_path, TAR_FILE_EXTRACTION_CODE) as tar:\n                    tar.extractall(\n                        path=local_tar_file_path.replace(tar_file_basename, \"\")\n                    )\n\n                # move extracted tar file to @self.cache_loc\n                shutil.move(\n                    local_tar_file_path.replace(f\".{TAR_FILE_EXTN}\", \"\"), self.cache_loc\n                )\n\n                # Delete the tar file\n                if os.path.exists(local_tar_file_path):\n                    os.remove(local_tar_file_path)\n            finally:\n                fcntl.flock(lock_file, fcntl.LOCK_UN)\n\n        return folder_idx\n\n    def get_image_text_dataset_pair(self, sample_index: int) -> Tuple[Image.Image, str]:\n        \"\"\"Get image-text pair from the dataset.\n\n        Args:\n            sample_index: Sample index.\n\n        Returns:\n            Returns a tuple of image and text caption for a given sample index.\n        \"\"\"\n\n        # Check if this folder exists. If not, then download the tar file and extract it.\n        folder_idx = self._download_and_extract_tar_file(sample_index=sample_index)\n\n        file_name = f\"{self.cache_loc}/{folder_idx}/{sample_index}.{SAMPLE_FILE_EXTN}\"\n        if not Path(file_name).exists():\n            # Each tar file is supposed to have certain number of samples, but\n            # it may not have all samples (because some samples may be corrupted and are filtered).\n            # Therefore, if file does not exist, we randomly sample the file from a folder and return its content.\n            # This helps in avoiding errors related to tensor mismatch shapes (usually arises when each GPU has different batch size)\n            # when gathering the image and text embeddings from all GPUs in contrastive loss.\n            files_in_folder = glob.glob(\n                f\"{self.cache_loc}/{folder_idx}/*.{SAMPLE_FILE_EXTN}\"\n            )\n            assert len(files_in_folder) > 0\n            file_name = random.choice(files_in_folder)\n\n        with open(file_name, \"rb\") as handle:\n            data = pickle.load(handle)\n        img_bytes = pybase64.b64decode(data[\"image\"], validate=True)\n        image = Image.open(io.BytesIO(img_bytes)).convert(\"RGBA\").convert(\"RGB\")\n        if \"texts\" in data:\n            caption_str = data[\"texts\"]\n        elif \"text\" in data:\n            caption_str = data[\"text\"]\n        else:\n            raise NotImplementedError(\"Text key not found.\")\n\n        return image, caption_str\n\n    def __len__(self) -> int:\n        \"\"\"Number of samples in the dataset.\n\n        The dataset comprises of multiple tar files, with each tar file containing 'max_files_per_tar'. Therefore,\n        the dataset could have maximum of @total_tar_files * @max_files_per_tar samples.\n\n        ...note:\n            For evaluation, we use standard image classification datasets. Therefore, during evaluation, we return length of such\n            datasets.\n        \"\"\"\n        if self.is_training:\n            return self.total_tar_files * self.max_files_per_tar\n        else:\n            return super().__len__()\n\n    def extra_repr(self) -> str:\n        extra_repr_str = super().extra_repr()\n        return (\n            extra_repr_str + f\"\\n\\tnum_tar_files={self.total_tar_files}\"\n            f\"\\n\\tmax_files_per_tar={self.max_files_per_tar}\"\n            f\"\\n\\tpadding_index={self.padding_index}\"\n        )\n"
  },
  {
    "path": "corenet/data/datasets/multi_modal_img_text/zero_shot_image_classification/__init__.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\n\nfrom corenet.data.datasets.multi_modal_img_text.zero_shot_image_classification.base_zero_shot_image_classification import (\n    BaseZeroShotImageClassificationDataset,\n)\nfrom corenet.utils.registry import Registry\n\nZERO_SHOT_IMAGE_CLASSIFICATION_DATASET_REGISTRY = Registry(\n    registry_name=\"zero_shot_datasets\",\n    base_class=BaseZeroShotImageClassificationDataset,\n    lazy_load_dirs=[\n        \"corenet/data/datasets/multi_modal_img_text/zero_shot_image_classification\"\n    ],\n    internal_dirs=[\"corenet/internal\", \"corenet/internal/projects/*\"],\n)\n\n\ndef arguments_zero_shot_image_classification_dataset(\n    parser: argparse.ArgumentParser,\n) -> argparse.ArgumentParser:\n    \"\"\"Helper function to get zero-shot dataset arguments\"\"\"\n    parser = BaseZeroShotImageClassificationDataset.add_arguments(parser=parser)\n    parser = ZERO_SHOT_IMAGE_CLASSIFICATION_DATASET_REGISTRY.all_arguments(parser)\n    return parser\n\n\ndef build_zero_shot_image_classification_dataset(\n    opts: argparse.Namespace, *args, **kwargs\n) -> BaseZeroShotImageClassificationDataset:\n    \"\"\"Helper function to build the zero shot image classification dataset.\"\"\"\n    zero_shot_dataset_name = getattr(\n        opts, \"dataset.multi_modal_img_text.zero_shot_img_cls_dataset_name\"\n    )\n    return ZERO_SHOT_IMAGE_CLASSIFICATION_DATASET_REGISTRY[zero_shot_dataset_name](\n        opts, *args, **kwargs\n    )\n"
  },
  {
    "path": "corenet/data/datasets/multi_modal_img_text/zero_shot_image_classification/base_zero_shot_image_classification.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nfrom typing import List, Tuple\n\nfrom corenet.data.datasets.classification.base_image_classification_dataset import (\n    BaseImageClassificationDataset,\n)\nfrom corenet.data.datasets.multi_modal_img_text.zero_shot_image_classification.templates import (\n    generate_text_prompts_clip,\n)\n\n\nclass BaseZeroShotImageClassificationDataset(BaseImageClassificationDataset):\n    \"\"\"Base dataset class for zero shot image classification tasks.\n\n    ...note:\n        The directory structure for zero-shot image classification datasets should be the same\n        as the image classification datasets. See 'BaseImageClassificationDataset' for more details.\n    \"\"\"\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        if cls == BaseZeroShotImageClassificationDataset:\n            group = parser.add_argument_group(cls.__name__)\n\n            group.add_argument(\n                \"--dataset.multi-modal-img-text.zero-shot-img-cls-dataset-name\",\n                type=str,\n                default=None,\n                help=\"Name of the dataset for zero-shot image classification evaluation. Defaults to None.\",\n            )\n        return parser\n\n    def __getitem__(self, img_index: int) -> Tuple[str, List[List[str]], int]:\n        \"\"\"Returns image path and text templates for a given image index.\n\n        Args:\n            img_index: Index of the image.\n\n        Returns:\n            Tuple containing image path, list of captions, and image label\n        \"\"\"\n        img_path, image_label = self.samples[img_index]\n        return img_path, self.text_prompts, image_label\n\n    @property\n    def class_names(self) -> List[str]:\n        \"\"\"Returns the list containing the name of the classes in the dataset.\n\n        The order of class names in the returned list determine the numerical class\n        label.\n        \"\"\"\n        raise NotImplementedError(\n            \"Sub-classes should define `class_names` that returns the list of class\"\n            \" names in the order of class labels.\"\n        )\n\n    @property\n    def text_prompts(self) -> List[List[str]]:\n        \"\"\"Generates text prompts.\n\n        A nested list that represents prompts for multiple classes is returned. Each inner list contains\n        a list of prompts for a specific class.\n        \"\"\"\n        class_names = self.class_names\n        text_prompts = []\n        for class_name in class_names:\n            text_prompts.append(self.generate_text_prompts(class_name.lower()))\n        return text_prompts\n\n    def generate_text_prompts(self, class_name: str) -> List[str]:\n        \"\"\"Return a list of prompts for the given class name.\"\"\"\n        return generate_text_prompts_clip(class_name)\n"
  },
  {
    "path": "corenet/data/datasets/multi_modal_img_text/zero_shot_image_classification/imagenet.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nfrom typing import List\n\nfrom corenet.data.datasets.multi_modal_img_text.zero_shot_image_classification import (\n    ZERO_SHOT_IMAGE_CLASSIFICATION_DATASET_REGISTRY,\n    BaseZeroShotImageClassificationDataset,\n)\nfrom corenet.data.datasets.multi_modal_img_text.zero_shot_image_classification.imagenet_class_names import (\n    IMAGENET_CLASS_NAMES,\n)\n\n\n@ZERO_SHOT_IMAGE_CLASSIFICATION_DATASET_REGISTRY.register(name=\"imagenet\")\nclass ImageNetDatasetZeroShot(BaseZeroShotImageClassificationDataset):\n    \"\"\"ImageNet dataset for zero-shot evaluation of image-text models.\"\"\"\n\n    @property\n    def class_names(self) -> List[str]:\n        \"\"\"Return the name of the classes present in the dataset.\"\"\"\n        return IMAGENET_CLASS_NAMES\n"
  },
  {
    "path": "corenet/data/datasets/multi_modal_img_text/zero_shot_image_classification/imagenet_a.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom typing import List\n\nfrom corenet.data.datasets.classification.imagenet_a import (\n    IMAGENET_A_CLASS_SUBLIST,\n    ImageNetADataset,\n)\nfrom corenet.data.datasets.multi_modal_img_text.zero_shot_image_classification import (\n    ZERO_SHOT_IMAGE_CLASSIFICATION_DATASET_REGISTRY,\n)\nfrom corenet.data.datasets.multi_modal_img_text.zero_shot_image_classification.base_zero_shot_image_classification import (\n    BaseZeroShotImageClassificationDataset,\n)\nfrom corenet.data.datasets.multi_modal_img_text.zero_shot_image_classification.imagenet_class_names import (\n    IMAGENET_CLASS_NAMES,\n)\n\n\n@ZERO_SHOT_IMAGE_CLASSIFICATION_DATASET_REGISTRY.register(name=\"imagenet_a\")\nclass ImageNetADatasetZeroShot(BaseZeroShotImageClassificationDataset):\n    \"\"\"ImageNetA Dataset for zero-shot evaluation of Image-text models.\"\"\"\n\n    @property\n    def class_names(self) -> List[str]:\n        \"\"\"Return the name of the classes present in the dataset.\"\"\"\n\n        return [\n            IMAGENET_CLASS_NAMES[ImageNetADataset.class_id_to_imagenet_class_id(i)]\n            for i in range(len(IMAGENET_A_CLASS_SUBLIST))\n        ]\n"
  },
  {
    "path": "corenet/data/datasets/multi_modal_img_text/zero_shot_image_classification/imagenet_class_names.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\n\nIMAGENET_CLASS_NAMES = [\n    \"tench\",\n    \"goldfish\",\n    \"great white shark\",\n    \"tiger shark\",\n    \"hammerhead shark\",\n    \"electric ray\",\n    \"stingray\",\n    \"rooster\",\n    \"hen\",\n    \"ostrich\",\n    \"brambling\",\n    \"goldfinch\",\n    \"house finch\",\n    \"junco\",\n    \"indigo bunting\",\n    \"American robin\",\n    \"bulbul\",\n    \"jay\",\n    \"magpie\",\n    \"chickadee\",\n    \"American dipper\",\n    \"kite (bird of prey)\",\n    \"bald eagle\",\n    \"vulture\",\n    \"great grey owl\",\n    \"fire salamander\",\n    \"smooth newt\",\n    \"newt\",\n    \"spotted salamander\",\n    \"axolotl\",\n    \"American bullfrog\",\n    \"tree frog\",\n    \"tailed frog\",\n    \"loggerhead sea turtle\",\n    \"leatherback sea turtle\",\n    \"mud turtle\",\n    \"terrapin\",\n    \"box turtle\",\n    \"banded gecko\",\n    \"green iguana\",\n    \"Carolina anole\",\n    \"desert grassland whiptail lizard\",\n    \"agama\",\n    \"frilled-necked lizard\",\n    \"alligator lizard\",\n    \"Gila monster\",\n    \"European green lizard\",\n    \"chameleon\",\n    \"Komodo dragon\",\n    \"Nile crocodile\",\n    \"American alligator\",\n    \"triceratops\",\n    \"worm snake\",\n    \"ring-necked snake\",\n    \"eastern hog-nosed snake\",\n    \"smooth green snake\",\n    \"kingsnake\",\n    \"garter snake\",\n    \"water snake\",\n    \"vine snake\",\n    \"night snake\",\n    \"boa constrictor\",\n    \"African rock python\",\n    \"Indian cobra\",\n    \"green mamba\",\n    \"sea snake\",\n    \"Saharan horned viper\",\n    \"eastern diamondback rattlesnake\",\n    \"sidewinder rattlesnake\",\n    \"trilobite\",\n    \"harvestman\",\n    \"scorpion\",\n    \"yellow garden spider\",\n    \"barn spider\",\n    \"European garden spider\",\n    \"southern black widow\",\n    \"tarantula\",\n    \"wolf spider\",\n    \"tick\",\n    \"centipede\",\n    \"black grouse\",\n    \"ptarmigan\",\n    \"ruffed grouse\",\n    \"prairie grouse\",\n    \"peafowl\",\n    \"quail\",\n    \"partridge\",\n    \"african grey parrot\",\n    \"macaw\",\n    \"sulphur-crested cockatoo\",\n    \"lorikeet\",\n    \"coucal\",\n    \"bee eater\",\n    \"hornbill\",\n    \"hummingbird\",\n    \"jacamar\",\n    \"toucan\",\n    \"duck\",\n    \"red-breasted merganser\",\n    \"goose\",\n    \"black swan\",\n    \"tusker\",\n    \"echidna\",\n    \"platypus\",\n    \"wallaby\",\n    \"koala\",\n    \"wombat\",\n    \"jellyfish\",\n    \"sea anemone\",\n    \"brain coral\",\n    \"flatworm\",\n    \"nematode\",\n    \"conch\",\n    \"snail\",\n    \"slug\",\n    \"sea slug\",\n    \"chiton\",\n    \"chambered nautilus\",\n    \"Dungeness crab\",\n    \"rock crab\",\n    \"fiddler crab\",\n    \"red king crab\",\n    \"American lobster\",\n    \"spiny lobster\",\n    \"crayfish\",\n    \"hermit crab\",\n    \"isopod\",\n    \"white stork\",\n    \"black stork\",\n    \"spoonbill\",\n    \"flamingo\",\n    \"little blue heron\",\n    \"great egret\",\n    \"bittern bird\",\n    \"crane bird\",\n    \"limpkin\",\n    \"common gallinule\",\n    \"American coot\",\n    \"bustard\",\n    \"ruddy turnstone\",\n    \"dunlin\",\n    \"common redshank\",\n    \"dowitcher\",\n    \"oystercatcher\",\n    \"pelican\",\n    \"king penguin\",\n    \"albatross\",\n    \"grey whale\",\n    \"killer whale\",\n    \"dugong\",\n    \"sea lion\",\n    \"Chihuahua\",\n    \"Japanese Chin\",\n    \"Maltese\",\n    \"Pekingese\",\n    \"Shih Tzu\",\n    \"King Charles Spaniel\",\n    \"Papillon\",\n    \"toy terrier\",\n    \"Rhodesian Ridgeback\",\n    \"Afghan Hound\",\n    \"Basset Hound\",\n    \"Beagle\",\n    \"Bloodhound\",\n    \"Bluetick Coonhound\",\n    \"Black and Tan Coonhound\",\n    \"Treeing Walker Coonhound\",\n    \"English foxhound\",\n    \"Redbone Coonhound\",\n    \"borzoi\",\n    \"Irish Wolfhound\",\n    \"Italian Greyhound\",\n    \"Whippet\",\n    \"Ibizan Hound\",\n    \"Norwegian Elkhound\",\n    \"Otterhound\",\n    \"Saluki\",\n    \"Scottish Deerhound\",\n    \"Weimaraner\",\n    \"Staffordshire Bull Terrier\",\n    \"American Staffordshire Terrier\",\n    \"Bedlington Terrier\",\n    \"Border Terrier\",\n    \"Kerry Blue Terrier\",\n    \"Irish Terrier\",\n    \"Norfolk Terrier\",\n    \"Norwich Terrier\",\n    \"Yorkshire Terrier\",\n    \"Wire Fox Terrier\",\n    \"Lakeland Terrier\",\n    \"Sealyham Terrier\",\n    \"Airedale Terrier\",\n    \"Cairn Terrier\",\n    \"Australian Terrier\",\n    \"Dandie Dinmont Terrier\",\n    \"Boston Terrier\",\n    \"Miniature Schnauzer\",\n    \"Giant Schnauzer\",\n    \"Standard Schnauzer\",\n    \"Scottish Terrier\",\n    \"Tibetan Terrier\",\n    \"Australian Silky Terrier\",\n    \"Soft-coated Wheaten Terrier\",\n    \"West Highland White Terrier\",\n    \"Lhasa Apso\",\n    \"Flat-Coated Retriever\",\n    \"Curly-coated Retriever\",\n    \"Golden Retriever\",\n    \"Labrador Retriever\",\n    \"Chesapeake Bay Retriever\",\n    \"German Shorthaired Pointer\",\n    \"Vizsla\",\n    \"English Setter\",\n    \"Irish Setter\",\n    \"Gordon Setter\",\n    \"Brittany dog\",\n    \"Clumber Spaniel\",\n    \"English Springer Spaniel\",\n    \"Welsh Springer Spaniel\",\n    \"Cocker Spaniel\",\n    \"Sussex Spaniel\",\n    \"Irish Water Spaniel\",\n    \"Kuvasz\",\n    \"Schipperke\",\n    \"Groenendael dog\",\n    \"Malinois\",\n    \"Briard\",\n    \"Australian Kelpie\",\n    \"Komondor\",\n    \"Old English Sheepdog\",\n    \"Shetland Sheepdog\",\n    \"collie\",\n    \"Border Collie\",\n    \"Bouvier des Flandres dog\",\n    \"Rottweiler\",\n    \"German Shepherd Dog\",\n    \"Dobermann\",\n    \"Miniature Pinscher\",\n    \"Greater Swiss Mountain Dog\",\n    \"Bernese Mountain Dog\",\n    \"Appenzeller Sennenhund\",\n    \"Entlebucher Sennenhund\",\n    \"Boxer\",\n    \"Bullmastiff\",\n    \"Tibetan Mastiff\",\n    \"French Bulldog\",\n    \"Great Dane\",\n    \"St. Bernard\",\n    \"husky\",\n    \"Alaskan Malamute\",\n    \"Siberian Husky\",\n    \"Dalmatian\",\n    \"Affenpinscher\",\n    \"Basenji\",\n    \"pug\",\n    \"Leonberger\",\n    \"Newfoundland dog\",\n    \"Great Pyrenees dog\",\n    \"Samoyed\",\n    \"Pomeranian\",\n    \"Chow Chow\",\n    \"Keeshond\",\n    \"brussels griffon\",\n    \"Pembroke Welsh Corgi\",\n    \"Cardigan Welsh Corgi\",\n    \"Toy Poodle\",\n    \"Miniature Poodle\",\n    \"Standard Poodle\",\n    \"Mexican hairless dog (xoloitzcuintli)\",\n    \"grey wolf\",\n    \"Alaskan tundra wolf\",\n    \"red wolf or maned wolf\",\n    \"coyote\",\n    \"dingo\",\n    \"dhole\",\n    \"African wild dog\",\n    \"hyena\",\n    \"red fox\",\n    \"kit fox\",\n    \"Arctic fox\",\n    \"grey fox\",\n    \"tabby cat\",\n    \"tiger cat\",\n    \"Persian cat\",\n    \"Siamese cat\",\n    \"Egyptian Mau\",\n    \"cougar\",\n    \"lynx\",\n    \"leopard\",\n    \"snow leopard\",\n    \"jaguar\",\n    \"lion\",\n    \"tiger\",\n    \"cheetah\",\n    \"brown bear\",\n    \"American black bear\",\n    \"polar bear\",\n    \"sloth bear\",\n    \"mongoose\",\n    \"meerkat\",\n    \"tiger beetle\",\n    \"ladybug\",\n    \"ground beetle\",\n    \"longhorn beetle\",\n    \"leaf beetle\",\n    \"dung beetle\",\n    \"rhinoceros beetle\",\n    \"weevil\",\n    \"fly\",\n    \"bee\",\n    \"ant\",\n    \"grasshopper\",\n    \"cricket insect\",\n    \"stick insect\",\n    \"cockroach\",\n    \"praying mantis\",\n    \"cicada\",\n    \"leafhopper\",\n    \"lacewing\",\n    \"dragonfly\",\n    \"damselfly\",\n    \"red admiral butterfly\",\n    \"ringlet butterfly\",\n    \"monarch butterfly\",\n    \"small white butterfly\",\n    \"sulphur butterfly\",\n    \"gossamer-winged butterfly\",\n    \"starfish\",\n    \"sea urchin\",\n    \"sea cucumber\",\n    \"cottontail rabbit\",\n    \"hare\",\n    \"Angora rabbit\",\n    \"hamster\",\n    \"porcupine\",\n    \"fox squirrel\",\n    \"marmot\",\n    \"beaver\",\n    \"guinea pig\",\n    \"common sorrel horse\",\n    \"zebra\",\n    \"pig\",\n    \"wild boar\",\n    \"warthog\",\n    \"hippopotamus\",\n    \"ox\",\n    \"water buffalo\",\n    \"bison\",\n    \"ram (adult male sheep)\",\n    \"bighorn sheep\",\n    \"Alpine ibex\",\n    \"hartebeest\",\n    \"impala (antelope)\",\n    \"gazelle\",\n    \"arabian camel\",\n    \"llama\",\n    \"weasel\",\n    \"mink\",\n    \"European polecat\",\n    \"black-footed ferret\",\n    \"otter\",\n    \"skunk\",\n    \"badger\",\n    \"armadillo\",\n    \"three-toed sloth\",\n    \"orangutan\",\n    \"gorilla\",\n    \"chimpanzee\",\n    \"gibbon\",\n    \"siamang\",\n    \"guenon\",\n    \"patas monkey\",\n    \"baboon\",\n    \"macaque\",\n    \"langur\",\n    \"black-and-white colobus\",\n    \"proboscis monkey\",\n    \"marmoset\",\n    \"white-headed capuchin\",\n    \"howler monkey\",\n    \"titi monkey\",\n    \"Geoffroy's spider monkey\",\n    \"common squirrel monkey\",\n    \"ring-tailed lemur\",\n    \"indri\",\n    \"Asian elephant\",\n    \"African bush elephant\",\n    \"red panda\",\n    \"giant panda\",\n    \"snoek fish\",\n    \"eel\",\n    \"silver salmon\",\n    \"rock beauty fish\",\n    \"clownfish\",\n    \"sturgeon\",\n    \"gar fish\",\n    \"lionfish\",\n    \"pufferfish\",\n    \"abacus\",\n    \"abaya\",\n    \"academic gown\",\n    \"accordion\",\n    \"acoustic guitar\",\n    \"aircraft carrier\",\n    \"airliner\",\n    \"airship\",\n    \"altar\",\n    \"ambulance\",\n    \"amphibious vehicle\",\n    \"analog clock\",\n    \"apiary\",\n    \"apron\",\n    \"trash can\",\n    \"assault rifle\",\n    \"backpack\",\n    \"bakery\",\n    \"balance beam\",\n    \"balloon\",\n    \"ballpoint pen\",\n    \"Band-Aid\",\n    \"banjo\",\n    \"baluster / handrail\",\n    \"barbell\",\n    \"barber chair\",\n    \"barbershop\",\n    \"barn\",\n    \"barometer\",\n    \"barrel\",\n    \"wheelbarrow\",\n    \"baseball\",\n    \"basketball\",\n    \"bassinet\",\n    \"bassoon\",\n    \"swimming cap\",\n    \"bath towel\",\n    \"bathtub\",\n    \"station wagon\",\n    \"lighthouse\",\n    \"beaker\",\n    \"military hat (bearskin or shako)\",\n    \"beer bottle\",\n    \"beer glass\",\n    \"bell tower\",\n    \"baby bib\",\n    \"tandem bicycle\",\n    \"bikini\",\n    \"ring binder\",\n    \"binoculars\",\n    \"birdhouse\",\n    \"boathouse\",\n    \"bobsleigh\",\n    \"bolo tie\",\n    \"poke bonnet\",\n    \"bookcase\",\n    \"bookstore\",\n    \"bottle cap\",\n    \"hunting bow\",\n    \"bow tie\",\n    \"brass memorial plaque\",\n    \"bra\",\n    \"breakwater\",\n    \"breastplate\",\n    \"broom\",\n    \"bucket\",\n    \"buckle\",\n    \"bulletproof vest\",\n    \"high-speed train\",\n    \"butcher shop\",\n    \"taxicab\",\n    \"cauldron\",\n    \"candle\",\n    \"cannon\",\n    \"canoe\",\n    \"can opener\",\n    \"cardigan\",\n    \"car mirror\",\n    \"carousel\",\n    \"tool kit\",\n    \"cardboard box / carton\",\n    \"car wheel\",\n    \"automated teller machine\",\n    \"cassette\",\n    \"cassette player\",\n    \"castle\",\n    \"catamaran\",\n    \"CD player\",\n    \"cello\",\n    \"mobile phone\",\n    \"chain\",\n    \"chain-link fence\",\n    \"chain mail\",\n    \"chainsaw\",\n    \"storage chest\",\n    \"chiffonier\",\n    \"bell or wind chime\",\n    \"china cabinet\",\n    \"Christmas stocking\",\n    \"church\",\n    \"movie theater\",\n    \"cleaver\",\n    \"cliff dwelling\",\n    \"cloak\",\n    \"clogs\",\n    \"cocktail shaker\",\n    \"coffee mug\",\n    \"coffeemaker\",\n    \"spiral or coil\",\n    \"combination lock\",\n    \"computer keyboard\",\n    \"candy store\",\n    \"container ship\",\n    \"convertible\",\n    \"corkscrew\",\n    \"cornet\",\n    \"cowboy boot\",\n    \"cowboy hat\",\n    \"cradle\",\n    \"construction crane\",\n    \"crash helmet\",\n    \"crate\",\n    \"infant bed\",\n    \"Crock Pot\",\n    \"croquet ball\",\n    \"crutch\",\n    \"cuirass\",\n    \"dam\",\n    \"desk\",\n    \"desktop computer\",\n    \"rotary dial telephone\",\n    \"diaper\",\n    \"digital clock\",\n    \"digital watch\",\n    \"dining table\",\n    \"dishcloth\",\n    \"dishwasher\",\n    \"disc brake\",\n    \"dock\",\n    \"dog sled\",\n    \"dome\",\n    \"doormat\",\n    \"drilling rig\",\n    \"drum\",\n    \"drumstick\",\n    \"dumbbell\",\n    \"Dutch oven\",\n    \"electric fan\",\n    \"electric guitar\",\n    \"electric locomotive\",\n    \"entertainment center\",\n    \"envelope\",\n    \"espresso machine\",\n    \"face powder\",\n    \"feather boa\",\n    \"filing cabinet\",\n    \"fireboat\",\n    \"fire truck\",\n    \"fire screen\",\n    \"flagpole\",\n    \"flute\",\n    \"folding chair\",\n    \"football helmet\",\n    \"forklift\",\n    \"fountain\",\n    \"fountain pen\",\n    \"four-poster bed\",\n    \"freight car\",\n    \"French horn\",\n    \"frying pan\",\n    \"fur coat\",\n    \"garbage truck\",\n    \"gas mask or respirator\",\n    \"gas pump\",\n    \"goblet\",\n    \"go-kart\",\n    \"golf ball\",\n    \"golf cart\",\n    \"gondola\",\n    \"gong\",\n    \"gown\",\n    \"grand piano\",\n    \"greenhouse\",\n    \"radiator grille\",\n    \"grocery store\",\n    \"guillotine\",\n    \"hair clip\",\n    \"hair spray\",\n    \"half-track\",\n    \"hammer\",\n    \"hamper\",\n    \"hair dryer\",\n    \"hand-held computer\",\n    \"handkerchief\",\n    \"hard disk drive\",\n    \"harmonica\",\n    \"harp\",\n    \"combine harvester\",\n    \"hatchet\",\n    \"holster\",\n    \"home theater\",\n    \"honeycomb\",\n    \"hook\",\n    \"hoop skirt\",\n    \"gymnastic horizontal bar\",\n    \"horse-drawn vehicle\",\n    \"hourglass\",\n    \"iPod\",\n    \"clothes iron\",\n    \"carved pumpkin\",\n    \"jeans\",\n    \"jeep\",\n    \"T-shirt\",\n    \"jigsaw puzzle\",\n    \"rickshaw\",\n    \"joystick\",\n    \"kimono\",\n    \"knee pad\",\n    \"knot\",\n    \"lab coat\",\n    \"ladle\",\n    \"lampshade\",\n    \"laptop computer\",\n    \"lawn mower\",\n    \"lens cap\",\n    \"letter opener\",\n    \"library\",\n    \"lifeboat\",\n    \"lighter\",\n    \"limousine\",\n    \"ocean liner\",\n    \"lipstick\",\n    \"slip-on shoe\",\n    \"lotion\",\n    \"music speaker\",\n    \"loupe magnifying glass\",\n    \"sawmill\",\n    \"magnetic compass\",\n    \"messenger bag\",\n    \"mailbox\",\n    \"tights\",\n    \"one-piece bathing suit\",\n    \"manhole cover\",\n    \"maraca\",\n    \"marimba\",\n    \"mask\",\n    \"matchstick\",\n    \"maypole\",\n    \"maze\",\n    \"measuring cup\",\n    \"medicine cabinet\",\n    \"megalith\",\n    \"microphone\",\n    \"microwave oven\",\n    \"military uniform\",\n    \"milk can\",\n    \"minibus\",\n    \"miniskirt\",\n    \"minivan\",\n    \"missile\",\n    \"mitten\",\n    \"mixing bowl\",\n    \"mobile home\",\n    \"ford model t\",\n    \"modem\",\n    \"monastery\",\n    \"monitor\",\n    \"moped\",\n    \"mortar and pestle\",\n    \"graduation cap\",\n    \"mosque\",\n    \"mosquito net\",\n    \"vespa\",\n    \"mountain bike\",\n    \"tent\",\n    \"computer mouse\",\n    \"mousetrap\",\n    \"moving van\",\n    \"muzzle\",\n    \"metal nail\",\n    \"neck brace\",\n    \"necklace\",\n    \"baby pacifier\",\n    \"notebook computer\",\n    \"obelisk\",\n    \"oboe\",\n    \"ocarina\",\n    \"odometer\",\n    \"oil filter\",\n    \"pipe organ\",\n    \"oscilloscope\",\n    \"overskirt\",\n    \"bullock cart\",\n    \"oxygen mask\",\n    \"product packet / packaging\",\n    \"paddle\",\n    \"paddle wheel\",\n    \"padlock\",\n    \"paintbrush\",\n    \"pajamas\",\n    \"palace\",\n    \"pan flute\",\n    \"paper towel\",\n    \"parachute\",\n    \"parallel bars\",\n    \"park bench\",\n    \"parking meter\",\n    \"railroad car\",\n    \"patio\",\n    \"payphone\",\n    \"pedestal\",\n    \"pencil case\",\n    \"pencil sharpener\",\n    \"perfume\",\n    \"Petri dish\",\n    \"photocopier\",\n    \"plectrum\",\n    \"Pickelhaube\",\n    \"picket fence\",\n    \"pickup truck\",\n    \"pier\",\n    \"piggy bank\",\n    \"pill bottle\",\n    \"pillow\",\n    \"ping-pong ball\",\n    \"pinwheel\",\n    \"pirate ship\",\n    \"drink pitcher\",\n    \"block plane\",\n    \"planetarium\",\n    \"plastic bag\",\n    \"plate rack\",\n    \"farm plow\",\n    \"plunger\",\n    \"Polaroid camera\",\n    \"pole\",\n    \"police van\",\n    \"poncho\",\n    \"pool table\",\n    \"soda bottle\",\n    \"plant pot\",\n    \"potter's wheel\",\n    \"power drill\",\n    \"prayer rug\",\n    \"printer\",\n    \"prison\",\n    \"missile\",\n    \"projector\",\n    \"hockey puck\",\n    \"punching bag\",\n    \"purse\",\n    \"quill\",\n    \"quilt\",\n    \"race car\",\n    \"racket\",\n    \"radiator\",\n    \"radio\",\n    \"radio telescope\",\n    \"rain barrel\",\n    \"recreational vehicle\",\n    \"fishing casting reel\",\n    \"reflex camera\",\n    \"refrigerator\",\n    \"remote control\",\n    \"restaurant\",\n    \"revolver\",\n    \"rifle\",\n    \"rocking chair\",\n    \"rotisserie\",\n    \"eraser\",\n    \"rugby ball\",\n    \"ruler measuring stick\",\n    \"sneaker\",\n    \"safe\",\n    \"safety pin\",\n    \"salt shaker\",\n    \"sandal\",\n    \"sarong\",\n    \"saxophone\",\n    \"scabbard\",\n    \"weighing scale\",\n    \"school bus\",\n    \"schooner\",\n    \"scoreboard\",\n    \"CRT monitor\",\n    \"screw\",\n    \"screwdriver\",\n    \"seat belt\",\n    \"sewing machine\",\n    \"shield\",\n    \"shoe store\",\n    \"shoji screen / room divider\",\n    \"shopping basket\",\n    \"shopping cart\",\n    \"shovel\",\n    \"shower cap\",\n    \"shower curtain\",\n    \"ski\",\n    \"balaclava ski mask\",\n    \"sleeping bag\",\n    \"slide rule\",\n    \"sliding door\",\n    \"slot machine\",\n    \"snorkel\",\n    \"snowmobile\",\n    \"snowplow\",\n    \"soap dispenser\",\n    \"soccer ball\",\n    \"sock\",\n    \"solar thermal collector\",\n    \"sombrero\",\n    \"soup bowl\",\n    \"keyboard space bar\",\n    \"space heater\",\n    \"space shuttle\",\n    \"spatula\",\n    \"motorboat\",\n    \"spider web\",\n    \"spindle\",\n    \"sports car\",\n    \"spotlight\",\n    \"stage\",\n    \"steam locomotive\",\n    \"through arch bridge\",\n    \"steel drum\",\n    \"stethoscope\",\n    \"scarf\",\n    \"stone wall\",\n    \"stopwatch\",\n    \"stove\",\n    \"strainer\",\n    \"tram\",\n    \"stretcher\",\n    \"couch\",\n    \"stupa\",\n    \"submarine\",\n    \"suit\",\n    \"sundial\",\n    \"sunglasses\",\n    \"sunglasses\",\n    \"sunscreen\",\n    \"suspension bridge\",\n    \"mop\",\n    \"sweatshirt\",\n    \"swim trunks / shorts\",\n    \"swing\",\n    \"electrical switch\",\n    \"syringe\",\n    \"table lamp\",\n    \"tank\",\n    \"tape player\",\n    \"teapot\",\n    \"teddy bear\",\n    \"television\",\n    \"tennis ball\",\n    \"thatched roof\",\n    \"front curtain\",\n    \"thimble\",\n    \"threshing machine\",\n    \"throne\",\n    \"tile roof\",\n    \"toaster\",\n    \"tobacco shop\",\n    \"toilet seat\",\n    \"torch\",\n    \"totem pole\",\n    \"tow truck\",\n    \"toy store\",\n    \"tractor\",\n    \"semi-trailer truck\",\n    \"tray\",\n    \"trench coat\",\n    \"tricycle\",\n    \"trimaran\",\n    \"tripod\",\n    \"triumphal arch\",\n    \"trolleybus\",\n    \"trombone\",\n    \"hot tub\",\n    \"turnstile\",\n    \"typewriter keyboard\",\n    \"umbrella\",\n    \"unicycle\",\n    \"upright piano\",\n    \"vacuum cleaner\",\n    \"vase\",\n    \"vaulted or arched ceiling\",\n    \"velvet fabric\",\n    \"vending machine\",\n    \"vestment\",\n    \"viaduct\",\n    \"violin\",\n    \"volleyball\",\n    \"waffle iron\",\n    \"wall clock\",\n    \"wallet\",\n    \"wardrobe\",\n    \"military aircraft\",\n    \"sink\",\n    \"washing machine\",\n    \"water bottle\",\n    \"water jug\",\n    \"water tower\",\n    \"whiskey jug\",\n    \"whistle\",\n    \"hair wig\",\n    \"window screen\",\n    \"window shade\",\n    \"Windsor tie\",\n    \"wine bottle\",\n    \"airplane wing\",\n    \"wok\",\n    \"wooden spoon\",\n    \"wool\",\n    \"split-rail fence\",\n    \"shipwreck\",\n    \"sailboat\",\n    \"yurt\",\n    \"website\",\n    \"comic book\",\n    \"crossword\",\n    \"traffic or street sign\",\n    \"traffic light\",\n    \"dust jacket\",\n    \"menu\",\n    \"plate\",\n    \"guacamole\",\n    \"consomme\",\n    \"hot pot\",\n    \"trifle\",\n    \"ice cream\",\n    \"popsicle\",\n    \"baguette\",\n    \"bagel\",\n    \"pretzel\",\n    \"cheeseburger\",\n    \"hot dog\",\n    \"mashed potatoes\",\n    \"cabbage\",\n    \"broccoli\",\n    \"cauliflower\",\n    \"zucchini\",\n    \"spaghetti squash\",\n    \"acorn squash\",\n    \"butternut squash\",\n    \"cucumber\",\n    \"artichoke\",\n    \"bell pepper\",\n    \"cardoon\",\n    \"mushroom\",\n    \"Granny Smith apple\",\n    \"strawberry\",\n    \"orange\",\n    \"lemon\",\n    \"fig\",\n    \"pineapple\",\n    \"banana\",\n    \"jackfruit\",\n    \"cherimoya (custard apple)\",\n    \"pomegranate\",\n    \"hay\",\n    \"carbonara\",\n    \"chocolate syrup\",\n    \"dough\",\n    \"meatloaf\",\n    \"pizza\",\n    \"pot pie\",\n    \"burrito\",\n    \"red wine\",\n    \"espresso\",\n    \"tea cup\",\n    \"eggnog\",\n    \"mountain\",\n    \"bubble\",\n    \"cliff\",\n    \"coral reef\",\n    \"geyser\",\n    \"lakeshore\",\n    \"promontory\",\n    \"sandbar\",\n    \"beach\",\n    \"valley\",\n    \"volcano\",\n    \"baseball player\",\n    \"bridegroom\",\n    \"scuba diver\",\n    \"rapeseed\",\n    \"daisy\",\n    \"yellow lady's slipper\",\n    \"corn\",\n    \"acorn\",\n    \"rose hip\",\n    \"horse chestnut seed\",\n    \"coral fungus\",\n    \"agaric\",\n    \"gyromitra\",\n    \"stinkhorn mushroom\",\n    \"earth star fungus\",\n    \"hen of the woods mushroom\",\n    \"bolete\",\n    \"corn cob\",\n    \"toilet paper\",\n]\n"
  },
  {
    "path": "corenet/data/datasets/multi_modal_img_text/zero_shot_image_classification/imagenet_r.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom typing import List\n\nfrom corenet.data.datasets.classification.imagenet_r import (\n    IMAGENET_R_CLASS_SUBLIST,\n    ImageNetRDataset,\n)\nfrom corenet.data.datasets.multi_modal_img_text.zero_shot_image_classification import (\n    ZERO_SHOT_IMAGE_CLASSIFICATION_DATASET_REGISTRY,\n)\nfrom corenet.data.datasets.multi_modal_img_text.zero_shot_image_classification.base_zero_shot_image_classification import (\n    BaseZeroShotImageClassificationDataset,\n)\nfrom corenet.data.datasets.multi_modal_img_text.zero_shot_image_classification.imagenet import (\n    IMAGENET_CLASS_NAMES,\n)\n\n\n@ZERO_SHOT_IMAGE_CLASSIFICATION_DATASET_REGISTRY.register(name=\"imagenet_r\")\nclass ImageNetRDatasetZeroShot(\n    BaseZeroShotImageClassificationDataset, ImageNetRDataset\n):\n    \"\"\"ImageNet-R dataset for zero-shot evaluation of Image-text models.\"\"\"\n\n    @property\n    def class_names(self) -> List[str]:\n        \"\"\"Return the name of the classes present in the dataset.\"\"\"\n        return [\n            IMAGENET_CLASS_NAMES[ImageNetRDataset.class_id_to_imagenet_class_id(i)]\n            for i in range(len(IMAGENET_R_CLASS_SUBLIST))\n        ]\n"
  },
  {
    "path": "corenet/data/datasets/multi_modal_img_text/zero_shot_image_classification/imagenet_sketch.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom typing import List\n\nfrom corenet.data.datasets.classification.imagenet_sketch import ImageNetSketchDataset\nfrom corenet.data.datasets.multi_modal_img_text.zero_shot_image_classification import (\n    ZERO_SHOT_IMAGE_CLASSIFICATION_DATASET_REGISTRY,\n)\nfrom corenet.data.datasets.multi_modal_img_text.zero_shot_image_classification.base_zero_shot_image_classification import (\n    BaseZeroShotImageClassificationDataset,\n)\nfrom corenet.data.datasets.multi_modal_img_text.zero_shot_image_classification.imagenet import (\n    IMAGENET_CLASS_NAMES,\n)\n\n\n@ZERO_SHOT_IMAGE_CLASSIFICATION_DATASET_REGISTRY.register(name=\"imagenet_sketch\")\nclass ImageNetSketchDatasetZeroShot(\n    BaseZeroShotImageClassificationDataset, ImageNetSketchDataset\n):\n    \"\"\"ImageNet-Sketch Dataset for zero-shot evaluation of Image-text models.\"\"\"\n\n    @property\n    def class_names(self) -> List[str]:\n        \"\"\"Return the name of the classes present in the dataset.\"\"\"\n        return IMAGENET_CLASS_NAMES\n"
  },
  {
    "path": "corenet/data/datasets/multi_modal_img_text/zero_shot_image_classification/templates.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom typing import List\n\nCLIP_TEMPLATES = [\n    \"a bad photo of a {class_name}.\",\n    \"a photo of many {class_name}.\",\n    \"a sculpture of a {class_name}.\",\n    \"a photo of the hard to see {class_name}.\",\n    \"a low resolution photo of the {class_name}.\",\n    \"a rendering of a {class_name}.\",\n    \"graffiti of a {class_name}.\",\n    \"a bad photo of the {class_name}.\",\n    \"a cropped photo of the {class_name}.\",\n    \"a tattoo of a {class_name}.\",\n    \"the embroidered {class_name}.\",\n    \"a photo of a hard to see {class_name}.\",\n    \"a bright photo of a {class_name}.\",\n    \"a photo of a clean {class_name}.\",\n    \"a photo of a dirty {class_name}.\",\n    \"a dark photo of the {class_name}.\",\n    \"a drawing of a {class_name}.\",\n    \"a photo of my {class_name}.\",\n    \"the plastic {class_name}.\",\n    \"a photo of the cool {class_name}.\",\n    \"a close-up photo of a {class_name}.\",\n    \"a black and white photo of the {class_name}.\",\n    \"a painting of the {class_name}.\",\n    \"a painting of a {class_name}.\",\n    \"a pixelated photo of the {class_name}.\",\n    \"a sculpture of the {class_name}.\",\n    \"a bright photo of the {class_name}.\",\n    \"a cropped photo of a {class_name}.\",\n    \"a plastic {class_name}.\",\n    \"a photo of the dirty {class_name}.\",\n    \"a jpeg corrupted photo of a {class_name}.\",\n    \"a blurry photo of the {class_name}.\",\n    \"a photo of the {class_name}.\",\n    \"a good photo of the {class_name}.\",\n    \"a rendering of the {class_name}.\",\n    \"a {class_name} in a video game.\",\n    \"a photo of one {class_name}.\",\n    \"a doodle of a {class_name}.\",\n    \"a close-up photo of the {class_name}.\",\n    \"a photo of a {class_name}.\",\n    \"the origami {class_name}.\",\n    \"the {class_name} in a video game.\",\n    \"a sketch of a {class_name}.\",\n    \"a doodle of the {class_name}.\",\n    \"a origami {class_name}.\",\n    \"a low resolution photo of a {class_name}.\",\n    \"the toy {class_name}.\",\n    \"a rendition of the {class_name}.\",\n    \"a photo of the clean {class_name}.\",\n    \"a photo of a large {class_name}.\",\n    \"a rendition of a {class_name}.\",\n    \"a photo of a nice {class_name}.\",\n    \"a photo of a weird {class_name}.\",\n    \"a blurry photo of a {class_name}.\",\n    \"a cartoon {class_name}.\",\n    \"art of a {class_name}.\",\n    \"a sketch of the {class_name}.\",\n    \"a embroidered {class_name}.\",\n    \"a pixelated photo of a {class_name}.\",\n    \"itap of the {class_name}.\",\n    \"a jpeg corrupted photo of the {class_name}.\",\n    \"a good photo of a {class_name}.\",\n    \"a plushie {class_name}.\",\n    \"a photo of the nice {class_name}.\",\n    \"a photo of the small {class_name}.\",\n    \"a photo of the weird {class_name}.\",\n    \"the cartoon {class_name}.\",\n    \"art of the {class_name}.\",\n    \"a drawing of the {class_name}.\",\n    \"a photo of the large {class_name}.\",\n    \"a black and white photo of a {class_name}.\",\n    \"the plushie {class_name}.\",\n    \"a dark photo of a {class_name}.\",\n    \"itap of a {class_name}.\",\n    \"graffiti of the {class_name}.\",\n    \"a toy {class_name}.\",\n    \"itap of my {class_name}.\",\n    \"a photo of a cool {class_name}.\",\n    \"a photo of a small {class_name}.\",\n    \"a tattoo of the {class_name}.\",\n]\n\n\ndef generate_text_prompts_clip(class_name) -> List[str]:\n    \"\"\"Return a list of prompts for the given class name.\"\"\"\n    return [template.format(class_name=class_name) for template in CLIP_TEMPLATES]\n"
  },
  {
    "path": "corenet/data/datasets/segmentation/__init__.py",
    "content": ""
  },
  {
    "path": "corenet/data/datasets/segmentation/ade20k.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nimport os\nfrom typing import List\n\nimport numpy as np\n\nfrom corenet.data.datasets import DATASET_REGISTRY\nfrom corenet.data.datasets.segmentation.base_segmentation import (\n    BaseImageSegmentationDataset,\n)\n\n\n@DATASET_REGISTRY.register(name=\"ade20k\", type=\"segmentation\")\nclass ADE20KDataset(BaseImageSegmentationDataset):\n    \"\"\"Dataset class for the ADE20K dataset\n\n    The structure of the dataset should be something like this: ::\n\n    ADEChallengeData2016/annotations/training/*.png\n    ADEChallengeData2016/annotations/validation/*.png\n\n    ADEChallengeData2016/images/training/*.jpg\n    ADEChallengeData2016/images/validation/*.jpg\n\n    Args:\n        opts: Command-line arguments\n    \"\"\"\n\n    def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None:\n        super().__init__(opts=opts, *args, **kwargs)\n        root = self.root\n\n        image_dir = os.path.join(\n            root, \"images\", \"training\" if self.is_training else \"validation\"\n        )\n        annotation_dir = os.path.join(\n            root, \"annotations\", \"training\" if self.is_training else \"validation\"\n        )\n\n        images = []\n        masks = []\n        for file_name in os.listdir(image_dir):\n            if file_name.endswith(\".jpg\"):\n                img_f_name = \"{}/{}\".format(image_dir, file_name)\n                mask_f_name = \"{}/{}\".format(\n                    annotation_dir, file_name.replace(\"jpg\", \"png\")\n                )\n\n                if os.path.isfile(img_f_name) and os.path.isfile(mask_f_name):\n                    images.append(img_f_name)\n                    masks.append(mask_f_name)\n\n        self.images = images\n        self.masks = masks\n        self.ignore_label = 255\n        self.background_idx = 0\n        self.check_dataset()\n\n    @staticmethod\n    def adjust_mask_value() -> int:\n        \"\"\"Adjust the mask value by this factor\"\"\"\n        # because we do not include background index for ADE20k, we shift mask labels by 1\n        return 1\n\n    @staticmethod\n    def color_palette() -> List[int]:\n        \"\"\"Class index to RGB color mapping. The list index corresponds to class id.\n        Note that the color list is flattened.\"\"\"\n        color_codes = [\n            [0, 0, 0],  # background\n            [120, 120, 120],\n            [180, 120, 120],\n            [6, 230, 230],\n            [80, 50, 50],\n            [4, 200, 3],\n            [120, 120, 80],\n            [140, 140, 140],\n            [204, 5, 255],\n            [230, 230, 230],\n            [4, 250, 7],\n            [224, 5, 255],\n            [235, 255, 7],\n            [150, 5, 61],\n            [120, 120, 70],\n            [8, 255, 51],\n            [255, 6, 82],\n            [143, 255, 140],\n            [204, 255, 4],\n            [255, 51, 7],\n            [204, 70, 3],\n            [0, 102, 200],\n            [61, 230, 250],\n            [255, 6, 51],\n            [11, 102, 255],\n            [255, 7, 71],\n            [255, 9, 224],\n            [9, 7, 230],\n            [220, 220, 220],\n            [255, 9, 92],\n            [112, 9, 255],\n            [8, 255, 214],\n            [7, 255, 224],\n            [255, 184, 6],\n            [10, 255, 71],\n            [255, 41, 10],\n            [7, 255, 255],\n            [224, 255, 8],\n            [102, 8, 255],\n            [255, 61, 6],\n            [255, 194, 7],\n            [255, 122, 8],\n            [0, 255, 20],\n            [255, 8, 41],\n            [255, 5, 153],\n            [6, 51, 255],\n            [235, 12, 255],\n            [160, 150, 20],\n            [0, 163, 255],\n            [140, 140, 140],\n            [250, 10, 15],\n            [20, 255, 0],\n            [31, 255, 0],\n            [255, 31, 0],\n            [255, 224, 0],\n            [153, 255, 0],\n            [0, 0, 255],\n            [255, 71, 0],\n            [0, 235, 255],\n            [0, 173, 255],\n            [31, 0, 255],\n            [11, 200, 200],\n            [255, 82, 0],\n            [0, 255, 245],\n            [0, 61, 255],\n            [0, 255, 112],\n            [0, 255, 133],\n            [255, 0, 0],\n            [255, 163, 0],\n            [255, 102, 0],\n            [194, 255, 0],\n            [0, 143, 255],\n            [51, 255, 0],\n            [0, 82, 255],\n            [0, 255, 41],\n            [0, 255, 173],\n            [10, 0, 255],\n            [173, 255, 0],\n            [0, 255, 153],\n            [255, 92, 0],\n            [255, 0, 255],\n            [255, 0, 245],\n            [255, 0, 102],\n            [255, 173, 0],\n            [255, 0, 20],\n            [255, 184, 184],\n            [0, 31, 255],\n            [0, 255, 61],\n            [0, 71, 255],\n            [255, 0, 204],\n            [0, 255, 194],\n            [0, 255, 82],\n            [0, 10, 255],\n            [0, 112, 255],\n            [51, 0, 255],\n            [0, 194, 255],\n            [0, 122, 255],\n            [0, 255, 163],\n            [255, 153, 0],\n            [0, 255, 10],\n            [255, 112, 0],\n            [143, 255, 0],\n            [82, 0, 255],\n            [163, 255, 0],\n            [255, 235, 0],\n            [8, 184, 170],\n            [133, 0, 255],\n            [0, 255, 92],\n            [184, 0, 255],\n            [255, 0, 31],\n            [0, 184, 255],\n            [0, 214, 255],\n            [255, 0, 112],\n            [92, 255, 0],\n            [0, 224, 255],\n            [112, 224, 255],\n            [70, 184, 160],\n            [163, 0, 255],\n            [153, 0, 255],\n            [71, 255, 0],\n            [255, 0, 163],\n            [255, 204, 0],\n            [255, 0, 143],\n            [0, 255, 235],\n            [133, 255, 0],\n            [255, 0, 235],\n            [245, 0, 255],\n            [255, 0, 122],\n            [255, 245, 0],\n            [10, 190, 212],\n            [214, 255, 0],\n            [0, 204, 255],\n            [20, 0, 255],\n            [255, 255, 0],\n            [0, 153, 255],\n            [0, 41, 255],\n            [0, 255, 204],\n            [41, 0, 255],\n            [41, 255, 0],\n            [173, 0, 255],\n            [0, 245, 255],\n            [71, 0, 255],\n            [122, 0, 255],\n            [0, 255, 184],\n            [0, 92, 255],\n            [184, 255, 0],\n            [0, 133, 255],\n            [255, 214, 0],\n            [25, 194, 194],\n            [102, 255, 0],\n            [92, 0, 255],\n        ]\n        color_codes = np.asarray(color_codes).flatten()\n        return list(color_codes)\n\n    @staticmethod\n    def class_names() -> List[str]:\n        \"\"\"Class index (index of a list corresponds to class id) to class name\"\"\"\n        return [\n            \"background\",\n            \"wall\",\n            \"building\",\n            \"sky\",\n            \"floor\",\n            \"tree\",\n            \"ceiling\",\n            \"road\",\n            \"bed \",\n            \"windowpane\",\n            \"grass\",\n            \"cabinet\",\n            \"sidewalk\",\n            \"person\",\n            \"earth\",\n            \"door\",\n            \"table\",\n            \"mountain\",\n            \"plant\",\n            \"curtain\",\n            \"chair\",\n            \"car\",\n            \"water\",\n            \"painting\",\n            \"sofa\",\n            \"shelf\",\n            \"house\",\n            \"sea\",\n            \"mirror\",\n            \"rug\",\n            \"field\",\n            \"armchair\",\n            \"seat\",\n            \"fence\",\n            \"desk\",\n            \"rock\",\n            \"wardrobe\",\n            \"lamp\",\n            \"bathtub\",\n            \"railing\",\n            \"cushion\",\n            \"base\",\n            \"box\",\n            \"column\",\n            \"signboard\",\n            \"chest of drawers\",\n            \"counter\",\n            \"sand\",\n            \"sink\",\n            \"skyscraper\",\n            \"fireplace\",\n            \"refrigerator\",\n            \"grandstand\",\n            \"path\",\n            \"stairs\",\n            \"runway\",\n            \"case\",\n            \"pool table\",\n            \"pillow\",\n            \"screen door\",\n            \"stairway\",\n            \"river\",\n            \"bridge\",\n            \"bookcase\",\n            \"blind\",\n            \"coffee table\",\n            \"toilet\",\n            \"flower\",\n            \"book\",\n            \"hill\",\n            \"bench\",\n            \"countertop\",\n            \"stove\",\n            \"palm\",\n            \"kitchen island\",\n            \"computer\",\n            \"swivel chair\",\n            \"boat\",\n            \"bar\",\n            \"arcade machine\",\n            \"hovel\",\n            \"bus\",\n            \"towel\",\n            \"light\",\n            \"truck\",\n            \"tower\",\n            \"chandelier\",\n            \"awning\",\n            \"streetlight\",\n            \"booth\",\n            \"television receiver\",\n            \"airplane\",\n            \"dirt track\",\n            \"apparel\",\n            \"pole\",\n            \"land\",\n            \"bannister\",\n            \"escalator\",\n            \"ottoman\",\n            \"bottle\",\n            \"buffet\",\n            \"poster\",\n            \"stage\",\n            \"van\",\n            \"ship\",\n            \"fountain\",\n            \"conveyer belt\",\n            \"canopy\",\n            \"washer\",\n            \"plaything\",\n            \"swimming pool\",\n            \"stool\",\n            \"barrel\",\n            \"basket\",\n            \"waterfall\",\n            \"tent\",\n            \"bag\",\n            \"minibike\",\n            \"cradle\",\n            \"oven\",\n            \"ball\",\n            \"food\",\n            \"step\",\n            \"tank\",\n            \"trade name\",\n            \"microwave\",\n            \"pot\",\n            \"animal\",\n            \"bicycle\",\n            \"lake\",\n            \"dishwasher\",\n            \"screen\",\n            \"blanket\",\n            \"sculpture\",\n            \"hood\",\n            \"sconce\",\n            \"vase\",\n            \"traffic light\",\n            \"tray\",\n            \"ashcan\",\n            \"fan\",\n            \"pier\",\n            \"crt screen\",\n            \"plate\",\n            \"monitor\",\n            \"bulletin board\",\n            \"shower\",\n            \"radiator\",\n            \"glass\",\n            \"clock\",\n            \"flag\",\n        ]\n"
  },
  {
    "path": "corenet/data/datasets/segmentation/base_segmentation.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nimport os\nfrom typing import List, Mapping, Optional, Tuple, Union\n\nimport numpy as np\nimport torch\nfrom PIL import Image\nfrom torch import Tensor\n\nfrom corenet.data.datasets.dataset_base import BaseImageDataset\nfrom corenet.data.transforms import image_pil as T\nfrom corenet.data.transforms.common import Compose\nfrom corenet.utils import logger\nfrom corenet.utils.color_map import Colormap\n\n\nclass BaseImageSegmentationDataset(BaseImageDataset):\n    \"\"\"Base Dataset class for Image Segmentation datasets. Sub-classes must define `ignore_label`\n    and `background_idx` variable.\n\n    Args:\n        opts: Command-line arguments\n    \"\"\"\n\n    def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None:\n        super().__init__(opts=opts, *args, **kwargs)\n        self.masks = None\n        self.images = None\n\n        # ignore label and background indices are dataset specific. So, child classes\n        # need to implement these\n        self.ignore_label = None\n        self.background_idx = None\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        if cls != BaseImageSegmentationDataset:\n            # Don't re-register arguments in subclasses that don't override `add_arguments()`.\n            return parser\n\n        group = parser.add_argument_group(cls.__name__)\n\n        # segmentation evaluation related arguments\n        group.add_argument(\n            \"--evaluation.segmentation.apply-color-map\",\n            action=\"store_true\",\n            default=False,\n            help=\"Apply color map to different classes in segmentation masks. Useful in visualization \"\n            \"+ some competitions (e.g, PASCAL VOC) accept submissions with colored segmentation masks.\"\n            \"Defaults to False.\",\n        )\n        group.add_argument(\n            \"--evaluation.segmentation.save-overlay-rgb-pred\",\n            action=\"store_true\",\n            default=False,\n            help=\"Enable this flag to visualize predicted masks on top of input image. \"\n            \"Defaults to False.\",\n        )\n        group.add_argument(\n            \"--evaluation.segmentation.save-masks\",\n            action=\"store_true\",\n            default=False,\n            help=\"Save predicted masks without colormaps. Useful for submitting to \"\n            \"competitions like Cityscapes. Defaults to False.\",\n        )\n        group.add_argument(\n            \"--evaluation.segmentation.overlay-mask-weight\",\n            default=0.5,\n            type=float,\n            help=\"Contribution of mask when overlaying on top of RGB image. Defaults to 0.5.\",\n        )\n        group.add_argument(\n            \"--evaluation.segmentation.mode\",\n            type=str,\n            default=\"validation_set\",\n            choices=[\"single_image\", \"image_folder\", \"validation_set\"],\n            help=\"Contribution of mask when overlaying on top of RGB image. Defaults to validation_set.\",\n        )\n        group.add_argument(\n            \"--evaluation.segmentation.path\",\n            type=str,\n            default=None,\n            help=\"Path of the image or image folder (only required for single_image and image_folder modes). \"\n            \"Defaults to None.\",\n        )\n        group.add_argument(\n            \"--evaluation.segmentation.resize-input-images\",\n            action=\"store_true\",\n            default=False,\n            help=\"Enable resizing input images while maintaining aspect ratio during segmentation evaluation.\"\n            \"Defaults to False.\",\n        )\n\n        group.add_argument(\n            \"--evaluation.segmentation.resize-input-images-fixed-size\",\n            action=\"store_true\",\n            default=False,\n            help=\"Enable resizing input images to fixed size during segmentation evaluation. \"\n            \"Defaults to False.\",\n        )\n        return parser\n\n    def check_dataset(self) -> None:\n        # TODO: Remove this check in future\n        assert self.masks is not None, \"Please specify masks for segmentation data\"\n        assert self.images is not None, \"Please specify images for segmentation data\"\n        assert (\n            self.ignore_label is not None\n        ), \"Please specify ignore label for segmentation dataset\"\n        assert (\n            self.background_idx is not None\n        ), \"Please specify background index for segmentation dataset\"\n\n    def _training_transforms(self, size: Tuple[int, int]) -> T.BaseTransformation:\n        \"\"\"Data augmentation during training.\n\n        Order of transformation is RandomShortSizeResize, RandomHorizontalFlip, RandomCrop,\n            Optional[RandomGaussianBlur], Optional[PhotometricDistort], Optional[RandomRotate].\n\n        If random order is enabled, then the order of transforms is shuffled, with an exception to RandomShortSizeResize.\n        These transforms are followed by ToTensor.\n\n        Args:\n            size: Size for resizing the input image. Expected to be a tuple (height, width)\n\n        Returns:\n            An instance of `corenet.data.transforms.image_pil.BaseTransformation.`\n        \"\"\"\n        first_aug = T.RandomShortSizeResize(opts=self.opts)\n        aug_list = [\n            T.RandomHorizontalFlip(opts=self.opts),\n            T.RandomCrop(opts=self.opts, size=size, ignore_idx=self.ignore_label),\n        ]\n\n        if getattr(self.opts, \"image_augmentation.random_gaussian_noise.enable\"):\n            aug_list.append(T.RandomGaussianBlur(opts=self.opts))\n\n        if getattr(self.opts, \"image_augmentation.photo_metric_distort.enable\"):\n            aug_list.append(T.PhotometricDistort(opts=self.opts))\n\n        if getattr(self.opts, \"image_augmentation.random_rotate.enable\"):\n            aug_list.append(T.RandomRotate(opts=self.opts))\n\n        if getattr(self.opts, \"image_augmentation.random_order.enable\"):\n            new_aug_list = [\n                first_aug,\n                T.RandomOrder(opts=self.opts, img_transforms=aug_list),\n                T.ToTensor(opts=self.opts),\n            ]\n            return Compose(opts=self.opts, img_transforms=new_aug_list)\n        else:\n            aug_list.insert(0, first_aug)\n            aug_list.append(T.ToTensor(opts=self.opts))\n            return Compose(opts=self.opts, img_transforms=aug_list)\n\n    def _validation_transforms(\n        self, size: Tuple[int, int], *args, **kwargs\n    ) -> T.BaseTransformation:\n        \"\"\"Data augmentation during validation.\n\n        Order of transformation is Resize, ToTensor\n\n        Args:\n            size: Size for resizing the input image. Expected to be a tuple (height, width)\n\n        Returns:\n            An instance of `corenet.data.transforms.image_pil.BaseTransformation.`\n        \"\"\"\n        aug_list = [T.Resize(opts=self.opts), T.ToTensor(opts=self.opts)]\n        return Compose(opts=self.opts, img_transforms=aug_list)\n\n    def _evaluation_transforms(\n        self, size: Union[int, Tuple[int, int]], *args, **kwargs\n    ) -> T.BaseTransformation:\n        \"\"\"Data augmentation during testing/evaluation.\n\n        Order of transformation is Optional[Resize], ToTensor\n\n        Args:\n            size: Size for resizing the input image. Expected to be an int or a tuple (height, width)\n\n        Returns:\n            An instance of `corenet.data.transforms.image_pil.BaseTransformation.`\n\n        ...note::\n            When `evaluation.segmentation.resize_input_images` is enabled, then images are resized\n                while maintaining the aspect ratio. If size is a tuple of integers, then min(size)\n                is used as a size.\n\n            When `evaluation.segmentation.resize_input_images_fixed_size` is enabled, then images\n                are resized to the given size.\n\n        \"\"\"\n        aug_list = []\n\n        resize_maintain_ar = getattr(\n            self.opts, \"evaluation.segmentation.resize_input_images\"\n        )\n        resize_fixed_size = getattr(\n            self.opts, \"evaluation.segmentation.resize_input_images_fixed_size\"\n        )\n\n        if resize_maintain_ar:\n            assert resize_fixed_size is False\n            # A standard practice for tasks of segmentation is to resize images while maintaining\n            # aspect ratio. To do so during evaluation, we pass min(img_size) as size as an\n            # argument to resize function. The resize function then resizes image while\n            # maintaining aspect ratio.\n            aug_list.append(T.Resize(opts=self.opts, img_size=min(size)))\n        elif resize_fixed_size:\n            assert resize_maintain_ar is False\n            # we want to resize while maintaining aspect ratio. So, we pass size as an\n            # argument to resize function\n            aug_list.append(T.Resize(opts=self.opts, img_size=size))\n        # default is no resizing\n        aug_list.append(T.ToTensor(opts=self.opts))\n        return Compose(opts=self.opts, img_transforms=aug_list)\n\n    @staticmethod\n    def adjust_mask_value() -> int:\n        \"\"\"Adjust the mask value by this factor\"\"\"\n        # Some datasets (e.g., ADE20k) requires us to adjust the mask value.\n        # By default, we set to 0. But child classes can adjust it\n        return 0\n\n    def __len__(self) -> int:\n        \"\"\"Number of samples in segmentation dataset\"\"\"\n        return len(self.images)\n\n    @staticmethod\n    def color_palette() -> List[int]:\n        \"\"\"Class index to RGB color mapping. The list index corresponds to class id.\n        Note that the color list is flattened.\"\"\"\n        # Child classes may override this method (optionally)\n        return Colormap().get_color_map_list()\n\n    @staticmethod\n    def class_names() -> List[str]:\n        \"\"\"Class index to name. The list index should correspond to class id\"\"\"\n        # Child classes may implement these methods (optionally)\n        raise NotImplementedError\n\n    @staticmethod\n    def read_mask_pil(path: str) -> Optional[Image.Image]:\n        \"\"\"Reads mask image and returns as a PIL image\"\"\"\n        try:\n            mask = Image.open(path)\n            if mask.mode != \"L\":\n                logger.error(\"Mask mode should be L. Got: {}\".format(mask.mode))\n            return mask\n        except:\n            return None\n\n    @staticmethod\n    def convert_mask_to_tensor(mask: Image.Image) -> Tensor:\n        \"\"\"Convert PIL mask to Tensor\"\"\"\n        # convert to tensor\n        mask = np.array(mask)\n        if len(mask.shape) > 2 and mask.shape[-1] > 1:\n            mask = np.ascontiguousarray(mask.transpose(2, 0, 1))\n        return torch.as_tensor(mask, dtype=torch.long)\n\n    def __getitem__(\n        self, sample_size_and_index: Tuple[int, int, int], *args, **kwargs\n    ) -> Mapping[str, Union[Tensor, Mapping[str, Tensor]]]:\n        \"\"\"Returns the sample corresponding to the input sample index. Returned sample is transformed\n        into the size specified by the input.\n\n        Args:\n            sample_size_and_index: Tuple of the form (crop_size_h, crop_size_w, sample_index)\n\n        Returns:\n            A dictionary with `samples` and `targets` as keys corresponding to input and labels of\n            a sample, respectively.\n\n        Shapes:\n            The shape of values in output dictionary, output_data, are as follows:\n\n            output_data[\"samples\"][\"image\"]: Shape is [Channels, Height, Width]\n            output_data[\"targets\"][\"mask\"]: Shape is [Height, Width]\n        \"\"\"\n\n        crop_size_h, crop_size_w, img_index = sample_size_and_index\n        transform = self.get_augmentation_transforms(size=(crop_size_h, crop_size_w))\n\n        mask = self.read_mask_pil(self.masks[img_index])\n        img = self.read_image_pil(self.images[img_index])\n\n        if (img.size[0] != mask.size[0]) or (img.size[1] != mask.size[1]):\n            logger.error(\n                \"Input image and mask sizes are different. Input size: {} and Mask size: {}\".format(\n                    img.size, mask.size\n                )\n            )\n\n        data = {\"image\": img}\n        if not self.is_evaluation:\n            data[\"mask\"] = mask\n\n        data = transform(data)\n\n        if self.is_evaluation:\n            # for evaluation purposes, resize only the input and not mask\n            data[\"mask\"] = self.convert_mask_to_tensor(mask)\n\n        output_data = {\n            \"samples\": data[\"image\"],\n            # ignore dataset specific indices in mask\n            \"targets\": data[\"mask\"] - self.adjust_mask_value(),\n        }\n\n        if self.is_evaluation:\n            im_width, im_height = img.size\n            img_name = self.images[img_index].split(os.sep)[-1].replace(\"jpg\", \"png\")\n            mask = output_data.pop(\"targets\")\n            output_data[\"targets\"] = {\n                \"mask\": mask,\n                \"file_name\": img_name,\n                \"im_width\": im_width,\n                \"im_height\": im_height,\n            }\n\n        return output_data\n"
  },
  {
    "path": "corenet/data/datasets/segmentation/coco_segmentation.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nimport os\nfrom typing import List, Mapping, Optional, Tuple, Union\n\nimport numpy as np\nfrom pycocotools import mask\nfrom pycocotools.coco import COCO\nfrom torch import Tensor\n\nfrom corenet.data.datasets import DATASET_REGISTRY\nfrom corenet.data.datasets.segmentation.base_segmentation import (\n    BaseImageSegmentationDataset,\n)\n\n\n@DATASET_REGISTRY.register(name=\"coco\", type=\"segmentation\")\nclass COCOSegmentationDataset(BaseImageSegmentationDataset):\n    \"\"\"Dataset class for the COCO dataset that maps classes to PASCAL VOC classes\n\n    Args:\n        opts: command-line arguments\n    \"\"\"\n\n    def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None:\n        super().__init__(opts=opts, *args, **kwargs)\n        year = 2017\n        split = \"train\" if self.is_training else \"val\"\n        ann_file = os.path.join(\n            self.root, \"annotations/instances_{}{}.json\".format(split, year)\n        )\n        self.img_dir = os.path.join(self.root, \"images/{}{}\".format(split, year))\n        self.split = split\n        self.coco = COCO(ann_file)\n        self.coco_mask = mask\n        self.ids = list(self.coco.imgs.keys())\n\n        self.ignore_label = 255\n        self.background_idx = 0\n\n    def __getitem__(\n        self, sample_size_and_index: Tuple[int, int, int], *args, **kwargs\n    ) -> Mapping[str, Union[Tensor, Mapping[str, Tensor]]]:\n        \"\"\"Returns the sample corresponding to the input sample index. Returned sample is transformed\n        into the size specified by the input.\n\n        Args:\n            sample_size_and_index: Tuple of the form (crop_size_h, crop_size_w, sample_index)\n\n        Returns:\n            A dictionary with `samples` and `targets` as keys corresponding to input and labels of\n            a sample, respectively.\n\n        Shapes:\n            The shape of values in output dictionary, output_data, are as follows:\n\n            output_data[\"samples\"][\"image\"]: Shape is [Channels, Height, Width]\n            output_data[\"targets\"][\"mask\"]: Shape is [Height, Width]\n\n        \"\"\"\n        crop_size_h, crop_size_w, img_index = sample_size_and_index\n\n        _transform = self.get_augmentation_transforms(size=(crop_size_h, crop_size_w))\n\n        coco = self.coco\n        img_id = self.ids[img_index]\n        img_metadata = coco.loadImgs(img_id)[0]\n        path = img_metadata[\"file_name\"]\n\n        rgb_img = self.read_image_pil(os.path.join(self.img_dir, path))\n        cocotarget = coco.loadAnns(coco.getAnnIds(imgIds=img_id))\n\n        mask = self._gen_seg_mask(\n            cocotarget, img_metadata[\"height\"], img_metadata[\"width\"]\n        )\n\n        data = {\"image\": rgb_img, \"mask\": None if self.is_evaluation else mask}\n\n        data = _transform(data)\n\n        if self.is_evaluation:\n            # for evaluation purposes, resize only the input and not mask\n            data[\"mask\"] = mask\n\n        output_data = {\"samples\": data[\"image\"], \"targets\": data[\"mask\"]}\n\n        if self.is_evaluation:\n            im_width, im_height = rgb_img.size\n            img_name = path.replace(\"jpg\", \"png\")\n            mask = output_data.pop(\"targets\")\n            output_data[\"targets\"] = {\n                \"mask\": mask,\n                \"file_name\": img_name,\n                \"im_width\": im_width,\n                \"im_height\": im_height,\n            }\n\n        return output_data\n\n    def _gen_seg_mask(self, target, h: int, w: int) -> np.ndarray:\n        \"\"\"Generates a mask in PASCAL VOC format\"\"\"\n        mask = np.zeros((h, w), dtype=np.uint8)\n        coco_mask = self.coco_mask\n        coco_to_pascal = self.coco_to_pascal_mapping()\n        for instance in target:\n            rle = coco_mask.frPyObjects(instance[\"segmentation\"], h, w)\n            m = coco_mask.decode(rle)\n            cat = instance[\"category_id\"]\n            if cat in coco_to_pascal:\n                c = coco_to_pascal.index(cat)\n            else:\n                continue\n            if len(m.shape) < 3:\n                mask[:, :] += (mask == 0) * (m * c)\n            else:\n                mask[:, :] += (mask == 0) * (((np.sum(m, axis=2)) > 0) * c).astype(\n                    np.uint8\n                )\n        return mask\n\n    def __len__(self) -> int:\n        return len(self.ids)\n\n    @staticmethod\n    def class_names() -> List[str]:\n        \"\"\"PASCAL VOC classes names\"\"\"\n        return [\n            \"background\",\n            \"aeroplane\",\n            \"bicycle\",\n            \"bird\",\n            \"boat\",\n            \"bottle\",\n            \"bus\",\n            \"car\",\n            \"cat\",\n            \"chair\",\n            \"cow\",\n            \"diningtable\",\n            \"dog\",\n            \"horse\",\n            \"motorbike\",\n            \"person\",\n            \"potted_plant\",\n            \"sheep\",\n            \"sofa\",\n            \"train\",\n            \"tv_monitor\",\n        ]\n\n    @staticmethod\n    def coco_to_pascal_mapping() -> List[int]:\n        \"\"\"COCO to PASCAL VOC class mapping\"\"\"\n        return [\n            0,\n            5,\n            2,\n            16,\n            9,\n            44,\n            6,\n            3,\n            17,\n            62,\n            21,\n            67,\n            18,\n            19,\n            4,\n            1,\n            64,\n            20,\n            63,\n            7,\n            72,\n        ]\n"
  },
  {
    "path": "corenet/data/datasets/segmentation/coco_stuff.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nimport os\nfrom typing import List\n\nimport numpy as np\n\nfrom corenet.data.datasets import DATASET_REGISTRY\nfrom corenet.data.datasets.segmentation.base_segmentation import (\n    BaseImageSegmentationDataset,\n)\n\n\n@DATASET_REGISTRY.register(name=\"coco_stuff\", type=\"segmentation\")\nclass COCOStuffDataset(BaseImageSegmentationDataset):\n    \"\"\"`COCOStuff <https://arxiv.org/abs/1612.03716>`_ dataset.\n\n    The segmenation mask IDs are from 0 to 171 with 0 representing unlabelled/background\n    area. So, it comprises of a total of 172 classes. The dataset includes annotation for\n    all 164k images in COCO 2017 dataset.\n\n    With 'cocostuff' as the root directory, the expected structure of images and annotations is as follows:\n\n        cocostuff/\n        ├── images/\n        │   ├── train2017/\n        │   │   ├── *.jpg\n        │   ├── val2017/\n        │   │   ├── *.jpg\n        ├── annotations/\n        │   ├── train2017/\n        │   │   ├── *.png\n        │   ├── val2017/\n        │   │   ├── *.png\n\n    ...note:\n        The dataset has total of 182 classes, but labels are provided only for 171 classes. Therefore, unnannotated\n        classes needs to be remapped before training. This can be done by running the following script:\n\n        >>> python tools/converter_coco_stuff.py --src-dir cocostuff/annotations\n\n    Args:\n        opts: Command-line arguments.\n    \"\"\"\n\n    def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None:\n        super().__init__(opts=opts, *args, **kwargs)\n        root = self.root\n\n        year = 2017\n        split = \"train\" if self.is_training else \"val\"\n        img_dir = os.path.join(root, \"images/{}{}\".format(split, year))\n        annotation_dir = os.path.join(root, \"annotations/{}{}\".format(split, year))\n\n        self.masks = []\n        self.images = []\n\n        file_names = os.listdir(img_dir)\n        for file_name in file_names:\n            if not file_name.endswith(\".jpg\"):\n                continue\n            jpg_file = os.path.join(img_dir, file_name)\n            png_file = os.path.join(annotation_dir, file_name.replace(\".jpg\", \".png\"))\n            self.images.append(jpg_file)\n            self.masks.append(png_file)\n\n        self.ignore_label = 255\n        self.background_idx = 0\n        self.check_dataset()\n\n    @staticmethod\n    def color_palette() -> List[int]:\n        \"\"\"Class index to RGB color mapping. The list index corresponds to class id.\n        Note that the color list is flattened.\"\"\"\n        color_codes = [\n            [0, 0, 0],\n            [0, 192, 64],\n            [0, 192, 64],\n            [0, 64, 96],\n            [128, 192, 192],\n            [0, 64, 64],\n            [0, 192, 224],\n            [0, 192, 192],\n            [128, 192, 64],\n            [0, 192, 96],\n            [128, 192, 64],\n            [128, 32, 192],\n            [0, 0, 224],\n            [0, 0, 64],\n            [0, 160, 192],\n            [128, 0, 96],\n            [128, 0, 192],\n            [0, 32, 192],\n            [128, 128, 224],\n            [0, 0, 192],\n            [128, 160, 192],\n            [128, 128, 0],\n            [128, 0, 32],\n            [128, 32, 0],\n            [128, 0, 128],\n            [64, 128, 32],\n            [0, 160, 0],\n            [0, 0, 0],\n            [192, 128, 160],\n            [0, 32, 0],\n            [0, 128, 128],\n            [64, 128, 160],\n            [128, 160, 0],\n            [0, 128, 0],\n            [192, 128, 32],\n            [128, 96, 128],\n            [0, 0, 128],\n            [64, 0, 32],\n            [0, 224, 128],\n            [128, 0, 0],\n            [192, 0, 160],\n            [0, 96, 128],\n            [128, 128, 128],\n            [64, 0, 160],\n            [128, 224, 128],\n            [128, 128, 64],\n            [192, 0, 32],\n            [128, 96, 0],\n            [128, 0, 192],\n            [0, 128, 32],\n            [64, 224, 0],\n            [0, 0, 64],\n            [128, 128, 160],\n            [64, 96, 0],\n            [0, 128, 192],\n            [0, 128, 160],\n            [192, 224, 0],\n            [0, 128, 64],\n            [128, 128, 32],\n            [192, 32, 128],\n            [0, 64, 192],\n            [0, 0, 32],\n            [64, 160, 128],\n            [128, 64, 64],\n            [128, 0, 160],\n            [64, 32, 128],\n            [128, 192, 192],\n            [0, 0, 160],\n            [192, 160, 128],\n            [128, 192, 0],\n            [128, 0, 96],\n            [192, 32, 0],\n            [128, 64, 128],\n            [64, 128, 96],\n            [64, 160, 0],\n            [0, 64, 0],\n            [192, 128, 224],\n            [64, 32, 0],\n            [0, 192, 128],\n            [64, 128, 224],\n            [192, 160, 0],\n            [0, 192, 0],\n            [192, 128, 96],\n            [192, 96, 128],\n            [0, 64, 128],\n            [64, 0, 96],\n            [64, 224, 128],\n            [128, 64, 0],\n            [192, 0, 224],\n            [64, 96, 128],\n            [128, 192, 128],\n            [64, 0, 224],\n            [192, 224, 128],\n            [128, 192, 64],\n            [192, 0, 96],\n            [192, 96, 0],\n            [128, 64, 192],\n            [0, 128, 96],\n            [0, 224, 0],\n            [64, 64, 64],\n            [128, 128, 224],\n            [0, 96, 0],\n            [64, 192, 192],\n            [0, 128, 224],\n            [128, 224, 0],\n            [64, 192, 64],\n            [128, 128, 96],\n            [128, 32, 128],\n            [64, 0, 192],\n            [0, 64, 96],\n            [0, 160, 128],\n            [192, 0, 64],\n            [128, 64, 224],\n            [0, 32, 128],\n            [192, 128, 192],\n            [0, 64, 224],\n            [128, 160, 128],\n            [192, 128, 0],\n            [128, 64, 32],\n            [128, 32, 64],\n            [192, 0, 128],\n            [64, 192, 32],\n            [0, 160, 64],\n            [64, 0, 0],\n            [192, 192, 160],\n            [0, 32, 64],\n            [64, 128, 128],\n            [64, 192, 160],\n            [128, 160, 64],\n            [64, 128, 0],\n            [192, 192, 32],\n            [128, 96, 192],\n            [64, 0, 128],\n            [64, 64, 32],\n            [0, 224, 192],\n            [192, 0, 0],\n            [192, 64, 160],\n            [0, 96, 192],\n            [192, 128, 128],\n            [64, 64, 160],\n            [128, 224, 192],\n            [192, 128, 64],\n            [192, 64, 32],\n            [128, 96, 64],\n            [192, 0, 192],\n            [0, 192, 32],\n            [64, 224, 64],\n            [64, 0, 64],\n            [128, 192, 160],\n            [64, 96, 64],\n            [64, 128, 192],\n            [0, 192, 160],\n            [192, 224, 64],\n            [64, 128, 64],\n            [128, 192, 32],\n            [192, 32, 192],\n            [64, 64, 192],\n            [0, 64, 32],\n            [64, 160, 192],\n            [192, 64, 64],\n            [128, 64, 160],\n            [64, 32, 192],\n            [192, 192, 192],\n            [0, 64, 160],\n            [192, 160, 192],\n            [192, 192, 0],\n            [128, 64, 96],\n            [192, 32, 64],\n            [192, 64, 128],\n            [64, 192, 96],\n            [64, 160, 64],\n            [64, 64, 0],\n        ]\n\n        color_codes = np.asarray(color_codes).flatten()\n        return list(color_codes)\n\n    @staticmethod\n    def class_names() -> List[str]:\n        \"\"\"Class index to class name mapping. Class index corresponds to list index\"\"\"\n\n        return [\n            \"unlabeled\",\n            \"person\",\n            \"bicycle\",\n            \"car\",\n            \"motorcycle\",\n            \"airplane\",\n            \"bus\",\n            \"train\",\n            \"truck\",\n            \"boat\",\n            \"traffic light\",\n            \"fire hydrant\",\n            \"stop sign\",\n            \"parking meter\",\n            \"bench\",\n            \"bird\",\n            \"cat\",\n            \"dog\",\n            \"horse\",\n            \"sheep\",\n            \"cow\",\n            \"elephant\",\n            \"bear\",\n            \"zebra\",\n            \"giraffe\",\n            \"backpack\",\n            \"umbrella\",\n            \"handbag\",\n            \"tie\",\n            \"suitcase\",\n            \"frisbee\",\n            \"skis\",\n            \"snowboard\",\n            \"sports ball\",\n            \"kite\",\n            \"baseball bat\",\n            \"baseball glove\",\n            \"skateboard\",\n            \"surfboard\",\n            \"tennis racket\",\n            \"bottle\",\n            \"wine glass\",\n            \"cup\",\n            \"fork\",\n            \"knife\",\n            \"spoon\",\n            \"bowl\",\n            \"banana\",\n            \"apple\",\n            \"sandwich\",\n            \"orange\",\n            \"broccoli\",\n            \"carrot\",\n            \"hot dog\",\n            \"pizza\",\n            \"donut\",\n            \"cake\",\n            \"chair\",\n            \"couch\",\n            \"potted plant\",\n            \"bed\",\n            \"dining table\",\n            \"toilet\",\n            \"tv\",\n            \"laptop\",\n            \"mouse\",\n            \"remote\",\n            \"keyboard\",\n            \"cell phone\",\n            \"microwave\",\n            \"oven\",\n            \"toaster\",\n            \"sink\",\n            \"refrigerator\",\n            \"book\",\n            \"clock\",\n            \"vase\",\n            \"scissors\",\n            \"teddy bear\",\n            \"hair drier\",\n            \"toothbrush\",\n            \"banner\",\n            \"blanket\",\n            \"branch\",\n            \"bridge\",\n            \"building-other\",\n            \"bush\",\n            \"cabinet\",\n            \"cage\",\n            \"cardboard\",\n            \"carpet\",\n            \"ceiling-other\",\n            \"ceiling-tile\",\n            \"cloth\",\n            \"clothes\",\n            \"clouds\",\n            \"counter\",\n            \"cupboard\",\n            \"curtain\",\n            \"desk-stuff\",\n            \"dirt\",\n            \"door-stuff\",\n            \"fence\",\n            \"floor-marble\",\n            \"floor-other\",\n            \"floor-stone\",\n            \"floor-tile\",\n            \"floor-wood\",\n            \"flower\",\n            \"fog\",\n            \"food-other\",\n            \"fruit\",\n            \"furniture-other\",\n            \"grass\",\n            \"gravel\",\n            \"ground-other\",\n            \"hill\",\n            \"house\",\n            \"leaves\",\n            \"light\",\n            \"mat\",\n            \"metal\",\n            \"mirror-stuff\",\n            \"moss\",\n            \"mountain\",\n            \"mud\",\n            \"napkin\",\n            \"net\",\n            \"paper\",\n            \"pavement\",\n            \"pillow\",\n            \"plant-other\",\n            \"plastic\",\n            \"platform\",\n            \"playingfield\",\n            \"railing\",\n            \"railroad\",\n            \"river\",\n            \"road\",\n            \"rock\",\n            \"roof\",\n            \"rug\",\n            \"salad\",\n            \"sand\",\n            \"sea\",\n            \"shelf\",\n            \"sky-other\",\n            \"skyscraper\",\n            \"snow\",\n            \"solid-other\",\n            \"stairs\",\n            \"stone\",\n            \"straw\",\n            \"structural-other\",\n            \"table\",\n            \"tent\",\n            \"textile-other\",\n            \"towel\",\n            \"tree\",\n            \"vegetable\",\n            \"wall-brick\",\n            \"wall-concrete\",\n            \"wall-other\",\n            \"wall-panel\",\n            \"wall-stone\",\n            \"wall-tile\",\n            \"wall-wood\",\n            \"water-other\",\n            \"waterdrops\",\n            \"window-blind\",\n            \"window-other\",\n            \"wood\",\n        ]\n"
  },
  {
    "path": "corenet/data/datasets/segmentation/pascal_voc.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nimport os\nfrom typing import List\n\nimport numpy as np\n\nfrom corenet.data.datasets import DATASET_REGISTRY\nfrom corenet.data.datasets.segmentation.base_segmentation import (\n    BaseImageSegmentationDataset,\n)\n\n\n@DATASET_REGISTRY.register(name=\"pascal\", type=\"segmentation\")\nclass PascalVOCDataset(BaseImageSegmentationDataset):\n    \"\"\"Dataset class for the PASCAL VOC 2012 dataset\n\n    The structure of PASCAL VOC dataset should be like this: ::\n\n        pascal_voc/VOCdevkit/VOC2012/Annotations\n        pascal_voc/VOCdevkit/VOC2012/JPEGImages\n        pascal_voc/VOCdevkit/VOC2012/SegmentationClass\n        pascal_voc/VOCdevkit/VOC2012/SegmentationClassAug_Visualization\n        pascal_voc/VOCdevkit/VOC2012/ImageSets\n        pascal_voc/VOCdevkit/VOC2012/list\n        pascal_voc/VOCdevkit/VOC2012/SegmentationClassAug\n        pascal_voc/VOCdevkit/VOC2012/SegmentationObject\n\n    Args:\n        opts: Command-line arguments\n    \"\"\"\n\n    def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None:\n        super().__init__(opts=opts, *args, **kwargs)\n        use_coco_data = getattr(opts, \"dataset.pascal.use_coco_data\")\n        coco_root_dir = getattr(opts, \"dataset.pascal.coco_root_dir\")\n        root = self.root\n\n        voc_root_dir = os.path.join(root, \"VOC2012\")\n        voc_list_dir = os.path.join(voc_root_dir, \"list\")\n\n        coco_data_file = None\n        if self.is_training:\n            # use the PASCAL VOC 2012 train data with augmented data\n            data_file = os.path.join(voc_list_dir, \"train_aug.txt\")\n            if use_coco_data and coco_root_dir is not None:\n                coco_data_file = os.path.join(coco_root_dir, \"train_2017.txt\")\n                assert os.path.isfile(\n                    coco_data_file\n                ), \"COCO data file does not exist at: {}\".format(coco_root_dir)\n        else:\n            data_file = os.path.join(voc_list_dir, \"val.txt\")\n\n        self.images = []\n        self.masks = []\n        with open(data_file, \"r\") as lines:\n            for line in lines:\n                line_split = line.split(\" \")\n                rgb_img_loc = voc_root_dir + os.sep + line_split[0].strip()\n                mask_img_loc = voc_root_dir + os.sep + line_split[1].strip()\n                assert os.path.isfile(\n                    rgb_img_loc\n                ), \"RGB file does not exist at: {}\".format(rgb_img_loc)\n                assert os.path.isfile(\n                    mask_img_loc\n                ), \"Mask image does not exist at: {}\".format(rgb_img_loc)\n                self.images.append(rgb_img_loc)\n                self.masks.append(mask_img_loc)\n\n        # if COCO data (mapped in PASCAL VOC format) needs to be used during training\n        if self.is_training and coco_data_file is not None:\n            with open(coco_data_file, \"r\") as lines:\n                for line in lines:\n                    line_split = line.split(\" \")\n                    rgb_img_loc = coco_root_dir + os.sep + line_split[0].rstrip()\n                    mask_img_loc = coco_root_dir + os.sep + line_split[1].rstrip()\n                    assert os.path.isfile(rgb_img_loc)\n                    assert os.path.isfile(mask_img_loc)\n                    self.images.append(rgb_img_loc)\n                    self.masks.append(mask_img_loc)\n        self.use_coco_data = use_coco_data\n        self.ignore_label = 255\n        self.background_idx = 0\n        self.check_dataset()\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        if cls != PascalVOCDataset:\n            # Don't re-register arguments in subclasses that don't override `add_arguments()`.\n            return parser\n\n        group = parser.add_argument_group(title=cls.__name__)\n        group.add_argument(\n            \"--dataset.pascal.use-coco-data\",\n            action=\"store_true\",\n            default=False,\n            help=\"Use MS-COCO data for training with PASCAL VOC dataset. Defaults to False.\",\n        )\n        group.add_argument(\n            \"--dataset.pascal.coco-root-dir\",\n            type=str,\n            default=None,\n            help=\"Location of MS-COCO data. Defaults to None.\",\n        )\n        return parser\n\n    @staticmethod\n    def color_palette() -> List[int]:\n        \"\"\"Class index to RGB color mapping. The list index corresponds to class id.\n        Note that the color list is flattened.\"\"\"\n        color_codes = [\n            [0, 0, 0],\n            [128, 0, 0],\n            [0, 128, 0],\n            [128, 128, 0],\n            [0, 0, 128],\n            [128, 0, 128],\n            [0, 128, 128],\n            [128, 128, 128],\n            [64, 0, 0],\n            [192, 0, 0],\n            [64, 128, 0],\n            [192, 128, 0],\n            [64, 0, 128],\n            [192, 0, 128],\n            [64, 128, 128],\n            [192, 128, 128],\n            [0, 64, 0],\n            [128, 64, 0],\n            [0, 192, 0],\n            [128, 192, 0],\n            [0, 64, 128],\n        ]\n\n        color_codes = np.asarray(color_codes).flatten()\n        return list(color_codes)\n\n    @staticmethod\n    def class_names() -> List[str]:\n        \"\"\"Class index to class name mapping. Class index corresponds to list index\"\"\"\n        return [\n            \"background\",\n            \"aeroplane\",\n            \"bicycle\",\n            \"bird\",\n            \"boat\",\n            \"bottle\",\n            \"bus\",\n            \"car\",\n            \"cat\",\n            \"chair\",\n            \"cow\",\n            \"diningtable\",\n            \"dog\",\n            \"horse\",\n            \"motorbike\",\n            \"person\",\n            \"potted_plant\",\n            \"sheep\",\n            \"sofa\",\n            \"train\",\n            \"tv_monitor\",\n        ]\n"
  },
  {
    "path": "corenet/data/datasets/utils/__init__.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n"
  },
  {
    "path": "corenet/data/datasets/utils/common.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport collections\nimport os\nimport random\nfrom typing import Any, List, Optional, Tuple, Union\n\nIMG_EXTENSIONS = (\n    \".jpg\",\n    \".jpeg\",\n    \".png\",\n    \".ppm\",\n    \".bmp\",\n    \".pgm\",\n    \".tif\",\n    \".tiff\",\n    \".webp\",\n)\n\n\ndef file_has_valid_image_extension(filename: str) -> bool:\n    return file_has_allowed_extension(filename, IMG_EXTENSIONS)\n\n\ndef file_has_allowed_extension(\n    filename: str, extensions: Union[str, Tuple[str, ...]]\n) -> bool:\n    \"\"\"Checks if a file has an allowed extension.\n\n    Args:\n        filename: Path to a file.\n        extensions: A string or a tuple of strings specifying the file extensions.\n\n    Returns:\n        True if the filename ends with one of given extensions, else False\n    \"\"\"\n    return filename.lower().endswith(extensions)\n\n\ndef get_image_paths(directory: str) -> List[str]:\n    \"\"\"Returns a list of paths to all image files in the input directory and its subdirectories.\"\"\"\n    image_paths = []\n    for root, _, fnames in sorted(os.walk(directory, topdown=False)):\n        for fname in sorted(fnames):\n            path = os.path.join(root, fname)\n            if file_has_valid_image_extension(path):\n                image_paths.append(path)\n\n    return image_paths\n\n\ndef select_random_subset(\n    random_seed: int,\n    num_total_samples: int,\n    num_samples_to_select: Optional[int] = None,\n    percentage_of_samples_to_select: Optional[float] = None,\n) -> List[int]:\n    \"\"\"\n    Randomly selects a subset of samples.\n\n    Only one of `num_samples_to_select` and `percentage_of_samples_to_select` should be provided.\n    Selects all the samples if neither of them are provided.\n\n    Args:\n        random_seed: An integer seed to use for random selection.\n        num_total_samples: Total number of samples in the set that is being subsampled.\n        num_samples_to_select: An optional integer indicating the number of samples to select.\n        percentage_of_samples_to_select: An optional float in the range (0,100] indicating the percentage of\n            samples to select.\n\n    Returns:\n        A list of (integer) indices of the selected samples.\n\n     Raises:\n        ValueError if both `num_samples_to_select` and `percentage_of_samples_to_select` are provided.\n    \"\"\"\n    if (\n        num_samples_to_select is not None\n        and percentage_of_samples_to_select is not None\n    ):\n        raise ValueError(\n            \"Only one of `num_samples_to_select` and `percentage_of_samples_to_select` should be provided.\"\n        )\n\n    if num_samples_to_select is not None and num_samples_to_select < 1:\n        raise ValueError(\"`num_samples_to_select` should be greater than 0.\")\n\n    if percentage_of_samples_to_select is not None:\n        if not 0 < percentage_of_samples_to_select <= 100:\n            raise ValueError(\n                \"`percentage_of_samples_to_select` should be in the range (0, 100].\"\n            )\n\n    sample_indices = list(range(num_total_samples))\n    rng = random.Random(random_seed)\n    rng.shuffle(sample_indices)\n\n    if num_samples_to_select is None and percentage_of_samples_to_select is None:\n        return sample_indices\n\n    if num_samples_to_select is None:\n        num_samples_to_select = int(\n            percentage_of_samples_to_select * num_total_samples / 100\n        )\n\n    num_samples_to_select = min(num_samples_to_select, num_total_samples)\n    return sample_indices[:num_samples_to_select]\n\n\ndef select_samples_by_category(\n    sample_category_labels: List[Any],\n    random_seed: int,\n    num_samples_per_category: Optional[int] = None,\n    percentage_of_samples_per_category: Optional[float] = None,\n) -> List[int]:\n    \"\"\"\n    Randomly selects a specified number/percentage of samples from each category.\n\n    Only one of `num_samples_per_category` and `percentage_of_samples_per_category` should be provided.\n    Selects all the samples if neither of them are provided.\n\n    Args:\n        sample_category_labels: A list of category labels.\n        random_seed: An integer seed to use for random selection.\n        num_samples_per_category: An optional integer indicating the number of samples to select from each category.\n        percentage_of_samples_per_category: An optional float in the range (0, 100] indicating the percentage of\n            samples to select from each category.\n\n    Returns:\n        A list of (integer) indices of the selected samples.\n\n    Raises:\n        ValueError if both `num_samples_per_category` and `percentage_of_samples_per_category` are provided.\n    \"\"\"\n    if (\n        num_samples_per_category is not None\n        and percentage_of_samples_per_category is not None\n    ):\n        raise ValueError(\n            \"Only one of `num_samples_per_category` and `percentage_of_samples_per_category` should be provided.\"\n        )\n\n    if num_samples_per_category is None and percentage_of_samples_per_category is None:\n        return list(range(len(sample_category_labels)))\n\n    if num_samples_per_category is not None and num_samples_per_category < 1:\n        raise ValueError(\"`num_samples_per_category` should be greater than 0.\")\n\n    if percentage_of_samples_per_category is not None:\n        if not 0 < percentage_of_samples_per_category <= 100:\n            raise ValueError(\n                \"`percentage_of_samples_per_category` should be in the range (0, 100].\"\n            )\n\n    category_specific_samples = collections.defaultdict(list)\n    for ind, label in enumerate(sample_category_labels):\n        category_specific_samples[label].append(ind)\n\n    rng = random.Random(random_seed)\n    selected_sample_indices = []\n    for label, sample_indices in category_specific_samples.items():\n        rng.shuffle(sample_indices)\n        if num_samples_per_category:\n            num_samples = num_samples_per_category\n        else:\n            num_samples = int(\n                percentage_of_samples_per_category * len(sample_indices) / 100\n            )\n        num_samples = min(num_samples, len(sample_indices))\n        selected_sample_indices += sample_indices[:num_samples]\n\n    return selected_sample_indices\n"
  },
  {
    "path": "corenet/data/datasets/utils/text.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport re\nimport urllib\n\nimport ftfy\n\n\ndef caption_preprocessing(caption: str) -> str:\n    \"\"\"Removes the unwanted tokens (e.g., HTML tokens, next line, unwanted spaces) from\n    the text.\"\"\"\n    # captions may contain HTML tokens. Remove them\n    html_re = re.compile(\"<.*?>\")\n    caption = urllib.parse.unquote(str(caption))\n    caption = caption.replace(\"+\", \" \")\n    caption = re.sub(html_re, \"\", str(caption))\n    # remove the next line\n    caption = caption.strip(\"\\n\")\n    # remove unwanted spaces\n    caption = re.sub(\" +\", \" \", caption)\n\n    caption = ftfy.fix_text(caption)\n    return caption.strip().lower()\n"
  },
  {
    "path": "corenet/data/datasets/utils/video.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\"\"\"Contains helper functions for reading from video detection datasets.\n\n    NOTE: Annotations are stored via a @rectangles_dict of the form:\n        Dict:\n            key -> identity:\n                Annotation list of Dicts for different timestamps:\n                    timestamp (float): The timestamp representing the seconds since the\n                        video began, ex. 1.2 is 1.2 seconds into the video.\n                    x0 (float): Normalized pixel space coordinate of top left of\n                        bounding box.\n                    y0 (float): Normalized pixel space coordinate of top left of\n                        bounding box.\n                    x1 (float): Normalized pixel space coordinate of bottom right of\n                        bounding box.\n                    y1 (float): Normalized pixel space coordinate of bottom right of\n                        bounding box.\n                    <class_label_name> (int): Label of the class. The key to\n                        this field depends on the dataset.\n                    is_visible (bool): []Optional] Whether bounding box is\n                        visible.\n        See `tests/data/datasets/utils/video_test.py` for an example of this dictionary.\n\"\"\"\n\nimport functools\nfrom typing import Any, Collection, Dict, List, Literal, Optional, Tuple, Union\n\nimport numpy as np\n\nfrom corenet.utils import logger\n\nEPS = 1e-6\n\n\ndef _simultaneous(\n    this_timestamp: float,\n    other_timestamp: float,\n    time_eps: float = EPS,\n) -> bool:\n    return abs(this_timestamp - other_timestamp) < time_eps\n\n\ndef _before(this_timestamp: float, other_timestamp: float) -> bool:\n    return (\n        not _simultaneous(this_timestamp, other_timestamp)\n        and this_timestamp < other_timestamp\n    )\n\n\ndef fetch_labels_from_timestamps(\n    class_label_name: str,\n    timestamps: List[float],\n    rectangles_dict: Dict[str, List[Dict[str, Any]]],\n    interpolation_cutoff_threshold_sec: Optional[float] = None,\n    progressible_labels: Optional[Collection[int]] = None,\n    carry_over_keys: Optional[Union[List[str], Literal[True]]] = None,\n    required_keys: Optional[List[str]] = None,\n) -> Dict[str, List[Dict[str, Any]]]:\n    \"\"\"Returns object labels for the specified video frame timestamps.\n\n    The result will retain the structure of `rectangles_dict`, but just ensure that the\n    timestamp values are as requested.\n\n    If `progressible_labels` are supplied, the `\"progress\"` field will be included. This\n    field represents the 'normalized' amount of time that the class label has existed\n    temporally. See\n    tests/data/datasets/utils/test_video.py:test_fetch_frame_with_progress for examples.\n\n    This fetching function can be used for (per-frame) video classification pipelines.\n\n    Args:\n        class_label_name: The field name in `rectangles_dict` that maps to the class\n            label.\n        timestamps: A list of timestamps to fectch label from.\n        rectangles_dict: (See docstring at top of file.)\n        interpolation_cutoff_threshold_sec: Threshold under which we allow\n            interpolation. In some `rectangles_dict`s, the labels (within the same\n            track) are so far apart (e.g. 10 seconds) that interpolation is\n            non-sensical. Thus this value prevents unrelated labels from being\n            interpolated.\n        progressible_labels: Set of labels for which to calculate `\"progress\"` for the\n            resulting bounding boxes. If None, no `\"progress\"` field will be included.\n        carry_over_keys: A list of keywords that specifies which keys should be carried\n            over from the previous rectangle during interpolation. Defaults to None.\n            True means to carry over all keys.\n        required_keys: A list of keywords that specifies which keywords need to be\n            included in a new bounding_box in addition to the @class_label_name.\n            Defaults to None.\n\n    Returns:\n        Dict containing the labels, still indexable by track id.\n    \"\"\"\n\n    if progressible_labels is not None and len(progressible_labels) > 1:\n        raise NotImplementedError(\n            \"Currently only the calculation of one progressible label is supported;\"\n            f\" got labels={progressible_labels}.\"\n        )\n\n    labels = []\n    for timestamp in timestamps:\n        labels.append(\n            _fetch_frame_label(\n                class_label_name,\n                timestamp,\n                rectangles_dict,\n                interpolation_cutoff_threshold_sec,\n                progressible_labels,\n                carry_over_keys,\n                required_keys,\n            )\n        )\n\n    # Reslice @labels to be a dict of lists.\n    ret = {}\n    for label in labels:\n        # @label is a dict with a key and dict of values.\n        for k, v in label.items():\n            if k not in ret:\n                ret[k] = []\n            ret[k].append(v)\n\n    return ret\n\n\ndef _make_fake_bbox(\n    rectangles_dict: Dict[str, List[Dict[str, Any]]],\n    timestamp: float,\n    progressible_labels: Optional[Collection[int]] = None,\n    required_keys: Optional[List[str]] = None,\n) -> Dict[str, Any]:\n    \"\"\"Creates a fake bounding box annotation.\n\n    Args:\n        rectangles_dict: dictionary of annotations.\n        timestamp: timestamp for make bounding box.\n        progressive_labels: whether to add progressive labels or not.\n        required_keys: A list of keywords that specifies which keywords need to be\n            included in a new bounding_box in addition to the class_label_name. Defaults\n            to None.\n\n    Returns:\n        bounding box annotation at @timestamp that is not visible with all other values\n        set to None.\n    \"\"\"\n    keys = rectangles_dict[list(rectangles_dict.keys())[0]][0].keys()\n    res = {key: None for key in keys}\n    res[\"is_visible\"] = False\n    res[\"timestamp\"] = timestamp\n    if required_keys is not None:\n        for key in required_keys:\n            res[key] = None\n\n    if progressible_labels is not None and len(progressible_labels) > 0:\n        res[\"progress\"] = None\n    return res\n\n\ndef _fetch_frame_label(\n    class_label_name: str,\n    timestamp: float,\n    rectangles_dict: Dict[str, List[Dict[str, Any]]],\n    interpolation_cutoff_threshold_sec: Optional[float] = None,\n    progressible_labels: Optional[Collection[int]] = None,\n    carry_over_keys: Optional[Union[List[str], Literal[True]]] = None,\n    required_keys: Optional[List[str]] = None,\n) -> Dict[str, Dict[str, Any]]:\n    \"\"\"Returns object labels for the specified video frame timestamp.\n\n    The result will retain the structure of `rectangles_dict`, but just ensure that the\n    timestamp value is as requested.\n\n    If `progressible_labels` are supplied, the `\"progress\"` field will be included. This\n    field represents the 'normalized' amount of time that the class label has existed\n    temporally. See\n    tests/data/datasets/utils/test_video.py:test_fetch_frame_with_progress for examples.\n\n    This fetching function can be used for (per-frame) video classification pipelines.\n\n    Args:\n        class_label_name: The field name in `rectangles_dict` that maps to the class\n            label.\n        timestamps: A list of timestamps to fectch label from.\n        rectangles_dict: (See docstring at top of file.)\n        interpolation_cutoff_threshold_sec: Threshold under which we allow\n            interpolation. In some `rectangles_dict`s, the labels (within the\n            same track) are so far apart (e.g. 10 seconds) that interpolation is\n            non-sensical. Thus this value prevents unrelated labels from being\n            interpolated.\n        progressible_labels: Set of label values for which to calculate `\"progress\"` for\n            the resulting bounding boxes. If None, no `\"progress\"` field will be included.\n        carry_over_keys: A list of keywords that specifies which keys should be carried\n            over from the previous rectangle during interpolation. Defaults to None.\n            True means to carry over all keys.\n        required_keys: A list of keywords that specifies which keywords need to be\n            included in a new bounding_box in addition to the class_label_name. Defaults\n            to None.\n\n    Returns:\n        Dict containing the labels, still indexable by track id.\n    \"\"\"\n\n    ret = {}\n    for track_label, track_rectangles in rectangles_dict.items():\n        all_times = [a[\"timestamp\"] for a in track_rectangles]\n        if not (all_times) == sorted(all_times):\n            raise RuntimeError(\"all_times should be sorted.\")\n\n        if _before(timestamp, all_times[0]) or _before(all_times[-1], timestamp):\n            # The track doesn't exist or has ceased to exist.\n            ret[track_label] = _make_fake_bbox(\n                rectangles_dict, timestamp, progressible_labels, required_keys\n            )\n            continue\n\n        idx = np.searchsorted(np.array(all_times), timestamp, side=\"right\")\n\n        # idx may be at the start/end if the timestamp is within EPS\n        before_idx = max(idx - 1, 0)\n        after_idx = min(idx, len(all_times) - 1)\n\n        before_time = all_times[before_idx]\n        after_time = all_times[after_idx]\n\n        # Either box for interpolation is invisible.\n        if (\n            not track_rectangles[before_idx][\"is_visible\"]\n            or not track_rectangles[after_idx][\"is_visible\"]\n        ):\n            # We make a fake annotation for invisible boxes.\n            ret[track_label] = _make_fake_bbox(\n                rectangles_dict, timestamp, progressible_labels, required_keys\n            )\n            continue\n\n        # Boxes for interpolation are too far away.\n        if (\n            interpolation_cutoff_threshold_sec is not None\n            and after_time - before_time > interpolation_cutoff_threshold_sec\n        ):\n            ret[track_label] = _make_fake_bbox(\n                rectangles_dict, timestamp, progressible_labels, required_keys\n            )\n            continue\n\n        # pylint: disable=unbalanced-tuple-unpacking\n        x0, x1, y0, y1 = _interpolate_bounding_box(\n            track_rectangles[before_idx],\n            track_rectangles[after_idx],\n            timestamp - before_time,\n            after_time - before_time,\n        )\n\n        if carry_over_keys is None:\n            new_label = {}\n        elif carry_over_keys is True:\n            # Copy the whole thing - bbox coords/timestamp are overridden below\n            new_label = {**track_rectangles[before_idx]}\n        else:\n            new_label = {\n                key: track_rectangles[before_idx][key]\n                for key in carry_over_keys\n                if key in track_rectangles[before_idx]\n            }\n\n        if required_keys is not None:\n            for key in required_keys:\n                new_label[key] = track_rectangles[before_idx].get(key, None)\n        # New label will have updated coordinates and timestamp.\n        new_label[\"x0\"] = x0\n        new_label[\"x1\"] = x1\n        new_label[\"y0\"] = y0\n        new_label[\"y1\"] = y1\n        new_label[\"timestamp\"] = timestamp\n\n        if progressible_labels is not None:\n            progress = None\n            if track_rectangles[before_idx][class_label_name] in progressible_labels:\n                search_fn = functools.partial(\n                    _search_for_label_edge_timestamp,\n                    class_label_name,\n                    track_rectangles,\n                    before_idx,\n                    interpolation_cutoff_threshold_sec=interpolation_cutoff_threshold_sec,\n                )\n                start_timestamp = search_fn(-1)\n                end_timestamp = search_fn(+1)\n                progress = (timestamp - start_timestamp) / (\n                    end_timestamp - start_timestamp\n                )\n            new_label[\"progress\"] = progress\n\n        _assert_progress_repr(class_label_name, progressible_labels, new_label)\n        ret[track_label] = new_label\n\n    return ret\n\n\ndef _assert_progress_repr(\n    class_label_name: str,\n    progressible_labels: Optional[Collection[int]],\n    new_label: Dict[str, Any],\n) -> None:\n    if progressible_labels is None:\n        assert \"progress\" not in new_label\n    else:\n        assert \"progress\" in new_label\n        if new_label[class_label_name] in progressible_labels:\n            # We shouldn't ever return a 'progressible label' while not returning the\n            # `\"progress\"` field.\n            assert 0.0 <= new_label[\"progress\"] <= 1.0\n        else:\n            # We shouldn't ever return the `\"progress\"` field while not returning a\n            # 'progressible label'.\n            assert new_label[\"progress\"] == None\n\n\ndef _search_for_label_edge_timestamp(\n    class_label_name: str,\n    track_rectangles: List[Dict[str, Any]],\n    cur_idx: int,\n    step: int,\n    interpolation_cutoff_threshold_sec: Optional[float] = None,\n) -> float:\n    \"\"\"Find the timestamp of the furthest invisible annotation that has the same label\n    with `class_label_name`.\n\n    Args:\n        class_label_name: The string name of the target class's annotation to search.\n        track_rectangles: The annotation of an identity across time.\n        cur_idx: The index of the annotation in `track_rectangles` to start searching.\n        step: The step to search for the timestamp. A positive step indicates the\n            timstamp should be after `cur_idx`'s; while a negative step indicates the\n            timestamp should be before `cur_idx`'s.\n        interpolation_cutoff_threshold_sec: The threshold of timestamp difference where\n            the label value changes.\n\n    Returns:\n        The edge timestamp.\n    \"\"\"\n    label = track_rectangles[cur_idx][class_label_name]\n\n    def in_bounds(idx: int) -> bool:\n        return 0 <= idx < len(track_rectangles)\n\n    while True:\n        cur_idx += step\n        if not in_bounds(cur_idx):\n            # If the original video clips were split into smaller clips before running\n            # this pipeline (which occurs with some datasets), then there is a chance\n            # that this annotation was split into two separate clips. However, since the\n            # label is at the edge of the clip, we don't know if it was split, or if the\n            # label just coinciedentally starts/ends at this edge of the video.\n            logger.warning(\n                \"Annotation is potentially split across video clips. This \"\n                \"makes the 'progress' calculation inherently unreliable.\"\n            )\n            break\n        cur_rectangle = track_rectangles[cur_idx]\n        if cur_rectangle[class_label_name] != label or not cur_rectangle[\"is_visible\"]:\n            break\n\n    outside_idx = cur_idx  # First encountered outside label idx.\n    inside_idx = cur_idx - step  # Last known 'inside' label idx.\n    inside_timestamp = track_rectangles[inside_idx][\"timestamp\"]\n\n    if in_bounds(outside_idx):\n        # Since we know that the label at `outside_idx` is valid, but different than the\n        # relevant action, we can interpolate halfway between (of course, only if the\n        # labels are within the threshold).\n        outside_timestamp = track_rectangles[outside_idx][\"timestamp\"]\n\n        if step > 0 and (\n            interpolation_cutoff_threshold_sec is None\n            or (\n                abs(inside_timestamp - outside_timestamp)\n                < interpolation_cutoff_threshold_sec\n            )\n        ):\n            # In this case, `outside_idx` is at the first timestamp which has a\n            # differing label. Since we use the \"floor\" convention for computing the\n            # label, `outside_timestamp` is our upper bound.\n            return outside_timestamp\n\n    return inside_timestamp\n\n\ndef _interpolate_bounding_box(\n    before: Dict[str, Any],\n    after: Dict[str, Any],\n    delta: float,\n    range_delta: float,\n) -> Tuple[float, float, float, float]:\n    \"\"\"Given two adjacent bounding box annotations, return an interpolated label.\n\n    Note that @delta and @range_delta must be positive, and @delta must be between 0 and\n    `range_delta`, inclusively.\n\n    Args:\n        before: Bounding box label with lesser timestamp.\n        after: Bounding box label with greater timestamp.\n        delta: Time after `before` to compute label.\n        range_delta: Time separating `before` and `after`.\n\n    Returns:\n        Bounding box label that is linearly interpolated between `before` and `after`.\n    \"\"\"\n    if range_delta < 0:\n        raise ValueError(\n            f\"@range_delta must be positive. Got range_delta={range_delta}.\"\n        )\n\n    if range_delta < 1e-5:\n        return [before[key] for key in [\"x0\", \"x1\", \"y0\", \"y1\"]]\n\n    if delta < 0 or delta - range_delta > EPS:\n        # Some floating point arithmetic causes delta-range_delta to be a small value\n        # above zero even if they're equal. Hence the epsilon.\n        raise ValueError(\n            f\"@delta must be between 0 and @range_delta, inclusively. Got delta={delta},\"\n            f\"range_delta={range_delta}.\"\n        )\n\n    ret = []\n    for key in [\"x0\", \"x1\", \"y0\", \"y1\"]:\n        alpha = 1.0 - delta / range_delta\n        ret.append(before[key] * alpha + after[key] * (1.0 - alpha))\n\n    return ret\n"
  },
  {
    "path": "corenet/data/io/__init__.py",
    "content": ""
  },
  {
    "path": "corenet/data/io/transfer_clients.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\n\nimport argparse\nimport os\nimport random\nimport time\nfrom argparse import ArgumentParser\nfrom functools import cached_property\nfrom pathlib import Path\nfrom typing import List, Optional, Union\nfrom urllib.parse import urlparse\n\nimport boto3\nimport requests\nfrom boto3.s3.transfer import S3Transfer, TransferConfig\nfrom joblib import Parallel, delayed\n\nfrom corenet.constants import if_test_env\nfrom corenet.utils import logger, resources\nfrom corenet.utils.common_utils import construct_local_path_from_remote\nfrom corenet.utils.ddp_utils import dist_barrier, is_master, is_start_rank_node\nfrom corenet.utils.registry import Registry\nfrom corenet.utils.retry_utils import run_with_retries\n\n\nclass BaseClient(object):\n    \"\"\"Base class for transfer clients.\n\n    Args:\n        opts: Command-line arguments.\n        max_retries: Maximum download retries. Defaults to 5.\n        force_delete: Force the file to be deleted if it is present locally. The local path is a concatenation of 'dst_location' and basename of 'remote_file'\n        only_download_on_start_rank: Download the files on the start rank of each node.\n        synchronize_distributed_ranks: Synchronize DDP ranks after downloading.\n        parallel_download: If enabled, files are downloaded in parallel in 'download_multiple_files' function.\n        max_download_workers: Maximum number of workers for downloading. Should satisfy 1 <= 'max_download_workers' <= num_cpus.\n\n    ...note:\n        During regular training, setting 'force_delete' to 'None' is equivalent to specifying 'force_delete=True.' However, when running tests with pytest, 'None' is\n        interpreted as 'False' to optimize test execution speed.\n    \"\"\"\n\n    def __init__(\n        self,\n        opts: argparse.Namespace,\n        max_retries: int = 5,\n        force_delete: Optional[bool] = None,\n        only_download_on_start_rank: bool = True,\n        synchronize_distributed_ranks: bool = True,\n        parallel_download: bool = False,\n        max_download_workers: int = 1,\n        *args,\n        **kwargs,\n    ) -> None:\n        n_cpus = resources.cpu_count()\n        if max_download_workers < 1 or max_download_workers > n_cpus:\n            raise RuntimeError(\n                \"Maximum number of download workers should be between 1 and number of\"\n                f\" available CPUs. Got: {max_download_workers}.\"\n            )\n        self.opts = opts\n        self.max_retries = max_retries\n        self.force_delete = force_delete\n        self.download_on_start_rank = only_download_on_start_rank\n        self.synchronize_distributed_ranks = synchronize_distributed_ranks\n        self.parallel_download = parallel_download\n        self.is_master_node = is_master(opts)\n        self.n_download_workers = max_download_workers\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        \"\"\"Add client-specific arguments.\"\"\"\n        if cls != BaseClient:\n            # Don't re-register arguments in subclasses that don't override `add_arguments()`.\n            return parser\n        return parser\n\n    @cached_property\n    def start_rank_node(self) -> bool:\n        \"\"\"Check whether this process runs on the starting rank of its node.\"\"\"\n        opts = self.opts\n        return is_start_rank_node(opts)\n\n    @cached_property\n    def sync_distributed_ranks(self) -> bool:\n        \"\"\"Synchronize the ranks during distributed training.\"\"\"\n        opts = self.opts\n        sync_ranks = self.synchronize_distributed_ranks\n        # 'ddp.use_distributed' is a private argument, therefore, default value is set.\n        return getattr(opts, \"ddp.use_distributed\", False) and sync_ranks\n\n    def _download_fn(self, remote_path: str, local_path: str) -> None:\n        \"\"\"Attempts downloading 'remote_path' to 'local_path' without retries.\n\n        Args:\n            remote_path: Remote file path.\n            local_path: Local path where file should be downloaded.\n        \"\"\"\n        raise NotImplementedError(\n            f\"Child classes of {self.__class__.__name__} must implement downloading logic.\"\n        )\n\n    def _download_with_retries(self, remote_path: str, local_path: str) -> None:\n        \"\"\"Download 'remote_path' to 'local_path' with retries.\"\"\"\n        run_with_retries(\n            self._download_fn,\n            max_retries=self.max_retries,\n            args=(remote_path, local_path),\n            function_name=f\"download {remote_path} using {type(self).__name__}\",\n        )\n\n    def _download_single_file(self, remote_path: str, dst_dir: str) -> str:\n        \"\"\"Download single remote file locally.\n\n        Args:\n            remote_path: Path of the remote file.\n            dst_dir: Local storage directory.\n\n        Returns:\n            Local file path.\n        \"\"\"\n        force_delete = self.force_delete\n        if force_delete is None:\n            # An alternative approach is to move this logic to the argument's default value in the function signature:\n            #     def get_local_path(..., force_delete = if_test_env(False, otherwise=True), ...):\n            # But that won't always work because pytest may set PYTEST_CURRENT_TEST env set loading this module.\n            force_delete = if_test_env(False, otherwise=True)\n\n        local_path = construct_local_path_from_remote(\n            remote_path=remote_path, local_dir=dst_dir\n        )\n\n        if os.path.isfile(local_path) and force_delete:\n            # If file exists, remove it and then download again\n            if self.download_on_start_rank:\n                # Remove the file from start rank and let other ranks in DDP keep waiting till file is deleted\n                if is_start_rank_node(self.opts):\n                    os.remove(local_path)\n                else:\n                    while not os.path.isfile(local_path):\n                        time.sleep(if_test_env(0, otherwise=1))\n                        continue\n            else:\n                # All ranks in DDP deletes the file\n                os.remove(local_path)\n\n        if not os.path.isfile(local_path):\n            if self.download_on_start_rank:\n                # Download the file using start rank and let other ranks in DDP keep waiting till file is downloaded\n                if self.start_rank_node:\n                    self._download_with_retries(remote_path, local_path)\n                else:\n                    while not os.path.isfile(local_path):\n                        time.sleep(if_test_env(0, otherwise=1))\n                        continue\n            else:\n                # All ranks in DDP downloads the file\n                self._download_with_retries(remote_path, local_path)\n\n        if self.sync_distributed_ranks:\n            # synchronize between ranks\n            dist_barrier()\n        return local_path\n\n    def _download_multiple_files(\n        self, remote_file_paths: List[str], dst_dir: str\n    ) -> List[str]:\n        \"\"\"Download multiple remote files locally either sequentially or simultaneously.\n\n        Args:\n            remote_file_paths: List of remote file paths.\n            dst_dir: Local storage directory.\n\n        Returns:\n            List of local file paths.\n        \"\"\"\n        total_files = len(remote_file_paths)\n        if total_files < 1:\n            raise RuntimeError(\"Need at least one file for downloading.\")\n\n        if self.parallel_download and total_files > 1:\n            n_workers = min(self.n_download_workers, total_files)\n            local_paths = Parallel(n_jobs=n_workers)(\n                delayed(self._download_single_file)(remote_file_path, dst_dir)\n                for remote_file_path in remote_file_paths\n            )\n        else:\n            local_paths = [\n                self._download_single_file(\n                    remote_path=remote_file_path, dst_dir=dst_dir\n                )\n                for remote_file_path in remote_file_paths\n            ]\n        return local_paths\n\n    def download(\n        self, remote_file_paths: Union[str, List[str]], dst_dir: str\n    ) -> Union[str, List[str]]:\n        \"\"\"Download remote files locally.\n\n        Args:\n            remote_file_paths: Single (or list) remote file path(s).\n            dst_dir: Local storage directory.\n\n        Returns:\n            Single (or list) local file path(s).\n        \"\"\"\n        Path(dst_dir).mkdir(exist_ok=True, parents=True)\n\n        if isinstance(remote_file_paths, List):\n            return self._download_multiple_files(remote_file_paths, dst_dir)\n        elif isinstance(remote_file_paths, str):\n            return self._download_single_file(remote_file_paths, dst_dir)\n        else:\n            raise NotImplementedError(\n                f\"Supported file paths for downloading are string or List[str]. Got: {type(remote_file_paths)}.\"\n            )\n\n\nTRANSFER_CLIENT_REGISTRY = Registry(\n    registry_name=\"transfer_client_registry\",\n    base_class=BaseClient,\n    lazy_load_dirs=[\"corenet/data/io\"],\n    internal_dirs=[\"corenet/internal\", \"corenet/internal/projects/*\"],\n)\n\n\n@TRANSFER_CLIENT_REGISTRY.register(name=\"s3\")\nclass S3Client(BaseClient):\n    \"\"\"Client to download files from S3.\"\"\"\n\n    def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None:\n        endpoint_url = getattr(opts, \"common.s3.endpoint_url\")\n        aws_access_key_id = getattr(opts, \"common.s3.aws_access_key_id\")\n        aws_secret_access_key = getattr(opts, \"common.s3.aws_secret_access_key\")\n        aws_session_token = getattr(opts, \"common.s3.aws_session_token\")\n        super().__init__(opts, *args, **kwargs)\n        self.boto_transfer_client = self.init_client(\n            endpoint_url=endpoint_url,\n            aws_access_key_id=aws_access_key_id,\n            aws_secret_access_key=aws_secret_access_key,\n            aws_session_token=aws_session_token,\n        )\n\n    def transfer_config(self) -> TransferConfig:\n        multipart_chunksize = getattr(self.opts, \"common.s3.multipart_chunksize\")\n        transfer_config = TransferConfig(\n            multipart_chunksize=multipart_chunksize,\n            num_download_attempts=self.max_retries,\n        )\n        return transfer_config\n\n    def init_client(\n        self,\n        endpoint_url: Optional[str] = None,\n        aws_access_key_id: Optional[str] = None,\n        aws_secret_access_key: Optional[str] = None,\n        aws_session_token: Optional[str] = None,\n    ) -> S3Transfer:\n        \"\"\"Initialize S3Transfer client.\n\n        Args:\n            endpoint_url: Endpoint URL. If none, botocore will automatically construct the\n                appropriate URL to use when communicating with a service.\n            aws_access_key_id: The access key to use when creating the client. If None, the\n                credentials configured for the session will automatically be used.\n            aws_secret_access_key: The secret key to use when creating the client. Same semantics\n                as 'aws_access_key_id'.\n            aws_session_token: The session token to use when creating the client. Same semantics\n                as 'aws_access_key_id'.\n        Returns:\n            An instance of 'S3Transfer'.\n        \"\"\"\n\n        transfer_config = self.transfer_config()\n        self.boto_client = boto3.client(\n            service_name=\"s3\",\n            endpoint_url=endpoint_url,\n            aws_access_key_id=aws_access_key_id,\n            aws_secret_access_key=aws_secret_access_key,\n            aws_session_token=aws_session_token,\n        )\n        boto_transfer_client = S3Transfer(self.boto_client, transfer_config)\n        return boto_transfer_client\n\n    @classmethod\n    def add_arguments(cls, parser: ArgumentParser) -> ArgumentParser:\n        \"\"\"S3 client specific arguments.\n\n        ...note:\n            More details can be found in boto3, an AWS SDK for Python.\n        \"\"\"\n        if cls != S3Client:\n            return parser\n        group = parser.add_argument_group(cls.__name__)\n        group.add_argument(\n            \"--common.s3.endpoint-url\",\n            type=str,\n            default=None,\n            help=\"Endpoint URL for S3 client. Defaults to None.\",\n        )\n        group.add_argument(\n            \"--common.s3.aws-access-key-id\",\n            type=str,\n            default=None,\n            help=\"AWS Access key id. Defaults to None.\",\n        )\n        group.add_argument(\n            \"--common.s3.aws-secret-access-key\",\n            type=str,\n            default=None,\n            help=\"AWS secret access key. Defaults to None.\",\n        )\n        group.add_argument(\n            \"--common.s3.aws-session-token\",\n            type=str,\n            default=None,\n            help=\"AWS session token. Defaults to None.\",\n        )\n        group.add_argument(\n            \"--common.s3.multipart-chunksize\",\n            type=str,\n            default=64 * 1024 * 1024,\n            help=\"The partition size of each part for a multipart transfer. Defaults to 64 MB.\",\n        )\n\n        return parser\n\n    def _download_fn(self, remote_path: str, local_path: str) -> None:\n        parsed_url = urlparse(remote_path)\n        self.boto_transfer_client.download_file(\n            bucket=parsed_url.netloc,\n            key=parsed_url.path.lstrip(\"/\"),\n            filename=local_path,\n        )\n\n\n@TRANSFER_CLIENT_REGISTRY.register(name=\"http\")\nclass HTTPClient(BaseClient):\n    \"\"\"Client to download files from HTTP.\"\"\"\n\n    def __init__(self, opts, *args, **kwargs) -> None:\n        super().__init__(opts, *args, **kwargs)\n\n    @cached_property\n    def proxies(self):\n        return {\n            \"https\": os.environ.get(\"HTTPS_PROXY\", None),\n            \"http\": os.environ.get(\"HTTP_PROXY\", None),\n        }\n\n    def _download_fn(self, remote_path: str, local_path: str) -> None:\n        response = requests.get(remote_path, stream=True)\n        if response.status_code == 403:\n            # Try with the HTTP/HTTPS proxy from ENV\n            response = requests.get(remote_path, stream=True, proxies=self.proxies)\n        if response.status_code == 200:\n            with open(local_path, \"wb\") as f:\n                f.write(response.raw.read())\n        else:\n            raise IOError(f\"Download failed with status code {response.status_code}.\")\n\n\n@TRANSFER_CLIENT_REGISTRY.register(name=\"https\")\nclass HTTPSClient(HTTPClient):\n    \"\"\"Client to download files from HTTPS.\"\"\"\n\n    def __init__(self, opts, *args, **kwargs) -> None:\n        super().__init__(opts, *args, **kwargs)\n\n\ndef get_transfer_client(\n    opts: argparse.Namespace,\n    transfer_client_name: str,\n    max_retries: int = 5,\n    force_delete: Optional[bool] = None,\n    only_download_on_start_rank: bool = True,\n    synchronize_distributed_ranks: bool = True,\n    parallel_download: bool = False,\n    max_download_workers: int = 1,\n    raise_error_if_transfer_client_not_present: bool = True,\n) -> Optional[BaseClient]:\n    \"\"\"\n    Helper function to get transfer client.\n\n    Args:\n        opts: Command-line arguments.\n        transfer_client_name: Name of the transfer client.\n        max_retries: Maximum download retries. Defaults to 5.\n        force_delete: Force the file to be deleted if it is present in the `cache_loc`.\n        only_download_on_start_rank: Download the files on the start rank of each node.\n        synchronize_distributed_ranks: Synchronize DDP ranks after downloading.\n        parallel_download: If enabled, files are downloaded in parallel.\n        max_download_workers: Maximum number of workers for downloading. Should satisfy 1 <= 'max_download_workers' <= num_cpus.\n        raise_error_if_transfer_client_not_present: Raise an error if client is not present.\n\n    Returns:\n        The transfer client requested will be returned if it's available. Otherwise, an error will be raised if the 'raise_error_if_transfer_client_not_present' flag is set to True, or None will be returned.\n\n    ...note:\n        In certain places, we may want to control the error handling different (e.g., 'get_local_path' is a no-op when path is a local). To enable such case,\n        use 'raise_error_if_transfer_client_not_present' flag.\n    \"\"\"\n\n    if transfer_client_name in TRANSFER_CLIENT_REGISTRY.keys():\n        client_cls = TRANSFER_CLIENT_REGISTRY[transfer_client_name]\n        client = client_cls(\n            opts,\n            max_retries=max_retries,\n            force_delete=force_delete,\n            only_download_on_start_rank=only_download_on_start_rank,\n            synchronize_distributed_ranks=synchronize_distributed_ranks,\n            parallel_download=parallel_download,\n            max_download_workers=max_download_workers,\n        )\n        return client\n    elif raise_error_if_transfer_client_not_present:\n        raise RuntimeError(\n            f\"Requested transfer client, i.e. {transfer_client_name}, is not available. \\\n                Available clients are {list(TRANSFER_CLIENT_REGISTRY.keys())}\"\n        )\n    else:\n        return None\n\n\ndef transfer_client_arguments(\n    parser: argparse.ArgumentParser,\n) -> argparse.ArgumentParser:\n    \"\"\"Transfer client arguments.\"\"\"\n    return TRANSFER_CLIENT_REGISTRY.all_arguments(parser)\n"
  },
  {
    "path": "corenet/data/loader/__init__.py",
    "content": ""
  },
  {
    "path": "corenet/data/loader/dataloader.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport sys\nfrom typing import Callable, Dict, List, Optional, Union\n\nimport torch\nfrom torch.utils.data import DataLoader\n\nfrom corenet.data.datasets.dataset_base import BaseDataset, BaseIterableDataset\nfrom corenet.data.sampler import Sampler\n\n\nclass CoreNetDataLoader(DataLoader):\n    \"\"\"Data loader class that combines a dataset and a sampler, and provides an iterable over\n    the given dataset.\n\n    Args:\n        dataset: Dataset from which to load the data.\n        batch_size: How many samples per batch to load.\n        batch_sampler: Defines the strategy to\n            returns a batch of indices at a time.\n        num_workers: Number of subprocesses to use for data loading. Defaults to 1.\n        pin_memory: If ``True``, the data loader will copy Tensors into device/CUDA pinned\n            memory before returning them.\n        persistent_workers: If ``True``, the data loader will not shutdown\n            the worker processes after a dataset has been consumed once. This allows to\n            maintain the workers `Dataset` instances alive. Defaults to False.\n        collate_fn: Merges a list of samples to form a mini-batch of Tensor(s). Typically used\n            when using batched loading from a map-style dataset.\n        prefetch_factor: Number of batches loaded in advance by each worker. The value of ``2`` means\n            there will be a total of 2 * num_workers batches prefetched across all workers. Default value depends\n            on the value for num_workers. If num_workers=0, then the default value of prefetch_factor is ``None``.\n            Otherwise, it is ``2`` for num_workers>0.\n    \"\"\"\n\n    def __init__(\n        self,\n        dataset: Union[BaseDataset, BaseIterableDataset],\n        batch_size: int,\n        batch_sampler: Sampler,\n        num_workers: Optional[int] = 1,\n        pin_memory: Optional[bool] = False,\n        persistent_workers: Optional[bool] = False,\n        collate_fn: Optional[\n            Callable[[List[Union[Dict, torch.Tensor]]], Union[Dict, torch.Tensor]]\n        ] = None,\n        prefetch_factor: Optional[int] = None,\n        *args,\n        **kwargs\n    ):\n        if num_workers == 0 and prefetch_factor is not None:\n            # prefecting can only be done during multiprocessing, so disabling it.\n            prefetch_factor = None\n        if num_workers > 0 and prefetch_factor is None:\n            # setting prefetch factor to 2 (same as PyTorch's default value for this condition.)\n            prefetch_factor = 2\n\n        super(CoreNetDataLoader, self).__init__(\n            dataset=dataset,\n            batch_size=batch_size,\n            batch_sampler=batch_sampler,\n            num_workers=num_workers,\n            pin_memory=pin_memory,\n            persistent_workers=persistent_workers,\n            collate_fn=collate_fn,\n            prefetch_factor=prefetch_factor,\n            *args,\n            **kwargs\n        )\n\n    def update_indices(self, new_indices: List, *args, **kwargs):\n        \"\"\"Update indices in the dataset class\"\"\"\n        if hasattr(self.batch_sampler, \"img_indices\") and hasattr(\n            self.batch_sampler, \"update_indices\"\n        ):\n            self.batch_sampler.update_indices(new_indices)\n\n    def __len__(self) -> int:\n        \"\"\"Number of samples in the dataset.\n\n        ...note:\n            The length of Iterable datasets is set to 'sys.maxsize' because '__len__' could be\n            inaccurate with naive multi-processing data loading for such datasets, as samples may\n            be duplicated. Similar to PyTorch's recommendation, we also discourage the use of '__len__'\n            for iterable datasets, and generally trust the corresponding iterable dataset class for\n            correct implementation.\n        \"\"\"\n        return (\n            sys.maxsize\n            if isinstance(self.dataset, BaseIterableDataset)\n            else len(self.dataset)\n        )\n\n    def get_sample_indices(self) -> List:\n        \"\"\"Sample IDs\"\"\"\n        return self.batch_sampler.img_indices\n"
  },
  {
    "path": "corenet/data/sampler/__init__.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nfrom typing import Callable, Dict, Mapping, Optional, Union\n\nfrom torch.utils.data.sampler import Sampler\n\nfrom corenet.data.sampler.base_sampler import BaseSampler, BaseSamplerDDP\nfrom corenet.utils.registry import Registry\n\nSAMPLER_REGISTRY = Registry(\n    registry_name=\"data_samplers\",\n    base_class=Sampler,\n    # lazily import the samplers\n    lazy_load_dirs=[\"corenet/data/sampler\"],\n    internal_dirs=[\"corenet/internal\", \"corenet/internal/projects/*\"],\n)\n\n\ndef build_sampler(\n    opts: argparse.Namespace,\n    n_data_samples: Union[int, Mapping[str, int]],\n    is_training: bool = False,\n    get_item_metadata: Optional[Callable[[int], Dict]] = None,\n    *args,\n    **kwargs\n) -> Sampler:\n    \"\"\"Helper function to build data sampler from command-line arguments\n\n    Args:\n        opts: Command-line arguments\n        n_data_samples: Number of data samples. It can be an integer specifying number of data samples for a given task\n            or a mapping of task name and data samples per task in case of a chain sampler.\n        get_item_metadata: A callable that provides sample metadata, given sample index.\n        is_training: Training mode or not. Defaults to False.\n\n    Returns:\n        Data sampler over which we can iterate.\n    \"\"\"\n    sampler_name = getattr(opts, \"sampler.name\")\n    is_distributed = getattr(opts, \"ddp.use_distributed\")\n\n    if (\n        is_distributed\n        and sampler_name.split(\"_\")[-1] != \"ddp\"\n        and sampler_name != \"chain_sampler\"\n    ):\n        # In case of a DDP environment, add `_ddp` to sampler name if not present\n        # with an exception to chain_sampler (which is nothing but a loop over existing samplers)\n        sampler_name = sampler_name + \"_ddp\"\n\n    sampler = SAMPLER_REGISTRY[sampler_name](\n        opts,\n        n_data_samples=n_data_samples,\n        is_training=is_training,\n        get_item_metadata=get_item_metadata,\n    )\n    return sampler\n\n\ndef add_sampler_arguments(\n    parser: argparse.ArgumentParser,\n) -> argparse.ArgumentParser:\n    \"\"\"Add sampler arguments to parser from SAMPLER_REGISTRY,\n    BaseSampler, and BaseSamplerDDP\"\"\"\n    parser = SAMPLER_REGISTRY.all_arguments(parser)\n    parser = BaseSampler.add_arguments(parser)\n    parser = BaseSamplerDDP.add_arguments(parser)\n    return parser\n"
  },
  {
    "path": "corenet/data/sampler/base_sampler.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nimport copy\nimport math\nimport random\nfrom typing import Any, Iterator, List, Tuple\n\nimport numpy as np\nimport torch\nimport torch.distributed as dist\nfrom torch.utils.data.sampler import Sampler\n\n\nclass BaseSampler(Sampler):\n    \"\"\"Base class for standard and DataParallel Sampler.\n\n    Every subclass should implement `__iter__` method, providing a way to iterate\n    over indices of dataset elements.\n\n    Args:\n        opts: Command line arguments.\n        n_data_samples: Number of samples in the dataset.\n        is_training: Training mode or not.\n    \"\"\"\n\n    def __init__(\n        self,\n        opts: argparse.Namespace,\n        n_data_samples: int,\n        is_training: bool = False,\n        *args,\n        **kwargs,\n    ) -> None:\n        # max between 1 and number of available GPUs. 1 because for supporting CPUs\n        n_gpus: int = max(1, torch.cuda.device_count())\n        batch_size_gpu0: int = get_batch_size_from_opts(opts, is_training=is_training)\n\n        n_samples_per_gpu = int(math.ceil(n_data_samples * 1.0 / n_gpus))\n        total_size = n_samples_per_gpu * n_gpus\n\n        indexes = [idx for idx in range(n_data_samples)]\n        # This ensures that we can divide the batches evenly across GPUs\n        indexes += indexes[: (total_size - n_data_samples)]\n        assert total_size == len(indexes)\n\n        self.img_indices = indexes\n        self.n_samples = total_size\n        self.batch_size_gpu0 = batch_size_gpu0\n        self.n_gpus = n_gpus\n        self.shuffle = True if is_training else False\n        self.epoch = 0\n\n        self.num_repeats = 1\n        self.trunc_rep_aug = False\n        self.start_shuffling_from_epoch = getattr(\n            opts, \"sampler.start_shuffling_from_epoch\"\n        )\n        if is_training:\n            # enable these arguments for repeated data augmentation\n            # https://openaccess.thecvf.com/content_CVPR_2020/papers/Hoffer_Augment_Your_Batch_Improving_Generalization_Through_Instance_Repetition_CVPR_2020_paper.pdf\n            self.num_repeats = getattr(opts, \"sampler.num_repeats\")\n            self.trunc_rep_aug = getattr(opts, \"sampler.truncated_repeat_aug_sampler\")\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        if cls != BaseSampler:\n            # Don't re-register arguments in subclasses that don't override `add_arguments()`.\n            return parser\n\n        # add sampler-specific arguments\n        group = parser.add_argument_group(cls.__name__)\n        group.add_argument(\n            \"--sampler.name\",\n            type=str,\n            default=None,\n            help=(\n                \"Name of the sampler. Defaults to None (i.e., user needs to specify the sampler if using MAP-style datasets).\"\n                \"Note that this argument is not applicable to iterable datasets.\"\n            ),\n        )\n        group.add_argument(\n            \"--sampler.num-repeats\",\n            type=int,\n            default=1,\n            help=\"Repeat the training dataset samples by this factor in each epoch (aka repeated augmentation). \"\n            \"This effectively increases samples per epoch. As an example, if dataset has 10000 samples \"\n            \"and sampler.num_repeats is set to 2, then total samples in each epoch would be 20000. \"\n            \"Defaults to 1.\",\n        )\n\n        group.add_argument(\n            \"--sampler.truncated-repeat-aug-sampler\",\n            action=\"store_true\",\n            default=False,\n            help=\"When enabled, it restricts the sampler to load a subset of the training dataset such that\"\n            \"number of samples obtained after repetition are the same as the original dataset.\"\n            \"As an example, if dataset has 10000 samples, sampler.num_repeats is set to 2, and \"\n            \"sampler.truncated_repeat_aug_sampler is enabled, then the sampler would sample \"\n            \"10000 samples in each epoch. Defaults to False.\",\n        )\n\n        group.add_argument(\n            \"--sampler.start-shuffling-from-epoch\",\n            default=0,\n            type=int,\n            help=\"Shuffle data indices during training from this epoch onwards. Defaults to 0 (i.e., shuffle from the first epoch).\",\n        )\n        return parser\n\n    def get_indices(self) -> List[int]:\n        \"\"\"Returns a list of indices of dataset elements to iterate over.\n\n        ...note:\n            If repeated augmentation is enabled, then indices will be repeated.\n        \"\"\"\n        img_indices = copy.deepcopy(self.img_indices)\n        if self.shuffle:\n            random.seed(self.epoch)\n            if self.epoch >= self.start_shuffling_from_epoch:\n                random.shuffle(img_indices)\n\n            if self.num_repeats > 1:\n                # Apply repeated augmentation\n                \"\"\"Assume that we have [0, 1, 2, 3] samples. With repeated augmentation,\n                we first repeat the samples [0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3] and then select 4\n                samples [0, 0, 0, 1]. Note that we do shuffle at the beginning, so samples are not the\n                same at every iteration.\n                \"\"\"\n                n_samples_before_repeat = len(img_indices)\n                img_indices = np.repeat(img_indices, repeats=self.num_repeats)\n                img_indices = list(img_indices)\n                if self.trunc_rep_aug:\n                    img_indices = img_indices[:n_samples_before_repeat]\n        return img_indices\n\n    def __iter__(self) -> Iterator[Tuple[Any, ...]]:\n        raise NotImplementedError\n\n    def __len__(self) -> int:\n        return len(self.img_indices) * (1 if self.trunc_rep_aug else self.num_repeats)\n\n    def set_epoch(self, epoch: int) -> None:\n        \"\"\"Helper function to set epoch in each sampler.\"\"\"\n        self.epoch = epoch\n\n    def update_scales(\n        self, epoch: int, is_master_node: bool = False, *args, **kwargs\n    ) -> None:\n        \"\"\"Helper function to update scales in each sampler. This is typically useful in variable-batch sampler.\n\n        Subclass is expected to implement this function. By default, we do not do anything\n        \"\"\"\n\n    def update_indices(self, new_indices: List[int]) -> None:\n        \"\"\"Update indices to new indices. This function might be useful for sample-efficient training.\"\"\"\n        self.img_indices = new_indices\n\n    def extra_repr(self) -> str:\n        extra_repr_str = (\n            f\"\\n\\t num_repeat={self.num_repeats}\"\n            f\"\\n\\t trunc_rep_aug={self.trunc_rep_aug}\"\n        )\n        return extra_repr_str\n\n    def __repr__(self) -> str:\n        return \"{}({}\\n)\".format(self.__class__.__name__, self.extra_repr())\n\n\nclass BaseSamplerDDP(Sampler):\n    \"\"\"Base class for DistributedDataParallel Sampler.\n\n    Every subclass should implement `__iter__` method, providing a way to iterate\n    over indices of dataset elements.\n\n    Args:\n        opts: Command line arguments.\n        n_data_samples: Number of samples in the dataset.\n        is_training: Training or validation mode.\n    \"\"\"\n\n    def __init__(\n        self,\n        opts: argparse.Namespace,\n        n_data_samples: int,\n        is_training: bool = False,\n        *args,\n        **kwargs,\n    ) -> None:\n        batch_size_gpu0: int = get_batch_size_from_opts(opts, is_training=is_training)\n\n        if not dist.is_available():\n            raise RuntimeError(\"Requires distributed package to be available\")\n\n        num_replicas = dist.get_world_size()\n        rank = dist.get_rank()\n        gpus_node_i = max(1, torch.cuda.device_count())\n\n        num_samples_per_replica = int(math.ceil(n_data_samples * 1.0 / num_replicas))\n        total_size = num_samples_per_replica * num_replicas\n\n        img_indices = [idx for idx in range(n_data_samples)]\n        img_indices += img_indices[: (total_size - n_data_samples)]\n        assert len(img_indices) == total_size\n\n        self.img_indices = img_indices\n        self.n_samples_per_replica = num_samples_per_replica\n        self.shuffle = True if is_training else False\n        self.epoch = 0\n        self.rank = rank\n        self.batch_size_gpu0 = batch_size_gpu0\n        self.num_replicas = num_replicas\n        self.skip_sample_indices = []\n        self.node_id = rank // gpus_node_i\n\n        self.num_nodes = max(1, num_replicas // gpus_node_i)\n        self.local_rank = rank % gpus_node_i\n        self.num_gpus_node_i = gpus_node_i\n\n        self.sharding = False\n        self.num_repeats = 1\n        self.trunc_rep_aug = False\n        self.disable_shuffle_sharding = False\n        if is_training:\n            self.sharding = getattr(opts, \"sampler.use_shards\")\n            self.num_repeats = getattr(opts, \"sampler.num_repeats\")\n            self.trunc_rep_aug = getattr(opts, \"sampler.truncated_repeat_aug_sampler\")\n            self.disable_shuffle_sharding = getattr(\n                opts, \"sampler.disable_shuffle_sharding\"\n            )\n\n        sample_multiplier = 1 if self.trunc_rep_aug else self.num_repeats\n        self.n_samples_per_replica = num_samples_per_replica * sample_multiplier\n        self.start_shuffling_from_epoch = getattr(\n            opts, \"sampler.start_shuffling_from_epoch\"\n        )\n\n    def get_indices_rank_i(self) -> List[int]:\n        \"\"\"Returns a list of indices of dataset elements for each rank to iterate over.\n\n        ...note:\n            1. If repeated augmentation is enabled, then indices will be repeated.\n            2. If sharding is enabled, then each rank will process a subset of the dataset.\n        \"\"\"\n        img_indices = copy.deepcopy(self.img_indices)\n        if self.shuffle:\n            random.seed(self.epoch)\n\n            if self.sharding:\n                \"\"\"If we have 8 samples, say [0, 1, 2, 3, 4, 5, 6, 7], and we have two nodes,\n                then node 0 will receive first 4 samples and node 1 will receive last 4 samples.\n\n                note:\n                    This strategy is useful when dataset is large and we want to process subset of dataset on each node.\n                \"\"\"\n\n                # compute number pf samples per node.\n                # Each node may have multiple GPUs\n                # Node id = rank // num_gpus_per_rank\n                samples_per_node = int(math.ceil(len(img_indices) / self.num_nodes))\n                indices_node_i = img_indices[\n                    self.node_id\n                    * samples_per_node : (self.node_id + 1)\n                    * samples_per_node\n                ]\n\n                # Ensure that each node has equal number of samples\n                if len(indices_node_i) < samples_per_node:\n                    indices_node_i += indices_node_i[\n                        : (samples_per_node - len(indices_node_i))\n                    ]\n\n                # Note: For extremely large datasets, we may want to disable shuffling for efficient data loading\n                if (\n                    not self.disable_shuffle_sharding\n                    and self.epoch >= self.start_shuffling_from_epoch\n                ):\n                    # shuffle the indices within a node.\n                    random.shuffle(indices_node_i)\n\n                if self.num_repeats > 1:\n                    \"\"\"Assume that we have [0, 1, 2, 3] samples in rank_i. With repeated augmentation,\n                    we first repeat the samples [0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3] and then select 4\n                    samples [0, 0, 0, 1]. Note shuffling at the beginning\n                    \"\"\"\n                    # Apply repeated augmentation\n                    n_samples_before_repeat = len(indices_node_i)\n                    indices_node_i = np.repeat(indices_node_i, repeats=self.num_repeats)\n                    indices_node_i = list(indices_node_i)\n                    if self.trunc_rep_aug:\n                        indices_node_i = indices_node_i[:n_samples_before_repeat]\n\n                # divide the samples among each GPU in a node\n                indices_rank_i = indices_node_i[\n                    self.local_rank : len(indices_node_i) : self.num_gpus_node_i\n                ]\n            else:\n                \"\"\"If we have 8 samples, say [0, 1, 2, 3, 4, 5, 6, 7], and we have two nodes,\n                then node 0 will receive [0, 2, 4, 6] and node 1 will receive [1, 3, 4, 7].\n\n                note:\n                    This strategy is useful when each data sample is stored independently, and is\n                    default in many frameworks\n                \"\"\"\n                if self.epoch >= self.start_shuffling_from_epoch:\n                    random.shuffle(img_indices)\n\n                if self.num_repeats > 1:\n                    # Apply repeated augmentation\n                    n_samples_before_repeat = len(img_indices)\n                    img_indices = np.repeat(img_indices, repeats=self.num_repeats)\n                    img_indices = list(img_indices)\n                    if self.trunc_rep_aug:\n                        img_indices = img_indices[:n_samples_before_repeat]\n\n                # divide the samples among each GPU in a node\n                indices_rank_i = img_indices[\n                    self.rank : len(img_indices) : self.num_replicas\n                ]\n        else:\n            indices_rank_i = img_indices[\n                self.rank : len(self.img_indices) : self.num_replicas\n            ]\n        return indices_rank_i\n\n    def __iter__(self) -> Iterator[Tuple[Any, ...]]:\n        raise NotImplementedError\n\n    def __len__(self) -> int:\n        return (len(self.img_indices) // self.num_replicas) * (\n            1 if self.trunc_rep_aug else self.num_repeats\n        )\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        if cls != BaseSamplerDDP:\n            # Don't re-register arguments in subclasses that don't override `add_arguments()`.\n            return parser\n\n        group = parser.add_argument_group(cls.__name__)\n        group.add_argument(\n            \"--sampler.use-shards\",\n            action=\"store_true\",\n            default=False,\n            help=\"Use data sharding. Only applicable to DDP. Defaults to False.\",\n        )\n        group.add_argument(\n            \"--sampler.disable-shuffle-sharding\",\n            action=\"store_true\",\n            default=False,\n            help=\"Disable shuffling while sharding for extremely large datasets. Defaults to False.\",\n        )\n\n        return parser\n\n    def set_epoch(self, epoch: int) -> None:\n        \"\"\"Helper function to set epoch in each sampler.\"\"\"\n        self.epoch = epoch\n\n    def update_scales(\n        self, epoch: int, is_master_node: bool = False, *args, **kwargs\n    ) -> None:\n        \"\"\"Helper function to update scales in each sampler. This is typically useful in variable-batch sampler\n\n        Subclass is expected to implement this function. By default, we do not do anything\n        \"\"\"\n\n    def update_indices(self, new_indices: List[int]) -> None:\n        \"\"\"Update indices to new indices. This function might be useful for sample-efficient training.\"\"\"\n        self.img_indices = new_indices\n\n    def extra_repr(self) -> str:\n        extra_repr_str = (\n            f\"\\n\\t num_repeat={self.num_repeats}\"\n            f\"\\n\\t trunc_rep_aug={self.trunc_rep_aug}\"\n            f\"\\n\\t sharding={self.sharding}\"\n            f\"\\n\\t disable_shuffle_sharding={self.disable_shuffle_sharding}\"\n        )\n        return extra_repr_str\n\n    def __repr__(self):\n        return \"{}({}\\n)\".format(self.__class__.__name__, self.extra_repr())\n\n\ndef get_batch_size_from_opts(\n    opts: argparse.Namespace, is_training: bool = False\n) -> int:\n    \"\"\"Helper function to extract batch size for training or validation/test\n\n    Args:\n        opts: command line argument\n        is_training: Training or validation mode. Default: False\n\n    Returns:\n        Returns an integer\n    \"\"\"\n    batch_size_gpu0 = int(\n        getattr(opts, \"dataset.train_batch_size0\")\n        if is_training\n        else getattr(opts, \"dataset.val_batch_size0\")\n    )\n    return batch_size_gpu0\n"
  },
  {
    "path": "corenet/data/sampler/batch_sampler.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nfrom typing import Iterator, Tuple\n\nfrom corenet.constants import DEFAULT_IMAGE_HEIGHT, DEFAULT_IMAGE_WIDTH\nfrom corenet.data.sampler import SAMPLER_REGISTRY\nfrom corenet.data.sampler.base_sampler import BaseSampler, BaseSamplerDDP\n\n\n@SAMPLER_REGISTRY.register(name=\"batch_sampler\")\nclass BatchSampler(BaseSampler):\n    \"\"\"Standard Batch Sampler for data parallel. This sampler yields batches of fixed batch size\n    and spatial resolutions.\n\n    Args:\n        opts: command line argument\n        n_data_samples: Number of samples in the dataset\n        is_training: Training or validation mode. Default: False\n    \"\"\"\n\n    def __init__(\n        self,\n        opts,\n        n_data_samples: int,\n        is_training: bool = False,\n        *args,\n        **kwargs,\n    ) -> None:\n        super().__init__(\n            opts=opts, n_data_samples=n_data_samples, is_training=is_training\n        )\n        # spatial dimensions\n        crop_size_w: int = getattr(opts, \"sampler.bs.crop_size_width\")\n        crop_size_h: int = getattr(opts, \"sampler.bs.crop_size_height\")\n\n        self.crop_size_w = crop_size_w\n        self.crop_size_h = crop_size_h\n\n    def __iter__(self) -> Iterator[Tuple[int, int, int]]:\n        img_indices = self.get_indices()\n\n        start_index = 0\n        batch_size = self.batch_size_gpu0\n        n_samples = len(img_indices)\n        while start_index < n_samples:\n\n            end_index = min(start_index + batch_size, n_samples)\n            batch_ids = img_indices[start_index:end_index]\n            start_index += batch_size\n\n            if len(batch_ids) > 0:\n                batch = [\n                    (self.crop_size_h, self.crop_size_w, b_id) for b_id in batch_ids\n                ]\n                yield batch\n\n    def extra_repr(self) -> str:\n        extra_repr_str = super().extra_repr()\n        extra_repr_str += (\n            f\"\\n\\tbase_im_size=(h={self.crop_size_h}, w={self.crop_size_w})\"\n            f\"\\n\\tbase_batch_size={self.batch_size_gpu0}\"\n        )\n        return extra_repr_str\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        if cls != BatchSampler:\n            # Don't re-register arguments in subclasses that don't override `add_arguments()`.\n            return parser\n        group = parser.add_argument_group(cls.__name__)\n        group.add_argument(\n            \"--sampler.bs.crop-size-width\",\n            default=DEFAULT_IMAGE_WIDTH,\n            type=int,\n            help=\"Base crop size (along width) during training\",\n        )\n        group.add_argument(\n            \"--sampler.bs.crop-size-height\",\n            default=DEFAULT_IMAGE_HEIGHT,\n            type=int,\n            help=\"Base crop size (along height) during training\",\n        )\n        return parser\n\n\n@SAMPLER_REGISTRY.register(name=\"batch_sampler_ddp\")\nclass BatchSamplerDDP(BaseSamplerDDP):\n    \"\"\"DDP variant of BatchSampler\n\n    Args:\n        opts: command line argument\n        n_data_samples: Number of samples in the dataset\n        is_training: Training or validation mode. Default: False\n    \"\"\"\n\n    def __init__(\n        self,\n        opts,\n        n_data_samples: int,\n        is_training: bool = False,\n        *args,\n        **kwargs,\n    ) -> None:\n        super().__init__(\n            opts=opts, n_data_samples=n_data_samples, is_training=is_training\n        )\n        crop_size_w: int = getattr(\n            opts, \"sampler.bs.crop_size_width\", DEFAULT_IMAGE_WIDTH\n        )\n        crop_size_h: int = getattr(\n            opts, \"sampler.bs.crop_size_height\", DEFAULT_IMAGE_HEIGHT\n        )\n\n        self.crop_size_w = crop_size_w\n        self.crop_size_h = crop_size_h\n\n    def __iter__(self) -> Iterator[Tuple[int, int, int]]:\n        indices_rank_i = self.get_indices_rank_i()\n        start_index = 0\n        batch_size = self.batch_size_gpu0\n\n        n_samples_rank_i = len(indices_rank_i)\n        while start_index < n_samples_rank_i:\n            end_index = min(start_index + batch_size, n_samples_rank_i)\n            batch_ids = indices_rank_i[start_index:end_index]\n            n_batch_samples = len(batch_ids)\n            if n_batch_samples != batch_size:\n                batch_ids += indices_rank_i[: (batch_size - n_batch_samples)]\n            start_index += batch_size\n\n            if len(batch_ids) > 0:\n                batch = [\n                    (self.crop_size_h, self.crop_size_w, b_id) for b_id in batch_ids\n                ]\n                yield batch\n\n    def extra_repr(self) -> str:\n        extra_repr_str = super().extra_repr()\n        extra_repr_str += (\n            f\"\\n\\tbase_im_size=(h={self.crop_size_h}, w={self.crop_size_w})\"\n            f\"\\n\\tbase_batch_size={self.batch_size_gpu0}\"\n        )\n        return extra_repr_str\n"
  },
  {
    "path": "corenet/data/sampler/chain_sampler.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom __future__ import annotations\n\nimport argparse\nimport copy\nimport itertools\nimport json\nfrom typing import Iterator, List, Mapping, Optional, Tuple\n\nfrom torch.utils.data.sampler import Sampler\n\nfrom corenet.data.sampler import SAMPLER_REGISTRY, build_sampler\nfrom corenet.options.utils import flatten_yaml_as_dict\nfrom corenet.utils import logger\n\n\n@SAMPLER_REGISTRY.register(name=\"chain_sampler\")\nclass ChainSampler(Sampler):\n    \"\"\"\n    This class is a wrapper for iterating over datasets for multiple or similar tasks, typically useful for\n    multi-task training.\n    `task_name` and `sampler_config` are two mandatory keys that allows us to use task-specific data samplers.\n    For specifying batch sizes, we use `train_batch_size0`, and `val_batch_size0` as keys for\n    training and validation sets. Note that the batch sizes are scaled automatically depending on the number of GPUs.\n\n    Args:\n        opts: Command-line arguments\n        data_samplers: dictionary containing different samplers\n\n    Example::\n    # Example yaml config for combining different samplers is given below.\n    # Please note that configuration for each sampler should start with `-` in `chain_sampler`.\n\n    sampler:\n        name: \"chain_sampler\"\n        chain_sampler_mode: \"sequential\"\n        chain_sampler:\n          - task_name: \"segmentation\"\n            train_batch_size0: 10\n            sampler_config:\n              name: \"variable_batch_sampler\"\n              use_shards: false\n              num_repeats: 4\n              truncated_repeat_aug_sampler: false\n              vbs:\n                crop_size_width: 512\n                crop_size_height: 512\n                max_n_scales: 25\n                min_crop_size_width: 256\n                max_crop_size_width: 768\n                min_crop_size_height: 256\n                max_crop_size_height: 768\n                check_scale: 16\n          - task_name: \"classification\"\n            train_batch_size0: 20\n            sampler_config:\n              name: \"batch_sampler\"\n              bs:\n                crop_size_width: 512\n                crop_size_height: 512\n    \"\"\"\n\n    _SUPPORTED_SAMPLING_MODES = [\"sequential\", \"interleave\"]\n\n    def __init__(\n        self,\n        opts: argparse.Namespace,\n        *args,\n        **kwargs,\n    ) -> None:\n        data_samplers = ChainSampler.build_chain_sampler(opts, *args, **kwargs)\n        sampling_mode = getattr(opts, \"sampler.chain_sampler_mode\")\n\n        if sampling_mode is None:\n            logger.error(f\"Sampling mode can't be None in {self.__class__.__name__}\")\n        if not isinstance(sampling_mode, str):\n            logger.error(\n                f\"Sampling mode in {self.__class__.__name__} should be a type of string. Got: {type(sampling_mode)}\"\n            )\n\n        if sampling_mode not in self._SUPPORTED_SAMPLING_MODES:\n            logger.error(\n                f\"Supported sampling mode in {self.__class__.__name__} are {self._SUPPORTED_SAMPLING_MODES}. \"\n                f\"Got: {sampling_mode}\"\n            )\n        self.samplers_dict = data_samplers\n        self.sampling_mode = sampling_mode\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        \"\"\"Add arguments for chain sampler.\"\"\"\n        if cls != ChainSampler:\n            # Don't re-register arguments in subclasses that don't override `add_arguments()`.\n            return parser\n\n        group = parser.add_argument_group(cls.__name__)\n        group.add_argument(\"--sampler.chain-sampler\", type=json.loads, action=\"append\")\n        group.add_argument(\n            \"--sampler.chain-sampler-mode\",\n            type=str,\n            default=\"sequential\",\n            choices=cls._SUPPORTED_SAMPLING_MODES,\n            help=\"Chain sampler mode. Defaults to sequential.\",\n        )\n        return parser\n\n    @classmethod\n    def build_chain_sampler(\n        cls,\n        opts: argparse.Namespace,\n        n_data_samples: Mapping[str, int],\n        is_training: bool = False,\n        *args,\n        **kwargs,\n    ) -> Mapping[str, Sampler]:\n        \"\"\"Build chain sampler from command line arguments and sampler registry\n        Args:\n            opts: command-line arguments\n            n_data_samples: Mapping containing the task name and number of dataset samples in task-specific dataset\n            is_training: Training mode or not\n\n        Returns:\n            A dictionary, sampler_dict, containing information about sampler name and module.\n        \"\"\"\n\n        chain_sampler_opts = getattr(opts, \"sampler.chain_sampler\")\n\n        if chain_sampler_opts is None:\n            logger.error(\n                f\"sampler.chain_sampler in {cls.__name__} can't be None. Please specify \"\n                f\"sampler.chain_sampler using a yaml file.\"\n            )\n\n        if not isinstance(chain_sampler_opts, List):\n            logger.error(\n                f\"Chain sampler options are expected as a List. \"\n                f\"Got type: {type(chain_sampler_opts)} and values: {chain_sampler_opts}\"\n            )\n\n        num_samplers = len(chain_sampler_opts)\n        if num_samplers < 1:\n            logger.error(\"We need at least one sampler if using chain sampler\")\n        sampler_dict = {}\n\n        for i, sampler_opts_ in enumerate(chain_sampler_opts):\n            task_name = sampler_opts_.get(\"task_name\", None)\n            if task_name is None:\n                logger.error(\"task_name is a mandatory key when using chain sampler\")\n\n            # get sampler configuration\n            sampler_opts_as_dict = sampler_opts_.get(\"sampler_config\", None)\n\n            if sampler_opts_as_dict is None:\n                logger.error(\n                    \"sampler_config is a mandatory key when using chain sampler\"\n                )\n\n            train_batch_size = sampler_opts_.get(\"train_batch_size0\", None)\n            val_batch_size = sampler_opts_.get(\"val_batch_size0\", None)\n\n            # flatten the dictionary\n            sampler_opts_as_dict = flatten_yaml_as_dict(sampler_opts_as_dict)\n\n            # create a local copy and override the global opts with task-specific sampler opts\n            sampler_opts = copy.deepcopy(opts)\n\n            # `sampler_opts_as_dict` only contains the values of command-line arguments that are\n            # defined in the yaml file. Therefore, if a user misses few arguments, we won't have access\n            # to default values, leading to an error. To avoid this, we create a local copy of global\n            # command-line arguments and update it with `sampler_opts_as_dict` arguments\n            for k, v in sampler_opts_as_dict.items():\n                # we need to prefix each argument with sampler because we define individual samplers as\n                # `sampler.vbs.*` and not `vbs.*`\n                setattr(sampler_opts, \"sampler.\" + k, v)\n\n            # override the batch size of sampler\n            if train_batch_size is not None:\n                setattr(sampler_opts, \"dataset.train_batch_size0\", train_batch_size)\n            if val_batch_size is not None:\n                setattr(sampler_opts, \"dataset.val_batch_size0\", val_batch_size)\n\n            if not isinstance(n_data_samples, Mapping):\n                logger.error(\n                    \"For chain sampler, we need n_data_samples as a dictionary with key as a task name \"\n                    f\"and value as number of data points. Got: {n_data_samples}\"\n                )\n\n            if task_name not in n_data_samples:\n                logger.error(\n                    f\"Sample mapping from dataset has following keys ({n_data_samples.keys()}) \"\n                    f\"and does not contain {task_name}. Please check.\"\n                )\n\n            # build the sampler for the task\n            sampler_dict[task_name] = build_sampler(\n                opts=sampler_opts,\n                n_data_samples=n_data_samples[task_name],\n                is_training=is_training,\n                *args,\n                **kwargs,\n            )\n        # see if the keys in n_data_samples and sampler_dict are the same or not\n        # i.e., intersection is null.\n        is_intersection = n_data_samples.keys().isdisjoint(sampler_dict)\n        assert is_intersection is False, (\n            f\"The keys in n_data_samples and sampler_dict are not the same. \"\n            f\"Got: {n_data_samples.keys()} and {sampler_dict.keys()}\"\n        )\n        return sampler_dict\n\n    def _sequential_sampling(self) -> List[Tuple]:\n        \"\"\"Assuming we have samples from N datasets, then this function first iterates over\n        the entire first dataset, then the entire second dataset, and so on\n\n        Example:\n            Dataset 1: [A, B, C]\n            Dataset 2: [D, E, F, G, H]\n\n            The result of this sampler would be something like this [A, B, C, D, E, F, G, H]\n\n        \"\"\"\n        for task_name, dataset_sampler in self.samplers_dict.items():\n            for batch_data in dataset_sampler:\n                # append dataset name to the batch data\n                yield [x + (task_name,) for x in batch_data]\n\n    def _interleave_sampling(self) -> List[Tuple]:\n        \"\"\"Assuming we have samples from N datasets, then this function yields a batch from first dataset,\n        then a batch from second dataset, and so on. In other words, batches are sampled from N datasets\n        in a round-robin fashion.\n\n        Example:\n            Dataset 1: [A, B, C]\n            Dataset 2: [D, E, F, G, H]\n\n            The result of this sampler would be [A, D, B, E, C, F, G, H]\n        \"\"\"\n\n        items = self.samplers_dict.items()\n        task_names, sampler_names = zip(*items)\n        num_active_samplers = len(sampler_names)\n        next_samplers = itertools.cycle(\n            iter(data_sampler).__next__ for data_sampler in sampler_names\n        )\n\n        while num_active_samplers:\n            try:\n                for i, next_sampler in enumerate(next_samplers):\n                    yield [\n                        x + (task_names[i % num_active_samplers],)\n                        for x in next_sampler()\n                    ]\n            except StopIteration:\n                # Remove the sampler that we just exhausted from the cycle.\n                num_active_samplers -= 1\n                next_samplers = itertools.cycle(\n                    itertools.islice(next_samplers, num_active_samplers)\n                )\n\n    def __iter__(self) -> Iterator[Tuple]:\n        if self.sampling_mode == \"sequential\":\n            return self._sequential_sampling()\n        elif self.sampling_mode == \"interleave\":\n            return self._interleave_sampling()\n\n    def __len__(self) -> int:\n        return sum(\n            [\n                len(dataset_sampler)\n                for task_name, dataset_sampler in self.samplers_dict.items()\n            ]\n        )\n\n    def set_epoch(self, epoch: int) -> None:\n        \"\"\"Helper function to set epoch in each sampler.\n        Args:\n            epoch: Current epoch\n\n        Returns:\n            Nothing\n        \"\"\"\n        for task_name, dataset_sampler in self.samplers_dict.items():\n            if hasattr(dataset_sampler, \"set_epoch\"):\n                dataset_sampler.set_epoch(epoch)\n\n    def update_scales(\n        self, epoch: int, is_master_node: Optional[bool] = False, *args, **kwargs\n    ) -> None:\n        \"\"\"Helper function to update scales in each sampler. This is typically useful for variable-batch samplers\n\n        Args:\n            epoch: Current epoch\n            is_master_node: Master node or not.\n\n        Returns:\n            Nothing\n        \"\"\"\n        for task_name, dataset_sampler in self.samplers_dict.items():\n            if hasattr(dataset_sampler, \"update_scales\"):\n                dataset_sampler.update_scales(\n                    epoch, is_master_node=is_master_node, *args, **kwargs\n                )\n\n    def update_indices(self, new_indices: List[int]) -> None:\n        \"\"\"Update sample indices of the datasets with these new indices.\n\n        Args:\n            new_indices: Filtered indices of the samples that needs to be used in next epoch.\n\n        Returns:\n            Nothing\n\n        ...note:\n            This function is useful for sample-efficient training. This function may be implemented\n            in future (depending on use-case)\n        \"\"\"\n        raise NotImplementedError\n\n    def __repr__(self) -> str:\n        repr_str = f\"{self.__class__.__name__}(\\n\"\n        for k, v in self.samplers_dict.items():\n            repr_str += f\"{k} --> \" + v.__repr__().replace(\"\\n\\t\", \"\\n\\t\\t\").replace(\n                \"\\n)\", \"\\n\\t)\"\n            )\n            repr_str += \"\\n\"\n        repr_str += \"\\n)\"\n        return repr_str\n"
  },
  {
    "path": "corenet/data/sampler/multi_scale_sampler.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nimport random\nfrom typing import Iterator, Tuple\n\nfrom corenet.constants import DEFAULT_IMAGE_HEIGHT, DEFAULT_IMAGE_WIDTH\nfrom corenet.data.sampler import SAMPLER_REGISTRY\nfrom corenet.data.sampler.base_sampler import BaseSampler, BaseSamplerDDP\nfrom corenet.data.sampler.utils import image_batch_pairs\nfrom corenet.utils import logger\n\n\n@SAMPLER_REGISTRY.register(name=\"multi_scale_sampler\")\nclass MultiScaleSampler(BaseSampler):\n    \"\"\"Multi-scale batch sampler for data parallel. This sampler yields batches of fixed batch size, but each batch\n    has different spatial resolution.\n\n    Args:\n        opts: command line argument\n        n_data_samples: Number of samples in the dataset\n        is_training: Training or validation mode. Default: False\n    \"\"\"\n\n    def __init__(\n        self,\n        opts,\n        n_data_samples: int,\n        is_training: bool = False,\n        *args,\n        **kwargs,\n    ) -> None:\n        super().__init__(\n            opts=opts, n_data_samples=n_data_samples, is_training=is_training\n        )\n\n        crop_size_w = getattr(opts, \"sampler.msc.crop_size_width\")\n        crop_size_h = getattr(opts, \"sampler.msc.crop_size_height\")\n\n        min_crop_size_w = getattr(opts, \"sampler.msc.min_crop_size_width\")\n        max_crop_size_w = getattr(opts, \"sampler.msc.max_crop_size_width\")\n\n        min_crop_size_h = getattr(opts, \"sampler.msc.min_crop_size_height\")\n        max_crop_size_h = getattr(opts, \"sampler.msc.max_crop_size_height\")\n\n        check_scale_div_factor = getattr(opts, \"sampler.msc.check_scale\")\n        max_img_scales = getattr(opts, \"sampler.msc.max_n_scales\")\n\n        scale_inc = getattr(opts, \"sampler.msc.scale_inc\")\n\n        self.min_crop_size_w = min_crop_size_w\n        self.max_crop_size_w = max_crop_size_w\n        self.min_crop_size_h = min_crop_size_h\n        self.max_crop_size_h = max_crop_size_h\n\n        self.crop_size_w = crop_size_w\n        self.crop_size_h = crop_size_h\n\n        self.max_img_scales = max_img_scales\n        self.check_scale_div_factor = check_scale_div_factor\n        self.scale_inc = scale_inc\n\n        if is_training:\n            self.img_batch_tuples = image_batch_pairs(\n                crop_size_h=self.crop_size_h,\n                crop_size_w=self.crop_size_w,\n                batch_size_gpu0=self.batch_size_gpu0,\n                n_gpus=self.n_gpus,\n                max_scales=self.max_img_scales,\n                check_scale_div_factor=self.check_scale_div_factor,\n                min_crop_size_w=self.min_crop_size_w,\n                max_crop_size_w=self.max_crop_size_w,\n                min_crop_size_h=self.min_crop_size_h,\n                max_crop_size_h=self.max_crop_size_h,\n            )\n            # over-ride the batch-size\n            self.img_batch_tuples = [\n                (h, w, self.batch_size_gpu0) for h, w, b in self.img_batch_tuples\n            ]\n        else:\n            self.img_batch_tuples = [(crop_size_h, crop_size_w, self.batch_size_gpu0)]\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        if cls != MultiScaleSampler:\n            # Don't re-register arguments in subclasses that don't override `add_arguments()`.\n            return parser\n\n        group = parser.add_argument_group(cls.__name__)\n        group.add_argument(\n            \"--sampler.msc.crop-size-width\",\n            default=DEFAULT_IMAGE_WIDTH,\n            type=int,\n            help=f\"Base crop size (along width) during training. Defaults to {DEFAULT_IMAGE_WIDTH}.\",\n        )\n        group.add_argument(\n            \"--sampler.msc.crop-size-height\",\n            default=DEFAULT_IMAGE_HEIGHT,\n            type=int,\n            help=f\"Base crop size (along height) during training. Defaults to {DEFAULT_IMAGE_HEIGHT}.\",\n        )\n\n        group.add_argument(\n            \"--sampler.msc.min-crop-size-width\",\n            default=160,\n            type=int,\n            help=\"Min. crop size along width during training. Defaults to 160.\",\n        )\n        group.add_argument(\n            \"--sampler.msc.max-crop-size-width\",\n            default=320,\n            type=int,\n            help=\"Max. crop size along width during training. Defaults to 320.\",\n        )\n\n        group.add_argument(\n            \"--sampler.msc.min-crop-size-height\",\n            default=160,\n            type=int,\n            help=\"Min. crop size along height during training. Defaults to 160.\",\n        )\n        group.add_argument(\n            \"--sampler.msc.max-crop-size-height\",\n            default=320,\n            type=int,\n            help=\"Max. crop size along height during training. Defaults to 320.\",\n        )\n        group.add_argument(\n            \"--sampler.msc.max-n-scales\",\n            default=5,\n            type=int,\n            help=\"Max. scales in variable batch sampler. Defaults to 5.\",\n        )\n        group.add_argument(\n            \"--sampler.msc.check-scale\",\n            default=32,\n            type=int,\n            help=\"Image scales should be divisible by this factor. Defaults to 32.\",\n        )\n        group.add_argument(\n            \"--sampler.msc.scale-inc\",\n            action=\"store_true\",\n            default=False,\n            help=\"Increase image scales during training. Defaults to False.\",\n        )\n\n        return parser\n\n    def __iter__(self) -> Iterator[Tuple[int, int, int]]:\n        img_indices = self.get_indices()\n        start_index = 0\n        n_samples = len(img_indices)\n        while start_index < n_samples:\n            crop_h, crop_w, batch_size = random.choice(self.img_batch_tuples)\n\n            end_index = min(start_index + batch_size, n_samples)\n            batch_ids = img_indices[start_index:end_index]\n            n_batch_samples = len(batch_ids)\n            if len(batch_ids) != batch_size:\n                batch_ids += img_indices[: (batch_size - n_batch_samples)]\n            start_index += batch_size\n\n            if len(batch_ids) > 0:\n                batch = [(crop_h, crop_w, b_id) for b_id in batch_ids]\n                yield batch\n\n    def update_scales(\n        self, epoch: int, is_master_node: bool = False, *args, **kwargs\n    ) -> None:\n        if type(self).update_scales is not MultiScaleSampler.update_scales:\n            # Do nothing when a subclass overrides this method and calls super().update_scales\n            return\n\n        if is_master_node and self.scale_inc:\n            logger.warning(\n                f\"Update scale function is not yet implemented for {self.__class__.__name__}.\"\n            )\n\n    def extra_repr(self) -> str:\n        extra_repr_str = super().extra_repr()\n        extra_repr_str += (\n            f\"\\n\\t base_im_size=(h={self.crop_size_h}, w={self.crop_size_w})\"\n            f\"\\n\\t base_batch_size={self.batch_size_gpu0}\"\n            f\"\\n\\t scales={self.img_batch_tuples}\"\n        )\n        return extra_repr_str\n\n\n@SAMPLER_REGISTRY.register(name=\"multi_scale_sampler_ddp\")\nclass MultiScaleSamplerDDP(BaseSamplerDDP):\n    \"\"\"DDP version of MultiScaleSampler\n\n    Args:\n        opts: command line argument\n        n_data_samples: Number of samples in the dataset\n        is_training: Training or validation mode. Default: False\n    \"\"\"\n\n    def __init__(\n        self,\n        opts: argparse.Namespace,\n        n_data_samples: int,\n        is_training: bool = False,\n        *args,\n        **kwargs,\n    ) -> None:\n        super().__init__(\n            opts=opts, n_data_samples=n_data_samples, is_training=is_training\n        )\n        crop_size_w = getattr(opts, \"sampler.msc.crop_size_width\")\n        crop_size_h = getattr(opts, \"sampler.msc.crop_size_height\")\n\n        min_crop_size_w = getattr(opts, \"sampler.msc.min_crop_size_width\")\n        max_crop_size_w = getattr(opts, \"sampler.msc.max_crop_size_width\")\n\n        min_crop_size_h = getattr(opts, \"sampler.msc.min_crop_size_height\")\n        max_crop_size_h = getattr(opts, \"sampler.msc.max_crop_size_height\")\n\n        check_scale_div_factor = getattr(opts, \"sampler.msc.check_scale\")\n\n        max_img_scales = getattr(opts, \"sampler.msc.max_n_scales\")\n        scale_inc = getattr(opts, \"sampler.msc.scale_inc\")\n\n        self.crop_size_h = crop_size_h\n        self.crop_size_w = crop_size_w\n        self.min_crop_size_h = min_crop_size_h\n        self.max_crop_size_h = max_crop_size_h\n        self.min_crop_size_w = min_crop_size_w\n        self.max_crop_size_w = max_crop_size_w\n\n        self.max_img_scales = max_img_scales\n        self.check_scale_div_factor = check_scale_div_factor\n        self.scale_inc = scale_inc\n\n        if is_training:\n            self.img_batch_tuples = image_batch_pairs(\n                crop_size_h=self.crop_size_h,\n                crop_size_w=self.crop_size_w,\n                batch_size_gpu0=self.batch_size_gpu0,\n                n_gpus=self.num_replicas,\n                max_scales=self.max_img_scales,\n                check_scale_div_factor=self.check_scale_div_factor,\n                min_crop_size_w=self.min_crop_size_w,\n                max_crop_size_w=self.max_crop_size_w,\n                min_crop_size_h=self.min_crop_size_h,\n                max_crop_size_h=self.max_crop_size_h,\n            )\n            self.img_batch_tuples = [\n                (h, w, self.batch_size_gpu0) for h, w, b in self.img_batch_tuples\n            ]\n        else:\n            self.img_batch_tuples = [\n                (self.crop_size_h, self.crop_size_w, self.batch_size_gpu0)\n            ]\n\n    def __iter__(self) -> Iterator[Tuple[int, int, int]]:\n        indices_rank_i = self.get_indices_rank_i()\n\n        start_index = 0\n        n_samples_rank_i = len(indices_rank_i)\n        while start_index < n_samples_rank_i:\n            crop_h, crop_w, batch_size = random.choice(self.img_batch_tuples)\n\n            end_index = min(start_index + batch_size, n_samples_rank_i)\n            batch_ids = indices_rank_i[start_index:end_index]\n            n_batch_samples = len(batch_ids)\n            if n_batch_samples != batch_size:\n                batch_ids += indices_rank_i[: (batch_size - n_batch_samples)]\n            start_index += batch_size\n\n            if len(batch_ids) > 0:\n                batch = [(crop_h, crop_w, b_id) for b_id in batch_ids]\n                yield batch\n\n    def extra_repr(self) -> str:\n        extra_repr_str = super().extra_repr()\n        extra_repr_str += (\n            f\"\\n\\t base_im_size=(h={self.crop_size_h}, w={self.crop_size_w})\"\n            f\"\\n\\t base_batch_size={self.batch_size_gpu0}\"\n            f\"\\n\\t scales={self.img_batch_tuples}\"\n        )\n        return extra_repr_str\n\n    def update_scales(\n        self, epoch: int, is_master_node: bool = False, *args, **kwargs\n    ) -> None:\n        if type(self).update_scales is not MultiScaleSamplerDDP.update_scales:\n            # Do nothing when a subclass overrides this method and calls super().update_scales\n            return\n\n        if is_master_node and self.scale_inc:\n            logger.warning(\n                f\"Update scale function is not yet implemented for {self.__class__.__name__}\"\n            )\n"
  },
  {
    "path": "corenet/data/sampler/utils.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom typing import List, Optional, Tuple, Union\n\nimport numpy as np\n\nfrom corenet.utils.math_utils import make_divisible\n\n\ndef image_batch_pairs(\n    crop_size_w: int,\n    crop_size_h: int,\n    batch_size_gpu0: int,\n    max_scales: Optional[float] = 5,\n    check_scale_div_factor: Optional[int] = 32,\n    min_crop_size_w: Optional[int] = 160,\n    max_crop_size_w: Optional[int] = 320,\n    min_crop_size_h: Optional[int] = 160,\n    max_crop_size_h: Optional[int] = 320,\n    *args,\n    **kwargs\n) -> List[Tuple[int, int, int]]:\n    \"\"\"This function creates batch and image size pairs.  For a given batch size and image size, different image sizes\n        are generated and batch size is adjusted so that GPU memory can be utilized efficiently.\n\n    Args:\n        crop_size_w: Base Image width (e.g., 224)\n        crop_size_h: Base Image height (e.g., 224)\n        batch_size_gpu0: Batch size on GPU 0 for base image\n        max_scales: Number of scales. How many image sizes that we want to generate between min and max scale factors. Default: 5\n        check_scale_div_factor: Check if image scales are divisible by this factor. Default: 32\n        min_crop_size_w: Min. crop size along width. Default: 160\n        max_crop_size_w: Max. crop size along width. Default: 320\n        min_crop_size_h: Min. crop size along height. Default: 160\n        max_crop_size_h: Max. crop size along height. Default: 320\n\n    Returns:\n        a sorted list of tuples. Each index is of the form (h, w, batch_size)\n\n    \"\"\"\n    width_dims = create_intervallic_integer_list(\n        crop_size_w,\n        min_crop_size_w,\n        max_crop_size_w,\n        max_scales,\n        check_scale_div_factor,\n    )\n    height_dims = create_intervallic_integer_list(\n        crop_size_h,\n        min_crop_size_h,\n        max_crop_size_h,\n        max_scales,\n        check_scale_div_factor,\n    )\n    img_batch_tuples = set()\n    n_elements = crop_size_w * crop_size_h * batch_size_gpu0\n    for crop_h, crop_y in zip(height_dims, width_dims):\n        # compute the batch size for sampled image resolutions with respect to the base resolution\n        _bsz = max(1, int(round(n_elements / (crop_h * crop_y), 2)))\n\n        img_batch_tuples.add((crop_h, crop_y, _bsz))\n\n    img_batch_tuples = list(img_batch_tuples)\n    return sorted(img_batch_tuples)\n\n\ndef make_video_pairs(\n    crop_size_h: int,\n    crop_size_w: int,\n    min_crop_size_h: int,\n    max_crop_size_h: int,\n    min_crop_size_w: int,\n    max_crop_size_w: int,\n    default_frames: int,\n    max_scales: Optional[int] = 5,\n    check_scale_div_factor: Optional[int] = 32,\n    *args,\n    **kwargs\n) -> List[Tuple[int, int, int]]:\n    \"\"\"This function creates number of frames and spatial size pairs for videos.\n\n    Args:\n        crop_size_h: Base Image height (e.g., 224)\n        crop_size_w: Base Image width (e.g., 224)\n        min_crop_size_w: Min. crop size along width.\n        max_crop_size_w: Max. crop size along width.\n        min_crop_size_h: Min. crop size along height.\n        max_crop_size_h: Max. crop size along height.\n        default_frames: Default number of frames per clip in a video.\n        max_scales: Number of scales. Default: 5\n        check_scale_div_factor: Check if spatial scales are divisible by this factor.\n            Default: 32.\n\n    Returns:\n        A sorted list of tuples. Each index is of the form (h, w, n_frames)\n    \"\"\"\n\n    width_dims = create_intervallic_integer_list(\n        crop_size_w,\n        min_crop_size_w,\n        max_crop_size_w,\n        max_scales,\n        check_scale_div_factor,\n    )\n    height_dims = create_intervallic_integer_list(\n        crop_size_h,\n        min_crop_size_h,\n        max_crop_size_h,\n        max_scales,\n        check_scale_div_factor,\n    )\n    batch_pairs = set()\n    n_elements = crop_size_w * crop_size_h * default_frames\n    for h, w in zip(height_dims, width_dims):\n        n_frames = max(1, int(round(n_elements / (h * w), 2)))\n        batch_pairs.add((h, w, n_frames))\n    return sorted(list(batch_pairs))\n\n\ndef create_intervallic_integer_list(\n    base_val: Union[int, float],\n    min_val: float,\n    max_val: float,\n    num_scales: Optional[int] = 5,\n    scale_div_factor: Optional[int] = 1,\n) -> List[int]:\n    \"\"\"This function creates a list of `n` integer values that scales `base_val` between\n    `min_scale` and `max_scale`.\n\n    Args:\n        base_val: The base value to scale.\n        min_val: The lower end of the value.\n        max_val: The higher end of the value.\n        n: Number of scaled values to generate.\n        scale_div_factor: Check if scaled values are divisible by this factor.\n\n    Returns:\n        a sorted list of tuples. Each index is of the form (h, w, n_frames)\n    \"\"\"\n    values = set(np.linspace(min_val, max_val, num_scales))\n    values.add(base_val)\n    values = [make_divisible(v, scale_div_factor) for v in values]\n    return sorted(values)\n\n\ndef make_tuple_list(*val_list: List) -> List[Tuple]:\n    \"\"\"Make a list of values to a list of the tuples. Where ith element in each list\n    is in the ith tuple of the returned list.\n\n    For example: [[1, 2], [3, 4], [5, 6]] is converted to [(1, 3, 5), (2, 4, 6)].\n\n    Args:\n        val_list: A list of m list, where each element is a list of n values.\n\n    Return:\n        A list of size n, where each value is a tupe if m values.\n    \"\"\"\n    return list(zip(*val_list))\n"
  },
  {
    "path": "corenet/data/sampler/variable_batch_sampler.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nimport random\nfrom typing import Iterator, Tuple\n\nfrom corenet.constants import DEFAULT_IMAGE_HEIGHT, DEFAULT_IMAGE_WIDTH\nfrom corenet.data.sampler import SAMPLER_REGISTRY\nfrom corenet.data.sampler.base_sampler import BaseSampler, BaseSamplerDDP\nfrom corenet.data.sampler.utils import image_batch_pairs\nfrom corenet.utils import logger\n\n\n@SAMPLER_REGISTRY.register(name=\"variable_batch_sampler\")\nclass VariableBatchSampler(BaseSampler):\n    \"\"\"Variably-size multi-scale batch sampler <https://arxiv.org/abs/2110.02178?context=cs.LG>` for data parallel.\n    This sampler yields batches with variable spatial resolution and batch size.\n\n    Args:\n        opts: command line argument\n        n_data_samples: Number of samples in the dataset\n        is_training: Training or validation mode. Default: False\n    \"\"\"\n\n    def __init__(\n        self,\n        opts: argparse.Namespace,\n        n_data_samples: int,\n        is_training: bool = False,\n        *args,\n        **kwargs,\n    ) -> None:\n        super().__init__(\n            opts=opts, n_data_samples=n_data_samples, is_training=is_training\n        )\n\n        crop_size_w = getattr(opts, \"sampler.vbs.crop_size_width\")\n        crop_size_h = getattr(opts, \"sampler.vbs.crop_size_height\")\n\n        min_crop_size_w = getattr(opts, \"sampler.vbs.min_crop_size_width\")\n        max_crop_size_w = getattr(opts, \"sampler.vbs.max_crop_size_width\")\n\n        min_crop_size_h = getattr(opts, \"sampler.vbs.min_crop_size_height\")\n        max_crop_size_h = getattr(opts, \"sampler.vbs.max_crop_size_height\")\n\n        check_scale_div_factor = getattr(opts, \"sampler.vbs.check_scale\")\n        max_img_scales = getattr(opts, \"sampler.vbs.max_n_scales\")\n\n        scale_inc = getattr(opts, \"sampler.vbs.scale_inc\")\n        min_scale_inc_factor = getattr(opts, \"sampler.vbs.min_scale_inc_factor\")\n        max_scale_inc_factor = getattr(opts, \"sampler.vbs.max_scale_inc_factor\")\n        scale_ep_intervals = getattr(opts, \"sampler.vbs.ep_intervals\")\n        if isinstance(scale_ep_intervals, int):\n            scale_ep_intervals = [scale_ep_intervals]\n\n        self.min_crop_size_w = min_crop_size_w\n        self.max_crop_size_w = max_crop_size_w\n        self.min_crop_size_h = min_crop_size_h\n        self.max_crop_size_h = max_crop_size_h\n\n        self.crop_size_w = crop_size_w\n        self.crop_size_h = crop_size_h\n\n        self.min_scale_inc_factor = min_scale_inc_factor\n        self.max_scale_inc_factor = max_scale_inc_factor\n        self.scale_ep_intervals = scale_ep_intervals\n\n        self.max_img_scales = max_img_scales\n        self.check_scale_div_factor = check_scale_div_factor\n        self.scale_inc = scale_inc\n\n        if is_training:\n            self.img_batch_tuples = image_batch_pairs(\n                crop_size_h=self.crop_size_h,\n                crop_size_w=self.crop_size_w,\n                batch_size_gpu0=self.batch_size_gpu0,\n                n_gpus=self.n_gpus,\n                max_scales=self.max_img_scales,\n                check_scale_div_factor=self.check_scale_div_factor,\n                min_crop_size_w=self.min_crop_size_w,\n                max_crop_size_w=self.max_crop_size_w,\n                min_crop_size_h=self.min_crop_size_h,\n                max_crop_size_h=self.max_crop_size_h,\n            )\n        else:\n            self.img_batch_tuples = [(crop_size_h, crop_size_w, self.batch_size_gpu0)]\n\n    def __iter__(self) -> Iterator[Tuple[int, int, int]]:\n        img_indices = self.get_indices()\n        start_index = 0\n        n_samples = len(img_indices)\n        while start_index < n_samples:\n            crop_h, crop_w, batch_size = random.choice(self.img_batch_tuples)\n\n            end_index = min(start_index + batch_size, n_samples)\n            batch_ids = img_indices[start_index:end_index]\n            n_batch_samples = len(batch_ids)\n            if len(batch_ids) != batch_size:\n                batch_ids += img_indices[: (batch_size - n_batch_samples)]\n            start_index += batch_size\n\n            if len(batch_ids) > 0:\n                batch = [(crop_h, crop_w, b_id) for b_id in batch_ids]\n                yield batch\n\n    def update_scales(\n        self, epoch: int, is_master_node: bool = False, *args, **kwargs\n    ) -> None:\n        \"\"\"Update the scales in variable batch sampler at specified epoch intervals during training.\"\"\"\n        if epoch in self.scale_ep_intervals and self.scale_inc:\n            self.min_crop_size_w += int(\n                self.min_crop_size_w * self.min_scale_inc_factor\n            )\n            self.max_crop_size_w += int(\n                self.max_crop_size_w * self.max_scale_inc_factor\n            )\n\n            self.min_crop_size_h += int(\n                self.min_crop_size_h * self.min_scale_inc_factor\n            )\n            self.max_crop_size_h += int(\n                self.max_crop_size_h * self.max_scale_inc_factor\n            )\n\n            self.img_batch_tuples = image_batch_pairs(\n                crop_size_h=self.crop_size_h,\n                crop_size_w=self.crop_size_w,\n                batch_size_gpu0=self.batch_size_gpu0,\n                n_gpus=self.n_gpus,\n                max_scales=self.max_img_scales,\n                check_scale_div_factor=self.check_scale_div_factor,\n                min_crop_size_w=self.min_crop_size_w,\n                max_crop_size_w=self.max_crop_size_w,\n                min_crop_size_h=self.min_crop_size_h,\n                max_crop_size_h=self.max_crop_size_h,\n            )\n            if is_master_node:\n                logger.log(\"Scales updated in {}\".format(self.__class__.__name__))\n                logger.log(\"New scales: {}\".format(self.img_batch_tuples))\n\n    def extra_repr(self) -> str:\n        extra_repr_str = super().extra_repr()\n        extra_repr_str += (\n            f\"\\n\\t base_im_size=(h={self.crop_size_h}, w={self.crop_size_w})\"\n            f\"\\n\\t base_batch_size={self.batch_size_gpu0}\"\n            f\"\\n\\t scales={self.img_batch_tuples}\"\n            f\"\\n\\t scale_inc={self.scale_inc}\"\n            f\"\\n\\t min_scale_inc_factor={self.min_scale_inc_factor}\"\n            f\"\\n\\t max_scale_inc_factor={self.max_scale_inc_factor}\"\n            f\"\\n\\t ep_intervals={self.scale_ep_intervals}\"\n        )\n\n        return extra_repr_str\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        if cls != VariableBatchSampler:\n            # Don't re-register arguments in subclasses that don't override `add_arguments()`.\n            return parser\n        group = parser.add_argument_group(cls.__name__)\n        group.add_argument(\n            \"--sampler.vbs.crop-size-width\",\n            default=DEFAULT_IMAGE_WIDTH,\n            type=int,\n            help=f\"Base crop size (along width) during training. Defaults to {DEFAULT_IMAGE_WIDTH}.\",\n        )\n        group.add_argument(\n            \"--sampler.vbs.crop-size-height\",\n            default=DEFAULT_IMAGE_HEIGHT,\n            type=int,\n            help=f\"Base crop size (along height) during training. Defaults to {DEFAULT_IMAGE_HEIGHT}.\",\n        )\n\n        group.add_argument(\n            \"--sampler.vbs.min-crop-size-width\",\n            default=160,\n            type=int,\n            help=\"Min. crop size along width during training. Defaults to 160.\",\n        )\n        group.add_argument(\n            \"--sampler.vbs.max-crop-size-width\",\n            default=320,\n            type=int,\n            help=\"Max. crop size along width during training. Defaults to 320.\",\n        )\n\n        group.add_argument(\n            \"--sampler.vbs.min-crop-size-height\",\n            default=160,\n            type=int,\n            help=\"Min. crop size along height during training. Defaults to 160.\",\n        )\n        group.add_argument(\n            \"--sampler.vbs.max-crop-size-height\",\n            default=320,\n            type=int,\n            help=\"Max. crop size along height during training. Defaults to 320.\",\n        )\n        group.add_argument(\n            \"--sampler.vbs.max-n-scales\",\n            default=5,\n            type=int,\n            help=\"Max. scales in variable batch sampler. Defaults to 5.\",\n        )\n        group.add_argument(\n            \"--sampler.vbs.check-scale\",\n            default=32,\n            type=int,\n            help=\"Image scales should be divisible by this factor. Defaults to 32.\",\n        )\n        group.add_argument(\n            \"--sampler.vbs.ep-intervals\",\n            default=[40],\n            type=int,\n            help=\"Epoch intervals at which scales should be adjusted. Defaults to 40.\",\n        )\n        group.add_argument(\n            \"--sampler.vbs.min-scale-inc-factor\",\n            default=1.0,\n            type=float,\n            help=\"Factor by which we should increase the minimum scale. Defaults to 1.0\",\n        )\n        group.add_argument(\n            \"--sampler.vbs.max-scale-inc-factor\",\n            default=1.0,\n            type=float,\n            help=\"Factor by which we should increase the maximum scale. Defaults to 1.0\",\n        )\n        group.add_argument(\n            \"--sampler.vbs.scale-inc\",\n            action=\"store_true\",\n            default=False,\n            help=\"Increase image scales during training. Defaults to False.\",\n        )\n\n        return parser\n\n\n@SAMPLER_REGISTRY.register(name=\"variable_batch_sampler_ddp\")\nclass VariableBatchSamplerDDP(BaseSamplerDDP):\n    \"\"\"DDP version of  VariableBatchSampler\n\n    Args:\n        opts: command line argument\n        n_data_samples: Number of samples in the dataset\n        is_training: Training or validation mode. Default: False\n    \"\"\"\n\n    def __init__(\n        self,\n        opts: argparse.Namespace,\n        n_data_samples: int,\n        is_training: bool = False,\n        *args,\n        **kwargs,\n    ) -> None:\n        super().__init__(\n            opts=opts, n_data_samples=n_data_samples, is_training=is_training\n        )\n\n        crop_size_w = getattr(opts, \"sampler.vbs.crop_size_width\")\n        crop_size_h = getattr(opts, \"sampler.vbs.crop_size_height\")\n\n        min_crop_size_w = getattr(opts, \"sampler.vbs.min_crop_size_width\")\n        max_crop_size_w = getattr(opts, \"sampler.vbs.max_crop_size_width\")\n\n        min_crop_size_h = getattr(opts, \"sampler.vbs.min_crop_size_height\")\n        max_crop_size_h = getattr(opts, \"sampler.vbs.max_crop_size_height\")\n\n        check_scale_div_factor = getattr(opts, \"sampler.vbs.check_scale\")\n        max_img_scales = getattr(opts, \"sampler.vbs.max_n_scales\")\n\n        scale_inc = getattr(opts, \"sampler.vbs.scale_inc\")\n        min_scale_inc_factor = getattr(opts, \"sampler.vbs.min_scale_inc_factor\")\n        max_scale_inc_factor = getattr(opts, \"sampler.vbs.max_scale_inc_factor\")\n        scale_ep_intervals = getattr(opts, \"sampler.vbs.ep_intervals\")\n        if isinstance(scale_ep_intervals, int):\n            scale_ep_intervals = [scale_ep_intervals]\n\n        self.crop_size_h = crop_size_h\n        self.crop_size_w = crop_size_w\n        self.min_crop_size_h = min_crop_size_h\n        self.max_crop_size_h = max_crop_size_h\n        self.min_crop_size_w = min_crop_size_w\n        self.max_crop_size_w = max_crop_size_w\n\n        self.min_scale_inc_factor = min_scale_inc_factor\n        self.max_scale_inc_factor = max_scale_inc_factor\n        self.scale_ep_intervals = scale_ep_intervals\n        self.max_img_scales = max_img_scales\n        self.check_scale_div_factor = check_scale_div_factor\n        self.scale_inc = scale_inc\n\n        if is_training:\n            self.img_batch_tuples = image_batch_pairs(\n                crop_size_h=self.crop_size_h,\n                crop_size_w=self.crop_size_w,\n                batch_size_gpu0=self.batch_size_gpu0,\n                n_gpus=self.num_replicas,\n                max_scales=self.max_img_scales,\n                check_scale_div_factor=self.check_scale_div_factor,\n                min_crop_size_w=self.min_crop_size_w,\n                max_crop_size_w=self.max_crop_size_w,\n                min_crop_size_h=self.min_crop_size_h,\n                max_crop_size_h=self.max_crop_size_h,\n            )\n        else:\n            self.img_batch_tuples = [\n                (self.crop_size_h, self.crop_size_w, self.batch_size_gpu0)\n            ]\n\n    def __iter__(self) -> Iterator[Tuple[int, int, int]]:\n        indices_rank_i = self.get_indices_rank_i()\n        start_index = 0\n        n_samples_rank_i = len(indices_rank_i)\n        while start_index < n_samples_rank_i:\n            crop_h, crop_w, batch_size = random.choice(self.img_batch_tuples)\n\n            end_index = min(start_index + batch_size, n_samples_rank_i)\n            batch_ids = indices_rank_i[start_index:end_index]\n            n_batch_samples = len(batch_ids)\n            if n_batch_samples != batch_size:\n                batch_ids += indices_rank_i[: (batch_size - n_batch_samples)]\n            start_index += batch_size\n\n            if len(batch_ids) > 0:\n                batch = [(crop_h, crop_w, b_id) for b_id in batch_ids]\n                yield batch\n\n    def update_scales(self, epoch: int, is_master_node=False, *args, **kwargs) -> None:\n        \"\"\"Update the scales in variable batch sampler at specified epoch intervals during training.\"\"\"\n        if (epoch in self.scale_ep_intervals) and self.scale_inc:\n            self.min_crop_size_w += int(\n                self.min_crop_size_w * self.min_scale_inc_factor\n            )\n            self.max_crop_size_w += int(\n                self.max_crop_size_w * self.max_scale_inc_factor\n            )\n\n            self.min_crop_size_h += int(\n                self.min_crop_size_h * self.min_scale_inc_factor\n            )\n            self.max_crop_size_h += int(\n                self.max_crop_size_h * self.max_scale_inc_factor\n            )\n\n            self.img_batch_tuples = image_batch_pairs(\n                crop_size_h=self.crop_size_h,\n                crop_size_w=self.crop_size_w,\n                batch_size_gpu0=self.batch_size_gpu0,\n                n_gpus=self.num_replicas,\n                max_scales=self.max_img_scales,\n                check_scale_div_factor=self.check_scale_div_factor,\n                min_crop_size_w=self.min_crop_size_w,\n                max_crop_size_w=self.max_crop_size_w,\n                min_crop_size_h=self.min_crop_size_h,\n                max_crop_size_h=self.max_crop_size_h,\n            )\n            if is_master_node:\n                logger.log(\"Scales updated in {}\".format(self.__class__.__name__))\n                logger.log(\"New scales: {}\".format(self.img_batch_tuples))\n\n    def extra_repr(self) -> str:\n        extra_repr_str = super().extra_repr()\n        extra_repr_str += (\n            f\"\\n\\t base_im_size=(h={self.crop_size_h}, w={self.crop_size_w})\"\n            f\"\\n\\t base_batch_size={self.batch_size_gpu0}\"\n            f\"\\n\\t scales={self.img_batch_tuples}\"\n            f\"\\n\\t scale_inc={self.scale_inc}\"\n            f\"\\n\\t min_scale_inc_factor={self.min_scale_inc_factor}\"\n            f\"\\n\\t max_scale_inc_factor={self.max_scale_inc_factor}\"\n            f\"\\n\\t ep_intervals={self.scale_ep_intervals}\"\n        )\n\n        return extra_repr_str\n"
  },
  {
    "path": "corenet/data/sampler/video_batch_sampler.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nfrom typing import Iterator, Tuple\n\nfrom corenet.data.sampler import SAMPLER_REGISTRY\nfrom corenet.data.sampler.batch_sampler import BatchSampler, BatchSamplerDDP\n\n\n@SAMPLER_REGISTRY.register(name=\"video_batch_sampler\")\nclass VideoBatchSampler(BatchSampler):\n    \"\"\"Standard Batch Sampler for videos. This sampler yields batches of fixed (1) batch size,\n    (2) spatial resolutions, (3) frames per clip, and (4) number of clips per video.\n\n    Args:\n        opts: command line argument\n        n_data_samples: Number of samples in the dataset\n        is_training: Training or validation mode. Default: False\n    \"\"\"\n\n    def __init__(\n        self,\n        opts: argparse.Namespace,\n        n_data_samples: int,\n        is_training: bool = False,\n        *args,\n        **kwargs,\n    ) -> None:\n        super().__init__(\n            opts=opts, n_data_samples=n_data_samples, is_training=is_training\n        )\n        self.default_frames = getattr(opts, \"sampler.bs.num_frames_per_clip\")\n\n        self.clips_per_video = getattr(opts, \"sampler.bs.clips_per_video\")\n\n    def __iter__(self) -> Iterator[Tuple[int, int, int, int, int]]:\n        indices = self.get_indices()\n\n        start_index = 0\n        batch_size = self.batch_size_gpu0\n        indices_len = len(indices)\n        while start_index < indices_len:\n\n            end_index = min(start_index + batch_size, indices_len)\n            batch_ids = indices[start_index:end_index]\n            start_index += batch_size\n\n            if len(batch_ids) > 0:\n                batch = [\n                    (\n                        self.crop_size_h,\n                        self.crop_size_w,\n                        b_id,\n                        self.default_frames,\n                        self.clips_per_video,\n                    )\n                    for b_id in batch_ids\n                ]\n                yield batch\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.Namespace:\n        if cls != VideoBatchSampler:\n            # Don't re-register arguments in subclasses that don't override `add_arguments()`.\n            return parser\n        group = parser.add_argument_group(cls.__name__)\n        group.add_argument(\n            \"--sampler.bs.num-frames-per-clip\",\n            default=8,\n            type=int,\n            help=\"Number of frames per video clip. Defaults to 8.\",\n        )\n        group.add_argument(\n            \"--sampler.bs.clips-per-video\",\n            default=1,\n            type=int,\n            help=\"Number of clips per video. Defaults to 1.\",\n        )\n        return parser\n\n    def extra_repr(self) -> str:\n        extra_repr_str = super().extra_repr()\n        extra_repr_str += (\n            f\"\\n\\t n_clips={self.clips_per_video}\"\n            f\"\\n\\t n_frames_per_clip={self.default_frames}\"\n        )\n        return extra_repr_str\n\n\n@SAMPLER_REGISTRY.register(name=\"video_batch_sampler_ddp\")\nclass VideoBatchSamplerDDP(BatchSamplerDDP):\n    \"\"\"DDP version of VideoBatchSampler\n\n    Args:\n        opts: command line argument\n        n_data_samples: Number of samples in the dataset\n        is_training: Training or validation mode. Default: False\n    \"\"\"\n\n    def __init__(\n        self,\n        opts: argparse.Namespace,\n        n_data_samples: int,\n        is_training: bool = False,\n        *args,\n        **kwargs,\n    ) -> None:\n        super().__init__(\n            opts=opts, n_data_samples=n_data_samples, is_training=is_training\n        )\n        self.default_frames = getattr(opts, \"sampler.bs.num_frames_per_clip\")\n        self.clips_per_video = getattr(opts, \"sampler.bs.clips_per_video\")\n\n    def __iter__(self) -> Iterator[Tuple[int, int, int, int, int]]:\n        indices_rank_i = self.get_indices_rank_i()\n\n        start_index = 0\n        batch_size = self.batch_size_gpu0\n        indices_len = len(indices_rank_i)\n        while start_index < indices_len:\n            end_index = min(start_index + batch_size, indices_len)\n            batch_ids = indices_rank_i[start_index:end_index]\n            n_batch_samples = len(batch_ids)\n            if n_batch_samples != batch_size:\n                batch_ids += indices_rank_i[: (batch_size - n_batch_samples)]\n            start_index += batch_size\n\n            if len(batch_ids) > 0:\n                batch = [\n                    (\n                        self.crop_size_h,\n                        self.crop_size_w,\n                        b_id,\n                        self.default_frames,\n                        self.clips_per_video,\n                    )\n                    for b_id in batch_ids\n                ]\n                yield batch\n\n    def extra_repr(self) -> str:\n        extra_repr_str = super().extra_repr()\n        extra_repr_str += (\n            f\"\\n\\t n_clips={self.clips_per_video}\"\n            f\"\\n\\t n_frames_per_clip={self.default_frames}\"\n        )\n        return extra_repr_str\n"
  },
  {
    "path": "corenet/data/sampler/video_clip_batch_sampler.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nimport math\nimport random\nfrom typing import Any, Callable, Dict, Iterator, List, Optional, Tuple\n\nimport numpy as np\n\nfrom corenet.data.sampler import SAMPLER_REGISTRY\nfrom corenet.data.sampler.base_sampler import BaseSampler, BaseSamplerDDP\nfrom corenet.data.sampler.variable_batch_sampler import (\n    VariableBatchSampler,\n    VariableBatchSamplerDDP,\n)\nfrom corenet.utils import logger\n\n\n@SAMPLER_REGISTRY.register(name=\"video_clip_batch_sampler\")\nclass VideoClipBatchSampler(VariableBatchSampler):\n    \"\"\"\n    Batch sampler for videos. Different with VideoBatchSampler that samples each video\n    the same number of clips despite the length of the video, VideoClipBatchSampler\n    samples number of clips proportional to the length of the video. In addition, by\n    setting scales of image (--sampler.vbs.min-crop-size-width,\n    --sampler.vbs.mmax-crop-size-width, --sampler.vbs.min-crop-size-height,\n    --sampler.vbs.mmax-crop-size-height, --sampler.vbs.max-n-scales) and frame rate\n    (--sampler.vcbs.min-clip-fps-scale, --sampler.vcbs.max-clip-fps-scale and\n    --sampler.vcbs.video-fps-num-scales), this sampler can also sample videos with\n    variable image size and frame rate.\n\n    When VideoClipBatchSampler is used, a tuple (crop_h, crop_w, video_id, num_frames,\n    num_clips, video_fps, audio_fps, num_samples_per_clip) is returned. (`crop_h`,\n    `crop_w`) is the image size to use, `video_id` is the index of the video the current\n    clips come from, `num_clips` is the number of clip to sample from the current video,\n    which is proportional to the length of the video; `video_fps` and `audio_fps` is the\n    frame rate of video and audio to sample; `num_samples_per_clip` is the number of\n    samples to generate for each clip at training time, this variable is only valid at\n    training time.\n\n    Note that the variable image size and frame rate are only applied during the\n    training time. The batch size is adjusted accordingly with the image size and video\n    length. By setting `--sampler.vcbs.max-num-clips-per-batch`, we have a upper bound\n    of a batch in case a certain video is too long and cause OOM problem.\n\n    Args:\n        opts: Command line argument.\n        n_data_samples: Number of samples in the dataset.\n        is_training: Training or validation mode. Default: False.\n        get_item_metadata: A callable that provides sample metadata, given sample index.\n    \"\"\"\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        group = parser.add_argument_group(\n            title=\"Batch sampler for videos\",\n            description=\"Arguments related to variable batch sampler\",\n        )\n        group.add_argument(\n            \"--sampler.vcbs.num-frames-per-clip\",\n            default=8,\n            type=int,\n            help=\"Number of frames per video clip. Default to 8.\",\n        )\n        group.add_argument(\n            \"--sampler.vcbs.video-fps\",\n            type=int,\n            default=8,\n            help=\"The desired frame rate of the clip. Default to 8.\",\n        )\n        group.add_argument(\n            \"--sampler.vcbs.audio-fps\",\n            type=int,\n            default=16000,\n            help=\"The frame rate of audio. Default to 16000.\",\n        )\n        group.add_argument(\n            \"--sampler.vcbs.min-clip-fps-scale\",\n            type=float,\n            default=1,\n            help=\"The minimal scale to apply to the desired video/audio frame rate of\"\n            \" the clip. Default to 1.\",\n        )\n        group.add_argument(\n            \"--sampler.vcbs.max-clip-fps-scale\",\n            type=float,\n            default=2.5,\n            help=\"The maximal scale to apply to desired video/audio frame rate of the\"\n            \" clip. Default to 2.5.\",\n        )\n        group.add_argument(\n            \"--sampler.vcbs.video-fps-num-scales\",\n            type=float,\n            default=5,\n            help=\"The maximal scale to apply to desired frame rate of the clip. Default\"\n            \" to 5.\",\n        )\n        group.add_argument(\n            \"--sampler.vcbs.num-clips-per-second-train\",\n            type=float,\n            default=1.0,\n            help=\"The number of clips per second for training, default to 1. This is\"\n            \" used to determine the frequency to sample.\",\n        )\n        group.add_argument(\n            \"--sampler.vcbs.num-clips-per-second-val\",\n            type=float,\n            default=4.0,\n            help=\"The number of clips per second for validation, default to 4. This is\"\n            \"used to determine the frequency to sample.\",\n        )\n        group.add_argument(\n            \"--sampler.vcbs.max-num-clips-per-batch\",\n            type=int,\n            default=50,\n            help=\"The maximal number of clips per batch, default to 50. This is used to\"\n            \" avoid memory leak if videos are too long.\",\n        )\n        group.add_argument(\n            \"--sampler.vcbs.num-samples-per-clip\",\n            type=int,\n            default=1,\n            help=\"The number of samples to generate for each clip at training time.\"\n            \" Default to 1.\",\n        )\n        return parser\n\n    def __init__(\n        self,\n        opts,\n        n_data_samples: int,\n        is_training: Optional[bool] = False,\n        get_item_metadata: Optional[Callable[[int], Dict]] = None,\n        *args,\n        **kwargs,\n    ) -> None:\n        super().__init__(\n            opts=opts, n_data_samples=n_data_samples, is_training=is_training\n        )\n        self.default_frames = getattr(opts, \"sampler.vcbs.num_frames_per_clip\")\n        self.video_fps = getattr(opts, \"sampler.vcbs.video_fps\")\n        self.audio_fps = getattr(opts, \"sampler.vcbs.audio_fps\")\n        self.min_fps_scale = getattr(opts, \"sampler.vcbs.min_clip_fps_scale\")\n        self.max_fps_scale = getattr(opts, \"sampler.vcbs.max_clip_fps_scale\")\n        self.num_fps_scale = getattr(opts, \"sampler.vcbs.video_fps_num_scales\")\n        self.num_samples_per_clip = getattr(opts, \"sampler.vcbs.num_samples_per_clip\")\n        self.num_clips_per_second_train = getattr(\n            opts, \"sampler.vcbs.num_clips_per_second_train\"\n        )\n        self.num_clips_per_second_val = getattr(\n            opts, \"sampler.vcbs.num_clips_per_second_val\"\n        )\n        self.max_num_clips_per_batch = getattr(\n            opts, \"sampler.vcbs.max_num_clips_per_batch\"\n        )\n        self.is_training = is_training\n        self.get_item_metadata = get_item_metadata\n\n        if is_training:\n            frame_rate_scales = np.linspace(\n                self.min_fps_scale,\n                self.max_fps_scale,\n                self.num_fps_scale,\n            )\n            self.frame_rate_scales = list(set(frame_rate_scales) | {1})\n        else:\n            self.frame_rate_scales = [1.0]\n            self.num_samples_per_clip = 1\n\n    def __iter__(self) -> Iterator[List]:\n        indices = self.get_indices()\n        start_index = 0\n        n_samples = len(indices)\n        while start_index < n_samples:\n            crop_h, crop_w, batch_size = random.choice(self.img_batch_tuples)\n            h_scale = crop_h / self.crop_size_h\n            w_scale = crop_w / self.crop_size_w\n            max_num_clips_per_batch = int(\n                self.max_num_clips_per_batch / (h_scale * w_scale)\n            )\n            fps_scale = random.choice(self.frame_rate_scales)\n            video_fps = int(self.video_fps * fps_scale)\n            audio_fps = int(self.audio_fps * fps_scale)\n\n            # Find the maximal batch size to contain no more than\n            # `self.max_num_clips_per_batch` clips.\n            batch_end_index = min(start_index + batch_size, n_samples)\n            end_index = start_index\n            sum_batch_clips = 0\n            num_batch_clips = []\n            while end_index < batch_end_index:\n                # Computed the weighted number of clips in the batch, taking video\n                # length, image size into account to make sure the batch fits into the\n                # memory.\n                num_clips_per_second = (\n                    self.num_clips_per_second_train\n                    if self.is_training\n                    else self.num_clips_per_second_val\n                )\n                metadata = self.get_item_metadata(indices[end_index])\n                if num_clips_per_second > 0:\n                    num_clips = max(\n                        1,\n                        int(metadata[\"video_duration\"] * num_clips_per_second),\n                    )\n                else:\n                    clip_duration = self.default_frames / self.video_fps\n                    num_clips = int(\n                        metadata[\"total_video_frames\"]\n                        - clip_duration * metadata[\"video_fps\"]\n                    )\n\n                num_clips = min(num_clips, max_num_clips_per_batch)\n                sum_batch_clips += num_clips\n                if sum_batch_clips > max_num_clips_per_batch:\n                    break\n                num_batch_clips.append(num_clips)\n                end_index += 1\n\n            video_ids = indices[start_index:end_index]\n            start_index += len(video_ids)\n\n            if len(video_ids) > 0:\n                batch = [\n                    (\n                        crop_h,\n                        crop_w,\n                        video_id,\n                        self.default_frames,\n                        num_batch_clips[i],\n                        video_fps,\n                        audio_fps,\n                        self.num_samples_per_clip,\n                    )\n                    for i, video_id in enumerate(video_ids)\n                ]\n                yield batch\n            else:\n                logger.warning(\"No data in the current batch.\")\n\n    def __repr__(self) -> str:\n        repr_str = \"{}(\".format(self.__class__.__name__)\n        repr_str += \"\\n \\t base_im_size=(h={}, w={})\\n \\t base_batch_size={}\\n \\t video_fps={}\\n \\taudio_fps={}\\n \\tn_frames={}\".format(\n            self.crop_size_h,\n            self.crop_size_w,\n            self.batch_size_gpu0,\n            self.video_fps,\n            self.audio_fps,\n            self.default_frames,\n        )\n        repr_str += self.extra_repr()\n        repr_str += \"\\n)\"\n        return repr_str\n\n\n@SAMPLER_REGISTRY.register(name=\"video_clip_batch_sampler_ddp\")\nclass VideoClipBatchSamplerDDP(BaseSamplerDDP):\n    \"\"\"Wraps the VideoClipBatchSampler to make it work with DDP.\n\n    This is needed for because we do not know how long the epoch will be, and\n    it is imperative that all replicas take the same number of steps.\n\n    This approach could be used to adapt any non DDP sampler.\n    \"\"\"\n\n    def __init__(\n        self,\n        *args,\n        **kwargs,\n    ) -> None:\n        self.inner = VideoClipBatchSampler(*args, **kwargs)\n        super().__init__(*args, **kwargs)\n\n    def __iter__(self) -> Iterator[List]:\n        \"\"\"Returns VideoClipBatchSampler samples divided up between DDP nodes.\"\"\"\n        batches = list(self.inner)\n        while len(batches) % self.num_replicas != 0:\n            for batch in reversed(batches):\n                if len(batch) > 1:\n                    batches.append([batch.pop()])\n                    break\n            else:\n                batches.pop()\n        for i in range(self.rank, len(batches), self.num_replicas):\n            yield batches[i]\n\n    def __len__(self) -> int:\n        return int(math.ceil(len(self.inner) / self.num_replicas))\n\n    def set_epoch(self, epoch: int) -> None:\n        self.epoch = epoch\n        self.inner.set_epoch(epoch)\n\n    def update_scales(self, *args, **kwargs) -> None:\n        return self.inner.update_scales(*args, **kwargs)\n\n    def update_indices(self, new_indices: List[int]) -> None:\n        return self.inner.update_indices(*args, **kwargs)\n\n    def extra_repr(self) -> str:\n        return self.inner.extra_repr()\n"
  },
  {
    "path": "corenet/data/sampler/video_variable_seq_sampler.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nimport random\nfrom typing import Iterator, Optional, Tuple\n\nfrom corenet.data.sampler import SAMPLER_REGISTRY\nfrom corenet.data.sampler.utils import make_video_pairs\nfrom corenet.data.sampler.variable_batch_sampler import (\n    VariableBatchSampler,\n    VariableBatchSamplerDDP,\n)\nfrom corenet.utils import logger\n\n\n@SAMPLER_REGISTRY.register(name=\"video_variable_seq_sampler\")\nclass VideoVariableSeqSampler(VariableBatchSampler):\n    \"\"\"Extends `Variably-size multi-scale batch sampler <https://arxiv.org/abs/2110.02178?context=cs.LG>` for videos.\n    This sampler yields batches of variable (1) batch size, (2) spatial resolutions,\n    (3) frames per clip, and (4) number of clips per video.\n\n    Args:\n        opts: command line argument\n        n_data_samples: Number of samples in the dataset\n        is_training: Training or validation mode. Default: False\n    \"\"\"\n\n    def __init__(\n        self,\n        opts: argparse.Namespace,\n        n_data_samples: int,\n        is_training: bool = False,\n        *args,\n        **kwargs,\n    ) -> None:\n        super().__init__(\n            opts=opts, n_data_samples=n_data_samples, is_training=is_training\n        )\n        self.default_frames = getattr(opts, \"sampler.vbs.num_frames_per_clip\")\n        min_clips_per_video = getattr(opts, \"sampler.vbs.min_clips_per_video\")\n        self.max_clips_per_video = getattr(opts, \"sampler.vbs.max_clips_per_video\")\n        self.clips_per_video = getattr(opts, \"sampler.vbs.clips_per_video\")\n        if min_clips_per_video is None:\n            logger.error(\n                \"Please specify min. clips per video using --sampler.vbs.min-clips-per-video.\"\n            )\n\n        self.min_clips_per_video = min_clips_per_video\n        self.random_video_clips = False\n        if is_training:\n            # override img_batch_tuples\n            self.img_batch_tuples = make_video_pairs(\n                crop_size_h=self.crop_size_h,\n                crop_size_w=self.crop_size_w,\n                min_crop_size_h=self.min_crop_size_h,\n                max_crop_size_h=self.max_crop_size_h,\n                min_crop_size_w=self.min_crop_size_w,\n                max_crop_size_w=self.max_crop_size_w,\n                max_scales=self.max_img_scales,\n                check_scale_div_factor=self.check_scale_div_factor,\n                default_frames=self.default_frames,\n            )\n            self.random_video_clips = getattr(opts, \"sampler.vbs.random_video_clips\")\n        else:\n            if self.clips_per_video is None:\n                logger.error(\n                    \"For modes other than training, clips per video can't be None\"\n                )\n            self.img_batch_tuples = [\n                (self.crop_size_h, self.crop_size_w, self.default_frames)\n            ]\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        if cls != VideoVariableSeqSampler:\n            # Don't re-register arguments in subclasses that don't override `add_arguments()`.\n            return parser\n        group = parser.add_argument_group(cls.__name__)\n        group.add_argument(\n            \"--sampler.vbs.num-frames-per-clip\",\n            default=8,\n            type=int,\n            help=\"Default frames per video. Defaults to 8\",\n        )\n\n        group.add_argument(\n            \"--sampler.vbs.random-video-clips\",\n            action=\"store_true\",\n            default=False,\n            help=\"Sample number of clips per video randomly during training between min and max values specified using \"\n            \"--sampler.vbs.min-clips-per-video and --sampler.vbs.max-clips-per-video arguments respectively\",\n        )\n        group.add_argument(\n            \"--sampler.vbs.min-clips-per-video\",\n            type=int,\n            default=1,\n            help=\"Minimum number of clips per video. Used only for training. Defaults to 1.\",\n        )\n        group.add_argument(\n            \"--sampler.vbs.max-clips-per-video\",\n            type=int,\n            default=5,\n            help=\"Maximum number of clips per video. Used only for training. Defaults to 5.\",\n        )\n        group.add_argument(\n            \"--sampler.vbs.clips-per-video\",\n            type=int,\n            default=1,\n            help=\"Number of clips per video. Defaults to 1.\",\n        )\n        group.add_argument(\n            \"--sampler.vbs.min-frames-per-clip\",\n            type=int,\n            default=8,\n            help=\"Minimum number of frames per clip. Defaults to 8.\",\n        )\n\n        return parser\n\n    def __iter__(self) -> Iterator[Tuple[int, int, int, int, int]]:\n        indices = self.get_indices()\n\n        start_index = 0\n        indices_len = len(indices)\n        while start_index < indices_len:\n            if self.random_video_clips:\n                # randomly sample number of clips and adjust frames per clip\n                n_clips = max(\n                    1,\n                    random.randint(self.min_clips_per_video, self.max_clips_per_video),\n                )\n                batch_size = max(\n                    self.batch_size_gpu0,\n                    self.batch_size_gpu0 * (self.clips_per_video // n_clips),\n                )\n            else:\n                n_clips = self.clips_per_video\n                batch_size = self.batch_size_gpu0\n\n            crop_h, crop_w, n_frames = random.choice(self.img_batch_tuples)\n            end_index = min(start_index + batch_size, indices_len)\n            batch_ids = indices[start_index:end_index]\n            n_batch_samples = len(batch_ids)\n            if len(batch_ids) != batch_size:\n                batch_ids += indices[: (batch_size - n_batch_samples)]\n            start_index += batch_size\n\n            if len(batch_ids) > 0:\n\n                batch = [\n                    (crop_h, crop_w, b_id, n_frames, n_clips) for b_id in batch_ids\n                ]\n                yield batch\n\n    def update_scales(\n        self, epoch: int, is_master_node: bool = False, *args, **kwargs\n    ) -> None:\n        if type(self).update_scales is not VideoVariableSeqSampler.update_scales:\n            # Do nothing when a subclass overrides this method and calls super().update_scales\n            return\n\n        if is_master_node and self.scale_inc:\n            logger.warning(\n                f\"Update scale function is not yet implemented for {self.__class__.__name__}\"\n            )\n\n    def extra_repr(self) -> str:\n        extra_repr_str = super().extra_repr()\n        extra_repr_str += (\n            f\"\\n\\t var_num_clips_training=(min={self.min_clips_per_video}, max={self.max_clips_per_video})\"\n            f\"\\n\\t fixed_num_clips_val={self.clips_per_video}\"\n        )\n        return extra_repr_str\n\n\n@SAMPLER_REGISTRY.register(name=\"video_variable_seq_sampler_ddp\")\nclass VideoVariableSeqSamplerDDP(VariableBatchSamplerDDP):\n    \"\"\"DDP variant of VideoVariableSeqSampler\n\n    Args:\n        opts: command line argument\n        n_data_samples (int): Number of samples in the dataset\n        is_training (Optional[bool]): Training or validation mode. Default: False\n    \"\"\"\n\n    def __init__(\n        self,\n        opts: argparse.Namespace,\n        n_data_samples: int,\n        is_training: Optional[bool] = False,\n        *args,\n        **kwargs,\n    ) -> None:\n        super().__init__(\n            opts=opts, n_data_samples=n_data_samples, is_training=is_training\n        )\n        self.default_frames = getattr(opts, \"sampler.vbs.num_frames_per_clip\")\n\n        self.random_video_clips = False\n        self.min_clips_per_video = getattr(opts, \"sampler.vbs.min_clips_per_video\")\n        self.max_clips_per_video = getattr(opts, \"sampler.vbs.max_clips_per_video\")\n        self.clips_per_video = getattr(opts, \"sampler.vbs.clips_per_video\")\n        if self.min_clips_per_video is None:\n            logger.error(\n                \"Please specify min. clips per video using --sampler.vbs.min-clips-per-video.\"\n            )\n\n        if is_training:\n            # override img_batch_tuples\n            self.img_batch_tuples = make_video_pairs(\n                crop_size_h=self.crop_size_h,\n                crop_size_w=self.crop_size_w,\n                min_crop_size_h=self.min_crop_size_h,\n                max_crop_size_h=self.max_crop_size_h,\n                min_crop_size_w=self.min_crop_size_w,\n                max_crop_size_w=self.max_crop_size_w,\n                max_scales=self.max_img_scales,\n                check_scale_div_factor=self.check_scale_div_factor,\n                default_frames=self.default_frames,\n            )\n            self.random_video_clips = getattr(opts, \"sampler.vbs.random_video_clips\")\n        else:\n            if self.clips_per_video is None:\n                logger.error(\n                    \"For modes other than training, clips per video can't be None\"\n                )\n\n            self.img_batch_tuples = [\n                (self.crop_size_h, self.crop_size_w, self.default_frames)\n            ]\n\n    def __iter__(self) -> Iterator[Tuple[int, int, int, int, int]]:\n        indices_rank_i = self.get_indices_rank_i()\n\n        start_index = 0\n        n_samples_rank_i = len(indices_rank_i)\n        while start_index < n_samples_rank_i:\n            if self.random_video_clips:\n                # randomly sample number of clips and adjust batch size\n                n_clips = max(\n                    1,\n                    random.randint(self.min_clips_per_video, self.max_clips_per_video),\n                )\n                batch_size = max(\n                    self.batch_size_gpu0,\n                    self.batch_size_gpu0 * (self.clips_per_video // n_clips),\n                )\n            else:\n                n_clips = self.clips_per_video\n                batch_size = self.batch_size_gpu0\n\n            crop_h, crop_w, n_frames = random.choice(self.img_batch_tuples)\n\n            end_index = min(start_index + batch_size, n_samples_rank_i)\n            batch_ids = indices_rank_i[start_index:end_index]\n            n_batch_samples = len(batch_ids)\n            if n_batch_samples != batch_size:\n                batch_ids += indices_rank_i[: (batch_size - n_batch_samples)]\n            start_index += batch_size\n\n            if len(batch_ids) > 0:\n                batch = [\n                    (crop_h, crop_w, b_id, n_frames, n_clips) for b_id in batch_ids\n                ]\n                yield batch\n\n    def update_scales(\n        self, epoch: int, is_master_node: bool = False, *args, **kwargs\n    ) -> None:\n        if type(self).update_scales is not VideoVariableSeqSamplerDDP.update_scales:\n            # Do nothing when a subclass overrides this method and calls super().update_scales\n            return\n        if is_master_node and self.scale_inc:\n            logger.warning(\n                f\"Update scale function is not yet implemented for {self.__class__.__name__}\"\n            )\n\n    def extra_repr(self) -> str:\n        extra_repr_str = super().extra_repr()\n        extra_repr_str += (\n            f\"\\n\\t var_num_clips_training=(min={self.min_clips_per_video}, max={self.max_clips_per_video})\"\n            f\"\\n\\t fixed_num_clips_val={self.clips_per_video}\"\n        )\n        return extra_repr_str\n"
  },
  {
    "path": "corenet/data/text_tokenizer/__init__.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\n\nfrom corenet.data.text_tokenizer.base_tokenizer import BaseTextTokenizer\nfrom corenet.utils import logger\nfrom corenet.utils.registry import Registry\n\nTOKENIZER_REGISTRY = Registry(\n    \"tokenizer\",\n    base_class=BaseTextTokenizer,\n    lazy_load_dirs=[\n        \"corenet/data/text_tokenizer\",\n        \"corenet/third_party/data/text_tokenizer\",\n    ],\n    internal_dirs=[\"corenet/internal\", \"corenet/internal/projects/*\"],\n)\n\n\ndef arguments_tokenizer(parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n    # add arguments for text_tokenizer\n    parser = BaseTextTokenizer.add_arguments(parser)\n\n    # add class specific arguments\n    parser = TOKENIZER_REGISTRY.all_arguments(parser)\n    return parser\n\n\ndef build_tokenizer(opts, *args, **kwargs) -> BaseTextTokenizer:\n    \"\"\"Helper function to build the text tokenizer from command-line arguments.\n\n    Args:\n        opts: Command-line arguments\n\n    Returns:\n        Image projection head module.\n    \"\"\"\n    tokenizer_name = getattr(opts, \"text_tokenizer.name\", None)\n\n    # We registered the base class using a special `name` (i.e., `__base__`)\n    # in order to access the arguments defined inside those classes. However, these classes are not supposed to\n    # be used. Therefore, we raise an error for such cases\n    if tokenizer_name == \"__base__\":\n        logger.error(\"__base__ can't be used as a projection name. Please check.\")\n\n    tokenizer = TOKENIZER_REGISTRY[tokenizer_name](opts, *args, **kwargs)\n    return tokenizer\n"
  },
  {
    "path": "corenet/data/text_tokenizer/base_tokenizer.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nfrom typing import Any\n\nfrom torch import Tensor, nn\n\nfrom corenet.utils import logger\n\n\nclass BaseTextTokenizer(nn.Module):\n    \"\"\"Base class for text tokenizers.\n\n    Args:\n        opts: Command-line arguments.\n    \"\"\"\n\n    def __init__(self, opts: argparse.Namespace) -> None:\n        super().__init__()\n        self.opts = opts\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        if cls == BaseTextTokenizer:\n            group = parser.add_argument_group(title=cls.__name__)\n\n            group.add_argument(\n                \"--text-tokenizer.name\",\n                type=str,\n                default=None,\n                help=\"Name of the text tokenizer (e.g., clip). Defaults to None.\",\n            )\n\n            group.add_argument(\n                \"--text-tokenizer.sot-token\",\n                type=str,\n                default=None,\n                help=f\"Start of the text token. Defaults to None (i.e., users must specify the value if it needs to be used.).\",\n            )\n            group.add_argument(\n                \"--text-tokenizer.eot-token\",\n                type=str,\n                default=None,\n                help=f\"End of the text token. Defaults to None (i.e., users must specify the value if it needs to be used.).\",\n            )\n            group.add_argument(\n                \"--text-tokenizer.pad-token\",\n                type=str,\n                default=None,\n                help=f\"Pad token. Defaults to None (i.e., users must specify the value if it needs to be used.).\",\n            )\n\n        return parser\n\n    @property\n    def vocab_size(self) -> int:\n        \"\"\"Text vocabulary size.\"\"\"\n        raise NotImplementedError(\"Child classes must implement this method.\")\n\n    @property\n    def eot_token(self) -> str:\n        \"\"\"End of text token.\"\"\"\n        eot = getattr(self.opts, \"text_tokenizer.eot_token\")\n        if eot is None:\n            logger.error(\n                \"EOT token can't be None. Please specify using 'text_tokenizer.eot_token' in config file.\"\n            )\n        return eot\n\n    @property\n    def eot_token_id(self) -> int:\n        \"\"\"Token index for EOT token.\"\"\"\n        raise NotImplementedError(\"Child classes must implement this method.\")\n\n    @property\n    def sot_token(self) -> str:\n        \"\"\"Start of text token.\"\"\"\n        sot = getattr(self.opts, \"text_tokenizer.sot_token\")\n        if sot is None:\n            logger.error(\n                \"SOT token can't be None. Please specify using 'text_tokenizer.sot_token' in config file.\"\n            )\n        return sot\n\n    @property\n    def sot_token_id(self) -> int:\n        \"\"\"Start of token index.\"\"\"\n        raise NotImplementedError(\"Child classes must implement this method.\")\n\n    @property\n    def pad_token(self) -> str:\n        \"\"\"Padding token.\"\"\"\n        pad = getattr(self.opts, \"text_tokenizer.pad_token\")\n        if pad is None:\n            logger.error(\n                \"Padding token can't be None. Please specify using 'text_tokenizer.pad_token' in config file.\"\n            )\n        return pad\n\n    @property\n    def pad_token_id(self) -> int:\n        \"\"\"Padding index.\"\"\"\n        raise NotImplementedError(\"Child classes must implement this method.\")\n\n    def tok_encode(self, input_sentence: str) -> Tensor:\n        \"\"\"Encodes a sentence into a tensor of token ids.\"\"\"\n        raise NotImplementedError(\"Child classes must implement this method.\")\n\n    def tok_decode(self, token_ids: Any) -> str:\n        \"\"\"Decodes token ids into a sentence.\"\"\"\n        raise NotImplementedError(\"Child classes must implement this method.\")\n\n    def forward(self, input_sentence: str) -> Tensor:\n        \"\"\"Tokenize the input sentence.\n\n        Args:\n            input_sentence: Pre-processed input sentence.\n\n        Returns:\n            Tensor containing tokenized sequence.\n\n        ...note:\n            Input sentence should be pre-processed (e.g., lower case).\n        \"\"\"\n        tokenized_sentence = self.tok_encode(input_sentence)\n        return tokenized_sentence\n"
  },
  {
    "path": "corenet/data/text_tokenizer/clip_tokenizer.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\n\nimport torch\nfrom torch import Tensor\nfrom torchtext.transforms import CLIPTokenizer\n\nfrom corenet.data.text_tokenizer import TOKENIZER_REGISTRY, BaseTextTokenizer\nfrom corenet.utils import logger\nfrom corenet.utils.download_utils import get_local_path\n\n\n@TOKENIZER_REGISTRY.register(name=\"clip\")\nclass ClipTokenizer(BaseTextTokenizer):\n    \"\"\"Tokenizer for CLIP.\n\n    This tokenizer uses torchtext's CLIP Tokenizer to tokenize input sentence into token ids.\n    Please see `torchtext documentation <https://pytorch.org/text/stable/transforms.html#torchtext.transforms.CLIPTokenizer>`_ for details.\n\n    Args:\n        opts: Command line arguments.\n    \"\"\"\n\n    def __init__(self, opts: argparse.Namespace) -> None:\n        merges_path = getattr(opts, \"text_tokenizer.clip.merges_path\")\n        if merges_path is None:\n            logger.error(\n                \"Please specify BPE merge file using --text-tokenizer.clip.merges-path argument\"\n            )\n\n        # DDP case is handled internally\n        merges_path = get_local_path(opts, path=merges_path, force_delete=False)\n\n        encoder_json_path = getattr(opts, \"text_tokenizer.clip.encoder_json_path\")\n        if encoder_json_path is None:\n            logger.error(\n                \"Please specify Encoder JSON file using --text-tokenizer.clip.encoder-json-path argument\"\n            )\n\n        encoder_json_path = get_local_path(\n            opts, path=encoder_json_path, force_delete=False\n        )\n\n        super().__init__(opts)\n        self.tokenizer = CLIPTokenizer(\n            merges_path=merges_path, encoder_json_path=encoder_json_path\n        )\n        # BPE encodings is a dict, where  keys are tokens and values are token_ids\n        self.bpe_encodings = self.tokenizer.bpe.bpe_encoder_\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        if cls == ClipTokenizer:\n            group = parser.add_argument_group(title=cls.__name__)\n\n            group.add_argument(\n                \"--text-tokenizer.clip.merges-path\",\n                type=str,\n                default=None,\n                help=\"Path to bpe merges file. Defaults to None.\",\n            )\n\n            group.add_argument(\n                \"--text-tokenizer.clip.encoder-json-path\",\n                type=str,\n                default=None,\n                help=\"Path to BPE encoder json file. This file is used to infer `num_merges`. Defaults to None.\",\n            )\n        return parser\n\n    @property\n    def vocab_size(self) -> int:\n        \"\"\"Text vocabulary size.\"\"\"\n        return len(self.bpe_encodings)\n\n    @property\n    def eot_token(self) -> str:\n        \"\"\"End of text token.\"\"\"\n        return \"<|endoftext|>\"\n\n    @property\n    def eot_token_id(self) -> int:\n        \"\"\"Token index for EOT token.\"\"\"\n        return int(self.tokenizer(self.eot_token)[0])\n\n    @property\n    def sot_token(self) -> str:\n        \"\"\"Start of text token.\"\"\"\n        return \"<|startoftext|>\"\n\n    @property\n    def sot_token_id(self) -> int:\n        \"\"\"Start of token index.\"\"\"\n        return int(self.tokenizer(self.sot_token)[0])\n\n    def tok_encode(self, input_sentence: str) -> Tensor:\n        \"\"\"Encodes a sentence into a tensor of token ids.\n\n        ...note:\n            SOT and EOT tokens are added to input sentence before tokenization.\n        \"\"\"\n        input_sentence = f\"{self.sot_token} {input_sentence} {self.eot_token}\"\n        # tokenizer returns indices as a string\n        tokenized_sentence = self.tokenizer(input_sentence)\n        # convert string to int and then create a tensor\n        tokenized_sentence = torch.tensor(\n            [int(cap) for cap in tokenized_sentence], dtype=torch.long\n        )\n        return tokenized_sentence\n"
  },
  {
    "path": "corenet/data/text_tokenizer/sentencepiece_tokenizer.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nfrom argparse import Namespace\nfrom typing import List, Union\n\nimport ftfy\nimport torch\nfrom torch import Tensor\n\nfrom corenet.data.text_tokenizer import TOKENIZER_REGISTRY, BaseTextTokenizer\nfrom corenet.utils import logger\nfrom corenet.utils.ddp_utils import is_rank_0_worker_0\nfrom corenet.utils.download_utils import get_local_path\n\n\n@TOKENIZER_REGISTRY.register(name=\"sentence_piece\")\nclass SentencePieceTokenizer(BaseTextTokenizer):\n    \"\"\"Sentence piece tokenizer.\n\n    Args:\n        opts: Command-line arguments.\n\n    ...note:\n        Sentence piece library needs to be installed in order to use this tokenizer.\n        It can be installed as:\n        ```\n            pip install -e '.[sentencepiece]'\n        ```\n    \"\"\"\n\n    def __init__(self, opts: Namespace) -> None:\n        super().__init__(opts)\n\n        try:\n            from sentencepiece import SentencePieceProcessor\n        except ModuleNotFoundError:\n            raise ModuleNotFoundError(\"Please install sentencepiece library.\")\n\n        spm_model_path = getattr(self.opts, \"text_tokenizer.sentence_piece.model_path\")\n        if spm_model_path is None:\n            logger.error(\n                f\"Model path can't be None in {self.__class__.__name__}. Please specify using 'text_tokenizer.sentence_piece.model_path' in config file.\"\n            )\n        spm_model_local_path = get_local_path(\n            opts=self.opts,\n            path=spm_model_path,\n            force_delete=False,\n            use_start_rank=True,\n            sync_ranks=False,\n        )\n        self.log_warning_once_on_rank0_worker0 = is_rank_0_worker_0(opts)\n\n        self.sp_model = SentencePieceProcessor(model_file=spm_model_local_path)\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        \"\"\"Add arguments related to sentence piece tokenizer.\"\"\"\n        if cls == SentencePieceTokenizer:\n            group = parser.add_argument_group(cls.__name__)\n            group.add_argument(\n                \"--text-tokenizer.sentence-piece.model-path\",\n                type=str,\n                default=None,\n                help=\"Sentence piece model path. Defaults to None (i.e., user need to supply the model path).\",\n            )\n            group.add_argument(\n                \"--text-tokenizer.sentence-piece.enable-nfc-normalization\",\n                action=\"store_true\",\n                default=False,\n                help=\"Normalize the text using NFC normalization. This is useful when pre-training. Defaults to False.\",\n            )\n            group.add_argument(\n                \"--text-tokenizer.sentence-piece.append-sot-token\",\n                action=\"store_true\",\n                default=False,\n                help=\"Append start of text token before tokenized text. Defaults to False.\",\n            )\n            group.add_argument(\n                \"--text-tokenizer.sentence-piece.append-eot-token\",\n                action=\"store_true\",\n                default=False,\n                help=\"Append end of text token after tokenized text. Defaults to False.\",\n            )\n\n        return parser\n\n    @property\n    def vocab_size(self) -> int:\n        \"\"\"Vocabulary size.\"\"\"\n        v_size = self.sp_model.vocab_size()\n        assert (\n            isinstance(v_size, int) and v_size > 0\n        ), f\"Vocabulary size should be a positive integer. Got: {v_size}\"\n        return v_size\n\n    @property\n    def sot_token_id(self) -> int:\n        \"\"\"Start of text token index.\"\"\"\n        sot = self.sp_model.bos_id()\n        assert (\n            isinstance(sot, int) and sot > 0\n        ), f\"The start of text index should be a non-negative integer. Got: {sot}.\"\n        return sot\n\n    @property\n    def eot_token_id(self) -> int:\n        \"\"\"End of text token index.\"\"\"\n        eot = self.sp_model.eos_id()\n        assert (\n            isinstance(eot, int) and eot > 0\n        ), f\"The end of text index should be a non-negative integer. Got: {eot}.\"\n        return eot\n\n    @property\n    def pad_token_id(self) -> int:\n        \"\"\"Padding index.\n\n        ...note:\n            If the padding index is None or -1, we set it equal to the vocabulary size. Consequently, the range of indices\n            in the vocabulary changes from '[0, vocab_size)' to '[0, vocab_size]'. This adjustment is primarily made to accommodate\n            variable sequence lengths during LLM pre-training. Users should exclude the padding index from consideration in the loss\n            function. They should also increase the size of embedding layer and classification layer in the model configuration to\n            accommodate padding index if it is None or -1.\n        \"\"\"\n        pad_id = self.sp_model.pad_id()\n\n        assert pad_id is None or (\n            isinstance(pad_id, int) and pad_id >= -1\n        ), f\"The padding index should be None or an integer greater than or equal to -1. Got: {pad_id}.\"\n        if pad_id is None or pad_id == -1:\n            pad_id = self.vocab_size\n            if self.log_warning_once_on_rank0_worker0:\n                logger.warning(\n                    \"Padding index is -1. Because -1 index does not work with embedding layer, we change it to vocab size.\"\n                )\n                self.log_warning_once_on_rank0_worker0 = False\n        return pad_id\n\n    def tok_encode(self, input_sentence: str) -> Tensor:\n        \"\"\"Encodes a sentence into a tensor of token ids.\n\n        Args:\n            input_sentence: Input sentence to be tokenized.\n\n        Returns:\n            A tensor containing token indices.\n        \"\"\"\n\n        if getattr(self.opts, \"text_tokenizer.sentence_piece.enable_nfc_normalization\"):\n            # normalize the text\n            input_sentence = ftfy.fix_text(input_sentence, normalization=\"NFC\")\n\n        # tokenized sequence is returned as a list.\n        tokenized_seq = self.sp_model.Encode(input_sentence)\n\n        if getattr(self.opts, \"text_tokenizer.sentence_piece.append_sot_token\"):\n            tokenized_seq = [self.sot_token_id] + tokenized_seq\n\n        if getattr(self.opts, \"text_tokenizer.sentence_piece.append_eot_token\"):\n            tokenized_seq = tokenized_seq + [self.eot_token_id]\n\n        # convert a list into tensor\n        tokenized_seq = torch.tensor(tokenized_seq, dtype=torch.long)\n        return tokenized_seq\n\n    def tok_decode(self, token_ids: Union[torch.Tensor, List[int]]) -> str:\n        \"\"\"Decodes token ids into a sentence.\n\n        Args:\n            token_ids: Token indices as a list of integers or a 1D integer tensor.\n\n        Returns:\n            A decoded sequence.\n        \"\"\"\n        if isinstance(token_ids, torch.Tensor):\n            assert token_ids.dim() == 1 and token_ids.dtype in [\n                torch.int,\n                torch.int64,\n                torch.int32,\n                torch.int8,\n            ]\n            token_ids = token_ids.numpy().tolist()\n\n        assert isinstance(token_ids, list) and all(\n            isinstance(x, int) for x in token_ids\n        )\n        return self.sp_model.Decode(token_ids)\n"
  },
  {
    "path": "corenet/data/transforms/__init__.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\n\nfrom corenet.data.transforms.base_transforms import BaseTransformation\nfrom corenet.utils.registry import Registry\n\nTRANSFORMATIONS_REGISTRY = Registry(\n    \"transformation\",\n    base_class=BaseTransformation,\n    lazy_load_dirs=[\"corenet/data/transforms\"],\n    internal_dirs=[\"corenet/internal\", \"corenet/internal/projects/*\"],\n)\n\n\ndef arguments_augmentation(parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n    # add arguments for base image projection layer\n    parser = BaseTransformation.add_arguments(parser)\n\n    # add augmentation specific arguments\n    parser = TRANSFORMATIONS_REGISTRY.all_arguments(parser)\n    return parser\n"
  },
  {
    "path": "corenet/data/transforms/audio.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nimport math\nimport pathlib\nimport random\nfrom typing import Callable, Dict, List, Optional, Union\n\nimport torch\nimport torchaudio\n\nfrom corenet.data.transforms import TRANSFORMATIONS_REGISTRY, BaseTransformation\nfrom corenet.data.transforms.audio_aux import mfccs\n\n\n@TRANSFORMATIONS_REGISTRY.register(name=\"audio_gain\", type=\"audio\")\nclass Gain(BaseTransformation):\n    \"\"\"\n    This class implements gain augmentation for audio.\n    \"\"\"\n\n    def __init__(self, opts, *args, **kwargs) -> None:\n        super().__init__(opts=opts)\n        self.gain_levels = getattr(opts, \"audio_augmentation.gain.levels\")\n        self.enable = getattr(opts, \"audio_augmentation.gain.enable\")\n        self.share_clip_params = getattr(\n            opts, \"audio_augmentation.gain.share_clip_params\"\n        )\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        group = parser.add_argument_group(title=cls.__name__)\n        group.add_argument(\n            \"--audio-augmentation.gain.enable\",\n            action=\"store_true\",\n            help=\"Use {}. This flag is useful when you want to study the effect of\"\n            \" different transforms. Defaults to False.\".format(cls.__name__),\n        )\n        group.add_argument(\n            \"--audio-augmentation.gain.levels\",\n            type=float,\n            default=[0],\n            nargs=\"+\",\n            help=\"Gain levels to use for augmentation (in dB). Defaults to [0] (no gain).\",\n        )\n        group.add_argument(\n            \"--audio-augmentation.gain.share-clip-params\",\n            action=\"store_true\",\n            help=\"Pick the same gain levels for each clip in the batch if set True.\",\n        )\n        return parser\n\n    def __call__(self, data: Dict) -> Dict:\n        \"\"\"\n        This function implements the gain transformation by scaling the\n        input audio with a specific constant determined from the gain_levels\n\n        Args:\n            data: A dictionary containing {\"samples\": {\"audio\": @audio}}, where\n                @audio is a tensor of shape [num_channels, sequence_length].\n\n        Returns:\n            The modified dictionary with the augmented audio.\n        \"\"\"\n\n        if self.gain_levels == [0]:\n            return data\n\n        audio = data[\"samples\"][\"audio\"]\n        if self.share_clip_params:\n            gain_level = random.choice(self.gain_levels)\n            data[\"samples\"][\"audio\"] = 10.0 ** (gain_level / 20.0) * audio\n        else:\n            new_audio = torch.empty_like(audio)\n            for i in range(audio.shape[0]):\n                gain_level = random.choice(self.gain_levels)\n                new_audio[i] = 10.0 ** (gain_level / 20.0) * audio[i]\n            data[\"samples\"][\"audio\"] = new_audio\n        return data\n\n    def __repr__(self) -> str:\n        return \"{}(gain_levels={}, enable={}, share_clip_parameters={})\".format(\n            self.__class__.__name__,\n            self.gain_levels,\n            self.enable,\n            self.share_clip_parameters,\n        )\n\n\n@TRANSFORMATIONS_REGISTRY.register(name=\"audio_ambient_noise\", type=\"audio\")\nclass Noise(BaseTransformation):\n    \"\"\"\n    This class implements ambient noise augmentation for audio.\n    \"\"\"\n\n    def __init__(\n        self,\n        opts: argparse.Namespace,\n        is_training: bool = True,\n        noise_files_dir: Optional[str] = None,\n        *args,\n        **kwargs,\n    ) -> None:\n        super().__init__(opts=opts)\n        self.gain_levels = getattr(opts, \"audio_augmentation.noise.levels\")\n        self.cache_size = getattr(opts, \"audio_augmentation.noise.cache_size\")\n        self.refresh_freq = getattr(opts, \"audio_augmentation.noise.refresh_freq\")\n        self.refresh_counter = self.refresh_freq\n\n        self.noise_files_dir = noise_files_dir\n        if self.noise_files_dir is None:\n            self.noise_files_dir = getattr(opts, \"audio_augmentation.noise.files_dir\")\n\n        self.noise_files = []\n        self.pointer = 0\n        if self.noise_files_dir is not None:\n            self.noise_files = sorted(\n                pathlib.Path(self.noise_files_dir).glob(\"**/*.wav\")\n            )\n            if is_training:\n                random.shuffle(self.noise_files)\n            self.noise_waves = self.load_noise_files(cache_size=self.cache_size)\n        if len(self.noise_files) == 0:\n            raise ValueError(\n                \"--audio-augmentation.noise.files-dir must be provided for this augmentation\"\n            )\n        self.enable = getattr(opts, \"audio_augmentation.noise.enable\")\n\n    def load_noise_files(self, cache_size: int) -> List[torch.TensorType]:\n        \"\"\"\n        This method caches a list of noise files for on the fly augmentation.\n        \"\"\"\n        noise_waves = []\n        for i in range(cache_size):\n            noise_wav_file = self.noise_files[self.pointer % len(self.noise_files)]\n            self.pointer += 1\n            noise, sample_rate = torchaudio.load(str(noise_wav_file))\n            assert (\n                noise.dtype == torch.float32\n            ), f\"Expected noise file {noise_wav_file} to decode to float32 audio, but got {noise.dtype}.\"\n            noise_waves.append((noise, sample_rate))\n        return noise_waves\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        group = parser.add_argument_group(title=cls.__name__)\n\n        group.add_argument(\n            \"--audio-augmentation.noise.enable\",\n            action=\"store_true\",\n            help=\"Use {}. This flag is useful when you want to study the effect of\"\n            \" different transforms. Defaults to False.\".format(cls.__name__),\n        )\n        group.add_argument(\n            \"--audio-augmentation.noise.levels\",\n            type=float,\n            default=[-100],\n            nargs=\"+\",\n            help=\"Gain levels to use for noise augmentation (in dB). Defaults to \"\n            \"[-100], means almost no augmentation (10^-5 noise signal).\",\n        )\n        group.add_argument(\n            \"--audio-augmentation.noise.cache-size\",\n            type=int,\n            default=10,\n            help=\"Number of augmentation noises to cache. Defaults to 10.\",\n        )\n        group.add_argument(\n            \"--audio-augmentation.noise.files-dir\",\n            type=str,\n            default=None,\n            help=\"Directory path that stores the noise files to be added. Defaults to None.\",\n        )\n        group.add_argument(\n            \"--audio-augmentation.noise.refresh-freq\",\n            type=int,\n            default=0,\n            help=\"Frequency to refresh noise files (default 0 means never refresh).\",\n        )\n        return parser\n\n    def __call__(self, data: Dict) -> Dict:\n        \"\"\"\n        This function adds a random noise sample selected from the\n        noise samples provided in the noise directory scaled by a random gain.\n        The sample should contain floating-point values in [-1, 1].\n\n        Args:\n            data: A dictionary containing {\"samples\": {\"audio\": @audio}}, where\n                @audio is a tensor of shape [num_channels, sequence_length].\n\n        Returns:\n            The modified dictionary with the augmented audio.\n        \"\"\"\n        audio = data[\"samples\"][\"audio\"]\n        assert audio.shape[0] in [1, 2]\n        gain_level = random.choice(self.gain_levels)\n        noise_wave, noise_fps = random.choice(self.noise_waves)\n        # @noise_wave is in [num_channels, sequence_length] format.\n        assert math.isclose(data[\"metadata\"][\"audio_fps\"], noise_fps, rel_tol=1e-6)\n        if noise_wave.shape[-1] >= audio.shape[-1]:\n            random_start_point = random.randint(\n                0, noise_wave.shape[-1] - audio.shape[-1]\n            )\n            noise_wave = noise_wave[\n                :, random_start_point : random_start_point + audio.shape[-1]\n            ]\n        else:\n            noise_wave = torch.nn.functional.pad(\n                noise_wave.unsqueeze(0),\n                (0, audio.shape[-1] - noise_wave.shape[-1]),\n                mode=\"circular\",\n            )\n            # @noise_wave is in [1, num_channels, sequence_length] format.\n            noise_wave = noise_wave[0]\n        augmented_audio = audio + 10.0 ** (gain_level / 20.0) * noise_wave\n        data[\"samples\"][\"audio\"] = augmented_audio\n        self.refresh_counter -= 1\n        if (\n            self.refresh_counter <= 0\n            and self.refresh_freq > 0\n            and self.noise_files_dir is not None\n        ):\n            # Refresh cache when met refresh criteria.\n            self.noise_waves = self.load_noise_files(self.cache_size)\n            self.refresh_counter = self.refresh_freq\n        return data\n\n    def __repr__(self) -> str:\n        return \"{}(gain_levels={}, noise_files_dir={}, enable={})\".format(\n            self.__class__.__name__,\n            self.gain_levels,\n            self.noise_files_dir,\n            self.enable,\n        )\n\n\n@TRANSFORMATIONS_REGISTRY.register(name=\"set_fixed_length\", type=\"audio\")\nclass SetFixedLength(BaseTransformation):\n    \"\"\"Set the audio buffer to a fixed length.\"\"\"\n\n    def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None:\n        super().__init__(opts, *args, **kwargs)\n        self.length = getattr(opts, \"audio_augmentation.set_fixed_length.length\")\n        self.enable = getattr(opts, \"audio_augmentation.set_fixed_length.enable\")\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        group = parser.add_argument_group(cls.__name__)\n\n        group.add_argument(\n            \"--audio-augmentation.set-fixed-length.enable\",\n            action=\"store_true\",\n            help=\"Use {}. This flag is useful when you want to study the effect of\"\n            \" different transforms. Defaults to False.\".format(cls.__name__),\n        )\n        group.add_argument(\n            \"--audio-augmentation.set-fixed-length.length\",\n            default=16000,\n            type=int,\n            help=\"Length to which to trim or pad the audio buffer. Defaults to 16000.\",\n        )\n\n        return parser\n\n    def __call__(\n        self,\n        data: Dict[str, Union[Dict[str, torch.Tensor], torch.Tensor, int]],\n        *args,\n        **kwargs,\n    ) -> Dict[str, Union[Dict[str, torch.Tensor], torch.Tensor, int]]:\n        \"\"\"\n        Apply the transformation to the input data.\n\n        Input data must have {\"samples\": {\"audio\": torch.Tensor}}. The audio\n        must be [C, N] in shape, where C is the number of channels, and N is the\n        number of samples.\n\n        Returns:\n            The transformed batch.\n        \"\"\"\n\n        audio = data[\"samples\"][\"audio\"]\n        if not audio.shape[0] in (1, 2):\n            raise ValueError(f\"Expected channels first. Got audio shape {audio.shape}\")\n\n        if audio.shape[1] < self.length:\n            audio = torch.nn.functional.pad(audio, (0, self.length - audio.shape[1]))\n        else:\n            audio = audio[:, 0 : self.length]\n        data[\"samples\"][\"audio\"] = audio\n        return data\n\n    def __repr__(self) -> str:\n        return f\"{self.__class__.__name__}(length={self.length}, enable={self.enable})\"\n\n\n@TRANSFORMATIONS_REGISTRY.register(name=\"roll\", type=\"audio\")\nclass Roll(BaseTransformation):\n    \"\"\"Perform a roll augmentation by shifting the window in a circular manner.\"\"\"\n\n    def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None:\n        super().__init__(opts, *args, **kwargs)\n        self.window = getattr(opts, \"audio_augmentation.roll.window\")\n        self.enable = getattr(opts, \"audio_augmentation.roll.enable\")\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        group = parser.add_argument_group(cls.__name__)\n\n        group.add_argument(\n            \"--audio-augmentation.roll.enable\",\n            action=\"store_true\",\n            help=\"Use {}. This flag is useful when you want to study the effect of\"\n            \" different transforms. Defaults to False.\".format(cls.__name__),\n        )\n        group.add_argument(\n            \"--audio-augmentation.roll.window\",\n            default=0.1,\n            type=float,\n            help=\"Maximum fraction of the audio buffer to move. Defaults to 0.1.\",\n        )\n\n        return parser\n\n    def __call__(\n        self,\n        data: Dict[str, Union[Dict[str, torch.Tensor], torch.Tensor, int]],\n        *args,\n        **kwargs,\n    ) -> Dict[str, Union[Dict[str, torch.Tensor], torch.Tensor, int]]:\n        \"\"\"\n        Apply the transformation to the input data.\n\n        Input data must have {\"samples\": {\"audio\": torch.Tensor}}. The audio\n        must be [C, N] in shape, where C is the number of channels, and N is the\n        number of samples.\n\n        Returns:\n            The transformed batch.\n        \"\"\"\n\n        audio = data[\"samples\"][\"audio\"]\n        C, N = audio.shape\n        if not C in (1, 2):\n            raise ValueError(f\"Unexpected number of channels {C}\")\n\n        audio = torch.roll(\n            audio,\n            torch.randint(-int(N * self.window), int(N * self.window), [1]).item(),\n            1,\n        )\n        data[\"samples\"][\"audio\"] = audio\n        return data\n\n    def __repr__(self) -> str:\n        return f\"{self.__class__.__name__}(window={self.window}, enable={self.enable})\"\n\n\n@TRANSFORMATIONS_REGISTRY.register(name=\"mfccs\", type=\"audio\")\nclass MFCCs(BaseTransformation):\n    def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None:\n        super().__init__(opts, *args, **kwargs)\n        self.num_mfccs = getattr(opts, \"audio_augmentation.mfccs.num_mfccs\")\n        self.window_length = getattr(opts, \"audio_augmentation.mfccs.window_length\")\n        self.num_frames = getattr(opts, \"audio_augmentation.mfccs.num_frames\")\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        group = parser.add_argument_group(cls.__name__)\n        group.add_argument(\n            \"--audio-augmentation.mfccs.num-mfccs\",\n            default=20,\n            type=int,\n            help=\"Number of MFCC features. Defaults to 20.\",\n        )\n        group.add_argument(\n            \"--audio-augmentation.mfccs.window-length\",\n            type=float,\n            default=0.023,\n            help=\"Window length (unit: seconds) for MFCC calculation. Defaults to 0.023.\",\n        )\n        group.add_argument(\n            \"--audio-augmentation.mfccs.num-frames\",\n            type=int,\n            default=8,\n            help=\"Number of sub-time-slice temporal components. This argument is used\"\n            \" for splitting the temporal dimension of the spectrogram into frames.\"\n            \" Defaults to 8.\",\n        )\n\n        return parser\n\n    def __call__(self, data: Dict, *args, **kwargs) -> Dict:\n        \"\"\"\n        Converts the audio signal of the samples to MFCC features. See the documentation\n        of @corenet.modeling.misc.get_mfcc_features for further details.\n\n        Args: {\n            \"samples\": {\n                \"audio\": torch.FloatTensor[num_clips x temporal_size x num_channels]\n                \"metadata\": {\n                     \"audio_fps\": float\n                }\n            }\n        },\n\n        Returns: {\n            \"samples\": {\n                \"audio\": torch.FloatTensor[num_clips, C, num_mfccs, num_frames,\n                ceil(spectrogram_length/num_frames)]\n            }\n        }\n        \"\"\"\n\n        audio_fps = data[\"samples\"][\"metadata\"][\"audio_fps\"]\n        audio_image = mfccs.get_mfcc_features(\n            data[\"samples\"][\"audio\"],\n            sampling_rate=audio_fps,\n            num_mfccs=self.num_mfccs,\n            window_length=self.window_length,\n            num_frames=self.num_frames,\n        ).detach()\n\n        data[\"samples\"][\"audio\"] = audio_image\n        return data\n\n    def __repr__(self) -> str:\n        return (\n            f\"{self.__class__.__name__}(num_mfccs={self.num_mfccs},window_length=\"\n            f\"{self.window_length}, num_frames={self.num_frames})\"\n        )\n\n\nclass LambdaAudio(BaseTransformation):\n    \"\"\"\n    Similar to @torchvision.transforms.Lambda, applies a user-defined lambda on the\n    audio samples as a transform.\n    \"\"\"\n\n    def __init__(\n        self,\n        opts: argparse.Namespace,\n        func: Callable[[torch.Tensor], torch.Tensor],\n        *args,\n        **kwargs,\n    ) -> None:\n        self.func = func\n        super(LambdaAudio, self).__init__(opts, *args, **kwargs)\n\n    def __call__(self, data: Dict, *args, **kwargs) -> Dict:\n        data[\"samples\"][\"audio\"] = self.func(data[\"samples\"][\"audio\"])\n        return data\n\n\n@TRANSFORMATIONS_REGISTRY.register(name=\"audio-resample\", type=\"audio\")\nclass AudioResample(BaseTransformation):\n    \"\"\"Resample audio to a specified framerate.\"\"\"\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> None:\n        group = parser.add_argument_group(cls.__name__)\n        group.add_argument(\n            \"--audio-augmentation.audio-resample.enable\",\n            action=\"store_true\",\n            help=\"Use {}. This flag is useful when you want to study the effect of\"\n            \" different transforms. Defaults to False.\".format(cls.__name__),\n        )\n\n        group.add_argument(\n            \"--audio-augmentation.audio-resample.audio-fps\",\n            default=16000,\n            type=int,\n            help=\"Frames per second in the incoming audio stream. Defaults to 16000.\",\n        )\n        return parser\n\n    def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None:\n        super().__init__(opts, *args, **kwargs)\n        self.sample_rate = getattr(opts, \"audio_augmentation.audio_resample.audio_fps\")\n        self.effects = [[\"rate\", str(self.sample_rate)]]\n        self.enable = getattr(opts, \"audio_augmentation.audio_resample.enable\")\n\n    def __call__(self, data: Dict, *args, **kwargs) -> Dict:\n        \"\"\"Reample audio to the specified audio fps.\n\n        Args:\n            data: A dict of data input in the following format:\n            {\n                \"samples\": {\n                    \"audio\": torch.FloatTensor[num_clips x temporal_size x num_channels]\n                    \"metadata\": {\n                        \"audio_fps\": float\n                    }\n                }\n            },\n\n        Returns: {\n            \"samples\": {\n                \"audio\": torch.FloatTensor[num_clips x temporal_size x num_channels]\n                \"metadata\": {\n                    \"audio_fps\": float\n                }\n            }\n        }\n        \"\"\"\n        audio = data[\"samples\"][\"audio\"]\n\n        audio_rate = data[\"samples\"][\"metadata\"][\"audio_fps\"]\n        resampled_audio = []\n        for audio_tensor in audio:\n            (\n                resampled_audio_tensor,\n                sample_rate,\n            ) = torchaudio.sox_effects.apply_effects_tensor(\n                audio_tensor, audio_rate, self.effects, channels_first=False\n            )\n            resampled_audio.append(resampled_audio_tensor)\n        data[\"samples\"][\"audio\"] = torch.stack(resampled_audio, dim=0)\n        data[\"samples\"][\"metadata\"][\"audio_fps\"] = self.sample_rate\n        return data\n\n    def __repr__(self) -> str:\n        return f\"{self.__class__.__name__}(sample_rate={self.sample_rate}, enable={self.enable})\"\n\n\n@TRANSFORMATIONS_REGISTRY.register(name=\"standardize_channels\", type=\"audio\")\nclass StandardizeChannels(BaseTransformation):\n    def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None:\n        self.num_channels = getattr(\n            opts, \"audio_augmentation.standardize_channels.num_channels\"\n        )\n        self.enable = getattr(opts, \"audio_augmentation.standardize_channels.enable\")\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        group = parser.add_argument_group(cls.__name__)\n\n        group.add_argument(\n            \"--audio-augmentation.standardize-channels.num-channels\",\n            default=2,\n            type=int,\n            help=\"Number of output audio channels. Defaults to 2.\",\n        )\n        group.add_argument(\n            \"--audio-augmentation.standardize-channels.enable\",\n            default=False,\n            action=\"store_true\",\n            help=\"Use {}. This flag is useful when you want to study the effect of\"\n            \" different transforms. Defaults to False.\".format(cls.__name__),\n        )\n        return parser\n\n    def __call__(self, data: Dict, *args, **kwargs) -> Dict:\n        \"\"\"Ensures all audio samples have a specific number of channels.\n\n        To reduce the number of audio channels from 2 to 1, the average values of the\n        two channels is used.\n\n        Args:\n            data (Dict): {\n                \"samples\": {\n                    \"audio\": Tensor[N,T,C] where N is the number of audio clips, T is\n                             the audio sequence length, and C is the number of channels.\n                }\n            }\n\n        Tensor shape abbreviations:\n            N: Number of clips.\n            T, T_audio, T_video: Temporal lengths.\n            C: Number of color channels.\n            H, W: Height, Width.\n\n        Returns:\n            Dict: _description_\n        \"\"\"\n        if not self.enable:\n            return data\n\n        audio = data[\"samples\"][\"audio\"]  # N, T, C\n        assert audio.ndim == 3, f\"Invalid audio dimension {audio.ndim}. Expected 3.\"\n        num_input_channels = audio.shape[2]\n\n        if num_input_channels == self.num_channels:\n            return data\n\n        if (num_input_channels, self.num_channels) == (1, 2):\n            audio = audio.repeat(1, 1, 2)  # N, T, 2\n        elif (num_input_channels, self.num_channels) == (2, 1):\n            audio = audio.mean(dim=2, keepdim=True)  # N, T, 1\n        else:\n            raise NotImplementedError(\n                f\"The logic for standardizing audio channels with input shape of\"\n                f\" {audio.shape} to {self.num_channels} channels is not implemented.\"\n            )\n\n        data[\"samples\"][\"audio\"] = audio\n        return data\n\n    def __repr__(self) -> str:\n        return f\"{self.__class__.__name__}(num_channels={self.num_channels}, enable={self.enable})\"\n\n\n@TRANSFORMATIONS_REGISTRY.register(name=\"gaussian-audio-noise\", type=\"audio\")\nclass GaussianAudioNoise(BaseTransformation):\n    \"\"\"Add Gaussian audio noise with a standard deviation randomly chosen from\n    a user-specified range.\"\"\"\n\n    def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None:\n        self._min_scale, self._max_scale = getattr(\n            opts, \"audio_augmentation.gaussian_noise.audio_noise_scale_range\"\n        )\n        self.enable = getattr(opts, \"audio_augmentation.gaussian_noise.enable\")\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> None:\n        group = parser.add_argument_group(cls.__name__)\n        group.add_argument(\n            \"--audio-augmentation.gaussian-noise.enable\",\n            action=\"store_true\",\n            help=\"Use {}. This flag is useful when you want to study the effect of\"\n            \" different transforms. Defaults to False.\".format(cls.__name__),\n        )\n\n        group.add_argument(\n            \"--audio-augmentation.gaussian-noise.audio-noise-scale-range\",\n            type=float,\n            nargs=2,\n            default=(0.000, 0.005),\n            help=\"The standard deviation of the noise will be between the high \"\n            \"and low end of this scale. Defaults to (0.000, 0.005)\",\n        )\n        return parser\n\n    def __call__(self, data: Dict, *args, **kwargs) -> Dict:\n        \"\"\"Applies gaussian noise between specified limits to the input audio signal\n\n        Args:\n            data (Dict): {\n                \"samples\": {\n                    \"audio\": Tensor[num_clips, num_frames, num_channels]\n                }\n            }\n\n\n        Returns:\n            data (Dict): {\n                \"samples\": {\n                    \"audio\": Tensor[num_clips, num_frames, num_channels]\n                }\n            }\n        \"\"\"\n        scale = random.uniform(self._min_scale, self._max_scale)\n        noise = torch.randn_like(data[\"samples\"][\"audio\"]) * scale\n        data[\"samples\"][\"audio\"] += noise\n        return data\n\n    def __repr__(self) -> str:\n        return (\n            f\"{self.__class__.__name__}(noise scale={self._min_scale}-\"\n            f\"{self._max_scale}, enable={self.enable})\"\n        )\n"
  },
  {
    "path": "corenet/data/transforms/audio_aux/__init__.py",
    "content": ""
  },
  {
    "path": "corenet/data/transforms/audio_aux/mfccs.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\nimport math\n\nimport torch\n\nfrom corenet.utils import logger\n\n\ndef get_mfccs(\n    data: torch.Tensor,\n    sampling_rate: float,\n    num_mfccs: int,\n    window_length: float = 0.023,\n) -> torch.Tensor:\n    \"\"\"Get Mel Frequency Cepstral Coefficients from an audio signal.\n\n    Explanation of Mel-Frequency Cepstral Coefficients (MFCCs):\n    > https://librosa.org/doc/main/generated/librosa.stft.html#librosa.stft\n\n    Args:\n        data: one channel of the audio signal, as a 1-D tensor.\n        sampling_rate: the sampling rate of the audio.\n        num_mfccs: the number of cepstral coefficients to use.\n        window_length: the window length used for computing the spectrogram. By\n            default, we choose 23ms, which is a good value for human speech.\n    \"\"\"\n    try:\n        from torchaudio.transforms import (\n            MFCC,  # Importing torchaudio takes ~0.6 s, but often not needed. That's why it is imported inside this function.\n        )\n    except ImportError:\n        logger.error(\"Torchaudio is not installed. Please install it.\")\n\n    n_fft = sampling_rate * window_length\n    # Round to the nearest power of 2.\n    n_fft = 2 ** round(math.log2(n_fft))\n\n    return MFCC(\n        sample_rate=sampling_rate,\n        n_mfcc=num_mfccs,\n        melkwargs={\n            \"n_fft\": n_fft,\n            # librosa's default value: https://github.com/librosa/librosa/blob/71077174b9e73ae81d268f81551bb9667bf3693b/librosa/filters.py#L132\n            \"n_mels\": 128,\n            # librosa's default value: https://github.com/librosa/librosa/blob/71077174b9e73ae81d268f81551bb9667bf3693b/librosa/feature/spectral.py#L2027\n            \"hop_length\": 512,\n            \"mel_scale\": \"slaney\",\n            # librosa's default value: https://github.com/librosa/librosa/blob/71077174b9e73ae81d268f81551bb9667bf3693b/librosa/filters.py#L136\n            \"norm\": \"slaney\",\n        },\n    )(data.float())\n\n\ndef calculate_mfccs(\n    audio: torch.Tensor,\n    sampling_rate: float,\n    num_mfccs: int,\n    window_length: float = 0.023,\n) -> torch.Tensor:\n    \"\"\"Calculate MFCCs on a batch of data.\n\n    Args:\n        audio: the audio signal, in [batch_size, num_channels, temporal_size]\n            order.\n        sampling_rate: the sampling rate of the audio signal.\n        num_mfccs: the number of coefficients to use.\n        window_length: the window length used for computing the spectrogram. By\n            default, we choose 23ms, which is a good value for human speech.\n    \"\"\"\n    if audio.dim() != 3:\n        raise ValueError(f\"Expected 3 dimensions, got {audio.dim()}\")\n\n    spectrogram_length = get_mfccs(\n        audio[0][0],\n        sampling_rate,\n        num_mfccs,\n        window_length=window_length,\n    ).shape[1]\n\n    result = torch.empty(\n        [audio.shape[0], audio.shape[1], num_mfccs, spectrogram_length],\n        device=audio.device,\n        dtype=audio.dtype,\n    )\n\n    for i, element in enumerate(audio):\n        for j, channel in enumerate(element):\n            mfccs = get_mfccs(\n                channel, sampling_rate, num_mfccs, window_length=window_length\n            )\n            result[i, j] = mfccs\n    return result\n\n\ndef get_mfcc_features(\n    audio: torch.Tensor,\n    sampling_rate: float,\n    num_mfccs: int,\n    num_frames: int,\n    window_length: float = 0.023,\n) -> torch.Tensor:\n    \"\"\"Get MFCC features for a batch of audio data.\n\n    Args:\n        audio: the audio signal, in [batch_size, temporal_size, num_channels]\n            order.\n        sampling_rate: the sampling rate of the audio signal.\n        num_mfccs: the number of coefficients to use.\n        window_length: the window length used for computing the spectrogram. By\n            default, we choose 23ms, which is a good value for human speech.\n        num_frames: each MFCC spectrogram gets dividied into @num_frames frames\n            (sub-time-slice temporal components) of length ceil(spectrogram_length/num_frames).\n    Returns:\n        MFCCs in [N, C, num_mfccs, num_frames, ceil(spectrogram_length/num_frames)] order.\n    \"\"\"\n    if audio.dim() != 3:\n        raise ValueError(f\"Invalid audio.dim()={audio.dim()}\")\n    if audio.shape[2] != 2:\n        raise ValueError(f\"Invalid number of channels {audio.shape[2]}\")\n    audio = audio.permute([0, 2, 1])\n\n    features = calculate_mfccs(\n        audio,\n        sampling_rate,\n        num_mfccs,\n        window_length=window_length,\n    )  # Size: [N, C, num_mfccs, T].\n\n    return get_padded_features(\n        features=features,\n        num_frames=num_frames,\n    )\n\n\ndef get_padded_features(\n    features: torch.Tensor,\n    num_frames: int,\n) -> torch.Tensor:\n    \"\"\"\n    Splits the temporal dimension (of length T) of MFCC features into\n    @num_frames sub-vectors (of length ``ceil(T/num_frames)``).\n    As T may not be divisible by @num_frames, pads the temporal dimension if required.\n\n    Args:\n        features: Tensor[batchsize x C(num_audio_channels) x num_mfccs x T]\n        num_frames: number of padded sub-vectors\n\n    Returns:\n        padded_features: Tensor (batchsize x C x num_mfccs x num_frames x ceil(T/num_frames))\n    \"\"\"\n    N, C, num_mfccs, T = features.shape\n    frame_length = math.ceil(T / num_frames)\n\n    if T % num_frames != 0:\n        padded_features = torch.zeros(\n            [\n                N,\n                C,\n                num_mfccs,\n                frame_length * num_frames,\n            ],\n            dtype=features.dtype,\n            device=features.device,\n        )\n        padded_features[:, :, :, :T] = features\n    else:\n        padded_features = features\n\n    padded_features = padded_features.reshape(N, C, num_mfccs, num_frames, frame_length)\n    return padded_features\n"
  },
  {
    "path": "corenet/data/transforms/audio_bytes.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\nimport argparse\nimport io\nimport tempfile\nfrom typing import Dict, Union\n\nimport numpy as np\nimport torch\nimport torchaudio\n\nfrom corenet.data.transforms import TRANSFORMATIONS_REGISTRY, BaseTransformation\n\n\ndef _stream_to_wav(x: torch.Tensor, dtype: str, audio_fps: int, backend: str) -> bytes:\n    \"\"\"\n    Take in a tensor of audio values in [-1, 1] and save it as a wav file with\n    values of the given @dtype.\n\n    Args:\n        x: a tensor of shape [N] or [C, N], where, C is the number of channels,\n            and N is the number of samples.\n        dtype: The data type to which @x should be converted before being saved.\n        audio_fps: The audio framerate at which x should be stored.\n        backend: The I/O backend to use for save the audio. Accepted values: sox,\n            ffmpeg, soundfile.\n\n    Returns:\n        The bytes of the wav file.\n    \"\"\"\n    assert x.dtype == torch.float32\n\n    if dtype == \"float32\":\n        pass\n    elif dtype == \"int32\":\n        x = x * (2**31 - 1)\n        x = x.to(dtype=torch.int32)\n    elif dtype == \"int16\":\n        x = x * (2**15 - 1)\n        x = x.to(dtype=torch.int16)\n    elif dtype == \"uint8\":\n        x = (x + 1) * (2**8 - 1) / 2\n        x = x.to(dtype=torch.uint8)\n\n    if x.dim() == 1:\n        x = x.reshape(1, -1)\n    with tempfile.NamedTemporaryFile(\"rb+\", suffix=\".wav\") as f:\n        # The sox backend does not support writing to BytesIO.\n        torchaudio.save(f.name, x, audio_fps, format=\"wav\", backend=backend)\n        byte_values = f.read()\n\n    return byte_values\n\n\n@TRANSFORMATIONS_REGISTRY.register(name=\"torchaudio_save\", type=\"audio\")\nclass TorchaudioSave(BaseTransformation):\n    \"\"\"\n    Encode audio with a supported file encoding.\n\n    Args:\n        opts: The global options.\n    \"\"\"\n\n    def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None:\n        super().__init__(opts=opts, *args, **kwargs)\n        self.opts = opts\n        self.encoding_dtype = getattr(\n            self.opts, \"audio_augmentation.torchaudio_save.encoding_dtype\"\n        )\n        self.format = getattr(self.opts, \"audio_augmentation.torchaudio_save.format\")\n        self.backend = getattr(self.opts, \"audio_augmentation.torchaudio_save.backend\")\n\n    def __call__(\n        self, data: Dict[str, Union[Dict[str, torch.Tensor], torch.Tensor, int]]\n    ) -> Dict[str, Union[Dict[str, torch.Tensor], torch.Tensor, int]]:\n        \"\"\"\n        Serialize the input as file bytes.\n\n        Args:\n            data: A tensor of the form:\n                {\n                    \"samples\": {\"audio\": tensor of shape [num_channels, sequence_length]},\n                    \"metadata\": {\"audio_fps\": the audio framerate.}\n                }\n\n        Returns:\n            The transformed data.\n        \"\"\"\n        x = data[\"samples\"][\"audio\"]\n        audio_fps = data[\"metadata\"][\"audio_fps\"]\n        if x.dim() == 2:\n            # @x is [C, N] in shape. Convert to mono.\n            if x.shape[0] in (1, 2):\n                x = x.mean(dim=0)\n            else:\n                raise ValueError(f\"Expected x.shape[0] to be 1 or 2, got {x.shape}\")\n        else:\n            raise ValueError(f\"Expected x.dim() == 2, got shape {x.shape}\")\n\n        if self.format == \"wav\":\n            file_bytes = _stream_to_wav(x, self.encoding_dtype, audio_fps, self.backend)\n            buf = np.frombuffer(file_bytes, dtype=np.uint8)\n            # Convert to int32 so we can use negative values as padding.\n            # The copy operation is required to avoid a warning about non-writable\n            # tensors.\n            buf = torch.from_numpy(buf.copy()).to(dtype=torch.int32)\n            data[\"samples\"][\"audio\"] = buf\n\n        elif self.format == \"mp3\":\n            if x.dim() == 1:\n                x = x.reshape(1, -1)\n            with tempfile.NamedTemporaryFile(\"rb+\", suffix=\".mp3\") as f:\n                # The sox backend does not support writing to BytesIO.\n                torchaudio.save(f.name, x, audio_fps, backend=self.backend)\n                byte_values = f.read()\n            buf = np.frombuffer(byte_values, dtype=np.uint8)\n            # Convert to int32 so we can use negative values as padding.\n            # The copy operation is required to avoid a warning about non-writable\n            # tensors.\n            buf = torch.from_numpy(buf.copy()).to(dtype=torch.int32)\n            data[\"samples\"][\"audio\"] = buf\n\n        else:\n            raise NotImplementedError(\n                f\"Format {self.format} not implemented. Only 'wav' and 'mp3' are supported.\"\n            )\n\n        return data\n\n    def __repr__(self) -> str:\n        return f\"{self.__class__.__name__}()\"\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        group = parser.add_argument_group(title=cls.__name__)\n        group.add_argument(\n            \"--audio-augmentation.torchaudio-save.enable\",\n            action=\"store_true\",\n            help=\"Use {}. This flag is useful when you want to study the effect of different \"\n            \"transforms.\".format(cls.__name__),\n        )\n        group.add_argument(\n            \"--audio-augmentation.torchaudio-save.encoding-dtype\",\n            choices=(\"float32\", \"int32\", \"int16\", \"uint8\"),\n            help=\"The data type used in the audio encoding. Defaults to float32.\",\n            default=\"float32\",\n        )\n        group.add_argument(\n            \"--audio-augmentation.torchaudio-save.format\",\n            choices=(\"wav\", \"mp3\"),\n            default=\"wav\",\n            help=\"The format in which to save the audio. Defaults to wav.\",\n        )\n        group.add_argument(\n            \"--audio-augmentation.torchaudio-save.backend\",\n            choices=(\"ffmpeg\", \"sox\", \"soundfile\"),\n            default=\"sox\",\n            help=(\n                \"The I/O backend to use for save the audio. Defaults to sox, which was\"\n                \" the default backend in the earlier torchaudio versions.\"\n            ),\n        )\n        return parser\n"
  },
  {
    "path": "corenet/data/transforms/base_transforms.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nfrom typing import Dict\n\n\nclass BaseTransformation(object):\n    \"\"\"\n    Base class for augmentation methods\n    \"\"\"\n\n    def __init__(self, opts, *args, **kwargs) -> None:\n        self.opts = opts\n\n    def __call__(self, data: Dict) -> Dict:\n        raise NotImplementedError\n\n    def __repr__(self) -> str:\n        return \"{}()\".format(self.__class__.__name__)\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        return parser\n"
  },
  {
    "path": "corenet/data/transforms/common.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\nfrom typing import Dict, List\n\nfrom corenet.data.transforms import TRANSFORMATIONS_REGISTRY, BaseTransformation\n\n\n@TRANSFORMATIONS_REGISTRY.register(name=\"compose\", type=\"common\")\nclass Compose(BaseTransformation):\n    \"\"\"\n    This method applies a list of transforms in a sequential fashion.\n    \"\"\"\n\n    def __init__(self, opts, img_transforms: List, *args, **kwargs) -> None:\n        super().__init__(opts=opts)\n        self.img_transforms = img_transforms\n\n    def __call__(self, data: Dict) -> Dict:\n        for t in self.img_transforms:\n            data = t(data)\n        return data\n\n    def __repr__(self) -> str:\n        transform_str = \", \".join(\"\\n\\t\\t\\t\" + str(t) for t in self.img_transforms)\n        repr_str = \"{}({}\\n\\t\\t)\".format(self.__class__.__name__, transform_str)\n        return repr_str\n\n\n@TRANSFORMATIONS_REGISTRY.register(name=\"identity\", type=\"common\")\nclass Identity(BaseTransformation):\n    \"\"\"\n    This is a no-op transformation that returns its inputs unchanged.\n    \"\"\"\n\n    def __call__(self, data: Dict) -> Dict:\n        return data\n\n    def __repr__(self) -> str:\n        return f\"{self.__class__.__name__}()\"\n"
  },
  {
    "path": "corenet/data/transforms/image_bytes.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nimport io\nfrom typing import Dict, Union\n\nimport numpy as np\nimport torch\nfrom PIL import Image\n\nfrom corenet.data.transforms import TRANSFORMATIONS_REGISTRY, BaseTransformation\n\n\ndef _image_to_bytes(x: torch.Tensor, **kwargs) -> io.BytesIO:\n    \"\"\"\n    Take an image in [0, 1] and save it as file bytes using PIL.\n\n    Args:\n        x: an image tensor in [C, H, W] order, where C is the number of channels,\n            and H, W are the height and width.\n        kwargs: any keyword arguments that can be passed to PIL's Image.save().\n\n    Returns:\n        The file bytes.\n\n    \"\"\"\n    assert x.min() >= 0\n    assert x.max() <= 1\n    x = (x * 255).byte().permute(1, 2, 0).cpu().numpy()  # Bytes in H, W, C order\n\n    img = Image.fromarray(x)\n    byte_array = io.BytesIO()\n\n    img.save(byte_array, **kwargs)\n    return byte_array\n\n\ndef _bytes_to_int32(byte_array: io.BytesIO) -> torch.Tensor:\n    \"\"\"\n    Convert a byte array to int32 values.\n\n    Args:\n        byte_array: The input byte array.\n    Returns:\n        The int32 tensor.\n    \"\"\"\n    buf = np.frombuffer(byte_array.getvalue(), dtype=np.uint8)\n    # The copy operation is required to avoid a warning about non-writable\n    # tensors.\n    buf = torch.from_numpy(buf.copy()).to(dtype=torch.int32)\n    return buf\n\n\n@TRANSFORMATIONS_REGISTRY.register(name=\"pil_save\", type=\"image_torch\")\nclass PILSave(BaseTransformation):\n    \"\"\"\n    Encode an image with a supported file encoding.\n    \"\"\"\n\n    def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None:\n        super().__init__(opts=opts, *args, **kwargs)\n        self.file_encoding = getattr(opts, \"image_augmentation.pil_save.file_encoding\")\n        self.quality = getattr(opts, \"image_augmentation.pil_save.quality\")\n        self.opts = opts\n\n    def __call__(\n        self, data: Dict[str, Union[torch.Tensor, int]]\n    ) -> Dict[str, Union[torch.Tensor, int]]:\n        \"\"\"\n        Serialize an image as file bytes.\n\n        Args:\n            data: A dictionary containing a key called \"samples\", which contains\n                an image tensor of shape [C, H, W].\n\n        Returns:\n            The transformed data.\n        \"\"\"\n        x = data[\"samples\"]\n\n        if self.file_encoding == \"fCHW\":\n            x = (x * 255).byte().to(dtype=torch.int32).reshape(-1)\n        elif self.file_encoding == \"fHWC\":\n            x = (x * 255).byte().to(dtype=torch.int32).permute(1, 2, 0).reshape(-1)\n        elif self.file_encoding == \"TIFF\":\n            x = _bytes_to_int32(_image_to_bytes(x, format=\"tiff\"))\n        elif self.file_encoding == \"PNG\":\n            x = _bytes_to_int32(_image_to_bytes(x, format=\"png\", compress_level=0))\n        elif self.file_encoding == \"JPEG\":\n            quality = getattr(self.opts, \"image_augmentation.pil_save.quality\")\n            x = _bytes_to_int32(_image_to_bytes(x, format=\"jpeg\", quality=quality))\n        else:\n            raise NotImplementedError(\n                f\"Invalid file encoding {self.file_encoding}. Expected one of 'fCHW, fHWC, TIFF, PNG, JPEG'.\"\n            )\n        data[\"samples\"] = x\n        return data\n\n    def __repr__(self) -> str:\n        return f\"{self.__class__.__name__}(file_encoding={self.file_encoding}, quality={self.quality})\"\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        group = parser.add_argument_group(title=cls.__name__)\n\n        group.add_argument(\n            \"--image-augmentation.pil-save.enable\",\n            action=\"store_true\",\n            help=\"Use {}. This flag is useful when you want to study the effect of different \"\n            \"transforms.\".format(cls.__name__),\n        )\n        group.add_argument(\n            \"--image-augmentation.pil-save.file-encoding\",\n            choices=(\"fCHW\", \"fHWC\", \"TIFF\", \"PNG\", \"JPEG\"),\n            help=\"The type of file encoding to use. Defaults to TIFF.\",\n            default=\"TIFF\",\n        )\n        group.add_argument(\n            \"--image-augmentation.pil-save.quality\",\n            help=\"JPEG quality if using JPEG encoding. Defaults to 100.\",\n            type=int,\n            default=100,\n        )\n        return parser\n\n\n@TRANSFORMATIONS_REGISTRY.register(name=\"shuffle_bytes\", type=\"image_torch\")\nclass ShuffleBytes(BaseTransformation):\n    \"\"\"\n    Reorder the bytes in a 1-dimensional buffer.\n    \"\"\"\n\n    def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None:\n        super().__init__(opts=opts, *args, **kwargs)\n        self.mode = getattr(opts, \"image_augmentation.shuffle_bytes.mode\")\n        self.stride = getattr(opts, \"image_augmentation.shuffle_bytes.stride\")\n        window_size = getattr(opts, \"image_augmentation.shuffle_bytes.window_size\")\n        self.window_shuffle = torch.randperm(window_size)\n\n    def __call__(\n        self, data: Dict[str, Union[torch.Tensor, int]]\n    ) -> Dict[str, Union[torch.Tensor, int]]:\n        \"\"\"\n        Reorder the bytes of a 1-dimensional buffer.\n\n        Args:\n            data: A dictionary containing a key called \"samples\", which contains\n                a tensor of shape [N], where N is the number of bytes.\n\n        Returns:\n            The transformed data.\n        \"\"\"\n        x = data[\"samples\"]\n        if not x.dim() == 1:\n            raise ValueError(f\"Expected 1d input, got {x.shape}\")\n\n        if self.mode == \"reverse\":\n            x = torch.fliplr(x.view(1, -1))[0]\n        elif self.mode == \"random_shuffle\":\n            x = x[torch.randperm(x.shape[0])]\n        elif self.mode == \"cyclic_half_length\":\n            x = torch.roll(x, x.shape[0] // 2)\n        elif self.mode == \"stride\":\n            l = len(x)\n            values = []\n            for i in range(self.stride):\n                values.append(x[i :: self.stride])\n            x = torch.cat(values, dim=0)\n            assert len(x) == l\n        elif self.mode == \"window_shuffle\":\n            l = len(x)\n            window_size = self.window_shuffle.shape[0]\n            num_windows = l // window_size\n            values = []\n            for i in range(num_windows):\n                chunk = x[i * window_size : (i + 1) * window_size]\n                values.append(chunk[self.window_shuffle])\n\n            # Add the last bits that fall outside the shuffling window.\n            values.append(x[num_windows * window_size :])\n            x = torch.cat(values, dim=0)\n            assert len(x) == l\n        else:\n            raise NotImplementedError(\n                f\"mode={self.mode} not implemented. Expected one of 'reverse, random_shuffle, cyclic_half_length, stride, window_shuffle'.\"\n            )\n        data[\"samples\"] = x\n        return data\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        group = parser.add_argument_group(title=cls.__name__)\n\n        group.add_argument(\n            \"--image-augmentation.shuffle-bytes.enable\",\n            action=\"store_true\",\n            help=\"Use {}. This flag is useful when you want to study the effect of different \"\n            \"transforms.\".format(cls.__name__),\n        )\n        group.add_argument(\n            \"--image-augmentation.shuffle-bytes.mode\",\n            default=\"reverse\",\n            help=\"The mode to use when shuffling bytes. Defaults to 'reverse'.\",\n            choices=(\n                \"reverse\",\n                \"random_shuffle\",\n                \"cyclic_half_length\",\n                \"stride\",\n                \"window_shuffle\",\n            ),\n        )\n        group.add_argument(\n            \"--image-augmentation.shuffle-bytes.stride\",\n            type=int,\n            default=1024,\n            help=\"The stride of the window used in shuffling operations that are windowed. Defaults to 1024.\",\n        )\n        group.add_argument(\n            \"--image-augmentation.shuffle-bytes.window-size\",\n            type=int,\n            default=1024,\n            help=\"The size of the window used in shuffling operations that are windowed. Defaults to 1024.\",\n        )\n        return parser\n\n\n@TRANSFORMATIONS_REGISTRY.register(name=\"mask_positions\", type=\"image_torch\")\nclass MaskPositions(BaseTransformation):\n    \"\"\"\n    Mask out values in a 1-dimensional buffer using a fixed masking pattern.\n    \"\"\"\n\n    def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None:\n        super().__init__(opts=opts, *args, **kwargs)\n        self.keep_frac = getattr(opts, \"image_augmentation.mask_positions.keep_frac\")\n        self._cached_masks = None\n\n    def _generate_masks(self, N: int) -> torch.Tensor:\n        if self._cached_masks is None:\n            g = torch.Generator()\n            # We want to fix the mask across all inputs, so we fix the seed.\n            # Choose a seed with a good balance of 0 and 1 bits. See:\n            # https://pytorch.org/docs/stable/generated/torch.Generator.html#torch.Generator.manual_seed\n            g.manual_seed(2147483647)\n            random_mask = torch.zeros([N], requires_grad=False, dtype=torch.bool)\n            random_mask[torch.randperm(N, generator=g)[: int(self.keep_frac * N)]] = 1\n            self._cached_masks = random_mask\n        return self._cached_masks\n\n    def __call__(\n        self, data: Dict[str, Union[torch.Tensor, int]]\n    ) -> Dict[str, Union[torch.Tensor, int]]:\n        \"\"\"\n        Mask values in a 1-dimensional buffer with a fixed masking pattern.\n\n        Args:\n            data: A dictionary containing a key called \"samples\", which contains\n                a tensor of shape [N], where N is the number of bytes.\n\n        Returns:\n            The transformed data.\n        \"\"\"\n        x = data[\"samples\"]\n        mask = self._generate_masks(x.shape[0])\n        x = x[mask]\n        data[\"samples\"] = x\n        return data\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        group = parser.add_argument_group(title=cls.__name__)\n\n        group.add_argument(\n            \"--image-augmentation.mask-positions.enable\",\n            action=\"store_true\",\n            help=\"Use {}. This flag is useful when you want to study the effect of different \"\n            \"transforms.\".format(cls.__name__),\n        )\n        group.add_argument(\n            \"--image-augmentation.mask-positions.keep-frac\",\n            type=float,\n            default=0.5,\n            help=\"The fraction of bytes to keep. Defaults to 0.5.\",\n        )\n        return parser\n\n\n@TRANSFORMATIONS_REGISTRY.register(name=\"byte_permutation\", type=\"image_torch\")\nclass BytePermutation(BaseTransformation):\n    \"\"\"\n    Remap byte values in [0, 255] to new values in [0, 255] using a permutation.\n    \"\"\"\n\n    def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None:\n        super().__init__(opts=opts, *args, **kwargs)\n\n        g = torch.Generator()\n        g.manual_seed(2147483647)\n        self.mask = torch.randperm(256, generator=g)\n\n    def __call__(\n        self, data: Dict[str, Union[torch.Tensor, int]]\n    ) -> Dict[str, Union[torch.Tensor, int]]:\n        \"\"\"\n        Remap byte values in [0, 255] to new values in [0, 255] using a permutation.\n\n        Args:\n            data: A dictionary containing a key called \"samples\", which contains\n                a tensor of shape [N], where N is the number of bytes.\n\n        Returns:\n            The transformed data.\n        \"\"\"\n        x = data[\"samples\"]\n\n        if x.dim() != 1:\n            raise ValueError(f\"Expected 1d tensor. Got {x.shape}.\")\n        x = torch.index_select(self.mask, dim=0, index=x)\n        data[\"samples\"] = x\n        return data\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        group = parser.add_argument_group(title=cls.__name__)\n\n        group.add_argument(\n            \"--image-augmentation.byte-permutation.enable\",\n            action=\"store_true\",\n            help=\"Use {}. This flag is useful when you want to study the effect of different \"\n            \"transforms.\".format(cls.__name__),\n        )\n        return parser\n\n\n@TRANSFORMATIONS_REGISTRY.register(name=\"random_uniform\", type=\"image_torch\")\nclass RandomUniformNoise(BaseTransformation):\n    \"\"\"\n    Add random uniform noise to integer values.\n    \"\"\"\n\n    def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None:\n        super().__init__(opts=opts, *args, **kwargs)\n        self.opts = opts\n\n        self.width_range = getattr(\n            opts, \"image_augmentation.random_uniform.width_range\"\n        )\n\n    def __call__(\n        self, data: Dict[str, Union[torch.Tensor, int]]\n    ) -> Dict[str, Union[torch.Tensor, int]]:\n        \"\"\"\n        Add random uniform noise to byte values.\n\n        Args:\n            data: A dict containing a tensor in its \"samples\" key. The tensor\n                contains integers representing byte values. Integers are used\n                because negative padding values may be added later. The shape\n                of the tenor is [N], where N is the number of bytes.\n\n        Returns:\n            The transformed data.\n        \"\"\"\n        x = data[\"samples\"]\n        noise = torch.randint_like(x, self.width_range[0], self.width_range[1] + 1)\n        dtype = x.dtype\n        x = x.int()\n        x = x + noise\n        x = x % 256\n        x = x.to(dtype)\n        data[\"samples\"] = x\n        return data\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        group = parser.add_argument_group(title=cls.__name__)\n\n        group.add_argument(\n            \"--image-augmentation.random-uniform.enable\",\n            action=\"store_true\",\n            help=\"Use {}. This flag is useful when you want to study the effect of different \"\n            \"transforms.\".format(cls.__name__),\n        )\n        group.add_argument(\n            \"--image-augmentation.random-uniform.width-range\",\n            type=int,\n            nargs=2,\n            default=[-5, 5],\n            help=\"The range of values from which to add noise. It is specified\"\n            \" as [low, high] (inclusive). Defaults to [-5, 5].\",\n        )\n        return parser\n"
  },
  {
    "path": "corenet/data/transforms/image_pil.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nimport copy\nimport math\nimport random\nfrom typing import Dict, List, Optional, Sequence, Tuple, Union\n\nimport numpy as np\nimport torch\nfrom PIL import Image, ImageFilter\nfrom torchvision import transforms as T\nfrom torchvision.transforms import functional as F\n\nfrom corenet.data.transforms import TRANSFORMATIONS_REGISTRY, BaseTransformation\nfrom corenet.data.transforms.utils import jaccard_numpy, setup_size\nfrom corenet.options.parse_args import JsonValidator\nfrom corenet.utils import logger\n\nINTERPOLATION_MODE_MAP = {\n    \"nearest\": T.InterpolationMode.NEAREST,\n    \"bilinear\": T.InterpolationMode.BILINEAR,\n    \"bicubic\": T.InterpolationMode.BICUBIC,\n    \"cubic\": T.InterpolationMode.BICUBIC,\n    \"box\": T.InterpolationMode.BOX,\n    \"hamming\": T.InterpolationMode.HAMMING,\n    \"lanczos\": T.InterpolationMode.LANCZOS,\n}\n\n\ndef _interpolation_modes_from_str(name: str) -> T.InterpolationMode:\n    return INTERPOLATION_MODE_MAP[name]\n\n\ndef _crop_fn(data: Dict, top: int, left: int, height: int, width: int) -> Dict:\n    \"\"\"Helper function for cropping\"\"\"\n    img = data[\"image\"]\n    data[\"image\"] = F.crop(img, top=top, left=left, height=height, width=width)\n\n    if \"mask\" in data:\n        mask = data.pop(\"mask\")\n        data[\"mask\"] = F.crop(mask, top=top, left=left, height=height, width=width)\n\n    if \"box_coordinates\" in data:\n        boxes = data.pop(\"box_coordinates\")\n\n        area_before_cropping = (boxes[..., 2] - boxes[..., 0]) * (\n            boxes[..., 3] - boxes[..., 1]\n        )\n\n        boxes[..., 0::2] = np.clip(boxes[..., 0::2] - left, a_min=0, a_max=left + width)\n        boxes[..., 1::2] = np.clip(boxes[..., 1::2] - top, a_min=0, a_max=top + height)\n\n        area_after_cropping = (boxes[..., 2] - boxes[..., 0]) * (\n            boxes[..., 3] - boxes[..., 1]\n        )\n        area_ratio = area_after_cropping / (area_before_cropping + 1)\n\n        # keep the boxes whose area is atleast 20% of the area before cropping\n        keep = area_ratio >= 0.2\n\n        box_labels = data.pop(\"box_labels\")\n\n        data[\"box_coordinates\"] = boxes[keep]\n        data[\"box_labels\"] = box_labels[keep]\n\n    if \"instance_mask\" in data:\n        assert \"instance_coords\" in data\n\n        instance_masks = data.pop(\"instance_mask\")\n        data[\"instance_mask\"] = F.crop(\n            instance_masks, top=top, left=left, height=height, width=width\n        )\n\n        instance_coords = data.pop(\"instance_coords\")\n        instance_coords[..., 0::2] = np.clip(\n            instance_coords[..., 0::2] - left, a_min=0, a_max=left + width\n        )\n        instance_coords[..., 1::2] = np.clip(\n            instance_coords[..., 1::2] - top, a_min=0, a_max=top + height\n        )\n        data[\"instance_coords\"] = instance_coords\n\n    return data\n\n\ndef _resize_fn(\n    data: Dict,\n    size: Union[Sequence, int],\n    interpolation: Optional[Union[T.InterpolationMode, str]] = T.InterpolationMode.BILINEAR,\n) -> Dict:\n    \"\"\"Helper function for resizing\"\"\"\n    img = data[\"image\"]\n\n    w, h = F.get_image_size(img)\n\n    if isinstance(size, Sequence) and len(size) == 2:\n        size_h, size_w = size[0], size[1]\n    elif isinstance(size, int):\n        if (w <= h and w == size) or (h <= w and h == size):\n            return data\n\n        if w < h:\n            size_h = int(size * h / w)\n\n            size_w = size\n        else:\n            size_w = int(size * w / h)\n            size_h = size\n    else:\n        raise TypeError(\n            \"Supported size args are int or tuple of length 2. Got inappropriate size arg: {}\".format(\n                size\n            )\n        )\n\n    if isinstance(interpolation, str):\n        interpolation = _interpolation_modes_from_str(name=interpolation)\n\n    data[\"image\"] = F.resize(\n        img=img, size=[size_h, size_w], interpolation=interpolation\n    )\n\n    if \"mask\" in data:\n        mask = data.pop(\"mask\")\n        # mask can be a PIL or Tensor.\n        # Especially for Mask-RCNN, we may have tensors with first dimension as 0.\n        # In that case, resize, won't work.\n        # A workaround is that we check for the instance of a Tensor and then check its dimension.\n        if isinstance(mask, torch.Tensor) and mask.shape[0] == 0:\n            # It's empty tensor.\n            resized_mask = torch.zeros(\n                [0, size_h, size_w], dtype=mask.dtype, device=mask.device\n            )\n        else:\n            resized_mask = F.resize(\n                img=mask,\n                size=[size_h, size_w],\n                interpolation=T.InterpolationMode.NEAREST,\n            )\n        data[\"mask\"] = resized_mask\n\n    if \"box_coordinates\" in data:\n        boxes = data.pop(\"box_coordinates\")\n        boxes[:, 0::2] *= 1.0 * size_w / w\n        boxes[:, 1::2] *= 1.0 * size_h / h\n        data[\"box_coordinates\"] = boxes\n\n    if \"instance_mask\" in data:\n        assert \"instance_coords\" in data\n\n        instance_masks = data.pop(\"instance_mask\")\n\n        resized_instance_masks = F.resize(\n            img=instance_masks,\n            size=[size_h, size_w],\n            interpolation=T.InterpolationMode.NEAREST,\n        )\n        data[\"instance_mask\"] = resized_instance_masks\n\n        instance_coords = data.pop(\"instance_coords\")\n        instance_coords = instance_coords.astype(np.float32)\n        instance_coords[..., 0::2] *= 1.0 * size_w / w\n        instance_coords[..., 1::2] *= 1.0 * size_h / h\n        data[\"instance_coords\"] = instance_coords\n\n    return data\n\n\ndef _pad_fn(\n    data: Dict,\n    padding: Union[int, Sequence],\n    fill: Optional[int] = 0,\n    padding_mode: Optional[str] = \"constant\",\n) -> Dict:\n    # Taken from the functional_tensor.py pad\n    if isinstance(padding, int):\n        pad_left = pad_right = pad_top = pad_bottom = padding\n    elif len(padding) == 1:\n        pad_left = pad_right = pad_top = pad_bottom = padding[0]\n    elif len(padding) == 2:\n        pad_left = pad_right = padding[0]\n        pad_top = pad_bottom = padding[1]\n    else:\n        pad_left = padding[0]\n        pad_top = padding[1]\n        pad_right = padding[2]\n        pad_bottom = padding[3]\n\n    padding = [pad_left, pad_top, pad_right, pad_bottom]\n    data[\"image\"] = F.pad(data.pop(\"image\"), padding, fill, padding_mode)\n\n    if \"mask\" in data:\n        data[\"mask\"] = F.pad(data.pop(\"mask\"), padding, 0, \"constant\")\n\n    if \"box_coordinates\" in data:\n        # labels remain unchanged\n        boxes = data.pop(\"box_coordinates\")\n        boxes[:, 0::2] += pad_left\n        boxes[:, 1::2] += pad_top\n        data[\"box_coordinates\"] = boxes\n\n    return data\n\n\n@TRANSFORMATIONS_REGISTRY.register(name=\"fixed_size_crop\", type=\"image_pil\")\nclass FixedSizeCrop(BaseTransformation):\n    def __init__(\n        self, opts, size: Optional[Union[int, Tuple[int, int]]] = None, *args, **kwargs\n    ):\n        super().__init__(opts, *args, **kwargs)\n        # size can be passed as an argument or using config.\n        # The argument is useful when implementing variable samplers\n        if size is None:\n            size = getattr(opts, \"image_augmentation.fixed_size_crop.size\", None)\n        fill = getattr(opts, \"image_augmentation.fixed_size_crop.fill\", 0)\n        padding_mode = getattr(\n            opts, \"image_augmentation.fixed_size_crop.padding_mode\", \"constant\"\n        )\n        size = setup_size(\n            size,\n            error_msg=\"Please provide either int or (int, int) for size in {}.\".format(\n                self.__class__.__name__\n            ),\n        )\n        self.crop_height = size[0]\n        self.crop_width = size[1]\n        self.fill = fill\n        self.padding_mode = padding_mode\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        group = parser.add_argument_group(title=cls.__name__)\n        group.add_argument(\n            \"--image-augmentation.fixed-size-crop.enable\",\n            action=\"store_true\",\n            help=\"use {}. This flag is useful when you want to study the effect of different \"\n            \"transforms.\".format(cls.__name__),\n        )\n        group.add_argument(\n            \"--image-augmentation.fixed-size-crop.size\",\n            type=int,\n            nargs=\"+\",\n            default=None,\n            help=\"Image size either as an int or (int, int).\",\n        )\n        group.add_argument(\n            \"--image-augmentation.fixed-size-crop.fill\",\n            type=int,\n            default=0,\n            help=\"Fill value to be used during padding operation. Defaults to 0.\",\n        )\n        group.add_argument(\n            \"--image-augmentation.fixed-size-crop.padding-mode\",\n            type=str,\n            default=\"constant\",\n            help=\"Padding modes. Defaults to constant\",\n        )\n\n        return parser\n\n    def __call__(self, data: Dict, *args, **kwargs) -> Dict:\n        img = data[\"image\"]\n        width, height = F.get_image_size(img)\n        new_height = min(height, self.crop_height)\n        new_width = min(width, self.crop_width)\n\n        if new_height != height or new_width != width:\n            offset_height = max(height - self.crop_height, 0)\n            offset_width = max(width - self.crop_width, 0)\n\n            r = random.random()\n            top = int(offset_height * r)\n            left = int(offset_width * r)\n\n            data = _crop_fn(\n                data, top=top, left=left, height=new_height, width=new_width\n            )\n\n        pad_bottom = max(self.crop_height - new_height, 0)\n        pad_right = max(self.crop_width - new_width, 0)\n        if pad_bottom != 0 or pad_right != 0:\n            data = _pad_fn(\n                data,\n                padding=[0, 0, pad_right, pad_bottom],\n                fill=self.fill,\n                padding_mode=self.padding_mode,\n            )\n        return data\n\n    def __repr__(self):\n        return \"{}(crop_size=({}, {}), fill={}, padding_mode={})\".format(\n            self.__class__.__name__,\n            self.crop_height,\n            self.crop_width,\n            self.fill,\n            self.padding_mode,\n        )\n\n\n@TRANSFORMATIONS_REGISTRY.register(name=\"scale_jitter\", type=\"image_pil\")\nclass ScaleJitter(BaseTransformation):\n    \"\"\"Randomly resizes the input within the scale range\"\"\"\n\n    def __init__(self, opts, *args, **kwargs) -> None:\n        target_size = getattr(opts, \"image_augmentation.scale_jitter.target_size\", None)\n        if target_size is None:\n            logger.error(\n                \"Target size can't be None in {}.\".format(self.__class__.__name__)\n            )\n        target_size = setup_size(\n            target_size,\n            error_msg=\"Need either an int or (int, int) for target size in {}\".format(\n                self.__class__.__name__\n            ),\n        )\n\n        scale_range = getattr(opts, \"image_augmentation.scale_jitter.scale_range\", None)\n        if scale_range is None:\n            logger.error(\n                \"Scale range can't be None in {}\".format(self.__class__.__name__)\n            )\n\n        if isinstance(scale_range, Sequence) and len(scale_range) == 2:\n            scale_range = scale_range\n        else:\n            logger.error(\n                \"Need (float, float) for target size in {}\".format(\n                    self.__class__.__name__\n                )\n            )\n\n        if scale_range[0] > scale_range[1]:\n            logger.error(\n                \"scale_range[1] >= scale_range[0] in {}. Got: {}\".format(\n                    self.__class__.__name__, scale_range[1], scale_range[0]\n                )\n            )\n\n        interpolation = getattr(\n            opts, \"image_augmentation.scale_jitter.interpolation\", \"bilinear\"\n        )\n\n        if isinstance(interpolation, str):\n            interpolation = _interpolation_modes_from_str(name=interpolation)\n\n        super().__init__(opts, *args, **kwargs)\n        self.target_size = target_size\n        self.scale_range = scale_range\n        self.interpolation = interpolation\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        group = parser.add_argument_group(title=cls.__name__)\n        group.add_argument(\n            \"--image-augmentation.scale-jitter.enable\",\n            action=\"store_true\",\n            help=\"use {}. This flag is useful when you want to study the effect of different \"\n            \"transforms.\".format(cls.__name__),\n        )\n        group.add_argument(\n            \"--image-augmentation.scale-jitter.interpolation\",\n            type=str,\n            default=\"bilinear\",\n            help=\"Interpolation method. Defaults to bilinear interpolation\",\n        )\n        group.add_argument(\n            \"--image-augmentation.scale-jitter.target-size\",\n            type=int,\n            nargs=\"+\",\n            default=None,\n            help=\"Target image size either as an int or (int, int).\",\n        )\n        group.add_argument(\n            \"--image-augmentation.scale-jitter.scale-range\",\n            type=float,\n            nargs=\"+\",\n            default=None,\n            help=\"Scale range as (float, float).\",\n        )\n\n        return parser\n\n    def __call__(self, data: Dict, *args, **kwargs) -> Dict:\n        img = data[\"image\"]\n        orig_width, orig_height = F.get_image_size(img)\n        scale = self.scale_range[0] + random.random() * (\n            self.scale_range[1] - self.scale_range[0]\n        )\n        r = (\n            min(\n                self.target_size[1] / orig_height,\n                self.target_size[0] / orig_width,\n            )\n            * scale\n        )\n        new_width = int(orig_width * r)\n        new_height = int(orig_height * r)\n\n        data = _resize_fn(\n            data, size=(new_height, new_width), interpolation=self.interpolation\n        )\n        return data\n\n    def __repr__(self):\n        return \"{}(scale_range={}, target_size={}, interpolation={})\".format(\n            self.__class__.__name__,\n            self.scale_range,\n            self.target_size,\n            self.interpolation,\n        )\n\n\n@TRANSFORMATIONS_REGISTRY.register(name=\"random_resized_crop\", type=\"image_pil\")\nclass RandomResizedCrop(BaseTransformation, T.RandomResizedCrop):\n    \"\"\"\n    This class crops a random portion of an image and resize it to a given size.\n    \"\"\"\n\n    def __init__(\n        self, opts: argparse.Namespace, size: Union[Sequence, int], *args, **kwargs\n    ) -> None:\n        interpolation = getattr(\n            opts, \"image_augmentation.random_resized_crop.interpolation\"\n        )\n        scale = getattr(opts, \"image_augmentation.random_resized_crop.scale\")\n        ratio = getattr(opts, \"image_augmentation.random_resized_crop.aspect_ratio\")\n\n        BaseTransformation.__init__(self, opts=opts)\n\n        T.RandomResizedCrop.__init__(\n            self,\n            size=size,\n            scale=scale,\n            ratio=ratio,\n            interpolation=interpolation,\n        )\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        group = parser.add_argument_group(title=cls.__name__)\n\n        group.add_argument(\n            \"--image-augmentation.random-resized-crop.enable\",\n            action=\"store_true\",\n            help=\"use {}. This flag is useful when you want to study the effect of different \"\n            \"transforms.\".format(cls.__name__),\n        )\n        group.add_argument(\n            \"--image-augmentation.random-resized-crop.interpolation\",\n            type=str,\n            default=\"bilinear\",\n            choices=list(INTERPOLATION_MODE_MAP.keys()),\n            help=\"Interpolation method for resizing. Defaults to bilinear.\",\n        )\n        group.add_argument(\n            \"--image-augmentation.random-resized-crop.scale\",\n            type=JsonValidator(Tuple[float, float]),\n            default=(0.08, 1.0),\n            help=\"Specifies the lower and upper bounds for the random area of the crop, before resizing.\"\n            \" The scale is defined with respect to the area of the original image. Defaults to \"\n            \"(0.08, 1.0)\",\n        )\n        group.add_argument(\n            \"--image-augmentation.random-resized-crop.aspect-ratio\",\n            type=float or tuple,\n            default=(3.0 / 4.0, 4.0 / 3.0),\n            help=\"lower and upper bounds for the random aspect ratio of the crop, before resizing. \"\n            \"Defaults to (3./4., 4./3.)\",\n        )\n        return parser\n\n    def get_rrc_params(self, image: Image.Image) -> Tuple[int, int, int, int]:\n        return T.RandomResizedCrop.get_params(\n            img=image, scale=self.scale, ratio=self.ratio\n        )\n\n    def __call__(self, data: Dict) -> Dict:\n        \"\"\"\n        Input data format:\n            data: mapping of: {\n                \"image\": [Height, Width, Channels],\n                \"mask\": [Height, Width],\n                \"box_coordinates\": [Num_boxes, x, y, w, h],\n                \"box_labels: : [Num_boxes],\n            }\n        Output data format: Same as the input\n        \"\"\"\n        img = data[\"image\"]\n        i, j, h, w = self.get_rrc_params(image=img)\n        data = _crop_fn(data=data, top=i, left=j, height=h, width=w)\n        return _resize_fn(data=data, size=self.size, interpolation=self.interpolation)\n\n    def __repr__(self) -> str:\n        return \"{}(scale={}, ratio={}, size={}, interpolation={})\".format(\n            self.__class__.__name__,\n            self.scale,\n            self.ratio,\n            self.size,\n            self.interpolation,\n        )\n\n\n@TRANSFORMATIONS_REGISTRY.register(name=\"auto_augment\", type=\"image_pil\")\nclass AutoAugment(BaseTransformation, T.AutoAugment):\n    \"\"\"\n    This class implements the `AutoAugment data augmentation <https://arxiv.org/pdf/1805.09501.pdf>`_ method.\n    \"\"\"\n\n    def __init__(self, opts, *args, **kwargs) -> None:\n        policy_name = getattr(\n            opts, \"image_augmentation.auto_augment.policy\", \"imagenet\"\n        )\n        interpolation = getattr(\n            opts, \"image_augmentation.auto_augment.interpolation\", \"bilinear\"\n        )\n        if policy_name == \"imagenet\":\n            policy = T.AutoAugmentPolicy.IMAGENET\n        else:\n            raise NotImplemented\n\n        if isinstance(interpolation, str):\n            interpolation = _interpolation_modes_from_str(name=interpolation)\n\n        BaseTransformation.__init__(self, opts=opts)\n        T.AutoAugment.__init__(self, policy=policy, interpolation=interpolation)\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        group = parser.add_argument_group(title=cls.__name__)\n\n        group.add_argument(\n            \"--image-augmentation.auto-augment.enable\",\n            action=\"store_true\",\n            help=\"use {}. This flag is useful when you want to study the effect of different \"\n            \"transforms.\".format(cls.__name__),\n        )\n        group.add_argument(\n            \"--image-augmentation.auto-augment.policy\",\n            type=str,\n            default=\"imagenet\",\n            help=\"Auto-augment policy name. Defaults to imagenet.\",\n        )\n        group.add_argument(\n            \"--image-augmentation.auto-augment.interpolation\",\n            type=str,\n            default=\"bilinear\",\n            help=\"Auto-augment interpolation method. Defaults to bilinear interpolation\",\n        )\n        return parser\n\n    def __call__(self, data: Dict) -> Dict:\n        if \"box_coordinates\" in data or \"mask\" in data or \"instance_masks\" in data:\n            logger.error(\n                \"{} is only supported for classification tasks\".format(\n                    self.__class__.__name__\n                )\n            )\n\n        img = data[\"image\"]\n        img = super().forward(img)\n        data[\"image\"] = img\n        return data\n\n    def __repr__(self) -> str:\n        return \"{}(policy={}, interpolation={})\".format(\n            self.__class__.__name__, self.policy, self.interpolation\n        )\n\n\n@TRANSFORMATIONS_REGISTRY.register(name=\"rand_augment\", type=\"image_pil\")\nclass RandAugment(BaseTransformation, T.RandAugment):\n    \"\"\"\n    This class implements the `RandAugment data augmentation <https://arxiv.org/abs/1909.13719>`_ method.\n    \"\"\"\n\n    def __init__(self, opts, *args, **kwargs) -> None:\n        num_ops = getattr(opts, \"image_augmentation.rand_augment.num_ops\", 2)\n        magnitude = getattr(opts, \"image_augmentation.rand_augment.magnitude\", 9)\n        num_magnitude_bins = getattr(\n            opts, \"image_augmentation.rand_augment.num_magnitude_bins\", 31\n        )\n        interpolation = getattr(\n            opts, \"image_augmentation.rand_augment.interpolation\", \"bilinear\"\n        )\n\n        BaseTransformation.__init__(self, opts=opts)\n\n        if isinstance(interpolation, str):\n            interpolation = _interpolation_modes_from_str(name=interpolation)\n\n        T.RandAugment.__init__(\n            self,\n            num_ops=num_ops,\n            magnitude=magnitude,\n            num_magnitude_bins=num_magnitude_bins,\n            interpolation=interpolation,\n        )\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        group = parser.add_argument_group(title=cls.__name__)\n\n        group.add_argument(\n            \"--image-augmentation.rand-augment.enable\",\n            action=\"store_true\",\n            help=\"Use {}. This flag is useful when you want to study the effect of different \"\n            \"transforms.\".format(cls.__name__),\n        )\n        group.add_argument(\n            \"--image-augmentation.rand-augment.num-ops\",\n            type=int,\n            default=2,\n            help=\"Number of augmentation transformations to apply sequentially. Defaults to 2.\",\n        )\n        group.add_argument(\n            \"--image-augmentation.rand-augment.magnitude\",\n            type=int,\n            default=9,\n            help=\"Magnitude for all the transformations. Defaults to 9\",\n        )\n        group.add_argument(\n            \"--image-augmentation.rand-augment.num-magnitude-bins\",\n            type=int,\n            default=31,\n            help=\"The number of different magnitude values. Defaults to 31.\",\n        )\n        group.add_argument(\n            \"--image-augmentation.rand-augment.interpolation\",\n            type=str,\n            default=\"bilinear\",\n            choices=list(INTERPOLATION_MODE_MAP.keys()),\n            help=\"Desired interpolation method. Defaults to bilinear\",\n        )\n        return parser\n\n    def __call__(self, data: Dict) -> Dict:\n        if \"box_coordinates\" in data or \"mask\" in data or \"instance_masks\" in data:\n            logger.error(\n                \"{} is only supported for classification tasks\".format(\n                    self.__class__.__name__\n                )\n            )\n\n        img = data[\"image\"]\n        img = super().forward(img)\n        data[\"image\"] = img\n        return data\n\n    def __repr__(self) -> str:\n        return \"{}(num_ops={}, magnitude={}, num_magnitude_bins={}, interpolation={})\".format(\n            self.__class__.__name__,\n            self.num_ops,\n            self.magnitude,\n            self.num_magnitude_bins,\n            self.interpolation,\n        )\n\n\n@TRANSFORMATIONS_REGISTRY.register(name=\"trivial_augment_wide\", type=\"image_pil\")\nclass TrivialAugmentWide(BaseTransformation, T.TrivialAugmentWide):\n    \"\"\"\n    This class implements the `TrivialAugment (Wide) data augmentation <https://arxiv.org/abs/2103.10158>`_ method.\n    \"\"\"\n\n    def __init__(self, opts, *args, **kwargs) -> None:\n        num_magnitude_bins = getattr(\n            opts,\n            \"image_augmentation.trivial_augment_wide.num_magnitude_bins\",\n            31,\n        )\n        interpolation = getattr(\n            opts,\n            \"image_augmentation.trivial_augment_wide.interpolation\",\n            \"bilinear\",\n        )\n\n        BaseTransformation.__init__(self, opts=opts)\n\n        if isinstance(interpolation, str):\n            interpolation = _interpolation_modes_from_str(name=interpolation)\n\n        T.TrivialAugmentWide.__init__(\n            self,\n            num_magnitude_bins=num_magnitude_bins,\n            interpolation=interpolation,\n        )\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        group = parser.add_argument_group(title=cls.__name__)\n\n        group.add_argument(\n            \"--image-augmentation.trivial-augment-wide.enable\",\n            action=\"store_true\",\n            help=\"Use {}. This flag is useful when you want to study the effect of different \"\n            \"transforms.\".format(cls.__name__),\n        )\n        group.add_argument(\n            \"--image-augmentation.trivial-augment-wide.num-magnitude-bins\",\n            type=int,\n            default=31,\n            help=\"The number of different magnitude values. Defaults to 31.\",\n        )\n        group.add_argument(\n            \"--image-augmentation.trivial-augment-wide.interpolation\",\n            type=str,\n            default=\"bilinear\",\n            choices=list(INTERPOLATION_MODE_MAP.keys()),\n            help=\"Desired interpolation method. Defaults to bilinear\",\n        )\n        return parser\n\n    def __call__(self, data: Dict) -> Dict:\n        if \"box_coordinates\" in data or \"mask\" in data or \"instance_masks\" in data:\n            logger.error(\n                \"{} is only supported for classification tasks\".format(\n                    self.__class__.__name__\n                )\n            )\n\n        img = data[\"image\"]\n        img = super().forward(img)\n        data[\"image\"] = img\n        return data\n\n    def __repr__(self) -> str:\n        return \"{}(num_magnitude_bins={}, interpolation={})\".format(\n            self.__class__.__name__,\n            self.num_magnitude_bins,\n            self.interpolation,\n        )\n\n\n@TRANSFORMATIONS_REGISTRY.register(name=\"random_horizontal_flip\", type=\"image_pil\")\nclass RandomHorizontalFlip(BaseTransformation):\n    \"\"\"\n    This class implements random horizontal flipping method\n    \"\"\"\n\n    def __init__(self, opts, *args, **kwargs) -> None:\n        p = getattr(opts, \"image_augmentation.random_horizontal_flip.p\")\n        super().__init__(opts=opts)\n        self.p = p\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        group = parser.add_argument_group(title=cls.__name__)\n        group.add_argument(\n            \"--image-augmentation.random-horizontal-flip.enable\",\n            action=\"store_true\",\n            help=\"use {}. This flag is useful when you want to study the effect of different \"\n            \"transforms.\".format(cls.__name__),\n        )\n        group.add_argument(\n            \"--image-augmentation.random-horizontal-flip.p\",\n            type=float,\n            default=0.5,\n            help=\"Probability for applying random horizontal flip\",\n        )\n        return parser\n\n    def __call__(self, data: Dict) -> Dict:\n        if random.random() <= self.p:\n            img = data[\"image\"]\n            width, height = F.get_image_size(img)\n            data[\"image\"] = F.hflip(img)\n\n            if \"mask\" in data:\n                mask = data.pop(\"mask\")\n                data[\"mask\"] = F.hflip(mask)\n\n            if \"box_coordinates\" in data:\n                boxes = data.pop(\"box_coordinates\")\n                boxes[..., 0::2] = width - boxes[..., 2::-2]\n                data[\"box_coordinates\"] = boxes\n\n            if \"instance_mask\" in data:\n                assert \"instance_coords\" in data\n\n                instance_coords = data.pop(\"instance_coords\")\n                instance_coords[..., 0::2] = width - instance_coords[..., 2::-2]\n                data[\"instance_coords\"] = instance_coords\n\n                instance_masks = data.pop(\"instance_mask\")\n                data[\"instance_mask\"] = F.hflip(instance_masks)\n        return data\n\n    def __repr__(self) -> str:\n        return \"{}(p={})\".format(self.__class__.__name__, self.p)\n\n\n@TRANSFORMATIONS_REGISTRY.register(name=\"random_rotate\", type=\"image_pil\")\nclass RandomRotate(BaseTransformation):\n    \"\"\"\n    This class implements random rotation method\n    \"\"\"\n\n    def __init__(self, opts, *args, **kwargs) -> None:\n        super().__init__(opts=opts)\n        self.angle = getattr(opts, \"image_augmentation.random_rotate.angle\", 10)\n        self.mask_fill = getattr(opts, \"image_augmentation.random_rotate.mask_fill\", 0)\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        group = parser.add_argument_group(title=cls.__name__)\n        group.add_argument(\n            \"--image-augmentation.random-rotate.enable\",\n            action=\"store_true\",\n            help=\"use {}. This flag is useful when you want to study the effect of different \"\n            \"transforms.\".format(cls.__name__),\n        )\n        group.add_argument(\n            \"--image-augmentation.random-rotate.angle\",\n            type=float,\n            default=10,\n            help=\"Angle for rotation. Defaults to 10. The angle is sampled \"\n            \"uniformly from [-angle, angle]\",\n        )\n        group.add_argument(\n            \"--image-augmentation.random-rotate.mask-fill\",\n            default=0,\n            help=\"Fill value for the segmentation mask. Defaults to 0.\",\n        )\n        return parser\n\n    def __call__(self, data: Dict) -> Dict:\n\n        data_keys = list(data.keys())\n        if \"box_coordinates\" in data_keys or \"instance_mask\" in data_keys:\n            logger.error(\"{} supports only images and masks\")\n\n        rand_angle = random.uniform(-self.angle, self.angle)\n        img = data.pop(\"image\")\n        data[\"image\"] = F.rotate(\n            img,\n            angle=rand_angle,\n            interpolation=F.InterpolationMode.BILINEAR,\n            fill=0,\n        )\n        if \"mask\" in data:\n            mask = data.pop(\"mask\")\n            data[\"mask\"] = F.rotate(\n                mask,\n                angle=rand_angle,\n                interpolation=F.InterpolationMode.NEAREST,\n                fill=self.mask_fill,\n            )\n        return data\n\n    def __repr__(self) -> str:\n        return \"{}(angle={}, mask_fill={})\".format(\n            self.__class__.__name__, self.angle, self.mask_fill\n        )\n\n\n@TRANSFORMATIONS_REGISTRY.register(name=\"resize\", type=\"image_pil\")\nclass Resize(BaseTransformation):\n    \"\"\"\n    This class implements resizing operation.\n\n    .. note::\n    Two possible modes for resizing.\n    1. Resize while maintaining aspect ratio. To enable this option, pass int as a size\n    2. Resize to a fixed size. To enable this option, pass a tuple of height and width as a size\n\n    .. note::\n        If img_size is passed as a positional argument, then it will override size from args\n    \"\"\"\n\n    def __init__(\n        self,\n        opts,\n        img_size: Optional[Union[Tuple[int, int], int]] = None,\n        *args,\n        **kwargs\n    ) -> None:\n        interpolation = getattr(\n            opts, \"image_augmentation.resize.interpolation\", \"bilinear\"\n        )\n        super().__init__(opts=opts)\n\n        # img_size argument is useful for implementing multi-scale sampler\n        size = (\n            getattr(opts, \"image_augmentation.resize.size\", None)\n            if img_size is None\n            else img_size\n        )\n        if size is None:\n            logger.error(\"Size can not be None in {}\".format(self.__class__.__name__))\n\n        # Possible modes.\n        # 1. Resize while maintaining aspect ratio. To enable this option, pass int as a size\n        # 2. Resize to a fixed size. To enable this option, pass a tuple of height and width as a size\n\n        if isinstance(size, Sequence) and len(size) == 1:\n            # List with single integer\n            size = size[0]\n        elif isinstance(size, Sequence) and len(size) > 2:\n            logger.error(\n                \"The length of size should be either 1 or 2 in {}. Got: {}\".format(\n                    self.__class__.__name__, size\n                )\n            )\n\n        if not (isinstance(size, Sequence) or isinstance(size, int)):\n            logger.error(\n                \"Size needs to be either Tuple of length 2 or an integer in {}. Got: {}\".format(\n                    self.__class__.__name__, size\n                )\n            )\n\n        self.size = size\n        self.interpolation = interpolation\n        self.maintain_aspect_ratio = True if isinstance(size, int) else False\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        group = parser.add_argument_group(title=cls.__name__)\n        group.add_argument(\n            \"--image-augmentation.resize.enable\",\n            action=\"store_true\",\n            help=\"use {}. This flag is useful when you want to study the effect of different \"\n            \"transforms.\".format(cls.__name__),\n        )\n        group.add_argument(\n            \"--image-augmentation.resize.interpolation\",\n            type=str,\n            default=\"bilinear\",\n            choices=list(INTERPOLATION_MODE_MAP.keys()),\n            help=\"Desired interpolation method for resizing. Defaults to bilinear\",\n        )\n        group.add_argument(\n            \"--image-augmentation.resize.size\",\n            type=int,\n            nargs=\"+\",\n            default=256,\n            help=\"Resize image to the specified size. If int is passed, then shorter side is resized\"\n            \"to the specified size and longest side is resized while maintaining aspect ratio.\"\n            \"Defaults to None.\",\n        )\n        return parser\n\n    def __call__(self, data: Dict) -> Dict:\n        return _resize_fn(data, size=self.size, interpolation=self.interpolation)\n\n    def __repr__(self) -> str:\n        return \"{}(size={}, interpolation={}, maintain_aspect_ratio={})\".format(\n            self.__class__.__name__,\n            self.size,\n            self.interpolation,\n            self.maintain_aspect_ratio,\n        )\n\n\n@TRANSFORMATIONS_REGISTRY.register(name=\"center_crop\", type=\"image_pil\")\nclass CenterCrop(BaseTransformation):\n    \"\"\"\n    This class implements center cropping method.\n\n    .. note::\n        This class assumes that the input size is greater than or equal to the desired size.\n    \"\"\"\n\n    def __init__(self, opts, *args, **kwargs) -> None:\n        super().__init__(opts=opts)\n        size = getattr(opts, \"image_augmentation.center_crop.size\", None)\n\n        if size is None:\n            logger.error(\"Size cannot be None in {}\".format(self.__class__.__name__))\n\n        if isinstance(size, Sequence) and len(size) == 2:\n            self.height, self.width = size[0], size[1]\n        elif isinstance(size, Sequence) and len(size) == 1:\n            self.height = self.width = size[0]\n        elif isinstance(size, int):\n            self.height = self.width = size\n        else:\n            logger.error(\"Scale should be either an int or tuple of ints\")\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        group = parser.add_argument_group(title=cls.__name__)\n\n        group.add_argument(\n            \"--image-augmentation.center-crop.enable\",\n            action=\"store_true\",\n            help=\"use {}. This flag is useful when you want to study the effect of different \"\n            \"transforms.\".format(cls.__name__),\n        )\n        group.add_argument(\n            \"--image-augmentation.center-crop.size\",\n            type=int,\n            nargs=\"+\",\n            default=224,\n            help=\"Center crop size. Defaults to None.\",\n        )\n        return parser\n\n    def __call__(self, data: Dict) -> Dict:\n        width, height = F.get_image_size(data[\"image\"])\n        i = (height - self.height) // 2\n        j = (width - self.width) // 2\n        return _crop_fn(data=data, top=i, left=j, height=self.height, width=self.width)\n\n    def __repr__(self) -> str:\n        return \"{}(size=(h={}, w={}))\".format(\n            self.__class__.__name__, self.height, self.width\n        )\n\n\n@TRANSFORMATIONS_REGISTRY.register(name=\"ssd_cropping\", type=\"image_pil\")\nclass SSDCroping(BaseTransformation):\n    \"\"\"\n    This class implements cropping method for `Single shot object detector <https://arxiv.org/abs/1512.02325>`_.\n    \"\"\"\n\n    def __init__(self, opts, *args, **kwargs) -> None:\n        super().__init__(opts=opts)\n\n        self.iou_sample_opts = getattr(\n            opts,\n            \"image_augmentation.ssd_crop.iou_thresholds\",\n            [0.0, 0.1, 0.3, 0.5, 0.7, 0.9, 1.0],\n        )\n        self.trials = getattr(opts, \"image_augmentation.ssd_crop.n_trials\", 40)\n        self.min_aspect_ratio = getattr(\n            opts, \"image_augmentation.ssd_crop.min_aspect_ratio\", 0.5\n        )\n        self.max_aspect_ratio = getattr(\n            opts, \"image_augmentation.ssd_crop.max_aspect_ratio\", 2.0\n        )\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        group = parser.add_argument_group(title=cls.__name__)\n\n        group.add_argument(\n            \"--image-augmentation.ssd-crop.enable\",\n            action=\"store_true\",\n            help=\"use {}. This flag is useful when you want to study the effect of different \"\n            \"transforms.\".format(cls.__name__),\n        )\n        group.add_argument(\n            \"--image-augmentation.ssd-crop.iou-thresholds\",\n            type=float,\n            nargs=\"+\",\n            default=[0.0, 0.1, 0.3, 0.5, 0.7, 0.9, 1.0],\n            help=\"IoU thresholds for SSD cropping. Defaults to [0.0, 0.1, 0.3, 0.5, 0.7, 0.9, 1.0]\",\n        )\n        group.add_argument(\n            \"--image-augmentation.ssd-crop.n-trials\",\n            type=int,\n            default=40,\n            help=\"Number of trials for SSD cropping. Defaults to 40\",\n        )\n        group.add_argument(\n            \"--image-augmentation.ssd-crop.min-aspect-ratio\",\n            type=float,\n            default=0.5,\n            help=\"Min. aspect ratio in SSD Cropping. Defaults to 0.5\",\n        )\n        group.add_argument(\n            \"--image-augmentation.ssd-crop.max-aspect-ratio\",\n            type=float,\n            default=2.0,\n            help=\"Max. aspect ratio in SSD Cropping. Defaults to 2.0\",\n        )\n        return parser\n\n    def __call__(self, data: Dict) -> Dict:\n        if \"box_coordinates\" in data:\n            boxes = data[\"box_coordinates\"]\n\n            # guard against no boxes\n            if boxes.shape[0] == 0:\n                return data\n\n            image = data[\"image\"]\n            labels = data[\"box_labels\"]\n            width, height = F.get_image_size(image)\n\n            while True:\n                # randomly choose a mode\n                min_jaccard_overalp = random.choice(self.iou_sample_opts)\n                if min_jaccard_overalp == 0.0:\n                    return data\n\n                for _ in range(self.trials):\n                    new_w = int(random.uniform(0.3 * width, width))\n                    new_h = int(random.uniform(0.3 * height, height))\n\n                    aspect_ratio = new_h / new_w\n                    if not (\n                        self.min_aspect_ratio <= aspect_ratio <= self.max_aspect_ratio\n                    ):\n                        continue\n\n                    left = int(random.uniform(0, width - new_w))\n                    top = int(random.uniform(0, height - new_h))\n\n                    # convert to integer rect x1,y1,x2,y2\n                    rect = np.array([left, top, left + new_w, top + new_h])\n\n                    # calculate IoU (jaccard overlap) b/t the cropped and gt boxes\n                    ious = jaccard_numpy(boxes, rect)\n\n                    # is min and max overlap constraint satisfied? if not try again\n                    if ious.max() < min_jaccard_overalp:\n                        continue\n\n                    # keep overlap with gt box IF center in sampled patch\n                    centers = (boxes[:, :2] + boxes[:, 2:]) * 0.5\n\n                    # mask in all gt boxes that above and to the left of centers\n                    m1 = (rect[0] < centers[:, 0]) * (rect[1] < centers[:, 1])\n\n                    # mask in all gt boxes that under and to the right of centers\n                    m2 = (rect[2] > centers[:, 0]) * (rect[3] > centers[:, 1])\n\n                    # mask in that both m1 and m2 are true\n                    mask = m1 * m2\n\n                    # have any valid boxes? try again if not\n                    if not mask.any():\n                        continue\n\n                    # if image size is too small, try again\n                    if (rect[3] - rect[1]) < 100 or (rect[2] - rect[0]) < 100:\n                        continue\n\n                    # cut the crop from the image\n                    image = F.crop(image, top=top, left=left, width=new_w, height=new_h)\n\n                    # take only matching gt boxes\n                    current_boxes = boxes[mask, :].copy()\n\n                    # take only matching gt labels\n                    current_labels = labels[mask]\n\n                    # should we use the box left and top corner or the crop's\n                    current_boxes[:, :2] = np.maximum(current_boxes[:, :2], rect[:2])\n                    # adjust to crop (by subtracting crop's left,top)\n                    current_boxes[:, :2] -= rect[:2]\n\n                    current_boxes[:, 2:] = np.minimum(current_boxes[:, 2:], rect[2:])\n                    # adjust to crop (by subtracting crop's left,top)\n                    current_boxes[:, 2:] -= rect[:2]\n\n                    data[\"image\"] = image\n                    data[\"box_labels\"] = current_labels\n                    data[\"box_coordinates\"] = current_boxes\n\n                    if \"mask\" in data:\n                        mask = data.pop(\"mask\")\n                        data[\"mask\"] = F.crop(\n                            mask, top=top, left=left, width=new_w, height=new_h\n                        )\n\n                    if \"instance_mask\" in data:\n                        assert \"instance_coords\" in data\n                        instance_masks = data.pop(\"instance_mask\")\n                        data[\"instance_mask\"] = F.crop(\n                            instance_masks,\n                            top=top,\n                            left=left,\n                            width=new_w,\n                            height=new_h,\n                        )\n\n                        instance_coords = data.pop(\"instance_coords\")\n                        # should we use the box left and top corner or the crop's\n                        instance_coords[..., :2] = np.maximum(\n                            instance_coords[..., :2], rect[:2]\n                        )\n                        # adjust to crop (by subtracting crop's left,top)\n                        instance_coords[..., :2] -= rect[:2]\n\n                        instance_coords[..., 2:] = np.minimum(\n                            instance_coords[..., 2:], rect[2:]\n                        )\n                        # adjust to crop (by subtracting crop's left,top)\n                        instance_coords[..., 2:] -= rect[:2]\n                        data[\"instance_coords\"] = instance_coords\n\n                    return data\n        return data\n\n\n@TRANSFORMATIONS_REGISTRY.register(name=\"photo_metric_distort\", type=\"image_pil\")\nclass PhotometricDistort(BaseTransformation):\n    \"\"\"\n    This class implements Photometeric distorion.\n\n    .. note::\n        Hyper-parameters of PhotoMetricDistort in PIL and OpenCV are different. Be careful\n    \"\"\"\n\n    def __init__(self, opts, *args, **kwargs) -> None:\n        # contrast\n        alpha_min = getattr(\n            opts, \"image_augmentation.photo_metric_distort.alpha_min\", 0.5\n        )\n        alpha_max = getattr(\n            opts, \"image_augmentation.photo_metric_distort.alpha_max\", 1.5\n        )\n        contrast = T.ColorJitter(contrast=[alpha_min, alpha_max])\n\n        # brightness\n        beta_min = getattr(\n            opts, \"image_augmentation.photo_metric_distort.beta_min\", 0.875\n        )\n        beta_max = getattr(\n            opts, \"image_augmentation.photo_metric_distort.beta_max\", 1.125\n        )\n        brightness = T.ColorJitter(brightness=[beta_min, beta_max])\n\n        # saturation\n        gamma_min = getattr(\n            opts, \"image_augmentation.photo_metric_distort.gamma_min\", 0.5\n        )\n        gamma_max = getattr(\n            opts, \"image_augmentation.photo_metric_distort.gamma_max\", 1.5\n        )\n        saturation = T.ColorJitter(saturation=[gamma_min, gamma_max])\n\n        # Hue\n        delta_min = getattr(\n            opts, \"image_augmentation.photo_metric_distort.delta_min\", -0.05\n        )\n        delta_max = getattr(\n            opts, \"image_augmentation.photo_metric_distort.delta_max\", 0.05\n        )\n        hue = T.ColorJitter(hue=[delta_min, delta_max])\n\n        super().__init__(opts=opts)\n        self._brightness = brightness\n        self._contrast = contrast\n        self._hue = hue\n        self._saturation = saturation\n        self.p = getattr(opts, \"image_augmentation.photo_metric_distort.p\", 0.5)\n\n    def __repr__(self) -> str:\n        return \"{}(contrast={}, brightness={}, saturation={}, hue={})\".format(\n            self.__class__.__name__,\n            self._contrast.contrast,\n            self._brightness.brightness,\n            self._saturation.saturation,\n            self._hue.hue,\n        )\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        group = parser.add_argument_group(title=cls.__name__)\n        group.add_argument(\n            \"--image-augmentation.photo-metric-distort.enable\",\n            action=\"store_true\",\n            help=\"use {}. This flag is useful when you want to study the effect of different \"\n            \"transforms.\".format(cls.__name__),\n        )\n\n        group.add_argument(\n            \"--image-augmentation.photo-metric-distort.alpha-min\",\n            type=float,\n            default=0.5,\n            help=\"Min. alpha value for contrast. Should be > 0. Defaults to 0.5\",\n        )\n        group.add_argument(\n            \"--image-augmentation.photo-metric-distort.alpha-max\",\n            type=float,\n            default=1.5,\n            help=\"Max. alpha value for contrast. Should be > 0. Defaults to 1.5\",\n        )\n\n        group.add_argument(\n            \"--image-augmentation.photo-metric-distort.beta-min\",\n            type=float,\n            default=0.875,\n            help=\"Min. beta value for brightness. Should be > 0. Defaults to 0.8\",\n        )\n        group.add_argument(\n            \"--image-augmentation.photo-metric-distort.beta-max\",\n            type=float,\n            default=1.125,\n            help=\"Max. beta value for brightness. Should be > 0. Defaults to 1.2\",\n        )\n\n        group.add_argument(\n            \"--image-augmentation.photo-metric-distort.gamma-min\",\n            type=float,\n            default=0.5,\n            help=\"Min. gamma value for saturation. Should be > 0. Defaults to 0.5\",\n        )\n        group.add_argument(\n            \"--image-augmentation.photo-metric-distort.gamma-max\",\n            type=float,\n            default=1.5,\n            help=\"Max. gamma value for saturation. Should be > 0. Defaults to 1.5\",\n        )\n\n        group.add_argument(\n            \"--image-augmentation.photo-metric-distort.delta-min\",\n            type=float,\n            default=-0.05,\n            help=\"Min. delta value for Hue. Should be between -1 and 1. Defaults to -0.05\",\n        )\n        group.add_argument(\n            \"--image-augmentation.photo-metric-distort.delta-max\",\n            type=float,\n            default=0.05,\n            help=\"Max. delta value for Hue. Should be between -1 and 1. Defaults to 0.05\",\n        )\n\n        group.add_argument(\n            \"--image-augmentation.photo-metric-distort.p\",\n            type=float,\n            default=0.5,\n            help=\"Probability for applying a distortion. Defaults to 0.5\",\n        )\n\n        return parser\n\n    def _apply_transformations(self, image):\n        r = np.random.rand(7)\n\n        if r[0] < self.p:\n            image = self._brightness(image)\n\n        contrast_before = r[1] < self.p\n        if contrast_before and r[2] < self.p:\n            image = self._contrast(image)\n\n        if r[3] < self.p:\n            image = self._saturation(image)\n\n        if r[4] < self.p:\n            image = self._hue(image)\n\n        if not contrast_before and r[5] < self.p:\n            image = self._contrast(image)\n\n        if r[6] < self.p and image.mode != \"L\":\n            # Only permute channels for RGB images\n            # [H, W, C] format\n            image_np = np.asarray(image)\n            n_channels = image_np.shape[2]\n            image_np = image_np[..., np.random.permutation(range(n_channels))]\n            image = Image.fromarray(image_np)\n        return image\n\n    def __call__(self, data: Dict) -> Dict:\n        image = data.pop(\"image\")\n        data[\"image\"] = self._apply_transformations(image)\n        return data\n\n\n@TRANSFORMATIONS_REGISTRY.register(name=\"box_percent_coords\", type=\"image_pil\")\nclass BoxPercentCoords(BaseTransformation):\n    \"\"\"\n    This class converts the box coordinates to percent\n    \"\"\"\n\n    def __init__(self, opts, *args, **kwargs) -> None:\n        super().__init__(opts=opts)\n\n    def __call__(self, data: Dict) -> Dict:\n        if \"box_coordinates\" in data:\n            boxes = data.pop(\"box_coordinates\")\n            image = data[\"image\"]\n            width, height = F.get_image_size(image)\n\n            boxes = boxes.astype(np.float32)\n\n            boxes[..., 0::2] /= width\n            boxes[..., 1::2] /= height\n            data[\"box_coordinates\"] = boxes\n\n        return data\n\n\n@TRANSFORMATIONS_REGISTRY.register(name=\"instance_processor\", type=\"image_pil\")\nclass InstanceProcessor(BaseTransformation):\n    \"\"\"\n    This class processes the instance masks.\n    \"\"\"\n\n    def __init__(\n        self,\n        opts,\n        instance_size: Optional[Union[int, Tuple[int, ...]]] = 16,\n        *args,\n        **kwargs\n    ) -> None:\n        super().__init__(opts=opts)\n        self.instance_size = setup_size(instance_size)\n\n    def __call__(self, data: Dict) -> Dict:\n\n        if \"instance_mask\" in data:\n            assert \"instance_coords\" in data\n            instance_masks = data.pop(\"instance_mask\")\n            instance_coords = data.pop(\"instance_coords\")\n            instance_coords = instance_coords.astype(np.int)\n\n            valid_boxes = (instance_coords[..., 3] > instance_coords[..., 1]) & (\n                instance_coords[..., 2] > instance_coords[..., 0]\n            )\n            instance_masks = instance_masks[valid_boxes]\n            instance_coords = instance_coords[valid_boxes]\n\n            num_instances = instance_masks.shape[0]\n\n            resized_instances = []\n            for i in range(num_instances):\n                # format is [N, H, W]\n                instance_m = instance_masks[i]\n                box_coords = instance_coords[i]\n\n                instance_m = F.crop(\n                    instance_m,\n                    top=box_coords[1],\n                    left=box_coords[0],\n                    height=box_coords[3] - box_coords[1],\n                    width=box_coords[2] - box_coords[0],\n                )\n                # need to unsqueeze and squeeze to make F.resize work\n                instance_m = F.resize(\n                    instance_m.unsqueeze(0),\n                    size=self.instance_size,\n                    interpolation=T.InterpolationMode.NEAREST,\n                ).squeeze(0)\n                resized_instances.append(instance_m)\n\n            if len(resized_instances) == 0:\n                resized_instances = torch.zeros(\n                    size=(1, self.instance_size[0], self.instance_size[1]),\n                    dtype=torch.long,\n                )\n                instance_coords = np.array(\n                    [[0, 0, self.instance_size[0], self.instance_size[1]]]\n                )\n            else:\n                resized_instances = torch.stack(resized_instances, dim=0)\n\n            data[\"instance_mask\"] = resized_instances\n            data[\"instance_coords\"] = instance_coords.astype(np.float32)\n        return data\n\n\n@TRANSFORMATIONS_REGISTRY.register(name=\"random_resize\", type=\"image_pil\")\nclass RandomResize(BaseTransformation):\n    \"\"\"\n    This class implements random resizing method.\n    \"\"\"\n\n    def __init__(self, opts, *args, **kwargs) -> None:\n        min_ratio = getattr(opts, \"image_augmentation.random_resize.min_ratio\", 0.5)\n        max_ratio = getattr(opts, \"image_augmentation.random_resize.max_ratio\", 2.0)\n        interpolation = getattr(\n            opts, \"image_augmentation.random_resize.interpolation\", \"bilinear\"\n        )\n\n        max_scale_long_edge = getattr(\n            opts, \"image_augmentation.random_resize.max_scale_long_edge\", None\n        )\n        max_scale_short_edge = getattr(\n            opts, \"image_augmentation.random_resize.max_scale_short_edge\", None\n        )\n\n        if max_scale_long_edge is None and max_scale_short_edge is not None:\n            logger.warning(\n                \"max_scale_long_edge cannot be none when max_scale_short_edge is not None in {}. Setting both to \"\n                \"None\".format(self.__class__.__name__)\n            )\n            max_scale_long_edge = None\n            max_scale_short_edge = None\n        elif max_scale_long_edge is not None and max_scale_short_edge is None:\n            logger.warning(\n                \"max_scale_short_edge cannot be none when max_scale_long_edge is not None in {}. Setting both to \"\n                \"None\".format(self.__class__.__name__)\n            )\n            max_scale_long_edge = None\n            max_scale_short_edge = None\n\n        super().__init__(opts=opts)\n        self.min_ratio = min_ratio\n        self.max_ratio = max_ratio\n\n        self.max_scale_long_edge = max_scale_long_edge\n        self.max_scale_short_edge = max_scale_short_edge\n\n        self.interpolation = interpolation\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        group = parser.add_argument_group(title=cls.__name__)\n        group.add_argument(\n            \"--image-augmentation.random-resize.enable\",\n            action=\"store_true\",\n            help=\"use {}. This flag is useful when you want to study the effect of different \"\n            \"transforms.\".format(cls.__name__),\n        )\n        group.add_argument(\n            \"--image-augmentation.random-resize.max-scale-long-edge\",\n            type=int,\n            default=None,\n            help=\"Max. value along the longest edge. Defaults to None\",\n        )\n        group.add_argument(\n            \"--image-augmentation.random-resize.max-scale-short-edge\",\n            type=int,\n            default=None,\n            help=\"Max. value along the shortest edge. Defaults to None.\",\n        )\n\n        group.add_argument(\n            \"--image-augmentation.random-resize.min-ratio\",\n            type=float,\n            default=0.5,\n            help=\"Min ratio for random resizing. Defaults to 0.5\",\n        )\n        group.add_argument(\n            \"--image-augmentation.random-resize.max-ratio\",\n            type=float,\n            default=2.0,\n            help=\"Max ratio for random resizing. Defaults to 2.0\",\n        )\n        group.add_argument(\n            \"--image-augmentation.random-resize.interpolation\",\n            type=str,\n            default=\"bilinear\",\n            choices=list(INTERPOLATION_MODE_MAP.keys()),\n            help=\"Desired interpolation method. Defaults to bilinear.\",\n        )\n        return parser\n\n    def __call__(self, data: Dict) -> Dict:\n        random_ratio = random.uniform(self.min_ratio, self.max_ratio)\n\n        # compute the size\n        width, height = F.get_image_size(data[\"image\"])\n        if self.max_scale_long_edge is not None:\n            min_hw = min(height, width)\n            max_hw = max(height, width)\n            scale_factor = (\n                min(\n                    self.max_scale_long_edge / max_hw,\n                    self.max_scale_short_edge / min_hw,\n                )\n                * random_ratio\n            )\n            # resize while maintaining aspect ratio\n            new_size = int(math.ceil(height * scale_factor)), int(\n                math.ceil(width * scale_factor)\n            )\n        else:\n            new_size = int(math.ceil(height * random_ratio)), int(\n                math.ceil(width * random_ratio)\n            )\n        # new_size should be a tuple of height and width\n        return _resize_fn(data, size=new_size, interpolation=self.interpolation)\n\n    def __repr__(self) -> str:\n        return \"{}(min_ratio={}, max_ratio={}, interpolation={}, max_long_edge={}, max_short_edge={})\".format(\n            self.__class__.__name__,\n            self.min_ratio,\n            self.max_ratio,\n            self.interpolation,\n            self.max_scale_long_edge,\n            self.max_scale_short_edge,\n        )\n\n\n@TRANSFORMATIONS_REGISTRY.register(name=\"random_short_size_resize\", type=\"image_pil\")\nclass RandomShortSizeResize(BaseTransformation):\n    \"\"\"\n    This class implements random resizing such that shortest side is between specified minimum and maximum values.\n    \"\"\"\n\n    def __init__(self, opts, *args, **kwargs) -> None:\n        super().__init__(opts=opts)\n        short_size_min = getattr(\n            opts,\n            \"image_augmentation.random_short_size_resize.short_side_min\",\n            None,\n        )\n        short_size_max = getattr(\n            opts,\n            \"image_augmentation.random_short_size_resize.short_side_max\",\n            None,\n        )\n        max_img_dim = getattr(\n            opts,\n            \"image_augmentation.random_short_size_resize.max_img_dim\",\n            None,\n        )\n        if short_size_min is None:\n            logger.error(\n                \"Short side minimum value can't be None in {}\".format(\n                    self.__class__.__name__\n                )\n            )\n        if short_size_max is None:\n            logger.error(\n                \"Short side maximum value can't be None in {}\".format(\n                    self.__class__.__name__\n                )\n            )\n        if max_img_dim is None:\n            logger.error(\n                \"Max. image dimension value can't be None in {}\".format(\n                    self.__class__.__name__\n                )\n            )\n\n        if short_size_max <= short_size_min:\n            logger.error(\n                \"Short side maximum value should be >= short side minimum value in {}. Got: {} and {}\".format(\n                    self.__class__.__name__, short_size_max, short_size_min\n                )\n            )\n\n        interpolation = getattr(\n            opts,\n            \"image_augmentation.random_short_size_resize.interpolation\",\n            \"bicubic\",\n        )\n\n        self.short_side_min = short_size_min\n        self.short_side_max = short_size_max\n        self.max_img_dim = max_img_dim\n        self.interpolation = interpolation\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        group = parser.add_argument_group(title=cls.__name__)\n        group.add_argument(\n            \"--image-augmentation.random-short-size-resize.enable\",\n            action=\"store_true\",\n            help=\"use {}. This flag is useful when you want to study the effect of different \"\n            \"transforms.\".format(cls.__name__),\n        )\n        group.add_argument(\n            \"--image-augmentation.random-short-size-resize.short-side-min\",\n            type=int,\n            default=None,\n            help=\"Minimum value for image's shortest side. Defaults to None.\",\n        )\n        group.add_argument(\n            \"--image-augmentation.random-short-size-resize.short-side-max\",\n            type=int,\n            default=None,\n            help=\"Maximum value for image's shortest side. Defaults to None.\",\n        )\n        group.add_argument(\n            \"--image-augmentation.random-short-size-resize.interpolation\",\n            type=str,\n            default=\"bicubic\",\n            choices=list(INTERPOLATION_MODE_MAP.keys()),\n            help=\"Desired interpolation method. Defaults to bicubic\",\n        )\n        group.add_argument(\n            \"--image-augmentation.random-short-size-resize.max-img-dim\",\n            type=int,\n            default=None,\n            help=\"Max. image dimension. Defaults to None.\",\n        )\n        return parser\n\n    def __call__(self, data: Dict) -> Dict:\n        short_side = random.randint(self.short_side_min, self.short_side_max)\n        img_w, img_h = data[\"image\"].size\n        scale = min(\n            short_side / min(img_h, img_w), self.max_img_dim / max(img_h, img_w)\n        )\n        img_w = int(img_w * scale)\n        img_h = int(img_h * scale)\n        data = _resize_fn(data, size=(img_h, img_w), interpolation=self.interpolation)\n        return data\n\n    def __repr__(self) -> str:\n        return \"{}(short_side_min={}, short_side_max={}, interpolation={})\".format(\n            self.__class__.__name__,\n            self.short_side_min,\n            self.short_side_max,\n            self.interpolation,\n        )\n\n\n@TRANSFORMATIONS_REGISTRY.register(name=\"random_erasing\", type=\"image_pil\")\nclass RandomErasing(BaseTransformation, T.RandomErasing):\n    \"\"\"\n    This class randomly selects a region in a tensor and erases its pixels.\n    See `this paper <https://arxiv.org/abs/1708.04896>`_ for details.\n    \"\"\"\n\n    def __init__(self, opts, *args, **kwargs) -> None:\n        BaseTransformation.__init__(self, opts=opts)\n        random_erase_p = getattr(opts, \"image_augmentation.random_erase.p\", 0.5)\n        T.RandomErasing.__init__(self, p=random_erase_p)\n\n        self.random_erase_p = random_erase_p\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        group = parser.add_argument_group(title=cls.__name__)\n\n        group.add_argument(\n            \"--image-augmentation.random-erase.enable\",\n            action=\"store_true\",\n            help=\"use {}. This flag is useful when you want to study the effect of different \"\n            \"transforms.\".format(cls.__name__),\n        )\n        group.add_argument(\n            \"--image-augmentation.random-erase.p\",\n            type=float,\n            default=0.5,\n            help=\"Probability that random erasing operation will be applied. Defaults to 0.5\",\n        )\n        return parser\n\n    def __call__(self, data: Dict) -> Dict:\n        data[\"image\"] = super().forward(data.pop(\"image\"))\n        return data\n\n    def __repr__(self) -> str:\n        return \"{}(random_erase_p={})\".format(\n            self.__class__.__name__, self.random_erase_p\n        )\n\n\n@TRANSFORMATIONS_REGISTRY.register(name=\"random_gaussian_blur\", type=\"image_pil\")\nclass RandomGaussianBlur(BaseTransformation):\n    \"\"\"\n    This method randomly blurs the input image.\n    \"\"\"\n\n    def __init__(self, opts, *args, **kwargs):\n        super().__init__(opts=opts)\n        self.p = getattr(opts, \"image_augmentation.random_gaussian_noise.p\", 0.5)\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        group = parser.add_argument_group(title=cls.__name__)\n\n        group.add_argument(\n            \"--image-augmentation.random-gaussian-noise.enable\",\n            action=\"store_true\",\n            help=\"use {}. This flag is useful when you want to study the effect of different \"\n            \"transforms.\".format(cls.__name__),\n        )\n        group.add_argument(\n            \"--image-augmentation.random-gaussian-noise.p\",\n            type=float,\n            default=0.5,\n            help=\"Probability for applying {}\".format(cls.__name__),\n        )\n        return parser\n\n    def __call__(self, data: Dict) -> Dict:\n        if random.random() < self.p:\n            img = data.pop(\"image\")\n            # radius is the standard devaition of the gaussian kernel\n            img = img.filter(ImageFilter.GaussianBlur(radius=random.random()))\n            data[\"image\"] = img\n        return data\n\n\n@TRANSFORMATIONS_REGISTRY.register(name=\"random_crop\", type=\"image_pil\")\nclass RandomCrop(BaseTransformation):\n    \"\"\"\n    This method randomly crops an image area.\n\n    .. note::\n        If the size of input image is smaller than the desired crop size, the input image is first resized\n        while maintaining the aspect ratio and then cropping is performed.\n    \"\"\"\n\n    def __init__(\n        self,\n        opts,\n        size: Union[Sequence, int],\n        ignore_idx: Optional[int] = 255,\n        *args,\n        **kwargs\n    ) -> None:\n        super().__init__(opts=opts)\n        self.height, self.width = setup_size(size=size)\n        self.opts = opts\n        self.seg_class_max_ratio = getattr(\n            opts, \"image_augmentation.random_crop.seg_class_max_ratio\", None\n        )\n        self.ignore_idx = ignore_idx\n        self.num_repeats = 10\n        self.seg_fill = getattr(opts, \"image_augmentation.random_crop.mask_fill\", 0)\n        pad_if_needed = getattr(\n            opts, \"image_augmentation.random_crop.pad_if_needed\", False\n        )\n        self.if_needed_fn = (\n            self._pad_if_needed if pad_if_needed else self._resize_if_needed\n        )\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        group = parser.add_argument_group(title=cls.__name__)\n\n        group.add_argument(\n            \"--image-augmentation.random-crop.enable\",\n            action=\"store_true\",\n            help=\"use {}. This flag is useful when you want to study the effect of different \"\n            \"transforms.\".format(cls.__name__),\n        )\n        group.add_argument(\n            \"--image-augmentation.random-crop.seg-class-max-ratio\",\n            default=None,\n            type=float,\n            help=\"Max. ratio that single segmentation class can occupy. Defaults to None\",\n        )\n        group.add_argument(\n            \"--image-augmentation.random-crop.pad-if-needed\",\n            action=\"store_true\",\n            help=\"Pad images if needed. Defaults to False, i.e., resizing will be performed\",\n        )\n        group.add_argument(\n            \"--image-augmentation.random-crop.mask-fill\",\n            type=int,\n            default=255,\n            help=\"Value to fill in segmentation mask in case of padding. Defaults to 255. \"\n            \"Generally, this value is the same as background or undefined class id.\",\n        )\n        return parser\n\n    @staticmethod\n    def get_params(img_h, img_w, target_h, target_w):\n        if img_w == target_w and img_h == target_h:\n            return 0, 0, img_h, img_w\n\n        i = random.randint(0, max(0, img_h - target_h))\n        j = random.randint(0, max(0, img_w - target_w))\n        return i, j, target_h, target_w\n\n    @staticmethod\n    def get_params_from_box(boxes, img_h, img_w):\n        # x, y, w, h\n        offset = random.randint(20, 50)\n        start_x = max(0, int(round(np.min(boxes[..., 0]))) - offset)\n        start_y = max(0, int(round(np.min(boxes[..., 1]))) - offset)\n        end_x = min(int(round(np.max(boxes[..., 2]))) + offset, img_w)\n        end_y = min(int(round(np.max(boxes[..., 3]))) + offset, img_h)\n\n        return start_y, start_x, end_y - start_y, end_x - start_x\n\n    def get_params_from_mask(self, data, i, j, h, w):\n        img_w, img_h = F.get_image_size(data[\"image\"])\n        for _ in range(self.num_repeats):\n            temp_data = _crop_fn(\n                data=copy.deepcopy(data), top=i, left=j, height=h, width=w\n            )\n            class_labels, cls_count = np.unique(\n                np.array(temp_data[\"mask\"]), return_counts=True\n            )\n            valid_cls_count = cls_count[class_labels != self.ignore_idx]\n\n            if valid_cls_count.size == 0:\n                continue\n\n            # compute the ratio of segmentation class with max. pixels to total pixels.\n            # If the ratio is less than seg_class_max_ratio, then exit the loop\n            total_valid_pixels = np.sum(valid_cls_count)\n            max_valid_pixels = np.max(valid_cls_count)\n            ratio = max_valid_pixels / total_valid_pixels\n\n            if len(cls_count) > 1 and ratio < self.seg_class_max_ratio:\n                break\n            i, j, h, w = self.get_params(\n                img_h=img_h,\n                img_w=img_w,\n                target_h=self.height,\n                target_w=self.width,\n            )\n        return i, j, h, w\n\n    def _resize_if_needed(self, data: Dict) -> Dict:\n        img = data[\"image\"]\n\n        w, h = F.get_image_size(img)\n        # resize while maintaining the aspect ratio\n        new_size = min(h + max(0, self.height - h), w + max(0, self.width - w))\n\n        return _resize_fn(\n            data, size=new_size, interpolation=T.InterpolationMode.BILINEAR\n        )\n\n    def _pad_if_needed(self, data: Dict) -> Dict:\n        img = data.pop(\"image\")\n\n        w, h = F.get_image_size(img)\n        new_h = h + max(self.height - h, 0)\n        new_w = w + max(self.width - w, 0)\n\n        pad_img = Image.new(img.mode, (new_w, new_h), color=0)\n        pad_img.paste(img, (0, 0))\n        data[\"image\"] = pad_img\n\n        if \"mask\" in data:\n            mask = data.pop(\"mask\")\n            pad_mask = Image.new(mask.mode, (new_w, new_h), color=self.seg_fill)\n            pad_mask.paste(mask, (0, 0))\n            data[\"mask\"] = pad_mask\n\n        return data\n\n    def __call__(self, data: Dict) -> Dict:\n        # box_info\n        if \"box_coordinates\" in data:\n            boxes = data.get(\"box_coordinates\")\n            # crop the relevant area\n            image_w, image_h = F.get_image_size(data[\"image\"])\n            box_i, box_j, box_h, box_w = self.get_params_from_box(\n                boxes, image_h, image_w\n            )\n            data = _crop_fn(data, top=box_i, left=box_j, height=box_h, width=box_w)\n\n        data = self.if_needed_fn(data)\n\n        img_w, img_h = F.get_image_size(data[\"image\"])\n        i, j, h, w = self.get_params(\n            img_h=img_h, img_w=img_w, target_h=self.height, target_w=self.width\n        )\n\n        if (\n            \"mask\" in data\n            and self.seg_class_max_ratio is not None\n            and self.seg_class_max_ratio < 1.0\n        ):\n            i, j, h, w = self.get_params_from_mask(data=data, i=i, j=j, h=h, w=w)\n\n        data = _crop_fn(data=data, top=i, left=j, height=h, width=w)\n        return data\n\n    def __repr__(self) -> str:\n        return \"{}(size=(h={}, w={}), seg_class_max_ratio={}, seg_fill={})\".format(\n            self.__class__.__name__,\n            self.height,\n            self.width,\n            self.seg_class_max_ratio,\n            self.seg_fill,\n        )\n\n\n@TRANSFORMATIONS_REGISTRY.register(name=\"to_tensor\", type=\"image_pil\")\nclass ToTensor(BaseTransformation):\n    \"\"\"\n    This method converts an image into a tensor and optionally normalizes by a mean and std.\n    \"\"\"\n\n    def __init__(self, opts, *args, **kwargs) -> None:\n        super().__init__(opts=opts)\n        img_dtype = getattr(opts, \"image_augmentation.to_tensor.dtype\", \"float\")\n        mean_std_normalization_enable = getattr(\n            opts, \"image_augmentation.to_tensor.mean_std_normalization.enable\"\n        )\n        normalization_mean = getattr(\n            opts, \"image_augmentation.to_tensor.mean_std_normalization.mean\"\n        )\n        normalization_std = getattr(\n            opts, \"image_augmentation.to_tensor.mean_std_normalization.std\"\n        )\n\n        if mean_std_normalization_enable:\n            assert (\n                normalization_mean is not None\n            ), \"--image_augmentation.to_tensor.mean_std_normalization.mean must be specified when --image_augmentation.to_tensor.mean_std_normalization.enable is set to true.\"\n            assert (\n                normalization_std is not None\n            ), \"--image_augmentation.to_tensor.mean_std_normalization.std must be specified when --image_augmentation.to_tensor.mean_std_normalization.enable is set to true.\"\n\n            if isinstance(normalization_mean, list):\n                assert (\n                    len(normalization_mean) == 3\n                ), \"--image_augmentation.to_tensor.mean_std_normalization.mean must be a list of length 3 or a scalar.\"\n\n            if isinstance(normalization_std, list):\n                assert (\n                    len(normalization_std) == 3\n                ), \"--image_augmentation.to_tensor.mean_std_normalization.std must be a list of length 3 or a scalar.\"\n\n        self.img_dtype = torch.float\n        self.norm_factor = 255\n        if img_dtype in [\"half\", \"float16\"]:\n            self.img_dtype = torch.float16\n        elif img_dtype in [\"uint8\"]:\n            self.img_dtype = torch.uint8\n            self.norm_factor = 1\n\n        self.mean_std_normalization_enable = mean_std_normalization_enable\n        self.normalization_mean = normalization_mean\n        self.normalization_std = normalization_std\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        parser.add_argument(\n            \"--image-augmentation.to-tensor.dtype\",\n            type=str,\n            default=\"float\",\n            help=\"Tensor data type. Default is float\",\n        )\n        parser.add_argument(\n            \"--image-augmentation.to-tensor.mean-std-normalization.enable\",\n            action=\"store_true\",\n            default=False,\n            help=\"This flag is used to normalize a tensor by a dataset's mean and std. Defaults to False.\",\n        )\n        parser.add_argument(\n            \"--image-augmentation.to-tensor.mean-std-normalization.mean\",\n            type=float,\n            nargs=\"+\",\n            default=None,\n            help=\"The mean used to normalize the input. Defaults to None.\",\n        )\n        parser.add_argument(\n            \"--image-augmentation.to-tensor.mean-std-normalization.std\",\n            type=float,\n            nargs=\"+\",\n            default=None,\n            help=\"The standard deviation used to normalize the input. Defaults to None.\",\n        )\n        return parser\n\n    def __repr__(self):\n        if self.mean_std_normalization_enable:\n            return \"{}(dtype={}, norm_factor={}, mean_std_normalization_enable={}, normalization_mean={}, normalization_std={})\".format(\n                self.__class__.__name__,\n                self.img_dtype,\n                self.norm_factor,\n                self.mean_std_normalization_enable,\n                self.normalization_mean,\n                self.normalization_std,\n            )\n        else:\n            return \"{}(dtype={}, norm_factor={})\".format(\n                self.__class__.__name__,\n                self.img_dtype,\n                self.norm_factor,\n            )\n\n    def __call__(self, data: Dict) -> Dict:\n        # HWC --> CHW\n        img = data[\"image\"]\n\n        if F._is_pil_image(img):\n            # convert PIL image to tensor\n            img = F.pil_to_tensor(img).contiguous()\n\n        data[\"image\"] = img.to(dtype=self.img_dtype).div(self.norm_factor)\n\n        if self.mean_std_normalization_enable:\n            data[\"image\"] = F.normalize(\n                data[\"image\"],\n                mean=self.normalization_mean,\n                std=self.normalization_std,\n            )\n\n        if \"mask\" in data:\n            mask = data.pop(\"mask\")\n            mask = np.array(mask)\n\n            if len(mask.shape) not in (2, 3):\n                logger.error(\n                    \"Mask needs to be 2- or 3-dimensional. Got: {}\".format(mask.shape)\n                )\n            data[\"mask\"] = torch.as_tensor(mask, dtype=torch.long)\n\n        if \"box_coordinates\" in data:\n            boxes = data.pop(\"box_coordinates\")\n            data[\"box_coordinates\"] = torch.as_tensor(boxes, dtype=torch.float)\n\n        if \"box_labels\" in data:\n            box_labels = data.pop(\"box_labels\")\n            data[\"box_labels\"] = torch.as_tensor(box_labels)\n\n        if \"instance_mask\" in data:\n            assert \"instance_coords\" in data\n            instance_masks = data.pop(\"instance_mask\")\n            data[\"instance_mask\"] = instance_masks.to(dtype=torch.long)\n\n            instance_coords = data.pop(\"instance_coords\")\n            data[\"instance_coords\"] = torch.as_tensor(\n                instance_coords, dtype=torch.float\n            )\n        return data\n\n\n@TRANSFORMATIONS_REGISTRY.register(name=\"random_order\", type=\"image_pil\")\nclass RandomOrder(BaseTransformation):\n    \"\"\"\n    This method applies a list of all or few transforms in a random order.\n    \"\"\"\n\n    def __init__(self, opts, img_transforms: List, *args, **kwargs) -> None:\n        super().__init__(opts=opts)\n        self.transforms = img_transforms\n        apply_k_factor = getattr(opts, \"image_augmentation.random_order.apply_k\", 1.0)\n        assert (\n            0.0 < apply_k_factor <= 1.0\n        ), \"--image-augmentation.random-order.apply-k should be > 0 and <= 1\"\n        self.keep_t = int(math.ceil(len(self.transforms) * apply_k_factor))\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        group = parser.add_argument_group(title=cls.__name__)\n        group.add_argument(\n            \"--image-augmentation.random-order.enable\",\n            action=\"store_true\",\n            help=\"use {}. This flag is useful when you want to study the effect of different \"\n            \"transforms.\".format(cls.__name__),\n        )\n        group.add_argument(\n            \"--image-augmentation.random-order.apply-k\",\n            type=int,\n            default=1.0,\n            help=\"Apply K percent of transforms randomly. Value between 0 and 1. \"\n            \"Defaults to 1 (i.e., apply all transforms in random order).\",\n        )\n        return parser\n\n    def __call__(self, data: Dict) -> Dict:\n        random.shuffle(self.transforms)\n        for t in self.transforms[: self.keep_t]:\n            data = t(data)\n        return data\n\n    def __repr__(self):\n        transform_str = \", \".join(str(t) for t in self.transforms)\n        repr_str = \"{}(n_transforms={}, t_list=[{}]\".format(\n            self.__class__.__name__, self.keep_t, transform_str\n        )\n        return repr_str\n\n\n@TRANSFORMATIONS_REGISTRY.register(name=\"rand_augment_timm\", type=\"image_pil\")\nclass RandAugmentTimm(BaseTransformation):\n    \"\"\"\n    This class implements the `RandAugment data augmentation <https://arxiv.org/abs/1909.13719>`_ method,\n    as described in `ResNet Strikes Back <https://arxiv.org/abs/2110.00476>`_ paper\n    \"\"\"\n\n    def __init__(self, opts, *args, **kwargs) -> None:\n        config_str = getattr(\n            opts,\n            \"image_augmentation.rand_augment.timm_config_str\",\n            \"rand-m9-mstd0.5-inc1\",\n        )\n\n        super().__init__(opts=opts, *args, **kwargs)\n\n        rand_augment_transform = None\n        try:\n            from timm.data.transforms_factory import rand_augment_transform\n        except ModuleNotFoundError:\n            logger.error(\"Please install timm library\")\n\n        self.config_str = config_str\n        self.aug_fn = rand_augment_transform\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        group = parser.add_argument_group(title=cls.__name__)\n\n        group.add_argument(\n            \"--image-augmentation.rand-augment.use-timm-library\",\n            action=\"store_true\",\n            help=\"Use timm library for randaugment over PyTorch's implementation\",\n        )\n        group.add_argument(\n            \"--image-augmentation.rand-augment.timm-config-str\",\n            type=str,\n            default=\"rand-m9-mstd0.5-inc1\",\n            help=\"Number of augmentation transformations to apply sequentially. Defaults to 2.\",\n        )\n        return parser\n\n    def __call__(self, data: Dict) -> Dict:\n        if \"box_coordinates\" in data or \"mask\" in data or \"instance_masks\" in data:\n            logger.error(\n                \"{} is only supported for classification tasks\".format(\n                    self.__class__.__name__\n                )\n            )\n\n        img = data[\"image\"]\n        img_size_min = min(img.size)\n        aa_params = dict(\n            translate_const=int(img_size_min * 0.45),\n            img_mean=tuple([128, 128, 128]),\n        )\n        img = self.aug_fn(self.config_str, aa_params)(img)\n        data[\"image\"] = img\n        return data\n\n    def __repr__(self) -> str:\n        return \"{}(config_str={})\".format(self.__class__.__name__, self.config_str)\n"
  },
  {
    "path": "corenet/data/transforms/image_torch.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nimport math\nimport random\nfrom typing import Dict, Tuple\n\nimport torch\nfrom torch import Tensor\nfrom torch.nn import functional as F_torch\nfrom torchvision.transforms import functional as F\n\nfrom corenet.data.transforms import TRANSFORMATIONS_REGISTRY, BaseTransformation\nfrom corenet.utils import logger\n\n\n# Copied from PyTorch Torchvision\n@TRANSFORMATIONS_REGISTRY.register(name=\"random_mixup\", type=\"image_torch\")\nclass RandomMixup(BaseTransformation):\n    \"\"\"\n    Given a batch of input images and labels, this class randomly applies the\n    `MixUp transformation <https://arxiv.org/abs/1710.09412>`_\n\n    Args:\n        opts (argparse.Namespace): Arguments\n        num_classes (int): Number of classes in the dataset\n    \"\"\"\n\n    def __init__(\n        self, opts: argparse.Namespace, num_classes: int, *args, **kwargs\n    ) -> None:\n        super().__init__(opts=opts, *args, **kwargs)\n        alpha = getattr(opts, \"image_augmentation.mixup.alpha\")\n        assert (\n            num_classes > 0\n        ), \"Please provide a valid positive value for the num_classes.\"\n        assert alpha > 0, \"Alpha param can't be zero.\"\n\n        self.num_classes = num_classes\n        self.p = getattr(opts, \"image_augmentation.mixup.p\")\n        assert (\n            0.0 < self.p <= 1.0\n        ), \"MixUp probability should be between 0 and 1, where 1 is inclusive\"\n        self.alpha = alpha\n        self.inplace = getattr(opts, \"image_augmentation.mixup.inplace\")\n        self.sample_key = getattr(opts, \"image_augmentation.mixup.sample_key\")\n        self.target_key = getattr(opts, \"image_augmentation.mixup.target_key\")\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        group = parser.add_argument_group(title=cls.__name__)\n\n        group.add_argument(\n            \"--image-augmentation.mixup.enable\",\n            action=\"store_true\",\n            help=\"use {}. This flag is useful when you want to study the effect of different \"\n            \"transforms.\".format(cls.__name__),\n        )\n        group.add_argument(\n            \"--image-augmentation.mixup.alpha\",\n            type=float,\n            default=0.2,\n            help=\"Alpha for MixUp augmentation. Defaults to 0.2\",\n        )\n        group.add_argument(\n            \"--image-augmentation.mixup.p\",\n            type=float,\n            default=1.0,\n            help=\"Probability for applying MixUp augmentation. Defaults to 1.0 .\"\n            \" If both MixUp and CutMix are enabled,\"\n            \" one is used with probability 0.5 per batch.\",\n        )\n        group.add_argument(\n            \"--image-augmentation.mixup.inplace\",\n            action=\"store_true\",\n            default=False,\n            help=\"Apply MixUp augmentation inplace. Defaults to False.\",\n        )\n\n        group.add_argument(\n            \"--image-augmentation.mixup.sample-key\",\n            type=str,\n            default=None,\n            help=\"Name of the key if input is a dictionart. Defaults to None.\",\n        )\n\n        group.add_argument(\n            \"--image-augmentation.mixup.target-key\",\n            type=str,\n            default=None,\n            help=\"Name of the key if target is a dictionary. Defaults to None.\",\n        )\n\n        return parser\n\n    def _apply_mixup_transform(\n        self, image_tensor: Tensor, target_tensor: Tensor\n    ) -> Tuple[Tensor, Tensor]:\n        if image_tensor.ndim != 4:\n            logger.error(f\"Batch ndim should be 4. Got {image_tensor.ndim}\")\n        if target_tensor.ndim != 1:\n            logger.error(f\"Target ndim should be 1. Got {target_tensor.ndim}\")\n        if not image_tensor.is_floating_point():\n            logger.error(\n                f\"Batch datatype should be a float tensor. Got {image_tensor.dtype}.\"\n            )\n        if target_tensor.dtype != torch.int64:\n            logger.error(\n                f\"Target datatype should be torch.int64. Got {target_tensor.dtype}\"\n            )\n\n        if not self.inplace:\n            image_tensor = image_tensor.clone()\n            target_tensor = target_tensor.clone()\n\n        if target_tensor.ndim == 1:\n            target_tensor = F_torch.one_hot(\n                target_tensor, num_classes=self.num_classes\n            ).to(dtype=image_tensor.dtype)\n\n        # It's faster to roll the batch by one instead of shuffling it to create image pairs\n        batch_rolled = image_tensor.roll(1, 0)\n        target_rolled = target_tensor.roll(1, 0)\n\n        # Implemented as on mixup paper, page 3.\n        lambda_param = float(\n            torch._sample_dirichlet(torch.tensor([self.alpha, self.alpha]))[0]\n        )\n        batch_rolled.mul_(1.0 - lambda_param)\n        image_tensor.mul_(lambda_param).add_(batch_rolled)\n\n        target_rolled.mul_(1.0 - lambda_param)\n        target_tensor.mul_(lambda_param).add_(target_rolled)\n        return image_tensor, target_tensor\n\n    def __call__(self, data: Dict) -> Dict:\n        \"\"\"\n        Input data format:\n            data: mapping of: {\n                \"samples\": {\"sample_key\": Tensor of shape: [Batch, Channels, Height, Width]},\n                \"targets\": {\"target_key\": IntTensor of shape: [Batch]}\n            }\n\n            OR\n            data: mapping of: {\n                \"samples\": {\"sample_key\": Tensor of shape: [Batch, Channels, Height, Width]},\n                \"targets\": IntTensor of shape: [Batch]\n            }\n\n            OR\n            data: mapping of: {\n                \"samples\": Tensor of shape: [Batch, Channels, Height, Width],\n                \"targets\": {\"target_key\": IntTensor of shape: [Batch]}\n            }\n            OR\n            data: mapping of: {\n                \"samples\": Tensor of shape: [Batch, Channels, Height, Width],\n                \"targets\": IntTensor of shape: [Batch]\n            }\n        Output data format: Same as the input\n        \"\"\"\n\n        if torch.rand(1).item() >= self.p:\n            return data\n\n        samples, targets = data.pop(\"samples\"), data.pop(\"targets\")\n\n        if self.sample_key is not None:\n            samples = samples[self.sample_key]\n            if not isinstance(samples, Tensor):\n                logger.error(\n                    f\"Samples need to be of type Tensor. Got: {type(samples)}. \"\n                    f\"Maybe you want to check the value of --image-augmentation.mixup.sample-key\"\n                )\n\n        if self.target_key is not None:\n            targets = targets[self.target_key]\n            if not isinstance(targets, Tensor):\n                logger.error(\n                    f\"Targets need to be of type Tensor. Got: {type(targets)}. \"\n                    f\"Maybe you want to check the value of --image-augmentation.mixup.target-key\"\n                )\n\n        samples, targets = self._apply_mixup_transform(\n            image_tensor=samples, target_tensor=targets\n        )\n\n        if self.sample_key is not None:\n            if isinstance(samples, Tensor):\n                samples = {self.sample_key: samples}\n            else:\n                samples[self.sample_key] = samples\n        if self.target_key is not None:\n            if isinstance(targets, Tensor):\n                targets = {self.target_key: targets}\n            else:\n                targets[self.target_key] = targets\n\n        data.update({\"samples\": samples, \"targets\": targets})\n\n        return data\n\n    def __repr__(self) -> str:\n        return \"{}(num_classes={}, p={}, alpha={}, inplace={})\".format(\n            self.__class__.__name__, self.num_classes, self.p, self.alpha, self.inplace\n        )\n\n\n@TRANSFORMATIONS_REGISTRY.register(name=\"random_cutmix\", type=\"image_torch\")\nclass RandomCutmix(BaseTransformation):\n    \"\"\"\n    Given a batch of input images and labels, this class randomly applies the\n    `CutMix transformation <https://arxiv.org/abs/1905.04899>`_\n\n    Args:\n        opts (argparse.Namespace): Arguments\n        num_classes (int): Number of classes in the dataset\n    \"\"\"\n\n    def __init__(\n        self, opts: argparse.Namespace, num_classes: int, *args, **kwargs\n    ) -> None:\n        super().__init__(opts=opts, *args, **kwargs)\n        alpha = getattr(opts, \"image_augmentation.cutmix.alpha\")\n        assert (\n            num_classes > 0\n        ), \"Please provide a valid positive value for the num_classes.\"\n        assert alpha > 0, \"Alpha param can't be zero.\"\n\n        self.num_classes = num_classes\n        self.p = getattr(opts, \"image_augmentation.cutmix.p\")\n        assert (\n            0.0 < self.p <= 1.0\n        ), \"CutMix probability should be between 0 and 1, where 1 is inclusive\"\n        self.alpha = alpha\n        self.inplace = getattr(opts, \"image_augmentation.cutmix.inplace\")\n        self.sample_key = getattr(opts, \"image_augmentation.cutmix.sample_key\")\n        self.target_key = getattr(opts, \"image_augmentation.cutmix.target_key\")\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        group = parser.add_argument_group(title=cls.__name__)\n\n        group.add_argument(\n            \"--image-augmentation.cutmix.enable\",\n            action=\"store_true\",\n            help=\"use {}. This flag is useful when you want to study the effect of different \"\n            \"transforms.\".format(cls.__name__),\n        )\n\n        group.add_argument(\n            \"--image-augmentation.cutmix.alpha\",\n            type=float,\n            default=1.0,\n            help=\"Alpha for cutmix augmentation. Defaults to 1.0\",\n        )\n        group.add_argument(\n            \"--image-augmentation.cutmix.p\",\n            type=float,\n            default=1.0,\n            help=\"Probability for applying cutmix augmentation. Defaults to 1.0\"\n            \" If both MixUp and CutMix are enabled,\"\n            \" one is used with probability 0.5 per batch.\",\n        )\n        group.add_argument(\n            \"--image-augmentation.cutmix.inplace\",\n            action=\"store_true\",\n            default=False,\n            help=\"Apply cutmix operation inplace. Defaults to False\",\n        )\n\n        group.add_argument(\n            \"--image-augmentation.cutmix.sample-key\",\n            type=str,\n            default=None,\n            help=\"Name of the key if input is a dictionary. Defaults to None.\",\n        )\n\n        group.add_argument(\n            \"--image-augmentation.cutmix.target-key\",\n            type=str,\n            default=None,\n            help=\"Name of the key if target is a dictionary. Defaults to None.\",\n        )\n        return parser\n\n    def _apply_cutmix_transform(\n        self, image_tensor: Tensor, target_tensor: Tensor\n    ) -> Tuple[Tensor, Tensor]:\n        if image_tensor.ndim != 4:\n            logger.error(f\"Batch ndim should be 4. Got {image_tensor.ndim}\")\n        if target_tensor.ndim != 1:\n            logger.error(f\"Target ndim should be 1. Got {target_tensor.ndim}\")\n        if not image_tensor.is_floating_point():\n            logger.error(\n                f\"Batch dtype should be a float tensor. Got {image_tensor.dtype}.\"\n            )\n        if target_tensor.dtype != torch.int64:\n            logger.error(\n                f\"Target dtype should be torch.int64. Got {target_tensor.dtype}\"\n            )\n\n        if not self.inplace:\n            image_tensor = image_tensor.clone()\n            target_tensor = target_tensor.clone()\n\n        if target_tensor.ndim == 1:\n            target_tensor = F_torch.one_hot(\n                target_tensor, num_classes=self.num_classes\n            ).to(dtype=image_tensor.dtype)\n\n        # It's faster to roll the batch by one instead of shuffling it to create image pairs\n        batch_rolled = image_tensor.roll(1, 0)\n        target_rolled = target_tensor.roll(1, 0)\n\n        # Implemented as on cutmix paper, page 12 (with minor corrections on typos).\n        lambda_param = float(\n            torch._sample_dirichlet(torch.tensor([self.alpha, self.alpha]))[0]\n        )\n        W, H = F.get_image_size(image_tensor)\n\n        r_x = torch.randint(W, (1,))\n        r_y = torch.randint(H, (1,))\n\n        r = 0.5 * math.sqrt(1.0 - lambda_param)\n        r_w_half = int(r * W)\n        r_h_half = int(r * H)\n\n        x1 = int(torch.clamp(r_x - r_w_half, min=0))\n        y1 = int(torch.clamp(r_y - r_h_half, min=0))\n        x2 = int(torch.clamp(r_x + r_w_half, max=W))\n        y2 = int(torch.clamp(r_y + r_h_half, max=H))\n\n        image_tensor[:, :, y1:y2, x1:x2] = batch_rolled[:, :, y1:y2, x1:x2]\n        lambda_param = float(1.0 - (x2 - x1) * (y2 - y1) / (W * H))\n\n        target_rolled.mul_(1.0 - lambda_param)\n        target_tensor.mul_(lambda_param).add_(target_rolled)\n        return image_tensor, target_tensor\n\n    def __call__(self, data: Dict) -> Dict:\n        \"\"\"\n        Input data format:\n            data: mapping of: {\n                \"samples\": {\"sample_key\": Tensor of shape: [Batch, Channels, Height, Width]},\n                \"targets\": {\"target_key\": IntTensor of shape: [Batch]}\n            }\n\n            OR\n            data: mapping of: {\n                \"samples\": {\"sample_key\": Tensor of shape: [Batch, Channels, Height, Width]},\n                \"targets\": IntTensor of shape: [Batch]\n            }\n\n            OR\n            data: mapping of: {\n                \"samples\": Tensor of shape: [Batch, Channels, Height, Width],\n                \"targets\": {\"target_key\": IntTensor of shape: [Batch]}\n            }\n            OR\n            data: mapping of: {\n                \"samples\": Tensor of shape: [Batch, Channels, Height, Width],\n                \"targets\": IntTensor of shape: [Batch]\n            }\n        Output data format: Same as the input\n        \"\"\"\n\n        if torch.rand(1).item() >= self.p:\n            return data\n\n        samples, targets = data.pop(\"samples\"), data.pop(\"targets\")\n\n        if self.sample_key is not None:\n            samples = samples[self.sample_key]\n            if not isinstance(samples, Tensor):\n                logger.error(\n                    f\"Samples need to be of type Tensor. Got: {type(samples)}. \"\n                    f\"Maybe you want to check the value of --image-augmentation.cutmix.sample-key\"\n                )\n\n        if self.target_key is not None:\n            targets = targets[self.target_key]\n            if not isinstance(targets, Tensor):\n                logger.error(\n                    f\"Targets need to be of type Tensor. Got: {type(targets)}. \"\n                    f\"Maybe you want to check the value of --image-augmentation.cutmix.target-key\"\n                )\n\n        samples, targets = self._apply_cutmix_transform(\n            image_tensor=samples, target_tensor=targets\n        )\n\n        if self.sample_key is not None:\n            if isinstance(samples, Tensor):\n                samples = {self.sample_key: samples}\n            else:\n                samples[self.sample_key] = samples\n        if self.target_key is not None:\n            if isinstance(targets, Tensor):\n                targets = {self.target_key: targets}\n            else:\n                targets[self.target_key] = targets\n\n        data.update({\"samples\": samples, \"targets\": targets})\n        return data\n\n    def __repr__(self) -> str:\n        return \"{}(num_classes={}, p={}, alpha={}, inplace={})\".format(\n            self.__class__.__name__, self.num_classes, self.p, self.alpha, self.inplace\n        )\n\n\ndef apply_mixing_transforms(opts: argparse.Namespace, data: Dict) -> Dict:\n    \"\"\"\n    Helper function to apply MixUp/CutMix transforms. If both MixUp and CutMix transforms\n    are selected with 0.0 < p <= 1.0, then one of them is chosen randomly and applied.\n\n    Input data format:\n        data: mapping of: {\n            \"samples\": {\"sample_key\": Tensor of shape: [Batch, Channels, Height, Width]},\n            \"targets\": {\"target_key\": IntTensor of shape: [Batch]}\n        }\n\n        OR\n        data: mapping of: {\n            \"samples\": {\"sample_key\": Tensor of shape: [Batch, Channels, Height, Width},\n            \"targets\": IntTensor of shape: [Batch]\n        }\n\n        OR\n        data: mapping of: {\n            \"samples\": Tensor of shape: [Batch, Channels, Height, Width],\n            \"targets\": {\"target_key\": IntTensor of shape: [Batch]}\n        }\n        OR\n        data: mapping of: {\n            \"samples\": Tensor of shape: [Batch, Channels, Height, Width],\n            \"targets\": IntTensor of shape: [Batch]\n        }\n    Output data format: Same as the input\n    \"\"\"\n\n    mixup_transforms = []\n    if getattr(opts, \"image_augmentation.mixup.enable\"):\n        n_classes = getattr(opts, \"model.classification.n_classes\")\n        if n_classes is None:\n            logger.error(\"Please specify number of classes. Got None.\")\n        mixup_transforms.append(RandomMixup(opts=opts, num_classes=n_classes))\n\n    if getattr(opts, \"image_augmentation.cutmix.enable\"):\n        n_classes = getattr(opts, \"model.classification.n_classes\")\n        if n_classes is None:\n            logger.error(\"Please specify number of classes. Got None.\")\n        mixup_transforms.append(RandomCutmix(opts=opts, num_classes=n_classes))\n\n    if len(mixup_transforms) > 0:\n        _mixup_transform = random.choice(mixup_transforms)\n        data = _mixup_transform(data)\n    return data\n"
  },
  {
    "path": "corenet/data/transforms/utils.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom typing import Any\n\nimport numpy as np\n\n\ndef setup_size(size: Any, error_msg=\"Need a tuple of length 2\"):\n    if size is None:\n        raise ValueError(\"Size can't be None\")\n\n    if isinstance(size, int):\n        return size, size\n    elif isinstance(size, (list, tuple)) and len(size) == 1:\n        return size[0], size[0]\n\n    if len(size) != 2:\n        raise ValueError(error_msg)\n\n    return size\n\n\ndef intersect(box_a, box_b):\n    \"\"\"Computes the intersection between box_a and box_b\"\"\"\n    max_xy = np.minimum(box_a[:, 2:], box_b[2:])\n    min_xy = np.maximum(box_a[:, :2], box_b[:2])\n    inter = np.clip((max_xy - min_xy), a_min=0, a_max=np.inf)\n    return inter[:, 0] * inter[:, 1]\n\n\ndef jaccard_numpy(box_a: np.ndarray, box_b: np.ndarray):\n    \"\"\"\n    Computes the intersection of two boxes.\n    Args:\n        box_a (np.ndarray): Boxes of shape [Num_boxes_A, 4]\n        box_b (np.ndarray): Box osf shape [Num_boxes_B, 4]\n\n    Returns:\n        intersection over union scores. Shape is [box_a.shape[0], box_a.shape[1]]\n    \"\"\"\n    inter = intersect(box_a, box_b)\n    area_a = (box_a[:, 2] - box_a[:, 0]) * (box_a[:, 3] - box_a[:, 1])  # [A,B]\n    area_b = (box_b[2] - box_b[0]) * (box_b[3] - box_b[1])  # [A,B]\n    union = area_a + area_b - inter\n    return inter / union  # [A,B]\n"
  },
  {
    "path": "corenet/data/transforms/video.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\nimport argparse\nimport datetime\nimport hashlib\nimport math\nimport os\nimport random\nimport subprocess\nimport tempfile\nfrom pathlib import Path\nfrom typing import Callable, Dict, List, Optional, Sequence, Tuple, Union\n\nimport psutil\nimport torch\nimport torchaudio\nfrom torch.nn import functional as F\nfrom torchvision.io import write_video\nfrom torchvision.transforms import InterpolationMode\nfrom torchvision.transforms import functional as FV\n\nfrom corenet.data.transforms import TRANSFORMATIONS_REGISTRY, BaseTransformation\nfrom corenet.data.transforms.utils import *\nfrom corenet.options.parse_args import JsonValidator\nfrom corenet.utils import logger\n\nSUPPORTED_PYTORCH_INTERPOLATIONS = [\"nearest\", \"bilinear\", \"bicubic\"]\n\n\ndef _check_interpolation(interpolation):\n    if interpolation not in SUPPORTED_PYTORCH_INTERPOLATIONS:\n        inter_str = \"Supported interpolation modes are:\"\n        for i, j in enumerate(SUPPORTED_PYTORCH_INTERPOLATIONS):\n            inter_str += \"\\n\\t{}: {}\".format(i, j)\n        logger.error(inter_str)\n    return interpolation\n\n\ndef _crop_fn(data: Dict, i: int, j: int, h: int, w: int) -> Dict:\n    \"\"\"Crop the video in `data`.\n\n    Args:\n        data: A dictionary of data. The format is:\n            {\n                \"samples\":{\n                    \"video\": A video tensor of shape [...x H x W], where H and W are the\n                        height and width.\n                    \"audio\": An audio tensor.\n                }\n            }\n        i: The height coordinate of the top left corner of the cropped rectangle.\n        j: The width coordinate of the top left corner of the cropped rectangle.\n        h: The height of the cropped rectangle.\n        w: The width of the cropped rectangle.\n\n    Returns:\n        A dictionary of the same format as `data` where `data[\"samples\"][\"videos\"]` is\n        the cropped video.\n    \"\"\"\n    img = data[\"samples\"][\"video\"]\n    check_rgb_video_tensor(img)\n\n    crop_image = img[..., i : i + h, j : j + w]\n    data[\"samples\"][\"video\"] = crop_image\n\n    mask = data.get(\"mask\", None)\n    if mask is not None:\n        crop_mask = mask[..., i : i + h, j : j + w]\n        data[\"samples\"][\"mask\"] = crop_mask\n    return data\n\n\ndef _resize_fn(\n    data: Dict,\n    size: Union[Sequence, int],\n    interpolation: Optional[str] = \"bilinear\",\n) -> Dict:\n    \"\"\"Resize the video in `data`.\n\n    Args:\n        data: A dictionary of data. The format is:\n            {\n                \"samples\":{\n                    \"video\": A video tensor of shape [... x H x W], where H and W are the\n                        height and width.\n                    \"mask\": An optional entry of the mask tensor of shape [... x H x W],\n                        where H and W are the height and width.\n                    \"audio\": An audio tensor.\n                }\n            }\n        size: The size of video to resize to.\n        interpolation: The method of interpolation to use. Choices are: \"bilinear\",\n        \"nearest\", \"linear\", \"bicubic\", \"trilinear\", \"area\", \"nearest-exact\", default to\n        \"bilinear\".\n\n    Returns:\n        A dictionary of the same format as `data` where `data[\"samples\"][\"videos\"]` is\n        the cropped video.\n    \"\"\"\n\n    video = data[\"samples\"][\"video\"]\n\n    if isinstance(size, Sequence) and len(size) == 2:\n        size_h, size_w = size[0], size[1]\n    elif isinstance(size, int):\n        h, w = video.shape[-2:]\n        if (w <= h and w == size) or (h <= w and h == size):\n            return data\n\n        if w < h:\n            size_h = int(size * h / w)\n\n            size_w = size\n        else:\n            size_w = int(size * w / h)\n            size_h = size\n    else:\n        raise TypeError(\n            \"Supported size args are int or tuple of length 2. Got inappropriate size\"\n            \" arg: {}\".format(size)\n        )\n    if isinstance(interpolation, str):\n        interpolation = _check_interpolation(interpolation)\n    n, tc1, tc2, h, w = video.shape\n    # Since video could be either NTCHW or NCTHW format, we reshape the 5D tensor into\n    # 4D and transpose back to 5D.\n    video = F.interpolate(\n        input=video.reshape(n, tc1 * tc2, h, w),\n        size=(size_h, size_w),\n        mode=interpolation,\n        align_corners=True if interpolation != \"nearest\" else None,\n    )\n    data[\"samples\"][\"video\"] = video.reshape(n, tc1, tc2, size_h, size_w)\n\n    mask = data[\"samples\"].get(\"mask\", None)\n    if mask is not None:\n        mask = F.interpolate(input=mask, size=(size_h, size_w), mode=\"nearest\")\n        data[\"samples\"][\"mask\"] = mask\n\n    return data\n\n\ndef check_rgb_video_tensor(clip: torch.Tensor) -> None:\n    \"\"\"Check if the video tensor is the right type and shape.\n\n    Args:\n        clip: A video clip tensor of shape [N x C x T x H x W] or\n        [N x C x T x H x W], where N is the number of clips, T is the number\n        of frames of the clip, C is the number of image channels,\n        H and W are the height and width of the frame image.\n    \"\"\"\n    if not isinstance(clip, torch.FloatTensor):\n        logger.error(\"Video clip is not an instance of FloatTensor.\")\n    if clip.dim() != 5:\n        logger.error(\"Video clip is not a 5-d tensor (NTCHW or NCTHW).\")\n\n\n@TRANSFORMATIONS_REGISTRY.register(name=\"to_tensor\", type=\"video\")\nclass ToTensor(BaseTransformation):\n    \"\"\"\n    This method converts an image into a tensor.\n\n    Tensor shape abbreviations:\n        N: Number of clips.\n        T, T_audio, T_video: Temporal lengths.\n        C: Number of color channels.\n        H, W: Height, Width.\n\n    .. note::\n        We do not perform any mean-std normalization. If mean-std normalization is\n        desired, please modify this class.\n    \"\"\"\n\n    def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None:\n        super().__init__(opts=opts)\n\n    def __call__(self, data: Dict) -> Dict:\n        # [N, C, T, H, W] or [N, T, C, H, W].\n        clip = data[\"samples\"][\"video\"]\n        if not isinstance(clip, torch.Tensor):\n            clip = torch.from_numpy(clip)\n\n        if not isinstance(clip, torch.FloatTensor):\n            # Convert to float, and normalize between 0 and 1.\n            clip = clip / 255.0\n\n        check_rgb_video_tensor(clip)\n\n        data[\"samples\"][\"video\"] = clip\n        return data\n\n\n@TRANSFORMATIONS_REGISTRY.register(name=\"to_array\", type=\"video\")\nclass ToPixelArray(BaseTransformation):\n    \"\"\"\n    This method is an inverse of ToTensor, converting a float tensor in range [0,1] back\n    to a numpy uint8 array in range [0,255].\n\n    Tensor shape abbreviations:\n        N: Number of clips.\n        T: Temporal length.\n        C: Number of color channels.\n        H, W: Height, Width.\n    \"\"\"\n\n    def __call__(self, data: Dict) -> Dict:\n        # [N, C, T, H, W] or [N, T, C, H, W].\n        video = data[\"samples\"][\"video\"]\n        video = (video * 255.0).round().numpy().astype(np.uint8)\n        data[\"samples\"][\"video\"] = video\n        return data\n\n\n@TRANSFORMATIONS_REGISTRY.register(name=\"save-inputs\", type=\"video\")\nclass SaveInputs(BaseTransformation):\n    def __init__(\n        self,\n        opts: argparse.Namespace,\n        get_frame_captions: Optional[Callable[[Dict], List[str]]] = None,\n        *args,\n        **kwargs,\n    ) -> None:\n        \"\"\"Saves the clips that are returned by VideoDataset.__getitem__() to disk\n        for debugging use cases. This transformation operates on multiple clips that\n        are extracted out of a single raw video. The video and audio of the clips are\n        concatenated and saved into 1 video file.\n\n        1 raw input video ==> VideoDataset.__getitem__() ==>\n            multiple clips in data[\"samples\"][\"video\"] ==> SaveInputs() ==>\n            1 output debugging video.\n\n        This is useful for visualizing training and/or validation videos to make\n        sure preprocessing logic is behaving as expected.\n\n        Args:\n            opts: Command line options.\n            get_frame_captions: If provided, this function returns a list of strings\n                (one string per video frame). The frame captions will be added to the\n                video as subtitles.\n        \"\"\"\n        self.get_frame_captions = get_frame_captions\n        self.enable = getattr(opts, \"video_augmentation.save_inputs.enable\")\n        save_dir = getattr(opts, \"video_augmentation.save_inputs.save_dir\")\n        if self.enable and save_dir is None:\n            logger.error(\n                \"Please provide value for --video_augmentation.save-inputs.save-dir\"\n            )\n        process_start_time = datetime.datetime.fromtimestamp(\n            psutil.Process(os.getpid()).create_time()\n        ).strftime(\"%Y-%m-%d %H:%M\")\n        self.save_dir = Path(save_dir, process_start_time).expanduser()\n        self.symlink_to_original = getattr(\n            opts, \"video_augmentation.save_inputs.symlink_to_original\"\n        )\n\n    def __call__(self, data: Dict) -> Dict:\n        if not self.enable:\n            return data\n        original_path = data[\"samples\"][\"metadata\"][\"filename\"]\n        original_basename = os.path.basename(original_path)\n        original_path_hash = hashlib.md5(str(original_path).encode()).hexdigest()[:5]\n        output_video_path = Path(\n            self.save_dir,\n            f\"{datetime.datetime.now().isoformat()[:5]}_{original_path_hash}_{original_basename}\",\n        )\n\n        self.save_video_with_annotations(\n            data=data,\n            output_video_path=output_video_path,\n        )\n        if self.symlink_to_original:\n            os.symlink(\n                original_path,\n                output_video_path.with_suffix(f\".original.{output_video_path.suffix}\"),\n            )\n        return data\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> None:\n        group = parser.add_argument_group(cls.__name__)\n        group.add_argument(\n            \"--video-augmentation.save-inputs.save-dir\",\n            type=str,\n            default=None,\n            help=(\n                \"Path to the folder for saving output debugging videos. Defaults to\"\n                \" None.\"\n            ),\n        )\n        group.add_argument(\n            \"--video-augmentation.save-inputs.add-labels\",\n            action=\"store_true\",\n            default=False,\n            help=(\n                \"If set, write the class label on each frame of the video. Defaults to\"\n                \" False.\"\n            ),\n        )\n        group.add_argument(\n            \"--video-augmentation.save-inputs.enable\",\n            action=\"store_true\",\n            default=False,\n            help=(\n                \"Use {}. This flag is useful when you want to study the effect of\"\n                \" different transforms. Defaults to False.\".format(cls.__name__)\n            ),\n        )\n        group.add_argument(\n            \"--video-augmentation.save-inputs.symlink-to-original\",\n            action=\"store_true\",\n            default=False,\n            help=(\n                \"If True, a symlink to original video sample will be created besides\"\n                \"the saved inputs for easier debugging. Defaults to False.\"\n            ),\n        )\n        return parser\n\n    @staticmethod\n    def _srt_format_timestamp(t: float) -> str:\n        t = int(t * 1000)\n        t, millis = divmod(t, 1000)\n        t, ss = divmod(t, 60)\n        t, mm = divmod(t, 60)\n        hh = t\n        return f\"{0 if hh<10 else ''}{hh}:{0 if mm<10 else ''}{mm}:{ss},{millis:0>3}\"\n\n    def save_video_with_annotations(\n        self,\n        data: Dict,\n        output_video_path: Path,\n    ) -> None:\n        \"\"\"Save a video with audio and captions.\n\n        Args:\n            data: Dataset output dict. Schema: {\n                \"samples\": {\n                    \"video\": Tensor[N x T X C x H x W],\n                    \"audio\": Tensor[N x T_audio x C],  # Optional\n                    \"audio_raw\": Tensor[N x T_audio x C],  # Optional - if provided,\n                                                           # \"audio\" will be ignored.\n                    \"metadata\": {\n                        \"video_fps\": Union[float,int],\n                        \"audio_fps\": Union[float,int],\n                    }\n                }\n            }\n            output_video_path: Path for saving the video.\n            get_frame_captions: A callback that receives @data as input and returns a\n               list of captions (one string per video frame). If provided, the captions\n               will be added to the output video as subtitles.\n        \"\"\"\n        video = data[\"samples\"][\"video\"]  # N x T x C x H x W\n        video = video.reshape(-1, *video.shape[2:])  # (N*T) x C x H x W\n        video_fps = data[\"samples\"][\"metadata\"][\"video_fps\"]\n\n        if \"audio_raw\" in data:\n            audio = data[\"samples\"][\"audio_raw\"]  # N x T_audio x C\n        else:\n            audio = data[\"samples\"].get(\"audio\")  # N x T_audio x C\n\n        if audio is not None:\n            audio = audio.reshape(-1, *audio.shape[2:])  # N*T_audio x C\n            audio_fps = int(round(data[\"samples\"][\"metadata\"][\"audio_fps\"]))\n\n        video = (video * 255).round().to(dtype=torch.uint8).cpu()\n        video = video.permute([0, 2, 3, 1])  # N x H x W x C\n\n        suffix = output_video_path.suffix\n        assert suffix in (\n            \".mp4\",\n            \".mov\",\n            \".mkv\",\n        ), f\"{suffix} format is not supported by SaveInputs yet.\"\n        output_video_path.parent.mkdir(exist_ok=True, parents=True)\n        if audio is not None or self.get_frame_captions is not None:\n            with tempfile.TemporaryDirectory() as tmp_dir:\n                tmp_video = Path(tmp_dir, \"video\" + suffix)\n                write_video(str(tmp_video), video_array=video, fps=video_fps)\n                command = [\"ffmpeg\", \"-i\", tmp_video]\n\n                if audio is not None:\n                    tmp_audio = str(Path(tmp_dir, \"audio.wav\"))\n                    torchaudio.save(tmp_audio, audio.transpose(0, 1), audio_fps)\n                    command.extend([\"-i\", tmp_audio])\n\n                command.extend([\"-c:v\", \"libx264\"])\n                if audio is not None:\n                    command.extend([\"-c:a\", \"aac\"])\n\n                if self.get_frame_captions:\n                    captions = self.get_frame_captions(data)\n                    tmp_srt = str(Path(tmp_dir, \"subtitle.srt\"))\n                    with open(tmp_srt, \"wt\") as srt:\n                        for i, caption in enumerate(captions):\n                            srt.write(\n                                f\"{i+1}\\n\"\n                                f\"{self._srt_format_timestamp(i / video_fps)} --> \"\n                                f\"{self._srt_format_timestamp((i+1) / video_fps)}\\n\"\n                                f\"{caption}\\n\\n\"\n                            )\n                    command.extend(\n                        [\n                            \"-vf\",\n                            f\"subtitles={tmp_srt}:force_style='Alignment=6,Fontsize=48,Outline=8'\",\n                        ]\n                    )\n\n                subprocess.check_output(\n                    [*command, f\"file:{output_video_path}\"],\n                    stderr=subprocess.PIPE,\n                )\n        else:\n            write_video(str(output_video_path), video_array=video, fps=video_fps)\n\n    def __repr__(self) -> str:\n        return (\n            \"{}(save_dir={}, add_labels={}, symlink_to_original={}, enable={})\".format(\n                self.__class__.__name__,\n                self.save_dir,\n                self.add_labels,\n                self.symlink_to_original,\n                self.enable,\n            )\n        )\n\n\n@TRANSFORMATIONS_REGISTRY.register(name=\"random_resized_crop\", type=\"video\")\nclass RandomResizedCrop(BaseTransformation):\n    \"\"\"\n    This class crops a random portion of an image and resize it to a given size.\n    \"\"\"\n\n    def __init__(self, opts, size: Union[Tuple, int], *args, **kwargs) -> None:\n        interpolation = getattr(\n            opts,\n            \"video_augmentation.random_resized_crop.interpolation\",\n        )\n        scale = getattr(opts, \"video_augmentation.random_resized_crop.scale\")\n        ratio = getattr(\n            opts,\n            \"video_augmentation.random_resized_crop.aspect_ratio\",\n        )\n\n        if not isinstance(scale, Sequence) or (\n            isinstance(scale, Sequence)\n            and len(scale) != 2\n            and 0.0 <= scale[0] < scale[1]\n        ):\n            logger.error(\n                \"--video-augmentation.random-resized-crop.scale should be a tuple of\"\n                f\" length 2 such that 0.0 <= scale[0] < scale[1]. Got: {scale}.\"\n            )\n\n        if not isinstance(ratio, Sequence) or (\n            isinstance(ratio, Sequence)\n            and len(ratio) != 2\n            and 0.0 < ratio[0] < ratio[1]\n        ):\n            logger.error(\n                \"--video-augmentation.random-resized-crop.aspect-ratio should be a\"\n                f\" tuple of length 2 such that 0.0 < ratio[0] < ratio[1]. Got: {ratio}.\"\n            )\n\n        ratio = (round(ratio[0], 3), round(ratio[1], 3))\n\n        super().__init__(opts=opts)\n\n        self.scale = scale\n        self.size = setup_size(size=size)\n\n        self.interpolation = _check_interpolation(interpolation)\n        self.ratio = ratio\n        self.enable = getattr(opts, \"video_augmentation.random_resized_crop.enable\")\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        group = parser.add_argument_group(title=cls.__name__)\n\n        group.add_argument(\n            \"--video-augmentation.random-resized-crop.enable\",\n            action=\"store_true\",\n            help=(\n                \"Use {}. This flag is useful when you want to study the effect of\"\n                \" different transforms. Defaults to False.\".format(cls.__name__)\n            ),\n        )\n        group.add_argument(\n            \"--video-augmentation.random-resized-crop.interpolation\",\n            type=str,\n            default=\"bilinear\",\n            choices=SUPPORTED_PYTORCH_INTERPOLATIONS,\n            help=\"Desired interpolation method. Defaults to bilinear\",\n        )\n        group.add_argument(\n            \"--video-augmentation.random-resized-crop.scale\",\n            type=JsonValidator(Tuple[float, float]),\n            default=(0.08, 1.0),\n            help=(\n                \"Specifies the lower and upper bounds for the random area of the crop,\"\n                \" before resizing. The scale is defined with respect to the area of the\"\n                \" original image. Defaults to (0.08, 1.0).\"\n            ),\n        )\n        group.add_argument(\n            \"--video-augmentation.random-resized-crop.aspect-ratio\",\n            type=JsonValidator(Union[float, tuple]),\n            default=(3.0 / 4.0, 4.0 / 3.0),\n            help=(\n                \"lower and upper bounds for the random aspect ratio of the crop,\"\n                \" before resizing. Defaults to (3./4., 4./3.).\"\n            ),\n        )\n        return parser\n\n    def get_params(self, height: int, width: int) -> (int, int, int, int):\n        area = height * width\n        for _ in range(10):\n            target_area = random.uniform(*self.scale) * area\n            log_ratio = (math.log(self.ratio[0]), math.log(self.ratio[1]))\n            aspect_ratio = math.exp(random.uniform(*log_ratio))\n\n            w = int(round(math.sqrt(target_area * aspect_ratio)))\n            h = int(round(math.sqrt(target_area / aspect_ratio)))\n\n            if 0 < w <= width and 0 < h <= height:\n                i = random.randint(0, height - h)\n                j = random.randint(0, width - w)\n                return i, j, h, w\n\n        # Fallback to central crop.\n        in_ratio = (1.0 * width) / height\n        if in_ratio < min(self.ratio):\n            w = width\n            h = int(round(w / min(self.ratio)))\n        elif in_ratio > max(self.ratio):\n            h = height\n            w = int(round(h * max(self.ratio)))\n        else:  # whole image\n            w = width\n            h = height\n        i = (height - h) // 2\n        j = (width - w) // 2\n        return i, j, h, w\n\n    def __call__(self, data: Dict) -> Dict:\n        clip = data[\"samples\"][\"video\"]\n        check_rgb_video_tensor(clip=clip)\n\n        height, width = clip.shape[-2:]\n\n        i, j, h, w = self.get_params(height=height, width=width)\n        data = _crop_fn(data=data, i=i, j=j, h=h, w=w)\n        return _resize_fn(data=data, size=self.size, interpolation=self.interpolation)\n\n    def __repr__(self) -> str:\n        return \"{}(scale={}, ratio={}, interpolation={}, enable={})\".format(\n            self.__class__.__name__,\n            self.scale,\n            self.ratio,\n            self.interpolation,\n            self.enable,\n        )\n\n\n@TRANSFORMATIONS_REGISTRY.register(name=\"random_short_side_resize_crop\", type=\"video\")\nclass RandomShortSizeResizeCrop(BaseTransformation):\n    \"\"\"\n    This class first randomly resizes the input video such that shortest side is between\n    specified minimum and maximum values, and then crops a desired size video.\n\n    .. note::\n        This class assumes that the video size after resizing is greater than or equal\n        to the desired size.\n    \"\"\"\n\n    def __init__(self, opts, size: Union[Tuple, int], *args, **kwargs) -> None:\n        interpolation = getattr(\n            opts,\n            \"video_augmentation.random_short_side_resize_crop.interpolation\",\n        )\n        short_size_min = getattr(\n            opts,\n            \"video_augmentation.random_short_side_resize_crop.short_side_min\",\n        )\n        short_size_max = getattr(\n            opts,\n            \"video_augmentation.random_short_side_resize_crop.short_side_max\",\n        )\n\n        if short_size_min is None:\n            logger.error(\n                \"Short side minimum value can't be None in {}\".format(\n                    self.__class__.__name__\n                )\n            )\n        if short_size_max is None:\n            logger.error(\n                \"Short side maximum value can't be None in {}\".format(\n                    self.__class__.__name__\n                )\n            )\n\n        if short_size_max <= short_size_min:\n            logger.error(\n                \"Short side maximum value should be >= short side minimum value in {}.\"\n                \" Got: {} and {}\".format(\n                    self.__class__.__name__, short_size_max, short_size_min\n                )\n            )\n\n        super().__init__(opts=opts)\n        self.short_side_min = short_size_min\n        self.size = size\n        self.short_side_max = short_size_max\n        self.interpolation = _check_interpolation(interpolation)\n        self.enable = getattr(\n            opts, \"video_augmentation.random_short_side_resize_crop.enable\"\n        )\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        group = parser.add_argument_group(title=cls.__name__)\n\n        group.add_argument(\n            \"--video-augmentation.random-short-side-resize-crop.enable\",\n            action=\"store_true\",\n            help=(\n                \"Use {}. This flag is useful when you want to study the effect of\"\n                \" different transforms. Defaults to False.\".format(cls.__name__)\n            ),\n        )\n        group.add_argument(\n            \"--video-augmentation.random-short-side-resize-crop.interpolation\",\n            type=str,\n            default=\"bilinear\",\n            choices=SUPPORTED_PYTORCH_INTERPOLATIONS,\n            help=\"Desired interpolation method. Defaults to bilinear\",\n        )\n        group.add_argument(\n            \"--video-augmentation.random-short-side-resize-crop.short-side-min\",\n            type=int,\n            default=None,\n            help=\"Minimum value for video's shortest side. Defaults to None.\",\n        )\n        group.add_argument(\n            \"--video-augmentation.random-short-side-resize-crop.short-side-max\",\n            type=int,\n            default=None,\n            help=\"Maximum value for video's shortest side. Defaults to None.\",\n        )\n        return parser\n\n    def get_params(self, height, width) -> Tuple[int, int, int, int]:\n        th, tw = self.size\n\n        if width == tw and height == th:\n            return 0, 0, height, width\n\n        i = random.randint(0, height - th)\n        j = random.randint(0, width - tw)\n        return i, j, th, tw\n\n    def __call__(self, data: Dict) -> Dict:\n        short_dim = random.randint(self.short_side_max, self.short_side_max)\n        # resize the video so that shorter side is short_dim\n        data = _resize_fn(data, size=short_dim, interpolation=self.interpolation)\n\n        clip = data[\"samples\"][\"video\"]\n        check_rgb_video_tensor(clip=clip)\n        height, width = clip.shape[-2:]\n        i, j, h, w = self.get_params(height=height, width=width)\n        # Crop the video.\n        return _crop_fn(data=data, i=i, j=j, h=h, w=w)\n\n    def __repr__(self) -> str:\n        return \"{}(size={}, short_size_range=({}, {}), interpolation={}, enable={})\".format(\n            self.__class__.__name__,\n            self.size,\n            self.short_side_min,\n            self.short_side_max,\n            self.interpolation,\n            self.enable,\n        )\n\n\n@TRANSFORMATIONS_REGISTRY.register(name=\"random_crop\", type=\"video\")\nclass RandomCrop(BaseTransformation):\n    \"\"\"\n    This method randomly crops a video area.\n\n    .. note::\n        This class assumes that the input video size is greater than or equal to the\n        desired size.\n    \"\"\"\n\n    def __init__(self, opts, size: Union[Tuple, int], *args, **kwargs) -> None:\n        size = setup_size(size=size)\n        super().__init__(opts=opts)\n        self.size = size\n        self.enable = getattr(opts, \"video_augmentation.random_crop.enable\")\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        group = parser.add_argument_group(title=cls.__name__)\n\n        group.add_argument(\n            \"--video-augmentation.random-crop.enable\",\n            action=\"store_true\",\n            help=(\n                \"Use {}. This flag is useful when you want to study the effect of\"\n                \" different transforms. Defaults to False.\".format(cls.__name__)\n            ),\n        )\n        return parser\n\n    def get_params(self, height: int, width: int) -> Tuple[int, int, int, int]:\n        th, tw = self.size\n\n        if width == tw and height == th:\n            return 0, 0, height, width\n\n        i = random.randint(0, height - th)\n        j = random.randint(0, width - tw)\n        return i, j, th, tw\n\n    def __call__(self, data: Dict) -> Dict:\n        clip = data[\"samples\"][\"video\"]\n        check_rgb_video_tensor(clip=clip)\n        height, width = clip.shape[-2:]\n        i, j, h, w = self.get_params(height=height, width=width)\n        return _crop_fn(data=data, i=i, j=j, h=h, w=w)\n\n    def __repr__(self) -> str:\n        return \"{}(crop_size={}, enable={})\".format(\n            self.__class__.__name__, self.size, self.enable\n        )\n\n\n@TRANSFORMATIONS_REGISTRY.register(name=\"random_horizontal_flip\", type=\"video\")\nclass RandomHorizontalFlip(BaseTransformation):\n    \"\"\"\n    This class implements random horizontal flipping method\n    \"\"\"\n\n    def __init__(self, opts, *args, **kwargs) -> None:\n        p = getattr(opts, \"video_augmentation.random_horizontal_flip.p\", 0.5)\n        super().__init__(opts=opts)\n        self.p = p\n        self.enable = getattr(opts, \"video_augmentation.random_horizontal_flip.enable\")\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        group = parser.add_argument_group(title=cls.__name__)\n        group.add_argument(\n            \"--video-augmentation.random-horizontal-flip.enable\",\n            action=\"store_true\",\n            help=(\n                \"Use {}. This flag is useful when you want to study the effect of\"\n                \" different transforms. Defaults to False.\".format(cls.__name__)\n            ),\n        )\n        group.add_argument(\n            \"--video-augmentation.random-horizontal-flip.p\",\n            type=float,\n            default=0.5,\n            help=\"Probability for random horizontal flip. Defaults to 0.5.\",\n        )\n        return parser\n\n    def __call__(self, data: Dict) -> Dict:\n        if random.random() <= self.p:\n            clip = data[\"samples\"][\"video\"]\n            check_rgb_video_tensor(clip=clip)\n            clip = torch.flip(clip, dims=[-1])\n            data[\"samples\"][\"video\"] = clip\n\n            mask = data.get(\"mask\", None)\n            if mask is not None:\n                mask = torch.flip(mask, dims=[-1])\n                data[\"mask\"] = mask\n\n        return data\n\n    def __repr__(self) -> str:\n        return (\n            f\"{self.__class__.__name__}(flip probability={self.p},\"\n            f\" enable={self.enable})\"\n        )\n\n\n@TRANSFORMATIONS_REGISTRY.register(name=\"center_crop\", type=\"video\")\nclass CenterCrop(BaseTransformation):\n    \"\"\"\n    This class implements center cropping method.\n\n    .. note::\n        This class assumes that the input size is greater than or equal to the desired\n        size.\n    \"\"\"\n\n    def __init__(self, opts, size: Union[Sequence, int], *args, **kwargs) -> None:\n        super().__init__(opts=opts)\n        if isinstance(size, Sequence) and len(size) == 2:\n            self.height, self.width = size[0], size[1]\n        elif isinstance(size, Sequence) and len(size) == 1:\n            self.height = self.width = size[0]\n        elif isinstance(size, int):\n            self.height = self.width = size\n        else:\n            logger.error(\"Scale should be either an int or tuple of ints.\")\n\n        self.enable = getattr(opts, \"video_augmentation.center_crop.enable\")\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        group = parser.add_argument_group(title=cls.__name__)\n\n        group.add_argument(\n            \"--video-augmentation.center-crop.enable\",\n            action=\"store_true\",\n            help=(\n                \"Use {}. This flag is useful when you want to study the effect of\"\n                \" different transforms. Defaults to False.\".format(cls.__name__)\n            ),\n        )\n        return parser\n\n    def __call__(self, data: Dict) -> Dict:\n        height, width = data[\"samples\"][\"video\"].shape[-2:]\n        i = (height - self.height) // 2\n        j = (width - self.width) // 2\n        return _crop_fn(data=data, i=i, j=j, h=self.height, w=self.width)\n\n    def __repr__(self) -> str:\n        return \"{}(size=(h={}, w={}), enable={})\".format(\n            self.__class__.__name__, self.height, self.width, self.enable\n        )\n\n\n@TRANSFORMATIONS_REGISTRY.register(name=\"resize\", type=\"video\")\nclass Resize(BaseTransformation):\n    \"\"\"\n    This class implements resizing operation.\n\n    .. note::\n    Two possible modes for resizing.\n    1. Resize while maintaining aspect ratio. To enable this option, pass int as a size.\n    2. Resize to a fixed size. To enable this option, pass a tuple of height and width\n        as a size.\n    \"\"\"\n\n    def __init__(self, opts, *args, **kwargs) -> None:\n        size = getattr(opts, \"video_augmentation.resize.size\", None)\n        if size is None:\n            logger.error(\"Size can not be None in {}\".format(self.__class__.__name__))\n\n        # Possible modes.\n        # 1. Resize while maintaining aspect ratio. To enable this option, pass int as a\n        # size.\n        # 2. Resize to a fixed size. To enable this option, pass a tuple of height and\n        # width as a size.\n\n        if isinstance(size, Sequence) and len(size) > 2:\n            logger.error(\n                \"The length of size should be either 1 or 2 in {}\".format(\n                    self.__class__.__name__\n                )\n            )\n\n        interpolation = getattr(\n            opts, \"video_augmentation.resize.interpolation\", \"bilinear\"\n        )\n        super().__init__(opts=opts)\n\n        self.size = size\n        self.interpolation = _check_interpolation(interpolation)\n        self.enable = getattr(opts, \"video_augmentation.resize.enable\")\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        group = parser.add_argument_group(title=cls.__name__)\n\n        group.add_argument(\n            \"--video-augmentation.resize.enable\",\n            action=\"store_true\",\n            help=(\n                \"Use {}. This flag is useful when you want to study the effect of\"\n                \" different transforms. Defaults to False.\".format(cls.__name__)\n            ),\n        )\n        group.add_argument(\n            \"--video-augmentation.resize.interpolation\",\n            type=str,\n            default=\"bilinear\",\n            choices=SUPPORTED_PYTORCH_INTERPOLATIONS,\n            help=\"Interpolation for resizing. Defaults to bilinear\",\n        )\n        group.add_argument(\n            \"--video-augmentation.resize.size\",\n            type=int,\n            nargs=\"+\",\n            default=None,\n            help=(\n                \"Resize video to the specified size. If int is passed, then shorter\"\n                \" side is resized to the specified size and longest side is resized\"\n                \" while maintaining aspect ratio. Defaults to None.\"\n            ),\n        )\n        return parser\n\n    def __call__(self, data: Dict) -> Dict:\n        return _resize_fn(data=data, size=self.size, interpolation=self.interpolation)\n\n    def __repr__(self) -> str:\n        return \"{}(size={}, interpolation={}, enable={})\".format(\n            self.__class__.__name__, self.size, self.interpolation, self.enable\n        )\n\n\n@TRANSFORMATIONS_REGISTRY.register(name=\"crop_by_bounding_box\", type=\"video\")\nclass CropByBoundingBox(BaseTransformation):\n    \"\"\"Crops video frames based on bounding boxes and adjusts the @targets\n    \"box_coordinates\" annotations.\n    Before cropping, the bounding boxes are expanded with @multiplier, while the\n    \"box_coordinates\" cover the original areas of the image.\n    Note that the cropped images may be padded with 0 values in the boundaries of the\n    cropped image when the bounding boxes are near the edges.\n\n    Frames with invalid bounding boxes (with x0=y0=x1=y1=-1, or with area <5) will be\n    blacked out in the output. Alternatively, we could have dropped them, which is not\n    implemented yet.\n    \"\"\"\n\n    BBOX_MIN_AREA = 5  # Minimum valid bounding box area (in pixels).\n\n    def __init__(\n        self,\n        opts: argparse.Namespace,\n        image_size: Optional[Tuple[int, int]] = None,\n        is_training: bool = False,\n        *args,\n        **kwargs,\n    ) -> None:\n        super().__init__(opts=opts, *args, **kwargs)\n        self.is_training = is_training\n        self.multiplier = getattr(\n            opts, \"video_augmentation.crop_by_bounding_box.multiplier\"\n        )\n        self.multiplier_range = getattr(\n            opts, \"video_augmentation.crop_by_bounding_box.multiplier_range\"\n        )\n        if image_size is None:\n            self.image_size = getattr(\n                opts, \"video_augmentation.crop_by_bounding_box.image_size\"\n            )\n        else:\n            self.image_size = image_size\n            assert image_size is not None, (\n                \"Please provide --video-augmentation.crop-by-bounding-box.image_size\"\n                \" argument.\"\n            )\n        self.channel_first = getattr(\n            opts, \"video_augmentation.crop_by_bounding_box.channel_first\"\n        )\n        self.interpolation = getattr(\n            opts, \"video_augmentation.crop_by_bounding_box.interpolation\"\n        )\n\n    def __call__(self, data: Dict, *args, **kwargs) -> Dict:\n        \"\"\"\n        Tensor shape abbreviations:\n            N: Number of clips.\n            T, T_audio, T_video: Temporal lengths.\n            C: Number of color channels.\n            H, W: Height, Width.\n\n        Args:\n            data: mapping of: {\n                \"samples\": {\n                    \"video\": Tensor of shape: [N, C, T, H, W] if self.channel_first else [N, T, C, H, W]\n                },\n                \"targets\": {\n                    \"traces\": {\n                        \"<object_trace_uuid>\": {\n                            \"box_coordinates\": FloatTensor[N, T, 4],  # x0, y0, x1, y1\n                        }\n                    },\n                    \"labels\": IntTensor[N, T],\n                }\n            }\n\n        Note:\n            This transformation does not modify the \"labels\". If frames that are\n            blacked out due to having invalid bounding boxes need a different label,\n            datasets should alter the labels according to the following logic:\n            ```\n                data = CropByBoundingBox(opts)(data)\n                trace, = data[\"targets\"][\"traces\"].values()\n                is_blacked_out = torch.all(trace[\"box_coordinates\"] == -1, dim=2)\n                data[\"targets\"][\"labels\"][is_blacked_out] = <custom_label>\n            ```\n        \"\"\"\n\n        traces = data[\"targets\"][\"traces\"]\n        trace_identity = random.choice(list(traces.keys()))\n        trace = traces[trace_identity]\n        video = data[\"samples\"][\"video\"]\n        if self.channel_first:\n            video = video.movedim(2, 1)\n\n        N, T, C, H, W = video.shape\n        expected_box_coordinates_shape = (N, T, 4)\n\n        box_coordinates = trace[\"box_coordinates\"]\n        assert box_coordinates.shape == expected_box_coordinates_shape, (\n            f\"Unexpected shape {trace['box_coordinates'].shape} !=\"\n            f\" {expected_box_coordinates_shape}\"\n        )\n        if self.is_training and self.multiplier_range is not None:\n            multiplier = random.uniform(*self.multiplier_range)\n        else:\n            multiplier = self.multiplier\n\n        expanded_corners, box_coordinates = self.expand_boxes(\n            trace[\"box_coordinates\"], multiplier, height=H, width=W\n        )  # (NxTx4, NxTx4)\n\n        expanded_corners = (\n            (expanded_corners * torch.tensor([W, H, W, H]).float()).round().int()\n        )  # NxTx4\n\n        result = torch.empty(\n            [N * T, C, *self.image_size],\n            dtype=video.dtype,\n            device=video.device,\n        )\n        for images, crop_corners, result_placeholder in zip(\n            video.reshape(-1, C, H, W), expanded_corners.reshape(-1, 4).tolist(), result\n        ):\n            # TODO: add video_augmentation.crop_by_bounding_box.antialias argument to\n            # experiment on antialias parameter of torchvision's resize function.\n            width = crop_corners[2] - crop_corners[0]\n            height = crop_corners[3] - crop_corners[1]\n            if (\n                width * height < CropByBoundingBox.BBOX_MIN_AREA\n                or width < 0\n                or height < 0\n            ):\n                # If the bounding box is invalid or too small, avoid cropping.\n                result_placeholder[...] = 0.0  # Create black frames\n            else:\n                result_placeholder[...] = FV.resized_crop(\n                    images,\n                    left=crop_corners[0],\n                    top=crop_corners[1],\n                    width=width,\n                    height=height,\n                    size=self.image_size,\n                    interpolation=InterpolationMode[self.interpolation.upper()],\n                    antialias=True,\n                )\n        data[\"samples\"][\"video\"] = result.reshape(N, T, C, *self.image_size)\n        data[\"targets\"][\"traces\"] = {\n            trace_identity: {**trace, \"box_coordinates\": box_coordinates}\n        }\n        return data\n\n    def expand_boxes(\n        self, box_coordinates: torch.Tensor, multiplier: float, width: int, height: int\n    ) -> Tuple[torch.Tensor, torch.Tensor]:\n        \"\"\"\n        Args:\n            box_coordinates: Tensor of shape [..., 4] with (x0, y0, x1, y1) in [0,1].\n            multiplier: The multiplier to expand the bounding box coordinates.\n\n        Outputs (tuple items):\n            expanded_corners: Tensor of shape [..., 4] with (x0, y0, x1, y1), containing\n                the coordinates for cropping. Because of the expansion, coordinates\n                could be negative or >1.\n            box_coordinates: Tensor of shape [..., 4] with (x0, y0, x1, y1) in [0,1] to\n                be used as bounding boxes after cropping.\n            height: Height of the frame (in pixels).\n            width: Width of the frame (in pixels).\n        \"\"\"\n        x0 = box_coordinates[..., 0]  # Shape: NxT\n        y0 = box_coordinates[..., 1]\n        x1 = box_coordinates[..., 2]\n        y1 = box_coordinates[..., 3]\n        area = (x1 - x0) * width * (y1 - y0) * height\n        invisible_mask = area < CropByBoundingBox.BBOX_MIN_AREA\n\n        dw = (x1 - x0) * (multiplier - 1) / 2\n        dh = (y1 - y0) * (multiplier - 1) / 2\n        expanded_corners = torch.stack(\n            [\n                x0 - dw,\n                y0 - dh,\n                x1 + dw,\n                y1 + dh,\n            ],\n            dim=-1,\n        )\n\n        # If multiplier is 1, new box_coordinates should cover the whole image (i.e.\n        # [0., 0., 1., 1.]), as image was cropped based on the box_coordinates. For\n        # multiplier > 1, new box_coordinates should have a small margin within the\n        # boundaries (i.e. [new_x0, new_y0, 1-new_x0, 1-new_y0]).\n        box_coordinates = torch.empty_like(box_coordinates)\n        box_coordinates[..., :2] = self.get_new_x0(multiplier)\n        box_coordinates[..., 2:] = 1 - box_coordinates[..., :2]\n        expanded_corners[invisible_mask] = -1\n        box_coordinates[invisible_mask] = -1\n        return expanded_corners, box_coordinates\n\n    @classmethod\n    def get_new_x0(cls, multiplier: float) -> float:\n        # new_width = old_width * multiplier\n        # new_x0 = [(new_width - old_width) / 2] / new_width\n        # => new_x0 = (1 - 1/multiplier) / 2\n        return (1 - 1 / multiplier) / 2\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        group = parser.add_argument_group(cls.__name__)\n        group.add_argument(\n            \"--video-augmentation.crop-by-bounding-box.enable\",\n            action=\"store_true\",\n            help=(\n                \"Use {}. This flag is useful when you want to study the effect of\"\n                \" different transforms. Default to False.\".format(cls.__name__)\n            ),\n        )\n        group.add_argument(\n            \"--video-augmentation.crop-by-bounding-box.image-size\",\n            type=JsonValidator(Tuple[int, int]),\n            default=None,\n            help=(\n                \"Sizes [height, width] of the video frames after cropping. Defaults to\"\n                \" None\"\n            ),\n        )\n        group.add_argument(\n            \"--video-augmentation.crop-by-bounding-box.channel-first\",\n            action=\"store_true\",\n            default=False,\n            help=(\n                \"If true, the video shape is [N, C, T, H, W]. Otherwise:\"\n                \" [N, T, C, H, W]. Defaults to False.\"\n            ),\n        ),\n        group.add_argument(\n            \"--video-augmentation.crop-by-bounding-box.multiplier-range\",\n            type=float,\n            nargs=2,\n            default=None,\n            help=(\n                \"The bounding boxes get randomly expanded within the range before\"\n                \" cropping. Useful for zooming in/out. Default None means no expansion\"\n                \" of the bounding box.\"\n            ),\n        )\n        group.add_argument(\n            \"--video-augmentation.crop-by-bounding-box.multiplier\",\n            type=float,\n            default=1,\n            help=(\n                \"The bounding boxes get expanded by this multiplier before cropping.\"\n                \" Useful for zooming in/out. Defaults to 1.\"\n            ),\n        )\n        group.add_argument(\n            \"--video-augmentation.crop-by-bounding-box.interpolation\",\n            type=str,\n            default=\"bilinear\",\n            choices=SUPPORTED_PYTORCH_INTERPOLATIONS,\n            help=\"Desired interpolation method. Defaults to bilinear.\",\n        )\n\n        return parser\n\n    def __repr__(self) -> str:\n        return \"{}(image size={}, channel_first={}, multiplier={})\".format(\n            self.__class__.__name__,\n            self.image_size,\n            self.channel_first,\n            self.multiplier,\n        )\n\n\n@TRANSFORMATIONS_REGISTRY.register(name=\"shuffle-audios\", type=\"video\")\nclass ShuffleAudios(BaseTransformation):\n    def __init__(\n        self,\n        opts: argparse.Namespace,\n        is_training: bool,\n        is_evaluation: bool,\n        item_index: int,\n        *args,\n        **kwargs,\n    ) -> None:\n        \"\"\"Transforms a batch of audio-visual clips. Generates binary labels, useful for\n        self-supervised audio-visual training.\n\n        At each invocation, a subset of clips within video (batch) get their audios\n        shuffled. The ratio of clips that participate in the shuffling is configurable\n        by argparse options.\n\n        When training, the shuffle order is random. When evaluating, the shuffle order\n        is deterministic.\n\n        Args:\n            is_training: When False, decide to shuffle the audios or not\n                deterministically.\n            is_evaluation: Combined with @is_training, determines which shuffle ratio\n                argument to use (train/val/eval).\n            item_index: Used for deterministic shuffling based on the item_index.\n        \"\"\"\n        super().__init__(opts, *args, **kwargs)\n        self.item_index = item_index\n        self.is_training = is_training\n        if is_training:\n            self.shuffle_ratio = getattr(\n                opts, \"video_augmentation.shuffle_audios.shuffle_ratio_train\"\n            )\n        elif is_evaluation:\n            self.shuffle_ratio = getattr(\n                opts, \"video_augmentation.shuffle_audios.shuffle_ratio_test\"\n            )\n        else:\n            self.shuffle_ratio = getattr(\n                opts, \"video_augmentation.shuffle_audios.shuffle_ratio_val\"\n            )\n        self.generate_frame_level_targets = getattr(\n            opts,\n            \"video_augmentation.shuffle_audios.generate_frame_level_targets\",\n        )\n        self.target_key = getattr(opts, \"video_augmentation.shuffle_audios.target_key\")\n        self.debug_mode = getattr(opts, \"video_augmentation.shuffle_audios.debug_mode\")\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        group = parser.add_argument_group(title=cls.__name__)\n        group.add_argument(\n            \"--video-augmentation.shuffle-audios.shuffle-ratio-train\",\n            type=float,\n            default=0.5,\n            help=(\n                \"Ratio of training videos with shuffled audio samples. Defaults to 0.5.\"\n            ),\n        )\n        group.add_argument(\n            \"--video-augmentation.shuffle-audios.shuffle-ratio-val\",\n            type=float,\n            default=0.5,\n            help=(\n                \"Ratio of validation videos with shuffled audio samples. Defaults to \"\n                \" 0.5.\"\n            ),\n        )\n        group.add_argument(\n            \"--video-augmentation.shuffle-audios.shuffle-ratio-test\",\n            type=float,\n            default=0.5,\n            help=\"Ratio of test videos with shuffled audio samples. Defaults to 0.5.\",\n        )\n        group.add_argument(\n            \"--video-augmentation.shuffle-audios.generate-frame-level-targets\",\n            default=False,\n            action=\"store_true\",\n            help=(\n                \"If true, the generated targets will be 2-dimensional (n_clips x \"\n                \"n_frames). Otherwise, targets will be 1 dimensional (n_clips).\"\n                \" Defaults to False.\"\n            ),\n        )\n        group.add_argument(\n            \"--video-augmentation.shuffle-audios.target-key\",\n            default=\"is_shuffled\",\n            type=str,\n            help=(\n                \"Defaults to 'is_shuffled'. Name of the sub-key in data['targets'] \"\n                \" to store the labels tensor. For each clip index `i`, we will have\"\n                \" data['targets']['is_shuffled'][i] == 0 iff audio of the clip matches\"\n                \" the video, otherwise 1.\"\n            ),\n        )\n        group.add_argument(\n            \"--video-augmentation.shuffle-audios.debug-mode\",\n            default=False,\n            action=\"store_true\",\n            help=(\n                \"If enabled, the permutation used for shuffling the clip audios will be\"\n                \" added to data['samples']['metadata']['shuffled_audio_permutation']\"\n                \" for debugging purposes. Defaults to False.\"\n            ),\n        )\n\n        return parser\n\n    @staticmethod\n    def _single_cycle_permutation(\n        numel: int, is_training: bool, device: torch.device\n    ) -> torch.LongTensor:\n        \"\"\"\n        Returns a permutation of values 0 to @numel-1 that has the following property:\n        For each index 0 <= i < numel: result[i] != i.\n\n        Args:\n            numel: Number of elements in the output permutation (must be >1).\n            is_training: If true, the output permutation will be deterministic.\n            device: Torch device (e.g. cuda, cpu) to use for output tensor.\n        \"\"\"\n        assert numel > 1, \"Cannot create a single-cycle permutation with <= 1 elements.\"\n\n        deterministic_single_cycle_perm = torch.roll(\n            torch.arange(numel, device=device), numel // 2\n        )\n        if not is_training:\n            return deterministic_single_cycle_perm\n\n        random_perm = torch.randperm(numel, device=device)\n\n        random_perm_inv = torch.empty_like(random_perm)\n        random_perm_inv[random_perm] = torch.arange(numel, device=device)\n\n        # Proof that this implementation satisfies output[i] != i criteria:\n        # 1. We know deterministic_single_cycle_perm[i] != i, because of the way it is\n        #    constructed ([n//2, n//2+1, ..., n, 1, 2, ..., n//2-1]).\n        # 2. ``rand_perm`` is a non-deterministic random permutation, and\n        #    ``rand_perm_inv`` is the inverse of `rand_perm`. That means for each\n        #    0 <= i < numel, we have: rand_perm_inv[rand_perm[i]] == i.\n        # 3. Proof by contradiction: Let's assume, for 0 <= i < numel, i == output[i]:\n        #    Thus: random_perm[deterministic_single_cycle_perm[random_perm_inv]][i] == i\n        # 4. For any two torch tensors a, b that expression `a[b]`` is valid, we have\n        #    a[b][i] == a[b[i]]. Thus, we can rewrite the assumption of step 3 as:\n        #    i == random_perm[deterministic_single_cycle_perm[random_perm_inv[i]]]\n        # 5. Now, apply rand_perm_inv[] on both sides of the equality:\n        #    rand_perm_inv[i] == deterministic_single_cycle_perm[random_perm_inv[i]]\n        #    Then, alias rand_perm_inv[i] as x. Then we will have:\n        #    x == deterministic_single_cycle_perm[x]\n        # 6. Assumption of step (3) leads to (5) which contradicts (1). Thus, assumption\n        #    of step (3) is false. Thus, output[i] != i\n        return random_perm[deterministic_single_cycle_perm[random_perm_inv]]\n\n    def _random_outcome(self, n: int) -> torch.Tensor:\n        \"\"\"Returns a pseudo random tensor of size n in range [0, 1]. For evaluation,\n        the outcome is a deterministic function of n and `self.item_index`\n\n        Args:\n            n: Length of the output tensor.\n\n        Returns: A tensor of length n, of random floats uniformly distributed between\n            0-1. The output is deterministic iff self.is_training is False.\n        \"\"\"\n        if self.is_training:\n            return torch.rand(n)\n        else:\n            return (\n                (((self.item_index + 1) % torch.pi) * (torch.arange(n) + 1)) % torch.pi\n            ) / torch.pi\n\n    def _random_participants_mask(self, n: int) -> torch.BoolTensor:\n        \"\"\"Returns a pseudo random boolean tensor of size n, where exactly ``int(\n        self.shuffle_ratio * n)`` indices are True, and the rest are False.\n        \"\"\"\n        x = self._random_outcome(n)\n        x = x.argsort() < self.shuffle_ratio * n - 1e-8\n        return x\n\n    def __call__(self, data: Dict) -> Dict:\n        audio = data[\"samples\"][\"audio\"]\n        N = len(audio)\n        if N == 1:\n            shuffled_permutation = torch.tensor([0], device=audio.device)\n            is_shuffling_participant_mask = torch.tensor([False], device=audio.device)\n        elif N > 1:\n            shuffled_permutation = self._single_cycle_permutation(\n                N, device=audio.device, is_training=self.is_training\n            )\n            is_shuffling_participant_mask = self._random_participants_mask(N)\n            shuffled_permutation = torch.where(\n                is_shuffling_participant_mask,\n                shuffled_permutation,\n                torch.arange(N),\n            )\n        else:\n            raise ValueError(\"Insufficient clips (N={N}) in batch.\")\n\n        data[\"samples\"][\"audio\"] = audio[shuffled_permutation]\n        if self.debug_mode:\n            data[\"samples\"][\"metadata\"][\n                \"shuffled_audio_permutation\"\n            ] = shuffled_permutation\n\n        target_dims = 2 if self.generate_frame_level_targets else 1\n        labels = torch.zeros(\n            data[\"samples\"][\"video\"].shape[:target_dims],\n            device=audio.device,\n            dtype=torch.long,\n        )\n        labels[is_shuffling_participant_mask] = 1.0  # 1 means shuffled\n        data[\"targets\"][self.target_key] = labels\n        return data\n"
  },
  {
    "path": "corenet/data/video_reader/__init__.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\n\nfrom corenet.data.video_reader.base_av_reader import BaseAVReader\nfrom corenet.utils import logger\nfrom corenet.utils.ddp_utils import is_master\nfrom corenet.utils.registry import Registry\n\nVIDEO_READER_REGISTRY = Registry(\n    \"video_reader\",\n    base_class=BaseAVReader,\n    lazy_load_dirs=[\"corenet/data/video_reader\"],\n    internal_dirs=[\"corenet/internal\", \"corenet/internal/projects/*\"],\n)\n\n\ndef arguments_video_reader(parser: argparse.ArgumentParser):\n    parser = BaseAVReader.add_arguments(parser=parser)\n\n    # add video reader specific arguments\n    parser = VIDEO_READER_REGISTRY.all_arguments(parser)\n    return parser\n\n\ndef get_video_reader(\n    opts: argparse.Namespace, log: bool = True, *args, **kwargs\n) -> BaseAVReader:\n    \"\"\"Helper function to build the video reader from command-line arguments.\n\n    Args:\n        opts: Command-line arguments\n        log: When True, the video reader details will be logged to stdout.\n    \"\"\"\n\n    video_reader_name = getattr(opts, \"video_reader.name\")\n\n    # We registered the base class using a special `name` (i.e., `__base__`)\n    # in order to access the arguments defined inside those classes. However, these classes are not supposed to\n    # be used. Therefore, we raise an error for such cases\n    if video_reader_name == \"__base__\":\n        logger.error(\"__base__ can't be used as a projection name. Please check.\")\n\n    video_reader = VIDEO_READER_REGISTRY[video_reader_name](opts, *args, **kwargs)\n\n    is_master_node = is_master(opts)\n    if log and is_master_node:\n        logger.log(\"Video reader details: \")\n        print(\"{}\".format(video_reader))\n    return video_reader\n"
  },
  {
    "path": "corenet/data/video_reader/base_av_reader.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nimport random\nfrom typing import Dict, Optional, Tuple, Union\n\nimport av\nimport numpy\nimport torch\nimport torch.nn.functional as F\nfrom torch import Tensor\n\nfrom corenet.data.transforms import BaseTransformation\nfrom corenet.data.transforms import image_pil as T\nfrom corenet.data.transforms.common import Compose\nfrom corenet.options.utils import (\n    extend_selected_args_with_prefix,\n    extract_opts_with_prefix_replacement,\n)\nfrom corenet.utils import logger\n\n\nclass VideoDurationDoesNotMatchAudioDurationError(AssertionError):\n    pass\n\n\naudio_video_duration_warnings = set()\n\n\ndef check_audio_video_duration(\n    vid_filename: str, audio_sec: float, video_sec: float\n) -> None:\n    \"\"\"Check audio/video alignment, throw an exception or print a warning if it is off.\"\"\"\n    difference = numpy.fabs(audio_sec - video_sec)\n    if difference > 0.1:\n        message = f\"Audio duration {audio_sec} mismatches video duration {video_sec} for {vid_filename}\"\n        if difference > 0.2:\n            raise VideoDurationDoesNotMatchAudioDurationError(message)\n        if vid_filename not in audio_video_duration_warnings:\n            audio_video_duration_warnings.add(vid_filename)\n            logger.warning(message)\n\n\nclass BaseAVReader(object):\n    \"\"\"\n    Base AudioVideo Reader\n\n    Args:\n        opts: command line arguments\n        is_training: Training or validation mode. Default: `False`.\n    \"\"\"\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        if (\n            cls != BaseAVReader\n        ):  # Shouldn't run for subclasses that don't override add_arguments\n            return parser\n\n        group = parser.add_argument_group(title=cls.__name__)\n        group.add_argument(\n            \"--video-reader.name\",\n            type=str,\n            default=\"pyav\",\n            help=\"Name of video reader.\",\n        )\n        group.add_argument(\n            \"--video-reader.fast-video-decoding\",\n            action=\"store_true\",\n            help=\"Multi-threaded fast video decoding using pyav.\",\n        )\n        group.add_argument(\n            \"--video-reader.frame-stack-format\",\n            type=str,\n            default=\"sequence_first\",\n            choices=[\"sequence_first\", \"channel_first\"],\n            help=\"Sequence first (NTCHW) or channel first (NCTHW) format for stacking\"\n            \" video frames.\",\n        )\n        # We want to be able to re-use the \"image\" augmentations on the video frames.\n        # As the use of \"--image-augmentation.*\" argparse prefix for video datasets can\n        # be confusing, we use \"--frame-augmentation.*\" prefix.\n        parser = extend_selected_args_with_prefix(\n            parser,\n            match_prefix=\"--image-augmentation.\",\n            additional_prefix=\"--frame-augmentation.\",\n        )\n        return parser\n\n    def __init__(\n        self,\n        opts: argparse.Namespace,\n        is_training: Optional[bool] = False,\n        *args,\n        **kwargs,\n    ):\n        super().__init__()\n        self.opts = opts\n        self.fast_decoding = getattr(opts, \"video_reader.fast_video_decoding\")\n        frame_stack_format = getattr(\n            opts, \"video_reader.frame_stack_format\", \"sequence_first\"\n        )\n\n        if frame_stack_format not in [\"sequence_first\", \"channel_first\"]:\n            logger.error(\n                \"Frame stacking format should be either sequence_first or channel_first.\"\n            )\n        self.channel_first_format = frame_stack_format == \"channel_first\"\n\n        self.frame_transforms = self.get_frame_transform(opts, is_training=is_training)\n\n        self.num_frames_cache = dict()\n\n    @staticmethod\n    def get_frame_transform(\n        opts: argparse.Namespace, is_training: bool, *args, **kwargs\n    ) -> BaseTransformation:\n        if is_training:\n            auto_augment = getattr(\n                opts,\n                \"frame_augmentation.auto_augment.enable\",\n            )\n            rand_augment = getattr(\n                opts,\n                \"frame_augmentation.rand_augment.enable\",\n            )\n            random_erase = getattr(\n                opts,\n                \"frame_augmentation.random_erase.enable\",\n            )\n        # We want to be able to re-use the \"image\" augmentations on the video frames.\n        # As the use of \"--image-augmentation.*\" argparse prefix for video datasets can\n        # be confusing, we use \"--frame-augmentation.*\" prefix.\n        frame_opts = extract_opts_with_prefix_replacement(\n            opts,\n            match_prefix=\"frame_augmentation.\",\n            replacement_prefix=\"image_augmentation.\",\n        )\n        if is_training:\n            aug_list = []\n            if auto_augment and rand_augment:\n                logger.error(\n                    \"AutoAugment and RandAugment are mutually exclusive. Use either of\"\n                    \" them, but not both.\"\n                )\n            elif auto_augment:\n                aug_list.append(T.AutoAugment(opts=frame_opts))\n            elif rand_augment:\n                aug_list.append(T.RandAugment(opts=frame_opts))\n\n            aug_list.append(T.ToTensor(opts=frame_opts))\n\n            if random_erase:\n                aug_list.append(T.RandomErasing(opts=frame_opts))\n\n            return Compose(opts=frame_opts, img_transforms=aug_list)\n        else:\n            return T.ToTensor(opts=frame_opts)\n\n    def __repr__(self):\n        return \"{}(\\n\\tfast_decoding={}\\n\\tchannel_first_format={}\\n)\".format(\n            self.__class__.__name__,\n            self.fast_decoding,\n            self.channel_first_format,\n        )\n\n    def check_video(self, filename: str) -> bool:\n        try:\n            # Adapted from basic demo: https://pyav.org/docs/stable/#basic-demo\n            with av.open(filename) as container:\n                # Decode the first video channel.\n                for frame in container.decode(video=0):\n                    frame_idx = frame.index\n                    break\n                return True\n        except Exception as e:\n            return False\n\n    def read_video(\n        self,\n        filename: str,\n        stream_idx: int = 0,\n        audio_sample_rate: int = -1,\n        custom_frame_transforms: Optional[BaseTransformation] = None,\n        video_only: bool = False,\n        *args,\n        **kwargs,\n    ) -> Dict:\n        raise NotImplementedError\n\n    def build_video_metadata(\n        self, video_path: str\n    ) -> Dict[str, Union[str, float, int]]:\n        \"\"\"Generate the metadata for a given video.\n\n        Args:\n            video_path: A video file path.\n\n        Returns:\n            The metadata of the corresponding video. The generated metadata format is:\n            {\n                \"filename\": <str>,\n                \"video_fps\": <float>,\n                \"total_video_frames\" <int>,\n                \"video_duration\": <float>,\n            }\n        \"\"\"\n        raise NotImplementedError\n\n    def num_frames(self, filename: str) -> int:\n        if filename in self.num_frames_cache:\n            return self.num_frames_cache[filename]\n        else:\n            with av.open(filename) as container:\n                total_frames = container.streams.video[0].frames\n            self.num_frames_cache[filename] = total_frames\n            return total_frames\n\n    @staticmethod\n    def random_sampling(\n        total_video_frames: int,\n        video_frames_per_clip: int,\n        clips_per_video: int,\n        total_audio_frames: Optional[int] = None,\n    ) -> Tuple[Tensor, Optional[Tensor]]:\n        \"\"\"\n        For a given video, sample `clips_per_video` indices randomly along with aligned\n        audio indices (optionally).\n\n        Args:\n            total_video_frames : number of video frames in the given video.\n            video_frames_per_clip : number of frames required per clip.\n            clips_per_video : number of clips needed from a given video.\n            total_audio_frames : number of audio frames in the given video.\n\n        Return:\n            vclip_ids : indices corresponding to video frames [Tensor (clips_per_video x\n                video_frames_per_clip)].\n            aclip_ids : indices corresponding to audio frames [Tensor (clips_per_video x\n                audio_frames_per_clip)].\n        \"\"\"\n        clip_start_frame_ids = torch.randint(\n            total_video_frames - video_frames_per_clip + 1, (clips_per_video,)\n        )\n        vclip_ids = clip_start_frame_ids[:, None] + torch.arange(video_frames_per_clip)\n\n        aclip_ids = None\n        if total_audio_frames is not None:\n            a_start_frame = (\n                clip_start_frame_ids * total_audio_frames / total_video_frames\n            ).long()\n            a_step_size = int(\n                video_frames_per_clip * total_audio_frames / total_video_frames\n            )\n            aclip_ids = a_start_frame[:, None] + torch.arange(a_step_size)\n        return vclip_ids, aclip_ids\n\n    @staticmethod\n    def uniform_sampling(\n        total_video_frames: int,\n        video_frames_per_clip: int,\n        clips_per_video: int,\n        total_audio_frames: Optional[int] = None,\n    ) -> Tuple[Tensor, Optional[Tensor]]:\n        \"\"\"\n        For a given video, sample `clips_per_video` indices uniformly along with aligned\n        audio indices (optionally).\n\n        Args:\n            total_video_frames : number of video frames in the given video.\n            video_frames_per_clip : number of frames required per clip.\n            clips_per_video : number of clips needed from a given video.\n            total_audio_frames : number of audio frames in the given video.\n\n        Return:\n            vclip_ids : indices corresponding to video frames [Tensor (clips_per_video x\n                video_frames_per_clip)].\n            aclip_ids : indices corresponding to audio frames [Tensor (clips_per_video x\n                audio_frames_per_clip)].\n        \"\"\"\n        clip_start_frame_ids = torch.linspace(\n            0, total_video_frames - video_frames_per_clip, clips_per_video\n        )\n        vclip_ids = (\n            clip_start_frame_ids[:clips_per_video, None]\n            + torch.arange(video_frames_per_clip)\n        ).long()\n\n        aclip_ids = None\n        if total_audio_frames is not None:\n            a_start_frame = (\n                clip_start_frame_ids * total_audio_frames / total_video_frames\n            ).long()\n            a_step_size = int(\n                video_frames_per_clip * total_audio_frames / total_video_frames\n            )\n            aclip_ids = a_start_frame[:clips_per_video, None] + torch.arange(\n                a_step_size\n            )\n        return vclip_ids, aclip_ids\n\n    def read_video_file_into_clips(\n        self,\n        vid_filename: str,\n        num_frames_per_clip: int,\n        clips_per_video: int,\n        is_training: bool,\n        video_only: bool = False,\n        output_video_fps: float = -1,\n        output_audio_fps: int = -1,\n        num_samples_per_clip: int = 1,\n        custom_frame_transforms: Optional[BaseTransformation] = None,\n        *args,\n        **kwargs,\n    ) -> Dict:\n        \"\"\"Read a video file into clips and sample the clips at the specified\n        video/audio frame rate. First, we read all the video and audio frames into the\n        memory, where audio is at `output_audio_fps` if specified; then we sample\n        `clips_per_video` clips from the entire video/audio tensor. If the desired video\n        frame rate is specified, we subsample the video at frame rate\n        `output_video_fps`. Despite whether the video is subsampled or not, there are\n        `num_frames_per_clip` video frames in each clip.\n\n        Args:\n            vid_filename: The path of the video to be read.\n            num_frames_per_clip: Number of frames per clip to read.\n            clips_per_video: Number of clips to read for each video.\n            is training: A boolean of whether the model is in training.\n            output_video_fps: The frame rate of the output video. Default is -1, which\n                means no resampling is required.\n            output_audio_fps: The frame rate of the output audio. Default is -1, which\n                means no resampling is required.\n            num_samples_per_clip: Number of random samples to generate per clip.\n            custom_frame_transforms: If provided, the transformation will be used\n                instead of the default @BaseAVReader.get_frame_transforms.\n                Note: Be careful when customizing frame transforms, because there might\n                    exist slight differences between the data type of frames read by\n                    different AVReaders before ToTensor() gets applied.\n\n        Tensor shape abbreviations:\n            N: Number of clips.\n            T, T_audio, T_video: Temporal lengths.\n            C: Number of color channels.\n            H, W: Height, Width.\n\n        Returns: A dictionary of the following format {\n            \"audio\": Tensor [N,T_audio,C],\n            \"video\": Tensor [N,T_video,C,H,W],\n            metadata: {\n                \"audio_fps\": float,\n                \"video_fps\": float,\n                \"filename\": str,\n                \"video_frame_timstamps\": Tensor[N,T_video]\n            },\n        }\n        \"\"\"\n\n        av_data = self.read_video(\n            vid_filename,\n            audio_sample_rate=output_audio_fps,\n            video_only=video_only,\n            custom_frame_transforms=custom_frame_transforms,\n            # At this stage, we read the video with its original frame rate, so that\n            # we can introduce small perterbations in the frame selection process\n            # (i.e. down sampling) during training.\n            video_fps=-1,\n        )\n        torch_video = av_data[\"video\"]\n        torch_audio = av_data[\"audio\"]\n        metadata = av_data[\"metadata\"]\n        original_video_fps = metadata[\"video_fps\"]\n        audio_fps = metadata[\"audio_fps\"]\n\n        assert isinstance(\n            torch_video, Tensor\n        ), f\"Video read from {vid_filename} expected to be a tensor.\"\n\n        num_video_frames = torch_video.shape[0]\n        # If we need to downsample the frames, read the video frames the same length in\n        # second, then downsample output frames.\n        if output_video_fps > 0:\n            clip_duration = num_frames_per_clip / output_video_fps\n            num_video_frames_to_sample = min(\n                num_video_frames,\n                round(clip_duration * original_video_fps),\n            )\n            metadata[\"video_fps\"] = output_video_fps\n        # If no frame resampling is required, read @num_frames_per_clip\n        # consecutive frames.\n        else:\n            num_video_frames_to_sample = num_frames_per_clip\n            clip_duration = num_frames_per_clip / original_video_fps\n\n        if torch_audio is None:\n            num_audio_frames = None\n        else:\n            num_audio_frames = torch_audio.shape[0]\n            check_audio_video_duration(\n                vid_filename,\n                num_audio_frames / audio_fps,\n                num_video_frames / original_video_fps,\n            )\n\n        if num_video_frames >= num_frames_per_clip:\n            sampling_fn = self.random_sampling if is_training else self.uniform_sampling\n            vclip_ids, aclip_ids = sampling_fn(\n                total_video_frames=num_video_frames,\n                video_frames_per_clip=num_video_frames_to_sample,\n                clips_per_video=clips_per_video,\n                total_audio_frames=num_audio_frames,\n            )\n        else:\n            vclip_ids = aclip_ids = None\n\n        num_samples_per_clip = num_samples_per_clip if is_training else 1\n        video_clips, metadata = self._generate_video_clips(\n            full_video_tensor=torch_video,\n            vclip_ids=vclip_ids,\n            metadata=metadata,\n            clips_per_video=clips_per_video,\n            num_frames_per_clip=num_frames_per_clip,\n            original_video_fps=original_video_fps,\n            output_video_fps=output_video_fps,\n            is_training=is_training,\n            num_samples_per_clip=num_samples_per_clip,\n        )\n\n        if torch_audio is None:\n            audio_clips = None\n        else:\n            audio_clips = self._generate_audio_clips(\n                full_audio_tensor=torch_audio,\n                aclip_ids=aclip_ids,\n                clip_duration=clip_duration,\n                clips_per_video=clips_per_video,\n                audio_fps=audio_fps,\n                num_samples_per_clip=num_samples_per_clip,\n            )\n\n        if audio_clips is not None:\n            assert (\n                video_clips.shape[0] == audio_clips.shape[0]\n            ), f\"Video and audio doesn't have the same number of clips, got {video_clips.shape[0]} and {audio_clips.shape[0]}.\"\n\n        return {\n            \"video\": video_clips,\n            \"audio\": audio_clips,\n            \"metadata\": metadata,\n        }\n\n    def _generate_video_clips(\n        self,\n        full_video_tensor: torch.Tensor,\n        vclip_ids: Optional[torch.Tensor],\n        metadata: Dict,\n        num_frames_per_clip: int,\n        clips_per_video: int,\n        original_video_fps: float,\n        output_video_fps: float,\n        is_training: bool,\n        num_samples_per_clip: Optional[int],\n    ) -> Tuple[torch.Tensor, Dict]:\n        \"\"\"Given entire video tensor of a video file and the indices of the sampled\n        video frames, return the video clips. If there's not enough frames, the last\n        frame will be padded. If `output_video_fps` is smaller than\n        `original_video_fps`, video frames will be downsampled accordingly.\n\n        Args:\n            full_video_tensor: A [T x 3 x H x W] tensor of all frames of a video, where\n                T is the total number of frames, H and W is the height and width of each\n                frame image.\n            vclip_ids: A [clips_per_video x N] tensor of the index of the sampled frames\n                in `full_video_tensor`, where N is the number of sampled frames.\n            metadata: A dictionary of the video's metadata information.\n            num_frames_per_clip: Number of frames of the output clips.\n            clips_per_video: Number of clips per video.\n            original_video_fps: The frame rate of the video.\n            output_video_fps: The frame rate of the output video clips.\n            is_training: Whether it's in training mode. No randomness is applied if set\n                False.\n            num_samples_per_clip: Number of samples per clip to generate when the frames\n                are downsampled.\n\n        Returns:\n            video_clips: A [clips_per_video x num_frames_per_clip x 3 x H x W] tensor.\n        \"\"\"\n        (\n            num_video_frames,\n            frame_channels,\n            frame_height,\n            frame_width,\n        ) = full_video_tensor.shape\n\n        if num_video_frames < num_frames_per_clip:\n            # Repeat the last frame.\n            num_video_frames_to_pad = num_frames_per_clip - num_video_frames\n            padded_video = torch.zeros(\n                size=(\n                    num_frames_per_clip,\n                    frame_channels,\n                    frame_height,\n                    frame_width,\n                ),\n                dtype=full_video_tensor.dtype,\n                device=full_video_tensor.device,\n            )\n            padded_video[:num_video_frames] = full_video_tensor\n            padded_video[num_video_frames:, :, :, :] = full_video_tensor[-1].unsqueeze(\n                0\n            )\n            num_repeats = (\n                clips_per_video * num_samples_per_clip\n                if is_training\n                else clips_per_video\n            )\n            video_clips = padded_video.repeat((num_repeats, 1, 1, 1, 1))\n            vclip_ids = torch.zeros((num_repeats, 1)) + torch.arange(num_video_frames)\n            vclip_ids = F.pad(vclip_ids, (0, num_video_frames_to_pad), mode=\"replicate\")\n        else:\n            if 0 < output_video_fps < original_video_fps:\n                vclip_ids = _downsample_frame_indices(\n                    frame_indices=vclip_ids,\n                    input_fps=original_video_fps,\n                    output_num_frames=num_frames_per_clip,\n                    output_fps=output_video_fps,\n                    num_samples=num_samples_per_clip,\n                    random_frames=is_training,\n                )\n            else:\n                if num_samples_per_clip > 1:\n                    # Duplicate video if multiple samples are generated for each clip at\n                    # training time.\n                    vclip_ids = torch.repeat_interleave(\n                        vclip_ids, num_samples_per_clip, dim=0\n                    )\n            video_clips = full_video_tensor[vclip_ids]\n\n        metadata[\"video_frame_timestamps\"] = vclip_ids / original_video_fps\n        if self.channel_first_format:\n            video_clips = video_clips.transpose(1, 2)\n        return video_clips, metadata\n\n    def _generate_audio_clips(\n        self,\n        full_audio_tensor: torch.Tensor,\n        aclip_ids: Optional[torch.Tensor],\n        clip_duration: float,\n        clips_per_video: int,\n        audio_fps: float,\n        num_samples_per_clip: Optional[int] = 1,\n    ) -> torch.Tensor:\n        \"\"\"Given entire audio tensor of a video file and the indices of the sampled\n        audio frames, pad to the desire shape if needed and return the audio clips.\n\n        Args:\n            full_audio_tensor: A [T x C] tensor of all frames of a audio, where T is the\n                total number of frames, C is the number of channels. The audio is mono\n                when C == 1 and stero when C == 2.\n            aclip_ids: A [clips_per_video x N] tensor of the index of the sampled frames\n                in `full_audio_tensor`, where N is the number of sampled frames.\n            clip_duration: The duration in second of each clip.\n            clips_per_video: Number of clips per video to generate.\n            audio_fps: The frame rate of the audio. The audio is not changed in this\n                function.\n            num_samples_per_clip: Number of samples to generate for each clip. This is\n                to match the shape of the video if multiple samples are generated during\n                training.\n\n        Returns:\n            A [clips_per_video x N x C] tensor as the audio clips, where N is the number\n            of frames within `clip_duration` time at `audio_fps` frame rate.\n        \"\"\"\n        num_audio_frames = full_audio_tensor.shape[0]\n        # Compute the output clip length in second with the output fps and number of\n        # frames.\n        expected_num_audio_frames = int(clip_duration * audio_fps)\n        if full_audio_tensor.shape[0] < expected_num_audio_frames:\n            num_audio_frames_to_pad = (\n                expected_num_audio_frames - full_audio_tensor.shape[0]\n            )\n            full_audio_tensor = F.pad(\n                full_audio_tensor, (0, 0, 0, num_audio_frames_to_pad)\n            )\n            audio_clips = full_audio_tensor.repeat((clips_per_video, 1, 1))\n        else:\n            # [num_frames, channels] --> [num_clips, per_clip_audio, channels]\n            audio_clips = full_audio_tensor[aclip_ids]\n            num_audio_frames_to_pad = expected_num_audio_frames - audio_clips.shape[1]\n            audio_clips = F.pad(audio_clips, (0, 0, 0, num_audio_frames_to_pad))\n\n        # Duplicate audio if multiple samples are generated for each clip at training\n        # time.\n        audio_clips = torch.repeat_interleave(audio_clips, num_samples_per_clip, dim=0)\n\n        return audio_clips\n\n    def dummy_audio_video_clips(\n        self,\n        clips_per_video: int,\n        num_frames_to_sample: int,\n        height: int,\n        width: int,\n        audio_fps: int = 16000,\n        video_fps: Union[float, int] = 30,\n    ) -> Dict:\n        # [K, C, T, H, W] or # [K, N, T, H, W]\n        # K --> number of clips, C --> Image channels, N --> Number of frames per clip,\n        # H --> Height, W --> Width.\n        video_tensor_size = (\n            (clips_per_video, 3, num_frames_to_sample, height, width)\n            if self.channel_first_format\n            else (clips_per_video, num_frames_to_sample, 3, height, width)\n        )\n\n        video_clips = torch.zeros(\n            size=video_tensor_size,\n            dtype=torch.float32,\n            device=torch.device(\"cpu\"),\n        )\n        # Dummy clips for audio\n        audio_tensor_size = (\n            clips_per_video,\n            int(num_frames_to_sample * audio_fps / video_fps),\n            1,\n        )\n        audio_clips = torch.zeros(\n            size=audio_tensor_size,\n            dtype=torch.float32,\n            device=torch.device(\"cpu\"),\n        )\n\n        metadata = {\n            \"video_fps\": video_fps,\n            \"audio_fps\": audio_fps,\n            \"filename\": \"dummy.mp4\",\n        }\n        return {\n            \"video\": video_clips,\n            \"audio\": audio_clips,\n            \"metadata\": metadata,\n        }\n\n\ndef _downsample_frame_indices(\n    frame_indices: torch.Tensor,\n    input_fps: float,\n    output_num_frames: int,\n    output_fps: float,\n    num_samples: int,\n    random_frames: bool,\n) -> torch.Tensor:\n    \"\"\"Downsample frames from a frame indices at a given @output_fps and with a given\n    @output_num_frames.\n\n    This is used as a helper function for batch samplers that construct shorter video\n    clips from a longer video clip. For example, we might load a 70-frame clip at 30fps\n    and use it to construct 4 different batch samples corresponding to 8-frame clips at\n    8fps.\n\n    Args:\n        frame_indices: A [K, N] tensor as the index of each frame, where K is the batch\n            dimension, N is the number of frames.\n        input_fps: The frame rate to be downsampled from.\n        output_num_frames: The number of frames to output in each sample.\n        output_fps: The desired fps of the output frames.\n        num_samples: The number of batch samples to construct from the data.\n        random_frames: If False, the input indices will be used to construct a single\n            example. If True, random offsets will be applied to the frame indices as an\n            augmentation.\n\n    Returns:\n        output_frame_indices: A [K_out, N_out] tensor as the frame indices to sample,\n        where:\n            - N_out = @output_num_frames\n            - K_out = K * @num_samples.\n    \"\"\"\n    if not random_frames and num_samples != 1:\n        raise ValueError(\n            \"Frames are deterministic, so set num_samples to 1. Got num_samples={num_samples}.\"\n        )\n    assert num_samples >= 1, f\"num_samples has to be positive, got {num_samples}.\"\n\n    assert (\n        input_fps > output_fps\n    ), f\"Output fps {output_fps} has to be smaller than the input fps {input_fps}.\"\n\n    frames_per_clip = frame_indices.shape[1]\n    assert (\n        frames_per_clip >= output_num_frames\n    ), f\"Need to load more frames sample, can't sample {output_num_frames} from {frames_per_clip} frames.\"\n\n    output_frame_indices = []\n    desired_length_seconds = output_num_frames / output_fps\n    num_frames_to_sample = min(frames_per_clip, int(desired_length_seconds * input_fps))\n    positions = (torch.linspace(0, num_frames_to_sample, output_num_frames + 1)).long()\n\n    for _ in range(num_samples):\n        if random_frames:\n            # Choose a starting timestamp for the frames.\n            last_valid_idx = frames_per_clip - num_frames_to_sample\n            frame_start_idx = random.randint(0, last_valid_idx)\n        else:\n            # We don't apply any offsets or randomness to the video frames, so we start\n            # the video frames at index 0.\n            frame_start_idx = 0\n\n        selected_frame_indices = frame_indices[\n            :,\n            frame_start_idx : frame_start_idx + num_frames_to_sample,\n        ]\n\n        if random_frames:\n            # Choose the middle of the chunk as the label. Then, choose the frame at\n            # random from the time slices.\n            selected_frame_locations = []\n            for i in range(output_num_frames):\n                # Select a random frame in the chunk.\n                # NOTE: random.randint() is inclusive on both ends, while\n                # torch.randint() is exclusive for the higher range.\n                selection = random.randint(positions[i], positions[i + 1] - 1)\n                selected_frame_locations.append(selection)\n        else:\n            # We choose frames deterministically. Since we don't apply any offsets to\n            # the video, the correct frames are at the beginning of each range.\n            selected_frame_locations = positions[:-1]\n\n        output_frame_indices.append(selected_frame_indices[:, selected_frame_locations])\n\n    return torch.cat(output_frame_indices)\n"
  },
  {
    "path": "corenet/data/video_reader/decord_reader.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport sys\nfrom typing import Dict, Optional, Union\n\nfrom corenet.data.transforms.base_transforms import BaseTransformation\nfrom corenet.utils.import_utils import ensure_library_is_available\n\ntry:\n    import decord\nexcept ImportError:\n    pass\n\nimport av\nimport torch\n\nfrom corenet.data.video_reader import VIDEO_READER_REGISTRY\nfrom corenet.data.video_reader.pyav_reader import BaseAVReader\nfrom corenet.utils import logger\n\n\n@VIDEO_READER_REGISTRY.register(name=\"decord\")\nclass DecordAVReader(BaseAVReader):\n    \"\"\"\n    Video Reader using Decord.\n    \"\"\"\n\n    def __init__(self, *args, **kwargs):\n        ensure_library_is_available(\"decord\")\n        super().__init__(*args, **kwargs)\n\n    def read_video(\n        self,\n        av_file: str,\n        stream_idx: int = 0,\n        audio_sample_rate: int = -1,\n        custom_frame_transforms: Optional[BaseTransformation] = None,\n        video_only: bool = False,\n        *args,\n        **kwargs\n    ) -> Dict:\n        video_frames = audio_frames = None\n        video_fps = audio_fps = None\n        decord.bridge.set_bridge(\"torch\")\n        # We have to use av package to obtain audio fps, which is not available in\n        # decord.\n        with av.open(str(av_file)) as container:\n            available_streams = []\n            for stream in container.streams:\n                if stream.type == \"audio\":\n                    # Skip audio stream if audio not required.\n                    if video_only:\n                        continue\n                    audio_fps = container.streams.audio[0].sample_rate\n                available_streams.append(stream.type)\n        for stream_type in available_streams:\n            if stream_type == \"video\":\n                with open(str(av_file), \"rb\") as f:\n                    video_reader = decord.VideoReader(f, ctx=decord.cpu(0))\n                    n_video_frames = video_reader._num_frame\n                    video_frames = []\n                    frame_transforms = (\n                        self.frame_transforms\n                        if custom_frame_transforms is None\n                        else custom_frame_transforms\n                    )\n                    for _ in range(n_video_frames):\n                        video_frame = video_reader.next()  # H, W, C\n                        video_frame = video_frame.permute(2, 0, 1)  # C, H, W\n                        video_frame = frame_transforms({\"image\": video_frame})[\"image\"]\n                        video_frames.append(video_frame)\n                    video_frames = torch.stack(video_frames)\n                    video_fps = video_reader.get_avg_fps()\n            if stream_type == \"audio\":\n                with open(str(av_file), \"rb\") as f:\n                    audio_reader = decord.AudioReader(\n                        f, ctx=decord.cpu(0), sample_rate=audio_sample_rate\n                    )\n                    audio_frames = torch.tensor(audio_reader._array).transpose(0, 1)\n                    audio_fps = (\n                        audio_sample_rate if audio_sample_rate > 0 else audio_fps\n                    )\n\n        return {\n            \"audio\": audio_frames,  # expected format T x C\n            \"video\": video_frames,  # expected format T x C x H x W\n            \"metadata\": {\n                \"audio_fps\": audio_fps,\n                \"video_fps\": video_fps,\n                \"filename\": av_file,\n            },\n        }\n\n    def build_video_metadata(\n        self, video_path: str\n    ) -> Dict[str, Union[str, float, int]]:\n        \"\"\"Generate the metadata for a given video.\n\n        Args:\n            video_path: A video file path.\n\n        Returns:\n            The metadata of the corresponding video. The generated metadata format is:\n            {\n                \"filename\": <str>,\n                \"video_fps\": <float>,\n                \"total_video_frames\" <int>,\n                \"video_duration\": <float>,\n            }\n        \"\"\"\n        vmetadata = {}\n        vr = decord.VideoReader(video_path, ctx=decord.cpu(0), num_threads=1)\n        with av.open(video_path) as container:\n            vmetadata[\"filename\"] = video_path\n            video_stream = container.streams.video[0]\n            vmetadata[\"total_video_frames\"] = len(vr)\n            vmetadata[\"video_fps\"] = float(vr.get_avg_fps())\n            vmetadata[\"video_duration\"] = (\n                vmetadata[\"total_video_frames\"] / vmetadata[\"video_fps\"]\n            )\n        return vmetadata\n\n    def build_audio_metadata(\n        self, video_path: str\n    ) -> Dict[str, Union[str, float, int]]:\n        \"\"\"Generate the audio metadata for a given video.\n\n        Args:\n            video_path: A video file path.\n\n        Returns:\n            The audio metadata of the corresponding video. The metadata format is:\n            {\n                \"audio_channels\": int,\n                \"audio_fps\": int,\n                \"total_audio_frames\": int,\n                \"audio_duration\": float,\n            }\n        \"\"\"\n        metadata = {}\n        # Decord doesn't provide audio_fps. Thus, we use PyAV.\n        with av.open(str(video_path)) as container:\n            for stream in container.streams:\n                container.seek(0)\n                if stream.type == \"audio\":\n                    if \"audio_fps\" in metadata:\n                        raise ValueError(\n                            \"Multiple audio streams exist while at most 1 is expected.\"\n                        )\n                    audio_stream = container.streams.audio[0]\n                    metadata[\"audio_channels\"] = len(audio_stream.layout.channels)\n                    metadata[\"audio_fps\"] = audio_stream.sample_rate\n                    # `audio_stream.frames` does not work for unknown reason.\n                    metadata[\"total_audio_frames\"] = self._get_total_audio_frames(\n                        video_path, audio_stream.sample_rate\n                    )\n                    metadata[\"audio_duration\"] = (\n                        metadata[\"total_audio_frames\"] / metadata[\"audio_fps\"]\n                    )\n        return metadata\n\n    @staticmethod\n    def _get_total_audio_frames(video_path: str, sample_rate: Union[int, float]) -> int:\n        \"\"\"Returns the total number frames in the audio stream of @video_path.\n\n        Args:\n            video_path: Path to the local video file.\n            sample_rate: Sample rate of the audio stream.\n        \"\"\"\n        with open(str(video_path), \"rb\") as f:\n            # FIXME: Type of the @sample_rate is Union[int,float], but decord expects an\n            # integer. We should investigate what happens when floating point values are\n            # passed to this function. This issue might cause some misalignment between\n            # the audio and the video.\n            audio_reader = decord.AudioReader(\n                f, ctx=decord.cpu(0), sample_rate=sample_rate\n            )\n            result = audio_reader.shape[1]\n        return result\n"
  },
  {
    "path": "corenet/data/video_reader/ffmpeg_reader.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nimport subprocess\nimport sys\nimport warnings\nfrom math import isclose\nfrom typing import Any, Dict, Optional, Tuple, Union\n\nimport torch\n\nfrom corenet.data.transforms.base_transforms import BaseTransformation\nfrom corenet.data.transforms.common import Compose\nfrom corenet.data.video_reader import VIDEO_READER_REGISTRY, ffmpeg_utils\nfrom corenet.data.video_reader.base_av_reader import BaseAVReader\nfrom corenet.utils.check import check\nfrom corenet.utils.import_utils import ensure_library_is_available\n\ntry:\n    import ffmpeg\nexcept ImportError:\n    pass\n\n\n@VIDEO_READER_REGISTRY.register(name=\"ffmpeg\")\nclass FFMPEGReader(BaseAVReader):\n    \"\"\"\n    This is an experimental AVReader that decodes videos using ffmpeg subprocess.\n    This reader handles memory better than DecordReader with large datasets. Hence, we\n    can enable --dataset.persistent_workers and --dataset.pin_memory, without OOM Error,\n    to speedup the training. However, the improvement in accuracy isn't guaranteed yet.\n    \"\"\"\n\n    def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None:\n        ensure_library_is_available(\"ffmpeg\")\n        super().__init__(opts, *args, **kwargs)\n\n    def read_video(\n        self,\n        filename: str,\n        stream_idx: int = 0,\n        audio_sample_rate: int = -1,\n        video_fps: float = -1,\n        custom_frame_transforms: Optional[BaseTransformation] = None,\n        video_only: bool = False,\n        align_audio_video: bool = False,\n        threads: int = 1,\n        crop_w_h_x_y: Optional[Tuple[int, int, int, int]] = None,\n        ffmpeg_loglevel: str = \"error\",\n        *args,\n        **kwargs,\n    ) -> Dict:\n        \"\"\"Reads the video frames and audio samples of a video file into torch Tensors.\n\n        Args:\n            filename: Path of the video file.\n            stream_idx: Video stream index, for files with multiple video streams. This\n                subclass only supports videos with a single video stream. Defaults to 0.\n            audio_sample_rate: Controls the audio sample rate when reading audio. If not\n                specified (-1), the file's original sample rate gets used.\n                Defaults to -1.\n            video_fps: Controls the frame rate for reading video. If not specified (-1),\n                the file's average frame rate gets used. If the input video is encoded\n                with dynamic frame rate, this reader instructs ffmpeg to read the video\n                with constant (average) frame rate.\n            custom_frame_transforms: If provided, the given transformation gets used,\n                rather then the default ``BaseAVReader.get_frame_transform()`` for\n                transforming individual frames. Defaults to None.\n            video_only: When True, the audio stream gets skipped. Defaults to False.\n            align_audio_video: When True, the audio/video tensors will be trimmed to\n                ensure they are exactly the same temporal length.\n            threads: Number of cpu threads to use for decoding and transforming the\n                video. Note that we don't have full control over ffmpeg, and some\n                ffmpeg components may ignore this flag. Defaults to 1.\n            crop_w_h_x_y: If provided, the frames will be cropped as early as possible\n                within ffmpeg pipeline, before being sent to Python. Defaults to None.\n                For example, given crop_w_h_x_y=(10, 20, 50, 100), the video tensor will\n                be a tensor of shape [T, C, 40, 30], cropped at 50<=x<60 and 100<=y<120,\n                where T is the temporal length and is the number of channels.\n            ffmpeg_loglevel: Controls the log level of ffmpeg library. NOTE: Values\n                other than \"error\" may cause too many lines of log, and may result in\n                buffer overflows resulting in halted training. Defaults to \"error\".\n\n        Tensor shape abbreviations:\n            T, T_audio, T_video: Temporal lengths.\n            C: Number of color channels.\n            H, W: Height, Width.\n\n        Returns: A dictionary of the following format {\n            \"audio\": Tensor [T_audio,C],\n            \"video\": Tensor [T_video,C,H,W],\n            metadata: {\n                \"audio_fps\": float,\n                \"video_fps\": float,\n                \"filename\": str,\n            },\n        }\n\n        Note:\n            * For random cropping, please use custom_frame_transforms argument. This\n            argument (crop_w_h_x_y) translates to `crop=out_w:out_h:x:y` static ffmpeg\n            cli argument that applies the same bounding box to all frames.\n        \"\"\"\n        if stream_idx != 0:\n            raise NotImplementedError(\n                f\"Reading videos with stream_idx={stream_idx} is not supported yet.\"\n            )\n\n        try:\n            video_metadata = ffmpeg_utils.get_video_metadata(filename)\n\n            video = ffmpeg.input(\n                filename,\n                threads=str(threads),\n                loglevel=ffmpeg_loglevel,\n            ).video\n            if crop_w_h_x_y is not None:\n                width, height, x, y = crop_w_h_x_y\n                video = video.crop(width=width, height=height, x=x, y=y)\n            else:\n                height = video_metadata[\"height\"]\n                width = video_metadata[\"width\"]\n            if video_fps != -1:\n                video = video.filter(\"fps\", fps=video_fps)\n            video = video.output(\n                \"pipe:\",\n                format=\"rawvideo\",\n                pix_fmt=\"rgb24\",\n                threads=str(threads),\n                loglevel=ffmpeg_loglevel,\n            )\n            video = video.global_args(\n                \"-threads\",\n                str(threads),\n                \"-loglevel\",\n                ffmpeg_loglevel,\n            )\n            video = subprocess.run(\n                video.compile(),\n                capture_output=True,\n                stdin=subprocess.DEVNULL,\n            ).stdout\n\n            with warnings.catch_warnings():\n                warnings.simplefilter(\"ignore\")\n                video = torch.frombuffer(video, dtype=torch.uint8)\n            video = video.reshape(-1, height, width, 3)\n\n            if video_fps == -1:\n                video_fps = video_metadata[\"video_fps\"]\n\n            expected_frames = int(video_metadata[\"video_duration\"] * video_fps)\n            if not isclose(expected_frames, video.shape[0], rel_tol=0.05, abs_tol=1):\n                raise ValueError(\n                    \"Expected\"\n                    f\" {video_metadata['video_duration']}*{video_fps}={expected_frames} video\"\n                    f\" frames, but got {video.shape[0]} frames.\"\n                )\n\n            video = video.permute(0, 3, 1, 2)  # [T,H,W,C] -> [T,C,H,W]\n\n            if not video_only:\n                audio, audio_metadata = self.read_audio(\n                    filename, audio_sample_rate=audio_sample_rate, threads=threads\n                )\n\n                audio_sample_rate = audio_metadata[\"audio_fps\"]\n\n                if align_audio_video:\n                    audio_samples_per_frame = audio_sample_rate / video_fps\n                    check(\n                        audio_samples_per_frame.is_integer(),\n                        lambda: f\"Cannot align A/V: Audio sample rate {audio_sample_rate} is not divisible by video fps {video_fps}\",\n                    )\n                    frames = min(\n                        video.shape[0],\n                        audio.shape[0] // int(audio_samples_per_frame),\n                    )\n                    video = video[:frames]\n                    audio = audio[: frames * int(audio_samples_per_frame)]\n\n        except ffmpeg.Error as e:\n            raise RuntimeError(e.stderr) from e\n\n        video = self._transform_video_frames(\n            video,\n            (\n                self.frame_transforms\n                if custom_frame_transforms is None\n                else custom_frame_transforms\n            ),\n        )\n\n        result = {\n            \"audio\": audio if not video_only else None,\n            \"video\": video,\n            \"metadata\": {\n                \"audio_fps\": audio_sample_rate if not video_only else None,\n                \"video_fps\": video_fps,\n                \"video_frame_timestamps\": torch.arange(video.shape[0]) / video_fps,\n                \"filename\": filename,\n            },\n        }\n        return result\n\n    def _transform_video_frames(\n        self, video: torch.Tensor, transformation: BaseTransformation\n    ) -> torch.Tensor:\n        \"\"\"Applies frame_transforms to the individual video frames.\n\n        Args:\n            video: Tensor[T,C,W,H], to be transformed.\n            frame_transforms: Transformation that operates on {\"image\": Tensor[C,W,H]}.\n\n        Returns:\n            Transformed tensor of shape [T,C,W,H].\n\n        Note:\n            * If the transformation is a No-Op (ie. ``Compose([])``), returns the input\n            as is. The No-Op transformation can be used by datasets that apply ToTensor\n            after cropping, to save compute.\n        \"\"\"\n        if isinstance(transformation, Compose) and transformation.img_transforms == []:\n            # No-Op frame transform\n            pass\n        else:\n            video = torch.stack(\n                [transformation({\"image\": frame})[\"image\"] for frame in video]\n            )\n\n        return video\n\n    @classmethod\n    def read_audio(\n        cls, filename: str, audio_sample_rate: int = -1, threads: int = 1\n    ) -> Tuple[torch.Tensor, Dict[str, Any]]:\n        \"\"\"Reads the audio tensor and audio stream's metadata of a given video file.\n\n        Args:\n            filename: Path of the video file.\n            audio_sample_rate: Controls the audio sample rate when reading audio. If not\n                specified (-1), the file's original sample rate gets used.\n                Defaults to -1.\n            threads: Number of cpu threads to use for decoding and transforming the\n                video. Note that we don't have full control over ffmpeg, and some\n                ffmpeg components may ignore this flag. Defaults to 1.\n\n        Returns:\n            (audio_tensor, metadata) tuple, where audio_tensor has shape [T,C] and the\n            metadata has the following schema: {\n                \"audio_fps\": float,\n                \"audio_duration\": float,\n                \"audio_channels\": int,\n            }.\n        \"\"\"\n        audio_metadata = cls.build_audio_metadata(filename)\n        if audio_sample_rate == -1:\n            audio_sample_rate = audio_metadata[\"audio_fps\"]\n        else:\n            audio_metadata[\"audio_fps\"] = audio_sample_rate\n\n        # F16LE is 16-bit little-endian signed PCM (raw) audio.\n        # See: https://gstreamer.freedesktop.org/documentation/additional/design/mediatype-audio-raw.html\n        if sys.byteorder == \"little\":\n            audio_format = \"f32le\"\n        elif sys.byteorder == \"big\":\n            audio_format = \"f32be\"\n        else:\n            raise NotImplementedError(f\"Unknown byte order '{sys.byteorder}'.\")\n\n        audio, _ = (\n            ffmpeg.input(filename, threads=str(threads))\n            .audio.output(\n                \"pipe:\",\n                format=audio_format,\n                acodec=f\"pcm_{audio_format}\",\n                ar=str(audio_sample_rate),\n                threads=str(threads),\n            )\n            .global_args(\"-vn\", \"-threads\", str(threads))\n            .run(capture_stdout=True, capture_stderr=True)\n        )\n        audio = torch.frombuffer(audio, dtype=torch.float32)\n        audio = audio.reshape(-1, audio_metadata[\"audio_channels\"])\n        expected_frames = int(audio_metadata[\"audio_duration\"] * audio_sample_rate)\n        if not isclose(expected_frames, audio.shape[0], rel_tol=0.05, abs_tol=1):\n            raise ValueError(\n                \"Expected\"\n                f\" {audio_metadata['audio_duration']}*{audio_sample_rate}={expected_frames} audio\"\n                f\" frames, but got {audio.shape[0]} frames.\"\n            )\n        return audio, audio_metadata\n\n    @classmethod\n    def build_video_metadata(cls, video_path: str) -> Dict[str, Union[str, float, int]]:\n        \"\"\"Generate the metadata for a given video.\n\n        Args:\n            video_path: A video file path.\n\n        Returns:\n            The metadata of the corresponding video. The generated metadata format is:\n            {\n                \"filename\": <str>,\n                \"video_fps\": <float>,\n                \"total_video_frames\" <int>,\n                \"video_duration\": <float>,\n                \"width\": <int>,\n                \"height\": <int>,\n            }\n        \"\"\"\n        return ffmpeg_utils.get_video_metadata(video_path)\n\n    @classmethod\n    def build_audio_metadata(cls, video_path: str) -> Dict[str, Union[str, float, int]]:\n        \"\"\"Generate the audio metadata for a given video.\n\n        Args:\n            video_path: A video file path.\n\n        Returns:\n            The audio metadata of the corresponding video. The metadata format is:\n            {\n                \"audio_channels\": int,\n                \"audio_fps\": int,\n                \"total_audio_frames\": int,\n                \"audio_duration\": float,\n                \"audio_channels\": int,\n            }\n        \"\"\"\n        return ffmpeg_utils.get_audio_metadata(video_path)\n"
  },
  {
    "path": "corenet/data/video_reader/ffmpeg_utils.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\nimport argparse\nimport functools\nimport json\nimport logging\nimport math\nimport os\nimport subprocess\nimport tempfile\nimport time\nimport warnings\nfrom io import IOBase\nfrom pathlib import Path\nfrom typing import Any, Dict, List, Optional, Tuple, Union\n\nimport numpy as np\nimport torch\n\ntry:\n    import ffmpeg\n\n    subprocess.check_call(\n        [\"ffmpeg\", \"-h\"],\n        stderr=subprocess.DEVNULL,\n        stdout=subprocess.DEVNULL,\n        stdin=subprocess.DEVNULL,\n    )\n    IS_FFMPEG_INSTALLED = True\nexcept (ImportError, subprocess.CalledProcessError, FileNotFoundError):\n    ffmpeg = None\n    IS_FFMPEG_INSTALLED = False\n\nfrom corenet.data.transforms.base_transforms import BaseTransformation\nfrom corenet.data.transforms.video import ToPixelArray, ToTensor\nfrom corenet.utils import logger\nfrom corenet.utils.check import check\nfrom corenet.utils.context_managers import context_tensor_threads\nfrom corenet.utils.import_utils import ensure_library_is_available\nfrom corenet.utils.io_utils import make_temp_file\n\n\nclass FFMPEGError(Exception):\n    def __init__(self, message: str, stderr: Union[IOBase, bytes, str]):\n        if isinstance(stderr, IOBase):\n            stderr = stderr.read()\n        if isinstance(stderr, bytes):\n            stderr = stderr.decode(errors=\"replace\")\n        super().__init__(f\"{message}:\\n{stderr}\")\n\n\ndef _parse_stream_duration(stream: Dict[str, Any]) -> float:\n    \"\"\"Extract duration (seconds) from audio/video stream headers.\n\n    Args:\n        stream: FFProbe headers (i.e. metadata) for an audio/video stream.\n\n    Returns:\n        The parsed duration of the input stream metadata, in seconds.\n    \"\"\"\n    if \"duration\" in stream:\n        duration = float(stream[\"duration\"])\n    else:\n        duration = stream[\"tags\"][\"DURATION\"]\n        hh, mm, ss = map(float, duration.split(\":\"))\n        duration = hh * 3600 + mm * 60 + ss\n\n    return duration\n\n\n@functools.lru_cache(maxsize=2)\ndef ffprobe(video_path: str, parse_json: bool = True) -> Union[str, Dict[str, Any]]:\n    \"\"\"Reads the container and stream metadata from video files.\n\n    For further information about ffprobe, see https://ffmpeg.org/ffprobe.html.\n\n    Args:\n        video_path: Represents the path of the video file.\n        parse_json: Determines whether the output should be a json string, or its\n            parsed dictionary. Defaults to True, that returns a Dict.\n\n    Returns:\n        The json metadata that is generated by ffprobe CLI.\n    \"\"\"\n    try:\n        output = subprocess.check_output(\n            [\n                \"ffprobe\",\n                \"-v\",\n                \"quiet\",\n                \"-print_format\",\n                \"json\",\n                \"-show_format\",\n                \"-show_streams\",\n                video_path,\n            ],\n            universal_newlines=True,\n            stderr=subprocess.PIPE,\n            stdin=subprocess.DEVNULL,\n        )\n        if parse_json:\n            output = json.loads(output)\n        return output\n    except (subprocess.CalledProcessError, TypeError, ValueError) as exc:\n        if isinstance(exc, subprocess.CalledProcessError):\n            stderr = exc.stderr\n        else:\n            stderr = str(exc)\n        raise FFMPEGError(\n            f\"Could not extract ffmpeg metadata for {video_path}.\",\n            stderr=stderr,\n        )\n\n\ndef get_video_metadata(\n    video_path: str, return_extras: bool = False\n) -> Union[Dict[str, Union[str, float, int]], Tuple[Dict, Dict]]:\n    \"\"\"Generate the metadata for a given video.\n\n    Args:\n        video_path: A video file path.\n        return_extras: When True, returns additional information as described in\n            \"Returns\" section. Defaults to False.\n\n    Returns:\n        When @return_extras is False (default), returns the following metadata:\n        metadata = {\n            \"filename\": <str>,\n            \"video_fps\": <float>,\n            \"total_video_frames\" <int>,\n            \"video_duration\": <float>,\n            \"width\": <int>,\n            \"height\": <int>,\n            \"start_time\": <float>,  # When greater than 0, the frame that ffmpeg reads\n                                    # should be presented at timestamp <start_time>.\n        }\n\n        When @return_extras is True, returns `(metadata, extras)` tuple, where:\n        extras = {\n            \"raw\": <dict>,  # The raw json output of ffprobe (video stream).\n            \"rotation\": <int>,  # Rotation of raw frames, in {0, 90, 180, 270}.\n        }\n    \"\"\"\n    ensure_library_is_available(module_name=\"ffmpeg\")\n\n    probe = ffprobe(video_path)\n    metadata = None\n    for stream in probe[\"streams\"]:\n        if stream.get(\"codec_type\") != \"video\":\n            continue\n        if stream.get(\"disposition\", {}).get(\"attached_pic\", 0) != 0:\n            # In some videos, the video thumbnail image is stored as a stream with\n            # codec_type=video and disposition.attached_pic tag. We shall skip\n            # thumbnail image streams.\n            continue\n        if metadata is not None:\n            raise ValueError(f\"Found more than 1 video stream in {video_path}.\")\n        num, denom = map(int, stream[\"avg_frame_rate\"].split(\"/\"))\n        frame_rate = num / denom\n        duration = _parse_stream_duration(stream)\n\n        # In older ffmpeg/ffprobe versions, rotation metadata was returned as\n        # stream[\"tags\"][\"rotate\"]. In the newer versions, rotation is returned as\n        # stream[\"side_data_list\"][<index>][\"rotation\"].\n        # See: https://superuser.com/a/1724964\n        rotation_metadata_values = []\n        if \"tags\" in stream and \"rotate\" in stream[\"tags\"]:\n            rotation_metadata_values.append(int(stream[\"tags\"][\"rotate\"]))\n        for side_data in stream.get(\"side_data_list\", []):\n            if \"rotation\" in side_data:\n                rotation_metadata_values.append(int(side_data[\"rotation\"]))\n\n        if rotation_metadata_values:\n            assert (\n                len(set(rotation_metadata_values)) == 1\n            ), f\"Got inconsistent rotation metadata {rotation_metadata_values}.\"\n            rotation = rotation_metadata_values[0]\n            assert (\n                rotation % 90 == 0\n            ), f\"Got unexpected rotation value {rotation} in {video_path}.\"\n            rotation = (rotation + 360) % 360  # Ensure positive value.\n        else:\n            rotation = 0\n\n        metadata = {\n            \"filename\": video_path,\n            \"video_fps\": frame_rate,\n            \"total_video_frames\": int(math.ceil(duration * frame_rate)),\n            \"video_duration\": duration,\n            \"width\": (stream[\"width\"] if rotation % 180 == 0 else stream[\"height\"]),\n            \"height\": (stream[\"height\"] if rotation % 180 == 0 else stream[\"width\"]),\n            \"start_time\": float(stream.get(\"start_time\", \"0.0\")),\n        }\n        if return_extras:\n            extras = {\n                \"raw\": stream,\n                \"rotation\": rotation,\n            }\n    if metadata is None:\n        raise ValueError(f\"Could not find a video stream in {video_path}.\")\n\n    if return_extras:\n        return metadata, extras\n    else:\n        return metadata\n\n\ndef get_audio_metadata(\n    video_path: str, return_extras: bool = False\n) -> Union[Optional[Dict], Tuple[Optional[Dict], Dict]]:\n    \"\"\"Generate the audio metadata for a given video.\n\n    Args:\n        video_path: A video file path.\n\n    Returns:\n        When @return_extras is False (default), returns the following metadata:\n        metadata = {\n            \"audio_fps\": int,\n            \"total_audio_frames\": int,\n            \"audio_duration\": float,\n            \"audio_channels\": int,\n        }\n\n        When @return_extras is True, returns `(metadata, extras)` tuple, where:\n        extras = {\n            \"raw\": <dict>,  # The raw json output of ffprobe (audio stream).\n        }\n    \"\"\"\n    probe = ffprobe(video_path)\n    result = None\n    extras = {\"raw\": None}\n    for stream in probe[\"streams\"]:\n        if stream.get(\"codec_type\") != \"audio\":\n            continue\n        if result is not None:\n            raise ValueError(f\"Found more than 1 audio stream in {video_path}.\")\n        extras[\"raw\"] = stream\n        sample_rate = int(stream[\"sample_rate\"])\n        duration = _parse_stream_duration(stream)\n\n        result = {\n            \"filename\": video_path,\n            \"audio_fps\": sample_rate,\n            \"total_audio_frames\": int(duration * sample_rate),\n            \"audio_duration\": duration,\n            \"audio_channels\": int(stream[\"channels\"]),\n        }\n    if return_extras:\n        return result, extras\n    return result\n\n\ndef get_flags_to_replicate_audio_codec(input_filename: str) -> Dict:\n    \"\"\"Extracts ffmpeg flags to replicate input audio codec properties in the output.\n\n    Args:\n        input_filename: Path of the input audio/video file.\n\n    Returns:\n        A dictionary containing ffmpeg flags to be consumed by ffmpeg-python package.\n    Each {key: value} entry of this dictionary will be converted to \"-key value\"\n    command-line flags for ffmpeg command.\n\n    Note:\n        The goal is to replicate a close behavior to \"-c:a copy\" while re-encoding the\n    audio (\"-c:a copy\" does not re-encode the audio). Re-encoding the audio is \n    necessary when we trim the video during processing, because \"-c:a copy\" produces\n    wrong durations. \n    \n    For example, you can use the following command to extract a 1.5 seconds audio clip,\n    but you will get a 2.04 second result. But replacing \"-c:a copy\" with \"-c:a aac\"\n    corrects the duration.\n\n    ffmpeg -ss 0.5 -i ./tests/data/dummy_video.mov -c:a copy -to 1.5 /tmp/a.mov -y \\\n        2>/dev/null && ffprobe /tmp/a.mov 2>&1 | grep Duration\n\n    As explained in https://trac.ffmpeg.org/ticket/977, one alternative is to move -ss\n    flag to after -i, that solves the duration problem but produces out of sync audio:\n    https://superuser.com/questions/1001299/ffmpeg-video-cutting-error-out-of-sync-audio.\n    \"\"\"\n    probe = ffprobe(input_filename)\n    audio_stream = None\n    for stream in probe[\"streams\"]:\n        if stream.get(\"codec_type\") != \"audio\":\n            continue\n        if audio_stream is not None:\n            raise ValueError(f\"Found more than 1 audio stream in {input_filename}.\")\n        audio_stream = stream\n    if audio_stream is None:\n        raise ValueError(f\"Could not find audio stream in {input_filename}.\")\n\n    codec_name = audio_stream[\"codec_name\"]\n    result = {\n        \"acodec\": codec_name,\n        \"ac\": audio_stream[\"channels\"],\n    }\n    if codec_name == \"aac\":\n        # AAC is a common mp4 audio encoding: https://trac.ffmpeg.org/wiki/Encode/AAC\n        result[\"b:a\"] = audio_stream[\"bit_rate\"]\n    elif codec_name.startswith(\"pcm_\"):\n        # pcm_s16le is the codec name for raw audio (stereo,16bit,little-endian)\n        result[\"ar\"] = audio_stream[\"sample_rate\"]\n    else:\n        logging.error(\n            \"The current implementation does not know how to replicate audio codec\"\n            f\" '{codec_name}'.\"\n        )\n    return result\n\n\ndef transform_video_file(\n    input_filename: str,\n    output_filename: str,\n    transform: BaseTransformation,\n    output_dimensions: Tuple[int, int] = None,\n    threads: int = 1,\n    max_pixels_per_batch: int = 1,\n    from_timestamp: Optional[float] = None,\n    to_timestamp: Optional[float] = None,\n    video_fps: Optional[float] = None,\n    ffmpeg_loglevel: str = \"error\",\n    logging_interval: int = 5 * 60,\n    encoder_acodec: str = \"copy\",\n    encoder_vcodec: str = \"mjpeg\",\n    encoder_flags: Optional[Dict] = None,\n) -> None:\n    \"\"\"\n    Reads batches of video frames using ffmpeg, transforms them, and writes results\n    back to the output file. This utility is especially useful for transforming long\n    videos that cannot be loaded into RAM as a whole.\n\n    Args:\n        input_filename: Path to the input video file.\n        output_filename: Path to the output video file.\n        transform (BaseTransformation): A transformation that is compatible with the\n            video transformations in ``corenet.data.transforms.video`` module. The\n            transformation should expect a dict with the following schema: {\n                \"samples\": {\n                    \"video\": Tensor[NxTxCxHxW],\n                    \"metadata\": {\n                        \"video_fps\": float,\n                        \"video_frame_timestamps\": Tensor[NxT],\n                    },\n                },\n                \"targets\": {},\n            }\n        output_dimensions: Expected frame size (height, weight) of the outputs of the\n            transformation.\n        threads: Number of threads to use. Note that some ffmpeg components may ignore\n            the threads option.\n        max_pixels_per_batch: Determines the batch size for reading and processing\n            frames. If you want to process 10 frames at a time, pass 10*C*H*W. Passing\n            number of pixels, rather than number of frames, allows us to dynamically\n            adapt the batch size given input video frame dimensions.\n        from_timestamp: If provided (in seconds), only the frames after this timestamp\n            will be written to the output file. Defaults to 0, that skips frames with\n            negative timestamp.\n        to_timestamp: If provided (in seconds), only the frames before this timestamp\n            will be written to the output file. Defaults to None, when the video\n            duration (from metadata) is used as to_timestamp.\n        video_fps: The output fps if specified. Defaults to None.\n        ffmpeg_loglevel: Controls the log level of ffmpeg library. NOTE: Values other\n            than \"error\" may cause too much logs. In our experience, too much logs can\n            lead to buffer overflow that cause hanging processes. Choices:\n            \"quiet\", \"panic\", \"fatal\"=, \"error\", \"warning\", \"info\", \"verbose\", \"debug\",\n            \"trace\". Defaults to \"error\". See: https://ffmpeg.org/ffmpeg.html\n        logging_interval: Controls the interval of logging the progress. The unit is\n            seconds. Defaults to 5 minutes.\n        encoder_acodec: FFMpeg audio codec for encoding the output file. Defaults to\n            \"copy\", that uses the same encoding as the input video. When @from_timestamp\n            or @to_timestamp arguments are provided, the audio-codec should be specified\n            (other than \"copy\") because we must re-encode audio to avoid lagged frames.\n        encoder_vcodec: FFMpeg video codec for encoding the input file. Defaults to\n            \"mjpeg\", that simply encodes individual frames as jpeg. As video frames are\n            processed in python and passed to the ffmpeg as input, passing\n            encoder_vcodec=\"copy\" will not copy the encoding from the input file.\n        encoder_flags: Extra ffmpeg flags to be used for output audio/video encoder.\n            For example, pass {\"b:a\": \"192k\"} to set mjpeg audio bitrate to 192k. This\n            argument overrides any other encoder_* argument Defaults to {}. Each\n            {key:value} gets translated to `-key value` ffmpeg CLI flags.\n    \"\"\"\n    ensure_library_is_available(module_name=\"ffmpeg\")\n\n    if encoder_flags is None:\n        encoder_flags = {}\n\n    metadata = get_video_metadata(input_filename)\n    height_in = metadata[\"height\"]\n    width_in = metadata[\"width\"]\n    if output_dimensions is None:\n        height_out, width_out = height_in, width_in\n    else:\n        height_out, width_out = output_dimensions\n\n    tmp_video_filename = None\n    if video_fps is not None:\n        # Downsample the video frame rate and store in a temp file.\n        tmp_video_filename = make_temp_file(suffix=Path(input_filename).suffix)\n        resample_video_command = (\n            ffmpeg.output(\n                ffmpeg.input(input_filename).video.filter(\"fps\", fps=video_fps),\n                ffmpeg.input(input_filename).audio,\n                filename=tmp_video_filename,\n            )\n            .overwrite_output()\n            .global_args(\"-threads\", str(threads), \"-loglevel\", ffmpeg_loglevel)\n            .compile()\n        )\n        video_resample_process = subprocess.Popen(\n            resample_video_command,\n            # See https://github.com/kkroening/ffmpeg-python/issues/782\n            stdin=subprocess.DEVNULL,\n            stdout=subprocess.PIPE,\n            stderr=subprocess.PIPE,\n        )\n        _, stderr = video_resample_process.communicate()\n        if video_resample_process.poll():\n            raise FFMPEGError(\"Failed to resample the video.\", stderr)\n\n        input_filename = tmp_video_filename\n    else:\n        video_fps = metadata[\"video_fps\"]\n\n    is_trimmed = from_timestamp is not None or to_timestamp is not None\n    if is_trimmed:\n        assert encoder_flags.get(\"acodec\", encoder_acodec) != \"copy\", (\n            \"Audio codec 'copy' is not valid when from_timestamp/to_timestamp\"\n            \" arguments are provided because audio must be re-encoded.\"\n        )\n        assert encoder_flags.get(\"vcodec\", encoder_vcodec) != \"copy\", (\n            \"Video codec 'copy' is not valid when from_timestamp/to_timestamp\"\n            \" arguments are provided because audio must be re-encoded.\"\n        )\n        if from_timestamp is None:\n            from_timestamp = 0.0\n        else:\n            assert from_timestamp >= 0.0\n        if to_timestamp is None:\n            to_timestamp = metadata[\"video_duration\"]\n\n        trim_flags = {\n            \"ss\": from_timestamp,\n            \"to\": to_timestamp,\n        }\n    else:\n        trim_flags = {}\n\n    tmp_audio_filename = None\n    video_decode_process = encoder_process = None\n    try:\n        video_decode_process_command: List[str] = (\n            ffmpeg.input(input_filename)\n            .video.output(\"pipe:\", format=\"rawvideo\", pix_fmt=\"rgb24\", **trim_flags)\n            .global_args(\n                \"-threads\",\n                str(max(1, threads // 2)),\n                \"-loglevel\",\n                ffmpeg_loglevel,\n            )\n            .compile()\n        )\n        video_decode_process = subprocess.Popen(\n            video_decode_process_command,\n            # See https://github.com/kkroening/ffmpeg-python/issues/782\n            stdin=subprocess.DEVNULL,\n            stdout=subprocess.PIPE,\n            stderr=subprocess.PIPE,\n        )\n\n        processed_video = ffmpeg.input(\n            \"pipe:\",\n            format=\"rawvideo\",\n            pix_fmt=\"rgb24\",\n            s=\"{}x{}\".format(width_out, height_out),\n            r=video_fps,\n            loglevel=ffmpeg_loglevel,\n        ).video\n\n        if is_trimmed:\n            # Copy trimmed audio with re-encoding to tmp_audio_filename\n            tmp_audio_filename = make_temp_file(suffix=Path(input_filename).suffix)\n            extract_audio_command = (\n                ffmpeg.output(\n                    ffmpeg.input(input_filename)\n                    .audio.filter_(\"atrim\", start=from_timestamp, end=to_timestamp)\n                    .filter_(\"asetpts\", \"PTS-STARTPTS\"),\n                    filename=tmp_audio_filename,\n                    acodec=\"pcm_s16le\",  # Store raw audio in the intermediate file.\n                    **{\"q:a\": 0},  # Use highest possible quality.\n                )\n                .overwrite_output()\n                .global_args(\"-threads\", str(threads), \"-loglevel\", ffmpeg_loglevel)\n                .compile()\n            )\n            extract_audio_process = subprocess.Popen(\n                extract_audio_command,\n                # See https://github.com/kkroening/ffmpeg-python/issues/782\n                stdin=subprocess.DEVNULL,\n                stdout=subprocess.PIPE,\n                stderr=subprocess.PIPE,\n            )\n            _, stderr = extract_audio_process.communicate()\n            if extract_audio_process.poll():\n                raise FFMPEGError(\"Failed to re-encode the audio.\", stderr)\n\n            processed_audio = ffmpeg.input(tmp_audio_filename).audio\n        else:\n            processed_audio = ffmpeg.input(input_filename).audio\n\n        encoder_flags.setdefault(\"acodec\", encoder_acodec)\n        encoder_flags.setdefault(\"vcodec\", encoder_vcodec)\n\n        encoder_process_command = (\n            ffmpeg.output(\n                processed_video,\n                processed_audio,\n                output_filename,\n                **encoder_flags,\n            )\n            .global_args(\n                \"-threads\",\n                str(max(1, threads // 2)),\n                \"-loglevel\",\n                ffmpeg_loglevel,\n            )\n            .overwrite_output()\n            .compile()\n        )\n        encoder_process = subprocess.Popen(\n            encoder_process_command,\n            stdin=subprocess.PIPE,\n            stdout=subprocess.PIPE,\n            stderr=subprocess.PIPE,\n        )\n\n        latest_log = start_time = time.time()\n        processed_frames = 0\n        current_timestamp = 0.0\n\n        @functools.cache\n        def get_total_frames():\n            if is_trimmed:\n                return int((to_timestamp - from_timestamp) * video_fps)\n            else:\n                return get_video_metadata(input_filename)[\"total_video_frames\"]\n\n        opts = argparse.Namespace()\n        to_tensor = ToTensor(opts)\n        to_pixel_array = ToPixelArray(opts)\n        with context_tensor_threads(threads):\n            while True:\n                max_frames = int(\n                    max(1, max_pixels_per_batch / width_in / height_in / 3)\n                )\n\n                if time.time() > latest_log + logging_interval:\n                    logger.log(\n                        \"Processing frames\"\n                        f\" {processed_frames}:{processed_frames+max_frames} /\"\n                        f\" {get_total_frames()} [{input_filename}]\"\n                        f\" [Velocity={processed_frames/(time.time()-start_time)*60:.1f}\"\n                        \" frames/minute]\"\n                    )\n                    latest_log = time.time()\n\n                frames = video_decode_process.stdout.read(\n                    max_frames * width_in * height_in * 3\n                )\n\n                if not frames:\n                    break\n                with warnings.catch_warnings():\n                    warnings.simplefilter(\"ignore\")\n                    frames = torch.frombuffer(frames, dtype=torch.uint8)\n                frames = frames.reshape(1, -1, height_in, width_in, 3)\n                num_frames = frames.shape[1]\n\n                video_frame_timestamps = (\n                    torch.arange(num_frames) / video_fps + current_timestamp\n                )\n                video_frame_timestamps = video_frame_timestamps[None, :]\n\n                frames = frames.permute(0, 1, 4, 2, 3)  # NTHWC -> NTCHW\n                data = {\n                    \"samples\": {\n                        \"video\": frames,\n                        \"metadata\": {\n                            \"video_fps\": video_fps,\n                            \"video_frame_timestamps\": video_frame_timestamps,\n                            \"filename\": input_filename,\n                        },\n                    },\n                    \"targets\": {},\n                }\n                data = to_tensor(data)\n                data = transform(data)\n                data = to_pixel_array(data)\n\n                frames = data[\"samples\"][\"video\"]\n                frames = frames.transpose(0, 1, 3, 4, 2)  # NTCHW -> NTHWC\n\n                if frames.shape[-1] == 1:\n                    frames = frames.repeat(3, -1)  # grayscale to rgb\n\n                expected_shape = (1, num_frames, height_out, width_out, 3)\n                assert (\n                    frames.shape == expected_shape\n                ), f\"Got shape {frames.shape}, expected {expected_shape}.\"\n                assert (\n                    frames.dtype == np.uint8\n                ), f\"Unexpected dtype {frames.dtype}, expected uint8.\"\n                processed_frames += num_frames\n                current_timestamp += num_frames / video_fps\n\n                encoder_process.stdin.write(frames.data.tobytes())\n                encoder_process.stdin.flush()\n\n        if output_filename:\n            encoder_process.stdin.close()\n        video_decode_process.wait()\n        if output_filename:\n            encoder_process.wait()\n\n    except BrokenPipeError:\n        raise FFMPEGError(\n            f\"Encoder process failed with command='{' '.join(encoder_process.args)}'\",\n            encoder_process.stderr,\n        )\n    finally:\n        if tmp_audio_filename is not None:\n            Path(tmp_audio_filename).unlink(missing_ok=True)\n        if tmp_video_filename is not None:\n            Path(tmp_video_filename).unlink(missing_ok=True)\n        if video_decode_process is not None:\n            _kill_subprocess(video_decode_process)\n        if encoder_process is not None:\n            _kill_subprocess(encoder_process)\n\n\ndef _kill_subprocess(process: subprocess.Popen, timeout_seconds: float = 5.0) -> None:\n    try:\n        t0 = time.time()\n        while process.poll() is None:\n            process.kill()\n            if time.time() - t0 > timeout_seconds:\n                raise TimeoutError()\n            time.sleep(0.1)\n\n    except:\n        logger.ignore_exception_with_warning(\n            f\"Couldn't kill subprocess with pid={getattr(subprocess, 'pid', None)}.\"\n        )\n\n\ndef write_video(\n    data: Dict,\n    output_filename: str,\n    ffmpeg_loglevel: str = \"error\",\n    acodec: str = \"pcm_s16le\",\n    _temp_audio_file: Optional[str] = None,\n):\n    \"\"\"Write a video file (potentially with audio) from tensors.\n\n    Arguments:\n        data: A dictionary of the following format:\n            {\n                \"audio\": Tensor [T_audio,C] (optional),\n                \"video\": Tensor [T_video,C,H,W],\n                \"metadata\": {\n                    \"audio_fps\": float (optional),\n                    \"video_fps\": float,\n                },\n            }\n        output_filename: Filename, .mkv or .mov is recommended.\n        ffmpeg_loglevel: Log level, see transform_video_file.\n        acodec: Audio codec.\n        _temp_audio_file: Internal, temporary audio file.\n    \"\"\"\n\n    if \"audio\" in data and _temp_audio_file is None:\n        with tempfile.TemporaryDirectory() as td:\n            _temp_audio_file = os.path.join(td, \"temp.wav\")\n            write_audio(data, _temp_audio_file, acodec=acodec)\n            return write_video(\n                data,\n                output_filename,\n                ffmpeg_loglevel=ffmpeg_loglevel,\n                acodec=acodec,\n                _temp_audio_file=_temp_audio_file,\n            )\n\n    video = data[\"video\"]\n\n    if video.is_floating_point():\n        video = (video * 255).round().to(torch.uint8)\n\n    check(video.dtype == torch.uint8, ValueError(\"Expect uint8 video\"))\n    check(video.ndim == 4, ValueError(\"Expect 4-dimensional video\"))\n\n    video = video.permute(0, 2, 3, 1)  # [T,C,H,W] -> [T,H,W,C]\n\n    if video.shape[-1] == 1:\n        video = video.repeat(1, 1, 1, 3)  # grayscale to rgb\n\n    check(video.shape[-1] == 3, ValueError(\"Expect 1 or 3 channel video\"))\n\n    output = ffmpeg.input(\n        \"pipe:\",\n        format=\"rawvideo\",\n        pix_fmt=\"rgb24\",\n        s=\"{}x{}\".format(video.shape[2], video.shape[1]),\n        r=data[\"metadata\"][\"video_fps\"],\n    )\n\n    if _temp_audio_file:\n        output = ffmpeg.concat(output, ffmpeg.input(_temp_audio_file).audio, v=1, a=1)\n\n    process = (\n        output.output(output_filename, pix_fmt=\"yuv420p\", acodec=acodec)\n        .overwrite_output()\n        .global_args(\"-loglevel\", ffmpeg_loglevel)\n        .run_async(pipe_stdin=True)\n    )\n    _, stderr = process.communicate(video.contiguous().numpy().tobytes())\n    if process.poll():\n        raise FFMPEGError(\"Failed to encode the video.\", stderr)\n\n\ndef write_audio(\n    data: Dict,\n    output_filename: str,\n    ffmpeg_loglevel: str = \"error\",\n    acodec: str = \"pcm_s16le\",\n):\n    \"\"\"Save audio from a tensor to a file.\n\n    Arguments:\n        data: A dictionary of the following format:\n            {\n                \"audio\": Tensor [T_audio,C],\n                \"metadata\": {\n                    \"audio_fps\": float,\n                },\n            }\n        output_filename: Filename, .wav is recommended.\n        ffmpeg_loglevel: Log level, see transform_video_file.\n        acodec: Audio codec.\n    \"\"\"\n\n    audio = data[\"audio\"]\n\n    if audio.is_floating_point():\n        audio = (audio * 32767).round().to(torch.int16)\n\n    check(audio.dtype == torch.int16, ValueError(\"Expect int16 audio\"))\n    check(audio.ndim == 2, ValueError(\"Expect 2-dimensional audio\"))\n\n    process = (\n        ffmpeg.input(\n            \"pipe:\",\n            format=\"s16le\",\n            ar=data[\"metadata\"][\"audio_fps\"],\n            ac=audio.shape[-1],\n        )\n        .output(output_filename, acodec=acodec)\n        .overwrite_output()\n        .global_args(\"-loglevel\", ffmpeg_loglevel)\n        .run_async(pipe_stdin=True)\n    )\n\n    _, stderr = process.communicate(audio.contiguous().numpy().tobytes())\n    if process.poll():\n        raise FFMPEGError(\"Failed to encode the audio.\", stderr)\n"
  },
  {
    "path": "corenet/data/video_reader/pyav_reader.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom typing import Dict, Optional, Union\n\nimport av\nimport numpy\nimport torch\n\nfrom corenet.data.transforms.base_transforms import BaseTransformation\nfrom corenet.data.video_reader import VIDEO_READER_REGISTRY, BaseAVReader\nfrom corenet.utils import logger\n\n\n@VIDEO_READER_REGISTRY.register(name=\"pyav\")\nclass PyAVReader(BaseAVReader):\n    \"\"\"\n    Video Reader using PyAV.\n    \"\"\"\n\n    def read_video(\n        self,\n        av_file: str,\n        stream_idx: int = 0,\n        audio_sample_rate: int = -1,\n        custom_frame_transforms: Optional[BaseTransformation] = None,\n        video_only: bool = False,\n        *args,\n        **kwargs,\n    ) -> Dict:\n        with av.open(av_file) as container:\n            audio_frames = video_frames = None\n            audio_fps = video_fps = None\n            for stream in container.streams:\n                if self.fast_decoding:\n                    # use multi-threading for decoding\n                    stream.thread_type = \"AUTO\"\n\n                container.seek(0)\n                if stream.type == \"audio\":\n                    # Skip audio stream if audio not required.\n                    if video_only:\n                        continue\n                    # Compute audio frame stats.\n                    assert (\n                        audio_fps is None\n                    ), f\"Multiple audio streams exist in '{av_file}', while only one is expected. (stream_idx={stream_idx})\"\n                    assert audio_frames is None\n\n                    audio_stream = container.streams.audio[stream_idx]\n                    n_audio_channels = len(audio_stream.layout.channels)\n                    audio_frames = []\n                    if audio_sample_rate > 0:\n                        resampler = av.AudioResampler(rate=audio_sample_rate)\n                    for frame in container.decode(audio=stream_idx):\n                        if audio_sample_rate > 0:\n                            frame = resampler.resample(frame)[0]\n                        audio_frames.append(\n                            frame.to_ndarray().reshape(n_audio_channels, -1)\n                        )\n                    audio_frames = torch.from_numpy(\n                        numpy.concatenate(audio_frames, axis=1)\n                    ).transpose(1, 0)\n\n                    audio_fps = (\n                        audio_sample_rate\n                        if audio_sample_rate > 0\n                        else audio_stream.sample_rate\n                    )\n\n                elif stream.type == \"video\":\n                    assert video_fps is None\n                    assert video_frames is None\n\n                    video_stream = container.streams.video[stream_idx]\n                    n_frames = video_stream.frames\n                    width = video_stream.width\n                    height = video_stream.height\n                    video_fps = float(video_stream.base_rate)\n\n                    video_frames = torch.empty(\n                        size=(n_frames, 3, height, width), dtype=torch.float\n                    )\n                    frame_transforms = (\n                        self.frame_transforms\n                        if custom_frame_transforms is None\n                        else custom_frame_transforms\n                    )\n                    for i, video_frame in enumerate(container.decode(video=stream_idx)):\n                        video_frame = video_frame.to_image()\n                        video_frame = frame_transforms({\"image\": video_frame})[\"image\"]\n                        video_frames[i] = video_frame\n            return {\n                \"audio\": audio_frames,\n                \"video\": video_frames,\n                \"metadata\": {\n                    \"audio_fps\": audio_fps,\n                    \"video_fps\": video_fps,\n                    \"filename\": av_file,\n                },\n            }\n\n    def build_video_metadata(\n        self, video_path: str\n    ) -> Dict[str, Union[str, float, int]]:\n        \"\"\"Generate the metadata for a given video.\n\n        Args:\n            video_path: A video file path.\n\n        Returns:\n            The metadata of the corresponding video. The generated metadata format is:\n            {\n                \"filename\": <str>,\n                \"video_fps\": <float>,\n                \"total_video_frames\" <int>,\n                \"video_duration\": <float>,\n            }\n        \"\"\"\n\n        vmetadata = {}\n        with av.open(video_path) as container:\n            vmetadata[\"filename\"] = video_path\n            video_stream = container.streams.video[0]\n            # NOTE: av package may return invalid 0 as the total number of frames.\n            vmetadata[\"total_video_frames\"] = video_stream.frames\n            if vmetadata[\"total_video_frames\"] == 0:\n                logger.warning(f\"Invalid frame number 0 for {video_path}.\")\n            vmetadata[\"video_fps\"] = float(video_stream.base_rate)\n            vmetadata[\"video_duration\"] = (\n                vmetadata[\"total_video_frames\"] / vmetadata[\"video_fps\"]\n            )\n        return vmetadata\n"
  },
  {
    "path": "corenet/engine/__init__.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom corenet.engine.default_trainer import DefaultTrainer\nfrom corenet.engine.evaluation_engine import Evaluator\n"
  },
  {
    "path": "corenet/engine/default_trainer.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nimport gc\nimport shutil\nimport time\nimport traceback\nfrom typing import Dict, Optional, Tuple, Union\n\nimport torch\nfrom torch import Tensor\nfrom torch.cuda.amp import GradScaler\n\nfrom corenet.constants import DEFAULT_EPOCHS, DEFAULT_ITERATIONS, if_test_env\nfrom corenet.data.loader.dataloader import CoreNetDataLoader\nfrom corenet.data.sampler.base_sampler import BaseSampler, BaseSamplerDDP\nfrom corenet.data.transforms.image_torch import apply_mixing_transforms\nfrom corenet.engine.utils import (\n    autocast_fn,\n    get_batch_size,\n    get_log_writers,\n    log_metrics,\n    step_log_metrics,\n)\nfrom corenet.loss_fn import BaseCriteria\nfrom corenet.metrics.stats import Statistics\nfrom corenet.modeling.misc.averaging_utils import EMA\nfrom corenet.modeling.models.base_model import BaseAnyNNModel\nfrom corenet.optims import BaseOptim\nfrom corenet.optims.scheduler import BaseLRScheduler\nfrom corenet.options.parse_args import parse_validation_metric_names\nfrom corenet.utils import logger\nfrom corenet.utils.checkpoint_utils import save_checkpoint\nfrom corenet.utils.common_utils import move_to_device\nfrom corenet.utils.ddp_utils import dist_barrier, is_master\n\n\nclass DefaultTrainer(object):\n    \"\"\"\n    Default training and validation engine.\n\n    Args:\n        opts: The command-line arguments as a namespace.\n        model: The neural network model to be trained.\n        validation_loader: The data loader for the validation dataset.\n        training_loader: The data loader for the training dataset.\n        criteria: The loss function used for training.\n        optimizer: The optimizer used for training.\n        scheduler: The learning rate scheduler used for training.\n        gradient_scaler: The gradient scaler for mixed precision training.\n        start_epoch: The epoch to start training from.\n        start_iteration: The iteration to start training from.\n        best_metric: The best validation metric value achieved so far.\n        model_ema: An optional instance of EMA model.\n    \"\"\"\n\n    def __init__(\n        self,\n        opts: argparse.Namespace,\n        model: BaseAnyNNModel,\n        validation_loader: CoreNetDataLoader,\n        training_loader: CoreNetDataLoader,\n        criteria: BaseCriteria,\n        optimizer: BaseOptim,\n        scheduler: BaseLRScheduler,\n        gradient_scaler: GradScaler,\n        start_epoch: int = 0,\n        start_iteration: int = 0,\n        best_metric: float = 0.0,\n        model_ema: EMA = None,\n    ) -> None:\n        super(DefaultTrainer, self).__init__()\n\n        self.opts = opts\n\n        self.model = model\n        self.model_ema = model_ema\n        self.criteria = criteria\n        self.optimizer = optimizer\n        self.scheduler = scheduler\n        self.gradient_scaler = gradient_scaler\n\n        self.val_loader = validation_loader\n        self.train_loader = training_loader\n\n        self.device = getattr(opts, \"dev.device\", torch.device(\"cpu\"))\n\n        self.start_epoch = start_epoch\n        self.best_metric = best_metric\n        self.train_iterations = start_iteration\n\n        self.is_master_node = is_master(opts)\n        self.max_iterations_reached = False\n        self.max_iterations = getattr(\n            self.opts, \"scheduler.max_iterations\", DEFAULT_ITERATIONS\n        )\n        self.use_distributed = getattr(self.opts, \"ddp.use_distributed\")\n        self.log_freq = getattr(self.opts, \"common.log_freq\")\n        self.accum_freq = getattr(self.opts, \"common.accum_freq\")\n        self.accum_after_epoch = getattr(self.opts, \"common.accum_after_epoch\")\n\n        self.mixed_precision_training = getattr(opts, \"common.mixed_precision\")\n        self.mixed_precision_dtype = getattr(opts, \"common.mixed_precision_dtype\")\n\n        self.train_metric_names = getattr(opts, \"stats.train\")\n        if isinstance(self.train_metric_names, str):\n            self.train_metric_names = [self.train_metric_names]\n\n        assert isinstance(\n            self.train_metric_names, list\n        ), \"Type of metric names should be list. Got: {}\".format(\n            type(self.train_metric_names)\n        )\n\n        if \"loss\" not in self.train_metric_names:\n            self.train_metric_names.append(self.train_metric_names)\n\n        (\n            self.val_metric_names,\n            self.ckpt_metric,\n            self.ckpt_submetric,\n        ) = parse_validation_metric_names(self.opts)\n\n        self.save_all_checkpoints = getattr(self.opts, \"common.save_all_checkpoints\")\n\n        self.save_location = getattr(opts, \"common.exp_loc\")\n\n        self.log_writers = get_log_writers(self.opts, save_location=self.save_location)\n\n        self.set_grad_to_none = getattr(opts, \"common.set_grad_to_none\")\n\n        # save interval checkpoints every `save_interval_freq` updates on the master node\n        self.save_interval_freq = getattr(opts, \"common.save_interval_freq\")\n        self.eval_every_k_iterations = getattr(opts, \"common.eval_every_k_iterations\")\n\n    def compute_grad_norm(self) -> torch.Tensor:\n        \"\"\"Computes and returns the L2 norm of the gradients.\"\"\"\n        parameters = [p for p in self.model.parameters() if p.grad is not None]\n        if len(parameters) == 0:\n            return None\n\n        norm_type = 2.0  # L2 norm\n\n        inv_scale = 1.0 / self.gradient_scaler.get_scale()\n        total_norm = torch.norm(\n            torch.stack(\n                [\n                    torch.norm(p.grad.detach() * inv_scale, norm_type).to(self.device)\n                    for p in parameters\n                ]\n            ),\n            norm_type,\n        )\n        if total_norm.isnan() or total_norm.isinf():\n            return None\n        return total_norm\n\n    def _zero_grad(self) -> None:\n        \"\"\"Sets the gradients to zero.\n\n        ...note:\n            If 'set_grad_to_none' is enabled, gradients are set to None instead of zero.\n            Caution should be exercised when using this option as setting gradients to None may alter certain behaviors.\n            Refer to the PyTorch's 'torch.optim.Optimizer' documentation for detailed explanations.\n        \"\"\"\n        if self.set_grad_to_none:\n            self.optimizer.zero_grad(set_to_none=True)\n        else:\n            self.optimizer.zero_grad()\n\n    def _set_training_mode(self) -> None:\n        \"\"\"\n        Sets the model and criteria in training mode.\n        \"\"\"\n        self.model.train()\n        self.criteria.train()\n\n    def _set_eval_mode(self) -> None:\n        \"\"\"\n        Sets the model and criteria in eval mode.\n        \"\"\"\n        self.model.eval()\n        self.criteria.eval()\n\n    def _save_and_evaluate_interval_checkpoint(\n        self, epoch: int, iterations: int, loss: torch.Tensor\n    ) -> None:\n        \"\"\"\n        Optionally save the interval checkpoints and evaluate them.\n\n        Args:\n            epoch: Current epoch.\n            iterations: Current training iteration.\n            loss: Loss value.\n        \"\"\"\n        # save the checkpoint every N updates\n        if (self.save_interval_freq > 0) and (\n            iterations + 1\n        ) % self.save_interval_freq == 0:\n\n            # set the model to eval mode and perform evaluation\n            self._set_eval_mode()\n\n            save_checkpoint(\n                iterations=iterations,\n                epoch=epoch,\n                model=self.model,\n                optimizer=self.optimizer,\n                best_metric=self.best_metric,\n                is_best=False,\n                save_dir=self.save_location,\n                is_master_node=self.is_master_node,\n                gradient_scaler=self.gradient_scaler,\n                model_ema=self.model_ema,\n                is_ema_best=False,\n                max_ckpt_metric=False,\n                k_best_checkpoints=-1,\n                save_all_checkpoints=True,\n                is_interval_ckpt=True,\n            )\n\n            # set the model and criteria back to training mode\n            self._set_training_mode()\n\n            if self.is_master_node:\n                logger.info(\n                    \"Checkpoints saved after {} updates at: {}\".format(\n                        iterations, self.save_location\n                    ),\n                    print_line=True,\n                )\n\n        # evaluate the checkpoint every N updates\n        if (\n            self.eval_every_k_iterations > 0\n            and (iterations + 1) % self.eval_every_k_iterations == 0\n        ):\n            # set the model to eval mode and perform evaluation\n            self._set_eval_mode()\n\n            self.val_epoch(epoch=epoch, model=self.model)\n\n            # set the model and criteria back to training mode\n            self._set_training_mode()\n\n    def train_epoch(self, epoch: int) -> Tuple[float, float]:\n        \"\"\"Train the model for one epoch.\n\n        Args:\n            epoch: Current epoch.\n\n        Returns:\n            A tuple containing average values of the training loss and the specified checkpoint metric (e.g., top1 accuracy).\n        \"\"\"\n        time.sleep(\n            if_test_env(0.5, otherwise=2)\n        )  # To prevent possible deadlock during epoch transition\n\n        if self.is_master_node:\n            logger.double_dash_line()\n            logger.info(f\"Training epoch {epoch}\")\n\n        train_stats = Statistics(\n            opts=self.opts,\n            metric_names=self.train_metric_names,\n            is_master_node=self.is_master_node,\n            is_distributed=self.use_distributed,\n            log_writers=self.log_writers,\n        )\n\n        self._set_training_mode()\n\n        accum_freq = self.accum_freq if epoch >= self.accum_after_epoch else 1\n        max_norm = getattr(self.opts, \"common.grad_clip\", None)\n\n        # set the gradient to zero or None\n        self._zero_grad()\n\n        epoch_start_time = time.time()\n        batch_load_start = time.time()\n        grad_norm = torch.tensor([0.0], dtype=torch.float, device=self.device)\n        for batch_id, batch in enumerate(self.train_loader):\n            if self.train_iterations > self.max_iterations:\n                self.max_iterations_reached = True\n                break\n\n            # move to device\n            batch = move_to_device(opts=self.opts, x=batch, device=self.device)\n            # apply mix-up transforms if any\n            batch = apply_mixing_transforms(opts=self.opts, data=batch)\n\n            batch_load_toc = time.time() - batch_load_start\n\n            samples, targets = batch[\"samples\"], batch[\"targets\"]\n\n            batch_size = get_batch_size(samples)\n\n            # update the learning rate\n            self.optimizer = self.scheduler.update_lr(\n                optimizer=self.optimizer, epoch=epoch, curr_iter=self.train_iterations\n            )\n\n            with autocast_fn(\n                enabled=self.mixed_precision_training,\n                amp_precision=self.mixed_precision_dtype,\n            ):\n                # prediction\n                pred_label = self.model(samples)\n                # compute loss\n                loss_dict_or_tensor: Union[Dict, Tensor] = self.criteria(\n                    input_sample=samples,\n                    prediction=pred_label,\n                    target=targets,\n                    epoch=epoch,\n                    iterations=self.train_iterations,\n                )\n\n                if isinstance(loss_dict_or_tensor, Dict):\n                    if \"total_loss\" not in loss_dict_or_tensor.keys():\n                        logger.error(\n                            \"total_loss key is required for loss functions that return outputs as dictionary.\"\n                        )\n                    loss = loss_dict_or_tensor[\"total_loss\"]\n                elif isinstance(loss_dict_or_tensor, Tensor):\n                    loss = loss_dict_or_tensor\n                else:\n                    logger.error(\"Loss value should be an instance of Tensor or Dict\")\n\n                if isinstance(loss, torch.Tensor) and torch.isnan(loss):\n                    logger.error(\"Nan encountered in the loss.\")\n\n            # perform the backward pass with gradient accumulation [Optional]\n            self.gradient_scaler.scale(loss).backward()\n\n            if (batch_id + 1) % accum_freq == 0:\n                if max_norm is not None:\n                    # For gradient clipping, unscale the gradients and then clip them\n                    self.gradient_scaler.unscale_(self.optimizer)\n                    torch.nn.utils.clip_grad_norm_(\n                        self.model.parameters(), max_norm=max_norm\n                    )\n\n                if \"grad_norm\" in self.train_metric_names:\n                    # compute grad_norm for logging purposes.\n                    # We can't use the output of clip_grad_norm_ because it returns the total norm before clipping\n                    grad_norm = self.compute_grad_norm()\n\n                # optimizer step\n                self.gradient_scaler.step(optimizer=self.optimizer)\n                # update the scale for next batch\n                self.gradient_scaler.update()\n                # set the gradient to zero or None\n                self._zero_grad()\n\n                self.train_iterations += 1\n\n                if self.model_ema is not None:\n                    self.model_ema.update_parameters(self.model)\n\n            train_stats.update(\n                pred_label=pred_label,\n                target_label=targets,\n                extras={\"loss\": loss_dict_or_tensor, \"grad_norm\": grad_norm},\n                batch_time=batch_load_toc,\n                batch_size=batch_size,\n            )\n\n            self._save_and_evaluate_interval_checkpoint(\n                epoch=epoch, iterations=self.train_iterations, loss=loss\n            )\n\n            if batch_id % self.log_freq == 0 and self.is_master_node:\n                lr = self.scheduler.retrieve_lr(self.optimizer)\n                train_stats.iter_summary(\n                    epoch=epoch,\n                    n_processed_samples=self.train_iterations,\n                    total_samples=self.max_iterations,\n                    learning_rate=lr,\n                    elapsed_time=epoch_start_time,\n                )\n                train_metrics = train_stats._compute_avg_statistics_all()\n                for log_writer in self.log_writers:\n                    step_log_metrics(\n                        lrs=lr,\n                        log_writer=log_writer,\n                        step=self.train_iterations,\n                        metrics=train_metrics,\n                    )\n            batch_load_start = time.time()\n\n        avg_loss = train_stats.avg_statistics(\n            metric_name=\"loss\", sub_metric_name=\"total_loss\"\n        )\n        train_stats.epoch_summary(\n            epoch=epoch, stage=\"training\", epoch_time=time.time() - epoch_start_time\n        )\n        avg_ckpt_metric = train_stats.avg_statistics(\n            metric_name=self.ckpt_metric, sub_metric_name=self.ckpt_submetric\n        )\n\n        gc.collect()\n\n        return avg_loss, avg_ckpt_metric\n\n    def val_epoch(\n        self, epoch: int, model: BaseAnyNNModel, extra_str=\"\"\n    ) -> Tuple[float, float]:\n        \"\"\"Validate the model.\n\n        Args:\n            epoch: Current epoch.\n            model: The neural network model to be validated.\n            extra_str: Extra string to append to the epoch summary. For example, specify whether the model is EMA or not.\n\n        Returns:\n            A tuple containing average values of the validation loss and the specified checkpoint metric (e.g., top1 accuracy).\n        \"\"\"\n        if self.val_loader is None:\n            return 0.0, 0.0\n\n        time.sleep(\n            if_test_env(0.5, otherwise=2)\n        )  # To prevent possible deadlock during epoch transition\n\n        if self.is_master_node:\n            logger.double_dash_line()\n            logger.info(f\"Validation epoch {epoch}\")\n\n        validation_stats = Statistics(\n            opts=self.opts,\n            metric_names=self.val_metric_names,\n            is_master_node=self.is_master_node,\n            is_distributed=self.use_distributed,\n            log_writers=self.log_writers,\n        )\n\n        model.eval()\n\n        if model.training:\n            if self.is_master_node:\n                logger.warning(\n                    \"Model is in training mode. Switching to evaluation mode\"\n                )\n            model.eval()\n\n        self.criteria.eval()\n        if self.criteria.training:\n            self.criteria.eval()\n\n        with torch.no_grad():\n            epoch_start_time = time.time()\n            # When validation dataset is an instance of Iterable dataset, then total_samples is redundant.\n            total_samples = len(self.val_loader)\n            processed_samples = 0\n            lr = self.scheduler.retrieve_lr(self.optimizer)\n            for batch_id, batch in enumerate(self.val_loader):\n                batch = move_to_device(opts=self.opts, x=batch, device=self.device)\n\n                samples, targets = batch[\"samples\"], batch[\"targets\"]\n\n                batch_size = get_batch_size(samples)\n\n                with autocast_fn(\n                    enabled=self.mixed_precision_training,\n                    amp_precision=self.mixed_precision_dtype,\n                ):\n                    # prediction\n                    pred_label = model(samples)\n                    # compute loss\n                    loss_dict_or_tensor = self.criteria(\n                        input_sample=samples, prediction=pred_label, target=targets\n                    )\n\n                processed_samples += batch_size\n\n                validation_stats.update(\n                    pred_label=pred_label,\n                    target_label=targets,\n                    extras={\"loss\": loss_dict_or_tensor},\n                    batch_time=0.0,\n                    batch_size=batch_size,\n                    # TODO: use is_evaluation?\n                )\n\n                if batch_id % self.log_freq == 0 and self.is_master_node:\n                    validation_stats.iter_summary(\n                        epoch=epoch,\n                        n_processed_samples=processed_samples,\n                        total_samples=total_samples,\n                        elapsed_time=epoch_start_time,\n                        learning_rate=lr,\n                    )\n\n        validation_stats.epoch_summary(\n            epoch=epoch,\n            stage=\"validation\" + extra_str,\n            epoch_time=time.time() - epoch_start_time,\n        )\n        avg_loss = validation_stats.avg_statistics(\n            metric_name=\"loss\", sub_metric_name=\"total_loss\"\n        )\n        avg_ckpt_metric = validation_stats.avg_statistics(\n            metric_name=self.ckpt_metric, sub_metric_name=self.ckpt_submetric\n        )\n\n        if avg_ckpt_metric is None:\n            avg_ckpt_metric = avg_loss\n\n        gc.collect()\n\n        return avg_loss, avg_ckpt_metric\n\n    def run(\n        self, train_sampler: Optional[Union[BaseSampler, BaseSamplerDDP]] = None\n    ) -> None:\n        \"\"\"Train and validate the model.\n\n        Args:\n            train_sampler: An optional sampler for training dataset.\n        \"\"\"\n\n        train_start_time = time.time()\n\n        cfg_file = getattr(self.opts, \"common.config_file\", None)\n        if cfg_file is not None and self.is_master_node:\n            dst_cfg_file = \"{}/config.yaml\".format(self.save_location)\n            shutil.copy(src=cfg_file, dst=dst_cfg_file)\n            logger.info(\n                \"Configuration file is stored here: {}\".format(\n                    logger.color_text(dst_cfg_file)\n                )\n            )\n\n        keep_k_best_ckpts = getattr(self.opts, \"common.k_best_checkpoints\", 5)\n        ema_best_metric = self.best_metric\n        is_ema_best = False\n\n        try:\n            max_epochs = getattr(self.opts, \"scheduler.max_epochs\", DEFAULT_EPOCHS)\n            max_checkpoint_metric = getattr(self.opts, \"stats.checkpoint_metric_max\")\n            for epoch in range(self.start_epoch, max_epochs):\n                if train_sampler is not None:\n                    # Note that we are using our owm implementations of data samplers\n                    # and we have defined this function for both distributed and non-distributed cases\n                    train_sampler.set_epoch(epoch)\n                    train_sampler.update_scales(\n                        epoch=epoch, is_master_node=self.is_master_node\n                    )\n\n                train_loss, train_ckpt_metric = self.train_epoch(epoch)\n\n                val_loss, val_ckpt_metric = self.val_epoch(\n                    epoch=epoch, model=self.model\n                )\n\n                if max_checkpoint_metric:\n                    is_best = val_ckpt_metric >= self.best_metric\n                    self.best_metric = max(val_ckpt_metric, self.best_metric)\n                else:\n                    is_best = val_ckpt_metric <= self.best_metric\n                    self.best_metric = min(val_ckpt_metric, self.best_metric)\n\n                val_ema_loss = None\n                val_ema_ckpt_metric = None\n                if self.model_ema is not None:\n                    val_ema_loss, val_ema_ckpt_metric = self.val_epoch(\n                        epoch=epoch, model=self.model_ema.ema_model, extra_str=\" (EMA)\"\n                    )\n                    if max_checkpoint_metric:\n                        is_ema_best = val_ema_ckpt_metric >= ema_best_metric\n                        ema_best_metric = max(val_ema_ckpt_metric, ema_best_metric)\n                    else:\n                        is_ema_best = val_ema_ckpt_metric <= ema_best_metric\n                        ema_best_metric = min(val_ema_ckpt_metric, ema_best_metric)\n\n                gc.collect()\n\n                save_checkpoint(\n                    iterations=self.train_iterations,\n                    epoch=epoch,\n                    model=self.model,\n                    optimizer=self.optimizer,\n                    best_metric=self.best_metric,\n                    is_best=is_best,\n                    save_dir=self.save_location,\n                    is_master_node=self.is_master_node,\n                    model_ema=self.model_ema,\n                    is_ema_best=is_ema_best,\n                    ema_best_metric=ema_best_metric,\n                    gradient_scaler=self.gradient_scaler,\n                    max_ckpt_metric=max_checkpoint_metric,\n                    k_best_checkpoints=keep_k_best_ckpts,\n                    save_all_checkpoints=self.save_all_checkpoints,\n                    is_interval_ckpt=False,\n                )\n\n                if self.is_master_node:\n                    lr_list = self.scheduler.retrieve_lr(self.optimizer)\n\n                    for log_writer in self.log_writers:\n                        log_metrics(\n                            lrs=lr_list,\n                            log_writer=log_writer,\n                            train_loss=train_loss,\n                            val_loss=val_loss,\n                            epoch=epoch,\n                            best_metric=self.best_metric,\n                            val_ema_loss=val_ema_loss,\n                            ckpt_metric_name=self.ckpt_metric,\n                            train_ckpt_metric=train_ckpt_metric,\n                            val_ckpt_metric=val_ckpt_metric,\n                            val_ema_ckpt_metric=val_ema_ckpt_metric,\n                        )\n\n                if self.max_iterations_reached:\n                    if self.use_distributed:\n                        dist_barrier()\n\n                    if self.is_master_node:\n                        logger.info(\"Max. iterations for training reached\")\n                    break\n        except KeyboardInterrupt as e:\n            if self.is_master_node:\n                logger.log(\"Keyboard interruption. Exiting from early training\")\n                raise e\n        except Exception as e:\n            if \"out of memory\" in str(e):\n                logger.log(\"OOM exception occurred\")\n                n_gpus = getattr(self.opts, \"dev.num_gpus\", 1)\n                for dev_id in range(n_gpus):\n                    mem_summary = torch.cuda.memory_summary(\n                        device=torch.device(\"cuda:{}\".format(dev_id)), abbreviated=True\n                    )\n                    logger.log(\"Memory summary for device id: {}\".format(dev_id))\n                    print(mem_summary)\n\n            logger.log(\n                f\"Exception occurred that interrupted the training:\\n{traceback.format_exc()}\"\n            )\n            raise e\n        finally:\n            use_distributed = getattr(self.opts, \"ddp.use_distributed\", False)\n            if use_distributed:\n                torch.distributed.destroy_process_group()\n\n            torch.cuda.empty_cache()\n\n            for log_writer in self.log_writers:\n                log_writer.close()\n\n            if self.is_master_node:\n                train_end_time = time.time()\n                hours, rem = divmod(train_end_time - train_start_time, 3600)\n                minutes, seconds = divmod(rem, 60)\n                train_time_str = \"{:0>2}:{:0>2}:{:05.2f}\".format(\n                    int(hours), int(minutes), seconds\n                )\n                logger.log(\"Training took {}\".format(train_time_str))\n"
  },
  {
    "path": "corenet/engine/detection_utils/__init__.py",
    "content": ""
  },
  {
    "path": "corenet/engine/detection_utils/coco_map.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport io\nimport os\nfrom contextlib import redirect_stdout\nfrom typing import List, Optional\n\nimport numpy as np\nfrom pycocotools import mask as maskUtils\nfrom pycocotools.coco import COCO\nfrom pycocotools.cocoeval import COCOeval\n\nfrom corenet.utils import logger\n\n\ndef coco_evaluation(\n    opts,\n    predictions: List[np.ndarray],\n    split: Optional[str] = \"val\",\n    year: Optional[int] = 2017,\n    *args,\n    **kwargs\n) -> None:\n    root = getattr(opts, \"dataset.root_val\", None)\n    ann_file = os.path.join(root, \"annotations/instances_{}{}.json\".format(split, year))\n    bkrnd_id = 0 if getattr(opts, \"dataset.detection.no_background_id\", False) else 1\n    coco = COCO(ann_file)\n    coco_categories = sorted(coco.getCatIds())\n\n    coco_id_to_contiguous_id = {\n        coco_id: i + bkrnd_id for i, coco_id in enumerate(coco_categories)\n    }\n    contiguous_id_to_coco_id = {v: k for k, v in coco_id_to_contiguous_id.items()}\n\n    coco_results = {\"bbox\": []}\n\n    for i, (image_id, boxes, labels, scores, masks) in enumerate(predictions):\n        if labels.shape[0] == 0:\n            continue\n\n        boxes = boxes.tolist()\n        labels = labels.tolist()\n        scores = scores.tolist()\n\n        coco_results[\"bbox\"].extend(\n            [\n                {\n                    \"image_id\": image_id,\n                    \"category_id\": contiguous_id_to_coco_id[labels[k]],\n                    \"bbox\": [\n                        box[0],\n                        box[1],\n                        box[2] - box[0],\n                        box[3] - box[1],\n                    ],  # to xywh format\n                    \"score\": scores[k],\n                }\n                for k, box in enumerate(boxes)\n            ]\n        )\n\n        if masks is not None:\n            if \"segm\" not in coco_results:\n                coco_results[\"segm\"] = []\n\n            # Masks are in [N, H, W] format\n            rles = [\n                maskUtils.encode(\n                    np.array(mask[:, :, np.newaxis], dtype=np.uint8, order=\"F\")\n                )[0]\n                for mask in masks\n            ]\n\n            for rle in rles:\n                rle[\"counts\"] = rle[\"counts\"].decode(\"utf-8\")\n            coco_results[\"segm\"].extend(\n                [\n                    {\n                        \"image_id\": image_id,\n                        \"category_id\": contiguous_id_to_coco_id[labels[seg_id]],\n                        \"segmentation\": rle,\n                        \"score\": scores[seg_id],\n                    }\n                    for seg_id, rle in enumerate(rles)\n                ]\n            )\n\n    if len(coco_results) == 0:\n        logger.error(\"Cannot compute COCO stats. Please check the predictions\")\n\n    for iou_type, coco_result in coco_results.items():\n        with redirect_stdout(io.StringIO()):\n            coco_dt = COCO.loadRes(coco, coco_result)\n\n        # Run COCO evaluation\n        coco_eval = COCOeval(coco, coco_dt, iou_type)\n        coco_eval.evaluate()\n        coco_eval.accumulate()\n        coco_eval.summarize()\n\n\ndef compute_quant_scores(opts, predictions: List, *args, **kwargs) -> None:\n    dataset_name = getattr(opts, \"dataset.name\", None)\n    if dataset_name.find(\"coco\") > -1:\n        coco_evaluation(opts=opts, predictions=predictions)\n    else:\n        raise NotImplementedError\n"
  },
  {
    "path": "corenet/engine/eval_detection.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nimport glob\nimport os.path\nfrom typing import Dict, List, Optional, Tuple\n\nimport numpy as np\nimport torch\nfrom PIL import Image\nfrom torch import Tensor\nfrom torch.nn import functional as F\nfrom torchvision.transforms import functional as F_vision\nfrom tqdm import tqdm\n\nfrom corenet.constants import SUPPORTED_IMAGE_EXTNS\nfrom corenet.data import create_test_loader\nfrom corenet.data.datasets.detection.coco_base import COCODetection\nfrom corenet.engine.detection_utils.coco_map import compute_quant_scores\nfrom corenet.engine.utils import autocast_fn\nfrom corenet.modeling import get_model\nfrom corenet.modeling.models.detection import DetectionPredTuple\nfrom corenet.modeling.models.detection.base_detection import BaseDetection\nfrom corenet.options.opts import get_training_arguments\nfrom corenet.utils import logger, resources\nfrom corenet.utils.common_utils import create_directories, device_setup\nfrom corenet.utils.ddp_utils import is_master\nfrom corenet.utils.download_utils import get_local_path\nfrom corenet.utils.tensor_utils import image_size_from_opts, to_numpy\nfrom corenet.utils.visualization_utils import draw_bounding_boxes\n\n# Evaluation on MSCOCO detection task\nobject_names = COCODetection.class_names()\n\n\ndef predict_and_save(\n    opts,\n    input_tensor: Tensor,\n    model: BaseDetection,\n    input_np: Optional[np.ndarray] = None,\n    device: torch.device = torch.device(\"cpu\"),\n    is_coco_evaluation: Optional[bool] = False,\n    file_name: Optional[str] = None,\n    output_stride: int = 32,\n    orig_h: Optional[int] = None,\n    orig_w: Optional[int] = None,\n) -> Optional[Tuple[np.ndarray, np.ndarray, np.ndarray, Optional[np.ndarray]]]:\n    \"\"\"\n    Predict the detection outputs (e.g., bounding box) and optionally save them.\n\n    Args:\n        opts: Command-line arguments.\n        input_tensor: Input image tensor of shape [batch size, image channels, height, width].\n        model: Detection model.\n        input_np: Input image numpy array of shape [original height, original width, image channels]. The 'input_np' does not\n            go under any pre-processing and is useful for visualization purposes. When it is `None' and 'is_coco_evaluation' is\n            not enabled, then 'input_np' is obtained from 'input_tensor'.\n        device: Inference device.\n        is_coco_evaluation: Evaluating on MS-COCO object detection or not.\n        file_name: Name of the output image file. If it is not specified, then output will not be saved.\n        output_stride: Output stride. Checks if input dimensions are multiple of output stride or not. This argument\n            is used to avoid dimension mismatch errors.\n        orig_h: Original image height. This may be different from @input_tensor's height because of image transforms. Useful\n            for visualizing detection results.\n        orig_w: Original image width. This may be different from @input_tensor's width because of image transforms. Useful\n            for visualizing detection results.\n\n    Returns:\n        When 'is_coco_evaluation' is enabled, the function returns a tuple that includes bounding boxes for each object,\n        predicted labels for each box, predicted scores for each box, and instance masks for each box.\n        Otherwise, nothing is returned.\n    \"\"\"\n    mixed_precision_training = getattr(opts, \"common.mixed_precision\")\n    mixed_precision_dtype = getattr(opts, \"common.mixed_precision_dtype\")\n\n    if input_np is None and not is_coco_evaluation:\n        input_np = to_numpy(input_tensor).squeeze(  # convert to numpy\n            0\n        )  # remove batch dimension\n\n    curr_height, curr_width = input_tensor.shape[2:]\n\n    # check if dimensions are multiple of output_stride, otherwise, we get dimension mismatch errors.\n    # if not, then resize them\n    new_h = (curr_height // output_stride) * output_stride\n    new_w = (curr_width // output_stride) * output_stride\n\n    if new_h != curr_height or new_w != curr_width:\n        # resize the input image, so that we do not get dimension mismatch errors in the forward pass\n        input_tensor = F.interpolate(\n            input=input_tensor,\n            size=(new_h, new_w),\n            mode=\"bilinear\",\n            align_corners=False,\n        )\n\n    # move data to device\n    input_tensor = input_tensor.to(device)\n\n    with autocast_fn(\n        enabled=mixed_precision_training, amp_precision=mixed_precision_dtype\n    ):\n        # prediction\n        # We dot scale inside the prediction function because we resize the input tensor such\n        # that the dimensions are divisible by output stride.\n        prediction: DetectionPredTuple = model.predict(input_tensor, is_scaling=False)\n\n    if orig_w is None:\n        assert orig_h is None\n        orig_h, orig_w = input_np.shape[:2]\n    elif orig_h is None:\n        assert orig_w is None\n        orig_h, orig_w = input_np.shape[:2]\n    assert orig_h is not None and orig_w is not None\n\n    # convert tensors to numpy\n    boxes = prediction.boxes.cpu().numpy()\n    labels = prediction.labels.cpu().numpy()\n    scores = prediction.scores.cpu().numpy()\n\n    masks = prediction.masks\n\n    # Ensure that there is at least one mask\n    if masks is not None and masks.shape[0] > 0:\n        # masks are in [N, H, W] format\n        # for interpolation, add a dummy batch dimension\n        masks = F.interpolate(\n            masks.unsqueeze(0),\n            size=(orig_h, orig_w),\n            mode=\"bilinear\",\n            align_corners=True,\n        ).squeeze(0)\n        # convert to binary masks\n        masks = masks > 0.5\n        masks = masks.cpu().numpy()\n\n    boxes[..., 0::2] = np.clip(a_min=0, a_max=orig_w, a=boxes[..., 0::2] * orig_w)\n    boxes[..., 1::2] = np.clip(a_min=0, a_max=orig_h, a=boxes[..., 1::2] * orig_h)\n\n    if is_coco_evaluation:\n        return boxes, labels, scores, masks\n\n    detection_res_file_name = None\n    if file_name is not None:\n        file_name = file_name.split(os.sep)[-1].split(\".\")[0] + \".jpg\"\n        res_dir = \"{}/detection_results\".format(getattr(opts, \"common.exp_loc\", None))\n        if not os.path.isdir(res_dir):\n            os.makedirs(res_dir, exist_ok=True)\n        detection_res_file_name = \"{}/{}\".format(res_dir, file_name)\n\n    draw_bounding_boxes(\n        image=input_np,\n        boxes=boxes,\n        labels=labels,\n        scores=scores,\n        masks=masks,\n        # some models may not use background class which is present in class names.\n        # adjust the class names\n        object_names=(\n            object_names[-model.n_detection_classes :]\n            if hasattr(model, \"n_detection_classes\")\n            else object_names\n        ),\n        is_bgr_format=True,\n        save_path=detection_res_file_name,\n    )\n\n\ndef read_and_process_image(\n    opts: argparse.Namespace, file_path: str\n) -> Tuple[Tensor, np.ndarray, int, int]:\n    \"\"\"Read and converts the input image into a tensor.\n\n    Args:\n        opts: Command-line arguments.\n        file_path: Path of the image file.\n\n    Returns:\n        A tuple containing:\n            1. Image tensor with shape [1, C, H, W]. The tensor values are normalized between 0 and 1.\n            2. Original RGB image as numpy array.\n            3. Height of the original image.\n            4. Width of the original image.\n    \"\"\"\n    input_img = Image.open(file_path).convert(\"RGB\")\n    input_np = np.array(input_img)\n    orig_w, orig_h = input_img.size\n\n    # Resize the image to the resolution that detector supports\n    res_h, res_w = image_size_from_opts(opts)\n    input_img = F_vision.resize(\n        input_img,\n        size=[res_h, res_w],\n        interpolation=F_vision.InterpolationMode.BILINEAR,\n    )\n    input_tensor = F_vision.pil_to_tensor(input_img)\n    input_tensor = input_tensor.float().div(255.0).unsqueeze(0)\n    return input_tensor, input_np, orig_h, orig_w\n\n\n@torch.no_grad()\ndef predict_labeled_dataset(opts: argparse.Namespace) -> None:\n    \"\"\"Generate predictions for the labeled dataset.\n\n    This function predicts detection outputs for RGB input images and calculates detection accuracy, measured\n    using COCO API, through comparison between predicted detection outputs and ground truth labels.\n\n    Args:\n        opts: Command-line arguments.\n    \"\"\"\n    device = getattr(opts, \"dev.device\")\n\n    # set-up data loaders\n    test_loader = create_test_loader(opts)\n\n    # set-up the model\n    model = get_model(opts)\n    model.eval()\n    model.info()\n    model = model.to(device=device)\n\n    predictions = []\n    for batch in tqdm(test_loader):\n        samples, targets = batch[\"samples\"], batch[\"targets\"]\n\n        if isinstance(samples, Dict):\n            assert (\n                \"image\" in samples\n            ), \"Samples does not contain 'image' key. Please check.\"\n            input_tensor = samples[\"image\"]\n        elif isinstance(samples, torch.Tensor):\n            input_tensor = samples\n        else:\n            raise NotImplementedError(\n                \"Only dictionary and tensor types are supported for the input sample.\"\n            )\n\n        orig_w = targets[\"image_width\"].item()\n        orig_h = targets[\"image_height\"].item()\n        image_id = targets[\"image_id\"].item()\n\n        boxes, labels, scores, masks = predict_and_save(\n            opts=opts,\n            input_tensor=input_tensor,\n            model=model,\n            device=device,\n            is_coco_evaluation=True,\n            orig_w=orig_w,\n            orig_h=orig_h,\n        )\n\n        predictions.append([image_id, boxes, labels, scores, masks])\n\n    compute_quant_scores(opts=opts, predictions=predictions)\n\n\n@torch.no_grad()\ndef predict_image(opts: argparse.Namespace, file_path: str) -> None:\n    \"\"\"Generate predictions for an RGB image.\n\n    Note that the predictions are saved in 'common.results_loc' directory.\n\n    Args:\n        opts: Command-line arguments.\n        file_path: Path of the image file.\n    \"\"\"\n    local_file_path = get_local_path(opts, file_path)\n    if not os.path.isfile(local_file_path):\n        logger.error(\"Image file does not exist at: {}\".format(local_file_path))\n\n    input_tensor, input_imp_copy, orig_h, orig_w = read_and_process_image(\n        opts, local_file_path\n    )\n\n    file_name = os.path.basename(local_file_path)\n\n    device = getattr(opts, \"dev.device\")\n    # set-up the model\n    model = get_model(opts)\n    model.eval()\n    model.info()\n    model = model.to(device=device)\n\n    predict_and_save(\n        opts=opts,\n        input_tensor=input_tensor,\n        input_np=input_imp_copy,\n        file_name=file_name,\n        model=model,\n        device=device,\n        orig_h=orig_h,\n        orig_w=orig_w,\n    )\n\n\n@torch.no_grad()\ndef predict_images_in_folder(opts: argparse.Namespace) -> None:\n    \"\"\"Generate predictions for all RGB images stored in a folder.\n\n    The prediction outputs are saved in 'common.results_loc' directory.\n\n    Args:\n        opts: Command-line arguments.\n\n    ...note:\n        The path of the folder containong RGB images is supplied using 'evaluation.detection.path' argument.\n    \"\"\"\n    img_folder_path = getattr(opts, \"evaluation.detection.path\")\n    if img_folder_path is None:\n        logger.error(\n            \"Image folder is not passed. Please use 'evaluation.detection.path' argument to pass the location of image folder.\"\n        )\n    elif not os.path.isdir(img_folder_path):\n        logger.error(f\"Image folder does not exist at {img_folder_path}. Please check.\")\n\n    img_files = []\n    for e in SUPPORTED_IMAGE_EXTNS:\n        img_files_with_extn = glob.glob(\"{}/*{}\".format(img_folder_path, e))\n        if len(img_files_with_extn) > 0 and isinstance(img_files_with_extn, list):\n            img_files.extend(img_files_with_extn)\n\n    if len(img_files) == 0:\n        logger.error(f\"Image files are not found at {img_folder_path}. Please check.\")\n\n    logger.log(\n        f\"Number of image files found at {img_folder_path} are {len(img_files)}.\"\n    )\n\n    device = getattr(opts, \"dev.device\")\n    # set-up the model\n    model = get_model(opts)\n    model.eval()\n    model.info()\n    model = model.to(device=device)\n\n    for image_fname in tqdm(img_files):\n        input_tensor, input_np, orig_h, orig_w = read_and_process_image(\n            opts, image_fname\n        )\n\n        predict_and_save(\n            opts=opts,\n            input_tensor=input_tensor,\n            input_np=input_np,\n            file_name=os.path.basename(image_fname),\n            model=model,\n            device=device,\n            orig_h=orig_h,\n            orig_w=orig_w,\n        )\n\n\ndef main_detection_evaluation(args: Optional[List[str]] = None) -> None:\n    \"\"\"Entrypoint for detection evaluation.\"\"\"\n    opts = get_training_arguments(args=args)\n\n    dataset_name = getattr(opts, \"dataset.name\")\n    if dataset_name.find(\"coco\") > -1:\n        # replace model specific datasets (e.g., coco_ssd) with base COCO dataset\n        setattr(opts, \"dataset.name\", \"coco\")\n        logger.log(\n            \"For evaluation, we use a base coco dataset class instead of model-specific COCO dataset class.\"\n        )\n\n    # device set-up\n    opts = device_setup(opts)\n    is_master_node = is_master(opts)\n\n    # create the directory for saving results\n    save_dir = getattr(opts, \"common.results_loc\")\n    run_label = getattr(opts, \"common.run_label\")\n    exp_dir = \"{}/{}\".format(save_dir, run_label)\n    setattr(opts, \"common.exp_loc\", exp_dir)\n    logger.log(\"Results (if any) will be stored here: {}\".format(exp_dir))\n\n    create_directories(dir_path=exp_dir, is_master_node=is_master_node)\n\n    num_gpus = getattr(opts, \"dev.num_gpus\")\n    assert (\n        num_gpus <= 1\n    ), f\"Testing of detection models is supported either on CPUs or a single GPU. Got: {num_gpus}.\"\n\n    # DDP is required neither for a single GPU task nor for a CPU-only task. Therefore, it is disabled.\n    # If it is required, please ensure that the DDP environment is properly initialized.\n    setattr(opts, \"ddp.use_distributed\", False)\n\n    dataset_workers = getattr(opts, \"dataset.workers\")\n\n    if dataset_workers == -1:\n        # No of data workers = no of CPUs (if not specified or -1)\n        setattr(opts, \"dataset.workers\", resources.cpu_count())\n        logger.log(\"Setting number of dataset workers as number of available CPUs.\")\n\n    eval_mode = getattr(opts, \"evaluation.detection.mode\")\n\n    if eval_mode == \"single_image\":\n        # test a single image\n        img_f_name = getattr(opts, \"evaluation.detection.path\")\n        predict_image(opts, img_f_name)\n    elif eval_mode == \"image_folder\":\n        # test all images in a folder\n        predict_images_in_folder(opts=opts)\n    elif eval_mode == \"validation_set\":\n        assert (\n            getattr(opts, \"dataset.eval_batch_size0\") == 1\n        ), \"For evaluation on validation set, we need a batch size of 1.\"\n        # evaluate and compute stats for labeled image dataset\n        # This is useful for generating results for validation set and compute quantitative results\n        predict_labeled_dataset(opts=opts)\n    else:\n        logger.error(\n            f\"Supported modes are 'single_image', 'image_folder', and 'validation_set'. Got: {eval_mode}.\"\n        )\n"
  },
  {
    "path": "corenet/engine/eval_segmentation.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\nimport argparse\nimport copy\nimport glob\nimport os\nfrom typing import List, Optional, Tuple\n\nimport torch\nfrom PIL import Image\nfrom torch import Tensor\nfrom torch.nn import functional as F\nfrom torchvision.transforms import functional as F_vision\nfrom tqdm import tqdm\n\nfrom corenet.constants import SUPPORTED_IMAGE_EXTNS\nfrom corenet.data import create_test_loader\nfrom corenet.engine.utils import autocast_fn\nfrom corenet.metrics.confusion_mat import ConfusionMatrix\nfrom corenet.modeling import get_model\nfrom corenet.modeling.models import BaseAnyNNModel\nfrom corenet.options.opts import get_training_arguments\nfrom corenet.utils import logger, resources\nfrom corenet.utils.color_map import Colormap\nfrom corenet.utils.common_utils import create_directories, device_setup\nfrom corenet.utils.ddp_utils import is_master\nfrom corenet.utils.download_utils import get_local_path\nfrom corenet.utils.tensor_utils import image_size_from_opts\nfrom corenet.utils.visualization_utils import convert_to_cityscape_format\n\n\"\"\"\nNotes:\n\n1) We have separate scripts for evaluating segmentation models because the size of input images varies and\nwe do not want to apply any resizing operations to input because that distorts the quality and hurts the performance.\n\n2) [Optional] We want to save the outputs in the same size as that of the input image.\n\"\"\"\n\n\ndef predict_and_save(\n    opts: argparse.Namespace,\n    input_tensor: Tensor,\n    file_name: str,\n    orig_h: int,\n    orig_w: int,\n    model: BaseAnyNNModel,\n    target_mask: Optional[Tensor] = None,\n    device: torch.device = torch.device(\"cpu\"),\n    conf_mat: Optional[ConfusionMatrix] = None,\n    color_map: List = None,\n    orig_image: Optional[Image.Image] = None,\n    adjust_label: Optional[int] = 0,\n    is_cityscape: bool = False,\n) -> None:\n    \"\"\"Predict the segmentation mask and optionally save them.\n\n    Args:\n        opts: Command-line arguments.\n        input_tensor: Input image tensor of shape [batch size, image channels, height, width].\n        file_name: Name of the image file.\n        orig_h: Original image height. This may be different from @input_tensor's height because of image transforms.\n        orig_w: Original image width. This may be different from @input_tensor's width because of image transforms.\n        model: Segmentation model.\n        target_mask: Optional target segmentation mask. If supplied, it will be used for computing confusion matrix with model's mask prediction.\n        device: Inference device.\n        conf_mat: Instance of ConfusionMatrix.\n        color_map: Color mapping for converting predicted binary masks into colored representations.\n        orig_image: The original RGB image, if provided, is used for overlaying segmentation predictions.\n        adjust_label: Increase the predicted and target mask value by this factor.\n        is_cityscape: Generating predictions on Cityscape dataset.\n\n    ...note:\n        1. If 'evaluation.segmentation.apply_color_map' is enabled using command-line arguments or configuration file,\n            then masks are also converted to colored representations.\n        2. If 'evaluation.segmentation.save_masks' is enabled using command-line arguments or configuration file,\n            then binary masks are also saved.\n\n    \"\"\"\n\n    mixed_precision_training = getattr(opts, \"common.mixed_precision\")\n    mixed_precision_dtype = getattr(opts, \"common.mixed_precision_dtype\")\n\n    output_stride = getattr(opts, \"model.segmentation.output_stride\")\n    if output_stride == 1:\n        # we set it to 32 because most of the ImageNet models have 5 downsampling stages (2^5 = 32)\n        output_stride = 32\n\n    if orig_image is None:\n        orig_image = F_vision.to_pil_image(input_tensor[0])\n\n    curr_h, curr_w = input_tensor.shape[2:]\n\n    # check if dimensions are multiple of output_stride, otherwise, we get dimension mismatch errors.\n    # if not, then resize them\n    new_h = (curr_h // output_stride) * output_stride\n    new_w = (curr_w // output_stride) * output_stride\n\n    if new_h != curr_h or new_w != curr_w:\n        # resize the input image, so that we do not get dimension mismatch errors in the forward pass\n        input_tensor = F.interpolate(\n            input=input_tensor, size=(new_h, new_w), mode=\"bilinear\", align_corners=True\n        )\n\n    file_name = file_name.split(os.sep)[-1].split(\".\")[0] + \".png\"\n\n    # move data to device\n    input_tensor = input_tensor.to(device)\n    if target_mask is not None:\n        target_mask = target_mask.to(device)\n\n    with autocast_fn(\n        enabled=mixed_precision_training, amp_precision=mixed_precision_dtype\n    ):\n        # prediction\n        pred = model(input_tensor, orig_size=(orig_h, orig_w))\n\n    if isinstance(pred, Tuple) and len(pred) == 2:\n        # when segmentation mask from decoder and auxiliary decoder are returned\n        pred = pred[0]\n    elif isinstance(pred, Tensor):\n        pred = pred\n    else:\n        raise NotImplementedError(\n            \"Predicted must should be either an instance of Tensor or Tuple[Tensor, Tensor]\"\n        )\n\n    num_classes = pred.shape[1]\n    pred_mask = pred.argmax(1).squeeze(0)\n\n    if target_mask is not None and conf_mat is not None:\n        conf_mat.update(\n            target=target_mask,\n            prediction=pred,\n        )\n\n    save_dir = getattr(opts, \"common.exp_loc\")\n    # For some dataset, we need to adjust the labels. For example, we need adjust by 1 for ADE20k\n    pred_mask = pred_mask + adjust_label\n    if target_mask is not None:\n        target_mask = target_mask + adjust_label\n\n    # Visualize results\n    if getattr(opts, \"evaluation.segmentation.apply_color_map\"):\n\n        apply_color_map_to_segmentation_masks(\n            opts=opts,\n            orig_image=orig_image,\n            pred_mask=pred_mask,\n            target_mask=target_mask,\n            save_dir=save_dir,\n            color_map=color_map,\n            file_name=file_name,\n        )\n\n    if getattr(opts, \"evaluation.segmentation.save_masks\"):\n        save_segmentation_masks(\n            pred_mask=pred_mask,\n            file_name=file_name,\n            is_cityscape=is_cityscape,\n            save_dir=save_dir,\n        )\n\n\ndef save_segmentation_masks(\n    pred_mask: Tensor,\n    file_name: str,\n    save_dir: str,\n    is_cityscape: Optional[bool] = False,\n) -> None:\n    \"\"\"Save predicted segmentation masks.\n\n    The value of pixels in the segmentation mask ranges between 0 and number of classes minus one. If the\n    segmentation dataset is Cityscapes, then segmentation masks are converted into Cityscapes format.\n\n    Args:\n        pred_mask: Predicted segmentation mask.\n        file_name: File name.\n        save_dir: Path of the directory where segmentation masks will be saved.\n        is_cityscape: Predictions are on the Cityscape dataset or not.\n    \"\"\"\n    no_color_mask_dir = \"{}/predictions_no_cmap\".format(save_dir)\n    if not os.path.isdir(no_color_mask_dir):\n        os.makedirs(no_color_mask_dir, exist_ok=True)\n    no_color_mask_f_name = \"{}/{}\".format(no_color_mask_dir, file_name)\n\n    if is_cityscape:\n        # convert mask values to cityscapes format\n        pred_mask = convert_to_cityscape_format(img=pred_mask)\n    pred_mask_pil = F_vision.to_pil_image(pred_mask.byte())\n    pred_mask_pil.save(no_color_mask_f_name)\n\n\ndef apply_color_map_to_segmentation_masks(\n    opts: argparse.Namespace,\n    orig_image: Image.Image,\n    pred_mask: Tensor,\n    target_mask: Tensor,\n    file_name: str,\n    save_dir: str,\n    color_map: Optional[List] = None,\n) -> None:\n    \"\"\"Apply color map to segmentation masks.\n\n    Args:\n        orig_image: Original RGB image.\n        pred_mask: Predicted segmentation tensor.\n        target_mask: Ground truth segmentation tensor.\n        file_name: File name.\n        save_dir: Path of the directory where colored segmentation masks will be saved.\n        color_map: Color mapping for converting predicted binary masks into colored representations.\n    \"\"\"\n\n    alpha = getattr(opts, \"evaluation.segmentation.overlay_mask_weight\")\n    save_overlay_rgb_pred = getattr(\n        opts, \"evaluation.segmentation.save_overlay_rgb_pred\"\n    )\n\n    if color_map is None:\n        color_map = Colormap().get_color_map_list()\n\n    # convert predicted tensor to PIL images, apply color map and save\n    pred_mask_pil = F_vision.to_pil_image(pred_mask.byte())\n    pred_mask_pil.putpalette(color_map)\n    pred_mask_pil = pred_mask_pil.convert(\"RGB\")\n    pred_color_mask_dir = \"{}/predictions_cmap\".format(save_dir)\n    if not os.path.isdir(pred_color_mask_dir):\n        os.makedirs(pred_color_mask_dir, exist_ok=True)\n    color_mask_f_name = \"{}/{}\".format(pred_color_mask_dir, file_name)\n    pred_mask_pil.save(color_mask_f_name)\n    logger.log(\"Predicted mask is saved at: {}\".format(color_mask_f_name))\n\n    if target_mask is not None:\n        # convert target tensor to PIL images, apply colormap, and save\n        target_mask_pil = F_vision.to_pil_image(target_mask.byte())\n        target_mask_pil.putpalette(color_map)\n        target_mask_pil = target_mask_pil.convert(\"RGB\")\n        target_color_mask_dir = \"{}/gt_cmap\".format(save_dir)\n        if not os.path.isdir(target_color_mask_dir):\n            os.makedirs(target_color_mask_dir, exist_ok=True)\n        gt_color_mask_f_name = \"{}/{}\".format(target_color_mask_dir, file_name)\n        target_mask_pil.save(gt_color_mask_f_name)\n        logger.log(\"Target mask is saved at: {}\".format(color_mask_f_name))\n\n    if save_overlay_rgb_pred and orig_image is not None:\n        # overlay predicted mask on top of original image and save\n\n        if pred_mask_pil.size != orig_image.size:\n            # resize if input image size is not the same as predicted mask.\n            # this is likely in case of labeled datasets where we use transforms on the input image\n            orig_image = F_vision.resize(\n                orig_image,\n                size=pred_mask_pil.size[::-1],\n                interpolation=F_vision.InterpolationMode.BILINEAR,\n            )\n\n        overlay_img = Image.blend(pred_mask_pil, orig_image, alpha=alpha)\n        overlay_mask_dir = \"{}/predictions_overlay\".format(save_dir)\n        if not os.path.isdir(overlay_mask_dir):\n            os.makedirs(overlay_mask_dir, exist_ok=True)\n        overlay_mask_f_name = \"{}/{}\".format(overlay_mask_dir, file_name)\n        overlay_img.save(overlay_mask_f_name)\n        logger.log(\n            \"RGB image blended with mask is saved at: {}\".format(overlay_mask_f_name)\n        )\n\n        # save original image\n        rgb_image_dir = \"{}/rgb_images\".format(save_dir)\n        if not os.path.isdir(rgb_image_dir):\n            os.makedirs(rgb_image_dir, exist_ok=True)\n        rgb_image_f_name = \"{}/{}\".format(rgb_image_dir, file_name)\n        orig_image.save(rgb_image_f_name)\n        logger.log(\"Original RGB image is saved at: {}\".format(overlay_mask_f_name))\n\n\ndef read_and_process_image(\n    opts: argparse.Namespace, file_path: str\n) -> Tuple[Tensor, Image.Image, int, int]:\n    \"\"\"Read and converts the input image into a tensor.\n\n    Args:\n        opts: Command-line arguments.\n        file_path: Path of the image file.\n\n    Returns:\n        A tuple containing:\n            1. Image tensor with shape [1, C, H, W]. The tensor values are normalized between 0 and 1.\n            2. Original RGB image.\n            3. Height of the original image.\n            4. Width of the original image.\n    \"\"\"\n\n    input_img = Image.open(file_path).convert(\"RGB\")\n    input_pil = copy.deepcopy(input_img)\n    orig_w, orig_h = input_img.size\n\n    # Resize the image while maitaining the aspect ratio\n    res_h, res_w = image_size_from_opts(opts)\n\n    input_img = F_vision.resize(\n        input_img,\n        size=min(res_h, res_w),\n        interpolation=F_vision.InterpolationMode.BILINEAR,\n    )\n    input_tensor = F_vision.pil_to_tensor(input_img)\n    input_tensor = input_tensor.float().div(255.0).unsqueeze(0)\n    return input_tensor, input_pil, orig_h, orig_w\n\n\n@torch.no_grad()\ndef predict_labeled_dataset(opts: argparse.Namespace) -> None:\n    \"\"\"Generate predictions for the labeled dataset.\n\n    This function predicts segmentation labels for RGB input images and calculates segmentation accuracy, measured\n    by mean intersection over union, through comparison between predicted segmentation masks and ground truth segmentation masks.\n\n    Args:\n        opts: Command-line arguments.\n    \"\"\"\n    device = getattr(opts, \"dev.device\", torch.device(\"cpu\"))\n    dataset_name = getattr(opts, \"dataset.name\", \"\")\n\n    # set-up data loaders\n    test_loader = create_test_loader(opts)\n\n    # set-up the model\n    model = get_model(opts)\n    model.eval()\n    model.info()\n    model = model.to(device=device)\n\n    if model.training:\n        logger.log(\"Model is in training mode. Switching to evaluation mode\")\n        model.eval()\n\n    color_map = Colormap().get_color_map_list()\n    adjust_label = 0\n    is_cityscape = False\n    conf_mat = ConfusionMatrix()\n    if hasattr(test_loader.dataset, \"color_palette\"):\n        color_map = test_loader.dataset.color_palette()\n\n    if hasattr(test_loader.dataset, \"adjust_mask_value\"):\n        adjust_label = test_loader.dataset.adjust_mask_value()\n\n    if dataset_name is not None and dataset_name.lower() == \"cityscapes\":\n        is_cityscape = True\n\n    for batch in tqdm(test_loader):\n        samples, targets = batch[\"samples\"], batch[\"targets\"]\n        batch_size = samples.shape[0]\n        assert (\n            batch_size == 1\n        ), \"We recommend to run segmentation evaluation with a batch size of 1\"\n\n        predict_and_save(\n            opts=opts,\n            input_tensor=samples,\n            file_name=targets[\"file_name\"][0],\n            orig_w=targets[\"im_width\"][0].item(),\n            orig_h=targets[\"im_height\"][0].item(),\n            model=model,\n            target_mask=targets[\"mask\"],\n            device=device,\n            conf_mat=conf_mat,\n            color_map=color_map,\n            adjust_label=adjust_label,\n            is_cityscape=is_cityscape,\n        )\n\n    metrics = conf_mat.compute()\n    logger.info(\"Quantitative results\")\n    print(\n        \"global correct: {:.2f}\\naverage row correct: {}\\nIoU: {}\\nmean IoU: {:.2f}\".format(\n            metrics[\"accuracy_global\"] * 100,\n            [\"{:.2f}\".format(i * 100) for i in metrics[\"class_accuracy\"]],\n            [\"{:.2f}\".format(i * 100) for i in metrics[\"iou\"]],\n            metrics[\"mean_iou\"] * 100,\n        )\n    )\n\n    is_city_dataset = getattr(opts, \"dataset.name\", \"\") == \"cityscapes\"\n    if is_city_dataset:\n        from corenet.engine.segmentation_utils.cityscapes_iou import eval_cityscapes\n\n        pred_dir = \"{}/predictions_no_cmap/\".format(\n            getattr(opts, \"common.exp_loc\", None)\n        )\n        gt_dir = os.path.join(getattr(opts, \"dataset.root_val\", None), \"gtFine/val/\")\n        eval_cityscapes(pred_dir=pred_dir, gt_dir=gt_dir)\n\n\n@torch.no_grad()\ndef predict_image(opts: argparse.Namespace, file_path: str) -> None:\n    \"\"\"Generate predictions for an RGB image.\n\n    Note that the predictions are saved in 'common.results_loc' directory.\n\n    Args:\n        opts: Command-line arguments.\n        file_path: Path of the image file.\n    \"\"\"\n    local_file_path = get_local_path(opts, file_path)\n\n    if not os.path.isfile(local_file_path):\n        logger.error(\"Image file does not exist at: {}\".format(local_file_path))\n\n    input_tensor, input_pil, orig_h, orig_w = read_and_process_image(\n        opts, local_file_path\n    )\n\n    file_name = os.path.basename(file_path)\n\n    device = getattr(opts, \"dev.device\")\n    # set-up the model\n    model = get_model(opts)\n    model.eval()\n    model.info()\n    model = model.to(device=device)\n\n    if model.training:\n        logger.log(\"Model is in training mode. Switching to evaluation mode\")\n        model.eval()\n\n    predict_and_save(\n        opts=opts,\n        input_tensor=input_tensor,\n        file_name=file_name,\n        orig_h=orig_h,\n        orig_w=orig_w,\n        model=model,\n        target_mask=None,\n        device=device,\n        orig_image=input_pil,\n    )\n\n\n@torch.no_grad()\ndef predict_images_in_folder(opts: argparse.Namespace) -> None:\n    \"\"\"Generate predictions for all RGB images stored in a folder.\n\n    Args:\n        opts: Command-line arguments.\n\n    ...note:\n        The path of the folder containong RGB images is supplied using 'evaluation.segmentation.path' argument.\n    \"\"\"\n    img_folder_path = getattr(opts, \"evaluation.segmentation.path\")\n    if img_folder_path is None:\n        logger.error(\n            \"Location of the folder containing images is not passed. Please use --evaluation.segmentation.path \"\n            \"as an argument to pass the location of the folder\".format(img_folder_path)\n        )\n    elif not os.path.isdir(img_folder_path):\n        logger.error(\n            \"Folder containing images does not exist at: {}. Please check\".format(\n                img_folder_path\n            )\n        )\n\n    img_files = []\n    for e in SUPPORTED_IMAGE_EXTNS:\n        img_files_with_extn = glob.glob(\"{}/*{}\".format(img_folder_path, e))\n        if len(img_files_with_extn) > 0 and isinstance(img_files_with_extn, list):\n            img_files.extend(img_files_with_extn)\n\n    if len(img_files) == 0:\n        logger.error(\n            \"Number of image files found at {}: {}\".format(\n                img_folder_path, len(img_files)\n            )\n        )\n\n    logger.log(\n        \"Number of image files found at {}: {}\".format(img_folder_path, len(img_files))\n    )\n\n    device = getattr(opts, \"dev.device\", torch.device(\"cpu\"))\n    # set-up the model\n    model = get_model(opts)\n    model.eval()\n    model.info()\n    model = model.to(device=device)\n\n    if model.training:\n        logger.log(\"Model is in training mode. Switching to evaluation mode\")\n        model.eval()\n\n    for image_fname in tqdm(img_files):\n        input_tensor, input_pil, orig_h, orig_w = read_and_process_image(\n            opts, file_path=image_fname\n        )\n\n        image_fname = image_fname.split(os.sep)[-1]\n\n        predict_and_save(\n            opts=opts,\n            input_tensor=input_tensor,\n            file_name=image_fname,\n            orig_h=orig_h,\n            orig_w=orig_w,\n            model=model,\n            target_mask=None,\n            device=device,\n            orig_image=input_pil,\n        )\n\n\ndef main_segmentation_evaluation(args: Optional[List[str]] = None) -> None:\n    \"\"\"Entrypoint for segmentation evaluation.\"\"\"\n    opts = get_training_arguments(args=args)\n\n    # device set-up\n    opts = device_setup(opts)\n\n    node_rank = getattr(opts, \"ddp.rank\")\n    if node_rank < 0:\n        logger.error(\"--rank should be >=0. Got {}\".format(node_rank))\n\n    is_master_node = is_master(opts)\n\n    # create the directory for saving results\n    save_dir = getattr(opts, \"common.results_loc\")\n    run_label = getattr(opts, \"common.run_label\")\n    exp_dir = \"{}/{}\".format(save_dir, run_label)\n    setattr(opts, \"common.exp_loc\", exp_dir)\n    logger.log(\"Results (if any) will be stored here: {}\".format(exp_dir))\n\n    create_directories(dir_path=exp_dir, is_master_node=is_master_node)\n\n    num_gpus = getattr(opts, \"dev.num_gpus\", 1)\n    # we disable the DDP setting for evaluating segmentation tasks\n    setattr(opts, \"ddp.use_distributed\", False)\n\n    dataset_workers = getattr(opts, \"dataset.workers\")\n\n    if dataset_workers == -1:\n        n_cpus = resources.cpu_count()\n        # Set number of data workers to the same as number of CPUs if 'dataset.workers' is -1\n        setattr(opts, \"dataset.workers\", n_cpus)\n\n    # For segmentation during inference, images are not resized to a fixed size.\n    # Therefore, we set batch size to 1.\n    logger.log(\"Setting batch size to 1 for segmentation evaluation.\")\n    setattr(opts, \"dataset.train_batch_size0\", 1)\n    setattr(opts, \"dataset.val_batch_size0\", 1)\n    setattr(opts, \"dev.device_id\", None)\n\n    eval_mode = getattr(opts, \"evaluation.segmentation.mode\")\n\n    if eval_mode == \"single_image\":\n        # Predict segmentation mask for a single RGB image\n        num_seg_classes = getattr(opts, \"model.segmentation.n_classes\")\n        assert num_seg_classes is not None\n        img_f_name = getattr(opts, \"evaluation.segmentation.path\")\n        predict_image(opts, img_f_name)\n    elif eval_mode == \"image_folder\":\n        # Predict segmentation masks for all RGB images in a folder\n        # This is useful for generating results for test set\n        num_seg_classes = getattr(opts, \"model.segmentation.n_classes\")\n        assert num_seg_classes is not None\n        predict_images_in_folder(opts=opts)\n    elif eval_mode == \"validation_set\":\n        # evaluate and compute stats for labeled image dataset\n        # This is useful for generating results for validation set and compute quantitative results\n        predict_labeled_dataset(opts=opts)\n    else:\n        logger.error(\n            \"Supported modes are 'single_image', 'image_folder', and 'validation_set'. Got: {}\".format(\n                eval_mode\n            )\n        )\n"
  },
  {
    "path": "corenet/engine/evaluation_engine.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nimport os\nimport time\n\nimport torch\n\nfrom corenet.constants import DEFAULT_LOG_FREQ, SUPPORTED_VIDEO_CLIP_VOTING_FN\nfrom corenet.data.loader.dataloader import CoreNetDataLoader\nfrom corenet.engine.utils import autocast_fn, get_batch_size, get_log_writers\nfrom corenet.loss_fn.base_criteria import BaseCriteria\nfrom corenet.metrics.stats import Statistics\nfrom corenet.modeling.models.base_model import BaseAnyNNModel\nfrom corenet.options.parse_args import parse_validation_metric_names\nfrom corenet.utils import logger\nfrom corenet.utils.common_utils import move_to_device\nfrom corenet.utils.ddp_utils import is_master\n\n\nclass Evaluator:\n    def __init__(\n        self,\n        opts: argparse.Namespace,\n        model: BaseAnyNNModel,\n        test_loader: CoreNetDataLoader,\n        criteria: BaseCriteria,\n    ) -> None:\n        \"\"\"\n        Evaluates the criteria on a validation or test dataset using a model.\n\n        Args:\n            opts: The command-line arguments as a namespace.\n            model: The neural network model to be trained.\n            test_loader: The data loader for the test dataset.\n            criteria: The loss function used for training.\n        \"\"\"\n        self.opts = opts\n\n        self.model = model\n        self.criteria = criteria\n\n        self.test_loader = test_loader\n\n        self.device = getattr(opts, \"dev.device\", torch.device(\"cpu\"))\n        self.use_distributed = getattr(self.opts, \"ddp.use_distributed\", False)\n        self.is_master_node = is_master(opts)\n        self.stage_name = getattr(opts, \"common.eval_stage_name\", \"evaluation\")\n\n        self.mixed_precision_training = getattr(opts, \"common.mixed_precision\", False)\n        self.save_location = getattr(opts, \"common.exp_loc\")\n        self.save_location = os.path.join(self.save_location, \"eval\")\n        if not os.path.exists(self.save_location):\n            os.makedirs(self.save_location, exist_ok=True)\n        self.mixed_precision_dtype = getattr(\n            opts, \"common.mixed_precision_dtype\", \"float16\"\n        )\n\n        (\n            self.metric_names,\n            self.ckpt_metric,\n            self.ckpt_submetric,\n        ) = parse_validation_metric_names(self.opts)\n\n        self.log_writers = get_log_writers(self.opts, save_location=self.save_location)\n\n    def eval_fn(self) -> None:\n        model = self.model\n        criteria = self.criteria\n        log_freq = getattr(self.opts, \"common.log_freq\", DEFAULT_LOG_FREQ)\n\n        evaluation_stats = Statistics(\n            opts=self.opts,\n            metric_names=self.metric_names,\n            is_master_node=self.is_master_node,\n            is_distributed=self.use_distributed,\n            log_writers=self.log_writers,\n        )\n\n        model.eval()\n        criteria.eval()\n\n        with torch.no_grad():\n            epoch_start_time = time.time()\n            total_samples = len(self.test_loader)\n            processed_samples = 0\n\n            for batch_id, batch in enumerate(self.test_loader):\n                batch = move_to_device(opts=self.opts, x=batch, device=self.device)\n\n                samples, targets = batch[\"samples\"], batch[\"targets\"]\n\n                batch_size = get_batch_size(samples)\n\n                with autocast_fn(\n                    enabled=self.mixed_precision_training,\n                    amp_precision=self.mixed_precision_dtype,\n                ):\n                    # prediction\n                    pred_label = model(samples)\n                    loss_dict_or_tensor = criteria(\n                        input_sample=samples, prediction=pred_label, target=targets\n                    )\n\n                processed_samples += batch_size\n\n                evaluation_stats.update(\n                    pred_label=pred_label,\n                    target_label=targets,\n                    extras={\"loss\": loss_dict_or_tensor},\n                    batch_time=0.0,\n                    batch_size=batch_size,\n                )\n\n                if batch_id % log_freq == 0 and self.is_master_node:\n                    evaluation_stats.iter_summary(\n                        epoch=0,\n                        n_processed_samples=processed_samples,\n                        total_samples=total_samples,\n                        elapsed_time=epoch_start_time,\n                        learning_rate=0.0,\n                    )\n\n        evaluation_stats.epoch_summary(epoch=0, stage=self.stage_name)\n\n    def run(self) -> None:\n        eval_start_time = time.time()\n        self.eval_fn()\n        for log_writer in self.log_writers:\n            log_writer.close()\n        eval_end_time = time.time() - eval_start_time\n        logger.log(\"Evaluation took {} seconds\".format(eval_end_time))\n"
  },
  {
    "path": "corenet/engine/fsdp_trainer.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nimport gc\nimport time\nfrom typing import Dict, Optional, Tuple, Union\n\nimport torch\nfrom torch import Tensor\n\nfrom corenet.constants import if_test_env\nfrom corenet.data.loader.dataloader import CoreNetDataLoader\nfrom corenet.data.transforms.image_torch import apply_mixing_transforms\nfrom corenet.engine.default_trainer import DefaultTrainer\nfrom corenet.engine.utils import get_batch_size, step_log_metrics\nfrom corenet.loss_fn.base_criteria import BaseCriteria\nfrom corenet.metrics.stats import Statistics\nfrom corenet.modeling.misc.averaging_utils import EMA\nfrom corenet.modeling.models.base_model import BaseAnyNNModel\nfrom corenet.modeling.models.fsdp_wrapper import FullyShardedDataParallelWrapper\nfrom corenet.optims.base_optim import BaseOptim\nfrom corenet.optims.scheduler.base_scheduler import BaseLRScheduler\nfrom corenet.utils import logger\nfrom corenet.utils.common_utils import move_to_device\n\n\nclass FSDPTrainer(DefaultTrainer):\n    \"\"\"\n    This class defines the training and validation code for training models with FullyShardedDataParallel.\n\n    Args:\n        opts: The command-line arguments as a namespace.\n        model: The neural network model to be trained.\n        validation_loader: The data loader for the validation dataset.\n        training_loader: The data loader for the training dataset.\n        criteria: The loss function used for training.\n        optimizer: The optimizer used for training.\n        scheduler: The learning rate scheduler used for training.\n        start_epoch: The epoch to start training from.\n        start_iteration: The iteration to start training from.\n        best_metric: The best validation metric value achieved so far.\n        model_ema: An optional instance of EMA model.\n    \"\"\"\n\n    def __init__(\n        self,\n        opts: argparse.Namespace,\n        model: BaseAnyNNModel,\n        validation_loader: CoreNetDataLoader,\n        training_loader: CoreNetDataLoader,\n        criteria: BaseCriteria,\n        optimizer: BaseOptim,\n        scheduler: BaseLRScheduler,\n        start_epoch: int = 0,\n        start_iteration: int = 0,\n        best_metric: float = 0.0,\n        model_ema: Optional[EMA] = None,\n    ) -> None:\n        if getattr(opts, \"common.accum_freq\") > 1:\n            logger.error(\"Gradient accumumlation is not supported with FSDP\")\n\n        if getattr(opts, \"ema.enable\"):\n            logger.error(\"EMA is not yet supported with FSDP\")\n\n        if not isinstance(model, FullyShardedDataParallelWrapper):\n            logger.error(\n                f\"{self.__class__.__name__} expects model to be an instance of FullyShardedDataParallelWrapper\"\n            )\n\n        super().__init__(\n            opts=opts,\n            model=model,\n            validation_loader=validation_loader,\n            training_loader=training_loader,\n            criteria=criteria,\n            optimizer=optimizer,\n            scheduler=scheduler,\n            # FSDP does not use autocast for mixed-precision training and handles it internally.\n            # So, gradient scalar is not required.\n            gradient_scaler=None,\n            start_epoch=start_epoch,\n            start_iteration=start_iteration,\n            best_metric=best_metric,\n            model_ema=model_ema,\n        )\n\n    def train_epoch(self, epoch: int) -> Tuple[float, float]:\n        \"\"\"Train model for one epoch.\n\n        Args:\n            epoch: Current epoch number.\n\n        Returns:\n            Average value for loss and checkpoint metric.\n        \"\"\"\n        time.sleep(\n            if_test_env(0.5, otherwise=2)\n        )  # To prevent possible deadlock during epoch transition\n\n        if self.is_master_node:\n            logger.double_dash_line()\n            logger.info(f\"Training epoch {epoch}\")\n\n        train_stats = Statistics(\n            opts=self.opts,\n            metric_names=self.train_metric_names,\n            is_master_node=self.is_master_node,\n            is_distributed=self.use_distributed,\n            log_writers=self.log_writers,\n        )\n\n        # set the training mode for model and criteria\n        self._set_training_mode()\n\n        max_norm = getattr(self.opts, \"common.grad_clip\")\n\n        # set the gradient to zero or None\n        self._zero_grad()\n\n        epoch_start_time = time.time()\n        batch_load_start = time.time()\n        grad_norm = torch.tensor([0.0], dtype=torch.float, device=self.device)\n        for batch_id, batch in enumerate(self.train_loader):\n            if self.train_iterations > self.max_iterations:\n                self.max_iterations_reached = True\n                break\n\n            # move to device\n            batch = move_to_device(opts=self.opts, x=batch, device=self.device)\n            # apply mix-up transforms if any\n            batch = apply_mixing_transforms(opts=self.opts, data=batch)\n\n            batch_load_toc = time.time() - batch_load_start\n\n            samples, targets = batch[\"samples\"], batch[\"targets\"]\n\n            batch_size = get_batch_size(samples)\n\n            # update the learning rate\n            self.optimizer = self.scheduler.update_lr(\n                optimizer=self.optimizer, epoch=epoch, curr_iter=self.train_iterations\n            )\n\n            # prediction\n            pred_label = self.model(samples)\n            # compute loss\n            loss_dict_or_tensor: Union[Dict, Tensor] = self.criteria(\n                input_sample=samples,\n                prediction=pred_label,\n                target=targets,\n                epoch=epoch,\n                iterations=self.train_iterations,\n            )\n\n            if isinstance(loss_dict_or_tensor, Dict):\n                if \"total_loss\" not in loss_dict_or_tensor.keys():\n                    logger.error(\n                        \"'total_loss' key is required for loss functions that return outputs as dictionary.\"\n                    )\n                loss = loss_dict_or_tensor[\"total_loss\"]\n            elif isinstance(loss_dict_or_tensor, Tensor):\n                loss = loss_dict_or_tensor\n            else:\n                logger.error(\n                    f\"Loss value should be an instance of Tensor or Dict. Got: {type(loss_dict_or_tensor)}\"\n                )\n\n            if not isinstance(loss, torch.Tensor):\n                logger.error(\n                    f\"Loss value should be an instance of Tensor. Got: {type(loss)}\"\n                )\n\n            if torch.isnan(loss):\n                logger.error(\"Nan encountered in the loss.\")\n\n            loss.backward()\n            if max_norm is not None:\n                self.model.clip_grad_norm_(max_norm=max_norm)\n\n            if \"grad_norm\" in self.train_metric_names:\n                # compute grad_norm for logging purposes.\n                # We can't use the output of clip_grad_norm_ because it returns the total norm before clipping\n                grad_norm = self.compute_grad_norm()\n\n            self.optimizer.step()\n\n            self._zero_grad()\n            self.train_iterations += 1\n\n            train_stats.update(\n                pred_label=pred_label,\n                target_label=targets,\n                extras={\"loss\": loss_dict_or_tensor, \"grad_norm\": grad_norm},\n                batch_time=batch_load_toc,\n                batch_size=batch_size,\n            )\n\n            self._save_and_evaluate_interval_checkpoint(\n                epoch=epoch, iterations=self.train_iterations, loss=loss\n            )\n\n            if batch_id % self.log_freq == 0 and self.is_master_node:\n                lr = self.scheduler.retrieve_lr(self.optimizer)\n                train_stats.iter_summary(\n                    epoch=epoch,\n                    n_processed_samples=self.train_iterations,\n                    total_samples=self.max_iterations,\n                    learning_rate=lr,\n                    elapsed_time=epoch_start_time,\n                )\n                train_metrics = train_stats._compute_avg_statistics_all()\n                for log_writer in self.log_writers:\n                    step_log_metrics(\n                        lrs=lr,\n                        log_writer=log_writer,\n                        step=self.train_iterations,\n                        metrics=train_metrics,\n                    )\n            batch_load_start = time.time()\n\n        avg_loss = train_stats.avg_statistics(\n            metric_name=\"loss\", sub_metric_name=\"total_loss\"\n        )\n        train_stats.epoch_summary(epoch=epoch, stage=\"training\")\n        avg_ckpt_metric = train_stats.avg_statistics(\n            metric_name=self.ckpt_metric, sub_metric_name=self.ckpt_submetric\n        )\n\n        # Python may not clean up the variables, so calling gc explicitly.\n        gc.collect()\n        return avg_loss, avg_ckpt_metric\n"
  },
  {
    "path": "corenet/engine/segmentation_utils/__init__.py",
    "content": ""
  },
  {
    "path": "corenet/engine/segmentation_utils/cityscapes_iou.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport glob\nimport os\n\nimport cityscapesscripts.evaluation.evalPixelLevelSemanticLabeling as cityscapes_semseg_eval\n\nfrom corenet.utils import logger\n\n\ndef eval_cityscapes(pred_dir: str, gt_dir: str) -> None:\n    \"\"\"Utility to evaluate on cityscapes dataset\"\"\"\n    cityscapes_semseg_eval.args.predictionPath = pred_dir\n    cityscapes_semseg_eval.args.predictionWalk = None\n    cityscapes_semseg_eval.args.JSONOutput = False\n    cityscapes_semseg_eval.args.colorized = False\n\n    gt_img_list = glob.glob(os.path.join(gt_dir, \"*\", \"*_gtFine_labelIds.png\"))\n    if len(gt_img_list) == 0:\n        logger.error(\"Cannot find ground truth images at: {}\".format(gt_dir))\n\n    pred_img_list = []\n    for gt in gt_img_list:\n        pred_img_list.append(\n            cityscapes_semseg_eval.getPrediction(cityscapes_semseg_eval.args, gt)\n        )\n\n    results = cityscapes_semseg_eval.evaluateImgLists(\n        pred_img_list, gt_img_list, cityscapes_semseg_eval.args\n    )\n\n    logger.info(\"Evaluation results summary\")\n    eval_res_str = \"\\n\\t IoU_cls: {:.2f} \\n\\t iIOU_cls: {:.2f} \\n\\t IoU_cat: {:.2f} \\n\\t iIOU_cat: {:.2f}\".format(\n        100.0 * results[\"averageScoreClasses\"],\n        100.0 * results[\"averageScoreInstClasses\"],\n        100.0 * results[\"averageScoreCategories\"],\n        100.0 * results[\"averageScoreInstCategories\"],\n    )\n    print(eval_res_str)\n"
  },
  {
    "path": "corenet/engine/utils.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\nimport argparse\nimport os\nfrom collections.abc import MutableMapping\nfrom numbers import Number\nfrom typing import Any, Dict, List, Optional, Union\n\nimport torch\nfrom torch import Tensor\nfrom torch.cuda.amp import autocast\n\nfrom corenet.utils import logger\nfrom corenet.utils.common_utils import create_directories\nfrom corenet.utils.ddp_utils import is_master\nfrom corenet.utils.file_logger import FileLogger\n\nstr_to_torch_dtype = {\"float16\": torch.float16, \"bfloat16\": torch.bfloat16}\n\n\ndef autocast_fn(enabled: bool, amp_precision: Optional[str] = \"float16\"):\n    if enabled:\n        # If AMP is enabled, ensure that:\n        # 1. Device is CUDA\n        # 2. dtype is FLOAT16 or BFLOAT16\n        if amp_precision not in str_to_torch_dtype:\n            logger.error(\n                \"For Mixed-precision training, supported dtypes are {}. Got: {}\".format(\n                    list(str_to_torch_dtype.keys()), amp_precision\n                )\n            )\n\n        if not torch.cuda.is_available():\n            logger.error(\"For mixed-precision training, CUDA device is required.\")\n\n        return autocast(enabled=enabled, dtype=str_to_torch_dtype[amp_precision])\n    else:\n        return autocast(enabled=False)\n\n\ndef get_batch_size(x: Union[Tensor, Dict, List]) -> int:\n    if isinstance(x, Tensor):\n        return x.shape[0]\n    elif isinstance(x, Dict):\n        for key in (\"image\", \"video\", \"audio\"):\n            if key in x:\n                return get_batch_size(x[key])\n        raise NotImplementedError(f\"Invalid dict keys {x.keys()}\")\n    elif isinstance(x, List):\n        return len(x)\n    else:\n        raise NotImplementedError(f\"Invalid type {type(x)}\")\n\n\ndef log_metrics(\n    lrs: Union[List, float],\n    log_writer,\n    train_loss: float,\n    val_loss: float,\n    epoch: int,\n    best_metric: float,\n    val_ema_loss: Optional[float] = None,\n    ckpt_metric_name: Optional[str] = None,\n    train_ckpt_metric: Optional[float] = None,\n    val_ckpt_metric: Optional[float] = None,\n    val_ema_ckpt_metric: Optional[float] = None,\n) -> None:\n    if not isinstance(lrs, list):\n        lrs = [lrs]\n    for g_id, lr_val in enumerate(lrs):\n        log_writer.add_scalar(\"LR/Group-{}\".format(g_id), round(lr_val, 6), epoch)\n\n    log_writer.add_scalar(\"Common/Best Metric\", round(best_metric, 2), epoch)\n\n\ndef flatten(\n    dictionary: dict[str, Any], parent_key: str = \"\", separator: str = \"/\"\n) -> Dict:\n    \"\"\"\n    Flatten a nested dictionary recursively.\n\n    Args:\n        dictionary: The dictionary to flatten.\n        parent_key: The key of this dictionary's parent.\n        separator: The separator to put between parent keys\n            and child keys.\n\n    Returns:\n        The flattened dictionary.\n    \"\"\"\n    items = []\n    for key, value in dictionary.items():\n        new_key = parent_key + separator + key if parent_key else key\n        if isinstance(value, MutableMapping):\n            items.extend(flatten(value, new_key, separator=separator).items())\n        else:\n            items.append((new_key, value))\n    return dict(items)\n\n\ndef step_log_metrics(\n    lrs: Union[List, float],\n    log_writer: Any,\n    step: int,\n    metrics: Dict[str, Any],\n) -> None:\n    \"\"\"\n    Log metrics for the current step of training/evaluation.\n\n    Args:\n        lrs: The learning rates.\n        log_writer: The log_writer object to use for logging.\n        step: The current step of training.\n        metrics: A dictionary containing metrics to log.\n    \"\"\"\n    if not isinstance(lrs, list):\n        lrs = [lrs]\n    for g_id, lr_val in enumerate(lrs):\n        log_writer.add_scalar(\"LR/Group-{}\".format(g_id), round(lr_val, 6), step)\n    if metrics is not None:\n        flattened_metrics = flatten(metrics)\n        for metric_name, metric_value in flattened_metrics.items():\n            if not (isinstance(metric_value, Number) or metric_value):\n                continue\n            log_writer.add_scalar(metric_name, metric_value, step)\n\n\ndef get_log_writers(opts: argparse.Namespace, save_location: Optional[str]):\n    is_master_node = is_master(opts)\n\n    log_writers = []\n    if not is_master_node:\n        return log_writers\n\n    tensorboard_logging = getattr(opts, \"common.tensorboard_logging\", False)\n    if tensorboard_logging and save_location is not None:\n        try:\n            from torch.utils.tensorboard import SummaryWriter\n        except ImportError:\n            logger.log(\n                \"Unable to import SummaryWriter from torch.utils.tensorboard. Disabling tensorboard logging\"\n            )\n            SummaryWriter = None\n\n        if SummaryWriter is not None:\n            exp_dir = \"{}/tb_logs\".format(save_location)\n            create_directories(dir_path=exp_dir, is_master_node=is_master_node)\n            log_writers.append(\n                SummaryWriter(log_dir=exp_dir, comment=\"Training and Validation logs\")\n            )\n\n    bolt_logging = getattr(opts, \"common.bolt_logging\", False)\n    if bolt_logging:\n        try:\n            from corenet.internal.utils.bolt_logger import BoltLogger\n        except ModuleNotFoundError:\n            BoltLogger = None\n\n        if BoltLogger is None:\n            logger.log(\"Unable to import bolt. Disabling bolt logging\")\n        else:\n            log_writers.append(BoltLogger())\n\n    hub_logging = getattr(opts, \"common.hub.logging\", False)\n    if hub_logging:\n        try:\n            from corenet.internal.utils.hub_logger import HubLogger\n        except ModuleNotFoundError:\n            HubLogger = None\n\n        if HubLogger is None:\n            logger.log(\"Unable to import hub. Disabling hub logging\")\n        else:\n            try:\n                hub_logger = HubLogger(opts)\n            except Exception as ex:\n                logger.log(\n                    f\"Unable to initialize hub logger. Disabling hub logging: {ex}\"\n                )\n                hub_logger = None\n            if hub_logger is not None:\n                log_writers.append(hub_logger)\n\n    file_logging = getattr(opts, \"common.file_logging\")\n    if file_logging and save_location is not None:\n        log_writers.append(FileLogger(os.path.join(save_location, \"stats.pt\")))\n\n    return log_writers\n"
  },
  {
    "path": "corenet/loss_fn/__init__.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nfrom typing import Optional\n\nfrom corenet.loss_fn.base_criteria import BaseCriteria\nfrom corenet.utils import logger\nfrom corenet.utils.registry import Registry\n\n# Registry for loss functions.\nLOSS_REGISTRY = Registry(\n    registry_name=\"loss_functions\",\n    base_class=BaseCriteria,\n    lazy_load_dirs=[\"corenet/loss_fn\"],\n    internal_dirs=[\"corenet/internal\", \"corenet/internal/projects/*\"],\n)\n\n\ndef build_loss_fn(\n    opts: argparse.Namespace, category: Optional[str] = \"\", *args, **kwargs\n) -> BaseCriteria:\n    \"\"\"Helper function to build loss function from command-line arguments.\n\n    Args:\n        opts: command-line arguments\n        category: Optional task category (e.g., classification). Specifying category may be useful for\n            building composite loss functions. See `loss_fns.composite_loss.CompositeLoss.build_composite_loss_fn`\n            function for an example\n\n    Returns:\n        Loss function module\n    \"\"\"\n\n    if not category:\n        # If category is not specified, then read it from command-line arguments\n        category = getattr(opts, \"loss.category\")\n\n    if category is None:\n        logger.error(\n            \"Please specify loss name using --loss.category. For composite loss function, see configuration\"\n            \"example in `loss_fns.composite_loss.CompositeLoss`. Got None\"\n        )\n\n    # Get the name of loss function for a given category.\n    # Note that loss functions (e.g., NeuralAugmentation) that are not task-specific does not have this\n    # argument defined. In such case, we set the loss function name the same as category\n    if hasattr(opts, f\"loss.{category}.name\"):\n        loss_fn_name = getattr(opts, f\"loss.{category}.name\")\n    else:\n        loss_fn_name = category\n\n    # We registered the base criteria classes for different categories using a special `name` (i.e., `__base__`)\n    # in order to access the arguments defined inside those classes. However, these classes are not supposed to\n    # be used as a loss function. Therefore, we raise an error for such cases\n    if loss_fn_name == \"__base__\":\n        logger.error(\"__base__ can't be used as a loss function name. Please check.\")\n\n    loss_fn = LOSS_REGISTRY[loss_fn_name, category](opts, *args, **kwargs)\n    return loss_fn\n\n\ndef add_loss_fn_arguments(parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n    \"\"\"This method gets a parser object, and for every loss that is registered in the\n    LOSS_REGISTRY adds its arguments to it.\"\"\"\n    parser = BaseCriteria.add_arguments(parser=parser)\n\n    parser = LOSS_REGISTRY.all_arguments(parser)\n    return parser\n"
  },
  {
    "path": "corenet/loss_fn/base_criteria.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport abc\nimport argparse\nfrom typing import Any\n\nfrom torch import nn\n\nfrom corenet.utils import logger\n\n\nclass BaseCriteria(nn.Module, abc.ABC):\n    \"\"\"Base class for defining loss functions. Sub-classes must implement compute_loss function.\n\n    Args:\n        opts: command line arguments\n    \"\"\"\n\n    def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None:\n        super(BaseCriteria, self).__init__()\n        self.opts = opts\n        # small value for numerical stability purposes that sub-classes may want to use.\n        self.eps = 1e-7\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        \"\"\"Add criteria-specific arguments to the parser.\"\"\"\n        if cls != BaseCriteria:\n            # Don't re-register arguments in subclasses that don't override `add_arguments()`.\n            return parser\n        group = parser.add_argument_group(cls.__name__)\n\n        group.add_argument(\n            \"--loss.category\",\n            type=str,\n            default=None,\n            help=\"Loss function category (e.g., classification). Defaults to None.\",\n        )\n        return parser\n\n    @abc.abstractmethod\n    def forward(\n        self, input_sample: Any, prediction: Any, target: Any, *args, **kwargs\n    ) -> Any:\n        \"\"\"Compute the loss.\n\n        Args:\n            input_sample: Input to the model.\n            prediction: Model's output\n            target: Ground truth labels\n        \"\"\"\n        raise NotImplementedError\n\n    def extra_repr(self) -> str:\n        return \"\"\n\n    def __repr__(self) -> str:\n        return \"{}({}\\n)\".format(self.__class__.__name__, self.extra_repr())\n"
  },
  {
    "path": "corenet/loss_fn/classification/__init__.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n"
  },
  {
    "path": "corenet/loss_fn/classification/base_classification_criteria.py",
    "content": "#  For licensing see accompanying LICENSE file.\n#  Copyright (C) 2024 Apple Inc. All Rights Reserved.\n\nimport argparse\nfrom typing import Any, Dict, Union\n\nfrom torch import Tensor\n\nfrom corenet.loss_fn import LOSS_REGISTRY, BaseCriteria\nfrom corenet.utils import logger\n\n\n@LOSS_REGISTRY.register(name=\"__base__\", type=\"classification\")\nclass BaseClassificationCriteria(BaseCriteria):\n    \"\"\"Base class for defining classification loss functions. Sub-classes must implement forward function.\n\n    Args:\n        opts: command line arguments\n    \"\"\"\n\n    def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None:\n        super().__init__(opts, *args, **kwargs)\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        \"\"\"Add criteria-specific arguments to the parser.\"\"\"\n        if cls != BaseClassificationCriteria:\n            # Don't re-register arguments in subclasses that don't override `add_arguments()`.\n            return parser\n\n        group = parser.add_argument_group(cls.__name__)\n        group.add_argument(\n            \"--loss.classification.name\",\n            type=str,\n            default=None,\n            help=f\"Name of the loss function in {cls.__name__}. Defaults to None.\",\n        )\n        return parser\n\n    def _compute_loss(\n        self, prediction: Tensor, target: Tensor, *args, **kwargs\n    ) -> Tensor:\n        \"\"\"Sub-classes must override this function to compute loss\n\n        Args:\n            prediction: Output of the model\n            target: ground truth\n\n        Returns:\n            Expected to return a scalar value of loss\n        \"\"\"\n        raise NotImplementedError\n\n    def forward(\n        self,\n        input_sample: Any,\n        prediction: Union[Dict[str, Tensor], Tensor],\n        target: Tensor,\n        *args,\n        **kwargs,\n    ) -> Tensor:\n        \"\"\"Computes the cross entropy loss.\n\n        Args:\n            input_sample: Input image tensor to model.\n            prediction: Output of model. It can be a tensor or mapping of (string: Tensor). In case of a dictionary,\n            `logits` is a required key.\n            target: Target label tensor containing values in the range `[0, C)`, where :math:`C` is the number of classes\n\n        Shapes:\n            input_sample: This loss function does not care about this argument.\n            prediction:\n                * When prediction is a tensor, then shape is [N, C]\n                * When prediction is a dictionary, then the shape of prediction[\"logits\"] is [N, C]\n            target: The shape of target tensor is [N]\n\n        Returns:\n            Scalar loss value is returned.\n        \"\"\"\n\n        if isinstance(prediction, Tensor):\n            return self._compute_loss(\n                prediction=prediction, target=target, *args, **kwargs\n            )\n        elif isinstance(prediction, Dict):\n            if \"logits\" not in prediction:\n                logger.error(\n                    f\"logits is a required key in {self.__class__.__name__} when prediction type\"\n                    f\"is dictionary. Got keys: {prediction.keys()}\"\n                )\n\n            predicted_logits = prediction[\"logits\"]\n            if predicted_logits is None:\n                logger.error(\"Predicted logits can not be None.\")\n\n            ce_loss = self._compute_loss(\n                prediction=predicted_logits, target=target, *args, **kwargs\n            )\n            return ce_loss\n        else:\n            logger.error(\n                f\"Prediction should be either a Tensor or Dictionary[str, Tensor]. Got: {type(prediction)}\"\n            )\n"
  },
  {
    "path": "corenet/loss_fn/classification/binary_cross_entropy.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\n\nfrom torch import Tensor\nfrom torch.nn import functional as F\n\nfrom corenet.loss_fn import LOSS_REGISTRY\nfrom corenet.loss_fn.classification.base_classification_criteria import (\n    BaseClassificationCriteria,\n)\n\n\n@LOSS_REGISTRY.register(name=\"binary_cross_entropy\", type=\"classification\")\nclass BinaryCrossEntropy(BaseClassificationCriteria):\n    \"\"\"Binary cross-entropy loss for classification tasks\n\n    Args:\n        opts: command-line arguments\n    \"\"\"\n\n    def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None:\n        super().__init__(opts, *args, **kwargs)\n        self.reduction = getattr(\n            opts,\n            \"loss.classification.binary_cross_entropy.reduction\",\n        )\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        if cls != BinaryCrossEntropy:\n            # Don't re-register arguments in subclasses that don't override `add_arguments()`.\n            return parser\n\n        group = parser.add_argument_group(cls.__name__)\n        group.add_argument(\n            \"--loss.classification.binary-cross-entropy.reduction\",\n            type=str,\n            default=\"mean\",\n            choices=[\"sum\", \"mean\", \"none\", \"batch_mean\"],\n            help=\"Specifies the reduction to apply to the output (default='mean').\"\n            \" 'batch_mean' divides the sum of the loss only by the first dimension.\",\n        )\n        return parser\n\n    def _compute_loss(\n        self, prediction: Tensor, target: Tensor, *args, **kwargs\n    ) -> Tensor:\n        \"\"\"The binary cross-entropy loss with logits for binary classification.\n        The probability for class one is the Sigmoid on the logit.\n        For multi-class problems with multiple valid labels, the loss penalizes by\n        the given target probability of the same shape as predictions.\n\n        Args:\n            prediction: Logits of class 1\n            target: Ground-truth class index or probability.\n\n        Shapes:\n            prediction: [Batch size, ...]\n            target: A tensor of similar shape to prediction if the target\n                probability for each output is known. Or a tensor of ground-truth labels\n                missing the last dimension of size `num_classes`.\n\n        Returns:\n            If reduction is none, then tensor of the same shape as prediction is returned.\n            Otherwise, a scalar loss value is returned.\n        \"\"\"\n        if target.dim() == (prediction.dim() - 1):\n            # Ground truth labels are hard labels. Convert to one-hot labels.\n            target = F.one_hot(target, num_classes=prediction.shape[-1])\n\n        div_by = 1.0\n        if self.reduction == \"batch_mean\":\n            div_by = target.shape[0]\n        reduction = self.reduction if self.reduction != \"batch_mean\" else \"sum\"\n\n        bce_loss = F.binary_cross_entropy_with_logits(\n            input=prediction,\n            target=target.to(prediction.dtype),\n            reduction=reduction,\n        )\n\n        return bce_loss / div_by\n\n    def extra_repr(self) -> str:\n        return f\"\\n\\t reduction={self.reduction}\"\n"
  },
  {
    "path": "corenet/loss_fn/classification/cross_entropy.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\n\nfrom torch import Tensor\nfrom torch.nn import functional as F\n\nfrom corenet.loss_fn import LOSS_REGISTRY\nfrom corenet.loss_fn.classification.base_classification_criteria import (\n    BaseClassificationCriteria,\n)\nfrom corenet.loss_fn.utils.class_weighting import compute_class_weights\n\n\n@LOSS_REGISTRY.register(name=\"cross_entropy\", type=\"classification\")\nclass CrossEntropy(BaseClassificationCriteria):\n    \"\"\"Cross entropy loss function for image classification tasks\n\n    Args:\n        opts: command-line arguments\n    \"\"\"\n\n    def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None:\n        super().__init__(opts, *args, **kwargs)\n\n        self.ignore_idx = getattr(\n            opts, \"loss.classification.cross_entropy.ignore_index\"\n        )\n        self.use_class_wts = getattr(\n            opts, \"loss.classification.cross_entropy.class_weights\"\n        )\n        self.label_smoothing = getattr(\n            opts, \"loss.classification.cross_entropy.label_smoothing\"\n        )\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        \"\"\"Add cross-entropy criteria-specific arguments to the parser.\"\"\"\n        if cls != CrossEntropy:\n            # Don't re-register arguments in subclasses that don't override `add_arguments()`.\n            return parser\n        group = parser.add_argument_group(title=cls.__name__)\n        group.add_argument(\n            \"--loss.classification.cross-entropy.class-weights\",\n            action=\"store_true\",\n            default=False,\n            help=f\"Use class weights in {cls.__name__}. Defaults to False.\",\n        )\n        group.add_argument(\n            \"--loss.classification.cross-entropy.ignore-index\",\n            type=int,\n            default=-1,\n            help=f\"Target value that is ignored and does not contribute to \"\n            f\"the input gradient in {cls.__name__}. Defaults to -1.\",\n        )\n        group.add_argument(\n            \"--loss.classification.cross-entropy.label-smoothing\",\n            type=float,\n            default=0.0,\n            help=f\"Specifies the amount of smoothing when computing the loss in {cls.__name__}, \"\n            f\"where 0.0 means no smoothing. Defaults to 0.0.\",\n        )\n        return parser\n\n    def _compute_loss(\n        self, prediction: Tensor, target: Tensor, *args, **kwargs\n    ) -> Tensor:\n        \"\"\"Computes cross-entropy loss between prediction and target tensors.\n\n        Args:\n            prediction: Predicted tensor of shape [N, C]\n            target: Target label tensor of shape [N] containing values between [0, C),\n\n            Here, :math:`C` is the number of classes and :math:`N` is the batch size\n\n        Returns:\n            A scalar loss value\n        \"\"\"\n        weight = None\n        if self.use_class_wts and self.training:\n            n_classes = prediction.shape[1]\n            weight = compute_class_weights(target=target, n_classes=n_classes)\n\n        # for validation, we compute standard CE loss\n        label_smoothing_val = self.label_smoothing if self.training else 0.0\n        return F.cross_entropy(\n            input=prediction,\n            target=target,\n            weight=weight,\n            ignore_index=self.ignore_idx,\n            label_smoothing=label_smoothing_val,\n        )\n\n    def extra_repr(self) -> str:\n        return (\n            f\"\\n\\t ignore_idx={self.ignore_idx}\"\n            f\"\\n\\t class_weighting={self.use_class_wts}\"\n            f\"\\n\\t label_smoothing={self.label_smoothing}\"\n        )\n"
  },
  {
    "path": "corenet/loss_fn/classification/focal_loss.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\n\nimport torch\nfrom torch import Tensor, nn\nfrom torch.nn import functional as F\n\nfrom corenet.loss_fn import LOSS_REGISTRY\nfrom corenet.loss_fn.classification.base_classification_criteria import (\n    BaseClassificationCriteria,\n)\n\n\n@LOSS_REGISTRY.register(name=\"focal_loss\", type=\"classification\")\nclass FocalLoss(BaseClassificationCriteria):\n    \"\"\"Add focal loss, as introduced in RetinaNet\n    (https://arxiv.org/pdf/1708.02002.pdf).\n\n    This loss is similar to Cross Entropy, but downweights the loss from\n    examples that are correctly classified with high confidence. This helps the\n    classifier focus on hard examples. The weighting term is (1 - p)^gamma,\n    where gamma is a hyperparameter.\n\n    Arguments:\n        gamma: The loss-weighting hyperparameter.\n        weights: The class-specific loss weights, as a vector.\n    \"\"\"\n\n    def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None:\n        super().__init__(opts, *args, **kwargs)\n        self.gamma = getattr(opts, \"loss.classification.focal_loss.gamma\")\n        self.weights = getattr(opts, \"loss.classification.focal_loss.weights\")\n        if self.weights is not None:\n            self.weights = torch.tensor(self.weights)\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        \"\"\"Add Focal loss criteria-specific arguments to the parser.\"\"\"\n        if cls != FocalLoss:\n            # Don't re-register arguments in subclasses that don't override `add_arguments()`.\n            return parser\n        group = parser.add_argument_group(title=cls.__name__)\n        group.add_argument(\n            \"--loss.classification.focal-loss.gamma\",\n            type=float,\n            default=0,\n            help=f\"Gamma of focal loss. Defaults to 0 and it's equvilent to CE loss.\",\n        )\n        group.add_argument(\n            \"--loss.classification.focal-loss.weights\",\n            nargs=\"*\",\n            default=None,\n            type=float,\n            help=f\"Weights for {cls.__name__}. Defaults to None.\",\n        )\n        return parser\n\n    def _compute_loss(\n        self, prediction: Tensor, target: Tensor, *args, **kwargs\n    ) -> Tensor:\n        \"\"\"Calculate the focal loss.\n\n        Arguments:\n            prediction: A tensor of shape [batch_size, num_classes] containing logits.\n            targets: Either (1) a tensor of shape [batch_size] containing class ids, or\n                (2) a tensor of shape [batch_size, num_classes] containing soft targets.\n\n        Returns:\n            A scalar loss value.\n        \"\"\"\n        if prediction.dim() != 2:\n            raise ValueError(f\"Expected 2 dimensions, got {prediction.dim()}\")\n        if target.dim() not in (1, 2):\n            raise ValueError(f\"Expected 1 or 2 dimensions, got {target.dim()}\")\n\n        if target.dim() == 1:\n            target = F.one_hot(target, num_classes=prediction.shape[-1])\n\n        log_softmax_probabilities = torch.log_softmax(prediction, dim=-1)\n        loss = -target * log_softmax_probabilities\n\n        # Add the focal loss term.\n        focal_term = (1 - torch.exp(log_softmax_probabilities)).pow(self.gamma)\n        loss *= focal_term\n\n        # Add the weights.\n        if self.weights is not None:\n            loss *= self.weights.to(loss.device)\n\n        return loss.sum(dim=-1).mean()\n\n    def extra_repr(self) -> str:\n        return f\"\\n\\t gamma={self.gamma}\" f\"\\n\\t weights={self.weights}\"\n"
  },
  {
    "path": "corenet/loss_fn/composite_loss.py",
    "content": "#  For licensing see accompanying LICENSE file.\n#  Copyright (C) 2024 Apple Inc. All Rights Reserved.\n\nfrom __future__ import annotations\n\nimport argparse\nimport copy\nimport json\nfrom typing import Any, List, Mapping, Tuple\n\nfrom torch import Tensor\n\nfrom corenet.loss_fn import LOSS_REGISTRY, BaseCriteria, build_loss_fn\nfrom corenet.options.utils import flatten_yaml_as_dict\nfrom corenet.utils import logger\n\n\n# CompositeLoss can be used with any task. Therefore, we register both name and type\n# as the same.\n@LOSS_REGISTRY.register(name=\"composite_loss\", type=\"composite_loss\")\nclass CompositeLoss(BaseCriteria):\n    \"\"\"Combines different loss functions and returns the weighted sum of these losses.\n    `loss_category` and `loss_weight` are two mandatory keys that allows us to combine\n    different losses and compute their weighted sum. The `loss_category` specifies the category\n    of a loss function and is a string (e.g., classification). The `loss_weight` specifies\n    the contribution of a loss function and is a float value (e.g., 1.0). The sum of `loss_weight`s\n    corresponding to different loss functions is not required to be 1.\n\n    Args:\n        opts: command-line arguments\n\n    Example::\n    # Example yaml config for combining classification and neural_augmentation loss function is given below.\n    # Please note that configuration for each loss function should start with `-` in `composite_loss`.\n\n    loss:\n      category: \"composite_loss\"\n      composite_loss:\n        - loss_category: \"classification\"\n          loss_weight: 1.0\n          classification:\n            name: \"cross_entropy\"\n            cross_entropy:\n              label_smoothing: 0.1\n        - loss_category: \"neural_augmentation\"\n          loss_weight: 1.0\n          neural_augmentation:\n            perceptual_metric: \"psnr\"\n            target_value: [ 40, 10 ]\n            curriculum_method: \"cosine\"\n    \"\"\"\n\n    def __init__(\n        self,\n        opts: argparse.Namespace,\n        *args,\n        **kwargs,\n    ) -> None:\n\n        (\n            task_loss_fn_mapping,\n            task_loss_wts_mapping,\n        ) = CompositeLoss.build_composite_loss_fn(opts, *args, **kwargs)\n\n        super().__init__(opts, *args, **kwargs)\n        self.loss_fns = task_loss_fn_mapping\n        self.loss_weights = task_loss_wts_mapping\n\n    @classmethod\n    def build_composite_loss_fn(\n        cls, opts: argparse.Namespace, *args, **kwargs\n    ) -> Tuple[Mapping[str, BaseCriteria], Mapping[str, float]]:\n        \"\"\"Build loss functions from command line arguments and loss registry\n\n        Args:\n            opts: command-line arguments\n\n        Returns:\n            A tuple of two dictionaries. The first dictionary, task_loss_fn_mapping, contains\n            information about loss function category and module. The second dictionary, `task_loss_wts_mapping`\n            contains the information about loss function category and weight.\n        \"\"\"\n        composite_loss_opts = getattr(opts, \"loss.composite_loss\")\n        if composite_loss_opts is None:\n            logger.error(\n                f\"{cls.__name__} can't be None. Please specify --loss.composite-loss using yaml file\"\n            )\n\n        if not isinstance(composite_loss_opts, List):\n            logger.error(\n                f\"{cls.__name__} options are expected as a List. \"\n                f\"Got type: {type(composite_loss_opts)} and values: {composite_loss_opts}\"\n            )\n\n        num_loss_fns = len(composite_loss_opts)\n        if num_loss_fns < 1:\n            logger.error(f\"We need at least one loss function if using {cls.__name__}\")\n\n        task_loss_fn_mapping = {}\n        task_loss_wts_mapping = {}\n        for i, composite_loss_opts_as_dict in enumerate(composite_loss_opts):\n            if \"loss_category\" not in composite_loss_opts_as_dict:\n                logger.error(\"loss_category is a mandatory key\")\n            if \"loss_weight\" not in composite_loss_opts_as_dict:\n                logger.error(\"Loss weight is a mandatory\")\n            loss_category = composite_loss_opts_as_dict.pop(\"loss_category\")\n\n            loss_weight = composite_loss_opts_as_dict.pop(\"loss_weight\")\n            if not isinstance(loss_weight, (float, int)):\n                logger.error(\n                    f\"loss weight should be either int or float. \"\n                    f\"Got: value={loss_weight}, type={type(loss_weight)}\"\n                )\n\n            # flatten the dictionary\n            composite_loss_opts_as_dict = flatten_yaml_as_dict(\n                composite_loss_opts_as_dict\n            )\n\n            # `composite_loss_opts_as_dict` only contains the values of command-line arguments that are\n            # defined in the yaml file. Therefore, if a user misses few arguments, we won't have access\n            # to default values, leading to an error. To avoid this, we create a local copy of global\n            # command-line arguments and update it with `composite_loss_opts_as_dict` arguments\n            loss_opts = copy.deepcopy(opts)\n\n            # override the global opts with loss_fn specific opts in local copy\n            for k, v in composite_loss_opts_as_dict.items():\n                # we need to prefix each argument with loss because we define individual losses as\n                # `loss.classification.*` and not `classification.*`\n                setattr(loss_opts, \"loss.\" + k, v)\n\n            # given the category of a loss function, build the criteria\n            task_loss_fn_mapping[loss_category] = build_loss_fn(\n                opts=loss_opts, category=loss_category, *args, **kwargs\n            )\n\n            task_loss_wts_mapping[loss_category] = loss_weight\n\n        # see if the keys in task_loss_fn_mapping and task_loss_wts_mapping are the same or not\n        # i.e., intersection is null.\n        is_intersection = task_loss_fn_mapping.keys().isdisjoint(task_loss_wts_mapping)\n        assert is_intersection is False, (\n            f\"The keys in task_loss_fn_mapping and task_loss_wts_mapping are not the same. \"\n            f\"Got: {task_loss_fn_mapping.keys()} and {task_loss_wts_mapping.keys()}\"\n        )\n\n        return task_loss_fn_mapping, task_loss_wts_mapping\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        \"\"\"Add criteria-specific arguments to the parser.\"\"\"\n        if cls != CompositeLoss:\n            # Don't re-register arguments in subclasses that don't override `add_arguments()`.\n            return parser\n        group = parser.add_argument_group(cls.__name__)\n\n        group.add_argument(\"--loss.composite-loss\", type=json.loads, action=\"append\")\n        return parser\n\n    def forward(\n        self, input_sample: Any, prediction: Any, target: Any, *args, **kwargs\n    ) -> Any:\n        \"\"\"Compute the weighted sum of different loss functions.\n\n        Args:\n            input_sample: Input to the model.\n            prediction: Model's output\n            target: Ground truth labels\n\n        Returns:\n            A mapping of the form (str: scalar loss value) with `total_loss` as a mandatory key.\n            The other keys corresponds to loss category names and their values contain category-specific\n            scalar loss values. total_loss is weighted sum of these category-specific losses.\n        \"\"\"\n        outputs = {}\n        total_loss = 0.0\n        for loss_name, loss_layer in self.loss_fns.items():\n            loss_wt = self.loss_weights[loss_name]\n            loss_val = loss_layer(\n                input_sample=input_sample,\n                prediction=prediction,\n                target=target,\n                *args,\n                **kwargs,\n            )\n\n            if not isinstance(loss_val, (Tensor, Mapping)):\n                logger.error(\n                    \"Loss value is expected as a scalar or dictionary of scalars with total_loss as a \"\n                    \"mandatory key.\"\n                )\n\n            if isinstance(loss_val, Mapping) and \"total_loss\" in loss_val:\n                loss_val = loss_val[\"total_loss\"]\n\n                if not isinstance(loss_val, Tensor):\n                    logger.error(\n                        f\"Value corresponding to total_loss key in {loss_val} is expected to be scalar.\"\n                        f\"Got: {type(loss_val)}\"\n                    )\n            # scale the loss\n            loss_val = loss_val * loss_wt\n\n            total_loss += loss_val\n            outputs[loss_name] = loss_val\n        outputs.update({\"total_loss\": total_loss})\n        return outputs\n\n    def train(self, mode: bool = True) -> None:\n        \"\"\"Sets the loss functions in training mode.\"\"\"\n        for loss_name, loss_layer in self.loss_fns.items():\n            loss_layer.train(mode=mode)\n\n    def eval(self) -> None:\n        \"\"\"Sets the loss functions in evaluation mode.\"\"\"\n        for loss_name, loss_layer in self.loss_fns.items():\n            loss_layer.eval()\n\n    def __repr__(self) -> str:\n        repr_str = f\"{self.__class__.__name__}(\\n\\t\"\n        for k, v in self.loss_fns.items():\n            repr_str += (\n                v.__repr__()\n                .replace(\"\\n\\t\", \" \")\n                .replace(\"\\n)\", f\" loss_wt={self.loss_weights[k]})\")\n            )\n            repr_str += \"\\n\\t\"\n        repr_str += \"\\n)\"\n        return repr_str\n"
  },
  {
    "path": "corenet/loss_fn/detection/__init__.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n"
  },
  {
    "path": "corenet/loss_fn/detection/base_detection_criteria.py",
    "content": "#  For licensing see accompanying LICENSE file.\n#  Copyright (C) 2024 Apple Inc. All Rights Reserved.\n\nimport argparse\n\nfrom corenet.loss_fn import LOSS_REGISTRY, BaseCriteria\n\n\n@LOSS_REGISTRY.register(name=\"__base__\", type=\"detection\")\nclass BaseDetectionCriteria(BaseCriteria):\n    \"\"\"Base class for defining detection loss functions. Sub-classes must implement forward function.\n\n    Args:\n        opts: command line arguments\n    \"\"\"\n\n    def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None:\n        super().__init__(opts, *args, **kwargs)\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        if cls != BaseDetectionCriteria:\n            # Don't re-register arguments in subclasses that don't override `add_arguments()`.\n            return parser\n\n        group = parser.add_argument_group(cls.__name__)\n        group.add_argument(\n            \"--loss.detection.name\",\n            type=str,\n            default=None,\n            help=f\"Name of the loss function in {cls.__name__}. Defaults to None.\",\n        )\n        return parser\n"
  },
  {
    "path": "corenet/loss_fn/detection/mask_rcnn_loss.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nfrom typing import Any, Dict\n\nimport torch\nfrom torch import Tensor\n\nfrom corenet.loss_fn import LOSS_REGISTRY\nfrom corenet.loss_fn.detection.base_detection_criteria import BaseDetectionCriteria\nfrom corenet.utils import logger\n\n\n@LOSS_REGISTRY.register(name=\"mask_rcnn_loss\", type=\"detection\")\nclass MaskRCNNLoss(BaseDetectionCriteria):\n    \"\"\"Mask RCNN loss is computed inside the MaskRCNN model. This class is a wrapper to extract\n    loss values for different heads (RPN, classification, etc.) and compute the weighted sum.\n\n    Args:\n        opts: command-line arguments\n    \"\"\"\n\n    def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None:\n        super().__init__(opts, *args, **kwargs)\n\n        self.classifier_weight = getattr(\n            opts, \"loss.detection.mask_rcnn_loss.classifier_weight\"\n        )\n        self.box_reg_weight = getattr(\n            opts, \"loss.detection.mask_rcnn_loss.box_reg_weight\"\n        )\n        self.mask_weight = getattr(opts, \"loss.detection.mask_rcnn_loss.mask_weight\")\n        self.objectness_weight = getattr(\n            opts, \"loss.detection.mask_rcnn_loss.objectness_weight\"\n        )\n        self.rpn_box_reg = getattr(opts, \"loss.detection.mask_rcnn_loss.rpn_box_reg\")\n        # dev.device is not a part of model arguments. so test fails.\n        # Setting a default value so test works\n        self.device = getattr(opts, \"dev.device\", torch.device(\"cpu\"))\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        if cls != MaskRCNNLoss:\n            # Don't re-register arguments in subclasses that don't override `add_arguments()`.\n            return parser\n        group = parser.add_argument_group(title=cls.__name__)\n        group.add_argument(\n            \"--loss.detection.mask-rcnn-loss.classifier-weight\",\n            type=float,\n            default=1,\n            help=f\"Weight for classifier in {cls.__name__}. Defaults to 1.\",\n        )\n        group.add_argument(\n            \"--loss.detection.mask-rcnn-loss.box-reg-weight\",\n            type=float,\n            default=1,\n            help=f\"Weight for box reg in {cls.__name__}. Defaults to 1.\",\n        )\n        group.add_argument(\n            \"--loss.detection.mask-rcnn-loss.mask-weight\",\n            type=float,\n            default=1,\n            help=f\"Weight for mask in {cls.__name__}. Defaults to 1.\",\n        )\n        group.add_argument(\n            \"--loss.detection.mask-rcnn-loss.objectness-weight\",\n            type=float,\n            default=1,\n            help=f\"Weight for objectness in {cls.__name__}. Defaults to 1.\",\n        )\n        group.add_argument(\n            \"--loss.detection.mask-rcnn-loss.rpn-box-reg\",\n            type=float,\n            default=1,\n            help=f\"Weight for rpn box reg. in {cls.__name__}. Defaults to 1.\",\n        )\n        return parser\n\n    def forward(\n        self,\n        input_sample: Any,\n        prediction: Dict[str, Tensor],\n        *args,\n        **kwargs,\n    ) -> Dict[str, Tensor]:\n        \"\"\"Compute MaskRCNN loss.\n\n        Args:\n            input_sample: Input image tensor to the model.\n            prediction: Mapping of the Maskrcnn losses.\n\n        Shapes:\n            input_sample: This loss function does not care about input to the model.\n            prediction: Dictionary containing scalar Mask RCNN loss values. Expected keys are\n                loss_classifier, loss_box_reg, loss_mask, loss_objectness, loss_rpn_box_reg.\n\n        Returns:\n            A mapping of (string: scalar) is returned. Output contains following keys: (total_loss,\n            loss_classifier, loss_box_reg, loss_mask, loss_objectness, loss_rpn_box_reg).\n        \"\"\"\n\n        if not self.training:\n            # MaskRCNN doesn't return the loss during validation. Therefore, we return 0.\n            return {\"total_loss\": torch.tensor(0.0, device=self.device)}\n\n        if not isinstance(prediction, Dict):\n            logger.error(\n                f\"{self.__class__.__name__} requires prediction as a dictionary with \"\n                f\"loss_classifier, loss_box_reg, loss_mask, loss_objectness, loss_rpn_box_reg as \"\n                f\"mandatory keys. Got: {type(prediction)}.\"\n            )\n\n        if not {\n            \"loss_classifier\",\n            \"loss_box_reg\",\n            \"loss_mask\",\n            \"loss_objectness\",\n            \"loss_rpn_box_reg\",\n        }.issubset(prediction.keys()):\n            logger.error(\n                f\"loss_classifier, loss_box_reg, loss_mask, loss_objectness, loss_rpn_box_reg are \"\n                f\"required keys in {self.__class__.__name__}. Got: {prediction.keys()}\"\n            )\n\n        total_loss = 0.0\n        mask_rcnn_losses = {}\n\n        for loss_key, loss_wt in zip(\n            [\n                \"loss_classifier\",\n                \"loss_box_reg\",\n                \"loss_mask\",\n                \"loss_objectness\",\n                \"loss_rpn_box_reg\",\n            ],\n            [\n                self.classifier_weight,\n                self.box_reg_weight,\n                self.mask_weight,\n                self.objectness_weight,\n                self.rpn_box_reg,\n            ],\n        ):\n            loss_ = prediction[loss_key] * loss_wt\n            total_loss += loss_\n            mask_rcnn_losses[loss_key] = loss_\n        mask_rcnn_losses.update({\"total_loss\": total_loss})\n        return mask_rcnn_losses\n\n    def extra_repr(self) -> str:\n        return (\n            f\"\\n\\t classifier_wt={self.classifier_weight}\"\n            f\"\\n\\t box_reg_weight={self.box_reg_weight}\"\n            f\"\\n\\t mask_weight={self.mask_weight}\"\n            f\"\\n\\t objectness_weight={self.objectness_weight}\"\n            f\"\\n\\t rpn_box_reg={self.rpn_box_reg}\"\n        )\n"
  },
  {
    "path": "corenet/loss_fn/detection/ssd_multibox_loss.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nfrom typing import Any, Dict\n\nimport torch\nfrom torch import Tensor\nfrom torch.nn import functional as F\n\nfrom corenet.loss_fn import LOSS_REGISTRY\nfrom corenet.loss_fn.detection.base_detection_criteria import BaseDetectionCriteria\nfrom corenet.third_party.modeling.ssd_utils import hard_negative_mining\nfrom corenet.utils import logger\nfrom corenet.utils.ddp_utils import is_master\nfrom corenet.utils.tensor_utils import tensor_to_python_float\n\n\n@LOSS_REGISTRY.register(name=\"ssd_multibox_loss\", type=\"detection\")\nclass SSDLoss(BaseDetectionCriteria):\n    \"\"\"Loss for single shot multi-box object detection\n\n    Args:\n        opts: command-line arguments\n    \"\"\"\n\n    def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None:\n        super().__init__(opts, *args, **kwargs)\n        self.unscaled_reg_loss = 1e-7\n        self.unscaled_conf_loss = 1e-7\n        self.neg_pos_ratio = getattr(\n            opts, \"loss.detection.ssd_multibox_loss.neg_pos_ratio\"\n        )\n        self.wt_loc = 1.0\n        self.curr_iter = 0\n        self.max_iter = getattr(\n            opts, \"loss.detection.ssd_multibox_loss.max_monitor_iter\"\n        )\n        self.update_inter = getattr(\n            opts, \"loss.detection.ssd_multibox_loss.update_wt_freq\"\n        )\n        self.is_master = is_master(opts)\n        self.label_smoothing = getattr(\n            opts, \"loss.detection.ssd_multibox_loss.label_smoothing\"\n        )\n        if not (0.0 <= self.label_smoothing < 1.0):\n            logger.error(\n                \"The value of --loss.detection.ssd-multibox-loss.label-smoothing should be between 0 and 1. \"\n                \"Got: {}\".format(self.label_smoothing)\n            )\n\n        # Add default value to run CI/CD smoothly\n        self.is_distributed = getattr(opts, \"ddp.use_distributed\", False)\n\n        self.reset_unscaled_loss_values()\n\n    def reset_unscaled_loss_values(self) -> None:\n        \"\"\"Reset the unscaled coefficients for confidence and regression losses to small values\"\"\"\n        # initialize with very small float values\n        self.unscaled_conf_loss = 1e-7\n        self.unscaled_reg_loss = 1e-7\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        if cls != SSDLoss:\n            # Don't re-register arguments in subclasses that don't override `add_arguments()`.\n            return parser\n\n        group = parser.add_argument_group(title=cls.__name__)\n        group.add_argument(\n            \"--loss.detection.ssd-multibox-loss.neg-pos-ratio\",\n            type=int,\n            default=3,\n            help=f\"Negative positive ratio in {cls.__name__}. Defaults to 3.\",\n        )\n        group.add_argument(\n            \"--loss.detection.ssd-multibox-loss.max-monitor-iter\",\n            type=int,\n            default=-1,\n            help=f\"Number of iterations for monitoring location and \"\n            f\"classification loss in {cls.__name__}. -1 means do not monitor. \"\n            f\"Defaults to -1.\",\n        )\n        group.add_argument(\n            \"--loss.detection.ssd-multibox-loss.update-wt-freq\",\n            type=int,\n            default=200,\n            help=f\"Update the weights after N number of iterations in {cls.__name__}. \"\n            f\"Defaults to 200 iterations.\",\n        )\n        group.add_argument(\n            \"--loss.detection.ssd-multibox-loss.label-smoothing\",\n            type=float,\n            default=0.0,\n            help=f\"Specifies the amount of smoothing when computing the classification loss in {cls.__name__}, \"\n            f\"where 0.0 means no smoothing. Defaults to 0.0.\",\n        )\n        return parser\n\n    def forward(\n        self,\n        input_sample: Any,\n        prediction: Dict[str, Tensor],\n        target: Dict[str, Tensor],\n        *args,\n        **kwargs,\n    ) -> Dict[str, Tensor]:\n        \"\"\"\n        Compute the SSD Loss\n\n        Args:\n            input_sample: Input image tensor to the model.\n            prediction: Model output. It is a mapping of the form (string: Tensor) containing two\n                mandatory keys, i.e., scores and boxes\n            target: Ground truth labels. It is a mapping of the form (string: Tensor) containing two\n                mandatory keys, i.e., box_labels and box_coordinates.\n        Shape:\n            input_sample: This loss function does not care about input to the model.\n            prediction[\"scores\"]: Shape is [Batch size, number of anchors, number of classes]\n            prediction[\"boxes\"]: Shape is [Batch size, number of anchors, 4] where 4 is the number of box coordinates\n\n            target[\"box_labels\"]: Shape is [Batch size, number of anchors]\n            target[\"box_coordinates\"]: Shape is [Batch size, number of anchors, 4]\n\n        Returns:\n            A mapping of (string: scalar) is returned. Output contains following keys: (total_loss, reg_loss, cls_loss).\n        \"\"\"\n\n        if not {\"scores\", \"boxes\"}.issubset(prediction.keys()):\n            logger.error(\n                f\"scores and boxes are mandatory keys for model's output in {self.__class__.__name__}.\"\n            )\n\n        if not {\"box_labels\", \"box_coordinates\"}.issubset(target.keys()):\n            logger.error(\n                f\"box_labels and box_coordinates are mandatory keys for ground truth in {self.__class__.__name__}.\"\n            )\n\n        confidence = prediction[\"scores\"]\n        predicted_locations = prediction[\"boxes\"]\n\n        gt_labels = target[\"box_labels\"]\n        gt_locations = target[\"box_coordinates\"]\n\n        num_classes = confidence.shape[-1]\n        num_coordinates = predicted_locations.shape[-1]\n\n        pos_mask = gt_labels > 0\n        predicted_locations = predicted_locations[pos_mask].reshape(-1, num_coordinates)\n        gt_locations = gt_locations[pos_mask].reshape(-1, num_coordinates)\n        num_pos = max(1, gt_locations.shape[0])\n        smooth_l1_loss = F.smooth_l1_loss(\n            predicted_locations, gt_locations, reduction=\"sum\"\n        )\n\n        with torch.no_grad():\n            loss = -F.log_softmax(confidence, dim=2)[:, :, 0]\n            mask = hard_negative_mining(loss, gt_labels, self.neg_pos_ratio)\n\n        confidence = confidence[mask, :]\n        label_smoothing = self.label_smoothing if self.training else 0.0\n        classification_loss = F.cross_entropy(\n            input=confidence.reshape(-1, num_classes),\n            target=gt_labels[mask],\n            reduction=\"sum\",\n            label_smoothing=label_smoothing,\n        )\n\n        if self.curr_iter <= self.max_iter and self.training:\n            # classification loss may dominate localization loss or vice-versa\n            # Therefore, to ensure that their contributions are equal towards total loss, we scale regression loss.\n            # If classification loss contribution is less (or more), then scaling factor will be < 1 (or > 1)\n            self.unscaled_conf_loss += tensor_to_python_float(\n                classification_loss, is_distributed=self.is_distributed\n            )\n            self.unscaled_reg_loss += tensor_to_python_float(\n                smooth_l1_loss, is_distributed=self.is_distributed\n            )\n\n            if (\n                (self.curr_iter + 1) % self.update_inter == 0\n            ) or self.curr_iter == self.max_iter:\n                # weight value before update\n                before_update = tensor_to_python_float(\n                    self.wt_loc, is_distributed=self.is_distributed\n                )\n                before_update = round(before_update, 4)\n                # update the weight value\n                self.wt_loc = self.unscaled_conf_loss / self.unscaled_reg_loss\n                self.reset_unscaled_loss_values()\n\n                if self.is_master:\n                    # weight value after update\n                    after_update = tensor_to_python_float(\n                        self.wt_loc, is_distributed=self.is_distributed\n                    )\n                    after_update = round(after_update, 4)\n                    logger.log(\n                        f\"Updating localization loss multiplier from {before_update} to {after_update}\"\n                    )\n\n            self.curr_iter += 1\n\n        if self.training and self.wt_loc > 0.0:\n            smooth_l1_loss = smooth_l1_loss * self.wt_loc\n\n        ssd_loss = (smooth_l1_loss + classification_loss) / num_pos\n        return {\n            \"total_loss\": ssd_loss,\n            \"reg_loss\": smooth_l1_loss / num_pos,\n            \"cls_loss\": classification_loss / num_pos,\n        }\n\n    def extra_repr(self) -> str:\n        return (\n            f\"\\n\\t neg_pos_ratio={self.neg_pos_ratio}\"\n            f\"\\n\\t box_loss=SmoothL1\"\n            f\"\\n\\t class_loss=CrossEntropy\"\n            f\"\\n\\t self_weighting={True if self.max_iter > 0 else False}\"\n        )\n"
  },
  {
    "path": "corenet/loss_fn/distillation/__init__.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n"
  },
  {
    "path": "corenet/loss_fn/distillation/base_distillation.py",
    "content": "#  For licensing see accompanying LICENSE file.\n#  Copyright (C) 2024 Apple Inc. All Rights Reserved.\n\nimport argparse\nfrom typing import Mapping, Union\n\nimport torch\nfrom torch import Tensor\n\nfrom corenet.loss_fn import LOSS_REGISTRY, BaseCriteria\nfrom corenet.loss_fn.utils.build_helper import build_cls_teacher_from_opts\nfrom corenet.utils import logger\n\n\n@LOSS_REGISTRY.register(name=\"__base__\", type=\"distillation\")\nclass BaseDistillationCriteria(BaseCriteria):\n    \"\"\"Base class for defining distillation loss functions. Sub-classes must implement `_forward_distill` function.\n\n    Args:\n        opts: command line arguments\n    \"\"\"\n\n    def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None:\n        super().__init__(opts, *args, **kwargs)\n\n        self.teacher = build_cls_teacher_from_opts(opts=opts)\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        if cls != BaseDistillationCriteria:\n            # Don't re-register arguments in subclasses that don't override `add_arguments()`.\n            return parser\n\n        group = parser.add_argument_group(cls.__name__)\n        group.add_argument(\n            \"--loss.distillation.name\",\n            type=str,\n            default=None,\n            help=\"Name of the loss function. Defaults to None.\",\n        )\n        return parser\n\n    @torch.no_grad()\n    def _logits_from_teacher(self, input_sample: Tensor) -> Tensor:\n        \"\"\"Compute logits from teacher given input image tensor.\n\n        Args:\n            input_sample: Input image tensor\n\n        Shape:\n            input_sample: Shape is [Batch size, 3, height, width]\n            teacher_output or teacher_output[\"logits\"]: Shape is [Batch size, number of classes]\n\n        Returns:\n            Teacher output tensor (without softmax)\n\n        ...note:\n            The output of teacher can be Tensor or Dict[str, Tensor]. In case\n            of dictionary, logits is a mandatory key.\n        \"\"\"\n        self.teacher.eval()\n        teacher_output: Union[Tensor, Mapping[str, Tensor]] = self.teacher(input_sample)\n        if isinstance(teacher_output, Mapping):\n            if \"logits\" not in teacher_output:\n                logger.error(\n                    \"The output type of teacher is dictionary and must contain logits as a key.\"\n                    f\"Got: {teacher_output.keys()}\"\n                )\n            return teacher_output[\"logits\"]\n        return teacher_output\n\n    def _forward_distill(\n        self, input_sample: Tensor, prediction: Tensor, *args, **kwargs\n    ) -> Tensor:\n        \"\"\"Computes distillation loss.\n\n        Args:\n            input_sample: Input image tensor\n            prediction: Student model's output.\n\n        Shapes:\n            input_sample: Shape is [Batch size, 3, height, width]\n            prediction: Shape is [Batch size, number of classes]\n\n        Returns:\n            A scalar loss value.\n        \"\"\"\n        raise NotImplementedError\n\n    def forward(\n        self,\n        input_sample: Tensor,\n        prediction: Union[Mapping[str, Tensor], Tensor],\n        target: Tensor,\n        *args,\n        **kwargs,\n    ) -> Union[Mapping[str, Tensor], Tensor]:\n        \"\"\"Computes distillation loss\n\n        Args:\n            input_sample: Input image tensor.\n            prediction: Output of model. It can be a tensor or mapping of (string: Tensor). In case of a dictionary,\n            `logits` is a required key.\n            target: Target label tensor containing values in the range `[0, C)`, where :math:`C` is the number of classes\n\n        Shapes:\n            input_sample: The shape of input tensor is [N, C, H, W]\n            prediction:\n                * When prediction is a tensor, then shape is [N, C]\n                * When prediction is a dictionary, then shape of prediction[\"logits\"] is [N, C]\n            target: The shape of target tensor is [N]\n\n        Returns:\n            * Scalar loss value is returned.\n        \"\"\"\n\n        if isinstance(prediction, Tensor):\n            return self._forward_distill(\n                input_sample=input_sample, prediction=prediction, *args, **kwargs\n            )\n        elif isinstance(prediction, Mapping):\n            if \"logits\" not in prediction:\n                logger.error(\n                    f\"logits is a required key in {self.__class__.__name__} when prediction type\"\n                    f\"is dictionary. Got keys: {prediction.keys()}\"\n                )\n\n            predicted_logits = prediction[\"logits\"]\n\n            # compute distillation loss\n            distill_loss = self._forward_distill(\n                input_sample=input_sample, prediction=predicted_logits, *args, **kwargs\n            )\n            return distill_loss\n        else:\n            logger.error(\n                f\"Prediction should be either a Tensor or Dictionary[str, Tensor]. Got: {type(prediction)}\"\n            )\n"
  },
  {
    "path": "corenet/loss_fn/distillation/hard_distillation.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\n\nimport torch\nfrom torch import Tensor\nfrom torch.nn import functional as F\n\nfrom corenet.loss_fn import LOSS_REGISTRY\nfrom corenet.loss_fn.distillation.base_distillation import BaseDistillationCriteria\nfrom corenet.utils import logger\n\n\n@LOSS_REGISTRY.register(name=\"hard_distillation\", type=\"distillation\")\nclass HardDistillationLoss(BaseDistillationCriteria):\n    \"\"\"Hard distillation using cross-entropy for classification tasks. Given an input sample, hard-labels\n    are generated from a teacher and cross-entropy loss is computed between hard-labels and student model's output.\n\n    Args:\n        opts: command-line arguments\n    \"\"\"\n\n    def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None:\n        top_k = getattr(opts, \"loss.distillation.hard_distillation.topk\")\n        if top_k < 1:\n            logger.error(f\"The value of top-k should be greater than 0. Got: {top_k}\")\n\n        label_smoothing = getattr(\n            opts, \"loss.distillation.hard_distillation.label_smoothing\"\n        )\n        if not (0.0 <= label_smoothing < 1.0):\n            logger.error(\n                f\"The value of label smoothing should be between 0 and 1. Got: {label_smoothing}\"\n            )\n\n        super().__init__(opts, *args, **kwargs)\n\n        self.topk = top_k\n        self.label_smoothing = label_smoothing\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        if cls != HardDistillationLoss:\n            # Don't re-register arguments in subclasses that don't override `add_arguments()`.\n            return parser\n\n        group = parser.add_argument_group(title=cls.__name__)\n        group.add_argument(\n            \"--loss.distillation.hard-distillation.topk\",\n            type=int,\n            default=1,\n            help=f\"Distill top-k labels from teacher when in {cls.__name__}. Defaults to 1.\",\n        )\n        group.add_argument(\n            \"--loss.distillation.hard-distillation.label-smoothing\",\n            type=float,\n            default=0.0,\n            help=f\"Specifies the amount of smoothing when computing the classification loss in {cls.__name__}, \"\n            f\"where 0.0 means no smoothing. Defaults to 0.0.\",\n        )\n        return parser\n\n    def _forward_distill(\n        self, input_sample: Tensor, prediction: Tensor, *args, **kwargs\n    ) -> Tensor:\n        \"\"\"\n        Computes cross entropy loss between students and hard labels generated from teacher.\n\n        Args:\n            input_sample: Input image tensor\n            prediction: Output of student model\n\n        Shapes:\n            input_sample: Shape is [Batch size, 3, height, width]\n            prediction: Shape is [Batch size, Number of classes]\n\n        Returns:\n            A scalar loss value\n\n        ...note:\n            When top-k labels extracted from teacher are used for distillation, binary cross entropy loss is used.\n        \"\"\"\n\n        with torch.no_grad():\n            teacher_logits = self._logits_from_teacher(input_sample)\n            teacher_probs = F.softmax(teacher_logits, dim=-1).detach()\n            _, teacher_topk_labels = torch.topk(\n                teacher_probs, k=self.topk, dim=-1, largest=True, sorted=True\n            )\n\n        if self.topk > 1:\n            num_classes = prediction.shape[-1]\n            teacher_topk_labels = F.one_hot(\n                teacher_topk_labels, num_classes=num_classes\n            )\n            teacher_topk_labels = teacher_topk_labels.sum(1)\n            teacher_topk_labels = teacher_topk_labels.to(dtype=prediction.dtype)\n\n            # smooth labels corresponding to multiple classes\n            smooth_class_p = (1.0 - self.label_smoothing) / self.topk\n            # distribute the mass over remaining classes\n            smooth_non_class_p = self.label_smoothing / (num_classes - self.topk)\n\n            teacher_topk_labels = torch.where(\n                teacher_topk_labels == 1.0, smooth_class_p, smooth_non_class_p\n            )\n\n            # scale by number of classes. Otherwise, the contribution is small\n            loss = (\n                F.binary_cross_entropy_with_logits(\n                    input=prediction, target=teacher_topk_labels, reduction=\"mean\"\n                )\n                * num_classes\n            )\n        else:\n            teacher_topk_labels = teacher_topk_labels.reshape(-1)\n            loss = F.cross_entropy(\n                input=prediction,\n                target=teacher_topk_labels,\n                reduction=\"mean\",\n                label_smoothing=self.label_smoothing,\n            )\n        return loss\n\n    def extra_repr(self) -> str:\n        return f\"\\n\\t topk={self.topk}\" f\"\\n\\tlabel_smoothing={self.label_smoothing}\"\n"
  },
  {
    "path": "corenet/loss_fn/distillation/soft_kl_distillation.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\n\nimport torch\nfrom torch import Tensor\nfrom torch.nn import functional as F\n\nfrom corenet.loss_fn import LOSS_REGISTRY\nfrom corenet.loss_fn.distillation.base_distillation import BaseDistillationCriteria\nfrom corenet.utils import logger\n\n\n@LOSS_REGISTRY.register(name=\"soft_kl_loss\", type=\"distillation\")\nclass SoftKLLoss(BaseDistillationCriteria):\n    \"\"\"Soft KL Loss for classification tasks. Given an input sample, soft-labels (or probabilities)\n    are generated from a teacher and KL loss is computed between soft-labels and student model's output.\n\n    Args:\n        opts: command-line arguments\n    \"\"\"\n\n    def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None:\n        temperature = getattr(opts, \"loss.distillation.soft_kl_loss.temperature\")\n        if temperature <= 0.0:\n            logger.error(\n                f\"The value of temperature in {self.__class__.__name__} should be positive.\"\n            )\n\n        super().__init__(opts, *args, **kwargs)\n\n        self.temperature = temperature\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        if cls != SoftKLLoss:\n            # Don't re-register arguments in subclasses that don't override `add_arguments()`.\n            return parser\n\n        group = parser.add_argument_group(title=cls.__name__)\n        group.add_argument(\n            \"--loss.distillation.soft-kl-loss.temperature\",\n            type=float,\n            default=1.0,\n            help=f\"Temperature for KL divergence loss in {cls.__name__}. Defaults to 1.\",\n        )\n        return parser\n\n    def _forward_distill(\n        self, input_sample: Tensor, prediction: Tensor, *args, **kwargs\n    ) -> Tensor:\n        \"\"\"Computes distillation loss.\n\n        Args:\n            input_sample: Input image tensor\n            prediction: Student model's output.\n\n        Shapes:\n            input_sample: Shape is [Batch size, 3, height, width]\n            prediction: Shape is [Batch size, number of classes]\n\n        Returns:\n            A scalar loss value.\n        \"\"\"\n        with torch.no_grad():\n            teacher_logits = self._logits_from_teacher(input_sample)\n            teacher_lprobs = F.log_softmax(\n                teacher_logits / self.temperature, dim=1\n            ).detach()\n\n        student_lprobs = F.log_softmax(prediction / self.temperature, dim=-1)\n        kl_loss = F.kl_div(\n            student_lprobs, teacher_lprobs, reduction=\"batchmean\", log_target=True\n        )\n        return kl_loss * (self.temperature**2)\n\n    def extra_repr(self) -> str:\n        return f\"\\n\\t temperature={self.temperature}\"\n"
  },
  {
    "path": "corenet/loss_fn/language_modeling/__init__.py",
    "content": ""
  },
  {
    "path": "corenet/loss_fn/language_modeling/base_lm.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nfrom typing import Any, Dict, Optional, Union\n\nfrom torch import Tensor\n\nfrom corenet.loss_fn import LOSS_REGISTRY, BaseCriteria\nfrom corenet.utils import logger\n\n\n@LOSS_REGISTRY.register(name=\"__base__\", type=\"language_modeling\")\nclass BaseLanguageModelingCriteria(BaseCriteria):\n    \"\"\"Base class for defining loss functions for the task of language modeling.\n\n    Args:\n        opts: Command line arguments.\n\n    ...note:\n        Sub-classes must implement '_compute_loss' function.\n    \"\"\"\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        \"\"\"Add language modeling specific arguments to the parser.\"\"\"\n        if cls is BaseLanguageModelingCriteria:\n            group = parser.add_argument_group(cls.__name__)\n            group.add_argument(\n                \"--loss.language-modeling.name\",\n                type=str,\n                default=None,\n                help=f\"Name of the loss function in {cls.__name__}. Defaults to None.\",\n            )\n        return parser\n\n    def _compute_loss(self, prediction: Tensor, target: Tensor) -> Tensor:\n        \"\"\"Sub-classes must override this function to compute loss.\n\n        Args:\n            prediction: Output of the model.\n            target: Ground truth labels.\n\n        Returns:\n            Expected to return a scalar value of loss.\n        \"\"\"\n        raise NotImplementedError(\n            \"Sub-classes must override this function to compute loss.\"\n        )\n\n    def forward(\n        self,\n        input_sample: Any,\n        prediction: Union[Dict[str, Tensor], Tensor],\n        target: Tensor,\n        epoch: Optional[int] = None,\n        iterations: Optional[int] = None,\n    ) -> Union[Dict[str, Tensor], Tensor]:\n        \"\"\"Computes the loss.\n\n        Args:\n            input_sample: Input samples to model.\n            prediction: Output of model. It can be a tensor or mapping of (string: Tensor). In case of mapping,\n            `logits` is a required key.\n            target: Target label tensor containing values in the range `[0, vocabulary size)`.\n            epoch: Training epoch.\n            iterations: Training iteration.\n\n        Shapes:\n            input_sample: This loss function does not care about this argument.\n            prediction:\n                * When prediction is a tensor, then shape is [batch size, sequence length, vocabulary size]\n                * When prediction is a dictionary, then the shape of prediction[\"logits\"] is [batch size, sequence length, vocabulary size]\n            target: The shape of target tensor is [batch size, sequence length]\n\n        Returns:\n            Either of the following is returned as an output:\n            1. 0-dimensional tensor containing the scalar loss value.\n            2. Mapping of the form (string: 0-dimensional tensor) is returned with 'total_loss' as\n                a mandatory key.\n\n        ...note:\n            While epoch and iteration values are currently not utilized in language modeling loss functions, they may be\n            incorporated in future developments or research.\n        \"\"\"\n\n        if isinstance(prediction, Tensor):\n            return self._compute_loss(prediction=prediction, target=target)\n        elif isinstance(prediction, Dict):\n            if \"logits\" not in prediction:\n                logger.error(\n                    f\"logits is a required key in {self.__class__.__name__} when prediction type\"\n                    f\"is dictionary. Got keys: {prediction.keys()}\"\n                )\n\n            predicted_logits = prediction[\"logits\"]\n            if predicted_logits is None:\n                logger.error(\"Predicted logits can not be None.\")\n\n            loss = self._compute_loss(prediction=predicted_logits, target=target)\n\n            return loss\n        else:\n            logger.error(\n                f\"Prediction should be either a Tensor or Dictionary[str, Tensor]. Got: {type(prediction)}\"\n            )\n"
  },
  {
    "path": "corenet/loss_fn/language_modeling/cross_entropy.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nfrom typing import Dict, Union\n\nfrom torch import Tensor\nfrom torch.nn import functional as F\n\nfrom corenet.loss_fn import LOSS_REGISTRY\nfrom corenet.loss_fn.language_modeling.base_lm import BaseLanguageModelingCriteria\n\n\n@LOSS_REGISTRY.register(name=\"cross_entropy\", type=\"language_modeling\")\nclass CrossEntropyLM(BaseLanguageModelingCriteria):\n    \"\"\"Cross entropy loss function for language modeling tasks.\n\n    Args:\n        opts: Command-line arguments.\n    \"\"\"\n\n    def __init__(self, opts: argparse.Namespace) -> None:\n        super().__init__(opts)\n\n        self.ignore_idx = getattr(\n            opts, \"loss.language_modeling.cross_entropy.ignore_index\"\n        )\n        if self.training:\n            self.label_smoothing = getattr(\n                opts, \"loss.language_modeling.cross_entropy.label_smoothing\"\n            )\n        else:\n            # for validation/test sets, we compute standard CE loss\n            self.label_smoothing = 0.0\n\n        self.use_z_loss = getattr(\n            opts, \"loss.language_modeling.cross_entropy.use_z_loss\"\n        )\n        self.z_loss_eps = getattr(\n            opts, \"loss.language_modeling.cross_entropy.z_loss_eps\"\n        )\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        \"\"\"Add cross-entropy criteria-specific arguments to the parser.\"\"\"\n        if cls == CrossEntropyLM:\n            group = parser.add_argument_group(title=cls.__name__)\n            group.add_argument(\n                \"--loss.language-modeling.cross-entropy.ignore-index\",\n                type=int,\n                default=-1,\n                help=f\"Target value that is ignored and does not contribute to \"\n                f\"the input gradient in {cls.__name__}. Defaults to -1.\",\n            )\n            group.add_argument(\n                \"--loss.language-modeling.cross-entropy.label-smoothing\",\n                type=float,\n                default=0.0,\n                help=f\"Specifies the amount of smoothing when computing the loss in {cls.__name__}, \"\n                f\"where 0.0 means no smoothing. Defaults to 0.0.\",\n            )\n            group.add_argument(\n                \"--loss.language-modeling.cross-entropy.use-z-loss\",\n                action=\"store_true\",\n                default=False,\n                help=\"Use z-loss with cross-entropy loss. Defaults to False.\",\n            )\n            group.add_argument(\n                \"--loss.language-modeling.cross-entropy.z-loss-eps\",\n                default=1.0e-4,\n                type=float,\n                help=\"Epsilon value for z-loss. Defaults to 0.0001.\",\n            )\n        return parser\n\n    def _compute_loss(\n        self, prediction: Tensor, target: Tensor\n    ) -> Union[Dict[str, Tensor], Tensor]:\n        \"\"\"Computes cross-entropy loss between prediction and target tensors.\n\n        Args:\n            prediction: Predicted tensor of shape [batch size, sequence length, vocabulary size].\n            target: Target label tensor containing values in the range `[0, vocabulary size)`. The shape of tensor is\n                [batch size, sequence length].\n\n        Returns:\n            1. If z-loss is disabled, then a 0-dimensional tensor containing scalar loss value is returned.\n            2. If z-loss is enabled, then a dictionary of the form (string: 0-dimensional tensor) is returned\n                with three keys: 'total_loss', 'ce_loss', and 'z_loss'.\n        \"\"\"\n\n        batch_size, seq_length, vocab_size = prediction.shape\n        prediction = prediction.reshape(batch_size * seq_length, vocab_size)\n        target = target.reshape(batch_size * seq_length)\n        ce_loss = F.cross_entropy(\n            input=prediction,\n            target=target,\n            ignore_index=self.ignore_idx,\n            label_smoothing=self.label_smoothing,\n        )\n\n        if self.use_z_loss:\n            # Adaption of Eq. (5) for z-loss computation in https://arxiv.org/pdf/2202.08906.pdf (non-router use-case).\n            valid_tokens = (target != self.ignore_idx).type_as(prediction)\n            # do not compute z_loss for ignored indices\n            z_loss = (prediction * valid_tokens[:, None]).logsumexp(-1).pow(2).sum()\n            z_loss *= self.z_loss_eps / valid_tokens.sum()\n            return {\n                \"total_loss\": ce_loss + z_loss,\n                \"ce_loss\": ce_loss,\n                \"z_loss\": z_loss,\n            }\n        return ce_loss\n\n    def extra_repr(self) -> str:\n        loss_info_str = (\n            f\"\\n\\t ignore_idx={self.ignore_idx}\"\n            f\"\\n\\t label_smoothing={self.label_smoothing}\"\n        )\n        if self.use_z_loss:\n            loss_info_str += (\n                f\"\\n\\t use_z_loss={self.use_z_loss}\"\n                f\"\\n\\t z_loss_eps={self.z_loss_eps}\"\n            )\n\n        return loss_info_str\n"
  },
  {
    "path": "corenet/loss_fn/language_modeling/cross_entropy_for_kv_prediction.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nfrom typing import Any, Dict, List, Optional, Union\n\nimport torch\nfrom torch import Tensor\nfrom torch.nn import functional as F\n\nfrom corenet.loss_fn import LOSS_REGISTRY, BaseCriteria\nfrom corenet.utils import logger\n\n\n@LOSS_REGISTRY.register(\n    name=\"cross_entropy_for_kv_prediction\", type=\"language_modeling\"\n)\nclass CrossEntropyForKVPrediction(BaseCriteria):\n    \"\"\"Cross entropy loss function for language modeling tasks.\n\n    Used in KV Prediction experiments (https://arxiv.org/abs/2410.08391).\n\n    Args:\n        opts: Command-line arguments.\n    \"\"\"\n\n    def __init__(self, opts: argparse.Namespace) -> None:\n        super().__init__(opts)\n\n        self.ignore_idx = getattr(\n            opts, \"loss.language_modeling.cross_entropy_for_kv_prediction.ignore_index\"\n        )\n        if self.training:\n            self.label_smoothing = getattr(\n                opts,\n                \"loss.language_modeling.cross_entropy_for_kv_prediction.label_smoothing\",\n            )\n        else:\n            # for validation/test sets, we compute standard CE loss\n            self.label_smoothing = 0.0\n\n        self.use_z_loss = getattr(\n            opts, \"loss.language_modeling.cross_entropy_for_kv_prediction.use_z_loss\"\n        )\n        self.z_loss_eps = getattr(\n            opts, \"loss.language_modeling.cross_entropy_for_kv_prediction.z_loss_eps\"\n        )\n        self.auxiliary_loss = getattr(\n            opts,\n            \"loss.language_modeling.cross_entropy_for_kv_prediction.auxiliary_loss\",\n        )\n        self.base_loss = getattr(\n            opts, \"loss.language_modeling.cross_entropy_for_kv_prediction.base_loss\"\n        )\n        self.kv_loss = getattr(\n            opts, \"loss.language_modeling.cross_entropy_for_kv_prediction.kv_loss\"\n        )\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        \"\"\"Add cross-entropy criteria-specific arguments to the parser.\"\"\"\n        if cls == CrossEntropyForKVPrediction:\n            group = parser.add_argument_group(title=cls.__name__)\n            group.add_argument(\n                \"--loss.language-modeling.cross-entropy-for-kv-prediction.ignore-index\",\n                type=int,\n                default=-1,\n                help=f\"Target value that is ignored and does not contribute to \"\n                f\"the input gradient in {cls.__name__}. Defaults to -1.\",\n            )\n            group.add_argument(\n                \"--loss.language-modeling.cross-entropy-for-kv-prediction.label-smoothing\",\n                type=float,\n                default=0.0,\n                help=f\"Specifies the amount of smoothing when computing the loss in {cls.__name__}, \"\n                f\"where 0.0 means no smoothing. Defaults to 0.0.\",\n            )\n            group.add_argument(\n                \"--loss.language-modeling.cross-entropy-for-kv-prediction.use-z-loss\",\n                action=\"store_true\",\n                default=False,\n                help=\"Use z-loss with cross-entropy loss. Defaults to False.\",\n            )\n            group.add_argument(\n                \"--loss.language-modeling.cross-entropy-for-kv-prediction.z-loss-eps\",\n                default=1.0e-4,\n                type=float,\n                help=\"Epsilon value for z-loss. Defaults to 0.0001.\",\n            )\n            group.add_argument(\n                \"--loss.language-modeling.cross-entropy-for-kv-prediction.auxiliary-loss\",\n                default=0.0,\n                type=float,\n                help=\"Multiplicative factor for auxiliary loss.\",\n            )\n            group.add_argument(\n                \"--loss.language-modeling.cross-entropy-for-kv-prediction.base-loss\",\n                default=1.0,\n                type=float,\n                help=\"Multiplicative factor for base loss.\",\n            )\n            group.add_argument(\n                \"--loss.language-modeling.cross-entropy-for-kv-prediction.kv-loss\",\n                default=0.0,\n                type=float,\n                help=\"Multiplicative factor for KV loss.\",\n            )\n\n        return parser\n\n    def forward(\n        self,\n        input_sample: Any,\n        prediction: Union[Dict[str, Tensor], Tensor],\n        target: Tensor,\n        epoch: Optional[int] = None,\n        iterations: Optional[int] = None,\n    ) -> Union[Dict[str, Tensor], Tensor]:\n        \"\"\"Computes the loss.\n\n        Args:\n            input_sample: Input samples to model.\n            prediction: Output of model. It can be a tensor or mapping of (string: Tensor). In case of mapping,\n            `logits` is a required key.\n            target: Target label tensor containing values in the range `[0, vocabulary size)`.\n            epoch: Training epoch.\n            iterations: Training iteration.\n\n        Shapes:\n            input_sample: This loss function does not care about this argument.\n            prediction:\n                * When prediction is a tensor, then shape is [batch size, sequence length, vocabulary size]\n                * When prediction is a dictionary, then the shape of prediction[\"logits\"] is [batch size, sequence length, vocabulary size]\n            target: The shape of target tensor is [batch size, sequence length]\n\n        Returns:\n            Either of the following is returned as an output:\n            1. 0-dimensional tensor containing the scalar loss value.\n            2. Mapping of the form (string: 0-dimensional tensor) is returned with 'total_loss' as\n                a mandatory key.\n\n        ...note:\n            While epoch and iteration values are currently not utilized in language modeling loss functions, they may be\n            incorporated in future developments or research.\n        \"\"\"\n        if isinstance(prediction, Tensor):\n            raise ValueError(f\"This loss requires a dictionary.\")\n        elif isinstance(prediction, Dict):\n            expected_keys = {\n                \"auxiliary_logits\",\n                \"past_keys\",\n                \"past_values\",\n                \"base_past_keys\",\n                \"base_past_values\",\n            }\n            if not expected_keys.issubset(prediction):\n                logger.error(\n                    f\"Expected keys {expected_keys=}.\" f\"Got keys {prediction.keys()=}\"\n                )\n\n            loss = self._compute_loss(\n                prediction=prediction[\"logits\"],\n                target=target,\n                auxiliary=prediction[\"auxiliary_logits\"],\n                past_keys=prediction[\"past_keys\"],\n                past_values=prediction[\"past_values\"],\n                base_past_keys=prediction[\"base_past_keys\"],\n                base_past_values=prediction[\"base_past_values\"],\n            )\n\n            return loss\n        else:\n            logger.error(\n                f\"Prediction should be either a Tensor or Dictionary[str, Tensor]. Got: {type(prediction)}\"\n            )\n\n    def _compute_loss(\n        self,\n        prediction: Tensor,\n        target: Tensor,\n        auxiliary: Tensor,\n        past_keys: List[Tensor],\n        past_values: List[Tensor],\n        base_past_keys: List[Tensor],\n        base_past_values: List[Tensor],\n    ) -> Union[Dict[str, Tensor], Tensor]:\n        \"\"\"Computes cross-entropy loss between prediction and target tensors.\n\n        Args:\n            prediction: Predicted tensor of shape [batch size, sequence length, vocabulary size].\n            target: Target label tensor containing values in the range `[0, vocabulary size)`. The shape of tensor is\n                [batch size, sequence length].\n            auxiliary: The Auxiliary model's logits. A tensor of shape [batch size, sequence length, vocabulary size].\n            past_keys: The keys from the KV cache generated by the KV predicter.\n            past_values: The values from the KV cache generated by the KV predicter.\n            base_past_keys: The keys from the KV cache generated by the Base model.\n            base_past_values: The values from the KV cache generated by the Base model.\n\n        Returns:\n            A dictionary with total_loss, base_loss, auxiliary_loss, and the key/value cache\n            prediction losses at each layer, 'k_loss/i' and 'v_loss/i' (if the key/value\n            cache loss is activated).\n        \"\"\"\n        batch_size, seq_length, vocab_size = prediction.shape\n        prediction = prediction.reshape(batch_size * seq_length, vocab_size)\n        target = target.reshape(batch_size * seq_length)\n        ce_loss = F.cross_entropy(\n            input=prediction,\n            target=target,\n            ignore_index=self.ignore_idx,\n            label_smoothing=self.label_smoothing,\n        )\n        ret = {\"base_loss\": ce_loss}\n\n        if auxiliary is not None:\n            batch_size, seq_length, vocab_size = auxiliary.shape\n            auxiliary = auxiliary.reshape(batch_size * seq_length, vocab_size)\n            auxiliary_loss = F.cross_entropy(\n                input=auxiliary,\n                target=target,\n                ignore_index=self.ignore_idx,\n                label_smoothing=self.label_smoothing,\n            )\n            ret[\"auxiliary_loss\"] = auxiliary_loss\n\n        if self.use_z_loss:\n\n            def get_zloss(x):\n                # Adaption of Eq. (5) for z-loss computation in https://arxiv.org/pdf/2202.08906.pdf (non-router use-case).\n                valid_tokens = (target != self.ignore_idx).type_as(x)\n                # do not compute z_loss for ignored indices\n                z_loss = (x * valid_tokens[:, None]).logsumexp(-1).pow(2).sum()\n                z_loss *= self.z_loss_eps / valid_tokens.sum()\n                return z_loss\n\n            ret[\"z_loss_base\"] = get_zloss(prediction)\n            if auxiliary is not None:\n                ret[\"z_loss_auxiliary\"] = get_zloss(auxiliary)\n\n        if self.kv_loss > 0:\n            ignore_positions = target.view(batch_size, seq_length) == self.ignore_idx\n            k_losses = get_cache_losses(\n                base_past_keys,\n                past_keys,\n                ignore_positions=ignore_positions,\n            )\n            total_k_loss = 0\n            for i, k_loss in enumerate(k_losses):\n                ret[f\"k_loss/{i}\"] = k_loss\n                total_k_loss += k_loss\n            ret[\"k_loss/total\"] = total_k_loss\n            ret[\"k_loss/average\"] = total_k_loss / len(k_losses)\n\n            v_losses = get_cache_losses(\n                base_past_values,\n                past_values,\n                ignore_positions=ignore_positions,\n            )\n            total_v_loss = 0\n            for i, v_loss in enumerate(v_losses):\n                ret[f\"v_loss/{i}\"] = v_loss\n                total_v_loss += v_loss\n            ret[\"v_loss/total\"] = total_v_loss\n            ret[\"v_loss/average\"] = total_v_loss / len(v_losses)\n\n        ret[\"total_loss\"] = (\n            (ret[\"base_loss\"] + ret.get(\"z_loss_base\", 0)) * self.base_loss\n            + (ret.get(\"auxiliary_loss\", 0) + ret.get(\"z_loss_auxiliary\", 0))\n            * self.auxiliary_loss\n            + (ret.get(\"k_loss/total\", 0) + ret.get(\"v_loss/total\", 0)) * self.kv_loss\n        )\n        return ret\n\n    def extra_repr(self) -> str:\n        loss_info_str = (\n            f\"\\n\\t ignore_idx={self.ignore_idx}\"\n            f\"\\n\\t label_smoothing={self.label_smoothing}\"\n        )\n        if self.use_z_loss:\n            loss_info_str += (\n                f\"\\n\\t use_z_loss={self.use_z_loss}\"\n                f\"\\n\\t z_loss_eps={self.z_loss_eps}\"\n            )\n        if self.kv_loss:\n            loss_info_str += f\"\\n\\t kv_loss={self.kv_loss}\"\n\n        return loss_info_str\n\n\ndef get_cache_losses(\n    base_cache: List[Tensor],\n    predicted_cache: List[Tensor],\n    ignore_positions=None,\n) -> List[Tensor]:\n    \"\"\"\n    Compute the loss between two caches.\n\n    Args:\n        base_cache: The cache from the base model, of shape [[batch_size, num_heads, seq_len, head_dim] * num_layers]\n        predicted_cache: The predicted cache, of shape [[batch_size, num_heads, seq_len, head_dim] * num_layers]\n        ignore_positions: A [batch_size, seq_len] tensor with positions to ignore.\n    Returns:\n        `list(torch.Tensor)` a list of losses.\n    \"\"\"\n    cache_losses = []\n    for layer in range(len(base_cache)):\n        target = base_cache[layer]\n        prediction = predicted_cache[layer]\n\n        assert target.dim() == 4\n        assert prediction.dim() == 4\n        batch_size, num_heads, seq_len, dim = target.shape\n        assert prediction.shape == target.shape\n\n        if ignore_positions is not None:\n            keep_positions = (\n                ignore_positions.logical_not()\n                .view(batch_size, 1, seq_len, 1)\n                .expand(-1, prediction.shape[1], -1, prediction.shape[3])\n            )\n            target = target[keep_positions]\n            prediction = prediction[keep_positions]\n        loss = F.l1_loss(prediction, target).abs()\n        cache_losses.append(loss)\n    return cache_losses\n"
  },
  {
    "path": "corenet/loss_fn/multi_modal_img_text/__init__.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n"
  },
  {
    "path": "corenet/loss_fn/multi_modal_img_text/base_multi_modal_img_text_criteria.py",
    "content": "#  For licensing see accompanying LICENSE file.\n#  Copyright (C) 2024 Apple Inc. All Rights Reserved.\n\nimport argparse\n\nfrom corenet.loss_fn import LOSS_REGISTRY, BaseCriteria\n\n\n@LOSS_REGISTRY.register(name=\"__base__\", type=\"multi_modal_image_text\")\nclass BaseMultiModalImageTextCriteria(BaseCriteria):\n    \"\"\"Base class for defining multi-modal image-text loss functions. Sub-classes must implement forward function.\n\n    Args:\n        opts: command line arguments\n    \"\"\"\n\n    def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None:\n        super().__init__(opts, *args, **kwargs)\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        if cls != BaseMultiModalImageTextCriteria:\n            # Don't re-register arguments in subclasses that don't override `add_arguments()`.\n            return parser\n\n        group = parser.add_argument_group(cls.__name__)\n        group.add_argument(\n            \"--loss.multi-modal-image-text.name\",\n            type=str,\n            default=None,\n            help=\"Name of the loss function. Defaults to None.\",\n        )\n        return parser\n"
  },
  {
    "path": "corenet/loss_fn/multi_modal_img_text/contrastive_loss_clip.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\nimport argparse\nfrom typing import Any, Dict, Tuple\n\nimport torch\nfrom torch import Tensor\nfrom torch.nn import functional as F\n\nfrom corenet.loss_fn import LOSS_REGISTRY\nfrom corenet.loss_fn.multi_modal_img_text.base_multi_modal_img_text_criteria import (\n    BaseMultiModalImageTextCriteria,\n)\nfrom corenet.utils import logger\nfrom corenet.utils.tensor_utils import gather_all_features\n\n\n@LOSS_REGISTRY.register(name=\"contrastive_loss_clip\", type=\"multi_modal_image_text\")\nclass ContrastiveLossClip(BaseMultiModalImageTextCriteria):\n    \"\"\"Compute contrastive loss between image and text pairs.\n\n    Args:\n        opts: command-line arguments\n    \"\"\"\n\n    def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None:\n        super().__init__(opts, *args, **kwargs)\n        # need to set these default to prevent tests for failing\n        self.rank = getattr(opts, \"ddp.rank\", 0)\n        self.use_distributed = getattr(opts, \"ddp.use_distributed\", False)\n        self.device = getattr(opts, \"dev.device\", torch.device(\"cpu\"))\n\n    def _forward_clip(\n        self, prediction: Dict[str, Tensor], *args, **kwargs\n    ) -> Dict[str, Tensor]:\n        \"\"\"\n        Computes the contrast loss between image and text representations\n\n        Args:\n            prediction: A mapping of the form (string: Tensor). image and text are mandatory keys\n\n        Shape:\n            prediction[\"image\"]: Shape is [N, d]\n            prediction[\"text\"]: Shape is [N, d]\n            where N and d are batch size and feature dimensions, respectively.\n\n        Returns:\n            The output dictionary contains four keys (total_loss, image_loss, text_loss, logit_scale) and scalar\n            loss value for each of these keys. total_loss is sum of image_loss and text_loss.\n        \"\"\"\n\n        if not {\"image\", \"text\"}.issubset(prediction.keys()):\n            logger.error(\n                f\"image and text are mandatory keys for {self.__class__.__name__}.\"\n            )\n\n        image_features = prediction.pop(\"image\")\n        text_features = prediction.pop(\"text\")\n        logit_scale = prediction.pop(\"logit_scale\", 1.0)\n\n        if image_features is None:\n            logger.error(f\"Image features can't be None in {self.__class__.__name__}\")\n        if text_features is None:\n            logger.error(f\"Text features can't be None in {self.__class__.__name__}\")\n\n        # Aggregate image and text features from all GPUs\n        gathered_image_features, gathered_text_features = gather_features(\n            image_features=image_features,\n            text_features=text_features,\n            use_distributed=self.use_distributed,\n        )\n\n        # compute logits\n        # [N, d] x [G x d]^T --> [N, G], where G is global batch size\n        logits_per_image = logit_scale * (\n            image_features @ gathered_text_features.transpose(0, 1)\n        )\n        # [N, d] x [G, d]^T --> [N, G]\n        logits_per_text = logit_scale * (\n            text_features @ gathered_image_features.transpose(0, 1)\n        )\n\n        # generate labels\n        num_logits = logits_per_image.shape[0]\n        contrastive_labels = torch.arange(\n            num_logits, device=logits_per_image.device, dtype=torch.long\n        )\n\n        # shift the labels by rank id\n        contrastive_labels = contrastive_labels + (num_logits * self.rank)\n\n        # compute cross entropy loss\n        text_loss = F.cross_entropy(logits_per_text, contrastive_labels) * 0.5\n        image_loss = F.cross_entropy(logits_per_image, contrastive_labels) * 0.5\n        total_loss = image_loss + text_loss\n        return {\n            \"total_loss\": total_loss,\n            \"image_loss\": image_loss,\n            \"text_loss\": text_loss,\n            \"logit_scale\": logit_scale,\n        }\n\n    def forward(\n        self,\n        input_sample: Any,\n        prediction: Dict[str, Tensor],\n        *args,\n        **kwargs,\n    ) -> Dict:\n        \"\"\"\n        Computes contrastive loss between image and text representations, optionally with neural aug\n\n        Args:\n            input_sample: Input to the model.\n            prediction: A mapping of the form (string: Tensor). image and text are mandatory keys.\n\n        Shape:\n            input_sample: This loss function does not care about this argument.\n            prediction[\"image\"]: Shape is [N, d]\n            prediction[\"text\"]: Shape is [N, d]\n\n            where N is the local batch size and d is the feature dimension.\n\n        Returns:\n            The output dictionary contains four keys (total_loss, image_loss, text_loss, logit_scale) and scalar\n            loss value for each of these keys. total_loss is sum of image_loss and text_loss.\n        \"\"\"\n\n        if not self.training:\n            # we typically compute zero-shot logits for monitoring the val perf.\n            # Therefore, we return 0 for loss during validation.\n\n            # Note: In future, we may compute validation loss (depending on use case)\n            return {\n                \"total_loss\": torch.tensor(0.0, dtype=torch.float, device=self.device)\n            }\n\n        clip_loss_dict = self._forward_clip(prediction=prediction)\n        return clip_loss_dict\n\n\ndef gather_features(\n    image_features: Tensor, text_features: Tensor, use_distributed: bool\n) -> Tuple[Tensor, Tensor]:\n    \"\"\"\n    Helper function that allows us to gather image and text features from all DDP ranks in a differentiable manner\n\n    Args:\n        image_features: Image features\n        text_features: Text features\n        use_distributed: DDP training or not\n\n    Shapes:\n        image_features: Shape is [N, d]\n        text_features: Shape is [N, d]\n        where N is the local batch size and d is the feature dimension.\n\n    Returns:\n        A tuple of gathered image and text features across all GPUs. In case of a DDP task, each feature\n        tensor has a dimension of [G, d] where G=NW is the effective batch size and W is world\n        size (or total number of GPUs).\n    \"\"\"\n    if use_distributed:\n        # gather features from all ranks\n        # [N, d] x W --> [G, d] where N and G=NW are the local and global batch sizes and W is the world size\n        gathered_image_features = gather_all_features(features=image_features, dim=0)\n        # [N d] x W --> [G, d]\n        gathered_text_features = gather_all_features(features=text_features, dim=0)\n        return gathered_image_features, gathered_text_features\n    return image_features, text_features\n"
  },
  {
    "path": "corenet/loss_fn/neural_augmentation.py",
    "content": "#  For licensing see accompanying LICENSE file.\n#  Copyright (C) 2024 Apple Inc. All Rights Reserved.\n\nimport argparse\nimport math\nfrom typing import List, Mapping, Union\n\nimport torch\nfrom torch import Tensor\nfrom torch.nn import functional as F\n\nfrom corenet.loss_fn import LOSS_REGISTRY, BaseCriteria\nfrom corenet.utils import logger\nfrom corenet.utils.ddp_utils import is_master\n\n\n# NeuralAugmentation can be used with any task. Therefore, we register both name and type\n# as the same.\n@LOSS_REGISTRY.register(name=\"neural_augmentation\", type=\"neural_augmentation\")\nclass NeuralAugmentation(BaseCriteria):\n    \"\"\"Compute the augmentation loss, as described in the\n    `RangeAugment <https://arxiv.org/abs/2212.10553>`_ paper.\n\n    Args:\n        opts: command line arguments\n    \"\"\"\n\n    __supported_metrics = [\"psnr\"]\n\n    def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None:\n        super().__init__(opts, *args, **kwargs)\n\n        perceptual_metric = getattr(opts, \"loss.neural_augmentation.perceptual_metric\")\n        is_master_node = is_master(opts)\n        if perceptual_metric is None and is_master_node:\n            logger.error(\n                \"Perceptual metric can't be none. \"\n                \"Please specify perceptual metric using --loss.auxiliary.neural-augmentation.perceptual-metric argument\"\n            )\n        if not isinstance(perceptual_metric, str) and is_master_node:\n            logger.error(\n                \"The type of perceptual metric is not string. Got: {}\".format(\n                    type(perceptual_metric)\n                )\n            )\n        perceptual_metric = perceptual_metric.lower()\n        target_value = getattr(opts, \"loss.neural_augmentation.target_value\")\n\n        self.curriculumn_learning = False\n        self.iteration_based_training = getattr(\n            opts, \"scheduler.is_iteration_based\", False\n        )\n        self.target_str = f\"{target_value}\"\n        alpha = getattr(opts, \"loss.neural_augmentation.alpha\")\n        if perceptual_metric == \"psnr\":\n            if target_value is None and is_master_node:\n                logger.error(\"Target PSNR value can not be None.\")\n\n            if isinstance(target_value, (int, float)):\n                if target_value < 0:\n                    if is_master_node:\n                        logger.error(\n                            \"PSNR value should be >= 0 in {}. Got: {}\".format(\n                                self.__class__.__name__, target_value\n                            )\n                        )\n                # compute target MSE using below equation\n                # # PSNR = 20 log10(255) - 10 log10(MSE)\n                target_mse = 10.0 ** ((20.0 * math.log10(255.0) - target_value) / 10.0)\n                self.target_value = torch.ones(size=(1,), dtype=torch.float).fill_(\n                    target_mse\n                )\n                self.target_str = f\"{target_value}\"\n            elif isinstance(target_value, (list, tuple)) and len(target_value) == 2:\n                start_target_value = target_value[0]\n                end_target_value = target_value[1]\n\n                if start_target_value < 0 or end_target_value < 0:\n                    if is_master_node:\n                        logger.error(\n                            \"PSNR value should be >= 0 in {}. Got: {}\".format(\n                                self.__class__.__name__, target_value\n                            )\n                        )\n\n                # compute target MSE using below equation\n                # # PSNR = 20 log10(255) - 10 log10(MSE)\n                start_target_mse = 10.0 ** (\n                    (20.0 * math.log10(255.0) - start_target_value) / 10.0\n                )\n                end_target_mse = 10.0 ** (\n                    (20.0 * math.log10(255.0) - end_target_value) / 10.0\n                )\n\n                max_steps = (\n                    getattr(opts, \"scheduler.max_iterations\")\n                    if self.iteration_based_training\n                    else getattr(opts, \"scheduler.max_epochs\")\n                )\n\n                if max_steps is None and is_master_node:\n                    logger.error(\n                        \"Please specify {}. Got None.\".format(\n                            \"--scheduler.max-iterations\"\n                            if self.iteration_based_training\n                            else \"--scheduler.max-epochs\"\n                        )\n                    )\n\n                curriculum_method = getattr(\n                    opts, \"loss.neural_augmentation.curriculum_method\"\n                )\n                if curriculum_method in CURRICULUM_METHOD.keys():\n                    self.target_value = CURRICULUM_METHOD[curriculum_method](\n                        start=start_target_mse, end=end_target_mse, period=max_steps\n                    )\n                else:\n                    raise NotImplementedError\n\n                self.curriculumn_learning = True\n                self.target_str = f\"[{start_target_value}, {end_target_value}]\"\n            else:\n                raise NotImplementedError\n\n            # the maximum possible MSE error is computed as:\n            # a = torch.ones((3, H, W)) * 255.0 # Max. input value is 255.0\n            # b = torch.zeros((3, H, W)) # min. input value is 0.0\n            # mse = torch.mean( (a -b) ** 2)\n            # 65025 is the maximum mse\n            self.alpha = alpha / 65025.0\n        else:\n            if is_master_node:\n                logger.error(\n                    \"Supported perceptual metrics are: {}. Got: {}\".format(\n                        self.__supported_metrics, perceptual_metric\n                    )\n                )\n        self.perceptual_metric = perceptual_metric\n        self.device = getattr(opts, \"dev.device\", torch.device(\"cpu\"))\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        group = parser.add_argument_group(cls.__name__)\n\n        group.add_argument(\n            \"--loss.neural-augmentation.perceptual-metric\",\n            type=str,\n            default=\"psnr\",\n            choices=cls.__supported_metrics,\n            help=f\"Name of the perceptual metric to be used in {cls.__name__}.\",\n        )\n\n        group.add_argument(\n            \"--loss.neural-augmentation.target-value\",\n            type=float,\n            default=[40, 20],\n            nargs=\"+\",\n            help=f\"Target image similarity value in {cls.__name__}. Defaults to [40, 20]\",\n        )\n\n        group.add_argument(\n            \"--loss.neural-augmentation.curriculum-method\",\n            type=str,\n            default=\"cosine\",\n            choices=[\"linear\", \"cosine\"],\n            help=f\"Curriculum for varying the target image similarity value in {cls.__name__}.\"\n            f\"Supported curriculums are {cls.__supported_metrics}. Defaults to cosine\",\n        )\n        group.add_argument(\n            \"--loss.neural-augmentation.alpha\",\n            default=100.0,\n            type=float,\n            help=\"Scale loss value by alpha value. Defaults to 100. \"\n            \"Note: When perceptual metric is PSNR, alpha value is divided by 65025\",\n        )\n        return parser\n\n    def _forward_psnr(\n        self, input_tensor: Tensor, augmented_tensor: Tensor, *args, **kwargs\n    ) -> Tensor:\n        \"\"\"Compute the MSE error between input and augmented image, and minimizes\n        the distance between MSE error and target error.\n\n        Args:\n            input_tensor: Input image of shape [N, C, H, W]\n            augmented_tensor: Augmented image of shape [N, C, H, W]\n\n        Returns:\n            A scalar loss value\n        \"\"\"\n\n        squared_err = ((augmented_tensor - input_tensor) * 255.0) ** 2\n        # [B, C, H, W] --> [B]\n        pred_mse = torch.mean(squared_err, dim=[1, 2, 3])\n\n        if self.curriculumn_learning:\n            step = (\n                kwargs.get(\"iterations\", 0)\n                if self.iteration_based_training\n                else kwargs.get(\"epoch\", 0)\n            )\n            if step >= len(self.target_value):\n                step = -1\n            target_mse = self.target_value[step]\n        else:\n            target_mse = self.target_value\n\n        # compute L1 loss between target and current MSE\n        smooth_l1_loss = F.smooth_l1_loss(\n            input=pred_mse,\n            target=target_mse.expand_as(pred_mse).to(\n                device=pred_mse.device, dtype=pred_mse.dtype\n            ),\n            reduction=\"mean\",\n        )\n\n        loss_na = smooth_l1_loss * self.alpha\n        return loss_na\n\n    def _compute_loss(\n        self, input_tensor: Tensor, augmented_tensor: Tensor, *args, **kwargs\n    ) -> Tensor:\n        \"\"\"Compute the neural augmentation loss.\n\n        Args:\n            input_tensor: Input image of shape [N, C, H, W]\n            augmented_tensor: Augmented image of shape [N, C, H, W]\n\n        Returns:\n            A scalar value\n        \"\"\"\n        if augmented_tensor is None:\n            logger.error(\n                f\"Augmented tensor can't be None in {self.__class__.__name__} during training mode.\"\n            )\n\n        forward_loss_fn = getattr(self, f\"_forward_{self.perceptual_metric}\")\n        loss_na = forward_loss_fn(\n            input_tensor=input_tensor,\n            augmented_tensor=augmented_tensor,\n            *args,\n            **kwargs,\n        )\n        return loss_na\n\n    def forward(\n        self,\n        input_sample: Union[Tensor, Mapping[str, Union[Tensor, List[Tensor]]]],\n        prediction: Mapping[str, Tensor],\n        *args,\n        **kwargs,\n    ) -> Tensor:\n        \"\"\"Compute the loss between input and augmented image, as described in\n        `RangeAugment <https://arxiv.org/abs/2212.10553>`_ paper.\n\n        Args:\n            input_sample: Input sample can either be a Tensor or a dictionary with mandatory key \"image\". In\n                case of a dictionary, the values can be a Tensor or list of Tensors.\n            prediction: Output of augmentation model. Mapping of (string: Tensor) with `augmented_tensor`\n                as the required key.\n\n        Shapes:\n            input_sample:\n                * Tensor: The shape of input tensor is [N, C, H, W]\n                * Mapping[str, Tensor]: The shape of tensor is [N, C, H, W]\n                * Mapping[str, List[Tensor]]: The length of List is N, and the shape of each tensor is [1, C, H, W]\n            prediction: The shape of prediction[\"augmented_tensor\"] is [N, C, H, W]\n\n        Returns:\n            A scalar loss value\n\n        ...note:\n            During validation or evaluation, neural augmentation loss is not computed and 0 is returned\n        \"\"\"\n        if not self.training:\n            return torch.tensor(0.0, device=self.device, dtype=torch.float)\n\n        if not isinstance(prediction, Mapping):\n            logger.error(\n                \"Prediction needs to be an instance of Mapping and must contain augmented_tensor\"\n                \" as keys\"\n            )\n        if isinstance(input_sample, Mapping):\n            input_sample = input_sample[\"image\"]\n\n        if isinstance(input_sample, List):\n            # if its a list of images, stack them\n            input_sample = torch.stack(input_sample, dim=0)\n\n        augmented_tensor = prediction[\"augmented_tensor\"]\n        loss_na = self._compute_loss(\n            input_tensor=input_sample,\n            augmented_tensor=augmented_tensor,\n            *args,\n            **kwargs,\n        )\n\n        return loss_na\n\n    def extra_repr(self) -> str:\n        return (\n            \"\\n\\t target_metric={}\"\n            \"\\n\\t target_value={}\"\n            \"\\n\\t curriculum_learning={}\"\n            \"\\n\\t alpha={}\".format(\n                self.perceptual_metric,\n                self.target_str,\n                self.curriculumn_learning,\n                self.alpha,\n            )\n        )\n\n\ndef linear_curriculum(start: int, end: int, period: int) -> Tensor:\n    \"\"\"This function implements linear curriculum\n\n    Args:\n        start: the starting value for the set of points\n        end: the ending value for the set of points\n        period: size of the constructed tensor\n\n    Returns:\n        A float tensor of length period\n    \"\"\"\n    return torch.linspace(start=start, end=end, steps=period + 1, dtype=torch.float)\n\n\ndef cosine_curriculum(start: int, end: int, period: int) -> Tensor:\n    \"\"\"This function implements cosine curriculum\n    Args:\n        start: the starting value for the set of points\n        end: the ending value for the set of points\n        period: size of the constructed tensor\n\n    Returns:\n        A float tensor of length period\n    \"\"\"\n\n    curr = [\n        end + 0.5 * (start - end) * (1 + math.cos(math.pi * i / (period + 1)))\n        for i in range(period + 1)\n    ]\n\n    curr = torch.tensor(curr, dtype=torch.float)\n    return curr\n\n\nCURRICULUM_METHOD = {\n    \"linear\": linear_curriculum,\n    \"cosine\": cosine_curriculum,\n}\n"
  },
  {
    "path": "corenet/loss_fn/segmentation/__init__.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n"
  },
  {
    "path": "corenet/loss_fn/segmentation/base_segmentation_criteria.py",
    "content": "#  For licensing see accompanying LICENSE file.\n#  Copyright (C) 2024 Apple Inc. All Rights Reserved.\n\nimport argparse\n\nfrom corenet.loss_fn import LOSS_REGISTRY, BaseCriteria\n\n\n@LOSS_REGISTRY.register(name=\"__base__\", type=\"segmentation\")\nclass BaseSegmentationCriteria(BaseCriteria):\n    \"\"\"Base class for defining segmentation loss functions. Sub-classes must implement forward function.\n\n    Args:\n        opts: command line arguments\n    \"\"\"\n\n    def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None:\n        super().__init__(opts, *args, **kwargs)\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        if cls != BaseSegmentationCriteria:\n            # Don't re-register arguments in subclasses that don't override `add_arguments()`.\n            return parser\n\n        group = parser.add_argument_group(cls.__name__)\n        group.add_argument(\n            \"--loss.segmentation.name\",\n            type=str,\n            default=None,\n            help=\"Name of the loss function. Defaults to None.\",\n        )\n        return parser\n"
  },
  {
    "path": "corenet/loss_fn/segmentation/cross_entropy.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nfrom typing import Any, Mapping, Optional, Tuple, Union\n\nfrom torch import Tensor\nfrom torch.nn import functional as F\n\nfrom corenet.loss_fn import LOSS_REGISTRY\nfrom corenet.loss_fn.segmentation.base_segmentation_criteria import (\n    BaseSegmentationCriteria,\n)\nfrom corenet.loss_fn.utils.class_weighting import compute_class_weights\nfrom corenet.utils import logger\n\n\n@LOSS_REGISTRY.register(name=\"cross_entropy\", type=\"segmentation\")\nclass SegCrossEntropy(BaseSegmentationCriteria):\n    \"\"\"Cross entropy loss for the task of semantic segmentation.\n\n    Args:\n        opts: command-line arguments\n    \"\"\"\n\n    def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None:\n        super().__init__(opts, *args, **kwargs)\n        self.ignore_idx = getattr(opts, \"loss.segmentation.cross_entropy.ignore_index\")\n        self.use_class_wts = getattr(\n            opts, \"loss.segmentation.cross_entropy.class_weights\"\n        )\n        self.aux_wt = getattr(opts, \"loss.segmentation.cross_entropy.aux_weight\")\n        self.label_smoothing = getattr(\n            opts, \"loss.segmentation.cross_entropy.label_smoothing\"\n        )\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        if cls != SegCrossEntropy:\n            # Don't re-register arguments in subclasses that don't override `add_arguments()`.\n            return parser\n\n        group = parser.add_argument_group(cls.__name__)\n        group.add_argument(\n            \"--loss.segmentation.cross-entropy.class-weights\",\n            action=\"store_true\",\n            default=False,\n            help=f\"Use class weights in {cls.__name__}. Defaults to False.\",\n        )\n        group.add_argument(\n            \"--loss.segmentation.cross-entropy.ignore-index\",\n            type=int,\n            default=-1,\n            help=f\"Target value that is ignored and does not contribute to \"\n            f\"the input gradient in {cls.__name__}. Defaults to -1.\",\n        )\n        group.add_argument(\n            \"--loss.segmentation.cross-entropy.aux-weight\",\n            type=float,\n            # This is a typical value used in segmentation networks for auxiliary loss.\n            # See PSPNet paper for instance: https://arxiv.org/abs/1612.01105\n            default=0.4,\n            help=\"Weight of auxiliary segmentation loss. Defaults to 0.4.\",\n        )\n        group.add_argument(\n            \"--loss.segmentation.cross-entropy.label-smoothing\",\n            type=float,\n            default=0.0,\n            help=f\"Specifies the amount of smoothing when computing the loss in {cls.__name__}, \"\n            f\"where 0.0 means no smoothing. Defaults to 0.0.\",\n        )\n\n        return parser\n\n    def _compute_loss(\n        self, pred_mask: Tensor, target_mask: Tensor, weight: Optional[Tensor] = None\n    ) -> Tensor:\n        \"\"\"Computes the cross-entropy loss\n\n        Args:\n            pred_mask: Predicted segmentation mask\n            target_mask: Target segmentation mask whose values are in the range `[0, C)`,\n                where :math:`C` is the number of classes\n            weight: class weights for handling class imbalancing.\n\n        Shapes:\n            pred_mask: Shape is [Batch size, Channels, Height, Width]\n            target_mask: Shape is [Batch size, Height, Width]\n            weight: Shape is [C]\n\n        Returns:\n            A scalar loss value\n        \"\"\"\n\n        b, c, x_h, x_w = pred_mask.shape\n        b, y_h, y_w = target_mask.shape\n\n        # use label smoothing during training\n        label_smoothing = self.label_smoothing if self.training else 0.0\n\n        if x_h != y_h or x_w != y_w:\n            # if predicting mask shape is not the same as target mask, resize it using\n            # bilinear interpolation.\n            pred_mask = F.interpolate(\n                pred_mask, size=(y_h, y_w), mode=\"bilinear\", align_corners=True\n            )\n\n        loss = F.cross_entropy(\n            input=pred_mask,\n            target=target_mask,\n            weight=weight,\n            ignore_index=self.ignore_idx,\n            label_smoothing=label_smoothing,\n        )\n\n        return loss\n\n    def _forward_seg(\n        self,\n        prediction: Union[Tensor, Tuple[Tensor, Tensor]],\n        target: Tensor,\n        *args,\n        **kwargs,\n    ) -> Mapping[str, Tensor]:\n        \"\"\"Computes the segmentation loss. If prediction is a Tuple[Tensor, Tensor], then weighted sum of CE losses is\n        computed.\n\n        Args:\n            prediction: Output of segmentation model. If auxiliary branch is enabled, then prediction is\n            a Tuple[Tensor, Tensor]. Otherwise, it is a Tensor.\n            target: Ground truth segmentation mask.\n\n        Shapes:\n            prediction:\n                * When prediction is a Tensor, then shape is [Batch size, Channels, Height, Width]\n                * When prediction is a Tuple[Tensor, Tensor], then shape of one tensor is [Batch size, Channels, Height, Width]\n                    while the other is [Batch size, Channels, Height / O, Width/ O]\n                    where O is output stride of feature map (typically 4).\n            target: Shape is [Batch size, Height, Width]\n\n        Returns:\n            Mapping of the form (string: scalar value) is returned with total_loss as mandatory and\n            (seg_loss, aux_loss) as optional keys. total_loss is weighted sum of seg_loss and aux_loss (when applicable).\n\n        ...note:\n            When shape of prediction and target are not the same, prediction is resized using bilinear interpolation to\n            match the size of target.\n        \"\"\"\n\n        aux_out = None\n        if isinstance(prediction, Tuple) and len(prediction) == 2:\n            mask, aux_out = prediction\n            assert isinstance(mask, Tensor)\n            assert isinstance(aux_out, Tensor)\n        elif isinstance(prediction, Tensor):\n            mask = prediction\n            assert isinstance(mask, Tensor)\n        else:\n            raise NotImplementedError(\n                \"For computing loss for segmentation task, we need prediction to be an instance of Tuple or Tensor\"\n            )\n\n        cls_wts = None\n        if self.training:\n            if self.use_class_wts:\n                n_classes = mask.size(1)  # Mask is of shape B x C x H x W\n                cls_wts = compute_class_weights(target=target, n_classes=n_classes)\n            seg_loss = self._compute_loss(\n                pred_mask=mask, target_mask=target, weight=cls_wts\n            )\n\n            if aux_out is not None:\n                loss_aux = self._compute_loss(\n                    pred_mask=aux_out, target_mask=target, weight=cls_wts\n                )\n                total_loss = seg_loss + (self.aux_wt * loss_aux)\n                return {\n                    \"total_loss\": total_loss,\n                    \"seg_loss\": seg_loss,\n                    \"aux_loss\": (self.aux_wt * loss_aux),\n                }\n            return {\"total_loss\": seg_loss}\n        else:\n            # during validation, we do not compute aux. loss\n            seg_loss = self._compute_loss(\n                pred_mask=mask, target_mask=target, weight=None\n            )\n            return {\"total_loss\": seg_loss}\n\n    def forward(\n        self,\n        input_sample: Any,\n        prediction: Union[\n            Mapping[str, Union[Tensor, Tuple[Tensor, Tensor]]],\n            Tensor,\n            Tuple[Tensor, Tensor],\n        ],\n        target: Tensor,\n        *args,\n        **kwargs,\n    ) -> Mapping[str, Tensor]:\n        \"\"\"Compute CE segmentation loss\n\n        Args:\n            input_sample: Input image tensor to model.\n            prediction: Output of model. It can be a\n                * Tensor\n                * Tuple[Tensor, Tensor]\n                * Mapping[segmentation_output, Tensor]\n                * Mapping[segmentation_output, Tuple[Tensor, Tensor]], where segmentation_output is a required key.\n            target: Target label tensor containing values in the range `[0, C)`, where :math:`C` is the number of classes\n\n        Shapes:\n            input_sample: This loss function does not care about this argument.\n            prediction:\n                * When prediction is a Tensor, then shape is [Batch size, C, Height, Width]\n                * When prediction is a Tuple[Tensor, Tensor], then shape of one tensor is [Batch size, C, Height, Width]\n                    while the other is [Batch size, C, Height / O, Width/ O]\n                    where O is the output stride of feature map (typically 4).\n                * When prediction is a dictionary, then the shape of prediction[\"segmentation_output\"] should\n                    be the same as described in above steps (depending on type).\n            target: The shape of target tensor is [Batch size, Height, Width]\n\n        Returns:\n            Mapping of the form (string: scalar value) is returned with total_loss as mandatory and\n            (seg_loss, aux_loss) as optional keys. total_loss is weighted sum of seg_loss and aux_loss (when applicable).\n        \"\"\"\n\n        if isinstance(prediction, (Tuple, Tensor)):\n            return self._forward_seg(\n                prediction=prediction, target=target, *args, **kwargs\n            )\n        elif isinstance(prediction, Mapping):\n            if \"segmentation_output\" not in prediction:\n                logger.error(\n                    f\"segmentation_output is a mandatory key in prediction when\"\n                    f\"type of prediction is Dict. Got: {prediction.keys()}\"\n                )\n\n            seg_loss = self._forward_seg(\n                prediction=prediction[\"segmentation_output\"],\n                target=target,\n                *args,\n                **kwargs,\n            )\n\n            return seg_loss\n        else:\n            logger.error(\n                f\"Prediction should be either a Tensor or Tuple[Tensor, Tensor] \"\n                f\"or Dictionary[str, Tensor] in {self.__class__.__name__}. Got: {type(prediction)}\"\n            )\n\n    def extra_repr(self) -> str:\n        return (\n            f\"\\n\\t ignore_idx={self.ignore_idx}\"\n            f\"\\n\\t class_weighting={self.use_class_wts}\"\n            f\"\\n\\t label_smoothing={self.label_smoothing}\"\n            f\"\\n\\t aux_weight={self.aux_wt}\"\n        )\n"
  },
  {
    "path": "corenet/loss_fn/utils/__init__.py",
    "content": ""
  },
  {
    "path": "corenet/loss_fn/utils/build_helper.py",
    "content": "#  For licensing see accompanying LICENSE file.\n#  Copyright (C) 2024 Apple Inc. All Rights Reserved.\n\nimport argparse\n\nfrom torch import nn\n\nfrom corenet.constants import is_test_env\nfrom corenet.modeling.models import get_model\nfrom corenet.options.utils import extract_opts_with_prefix_replacement\nfrom corenet.utils import logger\n\n\ndef build_cls_teacher_from_opts(opts: argparse.Namespace) -> nn.Module:\n    \"\"\"Helper function to build a classification teacher model from command-line arguments\n\n    Args:\n        opts: command-line arguments\n\n    Returns:\n        A teacher model\n    \"\"\"\n    pretrained_model = getattr(opts, \"teacher.model.classification.pretrained\")\n\n    pytest_env = is_test_env()\n    if not pytest_env and pretrained_model is None:\n        logger.error(\n            \"For distillation, please specify teacher weights using teacher.model.classification.pretrained\"\n        )\n    teacher_opts = extract_opts_with_prefix_replacement(\n        opts, \"teacher.model.\", \"model.\"\n    )\n\n    # build teacher model\n    return get_model(teacher_opts, category=\"classification\")\n"
  },
  {
    "path": "corenet/loss_fn/utils/class_weighting.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport torch\nfrom torch import Tensor\n\n\ndef compute_class_weights(\n    target: Tensor, n_classes: int, norm_val: float = 1.1\n) -> Tensor:\n    \"\"\"Implementation of a class-weighting scheme, as defined in Section 5.2\n    of `ENet <https://arxiv.org/pdf/1606.02147.pdf>`_ paper.\n\n    Args:\n        target: Tensor of shape [Batch_size, *] containing values in the range `[0, C)`.\n        n_classes: Integer specifying the number of classes :math:`C`\n        norm_val: Normalization value. Defaults to 1.1. This value is decided based on the\n        `ESPNetv2 paper <https://arxiv.org/abs/1811.11431>`_.\n        Link: https://github.com/sacmehta/ESPNetv2/blob/b78e323039908f31347d8ca17f49d5502ef1a594/segmentation/loadData.py#L16\n\n    Returns:\n        A :math:`C`-dimensional tensor containing class weights\n    \"\"\"\n\n    class_hist = torch.histc(target.float(), bins=n_classes, min=0, max=n_classes - 1)\n    mask_indices = class_hist == 0\n\n    # normalize between 0 and 1 by dividing by the sum\n    norm_hist = torch.div(class_hist, class_hist.sum())\n    norm_hist = torch.add(norm_hist, norm_val)\n\n    # compute class weights.\n    # samples with more frequency will have less weight and vice-versa\n    class_wts = torch.div(torch.ones_like(class_hist), torch.log(norm_hist))\n\n    # mask the classes which do not have samples in the current batch\n    class_wts[mask_indices] = 0.0\n\n    return class_wts.to(device=target.device)\n"
  },
  {
    "path": "corenet/metrics/__init__.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\n\nfrom corenet.utils.registry import Registry\n\nMETRICS_REGISTRY = Registry(\n    \"metrics\",\n    lazy_load_dirs=[\"corenet/metrics\"],\n    internal_dirs=[\"corenet/internal\", \"corenet/internal/projects/*\"],\n)\n\n\ndef arguments_stats(parser: argparse.ArgumentParser):\n    group = parser.add_argument_group(title=\"Statistics\", description=\"Statistics\")\n    group.add_argument(\n        \"--stats.val\", type=str, default=[\"loss\"], nargs=\"+\", help=\"Name of statistics\"\n    )\n    group.add_argument(\n        \"--stats.train\",\n        type=str,\n        default=[\"loss\"],\n        nargs=\"+\",\n        help=\"Name of statistics\",\n    )\n    group.add_argument(\n        \"--stats.checkpoint-metric\",\n        type=str,\n        default=\"loss\",\n        help=\"Metric to use for saving checkpoints\",\n    )\n    group.add_argument(\n        \"--stats.checkpoint-metric-max\",\n        action=\"store_true\",\n        default=False,\n        help=\"Maximize checkpoint metric\",\n    )\n    group.add_argument(\n        \"--stats.coco-map.iou-types\",\n        type=str,\n        default=[\"bbox\"],\n        nargs=\"+\",\n        choices=(\"bbox\", \"segm\"),\n        help=\"Types of IOU to compute for MSCoco.\",\n    )\n\n    return parser\n"
  },
  {
    "path": "corenet/metrics/average_precision.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport traceback\nfrom numbers import Number\nfrom typing import Dict, Union\n\nimport numpy as np\nfrom sklearn.metrics import average_precision_score\nfrom torch import Tensor\nfrom torch.nn import functional as F\n\nfrom corenet.metrics import METRICS_REGISTRY\nfrom corenet.metrics.metric_base import EpochMetric\nfrom corenet.utils import logger\n\n\n@METRICS_REGISTRY.register(\"average_precision\")\nclass AveragePrecisionMetric(EpochMetric):\n    def compute_with_aggregates(\n        self, y_pred: Tensor, y_true: Tensor\n    ) -> Union[Number, Dict[str, Number]]:\n        y_pred, y_true = self.get_aggregates()\n\n        y_pred = F.softmax(y_pred, dim=-1).numpy().astype(np.float32)\n        y_true = y_true.numpy().astype(np.float32)\n\n        # Clip predictions to reduce chance of getting INF\n        y_pred = y_pred.clip(0, 1)\n\n        if y_pred.ndim == 1 or y_pred.ndim == 2 and y_pred.shape[1] == 1:\n            pass  # TODO?\n        elif y_pred.ndim == 2 and y_pred.shape[1] == 2:\n            y_pred = y_pred[:, 1]\n        else:\n            logger.warning(\n                \"Expected only two classes, got prediction Tensor of shape {}\".format(\n                    y_pred.shape\n                )\n            )\n\n        try:\n            ap = 100 * average_precision_score(y_true, y_pred, average=None)\n        except ValueError as e:\n            logger.warning(\"Could not compute Average Precision: {}\".format(str(e)))\n            traceback.print_exc()\n            ap = 0  # we don't want the job to fail over a metric computation issue\n\n        return ap\n"
  },
  {
    "path": "corenet/metrics/coco_map.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\nimport io\nimport os\nfrom contextlib import redirect_stdout\nfrom typing import Any, Dict, List, Optional, Union\n\nimport numpy as np\nimport torch\nfrom pycocotools import mask as maskUtils\nfrom pycocotools.coco import COCO\nfrom pycocotools.cocoeval import COCOeval\nfrom torch import Tensor\nfrom torch.nn import functional as F\n\nfrom corenet.metrics import METRICS_REGISTRY\nfrom corenet.metrics.metric_base import BaseMetric\nfrom corenet.modeling.models.detection import DetectionPredTuple\nfrom corenet.utils import logger\nfrom corenet.utils.ddp_utils import is_master\nfrom corenet.utils.tensor_utils import all_gather_list\n\n\n@METRICS_REGISTRY.register(name=\"coco_map\")\nclass COCOEvaluator(BaseMetric):\n    def __init__(\n        self,\n        opts,\n        split: Optional[str] = \"val\",\n        year: Optional[int] = 2017,\n        is_distributed: Optional[bool] = False,\n    ):\n        # disable printing on console, so that pycocotools print statements are not printed on console\n        logger.disable_printing()\n        bkrnd_id = (\n            0 if getattr(opts, \"dataset.detection.no_background_id\", False) else 1\n        )\n\n        iou_types = getattr(opts, \"stats.coco_map.iou_types\", [\"bbox\"])\n\n        root = getattr(opts, \"dataset.root_val\", None)\n        ann_file = os.path.join(\n            root, \"annotations/instances_{}{}.json\".format(split, year)\n        )\n        coco_gt = COCO(ann_file)\n\n        coco_categories = sorted(coco_gt.getCatIds())\n        self.coco_id_to_contiguous_id = {\n            coco_id: i + bkrnd_id for i, coco_id in enumerate(coco_categories)\n        }\n        self.contiguous_id_to_coco_id = {\n            v: k for k, v in self.coco_id_to_contiguous_id.items()\n        }\n\n        self.coco_gt = coco_gt\n        self.iou_types = iou_types\n        self.is_distributed = is_distributed\n        self.is_master_node = is_master(opts)\n\n        self.coco_results = None\n        self.reset()\n\n        # enable printing, to enable corenet log printing\n        logger.enable_printing()\n\n    def reset(self) -> None:\n        self.coco_results = {iou_type: [] for iou_type in self.iou_types}\n\n    def update(\n        self,\n        prediction: Union[Tensor, Dict],\n        target: Union[Tensor, Dict],\n        extras: Dict[str, Any] = {},\n        batch_size: Optional[int] = 1,\n    ):\n        if not (\n            isinstance(prediction, Dict)\n            and ({\"detections\"} <= set(list(prediction.keys())))\n        ):\n            logger.error(\n                \"For coco evaluation during training, the output from the model should be a dictionary \"\n                \"and should contain the results in a key called detections\"\n            )\n\n        detections = prediction[\"detections\"]\n\n        if isinstance(target, list):\n            image_ids = torch.tensor([t[\"image_id\"] for t in target], dtype=torch.int64)\n            image_widths = torch.tensor(\n                [t[\"image_width\"] for t in target], dtype=torch.int64\n            )\n            image_heights = torch.tensor(\n                [t[\"image_height\"] for t in target], dtype=torch.int64\n            )\n        else:\n            image_ids = target[\"image_id\"]\n            image_widths = target[\"image_width\"]\n            image_heights = target[\"image_height\"]\n\n        if isinstance(detections, DetectionPredTuple):\n            detections = [detections]\n\n        if not (\n            isinstance(detections, List)\n            and isinstance(detections[0], DetectionPredTuple)\n        ):\n            logger.error(\n                \"For coco evaluation during training, the results should be stored as a List of DetectionPredTuple\"\n            )\n\n        self.prepare_cache_results(\n            detection_results=detections,\n            image_ids=image_ids,\n            image_widths=image_widths,\n            image_heights=image_heights,\n        )\n\n    def prepare_cache_results(\n        self,\n        detection_results: List[DetectionPredTuple],\n        image_ids,\n        image_widths,\n        image_heights,\n    ) -> None:\n        batch_results = {k: [] for k in self.coco_results.keys()}\n        for detection_result, img_id, img_w, img_h in zip(\n            detection_results, image_ids, image_widths, image_heights\n        ):\n            label = detection_result.labels\n\n            if label.numel() == 0:\n                # no detections\n                continue\n            box = detection_result.boxes\n            score = detection_result.scores\n\n            img_id, img_w, img_h = img_id.item(), img_w.item(), img_h.item()\n\n            box[..., 0::2] = torch.clip(box[..., 0::2] * img_w, min=0, max=img_w)\n            box[..., 1::2] = torch.clip(box[..., 1::2] * img_h, min=0, max=img_h)\n\n            # convert box from xyxy to xywh format\n            box[..., 2] = box[..., 2] - box[..., 0]\n            box[..., 3] = box[..., 3] - box[..., 1]\n\n            box = box.cpu().numpy()\n            label = label.cpu().numpy()\n            score = score.cpu().numpy()\n\n            if \"bbox\" in batch_results:\n                batch_results[\"bbox\"].extend(\n                    [\n                        {\n                            \"image_id\": img_id,\n                            \"category_id\": self.contiguous_id_to_coco_id[\n                                label[bbox_id]\n                            ],\n                            \"bbox\": box[bbox_id].tolist(),\n                            \"score\": score[bbox_id],\n                        }\n                        for bbox_id in range(box.shape[0])\n                        if label[bbox_id] > 0\n                    ]\n                )\n\n            masks = detection_result.masks\n            if masks is not None and \"segm\" in batch_results:\n                # masks are [N, H, W]. For interpolation, convert them to [1, N, H, W] and then back to [N, H, W]\n                masks = F.interpolate(\n                    masks.unsqueeze(0),\n                    size=(img_h, img_w),\n                    mode=\"bilinear\",\n                    align_corners=True,\n                ).squeeze(0)\n                masks = masks > 0.5\n\n                masks = masks.cpu().numpy()\n                # predicted masks are in [N, H, W] format\n                rles = [\n                    maskUtils.encode(\n                        np.array(mask[:, :, np.newaxis], dtype=np.uint8, order=\"F\")\n                    )[0]\n                    for mask in masks\n                ]\n                for rle in rles:\n                    rle[\"counts\"] = rle[\"counts\"].decode(\"utf-8\")\n\n                batch_results[\"segm\"].extend(\n                    [\n                        {\n                            \"image_id\": img_id,\n                            \"category_id\": self.contiguous_id_to_coco_id[label[seg_id]],\n                            \"segmentation\": rle,\n                            \"score\": score[seg_id],\n                        }\n                        for seg_id, rle in enumerate(rles)\n                        if label[seg_id] > 0\n                    ]\n                )\n\n        for k in batch_results.keys():\n            new_results: List[Dict] = batch_results[k]\n            if self.is_distributed:\n                # Gather results from all processes\n                gathered_results: List[List[Dict]] = all_gather_list(new_results)\n                # Flatten results as the output of all_gather will be a list of list here\n                new_results = [x for results in gathered_results for x in results]\n\n            self.coco_results[k].extend(new_results)\n\n    def summarize_coco_results(self) -> Dict:\n        stats_map = dict()\n        for iou_type, coco_results in self.coco_results.items():\n            if len(coco_results) < 1:\n                # during initial epochs, we may not have any sample results, so we can skip this part\n                map_val = 0.0\n            else:\n                try:\n                    logger.disable_printing()\n\n                    with redirect_stdout(io.StringIO()):\n                        coco_dt = COCO.loadRes(self.coco_gt, coco_results)\n\n                    coco_eval = COCOeval(\n                        cocoGt=self.coco_gt, cocoDt=coco_dt, iouType=iou_type\n                    )\n                    coco_eval.evaluate()\n                    coco_eval.accumulate()\n\n                    if self.is_master_node:\n                        logger.enable_printing()\n\n                    logger.log(\"Results for IoU Metric: {}\".format(iou_type))\n                    coco_eval.summarize()\n                    map_val = coco_eval.stats[0].item()\n                except Exception as e:\n                    map_val = 0.0\n            stats_map[iou_type] = map_val * 100\n\n        logger.enable_printing()\n        return stats_map\n\n    def compute(self) -> Dict[str, float]:\n        return self.summarize_coco_results()\n"
  },
  {
    "path": "corenet/metrics/confusion_mat.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom numbers import Number\nfrom typing import Any, Dict, List, Optional, Union\n\nimport torch\nfrom torch import Tensor\n\nfrom corenet.metrics import METRICS_REGISTRY\nfrom corenet.metrics.metric_base import BaseMetric\nfrom corenet.utils.tensor_utils import reduce_tensor_sum\n\n\n# TODO: tests\n@METRICS_REGISTRY.register(\"confusion_matrix\")\nclass ConfusionMatrix(BaseMetric):\n    \"\"\"\n    Computes the confusion matrix and is based on `FCN <https://github.com/shelhamer/fcn.berkeleyvision.org/blob/master/score.py>`_\n    \"\"\"\n\n    def reset(self):\n        self.confusion_mat = None\n        self.prediction_key = \"logits\"\n\n    def update(\n        self,\n        prediction: Union[Tensor, Dict],\n        target: Union[Tensor, Dict],\n        extras: Dict[str, Any] = {},\n        batch_size: Optional[int] = 1,\n    ):\n        if isinstance(prediction, dict) and self.prediction_key in prediction:\n            prediction = prediction[self.prediction_key]\n\n        if isinstance(prediction, dict) or isinstance(prediction, dict):\n            raise NotImplementedError(\n                \"ConfusionMatrix does not currently support Dict predictions or targets\"\n            )\n\n        n_classes = prediction.shape[1]\n\n        if self.confusion_mat is None:\n            self.confusion_mat = torch.zeros(\n                (n_classes, n_classes), dtype=torch.int64, device=target.device\n            )\n\n        with torch.no_grad():\n            prediction = prediction.argmax(1).flatten()\n            target = target.flatten()\n            k = (target >= 0) & (target < n_classes)\n            inds = n_classes * target[k].to(torch.int64) + prediction[k]\n            cnts = torch.bincount(inds, minlength=n_classes**2).reshape(\n                n_classes, n_classes\n            )\n            if self.is_distributed:\n                cnts = reduce_tensor_sum(cnts)\n            self.confusion_mat += cnts\n\n    def compute(self) -> Union[Number, Dict[str, Union[Number, List[Number]]]]:\n        if self.confusion_mat is None:\n            print(\"Confusion matrix is None. Check code\")\n            return None\n\n        h = self.confusion_mat.float()\n\n        metrics: Dict[str, Tensor] = {}\n        metrics[\"accuracy_global\"] = torch.diag(h).sum() / h.sum()\n        diag_h = torch.diag(h)\n        metrics[\"class_accuracy\"] = diag_h / h.sum(1)\n        metrics[\"mean_class_accuracy\"] = metrics[\"class_accuracy\"].mean()\n        metrics[\"iou\"] = diag_h / (h.sum(1) + h.sum(0) - diag_h)\n        metrics[\"mean_iou\"] = metrics[\"iou\"].mean()\n        metrics[\"confusion\"] = self.confusion_mat\n\n        # Making sure all values are converted to Python values\n        metrics = {k: v.detach().cpu().tolist() for k, v in metrics.items()}\n        return metrics\n"
  },
  {
    "path": "corenet/metrics/image_text_retrieval.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nfrom numbers import Number\nfrom typing import Any, Dict, Tuple, Union\n\nimport torch\nfrom torch import Tensor\n\nfrom corenet.metrics import METRICS_REGISTRY\nfrom corenet.metrics.metric_base import BaseMetric\nfrom corenet.metrics.retrieval_cmc import DISTANCE_REGISTRY\nfrom corenet.utils import logger\nfrom corenet.utils.tensor_utils import all_gather_list\n\n\n@METRICS_REGISTRY.register(\"image_text_retrieval\")\nclass ImageTextRetrievalMetric(BaseMetric):\n    \"\"\"\n    Computes the image-text retrieval metrics for a list of images and their captions\n    using the distance between their embeddings.\n\n    Expects predictions to contain two keys:\n        image (Tensor): [batch, hidden_dim]\n        text (Tensor): [batch * num_captions, hidden_dim]\n\n    Computes the following metrics:\n        image2text\n            recall@1, recall@5, recall@10, mean_rank, median_rank\n        text2image\n            recall@1, recall@5, recall@10, mean_rank, median_rank\n\n    NOTE: each image MUST have the same number of captions.\n    \"\"\"\n\n    def __init__(\n        self,\n        image: str = \"image\",\n        text: str = \"text\",\n        opts: Dict[str, Any] = None,\n        is_distributed: bool = False,\n    ) -> None:\n        # Ignoring pred_key and target_key as we won't be using them\n        # The issue is, both text and image are in the prediction, so pred_key and\n        # target_key don't make sense here. We can still use pred_key to support nested\n        # dicts, but it didn't seem required.\n        super().__init__(opts, is_distributed)\n        self._image_key = image\n        self._text_key = text\n\n        distance_metric = getattr(\n            opts, \"stats.metrics.img_text_retrieval.distance_metric\"\n        )\n        self.measure = DISTANCE_REGISTRY[distance_metric]\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        \"\"\"Add metric specific arguments\"\"\"\n        if cls == ImageTextRetrievalMetric:\n            parser.add_argument(\n                \"--stats.metrics.img-text-retrieval.distance-metric\",\n                type=str,\n                default=\"cosine\",\n                choices=list(DISTANCE_REGISTRY.keys()),\n                help=\"Distance to use for nearest-neighbor calculation.\",\n            )\n        return parser\n\n    def reset(self) -> None:\n        self._images = []\n        self._texts = []\n\n    def update(\n        self,\n        prediction: Union[Tensor, Dict],\n        target: Union[Tensor, Dict],\n        extras: Dict[str, Any],\n        batch_size: int = 1,\n    ) -> None:\n        images = prediction[self._image_key]\n        texts = prediction[self._text_key]\n\n        if not isinstance(images, Tensor) or not isinstance(texts, Tensor):\n            logger.error(\n                \"ImageTextRetrievalMetric only works on Tensor, got {} and {}.\".format(\n                    type(images), type(texts)\n                )\n            )\n            return\n\n        if self.is_distributed:\n            images = all_gather_list(images)\n            texts = all_gather_list(texts)\n        else:\n            images = [images.detach()]\n            texts = [texts.detach()]\n\n        self._images.extend(images)\n        self._texts.extend(texts)\n\n    def get_aggregates(self) -> Tuple[Tensor, Tensor]:\n        self._images = [torch.cat(self._images, dim=0)]\n        self._texts = [torch.cat(self._texts, dim=0)]\n\n        return self._images[0], self._texts[0]\n\n    def _text2image(\n        self, images: Tensor, texts: Tensor, num_captions: int\n    ) -> torch.LongTensor:\n        \"\"\"\n        Compute the distance between embeddings for text captions and their respective images.\n\n        Args:\n            image: A tensor of image embeddings. Shape: [batch, hidden_dim]\n            text: A tensor of text embeddings. Shape: [batch * num_captions, hidden_dim]\n            num_captions: The number of captions paired with a single image.\n\n        Returns:\n            A tensor containing ranks of the corresponding image among all images.\n        \"\"\"\n        ranks = torch.zeros(images.shape[0], dtype=torch.long)\n        for i, image in enumerate(images):\n            # [1, hidden_dim] dist [batch * num_captions, hidden_dim] --> [batch * num_captions]\n            # i.e. dists of size: [num_texts]\n            dists = self.measure(image.unsqueeze(0), texts).squeeze(0)\n\n            # find the rank of the best scoring caption among num_captions\n            inds = torch.argsort(dists) // num_captions\n            ranks[i] = (inds == i).nonzero()[0, 0]\n        return ranks\n\n    def _image2text(\n        self, images: Tensor, texts: Tensor, num_captions: int\n    ) -> torch.LongTensor:\n        \"\"\"\n        Compute the distance between embeddings for images and their respective captions.\n\n        Args:\n            image: A tensor of image embeddings. Shape: [batch, hidden_dim]\n            text: A tensor of text embeddings. Shape: [batch * num_captions, hidden_dim]\n            num_captions: The number of captions paired with a single image.\n\n        Returns:\n            A tensor containing ranks of the closest caption to each image among all\n            captions.\n        \"\"\"\n        ranks = torch.zeros(texts.shape[0], dtype=torch.long)\n        for i, text in enumerate(texts):\n            # [1, hidden_dim] cos [batch, hidden_dim] --> [batch]\n            # i.e. dists of size: [num_images]\n            dists = self.measure(text.unsqueeze(0), images).squeeze(0)\n\n            # find the rank of the corresponding image\n            inds = torch.argsort(dists)\n            ranks[i] = (inds == (i // num_captions)).nonzero()[0, 0]\n        return ranks\n\n    def compute(self) -> Union[Number, Dict[str, Number]]:\n        # image: [batch, hidden_dim]\n        # text:  [batch, num_captions, hidden_dim] or [batch * num_captions, hidden_dim]\n        images, texts = self.get_aggregates()\n\n        # make sure text shape is: [batch * num_captions, hidden_dim]\n        if texts.dim() == 3:\n            # [batch, num_captions, hidden_dim] --> [batch * num_captions, hidden_dim]\n            texts = texts.reshape(-1, texts.shape[-1])\n\n        num_images = images.shape[0]\n        num_texts = texts.shape[0]\n        assert num_texts % num_images == 0, \"Number of captions is not consistent\"\n        num_captions = num_texts // num_images\n\n        with torch.no_grad():\n            i2t_ranks = self._image2text(images, texts, num_captions)\n            t2i_ranks = self._text2image(images, texts, num_captions)\n\n        return {\n            \"text2image\": self._rank_metrics(t2i_ranks),\n            \"image2text\": self._rank_metrics(i2t_ranks),\n        }\n\n    def _rank_metrics(self, ranks: torch.LongTensor) -> Dict[str, Number]:\n        return {\n            \"recall@1\": 100 * (ranks < 1).float().mean().item(),\n            \"recall@5\": 100 * (ranks < 5).float().mean().item(),\n            \"recall@10\": 100 * (ranks < 10).float().mean().item(),\n            \"mean_rank\": 1 + ranks.float().mean().item(),\n            \"median_rank\": 1 + ranks.median().item(),\n        }\n"
  },
  {
    "path": "corenet/metrics/intersection_over_union.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom numbers import Number\nfrom typing import Any, Dict, Optional, Tuple, Union\n\nimport numpy as np\nimport torch\nfrom torch import Tensor\n\nfrom corenet.metrics import METRICS_REGISTRY\nfrom corenet.metrics.metric_base import AverageMetric\nfrom corenet.utils import logger\n\n\ndef compute_miou_batch(\n    prediction: Union[Tuple[Tensor, Tensor], Tensor],\n    target: Tensor,\n    epsilon: Optional[float] = 1e-7,\n):\n    if isinstance(prediction, Tuple) and len(prediction) == 2:\n        mask = prediction[0]\n        assert isinstance(mask, Tensor)\n    elif isinstance(prediction, Tensor):\n        mask = prediction\n        assert isinstance(mask, Tensor)\n    else:\n        raise NotImplementedError(\n            \"For computing loss for segmentation task, we need prediction to be an instance of Tuple or Tensor\"\n        )\n\n    num_classes = mask.shape[1]\n    pred_mask = torch.max(mask, dim=1)[1]\n    assert (\n        pred_mask.dim() == 3\n    ), \"Predicted mask tensor should be 3-dimensional (B x H x W)\"\n\n    pred_mask = pred_mask.byte()\n    target = target.byte()\n\n    # shift by 1 so that 255 is 0\n    pred_mask += 1\n    target += 1\n\n    pred_mask = pred_mask * (target > 0)\n    inter = pred_mask * (pred_mask == target)\n    area_inter = torch.histc(inter.float(), bins=num_classes, min=1, max=num_classes)\n    area_pred = torch.histc(pred_mask.float(), bins=num_classes, min=1, max=num_classes)\n    area_mask = torch.histc(target.float(), bins=num_classes, min=1, max=num_classes)\n    area_union = area_pred + area_mask - area_inter + epsilon\n    return area_inter, area_union\n\n\n@METRICS_REGISTRY.register(name=\"iou\")\nclass IOUMetric(AverageMetric):\n    def gather_metrics(\n        self,\n        prediction: Union[Tensor, Dict],\n        target: Union[Tensor, Dict],\n        extras: Dict[str, Any],\n    ) -> Union[Tensor, Dict[str, Tensor]]:\n        \"\"\"\n        This function gathers intersection and union metrics from different processes and converts to float.\n        \"\"\"\n        if isinstance(prediction, Tensor) and isinstance(target, Tensor):\n            inter, union = compute_miou_batch(prediction=prediction, target=target)\n            return {\"inter\": inter, \"union\": union}\n        # elif isinstance(prediction, Dict):\n        #    logger.error(\"IOU metrics are not supported for a dictionary of predictions\")\n        # We will revisit it later, as per the use case.\n\n        # inter_dict = {}\n        # union_dict = {}\n        # for k, v in prediction.items():\n        #     inter, union = compute_miou_batch(prediction=v, target=target)\n        #     inter = tensor_to_python_float(inter, is_distributed=is_distributed)\n        #     union = tensor_to_python_float(union, is_distributed=is_distributed)\n        #     inter_dict[k] = inter\n        #     union_dict[k] = union\n        # return inter_dict, union_dict\n        else:\n            logger.error(\"Metric monitor supports Tensor only for IoU\")\n\n    def compute(self) -> Union[Number, Dict[str, Number]]:\n        averaged = super().compute()\n        iou = averaged[\"inter\"] / averaged[\"union\"]\n\n        if isinstance(iou, Tensor):\n            iou = iou.cpu().numpy()\n\n        # Converting iou from [0, 1] to [0, 100]\n        # other metrics are by default in [0, 100 range]\n        avg_iou = np.mean(iou) * 100.0\n\n        return avg_iou\n"
  },
  {
    "path": "corenet/metrics/metric_base.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport abc\nimport argparse\nfrom numbers import Number\nfrom typing import Any, Dict, List, Optional, Tuple, Union\n\nimport numpy as np\nimport torch\nfrom torch import Tensor\n\nfrom corenet.utils import logger\nfrom corenet.utils.object_utils import flatten_to_dict\nfrom corenet.utils.tensor_utils import (\n    all_gather_list,\n    reduce_tensor_sum,\n    tensor_to_python_float,\n)\n\n\nclass BaseMetric(abc.ABC):\n    def __init__(\n        self,\n        opts: Optional[argparse.Namespace] = None,\n        is_distributed: bool = False,\n        pred: str = None,\n        target: str = None,\n    ):\n        self.opts = opts\n        # We need the default value of device for tests.\n        self.device = getattr(opts, \"dev.device\", \"cpu\")\n        self.is_distributed = is_distributed\n        self.pred_key = pred\n        self.target_key = target\n        self.reset()\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        \"\"\"Add metric specific arguments\"\"\"\n        return parser\n\n    @abc.abstractmethod\n    def reset(self) -> None:\n        \"\"\"\n        Resets all aggregated data.\n        Called at the start of every epoch.\n        \"\"\"\n        raise NotImplementedError\n\n    @abc.abstractmethod\n    def update(\n        self,\n        prediction: Union[Tensor, Dict],\n        target: Union[Tensor, Dict],\n        extras: Dict[str, Any],\n        batch_size: Optional[int] = 1,\n    ) -> None:\n        \"\"\"\n        Processes a new batch of predictions and targets for computing the metric.\n\n        Args:\n            predictions: model outputs for the current batch\n            target: labels for the current batch\n            extras: dict containing extra information.\n                During training this includes \"loss\" and \"grad_norm\" keys.\n                During validaiton only includes \"loss\".\n            batch_size: optionally used to correctly compute the averages when\n                the batch size varies across batches.\n        \"\"\"\n        raise NotImplementedError\n\n    @abc.abstractmethod\n    def compute(\n        self,\n    ) -> Union[Number, List, Dict[str, Any]]:\n        \"\"\"\n        Computes the metrics with the existing data.\n\n        It gets called at every log iteration as well as the end of each epoch,\n        e.g. train, val, valEMA.\n        Logging happens at iteration 1 and every `common.log_freq` thereafter.\n\n        Note: for computationally heavy metrics, you may want to increase `common.log_freq`.\n\n        Returns:\n            Depending on the metric, can return a scalar metric or a dictionary of metrics.\n            Lists (or dicts of lists) are also generally accepted but not encouraged.\n        \"\"\"\n        raise NotImplementedError\n\n    def preprocess_predictions(\n        self, prediction: Union[Tensor, Dict]\n    ) -> Union[Tensor, Dict]:\n        if isinstance(prediction, dict) and self.pred_key in prediction:\n            prediction = prediction[self.pred_key]\n\n        return prediction\n\n    def preprocess_targets(self, target: Union[Tensor, Dict]) -> Union[Tensor, Dict]:\n        if isinstance(target, dict) and self.target_key in target:\n            target = target[self.target_key]\n\n        return target\n\n    def summary_string(self, name: str, sep: str, values: Dict[str, Any]) -> str:\n        \"\"\"\n        Get a string representation of the given metric values, suitable for\n        printing to the terminal.\n\n        Note that we might not print everything inside @values, e.g. if it would\n        create too large of an output that would make logs too verbose.\n\n        Args:\n            name: The name of the metric.\n            sep: The separator used in the printout.\n            values: The metric values, as output by @self.compute.\n\n        Returns:\n            A string representation of the metric.\n        \"\"\"\n        return f\"{name:<}{sep}{values}\"\n\n    def is_epoch_summary_enabled_for_metric(\n        self, metric_name: str, log_writer: Any\n    ) -> bool:\n        \"\"\"\n        Determines whether to log a metric with the given @metric_name when the\n        given @log_writer is invoked.\n\n        This is mainly used to prevent logs from becoming too large. For\n        example, we might not want to display every value in a PR curve, even\n        though we want to calculate and store the curve.\n\n        Args:\n            metric_name: The name of the metric.\n            log_writer: An object that can be used as a log writer (for example,\n                a TensorBoardLogger).\n\n        Returns:\n            True if the name of the metric should be logged. False otherwise.\n        \"\"\"\n        return True\n\n    def flatten_metric(\n        self, values: Union[Number, List, Dict[str, Any]], metric_name: str\n    ) -> Dict[str, Union[Number, List, Dict[str, Any]]]:\n        \"\"\"\n        Flatten the given metric @values, prepending @metric_name to the\n        resulting dictionary's keys.\n\n        Args:\n            values: The values, as output by @self.compute.\n            metric_name: The metric name key prefix.\n\n        Returns:\n            A version of @values that has been flattened, with key names\n                starting with @metric_name.\n        \"\"\"\n        return flatten_to_dict(values, metric_name)\n\n\nclass AverageMetric(BaseMetric):\n    def reset(self):\n        self.count = 0\n        self.value = None\n\n    @abc.abstractmethod\n    def gather_metrics(\n        self,\n        prediction: Union[Tensor, Dict],\n        target: Union[Tensor, Dict],\n        extras: Dict[str, Any],\n    ) -> Union[Tensor, Dict[str, Tensor]]:\n        raise NotImplementedError(\n            \"gather_metrics needs to be implemented for subclasses of AverageMetric\"\n        )\n\n    def _aggregate_ddp_sum(\n        self, value: Union[Tensor, Number]\n    ) -> Union[float, List[float]]:\n        \"\"\"\n        Given a value, sums it up across distributed workers (if distributed) and\n        returns the value as a float (if scalar) or a Numpy array (otherwise).\n        \"\"\"\n        with torch.no_grad():\n            if not isinstance(value, Tensor):\n                value = torch.tensor(value)\n            value = value.to(device=self.device)\n\n            value = tensor_to_python_float(\n                value,\n                is_distributed=self.is_distributed,\n                reduce_op=\"sum\",\n            )\n        return value\n\n    def update(\n        self,\n        prediction: Union[Tensor, Dict],\n        target: Union[Tensor, Dict],\n        extras: Optional[Dict[str, Any]] = {},\n        batch_size: Optional[int] = 1,\n    ) -> None:\n        prediction = self.preprocess_predictions(prediction)\n        target = self.preprocess_targets(target)\n\n        metric = self.gather_metrics(prediction, target, extras)\n\n        if isinstance(metric, Dict):\n            # The values should be summed over all existing workers\n            metric = {\n                k: self._aggregate_ddp_sum(v * batch_size) for k, v in metric.items()\n            }\n            if self.value is None:\n                self.value = metric\n            else:\n                for k, v in metric.items():\n                    self.value[k] += v\n\n        elif isinstance(metric, Tensor):\n            if self.value is None:\n                self.value = 0\n\n            # The value should be summed over all existing workers\n            self.value += self._aggregate_ddp_sum(metric * batch_size)\n        else:\n            raise ValueError(\n                \"gather_metrics should return a Tensor or a Dict containing Tensors. Got {}: {}\".format(\n                    metric.__class__, metric\n                )\n            )\n\n        # The count should be summed over all existing workers\n        self.count += self._aggregate_ddp_sum(batch_size)\n\n    def compute(self) -> Union[Number, List, Dict[str, Any]]:\n        if self.value is None:\n            return {}\n        elif isinstance(self.value, Number):\n            return self.value / self.count\n        elif isinstance(self.value, Dict):\n            avg_dict = {k: v / self.count for k, v in self.value.items()}\n            return avg_dict\n\n\nclass EpochMetric(BaseMetric):\n    def __init__(\n        self,\n        opts: Optional[argparse.Namespace] = None,\n        is_distributed: bool = False,\n        pred: str = None,\n        target: str = None,\n        force_cpu: bool = True,\n    ):\n        super().__init__(opts, is_distributed, pred, target)\n        self.force_cpu = force_cpu\n\n    def reset(self):\n        self._predictions: List[Tensor] = []\n        self._targets: List[Tensor] = []\n\n    def update(\n        self,\n        prediction: Union[Tensor, Dict],\n        target: Union[Tensor, Dict],\n        extras: Dict[str, Any] = None,\n        batch_size: Optional[int] = 1,\n    ) -> None:\n        prediction = self.preprocess_predictions(prediction)\n        target = self.preprocess_targets(target)\n\n        if not isinstance(prediction, Tensor) or not isinstance(target, Tensor):\n            logger.error(\n                \"EpochMetric only works on Tensor, got {} and {}.\".format(\n                    type(prediction), type(target)\n                )\n                + \" Please set pred_key or target_key by setting the proper metric name:\"\n                + \" `stats.val: ['metric_name(pred=key1, target=key2)']`\"\n            )\n            return\n\n        if self.is_distributed:\n            prediction = all_gather_list(prediction)\n            target = all_gather_list(target)\n        else:\n            prediction = [prediction]\n            target = [target]\n\n        # Detach the variables: we don't need to backprop in metrics\n        prediction = [x.detach() for x in prediction]\n        target = [x.detach() for x in target]\n        # By default we move things to CPU so as to not put extra burden on GPU memory\n        # but we allow child-classes/instances to keep the data on GPU for efficiency.\n        if self.force_cpu:\n            prediction = [x.cpu() for x in prediction]\n            target = [x.cpu() for x in target]\n\n        self._predictions.extend(prediction)\n        self._targets.extend(target)\n\n    def get_aggregates(self) -> Tuple[Tensor, Tensor]:\n        \"\"\"Aggregates predictions and targets.\n\n        This function gets called every time `self.compute` is called, which is at every\n        log iteration as well as the end of each epoch, e.g. train, val, valEMA.\n        Logging happens at iteration 1 and every `common.log_freq` thereafter.\n\n        Note: for computationally heavy metrics, you may want to increase `common.log_freq`.\n        \"\"\"\n        self._predictions = [torch.cat(self._predictions, dim=0)]\n        self._targets = [torch.cat(self._targets, dim=0)]\n\n        return self._predictions[0], self._targets[0]\n\n    def compute_with_aggregates(self, predictions: Tensor, targets: Tensor):\n        \"\"\"\n        Computes the metrics given aggregated predictions and targets.\n\n        It gets called by `self.compute`. This happens at every\n        log iteration as well as the end of each epoch, e.g. train, val, valEMA.\n        Logging happens at iteration 1 and every `common.log_freq` thereafter.\n\n        Note: for computationally heavy metrics, you may want to increase `common.log_freq`.\n        \"\"\"\n        raise NotImplementedError\n\n    def compute(self) -> Union[Number, List, Dict[str, Any]]:\n        predictions, targets = self.get_aggregates()\n        return self.compute_with_aggregates(predictions, targets)\n"
  },
  {
    "path": "corenet/metrics/metric_base_test.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom typing import Any, Dict, Union\n\nimport torch\nfrom torch import Tensor\n\nfrom corenet.metrics.metric_base import AverageMetric\n\n\nclass DummyMetric(AverageMetric):\n    def gather_metrics(\n        self,\n        prediction: Union[Tensor, Dict],\n        target: Union[Tensor, Dict],\n        extras: Dict[str, Any],\n    ) -> Union[Tensor, Dict[str, Tensor]]:\n        return prediction\n\n\ndef test_average_metric_distributed_batchsize(mocker):\n    mocker.patch(\"torch.distributed.is_initialized\", return_value=True)\n    mocker.patch(\"torch.distributed.get_world_size\", return_value=2)\n    mocker.patch(\"torch.distributed.all_reduce\", lambda x, *_, **__: x.add_(1))\n\n    metric = DummyMetric(None, is_distributed=True)\n    metric.update(torch.tensor([2.0]), None, batch_size=torch.tensor([2]))\n\n    # Value is 2 and batch size is 2, but we're simulating the second device\n    # having value 1 and batch size 1 by making sure all_reduce adds 1 to both\n    # the value and the batch size. It's as if we have [2, 2] in GPU1 and [1]\n    # in GPU 2. Therefore the expected average is 5/3.\n\n    expected_value = (2 * 2 + 1 * 1) / 3\n    assert metric.compute() == expected_value\n"
  },
  {
    "path": "corenet/metrics/misc.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom numbers import Number\nfrom typing import Any, Dict, Union\n\nimport torch\nfrom torch import Tensor\n\nfrom corenet.metrics import METRICS_REGISTRY\nfrom corenet.metrics.metric_base import AverageMetric\nfrom corenet.utils import logger\n\n\n@METRICS_REGISTRY.register(name=\"loss\")\nclass LossMetric(AverageMetric):\n    def gather_metrics(\n        self,\n        prediction: Union[Tensor, Dict],\n        target: Union[Tensor, Dict],\n        extras: Dict[str, Any],\n    ) -> Union[Tensor, Dict[str, Tensor]]:\n        \"\"\"\n        This function gather losses from different processes and converts to float.\n        \"\"\"\n        if extras is None:\n            extras = {}\n\n        loss = extras.get(\"loss\", None)\n\n        if loss is None:\n            loss = 0.0\n\n        if isinstance(loss, Tensor):\n            return loss\n        elif isinstance(loss, Number):\n            return torch.tensor(loss, device=self.device)\n        elif isinstance(loss, Dict):\n            loss.pop(None, None)\n\n            for k, v in loss.items():\n                if isinstance(v, Number):\n                    loss[k] = torch.tensor(loss, device=self.device)\n                elif not isinstance(v, Tensor):\n                    logger.error(\n                        \"Loss metric supports Number, Tensor, or Dict of Tensors.\"\n                        f\" Got {v} with {type(v)} type under key {k}.\"\n                    )\n\n            return loss\n        else:\n            logger.error(\n                \"Loss metric supports Number, Tensor, or Dict of Tensors.\"\n                f\" Got {loss} with {type(loss)} type.\"\n            )\n\n\n@METRICS_REGISTRY.register(name=\"grad_norm\")\nclass GradNormMetric(AverageMetric):\n    def gather_metrics(\n        self,\n        prediction: Union[Tensor, Dict],\n        target: Union[Tensor, Dict],\n        extras: Dict[str, Any],\n    ) -> Union[Tensor, Dict[str, Tensor]]:\n        if extras is None:\n            extras = {}\n\n        grad_norm = extras.get(\"grad_norm\", None)\n\n        if grad_norm is None:\n            grad_norm = 0.0\n\n        if isinstance(grad_norm, Tensor):\n            return grad_norm\n        elif isinstance(grad_norm, Number):\n            return torch.tensor(grad_norm, device=self.device)\n        elif isinstance(grad_norm, Dict):\n            grad_norm.pop(None, None)\n\n            for k, v in grad_norm.items():\n                if isinstance(v, Number):\n                    grad_norm[k] = torch.tensor(grad_norm, device=self.device)\n                elif isinstance(v, str):\n                    del grad_norm[k]\n                elif not isinstance(v, Tensor):\n                    logger.error(\n                        \"Grad-norm metric supports Number, Tensor, or Dict of Tensors.\"\n                        f\" Got {v} with {type(v)} type under key {k}.\"\n                    )\n\n            return grad_norm\n        else:\n            logger.error(\n                \"Grad-norm metric supports Number, Tensor, or Dict of Tensors.\"\n                f\" Got {grad_norm} with {type(grad_norm)} type.\"\n            )\n"
  },
  {
    "path": "corenet/metrics/multiclass_classification_pr.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\nimport argparse\nfrom numbers import Number\nfrom typing import Any, Dict, List, Optional, Tuple, Union\n\nimport numpy as np\nimport torch\nfrom sklearn.metrics import average_precision_score, precision_recall_curve\nfrom torch import Tensor\nfrom torch.nn import functional as F\n\nfrom corenet.metrics import METRICS_REGISTRY\nfrom corenet.metrics.metric_base import BaseMetric\nfrom corenet.utils import logger, tensor_utils\nfrom corenet.utils.file_logger import FileLogger\n\n\ndef get_recall_at_precision(\n    precisions: np.ndarray,\n    recalls: np.ndarray,\n    precision_value: float,\n    suppress_warnings: bool = False,\n) -> float:\n    \"\"\"\n    Compute the recall at the given @precision_value.\n\n    Args:\n      precisions: An array of shape [num_elements] with precision values.\n      recalls: An array of shape [num_elements] with precision values.\n      precision_value: The precision at which to obtain the recall.\n      suppress_warnings: Suppress warnings.\n\n    Returns: The recall at @precision_value.\n    \"\"\"\n    sort_indices = np.argsort(precisions)\n    sorted_precisions = precisions[sort_indices]\n    sorted_recalls = recalls[sort_indices]\n\n    index = np.searchsorted(sorted_precisions, precision_value)\n\n    if not suppress_warnings and not np.isclose(\n        sorted_precisions[index], precision_value, rtol=0.01, atol=0.01\n    ):\n        # The difference between the requested and true precisions are higher than expected.\n        logger.warning(\n            f\"Found recall at precision {sorted_precisions[index]} \"\n            f\"when recall at precision {precision_value} was requested.\"\n        )\n\n    return float(sorted_recalls[index])\n\n\ndef compute_oi_f1(predictions: Tensor, targets: Tensor) -> Tuple[float, float]:\n    \"\"\"\n    Compute the \"Optimal Instance\" F1 score.\n\n    The \"official\" computation corresponds to:\n        1. Compute the threshold that maximizes individual input's F1 scores\n            separately.\n        2. Using those thresholds, count the true positives, false positives,\n            and false negatives.\n        3. Use these values to compute the F1 score.\n\n    This function also computes a simple averaging of F1 scores individually\n    calculated from each input's optimal thresholds.\n\n    Args:\n        predictions: A tensor of shape [batch_size, num_classes, predictions_per_sample]\n            containing predictions.\n        targets: A tensor of shape [batch_size, num_classes, predictions_per_sample]\n            containing targets.\n\n    Returns: A tuple containing the \"official\" F1 and the simple average of individual\n        F1 scores, as described above.\n    \"\"\"\n    if not predictions.ndim == 3:\n        raise ValueError(f\"Invalid shape {predictions.shape}\")\n    if not targets.ndim == 3:\n        raise ValueError(f\"Invalid shape {targets.shape}\")\n\n    batch_size = predictions.shape[0]\n    num_classes = predictions.shape[1]\n\n    official_ois_f1_scores = []\n    avg_of_best_f1_scores = []\n    for class_id in range(num_classes):\n        true_positives = 0\n        false_positives = 0\n        false_negatives = 0\n        best_f1_scores = []\n\n        for idx in range(batch_size):\n            # 1. Find the threshold that maximizes F1 score.\n            prediction = predictions[idx, class_id]\n            target = targets[idx, class_id]\n            precisions, recalls, thresholds = precision_recall_curve(target, prediction)\n            f1_scores = (\n                2\n                * precisions\n                * recalls\n                / (precisions + recalls + ((precisions + recalls) == 0))\n            )\n            max_idx = np.argmax(f1_scores)\n            threshold = thresholds[max_idx]\n            best_f1_scores.append(f1_scores[max_idx])\n\n            # 2. Use the threshold to update counts.\n            true_positives += ((prediction >= threshold) * (target == 1)).sum().item()\n            false_positives += ((prediction >= threshold) * (target == 0)).sum().item()\n            false_negatives += ((prediction < threshold) * (target == 1)).sum().item()\n\n        # Store the F1 score for this class.\n        precision = true_positives / (\n            true_positives + false_positives + ((true_positives + false_positives) == 0)\n        )\n        recall = true_positives / (\n            true_positives + false_negatives + ((true_positives + false_negatives) == 0)\n        )\n        official_ois_f1_scores.append(\n            float(\n                (2 * precision * recall)\n                / (precision + recall + ((precision + recall) == 0))\n            )\n        )\n        avg_of_best_f1_scores.append(sum(best_f1_scores) / len(best_f1_scores))\n    return official_ois_f1_scores, avg_of_best_f1_scores\n\n\n@METRICS_REGISTRY.register(name=\"multiclass_classification_pr\")\nclass MulticlassClassificationPR(BaseMetric):\n    \"\"\"\n    Computes multiclass precision/recall metrics.\n\n    Example .yaml configuration to use this metric (assuming your\n    model outputs a dict with key \"logits\"):\n\n    stats:\n        val: [\"multiclass_classification_pr(pred=logits)\"]\n        checkpoint_metric: \"multiclass_classification_pr(pred=logits).macro\"\n        checkpoint_metric_max: true\n        metrics:\n            multiclass_classification_pr:\n                include_curve: false\n    \"\"\"\n\n    def __init__(\n        self,\n        opts: Optional[argparse.Namespace] = None,\n        is_distributed: bool = False,\n        pred: str = None,\n        target: str = None,\n    ) -> None:\n        self.all_predictions: List[torch.Tensor] = []\n        self.all_targets: List[torch.Tensor] = []\n        self.include_curve = getattr(\n            opts, \"stats.metrics.multiclass_classification_pr.include_curve\"\n        )\n        self.include_classwise_ap = getattr(\n            opts, \"stats.metrics.multiclass_classification_pr.include_classwise_ap\"\n        )\n        self.suppress_warnings = getattr(\n            opts, \"stats.metrics.multiclass_classification_pr.suppress_warnings\"\n        )\n        super().__init__(opts, is_distributed, pred, target)\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        \"\"\"\n        Add metric specific arguments.\n\n        Args:\n            parser: The parser to which to add the arguments.\n\n        Returns:\n            The parser.\n        \"\"\"\n        if cls == MulticlassClassificationPR:\n            parser.add_argument(\n                \"--stats.metrics.multiclass-classification-pr.include-curve\",\n                action=\"store_true\",\n                help=\"If set, PR curves will be stored.\",\n            )\n            parser.add_argument(\n                \"--stats.metrics.multiclass-classification-pr.include-classwise-ap\",\n                action=\"store_true\",\n                help=\"If set, AP will be plotted for each class.\",\n            )\n            parser.add_argument(\n                \"--stats.metrics.multiclass-classification-pr.suppress-warnings\",\n                action=\"store_true\",\n                help=\"If set, warnings will be suppressed. This is useful to reduce the logs size during training.\",\n            )\n        return parser\n\n    def reset(self) -> None:\n        \"\"\"\n        Resets all aggregated data.\n        Called at the start of every epoch.\n        \"\"\"\n        self.all_predictions.clear()\n        self.all_targets.clear()\n\n    def update(\n        self,\n        prediction: Union[Tensor, Dict],\n        target: Union[Tensor, Dict],\n        extras: Dict[str, Any] = {},\n        batch_size: Optional[int] = 1,\n    ) -> None:\n        \"\"\"\n        Processes a new batch of predictions and targets for computing the metric.\n\n        Args:\n            predictions: model outputs for the current batch. They must be a\n                tensor of shape [batch_size, num_classes, ...], or a dictionary\n                with key self.pred_key containing such a tensor.\n            target: labels for the current batch. They may be a tensor of shape\n                [batch_size, ...], or a dictionary with key self.target_key containing\n                such a tensor. If so, the entries are assumed to be class indices.\n                The target may also be a tensor of shape [batch_size, num_classes, ...],\n                or a dictionary with key self.target_key containing such a tensor. If so,\n                the entries are assumed to be binary class labels.\n            extras: unused.\n            batch_size: unused.\n        \"\"\"\n        if isinstance(prediction, dict):\n            if self.pred_key in prediction:\n                prediction = prediction[self.pred_key]\n            else:\n                raise KeyError(\n                    f\"Missing prediction key '{self.pred_key}. Existing keys: {prediction.keys()}'\"\n                )\n\n        if isinstance(target, dict):\n            if self.target_key in target:\n                target = target[self.target_key]\n            else:\n                raise KeyError(\n                    f\"Missing target key '{self.target_key}. Existing keys: {target.keys()}'\"\n                )\n\n        if (prediction.ndim - target.ndim) not in (0, 1):\n            raise ValueError(\n                f\"Invalid dimensions prediction.shape={prediction.shape}, target.shape={target.shape}\"\n            )\n\n        if target.ndim < prediction.ndim:\n            # The target doesn't have a num_classes dimension because it has\n            # class labels. Expand it.\n            num_classes = prediction.shape[1]\n            target = F.one_hot(target, num_classes=num_classes)\n            # Change from [batch_size, ..., num_classes] to [batch_size, num_classes, ...].\n            new_order = (\n                0,\n                target.ndim - 1,\n            ) + tuple(range(1, target.ndim - 1))\n            target = target.permute(*new_order)\n\n        # Now, @target and @prediction are both in [batch_size, num_classes, ...] order.\n        assert target.shape == prediction.shape\n\n        if prediction.dim() > 2:\n            prediction = prediction.reshape(\n                prediction.shape[0], prediction.shape[1], -1\n            )\n            target = target.reshape(target.shape[0], target.shape[1], -1)\n\n        with torch.no_grad():\n            if self.is_distributed:\n                all_predictions = tensor_utils.all_gather_list(\n                    prediction.detach().cpu().contiguous()\n                )\n                all_targets = tensor_utils.all_gather_list(\n                    target.detach().cpu().contiguous()\n                )\n                all_predictions = torch.cat(\n                    [p.detach().cpu() for p in all_predictions], dim=0\n                )\n                all_targets = torch.cat([t.detach().cpu() for t in all_targets], dim=0)\n            else:\n                all_predictions = prediction.detach().cpu()\n                all_targets = target.detach().cpu()\n            self.all_predictions.append(all_predictions)\n            self.all_targets.append(all_targets)\n\n    def compute(self) -> Dict[str, Union[Number, List[List[Number]]]]:\n        \"\"\"\n        Compute the multiclass classification Precision-Recall metrics.\n\n        See https://scikit-learn.org/stable/modules/generated/sklearn.metrics.average_precision_score.html#sklearn.metrics.average_precision_score\n        for details.\n\n        Returns:\n            A dictionary containing:\n            {\n                \"micro\": The \"micro\"-averaged precision, as defined by SKLearn.\n                    This corresponds to treating each element in the multiclass\n                    prediction separately.\n                \"macro\": The \"macro\"-averaged precision, as defined by SKLearn.\n                    This corresponds to calculating precision-recall metrics\n                    separately for each label, then computing an unweighted mean.\n                \"weighted\": The \"weighted\"-averaged precision, as defined by SKLearn.\n                    This corresponds to calculating precision-recall metrics\n                    separately for each label, then computing a weighted mean.\n                \"precisions\": A list of lists, where element [i][j] is the\n                    j'th precision value for the i'th class.\n                \"recalls\": A list of lists, where element [i][j] is\n                    the j'th precision value for the i'th class.\n                \"thresholds\": A list of lists, where element [i][j] is\n                    the j'th threshold value for the i'th class.\n            }\n        \"\"\"\n        if self.include_curve:\n            metrics = {\n                \"precisions\": [],\n                \"recalls\": [],\n                \"thresholds\": [],\n                \"ODS-F1\": [],\n                \"AP\": [],\n                \"Recall@P=50\": [],\n            }\n        else:\n            metrics = {\n                \"ODS-F1\": [],\n                \"AP\": [],\n                \"Recall@P=50\": [],\n            }\n\n        predictions = (\n            torch.cat(self.all_predictions, dim=0).float().numpy()\n        )  # [batch_size, num_classes, ...]\n        num_classes = predictions.shape[1]\n\n        targets = (\n            torch.cat(self.all_targets, dim=0).float().numpy()\n        )  # [batch_size, num_classes, ...]\n\n        if predictions.ndim == 3:\n            assert targets.ndim == 3\n            # @predictions and @targets have shape [batch_size, num_classes, predictions_per_element]. Compute\n            # the optimal instance score (OIS-F), which is the only metric that needs the predictions_per_element\n            # dimension. Then, reshape to [batch_size * predictions_per_element, num_classes].\n            official, avg = compute_oi_f1(predictions, targets)\n            metrics[\"OIS-F1-official\"] = official\n            metrics[\"OIS-F1-avg\"] = avg\n            predictions = predictions.transpose(0, 2, 1).reshape(-1, num_classes)\n            targets = targets.transpose(0, 2, 1).reshape(-1, num_classes)\n\n        for class_id in range(num_classes):\n            (\n                precisions,\n                recalls,\n                thresholds,\n            ) = precision_recall_curve(targets[:, class_id], predictions[:, class_id])\n\n            f1_scores = (2 * precisions * recalls) / (\n                precisions + recalls + ((precisions + recalls) == 0)\n            )\n            metrics[\"ODS-F1\"].append(f1_scores.max().item())\n\n            if self.include_curve:\n                metrics[\"precisions\"].append(precisions.tolist())\n                metrics[\"recalls\"].append(recalls.tolist())\n                metrics[\"thresholds\"].append(thresholds.tolist())\n\n            metrics[\"AP\"].append(\n                float(\n                    average_precision_score(\n                        targets[:, class_id], predictions[:, class_id]\n                    )\n                )\n            )\n            metrics[\"Recall@P=50\"].append(\n                get_recall_at_precision(\n                    precisions, recalls, 0.5, suppress_warnings=self.suppress_warnings\n                )\n            )\n\n        for average in [\"micro\", \"macro\", \"weighted\"]:\n            metrics[average] = float(\n                average_precision_score(targets, predictions, average=average)\n            )\n\n        if self.include_classwise_ap:\n            for i, v in enumerate(metrics[\"AP\"]):\n                metrics[f\"AP-class{i}\"] = v\n\n        return metrics\n\n    def is_epoch_summary_enabled_for_metric(\n        self, metric_name: str, log_writer: Any\n    ) -> bool:\n        \"\"\"\n        Determines whether to log a metric with the given @metric_name when the\n        given @log_writer is invoked.\n\n        This is mainly used to prevent logs from becoming too large. For\n        example, we might not want to display every value in a PR curve, even\n        though we want to calculate and store the curve.\n\n        Args:\n            metric_name: The name of the metric.\n            log_writer: An object that can be used as a log writer (for example,\n                a TensorBoardLogger).\n\n        Returns:\n            True if the name of the metric should be logged. False otherwise.\n        \"\"\"\n        if isinstance(log_writer, FileLogger):\n            # For FileLoggers, we log everything, including the rather large\n            # precisions/thresholds/recalls keys.\n            return True\n        else:\n            # For other loggers, we avoid the precisions/thresholds/recalls\n            # keys.\n            return not any(\n                (\n                    \"precisions\" in metric_name.lower(),\n                    \"thresholds\" in metric_name.lower(),\n                    \"recalls\" in metric_name.lower(),\n                )\n            )\n\n    def flatten_metric(\n        self, values: Union[Number, List, Dict[str, Any]], metric_name: str\n    ) -> Dict[str, Union[Number, List, Dict[str, Any]]]:\n        \"\"\"\n        Flatten the given metric @values, prepending @metric_name to the\n        resulting dictionary's keys.\n\n        Unlike the base class's method, we do not recursively flatten. This is\n        because we have lists of PR curve values, and we don't want to generate\n        an enormous number of keys to avoid inefficient storage.\n\n        Args:\n            values: The values, as output by @self.compute.\n            metric_name: The metric name key prefix.\n\n        Returns:\n            A version of @values that has been flattened, with key names\n                starting with @metric_name.\n        \"\"\"\n        return {f\"{metric_name}/{k}\": v for k, v in values.items()}\n\n    def summary_string(self, name: str, sep: str, values: Dict[str, Any]) -> str:\n        \"\"\"\n        Get a string representation of the given metric values, suitable for\n        printing to the terminal.\n\n        We avoid printing precision/thresholds/recalls from PR curve\n        computation, to avoid excessively long logs.\n\n        Args:\n            name: The name of the metric.\n            sep: The separator used in the printout.\n            values: The metric values, as output by @self.compute.\n\n        Returns:\n            A string representation of the metric.\n        \"\"\"\n        filtered_keys = {\"precisions\", \"thresholds\", \"recalls\"}\n        values = {k: v for k, v in values.items() if k not in filtered_keys}\n        return super().summary_string(name, sep, values)\n"
  },
  {
    "path": "corenet/metrics/probability_histograms.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nfrom numbers import Number\nfrom typing import Dict, Union\n\nimport numpy as np\nfrom torch import Tensor\nfrom torch.nn import functional as F\n\nfrom corenet.metrics import METRICS_REGISTRY\nfrom corenet.metrics.metric_base import EpochMetric\nfrom corenet.utils import logger\n\n\n@METRICS_REGISTRY.register(\"prob_hist\")\nclass ProbabilityHistogramMetric(EpochMetric):\n    def __init__(\n        self,\n        opts: argparse.Namespace = None,\n        is_distributed: bool = False,\n        pred: str = None,\n        target: str = None,\n    ):\n        super().__init__(opts, is_distributed, pred, target)\n        self.num_bins = getattr(self.opts, \"stats.metrics.prob_hist.num_bins\")\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        \"\"\"Add metric specific arguments\"\"\"\n        if cls == ProbabilityHistogramMetric:\n            parser.add_argument(\n                \"--stats.metrics.prob-hist.num-bins\", type=int, default=10\n            )\n        return parser\n\n    def compute_with_aggregates(\n        self, y_pred: Tensor, y_true: Tensor\n    ) -> Union[Number, Dict[str, Number]]:\n        y_pred = F.softmax(y_pred, dim=-1).numpy()\n        y_true = y_true.numpy()\n\n        max_confs = y_pred.max(axis=-1)\n        max_hist = np.histogram(max_confs, bins=self.num_bins, range=[0, 1])[0]\n        max_hist = max_hist / max_hist.sum()\n\n        target_confs = np.take_along_axis(y_pred, y_true.reshape(-1, 1), 1)\n        target_hist = np.histogram(target_confs, bins=self.num_bins, range=[0, 1])[0]\n        target_hist = target_hist / target_hist.sum()\n\n        return {\n            \"max\": max_hist.tolist(),\n            \"target\": target_hist.tolist(),\n        }\n"
  },
  {
    "path": "corenet/metrics/psnr.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom typing import Any, Dict, Optional, Union\n\nimport torch\nfrom torch import Tensor\n\nfrom corenet.metrics import METRICS_REGISTRY\nfrom corenet.metrics.metric_base import AverageMetric\nfrom corenet.utils import logger\n\n\ndef compute_psnr(\n    prediction: Tensor, target: Tensor, no_uint8_conversion: Optional[bool] = False\n) -> Tensor:\n\n    if not no_uint8_conversion:\n        prediction = prediction.mul(255.0).to(torch.uint8)\n        target = target.mul(255.0).to(torch.uint8)\n        MAX_I = 255**2\n    else:\n        MAX_I = 1\n\n    error = torch.pow(prediction - target, 2).float()\n    mse = torch.mean(error) + 1e-10\n    psnr = 10.0 * torch.log10(MAX_I / mse)\n    return psnr\n\n\n@METRICS_REGISTRY.register(name=\"psnr\")\nclass PSNRMetric(AverageMetric):\n    def gather_metrics(\n        self,\n        prediction: Union[Tensor, Dict],\n        target: Union[Tensor, Dict],\n        extras: Dict[str, Any],\n    ) -> Union[Tensor, Dict[str, Tensor]]:\n        \"\"\"\n        This function gathers psnr scores from different processes and converts to float.\n        \"\"\"\n        # We have four combinations between prediction and target types:\n        # 1. (Tensor, Tensor)\n        # 2. (Dict, Tensor)\n        # 3. (Dict, Dict)\n        # 4. (Tensor, Dict) --> This combination is rare\n\n        if isinstance(prediction, Tensor) and isinstance(target, Tensor):\n            if prediction.numel() != target.numel():\n                logger.error(\n                    \"Prediction and target have different number of elements.\"\n                    \"Got: Prediction={} and target={}\".format(\n                        prediction.shape, target.shape\n                    )\n                )\n            psnr = compute_psnr(prediction=prediction, target=target)\n            return psnr\n        elif isinstance(prediction, Dict) and isinstance(target, Tensor):\n            psnr_dict = {}\n            for pred_k, pred_v in prediction.items():\n                # only compute PSNR where prediction size and target sizes are the same\n                if isinstance(pred_v, Tensor) and (pred_v.numel() == target.numel()):\n                    psnr = compute_psnr(prediction=pred_v, target=target)\n                    psnr_dict[pred_k] = psnr\n            return psnr_dict\n        elif isinstance(prediction, Dict) and isinstance(target, Dict):\n            # prediction and target dictionaries should have intersecting keys\n            prediction_keys = prediction.keys()\n            target_keys = target.keys()\n\n            intersection_keys = list(set(prediction_keys).intersection(target_keys))\n            if len(intersection_keys) == 0:\n                logger.error(\n                    \"The keys in prediction and target are different. \"\n                    \" Got: Prediction keys={} and Target keys={}\".format(\n                        prediction_keys, target_keys\n                    )\n                )\n\n            psnr_dict = {}\n            for pred_k in intersection_keys:\n                pred_v = prediction[pred_k]\n                target_v = target[pred_k]\n                # only compute PSNR where prediction size and target sizes are the same\n                if (\n                    isinstance(pred_v, Tensor)\n                    and isinstance(target_v, Tensor)\n                    and (pred_v.numel() == target_v.numel())\n                ):\n                    psnr = compute_psnr(prediction=pred_v, target=target_v)\n                    psnr_dict[pred_k] = psnr\n            return psnr_dict\n        elif isinstance(prediction, Tensor) and isinstance(target, Dict):\n            psnr_dict = {}\n            for target_k, target_v in target.items():\n                # only compute PSNR where prediction size and target sizes are the same\n                if isinstance(target_v, Tensor) and (\n                    prediction.numel() == target_v.numel()\n                ):\n                    psnr = compute_psnr(prediction=prediction, target=target_v)\n                    psnr_dict[target_k] = psnr\n            return psnr_dict\n        else:\n            logger.error(\"Metric monitor supports Tensor or Dict of Tensors\")\n"
  },
  {
    "path": "corenet/metrics/retrieval_cmc.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nimport copy\nfrom typing import Dict, Tuple\n\nimport numpy as np\nimport torch\nfrom sklearn.metrics import average_precision_score\nfrom torch.nn import functional as F\n\nfrom corenet.metrics import METRICS_REGISTRY\nfrom corenet.metrics.metric_base import EpochMetric\nfrom corenet.utils import logger\nfrom corenet.utils.ddp_utils import is_master\nfrom corenet.utils.registry import Registry\n\nDISTANCE_REGISTRY = Registry(\"distance_metrics\")\n\n\n@DISTANCE_REGISTRY.register(\"cosine\")\ndef cosine_distance_matrix(x: torch.Tensor, y: torch.Tensor) -> torch.Tensor:\n    \"\"\"Get pair-wise cosine distances.\n\n    Args:\n        x: A feature tensor with shape (n, d).\n        y: A feature tensor with shape (m, d).\n\n    Returns: Distance tensor between features x and y with shape (n, m).\n\n    \"\"\"\n    assert len(x.shape) == len(y.shape) == 2\n    assert x.shape[1] == y.shape[1]\n\n    cosine_sim = F.cosine_similarity(x.unsqueeze(-1), y.T.unsqueeze(0), dim=1)\n    assert cosine_sim.shape[0] == x.shape[0]\n    assert cosine_sim.shape[1] == y.shape[0]\n    assert len(cosine_sim.shape) == 2\n\n    return 1 - cosine_sim\n\n\n@DISTANCE_REGISTRY.register(\"l2\")\ndef l2_distance_matrix(x: torch.Tensor, y: torch.Tensor) -> torch.Tensor:\n    \"\"\"Get pair-wise l2 distances.\n\n    Args:\n        x: A torch feature tensor with shape (n, d).\n        y: A torch feature tensor with shape (m, d).\n\n    Returns: Distance tensor between features x and y with shape (n, m).\n\n    \"\"\"\n    assert len(x.shape) == len(y.shape) == 2\n    assert x.shape[1] == y.shape[1]\n\n    return torch.cdist(x, y, p=2)\n\n\n@METRICS_REGISTRY.register(name=\"retrieval_cmc\")\nclass RetrievalCMC(EpochMetric):\n    \"\"\"\n    Compute CMC-top-k and mAP metrics in retrieval setup.\n    \"\"\"\n\n    def __init__(\n        self,\n        opts: argparse.Namespace = None,\n        is_distributed: bool = False,\n        pred: str = \"embedding\",\n        target: str = None,\n        compute_map: bool = True,\n    ) -> None:\n        super().__init__(opts, is_distributed, pred, target)\n        distance_metric = getattr(opts, \"stats.metrics.retrieval_cmc.distance_metric\")\n        self.k = getattr(opts, \"stats.metrics.retrieval_cmc.k\")\n        self.subset_fraction = float(\n            getattr(opts, \"stats.metrics.retrieval_cmc.subset_fraction\")\n        )\n\n        self.compute_map = compute_map\n\n        self.get_distance_matrix = DISTANCE_REGISTRY[distance_metric]\n        self.embedding = []\n        self.label = []\n        self.is_master = is_master(opts)\n        if self.subset_fraction > 1.0:\n            logger.error(\n                \"Subset fraction should be a positive number smaller than 1.0.\"\n                f\" Got {self.subset_fraction}\"\n            )\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        \"\"\"Add metric specific arguments\"\"\"\n        if cls == RetrievalCMC:\n            parser.add_argument(\n                \"--stats.metrics.retrieval-cmc.subset-fraction\",\n                type=float,\n                default=1.0,\n                help=\"Use fraction of gallery set for CMC calculation when set.\"\n                \" Defaults to 1.0\",\n            )\n            parser.add_argument(\n                \"--stats.metrics.retrieval-cmc.k\",\n                type=int,\n                default=5,\n                help=\"CMC top-k: percentage of query images with at least one same-class\"\n                \" gallery image in their k-NN. Defaults to 5.\",\n            )\n            parser.add_argument(\n                \"--stats.metrics.retrieval-cmc.distance-metric\",\n                type=str,\n                default=\"l2\",\n                choices=[\"l2\", \"cosine\"],\n                help=\"Distance to use for nearest-neighbor calculation.\"\n                \" Defaults to l2\",\n            )\n\n        return parser\n\n    def compute_with_aggregates(\n        self, embedding: torch.Tensor, labels: torch.Tensor\n    ) -> Dict[str, float]:\n        \"\"\"Compute retrieval metrics over full epoch.\n\n        Args:\n            embedding: tensor of m embeddings with shape (m, d), where d is embedding dimension.\n            labels: tensor of m labels.\n\n        Returns: A dictionary of `top1`, `top-{k}` and `mAP`.\n\n        \"\"\"\n        # (Possibly) use a smaller subset\n        if self.subset_fraction < 1.0:\n            gallery_size = embedding.shape[0]\n            n_subset = int(self.subset_fraction * gallery_size)\n            mask = torch.randperm(embedding.shape[0])[:n_subset]\n            embedding = embedding[mask]\n            labels = labels[mask]\n\n        # Same embeddings are used for both gallery and query\n        distance_matrix = self.get_distance_matrix(embedding, embedding)\n\n        if self.is_master:\n            logger.log(\n                f\"Begin CMC calculation on embeddings with shape = {embedding.shape}.\"\n            )\n\n        top1, topk = cmc_calculation(\n            distance_matrix=distance_matrix,\n            query_ids=labels,\n            k=self.k,\n        )\n        top1 = float(top1)\n        topk = float(topk)\n\n        if self.compute_map:\n            retrieval_map = mean_ap(distance_matrix=distance_matrix, labels=labels)\n        else:\n            retrieval_map = 0\n\n        # Convert to percent and return\n        return {\n            \"top1\": 100 * top1,\n            f\"top{self.k}\": 100 * topk,\n            \"mAP\": 100 * retrieval_map,\n        }\n\n\ndef cmc_calculation(\n    distance_matrix: torch.Tensor,\n    query_ids: torch.Tensor,\n    k: int = 5,\n) -> Tuple[float, float]:\n    \"\"\"Compute Cumulative Matching Characteristics metric.\n\n    Args:\n        distance_matrix: pairwise distance matrix between embeddings of gallery and query sets\n        query_ids: labels for the query data (assuming the same as gallery)\n        k: parameter for top k retrieval\n\n    Returns: cmc-top1, cmc-top5\n\n    \"\"\"\n    distance_matrix = copy.deepcopy(distance_matrix)\n    query_ids = copy.deepcopy(query_ids)\n\n    distance_matrix.fill_diagonal_(float(\"inf\"))\n    _, indices = torch.sort(distance_matrix)\n    labels = query_ids.unsqueeze(dim=0).repeat(query_ids.shape[0], 1)\n    sorted_labels = torch.gather(labels, 1, indices)\n    top_1 = (sorted_labels[:, 0] == query_ids).sum() / query_ids.shape[0]\n    top_k = (sorted_labels[:, :k] == query_ids.unsqueeze(1)).sum(dim=1).clamp(\n        max=1\n    ).sum() / query_ids.shape[0]\n\n    return top_1, top_k\n\n\ndef mean_ap(\n    distance_matrix: torch.Tensor,\n    labels: torch.Tensor,\n) -> float:\n    \"\"\"Compute Mean Average Precision.\n\n    Args:\n        distance_matrix: pairwise distance matrix between embeddings of gallery and query sets, shape = (m,m)\n        labels: labels for the query data (assuming the same as gallery), shape = (m,)\n\n    Returns: mean average precision (float)\n\n    \"\"\"\n    m, n = distance_matrix.shape\n    assert m == n\n\n    # Sort and find correct matches\n    distance_matrix, gallery_matched_indices = torch.sort(distance_matrix, dim=1)\n    truth_mask = labels[gallery_matched_indices] == labels[:, None]\n\n    distance_matrix = distance_matrix.cpu().numpy()\n    gallery_matched_indices = gallery_matched_indices.cpu().numpy()\n    truth_mask = truth_mask.cpu().numpy()\n\n    # Compute average precision for each query\n    average_precisions = list()\n    for query_index in range(n):\n        valid_sorted_match_indices = (\n            gallery_matched_indices[query_index, :] != query_index\n        )\n        y_true = truth_mask[query_index, valid_sorted_match_indices]\n        y_score = -distance_matrix[query_index][valid_sorted_match_indices]\n        if not np.any(y_true):\n            continue  # if a query does not have any match, we exclude it from mAP calculation.\n        average_precisions.append(average_precision_score(y_true, y_score))\n    return np.mean(average_precisions)\n"
  },
  {
    "path": "corenet/metrics/stats.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nimport sys\nimport time\nimport traceback\nfrom numbers import Number\nfrom typing import Any, Dict, List, Optional, Union\n\nimport numpy as np\nimport torch\nfrom torch import Tensor\n\nfrom corenet.metrics import METRICS_REGISTRY\nfrom corenet.metrics.metric_base import BaseMetric\nfrom corenet.utils import logger\nfrom corenet.utils.object_utils import apply_recursively\n\n\nclass Statistics(object):\n    def __init__(\n        self,\n        opts: argparse.Namespace,\n        metric_names: list = [\"loss\"],\n        is_master_node: Optional[bool] = False,\n        is_distributed: Optional[bool] = False,\n        log_writers: Optional[List] = [],\n    ) -> None:\n        if len(metric_names) == 0:\n            logger.error(\"Metric names list cannot be empty\")\n\n        # key is the metric name and value is the value\n        self.metric_dict: Dict[str, BaseMetric] = {}\n        for m_name in metric_names:\n            if m_name in METRICS_REGISTRY:\n                self.metric_dict[m_name] = METRICS_REGISTRY[m_name](\n                    opts=opts, is_distributed=is_distributed\n                )\n            else:\n                if is_master_node:\n                    logger.log(\n                        \"{} statistics not supported. Supported: {}\".format(\n                            m_name, METRICS_REGISTRY.keys()\n                        )\n                    )\n\n        self.round_places = 4\n        self.is_master_node = is_master_node\n        self.log_writers = log_writers\n\n        self.batch_time = 0\n        self.batch_counter = 0\n\n    def update(\n        self,\n        pred_label: Union[Tensor, Dict],\n        target_label: Union[Tensor, Dict],\n        extras: Optional[Dict[str, Any]] = None,\n        batch_time: Optional[float] = 0.0,\n        batch_size: Optional[int] = 1,\n    ) -> None:\n        \"\"\"\n        Updates all the metrics after a batch.\n\n        :param pred_label: predictions coming from a model (must be a Tensor or a Dict of Tensors)\n        :param target_label: GT labels (Tensor or a Dict of Tensors)\n        :param extras: Optional Dict containing extra info, usually Loss and GradNorm\n                       e.g. {\"loss\": loss_value, \"grad_norm\": gradient_norm}\n        :param batch_time: Optional time it took to run through the batch\n        :param n: batch size (to be used in averaging the numbers correctly)\n        \"\"\"\n        for metric_name, metric in self.metric_dict.items():\n            try:\n                metric.update(\n                    prediction=pred_label,\n                    target=target_label,\n                    extras=extras,\n                    batch_size=batch_size,\n                )\n            except Exception as e:\n                traceback.print_exc()\n                logger.error(\n                    \"Caught an error while updating metric {}: {}\".format(\n                        metric_name, e\n                    )\n                )\n\n        self.batch_time += batch_time\n        self.batch_counter += 1\n\n    def _avg_statistics_all(self, sep=\": \", metrics=None) -> List[str]:\n        \"\"\"\n        This function computes average statistics of all metrics and returns them as a list of strings.\n\n        Examples:\n         loss: 12.9152\n         loss: {'total_loss': 12.9152, 'reg_loss': 2.8199, 'cls_loss': 10.0953}\n        \"\"\"\n        if metrics is None:\n            metrics = self._compute_avg_statistics_all()\n\n        return [\n            self.metric_dict[name].summary_string(name, sep, avg)\n            for name, avg in metrics.items()\n            if isinstance(avg, Number) or avg\n        ]\n\n    def _compute_avg_statistics_all(self) -> Dict[str, Union[float, Dict]]:\n        metric_stats = {}\n        for metric_name, metric in self.metric_dict.items():\n            value = metric.compute()\n            metric_stats[metric_name] = apply_recursively(\n                value, lambda x: round(x * 1.0, self.round_places)\n            )\n\n        return metric_stats\n\n    # TODO: change name: avg is presumptuous\n    def avg_statistics(\n        self, metric_name: str, sub_metric_name: Optional[str] = None, *args, **kwargs\n    ) -> float:\n        \"\"\"\n        This function computes the average statistics of a given metric.\n\n        .. note::\n        The statistics are stored in form of a dictionary and each key-value pair can be of string and number\n        OR string and dictionary of string and number.\n\n        Examples:\n             {'loss': 10.0, 'top-1': 50.0}\n             {'loss': {'total_loss': 10.0, 'cls_loss': 2.0, 'reg_loss': 8.0}, 'mAP': 5.0}\n\n        \"\"\"\n        if metric_name in self.metric_dict:\n            computed_metric = self.metric_dict[metric_name].compute()\n            computed_metric = apply_recursively(\n                computed_metric, lambda x: round(x * 1.0, self.round_places)\n            )\n\n            if isinstance(computed_metric, Dict):\n                if sub_metric_name is not None:\n                    if sub_metric_name in computed_metric:\n                        return computed_metric[sub_metric_name]\n                    else:\n                        logger.error(\n                            \"{} not present in the dictionary. Available keys are: {}\".format(\n                                sub_metric_name, list(computed_metric.keys())\n                            )\n                        )\n                else:\n                    return None\n\n            elif isinstance(computed_metric, Number):\n                return computed_metric\n            else:\n                return None\n\n        return None\n\n    def iter_summary(\n        self,\n        epoch: int,\n        n_processed_samples: int,\n        total_samples: int,\n        elapsed_time: float,\n        learning_rate: Union[float, list],\n    ) -> None:\n        if self.is_master_node:\n            metric_stats = self._avg_statistics_all()\n            el_time_str = \"Elapsed time: {:5.2f}\".format(time.time() - elapsed_time)\n            if isinstance(learning_rate, float):\n                lr_str = \"LR: {:1.6f}\".format(learning_rate)\n            else:\n                learning_rate = [round(lr, 6) for lr in learning_rate]\n                lr_str = \"LR: {}\".format(learning_rate)\n            epoch_str = \"Epoch: {:3d} [{:8d}/{:8d}]\".format(\n                epoch, n_processed_samples, total_samples\n            )\n            batch_str = \"Avg. batch load time: {:1.3f}\".format(\n                self.batch_time / self.batch_counter\n            )\n\n            stats_summary = [epoch_str]\n            stats_summary.extend(metric_stats)\n            stats_summary.append(lr_str)\n            stats_summary.append(batch_str)\n            stats_summary.append(el_time_str)\n\n            summary_str = \", \".join(stats_summary)\n            logger.log(summary_str)\n            sys.stdout.flush()\n\n    def epoch_summary(\n        self,\n        epoch: int,\n        stage: Optional[str] = \"Training\",\n        epoch_time: Optional[float] = None,\n    ) -> None:\n        if self.is_master_node:\n            metrics = self._compute_avg_statistics_all()\n            metric_stats = self._avg_statistics_all(sep=\"=\", metrics=metrics)\n            metric_stats_str = \" || \".join(metric_stats)\n            logger.log(\"*** {} summary for epoch {}\".format(stage.title(), epoch))\n            print(\"\\t {}\".format(metric_stats_str))\n            sys.stdout.flush()\n\n            # TODO: this step is only here for backward-compatibility. We can remove it as well\n            shortened_stage_map = {\n                \"training\": \"Train\",\n                \"validation\": \"Val\",\n                \"evaluation\": \"Eval\",\n                \"validation (EMA)\": \"Val_EMA\",\n            }\n            s_stage = shortened_stage_map.get(stage, stage)\n\n            for metric_name, metric in self.metric_dict.items():\n                values = metrics[metric_name]\n                for log_writer in self.log_writers:\n                    for scalar_name, scalar_value in metric.flatten_metric(\n                        values, metric_name\n                    ).items():\n                        if metric.is_epoch_summary_enabled_for_metric(\n                            scalar_name, log_writer\n                        ):\n                            log_writer.add_scalar(\n                                \"{}/{}\".format(s_stage, scalar_name.title()),\n                                scalar_value,\n                                epoch,\n                            )\n\n            if epoch_time is not None:\n                for log_writer in self.log_writers:\n                    log_writer.add_scalar(\n                        \"{}/{}\".format(s_stage, \"Epoch_Time\"),\n                        epoch_time,\n                        epoch,\n                    )\n"
  },
  {
    "path": "corenet/metrics/topk_accuracy.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom typing import Any, Dict, Optional, Union\n\nfrom torch import Tensor\n\nfrom corenet.metrics import METRICS_REGISTRY\nfrom corenet.metrics.metric_base import AverageMetric\nfrom corenet.utils import logger\n\n\ndef top_k_accuracy(\n    output: Tensor, target: Tensor, top_k: Optional[tuple] = (1,)\n) -> list:\n    maximum_k = max(top_k)\n    batch_size = target.shape[0]\n\n    _, pred = output.topk(maximum_k, 1, True, True)\n    pred = pred.t()\n    correct = pred.eq(target.reshape(1, -1).expand_as(pred))\n\n    results = []\n    for k in top_k:\n        correct_k = correct[:k].reshape(-1).float().sum(0, keepdim=True)\n        acc_k = correct_k.mul_(100.0 / batch_size)\n        results.append(acc_k)\n    return results\n\n\nclass TopKMetric(AverageMetric):\n    K = 1\n\n    def gather_metrics(\n        self,\n        prediction: Union[Tensor, Dict],\n        target: Union[Tensor, Dict],\n        extras: Dict[str, Any],\n    ) -> Union[Tensor, Dict[str, Tensor]]:\n        \"\"\"\n        This function gather top-k metrics from different processes and converts to float.\n        \"\"\"\n        # We have four combinations between prediction and target types:\n        # 1. (Tensor, Tensor)\n        # 2. (Dict, Tensor)\n        # 3. (Dict, Dict)\n        # 4. (Tensor, Dict) --> This combination is rare\n\n        if isinstance(prediction, Tensor) and isinstance(target, Tensor):\n            (top_k_acc,) = top_k_accuracy(prediction, target, top_k=(self.K,))\n            return top_k_acc\n        elif isinstance(prediction, Dict) and isinstance(target, Tensor):\n            top_k_dict = {}\n            for pred_k, pred_v in prediction.items():\n                if (\n                    isinstance(pred_v, Tensor)\n                    and pred_v.dim() == 2\n                    and target.dim() == 1\n                ):  # Output tensor should be of size [batch_size, num_classes] and target should be of shape [batch_size]\n                    (top_1_acc,) = top_k_accuracy(pred_v, target, top_k=(self.K,))\n                    top_k_dict[pred_k] = top_1_acc\n            return top_k_dict\n        elif isinstance(prediction, Dict) and isinstance(target, Dict):\n            # prediction and target dictionaries should have intersecting keys\n            prediction_keys = prediction.keys()\n            target_keys = target.keys()\n\n            intersection_keys = list(set(prediction_keys).intersection(target_keys))\n            if len(intersection_keys) == 0:\n                logger.error(\n                    \"The keys in prediction and target are different. \"\n                    \" Got: Prediction keys={} and Target keys={}\".format(\n                        prediction_keys, target_keys\n                    )\n                )\n\n            top_k_dict = {}\n            for pred_k in intersection_keys:\n                pred_v = prediction[pred_k]\n                target_v = target[pred_k]\n                if (\n                    isinstance(pred_v, Tensor)\n                    and isinstance(target_v, Tensor)\n                    and pred_v.dim() == 2\n                    and target_v.dim() == 1\n                ):  # Output tensor should be of size [batch_size, num_classes] and target should be of shape [batch_size]\n                    (top_1_acc,) = top_k_accuracy(pred_v, target_v, top_k=(self.K,))\n                    top_k_dict[pred_k] = top_1_acc\n            return top_k_dict\n        elif isinstance(prediction, Tensor) and isinstance(target, Dict):\n            # rare but possible\n            top_k_dict = {}\n            for target_k, target_v in target.items():\n                if (\n                    isinstance(target_v, Tensor)\n                    and prediction.dim() == 2\n                    and target_v.dim() == 1\n                ):  # Output tensor should be of size [batch_size, num_classes] and target should be of shape [batch_size]\n                    (top_1_acc,) = top_k_accuracy(prediction, target_v, top_k=(self.K,))\n                    top_k_dict[target_k] = top_1_acc\n            return top_k_dict\n        else:\n            logger.error(\"Metric monitor supports Tensor or Dict of Tensors\")\n\n\n@METRICS_REGISTRY.register(name=\"top1\")\nclass Top1Metric(TopKMetric):\n    K = 1\n\n\n@METRICS_REGISTRY.register(name=\"top5\")\nclass Top5Metric(TopKMetric):\n    K = 5\n"
  },
  {
    "path": "corenet/metrics/vqa_preset_score.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\"\"\"Preset score metric for VQA evaluation.\"\"\"\n\nfrom typing import Any, Dict, Union\n\nimport torch\nfrom torch import Tensor\nfrom torch.nn import functional as F\n\nfrom corenet.metrics import METRICS_REGISTRY\nfrom corenet.metrics.metric_base import AverageMetric\n\n\ndef vqa_preset_score_metric(output: Tensor, target: Tensor) -> list:\n    \"\"\"Sum the VQA preset scores for tasks with more than one ground-truth target.\n\n    Score metric is an alternative to the strict 0-1 accuracy metric in multi-class\n    classification that assigns non-zero score to partially correct answers. For\n    example, in the Visual-Question-Answering task the question \"How many cats are in\n    this picture?\" can have a correct answer '3' with score 1.0 and a partially correct\n    answer '2' with score 0.5. All other predicted answers get score 0.0 .\n\n    Arguments:\n        output: Prediction probabilities to be scored (batch_size, n_clasess).\n        target: Preset ground-truth score for predicted label per input\n          (batch_size, n_classes).\n\n    Returns:\n        A tensor of a single float as the average of score on the batch.\n    \"\"\"\n    batch_size = target.shape[0]\n    output = F.softmax(output, dim=-1)\n    _, pred = output.max(1, keepdim=True)  # (B, C)\n    score = torch.gather(target, 1, pred).sum()\n    score = score.mul_(100.0 / batch_size)\n    return score\n\n\n@METRICS_REGISTRY.register(name=\"vqa_preset_score\")\nclass VQAPresetScoreMetric(AverageMetric):\n    \"\"\"Metric class for VQA preset score.\"\"\"\n\n    def gather_metrics(\n        self,\n        prediction: Union[Tensor, Dict],\n        target: Union[Tensor, Dict],\n        extras: Dict[str, Any],\n    ) -> Tensor:\n        \"\"\"Gather VQA score metric for given set of predictions and targets.\n\n        This function accepts two combinations between prediction and target types:\n        1. (Tensor, Tensor)\n        2. (Dict, Tensor)\n\n        Args:\n            prediction: a tensor or a dictionary with `logits` as the key.\n            target: a tensor of the same shape as prediction.\n            extras: a dictionary with extra arguments. Not used in this class.\n\n        Returns:\n            A tensor of a single float as the average of score on the batch.\n        \"\"\"\n        if isinstance(prediction, Tensor) and isinstance(target, Tensor):\n            score = vqa_preset_score_metric(prediction, target)\n            return score\n        elif isinstance(prediction, Dict) and isinstance(target, Tensor):\n            pred_v = prediction[\"logits\"]\n            if isinstance(pred_v, Tensor) and pred_v.dim() == 2 and target.dim() == 2:\n                score = vqa_preset_score_metric(pred_v, target)\n            return score\n        else:\n            raise NotImplementedError(\n                f\"{self.__class__.__name__} only takes (Tensor, Tensor) or\"\n                \" (Dict, Tensor) as prediction and target.\"\n            )\n"
  },
  {
    "path": "corenet/modeling/__init__.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\n\nfrom corenet.modeling.anchor_generator import arguments_anchor_gen\nfrom corenet.modeling.image_projection_layers import arguments_image_projection_head\nfrom corenet.modeling.layers import arguments_nn_layers\nfrom corenet.modeling.matcher_det import arguments_box_matcher\nfrom corenet.modeling.misc.averaging_utils import EMA, arguments_ema\nfrom corenet.modeling.misc.common import parameter_list\nfrom corenet.modeling.models import arguments_model, get_model\nfrom corenet.modeling.models.detection import DetectionPredTuple\nfrom corenet.modeling.neural_augmentor import arguments_neural_augmentor\nfrom corenet.modeling.text_encoders import arguments_text_encoder\nfrom corenet.options.utils import extend_selected_args_with_prefix\n\n\ndef modeling_arguments(parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n    # text encoder arguments (usually for multi-modal tasks)\n    parser = arguments_text_encoder(parser)\n    # image projection head arguments (usually for multi-modal tasks)\n    parser = arguments_image_projection_head(parser)\n    # model arguments\n    parser = arguments_model(parser)\n    # neural network layer arguments\n    parser = arguments_nn_layers(parser)\n    # EMA arguments\n    parser = arguments_ema(parser)\n    # anchor generator arguments (for object detection)\n    parser = arguments_anchor_gen(parser)\n    # box matcher arguments (for object detection)\n    parser = arguments_box_matcher(parser)\n    # neural aug arguments\n    parser = arguments_neural_augmentor(parser)\n\n    # Add teacher as a prefix to enable distillation tasks\n    # keep it as the last entry\n    parser = extend_selected_args_with_prefix(\n        parser, match_prefix=\"--model.\", additional_prefix=\"--teacher.model.\"\n    )\n\n    return parser\n"
  },
  {
    "path": "corenet/modeling/anchor_generator/__init__.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\n\nfrom corenet.modeling.anchor_generator.base_anchor_generator import BaseAnchorGenerator\nfrom corenet.utils import logger\nfrom corenet.utils.registry import Registry\n\n# register anchor generator\nANCHOR_GEN_REGISTRY = Registry(\n    \"anchor_gen\",\n    base_class=BaseAnchorGenerator,\n    lazy_load_dirs=[\"corenet/modeling/anchor_generator\"],\n    internal_dirs=[\"corenet/internal\", \"corenet/internal/projects/*\"],\n)\n\n\ndef arguments_anchor_gen(parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n    \"\"\"Arguments related to anchor generator for object detection\"\"\"\n    group = parser.add_argument_group(\"Anchor generator\", \"Anchor generator\")\n    group.add_argument(\n        \"--anchor-generator.name\", type=str, help=\"Name of the anchor generator\"\n    )\n\n    # add class specific arguments\n    parser = ANCHOR_GEN_REGISTRY.all_arguments(parser)\n    return parser\n\n\ndef build_anchor_generator(opts, *args, **kwargs):\n    \"\"\"Build anchor generator for object detection\"\"\"\n    anchor_gen_name = getattr(opts, \"anchor_generator.name\")\n\n    # We registered the base class using a special `name` (i.e., `__base__`)\n    # in order to access the arguments defined inside those classes. However, these classes are not supposed to\n    # be used. Therefore, we raise an error for such cases\n    if anchor_gen_name == \"__base__\":\n        logger.error(\"__base__ can't be used as a projection name. Please check.\")\n\n    anchor_gen = ANCHOR_GEN_REGISTRY[anchor_gen_name](opts, *args, **kwargs)\n    return anchor_gen\n"
  },
  {
    "path": "corenet/modeling/anchor_generator/base_anchor_generator.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nfrom typing import Optional, Tuple, Union\n\nimport torch\nfrom torch import Tensor\n\n\nclass BaseAnchorGenerator(torch.nn.Module):\n    \"\"\"\n    Base class for anchor generators for the task of object detection.\n    \"\"\"\n\n    def __init__(self, *args, **kwargs) -> None:\n        super().__init__()\n        self.anchors_dict = dict()\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        \"\"\"\n        Add anchor generator-specific arguments to the parser\n        \"\"\"\n        return parser\n\n    def num_anchors_per_os(self):\n        \"\"\"Returns anchors per output stride. Child classes must implement this function.\"\"\"\n        raise NotImplementedError\n\n    @torch.no_grad()\n    def _generate_anchors(\n        self,\n        height: int,\n        width: int,\n        output_stride: int,\n        device: Optional[str] = \"cpu\",\n        *args,\n        **kwargs\n    ) -> Union[Tensor, Tuple[Tensor, ...]]:\n        raise NotImplementedError\n\n    @torch.no_grad()\n    def _get_anchors(\n        self,\n        fm_height: int,\n        fm_width: int,\n        fm_output_stride: int,\n        device: Optional[str] = \"cpu\",\n        *args,\n        **kwargs\n    ) -> Union[Tensor, Tuple[Tensor, ...]]:\n        key = \"h_{}_w_{}_os_{}\".format(fm_height, fm_width, fm_output_stride)\n        if key not in self.anchors_dict:\n            default_anchors_ctr = self._generate_anchors(\n                height=fm_height,\n                width=fm_width,\n                output_stride=fm_output_stride,\n                device=device,\n                *args,\n                **kwargs\n            )\n            self.anchors_dict[key] = default_anchors_ctr\n            return default_anchors_ctr\n        else:\n            return self.anchors_dict[key]\n\n    @torch.no_grad()\n    def forward(\n        self,\n        fm_height: int,\n        fm_width: int,\n        fm_output_stride: int,\n        device: Optional[str] = \"cpu\",\n        *args,\n        **kwargs\n    ) -> Union[Tensor, Tuple[Tensor, ...]]:\n        \"\"\"\n        Returns anchors for the feature map\n\n        Args:\n            fm_height (int): Height of the feature map\n            fm_width (int): Width of the feature map\n            fm_output_stride (int): Output stride of the feature map\n            device (Optional, str): Device (cpu or cuda). Defaults to cpu\n\n        Returns:\n            Tensor or Tuple of Tensors\n        \"\"\"\n        return self._get_anchors(\n            fm_height=fm_height,\n            fm_width=fm_width,\n            fm_output_stride=fm_output_stride,\n            device=device,\n            *args,\n            **kwargs\n        )\n"
  },
  {
    "path": "corenet/modeling/anchor_generator/ssd_anchor_generator.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nfrom itertools import product\nfrom typing import List, Optional\n\nimport numpy as np\nimport torch\nfrom torch import Tensor\n\nfrom corenet.modeling.anchor_generator import ANCHOR_GEN_REGISTRY, BaseAnchorGenerator\nfrom corenet.utils import logger\n\n\n@ANCHOR_GEN_REGISTRY.register(name=\"ssd\")\nclass SSDAnchorGenerator(BaseAnchorGenerator):\n    \"\"\"\n    This class generates anchors (or priors) ``on-the-fly`` for the\n    `single shot object detector (SSD) <https://arxiv.org/abs/1512.02325>`_.\n    \"\"\"\n\n    def __init__(self, opts, *args, **kwargs) -> None:\n        output_strides = getattr(\n            opts, \"anchor_generator.ssd.output_strides\", [32, 64, 128, 256, -1]\n        )\n        aspect_ratios = getattr(\n            opts, \"anchor_generator.ssd.aspect_ratios\", [[2, 3]] * len(output_strides)\n        )\n\n        min_ratio = getattr(opts, \"anchor_generator.ssd.min_scale_ratio\", 0.1)\n        max_ratio = getattr(opts, \"anchor_generator.ssd.max_scale_ratio\", 1.05)\n        no_clipping = getattr(opts, \"anchor_generator.ssd.no_clipping\", False)\n\n        step = getattr(opts, \"anchor_generator.ssd.step\", [1])\n        if isinstance(step, int):\n            step = [step] * len(output_strides)\n        elif isinstance(step, List) and len(step) <= len(output_strides):\n            step = step + [1] * (len(output_strides) - len(step))\n        else:\n            logger.error(\n                \"--anchor-generator.ssd.step should be either a list of ints with the same length as \"\n                \"the output strides OR an integer\"\n            )\n\n        super().__init__()\n        aspect_ratios = [list(set(ar)) for ar in aspect_ratios]\n        output_strides_aspect_ratio = dict()\n        for k, v in zip(output_strides, aspect_ratios):\n            output_strides_aspect_ratio[k] = v\n        self.output_strides_aspect_ratio = output_strides_aspect_ratio\n        self.output_strides = output_strides\n        self.anchors_dict = dict()\n\n        self.num_output_strides = len(output_strides)\n        self.num_aspect_ratios = len(aspect_ratios)\n\n        scales = np.linspace(min_ratio, max_ratio, len(output_strides) + 1)\n        self.sizes = dict()\n        for i, s in enumerate(output_strides):\n            self.sizes[s] = {\n                \"min\": scales[i],\n                \"max\": (scales[i] * scales[i + 1]) ** 0.5,\n                \"step\": step[i],\n            }\n\n        self.clip = not no_clipping\n        self.min_scale_ratio = min_ratio\n        self.max_scale_ratio = max_ratio\n        self.step = step\n\n    def __repr__(self):\n        return \"{}(min_scale_ratio={}, max_scale_ratio={}, n_output_strides={}, n_aspect_ratios={}, clipping={})\".format(\n            self.__class__.__name__,\n            self.min_scale_ratio,\n            self.max_scale_ratio,\n            self.num_output_strides,\n            self.num_aspect_ratios,\n            self.clip,\n        )\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        \"\"\"\n        Adds SSD anchor generator-specific arguments to the parser\n        \"\"\"\n        group = parser.add_argument_group(title=cls.__name__)\n        group.add_argument(\n            \"--anchor-generator.ssd.output-strides\",\n            nargs=\"+\",\n            type=int,\n            help=\"Output strides of the feature maps for which we want to generate anchors\",\n        )\n        group.add_argument(\n            \"--anchor-generator.ssd.aspect-ratios\",\n            nargs=\"+\",\n            type=float,\n            action=\"append\",\n            help=\"Aspect ratios at each output stride\",\n        )\n\n        # prior box arguments\n        # SSD sample priors between min and max box sizes.\n        # for example, if we use feature maps from three spatial levels (or output strides), then we\n        # sample width and height for anchor boxes as:\n        # scales = np.linspace(min_box_size, max_box_size, len(output_strides) + 1)\n        # min_box dimensions for the first feature map is scales[0] * feature_map_dimensions\n        # while the max_box dimensions will be sqrt(scales[0] * scales[1]) * feature_map dimensions. And so on\n        group.add_argument(\n            \"--anchor-generator.ssd.min-scale-ratio\",\n            type=float,\n            help=\"Min. scale ratio\",\n        )\n        group.add_argument(\n            \"--anchor-generator.ssd.max-scale-ratio\",\n            type=float,\n            help=\"Max. scale ratio\",\n        )\n        group.add_argument(\n            \"--anchor-generator.ssd.no-clipping\",\n            action=\"store_true\",\n            help=\"Don't clip the anchors\",\n        )\n        group.add_argument(\n            \"--anchor-generator.ssd.step\",\n            type=int,\n            default=[1],\n            nargs=\"+\",\n            help=\"Step between pixels\",\n        )\n        return parser\n\n    def num_anchors_per_os(self) -> List:\n        \"\"\"\n        Returns anchors per output stride for SSD\n        \"\"\"\n        return [2 + 2 * len(ar) for os, ar in self.output_strides_aspect_ratio.items()]\n\n    @torch.no_grad()\n    def _generate_anchors(\n        self,\n        height: int,\n        width: int,\n        output_stride: int,\n        device: Optional[str] = \"cpu\",\n        *args,\n        **kwargs\n    ) -> Tensor:\n        min_size_h = self.sizes[output_stride][\"min\"]\n        min_size_w = self.sizes[output_stride][\"min\"]\n\n        max_size_h = self.sizes[output_stride][\"max\"]\n        max_size_w = self.sizes[output_stride][\"max\"]\n        aspect_ratio = self.output_strides_aspect_ratio[output_stride]\n\n        step = max(1, self.sizes[output_stride][\"step\"])\n\n        default_anchors_ctr = []\n\n        start_step = max(0, step // 2)\n\n        # Note that feature maps are in NCHW format\n        for y, x in product(\n            range(start_step, height, step), range(start_step, width, step)\n        ):\n\n            # [x, y, w, h] format\n            cx = (x + 0.5) / width\n            cy = (y + 0.5) / height\n\n            # small box size\n            default_anchors_ctr.append([cx, cy, min_size_w, min_size_h])\n\n            # big box size\n            default_anchors_ctr.append([cx, cy, max_size_w, max_size_h])\n\n            # change h/w ratio of the small sized box based on aspect ratios\n            for ratio in aspect_ratio:\n                ratio = ratio**0.5\n                default_anchors_ctr.extend(\n                    [\n                        [cx, cy, min_size_w * ratio, min_size_h / ratio],\n                        [cx, cy, min_size_w / ratio, min_size_h * ratio],\n                    ]\n                )\n\n        default_anchors_ctr = torch.tensor(\n            default_anchors_ctr, dtype=torch.float, device=device\n        )\n        if self.clip:\n            default_anchors_ctr = torch.clamp(default_anchors_ctr, min=0.0, max=1.0)\n\n        return default_anchors_ctr\n"
  },
  {
    "path": "corenet/modeling/image_projection_layers/__init__.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\n\nimport argparse\n\nfrom corenet.modeling.image_projection_layers.base_image_projection import (\n    BaseImageProjectionHead,\n)\nfrom corenet.utils import logger\nfrom corenet.utils.registry import Registry\n\nIMAGE_PROJECTION_HEAD_REGISTRY = Registry(\n    \"image_projection_head\",\n    base_class=BaseImageProjectionHead,\n    lazy_load_dirs=[\"corenet/modeling/image_projection_layers\"],\n    internal_dirs=[\"corenet/internal\", \"corenet/internal/projects/*\"],\n)\n\n\ndef arguments_image_projection_head(\n    parser: argparse.ArgumentParser,\n) -> argparse.ArgumentParser:\n    \"\"\"Register arguments of all image projection heads.\"\"\"\n    # add arguments for base image projection layer\n    parser = BaseImageProjectionHead.add_arguments(parser)\n\n    # add class specific arguments\n    parser = IMAGE_PROJECTION_HEAD_REGISTRY.all_arguments(parser)\n    return parser\n\n\ndef build_image_projection_head(\n    opts: argparse.Namespace, in_dim: int, out_dim: int, *args, **kwargs\n) -> BaseImageProjectionHead:\n    \"\"\"Helper function to build an image projection head from command-line arguments.\n\n    Args:\n        opts: Command-line arguments\n        in_dim: Input dimension to the projection head.\n        out_dim: Output dimension of the projection head.\n\n    Returns:\n        Image projection head module.\n    \"\"\"\n\n    # Get the name of image projection head\n    image_projection_head_name = getattr(opts, \"model.image_projection_head.name\")\n\n    # We registered the base class using a special `name` (i.e., `__base__`)\n    # in order to access the arguments defined inside those classes. However, these classes are not supposed to\n    # be used. Therefore, we raise an error for such cases\n    if image_projection_head_name == \"__base__\":\n        logger.error(\"__base__ can't be used as a projection name. Please check.\")\n\n    image_projection_head = IMAGE_PROJECTION_HEAD_REGISTRY[image_projection_head_name](\n        opts, in_dim, out_dim, *args, **kwargs\n    )\n    return image_projection_head\n"
  },
  {
    "path": "corenet/modeling/image_projection_layers/attention_pool_2d.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\n\nimport torch\nfrom torch import Tensor, nn\nfrom torch.nn import functional as F\n\nfrom corenet.modeling.image_projection_layers import (\n    IMAGE_PROJECTION_HEAD_REGISTRY,\n    BaseImageProjectionHead,\n)\nfrom corenet.modeling.layers import MultiHeadAttention, PositionalEmbedding\nfrom corenet.utils import logger\n\n\n@IMAGE_PROJECTION_HEAD_REGISTRY.register(name=\"attention_pool_nchw2nc\")\nclass AttentionPool2dHead(BaseImageProjectionHead):\n    \"\"\"This class implements attention pooling layer, as\n    described in `Clip <https://arxiv.org/pdf/2103.00020.pdf>`_, and should be\n    used for CNN-style models, including MobileViTs\"\"\"\n\n    def __init__(self, opts, in_dim: int, out_dim: int, *args, **kwargs) -> None:\n        super().__init__(opts, *args, **kwargs)\n\n        num_embeddings = getattr(\n            opts,\n            \"model.image_projection_head.attention_pool_nchw2nc.num_pos_embeddings\",\n            None,\n        )\n        if num_embeddings is None:\n            logger.error(\n                \"Number of embeddings can't be None in {}. Please specify using \"\n                \"--model.image-projection.attention-pool-2d.num-pos-embeddings argument\".format(\n                    self.__class__.__name__\n                )\n            )\n        sin_pos_emb = getattr(\n            opts,\n            \"model.image_projection_head.attention_pool_nchw2nc.use_sinusoidal_pos_embeddings\",\n            False,\n        )\n        num_heads = getattr(\n            opts, \"model.image_projection_head.attention_pool_nchw2nc.num_attn_heads\", 8\n        )\n\n        self.use_pytorch_mha = getattr(\n            opts,\n            \"model.image_projection_head.attention_pool_nchw2nc.use_pytorch_mha\",\n            False,\n        )\n\n        self.positional_embedding = PositionalEmbedding(\n            opts,\n            num_embeddings=num_embeddings,\n            embedding_dim=in_dim,\n            padding_idx=None,\n            is_learnable=not sin_pos_emb,\n            sequence_first=self.use_pytorch_mha,\n        )\n        self.multi_head_attn = MultiHeadAttention(\n            embed_dim=in_dim, num_heads=num_heads, output_dim=out_dim\n        )\n\n        self.embed_dim = in_dim\n        self.projection_dim = out_dim if out_dim is not None else in_dim\n        self.sin_pos_emb = sin_pos_emb\n        self.normalize_features = not getattr(\n            opts,\n            \"model.image_projection_head.attention_pool_nchw2nc.no_feature_normalization\",\n            False,\n        )\n\n        self.reset_parameters()\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser):\n        group = parser.add_argument_group(title=cls.__name__)\n        group.add_argument(\n            \"--model.image-projection-head.attention-pool-nchw2nc.num-pos-embeddings\",\n            type=int,\n            default=None,\n            help=\"Number of positional embeddings\",\n        )\n\n        group.add_argument(\n            \"--model.image-projection-head.attention-pool-nchw2nc.use-sinusoidal-pos-embeddings\",\n            action=\"store_true\",\n            help=\"Use sinusoidal positional embeddings instead of learnable\",\n        )\n\n        group.add_argument(\n            \"--model.image-projection-head.attention-pool-nchw2nc.num-attn-heads\",\n            type=int,\n            default=8,\n            help=\"Number of attention heads in {}\".format(cls.__name__),\n        )\n\n        group.add_argument(\n            \"--model.image-projection-head.attention-pool-nchw2nc.no-feature-normalization\",\n            action=\"store_true\",\n            help=\"Don't normalize image features\",\n        )\n\n        group.add_argument(\n            \"--model.image-projection-head.attention-pool-nchw2nc.use-pytorch-mha\",\n            action=\"store_true\",\n            help=\"Use Pytorch Multi-head attention\",\n        )\n\n        return parser\n\n    def reset_parameters(self):\n        std = self.projection_dim**-0.5\n        nn.init.normal_(self.multi_head_attn.qkv_proj.weight, mean=0.0, std=std)\n        nn.init.normal_(self.multi_head_attn.out_proj.weight, mean=0.0, std=std)\n\n    def forward(self, x: Tensor, *args, **kwargs) -> Tensor:\n\n        assert (\n            x.dim() == 4\n        ), \"Input should be 4-dimensional (Batch, in_channels, height, width). Got: {}\".format(\n            x.shape\n        )\n        # x is [batch, in_channels, height, width]\n        # For CNN-style architectures, including MobileViTs\n        batch_size, in_channels, in_height, in_width = x.shape\n\n        # Flatten the feature map\n        # [batch, in_channels, height, width] --> [batch, in_channels, height*width]\n        x = x.reshape(batch_size, in_channels, in_height * in_width)\n\n        if self.use_pytorch_mha:\n            # we need sequence first.\n            # [batch, in_channels, height*width] --> [height*width, batch, in_channels]\n            x = x.permute(2, 0, 1)\n\n            # global pool\n            # [height*width, batch, in_channels] --> [1, batch, in_channels]\n            global_token = torch.mean(x, dim=0, keepdim=True)\n\n            num_pixels = x.shape[0]\n\n            # add positional embedding to pixels\n            pos_emb = self.positional_embedding(num_pixels).to(\n                device=x.device, dtype=x.dtype\n            )\n            x = x + pos_emb\n\n            # concat the global token with pixel tokens\n            # [1, batch, in_channels] || [height*width, batch, in_channels] --> [1 + height*width, batch, in_channels]\n            x = torch.cat([global_token, x], dim=0)\n\n            # do attention\n            x = self.multi_head_attn(x, use_pytorch_mha=True)\n\n            # extract embeddings corresponding to global token\n            x = x[0]\n        else:\n            # [batch, in_channels, height*width] --> # [batch, height*width, in_channels]\n            x = x.transpose(1, 2)\n\n            # global pool\n            # [batch, height*width, in_channels] --> [batch, 1, in_channels]\n            global_token = torch.mean(x, dim=1, keepdim=True)\n\n            num_pixels = x.shape[1]\n            # add positional embedding to pixels\n            pos_emb = self.positional_embedding(num_pixels).to(\n                device=x.device, dtype=x.dtype\n            )\n            x = x + pos_emb\n\n            # concat the global token with pixel tokens\n            # [batch, 1, in_channels] || [batch, height*width, in_channels] --> [batch, 1 + height*width, in_channels]\n            x = torch.cat([global_token, x], dim=1)\n\n            # do attention\n            x = self.multi_head_attn(x, use_pytorch_mha=False)\n\n            # extract embeddings corresponding to global token\n            x = x[:, 0]\n\n        if self.normalize_features:\n            x = F.normalize(x, dim=-1)\n        return x\n"
  },
  {
    "path": "corenet/modeling/image_projection_layers/base_image_projection.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nfrom typing import Dict, Optional\n\nfrom torch import nn\n\nfrom corenet.modeling.layers import LinearLayer\nfrom corenet.modeling.misc.common import parameter_list\n\n\nclass BaseImageProjectionHead(nn.Module):\n    \"\"\"Base class that projects image representations to the same space as text representations\"\"\"\n\n    def __init__(self, opts, *args, **kwargs) -> None:\n        super().__init__()\n\n        self.lr_mult = getattr(opts, \"model.image_projection_head.lr_multiplier\", 1.0)\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser):\n        \"\"\"Add model specific arguments\"\"\"\n        group = parser.add_argument_group(title=cls.__name__)\n\n        group.add_argument(\n            \"--model.image-projection-head.name\",\n            type=str,\n            default=None,\n            help=\"Name of the image projection head\",\n        )\n\n        group.add_argument(\n            \"--model.image-projection-head.lr-multiplier\",\n            type=float,\n            default=1.0,\n            help=\"LR multiplier for image projection head\",\n        )\n\n        return parser\n\n    def reset_parameters(self) -> None:\n        \"\"\"Reset weights of a given layer\"\"\"\n        raise NotImplementedError\n\n    def get_trainable_parameters(\n        self,\n        weight_decay: Optional[float] = 0.0,\n        no_decay_bn_filter_bias: Optional[bool] = False,\n        *args,\n        **kwargs,\n    ):\n        param_list = parameter_list(\n            named_parameters=self.named_parameters,\n            weight_decay=weight_decay,\n            no_decay_bn_filter_bias=no_decay_bn_filter_bias,\n        )\n        return param_list, [self.lr_mult] * len(param_list)\n\n    def forward(self, input: Dict, *args, **kwargs) -> Dict:\n        raise NotImplementedError\n\n\ndef get_in_feature_dimension(image_classifier: nn.Module) -> int:\n    \"\"\"Return the input feature dimension to the image classification head.\"\"\"\n    in_features = None\n    if isinstance(image_classifier, nn.Sequential):\n        # Classifier that uses nn.Sequential usually has global pooling and\n        # multiple linear layers. Find the first linear layer and get its\n        # in_features\n        for layer in image_classifier:\n            if isinstance(layer, (nn.Linear, LinearLayer)):\n                in_features = layer.in_features\n                break\n    elif isinstance(image_classifier, (nn.Linear, LinearLayer)):\n        in_features = image_classifier.in_features\n\n    if in_features is None:\n        raise NotImplementedError(\n            f\"Cannot get input feature dimension of {image_classifier}.\"\n        )\n\n    return in_features\n"
  },
  {
    "path": "corenet/modeling/image_projection_layers/global_pool_2d.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\n\nimport torch\nfrom torch import Tensor, nn\nfrom torch.nn import functional as F\n\nfrom corenet.modeling.image_projection_layers import (\n    IMAGE_PROJECTION_HEAD_REGISTRY,\n    BaseImageProjectionHead,\n)\nfrom corenet.modeling.layers import GlobalPool\nfrom corenet.utils import logger\nfrom corenet.utils.ddp_utils import is_master\n\n\n@IMAGE_PROJECTION_HEAD_REGISTRY.register(name=\"global_pool_nchw2nc\")\nclass GlobalPool2D(BaseImageProjectionHead):\n    \"\"\"This class implements global pooling with linear projection\"\"\"\n\n    def __init__(self, opts, in_dim: int, out_dim: int, *args, **kwargs) -> None:\n        super().__init__(opts, *args, **kwargs)\n\n        scale = in_dim**-0.5\n        self.use_identity = (\n            getattr(\n                opts,\n                \"model.image_projection_head.global_pool_nchw2nc.identity_if_same_size\",\n            )\n            and in_dim == out_dim\n        )\n        self.pool = GlobalPool(pool_type=\"mean\", keep_dim=False)\n        if not self.use_identity:\n            self.proj = nn.Parameter(scale * torch.randn(size=(in_dim, out_dim)))\n        else:\n            if is_master(opts):\n                logger.log(\n                    f\"Using identity projection for GlobalPool2D given input/out size = {in_dim}.\"\n                )\n        self.in_dim = in_dim\n        self.out_dim = out_dim\n\n        self.feature_normalization = not getattr(\n            opts,\n            \"model.image_projection_head.global_pool_nchw2nc.no_feature_normalization\",\n        )\n\n        self.reset_parameters()\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        group = parser.add_argument_group(title=cls.__name__)\n\n        group.add_argument(\n            \"--model.image-projection-head.global-pool-nchw2nc.no-feature-normalization\",\n            action=\"store_true\",\n            help=\"Don't normalize image features. Defaults to False.\",\n        )\n\n        group.add_argument(\n            \"--model.image-projection-head.global-pool-nchw2nc.identity-if-same-size\",\n            action=\"store_true\",\n            help=\"Use identity projection when projection input/output dims\"\n            \" are the same. Defaults to False.\",\n        )\n\n        return parser\n\n    def reset_parameters(self):\n        pass\n\n    def forward(self, x: Tensor, *args, **kwargs) -> Tensor:\n        # x is of shape [batch, in_dim]\n        assert (\n            x.dim() == 4\n        ), \"Input should be 4-dimensional (Batch x in_dim x in_height x in_width). Got: {}\".format(\n            x.shape\n        )\n\n        # [batch, in_dim, in_height, in_width] --> [batch, in_dim]\n        x = self.pool(x)\n        # [batch, in_dim]  x [in_dim, out_dim] --> [batch, out_dim]\n        if not self.use_identity:\n            x = x @ self.proj\n        if self.feature_normalization:\n            x = F.normalize(x, dim=-1)\n        return x\n"
  },
  {
    "path": "corenet/modeling/image_projection_layers/simple_projection_head.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\n\nimport torch\nfrom torch import Tensor, nn\nfrom torch.nn import functional as F\n\nfrom corenet.modeling.image_projection_layers import (\n    IMAGE_PROJECTION_HEAD_REGISTRY,\n    BaseImageProjectionHead,\n)\nfrom corenet.utils import logger\nfrom corenet.utils.ddp_utils import is_master\n\n\n@IMAGE_PROJECTION_HEAD_REGISTRY.register(name=\"simple_projection_nc2nc\")\nclass SimpleImageProjectionHead(BaseImageProjectionHead):\n    \"\"\"This class implements simple projection head\"\"\"\n\n    def __init__(self, opts, in_dim: int, out_dim: int, *args, **kwargs) -> None:\n        super().__init__(opts, *args, **kwargs)\n\n        scale = in_dim**-0.5\n        self.use_identity = (\n            getattr(\n                opts,\n                \"model.image_projection_head.simple_projection_nc2nc.identity_if_same_size\",\n            )\n            and in_dim == out_dim\n        )\n        if not self.use_identity:\n            self.proj = nn.Parameter(scale * torch.randn(size=(in_dim, out_dim)))\n        else:\n            if is_master(opts):\n                logger.log(\n                    f\"Using identity projection for SimpleImageProjectionHead given input/out size = {in_dim}.\"\n                )\n        self.in_dim = in_dim\n        self.out_dim = out_dim\n\n        self.feature_normalization = not getattr(\n            opts,\n            \"model.image_projection_head.simple_projection_nc2nc.no_feature_normalization\",\n        )\n\n        self.reset_parameters()\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        group = parser.add_argument_group(title=cls.__name__)\n\n        group.add_argument(\n            \"--model.image-projection-head.simple-projection-nc2nc.no-feature-normalization\",\n            action=\"store_true\",\n            help=\"Don't normalize image features. Defaults to False.\",\n        )\n\n        group.add_argument(\n            \"--model.image-projection-head.simple-projection-nc2nc.identity-if-same-size\",\n            action=\"store_true\",\n            help=\"Use identity projection when projection input/output dims\"\n            \" are the same. Defaults to False\",\n        )\n\n        return parser\n\n    def reset_parameters(self):\n        pass\n\n    def forward(self, x: Tensor, *args, **kwargs) -> Tensor:\n        # x is of shape [batch, in_dim]\n        assert (\n            x.dim() == 2\n        ), \"Input should be 2-dimensional (Batch x in_dim). Got: {}\".format(x.shape)\n\n        if not self.use_identity:\n            # [batch, in_dim] x [in_dim, out_dim] --> [batch, out_dim]\n            x = x @ self.proj\n        if self.feature_normalization:\n            x = F.normalize(x, dim=-1)\n        return x\n"
  },
  {
    "path": "corenet/modeling/layers/__init__.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nimport importlib\nimport inspect\nimport os\n\nfrom corenet.modeling.layers.adaptive_pool import AdaptiveAvgPool2d\nfrom corenet.modeling.layers.base_layer import BaseLayer\nfrom corenet.modeling.layers.conv_layer import (\n    ConvLayer1d,\n    ConvLayer2d,\n    ConvLayer3d,\n    NormActLayer,\n    SeparableConv1d,\n    SeparableConv2d,\n    SeparableConv3d,\n    TransposeConvLayer2d,\n)\nfrom corenet.modeling.layers.dropout import Dropout, Dropout2d\nfrom corenet.modeling.layers.embedding import Embedding\nfrom corenet.modeling.layers.flash_multi_head_attention import (\n    FlashMultiHeadSelfAttention,\n)\nfrom corenet.modeling.layers.flatten import Flatten\nfrom corenet.modeling.layers.global_pool import GlobalPool\nfrom corenet.modeling.layers.identity import Identity\nfrom corenet.modeling.layers.linear_attention import LinearSelfAttention\nfrom corenet.modeling.layers.linear_layer import GroupLinear, LinearLayer\nfrom corenet.modeling.layers.multi_head_attention import MultiHeadAttention\nfrom corenet.modeling.layers.normalization_layers import (\n    get_normalization_layer,\n    norm_layers_tuple,\n)\nfrom corenet.modeling.layers.pixel_shuffle import PixelShuffle\nfrom corenet.modeling.layers.pooling import AvgPool2d, MaxPool2d\nfrom corenet.modeling.layers.positional_embedding import PositionalEmbedding\nfrom corenet.modeling.layers.rotary_embeddings import RotaryEmbedding\nfrom corenet.modeling.layers.single_head_attention import SingleHeadAttention\nfrom corenet.modeling.layers.softmax import Softmax\nfrom corenet.modeling.layers.stochastic_depth import StochasticDepth\nfrom corenet.modeling.layers.upsample import UpSample\n\n__all__ = [\n    \"ConvLayer1d\",\n    \"ConvLayer2d\",\n    \"ConvLayer3d\",\n    \"SeparableConv1d\",\n    \"SeparableConv2d\",\n    \"SeparableConv3d\",\n    \"NormActLayer\",\n    \"TransposeConvLayer2d\",\n    \"LinearLayer\",\n    \"GroupLinear\",\n    \"GlobalPool\",\n    \"Identity\",\n    \"PixelShuffle\",\n    \"UpSample\",\n    \"MaxPool2d\",\n    \"AvgPool2d\",\n    \"Dropout\",\n    \"Dropout2d\",\n    \"Flatten\",\n    \"MultiHeadAttention\",\n    \"SingleHeadAttention\",\n    \"Softmax\",\n    \"LinearSelfAttention\",\n    \"Embedding\",\n    \"PositionalEmbedding\",\n    \"norm_layers_tuple\",\n    \"StochasticDepth\",\n    \"get_normalization_layer\",\n    \"RotaryEmbedding\",\n    \"FlashMultiHeadSelfAttention\",\n]\n\n\n# iterate through all classes and fetch layer specific arguments\ndef layer_specific_args(parser: argparse.ArgumentParser):\n    layer_dir = os.path.dirname(__file__)\n    parsed_layers = []\n    for file in os.listdir(layer_dir):\n        path = os.path.join(layer_dir, file)\n        if (\n            not file.startswith(\"_\")\n            and not file.startswith(\".\")\n            and (file.endswith(\".py\") or os.path.isdir(path))\n        ):\n            layer_name = file[: file.find(\".py\")] if file.endswith(\".py\") else file\n            module = importlib.import_module(\"corenet.modeling.layers.\" + layer_name)\n            for name, cls in inspect.getmembers(module, inspect.isclass):\n                if issubclass(cls, BaseLayer) and name not in parsed_layers:\n                    parser = cls.add_arguments(parser)\n                    parsed_layers.append(name)\n    return parser\n\n\ndef arguments_nn_layers(parser: argparse.ArgumentParser):\n    # Retrieve layer specific arguments\n    parser = layer_specific_args(parser)\n\n    # activation and normalization arguments\n    from corenet.modeling.layers.activation import arguments_activation_fn\n\n    parser = arguments_activation_fn(parser)\n\n    from corenet.modeling.layers.normalization import arguments_norm_layers\n\n    parser = arguments_norm_layers(parser)\n\n    return parser\n"
  },
  {
    "path": "corenet/modeling/layers/activation/__init__.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nimport importlib\nimport os\nfrom typing import Optional\n\nimport torch.nn\n\nfrom corenet.utils import logger\n\nSUPPORTED_ACT_FNS = []\nACT_FN_REGISTRY = {}\n\n\ndef register_act_fn(name):\n    def register_fn(cls):\n        if name in SUPPORTED_ACT_FNS:\n            raise ValueError(\n                \"Cannot register duplicate activation function ({})\".format(name)\n            )\n        SUPPORTED_ACT_FNS.append(name)\n        ACT_FN_REGISTRY[name] = cls\n        return cls\n\n    return register_fn\n\n\ndef arguments_activation_fn(parser: argparse.ArgumentParser):\n    group = parser.add_argument_group(\n        title=\"Non-linear functions\", description=\"Non-linear functions\"\n    )\n\n    group.add_argument(\n        \"--model.activation.name\",\n        default=\"relu\",\n        type=str,\n        help=\"Non-linear function name\",\n    )\n    group.add_argument(\n        \"--model.activation.inplace\",\n        action=\"store_true\",\n        help=\"Use non-linear functions inplace\",\n    )\n    group.add_argument(\n        \"--model.activation.neg-slope\",\n        default=0.1,\n        type=float,\n        help=\"Negative slope in leaky relu function\",\n    )\n\n    return parser\n\n\ndef build_activation_layer(\n    opts: argparse.Namespace,\n    act_type: Optional[str] = None,\n    inplace: Optional[bool] = None,\n    negative_slope: Optional[float] = None,\n    num_parameters: int = -1,\n) -> torch.nn.Module:\n    \"\"\"\n    Helper function to build the activation function. If any of the optional\n    arguments are not provided (i.e. None), the corresponding ``model.activation.*``\n    config entry will be used as default value.\n\n    Args:\n        act_type: Name of the activation layer.\n            Default: --model.activation.name config value.\n        inplace: If true, operation will be inplace.\n            Default: --model.activation.inplace config value.\n        negative_slope: Negative slope parameter for leaky_relu.\n            Default: --model.activation.neg_slop config value.\n    \"\"\"\n    assert isinstance(\n        opts, argparse.Namespace\n    ), f\"Expected first argument to be an argparse.Namespace, but received a {type(opts)}.\"\n    if act_type is None:\n        act_type = getattr(opts, \"model.activation.name\")\n    if inplace is None:\n        inplace = getattr(opts, \"model.activation.inplace\")\n    if negative_slope is None:\n        negative_slope = getattr(opts, \"model.activation.neg_slope\")\n\n    act_type = act_type.lower()\n    act_layer = None\n    if act_type in ACT_FN_REGISTRY:\n        act_layer = ACT_FN_REGISTRY[act_type](\n            num_parameters=num_parameters,\n            inplace=inplace,\n            negative_slope=negative_slope,\n        )\n    else:\n        logger.error(\n            \"Supported activation layers are: {}. Supplied argument is: {}\".format(\n                SUPPORTED_ACT_FNS, act_type\n            )\n        )\n    return act_layer\n\n\n# automatically import different activation functions\nact_dir = os.path.dirname(__file__)\nfor file in os.listdir(act_dir):\n    path = os.path.join(act_dir, file)\n    if (\n        not file.startswith(\"_\")\n        and not file.startswith(\".\")\n        and (file.endswith(\".py\") or os.path.isdir(path))\n    ):\n        model_name = file[: file.find(\".py\")] if file.endswith(\".py\") else file\n        module = importlib.import_module(\n            \"corenet.modeling.layers.activation.\" + model_name\n        )\n"
  },
  {
    "path": "corenet/modeling/layers/activation/gelu.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom torch import Tensor, nn\n\nfrom corenet.modeling.layers.activation import register_act_fn\n\n\n@register_act_fn(name=\"gelu\")\nclass GELU(nn.GELU):\n    \"\"\"\n    Applies the `Gaussian Error Linear Units <https://arxiv.org/abs/1606.08415>`_ function\n    \"\"\"\n\n    def __init__(self, *args, **kwargs) -> None:\n        super().__init__()\n"
  },
  {
    "path": "corenet/modeling/layers/activation/hard_sigmoid.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom typing import Optional\n\nfrom torch import Tensor, nn\nfrom torch.nn import functional as F\n\nfrom corenet.modeling.layers.activation import register_act_fn\n\n\n@register_act_fn(name=\"hard_sigmoid\")\nclass Hardsigmoid(nn.Hardsigmoid):\n    \"\"\"\n    Applies the `Hard Sigmoid <https://arxiv.org/abs/1511.00363v3>`_ function\n    \"\"\"\n\n    def __init__(self, inplace: Optional[bool] = False, *args, **kwargs) -> None:\n        super().__init__(inplace=inplace)\n\n    def forward(self, input: Tensor, *args, **kwargs) -> Tensor:\n        if hasattr(F, \"hardsigmoid\"):\n            return F.hardsigmoid(input, self.inplace)\n        else:\n            return F.relu(input + 3) / 6\n"
  },
  {
    "path": "corenet/modeling/layers/activation/hard_swish.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom typing import Optional\n\nfrom torch import Tensor, nn\nfrom torch.nn import functional as F\n\nfrom corenet.modeling.layers.activation import register_act_fn\n\n\n@register_act_fn(name=\"hard_swish\")\nclass Hardswish(nn.Hardswish):\n    \"\"\"\n    Applies the HardSwish function, as described in the paper\n    `Searching for MobileNetv3 <https://arxiv.org/abs/1905.02244>`_\n    \"\"\"\n\n    def __init__(self, inplace: Optional[bool] = False, *args, **kwargs) -> None:\n        super().__init__(inplace=inplace)\n\n    def forward(self, input: Tensor, *args, **kwargs) -> Tensor:\n        if hasattr(F, \"hardswish\"):\n            return F.hardswish(input, self.inplace)\n        else:\n            x_hard_sig = F.relu(input + 3) / 6\n            return input * x_hard_sig\n"
  },
  {
    "path": "corenet/modeling/layers/activation/leaky_relu.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom typing import Optional\n\nfrom torch import Tensor, nn\n\nfrom corenet.modeling.layers.activation import register_act_fn\n\n\n@register_act_fn(name=\"leaky_relu\")\nclass LeakyReLU(nn.LeakyReLU):\n    \"\"\"\n    Applies a leaky relu function. See `Rectifier Nonlinearities Improve Neural Network Acoustic Models`\n    for more details.\n    \"\"\"\n\n    def __init__(\n        self,\n        negative_slope: Optional[float] = 1e-2,\n        inplace: Optional[bool] = False,\n        *args,\n        **kwargs\n    ) -> None:\n        super().__init__(negative_slope=negative_slope, inplace=inplace)\n"
  },
  {
    "path": "corenet/modeling/layers/activation/prelu.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom typing import Optional\n\nfrom torch import Tensor, nn\n\nfrom corenet.modeling.layers.activation import register_act_fn\n\n\n@register_act_fn(name=\"prelu\")\nclass PReLU(nn.PReLU):\n    \"\"\"\n    Applies the `Parametric Rectified Linear Unit <https://arxiv.org/abs/1502.01852>`_ function\n    \"\"\"\n\n    def __init__(\n        self,\n        num_parameters: Optional[int] = 1,\n        init: Optional[float] = 0.25,\n        *args,\n        **kwargs\n    ) -> None:\n        super().__init__(num_parameters=num_parameters, init=init)\n"
  },
  {
    "path": "corenet/modeling/layers/activation/relu.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom typing import Optional\n\nfrom torch import Tensor, nn\n\nfrom corenet.modeling.layers.activation import register_act_fn\n\n\n@register_act_fn(name=\"relu\")\nclass ReLU(nn.ReLU):\n    \"\"\"\n    Applies Rectified Linear Unit function\n    \"\"\"\n\n    def __init__(self, inplace: Optional[bool] = False, *args, **kwargs) -> None:\n        super().__init__(inplace=inplace)\n"
  },
  {
    "path": "corenet/modeling/layers/activation/relu6.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom typing import Optional\n\nfrom torch import Tensor, nn\n\nfrom corenet.modeling.layers.activation import register_act_fn\n\n\n@register_act_fn(name=\"relu6\")\nclass ReLU6(nn.ReLU6):\n    \"\"\"\n    Applies the ReLU6 function\n    \"\"\"\n\n    def __init__(self, inplace: Optional[bool] = False, *args, **kwargs) -> None:\n        super().__init__(inplace=inplace)\n"
  },
  {
    "path": "corenet/modeling/layers/activation/sigmoid.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom torch import Tensor, nn\n\nfrom corenet.modeling.layers.activation import register_act_fn\n\n\n@register_act_fn(name=\"sigmoid\")\nclass Sigmoid(nn.Sigmoid):\n    \"\"\"\n    Applies the sigmoid function\n    \"\"\"\n\n    def __init__(self, *args, **kwargs) -> None:\n        super().__init__()\n"
  },
  {
    "path": "corenet/modeling/layers/activation/swish.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom typing import Optional\n\nfrom torch import Tensor, nn\n\nfrom corenet.modeling.layers.activation import register_act_fn\n\n\n@register_act_fn(name=\"swish\")\nclass Swish(nn.SiLU):\n    \"\"\"\n    Applies the `Swish (also known as SiLU) <https://arxiv.org/abs/1702.03118>`_ function.\n    \"\"\"\n\n    def __init__(self, inplace: Optional[bool] = False, *args, **kwargs) -> None:\n        super().__init__(inplace=inplace)\n"
  },
  {
    "path": "corenet/modeling/layers/activation/tanh.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom torch import Tensor, nn\n\nfrom corenet.modeling.layers.activation import register_act_fn\n\n\n@register_act_fn(name=\"tanh\")\nclass Tanh(nn.Tanh):\n    \"\"\"\n    Applies Tanh function\n    \"\"\"\n\n    def __init__(self, *args, **kwargs) -> None:\n        super().__init__()\n"
  },
  {
    "path": "corenet/modeling/layers/adaptive_pool.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom typing import Tuple, Union\n\nfrom torch import Tensor, nn\n\n\nclass AdaptiveAvgPool2d(nn.AdaptiveAvgPool2d):\n    \"\"\"\n    Applies a 2D adaptive average pooling over an input tensor.\n\n    Args:\n        output_size (Optional, int or Tuple[int, int]): The target output size. If a single int :math:`h` is passed,\n        then a square output of size :math:`hxh` is produced. If a tuple of size :math:`hxw` is passed, then an\n        output of size `hxw` is produced. Default is 1.\n    Shape:\n        - Input: :math:`(N, C, H, W)` where :math:`N` is the batch size, :math:`C` is the number of input channels,\n        :math:`H` is the input height, and :math:`W` is the input width\n        - Output: :math:`(N, C, h, h)` or :math:`(N, C, h, w)`\n    \"\"\"\n\n    def __init__(\n        self, output_size: Union[int, Tuple[int, int]] = 1, *args, **kwargs\n    ) -> None:\n        super().__init__(output_size=output_size)\n"
  },
  {
    "path": "corenet/modeling/layers/base_layer.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nfrom typing import Any, Dict, List, Optional, Tuple\n\nfrom torch import nn\n\nfrom corenet.modeling.misc.common import parameter_list\n\n\nclass BaseLayer(nn.Module):\n    \"\"\"\n    Base class for neural network layers. Subclass must implement `forward` function.\n    \"\"\"\n\n    def __init__(self, *args, **kwargs) -> None:\n        super().__init__()\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        \"\"\"Add layer specific arguments\"\"\"\n        return parser\n\n    def get_trainable_parameters(\n        self,\n        weight_decay: Optional[float] = 0.0,\n        no_decay_bn_filter_bias: Optional[bool] = False,\n        *args,\n        **kwargs\n    ) -> Tuple[List[Dict], List[float]]:\n        \"\"\"\n        Get parameters for training along with the learning rate.\n\n        Args:\n            weight_decay: weight decay\n            no_decay_bn_filter_bias: Do not decay BN and biases. Defaults to False.\n\n        Returns:\n             Returns a tuple of length 2. The first entry is a list of dictionary with three keys\n             (params, weight_decay, param_names). The second entry is a list of floats containing\n             learning rate for each parameter.\n\n        Note:\n            Learning rate multiplier is set to 1.0 here as it is handled inside the Central Model.\n        \"\"\"\n        param_list = parameter_list(\n            named_parameters=self.named_parameters,\n            weight_decay=weight_decay,\n            no_decay_bn_filter_bias=no_decay_bn_filter_bias,\n            *args,\n            **kwargs\n        )\n        return param_list, [1.0] * len(param_list)\n\n    def forward(self, *args, **kwargs) -> Any:\n        \"\"\"Forward function.\"\"\"\n        raise NotImplementedError(\"Sub-classes should implement forward method\")\n\n    def __repr__(self):\n        return \"{}\".format(self.__class__.__name__)\n"
  },
  {
    "path": "corenet/modeling/layers/conv_layer.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nfrom typing import Optional, Tuple, Type, Union\n\nfrom torch import Tensor, nn\n\nfrom corenet.modeling.layers.activation import build_activation_layer\nfrom corenet.modeling.layers.base_layer import BaseLayer\nfrom corenet.modeling.layers.normalization.layer_norm import LayerNorm, LayerNorm2D_NCHW\nfrom corenet.modeling.layers.normalization_layers import get_normalization_layer\nfrom corenet.utils import logger\n\n\nclass Conv2d(nn.Conv2d):\n    \"\"\"\n    Applies a 2D convolution over an input.\n\n    Args:\n        in_channels: :math:`C_{in}` from an expected input of size :math:`(N, C_{in}, H_{in}, W_{in})`.\n        out_channels: :math:`C_{out}` from an expected output of size :math:`(N, C_{out}, H_{out}, W_{out})`.\n        kernel_size: Kernel size for convolution.\n        stride: Stride for convolution. Default: 1.\n        padding: Padding for convolution. Default: 0.\n        dilation: Dilation rate for convolution. Default: 1.\n        groups: Number of groups in convolution. Default: 1.\n        bias: Use bias. Default: ``False``.\n        padding_mode: Padding mode ('zeros', 'reflect', 'replicate' or 'circular'). Default: ``zeros``.\n        use_norm: Use normalization layer after convolution. Default: ``True``.\n        use_act: Use activation layer after convolution (or convolution and normalization).\n                                Default: ``True``.\n        act_name: Use specific activation function. Overrides the one specified in command line args.\n\n    Shape:\n        - Input: :math:`(N, C_{in}, H_{in}, W_{in})`.\n        - Output: :math:`(N, C_{out}, H_{out}, W_{out})`.\n    \"\"\"\n\n    def __init__(\n        self,\n        in_channels: int,\n        out_channels: int,\n        kernel_size: Union[int, Tuple[int, int]],\n        stride: Optional[Union[int, Tuple[int, int]]] = 1,\n        padding: Optional[Union[int, Tuple[int, int]]] = 0,\n        dilation: Optional[Union[int, Tuple[int, int]]] = 1,\n        groups: Optional[int] = 1,\n        bias: Optional[bool] = False,\n        padding_mode: Optional[str] = \"zeros\",\n        *args,\n        **kwargs,\n    ) -> None:\n        super().__init__(\n            in_channels=in_channels,\n            out_channels=out_channels,\n            kernel_size=kernel_size,\n            stride=stride,\n            padding=padding,\n            dilation=dilation,\n            groups=groups,\n            bias=bias,\n            padding_mode=padding_mode,\n        )\n\n\nclass _BaseConvNormActLayer(BaseLayer):\n    \"\"\"\n    Applies an N-dimensional convolution over an input.\n\n    Args:\n        opts: Command line options.\n        in_channels: :math:`C_{out}` from an expected output of size\n            :math:`(bs, C_{in}, X_{1}, ..., X_{N})`.\n        out_channels: :math:`C_{out}` from an expected output of size\n            :math:`(bs, C_{out}, Y_{1}, ..., Y_{N})`.\n        kernel_size: Kernel size for convolution. An integer, or tuple of length ``N``.\n        stride: Stride for convolution. An integer, or tuple of length ``N``. Default: 1.\n        dilation: Dilation rate for convolution. An integer, or tuple of length ``N``.\n            Default: ``1``.\n        padding: Padding for convolution. An integer, or tuple of length ``N``.\n            If not specified, padding is automatically computed based on kernel size and\n            dilation range. Default : ``None`` (equivalent to ``[\n            int((kernel_size[i] - 1) / 2) * dilation[i] for i in range(N)]``).\n        groups: Number of groups in convolution. Default: ``1``.\n        bias: Use bias. Default: ``False``.\n        padding_mode: Padding mode ('zeros', 'reflect', 'replicate' or 'circular').\n            Default: ``zeros``.\n        use_norm: Use normalization layer after convolution. Default: ``True``.\n        use_act: Use activation layer after convolution (or convolution and normalization).\n            Default: ``True``.\n        norm_layer: If not None, the provided normalization layer object will be used.\n            Otherwise, a normalization object will be created based on config\n            ``model.normalization.*`` opts.\n        act_layer: If not None, the provided activation function will be used.\n            Otherwise, an activation function will be created based on config\n            ``model.activation.*`` opts.\n\n    Shape:\n        - Input: :math:`(bs, C_{in}, X_{1}, ..., X_{N})`.\n        - Output: :math:`(bs, C_{out}, Y_{1}, ..., Y_{N})`.\n\n    .. note::\n        For depth-wise convolution, `groups=C_{in}=C_{out}`.\n    \"\"\"\n\n    @property\n    def ndim(self) -> int:\n        raise NotImplementedError(\"subclasses should override ndim property\")\n\n    @property\n    def module_cls(self) -> Type[nn.Module]:\n        raise NotImplementedError(\"subclasses should override module_cls property\")\n\n    def __init__(\n        self,\n        opts: argparse.Namespace,\n        in_channels: int,\n        out_channels: int,\n        kernel_size: Union[int, Tuple[int, ...]],\n        stride: Union[int, Tuple[int, ...]] = 1,\n        dilation: Union[int, Tuple[int, ...]] = 1,\n        padding: Optional[Union[int, Tuple[int, ...]]] = None,\n        groups: int = 1,\n        bias: bool = False,\n        padding_mode: str = \"zeros\",\n        use_norm: bool = True,\n        use_act: bool = True,\n        norm_layer: Optional[nn.Module] = None,\n        act_layer: Optional[nn.Module] = None,\n        *args,\n        **kwargs,\n    ) -> None:\n        super().__init__()\n\n        if norm_layer is None and use_norm:\n            norm_type = getattr(opts, \"model.normalization.name\")\n            if norm_type == \"batch_norm\":\n                norm_type = f\"batch_norm_{self.ndim}d\"\n            norm_layer = get_normalization_layer(\n                opts=opts, num_features=out_channels, norm_type=norm_type\n            )\n        elif norm_layer is not None and not use_norm:\n            logger.error(\n                f\"When use_norm is False, norm_layer should be None, but norm_layer={norm_layer} is provided.\"\n            )\n\n        if act_layer is None and use_act:\n            act_layer = build_activation_layer(opts, num_parameters=out_channels)\n        elif act_layer is not None and not use_act:\n            logger.error(\n                f\"When use_act is False, act_layer should be None, but act_layer={act_layer} is provided.\"\n            )\n\n        if (\n            use_norm\n            and any(param[0] == \"bias\" for param in norm_layer.named_parameters())\n            and bias\n        ):\n            assert (\n                not bias\n            ), \"Do not use bias when using normalization layers with bias.\"\n\n        if use_norm and isinstance(norm_layer, (LayerNorm, LayerNorm2D_NCHW)):\n            bias = True\n\n        if isinstance(kernel_size, int):\n            kernel_size = (kernel_size,) * self.ndim\n\n        if isinstance(stride, int):\n            stride = (stride,) * self.ndim\n\n        if isinstance(dilation, int):\n            dilation = (dilation,) * self.ndim\n\n        assert isinstance(kernel_size, Tuple)\n        assert isinstance(stride, Tuple)\n        assert isinstance(dilation, Tuple)\n\n        if padding is None:\n            padding = (\n                int((kernel_size[i] - 1) / 2) * dilation[i] for i in range(self.ndim)\n            )\n\n        if in_channels % groups != 0:\n            logger.error(\n                \"Input channels are not divisible by groups. {}%{} != 0 \".format(\n                    in_channels, groups\n                )\n            )\n        if out_channels % groups != 0:\n            logger.error(\n                \"Output channels are not divisible by groups. {}%{} != 0 \".format(\n                    out_channels, groups\n                )\n            )\n\n        block = nn.Sequential()\n\n        conv_layer = self.module_cls(\n            in_channels=in_channels,\n            out_channels=out_channels,\n            kernel_size=kernel_size,  # type: ignore\n            stride=stride,  # type: ignore\n            padding=padding,\n            dilation=dilation,  # type: ignore\n            groups=groups,\n            bias=bias,\n            padding_mode=padding_mode,\n        )\n\n        block.add_module(name=\"conv\", module=conv_layer)\n\n        self.norm_name = None\n        if use_norm:\n            block.add_module(name=\"norm\", module=norm_layer)\n            self.norm_name = norm_layer.__class__.__name__\n\n        self.act_name = None\n        if use_act:\n            block.add_module(name=\"act\", module=act_layer)\n            self.act_name = act_layer.__class__.__name__\n\n        self.block = block\n        self.in_channels = in_channels\n        self.out_channels = out_channels\n        self.stride = stride\n        self.groups = groups\n        self.kernel_size = conv_layer.kernel_size\n        self.bias = bias\n        self.dilation = dilation\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser):\n        if cls != _BaseConvNormActLayer:\n            return parser\n        group = parser.add_argument_group(cls.__name__)\n        group.add_argument(\n            \"--model.layer.conv-init\",\n            type=str,\n            default=\"kaiming_normal\",\n            help=\"Init type for conv layers\",\n        )\n        parser.add_argument(\n            \"--model.layer.conv-init-std-dev\",\n            type=float,\n            default=None,\n            help=\"Std deviation for conv layers\",\n        )\n        return parser\n\n    def forward(self, x: Tensor) -> Tensor:\n        return self.block(x)\n\n    def __repr__(self):\n        repr_str = self.block[0].__repr__()\n        repr_str = repr_str[:-1]\n\n        if self.norm_name is not None:\n            repr_str += \", normalization={}\".format(self.norm_name)\n\n        if self.act_name is not None:\n            repr_str += \", activation={}\".format(self.act_name)\n        repr_str += \")\"\n        return repr_str\n\n\nclass ConvLayer1d(_BaseConvNormActLayer):\n    ndim = 1\n    module_cls = nn.Conv1d\n\n\nclass ConvLayer2d(_BaseConvNormActLayer):\n    ndim = 2\n    module_cls = Conv2d\n\n\nclass ConvLayer3d(_BaseConvNormActLayer):\n    ndim = 3\n    module_cls = nn.Conv3d\n\n\nclass TransposeConvLayer2d(BaseLayer):\n    \"\"\"\n    Applies a 2D Transpose convolution (aka as Deconvolution) over an input.\n\n    Args:\n        opts: Command line arguments.\n        in_channels: :math:`C_{in}` from an expected input of size\n          :math:`(N, C_{in}, H_{in}, W_{in})`.\n        out_channels: :math:`C_{out}` from an expected output of size\n          :math:`(N, C_{out}, H_{out}, W_{out})`.\n        kernel_size: Kernel size for convolution.\n        stride: Stride for convolution. Default: 1.\n        dilation: Dilation rate for convolution. Default: 1.\n        groups: Number of groups in convolution. Default: 1.\n        bias: Use bias. Default: ``False``.\n        padding_mode: Padding mode. Default: ``zeros``.\n        use_norm: Use normalization layer after convolution. Default: ``True``.\n        use_act: Use activation layer after convolution (or convolution and normalization).\n        Default: ``True``.\n        norm_layer: If not None, the provided normalization layer object will be used.\n            Otherwise, a normalization object will be created based on config\n            ``model.normalization.*`` opts.\n        padding: Padding will be done on both sides of each dimension in the input.\n        output_padding: Additional padding on the output tensor.\n        auto_padding: Compute padding automatically. Default: ``True``.\n\n    Shape:\n        - Input: :math:`(N, C_{in}, H_{in}, W_{in})`.\n        - Output: :math:`(N, C_{out}, H_{out}, W_{out})`.\n    \"\"\"\n\n    def __init__(\n        self,\n        opts: argparse.Namespace,\n        in_channels: int,\n        out_channels: int,\n        kernel_size: Union[int, Tuple],\n        stride: Optional[Union[int, Tuple]] = 1,\n        dilation: Optional[Union[int, Tuple]] = 1,\n        groups: Optional[int] = 1,\n        bias: Optional[bool] = False,\n        padding_mode: Optional[str] = \"zeros\",\n        use_norm: Optional[bool] = True,\n        use_act: Optional[bool] = True,\n        norm_layer: Optional[nn.Module] = None,\n        padding: Optional[Union[int, Tuple]] = (0, 0),\n        output_padding: Optional[Union[int, Tuple]] = None,\n        auto_padding: Optional[bool] = True,\n    ) -> None:\n        super().__init__()\n\n        if norm_layer is None and use_norm:\n            norm_type = getattr(opts, \"model.normalization.name\")\n            norm_layer = get_normalization_layer(\n                opts=opts, num_features=out_channels, norm_type=norm_type\n            )\n        elif norm_layer is not None and not use_norm:\n            logger.error(\n                f\"When use_norm is False, norm_layer should be None, but norm_layer={norm_layer} is provided.\"\n            )\n\n        if (\n            use_norm\n            and any(param[0] == \"bias\" for param in norm_layer.named_parameters())\n            and bias\n        ):\n            assert (\n                not bias\n            ), \"Do not use bias when using normalization layers with bias.\"\n\n        if use_norm and isinstance(norm_layer, (LayerNorm, LayerNorm2D_NCHW)):\n            bias = True\n\n        if isinstance(kernel_size, int):\n            kernel_size = (kernel_size, kernel_size)\n\n        if isinstance(stride, int):\n            stride = (stride, stride)\n\n        if isinstance(dilation, int):\n            dilation = (dilation, dilation)\n\n        if output_padding is None:\n            output_padding = (stride[0] - 1, stride[1] - 1)\n\n        assert isinstance(kernel_size, (tuple, list))\n        assert isinstance(stride, (tuple, list))\n        assert isinstance(dilation, (tuple, list))\n\n        if auto_padding:\n            padding = (\n                int((kernel_size[0] - 1) / 2) * dilation[0],\n                int((kernel_size[1] - 1) / 2) * dilation[1],\n            )\n\n        if in_channels % groups != 0:\n            logger.error(\n                \"Input channels are not divisible by groups. {}%{} != 0 \".format(\n                    in_channels, groups\n                )\n            )\n        if out_channels % groups != 0:\n            logger.error(\n                \"Output channels are not divisible by groups. {}%{} != 0 \".format(\n                    out_channels, groups\n                )\n            )\n\n        block = nn.Sequential()\n        conv_layer = nn.ConvTranspose2d(\n            in_channels=in_channels,\n            out_channels=out_channels,\n            kernel_size=kernel_size,\n            stride=stride,\n            padding=padding,\n            dilation=dilation,\n            groups=groups,\n            bias=bias,\n            padding_mode=padding_mode,\n            output_padding=output_padding,\n        )\n\n        block.add_module(name=\"conv\", module=conv_layer)\n\n        self.norm_name = None\n        if use_norm:\n            block.add_module(name=\"norm\", module=norm_layer)\n            self.norm_name = norm_layer.__class__.__name__\n\n        self.act_name = None\n        act_type = getattr(opts, \"model.activation.name\", \"relu\")\n\n        if act_type is not None and use_act:\n            act_layer = build_activation_layer(\n                opts,\n                act_type=act_type,\n                num_parameters=out_channels,\n            )\n            block.add_module(name=\"act\", module=act_layer)\n            self.act_name = act_layer.__class__.__name__\n\n        self.block = block\n\n        self.in_channels = in_channels\n        self.out_channels = out_channels\n        self.stride = stride\n        self.groups = groups\n        self.kernel_size = conv_layer.kernel_size\n        self.bias = bias\n\n    def forward(self, x: Tensor) -> Tensor:\n        return self.block(x)\n\n    def __repr__(self):\n        repr_str = self.block[0].__repr__()\n        repr_str = repr_str[:-1]\n\n        if self.norm_name is not None:\n            repr_str += \", normalization={}\".format(self.norm_name)\n\n        if self.act_name is not None:\n            repr_str += \", activation={}\".format(self.act_name)\n        repr_str += \")\"\n        return repr_str\n\n\nclass NormActLayer(BaseLayer):\n    \"\"\"\n    Applies a normalization layer followed by an activation layer.\n\n    Args:\n        opts: Command-line arguments.\n        num_features: :math:`C` from an expected input of size :math:`(N, C, H, W)`.\n\n    Shape:\n        - Input: :math:`(N, C, H, W)`.\n        - Output: :math:`(N, C, H, W)`.\n    \"\"\"\n\n    def __init__(self, opts, num_features, *args, **kwargs):\n        super().__init__()\n\n        block = nn.Sequential()\n\n        self.norm_name = None\n        norm_layer = get_normalization_layer(opts=opts, num_features=num_features)\n        block.add_module(name=\"norm\", module=norm_layer)\n        self.norm_name = norm_layer.__class__.__name__\n\n        self.act_name = None\n        act_layer = build_activation_layer(\n            opts,\n            num_parameters=num_features,\n        )\n        block.add_module(name=\"act\", module=act_layer)\n        self.act_name = act_layer.__class__.__name__\n\n        self.block = block\n\n    def forward(self, x: Tensor) -> Tensor:\n        return self.block(x)\n\n    def __repr__(self):\n        repr_str = \"{}(normalization={}, activation={})\".format(\n            self.__class__.__name__, self.norm_type, self.act_type\n        )\n        return repr_str\n\n\nclass _BaseSeparableConv(BaseLayer):\n    \"\"\"\n    Applies an N-dimensional depth-wise separable convolution\n        <https://arxiv.org/abs/1610.02357> over an N-dimensional input tensor.\n\n    Args:\n        opts: Command line arguments.\n        in_channels: :math:`C_{in}` from an expected input of size\n            :math:`(N, C_{in}, X_{1}, ..., X_{N})`.\n        out_channels: :math:`C_{out}` from an expected output of size\n            :math:`(N, C_{out}, Y_{1}, ..., Y_{N})`.\n        kernel_size: Kernel size for convolution.\n        stride: Stride for convolution. Default: 1.\n        dilation: Dilation rate for convolution. Default: 1.\n        use_norm: Use normalization layer after convolution. Default: ``True``.\n        use_act: Use activation layer after convolution (or convolution and normalization).\n            Default: ``True``.\n        use_act_deptwise: Use activation layer after depthwise convolution (or\n            convolution and normalization). Default: ``False``.\n            NOTE: We recommend against using activation function in depth-wise convolution.\n        bias: Use bias. Default: ``False``.\n        padding_mode: Padding mode ('zeros', 'reflect', 'replicate' or 'circular').\n            Default: ``zeros``.\n        act_name: Use specific activation function. Overrides the one specified in\n            command line args. Default: ``None``.\n\n    Shape:\n        - Input: :math:`(N, C_{in}, X_{1}, ..., X_{N})`.\n        - Output: :math:`(N, C_{out}, Y_{1}, ..., Y_{N})`.\n\n    .. note::\n        For depth-wise convolution, `groups=C_{in}=C_{out}`.\n    \"\"\"\n\n    def __init__(\n        self,\n        opts: argparse.Namespace,\n        in_channels: int,\n        out_channels: int,\n        kernel_size: Union[int, Tuple[int, ...]],\n        stride: Union[int, Tuple[int, ...]] = 1,\n        dilation: Union[int, Tuple[int, ...]] = 1,\n        use_norm: bool = True,\n        use_act: bool = True,\n        use_act_depthwise: bool = False,\n        bias: bool = False,\n        padding_mode: str = \"zeros\",\n        act_name: Optional[str] = None,\n        *args,\n        **kwargs,\n    ) -> None:\n        super().__init__(*args, **kwargs)\n        self.dw_conv = self.conv_layer_cls(\n            opts=opts,\n            in_channels=in_channels,\n            out_channels=in_channels,\n            kernel_size=kernel_size,\n            stride=stride,\n            dilation=dilation,\n            groups=in_channels,\n            bias=False,\n            padding_mode=padding_mode,\n            use_norm=True,\n            # NOTE: We recommend against using activation function in depth-wise convolution.\n            use_act=use_act_depthwise,\n            act_name=act_name,\n        )\n        self.pw_conv = self.conv_layer_cls(\n            opts=opts,\n            in_channels=in_channels,\n            out_channels=out_channels,\n            kernel_size=1,\n            stride=1,\n            dilation=1,\n            groups=1,\n            bias=bias,\n            padding_mode=padding_mode,\n            use_norm=use_norm,\n            use_act=use_act,\n            act_name=act_name,\n        )\n        self.in_channels = in_channels\n        self.out_channels = out_channels\n        self.stride = stride\n        self.kernel_size = kernel_size\n        self.dilation = dilation\n\n    @property\n    def conv_layer_cls(self):\n        raise NotImplementedError(\"Subclasses should override conv_layer_cls.\")\n\n    def __repr__(self):\n        repr_str = \"{}(in_channels={}, out_channels={}, kernel_size={}, stride={}, dilation={})\".format(\n            self.__class__.__name__,\n            self.in_channels,\n            self.out_channels,\n            self.kernel_size,\n            self.stride,\n            self.dilation,\n        )\n        return repr_str\n\n    def forward(self, x: Tensor) -> Tensor:\n        x = self.dw_conv(x)\n        x = self.pw_conv(x)\n        return x\n\n\nclass SeparableConv1d(_BaseSeparableConv):\n    conv_layer_cls = ConvLayer1d\n\n\nclass SeparableConv2d(_BaseSeparableConv):\n    conv_layer_cls = ConvLayer2d\n\n\nclass SeparableConv3d(_BaseSeparableConv):\n    conv_layer_cls = ConvLayer3d\n"
  },
  {
    "path": "corenet/modeling/layers/dropout.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom typing import Optional\n\nfrom torch import Tensor, nn\n\n\nclass Dropout(nn.Dropout):\n    \"\"\"\n    This layer, during training, randomly zeroes some of the elements of the input tensor with probability `p`\n    using samples from a Bernoulli distribution.\n\n    Args:\n        p: probability of an element to be zeroed. Default: 0.5\n        inplace: If set to ``True``, will do this operation in-place. Default: ``False``\n\n    Shape:\n        - Input: :math:`(N, *)` where :math:`N` is the batch size\n        - Output: same as the input\n\n    \"\"\"\n\n    def __init__(\n        self, p: Optional[float] = 0.5, inplace: Optional[bool] = False, *args, **kwargs\n    ) -> None:\n        super().__init__(p=p, inplace=inplace)\n\n\nclass Dropout2d(nn.Dropout2d):\n    \"\"\"\n    This layer, during training, randomly zeroes some of the elements of the 4D input tensor with probability `p`\n    using samples from a Bernoulli distribution.\n\n    Args:\n        p: probability of an element to be zeroed. Default: 0.5\n        inplace: If set to ``True``, will do this operation in-place. Default: ``False``\n\n    Shape:\n        - Input: :math:`(N, C, H, W)` where :math:`N` is the batch size, :math:`C` is the input channels,\n            :math:`H` is the input tensor height, and :math:`W` is the input tensor width\n        - Output: same as the input\n\n    \"\"\"\n\n    def __init__(self, p: float = 0.5, inplace: bool = False):\n        super().__init__(p=p, inplace=inplace)\n"
  },
  {
    "path": "corenet/modeling/layers/embedding.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom typing import Optional\n\nimport torch\nfrom torch import Tensor, nn\n\nfrom corenet.modeling.layers.base_layer import BaseLayer\nfrom corenet.modeling.layers.normalization_layers import get_normalization_layer\nfrom corenet.utils import logger\n\n\nclass Embedding(nn.Embedding):\n    r\"\"\"A lookup table that stores embeddings of a fixed dictionary and size.\n\n    Args:\n        num_embeddings (int): size of the dictionary of embeddings\n        embedding_dim (int): the size of each embedding vector\n        padding_idx (int, optional): If specified, the entries at :attr:`padding_idx` do not contribute to the gradient;\n                                     therefore, the embedding vector at :attr:`padding_idx` is not updated during training,\n                                     i.e. it remains as a fixed \"pad\". For a newly constructed Embedding,\n                                     the embedding vector at :attr:`padding_idx` will default to all zeros,\n                                     but can be updated to another value to be used as the padding vector.\n\n    Shape:\n        - Input: :math:`(*)`, IntTensor or LongTensor of arbitrary shape containing the indices to extract\n        - Output: :math:`(*, H)`, where `*` is the input shape and :math:`H=\\text{embedding\\_dim}`\n    \"\"\"\n\n    def __init__(\n        self,\n        opts,\n        num_embeddings: int,\n        embedding_dim: int,\n        padding_idx: Optional[int] = None,\n        *args,\n        **kwargs\n    ):\n        super().__init__(\n            num_embeddings=num_embeddings,\n            embedding_dim=embedding_dim,\n            padding_idx=padding_idx,\n        )\n\n    def reset_parameters(self) -> None:\n        nn.init.normal_(self.weight, mean=0, std=self.embedding_dim**-0.5)\n        if self.padding_idx is not None:\n            nn.init.constant_(self.weight[self.padding_idx], 0)\n"
  },
  {
    "path": "corenet/modeling/layers/flash_multi_head_attention.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom typing import Optional\n\nimport torch\nfrom packaging import version\nfrom torch import Tensor\nfrom torch.nn import functional as F\n\nfrom corenet.modeling.layers.base_layer import BaseLayer\nfrom corenet.modeling.layers.linear_layer import LinearLayer\nfrom corenet.utils import logger\n\n\nclass FlashMultiHeadSelfAttention(BaseLayer):\n    \"\"\"Multi-head scaled dot-product attention using `flash attention <https://arxiv.org/abs/2205.14135>`_.\n\n    This layer uses efficient scaled-dot product attention implementation to reduce memory footprint and faster training.\n\n    Args:\n        in_features: Number of features in the input.\n        head_dim: Head dimension.\n        attn_dropout_prob: Attention dropout probability. Defaults to 0.0.\n        qkv_features: Number of features after linear projection in QKV branch in multi-head\n            attention. If None, qkv_features=in_features. Defaults to None.\n        bias: Use bias or not. Defaults to False.\n    \"\"\"\n\n    def __init__(\n        self,\n        in_features: int,\n        head_dim: int,\n        attn_dropout_prob: float = 0.0,\n        qkv_features: Optional[int] = None,\n        bias: bool = False,\n    ) -> None:\n        sdpa_exists = hasattr(torch.nn.functional, \"scaled_dot_product_attention\")\n        min_pytorch_supported_version = \"2.0\"\n        is_supported_pytorch_version_available = version.parse(\n            torch.__version__\n        ) >= version.parse(min_pytorch_supported_version)\n\n        if not (sdpa_exists and is_supported_pytorch_version_available):\n            logger.error(\n                f\"Please use PyTorch v{min_pytorch_supported_version} and above.\"\n            )\n\n        if qkv_features is None:\n            qkv_features = in_features\n\n        if qkv_features % head_dim != 0:\n            logger.error(\n                f\"QKV features should be divisible by head dimension in {self.__class__.__name__}. Got: {qkv_features} qkv_features and {head_dim} head dimension.\"\n            )\n        num_attn_heads = qkv_features // head_dim\n        super().__init__()\n\n        self.qkv_proj = LinearLayer(\n            in_features=in_features,\n            out_features=3 * qkv_features,\n            bias=bias,\n        )\n        self.out_proj_attn = LinearLayer(\n            in_features=qkv_features, out_features=in_features, bias=bias\n        )\n\n        self.attn_dropout_prob = attn_dropout_prob\n        self.num_heads = num_attn_heads\n        self.head_dim = head_dim\n        self.qkv_features = qkv_features\n\n    def forward(self, x: Tensor) -> Tensor:\n        \"\"\"Forward function.\n\n        Args:\n            x: Input tensor of shape [batch size, number of tokens, embedding dim]\n\n        Returns:\n            Output tensor of the same size as the input.\n        \"\"\"\n        batch_size, num_tokens, embed_dim = x.shape\n        qkv = self.qkv_proj(x)\n        # [batch size, tokens, embedding dim] -> [batch size, tokens, 3, number of heads, head dim]\n        qkv = qkv.reshape(batch_size, num_tokens, 3, self.num_heads, self.head_dim)\n        # [batch size, tokens, 3, number of heads, head dim] --> [batch size, number of heads, 3, tokens, head dim]\n        qkv = qkv.transpose(1, 3).contiguous()\n        # [batch size, number of heads, 3, tokens, head dim] --> [batch size, number of heads, tokens, head dim] x 3\n        query, key, value = qkv[:, :, 0], qkv[:, :, 1], qkv[:, :, 2]\n        # efficient attention using Flash Attention CUDA kernels\n        attn_output = F.scaled_dot_product_attention(\n            query,\n            key,\n            value,\n            attn_mask=None,\n            dropout_p=self.attn_dropout_prob if self.training else 0,\n            # For self-attention, causal masking is not required.\n            is_causal=False,\n        )\n        # [batch size, number of heads, tokens, head dim] --> [batch size, tokens, number of heads, head dim]\n        attn_output = attn_output.transpose(1, 2).contiguous()\n        # [batch size, tokens, number of heads, head dim] --> [batch size, tokens, number of heads * head dim]\n        attn_output = attn_output.reshape(batch_size, num_tokens, self.qkv_features)\n        y = self.out_proj_attn(attn_output)\n        return y\n"
  },
  {
    "path": "corenet/modeling/layers/flatten.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom typing import Optional\n\nfrom torch import Tensor, nn\n\n\nclass Flatten(nn.Flatten):\n    r\"\"\"\n    This layer flattens a contiguous range of dimensions into a tensor.\n\n    Args:\n        start_dim (Optional[int]): first dim to flatten. Default: 1\n        end_dim (Optional[int]): last dim to flatten. Default: -1\n\n    Shape:\n        - Input: :math:`(*, S_{\\text{start}},..., S_{i}, ..., S_{\\text{end}}, *)`,'\n          where :math:`S_{i}` is the size at dimension :math:`i` and :math:`*` means any\n          number of dimensions including none.\n        - Output: :math:`(*, \\prod_{i=\\text{start}}^{\\text{end}} S_{i}, *)`.\n    \"\"\"\n\n    def __init__(self, start_dim: Optional[int] = 1, end_dim: Optional[int] = -1):\n        super(Flatten, self).__init__(start_dim=start_dim, end_dim=end_dim)\n"
  },
  {
    "path": "corenet/modeling/layers/global_pool.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nfrom typing import List, Optional\n\nimport torch\nfrom torch import Tensor\n\nfrom corenet.modeling.layers.base_layer import BaseLayer\nfrom corenet.utils import logger\n\n\nclass GlobalPool(BaseLayer):\n    \"\"\"\n    This layers applies global pooling over a 4D or 5D input tensor\n\n    Args:\n        pool_type (Optional[str]): Pooling type. It can be mean, rms, or abs. Default: `mean`\n        keep_dim (Optional[bool]): Do not squeeze the dimensions of a tensor. Default: `False`\n\n    Shape:\n        - Input: :math:`(N, C, H, W)` or :math:`(N, C, D, H, W)`\n        - Output: :math:`(N, C, 1, 1)` or :math:`(N, C, 1, 1, 1)` if keep_dim else :math:`(N, C)`\n    \"\"\"\n\n    pool_types = [\"mean\", \"rms\", \"abs\"]\n\n    def __init__(\n        self,\n        pool_type: Optional[str] = \"mean\",\n        keep_dim: Optional[bool] = False,\n        *args,\n        **kwargs\n    ) -> None:\n        super().__init__()\n        if pool_type not in self.pool_types:\n            logger.error(\n                \"Supported pool types are: {}. Got {}\".format(\n                    self.pool_types, pool_type\n                )\n            )\n        self.pool_type = pool_type\n        self.keep_dim = keep_dim\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser):\n        cls_name = \"{} arguments\".format(cls.__name__)\n        group = parser.add_argument_group(title=cls_name, description=cls_name)\n        group.add_argument(\n            \"--model.layer.global-pool\",\n            type=str,\n            default=\"mean\",\n            help=\"Which global pooling?\",\n        )\n        return parser\n\n    def _global_pool(self, x: Tensor, dims: List):\n        if self.pool_type == \"rms\":  # root mean square\n            x = x**2\n            x = torch.mean(x, dim=dims, keepdim=self.keep_dim)\n            x = x**-0.5\n        elif self.pool_type == \"abs\":  # absolute\n            x = torch.mean(torch.abs(x), dim=dims, keepdim=self.keep_dim)\n        else:\n            # default is mean\n            # same as AdaptiveAvgPool\n            x = torch.mean(x, dim=dims, keepdim=self.keep_dim)\n        return x\n\n    def forward(self, x: Tensor) -> Tensor:\n        if x.dim() == 4:\n            dims = [-2, -1]\n        elif x.dim() == 5:\n            dims = [-3, -2, -1]\n        else:\n            raise NotImplementedError(\"Currently 2D and 3D global pooling supported\")\n        return self._global_pool(x, dims=dims)\n\n    def __repr__(self):\n        return \"{}(type={})\".format(self.__class__.__name__, self.pool_type)\n"
  },
  {
    "path": "corenet/modeling/layers/identity.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom torch import Tensor\n\nfrom corenet.modeling.layers.base_layer import BaseLayer\n\n\nclass Identity(BaseLayer):\n    \"\"\"\n    This is a place-holder and returns the same tensor.\n    \"\"\"\n\n    def __init__(self):\n        super(Identity, self).__init__()\n\n    def forward(self, x: Tensor) -> Tensor:\n        return x\n"
  },
  {
    "path": "corenet/modeling/layers/linear_attention.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\nfrom typing import Optional\n\nimport torch\nfrom torch import Tensor\nfrom torch.nn import functional as F\n\nfrom corenet.modeling.layers.base_layer import BaseLayer\nfrom corenet.modeling.layers.conv_layer import ConvLayer2d\nfrom corenet.modeling.layers.dropout import Dropout\n\n\nclass LinearSelfAttention(BaseLayer):\n    \"\"\"\n    This layer applies a self-attention with linear complexity, as described in `MobileViTv2 <https://arxiv.org/abs/2206.02680>`_ paper.\n    This layer can be used for self- as well as cross-attention.\n\n    Args:\n        opts: command line arguments\n        embed_dim (int): :math:`C` from an expected input of size :math:`(N, C, H, W)`\n        attn_dropout (Optional[float]): Dropout value for context scores. Default: 0.0\n        bias (Optional[bool]): Use bias in learnable layers. Default: True\n\n    Shape:\n        - Input: :math:`(N, C, P, N)` where :math:`N` is the batch size, :math:`C` is the input channels,\n        :math:`P` is the number of pixels in the patch, and :math:`N` is the number of patches\n        - Output: same as the input\n\n    .. note::\n        For MobileViTv2, we unfold the feature map [B, C, H, W] into [B, C, P, N] where P is the number of pixels\n        in a patch and N is the number of patches. Because channel is the first dimension in this unfolded tensor,\n        we use point-wise convolution (instead of a linear layer). This avoids a transpose operation (which may be\n        expensive on resource-constrained devices) that may be required to convert the unfolded tensor from\n        channel-first to channel-last format in case of a linear layer.\n    \"\"\"\n\n    def __init__(\n        self,\n        opts,\n        embed_dim: int,\n        attn_dropout: Optional[float] = 0.0,\n        bias: Optional[bool] = True,\n        *args,\n        **kwargs\n    ) -> None:\n        super().__init__()\n\n        self.qkv_proj = ConvLayer2d(\n            opts=opts,\n            in_channels=embed_dim,\n            out_channels=1 + (2 * embed_dim),\n            bias=bias,\n            kernel_size=1,\n            use_norm=False,\n            use_act=False,\n        )\n\n        self.attn_dropout = Dropout(p=attn_dropout)\n        self.out_proj = ConvLayer2d(\n            opts=opts,\n            in_channels=embed_dim,\n            out_channels=embed_dim,\n            bias=bias,\n            kernel_size=1,\n            use_norm=False,\n            use_act=False,\n        )\n        self.embed_dim = embed_dim\n\n    def __repr__(self):\n        return \"{}(embed_dim={}, attn_dropout={})\".format(\n            self.__class__.__name__, self.embed_dim, self.attn_dropout.p\n        )\n\n    @staticmethod\n    def visualize_context_scores(context_scores):\n        # [B, 1, P, N]\n        batch_size, channels, num_pixels, num_patches = context_scores.shape\n\n        assert batch_size == 1, \"For visualization purposes, use batch size of 1\"\n        assert (\n            channels == 1\n        ), \"The inner-product between input and latent node (query) is a scalar\"\n\n        up_scale_factor = int(num_pixels**0.5)\n        patch_h = patch_w = int(context_scores.shape[-1] ** 0.5)\n        # [1, 1, P, N] --> [1, P, h, w]\n        context_scores = context_scores.reshape(1, num_pixels, patch_h, patch_w)\n        # Fold context scores [1, P, h, w] using pixel shuffle to obtain [1, 1, H, W]\n        context_map = F.pixel_shuffle(context_scores, upscale_factor=up_scale_factor)\n        # [1, 1, H, W] --> [H, W]\n        context_map = context_map.squeeze()\n\n        # For ease of visualization, we do min-max normalization\n        min_val = torch.min(context_map)\n        max_val = torch.max(context_map)\n        context_map = (context_map - min_val) / (max_val - min_val)\n\n        try:\n            import os\n            from glob import glob\n\n            import cv2\n\n            # convert from float to byte\n            context_map = (context_map * 255).byte().cpu().numpy()\n            context_map = cv2.resize(\n                context_map, (80, 80), interpolation=cv2.INTER_NEAREST\n            )\n\n            colored_context_map = cv2.applyColorMap(context_map, cv2.COLORMAP_JET)\n            # Lazy way to dump feature maps in attn_res folder. Make sure that directory is empty and copy\n            # context maps before running on different image. Otherwise, attention maps will be overridden.\n            res_dir_name = \"attn_res\"\n            if not os.path.isdir(res_dir_name):\n                os.makedirs(res_dir_name)\n            f_name = \"{}/h_{}_w_{}_index_\".format(res_dir_name, patch_h, patch_w)\n\n            files_cmap = glob(\n                \"{}/h_{}_w_{}_index_*.png\".format(res_dir_name, patch_h, patch_w)\n            )\n            idx = len(files_cmap)\n            f_name += str(idx)\n\n            cv2.imwrite(\"{}.png\".format(f_name), colored_context_map)\n            return colored_context_map\n        except ModuleNotFoundError as mnfe:\n            print(\"Please install OpenCV to visualize context maps\")\n            return context_map\n\n    def _forward_self_attn(self, x: Tensor, *args, **kwargs) -> Tensor:\n        # [B, C, P, N] --> [B, h + 2d, P, N]\n        qkv = self.qkv_proj(x)\n\n        # Project x into query, key and value\n        # Query --> [B, 1, P, N]\n        # value, key --> [B, d, P, N]\n        query, key, value = torch.split(\n            qkv, split_size_or_sections=[1, self.embed_dim, self.embed_dim], dim=1\n        )\n\n        # apply softmax along N dimension\n        context_scores = F.softmax(query, dim=-1)\n        # Uncomment below line to visualize context scores\n        # self.visualize_context_scores(context_scores=context_scores)\n        context_scores = self.attn_dropout(context_scores)\n\n        # Compute context vector\n        # [B, d, P, N] x [B, 1, P, N] -> [B, d, P, N]\n        context_vector = key * context_scores\n        # [B, d, P, N] --> [B, d, P, 1]\n        context_vector = torch.sum(context_vector, dim=-1, keepdim=True)\n\n        # combine context vector with values\n        # [B, d, P, N] * [B, d, P, 1] --> [B, d, P, N]\n        out = F.relu(value) * context_vector.expand_as(value)\n        out = self.out_proj(out)\n        return out\n\n    def _forward_cross_attn(\n        self, x: Tensor, x_prev: Optional[Tensor] = None, *args, **kwargs\n    ) -> Tensor:\n        # x --> [B, C, P, N]\n        # x_prev = [B, C, P, M]\n\n        batch_size, in_dim, kv_patch_area, kv_num_patches = x.shape\n\n        q_patch_area, q_num_patches = x.shape[-2:]\n\n        assert (\n            kv_patch_area == q_patch_area\n        ), \"The number of pixels in a patch for query and key_value should be the same\"\n\n        # compute query, key, and value\n        # [B, C, P, M] --> [B, 1 + d, P, M]\n        qk = F.conv2d(\n            x_prev,\n            weight=self.qkv_proj.block.conv.weight[: self.embed_dim + 1, ...],\n            bias=self.qkv_proj.block.conv.bias[: self.embed_dim + 1, ...],\n        )\n        # [B, 1 + d, P, M] --> [B, 1, P, M], [B, d, P, M]\n        query, key = torch.split(qk, split_size_or_sections=[1, self.embed_dim], dim=1)\n        # [B, C, P, N] --> [B, d, P, N]\n        value = F.conv2d(\n            x,\n            weight=self.qkv_proj.block.conv.weight[self.embed_dim + 1 :, ...],\n            bias=self.qkv_proj.block.conv.bias[self.embed_dim + 1 :, ...],\n        )\n\n        # apply softmax along M dimension\n        context_scores = F.softmax(query, dim=-1)\n        context_scores = self.attn_dropout(context_scores)\n\n        # compute context vector\n        # [B, d, P, M] * [B, 1, P, M] -> [B, d, P, M]\n        context_vector = key * context_scores\n        # [B, d, P, M] --> [B, d, P, 1]\n        context_vector = torch.sum(context_vector, dim=-1, keepdim=True)\n\n        # combine context vector with values\n        # [B, d, P, N] * [B, d, P, 1] --> [B, d, P, N]\n        out = F.relu(value) * context_vector.expand_as(value)\n        out = self.out_proj(out)\n        return out\n\n    def forward(\n        self, x: Tensor, x_prev: Optional[Tensor] = None, *args, **kwargs\n    ) -> Tensor:\n        if x_prev is None:\n            return self._forward_self_attn(x, *args, **kwargs)\n        else:\n            return self._forward_cross_attn(x, x_prev=x_prev, *args, **kwargs)\n"
  },
  {
    "path": "corenet/modeling/layers/linear_layer.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nfrom typing import Optional\n\nimport torch\nfrom torch import Tensor, nn\nfrom torch.nn import functional as F\n\nfrom corenet.modeling.layers.base_layer import BaseLayer\nfrom corenet.utils import logger\n\n\nclass LinearLayer(BaseLayer):\n    \"\"\"\n    Applies a linear transformation to the input data\n\n    Args:\n        in_features (int): number of features in the input tensor\n        out_features (int): number of features in the output tensor\n        bias  (Optional[bool]): use bias or not\n        channel_first (Optional[bool]): Channels are first or last dimension. If first, then use Conv2d\n\n    Shape:\n        - Input: :math:`(N, *, C_{in})` if not channel_first else :math:`(N, C_{in}, *)` where :math:`*` means any number of dimensions.\n        - Output: :math:`(N, *, C_{out})` if not channel_first else :math:`(N, C_{out}, *)`\n\n    \"\"\"\n\n    def __init__(\n        self,\n        in_features: int,\n        out_features: int,\n        bias: Optional[bool] = True,\n        channel_first: Optional[bool] = False,\n        *args,\n        **kwargs\n    ) -> None:\n        super().__init__()\n        self.weight = nn.Parameter(torch.Tensor(out_features, in_features))\n        self.bias = nn.Parameter(torch.Tensor(out_features)) if bias else None\n\n        self.in_features = in_features\n        self.out_features = out_features\n        self.channel_first = channel_first\n\n        self.reset_params()\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser):\n        parser.add_argument(\n            \"--model.layer.linear-init\",\n            type=str,\n            default=\"xavier_uniform\",\n            help=\"Init type for linear layers\",\n        )\n        parser.add_argument(\n            \"--model.layer.linear-init-std-dev\",\n            type=float,\n            default=0.01,\n            help=\"Std deviation for Linear layers\",\n        )\n        return parser\n\n    def reset_params(self):\n        if self.weight is not None:\n            torch.nn.init.xavier_uniform_(self.weight)\n        if self.bias is not None:\n            torch.nn.init.constant_(self.bias, 0)\n\n    def forward(self, x: Tensor) -> Tensor:\n        if self.channel_first:\n            if not self.training:\n                logger.error(\"Channel-first mode is only supported during inference\")\n            if x.dim() != 4:\n                logger.error(\"Input should be 4D, i.e., (B, C, H, W) format\")\n            # only run during conversion\n            with torch.no_grad():\n                return F.conv2d(\n                    input=x,\n                    weight=self.weight.clone()\n                    .detach()\n                    .reshape(self.out_features, self.in_features, 1, 1),\n                    bias=self.bias,\n                )\n        else:\n            x = F.linear(x, weight=self.weight, bias=self.bias)\n        return x\n\n    def __repr__(self):\n        repr_str = (\n            \"{}(in_features={}, out_features={}, bias={}, channel_first={})\".format(\n                self.__class__.__name__,\n                self.in_features,\n                self.out_features,\n                True if self.bias is not None else False,\n                self.channel_first,\n            )\n        )\n        return repr_str\n\n\nclass GroupLinear(BaseLayer):\n    \"\"\"\n    Applies a GroupLinear transformation layer, as defined `here <https://arxiv.org/abs/1808.09029>`_,\n    `here <https://arxiv.org/abs/1911.12385>`_ and `here <https://arxiv.org/abs/2008.00623>`_\n\n    Args:\n        in_features (int): number of features in the input tensor\n        out_features (int): number of features in the output tensor\n        n_groups (int): number of groups\n        bias (Optional[bool]): use bias or not\n        feature_shuffle (Optional[bool]): Shuffle features between groups\n\n    Shape:\n        - Input: :math:`(N, *, C_{in})`\n        - Output: :math:`(N, *, C_{out})`\n\n    \"\"\"\n\n    def __init__(\n        self,\n        in_features: int,\n        out_features: int,\n        n_groups: int,\n        bias: Optional[bool] = True,\n        feature_shuffle: Optional[bool] = False,\n        *args,\n        **kwargs\n    ) -> None:\n        if in_features % n_groups != 0:\n            logger.error(\n                \"Input dimensions ({}) must be divisible by n_groups ({})\".format(\n                    in_features, n_groups\n                )\n            )\n        if out_features % n_groups != 0:\n            logger.error(\n                \"Output dimensions ({}) must be divisible by n_groups ({})\".format(\n                    out_features, n_groups\n                )\n            )\n\n        in_groups = in_features // n_groups\n        out_groups = out_features // n_groups\n\n        super().__init__()\n\n        self.weight = nn.Parameter(torch.Tensor(n_groups, in_groups, out_groups))\n        if bias:\n            self.bias = nn.Parameter(torch.Tensor(n_groups, 1, out_groups))\n        else:\n            self.bias = None\n\n        self.out_features = out_features\n        self.in_features = in_features\n        self.n_groups = n_groups\n        self.feature_shuffle = feature_shuffle\n\n        self.reset_params()\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser):\n        parser.add_argument(\n            \"--model.layer.group-linear-init\",\n            type=str,\n            default=\"xavier_uniform\",\n            help=\"Init type for group linear layers\",\n        )\n        parser.add_argument(\n            \"--model.layer.group-linear-init-std-dev\",\n            type=float,\n            default=0.01,\n            help=\"Std deviation for group linear layers\",\n        )\n        return parser\n\n    def reset_params(self):\n        if self.weight is not None:\n            torch.nn.init.xavier_uniform_(self.weight.data)\n        if self.bias is not None:\n            torch.nn.init.constant_(self.bias.data, 0)\n\n    def _forward(self, x: Tensor) -> Tensor:\n        bsz = x.shape[0]\n        # [B, N] -->  [B, g, N/g]\n        x = x.reshape(bsz, self.n_groups, -1)\n\n        # [B, g, N/g] --> [g, B, N/g]\n        x = x.transpose(0, 1)\n        # [g, B, N/g] x [g, N/g, M/g] --> [g, B, M/g]\n        x = torch.bmm(x, self.weight)\n\n        if self.bias is not None:\n            x = torch.add(x, self.bias)\n\n        if self.feature_shuffle:\n            # [g, B, M/g] --> [B, M/g, g]\n            x = x.permute(1, 2, 0)\n            # [B, M/g, g] --> [B, g, M/g]\n            x = x.reshape(bsz, self.n_groups, -1)\n        else:\n            # [g, B, M/g] --> [B, g, M/g]\n            x = x.transpose(0, 1)\n\n        return x.reshape(bsz, -1)\n\n    def forward(self, x: Tensor) -> Tensor:\n        if x.dim() == 2:\n            x = self._forward(x)\n            return x\n        else:\n            in_dims = x.shape[:-1]\n            n_elements = x.numel() // self.in_features\n            x = x.reshape(n_elements, -1)\n            x = self._forward(x)\n            x = x.reshape(*in_dims, -1)\n            return x\n\n    def __repr__(self):\n        repr_str = \"{}(in_features={}, out_features={}, groups={}, bias={}, shuffle={})\".format(\n            self.__class__.__name__,\n            self.in_features,\n            self.out_features,\n            self.n_groups,\n            True if self.bias is not None else False,\n            self.feature_shuffle,\n        )\n        return repr_str\n"
  },
  {
    "path": "corenet/modeling/layers/multi_head_attention.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom typing import Optional\n\nimport torch\nfrom torch import Tensor, nn\nfrom torch.nn import functional as F\n\nfrom corenet.modeling.layers.base_layer import BaseLayer\nfrom corenet.modeling.layers.dropout import Dropout\nfrom corenet.modeling.layers.linear_layer import LinearLayer\nfrom corenet.utils import logger\n\n\nclass MultiHeadAttention(BaseLayer):\n    \"\"\"\n    This layer applies a multi-head self- or cross-attention as described in\n    `Attention is all you need <https://arxiv.org/abs/1706.03762>`_ paper\n\n    Args:\n        embed_dim (int): :math:`C_{in}` from an expected input of size :math:`(N, S, C_{in})`\n        num_heads (int): Number of heads in multi-head attention\n        attn_dropout (Optional[float]): Attention dropout. Default: 0.0\n        bias (Optional[bool]): Use bias or not. Default: ``True``\n\n    Shape:\n        - Input:\n           - Query tensor (x_q) :math:`(N, S, C_{in})` where :math:`N` is batch size, :math:`S` is number of source tokens,\n        and :math:`C_{in}` is input embedding dim\n           - Optional Key-Value tensor (x_kv) :math:`(N, T, C_{in})` where :math:`T` is number of target tokens\n        - Output: same shape as the input\n\n    \"\"\"\n\n    def __init__(\n        self,\n        embed_dim: int,\n        num_heads: int,\n        attn_dropout: Optional[float] = 0.0,\n        bias: Optional[bool] = True,\n        output_dim: Optional[int] = None,\n        coreml_compatible: Optional[bool] = False,\n        *args,\n        **kwargs\n    ) -> None:\n        if output_dim is None:\n            output_dim = embed_dim\n        super().__init__()\n        if embed_dim % num_heads != 0:\n            logger.error(\n                \"Embedding dim must be divisible by number of heads in {}. Got: embed_dim={} and num_heads={}\".format(\n                    self.__class__.__name__, embed_dim, num_heads\n                )\n            )\n\n        self.qkv_proj = LinearLayer(\n            in_features=embed_dim, out_features=3 * embed_dim, bias=bias\n        )\n\n        self.attn_dropout = Dropout(p=attn_dropout)\n        self.out_proj = LinearLayer(\n            in_features=embed_dim, out_features=output_dim, bias=bias\n        )\n\n        self.head_dim = embed_dim // num_heads\n        self.scaling = self.head_dim**-0.5\n        self.softmax = nn.Softmax(dim=-1)\n        self.num_heads = num_heads\n        self.embed_dim = embed_dim\n        self.coreml_compatible = coreml_compatible\n        self.use_separate_proj_weight = embed_dim != output_dim\n\n    def __repr__(self):\n        return \"{}(head_dim={}, num_heads={}, attn_dropout={})\".format(\n            self.__class__.__name__, self.head_dim, self.num_heads, self.attn_dropout.p\n        )\n\n    def forward_tracing(\n        self,\n        x_q: Tensor,\n        x_kv: Optional[Tensor] = None,\n        key_padding_mask: Optional[Tensor] = None,\n        attn_mask: Optional[Tensor] = None,\n    ) -> Tensor:\n        if x_kv is None:\n            # [N, S, C] --> # [N, S, 3C] Here, T=S\n            qkv = self.qkv_proj(x_q)\n            # # [N, S, 3C] --> # [N, S, C] x 3\n            query, key, value = torch.chunk(qkv, chunks=3, dim=-1)\n        else:\n            # [N, S, C]\n            query = F.linear(\n                x_q,\n                weight=self.qkv_proj.weight[: self.embed_dim, ...],\n                bias=(\n                    self.qkv_proj.bias[: self.embed_dim]\n                    if self.qkv_proj.bias is not None\n                    else None\n                ),\n            )\n\n            # [N, T, C] --> [N, T, 2C]\n            kv = F.linear(\n                x_kv,\n                weight=self.qkv_proj.weight[self.embed_dim :, ...],\n                bias=(\n                    self.qkv_proj.bias[self.embed_dim :]\n                    if self.qkv_proj.bias is not None\n                    else None\n                ),\n            )\n            key, value = torch.chunk(kv, chunks=2, dim=-1)\n\n        query = query * self.scaling\n\n        # [N, S, C] --> [N, S, c] x h, where C = c * h\n        query = torch.chunk(query, chunks=self.num_heads, dim=-1)\n\n        # [N, T, C] --> [N, T, c] x h, where C = c * h\n        value = torch.chunk(value, chunks=self.num_heads, dim=-1)\n        # [N, T, C] --> [N, T, c] x h, where C = c * h\n        key = torch.chunk(key, chunks=self.num_heads, dim=-1)\n\n        wt_out = []\n        for h in range(self.num_heads):\n            attn_h = torch.matmul(query[h], key[h].transpose(-1, -2))\n            attn_h = self.softmax(attn_h)\n            attn_h = self.attn_dropout(attn_h)\n            out_h = torch.matmul(attn_h, value[h])\n            wt_out.append(out_h)\n\n        wt_out = torch.cat(wt_out, dim=-1)\n        wt_out = self.out_proj(wt_out)\n        return wt_out\n\n    def forward_default(\n        self,\n        x_q: Tensor,\n        x_kv: Optional[Tensor] = None,\n        key_padding_mask: Optional[Tensor] = None,\n        attn_mask: Optional[Tensor] = None,\n    ) -> Tensor:\n        # [N, S, C]\n        b_sz, S_len, in_channels = x_q.shape\n\n        if x_kv is None:\n            # self-attention\n            # [N, S, C] --> [N, S, 3C] --> [N, S, 3, h, c] where C = hc\n            qkv = self.qkv_proj(x_q).reshape(b_sz, S_len, 3, self.num_heads, -1)\n            # [N, S, 3, h, c] --> [N, h, 3, S, C]\n            qkv = qkv.transpose(1, 3).contiguous()\n\n            # [N, h, 3, S, C] --> [N, h, S, C] x 3\n            query, key, value = qkv[:, :, 0], qkv[:, :, 1], qkv[:, :, 2]\n        else:\n            T_len = x_kv.shape[1]\n\n            # cross-attention\n            # [N, S, C]\n            query = F.linear(\n                x_q,\n                weight=self.qkv_proj.weight[: self.embed_dim, ...],\n                bias=(\n                    self.qkv_proj.bias[: self.embed_dim]\n                    if self.qkv_proj.bias is not None\n                    else None\n                ),\n            )\n            # [N, S, C] --> [N, S, h, c] --> [N, h, S, c]\n            query = (\n                query.reshape(b_sz, S_len, self.num_heads, self.head_dim)\n                .transpose(1, 2)\n                .contiguous()\n            )\n\n            # [N, T, C] --> [N, T, 2C]\n            kv = F.linear(\n                x_kv,\n                weight=self.qkv_proj.weight[self.embed_dim :, ...],\n                bias=(\n                    self.qkv_proj.bias[self.embed_dim :]\n                    if self.qkv_proj.bias is not None\n                    else None\n                ),\n            )\n            # [N, T, 2C] --> [N, T, 2, h, c]\n            kv = kv.reshape(b_sz, T_len, 2, self.num_heads, self.head_dim)\n            # [N, T, 2, h, c] --> [N, h, 2, T, c]\n            kv = kv.transpose(1, 3).contiguous()\n            key, value = kv[:, :, 0], kv[:, :, 1]\n\n        query = query * self.scaling\n\n        # [N h, T, c] --> [N, h, c, T]\n        key = key.transpose(-1, -2)\n\n        # QK^T\n        # [N, h, S, c] x [N, h, c, T] --> [N, h, S, T]\n        attn = torch.matmul(query, key)\n\n        batch_size, num_heads, num_src_tokens, num_tgt_tokens = attn.shape\n        if attn_mask is not None:\n            # attn_mask shape should be the same as attn\n            assert list(attn_mask.shape) == [\n                batch_size,\n                num_src_tokens,\n                num_tgt_tokens,\n            ], \"Shape of attention mask should be [{}, {}, {}]. Got: {}\".format(\n                batch_size, num_src_tokens, num_tgt_tokens, attn_mask.shape\n            )\n            # [N, S, T] --> [N, 1, S, T]\n            attn_mask = attn_mask.unsqueeze(1)\n            attn = attn + attn_mask\n\n        if key_padding_mask is not None:\n            # Do not attend to padding positions\n            # key padding mask size is [N, T]\n            assert key_padding_mask.dim() == 2 and list(key_padding_mask.shape) == [\n                batch_size,\n                num_tgt_tokens,\n            ], \"Key_padding_mask should be 2-dimension with shape [{}, {}]. Got: {}\".format(\n                batch_size, num_tgt_tokens, key_padding_mask.shape\n            )\n            attn = attn.masked_fill(\n                key_padding_mask.unsqueeze(1)\n                .unsqueeze(2)\n                .to(torch.bool),  # [N, T] --> [N, 1, 1, T]\n                float(\"-inf\"),\n            )\n\n        attn_dtype = attn.dtype\n        attn_as_float = self.softmax(attn.float())\n        attn = attn_as_float.to(attn_dtype)\n        attn = self.attn_dropout(attn)\n\n        # weighted sum\n        # [N, h, S, T] x [N, h, T, c] --> [N, h, S, c]\n        out = torch.matmul(attn, value)\n\n        # [N, h, S, c] --> [N, S, h, c] --> [N, S, C]\n        out = out.transpose(1, 2).reshape(b_sz, S_len, -1)\n        out = self.out_proj(out)\n\n        return out\n\n    def forward_pytorch(\n        self,\n        x_q: Tensor,\n        x_kv: Optional[Tensor] = None,\n        key_padding_mask: Optional[Tensor] = None,\n        attn_mask: Optional[Tensor] = None,\n    ) -> Tensor:\n        out, _ = F.multi_head_attention_forward(\n            query=x_q,\n            key=x_kv if x_kv is not None else x_q,\n            value=x_kv if x_kv is not None else x_q,\n            embed_dim_to_check=self.embed_dim,\n            num_heads=self.num_heads,\n            in_proj_weight=torch.empty([0]),\n            in_proj_bias=self.qkv_proj.bias,\n            bias_k=None,\n            bias_v=None,\n            add_zero_attn=False,\n            dropout_p=self.attn_dropout.p,\n            out_proj_weight=self.out_proj.weight,\n            out_proj_bias=self.out_proj.bias,\n            training=self.training,\n            key_padding_mask=key_padding_mask,\n            need_weights=False,\n            attn_mask=attn_mask,\n            use_separate_proj_weight=True,\n            q_proj_weight=self.qkv_proj.weight[: self.embed_dim, ...],\n            k_proj_weight=self.qkv_proj.weight[\n                self.embed_dim : 2 * self.embed_dim, ...\n            ],\n            v_proj_weight=self.qkv_proj.weight[2 * self.embed_dim :, ...],\n        )\n        return out\n\n    def forward(\n        self,\n        x_q: Tensor,\n        x_kv: Optional[Tensor] = None,\n        key_padding_mask: Optional[Tensor] = None,\n        attn_mask: Optional[Tensor] = None,\n        *args,\n        **kwargs\n    ) -> Tensor:\n        if self.coreml_compatible:\n            # For CoreML, we follow batch-first format. Make sure the input is of the form\n            # [Batch , Sequence, Hidden_dim]\n            return self.forward_tracing(\n                x_q=x_q,\n                x_kv=x_kv,\n                key_padding_mask=key_padding_mask,\n                attn_mask=attn_mask,\n            )\n        elif kwargs.get(\"use_pytorch_mha\", False):\n            # pytorch uses sequence-first format. Make sure that input is of the form [Sequence, Batch, Hidden dim]\n            return self.forward_pytorch(\n                x_q=x_q,\n                x_kv=x_kv,\n                key_padding_mask=key_padding_mask,\n                attn_mask=attn_mask,\n            )\n        else:\n            # our default implementation format follows batch-first format. Make sure the input is of the form\n            # [Batch , Sequence, Hidden_dim]\n            return self.forward_default(\n                x_q=x_q,\n                x_kv=x_kv,\n                key_padding_mask=key_padding_mask,\n                attn_mask=attn_mask,\n            )\n"
  },
  {
    "path": "corenet/modeling/layers/normalization/__init__.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nimport importlib\nimport os\nfrom typing import Optional\n\nimport torch\n\nfrom corenet.modeling.layers.identity import Identity\nfrom corenet.utils import logger\n\nSUPPORTED_NORM_FNS = []\nNORM_LAYER_REGISTRY = {}\nNORM_LAYER_CLS = []\n\n\ndef register_norm_fn(name):\n    def register_fn(cls):\n        if name in SUPPORTED_NORM_FNS:\n            raise ValueError(\n                \"Cannot register duplicate normalization function ({})\".format(name)\n            )\n        SUPPORTED_NORM_FNS.append(name)\n        NORM_LAYER_REGISTRY[name] = cls\n        NORM_LAYER_CLS.append(cls)\n        return cls\n\n    return register_fn\n\n\ndef build_normalization_layer(\n    opts: argparse.Namespace,\n    num_features: int,\n    norm_type: Optional[str] = None,\n    num_groups: Optional[int] = None,\n    momentum: Optional[float] = None,\n) -> torch.nn.Module:\n    \"\"\"\n    Helper function to build the normalization layer.\n    The function can be used in either of below mentioned ways:\n    Scenario 1: Set the default normalization layers using command line arguments. This is useful when the same normalization\n    layer is used for the entire network (e.g., ResNet).\n    Scenario 2: Network uses different normalization layers. In that case, we can override the default normalization\n    layer by specifying the name using `norm_type` argument.\n    \"\"\"\n    if norm_type is None:\n        norm_type = getattr(opts, \"model.normalization.name\")\n    if num_groups is None:\n        num_groups = getattr(opts, \"model.normalization.groups\")\n    if momentum is None:\n        momentum = getattr(opts, \"model.normalization.momentum\")\n\n    norm_layer = None\n    norm_type = norm_type.lower()\n\n    if norm_type in NORM_LAYER_REGISTRY:\n        # For detecting non-cuda envs, we do not use torch.cuda.device_count() < 1\n        # condition because tests always use CPU, even if cuda device is available.\n        # Otherwise, we will get \"ValueError: SyncBatchNorm expected input tensor to be\n        # on GPU\" Error when running tests on a cuda-enabled node (usually linux).\n        #\n        # Note: We provide default value for getattr(opts, ...) because the configs may\n        # be missing \"dev.device\" attribute in the test env.\n        if (\n            \"cuda\" not in str(getattr(opts, \"dev.device\", \"cpu\"))\n            and \"sync_batch\" in norm_type\n        ):\n            # for a CPU-device, Sync-batch norm does not work. So, change to batch norm\n            norm_type = norm_type.replace(\"sync_\", \"\")\n        norm_layer = NORM_LAYER_REGISTRY[norm_type](\n            normalized_shape=num_features,\n            num_features=num_features,\n            momentum=momentum,\n            num_groups=num_groups,\n        )\n    elif norm_type == \"identity\":\n        norm_layer = Identity()\n    else:\n        logger.error(\n            \"Supported normalization layer arguments are: {}. Got: {}\".format(\n                SUPPORTED_NORM_FNS, norm_type\n            )\n        )\n    return norm_layer\n\n\ndef arguments_norm_layers(parser: argparse.ArgumentParser):\n    group = parser.add_argument_group(\n        title=\"Normalization layers\", description=\"Normalization layers\"\n    )\n\n    group.add_argument(\n        \"--model.normalization.name\",\n        default=\"batch_norm\",\n        type=str,\n        help=\"Normalization layer. Defaults to 'batch_norm'.\",\n    )\n    group.add_argument(\n        \"--model.normalization.groups\",\n        default=1,\n        type=str,\n        help=\"Number of groups in group normalization layer. Defaults to 1.\",\n    )\n    group.add_argument(\n        \"--model.normalization.momentum\",\n        default=0.1,\n        type=float,\n        help=\"Momentum in normalization layers. Defaults to 0.1\",\n    )\n\n    return parser\n\n\n# automatically import different normalization layers\nnorm_dir = os.path.dirname(__file__)\nfor file in os.listdir(norm_dir):\n    path = os.path.join(norm_dir, file)\n    if (\n        not file.startswith(\"_\")\n        and not file.startswith(\".\")\n        and (file.endswith(\".py\") or os.path.isdir(path))\n    ):\n        model_name = file[: file.find(\".py\")] if file.endswith(\".py\") else file\n        module = importlib.import_module(\n            \"corenet.modeling.layers.normalization.\" + model_name\n        )\n"
  },
  {
    "path": "corenet/modeling/layers/normalization/batch_norm.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom typing import Optional\n\nimport torch\nfrom torch import Tensor, nn\n\nfrom corenet.modeling.layers.normalization import register_norm_fn\n\n\n@register_norm_fn(name=\"batch_norm\")\n@register_norm_fn(name=\"batch_norm_2d\")\nclass BatchNorm2d(nn.BatchNorm2d):\n    \"\"\"\n    Applies a `Batch Normalization <https://arxiv.org/abs/1502.03167>`_ over a 4D input tensor\n\n    Args:\n        num_features (Optional, int): :math:`C` from an expected input of size :math:`(N, C, H, W)`\n        eps (Optional, float): Value added to the denominator for numerical stability. Default: 1e-5\n        momentum (Optional, float): Value used for the running_mean and running_var computation. Default: 0.1\n        affine (bool): If ``True``, use learnable affine parameters. Default: ``True``\n        track_running_stats: If ``True``, tracks running mean and variance. Default: ``True``\n\n    Shape:\n        - Input: :math:`(N, C, H, W)` where :math:`N` is the batch size, :math:`C` is the number of input channels,\n        :math:`H` is the input height, and :math:`W` is the input width\n        - Output: same shape as the input\n    \"\"\"\n\n    def __init__(\n        self,\n        num_features: int,\n        eps: Optional[float] = 1e-5,\n        momentum: Optional[float] = 0.1,\n        affine: Optional[bool] = True,\n        track_running_stats: Optional[bool] = True,\n        *args,\n        **kwargs\n    ) -> None:\n        super().__init__(\n            num_features=num_features,\n            eps=eps,\n            momentum=momentum,\n            affine=affine,\n            track_running_stats=track_running_stats,\n        )\n\n\n@register_norm_fn(name=\"batch_norm_fp32\")\nclass BatchNorm2dFP32(BatchNorm2d):\n    \"\"\"\n    Applies a `Batch Normalization <https://arxiv.org/abs/1502.03167>`_ over a 4D input tensor in FP32\n    \"\"\"\n\n    def __init__(\n        self,\n        num_features: int,\n        eps: Optional[float] = 1e-5,\n        momentum: Optional[float] = 0.1,\n        affine: Optional[bool] = True,\n        track_running_stats: Optional[bool] = True,\n        *args,\n        **kwargs\n    ) -> None:\n        super().__init__(\n            num_features=num_features,\n            eps=eps,\n            momentum=momentum,\n            affine=affine,\n            track_running_stats=track_running_stats,\n            *args,\n            **kwargs\n        )\n\n    def forward(self, input: Tensor) -> Tensor:\n        inp_dtype = input.dtype\n        return super().forward(input.to(torch.float32)).to(inp_dtype)\n\n\n@register_norm_fn(name=\"batch_norm_1d\")\nclass BatchNorm1d(nn.BatchNorm1d):\n    \"\"\"\n    Applies a `Batch Normalization <https://arxiv.org/abs/1502.03167>`_ over a 2D or 3D input tensor\n\n    Args:\n        num_features (Optional, int): :math:`C` from an expected input of size :math:`(N, C)` or :math:`(N, C, L)`\n        eps (Optional, float): Value added to the denominator for numerical stability. Default: 1e-5\n        momentum (Optional, float): Value used for the running_mean and running_var computation. Default: 0.1\n        affine (bool): If ``True``, use learnable affine parameters. Default: ``True``\n        track_running_stats: If ``True``, tracks running mean and variance. Default: ``True``\n\n    Shape:\n        - Input: :math:`(N, C)` or :math:`(N, C, L)` where :math:`N` is the batch size,\n        :math:`C` is the number of input channels,  and :math:`L` is the sequence length\n        - Output: same shape as the input\n    \"\"\"\n\n    def __init__(\n        self,\n        num_features: int,\n        eps: Optional[float] = 1e-5,\n        momentum: Optional[float] = 0.1,\n        affine: Optional[bool] = True,\n        track_running_stats: Optional[bool] = True,\n        *args,\n        **kwargs\n    ) -> None:\n        super().__init__(\n            num_features=num_features,\n            eps=eps,\n            momentum=momentum,\n            affine=affine,\n            track_running_stats=track_running_stats,\n        )\n\n\n@register_norm_fn(name=\"batch_norm_3d\")\nclass BatchNorm3d(nn.BatchNorm3d):\n    def __init__(\n        self,\n        num_features: int,\n        eps: Optional[float] = 1e-5,\n        momentum: Optional[float] = 0.1,\n        affine: Optional[bool] = True,\n        track_running_stats: Optional[bool] = True,\n        *args,\n        **kwargs\n    ) -> None:\n        \"\"\"\n        Applies a `Batch Normalization <https://arxiv.org/abs/1502.03167>`_ over a 5D input tensor\n\n        Args:\n            num_features (Optional, int): :math:`C` from an expected input of size :math:`(N, C, D, H, W)`\n            eps (Optional, float): Value added to the denominator for numerical stability. Default: 1e-5\n            momentum (Optional, float): Value used for the running_mean and running_var computation. Default: 0.1\n            affine (bool): If ``True``, use learnable affine parameters. Default: ``True``\n            track_running_stats: If ``True``, tracks running mean and variance. Default: ``True``\n\n        Shape:\n            - Input: :math:`(N, C, D, H, W)` where :math:`N` is the batch size, :math:`C` is the number of input\n            channels, :math:`D` is the input depth, :math:`H` is the input height, and :math:`W` is the input width\n            - Output: same shape as the input\n        \"\"\"\n        super().__init__(\n            num_features=num_features,\n            eps=eps,\n            momentum=momentum,\n            affine=affine,\n            track_running_stats=track_running_stats,\n        )\n"
  },
  {
    "path": "corenet/modeling/layers/normalization/group_norm.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom typing import Optional\n\nfrom torch import Tensor, nn\n\nfrom corenet.modeling.layers.normalization import register_norm_fn\n\n\n@register_norm_fn(name=\"group_norm\")\nclass GroupNorm(nn.GroupNorm):\n    \"\"\"\n    Applies a `Group Normalization <https://arxiv.org/abs/1803.08494>`_ over an input tensor\n\n    Args:\n        num_groups (int): number of groups to separate the input channels into\n        num_features (int): :math:`C` from an expected input of size :math:`(N, C, *)`\n        eps (Optional, float): Value added to the denominator for numerical stability. Default: 1e-5\n        affine (bool): If ``True``, use learnable affine parameters. Default: ``True``\n\n    Shape:\n        - Input: :math:`(N, C, *)` where :math:`N` is the batch size, :math:`C` is the number of input channels,\n        and :math:`*` is the remaining dimensions of the input tensor\n        - Output: same shape as the input\n\n    .. note::\n        GroupNorm is the same as LayerNorm when `num_groups=1` and it is the same as InstanceNorm when\n        `num_groups=C`.\n    \"\"\"\n\n    def __init__(\n        self,\n        num_groups: int,\n        num_features: int,\n        eps: Optional[float] = 1e-5,\n        affine: Optional[bool] = True,\n        *args,\n        **kwargs\n    ) -> None:\n        super().__init__(\n            num_groups=num_groups, num_channels=num_features, eps=eps, affine=affine\n        )\n"
  },
  {
    "path": "corenet/modeling/layers/normalization/instance_norm.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom typing import Optional\n\nfrom torch import Tensor, nn\n\nfrom corenet.modeling.layers.normalization import register_norm_fn\n\n\n@register_norm_fn(name=\"instance_norm\")\n@register_norm_fn(name=\"instance_norm_2d\")\nclass InstanceNorm2d(nn.InstanceNorm2d):\n    \"\"\"\n    Applies a `Instance Normalization <https://arxiv.org/abs/1607.08022>`_ over a 4D input tensor\n\n    Args:\n        num_features (int): :math:`C` from an expected input of size :math:`(N, C, H, W)`\n        eps (Optional, float): Value added to the denominator for numerical stability. Default: 1e-5\n        momentum (Optional, float): Value used for the running_mean and running_var computation. Default: 0.1\n        affine (bool): If ``True``, use learnable affine parameters. Default: ``True``\n        track_running_stats: If ``True``, tracks running mean and variance. Default: ``True``\n\n    Shape:\n        - Input: :math:`(N, C, H, W)` where :math:`N` is the batch size, :math:`C` is the number of input channels,\n        :math:`H` is the input height, and :math:`W` is the input width\n        - Output: same shape as the input\n    \"\"\"\n\n    def __init__(\n        self,\n        num_features: int,\n        eps: Optional[float] = 1e-5,\n        momentum: Optional[float] = 0.1,\n        affine: Optional[bool] = True,\n        track_running_stats: Optional[bool] = True,\n        *args,\n        **kwargs\n    ) -> None:\n        super().__init__(\n            num_features=num_features,\n            eps=eps,\n            momentum=momentum,\n            affine=affine,\n            track_running_stats=track_running_stats,\n        )\n\n\n@register_norm_fn(name=\"instance_norm_1d\")\nclass InstanceNorm1d(nn.InstanceNorm1d):\n    \"\"\"\n    Applies a `Instance Normalization <https://arxiv.org/abs/1607.08022>`_ over a 2D or 3D input tensor\n\n    Args:\n        num_features (int): :math:`C` from an expected input of size :math:`(N, C)` or :math:`(N, C, L)`\n        eps (Optional, float): Value added to the denominator for numerical stability. Default: 1e-5\n        momentum (Optional, float): Value used for the running_mean and running_var computation. Default: 0.1\n        affine (bool): If ``True``, use learnable affine parameters. Default: ``True``\n        track_running_stats: If ``True``, tracks running mean and variance. Default: ``True``\n\n    Shape:\n        - Input: :math:`(N, C)` or :math:`(N, C, L)` where :math:`N` is the batch size, :math:`C` is the number\n        of input channels,  and :math:`L` is the sequence length\n    - Output: same shape as the input\n    \"\"\"\n\n    def __init__(\n        self,\n        num_features: int,\n        eps: Optional[float] = 1e-5,\n        momentum: Optional[float] = 0.1,\n        affine: Optional[bool] = True,\n        track_running_stats: Optional[bool] = True,\n        *args,\n        **kwargs\n    ) -> None:\n        super().__init__(\n            num_features=num_features,\n            eps=eps,\n            momentum=momentum,\n            affine=affine,\n            track_running_stats=track_running_stats,\n        )\n"
  },
  {
    "path": "corenet/modeling/layers/normalization/layer_norm.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom typing import List, Optional, Union\n\nimport torch\nfrom torch import Size, Tensor, nn\n\nfrom corenet.modeling.layers.normalization import register_norm_fn\n\n\n@register_norm_fn(name=\"layer_norm\")\nclass LayerNorm(nn.LayerNorm):\n    r\"\"\"\n    Applies `Layer Normalization <https://arxiv.org/abs/1607.06450>`_ over a input tensor\n\n    Args:\n        normalized_shape (int or list or torch.Size): input shape from an expected input\n            of size\n\n            .. math::\n                [* \\times \\text{normalized\\_shape}[0] \\times \\text{normalized\\_shape}[1]\n                    \\times \\ldots \\times \\text{normalized\\_shape}[-1]]\n\n            If a single integer is used, it is treated as a singleton list, and this module will\n            normalize over the last dimension which is expected to be of that specific size.\n        eps (Optional, float): Value added to the denominator for numerical stability. Default: 1e-5\n        elementwise_affine (bool): If ``True``, use learnable affine parameters. Default: ``True``\n\n    Shape:\n        - Input: :math:`(N, *)` where :math:`N` is the batch size\n        - Output: same shape as the input\n    \"\"\"\n\n    def __init__(\n        self,\n        normalized_shape: Union[int, List[int], Size],\n        eps: Optional[float] = 1e-5,\n        elementwise_affine: Optional[bool] = True,\n        *args,\n        **kwargs\n    ):\n        super().__init__(\n            normalized_shape=normalized_shape,\n            eps=eps,\n            elementwise_affine=elementwise_affine,\n        )\n\n    def forward(self, x: Tensor) -> Tensor:\n        n_dim = x.ndim\n        if x.shape[1] == self.normalized_shape[0] and n_dim > 2:  # channel-first format\n            s, u = torch.std_mean(x, dim=1, keepdim=True, unbiased=False)\n            x = (x - u) / (s + self.eps)\n            if self.weight is not None:\n                # Using fused operation for performing affine transformation: x = (x * weight) + bias\n                n_dim = x.ndim - 2\n                new_shape = [1, self.normalized_shape[0]] + [1] * n_dim\n                x = torch.addcmul(\n                    input=self.bias.reshape(*[new_shape]),\n                    value=1.0,\n                    tensor1=x,\n                    tensor2=self.weight.reshape(*[new_shape]),\n                )\n            return x\n        elif x.shape[-1] == self.normalized_shape[0]:  # channel-last format\n            return super().forward(x)\n        else:\n            raise NotImplementedError(\n                \"LayerNorm is supported for channel-first and channel-last format only\"\n            )\n\n\n@register_norm_fn(name=\"layer_norm_2d\")\n@register_norm_fn(name=\"layer_norm_nchw\")\nclass LayerNorm2D_NCHW(nn.GroupNorm):\n    \"\"\"\n    Applies `Layer Normalization <https://arxiv.org/abs/1607.06450>`_ over a 4D input tensor\n\n    Args:\n        num_features (int): :math:`C` from an expected input of size :math:`(N, C, H, W)`\n        eps (Optional, float): Value added to the denominator for numerical stability. Default: 1e-5\n        elementwise_affine (bool): If ``True``, use learnable affine parameters. Default: ``True``\n\n    Shape:\n        - Input: :math:`(N, C, H, W)` where :math:`N` is the batch size, :math:`C` is the number of input channels,\n        :math:`H` is the input height, and :math:`W` is the input width\n        - Output: same shape as the input\n    \"\"\"\n\n    def __init__(\n        self,\n        num_features: int,\n        eps: Optional[float] = 1e-5,\n        elementwise_affine: Optional[bool] = True,\n        *args,\n        **kwargs\n    ) -> None:\n        super().__init__(\n            num_channels=num_features, eps=eps, affine=elementwise_affine, num_groups=1\n        )\n        self.num_channels = num_features\n\n    def __repr__(self):\n        return \"{}(num_channels={}, eps={}, affine={})\".format(\n            self.__class__.__name__, self.num_channels, self.eps, self.affine\n        )\n\n\n@register_norm_fn(name=\"layer_norm_fp32\")\nclass LayerNormFP32(LayerNorm):\n    \"\"\"\n    Applies `Layer Normalization <https://arxiv.org/abs/1607.06450>`_ over a input tensor with FP32 precision\n    \"\"\"\n\n    def __init__(\n        self,\n        normalized_shape: Union[int, List[int], Size],\n        eps: Optional[float] = 1e-5,\n        elementwise_affine: Optional[bool] = True,\n        *args,\n        **kwargs\n    ):\n        super().__init__(\n            normalized_shape=normalized_shape,\n            eps=eps,\n            elementwise_affine=elementwise_affine,\n            *args,\n            **kwargs\n        )\n\n    def forward(self, x: Tensor) -> Tensor:\n        # Convert input from dtype X to FP32 and perform normalization operation.\n        # This may help with underflow/overflow issues that we typically see with normalization layers\n        inp_dtype = x.dtype\n        return super().forward(x.to(torch.float32)).to(inp_dtype)\n"
  },
  {
    "path": "corenet/modeling/layers/normalization/rms_norm.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport torch\nfrom torch import Tensor, nn\n\nfrom corenet.modeling.layers.normalization import register_norm_fn\n\n\n@register_norm_fn(name=\"rms_norm\")\nclass RMSNorm(nn.Module):\n    def __init__(\n        self, num_features: int, eps: float = 1e-6, *unused_args, **unused_kwargs\n    ) -> None:\n        \"\"\"\n        `Root mean square (RMS) normalization layer <https://arxiv.org/abs/1910.07467>`_.\n\n        Args:\n            num_features: The dimension of the input tensor.\n            eps: A small value added to the denominator during normalization for numerical stability.\n        \"\"\"\n        super().__init__()\n        self.eps = eps\n        self.weight = nn.Parameter(torch.ones(num_features))\n        self.num_features = num_features\n\n    def _norm(self, x: Tensor) -> Tensor:\n        \"\"\"Apply the RMSNorm normalization to the input tensor.\n\n        Args:\n            x: The input tensor. The shape of the input tensor is [batch size, *, num features],\n                where * denotes any dimensions.\n\n        Returns:\n            The normalized tensor. The shape of the normalized tensor is the same as the input.\n\n        \"\"\"\n        return x * torch.rsqrt(x.pow(2).mean(-1, keepdim=True) + self.eps)\n\n    def forward(self, x: Tensor) -> Tensor:\n        \"\"\"Forward pass through the RMSNorm layer.\n\n        Args:\n            x: The input tensor. The shape of the input tensor is [batch size, *, num features],\n                where * denotes any dimensions.\n\n        Returns:\n            The output tensor after applying RMSNorm. The shape of the output tensor is the same\n            as the input tensor.\n\n        ...note:\n            The input is first converted to full precision and then normalized using RMSNorm.\n            The resulting output is then converted back to its original data type.\n        \"\"\"\n        output = self._norm(x.float()).type_as(x)\n        return output * self.weight\n\n    def extra_repr(self) -> str:\n        return (\n            super().extra_repr() + f\"num_features={self.num_features}, eps={self.eps}\"\n        )\n"
  },
  {
    "path": "corenet/modeling/layers/normalization/sync_batch_norm.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom typing import Optional\n\nimport torch\nfrom torch import Tensor, nn\n\nfrom corenet.modeling.layers.normalization import register_norm_fn\n\n\n@register_norm_fn(name=\"sync_batch_norm\")\nclass SyncBatchNorm(nn.SyncBatchNorm):\n    \"\"\"\n    Applies a `Synchronized Batch Normalization <https://arxiv.org/abs/1502.03167>`_ over the input tensor\n\n    Args:\n        num_features (Optional, int): :math:`C` from an expected input of size :math:`(N, C, *)`\n        eps (Optional, float): Value added to the denominator for numerical stability. Default: 1e-5\n        momentum (Optional, float): Value used for the running_mean and running_var computation. Default: 0.1\n        affine (bool): If ``True``, use learnable affine parameters. Default: ``True``\n        track_running_stats: If ``True``, tracks running mean and variance. Default: ``True``\n\n    Shape:\n        - Input: :math:`(N, C, *)` where :math:`N` is the batch size, :math:`C` is the number of input channels,\n        :math:`*` is the remaining input dimensions\n        - Output: same shape as the input\n\n    \"\"\"\n\n    def __init__(\n        self,\n        num_features: int,\n        eps: Optional[float] = 1e-5,\n        momentum: Optional[float] = 0.1,\n        affine: Optional[bool] = True,\n        track_running_stats: Optional[bool] = True,\n        *args,\n        **kwargs\n    ) -> None:\n        super().__init__(\n            num_features=num_features,\n            eps=eps,\n            momentum=momentum,\n            affine=affine,\n            track_running_stats=track_running_stats,\n        )\n\n\n@register_norm_fn(name=\"sync_batch_norm_fp32\")\nclass SyncBatchNormFP32(SyncBatchNorm):\n    \"\"\"\n    Synchronized BN in FP32\n    \"\"\"\n\n    def __init__(\n        self,\n        num_features: int,\n        eps: Optional[float] = 1e-5,\n        momentum: Optional[float] = 0.1,\n        affine: Optional[bool] = True,\n        track_running_stats: Optional[bool] = True,\n        *args,\n        **kwargs\n    ) -> None:\n        super().__init__(\n            num_features=num_features,\n            eps=eps,\n            momentum=momentum,\n            affine=affine,\n            track_running_stats=track_running_stats,\n        )\n\n    def forward(self, x: Tensor, *args, **kwargs) -> Tensor:\n        in_dtype = x.dtype\n        return super().forward(x.to(dtype=torch.float)).to(dtype=in_dtype)\n"
  },
  {
    "path": "corenet/modeling/layers/normalization_layers.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\nimport math\n\nfrom torch import nn\n\nfrom corenet.modeling.layers.normalization import (\n    NORM_LAYER_CLS,\n    build_normalization_layer,\n)\nfrom corenet.utils import logger\n\nnorm_layers_tuple = tuple(NORM_LAYER_CLS)\n\n\nget_normalization_layer = build_normalization_layer\n"
  },
  {
    "path": "corenet/modeling/layers/pixel_shuffle.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom torch import Tensor, nn\n\n\nclass PixelShuffle(nn.PixelShuffle):\n    \"\"\"\n    Rearranges elements in a tensor of shape :math:`(*, C \\times r^2, H, W)`\n    to a tensor of shape :math:`(*, C, H \\times r, W \\times r)`, where r is an upscale factor.\n\n    Args:\n        upscale_factor (int): factor to increase spatial resolution by\n\n    Shape:\n        - Input: :math:`(*, C \\times r^2, H, W)`, where * is zero or more dimensions\n        - Output: :math:`(*, C, H \\times r, W \\times r)`\n    \"\"\"\n\n    def __init__(self, upscale_factor: int, *args, **kwargs) -> None:\n        super(PixelShuffle, self).__init__(upscale_factor=upscale_factor)\n\n    def __repr__(self):\n        return \"{}(upscale_factor={})\".format(\n            self.__class__.__name__, self.upscale_factor\n        )\n"
  },
  {
    "path": "corenet/modeling/layers/pooling.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom typing import Optional\n\nfrom torch import Tensor, nn\n\n\nclass MaxPool2d(nn.MaxPool2d):\n    \"\"\"\n    Applies a 2D max pooling over a 4D input tensor.\n\n    Args:\n        kernel_size (Optional[int]): the size of the window to take a max over\n        stride (Optional[int]): The stride of the window. Default: 2\n        padding (Optional[int]): Padding to be added on both sides of the tensor. Default: 1\n\n    Shape:\n        - Input: :math:`(N, C, H_{in}, W_{in})` where :math:`N` is the batch size, :math:`C` is the input channels,\n            :math:`H_{in}` is the input height, and :math:`W_{in}` is the input width\n        - Output: :math:`(N, C, H_{out}, W_{out})` where :math:`H_{out}` is the output height, and :math:`W_{in}` is\n            the output width\n    \"\"\"\n\n    def __init__(\n        self,\n        kernel_size: Optional[int] = 3,\n        stride: Optional[int] = 2,\n        padding: Optional[int] = 1,\n        *args,\n        **kwargs\n    ) -> None:\n        super().__init__(kernel_size=kernel_size, stride=stride, padding=padding)\n\n    def __repr__(self):\n        return \"{}(kernel_size={}, stride={})\".format(\n            self.__class__.__name__, self.kernel_size, self.stride\n        )\n\n\nclass AvgPool2d(nn.AvgPool2d):\n    \"\"\"\n    Applies a 2D average pooling over a 4D input tensor.\n\n    Args:\n        kernel_size (Optional[int]): the size of the window to take a max over\n        stride (Optional[int]): The stride of the window. Default: 2\n        padding (Optional[int]): Padding to be added on both sides of the tensor. Default: 1\n        ceil_mode (Optional[bool]): When True, will use `ceil` instead of `floor` to compute the output shape. Default: False\n        count_include_pad (Optional[bool]): When True, will include the zero-padding in the averaging calculation. Default: True\n        divisor_override: if specified, it will be used as divisor, otherwise size of the pooling region will be used. Default: None\n\n    Shape:\n        - Input: :math:`(N, C, H_{in}, W_{in})` where :math:`N` is the batch size, :math:`C` is the input channels,\n            :math:`H_{in}` is the input height, and :math:`W_{in}` is the input width\n        - Output: :math:`(N, C, H_{out}, W_{out})` where :math:`H_{out}` is the output height, and :math:`W_{in}` is\n            the output width\n    \"\"\"\n\n    def __init__(\n        self,\n        kernel_size: tuple,\n        stride: Optional[tuple] = None,\n        padding: Optional[tuple] = (0, 0),\n        ceil_mode: Optional[bool] = False,\n        count_include_pad: Optional[bool] = True,\n        divisor_override: Optional[bool] = None,\n    ):\n        super(AvgPool2d, self).__init__(\n            kernel_size=kernel_size,\n            stride=stride,\n            padding=padding,\n            ceil_mode=ceil_mode,\n            count_include_pad=count_include_pad,\n            divisor_override=divisor_override,\n        )\n\n    def __repr__(self):\n        return \"{}(upscale_factor={})\".format(\n            self.__class__.__name__, self.upscale_factor\n        )\n"
  },
  {
    "path": "corenet/modeling/layers/positional_embedding.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport math\nfrom typing import Optional\n\nimport torch\nfrom torch import Tensor, nn\nfrom torch.nn import functional as F\n\nfrom corenet.modeling.layers import BaseLayer\n\n\nclass PositionalEmbedding(BaseLayer):\n    def __init__(\n        self,\n        opts,\n        num_embeddings: int,\n        embedding_dim: int,\n        padding_idx: Optional[int] = None,\n        is_learnable: Optional[bool] = False,\n        sequence_first: Optional[bool] = False,\n        interpolation_mode: Optional[str] = \"bilinear\",\n        *args,\n        **kwargs\n    ):\n        super().__init__(*args, **kwargs)\n        module = (\n            LearnablePositionalEmbedding\n            if is_learnable\n            else SinusoidalPositionalEmbedding\n        )\n        self.pos_embed = module(\n            opts,\n            num_embeddings=num_embeddings,\n            embedding_dim=embedding_dim,\n            padding_idx=padding_idx,\n            sequence_first=sequence_first,\n            interpolation_mode=interpolation_mode,\n            *args,\n            **kwargs\n        )\n\n    def forward(self, seq_len: int, *args, **kwargs) -> Tensor:\n        return self.pos_embed(seq_len, *args, **kwargs)\n\n    def __repr__(self):\n        return self.pos_embed.__repr__()\n\n\nclass LearnablePositionalEmbedding(nn.Module):\n    \"\"\"Learnable Positional embedding\"\"\"\n\n    def __init__(\n        self,\n        opts,\n        num_embeddings: int,\n        embedding_dim: int,\n        padding_idx: Optional[int] = None,\n        sequence_first: Optional[bool] = False,\n        interpolation_mode: Optional[str] = \"bilinear\",\n        *args,\n        **kwargs\n    ):\n        super().__init__()\n        self.pos_embed = nn.Parameter(torch.empty(1, 1, num_embeddings, embedding_dim))\n        self.embedding_dim = embedding_dim\n        self.num_embeddings = num_embeddings\n        self.padding_idx = padding_idx\n        self.sequence_first = sequence_first\n        self.interpolation_mode = interpolation_mode\n\n        self.reset_parameters()\n\n    def reset_parameters(self) -> None:\n        nn.init.trunc_normal_(self.pos_embed, mean=0, std=self.embedding_dim**-0.5)\n        if self.padding_idx is not None:\n            with torch.no_grad():\n                self.pos_embed[:, :, self.padding_idx, ...] = 0.0\n\n    def forward(self, seq_len: int, *args, **kwargs) -> Tensor:\n        # scale pos embedding\n        pos_embed = self.pos_embed\n        if self.padding_idx is not None:\n            with torch.no_grad():\n                pos_embed[:, :, self.padding_idx, ...] = 0.0\n\n        if seq_len != self.num_embeddings:\n            pos_embed = F.interpolate(\n                pos_embed,\n                size=(seq_len, self.embedding_dim),\n                mode=self.interpolation_mode,\n            )\n\n        # add dummy batch dimension\n        if self.sequence_first:\n            # Input is of the form [Seq_len, Batch, Embedding_dim]\n            return pos_embed.reshape(seq_len, 1, self.embedding_dim)\n        else:\n            # Input is of the form [Batch, Seq_len, Embedding_dim]\n            return pos_embed.reshape(1, seq_len, self.embedding_dim)\n\n    def __repr__(self):\n        return \"{}(num_embeddings={}, embedding_dim={}, padding_idx={}, sequence_first={})\".format(\n            self.__class__.__name__,\n            self.num_embeddings,\n            self.embedding_dim,\n            self.padding_idx,\n            self.sequence_first,\n        )\n\n\nclass SinusoidalPositionalEmbedding(nn.Module):\n    def __init__(\n        self,\n        opts,\n        num_embeddings: int,\n        embedding_dim: int,\n        padding_idx: Optional[int] = None,\n        sequence_first: Optional[bool] = False,\n        interpolation_mode: Optional[str] = \"bilinear\",\n        *args,\n        **kwargs\n    ):\n        super().__init__()\n        self.padding_idx = padding_idx\n        self.num_embeddings = num_embeddings\n        self.embedding_dim = embedding_dim\n        self.sequence_first = sequence_first\n        self.interpolation_mode = interpolation_mode\n        self.register_buffer(\"pos_embed\", self.get_weights())\n\n    def get_weights(self) -> Tensor:\n        \"\"\"Build sinusoidal embeddings. Adapted from Fairseq.\"\"\"\n        half_dim = self.embedding_dim // 2\n        emb = math.log(10000) / (half_dim - 1)\n        emb = torch.exp(torch.arange(half_dim, dtype=torch.float) * -emb)\n        emb = torch.arange(self.num_embeddings, dtype=torch.float).unsqueeze(\n            1\n        ) * emb.unsqueeze(0)\n        emb = torch.cat([torch.sin(emb), torch.cos(emb)], dim=1).reshape(\n            self.num_embeddings, -1\n        )\n        if self.embedding_dim % 2 == 1:\n            # zero pad\n            emb = torch.cat([emb, torch.zeros(self.num_embeddings, 1)], dim=1)\n\n        # set embeddings corresponding to padding index to 0\n        if self.padding_idx is not None:\n            emb[self.padding_idx, :] = 0\n        return emb.unsqueeze(0).unsqueeze(0)\n\n    def forward(self, seq_len: int, *args, **kwargs) -> Tensor:\n        # scale pos embedding\n        pos_embed = self.pos_embed\n\n        if seq_len != self.num_embeddings:\n            pos_embed = F.interpolate(\n                pos_embed,\n                size=(seq_len, self.embedding_dim),\n                mode=self.interpolation_mode,\n            )\n\n        if self.sequence_first:\n            # Input is of the form [Seq_len, Batch, Embedding_dim]\n            return pos_embed.reshape(seq_len, 1, self.embedding_dim)\n        else:\n            # Input is of the form [Batch, Seq_len, Embedding_dim]\n            return pos_embed.reshape(1, seq_len, self.embedding_dim)\n\n    def __repr__(self):\n        return \"{}(num_embeddings={}, embedding_dim={}, padding_idx={}, sequence_first={})\".format(\n            self.__class__.__name__,\n            self.num_embeddings,\n            self.embedding_dim,\n            self.padding_idx,\n            self.sequence_first,\n        )\n"
  },
  {
    "path": "corenet/modeling/layers/positional_encoding.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport math\nfrom typing import Optional\n\nimport torch\nfrom torch import Tensor, nn\n\nfrom corenet.modeling.layers.base_layer import BaseLayer\nfrom corenet.modeling.layers.dropout import Dropout\n\n\nclass SinusoidalPositionalEncoding(BaseLayer):\n    \"\"\"\n    This layer adds sinusoidal positional embeddings to a 3D input tensor. The code has been adapted from\n    `Pytorch tutorial <https://pytorch.org/tutorials/beginner/transformer_tutorial.html>`_\n\n    Args:\n        d_model (int): dimension of the input tensor\n        dropout (Optional[float]): Dropout rate. Default: 0.0\n        max_len (Optional[int]): Max. number of patches (or seq. length). Default: 5000\n        channels_last (Optional[bool]): Channels dimension is the last in the input tensor\n\n    Shape:\n        - Input: :math:`(N, C, P)` or :math:`(N, P, C)` where :math:`N` is the batch size, :math:`C` is the embedding dimension,\n            :math:`P` is the number of patches\n        - Output: same shape as the input\n\n    \"\"\"\n\n    def __init__(\n        self,\n        d_model: int,\n        dropout: Optional[float] = 0.0,\n        max_len: Optional[int] = 5000,\n        channels_last: Optional[bool] = True,\n        *args,\n        **kwargs\n    ) -> None:\n\n        position_last = not channels_last\n\n        pos_encoding = torch.zeros(max_len, d_model)\n        position = torch.arange(0, max_len, dtype=torch.float).unsqueeze(1)\n        div_term = torch.exp(\n            torch.arange(0, d_model, 2).float() * (-math.log(10000.0) / d_model)\n        )\n        pos_encoding[:, 0::2] = torch.sin(position * div_term)\n        pos_encoding[:, 1::2] = torch.cos(position * div_term)\n        # add dummy batch dimension\n        pos_encoding = pos_encoding.unsqueeze(0)  # [1 x C x P_max)\n\n        patch_dim = -2  # patch dimension is second last (N, P, C)\n        if position_last:\n            pos_encoding = pos_encoding.transpose(\n                1, 2\n            )  # patch dimension is last (N, C, P)\n            patch_dim = -1  # patch dimension is last (N, C, P)\n\n        super().__init__()\n\n        self.dropout = Dropout(p=dropout)\n        self.patch_dim = patch_dim\n        self.register_buffer(\"pe\", pos_encoding)\n\n    def forward_patch_last(\n        self, x, indices: Optional[Tensor] = None, *args, **kwargs\n    ) -> Tensor:\n        # seq_length should be the last dim\n        if indices is None:\n            x = x + self.pe[..., : x.shape[-1]]\n        else:\n            ndim = x.ndim\n            repeat_size = [x.shape[0]] + [-1] * (ndim - 1)\n\n            pe = self.pe.expand(repeat_size)\n            selected_pe = torch.gather(pe, index=indices, dim=-1)\n            x = x + selected_pe\n        return self.dropout(x)\n\n    def forward_others(\n        self, x, indices: Optional[Tensor] = None, *args, **kwargs\n    ) -> Tensor:\n        # seq_length should be the second last dim\n        if indices is None:\n            x = x + self.pe[..., : x.shape[-2], :]\n        else:\n            ndim = x.ndim\n            repeat_size = [x.shape[0]] + [-1] * (ndim - 1)\n\n            pe = self.pe.expand(repeat_size)\n            selected_pe = torch.gather(pe, index=indices, dim=-2)\n            x = x + selected_pe\n        return self.dropout(x)\n\n    def forward(self, x, indices: Optional[Tensor] = None, *args, **kwargs) -> Tensor:\n        if self.patch_dim == -1:\n            return self.forward_patch_last(x, indices=indices)\n        else:\n            return self.forward_others(x, indices=indices)\n\n    def __repr__(self):\n        return \"{}(dropout={})\".format(self.__class__.__name__, self.dropout.p)\n\n\nclass LearnablePositionEncoding(BaseLayer):\n    \"\"\"\n    This layer adds learnable positional embeddings to a 3D input tensor.\n\n    Args:\n        embed_dim (int): dimension of the input tensor\n        num_embeddings (int): number of input embeddings. This is similar to vocab size in NLP.\n        dropout (Optional[float]): Dropout rate. Default: 0.0\n        channels_last (Optional[bool]): Channels dimension is the last in the input tensor\n\n    Shape:\n        - Input: :math:`(N, *, C, P)` or :math:`(N, *, P, C)` where :math:`N` is the batch size, :math:`C` is the embedding dimension,\n            :math:`P` is the number of patches\n        - Output: same shape as the input\n\n    \"\"\"\n\n    def __init__(\n        self,\n        embed_dim: int,\n        num_embeddings: int,\n        dropout: Optional[float] = 0.0,\n        channels_last: Optional[bool] = True,\n        *args,\n        **kwargs\n    ) -> None:\n        super().__init__()\n        self.pos_emb = nn.Embedding(\n            num_embeddings=num_embeddings, embedding_dim=embed_dim\n        )\n        self.channel_last = channels_last\n        self.dropout = Dropout(p=dropout)\n\n    def forward(self, x, *args, **kwargs) -> Tensor:\n        num_embeddings = x.shape[-2] if self.channel_last else x.shape[-1]\n        posistions = torch.arange(num_embeddings, dtype=torch.int64, device=x.device)\n        position_emb = self.pos_emb(posistions)\n        position_emb = position_emb.expand_as(x)\n        x = x + position_emb\n        return self.dropout(x)\n\n    def __repr__(self):\n        return \"{}(embed_dim={}, vocab_size={}, dropout={})\".format(\n            self.__class__.__name__,\n            self.pos_emb.embedding_dim,\n            self.pos_emb.num_embeddings,\n            self.dropout.p,\n        )\n"
  },
  {
    "path": "corenet/modeling/layers/random_layers.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport random\nfrom typing import List, Optional\n\nfrom torch import Tensor\n\nfrom corenet.modeling.layers.base_layer import BaseLayer\nfrom corenet.utils.math_utils import bound_fn\n\n\nclass RandomApply(BaseLayer):\n    \"\"\"\n    This layer randomly applies a list of modules during training.\n\n    Args:\n        module_list (List): List of modules\n        keep_p (Optional[float]): Keep P modules from the list during training. Default: 0.8 (or 80%)\n    \"\"\"\n\n    def __init__(\n        self, module_list: List, keep_p: Optional[float] = 0.8, *args, **kwargs\n    ) -> None:\n        super().__init__()\n        n_modules = len(module_list)\n        self.module_list = module_list\n\n        self.module_indexes = [i for i in range(1, n_modules)]\n        k = int(round(n_modules * keep_p))\n        self.keep_k = bound_fn(min_val=1, max_val=n_modules, value=k)\n\n    def forward(self, x: Tensor) -> Tensor:\n        if self.training:\n            indexes = [0] + sorted(random.sample(self.module_indexes, k=self.keep_k))\n            for idx in indexes:\n                x = self.module_list[idx](x)\n        else:\n            for layer in self.module_list:\n                x = layer(x)\n        return x\n\n    def __repr__(self):\n        format_string = \"{}(apply_k (N={})={}, \".format(\n            self.__class__.__name__, len(self.module_list), self.keep_k\n        )\n        for layer in self.module_list:\n            format_string += \"\\n\\t {}\".format(layer)\n        format_string += \"\\n)\"\n        return format_string\n"
  },
  {
    "path": "corenet/modeling/layers/rotary_embeddings.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom typing import Tuple\n\nimport torch\nfrom torch import Tensor\n\n\ndef _negate_half(x: Tensor) -> Tensor:\n    \"\"\"\n    Computes the negative half of the input tensor along the last dimension.\n\n    Args:\n        x: Input tensor.\n\n    Returns:\n        Tensor with the negative second half preceding the first half along the last dimension.\n    \"\"\"\n    x1, x2 = x.chunk(2, dim=-1)\n    return torch.cat((-x2, x1), dim=-1)\n\n\ndef _apply_rotary_pos_emb(x: Tensor, pos_sin: Tensor, pos_cos: Tensor) -> Tensor:\n    \"\"\"\n    Applies rotary positional embeddings to the input tensor.\n\n    Args:\n        x: Input tensor.\n        pos_sin: Sine positional embeddings. The shape of 'pos_sin' embeddings is\n                [1, 1, number of key tokens, model dimension].\n        pos_cos: Cosine positional embeddings. The shape of 'pos_cos' embeddings is\n                [1, 1, number of key tokens, model dimension].\n\n    Returns:\n        Tensor with rotary positional embeddings applied.\n    \"\"\"\n    return (x * pos_cos) + (_negate_half(x) * pos_sin)\n\n\nclass RotaryEmbedding(torch.nn.Module):\n    \"\"\"\n    The rotary position embeddings (aka RoPE) from `RoFormer <https://arxiv.org/abs/2104.09864>`_.\n\n    RoPE encodes the position information of tokens using a rotation matrix, and is able to capture\n    explicit relative positional dependencies.\n\n    Args:\n        model_dim: The dimensionality of the model's hidden state.\n        max_seq_length: Maximum sequence length.\n        freq_constant: A constant used for computing frequencies.\n    \"\"\"\n\n    def __init__(\n        self, model_dim: int, max_seq_length: int, freq_constant: int = 10000\n    ) -> None:\n        inv_freq = 1.0 / (\n            freq_constant\n            ** (torch.arange(0, model_dim, 2, dtype=torch.float32) / model_dim)\n        )\n        super().__init__()\n\n        self.model_dim = model_dim\n        self.freq_constant = freq_constant\n        self.max_seq_length = max_seq_length\n\n        self.register_buffer(\"inv_freq\", inv_freq, persistent=False)\n        self._cached_cos = None\n        self._cached_sin = None\n        self._cached_seq_length = max_seq_length\n        self._compute_sin_cos_embeddings(max_seq_length)\n\n    def extra_repr(self) -> str:\n        return f\"\\tmodel_dim={self.model_dim}, max_seq_length={self.max_seq_length}, freq_constant={self.freq_constant}\"\n\n    def _compute_sin_cos_embeddings(\n        self,\n        key_len: int,\n        key_device: torch.device = torch.device(\"cpu\"),\n        key_dtype: torch.dtype = torch.float32,\n    ) -> None:\n        \"\"\"\n        Compute sine and cos embeddings.\n\n        Args:\n            key_len: Number of tokens in the key embeddings in the transformer model.\n            device: Device where the key embeddings are stored.\n            key_dtype: Data type of the key embeddings.\n\n        Returns:\n            None\n\n        ...note:\n            We recalculate the sine and cosine embeddings if any of the following conditions are met:\n                1. The number of tokens in key embeddings are greater than the cached sequence length.\n                2. Sine and cosine caches are empty.\n                3. The device and data type of sine and cosine embeddings does not match with the key embeddings.\n        \"\"\"\n        if (\n            key_len > self._cached_seq_length\n            or self._cached_cos is None\n            or (self._cached_cos is not None and self._cached_cos.device != key_device)\n            or (self._cached_cos is not None and self._cached_cos.dtype != key_dtype)\n            or self._cached_sin is None\n            or (self._cached_sin is not None and self._cached_sin.device != key_device)\n            or (self._cached_sin is not None and self._cached_sin.dtype != key_dtype)\n        ):\n            self._cached_seq_length = max(key_len, self._cached_seq_length)\n\n            # The shape of 'pos_index' is [number of key tokens]\n            pos_index = torch.arange(\n                self._cached_seq_length,\n                dtype=torch.float32,\n                device=self.inv_freq.device,\n            )\n            # The shape of 'pos_index_theta' is [number of key tokens, model dimension]\n            pos_index_theta = torch.einsum(\"i,j->ij\", pos_index, self.inv_freq)\n            # The shape of 'emb' is [number of key tokens, model dimension]\n            emb = torch.cat((pos_index_theta, pos_index_theta), dim=-1)\n\n            # the shape of cos and sin embeddings is [number of key tokens, model_dim]\n            cos_emb = emb.cos().to(dtype=key_dtype, device=key_device)\n            sin_emb = emb.sin().to(dtype=key_dtype, device=key_device)\n\n            # the shape of cached cos and sin embeddings is [1, 1, number of key tokens, model_dim]\n            self._cached_cos = cos_emb[None, None, :, :]\n            self._cached_sin = sin_emb[None, None, :, :]\n\n    def forward(\n        self,\n        query: torch.Tensor,\n        key: torch.Tensor,\n    ) -> Tuple[torch.Tensor, torch.Tensor]:\n        \"\"\"\n        The forward function of RoPE embeddings.\n\n        Args:\n            query: Query embeddings in the transformer model. The shape of query embeddings is\n                [Batch, number of query heads, number of query tokens, model dimension].\n            key: Key embeddings in the transformer model. The shape of key embeddings is\n                [Batch, number of key heads, number of key tokens, model dimension].\n\n        Returns:\n            A tuple containing the query and key embeddings with positional information. The shape of the returned query\n            and key embeddings is the same as the input query and key embeddings respectively.\n\n        ...note:\n            The RoPE embedding computation is done in full-precision. After the computation, input query and key tensors\n            are casted to original input datatype.\n        \"\"\"\n        dim = key.shape[-1]\n        key_len = key.shape[2]\n        query_len = query.shape[2]\n\n        assert dim == self.model_dim\n        assert key.device == query.device\n        assert key.dtype == query.dtype\n\n        # In the context of self-attention, the lengths of keys and queries are equal.\n        # However, in generation tasks, such as predicting the next token in a sequence, the lengths of keys and queries\n        # can differ. For instance, when employing key-value (KV) caching for sequence prediction, the keys\n        # represent embeddings of previous tokens and the current token, while the query corresponds\n        # to the embedding of the current token only.\n        assert (\n            key_len >= query_len\n        ), \"Number of keys has to be greater than or equal to number of queries.\"\n\n        query_float = query.float()\n        key_float = key.float()\n\n        self._compute_sin_cos_embeddings(\n            key_len, key_device=key_float.device, key_dtype=key_float.dtype\n        )\n        query_float = _apply_rotary_pos_emb(\n            x=query_float,\n            pos_sin=self._cached_sin[..., key_len - query_len : key_len, :],\n            pos_cos=self._cached_cos[..., key_len - query_len : key_len, :],\n        )\n        key_float = _apply_rotary_pos_emb(\n            x=key_float,\n            pos_sin=self._cached_sin[..., :key_len, :],\n            pos_cos=self._cached_cos[..., :key_len, :],\n        )\n\n        return query_float.type_as(query), key_float.type_as(key)\n"
  },
  {
    "path": "corenet/modeling/layers/single_head_attention.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom typing import Optional\n\nimport torch\nfrom torch import Tensor, nn\nfrom torch.nn import functional as F\n\nfrom corenet.modeling.layers.base_layer import BaseLayer\nfrom corenet.modeling.layers.dropout import Dropout\nfrom corenet.modeling.layers.linear_layer import LinearLayer\n\n\nclass SingleHeadAttention(BaseLayer):\n    \"\"\"\n    This layer applies a single-head attention as described in `DeLighT <https://arxiv.org/abs/2008.00623>`_ paper\n\n    Args:\n        embed_dim (int): :math:`C_{in}` from an expected input of size :math:`(N, P, C_{in})`\n        attn_dropout (Optional[float]): Attention dropout. Default: 0.0\n        bias (Optional[bool]): Use bias or not. Default: ``True``\n\n    Shape:\n        - Input: :math:`(N, P, C_{in})` where :math:`N` is batch size, :math:`P` is number of patches,\n        and :math:`C_{in}` is input embedding dim\n        - Output: same shape as the input\n\n    \"\"\"\n\n    def __init__(\n        self,\n        embed_dim: int,\n        attn_dropout: Optional[float] = 0.0,\n        bias: Optional[bool] = True,\n        *args,\n        **kwargs\n    ) -> None:\n        super().__init__()\n\n        self.qkv_proj = LinearLayer(\n            in_features=embed_dim, out_features=3 * embed_dim, bias=bias\n        )\n\n        self.attn_dropout = Dropout(p=attn_dropout)\n        self.out_proj = LinearLayer(\n            in_features=embed_dim, out_features=embed_dim, bias=bias\n        )\n\n        self.softmax = nn.Softmax(dim=-1)\n        self.embed_dim = embed_dim\n        self.scaling = self.embed_dim**-0.5\n\n    def __repr__(self) -> str:\n        return \"{}(embed_dim={}, attn_dropout={})\".format(\n            self.__class__.__name__, self.embed_dim, self.attn_dropout.p\n        )\n\n    def forward(\n        self,\n        x_q: Tensor,\n        x_kv: Optional[Tensor] = None,\n        key_padding_mask: Optional[Tensor] = None,\n        attn_mask: Optional[Tensor] = None,\n        *args,\n        **kwargs\n    ) -> Tensor:\n        # [N, P, C] --> [N, P, 3C]\n        if x_kv is None:\n            qkv = self.qkv_proj(x_q)\n            # [N, P, 3C] --> [N, P, C] x 3\n            query, key, value = torch.chunk(qkv, chunks=3, dim=-1)\n        else:\n            query = F.linear(\n                x_q,\n                weight=self.qkv_proj.weight[: self.embed_dim, ...],\n                bias=self.qkv_proj.bias[: self.embed_dim],\n            )\n\n            # [N, P, C] --> [N, P, 2C]\n            kv = F.linear(\n                x_kv,\n                weight=self.qkv_proj.weight[self.embed_dim :, ...],\n                bias=self.qkv_proj.bias[self.embed_dim :],\n            )\n            key, value = torch.chunk(kv, chunks=2, dim=-1)\n\n        query = query * self.scaling\n\n        # [N, P, C] --> [N, C, P]\n        key = key.transpose(-2, -1)\n\n        # QK^T\n        # [N, P, C] x [N, C, P] --> [N, P, P]\n        attn = torch.matmul(query, key)\n\n        if attn_mask is not None:\n            # attn_mask shape should be the same as attn\n            assert list(attn_mask.shape) == list(\n                attn.shape\n            ), \"Shape of attention mask and attn should be the same. Got: {} and {}\".format(\n                attn_mask.shape, attn.shape\n            )\n            attn = attn + attn_mask\n\n        if key_padding_mask is not None:\n            # Do not attend to padding positions\n            # key padding mask size is [N, P]\n            batch_size, num_src_tokens, num_tgt_tokens = attn.shape\n            assert key_padding_mask.dim() == 2 and list(key_padding_mask.shape) == [\n                batch_size,\n                num_tgt_tokens,\n            ], \"Key_padding_mask should be 2-dimension with shape [{}, {}]. Got: {}\".format(\n                batch_size, num_tgt_tokens, key_padding_mask.shape\n            )\n            attn = attn.masked_fill(\n                key_padding_mask.unsqueeze(1).to(torch.bool),\n                float(\"-inf\"),\n            )\n\n        attn = self.softmax(attn)\n        attn = self.attn_dropout(attn)\n\n        # weighted sum\n        # [N, P, P] x [N, P, C] --> [N, P, C]\n        out = torch.matmul(attn, value)\n        out = self.out_proj(out)\n\n        return out\n"
  },
  {
    "path": "corenet/modeling/layers/softmax.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom typing import Optional\n\nfrom torch import Tensor, nn\n\n\nclass Softmax(nn.Softmax):\n    \"\"\"\n    Applies the Softmax function to an input tensor along the specified dimension\n\n    Args:\n        dim (int): Dimension along which softmax to be applied. Default: -1\n\n    Shape:\n        - Input: :math:`(*)` where :math:`*` is one or more dimensions\n        - Output: same shape as the input\n    \"\"\"\n\n    def __init__(self, dim: Optional[int] = -1, *args, **kwargs):\n        super().__init__(dim=dim)\n"
  },
  {
    "path": "corenet/modeling/layers/stochastic_depth.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom torch import Tensor\nfrom torchvision.ops import StochasticDepth as StochasticDepthTorch\n\n\nclass StochasticDepth(StochasticDepthTorch):\n    \"\"\"\n    Implements the Stochastic Depth `\"Deep Networks with Stochastic Depth\"\n    <https://arxiv.org/abs/1603.09382>`_ used for randomly dropping residual\n    branches of residual architectures.\n    \"\"\"\n\n    def __init__(self, p: float, mode: str) -> None:\n        super().__init__(p=p, mode=mode)\n"
  },
  {
    "path": "corenet/modeling/layers/token_merging.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom typing import Tuple\n\nimport torch\nfrom torch import nn\nfrom torch.nn import functional as F\n\nfrom corenet.modeling.layers import linear_layer\nfrom corenet.modeling.layers.normalization import layer_norm\n\n\nclass TokenMerging(nn.Module):\n    \"\"\"\n    Merge tokens from a [batch_size, sequence_length, num_channels] tensor\n    using a linear projection.\n\n    This function also updates masks and adds padding as needed to make the\n    sequence length divisible by the window size before merging tokens.\n\n    Args:\n        dim: Number of input channels.\n        window: The size of the window to merge into a single token.\n    \"\"\"\n\n    def __init__(self, dim: int, window: int = 2) -> None:\n        super().__init__()\n        self.dim = dim\n        self.reduction = linear_layer.LinearLayer(window * dim, dim, bias=False)\n        self.norm = layer_norm.LayerNorm(dim)\n        self.window = window\n\n    def forward(\n        self, x: torch.Tensor, key_padding_mask: torch.Tensor\n    ) -> Tuple[torch.Tensor, torch.Tensor]:\n        \"\"\"\n        Perform token merging.\n\n        Args:\n            x: A tensor of shape [batch_size, sequence_length, num_channels].\n            key_padding_mask: A tensor of shape [batch_size, sequence_length]\n                with \"-inf\" values at mask tokens, and \"0\" values at unmasked\n                tokens.\n\n        Returns:\n            A tensor of shape [batch_size, math.ceil(sequence_length /\n                self.window), num_channels], where @self.window is the window\n                size.\n        \"\"\"\n        if key_padding_mask is not None:\n            # Zero out the masked portion of @x to make sure it doesn't\n            # participate in linear projections after windowing.\n            x[key_padding_mask == float(\"-inf\")] = 0\n\n        x, key_padding_mask = pad_x_and_mask(x, key_padding_mask, self.window)\n        B, N, C = x.shape\n\n        x = x.unfold(1, self.window, self.window)  # [B, N // window, C, window]\n        x = x.reshape(B, N // self.window, C * self.window)\n        x = self.reduction(x)  # [B, N // self.window, C]\n        x = self.norm(x)\n\n        if key_padding_mask is not None:\n            assert key_padding_mask.shape == (B, N)\n            key_padding_mask = key_padding_mask.unfold(\n                1, self.window, self.window\n            )  # [B, N // window, window].\n            key_padding_mask = key_padding_mask.max(dim=-1).values  # [B, N // window].\n\n        return x, key_padding_mask\n\n    def extra_repr(self) -> str:\n        return f\"dim={self.dim}, window={self.window}\"\n\n\ndef pad_x_and_mask(\n    x: torch.Tensor, key_padding_mask: torch.Tensor, window_size: int\n) -> Tuple[torch.Tensor, torch.Tensor]:\n    \"\"\"\n    Apply padding to @x and @key_padding_mask to make their lengths divisible\n    by @window_size.\n\n    Args:\n        x: The input tensor of shape [B, N, C].\n        key_padding_mask: The mask of shape [B, N].\n        window_size: the N dimension of @x and @key_padding_mask will be padded\n            to make them divisble by this number.\n\n    Returns:\n        A tuple containing @x and @key_padding_mask, with padding applied.\n    \"\"\"\n    B, N, _ = x.shape\n    padding = (window_size - (N % window_size)) % window_size\n\n    if key_padding_mask is not None:\n        key_padding_mask = F.pad(key_padding_mask, (0, padding), value=float(\"-inf\"))\n\n    # Apply similar padding to x which is [B, N, C] before padding.\n    x = F.pad(x, (0, 0, 0, padding), value=0)\n\n    return x, key_padding_mask\n"
  },
  {
    "path": "corenet/modeling/layers/upsample.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom typing import Optional, Tuple, Union\n\nimport torch\nfrom torch import Tensor, nn\n\n\nclass UpSample(nn.Upsample):\n    \"\"\"\n    This layer upsamples a given input tensor.\n\n    Args:\n        size (Optional[Union[int, Tuple[int, ...]]): Output spatial size. Default: None\n        scale_factor (Optional[float]): Scale each spatial dimension of the input by this factor. Default: None\n        mode (Optional[str]): Upsampling algorithm (``'nearest'``, ``'linear'``, ``'bilinear'``, ``'bicubic'`` and ``'trilinear'``. Default: ``'nearest'``\n        align_corners (Optional[bool]): if ``True``, the corner pixels of the input and output tensors are aligned, and thus preserving the values at\n            those pixels. This only has effect when :attr:`mode` is ``'linear'``, ``'bilinear'``, ``'bicubic'``, or ``'trilinear'``.\n            Default: ``None``\n\n    Shape:\n        - Input: :math:`(N, C, W_{in})` or :math:`(N, C, H_{in}, W_{in})` or :math:`(N, C, D_{in}, H_{in}, W_{in})`\n        - Output: :math:`(N, C, W_{out})` or :math:`(N, C, H_{out}, W_{out})` or :math:`(N, C, D_{out}, H_{out}, W_{out})`\n    \"\"\"\n\n    def __init__(\n        self,\n        size: Optional[Union[int, Tuple[int, ...]]] = None,\n        scale_factor: Optional[float] = None,\n        mode: Optional[str] = \"nearest\",\n        align_corners: Optional[bool] = None,\n        *args,\n        **kwargs\n    ) -> None:\n        super().__init__(\n            size=size, scale_factor=scale_factor, mode=mode, align_corners=align_corners\n        )\n"
  },
  {
    "path": "corenet/modeling/matcher_det/__init__.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\n\nfrom corenet.modeling.matcher_det.base_matcher import BaseMatcher\nfrom corenet.utils import logger\nfrom corenet.utils.registry import Registry\n\n# register BOX Matcher\nMATCHER_REGISTRY = Registry(\n    \"matcher\",\n    base_class=BaseMatcher,\n    lazy_load_dirs=[\"corenet/modeling/matcher_det\"],\n    internal_dirs=[\"corenet/internal\", \"corenet/internal/projects/*\"],\n)\n\n\ndef arguments_box_matcher(parser: argparse.ArgumentParser):\n    group = parser.add_argument_group(\"Matcher\", \"Matcher\")\n    group.add_argument(\n        \"--matcher.name\",\n        type=str,\n        help=\"Name of the matcher. Matcher matches anchors with GT box coordinates\",\n    )\n\n    # add segmentation specific arguments\n    parser = MATCHER_REGISTRY.all_arguments(parser)\n    return parser\n\n\ndef build_matcher(opts, *args, **kwargs):\n    matcher_name = getattr(opts, \"matcher.name\", None)\n    # We registered the base class using a special `name` (i.e., `__base__`)\n    # in order to access the arguments defined inside those classes. However, these classes are not supposed to\n    # be used. Therefore, we raise an error for such cases\n    if matcher_name == \"__base__\":\n        logger.error(\"__base__ can't be used as a projection name. Please check.\")\n\n    matcher = MATCHER_REGISTRY[matcher_name](opts, *args, **kwargs)\n    return matcher\n"
  },
  {
    "path": "corenet/modeling/matcher_det/base_matcher.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\n\n\nclass BaseMatcher(object):\n    \"\"\"\n    Base class for matching anchor boxes and labels for the task of object detection\n    \"\"\"\n\n    def __init__(self, opts, *args, **kwargs) -> None:\n        super(BaseMatcher, self).__init__()\n        self.opts = opts\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser):\n        \"\"\"Add class-specific arguments\"\"\"\n        return parser\n\n    def __call__(self, *args, **kwargs):\n        raise NotImplementedError\n"
  },
  {
    "path": "corenet/modeling/matcher_det/ssd_matcher.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nfrom typing import Optional, Tuple, Union\n\nimport numpy as np\nimport torch\nfrom torch import Tensor\n\nfrom corenet.modeling.matcher_det import MATCHER_REGISTRY, BaseMatcher\nfrom corenet.modeling.misc.box_utils import (\n    center_form_to_corner_form,\n    convert_boxes_to_locations,\n    convert_locations_to_boxes,\n    corner_form_to_center_form,\n)\nfrom corenet.third_party.modeling.ssd_utils import assign_priors\nfrom corenet.utils import logger\n\n\n@MATCHER_REGISTRY.register(name=\"ssd\")\nclass SSDMatcher(BaseMatcher):\n    \"\"\"\n    This class assigns labels to anchors via `SSD matching process <https://arxiv.org/abs/1512.02325>`_\n\n    Args:\n        opts: command line arguments\n        bg_class_id: Background class index\n\n    Shape:\n        - Input:\n            - gt_boxes: Ground-truth boxes in corner form (xyxy format). Shape is :math:`(N, 4)` where :math:`N` is the number of boxes\n            - gt_labels: Ground-truth box labels. Shape is :math:`(N)`\n            - anchors: Anchor boxes in center form (c_x, c_y, w, h). Shape is :math:`(M, 4)` where :math:`M` is the number of anchors\n\n        - Output:\n            - matched_boxes of shape :math:`(M, 4)`\n            - matched_box_labels of shape :math:`(M)`\n    \"\"\"\n\n    def __init__(self, opts, bg_class_id: Optional[int] = 0, *args, **kwargs) -> None:\n        center_variance = getattr(opts, \"matcher.ssd.center_variance\", None)\n        check_variable(center_variance, \"--matcher.ssd.center-variance\")\n\n        size_variance = getattr(opts, \"matcher.ssd.size_variance\", None)\n        check_variable(val=size_variance, args_str=\"--matcher.ssd.size-variance\")\n\n        iou_threshold = getattr(opts, \"matcher.ssd.iou_threshold\", None)\n        check_variable(val=iou_threshold, args_str=\"--matcher.ssd.iou-threshold\")\n\n        super().__init__(opts=opts, *args, **kwargs)\n\n        self.center_variance = center_variance\n        self.size_variance = size_variance\n        self.iou_threshold = iou_threshold\n        self.bg_class_id = bg_class_id\n\n    def __repr__(self):\n        return \"{}(center_variance={}, size_variance={}, iou_threshold={})\".format(\n            self.__class__.__name__,\n            self.center_variance,\n            self.size_variance,\n            self.iou_threshold,\n        )\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        \"\"\"\n        Add SSD Matcher specific arguments\n        \"\"\"\n        group = parser.add_argument_group(title=cls.__name__)\n        group.add_argument(\n            \"--matcher.ssd.center-variance\",\n            type=float,\n            default=0.1,\n            help=\"Center variance for matching\",\n        )\n        group.add_argument(\n            \"--matcher.ssd.size-variance\",\n            type=float,\n            default=0.2,\n            help=\"Size variance.\",\n        )\n        group.add_argument(\n            \"--matcher.ssd.iou-threshold\",\n            type=float,\n            default=0.45,\n            help=\"IOU Threshold.\",\n        )\n\n        return parser\n\n    def __call__(\n        self,\n        gt_boxes: Union[np.ndarray, Tensor],\n        gt_labels: Union[np.ndarray, Tensor],\n        anchors: Tensor,\n    ) -> Tuple[Tensor, Tensor]:\n        if isinstance(gt_boxes, np.ndarray):\n            gt_boxes = torch.from_numpy(gt_boxes)\n        if isinstance(gt_labels, np.ndarray):\n            gt_labels = torch.from_numpy(gt_labels)\n\n        # convert box priors from center [c_x, c_y] to corner_form [x, y]\n        anchors_xyxy = center_form_to_corner_form(boxes=anchors)\n\n        matched_boxes_xyxy, matched_labels = assign_priors(\n            gt_boxes,  # gt_boxes are in corner form [x, y, w, h]\n            gt_labels,\n            anchors_xyxy,  # priors are in corner form [x, y, w, h]\n            self.iou_threshold,\n            background_id=self.bg_class_id,\n        )\n\n        # convert the matched boxes to center form [c_x, c_y]\n        matched_boxes_cxcywh = corner_form_to_center_form(matched_boxes_xyxy)\n\n        # Eq.(2) in paper https://arxiv.org/pdf/1512.02325.pdf\n        boxes_for_regression = convert_boxes_to_locations(\n            gt_boxes=matched_boxes_cxcywh,  # center form\n            prior_boxes=anchors,  # center form\n            center_variance=self.center_variance,\n            size_variance=self.size_variance,\n        )\n\n        return boxes_for_regression, matched_labels\n\n    def convert_to_boxes(\n        self, pred_locations: torch.Tensor, anchors: torch.Tensor\n    ) -> Tensor:\n        \"\"\"\n        Decodes boxes from predicted locations and anchors.\n        \"\"\"\n\n        # decode boxes in center form\n        boxes = convert_locations_to_boxes(\n            pred_locations=pred_locations,\n            anchor_boxes=anchors,\n            center_variance=self.center_variance,\n            size_variance=self.size_variance,\n        )\n        # convert boxes from center form [c_x, c_y] to corner form [x, y]\n        boxes = center_form_to_corner_form(boxes)\n        return boxes\n\n\ndef check_variable(val, args_str: str):\n    if val is None:\n        logger.error(\"{} cannot be None\".format(args_str))\n\n    if not (0.0 < val < 1.0):\n        logger.error(\n            \"The value of {} should be between 0 and 1. Got: {}\".format(args_str, val)\n        )\n"
  },
  {
    "path": "corenet/modeling/misc/__init__.py",
    "content": ""
  },
  {
    "path": "corenet/modeling/misc/averaging_utils.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nfrom copy import deepcopy\nfrom typing import Optional\n\nimport torch\nfrom torch import nn\n\n\nclass EMA(object):\n    \"\"\"\n    For a given model, this class computes the exponential moving average of weights\n\n    Args:\n        model (torch.nn.Module): Model\n        ema_momentum (Optional[float]): Momentum value shows the contribution of weights at current iteration. Default: 0.0005\n        device (Optional[str]): Device (CPU or GPU) on which model resides. Default: cpu\n    \"\"\"\n\n    def __init__(\n        self,\n        model: nn.Module,\n        ema_momentum: Optional[float] = 0.0005,\n        device: Optional[str] = \"cpu\",\n        *args,\n        **kwargs\n    ) -> None:\n        # make a deep copy of the model for accumulating moving average of parameters and set to eval mode\n        self.ema_model = deepcopy(model)\n        self.ema_model.eval()\n        self.momentum = ema_momentum\n        self.device = device\n        if device:\n            self.ema_model.to(device=device)\n        self.ema_has_module = hasattr(self.ema_model, \"module\")\n        for param in self.ema_model.parameters():\n            param.requires_grad = False\n\n    def update_parameters(self, model):\n        # correct a mismatch in state dict keys\n        has_module = hasattr(model, \"module\") and not self.ema_has_module\n        with torch.no_grad():\n            msd = model.state_dict()\n            for k, ema_v in self.ema_model.state_dict().items():\n                if has_module:\n                    # .module is added if we use DistributedDataParallel or DataParallel wrappers around model\n                    k = \"module.\" + k\n                model_v = msd[k].detach()\n                if self.device:\n                    model_v = model_v.to(device=self.device)\n                ema_v.copy_((ema_v * (1.0 - self.momentum)) + (self.momentum * model_v))\n\n\ndef arguments_ema(parser: argparse.ArgumentParser):\n    group = parser.add_argument_group(\n        title=\"EMA\", description=\"Exponential moving average arguments\"\n    )\n    group.add_argument(\n        \"--ema.enable\", action=\"store_true\", help=\"Use exponential moving average\"\n    )\n    group.add_argument(\n        \"--ema.momentum\",\n        type=float,\n        default=0.0001,\n        help=\"EMA momentum. Defaults to 0.0001.\",\n    )\n    return parser\n"
  },
  {
    "path": "corenet/modeling/misc/box_utils.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport torch\nfrom torch import Tensor\n\n\"\"\"\n    This file implements different conversion functions to implement `SSD <https://arxiv.org/pdf/1512.02325.pdf>`_ object detector.\n    Equations are written inside each function for brevity.\n\"\"\"\n\n\ndef convert_locations_to_boxes(\n    pred_locations: Tensor,\n    anchor_boxes: Tensor,\n    center_variance: float,\n    size_variance: float,\n) -> Tensor:\n    \"\"\"\n        This is an inverse of convert_boxes_to_locations function (or Eq.(2) in `SSD paper <https://arxiv.org/pdf/1512.02325.pdf>`_\n    Args:\n        pred_locations (Tensor): predicted locations from detector\n        anchor_boxes (Tensor): prior boxes in center form\n        center_variance (float): variance value for centers (c_x and c_y)\n        size_variance (float): variance value for size (height and width)\n\n    Returns:\n        predicted boxes tensor in center form\n    \"\"\"\n\n    # priors can have one dimension less.\n    if anchor_boxes.dim() + 1 == pred_locations.dim():\n        anchor_boxes = anchor_boxes.unsqueeze(0)\n\n    # T_w = log(g_w/d_w) / size_variance ==> g_w = exp(T_w * size_variance) * d_w\n    # T_h = log(g_h/d_h) / size_variance ==> g_h = exp(T_h * size_variance) * d_h\n    pred_size = (\n        torch.exp(pred_locations[..., 2:] * size_variance) * anchor_boxes[..., 2:]\n    )\n    # T_cx = ((g_cx - d_cx) / d_w) / center_variance ==> g_cx = ((T_cx * center_variance) * d_w) + d_cx\n    # T_cy = ((g_cy - d_cy) / d_w) / center_variance ==> g_cy = ((T_cy * center_variance) * d_h) + d_cy\n    pred_center = (\n        pred_locations[..., :2] * center_variance * anchor_boxes[..., 2:]\n    ) + anchor_boxes[..., :2]\n\n    return torch.cat((pred_center, pred_size), dim=-1)\n\n\ndef convert_boxes_to_locations(\n    gt_boxes: Tensor, prior_boxes: Tensor, center_variance: float, size_variance: float\n):\n    \"\"\"\n    This function implements Eq.(2) in the `SSD paper <https://arxiv.org/pdf/1512.02325.pdf>`_\n\n    Args:\n        gt_boxes (Tensor): Ground truth boxes in center form (cx, cy, w, h)\n        prior_boxes (Tensor): Prior boxes in center form (cx, cy, w, h)\n        center_variance (float): variance value for centers (c_x and c_y)\n        size_variance (float): variance value for size (height and width)\n\n    Returns:\n        boxes tensor for training\n    \"\"\"\n\n    # T_cx = ((g_cx - d_cx) / d_w) / center_variance; Center vairance is nothing but normalization\n    # T_cy = ((g_cy - d_cy) / d_h) / center_variance\n    # T_w = log(g_w/d_w) / size_variance and T_h = log(g_h/d_h) / size_varianc\n\n    # priors can have one dimension less\n    if prior_boxes.dim() + 1 == gt_boxes.dim():\n        prior_boxes = prior_boxes.unsqueeze(0)\n\n    target_centers = (\n        (gt_boxes[..., :2] - prior_boxes[..., :2]) / prior_boxes[..., 2:]\n    ) / center_variance\n    target_size = torch.log(gt_boxes[..., 2:] / prior_boxes[..., 2:]) / size_variance\n    return torch.cat((target_centers, target_size), dim=-1)\n\n\ndef center_form_to_corner_form(boxes: Tensor) -> Tensor:\n    \"\"\"\n        This function convert boxes from center to corner form\n    Args:\n        boxes (Tensor): Boxes in center form (cx,cy,w,h)\n\n    Returns:\n        Boxes tensor in corner form (x,y,w,h)\n    \"\"\"\n\n    # x = c_x - (delta_w * 0.5), y = c_y - (delta_h * 0.5)\n    # w = c_x + (delta_w * 0.5), h = c_y + (delta_h * 0.5)\n    return torch.cat(\n        (\n            boxes[..., :2] - (boxes[..., 2:] * 0.5),\n            boxes[..., :2] + (boxes[..., 2:] * 0.5),\n        ),\n        dim=-1,\n    )\n\n\ndef corner_form_to_center_form(boxes: torch.Tensor) -> torch.Tensor:\n    \"\"\"\n        This function converts boxes from corner to center form\n    Args:\n        boxes (Tensor): boxes in corner form (x, y, w, h)\n\n    Returns:\n        Boxes tensor in center form (c_x, c_y, w, h)\n    \"\"\"\n\n    # c_x = ( x + w ) * 0.5, c_y = (y + h) * 0.5\n    # delta_w = w - x, delta_h = h - y\n    return torch.cat(\n        ((boxes[..., :2] + boxes[..., 2:]) * 0.5, boxes[..., 2:] - boxes[..., :2]),\n        dim=-1,\n    )\n"
  },
  {
    "path": "corenet/modeling/misc/common.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nimport os\nimport re\nfrom types import MethodType\nfrom typing import Dict, List, Optional, Tuple, Union\n\nimport torch\nfrom torch import Tensor\n\nfrom corenet.utils import logger\nfrom corenet.utils.common_utils import unwrap_model_fn\nfrom corenet.utils.ddp_utils import is_master, is_start_rank_node\n\n\ndef clean_strip(\n    obj: Union[str, List[str]], sep: Optional[str] = \",\", strip: bool = True\n) -> List[str]:\n    # Allowing list of strings as input as well as comma-separated strings\n    if isinstance(obj, list):\n        strings = obj\n    else:\n        strings = obj.split(sep)\n\n    if strip:\n        strings = [x.strip() for x in strings]\n    strings = [x for x in strings if x]\n    return strings\n\n\ndef load_pretrained_model(\n    model: torch.nn.Module, wt_loc: str, opts: argparse.Namespace, *args, **kwargs\n) -> torch.nn.Module:\n    \"\"\"Helper function to load pre-trained weights.\n    Args:\n        model: Model whose weights will be loaded.\n        wt_loc: Path to file to load state_dict from.\n        opts: Input arguments.\n    Returns:\n        The model loaded with the given weights.\n\n    \"\"\"\n    if not os.path.isfile(wt_loc):\n        logger.error(\"Pretrained file is not found here: {}\".format(wt_loc))\n\n    wts = torch.load(wt_loc, map_location=\"cpu\")\n\n    is_master_node = is_start_rank_node(opts)\n\n    exclude_scopes = getattr(opts, \"model.resume_exclude_scopes\", \"\")\n    exclude_scopes: List[str] = clean_strip(exclude_scopes)\n\n    missing_scopes = getattr(opts, \"model.ignore_missing_scopes\", \"\")\n    missing_scopes: List[str] = clean_strip(missing_scopes)\n\n    rename_scopes_map: List[List[str]] = getattr(opts, \"model.rename_scopes_map\", [])\n    if rename_scopes_map:\n        for entry in rename_scopes_map:\n            if len(entry) != 2:\n                raise ValueError(\n                    \"Every entry in model.rename_scopes_map must contain exactly two string elements\"\n                    \" for before and after. Got {}.\".format(str(entry))\n                )\n\n    # By default, adding scopes that we exclude to missing scopes\n    # If you excluded something, you can't expect it to be there.\n    missing_scopes += exclude_scopes\n\n    # remove unwanted scopes\n    if exclude_scopes:\n        for key in wts.copy():\n            if any([re.match(x, key) for x in exclude_scopes]):\n                del wts[key]\n\n    if rename_scopes_map:\n        for before, after in rename_scopes_map:\n            wts = {re.sub(before, after, key): value for key, value in wts.items()}\n\n    strict = not bool(missing_scopes)\n\n    try:\n        module = unwrap_model_fn(model)\n        missing_keys, unexpected_keys = module.load_state_dict(wts, strict=strict)\n\n        if unexpected_keys:\n            raise Exception(\n                \"Found unexpected keys: {}.\"\n                \"You can ignore these keys using `model.resume_exclude_scopes`.\".format(\n                    \", \".join(unexpected_keys)\n                )\n            )\n\n        missing_keys = [\n            key\n            for key in missing_keys\n            if not any([re.match(x, key) for x in missing_scopes])\n        ]\n\n        if missing_keys:\n            raise Exception(\n                \"Missing keys detected. Did not find the following keys in pre-trained model: {}.\"\n                \" You can ignore the keys using `model.ignore_missing_scopes`.\".format(\n                    \",\".join(missing_keys)\n                )\n            )\n\n        if is_master_node:\n            logger.log(\"Pretrained weights are loaded from {}\".format(wt_loc))\n    except Exception as e:\n        if is_master_node:\n            logger.error(\n                \"Unable to load pretrained weights from {}. Error: {}\".format(wt_loc, e)\n            )\n\n    return model\n\n\ndef parameter_list(\n    named_parameters,\n    weight_decay: Optional[float] = 0.0,\n    no_decay_bn_filter_bias: Optional[bool] = False,\n    *args,\n    **kwargs,\n) -> List[Dict]:\n    module_name = kwargs.get(\"module_name\", \"\")\n    with_decay = []\n    without_decay = []\n    with_decay_param_names = []\n    without_decay_param_names = []\n    if isinstance(named_parameters, list):\n        for n_parameter in named_parameters:\n            for p_name, param in n_parameter():\n                if (\n                    param.requires_grad\n                    and len(param.shape) == 1\n                    and no_decay_bn_filter_bias\n                ):\n                    # biases and normalization layer parameters are of len 1\n                    without_decay.append(param)\n                    without_decay_param_names.append(module_name + p_name)\n                elif param.requires_grad:\n                    with_decay.append(param)\n                    with_decay_param_names.append(module_name + p_name)\n    else:\n        for p_name, param in named_parameters():\n            if (\n                param.requires_grad\n                and len(param.shape) == 1\n                and no_decay_bn_filter_bias\n            ):\n                # biases and normalization layer parameters are of len 1\n                without_decay.append(param)\n                without_decay_param_names.append(module_name + p_name)\n            elif param.requires_grad:\n                with_decay.append(param)\n                with_decay_param_names.append(module_name + p_name)\n    param_list = [\n        {\n            \"params\": with_decay,\n            \"weight_decay\": weight_decay,\n            \"param_names\": with_decay_param_names,\n        }\n    ]\n    if len(without_decay) > 0:\n        param_list.append(\n            {\n                \"params\": without_decay,\n                \"weight_decay\": 0.0,\n                \"param_names\": without_decay_param_names,\n            }\n        )\n    return param_list\n\n\ndef freeze_module(module: torch.nn.Module, force_eval: bool = True) -> torch.nn.Module:\n    \"\"\"\n    Sets requires_grad = False on all the given module parameters, and put the module in eval mode.\n    By default, it also overrides the module's `train` method to make sure that it always stays in eval mode\n    (ie calling ``module.train(mode=True)`` executes ``module.train(mode=False)``)\n\n    >>> module = nn.Linear(10, 20).train()\n    >>> module.training\n    True\n    >>> module.weight.requires_grad\n    True\n    >>> freeze_module(module).train().training\n    False\n    >>> module.weight.requires_grad\n    False\n    \"\"\"\n\n    module.eval()\n    for parameter in module.parameters():\n        parameter.requires_grad = False\n\n    if force_eval:\n\n        def _force_train_in_eval(\n            self: torch.nn.Module, mode: bool = True\n        ) -> torch.nn.Module:\n            # ignore train/eval calls: perpetually stays in eval\n            return self\n\n        module.train = MethodType(_force_train_in_eval, module)\n\n    return module\n\n\ndef freeze_modules_based_on_opts(\n    opts: argparse.Namespace, model: torch.nn.Module, verbose: bool = True\n) -> torch.nn.Module:\n    \"\"\"\n    Allows for freezing immediate modules and parameters of the model using --model.freeze-modules.\n\n    --model.freeze-modules should be a list of strings or a comma-separated list of regex expressions.\n\n    Examples of --model.freeze-modules:\n        \"conv.*\"  # see example below: can freeze all (top-level) conv layers\n        \"^((?!classifier).)*$\"   # freezes everything except for \"classifier\": useful for linear probing\n        \"conv1,layer1,layer2,layer3\"  # freeze all layers up to layer3\n\n    >>> model = nn.Sequential(OrderedDict([\n          ('conv1', nn.Conv2d(1, 20, 5)),\n          ('relu1', nn.ReLU()),\n          ('conv2', nn.Conv2d(20, 64, 5)),\n          ('relu2', nn.ReLU())\n        ]))\n    >>> opts = argparse.Namespace(**{\"model.freeze_modules\": \"conv1\"})\n    >>> _ = freeze_modules_based_on_opts(opts, model)\n    INFO    - Freezing module: conv1\n    >>> model.train()\n    >>> model.conv1.training\n    False\n    >>> model.conv2.training\n    True\n    \"\"\"\n    freeze_patterns = getattr(opts, \"model.freeze_modules\", \"\")\n    freeze_patterns = clean_strip(freeze_patterns)\n\n    verbose = verbose and is_master(opts)\n\n    if freeze_patterns:\n        # TODO: allow applying on all modules, not just immediate children? How?\n        for name, module in model.named_children():\n            if any([re.match(p, name) for p in freeze_patterns]):\n                freeze_module(module)\n                if verbose:\n                    logger.info(\"Freezing module: {}\".format(name))\n\n        for name, param in model.named_parameters():\n            if any([re.match(p, name) for p in freeze_patterns]):\n                param.requires_grad = False\n                if verbose:\n                    logger.info(\"Freezing parameter: {}\".format(name))\n\n    if verbose and hasattr(model, \"get_trainable_parameters\"):\n        param_list, _ = model.get_trainable_parameters()\n        for params in param_list:\n            if (\n                not isinstance(params[\"param_names\"], List)\n                or not isinstance(params[\"params\"], List)\n                or not isinstance(params[\"weight_decay\"], (float, int))\n            ):\n                param_types = {k: type(v) for k, v in params.items()}\n                logger.error(\n                    \"Expected parameter format: {{ params: List, weight_decay: float, param_names: List }}. \"\n                    \"Got: {}\".format(param_types)\n                )\n        # Flatten all parameter names\n        trainable_param_names = [p for x in param_list for p in x[\"param_names\"]]\n        logger.info(\"Trainable parameters: {}\".format(trainable_param_names))\n\n    return model\n\n\ndef get_tensor_sizes(data: Union[Dict, Tensor]) -> Union[List[str], List[Tuple[int]]]:\n    \"\"\"Utility function for extracting tensor shapes (for printing purposes only).\"\"\"\n    if isinstance(data, Dict):\n        tensor_sizes = []\n        for k, v in data.items():\n            size_ = get_tensor_sizes(v)\n            if size_:\n                tensor_sizes.append(f\"{k}: {size_}\")\n        return tensor_sizes\n    elif isinstance(data, Tensor):\n        return [*data.shape]\n    else:\n        return []\n"
  },
  {
    "path": "corenet/modeling/misc/init_utils.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom typing import Optional\n\nfrom torch import nn\n\nfrom corenet.modeling.layers import GroupLinear, LinearLayer, norm_layers_tuple\nfrom corenet.utils import logger\n\nsupported_conv_inits = [\n    \"kaiming_normal\",\n    \"kaiming_uniform\",\n    \"xavier_normal\",\n    \"xavier_uniform\",\n    \"normal\",\n    \"trunc_normal\",\n]\nsupported_fc_inits = [\n    \"kaiming_normal\",\n    \"kaiming_uniform\",\n    \"xavier_normal\",\n    \"xavier_uniform\",\n    \"normal\",\n    \"trunc_normal\",\n]\n\n\ndef _init_nn_layers(\n    module,\n    init_method: Optional[str] = \"kaiming_normal\",\n    std_val: Optional[float] = None,\n) -> None:\n    \"\"\"\n    Helper function to initialize neural network module\n    \"\"\"\n    init_method = init_method.lower()\n    if init_method == \"kaiming_normal\":\n        if module.weight is not None:\n            nn.init.kaiming_normal_(module.weight, mode=\"fan_out\")\n        if module.bias is not None:\n            nn.init.zeros_(module.bias)\n    elif init_method == \"kaiming_uniform\":\n        if module.weight is not None:\n            nn.init.kaiming_uniform_(module.weight, mode=\"fan_out\")\n        if module.bias is not None:\n            nn.init.zeros_(module.bias)\n    elif init_method == \"xavier_normal\":\n        if module.weight is not None:\n            nn.init.xavier_normal_(module.weight)\n        if module.bias is not None:\n            nn.init.zeros_(module.bias)\n    elif init_method == \"xavier_uniform\":\n        if module.weight is not None:\n            nn.init.xavier_uniform_(module.weight)\n        if module.bias is not None:\n            nn.init.zeros_(module.bias)\n    elif init_method == \"normal\":\n        if module.weight is not None:\n            std = 1.0 / module.weight.size(1) ** 0.5 if std_val is None else std_val\n            nn.init.normal_(module.weight, mean=0.0, std=std)\n        if module.bias is not None:\n            nn.init.zeros_(module.bias)\n    elif init_method == \"trunc_normal\":\n        if module.weight is not None:\n            std = 1.0 / module.weight.size(1) ** 0.5 if std_val is None else std_val\n            nn.init.trunc_normal_(module.weight, mean=0.0, std=std)\n        if module.bias is not None:\n            nn.init.zeros_(module.bias)\n    else:\n        supported_conv_message = \"Supported initialization methods are:\"\n        for i, l in enumerate(supported_conv_inits):\n            supported_conv_message += \"\\n \\t {}) {}\".format(i, l)\n        logger.error(\"{} \\n Got: {}\".format(supported_conv_message, init_method))\n\n\ndef initialize_conv_layer(\n    module,\n    init_method: Optional[str] = \"kaiming_normal\",\n    std_val: Optional[float] = 0.01,\n) -> None:\n    \"\"\"Helper function to initialize convolution layers\"\"\"\n    _init_nn_layers(module=module, init_method=init_method, std_val=std_val)\n\n\ndef initialize_fc_layer(\n    module, init_method: Optional[str] = \"normal\", std_val: Optional[float] = 0.01\n) -> None:\n    \"\"\"Helper function to initialize fully-connected layers\"\"\"\n    if hasattr(module, \"layer\"):\n        _init_nn_layers(module=module.layer, init_method=init_method, std_val=std_val)\n    else:\n        _init_nn_layers(module=module, init_method=init_method, std_val=std_val)\n\n\ndef initialize_norm_layers(module) -> None:\n    \"\"\"Helper function to initialize normalization layers\"\"\"\n\n    def _init_fn(module):\n        if hasattr(module, \"weight\") and module.weight is not None:\n            nn.init.ones_(module.weight)\n        if hasattr(module, \"bias\") and module.bias is not None:\n            nn.init.zeros_(module.bias)\n\n    _init_fn(module.layer) if hasattr(module, \"layer\") else _init_fn(module=module)\n\n\ndef initialize_weights(opts, modules) -> None:\n    \"\"\"Helper function to initialize different layers in a model\"\"\"\n    # weight initialization\n    conv_init_type = getattr(opts, \"model.layer.conv_init\", \"kaiming_normal\")\n    linear_init_type = getattr(opts, \"model.layer.linear_init\", \"normal\")\n\n    conv_std = getattr(opts, \"model.layer.conv_init_std_dev\", None)\n    linear_std = getattr(opts, \"model.layer.linear_init_std_dev\", 0.01)\n    group_linear_std = getattr(opts, \"model.layer.group_linear_init_std_dev\", 0.01)\n\n    if isinstance(modules, nn.Sequential):\n        for m in modules:\n            if isinstance(m, (nn.Conv2d, nn.Conv3d)):\n                initialize_conv_layer(\n                    module=m, init_method=conv_init_type, std_val=conv_std\n                )\n            elif isinstance(m, norm_layers_tuple):\n                initialize_norm_layers(module=m)\n            elif isinstance(m, (nn.Linear, LinearLayer)):\n                initialize_fc_layer(\n                    module=m, init_method=linear_init_type, std_val=linear_std\n                )\n            elif isinstance(m, GroupLinear):\n                initialize_fc_layer(\n                    module=m, init_method=linear_init_type, std_val=group_linear_std\n                )\n    else:\n        if isinstance(modules, (nn.Conv2d, nn.Conv3d)):\n            initialize_conv_layer(\n                module=modules, init_method=conv_init_type, std_val=conv_std\n            )\n        elif isinstance(modules, norm_layers_tuple):\n            initialize_norm_layers(module=modules)\n        elif isinstance(modules, (nn.Linear, LinearLayer)):\n            initialize_fc_layer(\n                module=modules, init_method=linear_init_type, std_val=linear_std\n            )\n        elif isinstance(modules, GroupLinear):\n            initialize_fc_layer(\n                module=modules, init_method=linear_init_type, std_val=group_linear_std\n            )\n"
  },
  {
    "path": "corenet/modeling/models/__init__.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nfrom typing import Optional\n\nfrom corenet.modeling.misc.common import (\n    freeze_modules_based_on_opts,\n    load_pretrained_model,\n)\nfrom corenet.modeling.models.base_model import BaseAnyNNModel\nfrom corenet.modeling.models.fsdp_wrapper import FullyShardedDataParallelWrapper\nfrom corenet.third_party.modeling import lora\nfrom corenet.utils import logger\nfrom corenet.utils.download_utils import get_local_path\nfrom corenet.utils.registry import Registry\n\nMODEL_REGISTRY = Registry(\n    registry_name=\"model_registry\",\n    base_class=BaseAnyNNModel,\n    lazy_load_dirs=[\"corenet/modeling/models\"],\n    internal_dirs=[\"corenet/internal\", \"corenet/internal/projects/*\"],\n)\n\n\ndef get_model(\n    opts: argparse.Namespace,\n    category: Optional[str] = None,\n    model_name: Optional[str] = None,\n    use_lora: Optional[bool] = None,\n    *args,\n    **kwargs,\n) -> BaseAnyNNModel:\n    \"\"\"Create a task-specific model from command-line arguments. If model category (or task) and name are\n    passed as an argument, then they are used. Otherwise, `dataset.category` and `model.{category}.name` are\n    read from command-line arguments to read model category and name, respectively.\n\n    Args:\n        opts: Command-line arguments\n        category: Category or task (e.g., segmentation)\n        model_name: Model name for a specific task (e.g., vit for classification)\n        use_lora: If False, LoRA will not be used. If True, LoRA will be used. If\n            None, the value of @use_lora will be read from @opts.\n\n    Returns:\n        An instance of `corenet.modeling.models.BaseAnyNNModel`.\n    \"\"\"\n\n    if category is None:\n        category = getattr(opts, \"dataset.category\")\n\n    if model_name is None:\n        model_name = getattr(opts, f\"model.{category}.name\")\n\n    if model_name == \"__base__\":\n        # __base__ is used to register the task-specific base classes. These classes often\n        # provide functionalities that can be re-used by sub-classes, but does not provide\n        # task-specific models.\n        logger.error(\n            f\"For {category} task, model name can't be __base__. Please check.\"\n        )\n\n    model = MODEL_REGISTRY[model_name, category].build_model(opts, *args, **kwargs)\n\n    if use_lora is None:\n        use_lora = getattr(opts, \"model.lora.use_lora\")\n    if use_lora:\n        lora_config = getattr(opts, \"model.lora.config\")\n        lora.add_lora_layers(model, lora_config)\n\n    # for some categories, we do not have pre-trained path (e.g., segmentation_head).\n    # Therefore, we need to set the default value.\n    pretrained_wts_path = getattr(opts, f\"model.{category}.pretrained\", None)\n    if pretrained_wts_path is not None:\n        pretrained_model_path = get_local_path(opts, path=pretrained_wts_path)\n        model = load_pretrained_model(\n            model=model, wt_loc=pretrained_model_path, opts=opts\n        )\n\n    model = freeze_modules_based_on_opts(opts, model)\n    return model\n\n\ndef arguments_model(parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n    parser = BaseAnyNNModel.add_arguments(parser=parser)\n    parser = MODEL_REGISTRY.all_arguments(parser=parser)\n    parser = FullyShardedDataParallelWrapper.add_arguments(parser=parser)\n    return parser\n"
  },
  {
    "path": "corenet/modeling/models/audio_classification/__init__.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n"
  },
  {
    "path": "corenet/modeling/models/audio_classification/audio_byteformer.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nfrom typing import Dict, Union\n\nfrom torch import Tensor\n\nfrom corenet.modeling.models import MODEL_REGISTRY\nfrom corenet.modeling.models.audio_classification.base_audio_classification import (\n    BaseAudioClassification,\n)\nfrom corenet.modeling.models.classification.byteformer import ByteFormer\n\n\n@MODEL_REGISTRY.register(name=\"byteformer\", type=\"audio_classification\")\nclass AudioByteFormer(ByteFormer, BaseAudioClassification):\n    \"\"\"Identical to byteformer.ByteFormer, but registered as an audio classification\n    model.\"\"\"\n\n    def forward(self, x: Dict[str, Tensor], *args, **kwargs) -> Tensor:\n        \"\"\"\n        Perform a forward pass on input bytes. The input is a dictionary\n        containing the input tensor. The tensor is stored as an integer tensor\n        of shape [batch_size, sequence_length]. Integer tensors are used because\n        the tensor usually contains mask tokens.\n\n        Args:\n            x: A dictionary containing {\"audio\": audio_bytes}.\n\n        Returns:\n            The output logits.\n        \"\"\"\n        return super().forward(x[\"audio\"], *args, **kwargs)\n\n    def dummy_input_and_label(self, batch_size: int) -> Dict:\n        \"\"\"\n        Get a dummy input and label that could be passed to the model.\n\n        Args:\n            batch_size: The batch size to use for the generated inputs.\n\n        Returns:\n            A dict with\n                {\n                    \"samples\": {\"audio\": tensor of shape [batch_size, sequence_length]},\n                    \"targets\": tensor of shape [batch_size],\n                }\n        \"\"\"\n        input_and_label = super().dummy_input_and_label(batch_size)\n\n        ret = {\n            \"samples\": {\"audio\": input_and_label[\"samples\"]},\n            \"targets\": input_and_label[\"targets\"],\n        }\n        return ret\n"
  },
  {
    "path": "corenet/modeling/models/audio_classification/base_audio_classification.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\n\nfrom corenet.modeling.models import MODEL_REGISTRY, BaseAnyNNModel\n\n\n@MODEL_REGISTRY.register(name=\"__base__\", type=\"audio_classification\")\nclass BaseAudioClassification(BaseAnyNNModel):\n    \"\"\"Base class for audio classification.\n\n    Args:\n        opts: Command-line arguments\n    \"\"\"\n\n    def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None:\n        super().__init__(opts, *args, **kwargs)\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        \"\"\"Add model specific arguments\"\"\"\n        if cls != BaseAudioClassification:\n            # Don't re-register arguments in subclasses that don't override `add_arguments()`.\n            return parser\n        group = parser.add_argument_group(title=cls.__name__)\n        group.add_argument(\n            \"--model.audio-classification.name\",\n            type=str,\n            default=None,\n            help=\"Name of the audio classification model. Defaults to None.\",\n        )\n        group.add_argument(\n            \"--model.audio-classification.pretrained\",\n            type=str,\n            default=None,\n            help=\"Path of the pretrained backbone. Defaults to None.\",\n        )\n        return parser\n"
  },
  {
    "path": "corenet/modeling/models/base_model.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom __future__ import annotations\n\nimport argparse\nfrom typing import Any, Callable, Dict, List, Mapping, Optional, Tuple\n\nimport torch\nfrom torch import nn\n\nfrom corenet.modeling.layers import norm_layers_tuple\nfrom corenet.modeling.misc.common import get_tensor_sizes, parameter_list\nfrom corenet.modeling.misc.init_utils import initialize_weights\nfrom corenet.options.parse_args import JsonValidator\nfrom corenet.third_party.modeling import lora\nfrom corenet.utils import logger\nfrom corenet.utils.common_utils import check_frozen_norm_layer\nfrom corenet.utils.ddp_utils import is_master\n\n\nclass BaseAnyNNModel(nn.Module):\n    \"\"\"Base class for any neural network\"\"\"\n\n    def __init__(self, opts, *args, **kwargs) -> None:\n        super().__init__()\n        self.opts = opts\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser):\n        \"\"\"Add model-specific arguments\"\"\"\n\n        if cls != BaseAnyNNModel:\n            return parser\n        group = parser.add_argument_group(title=cls.__name__)\n        group.add_argument(\n            \"--model.resume-exclude-scopes\",\n            type=str,\n            default=\"\",\n            help=\"Comma-separated list of parameter scopes (regex strings) to exclude when \"\n            \"loading a pre-trained model\",\n        )\n        group.add_argument(\n            \"--model.ignore-missing-scopes\",\n            type=str,\n            default=\"\",\n            help=\"Comma-separated list of parameter scopes (regex strings) to ignore \"\n            \"if they are missing from the pre-training model\",\n        )\n        group.add_argument(\n            \"--model.rename-scopes-map\",\n            type=JsonValidator(List[List[str]]),\n            default=None,\n            help=\"A mapping from checkpoint variable names to match the existing model names.\"\n            \" The mapping is represented as a List[List[str]], e.g. [['before', 'after'], ['this', 'that']].\"\n            \" Note: only loading from Yaml file is supported for this argument.\",\n        )\n        group.add_argument(\n            \"--model.freeze-modules\",\n            type=str,\n            default=\"\",\n            help=\"Comma-separated list of parameter scopes (regex strings) to freeze.\",\n        )\n\n        group.add_argument(\n            \"--model.activation-checkpointing\",\n            action=\"store_true\",\n            help=\"If enabled, layer specified in model using 'get_activation_checkpoint_submodule_class' would be used \\\n                for activation checkpointing (a.k.a. gradient checkpointing).\",\n        )\n\n        group.add_argument(\n            \"--model.lora.config\",\n            type=JsonValidator(List[Dict[str, Any]]),\n            help=\"A json-formatted configuration for the LoRA model. See corenet/modeling/models/language_modeling/lora.py for details.\",\n        )\n        group.add_argument(\n            \"--model.lora.use-lora\",\n            action=\"store_true\",\n            help=\"If set, use LoRA for the model. Note that parameters are \"\n            \"not automatically frozen. They must be frozen with \"\n            \"--model.freeze-modules.\",\n        )\n        return parser\n\n    def reset_parameters(self, opts: argparse.Namespace) -> None:\n        \"\"\"Initialize model weights\"\"\"\n        initialize_weights(opts=opts, modules=self.modules())\n\n    def forward(self, x: Any, *args, **kwargs) -> Any:\n        \"\"\"Implement the model-specific forward function in sub-classes.\"\"\"\n        raise NotImplementedError\n\n    def _apply_layer_wise_lr(\n        self,\n        weight_decay: Optional[float] = 0.0,\n        no_decay_bn_filter_bias: Optional[bool] = False,\n        *args,\n        **kwargs,\n    ):\n        \"\"\"This function can be used to adjust the learning rate of each layer in a model. The\n        functionality of this function may vary from model to model, so we do not implement\n        it in the base class and expects child model classes will implement this function, if desired.\n        \"\"\"\n        raise NotImplementedError(\n            f\"Please implement _apply_layer_wise_lr function for {type(self).__name__}\"\n        )\n\n    def get_trainable_parameters(\n        self,\n        weight_decay: float = 0.0,\n        no_decay_bn_filter_bias: bool = False,\n        module_name: str = \"\",\n        *args,\n        **kwargs,\n    ) -> Tuple[List[Mapping], List[float]]:\n        \"\"\"Get parameters for training along with the learning rate.\n\n        Args:\n            weight_decay: weight decay\n            no_decay_bn_filter_bias: Do not decay BN and biases. Defaults to False.\n\n        Returns:\n             Returns a tuple of length 2. The first entry is a list of dictionary with three keys\n             (params, weight_decay, param_names). The second entry is a list of floats containing\n             learning rate for each parameter.\n\n        Note:\n            Kwargs may contain module_name. To avoid multiple arguments with the same name,\n            we pop it and concatenate with encoder or head name\n        \"\"\"\n        param_list = parameter_list(\n            named_parameters=self.named_parameters,\n            weight_decay=weight_decay,\n            no_decay_bn_filter_bias=no_decay_bn_filter_bias,\n            module_name=module_name,\n            *args,\n            **kwargs,\n        )\n        return param_list, [1.0] * len(param_list)\n\n    def dummy_input_and_label(self, batch_size: int) -> Dict:\n        \"\"\"Create dummy input and labels for CI/CD purposes. Child classes should implement it.\"\"\"\n        raise NotImplementedError(\n            f\"Please implement dummy_input_and_label function for {type(self).__name__}\"\n        )\n\n    def get_exportable_model(self) -> nn.Module:\n        \"\"\"This function can be used to prepare the architecture for inference. For example,\n        re-parameterizing branches when possible. The functionality of this method may vary\n        from model to model, so child model classes have to implement this method, if such a\n        transformation exists.\n        \"\"\"\n        return self\n\n    @classmethod\n    def freeze_norm_layers(\n        cls, opts: argparse.Namespace, model: BaseAnyNNModel\n    ) -> None:\n        \"\"\"Freeze normalization layers in the model\n\n        Args:\n            opts: Command-line arguments\n            model: An instance of `BaseAnyNNModel`\n        \"\"\"\n        is_maseter_node = is_master(opts)\n        for m in model.modules():\n            if isinstance(m, norm_layers_tuple):\n                m.eval()\n                m.weight.requires_grad = False\n                m.bias.requires_grad = False\n                m.training = False\n\n        # check if layers are frozen or not\n        frozen_state, count_norm = check_frozen_norm_layer(model)\n        if count_norm > 0 and frozen_state and is_maseter_node:\n            logger.error(\n                \"Something is wrong while freezing normalization layers. Please check\"\n            )\n\n        if is_maseter_node:\n            logger.log(\"Normalization layers are frozen\")\n\n    @classmethod\n    def build_model(cls, opts: argparse.Namespace, *args, **kwargs) -> BaseAnyNNModel:\n        \"\"\"Build a model from command-line arguments. Sub-classes must implement this\n        method.\n\n\n        Args:\n            opts: Command-line arguments\n\n        ...note::\n            This class method is useful when we have a common logic for constructing the\n            abstract class for a given task. The concrete sub-classes typically don't\n            override this method.\n        \"\"\"\n        return cls(opts, *args, **kwargs)\n\n    @torch.no_grad()\n    def info(self) -> None:\n        \"\"\"Prints model, parameters, and FLOPs on start rank.\"\"\"\n\n        train_mode = False\n        if self.training:\n            # do profiling in eval mode\n            train_mode = True\n            self.eval()\n\n        logger.log(logger.color_text(\"Model\"))\n        # print the model skeleton\n        print(self)\n\n        logger.double_dash_line(dashes=65)\n        print(\"{:>35} Summary\".format(self.__class__.__name__))\n        logger.double_dash_line(dashes=65)\n\n        # compute the network parameters\n        overall_params = sum([p.numel() for p in self.parameters()])\n        overall_trainable_params = sum(\n            [p.numel() for p in self.parameters() if p.requires_grad]\n        )\n        print(\"{:<20} = {:>8.3f} M\".format(\"Total parameters\", overall_params / 1e6))\n        print(\n            \"{:<20} = {:>8.3f} M\\n\".format(\n                \"Total trainable parameters\", overall_trainable_params / 1e6\n            )\n        )\n\n        try:\n            # Compute FLOPs using FVCore\n            try:\n                input_fvcore = self.dummy_input_and_label(batch_size=1)[\"samples\"]\n            except NotImplementedError:\n                logger.warning(\n                    \"Profiling not available, dummy_input_and_label not implemented for this model.\"\n                )\n                return\n\n            # compute flops using FVCore\n            from fvcore.nn import FlopCountAnalysis, flop_count_table\n\n            flop_analyzer = FlopCountAnalysis(self, input_fvcore)\n            logger.log(f\"FVCore Analysis:\")\n            # print input sizes\n            input_sizes = get_tensor_sizes(input_fvcore)\n            logger.log(\"Input sizes: {}\".format(input_sizes))\n            print(flop_count_table(flop_analyzer))\n\n            logger.warning(\n                \"\\n** Please be cautious when using the results in papers. \"\n                \"Certain operations may or may not be accounted in FLOP computation in FVCore. \"\n                \"Therefore, you want to manually ensure that FLOP computation is correct.\"\n            )\n\n            uncalled_modules = flop_analyzer.uncalled_modules()\n            if len(uncalled_modules) > 0:\n                logger.warning(f\"Uncalled Modules:\\n{uncalled_modules}\")\n            else:\n                logger.log(f\"No uncalled modules detected by fvcore.\")\n\n            unsupported_ops = flop_analyzer.unsupported_ops()\n            if len(unsupported_ops) > 0:\n                logger.warning(f\"Unsupported Ops:\\n{unsupported_ops}\")\n            else:\n                logger.log(f\"No unsupported ops detected by fvcore.\")\n        except:\n            logger.ignore_exception_with_warning(\n                \"Unable to compute FLOPs using FVCore. Please check\"\n            )\n        logger.double_dash_line(dashes=65)\n\n        if train_mode:\n            # switching back to train mode.\n            self.train()\n\n    def get_fsdp_wrap_policy(self) -> Optional[Callable[[nn.Module, bool, int], bool]]:\n        \"\"\"Returns the auto wrapping policy for FSDP.\n\n        This is either ``None`` or a callable of a fixed signature.\n\n        If it is ``None``, then ``module`` is wrapped with only a top-level FSDP instance without any nested wrapping.\n        If it is a callable, then it should take in three arguments ``module: nn.Module``, ``recurse: bool``, and\n        ``nonwrapped_numel: int`` and should return a ``bool`` specifying whether the passed-in ``module`` should be\n        wrapped if ``recurse=False`` or if the traversal should continue down the subtree if ``recurse=True``.\n\n        Additional custom arguments may be added to the callable. The ``size_based_auto_wrap_policy``\n        in ``torch.distributed.fsdp.wrap.py`` gives an example callable that wraps a module if the parameters\n        in its subtree exceed 100M numel. A good practice is to print the model after wrapping and adjust as needed.\n        \"\"\"\n        raise NotImplementedError(\n            \"Wrapping policy to be used with FSDP is not defined.\"\n        )\n\n    def get_activation_checkpoint_submodule_class(self) -> Callable:\n        \"\"\"Returns the sub-module class that needs to be checkpointed.\n\n        Activations of checkpointed sub-module are stored, and recomputed during the backward pass,\n        thus providing a trade-off between memory and compute.\n        \"\"\"\n        raise NotImplementedError(\n            \"Activation checkpoint submodule class is not implemented.\"\n        )\n"
  },
  {
    "path": "corenet/modeling/models/classification/__init__.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n"
  },
  {
    "path": "corenet/modeling/models/classification/base_image_encoder.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\nimport argparse\nfrom typing import Any, Dict, List, Mapping, Optional, Tuple\n\nimport torch\nfrom torch import Tensor, nn\nfrom torch.utils.checkpoint import checkpoint as gradient_checkpoint_fn\n\nfrom corenet.constants import is_test_env\nfrom corenet.modeling.layers import LinearLayer\nfrom corenet.modeling.misc.init_utils import initialize_fc_layer\nfrom corenet.modeling.models import MODEL_REGISTRY, BaseAnyNNModel\nfrom corenet.modeling.neural_augmentor import build_neural_augmentor\nfrom corenet.utils import logger\n\n\n@MODEL_REGISTRY.register(name=\"__base__\", type=\"classification\")\nclass BaseImageEncoder(BaseAnyNNModel):\n    \"\"\"Base class for different image classification models\"\"\"\n\n    def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None:\n        super().__init__(opts, *args, **kwargs)\n        self.conv_1 = None\n        self.layer_1 = None\n        self.layer_2 = None\n        self.layer_3 = None\n        self.layer_4 = None\n        self.layer_5 = None\n        self.conv_1x1_exp = None\n        self.classifier = None\n        self.round_nearest = 8\n\n        # Segmentation architectures like Deeplab and PSPNet modifies the strides of the backbone\n        # We allow that using output_stride and replace_stride_with_dilation arguments\n        self.dilation = 1\n        output_stride = kwargs.get(\"output_stride\", None)\n        self.dilate_l4 = False\n        self.dilate_l5 = False\n        if output_stride == 8:\n            self.dilate_l4 = True\n            self.dilate_l5 = True\n        elif output_stride == 16:\n            self.dilate_l5 = True\n        self.output_stride = output_stride\n\n        self.model_conf_dict = dict()\n        self.neural_augmentor = build_neural_augmentor(opts=opts, *args, **kwargs)\n        if getattr(opts, \"model.classification.gradient_checkpointing\"):\n            logger.error(\n                \"The argument, --model.classification.gradient-checkpointing, is deprecated and should not be used. \\\n                Please implement 'get_activation_checkpoint_submodule_class' and use --model.activation-checkpointing instead.\"\n            )\n\n        self.enable_layer_wise_lr_decay = getattr(\n            opts, \"model.classification.enable_layer_wise_lr_decay\"\n        )\n        self.layer_wise_lr_decay_rate = getattr(\n            opts, \"model.classification.layer_wise_lr_decay_rate\"\n        )\n\n    @property\n    def n_classes(self) -> int:\n        \"\"\"Number of classes that model is or will be trained to classify.\"\"\"\n        n_classes = getattr(self.opts, \"model.classification.n_classes\")\n        if n_classes is None:\n            logger.error(\n                f\"Number of classes in {self.__class__.__name__} cannot be None. Please specify using 'model.classification.n_classes' argument in configuration file.\"\n            )\n        return n_classes\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        \"\"\"Add image classification model-specific arguments\"\"\"\n        if cls != BaseImageEncoder:\n            # Don't re-register arguments in subclasses that don't override `add_arguments()`.\n            return parser\n        group = parser.add_argument_group(title=cls.__name__)\n\n        group.add_argument(\n            \"--model.classification.classifier-dropout\",\n            type=float,\n            default=0.0,\n            help=\"Dropout rate in classifier\",\n        )\n\n        group.add_argument(\n            \"--model.classification.name\", type=str, default=None, help=\"Model name\"\n        )\n        group.add_argument(\n            \"--model.classification.n-classes\",\n            type=int,\n            default=1000,\n            help=\"Number of classes in the dataset\",\n        )\n        group.add_argument(\n            \"--model.classification.pretrained\",\n            type=str,\n            default=None,\n            help=\"Path of the pretrained backbone\",\n        )\n        group.add_argument(\n            \"--model.classification.freeze-batch-norm\",\n            action=\"store_true\",\n            help=\"Freeze batch norm layers\",\n        )\n        group.add_argument(\n            \"--model.classification.activation.name\",\n            default=None,\n            type=str,\n            help=\"Non-linear function name (e.g., relu)\",\n        )\n        group.add_argument(\n            \"--model.classification.activation.inplace\",\n            action=\"store_true\",\n            help=\"Inplace non-linear functions\",\n        )\n        group.add_argument(\n            \"--model.classification.activation.neg-slope\",\n            default=0.1,\n            type=float,\n            help=\"Negative slope in leaky relu\",\n        )\n\n        group.add_argument(\n            \"--model.classification.finetune-pretrained-model\",\n            action=\"store_true\",\n            help=\"Finetune a pretrained model\",\n        )\n        group.add_argument(\n            \"--model.classification.n-pretrained-classes\",\n            type=int,\n            default=None,\n            help=\"Number of pre-trained classes\",\n        )\n\n        group.add_argument(\n            \"--model.classification.gradient-checkpointing\",\n            action=\"store_true\",\n            help=\"Checkpoint output of each spatial level in the classification backbone. Note that\"\n            \"we only take care of checkpointing in {}. If custom forward functions are used, please\"\n            \"implement checkpointing accordingly. \"\n            \"This option is deprecated in favor or --model.activation-checkpointing.\",\n        )\n\n        group.add_argument(\n            \"--model.classification.enable-layer-wise-lr-decay\",\n            action=\"store_true\",\n            default=False,\n            help=\"Enable layer-wise LR.\",\n        )\n        group.add_argument(\n            \"--model.classification.layer-wise-lr-decay-rate\",\n            type=float,\n            default=1.0,\n            help=\"Layer-wise LR decay range. Each model needs to define how layer-wise LR should be decayed.\"\n            \"For ViT, we decay layer_wise_lr_decay_rate ** (n_layers - i), where i is the layer index.\",\n        )\n\n        return parser\n\n    def check_model(self) -> None:\n        \"\"\"Check to see if model is adhering to the image encoder structure. Sub-classes\n        are not required to adhere to this structure. This is only required for easy\n        integration with downstream tasks.\"\"\"\n        assert (\n            self.model_conf_dict\n        ), \"Model configuration dictionary should not be empty\"\n        assert self.conv_1 is not None, \"Please implement self.conv_1\"\n        assert self.layer_1 is not None, \"Please implement self.layer_1\"\n        assert self.layer_2 is not None, \"Please implement self.layer_2\"\n        assert self.layer_3 is not None, \"Please implement self.layer_3\"\n        assert self.layer_4 is not None, \"Please implement self.layer_4\"\n        assert self.layer_5 is not None, \"Please implement self.layer_5\"\n        assert self.conv_1x1_exp is not None, \"Please implement self.conv_1x1_exp\"\n        assert self.classifier is not None, \"Please implement self.classifier\"\n\n    def update_classifier(self, opts: argparse.Namespace, n_classes: int) -> None:\n        \"\"\"This function updates the classification layer in a model. Useful for fine-tuning purposes.\"\"\"\n        logger.warning(\n            \"We encourage to use model scopes (`--model.resume-exclude-scopes`, `--model.ignore-missing-scopes`, \"\n            \"and `--model.rename-scopes-map`) for updating classifier for fine-tuning tasks. We will be \"\n            \"deprecating this function in future.\"\n        )\n\n        linear_init_type = getattr(opts, \"model.layer.linear_init\", \"normal\")\n        if isinstance(self.classifier, nn.Sequential):\n            in_features = self.classifier[-1].in_features\n            layer = LinearLayer(\n                in_features=in_features, out_features=n_classes, bias=True\n            )\n            initialize_fc_layer(layer, init_method=linear_init_type)\n            self.classifier[-1] = layer\n        else:\n            in_features = self.classifier.in_features\n            layer = LinearLayer(\n                in_features=in_features, out_features=n_classes, bias=True\n            )\n            initialize_fc_layer(layer, init_method=linear_init_type)\n\n            # re-init head\n            head_init_scale = 0.001\n            layer.weight.data.mul_(head_init_scale)\n            layer.bias.data.mul_(head_init_scale)\n\n            self.classifier = layer\n\n    def _forward_layer(self, layer: nn.Module, x: Tensor) -> Tensor:\n        \"\"\"Run a layer of the model, optionally with checkpointing\"\"\"\n        # Larger models with large input image size may not be able to fit into memory.\n        # We can use gradient checkpointing to enable training with large models and large inputs\n        return layer(x)\n\n    def extract_end_points_all(\n        self,\n        x: Tensor,\n        use_l5: Optional[bool] = True,\n        use_l5_exp: Optional[bool] = False,\n        *args,\n        **kwargs,\n    ) -> Dict[str, Tensor]:\n        \"\"\"Extract feature maps from different spatial levels of the model.\n\n        Args:\n            x: Input image tensor\n            use_l5: Include features from `layer_5` in the output dictionary. Defaults to True.\n            use_l5_exp: Include features from `conv_1x1_exp` in the output dictionary. Defaults to False.\n\n        Returns:\n            A mapping containing the name and output at each spatial-level of the model.\n\n        ...note:\n            This is useful for down-stream tasks.\n        \"\"\"\n        out_dict = {}  # Use dictionary over NamedTuple so that JIT is happy\n\n        if self.training and self.neural_augmentor is not None:\n            x = self.neural_augmentor(x)\n            out_dict[\"augmented_tensor\"] = x\n\n        x = self._forward_layer(self.conv_1, x)  # 112 x112\n        x = self._forward_layer(self.layer_1, x)  # 112 x112\n        out_dict[\"out_l1\"] = x\n\n        x = self._forward_layer(self.layer_2, x)  # 56 x 56\n        out_dict[\"out_l2\"] = x\n\n        x = self._forward_layer(self.layer_3, x)  # 28 x 28\n        out_dict[\"out_l3\"] = x\n\n        x = self._forward_layer(self.layer_4, x)  # 14 x 14\n        out_dict[\"out_l4\"] = x\n\n        if use_l5:\n            x = self._forward_layer(self.layer_5, x)  # 7 x 7\n            out_dict[\"out_l5\"] = x\n\n            if use_l5_exp:\n                x = self._forward_layer(self.conv_1x1_exp, x)\n                out_dict[\"out_l5_exp\"] = x\n        return out_dict\n\n    def extract_end_points_l4(self, x: Tensor, *args, **kwargs) -> Dict[str, Tensor]:\n        \"\"\"This function is similar to `extract_end_points_all`, with an exception that\n        it only returns output in a dictionary form till `layer_4` of the model.\n        \"\"\"\n        return self.extract_end_points_all(x, use_l5=False)\n\n    def extract_features(self, x: Tensor, *args, **kwargs) -> Tensor:\n        \"\"\"This function is similar to `extract_end_points_all`. However, it returns a single tensor as the\n        output of the last layer instead of a dictionary, and is typically used during classification tasks where\n        intermediate feature maps are not required.\n        \"\"\"\n        x = self._forward_layer(self.conv_1, x)\n        x = self._forward_layer(self.layer_1, x)\n        x = self._forward_layer(self.layer_2, x)\n        x = self._forward_layer(self.layer_3, x)\n\n        x = self._forward_layer(self.layer_4, x)\n        x = self._forward_layer(self.layer_5, x)\n        x = self._forward_layer(self.conv_1x1_exp, x)\n        return x\n\n    def forward_classifier(self, x: Tensor, *args, **kwargs) -> Tensor:\n        \"\"\"A helper function to extract features and running a classifier.\"\"\"\n        # We add another classifier function so that the classifiers\n        # that do not adhere to the structure of BaseEncoder can still\n        # use neural augmentor\n        x = self.extract_features(x)\n        x = self.classifier(x)\n        return x\n\n    def forward(self, x: Any, *args, **kwargs) -> Any:\n        \"\"\"A forward function of the model, optionally training the model with\n        neural augmentation.\"\"\"\n        if self.neural_augmentor is not None:\n            if self.training:\n                x_aug = self.neural_augmentor(x)\n                prediction = self.forward_classifier(x_aug)  # .detach()\n                out_dict = {\"augmented_tensor\": x_aug, \"logits\": prediction}\n            else:\n                out_dict = {\n                    \"augmented_tensor\": None,\n                    \"logits\": self.forward_classifier(x),\n                }\n            return out_dict\n        else:\n            x = self.forward_classifier(x, *args, **kwargs)\n            return x\n\n    def get_trainable_parameters(\n        self,\n        weight_decay: Optional[float] = 0.0,\n        no_decay_bn_filter_bias: Optional[bool] = False,\n        *args,\n        **kwargs,\n    ) -> Tuple[List[Mapping], List[float]]:\n        \"\"\"Get parameters for training along with the learning rate.\n\n        Args:\n            weight_decay: weight decay\n            no_decay_bn_filter_bias: Do not decay BN and biases. Defaults to False.\n\n        Returns:\n             Returns a tuple of length 2. The first entry is a list of dictionary with three keys\n             (params, weight_decay, param_names). The second entry is a list of floats containing\n             learning rate for each parameter.\n        \"\"\"\n        if self.enable_layer_wise_lr_decay:\n            return self._apply_layer_wise_lr(\n                weight_decay=weight_decay,\n                no_decay_bn_filter_bias=no_decay_bn_filter_bias,\n                *args,\n                **kwargs,\n            )\n        return super().get_trainable_parameters(\n            weight_decay=weight_decay,\n            no_decay_bn_filter_bias=no_decay_bn_filter_bias,\n            *args,\n            **kwargs,\n        )\n\n    def dummy_input_and_label(self, batch_size: int) -> Dict:\n        \"\"\"Create dummy input and labels for CI/CD purposes. Child classes must override it\n        if functionality is different.\n        \"\"\"\n        img_channels = 3\n        if is_test_env():\n            # We use smaller spatial resolution, for faster testing.\n            # We use 32 because most ImageNet models do a down-sampling by a factor of 32 before\n            # global average pooling and classification layer.\n            height = 32\n            width = 32\n        else:\n            # this is the typical resolution used in ImageNet datasets\n            height = 224\n            width = 224\n        n_labels = 10\n        img_tensor = torch.randn(\n            batch_size, img_channels, height, width, dtype=torch.float\n        )\n        label_tensor = torch.randint(low=0, high=n_labels, size=(batch_size,)).long()\n        return {\"samples\": img_tensor, \"targets\": label_tensor}\n\n    def get_exportable_model(self) -> nn.Module:\n        \"\"\"\n        This function can be used to prepare the architecture for inference. For example,\n        re-parameterizing branches when possible. The functionality of this method may vary\n        from model to model, so child model classes have to implement this method, if such a\n        transformation exists.\n        \"\"\"\n        return self\n\n    @classmethod\n    def build_model(cls, opts: argparse.Namespace, *args, **kwargs) -> BaseAnyNNModel:\n        \"\"\"Helper function to build a model.\n\n        Args:\n            opts: Command-line arguments\n\n        Returns:\n            An instance of `corenet.modeling.models.BaseAnyNNModel`.\n        \"\"\"\n        default_opt_info = set_model_specific_opts_before_model_building(opts)\n        model = cls(opts, *args, **kwargs)\n\n        unset_model_specific_opts_after_model_building(opts, default_opt_info)\n\n        if getattr(opts, \"model.classification.freeze_batch_norm\"):\n            cls.freeze_norm_layers(opts=opts, model=model)\n        return model\n\n\n# TODO: Find models and configurations that uses `set_model_specific_opts_before_model_building` and\n#  `unset_model_specific_opts_after_model_building` functions. Find a more explicit way of satisfying this requirement,\n#  such as namespacing config entries in a more composable way so that we no longer have conflicting config entries.\n\n\ndef set_model_specific_opts_before_model_building(\n    opts: argparse.Namespace,\n) -> Dict[str, Any]:\n    \"\"\"Override library-level defaults with model-specific default values.\n\n    Args:\n        opts: Command-line arguments\n\n    Returns:\n        A dictionary containing the name of arguments that are updated along with their original values.\n        This dictionary is used in `unset_model_specific_opts_after_model_building` function to unset the\n        model-specific to library-specific defaults.\n    \"\"\"\n\n    cls_act_fn = getattr(opts, \"model.classification.activation.name\")\n    default_opts_info = {}\n    if cls_act_fn is not None:\n        # Override the default activation arguments with classification network specific arguments\n        default_act_fn = getattr(opts, \"model.activation.name\", \"relu\")\n        default_act_inplace = getattr(opts, \"model.activation.inplace\", False)\n        default_act_neg_slope = getattr(opts, \"model.activation.neg_slope\", 0.1)\n\n        setattr(opts, \"model.activation.name\", cls_act_fn)\n        setattr(\n            opts,\n            \"model.activation.inplace\",\n            getattr(opts, \"model.classification.activation.inplace\", False),\n        )\n        setattr(\n            opts,\n            \"model.activation.neg_slope\",\n            getattr(opts, \"model.classification.activation.neg_slope\", 0.1),\n        )\n\n        default_opts_info[\"model.activation.name\"] = default_act_fn\n        default_opts_info[\"model.activation.inplace\"] = default_act_inplace\n        default_opts_info[\"model.activation.neg_slope\"] = default_act_neg_slope\n    return default_opts_info\n\n\ndef unset_model_specific_opts_after_model_building(\n    opts: argparse.Namespace, default_opts_info: Dict[str, Any], *ars, **kwargs\n) -> None:\n    \"\"\"Given command-line arguments and a mapping of opts that needs to be unset, this function\n    unsets the library-level defaults that were over-ridden previously\n    in `set_model_specific_opts_before_model_building`.\n    \"\"\"\n    assert isinstance(default_opts_info, dict), (\n        f\"Please ensure set_model_specific_opts_before_model_building() \"\n        f\"returns a dict.\"\n    )\n\n    if default_opts_info:\n        for k, v in default_opts_info.items():\n            setattr(opts, k, v)\n"
  },
  {
    "path": "corenet/modeling/models/classification/byteformer.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\nimport argparse\nimport math\nfrom typing import Dict, Optional, Tuple, Union\n\nimport numpy as np\nimport torch\nfrom torch import Tensor, nn\nfrom torch.nn import init\n\nfrom corenet.modeling.layers import (\n    LinearLayer,\n    embedding,\n    get_normalization_layer,\n    normalization,\n    positional_embedding,\n    token_merging,\n)\nfrom corenet.modeling.models import MODEL_REGISTRY, BaseAnyNNModel\nfrom corenet.modeling.models.classification.config.byteformer import get_configuration\nfrom corenet.modeling.modules import WindowedTransformerEncoder\n\n\ndef unfold_tokens(t: Tensor, kernel_size: int) -> Tensor:\n    \"\"\"\n    Group tokens from tensor @t using torch.Tensor.unfold, using the given\n    kernel size. This amounts to windowing @t using overlapping windows\n    of size @kernel_size, with overlap of @kernel_size // 2.\n\n    Args:\n        t: A tensor of shape [batch_size, sequence_length, num_channels].\n        kernel_size: The kernel size.\n\n    Returns:\n        A tensor of shape [batch_size * (sequence_length - kernel_size)\n        // (kernel_size // 2) + 1, kernel_size, num_channels].\n    \"\"\"\n    t = t.unfold(dimension=1, size=kernel_size, step=kernel_size // 2)\n    B, L, C, _ = t.shape\n    t = t.reshape(B * L, C, kernel_size)\n    t = t.transpose(1, 2)\n    return t\n\n\n@MODEL_REGISTRY.register(name=\"byteformer\", type=\"classification\")\nclass ByteFormer(BaseAnyNNModel):\n    \"\"\"\n    This class defines the `ByteFormer <https://arxiv.org/abs/2306.00238>`_ architecture.\n    \"\"\"\n\n    def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None:\n        super().__init__(opts, *args, **kwargs)\n\n        byteformer_config = get_configuration(opts)\n        embed_dim = byteformer_config[\"embed_dim\"]\n        ffn_dim = byteformer_config[\"ffn_dim\"]\n        n_transformer_layers = byteformer_config[\"n_transformer_layers\"]\n        num_heads = byteformer_config[\"n_attn_heads\"]\n        attn_dropout = byteformer_config[\"attn_dropout\"]\n        dropout = byteformer_config[\"dropout\"]\n        ffn_dropout = byteformer_config[\"ffn_dropout\"]\n        norm_layer = byteformer_config[\"norm_layer\"]\n\n        # This is usually 257 in the case of byte inputs (2**8 + 1 mask token).\n        vocab_size = getattr(opts, \"model.classification.byteformer.vocab_size\")\n        self.embeddings = embedding.Embedding(\n            opts, num_embeddings=vocab_size, embedding_dim=embed_dim, padding_idx=-1\n        )\n        # Reinitialize everything except the padding index.\n        init.trunc_normal_(self.embeddings.weight[:-1], std=math.sqrt(1.0 / embed_dim))\n\n        self.dummy_input_token_length = getattr(\n            opts, \"model.classification.byteformer.dummy_input_token_length\"\n        )\n\n        # Add token reduction convolution.\n        self.conv_kernel_size = getattr(\n            opts, \"model.classification.byteformer.conv_kernel_size\"\n        )\n        if self.conv_kernel_size == 0:\n            # We skip the convolution.\n            self.token_reduction_net = None\n        if self.conv_kernel_size is not None:\n            self.token_reduction_net = nn.Conv1d(\n                embed_dim,\n                get_configuration(opts)[\"embed_dim\"],\n                kernel_size=self.conv_kernel_size,\n                stride=self.conv_kernel_size // 2,\n                bias=False,\n            )\n\n        # Add the positional embeddings.\n        self.max_num_tokens = getattr(\n            opts, \"model.classification.byteformer.max_num_tokens\"\n        )\n        self.sinusoidal_pos_embed = getattr(\n            opts, \"model.classification.byteformer.sinusoidal_pos_emb\"\n        )\n        self.pos_embed = positional_embedding.PositionalEmbedding(\n            opts=opts,\n            num_embeddings=self.max_num_tokens,\n            embedding_dim=embed_dim,\n            sequence_first=False,\n            padding_idx=None,\n            is_learnable=not self.sinusoidal_pos_embed,\n            interpolation_mode=\"bilinear\",\n        )\n\n        pos_emb_drop_p = getattr(opts, \"model.classification.byteformer.dropout\")\n        self.emb_dropout = nn.Dropout(p=pos_emb_drop_p)\n\n        # Build the transformer backbone.\n        window_sizes = getattr(opts, \"model.classification.byteformer.window_sizes\")\n        window_shifts = getattr(opts, \"model.classification.byteformer.window_shifts\")\n        downsample = getattr(opts, \"model.classification.byteformer.downsample\")\n\n        if len(window_sizes) == 1:\n            window_sizes = window_sizes * n_transformer_layers\n\n        for x in [window_sizes, window_shifts, downsample]:\n            if len(x) != n_transformer_layers:\n                raise ValueError(\n                    f\"Invalid argument length {len(x)} != {n_transformer_layers}\"\n                )\n\n        stochastic_dropout = getattr(\n            opts, \"model.classification.byteformer.stochastic_dropout\"\n        )\n        per_layer_stochastic_drop_rate = [\n            round(x, 3)\n            for x in np.linspace(0, stochastic_dropout, n_transformer_layers)\n        ]\n\n        blocks = []\n        self.downsamplers = nn.ModuleDict()\n        for layer_idx in range(n_transformer_layers):\n            blocks.append(\n                WindowedTransformerEncoder(\n                    opts=opts,\n                    embed_dim=embed_dim,\n                    ffn_latent_dim=ffn_dim,\n                    num_heads=num_heads,\n                    attn_dropout=attn_dropout,\n                    dropout=dropout,\n                    ffn_dropout=ffn_dropout,\n                    transformer_norm_layer=norm_layer,\n                    stochastic_dropout=per_layer_stochastic_drop_rate[layer_idx],\n                    window_size=window_sizes[layer_idx],\n                    window_shift=window_shifts[layer_idx],\n                )\n            )\n            if downsample is not None and downsample[layer_idx]:\n                self.downsamplers[self.get_downsampler_name(layer_idx)] = (\n                    token_merging.TokenMerging(embed_dim)\n                )\n        self.transformer = nn.Sequential(*blocks)\n\n        self.post_transformer_norm = get_normalization_layer(\n            opts=opts, num_features=embed_dim, norm_type=norm_layer\n        )\n\n        num_classes = getattr(opts, \"model.classification.n_classes\")\n        self.classifier = LinearLayer(embed_dim, num_classes)\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        if cls != ByteFormer:\n            # Don't re-register arguments in subclasses that don't override `add_arguments()`.\n            return parser\n        group = parser.add_argument_group(title=cls.__name__)\n        group.add_argument(\n            \"--model.classification.byteformer.dropout\",\n            type=float,\n            default=0.0,\n            help=\"Dropout in Byteformer layers. Defaults to 0.0.\",\n        )\n        group.add_argument(\n            \"--model.classification.byteformer.stochastic-dropout\",\n            type=float,\n            default=0.0,\n            help=\"Probability of applying stochastic dropout to \"\n            \"TransformerEncoder submodules. Defaults to 0.0.\",\n        )\n        group.add_argument(\n            \"--model.classification.byteformer.norm-layer\",\n            type=str,\n            default=\"layer_norm\",\n            help=\"Normalization layer in Byteformer. Defaults to LayerNorm.\",\n            choices=list(normalization.NORM_LAYER_REGISTRY.keys()),\n        )\n        group.add_argument(\n            \"--model.classification.byteformer.sinusoidal-pos-emb\",\n            action=\"store_true\",\n            default=False,\n            help=\"Use sinusoidal instead of learnable positional encoding. Defaults to False.\",\n        )\n        group.add_argument(\n            \"--model.classification.byteformer.use-pytorch-mha\",\n            action=\"store_true\",\n            default=False,\n            help=\"Use PyTorch's native multi-head attention. Defaults to False.\",\n        )\n        group.add_argument(\n            \"--model.classification.byteformer.mode\",\n            type=str,\n            default=\"tiny\",\n            help=\"Byteformer mode, which determines the model size. Defaults to tiny.\",\n            choices=(\"tiny\", \"small\", \"base\", \"huge\"),\n        )\n        group.add_argument(\n            \"--model.classification.byteformer.vocab-size\",\n            type=int,\n            help=\"The vocab size of the token embedding. Defaults to 257,\"\n            \"corresponding to the number of unique bytes (256) plus 1 \"\n            \"more for the mask token.\",\n            default=257,\n        )\n        group.add_argument(\n            \"--model.classification.byteformer.max-num-tokens\",\n            type=int,\n            help=\"The maximum number of tokens that can be input to the network. Defaults to 10000.\",\n            default=10000,\n        )\n        group.add_argument(\n            \"--model.classification.byteformer.conv-kernel-size\",\n            type=int,\n            default=16,\n            help=\"The size of the kernel of the initial downsampling conv1d. Defaults to 16.\",\n        )\n        group.add_argument(\n            \"--model.classification.byteformer.window-sizes\",\n            type=int,\n            nargs=\"*\",\n            default=[128],\n            help=\"A list of window sizes used in shifted window attention. If the \"\n            \"list is length 1, the same window size is used for all windows. \"\n            \"Defaults to 128 for all windows.\",\n        )\n        group.add_argument(\n            \"--model.classification.byteformer.window-shifts\",\n            type=int,\n            nargs=\"*\",\n            default=[0, 64] * 6,\n            help=\"A list of shifts used in shifted window attention. Defaults to values that alternate between 0 and 64.\",\n        )\n        default_downsampling = [True, True] + ([False, True] * 4) + [False, False]\n        group.add_argument(\n            \"--model.classification.byteformer.downsample\",\n            type=bool,\n            nargs=\"*\",\n            default=default_downsampling,\n            help=\"A list of boolean values, where the i'th element specifies \"\n            \"whether to downsample after the transformer block with index i. \"\n            f\"Defaults to {default_downsampling}.\",\n        )\n        group.add_argument(\n            \"--model.classification.byteformer.padding-index\",\n            default=-1,\n            type=int,\n            help=\"The index used for padding tokens. Defaults to -1.\",\n        )\n        group.add_argument(\n            \"--model.classification.byteformer.dummy-input-token-length\",\n            default=48564,\n            type=int,\n            help=\"The token length to use for dummy inputs. Defaults to 48564, \"\n            \"corresponding to the average length of 224x224 JPEG images from \"\n            \"ImageNet.\",\n        )\n        return parser\n\n    def dummy_input_and_label(self, batch_size: int) -> Dict:\n        \"\"\"\n        Get a dummy input and label that could be passed to the model.\n\n        Args:\n            batch_size: The batch size to use for the generated inputs.\n\n        Returns:\n            A dict with\n                {\n                    \"samples\": tensor of shape [batch_size, sequence_length],\n                    \"targets\": tensor of shape [batch_size],\n                }\n        \"\"\"\n        n_labels = 10\n        max_value = 257\n\n        samples = torch.randint(\n            0, max_value, [batch_size, self.dummy_input_token_length]\n        )\n        targets = torch.randint(low=0, high=n_labels, size=(batch_size,)).long()\n        return {\"samples\": samples, \"targets\": targets}\n\n    def apply_token_reduction_net(\n        self, x: Tensor, x_mask: Tensor\n    ) -> Tuple[Tensor, Tensor]:\n        \"\"\"\n        Apply the portion of the network used to reduce sequence lengths before\n        the transformer backbone.\n\n        Args:\n            x: The input token embeddings of shape [batch_size, sequence_length,\n                embed_dim].\n            x_mask: The input mask of shape [batch_size, sequence_length].\n\n        Returns:\n            New versions of @x and @x_mask, downsampled along the sequence\n            dimension by the token reduction net.\n        \"\"\"\n        B, N, C = x.shape\n        if self.token_reduction_net is None:\n            return x, x_mask\n\n        x = self.token_reduction_net(x.permute(0, 2, 1)).permute(0, 2, 1)\n        if x_mask is not None:\n            x_mask = unfold_tokens(\n                x_mask.reshape(B, N, 1).float(), self.conv_kernel_size\n            )\n            # The mask is now [B * N, kernel_size, 1]. It contains values in {0, -inf}.\n            x_mask = x_mask.max(dim=1).values.view(x.shape[0], x.shape[1])\n\n            assert x.shape[:2] == x_mask.shape\n        return x, x_mask\n\n    def get_backbone_inputs(self, x: Tensor) -> Tuple[Tensor, Tensor]:\n        \"\"\"\n        Convert input bytes into embeddings to be passed to the network's\n        transformer backbone.\n\n        Args:\n            x: The input bytes as an integer tensor of shape [batch_size,\n                sequence_length]. Integer tensors are expected (rather than byte\n                tensors) since -1 is usually used for padding.\n\n        Returns:\n            The embeddings of shape [batch_size, new_sequence_length] and a\n            mask tensor of shape [batch_size, new_sequence_length]. The mask\n            contains 0 at unmasked positions and float(-inf) at masked\n            positions.\n        \"\"\"\n        mask = torch.zeros_like(x, dtype=torch.float)\n        mask[x == -1].fill_(float(\"-inf\"))\n        mask = mask.detach().requires_grad_(False)\n        x[x == -1] = self.embeddings.padding_idx\n        x = self.embeddings(x)\n\n        x, mask = self.apply_token_reduction_net(x, mask)\n        x = x + self.pos_embed(self.max_num_tokens)[:, : x.shape[1]]\n\n        x = self.emb_dropout(x)\n        return x, mask\n\n    def backbone_forward(\n        self, x: Tensor, key_padding_mask: Tensor\n    ) -> Tuple[Tensor, Tensor]:\n        \"\"\"\n        Execute the forward pass of the network's transformer backbone.\n\n        Args:\n            x: The input embeddings as a [batch_size, sequence_length, embed_dim] tensor.\n            key_padding_mask: The mask tensor of shape [batch_size, sequence_length].\n\n        Returns:\n            The outputs of the backbone as a tuple. The first element is the feature\n            tensor, and the second element is the updated key_padding_mask.\n        \"\"\"\n        B, S, _ = x.shape\n        assert key_padding_mask.shape == (B, S)\n\n        for layer_idx, elem in enumerate(self.transformer):\n            x = elem(x, key_padding_mask=key_padding_mask)\n            if self.get_downsampler(layer_idx) is not None:\n                x, key_padding_mask = self.get_downsampler(layer_idx)(\n                    x, key_padding_mask\n                )\n        x = self.post_transformer_norm(x)\n        return x, key_padding_mask\n\n    def get_downsampler_name(self, idx: int) -> str:\n        \"\"\"\n        Get the name of the downsampling layer with index @idx.\n\n        Args:\n            idx: The index of the downsampling layer.\n\n        Returns:\n            A string representing the name of the donwsampling layer.\n        \"\"\"\n        return f\"downsample_{idx}\"\n\n    def get_downsampler(self, idx: int) -> Optional[nn.Module]:\n        \"\"\"\n        Get the module that performs downsampling after transformer layer @idx.\n        If no downsampling occurs after that layer, return None.\n\n        Args:\n            idx: The desired index.\n\n        Returns:\n            The downsampling layer, or None.\n        \"\"\"\n        name = self.get_downsampler_name(idx)\n        if name not in self.downsamplers:\n            return None\n        return self.downsamplers[name]\n\n    def forward(self, x: Tensor, *args, **kwargs) -> Tensor:\n        \"\"\"\n        Perform a forward pass on input bytes. The tensor is\n        stored as an integer tensor of shape [batch_size, sequence_length].\n        Integer tensors are used because @x usually contains mask tokens.\n\n        Args:\n            x: The input tensor of shape [batch_size, sequence_length].\n\n        Returns:\n            The output logits.\n        \"\"\"\n        x, key_padding_mask = self.get_backbone_inputs(x)\n        x, attn_mask = self.backbone_forward(x, key_padding_mask)\n\n        attn_mask = attn_mask.view(x.shape[0], x.shape[1], 1)\n        x[(attn_mask == float(\"-inf\")).expand(-1, -1, x.shape[-1])] = 0\n        norms = (attn_mask == 0).sum(dim=1)\n        x = torch.sum(x, dim=1) / norms\n        x = self.classifier(x)\n        return x\n\n    @classmethod\n    def build_model(cls, opts: argparse.Namespace, *args, **kwargs) -> BaseAnyNNModel:\n        \"\"\"\n        Helper function to build a model.\n\n        Args:\n            opts: Command-line arguments.\n\n        Returns:\n            An instance of `corenet.modeling.models.BaseAnyNNModel`.\n        \"\"\"\n        model = cls(opts, *args, **kwargs)\n\n        if getattr(opts, \"model.classification.freeze_batch_norm\"):\n            cls.freeze_norm_layers(opts=opts, model=model)\n        return model\n"
  },
  {
    "path": "corenet/modeling/models/classification/config/__init__.py",
    "content": ""
  },
  {
    "path": "corenet/modeling/models/classification/config/byteformer.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\nimport argparse\nfrom typing import Dict\n\nfrom corenet.utils import logger\n\n\ndef get_configuration(opts: argparse.Namespace) -> Dict:\n    \"\"\"\n    Get configuration parameters associated with ByteFormer.\n\n    These parameters are similar to those of DeIT\n    (https://arxiv.org/pdf/2012.12877.pdf).\n\n    Args:\n        opts: The options configuration.\n\n    Returns:\n        A dict with keys specifying the parameters needed for ByteFormer.\n    \"\"\"\n    mode = getattr(opts, \"model.classification.byteformer.mode\")\n    mode = mode.lower()\n    dropout = getattr(opts, \"model.classification.byteformer.dropout\")\n    norm_layer = getattr(opts, \"model.classification.byteformer.norm_layer\")\n\n    byteformer_config = dict()\n    if mode == \"tiny\":\n        byteformer_config = {\n            \"embed_dim\": 192,\n            \"n_transformer_layers\": 12,\n            \"n_attn_heads\": 3,\n            \"ffn_dim\": 192 * 4,\n            \"norm_layer\": norm_layer,\n            \"pos_emb_drop_p\": 0.1,\n            \"attn_dropout\": 0.0,\n            \"ffn_dropout\": 0.0,\n            \"dropout\": dropout,\n        }\n    elif mode == \"small\":\n        byteformer_config = {\n            \"embed_dim\": 384,\n            \"n_transformer_layers\": 12,\n            \"n_attn_heads\": 6,\n            \"ffn_dim\": 384 * 4,\n            \"norm_layer\": norm_layer,\n            \"pos_emb_drop_p\": 0.0,\n            \"attn_dropout\": 0.0,\n            \"ffn_dropout\": 0.0,\n            \"dropout\": dropout,\n        }\n    elif mode == \"base\":\n        byteformer_config = {\n            \"embed_dim\": 768,\n            \"n_transformer_layers\": 12,\n            \"n_attn_heads\": 12,\n            \"ffn_dim\": 768 * 4,\n            \"norm_layer\": norm_layer,\n            \"pos_emb_drop_p\": 0.0,\n            \"attn_dropout\": 0.0,\n            \"ffn_dropout\": 0.0,\n            \"dropout\": dropout,\n        }\n    elif mode == \"huge\":\n        byteformer_config = {\n            \"embed_dim\": 1280,\n            \"n_transformer_layers\": 32,\n            \"n_attn_heads\": 20,  # each head dimension is 64\n            \"ffn_dim\": 1280 * 4,\n            \"norm_layer\": norm_layer,\n            \"pos_emb_drop_p\": 0.0,\n            \"attn_dropout\": 0.0,\n            \"ffn_dropout\": 0.0,\n            \"dropout\": dropout,\n        }\n    else:\n        logger.error(\"Got unsupported ByteFormer configuration: {}\".format(mode))\n    return byteformer_config\n"
  },
  {
    "path": "corenet/modeling/models/classification/config/efficientnet.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport math\nfrom dataclasses import dataclass\nfrom functools import partial\nfrom typing import Dict\n\nfrom corenet.utils import logger\nfrom corenet.utils.math_utils import make_divisible\n\n\n@dataclass\nclass CompoundScalingConfig:\n    \"\"\"This class stores the compound scaling configuration\"\"\"\n\n    width_mult: float\n    depth_mult: float\n    train_resolution: int\n\n\n@dataclass\nclass EfficientNetBlockConfig:\n    \"\"\"This class stores the config for each block in EfficientNet i.e. MBConv layers\n    in Table 1 of `EfficientNet paper <https://arxiv.org/abs/1905.11946>`_\n    Notably, this class takes width_mult and depth_mult as input too and adjusts\n    layers' depth and width, as is required in different modes of EfficientNet.\n    \"\"\"\n\n    def __init__(\n        self,\n        expand_ratio: float,\n        kernel: int,\n        stride: int,\n        in_channels: int,\n        out_channels: int,\n        num_layers: int,\n        width_mult: float,\n        depth_mult: float,\n    ):\n        self.expand_ratio = expand_ratio\n        self.kernel = kernel\n        self.stride = stride\n        self.in_channels = int(make_divisible(in_channels * width_mult, 8))\n        self.out_channels = int(make_divisible(out_channels * width_mult, 8))\n        self.num_layers = int(math.ceil(num_layers * depth_mult))\n\n\ndef get_configuration(opts) -> Dict:\n    network_mode = getattr(opts, \"model.classification.efficientnet.mode\")\n\n    if network_mode is None:\n        logger.error(\n            \"EfficientNet mode can't be none. Please specify --model.classification.efficientnet.mode\"\n        )\n\n    network_mode = network_mode.lower()\n    network_config = dict()\n\n    # EfficientNet scales depth, width and resolution.\n    # We will make use of resolution in the yaml configuration file, but leave it here for the sake of completeness\n\n    compound_scaling_cfg = {\n        \"b0\": CompoundScalingConfig(1.0, 1.0, 224),\n        \"b1\": CompoundScalingConfig(1.0, 1.1, 240),\n        \"b2\": CompoundScalingConfig(1.1, 1.2, 260),\n        \"b3\": CompoundScalingConfig(1.2, 1.4, 300),\n        \"b4\": CompoundScalingConfig(1.4, 1.8, 380),\n        \"b5\": CompoundScalingConfig(1.6, 2.2, 456),\n        \"b6\": CompoundScalingConfig(1.8, 2.6, 528),\n        \"b7\": CompoundScalingConfig(2.0, 3.1, 600),\n        \"b8\": CompoundScalingConfig(2.2, 3.6, 672),\n    }\n\n    if network_mode in compound_scaling_cfg:\n        compound_scaling_cfg_mode_i = compound_scaling_cfg[network_mode]\n        width_mult = compound_scaling_cfg_mode_i.width_mult\n        depth_mult = compound_scaling_cfg_mode_i.depth_mult\n\n        # pre-feed depth and width multipliers as they are always used and same across layers.\n        block_builder = partial(\n            EfficientNetBlockConfig, width_mult=width_mult, depth_mult=depth_mult\n        )\n\n        # Build the configuration at each spatial level.\n        # The format of configuration is: (expand_ratio, kernel, stride, in_channels, out_channels, num_layers)\n\n        # Configuration at output stride of 2\n        network_config[\"layer_1\"] = [block_builder(1, 3, 1, 32, 16, 1)]\n\n        # Configuration at output stride of 4\n        network_config[\"layer_2\"] = [\n            block_builder(6, 3, 2, 16, 24, 2),\n        ]\n\n        # Configuration at output stride of 8\n        network_config[\"layer_3\"] = [\n            block_builder(6, 5, 2, 24, 40, 2),\n        ]\n\n        # Configuration at output stride of 16\n        network_config[\"layer_4\"] = [\n            block_builder(6, 3, 2, 40, 80, 3),\n            block_builder(6, 5, 1, 80, 112, 3),\n        ]\n        # Configuration at output stride of 32\n        network_config[\"layer_5\"] = [\n            block_builder(6, 5, 2, 112, 192, 4),\n            block_builder(6, 3, 1, 192, 320, 1),\n        ]\n        network_config[\"last_channels\"] = 4 * network_config[\"layer_5\"][-1].out_channels\n    else:\n        logger.error(\n            \"Current supported modes for EfficientNet are b[0-7]. Got: {}\".format(\n                network_mode\n            )\n        )\n\n    # Count the total number of layers throughout all blocks.\n    # This will be used for stochastic depth (if enabled)\n    total_layers = 0\n    for layer_name in [\"layer_1\", \"layer_2\", \"layer_3\", \"layer_4\", \"layer_5\"]:\n        for block_config in network_config[layer_name]:\n            total_layers += block_config.num_layers\n    network_config[\"total_layers\"] = total_layers\n    return network_config\n"
  },
  {
    "path": "corenet/modeling/models/classification/config/fastvit.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\nimport argparse\nfrom functools import partial\nfrom typing import Dict\n\nfrom corenet.modeling.modules.fastvit import RepCPE\nfrom corenet.utils import logger\n\n\ndef get_configuration(opts: argparse.Namespace) -> Dict:\n    \"\"\"Get configuration of FastViT models.\"\"\"\n    variant = getattr(opts, \"model.classification.fastvit.variant\")\n    config = dict()\n\n    if variant == \"T8\":\n        config = {\n            \"layers\": [2, 2, 4, 2],\n            \"embed_dims\": [48, 96, 192, 384],\n            \"mlp_ratios\": [3, 3, 3, 3],\n            \"downsamples\": [True, True, True, True],\n            \"pos_embs\": None,\n            \"token_mixers\": [\"repmixer\", \"repmixer\", \"repmixer\", \"repmixer\"],\n            \"down_patch_size\": 7,\n            \"down_stride\": 2,\n            \"cls_ratio\": 2.0,\n            \"repmixer_kernel_size\": 3,\n        }\n    elif variant == \"T12\":\n        config = {\n            \"layers\": [2, 2, 6, 2],\n            \"embed_dims\": [64, 128, 256, 512],\n            \"mlp_ratios\": [3, 3, 3, 3],\n            \"downsamples\": [True, True, True, True],\n            \"pos_embs\": None,\n            \"token_mixers\": [\"repmixer\", \"repmixer\", \"repmixer\", \"repmixer\"],\n            \"down_patch_size\": 7,\n            \"down_stride\": 2,\n            \"cls_ratio\": 2.0,\n            \"repmixer_kernel_size\": 3,\n        }\n    elif variant == \"S12\":\n        config = {\n            \"layers\": [2, 2, 6, 2],\n            \"embed_dims\": [64, 128, 256, 512],\n            \"mlp_ratios\": [4, 4, 4, 4],\n            \"downsamples\": [True, True, True, True],\n            \"pos_embs\": None,\n            \"token_mixers\": [\"repmixer\", \"repmixer\", \"repmixer\", \"repmixer\"],\n            \"down_patch_size\": 7,\n            \"down_stride\": 2,\n            \"cls_ratio\": 2.0,\n            \"repmixer_kernel_size\": 3,\n        }\n    elif variant == \"SA12\":\n        config = {\n            \"layers\": [2, 2, 6, 2],\n            \"embed_dims\": [64, 128, 256, 512],\n            \"mlp_ratios\": [4, 4, 4, 4],\n            \"downsamples\": [True, True, True, True],\n            \"pos_embs\": [None, None, None, partial(RepCPE, spatial_shape=(7, 7))],\n            \"token_mixers\": [\"repmixer\", \"repmixer\", \"repmixer\", \"attention\"],\n            \"down_patch_size\": 7,\n            \"down_stride\": 2,\n            \"cls_ratio\": 2.0,\n            \"repmixer_kernel_size\": 3,\n        }\n    elif variant == \"SA24\":\n        config = {\n            \"layers\": [4, 4, 12, 4],\n            \"embed_dims\": [64, 128, 256, 512],\n            \"mlp_ratios\": [4, 4, 4, 4],\n            \"downsamples\": [True, True, True, True],\n            \"pos_embs\": [None, None, None, partial(RepCPE, spatial_shape=(7, 7))],\n            \"token_mixers\": [\"repmixer\", \"repmixer\", \"repmixer\", \"attention\"],\n            \"down_patch_size\": 7,\n            \"down_stride\": 2,\n            \"cls_ratio\": 2.0,\n            \"repmixer_kernel_size\": 3,\n        }\n    elif variant == \"SA36\":\n        config = {\n            \"layers\": [6, 6, 18, 6],\n            \"embed_dims\": [64, 128, 256, 512],\n            \"mlp_ratios\": [4, 4, 4, 4],\n            \"downsamples\": [True, True, True, True],\n            \"pos_embs\": [None, None, None, partial(RepCPE, spatial_shape=(7, 7))],\n            \"token_mixers\": [\"repmixer\", \"repmixer\", \"repmixer\", \"attention\"],\n            \"down_patch_size\": 7,\n            \"down_stride\": 2,\n            \"cls_ratio\": 2.0,\n            \"repmixer_kernel_size\": 3,\n        }\n    elif variant == \"MA36\":\n        config = {\n            \"layers\": [6, 6, 18, 6],\n            \"embed_dims\": [76, 152, 304, 608],\n            \"mlp_ratios\": [4, 4, 4, 4],\n            \"downsamples\": [True, True, True, True],\n            \"pos_embs\": [None, None, None, partial(RepCPE, spatial_shape=(7, 7))],\n            \"token_mixers\": [\"repmixer\", \"repmixer\", \"repmixer\", \"attention\"],\n            \"down_patch_size\": 7,\n            \"down_stride\": 2,\n            \"cls_ratio\": 2.0,\n            \"repmixer_kernel_size\": 3,\n        }\n    else:\n        logger.error(\n            \"FastViT supported variants: `T8`, `T12`, `S12`, `SA12`, `SA24`,\"\n            \"`SA36` and `MA36`. Please specify variant using \"\n            \"--model.classification.fastvit.variant flag. Got: {}\".format(variant)\n        )\n\n    return config\n"
  },
  {
    "path": "corenet/modeling/models/classification/config/mobilenetv1.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport math\nfrom typing import Dict\n\nfrom corenet.utils.math_utils import make_divisible\n\n\ndef get_configuration(opts) -> Dict:\n    width_mult = getattr(opts, \"model.classification.mobilenetv1.width_multiplier\", 1.0)\n\n    def scale_channels(in_channels):\n        return make_divisible(int(math.ceil(in_channels * width_mult)), 16)\n\n    config = {\n        \"conv1_out\": scale_channels(32),\n        \"layer1\": {\"out_channels\": scale_channels(64), \"stride\": 1, \"repeat\": 1},\n        \"layer2\": {\n            \"out_channels\": scale_channels(128),\n            \"stride\": 2,\n            \"repeat\": 1,\n        },\n        \"layer3\": {\n            \"out_channels\": scale_channels(256),\n            \"stride\": 2,\n            \"repeat\": 1,\n        },\n        \"layer4\": {\n            \"out_channels\": scale_channels(512),\n            \"stride\": 2,\n            \"repeat\": 5,\n        },\n        \"layer5\": {\n            \"out_channels\": scale_channels(1024),\n            \"stride\": 2,\n            \"repeat\": 1,\n        },\n    }\n    return config\n"
  },
  {
    "path": "corenet/modeling/models/classification/config/mobilenetv2.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom typing import Dict\n\n\ndef get_configuration(opts) -> Dict:\n\n    mobilenetv2_config = {\n        \"layer1\": {\n            \"expansion_ratio\": 1,\n            \"out_channels\": 16,\n            \"num_blocks\": 1,\n            \"stride\": 1,\n        },\n        \"layer2\": {\n            \"expansion_ratio\": 6,\n            \"out_channels\": 24,\n            \"num_blocks\": 2,\n            \"stride\": 2,\n        },\n        \"layer3\": {\n            \"expansion_ratio\": 6,\n            \"out_channels\": 32,\n            \"num_blocks\": 3,\n            \"stride\": 2,\n        },\n        \"layer4\": {\n            \"expansion_ratio\": 6,\n            \"out_channels\": 64,\n            \"num_blocks\": 4,\n            \"stride\": 2,\n        },\n        \"layer4_a\": {\n            \"expansion_ratio\": 6,\n            \"out_channels\": 96,\n            \"num_blocks\": 3,\n            \"stride\": 1,\n        },\n        \"layer5\": {\n            \"expansion_ratio\": 6,\n            \"out_channels\": 160,\n            \"num_blocks\": 3,\n            \"stride\": 2,\n        },\n        \"layer5_a\": {\n            \"expansion_ratio\": 6,\n            \"out_channels\": 320,\n            \"num_blocks\": 1,\n            \"stride\": 1,\n        },\n    }\n    return mobilenetv2_config\n"
  },
  {
    "path": "corenet/modeling/models/classification/config/mobilenetv3.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom typing import Dict\n\nfrom corenet.utils import logger\n\n\ndef get_configuration(opts) -> Dict:\n    mv3_mode = getattr(opts, \"model.classification.mobilenetv3.mode\", \"large\")\n\n    if mv3_mode is None:\n        logger.error(\n            \"MobileNetv3 mode can't be none. Please specify --model.classification.mobilenetv3.mode\"\n        )\n\n    mv3_mode = mv3_mode.lower()\n    mv3_config = dict()\n    if mv3_mode == \"small\":\n        # kernel_size, expansion_factor, in_channels, use_se, use_hs, stride\n        mv3_config[\"layer_1\"] = [[3, 1, 16, True, False, 2]]\n\n        mv3_config[\"layer_2\"] = [[3, 4.5, 24, False, False, 2]]\n\n        mv3_config[\"layer_3\"] = [[3, 3.67, 24, False, False, 1]]\n\n        mv3_config[\"layer_4\"] = [\n            [5, 4, 40, True, True, 2],\n            [5, 6, 40, True, True, 1],\n            [5, 6, 40, True, True, 1],\n            [5, 3, 48, True, True, 1],\n            [5, 3, 48, True, True, 1],\n        ]\n\n        mv3_config[\"layer_5\"] = [\n            [5, 6, 96, True, True, 2],\n            [5, 6, 96, True, True, 1],\n            [5, 6, 96, True, True, 1],\n        ]\n        mv3_config[\"last_channels\"] = 1024\n    elif mv3_mode == \"large\":\n        mv3_config[\"layer_1\"] = [[3, 1, 16, False, False, 1]]\n        mv3_config[\"layer_2\"] = [\n            [3, 4, 24, False, False, 2],\n            [3, 3, 24, False, False, 1],\n        ]\n\n        mv3_config[\"layer_3\"] = [\n            [5, 3, 40, True, False, 2],\n            [5, 3, 40, True, False, 1],\n            [5, 3, 40, True, False, 1],\n        ]\n\n        mv3_config[\"layer_4\"] = [\n            [3, 6, 80, False, True, 2],\n            [3, 2.5, 80, False, True, 1],\n            [3, 2.3, 80, False, True, 1],\n            [3, 2.3, 80, False, True, 1],\n            [3, 6, 112, True, True, 1],\n            [3, 6, 112, True, True, 1],\n        ]\n\n        mv3_config[\"layer_5\"] = [\n            [5, 6, 160, True, True, 2],\n            [5, 6, 160, True, True, 1],\n            [5, 6, 160, True, True, 1],\n        ]\n        mv3_config[\"last_channels\"] = 1280\n    else:\n        logger.error(\n            \"Current supported modes for MobileNetv3 are small and large. Got: {}\".format(\n                mv3_mode\n            )\n        )\n    return mv3_config\n"
  },
  {
    "path": "corenet/modeling/models/classification/config/mobileone.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\nimport argparse\nfrom typing import Dict\n\nfrom corenet.utils import logger\n\n\ndef get_configuration(opts: argparse.Namespace) -> Dict:\n    \"\"\"Get configuration of MobileOne models.\"\"\"\n    variant = getattr(opts, \"model.classification.mobileone.variant\")\n    config = dict()\n\n    if variant == \"s0\":\n        config = {\n            \"num_blocks_per_stage\": [2, 8, 10, 1],\n            \"width_multipliers\": (0.75, 1.0, 1.0, 2.0),\n            \"num_conv_branches\": 4,\n            \"use_se\": False,\n        }\n    elif variant == \"s1\":\n        config = {\n            \"num_blocks_per_stage\": [2, 8, 10, 1],\n            \"width_multipliers\": (1.5, 1.5, 2.0, 2.5),\n            \"num_conv_branches\": 1,\n            \"use_se\": False,\n        }\n    elif variant == \"s2\":\n        config = {\n            \"num_blocks_per_stage\": [2, 8, 10, 1],\n            \"width_multipliers\": (1.5, 2.0, 2.5, 4.0),\n            \"num_conv_branches\": 1,\n            \"use_se\": False,\n        }\n    elif variant == \"s3\":\n        config = {\n            \"num_blocks_per_stage\": [2, 8, 10, 1],\n            \"width_multipliers\": (2.0, 2.5, 3.0, 4.0),\n            \"num_conv_branches\": 1,\n            \"use_se\": False,\n        }\n    elif variant == \"s4\":\n        config = {\n            \"num_blocks_per_stage\": [2, 8, 10, 1],\n            \"width_multipliers\": (3.0, 3.5, 3.5, 4.0),\n            \"num_conv_branches\": 1,\n            \"use_se\": True,\n        }\n    else:\n        logger.error(\n            \"MobileOne supported variants: `s0`, `s1`, `s2`, `s3` and `s4`. Please specify variant using \"\n            \"--model.classification.mobileone.variant flag. Got: {}\".format(variant)\n        )\n\n    return config\n"
  },
  {
    "path": "corenet/modeling/models/classification/config/mobilevit.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom typing import Dict\n\nfrom corenet.utils import logger\n\n\ndef get_configuration(opts) -> Dict:\n    mode = getattr(opts, \"model.classification.mit.mode\", \"small\")\n    if mode is None:\n        logger.error(\"Please specify mode\")\n\n    head_dim = getattr(opts, \"model.classification.mit.head_dim\", None)\n    num_heads = getattr(opts, \"model.classification.mit.number_heads\", 4)\n    if head_dim is not None:\n        if num_heads is not None:\n            logger.error(\n                \"--model.classification.mit.head-dim and --model.classification.mit.number-heads \"\n                \"are mutually exclusive.\"\n            )\n    elif num_heads is not None:\n        if head_dim is not None:\n            logger.error(\n                \"--model.classification.mit.head-dim and --model.classification.mit.number-heads \"\n                \"are mutually exclusive.\"\n            )\n    mode = mode.lower()\n    if mode == \"xx_small\":\n        mv2_exp_mult = 2\n        config = {\n            \"layer1\": {\n                \"out_channels\": 16,\n                \"expand_ratio\": mv2_exp_mult,\n                \"num_blocks\": 1,\n                \"stride\": 1,\n                \"block_type\": \"mv2\",\n            },\n            \"layer2\": {\n                \"out_channels\": 24,\n                \"expand_ratio\": mv2_exp_mult,\n                \"num_blocks\": 3,\n                \"stride\": 2,\n                \"block_type\": \"mv2\",\n            },\n            \"layer3\": {  # 28x28\n                \"out_channels\": 48,\n                \"transformer_channels\": 64,\n                \"ffn_dim\": 128,\n                \"transformer_blocks\": 2,\n                \"patch_h\": 2,  # 8,\n                \"patch_w\": 2,  # 8,\n                \"stride\": 2,\n                \"mv_expand_ratio\": mv2_exp_mult,\n                \"head_dim\": head_dim,\n                \"num_heads\": num_heads,\n                \"block_type\": \"mobilevit\",\n            },\n            \"layer4\": {  # 14x14\n                \"out_channels\": 64,\n                \"transformer_channels\": 80,\n                \"ffn_dim\": 160,\n                \"transformer_blocks\": 4,\n                \"patch_h\": 2,  # 4,\n                \"patch_w\": 2,  # 4,\n                \"stride\": 2,\n                \"mv_expand_ratio\": mv2_exp_mult,\n                \"head_dim\": head_dim,\n                \"num_heads\": num_heads,\n                \"block_type\": \"mobilevit\",\n            },\n            \"layer5\": {  # 7x7\n                \"out_channels\": 80,\n                \"transformer_channels\": 96,\n                \"ffn_dim\": 192,\n                \"transformer_blocks\": 3,\n                \"patch_h\": 2,\n                \"patch_w\": 2,\n                \"stride\": 2,\n                \"mv_expand_ratio\": mv2_exp_mult,\n                \"head_dim\": head_dim,\n                \"num_heads\": num_heads,\n                \"block_type\": \"mobilevit\",\n            },\n            \"last_layer_exp_factor\": 4,\n        }\n    elif mode == \"x_small\":\n        mv2_exp_mult = 4\n        config = {\n            \"layer1\": {\n                \"out_channels\": 32,\n                \"expand_ratio\": mv2_exp_mult,\n                \"num_blocks\": 1,\n                \"stride\": 1,\n                \"block_type\": \"mv2\",\n            },\n            \"layer2\": {\n                \"out_channels\": 48,\n                \"expand_ratio\": mv2_exp_mult,\n                \"num_blocks\": 3,\n                \"stride\": 2,\n                \"block_type\": \"mv2\",\n            },\n            \"layer3\": {  # 28x28\n                \"out_channels\": 64,\n                \"transformer_channels\": 96,\n                \"ffn_dim\": 192,\n                \"transformer_blocks\": 2,\n                \"patch_h\": 2,\n                \"patch_w\": 2,\n                \"stride\": 2,\n                \"mv_expand_ratio\": mv2_exp_mult,\n                \"head_dim\": head_dim,\n                \"num_heads\": num_heads,\n                \"block_type\": \"mobilevit\",\n            },\n            \"layer4\": {  # 14x14\n                \"out_channels\": 80,\n                \"transformer_channels\": 120,\n                \"ffn_dim\": 240,\n                \"transformer_blocks\": 4,\n                \"patch_h\": 2,\n                \"patch_w\": 2,\n                \"stride\": 2,\n                \"mv_expand_ratio\": mv2_exp_mult,\n                \"head_dim\": head_dim,\n                \"num_heads\": num_heads,\n                \"block_type\": \"mobilevit\",\n            },\n            \"layer5\": {  # 7x7\n                \"out_channels\": 96,\n                \"transformer_channels\": 144,\n                \"ffn_dim\": 288,\n                \"transformer_blocks\": 3,\n                \"patch_h\": 2,\n                \"patch_w\": 2,\n                \"stride\": 2,\n                \"mv_expand_ratio\": mv2_exp_mult,\n                \"head_dim\": head_dim,\n                \"num_heads\": num_heads,\n                \"block_type\": \"mobilevit\",\n            },\n            \"last_layer_exp_factor\": 4,\n        }\n    elif mode == \"small\":\n        mv2_exp_mult = 4\n        config = {\n            \"layer1\": {\n                \"out_channels\": 32,\n                \"expand_ratio\": mv2_exp_mult,\n                \"num_blocks\": 1,\n                \"stride\": 1,\n                \"block_type\": \"mv2\",\n            },\n            \"layer2\": {\n                \"out_channels\": 64,\n                \"expand_ratio\": mv2_exp_mult,\n                \"num_blocks\": 3,\n                \"stride\": 2,\n                \"block_type\": \"mv2\",\n            },\n            \"layer3\": {  # 28x28\n                \"out_channels\": 96,\n                \"transformer_channels\": 144,\n                \"ffn_dim\": 288,\n                \"transformer_blocks\": 2,\n                \"patch_h\": 2,\n                \"patch_w\": 2,\n                \"stride\": 2,\n                \"mv_expand_ratio\": mv2_exp_mult,\n                \"head_dim\": head_dim,\n                \"num_heads\": num_heads,\n                \"block_type\": \"mobilevit\",\n            },\n            \"layer4\": {  # 14x14\n                \"out_channels\": 128,\n                \"transformer_channels\": 192,\n                \"ffn_dim\": 384,\n                \"transformer_blocks\": 4,\n                \"patch_h\": 2,\n                \"patch_w\": 2,\n                \"stride\": 2,\n                \"mv_expand_ratio\": mv2_exp_mult,\n                \"head_dim\": head_dim,\n                \"num_heads\": num_heads,\n                \"block_type\": \"mobilevit\",\n            },\n            \"layer5\": {  # 7x7\n                \"out_channels\": 160,\n                \"transformer_channels\": 240,\n                \"ffn_dim\": 480,\n                \"transformer_blocks\": 3,\n                \"patch_h\": 2,\n                \"patch_w\": 2,\n                \"stride\": 2,\n                \"mv_expand_ratio\": mv2_exp_mult,\n                \"head_dim\": head_dim,\n                \"num_heads\": num_heads,\n                \"block_type\": \"mobilevit\",\n            },\n            \"last_layer_exp_factor\": 4,\n        }\n    else:\n        raise NotImplementedError\n\n    return config\n"
  },
  {
    "path": "corenet/modeling/models/classification/config/mobilevit_v2.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom typing import Dict\n\nfrom corenet.utils.math_utils import bound_fn, make_divisible\n\n\ndef get_configuration(opts) -> Dict:\n\n    width_multiplier = getattr(opts, \"model.classification.mitv2.width_multiplier\", 1.0)\n\n    ffn_multiplier = (\n        2  # bound_fn(min_val=2.0, max_val=4.0, value=2.0 * width_multiplier)\n    )\n    mv2_exp_mult = 2  # max(1.0, min(2.0, 2.0 * width_multiplier))\n\n    layer_0_dim = bound_fn(min_val=16, max_val=64, value=32 * width_multiplier)\n    layer_0_dim = int(make_divisible(layer_0_dim, divisor=8, min_value=16))\n    config = {\n        \"layer0\": {\n            \"img_channels\": 3,\n            \"out_channels\": layer_0_dim,\n        },\n        \"layer1\": {\n            \"out_channels\": int(make_divisible(64 * width_multiplier, divisor=16)),\n            \"expand_ratio\": mv2_exp_mult,\n            \"num_blocks\": 1,\n            \"stride\": 1,\n            \"block_type\": \"mv2\",\n        },\n        \"layer2\": {\n            \"out_channels\": int(make_divisible(128 * width_multiplier, divisor=8)),\n            \"expand_ratio\": mv2_exp_mult,\n            \"num_blocks\": 2,\n            \"stride\": 2,\n            \"block_type\": \"mv2\",\n        },\n        \"layer3\": {  # 28x28\n            \"out_channels\": int(make_divisible(256 * width_multiplier, divisor=8)),\n            \"attn_unit_dim\": int(make_divisible(128 * width_multiplier, divisor=8)),\n            \"ffn_multiplier\": ffn_multiplier,\n            \"attn_blocks\": 2,\n            \"patch_h\": 2,\n            \"patch_w\": 2,\n            \"stride\": 2,\n            \"mv_expand_ratio\": mv2_exp_mult,\n            \"block_type\": \"mobilevit\",\n        },\n        \"layer4\": {  # 14x14\n            \"out_channels\": int(make_divisible(384 * width_multiplier, divisor=8)),\n            \"attn_unit_dim\": int(make_divisible(192 * width_multiplier, divisor=8)),\n            \"ffn_multiplier\": ffn_multiplier,\n            \"attn_blocks\": 4,\n            \"patch_h\": 2,\n            \"patch_w\": 2,\n            \"stride\": 2,\n            \"mv_expand_ratio\": mv2_exp_mult,\n            \"block_type\": \"mobilevit\",\n        },\n        \"layer5\": {  # 7x7\n            \"out_channels\": int(make_divisible(512 * width_multiplier, divisor=8)),\n            \"attn_unit_dim\": int(make_divisible(256 * width_multiplier, divisor=8)),\n            \"ffn_multiplier\": ffn_multiplier,\n            \"attn_blocks\": 3,\n            \"patch_h\": 2,\n            \"patch_w\": 2,\n            \"stride\": 2,\n            \"mv_expand_ratio\": mv2_exp_mult,\n            \"block_type\": \"mobilevit\",\n        },\n        \"last_layer_exp_factor\": 4,\n    }\n\n    return config\n"
  },
  {
    "path": "corenet/modeling/models/classification/config/regnet.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nfrom dataclasses import dataclass\nfrom typing import Dict, List, Tuple, Union\n\nimport numpy as np\n\nfrom corenet.utils import logger\nfrom corenet.utils.math_utils import make_divisible\n\nsupported_modes = [\n    \"x_200mf\",\n    \"x_400mf\",\n    \"x_600mf\",\n    \"x_800mf\",\n    \"x_1.6gf\",\n    \"x_3.2gf\",\n    \"x_4.0gf\",\n    \"x_6.4gf\",\n    \"x_8.0gf\",\n    \"x_12gf\",\n    \"x_16gf\",\n    \"x_32gf\",\n    \"y_200mf\",\n    \"y_400mf\",\n    \"y_800mf\",\n    \"y_600mf\",\n    \"y_1.6gf\",\n    \"y_3.2gf\",\n    \"y_4.0gf\",\n    \"y_6.4gf\",\n    \"y_8.0gf\",\n    \"y_12gf\",\n    \"y_16gf\",\n    \"y_32gf\",\n]\n\n\n@dataclass\nclass BlockParamsConfig:\n    \"\"\"\n    This class stores the quantized linear block params. It is adapted from torchvision.models.regnet:\n        https://github.com/pytorch/vision/blob/c06d52b1c5f6aee36802661c3ebc6347b97cc59e/torchvision/models/regnet.py#L203\n\n    Args:\n        depth: The total number of XBlocks in the network\n        w_0: Initial width\n        w_a: Width slope\n        w_m: Width slope in the log space\n        groups: The number of groups to use in the XBlock. Referred to\n        se_ratio: The squeeze-excitation ratio. The number of channels in the SE module will be the\n            input channels scaled by this ratio.\n        bottleneck_multiplier: The number of output channels in the intermediate conv layers in bottleneck/Xblock\n            block will be scaled by this value.\n        quant: Block widths will be divisible by this value\n        stride: The stride of the 3x3 conv of the XBlocks\n    \"\"\"\n\n    def __init__(\n        self,\n        depth: int,\n        w_0: int,\n        w_a: float,\n        w_m: float,\n        groups: int,\n        se_ratio: float = 0.0,\n        bottleneck_multiplier: float = 1.0,\n        quant: int = 8,\n        stride: int = 2,\n    ) -> None:\n        if w_a < 0 or w_0 <= 0 or w_m <= 1 or w_0 % 8 != 0:\n            raise ValueError(\n                f\"Invalid RegNet settings. Need\"\n                f\" w_a >= 0, given w_a={w_a};\"\n                f\" w_m > 1, given w_m={w_m};\"\n                f\" w_0 > 0 and w_0 % 8 == 0, given w_0={w_0}.\"\n            )\n\n        # Continuous widths for each block. Each stage has a unique block width\n        block_widths_cont = np.arange(depth) * w_a + w_0  # u_j in eq. (2) of paper\n        block_capacity = np.round(\n            np.log(block_widths_cont / w_0) / np.log(w_m)\n        )  # s_j in eq. (3) of paper\n\n        # Quantized block widths\n        block_widths_quant = (\n            (np.round(np.divide(w_0 * np.power(w_m, block_capacity), quant)) * quant)\n            .astype(int)\n            .tolist()\n        )\n        num_stages = len(set(block_widths_quant))\n\n        # Convert to per stage parameters\n        split_helper = zip(\n            block_widths_quant + [0],\n            [0] + block_widths_quant,\n            block_widths_quant + [0],\n            [0] + block_widths_quant,\n        )\n        splits = [w != wp or r != rp for w, wp, r, rp in split_helper]\n\n        stage_widths = [w for w, t in zip(block_widths_quant, splits[:-1]) if t]\n        stage_depths = (\n            np.diff([d for d, t in enumerate(splits) if t]).astype(int).tolist()\n        )\n\n        strides = [stride] * num_stages\n        bottleneck_multipliers = [bottleneck_multiplier] * num_stages\n        stage_groups = [groups] * num_stages\n\n        # Adjust the compatibility of stage widths and group widths\n        stage_widths, stage_groups = self._make_widths_compatible(\n            stage_widths, stage_groups, bottleneck_multipliers\n        )\n\n        self.depths = stage_depths\n        self.widths = stage_widths\n        self.stage_groups = stage_groups\n        self.bottleneck_multipliers = bottleneck_multipliers\n        self.strides = strides\n        self.se_ratio = se_ratio\n\n    def _make_widths_compatible(\n        self,\n        stage_widths: List[int],\n        stage_groups: List[int],\n        bottleneck_multipliers: List[float],\n    ) -> Tuple[List[int], List[int]]:\n        \"\"\"\n        Scales widths by bottleneck multipliers and adjusts them to be compatible with\n        the specified groups.\n        \"\"\"\n        # Scale widths according to bottleneck multipliers\n        widths = [\n            int(width * multiplier)\n            for width, multiplier in zip(stage_widths, bottleneck_multipliers)\n        ]\n        group_widths_min = [\n            min(groups, width) for groups, width in zip(stage_groups, widths)\n        ]\n\n        # Ensure the widths are divisible by groups\n        bottleneck_widths = [\n            make_divisible(width, groups)\n            for width, groups in zip(widths, group_widths_min)\n        ]\n\n        # Undo scaling\n        stage_widths = [\n            int(width / multiplier)\n            for width, multiplier in zip(bottleneck_widths, bottleneck_multipliers)\n        ]\n\n        return stage_widths, group_widths_min\n\n    def extra_repr(self) -> str:\n        extra_repr_str = \"\"\n        extra_repr_str += f\"\\n\\tdepths={self.depths}\"\n        extra_repr_str += f\"\\n\\twidths={self.widths}\"\n        extra_repr_str += f\"\\n\\tstrides={self.strides}\"\n        extra_repr_str += f\"\\n\\tstage_groups={self.stage_groups}\"\n        extra_repr_str += f\"\\n\\tbottleneck_multipliers={self.bottleneck_multipliers}\"\n        extra_repr_str += f\"\\n\\tse_ratio={self.se_ratio}\"\n\n        return extra_repr_str\n\n    def __repr__(self) -> str:\n        return \"{}({}\\n)\".format(self.__class__.__name__, self.extra_repr())\n\n\ndef get_configuration(\n    opts: argparse.Namespace,\n) -> Dict[str, Dict[str, Union[int, float]]]:\n    \"\"\"Gets the RegNet model configuration for the specified RegNet mode.\n\n    Args:\n        opts: command-line arguments\n\n    Returns:\n        * A dictionary containing the configuration for each layer. Each key is of the form\n            layer<i> and the corresponding value is another dictionary with the following keys:\n                depth: The depth of the stage at layer<i>\n                width: The width of the blocks at this stage\n                groups: The convolution groups of each block at this stage\n                stride: The stride of the convolutions in each block at this stage\n                bottleneck_multiplier: The multiplier for the bottleneck conv in each of this stage's blocks\n                se_ratio: The squeeze-excitation ratio for each block in this stage\n    \"\"\"\n    network_mode = getattr(opts, \"model.classification.regnet.mode\")\n\n    if network_mode is None:\n        logger.error(\n            \"RegNet mode can't be none. Please specify --model.classification.regnet.mode\"\n        )\n\n    network_config = dict()\n\n    block_params_config = {\n        \"x_200mf\": BlockParamsConfig(13, 24, 36.44, 2.49, 8),\n        \"x_400mf\": BlockParamsConfig(22, 24, 24.48, 2.54, 16),\n        \"x_600mf\": BlockParamsConfig(16, 48, 36.97, 2.24, 24),\n        \"x_800mf\": BlockParamsConfig(16, 56, 35.73, 2.28, 16),\n        \"x_1.6gf\": BlockParamsConfig(18, 80, 34.01, 2.25, 24),\n        \"x_3.2gf\": BlockParamsConfig(25, 88, 26.31, 2.25, 48),\n        \"x_4.0gf\": BlockParamsConfig(23, 96, 38.65, 2.43, 40),\n        \"x_6.4gf\": BlockParamsConfig(17, 184, 60.83, 2.07, 56),\n        \"x_8.0gf\": BlockParamsConfig(23, 80, 49.56, 2.88, 120),\n        \"x_12gf\": BlockParamsConfig(19, 168, 73.36, 2.37, 112),\n        \"x_16gf\": BlockParamsConfig(22, 216, 55.59, 2.1, 128),\n        \"x_32gf\": BlockParamsConfig(23, 320, 69.86, 2.0, 168),\n        \"y_200mf\": BlockParamsConfig(13, 24, 36.44, 2.49, 8, se_ratio=0.25),\n        \"y_400mf\": BlockParamsConfig(16, 48, 27.89, 2.09, 8, se_ratio=0.25),\n        \"y_600mf\": BlockParamsConfig(15, 48, 32.54, 2.32, 16, se_ratio=0.25),\n        \"y_800mf\": BlockParamsConfig(14, 56, 38.84, 2.4, 16, se_ratio=0.25),\n        \"y_1.6gf\": BlockParamsConfig(27, 48, 20.71, 2.65, 24, se_ratio=0.25),\n        \"y_3.2gf\": BlockParamsConfig(21, 80, 42.63, 2.66, 24, se_ratio=0.25),\n        \"y_4.0gf\": BlockParamsConfig(22, 96, 31.41, 2.24, 64, se_ratio=0.25),\n        \"y_6.4gf\": BlockParamsConfig(25, 112, 33.22, 2.27, 72, se_ratio=0.25),\n        \"y_8.0gf\": BlockParamsConfig(17, 192, 76.82, 2.19, 56, se_ratio=0.25),\n        \"y_12gf\": BlockParamsConfig(19, 168, 73.36, 2.37, 112, se_ratio=0.25),\n        \"y_16gf\": BlockParamsConfig(18, 200, 106.23, 2.48, 112, se_ratio=0.25),\n        \"y_32gf\": BlockParamsConfig(20, 232, 115.89, 2.53, 232, se_ratio=0.25),\n    }\n\n    if network_mode in block_params_config:\n        regnet_block_params_cfg = block_params_config[network_mode]\n\n        stage_depths = regnet_block_params_cfg.depths\n        stage_widths = regnet_block_params_cfg.widths\n        stage_groups = regnet_block_params_cfg.stage_groups\n        bottleneck_multipliers = regnet_block_params_cfg.bottleneck_multipliers\n        strides = regnet_block_params_cfg.strides\n        se_ratio = regnet_block_params_cfg.se_ratio\n\n        for i, layer_name in enumerate([f\"layer{i}\" for i in range(1, 5)]):\n            network_config[layer_name] = {\n                \"depth\": stage_depths[i],\n                \"width\": stage_widths[i],\n                \"groups\": stage_groups[i],\n                \"stride\": strides[i],\n                \"bottleneck_multiplier\": bottleneck_multipliers[i],\n                \"se_ratio\": se_ratio,\n            }\n    else:\n        logger.error(\n            f\"Current supported modes for RegNet are {', '.join(supported_modes)}. Got: {network_mode}\"\n        )\n\n    return network_config\n"
  },
  {
    "path": "corenet/modeling/models/classification/config/resnet.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom typing import Dict, List\n\nfrom corenet.utils import logger\n\n\ndef add_squeeze_channels(\n    config_dict: Dict, per_layer_squeeze_channels: List[int]\n) -> None:\n    \"\"\"Given the config_dict for the specified ResNet model, for each layer, adds a new key\n    ('squeeze_channels') with the corresponding channels for the squeeze-excitation module.\n\n    Args:\n        config_dict: The dict constructed by the get_configuration function.\n        per_layer_squeeze_channels: A list of length 4 where the ith element specifies\n            the number of channels for squeeze-excitation module of layer i.\n    \"\"\"\n    for layer, squeeze_channels in zip(range(2, 6), per_layer_squeeze_channels):\n        config_dict[f\"layer{layer}\"][\"squeeze_channels\"] = squeeze_channels\n\n\ndef get_configuration(opts) -> Dict:\n    depth = getattr(opts, \"model.classification.resnet.depth\")\n\n    # Whether to build an SE-ResNet model (https://arxiv.org/abs/1709.01507)\n    se_resnet = getattr(opts, \"model.classification.resnet.se_resnet\")\n\n    resnet_config = dict()\n\n    if depth == 18:\n        resnet_config[\"layer2\"] = {\n            \"num_blocks\": 2,\n            \"mid_channels\": 64,\n            \"block_type\": \"basic\",\n            \"stride\": 1,\n        }\n        resnet_config[\"layer3\"] = {\n            \"num_blocks\": 2,\n            \"mid_channels\": 128,\n            \"block_type\": \"basic\",\n            \"stride\": 2,\n        }\n        resnet_config[\"layer4\"] = {\n            \"num_blocks\": 2,\n            \"mid_channels\": 256,\n            \"block_type\": \"basic\",\n            \"stride\": 2,\n        }\n        resnet_config[\"layer5\"] = {\n            \"num_blocks\": 2,\n            \"mid_channels\": 512,\n            \"block_type\": \"basic\",\n            \"stride\": 2,\n        }\n        se_resnet_channels = [8, 8, 16, 32]\n    elif depth == 34:\n        resnet_config[\"layer2\"] = {\n            \"num_blocks\": 3,\n            \"mid_channels\": 64,\n            \"block_type\": \"basic\",\n            \"stride\": 1,\n        }\n        resnet_config[\"layer3\"] = {\n            \"num_blocks\": 4,\n            \"mid_channels\": 128,\n            \"block_type\": \"basic\",\n            \"stride\": 2,\n        }\n        resnet_config[\"layer4\"] = {\n            \"num_blocks\": 6,\n            \"mid_channels\": 256,\n            \"block_type\": \"basic\",\n            \"stride\": 2,\n        }\n        resnet_config[\"layer5\"] = {\n            \"num_blocks\": 3,\n            \"mid_channels\": 512,\n            \"block_type\": \"basic\",\n            \"stride\": 2,\n        }\n        se_resnet_channels = [8, 8, 16, 32]\n    elif depth == 50:\n        resnet_config[\"layer2\"] = {\n            \"num_blocks\": 3,\n            \"mid_channels\": 64,\n            \"block_type\": \"bottleneck\",\n            \"stride\": 1,\n        }\n        resnet_config[\"layer3\"] = {\n            \"num_blocks\": 4,\n            \"mid_channels\": 128,\n            \"block_type\": \"bottleneck\",\n            \"stride\": 2,\n        }\n        resnet_config[\"layer4\"] = {\n            \"num_blocks\": 6,\n            \"mid_channels\": 256,\n            \"block_type\": \"bottleneck\",\n            \"stride\": 2,\n        }\n        resnet_config[\"layer5\"] = {\n            \"num_blocks\": 3,\n            \"mid_channels\": 512,\n            \"block_type\": \"bottleneck\",\n            \"stride\": 2,\n        }\n        se_resnet_channels = [16, 32, 64, 128]\n    elif depth == 101:\n        resnet_config[\"layer2\"] = {\n            \"num_blocks\": 3,\n            \"mid_channels\": 64,\n            \"block_type\": \"bottleneck\",\n            \"stride\": 1,\n        }\n        resnet_config[\"layer3\"] = {\n            \"num_blocks\": 4,\n            \"mid_channels\": 128,\n            \"block_type\": \"bottleneck\",\n            \"stride\": 2,\n        }\n        resnet_config[\"layer4\"] = {\n            \"num_blocks\": 23,\n            \"mid_channels\": 256,\n            \"block_type\": \"bottleneck\",\n            \"stride\": 2,\n        }\n        resnet_config[\"layer5\"] = {\n            \"num_blocks\": 3,\n            \"mid_channels\": 512,\n            \"block_type\": \"bottleneck\",\n            \"stride\": 2,\n        }\n        se_resnet_channels = [16, 32, 64, 128]\n    else:\n        logger.error(\n            \"ResNet (or SE-ResNet) models are supported with depths of 18, 34, 50 and 101. Please specify depth using \"\n            \"--model.classification.resnet.depth flag. Got: {}\".format(depth)\n        )\n\n    if se_resnet:\n        add_squeeze_channels(resnet_config, se_resnet_channels)\n\n    return resnet_config\n"
  },
  {
    "path": "corenet/modeling/models/classification/config/swin_transformer.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom typing import Dict\n\nfrom corenet.utils import logger\n\n\ndef get_configuration(opts) -> Dict:\n    mode = getattr(opts, \"model.classification.swin.mode\", \"tiny\")\n    if mode is None:\n        logger.error(\"Please specify mode\")\n\n    stochastic_depth_prob = getattr(\n        opts, \"model.classification.swin.stochastic_depth_prob\", None\n    )\n\n    if stochastic_depth_prob is None:\n        default_stochastic_depth_prob = {\"tiny\": 0.2, \"small\": 0.3, \"base\": 0.5}\n        stochastic_depth_prob = default_stochastic_depth_prob[mode]\n\n    mode = mode.lower()\n    if mode == \"tiny\":\n        config = {\n            \"patch_size\": (4, 4),\n            \"embed_dim\": 96,\n            \"depths\": [2, 2, 6, 2],\n            \"num_heads\": [3, 6, 12, 24],\n            \"window_size\": [7, 7],\n            \"stochastic_depth_prob\": stochastic_depth_prob,  # 0.2\n            \"mlp_ratio\": 4.0,\n            \"dropout\": 0.0,\n            \"attn_dropout\": 0.0,\n            \"ffn_dropout\": 0.0,\n            \"norm_layer\": \"layer_norm\",\n        }\n    elif mode == \"small\":\n        config = {\n            \"patch_size\": (4, 4),\n            \"embed_dim\": 96,\n            \"depths\": [2, 2, 18, 2],\n            \"num_heads\": [3, 6, 12, 24],\n            \"window_size\": [7, 7],\n            \"stochastic_depth_prob\": stochastic_depth_prob,  # 0.3\n            \"mlp_ratio\": 4.0,\n            \"dropout\": 0.0,\n            \"attn_dropout\": 0.0,\n            \"ffn_dropout\": 0.0,\n            \"norm_layer\": \"layer_norm\",\n        }\n    elif mode == \"base\":\n        config = {\n            \"patch_size\": (4, 4),\n            \"embed_dim\": 128,\n            \"depths\": [2, 2, 18, 2],\n            \"num_heads\": [4, 8, 16, 32],\n            \"window_size\": [7, 7],\n            \"stochastic_depth_prob\": stochastic_depth_prob,  # 0.5\n            \"mlp_ratio\": 4.0,\n            \"dropout\": 0.0,\n            \"attn_dropout\": 0.0,\n            \"ffn_dropout\": 0.0,\n            \"norm_layer\": \"layer_norm\",\n        }\n    else:\n        raise NotImplementedError\n\n    return config\n"
  },
  {
    "path": "corenet/modeling/models/classification/config/vit.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nfrom typing import Dict\n\nfrom corenet.utils import logger\n\n\ndef get_configuration(opts: argparse.Namespace) -> Dict:\n    \"\"\"\n    Gets the ViT model configuration.\n\n    The 'tiny' and 'small' model configurations were used in the\n    `\"Training data-efficient image transformers & distillation through attention\" <https://arxiv.org/abs/2012.12877>`_ paper.\n\n    The 'base', 'large', and 'huge' variants were used in the\n    `\"An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale\" <https://arxiv.org/abs/2010.11929>`_ paper.\n\n    Args:\n        opts: Command line options.\n\n    Returns:\n        vit_config: The ViT model configuration dict.\n    \"\"\"\n    mode = getattr(opts, \"model.classification.vit.mode\", \"tiny\")\n    if not mode:\n        logger.error(\"Please specify mode\")\n\n    mode = mode.lower()\n    dropout = getattr(opts, \"model.classification.vit.dropout\", 0.0)\n    norm_layer = getattr(opts, \"model.classification.vit.norm_layer\", \"layer_norm\")\n\n    vit_config = dict()\n    if mode == \"test\":\n        vit_config = {\n            \"embed_dim\": 128,\n            \"n_transformer_layers\": 1,\n            \"n_attn_heads\": 2,\n            \"ffn_dim\": 128,\n            \"norm_layer\": norm_layer,\n            \"pos_emb_drop_p\": 0.1,\n            \"attn_dropout\": 0.0,\n            \"ffn_dropout\": 0.0,\n            \"dropout\": dropout,\n        }\n    elif mode == \"tiny\":\n        vit_config = {\n            \"embed_dim\": 192,\n            \"n_transformer_layers\": 12,\n            \"n_attn_heads\": 3,\n            \"ffn_dim\": 192 * 4,\n            \"norm_layer\": norm_layer,\n            \"pos_emb_drop_p\": 0.1,\n            \"attn_dropout\": 0.0,\n            \"ffn_dropout\": 0.0,\n            \"dropout\": dropout,\n        }\n    elif mode == \"small\":\n        vit_config = {\n            \"embed_dim\": 384,\n            \"n_transformer_layers\": 12,\n            \"n_attn_heads\": 6,\n            \"ffn_dim\": 384 * 4,\n            \"norm_layer\": norm_layer,\n            \"pos_emb_drop_p\": 0.0,\n            \"attn_dropout\": 0.0,\n            \"ffn_dropout\": 0.0,\n            \"dropout\": dropout,\n        }\n    elif mode == \"base\":\n        vit_config = {\n            \"embed_dim\": 768,\n            \"n_transformer_layers\": 12,\n            \"n_attn_heads\": 12,\n            \"ffn_dim\": 768 * 4,\n            \"norm_layer\": norm_layer,\n            \"pos_emb_drop_p\": 0.0,\n            \"attn_dropout\": 0.0,\n            \"ffn_dropout\": 0.0,\n            \"dropout\": dropout,\n        }\n    elif mode == \"large\":\n        vit_config = {\n            \"embed_dim\": 1024,\n            \"n_transformer_layers\": 24,\n            \"n_attn_heads\": 16,\n            \"ffn_dim\": 1024 * 4,\n            \"norm_layer\": norm_layer,\n            \"pos_emb_drop_p\": 0.0,\n            \"attn_dropout\": 0.0,\n            \"ffn_dropout\": 0.0,\n            \"dropout\": dropout,\n        }\n    elif mode == \"huge\":\n        vit_config = {\n            \"embed_dim\": 1280,\n            \"n_transformer_layers\": 32,\n            \"n_attn_heads\": 20,  # each head dimension is 64\n            \"ffn_dim\": 1280 * 4,\n            \"norm_layer\": norm_layer,\n            \"pos_emb_drop_p\": 0.0,\n            \"attn_dropout\": 0.0,\n            \"ffn_dropout\": 0.0,\n            \"dropout\": dropout,\n        }\n    else:\n        logger.error(\"Got unsupported ViT configuration: {}\".format(mode))\n    return vit_config\n"
  },
  {
    "path": "corenet/modeling/models/classification/efficientnet.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nfrom typing import Any, Callable, Optional, Tuple\n\nimport torch\nfrom torch import nn\n\nfrom corenet.modeling.layers import ConvLayer2d, Dropout, GlobalPool, LinearLayer\nfrom corenet.modeling.models import MODEL_REGISTRY\nfrom corenet.modeling.models.classification.base_image_encoder import BaseImageEncoder\nfrom corenet.modeling.models.classification.config.efficientnet import (\n    EfficientNetBlockConfig,\n    get_configuration,\n)\nfrom corenet.modeling.modules import EfficientNetBlock\n\n\n@MODEL_REGISTRY.register(name=\"efficientnet\", type=\"classification\")\nclass EfficientNet(BaseImageEncoder):\n    \"\"\"\n    This class defines the `EfficientNet architecture <https://arxiv.org/abs/1905.11946>`_\n    \"\"\"\n\n    def __init__(\n        self,\n        opts,\n        *args,\n        **kwargs: Any,\n    ) -> None:\n        super().__init__(opts, *args, **kwargs)\n\n        classifier_dropout = getattr(opts, \"model.classification.classifier_dropout\")\n\n        network_config = get_configuration(opts)\n        last_channels = network_config[\"last_channels\"]\n        total_layers = network_config[\"total_layers\"]\n        stochastic_depth_prob = getattr(\n            opts, \"model.classification.efficientnet.stochastic_depth_prob\", 0.2\n        )\n\n        # building first layer\n        image_channels = 3\n        in_channels = network_config[\"layer_1\"][0].in_channels\n        self.conv_1 = ConvLayer2d(\n            opts=opts,\n            in_channels=image_channels,\n            out_channels=in_channels,\n            kernel_size=3,\n            stride=2,\n            use_norm=True,\n            use_act=True,\n        )\n\n        self.model_conf_dict[\"conv1\"] = {\"in\": image_channels, \"out\": in_channels}\n\n        # building inverted residual blocks\n        prev_layers_cnt = 0  # counts the number of layers added so far\n        for layer_name in [\"layer_1\", \"layer_2\", \"layer_3\", \"layer_4\", \"layer_5\"]:\n            dilation = False\n            if layer_name == \"layer_4\":\n                dilation = self.dilate_l4\n            elif layer_name == \"layer_5\":\n                dilation = self.dilate_l5\n            layer, prev_layers_cnt = self._make_layer(\n                opts=opts,\n                block_config=network_config[layer_name],\n                stochastic_depth_prob=stochastic_depth_prob,\n                prev_layers_cnt=prev_layers_cnt,\n                total_layers=total_layers,\n                dilate=dilation,\n            )\n\n            setattr(self, layer_name, layer)\n            # we have saved mappings without underscore in layer_name, so removing it\n            self.model_conf_dict[layer_name.replace(\"_\", \"\")] = {\n                \"in\": network_config[layer_name][0].in_channels,\n                \"out\": network_config[layer_name][-1].out_channels,\n            }\n\n        # building last several layers\n        in_channels = network_config[\"layer_5\"][-1].out_channels\n        out_channels = last_channels\n        self.conv_1x1_exp = ConvLayer2d(\n            opts=opts,\n            in_channels=in_channels,\n            out_channels=out_channels,\n            kernel_size=1,\n            use_act=True,\n            use_norm=True,\n        )\n\n        self.model_conf_dict[\"exp_before_cls\"] = {\n            \"in\": in_channels,\n            \"out\": out_channels,\n        }\n        pool_type = getattr(opts, \"model.layer.global_pool\", \"mean\")\n\n        self.classifier = nn.Sequential()\n        self.classifier.add_module(\n            name=\"global_pool\", module=GlobalPool(pool_type=pool_type, keep_dim=False)\n        )\n        if 0.0 < classifier_dropout < 1.0:\n            self.classifier.add_module(\n                name=\"classifier_dropout\",\n                module=Dropout(p=classifier_dropout, inplace=True),\n            )\n        self.classifier.add_module(\n            name=\"classifier_fc\",\n            module=LinearLayer(\n                in_features=out_channels, out_features=self.n_classes, bias=True\n            ),\n        )\n\n    def _make_layer(\n        self,\n        opts,\n        block_config,\n        stochastic_depth_prob: float,\n        prev_layers_cnt: int,  # number of layers before calling this function\n        total_layers: int,  # Total number of layers in the network\n        dilate: Optional[bool] = False,\n        *args,\n        **kwargs,\n    ) -> Tuple[nn.Module, int]:\n        # This is to accommodate segmentation architectures modifying strides of the backbone network.\n        prev_dilation = self.dilation\n        # For classification, dilation here should always be 1.\n        block = []\n        count = 0\n\n        for layer_config in block_config:\n            assert isinstance(layer_config, EfficientNetBlockConfig)\n            in_channels = layer_config.in_channels\n            out_channels = layer_config.out_channels\n            for layer_idx in range(layer_config.num_layers):\n                stride = layer_config.stride if layer_idx == 0 else 1\n                if dilate and stride == 2:\n                    self.dilation *= stride\n                    stride = 1\n                    dilate = False\n\n                sd_prob = (\n                    stochastic_depth_prob\n                    * float(prev_layers_cnt + count)\n                    / total_layers\n                )\n                sd_prob = round(sd_prob, 4)\n\n                efficient_net_layer = EfficientNetBlock(\n                    stochastic_depth_prob=sd_prob,\n                    opts=opts,\n                    in_channels=in_channels,\n                    out_channels=out_channels,\n                    kernel_size=layer_config.kernel,\n                    stride=stride,\n                    expand_ratio=layer_config.expand_ratio,\n                    dilation=prev_dilation if count == 0 else self.dilation,\n                    use_hs=False,\n                    use_se=True,\n                    use_input_as_se_dim=True,\n                    squeeze_factor=layer_config.expand_ratio * 4,\n                    act_fn_name=\"swish\",\n                    se_scale_fn_name=\"sigmoid\",\n                )\n                block.append(efficient_net_layer)\n                count += 1\n                in_channels = out_channels\n        prev_layers_cnt += count\n        return nn.Sequential(*block), prev_layers_cnt\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        group = parser.add_argument_group(title=cls.__name__)\n        group.add_argument(\n            \"--model.classification.efficientnet.mode\",\n            type=str,\n            choices=[f\"b{i}\" for i in range(8)],\n        )\n        group.add_argument(\n            \"--model.classification.efficientnet.stochastic-depth-prob\",\n            type=float,\n            default=0.0,\n        )\n        return parser\n\n    def get_activation_checkpoint_submodule_class(self) -> Callable:\n        return EfficientNetBlock\n"
  },
  {
    "path": "corenet/modeling/models/classification/fastvit.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\nimport argparse\nimport copy\nfrom typing import List\n\nimport torch.nn as nn\n\nfrom corenet.modeling.layers import GlobalPool, Identity, LinearLayer\nfrom corenet.modeling.models import MODEL_REGISTRY\nfrom corenet.modeling.models.classification.base_image_encoder import BaseImageEncoder\nfrom corenet.modeling.models.classification.config.fastvit import get_configuration\nfrom corenet.modeling.modules.fastvit import (\n    AttentionBlock,\n    PatchEmbed,\n    RepMixerBlock,\n    convolutional_stem,\n)\nfrom corenet.modeling.modules.mobileone_block import MobileOneBlock\nfrom corenet.utils import logger\n\n\ndef basic_blocks(\n    opts: argparse.Namespace,\n    dim: int,\n    block_index: int,\n    num_blocks: List[int],\n    token_mixer_type: str,\n    kernel_size: int = 3,\n    mlp_ratio: float = 4.0,\n    drop_rate: float = 0.0,\n    drop_path_rate: float = 0.0,\n    inference_mode: bool = False,\n    use_layer_scale: bool = True,\n    layer_scale_init_value: float = 1e-5,\n) -> nn.Sequential:\n    \"\"\"Build FastViT blocks within a stage.\n\n    Args:\n        opts: Command line arguments.\n        dim: Number of embedding dimensions.\n        block_index: block index.\n        num_blocks: List containing number of blocks per stage.\n        token_mixer_type: Token mixer type.\n        kernel_size: Kernel size for repmixer.\n        mlp_ratio: MLP expansion ratio.\n        drop_rate: Dropout rate.\n        drop_path_rate: Drop path rate.\n        inference_mode: Flag to instantiate block in inference mode.\n        use_layer_scale: Flag to turn on layer scale regularization.\n        layer_scale_init_value: Layer scale value at initialization.\n\n    Returns:\n        nn.Sequential object of all the blocks within the stage.\n    \"\"\"\n    blocks = []\n    for block_idx in range(num_blocks[block_index]):\n        block_dpr = (\n            drop_path_rate\n            * (block_idx + sum(num_blocks[:block_index]))\n            / (sum(num_blocks) - 1)\n        )\n        if token_mixer_type == \"repmixer\":\n            blocks.append(\n                RepMixerBlock(\n                    opts,\n                    dim,\n                    kernel_size=kernel_size,\n                    mlp_ratio=mlp_ratio,\n                    drop=drop_rate,\n                    drop_path=block_dpr,\n                    inference_mode=inference_mode,\n                    use_layer_scale=use_layer_scale,\n                    layer_scale_init_value=layer_scale_init_value,\n                )\n            )\n        elif token_mixer_type == \"attention\":\n            blocks.append(\n                AttentionBlock(\n                    opts,\n                    dim,\n                    mlp_ratio=mlp_ratio,\n                    drop=drop_rate,\n                    drop_path=block_dpr,\n                    use_layer_scale=use_layer_scale,\n                    layer_scale_init_value=layer_scale_init_value,\n                )\n            )\n        else:\n            raise ValueError(\n                \"Token mixer type: {} not supported\".format(token_mixer_type)\n            )\n\n    blocks = nn.Sequential(*blocks)\n    return blocks\n\n\n@MODEL_REGISTRY.register(name=\"fastvit\", type=\"classification\")\nclass FastViT(BaseImageEncoder):\n    \"\"\"\n    This class implements `FastViT architecture <https://arxiv.org/abs/2303.14189>`_\n    \"\"\"\n\n    def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None:\n        cfg = get_configuration(opts=opts)\n        super().__init__(opts, *args, **kwargs)\n\n        # Warn users if model is instantiated in inference mode.\n        inference_mode = getattr(opts, \"model.classification.fastvit.inference_mode\")\n        if inference_mode:\n            logger.warning(\n                'Model instantiated in \"Inference mode\". '\n                \"This is not a desired mode for training.\"\n            )\n\n        # Get metaformer parameters\n        self.opts = opts\n        image_channels = 3\n        layers = cfg[\"layers\"]\n        pos_embs = cfg[\"pos_embs\"]\n        embed_dims = cfg[\"embed_dims\"]\n        token_mixers = cfg[\"token_mixers\"]\n        mlp_ratios = cfg[\"mlp_ratios\"]\n\n        # Patch embedding configurations\n        downsamples = cfg[\"downsamples\"]\n        down_patch_size = cfg[\"down_patch_size\"]\n        down_stride = cfg[\"down_stride\"]\n\n        # Get regularization parameters\n        drop_rate = getattr(opts, \"model.classification.fastvit.dropout\")\n        drop_path_rate = getattr(opts, \"model.classification.fastvit.drop_path\")\n        use_layer_scale = getattr(opts, \"model.classification.fastvit.use_layer_scale\")\n        layer_scale_init_value = getattr(\n            opts, \"model.classification.fastvit.layer_scale_init_value\"\n        )\n\n        if pos_embs is None:\n            pos_embs = [None] * len(cfg[\"layers\"])\n\n        # convolutional stem\n        self.model_conf_dict = dict()\n        self.conv_1 = convolutional_stem(opts, image_channels, embed_dims[0])\n        self.model_conf_dict[\"conv1\"] = {\"in\": image_channels, \"out\": embed_dims[0]}\n\n        self.layer_1 = Identity()\n        self.model_conf_dict[\"layer1\"] = {\"in\": embed_dims[0], \"out\": embed_dims[0]}\n\n        # Build all stages of the network.\n        network = []\n        for i in range(len(layers)):\n            blocks_per_stage = []\n            # Add position embeddings if requested\n            if pos_embs[i] is not None:\n                blocks_per_stage.append(pos_embs[i](opts, embed_dims[i], embed_dims[i]))\n            stage = basic_blocks(\n                opts,\n                embed_dims[i],\n                i,\n                layers,\n                token_mixer_type=token_mixers[i],\n                kernel_size=cfg[\"repmixer_kernel_size\"],\n                mlp_ratio=mlp_ratios[i],\n                drop_rate=drop_rate,\n                drop_path_rate=drop_path_rate,\n                use_layer_scale=use_layer_scale,\n                layer_scale_init_value=layer_scale_init_value,\n                inference_mode=inference_mode,\n            )\n            blocks_per_stage.append(stage)\n            if i >= len(layers) - 1:\n                network.append(nn.Sequential(*blocks_per_stage))\n                self.model_conf_dict[\"layer{}\".format(i + 2)] = {\n                    \"in\": embed_dims[i],\n                    \"out\": embed_dims[i],\n                }\n                break\n\n            # Downsampling+PatchEmb. between two stages\n            if downsamples[i] or embed_dims[i] != embed_dims[i + 1]:\n                blocks_per_stage.append(\n                    PatchEmbed(\n                        opts=opts,\n                        patch_size=down_patch_size,\n                        stride=down_stride,\n                        in_channels=embed_dims[i],\n                        embed_dim=embed_dims[i + 1],\n                    )\n                )\n\n            network.append(nn.Sequential(*blocks_per_stage))\n            self.model_conf_dict[\"layer{}\".format(i + 2)] = {\n                \"in\": embed_dims[i],\n                \"out\": embed_dims[i + 1],\n            }\n\n        self.layer_2, self.layer_3, self.layer_4, self.layer_5 = network\n\n        # Build 1x1 exp\n        self.conv_1x1_exp = nn.Sequential(\n            *[\n                MobileOneBlock(\n                    opts=opts,\n                    in_channels=embed_dims[-1],\n                    out_channels=int(embed_dims[-1] * cfg[\"cls_ratio\"]),\n                    kernel_size=3,\n                    stride=1,\n                    padding=1,\n                    groups=embed_dims[-1],\n                    inference_mode=inference_mode,\n                    use_se=True,\n                    num_conv_branches=1,\n                )\n            ]\n        )\n        self.model_conf_dict[\"exp_before_cls\"] = {\n            \"in\": embed_dims[-1],\n            \"out\": int(embed_dims[-1] * cfg[\"cls_ratio\"]),\n        }\n\n        # Build classifier\n        pool_type = getattr(opts, \"model.layer.global_pool\")\n        self.classifier = nn.Sequential()\n        self.classifier.add_module(\n            name=\"global_pool\", module=GlobalPool(pool_type=pool_type, keep_dim=False)\n        )\n        self.classifier.add_module(\n            name=\"classifier_fc\",\n            module=LinearLayer(\n                in_features=int(embed_dims[-1] * cfg[\"cls_ratio\"]),\n                out_features=self.n_classes,\n                bias=True,\n            ),\n        )\n        self.model_conf_dict[\"cls\"] = {\n            \"in\": int(embed_dims[-1] * cfg[\"cls_ratio\"]),\n            \"out\": self.n_classes,\n        }\n\n        # check model\n        self.check_model()\n\n        # weight initialization\n        self.reset_parameters(opts=opts)\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        \"\"\"Add model specific arguments\"\"\"\n        group = parser.add_argument_group(title=cls.__name__)\n        group.add_argument(\n            \"--model.classification.fastvit.variant\",\n            type=str,\n            default=\"T8\",\n            help=\"Variant string for FastViT. Default: T8\",\n        )\n        group.add_argument(\n            \"--model.classification.fastvit.inference-mode\",\n            type=bool,\n            default=False,\n            help=\"Flag to instantiate inference mode architecture. Default: False\",\n        )\n        group.add_argument(\n            \"--model.classification.fastvit.dropout\",\n            type=float,\n            default=0.0,\n            help=\"Dropout rate for regularization. Default: 0.0\",\n        )\n        group.add_argument(\n            \"--model.classification.fastvit.drop-path\",\n            type=float,\n            default=0.0,\n            help=\"Drop path rate. Default: 0.0\",\n        )\n        group.add_argument(\n            \"--model.classification.fastvit.use-layer-scale\",\n            type=bool,\n            default=True,\n            help=\"Flag to turn on layer scale regularization. Default: True\",\n        )\n        group.add_argument(\n            \"--model.classification.fastvit.layer-scale-init-value\",\n            type=float,\n            default=1e-5,\n            help=\"Drop path rate. Default: 1e-5\",\n        )\n        return parser\n\n    def get_exportable_model(self) -> nn.Module:\n        \"\"\"\n        Method returns a reparameterized model for faster inference.\n\n        Returns:\n            Reparametrized FastViT model for faster inference.\n        \"\"\"\n        # Avoid editing original graph\n        model = copy.deepcopy(self)\n        for module in model.modules():\n            if hasattr(module, \"reparameterize\"):\n                module.reparameterize()\n        return model\n"
  },
  {
    "path": "corenet/modeling/models/classification/mobilenetv1.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nfrom typing import Dict, List, Optional, Tuple, Union\n\nfrom torch import nn\n\nfrom corenet.modeling.layers import (\n    ConvLayer2d,\n    Dropout,\n    GlobalPool,\n    Identity,\n    LinearLayer,\n    SeparableConv2d,\n)\nfrom corenet.modeling.models import MODEL_REGISTRY\nfrom corenet.modeling.models.classification.base_image_encoder import BaseImageEncoder\nfrom corenet.modeling.models.classification.config.mobilenetv1 import get_configuration\nfrom corenet.utils.math_utils import bound_fn\n\n\n@MODEL_REGISTRY.register(name=\"mobilenetv1\", type=\"classification\")\nclass MobileNetv1(BaseImageEncoder):\n    \"\"\"\n    This class defines the `MobileNet architecture <https://arxiv.org/abs/1704.04861>`_\n    \"\"\"\n\n    def __init__(self, opts, *args, **kwargs) -> None:\n\n        image_channels = 3\n        classifier_dropout = getattr(\n            opts, \"model.classification.classifier_dropout\", 0.0\n        )\n        if classifier_dropout == 0.0:\n            width_mult = getattr(\n                opts, \"model.classification.mobilenetv1.width_multiplier\", 1.0\n            )\n            val = round(0.1 * width_mult, 3)\n            classifier_dropout = bound_fn(min_val=0.0, max_val=0.1, value=val)\n\n        super().__init__(opts, *args, **kwargs)\n\n        cfg = get_configuration(opts=opts)\n\n        self.model_conf_dict = dict()\n        input_channels = cfg[\"conv1_out\"]\n        self.conv_1 = ConvLayer2d(\n            opts=opts,\n            in_channels=image_channels,\n            out_channels=input_channels,\n            kernel_size=3,\n            stride=2,\n            use_norm=True,\n            use_act=True,\n        )\n        self.model_conf_dict[\"conv1\"] = {\"in\": image_channels, \"out\": input_channels}\n\n        self.layer_1, out_channels = self._make_layer(\n            opts=opts, mv1_config=cfg[\"layer1\"], input_channel=input_channels\n        )\n        self.model_conf_dict[\"layer1\"] = {\"in\": input_channels, \"out\": out_channels}\n        input_channels = out_channels\n\n        self.layer_2, out_channels = self._make_layer(\n            opts=opts, mv1_config=cfg[\"layer2\"], input_channel=input_channels\n        )\n        self.model_conf_dict[\"layer2\"] = {\"in\": input_channels, \"out\": out_channels}\n        input_channels = out_channels\n\n        self.layer_3, out_channels = self._make_layer(\n            opts=opts, mv1_config=cfg[\"layer3\"], input_channel=input_channels\n        )\n        self.model_conf_dict[\"layer3\"] = {\"in\": input_channels, \"out\": out_channels}\n        input_channels = out_channels\n\n        self.layer_4, out_channels = self._make_layer(\n            opts=opts,\n            mv1_config=cfg[\"layer4\"],\n            input_channel=input_channels,\n            dilate=self.dilate_l4,\n        )\n\n        self.model_conf_dict[\"layer4\"] = {\"in\": input_channels, \"out\": out_channels}\n        input_channels = out_channels\n\n        self.layer_5, out_channels = self._make_layer(\n            opts=opts,\n            mv1_config=cfg[\"layer5\"],\n            input_channel=input_channels,\n            dilate=self.dilate_l5,\n        )\n        self.model_conf_dict[\"layer5\"] = {\"in\": input_channels, \"out\": out_channels}\n        input_channels = out_channels\n\n        self.conv_1x1_exp = Identity()\n        self.model_conf_dict[\"exp_before_cls\"] = {\n            \"in\": input_channels,\n            \"out\": input_channels,\n        }\n\n        pool_type = getattr(opts, \"model.layer.global_pool\", \"mean\")\n\n        self.classifier = nn.Sequential()\n        self.classifier.add_module(\n            name=\"global_pool\", module=GlobalPool(pool_type=pool_type, keep_dim=False)\n        )\n        if 0.0 < classifier_dropout < 1.0:\n            self.classifier.add_module(\n                name=\"classifier_dropout\", module=Dropout(p=classifier_dropout)\n            )\n        self.classifier.add_module(\n            name=\"classifier_fc\",\n            module=LinearLayer(\n                in_features=input_channels, out_features=self.n_classes, bias=True\n            ),\n        )\n\n        self.model_conf_dict[\"cls\"] = {\"in\": input_channels, \"out\": self.n_classes}\n\n        # check model\n        self.check_model()\n\n        # weight initialization\n        self.reset_parameters(opts=opts)\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        \"\"\"Add model specific arguments\"\"\"\n        group = parser.add_argument_group(title=cls.__name__)\n        group.add_argument(\n            \"--model.classification.mobilenetv1.width-multiplier\",\n            type=float,\n            default=1.0,\n            help=\"Width multiplier for MobileNetv1. Default: 1.0\",\n        )\n\n        return parser\n\n    def _make_layer(\n        self,\n        opts,\n        mv1_config: Union[Dict, List],\n        input_channel: int,\n        dilate: Optional[bool] = False,\n        *args,\n        **kwargs\n    ) -> Tuple[nn.Module, int]:\n        prev_dilation = self.dilation\n        mv1_block = []\n\n        out_channels = mv1_config.get(\"out_channels\")\n        stride = mv1_config.get(\"stride\", 1)\n        n_repeat = mv1_config.get(\"repeat\", 0)\n\n        if stride == 2:\n            if dilate:\n                self.dilation *= stride\n                stride = 1\n\n            mv1_block.append(\n                SeparableConv2d(\n                    opts=opts,\n                    in_channels=input_channel,\n                    out_channels=out_channels,\n                    kernel_size=3,\n                    stride=stride,\n                    use_norm=True,\n                    use_act=True,\n                    dilation=prev_dilation,\n                ),\n            )\n            input_channel = out_channels\n\n        for i in range(n_repeat):\n            mv1_block.append(\n                SeparableConv2d(\n                    opts=opts,\n                    in_channels=input_channel,\n                    out_channels=out_channels,\n                    kernel_size=3,\n                    stride=1,\n                    use_norm=True,\n                    use_act=True,\n                    dilation=self.dilation,\n                ),\n            )\n            input_channel = out_channels\n\n        return nn.Sequential(*mv1_block), input_channel\n"
  },
  {
    "path": "corenet/modeling/models/classification/mobilenetv2.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nfrom typing import Dict, List, Optional, Tuple, Union\n\nfrom torch import nn\n\nfrom corenet.modeling.layers import ConvLayer2d, Dropout, GlobalPool, LinearLayer\nfrom corenet.modeling.models import MODEL_REGISTRY\nfrom corenet.modeling.models.classification.base_image_encoder import BaseImageEncoder\nfrom corenet.modeling.models.classification.config.mobilenetv2 import get_configuration\nfrom corenet.modeling.modules import InvertedResidual\nfrom corenet.utils.math_utils import bound_fn, make_divisible\n\n\n@MODEL_REGISTRY.register(name=\"mobilenetv2\", type=\"classification\")\nclass MobileNetV2(BaseImageEncoder):\n    \"\"\"\n    This class defines the `MobileNetv2 architecture <https://arxiv.org/abs/1801.04381>`_\n    \"\"\"\n\n    def __init__(self, opts, *args, **kwargs) -> None:\n\n        width_mult = getattr(\n            opts, \"model.classification.mobilenetv2.width_multiplier\", 1.0\n        )\n\n        cfg = get_configuration(opts=opts)\n\n        image_channels = 3\n        input_channels = 32\n        last_channel = 1280\n        classifier_dropout = getattr(\n            opts, \"model.classification.classifier_dropout\", 0.0\n        )\n        if classifier_dropout == 0.0 or classifier_dropout is None:\n            val = round(0.2 * width_mult, 3)\n            classifier_dropout = bound_fn(min_val=0.0, max_val=0.2, value=val)\n\n        super().__init__(opts, *args, **kwargs)\n\n        last_channel = make_divisible(\n            last_channel * max(1.0, width_mult), self.round_nearest\n        )\n        self.model_conf_dict = dict()\n\n        self.conv_1 = ConvLayer2d(\n            opts=opts,\n            in_channels=image_channels,\n            out_channels=input_channels,\n            kernel_size=3,\n            stride=2,\n            use_norm=True,\n            use_act=True,\n        )\n        self.model_conf_dict[\"conv1\"] = {\"in\": image_channels, \"out\": input_channels}\n\n        self.layer_1, out_channels = self._make_layer(\n            opts=opts,\n            mv2_config=cfg[\"layer1\"],\n            width_mult=width_mult,\n            input_channel=input_channels,\n        )\n        self.model_conf_dict[\"layer1\"] = {\"in\": input_channels, \"out\": out_channels}\n        input_channels = out_channels\n\n        self.layer_2, out_channels = self._make_layer(\n            opts=opts,\n            mv2_config=cfg[\"layer2\"],\n            width_mult=width_mult,\n            input_channel=input_channels,\n        )\n        self.model_conf_dict[\"layer2\"] = {\"in\": input_channels, \"out\": out_channels}\n        input_channels = out_channels\n\n        self.layer_3, out_channels = self._make_layer(\n            opts=opts,\n            mv2_config=cfg[\"layer3\"],\n            width_mult=width_mult,\n            input_channel=input_channels,\n        )\n        self.model_conf_dict[\"layer3\"] = {\"in\": input_channels, \"out\": out_channels}\n        input_channels = out_channels\n\n        self.layer_4, out_channels = self._make_layer(\n            opts=opts,\n            mv2_config=[cfg[\"layer4\"], cfg[\"layer4_a\"]],\n            width_mult=width_mult,\n            input_channel=input_channels,\n            dilate=self.dilate_l4,\n        )\n        self.model_conf_dict[\"layer4\"] = {\"in\": input_channels, \"out\": out_channels}\n        input_channels = out_channels\n\n        self.layer_5, out_channels = self._make_layer(\n            opts=opts,\n            mv2_config=[cfg[\"layer5\"], cfg[\"layer5_a\"]],\n            width_mult=width_mult,\n            input_channel=input_channels,\n            dilate=self.dilate_l5,\n        )\n        self.model_conf_dict[\"layer5\"] = {\"in\": input_channels, \"out\": out_channels}\n        input_channels = out_channels\n\n        self.conv_1x1_exp = ConvLayer2d(\n            opts=opts,\n            in_channels=input_channels,\n            out_channels=last_channel,\n            kernel_size=1,\n            stride=1,\n            use_act=True,\n            use_norm=True,\n        )\n        self.model_conf_dict[\"exp_before_cls\"] = {\n            \"in\": input_channels,\n            \"out\": last_channel,\n        }\n\n        pool_type = getattr(opts, \"model.layer.global_pool\", \"mean\")\n\n        self.classifier = nn.Sequential()\n        self.classifier.add_module(\n            name=\"global_pool\", module=GlobalPool(pool_type=pool_type, keep_dim=False)\n        )\n        if 0.0 < classifier_dropout < 1.0:\n            self.classifier.add_module(\n                name=\"classifier_dropout\", module=Dropout(p=classifier_dropout)\n            )\n        self.classifier.add_module(\n            name=\"classifier_fc\",\n            module=LinearLayer(\n                in_features=last_channel, out_features=self.n_classes, bias=True\n            ),\n        )\n\n        self.model_conf_dict[\"cls\"] = {\"in\": last_channel, \"out\": self.n_classes}\n\n        # check model\n        self.check_model()\n\n        # weight initialization\n        self.reset_parameters(opts=opts)\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        group = parser.add_argument_group(title=cls.__name__)\n        group.add_argument(\n            \"--model.classification.mobilenetv2.width-multiplier\",\n            type=float,\n            default=1.0,\n            help=\"Width multiplier for MobileNetv2. Default: 1.0\",\n        )\n        return parser\n\n    def _make_layer(\n        self,\n        opts,\n        mv2_config: Union[Dict, List],\n        width_mult: float,\n        input_channel: int,\n        dilate: Optional[bool] = False,\n        *args,\n        **kwargs\n    ) -> Tuple[nn.Module, int]:\n        prev_dilation = self.dilation\n        mv2_block = nn.Sequential()\n        count = 0\n\n        if isinstance(mv2_config, Dict):\n            mv2_config = [mv2_config]\n\n        for cfg in mv2_config:\n            t = cfg.get(\"expansion_ratio\")\n            c = cfg.get(\"out_channels\")\n            n = cfg.get(\"num_blocks\")\n            s = cfg.get(\"stride\")\n\n            output_channel = make_divisible(c * width_mult, self.round_nearest)\n\n            for block_idx in range(n):\n                stride = s if block_idx == 0 else 1\n                block_name = \"mv2_block_{}\".format(count)\n                if dilate and count == 0:\n                    self.dilation *= stride\n                    stride = 1\n\n                layer = InvertedResidual(\n                    opts=opts,\n                    in_channels=input_channel,\n                    out_channels=output_channel,\n                    stride=stride,\n                    expand_ratio=t,\n                    dilation=prev_dilation if count == 0 else self.dilation,\n                )\n                mv2_block.add_module(name=block_name, module=layer)\n                count += 1\n                input_channel = output_channel\n        return mv2_block, input_channel\n"
  },
  {
    "path": "corenet/modeling/models/classification/mobilenetv3.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nfrom typing import Optional, Tuple\n\nfrom torch import nn\n\nfrom corenet.modeling.layers import ConvLayer2d, Dropout, GlobalPool, LinearLayer\nfrom corenet.modeling.layers.activation import build_activation_layer\nfrom corenet.modeling.models import MODEL_REGISTRY\nfrom corenet.modeling.models.classification.base_image_encoder import BaseImageEncoder\nfrom corenet.modeling.models.classification.config.mobilenetv3 import get_configuration\nfrom corenet.modeling.modules import InvertedResidualSE\nfrom corenet.utils.math_utils import bound_fn, make_divisible\n\n\n@MODEL_REGISTRY.register(name=\"mobilenetv3\", type=\"classification\")\nclass MobileNetV3(BaseImageEncoder):\n    \"\"\"\n    This class implements the `MobileNetv3 architecture <https://arxiv.org/abs/1905.02244>`_\n    \"\"\"\n\n    def __init__(self, opts, *args, **kwargs) -> None:\n        width_mult = getattr(\n            opts, \"model.classification.mobilenetv3.width_multiplier\", 1.0\n        )\n        classifier_dropout = getattr(\n            opts, \"model.classification.classifier_dropout\", 0.0\n        )\n        if classifier_dropout == 0.0 or classifier_dropout is None:\n            val = round(0.2 * width_mult, 3)\n            classifier_dropout = bound_fn(min_val=0.0, max_val=0.2, value=val)\n\n        image_channels = 3\n        input_channels = make_divisible(16 * width_mult, 8)\n\n        mv3_config = get_configuration(opts)\n\n        super().__init__(opts, *args, **kwargs)\n\n        self.conv_1 = nn.Sequential()\n        self.conv_1.add_module(\n            name=\"conv_3x3_bn\",\n            module=ConvLayer2d(\n                opts=opts,\n                in_channels=image_channels,\n                out_channels=input_channels,\n                kernel_size=3,\n                stride=2,\n                use_norm=True,\n                use_act=False,\n            ),\n        )\n        self.conv_1.add_module(\n            name=\"act\",\n            module=build_activation_layer(opts, act_type=\"hard_swish\", inplace=True),\n        )\n\n        self.model_conf_dict[\"conv1\"] = {\"in\": image_channels, \"out\": input_channels}\n\n        self.layer_1, out_channels = self._make_layer(\n            opts=opts,\n            mv3_config=mv3_config[\"layer_1\"],\n            width_mult=width_mult,\n            input_channel=input_channels,\n        )\n        self.model_conf_dict[\"layer1\"] = {\"in\": input_channels, \"out\": out_channels}\n        input_channels = out_channels\n\n        self.layer_2, out_channels = self._make_layer(\n            opts=opts,\n            mv3_config=mv3_config[\"layer_2\"],\n            width_mult=width_mult,\n            input_channel=input_channels,\n        )\n        self.model_conf_dict[\"layer2\"] = {\"in\": input_channels, \"out\": out_channels}\n        input_channels = out_channels\n\n        self.layer_3, out_channels = self._make_layer(\n            opts=opts,\n            mv3_config=mv3_config[\"layer_3\"],\n            width_mult=width_mult,\n            input_channel=input_channels,\n        )\n        self.model_conf_dict[\"layer3\"] = {\"in\": input_channels, \"out\": out_channels}\n        input_channels = out_channels\n\n        self.layer_4, out_channels = self._make_layer(\n            opts=opts,\n            mv3_config=mv3_config[\"layer_4\"],\n            width_mult=width_mult,\n            input_channel=input_channels,\n            dilate=self.dilate_l4,\n        )\n        self.model_conf_dict[\"layer4\"] = {\"in\": input_channels, \"out\": out_channels}\n        input_channels = out_channels\n\n        self.layer_5, out_channels = self._make_layer(\n            opts=opts,\n            mv3_config=mv3_config[\"layer_5\"],\n            width_mult=width_mult,\n            input_channel=input_channels,\n            dilate=self.dilate_l5,\n        )\n        self.model_conf_dict[\"layer5\"] = {\"in\": input_channels, \"out\": out_channels}\n        input_channels = out_channels\n\n        self.conv_1x1_exp = nn.Sequential()\n        out_channels = 6 * input_channels\n        self.conv_1x1_exp.add_module(\n            name=\"conv_1x1\",\n            module=ConvLayer2d(\n                opts=opts,\n                in_channels=input_channels,\n                out_channels=out_channels,\n                kernel_size=1,\n                stride=1,\n                use_act=False,\n                use_norm=True,\n            ),\n        )\n        self.conv_1x1_exp.add_module(\n            name=\"act\",\n            module=build_activation_layer(opts, act_type=\"hard_swish\", inplace=True),\n        )\n        self.model_conf_dict[\"exp_before_cls\"] = {\n            \"in\": input_channels,\n            \"out\": out_channels,\n        }\n\n        pool_type = getattr(opts, \"model.layer.global_pool\", \"mean\")\n\n        last_channels = mv3_config[\"last_channels\"]\n        self.classifier = nn.Sequential()\n        self.classifier.add_module(\n            name=\"global_pool\", module=GlobalPool(pool_type=pool_type, keep_dim=False)\n        )\n        self.classifier.add_module(\n            name=\"fc1\",\n            module=LinearLayer(\n                in_features=out_channels, out_features=last_channels, bias=True\n            ),\n        )\n        self.classifier.add_module(\n            name=\"act\",\n            module=build_activation_layer(opts, act_type=\"hard_swish\", inplace=True),\n        )\n        if 0.0 < classifier_dropout < 1.0:\n            self.classifier.add_module(\n                name=\"classifier_dropout\", module=Dropout(p=classifier_dropout)\n            )\n        self.classifier.add_module(\n            name=\"classifier_fc\",\n            module=LinearLayer(\n                in_features=last_channels, out_features=self.n_classes, bias=True\n            ),\n        )\n\n        self.model_conf_dict[\"cls\"] = {\"in\": 6 * input_channels, \"out\": self.n_classes}\n\n    def _make_layer(\n        self,\n        opts,\n        mv3_config,\n        width_mult: float,\n        input_channel: int,\n        dilate: Optional[bool] = False,\n        *args,\n        **kwargs\n    ) -> Tuple[nn.Module, int]:\n        prev_dilation = self.dilation\n        mv3_block = nn.Sequential()\n        count = 0\n\n        for i in range(len(mv3_config)):\n            for kernel_size, expansion_factor, in_channels, use_se, use_hs, stride in [\n                mv3_config[i]\n            ]:\n                block_name = \"mv3_s_{}_idx_{}\".format(stride, count)\n                output_channel = make_divisible(\n                    in_channels * width_mult, self.round_nearest\n                )\n\n                if dilate and count == 0:\n                    self.dilation *= stride\n                    stride = 1\n\n                layer = InvertedResidualSE(\n                    opts=opts,\n                    in_channels=input_channel,\n                    out_channels=output_channel,\n                    stride=stride,\n                    expand_ratio=expansion_factor,\n                    dilation=prev_dilation if count == 0 else self.dilation,\n                    act_fn_name=\"hard_swish\" if use_hs else \"relu\",\n                    use_se=use_se,\n                )\n                mv3_block.add_module(name=block_name, module=layer)\n                count += 1\n                input_channel = output_channel\n        return mv3_block, input_channel\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser):\n        group = parser.add_argument_group(title=cls.__name__)\n        group.add_argument(\n            \"--model.classification.mobilenetv3.mode\",\n            type=str,\n            default=\"large\",\n            help=\"Configuration for mobilenetv3. Default: large\",\n            choices=(\"small\", \"large\"),\n        )\n        group.add_argument(\n            \"--model.classification.mobilenetv3.width-multiplier\",\n            type=float,\n            default=1.0,\n            help=\"Width multiplier for mobilenetv3. Default: 1.0\",\n        )\n        return parser\n"
  },
  {
    "path": "corenet/modeling/models/classification/mobileone.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\nimport argparse\nimport copy\n\nimport torch.nn as nn\n\nfrom corenet.modeling.layers import GlobalPool, Identity, LinearLayer\nfrom corenet.modeling.models import MODEL_REGISTRY\nfrom corenet.modeling.models.classification.base_image_encoder import BaseImageEncoder\nfrom corenet.modeling.models.classification.config.mobileone import get_configuration\nfrom corenet.modeling.modules.mobileone_block import MobileOneBlock\n\n\n@MODEL_REGISTRY.register(name=\"mobileone\", type=\"classification\")\nclass MobileOne(BaseImageEncoder):\n    \"\"\"\n    This class implements `MobileOne architecture <https://arxiv.org/pdf/2206.04040.pdf>`_\n    \"\"\"\n\n    def __init__(self, opts, *args, **kwargs) -> None:\n        cfg = get_configuration(opts=opts)\n\n        super().__init__(opts, *args, **kwargs)\n\n        self.opts = opts\n        image_channels = 3\n        num_blocks_per_stage = cfg[\"num_blocks_per_stage\"]\n        width_multipliers = cfg[\"width_multipliers\"]\n        use_se = cfg[\"use_se\"]\n        self.num_conv_branches = cfg[\"num_conv_branches\"]\n        self.inference_mode = getattr(\n            opts, \"model.classification.mobileone.inference_mode\"\n        )\n\n        assert len(width_multipliers) == 4\n        self.in_planes = min(64, int(64 * width_multipliers[0]))\n        self.model_conf_dict = dict()\n\n        # First dense conv\n        self.conv_1 = MobileOneBlock(\n            opts,\n            in_channels=image_channels,\n            out_channels=self.in_planes,\n            kernel_size=3,\n            stride=2,\n            padding=1,\n            inference_mode=self.inference_mode,\n        )\n        self.model_conf_dict[\"conv1\"] = {\"in\": image_channels, \"out\": self.in_planes}\n\n        self.layer_1 = Identity()\n        self.model_conf_dict[\"layer1\"] = {\"in\": self.in_planes, \"out\": self.in_planes}\n\n        # Build stages\n        self.cur_layer_idx = 1\n        self.model_conf_dict[\"layer2\"] = {\n            \"in\": self.in_planes,\n            \"out\": int(64 * width_multipliers[0]),\n        }\n        self.layer_2 = self._make_stage(\n            int(64 * width_multipliers[0]), num_blocks_per_stage[0], num_se_blocks=0\n        )\n        self.model_conf_dict[\"layer3\"] = {\n            \"in\": self.in_planes,\n            \"out\": int(128 * width_multipliers[1]),\n        }\n        self.layer_3 = self._make_stage(\n            int(128 * width_multipliers[1]), num_blocks_per_stage[1], num_se_blocks=0\n        )\n        self.model_conf_dict[\"layer4\"] = {\n            \"in\": self.in_planes,\n            \"out\": int(256 * width_multipliers[2]),\n        }\n        self.layer_4 = self._make_stage(\n            int(256 * width_multipliers[2]),\n            num_blocks_per_stage[2],\n            num_se_blocks=int(num_blocks_per_stage[2] // 2) if use_se else 0,\n        )\n        self.model_conf_dict[\"layer5\"] = {\n            \"in\": self.in_planes,\n            \"out\": int(512 * width_multipliers[3]),\n        }\n        self.layer_5 = self._make_stage(\n            int(512 * width_multipliers[3]),\n            num_blocks_per_stage[3],\n            num_se_blocks=num_blocks_per_stage[3] if use_se else 0,\n        )\n\n        # No extra 1x1 conv before classifier\n        self.conv_1x1_exp = Identity()\n        self.model_conf_dict[\"exp_before_cls\"] = {\n            \"in\": int(512 * width_multipliers[3]),\n            \"out\": int(512 * width_multipliers[3]),\n        }\n\n        # Build classifier\n        pool_type = getattr(opts, \"model.layer.global_pool\")\n        self.classifier = nn.Sequential()\n        self.classifier.add_module(\n            name=\"global_pool\", module=GlobalPool(pool_type=pool_type, keep_dim=False)\n        )\n        self.classifier.add_module(\n            name=\"classifier_fc\",\n            module=LinearLayer(\n                in_features=int(512 * width_multipliers[3]),\n                out_features=self.n_classes,\n                bias=True,\n            ),\n        )\n        self.model_conf_dict[\"cls\"] = {\n            \"in\": int(512 * width_multipliers[3]),\n            \"out\": self.n_classes,\n        }\n\n        # check model\n        self.check_model()\n\n        # weight initialization\n        self.reset_parameters(opts=opts)\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        \"\"\"Add model specific arguments\"\"\"\n        group = parser.add_argument_group(title=cls.__name__)\n        group.add_argument(\n            \"--model.classification.mobileone.variant\",\n            type=str,\n            default=\"s1\",\n            help=\"Variant string for MobileOne. Default: s1\",\n        )\n        group.add_argument(\n            \"--model.classification.mobileone.inference-mode\",\n            type=bool,\n            default=False,\n            help=\"Flag to instantiate inference mode architecture. Default: False\",\n        )\n        return parser\n\n    def _make_stage(\n        self, planes: int, num_blocks: int, num_se_blocks: int\n    ) -> nn.Sequential:\n        \"\"\"Build a stage of MobileOne model.\n\n        Args:\n            planes: Number of output channels.\n            num_blocks: Number of blocks in this stage.\n            num_se_blocks: Number of SE blocks in this stage.\n\n        Returns:\n            A stage of MobileOne model.\n        \"\"\"\n        # Get strides for all layers\n        strides = [2] + [1] * (num_blocks - 1)\n        blocks = []\n        for ix, stride in enumerate(strides):\n            use_se = False\n            if num_se_blocks > num_blocks:\n                raise ValueError(\n                    f\"Number of SE blocks ({num_se_blocks}) cannot exceed number of layers ({num_blocks}).\"\n                )\n            if ix >= (num_blocks - num_se_blocks):\n                use_se = True\n\n            # MobileOne block with depthwise conv\n            blocks.append(\n                MobileOneBlock(\n                    self.opts,\n                    in_channels=self.in_planes,\n                    out_channels=self.in_planes,\n                    kernel_size=3,\n                    stride=stride,\n                    padding=1,\n                    groups=self.in_planes,\n                    inference_mode=self.inference_mode,\n                    use_se=use_se,\n                    num_conv_branches=self.num_conv_branches,\n                )\n            )\n            # MobileOne block with pointwise conv\n            blocks.append(\n                MobileOneBlock(\n                    self.opts,\n                    in_channels=self.in_planes,\n                    out_channels=planes,\n                    kernel_size=1,\n                    stride=1,\n                    padding=0,\n                    groups=1,\n                    inference_mode=self.inference_mode,\n                    use_se=use_se,\n                    num_conv_branches=self.num_conv_branches,\n                )\n            )\n            self.in_planes = planes\n            self.cur_layer_idx += 1\n        return nn.Sequential(*blocks)\n\n    def get_exportable_model(self) -> nn.Module:\n        \"\"\"Method returns a model where a multi-branched structure\n           used in training is re-parameterized into a single branch\n            for inference.\n\n        Returns:\n            Reparametrized MobileOne model for faster inference.\n        \"\"\"\n        # Avoid editing original graph\n        model = copy.deepcopy(self)\n        for module in model.modules():\n            if hasattr(module, \"reparameterize\"):\n                module.reparameterize()\n        return model\n"
  },
  {
    "path": "corenet/modeling/models/classification/mobilevit.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nfrom typing import Callable, Dict, Optional, Tuple\n\nfrom torch import nn\n\nfrom corenet.modeling.layers import ConvLayer2d, Dropout, GlobalPool, LinearLayer\nfrom corenet.modeling.models import MODEL_REGISTRY\nfrom corenet.modeling.models.classification.base_image_encoder import BaseImageEncoder\nfrom corenet.modeling.models.classification.config.mobilevit import get_configuration\nfrom corenet.modeling.modules import InvertedResidual, MobileViTBlock\nfrom corenet.utils import logger\n\n\n@MODEL_REGISTRY.register(name=\"mobilevit\", type=\"classification\")\nclass MobileViT(BaseImageEncoder):\n    \"\"\"\n    This class implements the `MobileViT architecture <https://arxiv.org/abs/2110.02178?context=cs.LG>`_\n    \"\"\"\n\n    def __init__(self, opts, *args, **kwargs) -> None:\n        classifier_dropout = getattr(\n            opts, \"model.classification.classifier_dropout\", 0.0\n        )\n\n        pool_type = getattr(opts, \"model.layer.global_pool\", \"mean\")\n        image_channels = 3\n        out_channels = 16\n\n        mobilevit_config = get_configuration(opts=opts)\n\n        super().__init__(opts, *args, **kwargs)\n\n        # store model configuration in a dictionary\n        self.model_conf_dict = dict()\n        self.conv_1 = ConvLayer2d(\n            opts=opts,\n            in_channels=image_channels,\n            out_channels=out_channels,\n            kernel_size=3,\n            stride=2,\n            use_norm=True,\n            use_act=True,\n        )\n\n        self.model_conf_dict[\"conv1\"] = {\"in\": image_channels, \"out\": out_channels}\n\n        in_channels = out_channels\n        self.layer_1, out_channels = self._make_layer(\n            opts=opts, input_channel=in_channels, cfg=mobilevit_config[\"layer1\"]\n        )\n        self.model_conf_dict[\"layer1\"] = {\"in\": in_channels, \"out\": out_channels}\n\n        in_channels = out_channels\n        self.layer_2, out_channels = self._make_layer(\n            opts=opts, input_channel=in_channels, cfg=mobilevit_config[\"layer2\"]\n        )\n        self.model_conf_dict[\"layer2\"] = {\"in\": in_channels, \"out\": out_channels}\n\n        in_channels = out_channels\n        self.layer_3, out_channels = self._make_layer(\n            opts=opts, input_channel=in_channels, cfg=mobilevit_config[\"layer3\"]\n        )\n        self.model_conf_dict[\"layer3\"] = {\"in\": in_channels, \"out\": out_channels}\n\n        in_channels = out_channels\n        self.layer_4, out_channels = self._make_layer(\n            opts=opts,\n            input_channel=in_channels,\n            cfg=mobilevit_config[\"layer4\"],\n            dilate=self.dilate_l4,\n        )\n        self.model_conf_dict[\"layer4\"] = {\"in\": in_channels, \"out\": out_channels}\n\n        in_channels = out_channels\n        self.layer_5, out_channels = self._make_layer(\n            opts=opts,\n            input_channel=in_channels,\n            cfg=mobilevit_config[\"layer5\"],\n            dilate=self.dilate_l5,\n        )\n        self.model_conf_dict[\"layer5\"] = {\"in\": in_channels, \"out\": out_channels}\n\n        in_channels = out_channels\n        exp_channels = min(mobilevit_config[\"last_layer_exp_factor\"] * in_channels, 960)\n        self.conv_1x1_exp = ConvLayer2d(\n            opts=opts,\n            in_channels=in_channels,\n            out_channels=exp_channels,\n            kernel_size=1,\n            stride=1,\n            use_act=True,\n            use_norm=True,\n        )\n\n        self.model_conf_dict[\"exp_before_cls\"] = {\n            \"in\": in_channels,\n            \"out\": exp_channels,\n        }\n\n        self.classifier = nn.Sequential()\n        self.classifier.add_module(\n            name=\"global_pool\", module=GlobalPool(pool_type=pool_type, keep_dim=False)\n        )\n        if 0.0 < classifier_dropout < 1.0:\n            self.classifier.add_module(\n                name=\"dropout\", module=Dropout(p=classifier_dropout, inplace=True)\n            )\n        self.classifier.add_module(\n            name=\"fc\",\n            module=LinearLayer(\n                in_features=exp_channels, out_features=self.n_classes, bias=True\n            ),\n        )\n\n        # check model\n        self.check_model()\n\n        # weight initialization\n        self.reset_parameters(opts=opts)\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        group = parser.add_argument_group(title=cls.__name__)\n        group.add_argument(\n            \"--model.classification.mit.mode\",\n            type=str,\n            default=\"small\",\n            choices=[\"xx_small\", \"x_small\", \"small\"],\n            help=\"MobileViT mode. Defaults to small\",\n        )\n        group.add_argument(\n            \"--model.classification.mit.attn-dropout\",\n            type=float,\n            default=0.0,\n            help=\"Dropout in attention layer. Defaults to 0.0\",\n        )\n        group.add_argument(\n            \"--model.classification.mit.ffn-dropout\",\n            type=float,\n            default=0.0,\n            help=\"Dropout between FFN layers. Defaults to 0.0\",\n        )\n        group.add_argument(\n            \"--model.classification.mit.dropout\",\n            type=float,\n            default=0.0,\n            help=\"Dropout in Transformer layer. Defaults to 0.0\",\n        )\n        group.add_argument(\n            \"--model.classification.mit.transformer-norm-layer\",\n            type=str,\n            default=\"layer_norm\",\n            help=\"Normalization layer in transformer. Defaults to LayerNorm\",\n        )\n        group.add_argument(\n            \"--model.classification.mit.no-fuse-local-global-features\",\n            action=\"store_true\",\n            help=\"Do not combine local and global features in MobileViT block\",\n        )\n        group.add_argument(\n            \"--model.classification.mit.conv-kernel-size\",\n            type=int,\n            default=3,\n            help=\"Kernel size of Conv layers in MobileViT block\",\n        )\n\n        group.add_argument(\n            \"--model.classification.mit.head-dim\",\n            type=int,\n            default=None,\n            help=\"Head dimension in transformer\",\n        )\n        group.add_argument(\n            \"--model.classification.mit.number-heads\",\n            type=int,\n            default=None,\n            help=\"Number of heads in transformer\",\n        )\n        return parser\n\n    def _make_layer(\n        self,\n        opts,\n        input_channel,\n        cfg: Dict,\n        dilate: Optional[bool] = False,\n        *args,\n        **kwargs\n    ) -> Tuple[nn.Sequential, int]:\n        block_type = cfg.get(\"block_type\", \"mobilevit\")\n        if block_type.lower() == \"mobilevit\":\n            return self._make_mit_layer(\n                opts=opts, input_channel=input_channel, cfg=cfg, dilate=dilate\n            )\n        else:\n            return self._make_mobilenet_layer(\n                opts=opts, input_channel=input_channel, cfg=cfg\n            )\n\n    @staticmethod\n    def _make_mobilenet_layer(\n        opts, input_channel: int, cfg: Dict, *args, **kwargs\n    ) -> Tuple[nn.Sequential, int]:\n        output_channels = cfg.get(\"out_channels\")\n        num_blocks = cfg.get(\"num_blocks\", 2)\n        expand_ratio = cfg.get(\"expand_ratio\", 4)\n        block = []\n\n        for i in range(num_blocks):\n            stride = cfg.get(\"stride\", 1) if i == 0 else 1\n\n            layer = InvertedResidual(\n                opts=opts,\n                in_channels=input_channel,\n                out_channels=output_channels,\n                stride=stride,\n                expand_ratio=expand_ratio,\n            )\n            block.append(layer)\n            input_channel = output_channels\n        return nn.Sequential(*block), input_channel\n\n    def _make_mit_layer(\n        self,\n        opts,\n        input_channel,\n        cfg: Dict,\n        dilate: Optional[bool] = False,\n        *args,\n        **kwargs\n    ) -> Tuple[nn.Sequential, int]:\n        prev_dilation = self.dilation\n        block = []\n        stride = cfg.get(\"stride\", 1)\n\n        if stride == 2:\n            if dilate:\n                self.dilation *= 2\n                stride = 1\n\n            layer = InvertedResidual(\n                opts=opts,\n                in_channels=input_channel,\n                out_channels=cfg.get(\"out_channels\"),\n                stride=stride,\n                expand_ratio=cfg.get(\"mv_expand_ratio\", 4),\n                dilation=prev_dilation,\n            )\n\n            block.append(layer)\n            input_channel = cfg.get(\"out_channels\")\n\n        head_dim = cfg.get(\"head_dim\", 32)\n        transformer_dim = cfg[\"transformer_channels\"]\n        ffn_dim = cfg.get(\"ffn_dim\")\n        if head_dim is None:\n            num_heads = cfg.get(\"num_heads\", 4)\n            if num_heads is None:\n                num_heads = 4\n            head_dim = transformer_dim // num_heads\n\n        if transformer_dim % head_dim != 0:\n            logger.error(\n                \"Transformer input dimension should be divisible by head dimension. \"\n                \"Got {} and {}.\".format(transformer_dim, head_dim)\n            )\n\n        block.append(\n            MobileViTBlock(\n                opts=opts,\n                in_channels=input_channel,\n                transformer_dim=transformer_dim,\n                ffn_dim=ffn_dim,\n                n_transformer_blocks=cfg.get(\"transformer_blocks\", 1),\n                patch_h=cfg.get(\"patch_h\", 2),\n                patch_w=cfg.get(\"patch_w\", 2),\n                dropout=getattr(opts, \"model.classification.mit.dropout\", 0.1),\n                ffn_dropout=getattr(opts, \"model.classification.mit.ffn_dropout\", 0.0),\n                attn_dropout=getattr(\n                    opts, \"model.classification.mit.attn_dropout\", 0.1\n                ),\n                head_dim=head_dim,\n                no_fusion=getattr(\n                    opts,\n                    \"model.classification.mit.no_fuse_local_global_features\",\n                    False,\n                ),\n                conv_ksize=getattr(\n                    opts, \"model.classification.mit.conv_kernel_size\", 3\n                ),\n            )\n        )\n\n        return nn.Sequential(*block), input_channel\n\n    def get_activation_checkpoint_submodule_class(self) -> Callable:\n        return MobileViTBlock\n"
  },
  {
    "path": "corenet/modeling/models/classification/mobilevit_v2.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nfrom typing import Dict, Optional, Tuple\n\nfrom torch import nn\n\nfrom corenet.modeling.layers import ConvLayer2d, GlobalPool, Identity, LinearLayer\nfrom corenet.modeling.models import MODEL_REGISTRY\nfrom corenet.modeling.models.classification.base_image_encoder import BaseImageEncoder\nfrom corenet.modeling.models.classification.config.mobilevit_v2 import get_configuration\nfrom corenet.modeling.modules import InvertedResidual\nfrom corenet.modeling.modules import MobileViTBlockv2 as Block\n\n\n@MODEL_REGISTRY.register(name=\"mobilevit_v2\", type=\"classification\")\nclass MobileViTv2(BaseImageEncoder):\n    \"\"\"\n    This class defines the `MobileViTv2 <https://arxiv.org/abs/2206.02680>`_ architecture\n    \"\"\"\n\n    def __init__(self, opts, *args, **kwargs) -> None:\n        pool_type = getattr(opts, \"model.layer.global_pool\", \"mean\")\n\n        mobilevit_config = get_configuration(opts=opts)\n        image_channels = mobilevit_config[\"layer0\"][\"img_channels\"]\n        out_channels = mobilevit_config[\"layer0\"][\"out_channels\"]\n\n        super().__init__(opts, *args, **kwargs)\n\n        # store model configuration in a dictionary\n        self.model_conf_dict = dict()\n        self.conv_1 = ConvLayer2d(\n            opts=opts,\n            in_channels=image_channels,\n            out_channels=out_channels,\n            kernel_size=3,\n            stride=2,\n            use_norm=True,\n            use_act=True,\n        )\n\n        self.model_conf_dict[\"conv1\"] = {\"in\": image_channels, \"out\": out_channels}\n\n        in_channels = out_channels\n        self.layer_1, out_channels = self._make_layer(\n            opts=opts, input_channel=in_channels, cfg=mobilevit_config[\"layer1\"]\n        )\n        self.model_conf_dict[\"layer1\"] = {\"in\": in_channels, \"out\": out_channels}\n\n        in_channels = out_channels\n        self.layer_2, out_channels = self._make_layer(\n            opts=opts, input_channel=in_channels, cfg=mobilevit_config[\"layer2\"]\n        )\n        self.model_conf_dict[\"layer2\"] = {\"in\": in_channels, \"out\": out_channels}\n\n        in_channels = out_channels\n        self.layer_3, out_channels = self._make_layer(\n            opts=opts, input_channel=in_channels, cfg=mobilevit_config[\"layer3\"]\n        )\n        self.model_conf_dict[\"layer3\"] = {\"in\": in_channels, \"out\": out_channels}\n\n        in_channels = out_channels\n        self.layer_4, out_channels = self._make_layer(\n            opts=opts,\n            input_channel=in_channels,\n            cfg=mobilevit_config[\"layer4\"],\n            dilate=self.dilate_l4,\n        )\n        self.model_conf_dict[\"layer4\"] = {\"in\": in_channels, \"out\": out_channels}\n\n        in_channels = out_channels\n        self.layer_5, out_channels = self._make_layer(\n            opts=opts,\n            input_channel=in_channels,\n            cfg=mobilevit_config[\"layer5\"],\n            dilate=self.dilate_l5,\n        )\n        self.model_conf_dict[\"layer5\"] = {\"in\": in_channels, \"out\": out_channels}\n\n        self.conv_1x1_exp = Identity()\n        self.model_conf_dict[\"exp_before_cls\"] = {\n            \"in\": out_channels,\n            \"out\": out_channels,\n        }\n\n        self.classifier = nn.Sequential(\n            GlobalPool(pool_type=pool_type, keep_dim=False),\n            LinearLayer(\n                in_features=out_channels, out_features=self.n_classes, bias=True\n            ),\n        )\n\n        # check model\n        self.check_model()\n\n        # weight initialization\n        self.reset_parameters(opts=opts)\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        group = parser.add_argument_group(title=cls.__name__)\n        group.add_argument(\n            \"--model.classification.mitv2.attn-dropout\",\n            type=float,\n            default=0.0,\n            help=\"Dropout in attention layer. Defaults to 0.0\",\n        )\n        group.add_argument(\n            \"--model.classification.mitv2.ffn-dropout\",\n            type=float,\n            default=0.0,\n            help=\"Dropout between FFN layers. Defaults to 0.0\",\n        )\n        group.add_argument(\n            \"--model.classification.mitv2.dropout\",\n            type=float,\n            default=0.0,\n            help=\"Dropout in attention layer. Defaults to 0.0\",\n        )\n        group.add_argument(\n            \"--model.classification.mitv2.width-multiplier\",\n            type=float,\n            default=1.0,\n            help=\"Width multiplier. Defaults to 1.0\",\n        )\n        group.add_argument(\n            \"--model.classification.mitv2.attn-norm-layer\",\n            type=str,\n            default=\"layer_norm_2d\",\n            help=\"Norm layer in attention block. Defaults to LayerNorm\",\n        )\n        return parser\n\n    def _make_layer(\n        self, opts, input_channel, cfg: Dict, dilate: Optional[bool] = False\n    ) -> Tuple[nn.Sequential, int]:\n        block_type = cfg.get(\"block_type\", \"mobilevit\")\n        if block_type.lower() == \"mobilevit\":\n            return self._make_mit_layer(\n                opts=opts, input_channel=input_channel, cfg=cfg, dilate=dilate\n            )\n        else:\n            return self._make_mobilenet_layer(\n                opts=opts, input_channel=input_channel, cfg=cfg\n            )\n\n    @staticmethod\n    def _make_mobilenet_layer(\n        opts, input_channel: int, cfg: Dict\n    ) -> Tuple[nn.Sequential, int]:\n        output_channels = cfg.get(\"out_channels\")\n        num_blocks = cfg.get(\"num_blocks\", 2)\n        expand_ratio = cfg.get(\"expand_ratio\", 4)\n        block = []\n\n        for i in range(num_blocks):\n            stride = cfg.get(\"stride\", 1) if i == 0 else 1\n\n            layer = InvertedResidual(\n                opts=opts,\n                in_channels=input_channel,\n                out_channels=output_channels,\n                stride=stride,\n                expand_ratio=expand_ratio,\n            )\n            block.append(layer)\n            input_channel = output_channels\n        return nn.Sequential(*block), input_channel\n\n    def _make_mit_layer(\n        self, opts, input_channel, cfg: Dict, dilate: Optional[bool] = False\n    ) -> Tuple[nn.Sequential, int]:\n        prev_dilation = self.dilation\n        block = []\n        stride = cfg.get(\"stride\", 1)\n\n        if stride == 2:\n            if dilate:\n                self.dilation *= 2\n                stride = 1\n\n            layer = InvertedResidual(\n                opts=opts,\n                in_channels=input_channel,\n                out_channels=cfg.get(\"out_channels\"),\n                stride=stride,\n                expand_ratio=cfg.get(\"mv_expand_ratio\", 4),\n                dilation=prev_dilation,\n            )\n\n            block.append(layer)\n            input_channel = cfg.get(\"out_channels\")\n\n        attn_unit_dim = cfg[\"attn_unit_dim\"]\n        ffn_multiplier = cfg.get(\"ffn_multiplier\")\n\n        dropout = getattr(opts, \"model.classification.mitv2.dropout\", 0.0)\n\n        block.append(\n            Block(\n                opts=opts,\n                in_channels=input_channel,\n                attn_unit_dim=attn_unit_dim,\n                ffn_multiplier=ffn_multiplier,\n                n_attn_blocks=cfg.get(\"attn_blocks\", 1),\n                patch_h=cfg.get(\"patch_h\", 2),\n                patch_w=cfg.get(\"patch_w\", 2),\n                dropout=dropout,\n                ffn_dropout=getattr(\n                    opts, \"model.classification.mitv2.ffn_dropout\", 0.0\n                ),\n                attn_dropout=getattr(\n                    opts, \"model.classification.mitv2.attn_dropout\", 0.0\n                ),\n                conv_ksize=3,\n                attn_norm_layer=getattr(\n                    opts, \"model.classification.mitv2.attn_norm_layer\", \"layer_norm_2d\"\n                ),\n                dilation=self.dilation,\n            )\n        )\n\n        return nn.Sequential(*block), input_channel\n"
  },
  {
    "path": "corenet/modeling/models/classification/regnet.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nfrom typing import Dict, List, Tuple\n\nfrom torch import nn\n\nfrom corenet.modeling.layers import (\n    AdaptiveAvgPool2d,\n    ConvLayer2d,\n    Dropout,\n    Flatten,\n    Identity,\n    LinearLayer,\n)\nfrom corenet.modeling.models import MODEL_REGISTRY\nfrom corenet.modeling.models.classification.base_image_encoder import BaseImageEncoder\nfrom corenet.modeling.models.classification.config.regnet import (\n    get_configuration,\n    supported_modes,\n)\nfrom corenet.modeling.modules import AnyRegNetStage\n\n\n@MODEL_REGISTRY.register(name=\"regnet\", type=\"classification\")\nclass RegNet(BaseImageEncoder):\n    \"\"\"\n    This class implements the `RegNet architecture <https://arxiv.org/pdf/2003.13678.pdf>`_\n    \"\"\"\n\n    def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None:\n        image_channels = 3\n        classifier_dropout = getattr(opts, \"model.classification.classifier_dropout\")\n\n        cfg = get_configuration(opts=opts)\n\n        # Output channels of first conv layer\n        stem_width = getattr(opts, \"model.classification.regnet.stem_width\")\n\n        stochastic_depth_prob = getattr(\n            opts, \"model.classification.regnet.stochastic_depth_prob\"\n        )\n        stage_depths = [cfg[f\"layer{i}\"][\"depth\"] for i in range(1, 5)]\n\n        super().__init__(opts, *args, **kwargs)\n        self.model_conf_dict = dict()\n\n        # Stem\n        self.conv_1 = ConvLayer2d(\n            opts=opts,\n            in_channels=image_channels,\n            out_channels=stem_width,\n            kernel_size=3,\n            stride=2,\n            use_norm=True,\n            use_act=True,\n        )\n        self.model_conf_dict[\"conv1\"] = {\n            \"in\": image_channels,\n            \"out\": stem_width,\n        }\n\n        # Body/stages\n        in_channels = stem_width\n        net_num_blocks = sum(stage_depths)\n        for stage_index in range(1, 5):\n            # Set stochastic depths for each block in the stage\n            stage_depth = stage_depths[stage_index - 1]\n            start_index = sum(stage_depths[: stage_index - 1])\n            stochastic_depth_probs = [\n                round(\n                    stochastic_depth_prob * (i + start_index) / (net_num_blocks - 1), 4\n                )\n                for i in range(stage_depth)\n            ]\n\n            layer, out_channels = self._make_stage(\n                opts=opts,\n                width_in=in_channels,\n                stage_config=cfg[f\"layer{stage_index}\"],\n                stage_index=stage_index,\n                stochastic_depth_probs=stochastic_depth_probs,\n            )\n\n            setattr(self, f\"layer_{stage_index}\", layer)\n\n            self.model_conf_dict[f\"layer{stage_index}\"] = {\n                \"in\": in_channels,\n                \"out\": out_channels,\n            }\n\n            in_channels = out_channels\n\n        self.layer_5 = Identity()\n        self.model_conf_dict[\"layer5\"] = {\n            \"in\": in_channels,\n            \"out\": in_channels,\n        }\n\n        self.conv_1x1_exp = Identity()\n        self.model_conf_dict[\"exp_before_cls\"] = {\n            \"in\": in_channels,\n            \"out\": in_channels,\n        }\n\n        # Head\n        self.classifier = nn.Sequential()\n        self.classifier.add_module(\n            name=\"avg_pool\",\n            module=AdaptiveAvgPool2d(output_size=(1, 1), keep_dim=False),\n        )\n        self.classifier.add_module(name=\"flatten\", module=Flatten())\n\n        if classifier_dropout > 0:\n            self.classifier.add_module(\n                name=\"classifier_dropout\", module=Dropout(p=classifier_dropout)\n            )\n\n        self.classifier.add_module(\n            name=\"classifier_fc\",\n            module=LinearLayer(\n                in_features=in_channels, out_features=self.n_classes, bias=True\n            ),\n        )\n\n        self.model_conf_dict[\"cls\"] = {\"in\": in_channels, \"out\": self.n_classes}\n\n        self.check_model()\n        self.reset_parameters(opts=opts)\n\n    def _make_stage(\n        self,\n        opts: argparse.Namespace,\n        width_in: int,\n        stage_config: Dict,\n        stage_index: int,\n        stochastic_depth_probs: List[float],\n        *args,\n        **kwargs,\n    ) -> Tuple[nn.Sequential, int]:\n        stage_depth = stage_config[\"depth\"]\n        stage_width = stage_config[\"width\"]\n        groups = stage_config[\"groups\"]\n        stride = stage_config[\"stride\"]\n        bottleneck_multiplier = stage_config[\"bottleneck_multiplier\"]\n        se_ratio = stage_config[\"se_ratio\"]\n\n        stage = AnyRegNetStage(\n            opts=opts,\n            depth=stage_depth,\n            width_in=width_in,\n            width_out=stage_width,\n            stride=stride,\n            groups=groups,\n            bottleneck_multiplier=bottleneck_multiplier,\n            se_ratio=se_ratio,\n            stage_index=stage_index,\n            stochastic_depth_probs=stochastic_depth_probs,\n        )\n\n        return stage, stage_width\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        if cls != RegNet:\n            # Don't re-register arguments in subclasses that don't override `add_arguments()`.\n            return parser\n        group = parser.add_argument_group(title=cls.__name__)\n\n        group.add_argument(\n            \"--model.classification.regnet.mode\",\n            type=str,\n            default=\"y_4.0gf\",\n            help=f\"The RegNet<mode> to use. Must be one of {', '.join(supported_modes)}. Defaults to y_4.0gf.\",\n        )\n        group.add_argument(\n            \"--model.classification.regnet.stochastic-depth-prob\",\n            type=float,\n            default=0.0,\n            help=\"Stochastic depth drop probability in RegNet blocks. Defaults to 0.\",\n        )\n        group.add_argument(\n            \"--model.classification.regnet.stem-width\",\n            type=int,\n            default=32,\n            help=\"The number of output channels of the first conv layer. Defaults to 32\",\n        )\n        return parser\n"
  },
  {
    "path": "corenet/modeling/models/classification/resnet.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nfrom functools import partial\nfrom typing import Dict, List, Tuple\n\nimport numpy as np\nfrom torch import nn\n\nfrom corenet.modeling.layers import (\n    ConvLayer2d,\n    Dropout,\n    GlobalPool,\n    Identity,\n    LinearLayer,\n)\nfrom corenet.modeling.models import MODEL_REGISTRY\nfrom corenet.modeling.models.classification.base_image_encoder import BaseImageEncoder\nfrom corenet.modeling.models.classification.config.resnet import get_configuration\nfrom corenet.modeling.modules import BasicResNetBlock, BottleneckResNetBlock\n\n\n@MODEL_REGISTRY.register(name=\"resnet\", type=\"classification\")\nclass ResNet(BaseImageEncoder):\n    \"\"\"\n    This class implements the `ResNet architecture <https://arxiv.org/pdf/1512.03385.pdf>`_\n\n    .. note::\n        Our ResNet implementation is different from the original implementation in two ways:\n        1. First 7x7 strided conv is replaced with 3x3 strided conv\n        2. MaxPool operation is replaced with another 3x3 strided depth-wise conv\n    \"\"\"\n\n    def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None:\n        image_channels = 3\n        input_channels = 64\n        classifier_dropout = getattr(opts, \"model.classification.classifier_dropout\")\n\n        stochastic_depth_prob = getattr(\n            opts, \"model.classification.resnet.stochastic_depth_prob\"\n        )\n\n        pool_type = getattr(opts, \"model.layer.global_pool\")\n\n        cfg = get_configuration(opts=opts)\n\n        super().__init__(opts, *args, **kwargs)\n        self.model_conf_dict = dict()\n\n        self.conv_1 = ConvLayer2d(\n            opts=opts,\n            in_channels=image_channels,\n            out_channels=input_channels,\n            kernel_size=3,\n            stride=2,\n            use_norm=True,\n            use_act=True,\n        )\n        self.model_conf_dict[\"conv1\"] = {\"in\": image_channels, \"out\": input_channels}\n\n        self.layer_1 = ConvLayer2d(\n            opts=opts,\n            in_channels=input_channels,\n            out_channels=input_channels,\n            kernel_size=3,\n            stride=2,\n            use_norm=True,\n            use_act=True,\n            groups=input_channels,\n        )\n        self.model_conf_dict[\"layer1\"] = {\"in\": input_channels, \"out\": input_channels}\n\n        # Stochastic depth variables\n        block_repeats = [cfg[f\"layer{i}\"].get(\"num_blocks\", 2) for i in range(2, 6)]\n        block_start_indices = np.cumsum([0] + block_repeats[:-1])\n        net_num_blocks = sum(block_repeats)\n        stochastic_depth_fn = partial(\n            self._block_stochastic_depth_prob,\n            stochastic_depth_prob=stochastic_depth_prob,\n            net_num_blocks=net_num_blocks,\n        )\n\n        start_idx = block_start_indices[0]\n        num_blocks = cfg[\"layer2\"][\"num_blocks\"]\n        self.layer_2, out_channels = self._make_layer(\n            opts=opts,\n            in_channels=input_channels,\n            layer_config=cfg[\"layer2\"],\n            stochastic_depth_probs=[\n                stochastic_depth_fn(start_idx=start_idx, idx=idx)\n                for idx in range(num_blocks)\n            ],\n        )\n        self.model_conf_dict[\"layer2\"] = {\"in\": input_channels, \"out\": out_channels}\n        input_channels = out_channels\n\n        start_idx = block_start_indices[1]\n        num_blocks = cfg[\"layer3\"][\"num_blocks\"]\n        self.layer_3, out_channels = self._make_layer(\n            opts=opts,\n            in_channels=input_channels,\n            layer_config=cfg[\"layer3\"],\n            stochastic_depth_probs=[\n                stochastic_depth_fn(start_idx=start_idx, idx=idx)\n                for idx in range(num_blocks)\n            ],\n        )\n        self.model_conf_dict[\"layer3\"] = {\"in\": input_channels, \"out\": out_channels}\n        input_channels = out_channels\n\n        start_idx = block_start_indices[2]\n        num_blocks = cfg[\"layer4\"][\"num_blocks\"]\n        self.layer_4, out_channels = self._make_layer(\n            opts=opts,\n            in_channels=input_channels,\n            layer_config=cfg[\"layer4\"],\n            stochastic_depth_probs=[\n                stochastic_depth_fn(start_idx=start_idx, idx=idx)\n                for idx in range(num_blocks)\n            ],\n            dilate=self.dilate_l4,\n        )\n        self.model_conf_dict[\"layer4\"] = {\"in\": input_channels, \"out\": out_channels}\n        input_channels = out_channels\n\n        start_idx = block_start_indices[3]\n        num_blocks = cfg[\"layer5\"][\"num_blocks\"]\n        self.layer_5, out_channels = self._make_layer(\n            opts=opts,\n            in_channels=input_channels,\n            layer_config=cfg[\"layer5\"],\n            stochastic_depth_probs=[\n                stochastic_depth_fn(start_idx=start_idx, idx=idx)\n                for idx in range(num_blocks)\n            ],\n            dilate=self.dilate_l5,\n        )\n        self.model_conf_dict[\"layer5\"] = {\"in\": input_channels, \"out\": out_channels}\n        input_channels = out_channels\n\n        self.conv_1x1_exp = Identity()\n        self.model_conf_dict[\"exp_before_cls\"] = {\n            \"in\": input_channels,\n            \"out\": input_channels,\n        }\n\n        self.classifier = nn.Sequential()\n        self.classifier.add_module(\n            name=\"global_pool\", module=GlobalPool(pool_type=pool_type, keep_dim=False)\n        )\n        if 0.0 < classifier_dropout < 1.0:\n            self.classifier.add_module(\n                name=\"classifier_dropout\", module=Dropout(p=classifier_dropout)\n            )\n        self.classifier.add_module(\n            name=\"classifier_fc\",\n            module=LinearLayer(\n                in_features=input_channels, out_features=self.n_classes, bias=True\n            ),\n        )\n\n        self.model_conf_dict[\"cls\"] = {\"in\": input_channels, \"out\": self.n_classes}\n\n        # check model\n        self.check_model()\n\n        # weight initialization\n        self.reset_parameters(opts=opts)\n\n    def _block_stochastic_depth_prob(\n        self,\n        stochastic_depth_prob: float,\n        idx: int,\n        start_idx: int,\n        net_num_blocks: int,\n    ):\n        \"\"\"Computes the stochastic depth probability for a particular block in the network\"\"\"\n        return round(\n            stochastic_depth_prob * (idx + start_idx) / (net_num_blocks - 1), 4\n        )\n\n    def _make_layer(\n        self,\n        opts: argparse.Namespace,\n        in_channels: int,\n        layer_config: Dict,\n        stochastic_depth_probs: List[float],\n        dilate: bool = False,\n        *args,\n        **kwargs,\n    ) -> Tuple[nn.Sequential, int]:\n        block_type = (\n            BottleneckResNetBlock\n            if layer_config.get(\"block_type\", \"bottleneck\").lower() == \"bottleneck\"\n            else BasicResNetBlock\n        )\n        mid_channels = layer_config.get(\"mid_channels\")\n        num_blocks = layer_config.get(\"num_blocks\", 2)\n        stride = layer_config.get(\"stride\", 1)\n\n        squeeze_channels = layer_config.get(\"squeeze_channels\", None)\n\n        previous_dilation = self.dilation\n        if dilate:\n            self.dilation *= stride\n            stride = 1\n\n        out_channels = block_type.expansion * mid_channels\n        dropout = getattr(opts, \"model.classification.resnet.dropout\")\n\n        block = nn.Sequential()\n        block.add_module(\n            name=\"block_0\",\n            module=block_type(\n                opts=opts,\n                in_channels=in_channels,\n                mid_channels=mid_channels,\n                out_channels=out_channels,\n                stride=stride,\n                dilation=previous_dilation,\n                dropout=dropout,\n                stochastic_depth_prob=stochastic_depth_probs[0],\n                squeeze_channels=squeeze_channels,\n            ),\n        )\n\n        for block_idx in range(1, num_blocks):\n            block.add_module(\n                name=\"block_{}\".format(block_idx),\n                module=block_type(\n                    opts=opts,\n                    in_channels=out_channels,\n                    mid_channels=mid_channels,\n                    out_channels=out_channels,\n                    stride=1,\n                    dilation=self.dilation,\n                    dropout=dropout,\n                    stochastic_depth_prob=stochastic_depth_probs[block_idx],\n                    squeeze_channels=squeeze_channels,\n                ),\n            )\n\n        return block, out_channels\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        group = parser.add_argument_group(title=cls.__name__)\n        group.add_argument(\"--model.classification.resnet.depth\", type=int, default=50)\n        group.add_argument(\n            \"--model.classification.resnet.dropout\",\n            type=float,\n            default=0.0,\n            help=\"Dropout in Resnet blocks. Defaults to 0.\",\n        )\n\n        group.add_argument(\n            \"--model.classification.resnet.stochastic-depth-prob\",\n            type=float,\n            default=0.0,\n            help=\"Stochastic depth drop probability in Resnet blocks. Defaults to 0.\",\n        )\n\n        group.add_argument(\n            \"--model.classification.resnet.se-resnet\",\n            action=\"store_true\",\n            default=False,\n            help=\"Whether to use SE block to construct SE-ResNet model. Defaults to False.\",\n        )\n        return parser\n"
  },
  {
    "path": "corenet/modeling/models/classification/swin_transformer.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\nimport argparse\nfrom typing import Dict, List, Optional\n\nimport torch\nfrom torch import Tensor, nn\n\nfrom corenet.modeling.layers import (\n    ConvLayer2d,\n    Dropout,\n    GlobalPool,\n    Identity,\n    LinearLayer,\n    get_normalization_layer,\n)\nfrom corenet.modeling.models import MODEL_REGISTRY\nfrom corenet.modeling.models.classification.base_image_encoder import BaseImageEncoder\nfrom corenet.modeling.models.classification.config.swin_transformer import (\n    get_configuration,\n)\nfrom corenet.modeling.modules import PatchMerging, Permute, SwinTransformerBlock\nfrom corenet.utils import logger\n\n\n@MODEL_REGISTRY.register(name=\"swin\", type=\"classification\")\nclass SwinTransformer(BaseImageEncoder):\n    \"\"\"\n    Implements Swin Transformer from the `\"Swin Transformer: Hierarchical Vision Transformer using\n    Shifted Windows\" <https://arxiv.org/pdf/2103.14030>`_ paper.\n\n    The code is adapted from `\"Torchvision repository\" <https://github.com/pytorch/vision/blob/main/torchvision/models/swin_transformer.py>`_\n    \"\"\"\n\n    def __init__(self, opts, *args, **kwargs) -> None:\n        image_channels = 3\n        classifier_dropout = getattr(\n            opts, \"model.classification.classifier_dropout\", 0.0\n        )\n        pool_type = getattr(opts, \"model.layer.global_pool\", \"mean\")\n        super().__init__(opts, *args, **kwargs)\n\n        cfg = get_configuration(opts=opts)\n\n        patch_size = cfg[\"patch_size\"]\n        embed_dim = cfg[\"embed_dim\"]\n        depths = cfg[\"depths\"]\n        window_size = cfg[\"window_size\"]\n        mlp_ratio = cfg[\"mlp_ratio\"]\n        num_heads = cfg[\"num_heads\"]\n        dropout = cfg[\"dropout\"]\n        attn_dropout = cfg[\"attn_dropout\"]\n        ffn_dropout = cfg[\"ffn_dropout\"]\n        stochastic_depth_prob = cfg[\"stochastic_depth_prob\"]\n        norm_layer = cfg[\"norm_layer\"]\n\n        # store model configuration in a dictionary\n        self.model_conf_dict = dict()\n        self.conv_1 = nn.Sequential(\n            *[\n                ConvLayer2d(\n                    opts=opts,\n                    in_channels=image_channels,\n                    out_channels=embed_dim,\n                    kernel_size=patch_size,\n                    stride=patch_size,\n                    use_norm=False,\n                    use_act=False,\n                ),\n                Permute([0, 2, 3, 1]),\n                get_normalization_layer(\n                    opts=opts, norm_type=norm_layer, num_features=embed_dim\n                ),\n            ]\n        )\n\n        self.model_conf_dict[\"conv1\"] = {\"in\": image_channels, \"out\": embed_dim}\n        in_channels = embed_dim\n\n        self.model_conf_dict[\"layer1\"] = {\"in\": embed_dim, \"out\": embed_dim}\n\n        # build SwinTransformer blocks\n        layers: List[nn.Module] = []\n        total_stage_blocks = sum(depths)\n        stage_block_id = 0\n        for i_stage in range(len(depths)):\n            stage: List[nn.Module] = []\n            dim = embed_dim * 2**i_stage\n            for i_layer in range(depths[i_stage]):\n                # adjust stochastic depth probability based on the depth of the stage block\n                sd_prob = (\n                    stochastic_depth_prob\n                    * float(stage_block_id)\n                    / (total_stage_blocks - 1)\n                )\n                stage.append(\n                    SwinTransformerBlock(\n                        opts,\n                        dim,\n                        num_heads[i_stage],\n                        window_size=window_size,\n                        shift_size=[\n                            0 if i_layer % 2 == 0 else w // 2 for w in window_size\n                        ],\n                        mlp_ratio=mlp_ratio,\n                        dropout=dropout,\n                        attn_dropout=attn_dropout,\n                        ffn_dropout=ffn_dropout,\n                        stochastic_depth_prob=sd_prob,\n                        norm_layer=norm_layer,\n                    )\n                )\n                stage_block_id += 1\n            # add patch merging layer\n            if i_stage < (len(depths) - 1):\n                stage += [PatchMerging(opts, dim, norm_layer)]\n\n            layers.append(nn.Sequential(*stage))\n            self.model_conf_dict[\"layer{}\".format(i_stage + 2)] = {\n                \"in\": in_channels,\n                \"out\": dim,\n            }\n            in_channels = dim\n\n        self.layer_1, self.layer_2, self.layer_3, self.layer_4 = layers\n\n        # For segmentation architectures, we need to disable striding at an output stride of\n        # 8 or 16. Depending on the output stride value, we disable the striding in SwinTransformer\n        if self.dilate_l5:\n            for m in self.layer_3.modules():\n                if isinstance(m, PatchMerging):\n                    m.strided = False\n\n        if self.dilate_l4:\n            for m in self.layer_2.modules():\n                if isinstance(m, PatchMerging):\n                    m.strided = False\n\n        self.layer_5 = nn.Sequential(\n            *[\n                get_normalization_layer(\n                    opts=opts, norm_type=norm_layer, num_features=in_channels\n                ),\n                Permute([0, 3, 1, 2]),\n            ]\n        )\n\n        self.conv_1x1_exp = Identity()\n        self.model_conf_dict[\"exp_before_cls\"] = {\n            \"in\": in_channels,\n            \"out\": in_channels,\n        }\n\n        self.classifier = nn.Sequential()\n        self.classifier.add_module(\n            name=\"global_pool\", module=GlobalPool(pool_type=pool_type, keep_dim=False)\n        )\n        if 0.0 < classifier_dropout < 1.0:\n            self.classifier.add_module(\n                name=\"classifier_dropout\", module=Dropout(p=classifier_dropout)\n            )\n        self.classifier.add_module(\n            name=\"classifier_fc\",\n            module=LinearLayer(\n                in_features=in_channels, out_features=self.n_classes, bias=True\n            ),\n        )\n\n        self.model_conf_dict[\"cls\"] = {\"in\": in_channels, \"out\": self.n_classes}\n\n        extract_enc_point_format = getattr(\n            opts, \"model.classification.swin.extract_end_point_format\", \"nchw\"\n        )\n        if extract_enc_point_format not in [\"nchw\", \"nhwc\"]:\n            logger.error(\n                \"End point extraction format should be either nchw or nhwc. Got: {}\".format(\n                    extract_enc_point_format\n                )\n            )\n        self.extract_end_point_nchw_format = extract_enc_point_format == \"nchw\"\n\n        # check model\n        self.check_model()\n\n        # weight initialization\n        self.reset_parameters(opts=opts)\n\n    def extract_end_points_all(\n        self,\n        x: Tensor,\n        use_l5: Optional[bool] = True,\n        use_l5_exp: Optional[bool] = False,\n        *args,\n        **kwargs\n    ) -> Dict[str, Tensor]:\n        # First conv layer in SwinTransformer down samples by a factor of 4, so we modify the end-point extraction\n        # function, so that the model is compatible with down-stream heads (e.g., Mask-RCNN)\n\n        out_dict = {}  # Use dictionary over NamedTuple so that JIT is happy\n\n        if self.training and self.neural_augmentor is not None:\n            x = self.neural_augmentor(x)\n            out_dict[\"augmented_tensor\"] = x\n\n        # [N, C, H, W] --> [N, H/4, W/4, C]\n        x = self.conv_1(x)\n\n        # first layer down-samples by 4, so L1 and l2 should be identity\n        if self.extract_end_point_nchw_format:\n            x_nchw = torch.permute(x, dims=(0, 3, 1, 2))\n            out_dict[\"out_l1\"] = x_nchw\n            out_dict[\"out_l2\"] = x_nchw\n        else:\n            out_dict[\"out_l1\"] = x\n            out_dict[\"out_l2\"] = x\n\n        # [N, H/4, W/4, C] --> [N, H/8, W/8, C]\n        x = self.layer_1(x)\n        out_dict[\"out_l3\"] = (\n            torch.permute(x, dims=(0, 3, 1, 2))\n            if self.extract_end_point_nchw_format\n            else x\n        )\n\n        # [N, H/8, W/8, C] --> [N, H/16, W/16, C]\n        x = self.layer_2(x)\n        out_dict[\"out_l4\"] = (\n            torch.permute(x, dims=(0, 3, 1, 2))\n            if self.extract_end_point_nchw_format\n            else x\n        )\n\n        if use_l5:\n            # [N, H/16, W/16, C] --> [N, H/32, W/32, C]\n            x = self.layer_3(x)\n            x = self.layer_4(x)\n            # [N, H/32, W/32, C] --> [N, C, H/32, W/32]\n            x = self.layer_5(x)\n            out_dict[\"out_l5\"] = (\n                x\n                if self.extract_end_point_nchw_format\n                else torch.permute(x, dims=(0, 2, 3, 1))\n            )\n\n            if use_l5_exp:\n                x = self.conv_1x1_exp(x)\n                out_dict[\"out_l5_exp\"] = x\n        return out_dict\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        group = parser.add_argument_group(title=cls.__name__)\n        group.add_argument(\n            \"--model.classification.swin.mode\",\n            type=str,\n            default=\"tiny\",\n            help=\"SwinTransformer mode. Default is swin_t\",\n        )\n\n        group.add_argument(\n            \"--model.classification.swin.stochastic-depth-prob\",\n            type=float,\n            default=None,\n        )\n\n        group.add_argument(\n            \"--model.classification.swin.extract-end-point-format\",\n            type=str,\n            default=\"nchw\",\n            choices=[\"nchw\", \"nhwc\"],\n            help=\"End point extraction format in Swin Transformer. This is useful for down-stream tasks where \"\n            \"task-specific heads are either in nhwc format or nchw format. Defaults to nchw.\",\n        )\n\n        return parser\n"
  },
  {
    "path": "corenet/modeling/models/classification/vit.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nimport functools\nfrom typing import Callable, Dict, List, Optional, Tuple, Union\n\nimport numpy as np\nimport torch\nfrom torch import Tensor, nn\nfrom torch.distributed.fsdp.wrap import transformer_auto_wrap_policy\n\nfrom corenet.modeling.layers import (\n    ConvLayer2d,\n    Dropout,\n    Identity,\n    LinearLayer,\n    MaxPool2d,\n    PositionalEmbedding,\n    TransposeConvLayer2d,\n    get_normalization_layer,\n)\nfrom corenet.modeling.misc.common import parameter_list\nfrom corenet.modeling.misc.init_utils import initialize_conv_layer\nfrom corenet.modeling.models import MODEL_REGISTRY\nfrom corenet.modeling.models.classification.base_image_encoder import BaseImageEncoder\nfrom corenet.modeling.models.classification.config.vit import get_configuration\nfrom corenet.modeling.modules import FlashTransformerEncoder, TransformerEncoder\nfrom corenet.utils import logger\n\n\n@MODEL_REGISTRY.register(name=\"vit\", type=\"classification\")\nclass VisionTransformer(BaseImageEncoder):\n    \"\"\"Vision Transformer.\n\n    This class defines the `Vision Transformer architecture <https://arxiv.org/abs/2010.11929>`_. Our model implementation\n    is inspired from `Early Convolutions Help Transformers See Better <https://arxiv.org/abs/2106.14881>`_.\n\n    Args:\n        opts: Command-line arguments.\n\n    .. note::\n        Our implementation is different from the original implementation in two ways:\n        1. Kernel size is odd.\n        2. Our positional encoding implementation allows us to use ViT with any multiple input scales\n        3. We do not use StochasticDepth\n        4. We do not add positional encoding to class token (if enabled), as suggested in `DeiT-3 paper <https://arxiv.org/abs/2204.07118>`_\n    \"\"\"\n\n    def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None:\n        image_channels = 3\n\n        super().__init__(opts, *args, **kwargs)\n\n        vit_config = get_configuration(opts)\n\n        # Typically, in the ImageNet dataset, we use 224x224 as a resolution.\n        # For our ViT implementation, we use stride of 16. Therefore, total number of patch embeddings are (224 / 16)^2\n        num_patch_embeddings = (224 // 16) ** 2\n\n        embed_dim = vit_config[\"embed_dim\"]\n        ffn_dim = vit_config[\"ffn_dim\"]\n        pos_emb_drop_p = vit_config[\"pos_emb_drop_p\"]\n        n_transformer_layers = vit_config[\"n_transformer_layers\"]\n        num_heads = vit_config[\"n_attn_heads\"]\n        attn_dropout = vit_config[\"attn_dropout\"]\n        dropout = vit_config[\"dropout\"]\n        ffn_dropout = vit_config[\"ffn_dropout\"]\n        norm_layer = vit_config[\"norm_layer\"]\n\n        self.patch_emb = self._build_patch_embedding_layer(\n            opts, image_channels=image_channels, embedding_dimension=embed_dim\n        )\n\n        use_cls_token = not getattr(opts, \"model.classification.vit.no_cls_token\")\n        stochastic_dropout = getattr(\n            opts, \"model.classification.vit.stochastic_dropout\"\n        )\n        per_layer_stochastic_drop_rate = [\n            round(x, 3)\n            for x in np.linspace(0, stochastic_dropout, n_transformer_layers)\n        ]\n\n        self.post_transformer_norm = get_normalization_layer(\n            opts=opts, num_features=embed_dim, norm_type=norm_layer\n        )\n\n        use_flash_attn = getattr(opts, \"model.classification.vit.use_flash_attention\")\n\n        if use_flash_attn:\n            transformer_build_fn = self._build_transformer_layer_with_flash_attention\n        else:\n            transformer_build_fn = self._build_naive_transformer_layer\n\n        self.transformer = transformer_build_fn(\n            opts,\n            embedding_dimension=embed_dim,\n            ffn_dimension=ffn_dim,\n            num_transformer_layers=n_transformer_layers,\n            num_attention_heads=num_heads,\n            dropout=dropout,\n            attention_dropout=attn_dropout,\n            ffn_dropout=ffn_dropout,\n            normalization_layer_name=norm_layer,\n            per_layer_stochastic_drop_rate=per_layer_stochastic_drop_rate,\n        )\n        self.classifier = LinearLayer(embed_dim, self.n_classes)\n\n        self.reset_parameters(opts=opts)\n\n        if use_cls_token:\n            self.cls_token = nn.Parameter(torch.zeros(size=(1, 1, embed_dim)))\n            torch.nn.init.trunc_normal_(self.cls_token, std=0.02)\n        else:\n            self.cls_token = None\n\n        self.pos_embed = PositionalEmbedding(\n            opts=opts,\n            num_embeddings=num_patch_embeddings,\n            embedding_dim=embed_dim,\n            sequence_first=False,\n            padding_idx=None,\n            is_learnable=not getattr(\n                opts, \"model.classification.vit.sinusoidal_pos_emb\"\n            ),\n            interpolation_mode=\"bilinear\",\n        )\n        self.emb_dropout = Dropout(p=pos_emb_drop_p)\n        self.embed_dim = embed_dim\n        self.use_flash_attn = use_flash_attn\n\n        self.model_conf_dict = {\n            \"conv1\": {\"in\": image_channels, \"out\": embed_dim},\n            \"layer1\": {\"in\": embed_dim, \"out\": embed_dim},\n            \"layer2\": {\"in\": embed_dim, \"out\": embed_dim},\n            \"layer3\": {\"in\": embed_dim, \"out\": embed_dim},\n            \"layer4\": {\"in\": embed_dim, \"out\": embed_dim},\n            \"layer5\": {\"in\": embed_dim, \"out\": embed_dim},\n            \"exp_before_cls\": {\"in\": embed_dim, \"out\": embed_dim},\n            \"cls\": {\"in\": embed_dim, \"out\": self.n_classes},\n        }\n\n        use_simple_fpn = getattr(opts, \"model.classification.vit.use_simple_fpn\")\n        self.simple_fpn = None\n        if use_simple_fpn:\n            # for object detection, we add Simple FPN on top of ViT backbone, so that it can\n            # generate multi-scale representations. See https://arxiv.org/abs/2203.16527 for details\n            self.simple_fpn = self._build_simple_fpn_layers(opts, embed_dim, norm_layer)\n            self.reset_simple_fpn_params()\n\n        self.update_layer_norm_eps()\n\n    def _build_patch_embedding_layer(\n        self, opts: argparse.Namespace, image_channels: int, embedding_dimension: int\n    ) -> nn.Sequential:\n        \"\"\"Wrapper to build patch embedding layer.\n\n        Args:\n            opts: Command-line arguments.\n            image_channels: Number of image channels.\n            embedding_dimension: Embedding dimension.\n\n        Returns:\n            A sequential container with three convolution layers.\n        \"\"\"\n\n        # For classification tasks, output stride is 16, while for dense prediction tasks\n        # output stride is typically 8. We adjust default stride (i.e., [4, 2, 2]) in convolutional stem\n        # to [2, 2, 2] to obtain a ViT model with an output stride of 8.\n        kernel_sizes_conv_stem = [4, 2, 2]\n        strides_conv_stem = [4, 2, 2]\n        if self.output_stride is not None and self.output_stride not in [8, 16]:\n            logger.error(\"Output stride should be 8 or 16\")\n        elif self.output_stride is not None and self.output_stride == 8:\n            # For classification tasks,\n            strides_conv_stem[0] = 2\n\n        conv_stem_proj_dim = max(32, embedding_dimension // 4)\n        patch_emb = [\n            ConvLayer2d(\n                opts=opts,\n                in_channels=image_channels,\n                out_channels=conv_stem_proj_dim,\n                kernel_size=kernel_sizes_conv_stem[0],\n                stride=strides_conv_stem[0],\n                bias=False,\n                use_norm=True,\n                use_act=True,\n                norm_layer=get_normalization_layer(\n                    opts=opts, num_features=conv_stem_proj_dim, norm_type=\"batch_norm\"\n                ),\n            ),\n            ConvLayer2d(\n                opts=opts,\n                in_channels=conv_stem_proj_dim,\n                out_channels=conv_stem_proj_dim,\n                kernel_size=kernel_sizes_conv_stem[1],\n                stride=strides_conv_stem[1],\n                bias=False,\n                use_norm=True,\n                use_act=True,\n                norm_layer=get_normalization_layer(\n                    opts=opts, num_features=conv_stem_proj_dim, norm_type=\"batch_norm\"\n                ),\n            ),\n            ConvLayer2d(\n                opts=opts,\n                in_channels=conv_stem_proj_dim,\n                out_channels=embedding_dimension,\n                kernel_size=kernel_sizes_conv_stem[2],\n                stride=strides_conv_stem[2],\n                bias=True,\n                use_norm=False,\n                use_act=False,\n            ),\n        ]\n        return nn.Sequential(*patch_emb)\n\n    def _build_naive_transformer_layer(\n        self,\n        opts: argparse.Namespace,\n        embedding_dimension: int,\n        ffn_dimension: float,\n        num_transformer_layers: int,\n        num_attention_heads: int,\n        dropout: float,\n        attention_dropout: float,\n        ffn_dropout: float,\n        normalization_layer_name: str,\n        per_layer_stochastic_drop_rate: List[float],\n    ) -> nn.Sequential:\n        \"\"\"Wrapper to build transformer layer with unoptimized self-attention.\n\n        Args:\n            opts: Command-line arguments.\n            embedding_dimension: Embedding dimension.\n            ffn_dimension: Feed-forward network dimension.\n            num_transformer_layers: Number of transformer layers.\n            num_attention_heads: Number of attention heads.\n            dropout: Standard dropout.\n            attention_dropout: Attention dropout.\n            ffn_dropout: FFN dropout.\n            normalization_layer_name: Normalization layer name.\n            per_layer_stochastic_drop_rate: Stochastic dropout rate for each transformer layer.\n\n        Returns:\n            A sequential container with 'num_transformer_layers' TransformerEncoder layers.\n        \"\"\"\n\n        transformer_blocks = [\n            TransformerEncoder(\n                opts=opts,\n                embed_dim=embedding_dimension,\n                ffn_latent_dim=ffn_dimension,\n                num_heads=num_attention_heads,\n                attn_dropout=attention_dropout,\n                dropout=dropout,\n                ffn_dropout=ffn_dropout,\n                transformer_norm_layer=normalization_layer_name,\n                stochastic_dropout=per_layer_stochastic_drop_rate[layer_idx],\n            )\n            for layer_idx in range(num_transformer_layers)\n        ]\n        return nn.Sequential(*transformer_blocks)\n\n    def _build_transformer_layer_with_flash_attention(\n        self,\n        opts: argparse.Namespace,\n        embedding_dimension: int,\n        ffn_dimension: float,\n        num_transformer_layers: int,\n        num_attention_heads: int,\n        dropout: float,\n        attention_dropout: float,\n        ffn_dropout: float,\n        normalization_layer_name: str,\n        per_layer_stochastic_drop_rate: List[float],\n    ) -> nn.Module:\n        \"\"\"Wrapper to build transformer layer with flash self-attention.\n\n        Args:\n            opts: Command-line arguments.\n            embedding_dimension: Embedding dimension.\n            ffn_dimension: Feed-forward network dimension.\n            num_transformer_layers: Number of transformer layers.\n            num_attention_heads: Number of attention heads.\n            dropout: Standard dropout.\n            attention_dropout: Attention dropout.\n            ffn_dropout: FFN dropout.\n            normalization_layer_name: Normalization layer name.\n            per_layer_stochastic_drop_rate: Stochastic dropout rate for each transformer layer.\n\n        Returns:\n            A sequential container with 'num_transformer_layers' FlashTransformerEncoder layers.\n        \"\"\"\n\n        if embedding_dimension % num_attention_heads != 0:\n            logger.error(\n                f\"Embedding dimension should be divisble by num_attention_heads. Got: {embedding_dimension} embedding dimension and {num_attention_heads} heads.\"\n            )\n        head_dim = embedding_dimension // num_attention_heads\n\n        if head_dim not in [64, 128]:\n            logger.error(\n                f\"For flash attention, we want head dim to be 64 or 128 for better efficiency, but got head_dim as {head_dim}.\"\n            )\n\n        if ffn_dimension % embedding_dimension != 0:\n            logger.error(\n                f\"FFN dimension should be divisble by embedding dimension. Got FFN dimension as {ffn_dimension} and embedding dimension as {embedding_dimension}.\"\n            )\n\n        ffn_multiplier = ffn_dimension // embedding_dimension\n        transformer_blocks = [\n            FlashTransformerEncoder(\n                opts=opts,\n                in_features=embedding_dimension,\n                head_dim=head_dim,\n                attn_dropout_prob=attention_dropout,\n                qkv_features=embedding_dimension,\n                bias=True,\n                dropout=dropout,\n                ffn_dropout=ffn_dropout,\n                ffn_multiplier=ffn_multiplier,\n                stochastic_dropout=per_layer_stochastic_drop_rate[layer_idx],\n                norm_layer_name=normalization_layer_name,\n                divisible_by=16,\n            )\n            for layer_idx in range(num_transformer_layers)\n        ]\n        return nn.Sequential(*transformer_blocks)\n\n    def update_layer_norm_eps(self) -> None:\n        # Most ViT models use LayerNorm with 10^-6 eps. So, we update it here\n        for m in self.modules():\n            if isinstance(m, nn.LayerNorm):\n                m.eps = 1e-6\n\n    def reset_simple_fpn_params(self) -> None:\n        # reset simple FPN parameters\n        if self.simple_fpn is not None:\n            for m in self.simple_fpn.modules():\n                if isinstance(m, (nn.Conv2d, nn.ConvTranspose2d)):\n                    initialize_conv_layer(m, init_method=\"kaiming_uniform\")\n\n    def _apply_layer_wise_lr(\n        self,\n        weight_decay: Optional[float] = 0.0,\n        no_decay_bn_filter_bias: Optional[bool] = False,\n        *args,\n        **kwargs,\n    ) -> Tuple[List, List]:\n        \"\"\"\n        This function adjusts the learning rate of each layer in transformer module.\n        Layer-wise learning is a bit involved and requires a knowledge of how each layer is consumed\n        during the forward pass. We adjust the learning rate of patch embedding and transformer layers\n        while keeping the classifier and SimpleFPN at 1.0. This is because layer_wise_lr is typically\n        applied during fine-tuning for down-stream tasks.\n\n        For ViT (classification tasks), the path is like this:\n        Patch Embedding --> Transformer --> PostNorm --> Classifier\n\n        For ViT (detection tasks), the path is like this:\n        Patch Embedding --> Transformer --> PostNorm --> SimpleFPN\n\n        \"\"\"\n        n_layers = 1 + len(self.transformer)\n        layer_wise_lr = [\n            round(self.layer_wise_lr_decay_rate ** (n_layers - i), 5)\n            for i in range(n_layers)\n        ]\n        module_name = kwargs.pop(\"module_name\", \"\")\n\n        param_list = []\n        param_lr_list = []\n\n        if self.neural_augmentor:\n            neural_aug_params = parameter_list(\n                named_parameters=self.neural_augmentor.named_parameters,\n                weight_decay=weight_decay,\n                no_decay_bn_filter_bias=no_decay_bn_filter_bias,\n                module_name=module_name + \"neural_augmentor.\",\n                *args,\n                **kwargs,\n            )\n            param_list.extend(neural_aug_params)\n            param_lr_list.extend([layer_wise_lr[0]] * len(neural_aug_params))\n\n        # Patch embedding related parameters\n        embedding_params = parameter_list(\n            named_parameters=self.patch_emb.named_parameters,\n            weight_decay=weight_decay,\n            no_decay_bn_filter_bias=no_decay_bn_filter_bias,\n            module_name=module_name + \"patch_emb.\",\n            *args,\n            **kwargs,\n        )\n        param_list.extend(embedding_params)\n        param_lr_list.extend([layer_wise_lr[0]] * len(embedding_params))\n\n        # positional embedding parameters\n        pos_emb_params = parameter_list(\n            named_parameters=self.pos_embed.named_parameters,\n            weight_decay=weight_decay,\n            no_decay_bn_filter_bias=no_decay_bn_filter_bias,\n            module_name=module_name + \"pos_embed.\",\n            *args,\n            **kwargs,\n        )\n        param_list.extend(pos_emb_params)\n        param_lr_list.extend([layer_wise_lr[0]] * len(pos_emb_params))\n\n        if self.cls_token is not None:\n            # CLS token params\n            cls_token_params = parameter_list(\n                named_parameters=self.cls_token.named_parameters,\n                weight_decay=0.0,\n                no_decay_bn_filter_bias=no_decay_bn_filter_bias,\n                module_name=module_name + \"cls_token.\",\n                *args,\n                **kwargs,\n            )\n            param_list.extend(cls_token_params)\n            param_lr_list.extend([layer_wise_lr[0]] * len(cls_token_params))\n\n        # transformer related parameters\n        for layer_id, transformer_layer in enumerate(self.transformer):\n            layer_lr = layer_wise_lr[layer_id + 1]\n            transformer_layer_params = parameter_list(\n                named_parameters=transformer_layer.named_parameters,\n                weight_decay=weight_decay,\n                no_decay_bn_filter_bias=no_decay_bn_filter_bias,\n                module_name=module_name + f\"transformer.{layer_id}.\",\n                *args,\n                **kwargs,\n            )\n            param_list.extend(transformer_layer_params)\n            param_lr_list.extend([layer_lr] * len(transformer_layer_params))\n\n        # transformer post-norm params\n        post_transformer_norm_params = parameter_list(\n            named_parameters=self.post_transformer_norm.named_parameters,\n            weight_decay=weight_decay,\n            no_decay_bn_filter_bias=no_decay_bn_filter_bias,\n            module_name=module_name + \"post_transformer_norm.\",\n            *args,\n            **kwargs,\n        )\n        param_list.extend(post_transformer_norm_params)\n        param_lr_list.extend([layer_wise_lr[-1]] * len(post_transformer_norm_params))\n\n        if self.classifier is not None:\n            # classifier parameters\n            classifier_params = parameter_list(\n                named_parameters=self.classifier.named_parameters,\n                weight_decay=0.0,\n                no_decay_bn_filter_bias=no_decay_bn_filter_bias,\n                module_name=module_name + \"classifier.\",\n                *args,\n                **kwargs,\n            )\n            param_list.extend(classifier_params)\n            param_lr_list.extend([1.0] * len(classifier_params))\n\n        if self.simple_fpn is not None:\n            # simple FPN parameters\n            simple_fpn_params = parameter_list(\n                named_parameters=self.simple_fpn.named_parameters,\n                weight_decay=0.0,\n                no_decay_bn_filter_bias=no_decay_bn_filter_bias,\n                module_name=module_name + \"simple_fpn.\",\n                *args,\n                **kwargs,\n            )\n            param_list.extend(simple_fpn_params)\n            param_lr_list.extend([1.0] * len(simple_fpn_params))\n        return param_list, param_lr_list\n\n    def _build_simple_fpn_layers(\n        self,\n        opts: argparse.Namespace,\n        embedding_dimension: int,\n        normalization_layer_name: str,\n    ) -> nn.ModuleDict:\n        \"\"\"Wrapper to build simple FPN layer.\n\n        Args:\n            opts: Command-line arguments.\n            embedding_dimension: Embedding dimension.\n            normalization_layer_name: Normalization layer name.\n\n        Returns:\n            A module dictionary containing convolutional layers for building SimpleFPN.\n        \"\"\"\n        layer_l2 = nn.Sequential(\n            TransposeConvLayer2d(\n                opts,\n                in_channels=embedding_dimension,\n                out_channels=embedding_dimension // 2,\n                kernel_size=2,\n                stride=2,\n                padding=0,\n                output_padding=0,\n                groups=1,\n                use_norm=True,\n                use_act=True,\n                norm_layer=get_normalization_layer(\n                    opts=opts,\n                    num_features=embedding_dimension // 2,\n                    norm_type=normalization_layer_name,\n                ),\n            ),\n            TransposeConvLayer2d(\n                opts,\n                in_channels=embedding_dimension // 2,\n                out_channels=embedding_dimension // 4,\n                kernel_size=2,\n                stride=2,\n                padding=0,\n                output_padding=0,\n                groups=1,\n                use_norm=False,\n                use_act=False,\n                bias=True,\n            ),\n        )\n\n        self.model_conf_dict[\"layer2\"][\"out\"] = embedding_dimension // 4\n\n        layer_l3 = TransposeConvLayer2d(\n            opts,\n            in_channels=embedding_dimension,\n            out_channels=embedding_dimension // 2,\n            kernel_size=2,\n            stride=2,\n            padding=0,\n            output_padding=0,\n            groups=1,\n            use_norm=False,\n            use_act=False,\n            bias=True,\n        )\n        self.model_conf_dict[\"layer3\"][\"out\"] = embedding_dimension // 2\n\n        layer_l4 = Identity()\n        layer_l5 = MaxPool2d(kernel_size=2, stride=2, padding=0)\n\n        simple_fpn_layers = nn.ModuleDict(\n            {\n                \"out_l2\": layer_l2,\n                \"out_l3\": layer_l3,\n                \"out_l4\": layer_l4,\n                \"out_l5\": layer_l5,\n            }\n        )\n\n        return simple_fpn_layers\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        if cls == VisionTransformer:\n            group = parser.add_argument_group(cls.__name__)\n            group.add_argument(\n                \"--model.classification.vit.mode\",\n                type=str,\n                default=\"base\",\n                choices=[\"tiny\", \"small\", \"base\", \"large\", \"huge\"],\n                help=\"ViT mode. Default is base.\",\n            )\n            group.add_argument(\n                \"--model.classification.vit.dropout\",\n                type=float,\n                default=0.0,\n                help=\"Dropout in Transformer layers. Defaults to 0.0.\",\n            )\n\n            group.add_argument(\n                \"--model.classification.vit.stochastic-dropout\",\n                type=float,\n                default=0.0,\n                help=\"Stochastic Dropout in Transformer layers. Defaults to 0.0.\",\n            )\n\n            group.add_argument(\n                \"--model.classification.vit.norm-layer\",\n                type=str,\n                default=\"layer_norm\",\n                help=\"Normalization layer to be used in Transformer layer. Defaults to LayerNorm.\",\n            )\n\n            group.add_argument(\n                \"--model.classification.vit.sinusoidal-pos-emb\",\n                action=\"store_true\",\n                default=False,\n                help=\"Use sinusoidal instead of learnable positional embedding. Defaults to False.\",\n            )\n            group.add_argument(\n                \"--model.classification.vit.no-cls-token\",\n                action=\"store_true\",\n                default=False,\n                help=\"Do not use classification token. Defaults to False.\",\n            )\n\n            group.add_argument(\n                \"--model.classification.vit.use-simple-fpn\",\n                action=\"store_true\",\n                default=False,\n                help=\"Add simple FPN for down-stream tasks (e.g., detection). Defaults to False.\",\n            )\n            group.add_argument(\n                \"--model.classification.vit.use-flash-attention\",\n                action=\"store_true\",\n                default=False,\n                help=\"Use Transformer layers with flash attention for efficiently computing scaled dot-product attention. Defaults to False.\",\n            )\n\n        return parser\n\n    def extract_patch_embeddings(self, x: Tensor) -> Tuple[Tensor, Tuple[int, int]]:\n        \"\"\"Extract patch embeddings from input image tensor.\n\n        Args:\n            x: Input image tensor of size [batch, image channels, height, width]\n\n        Returns:\n            A tensor containing patch embeddings. The size of the tensor is [batch, number of patches, embedding dim].\n        \"\"\"\n        # input is of shape [batch, image channels, height, width]. image channels is mostly 3 (for RGB images)\n        batch_size = x.shape[0]\n\n        # [batch, image channels, height, width] --> [batch, embedding dim, number of patches along height, number of patches along width]\n        patch_emb = self.patch_emb(x)\n        num_patches_height, num_patches_width = patch_emb.shape[-2:]\n\n        # [batch, embedding dim, number of patches along height, number of patches along width] --> [batch, embedding dim, number of patches]\n        patch_emb = patch_emb.flatten(2)\n        # [batch, embedding dim, number of patches] --> [batch, number of patches, embedding dim]\n        patch_emb = patch_emb.transpose(1, 2).contiguous()\n\n        num_patches = patch_emb.shape[1]\n        # we resize the positional encodings dynamically.\n        pos_emb = self.pos_embed(num_patches).to(patch_emb.dtype)\n\n        # add positional encodings\n        patch_emb = pos_emb + patch_emb\n\n        # add classification token\n        if self.cls_token is not None:\n            # [1, 1, embedding dim] --> [batch, 1, embedding dim]\n            cls_tokens = self.cls_token.expand(batch_size, -1, -1)\n            # Concat([batch, 1, embedding dim], [batch, number of patches, embedding dim]) --> [batch, number of patches + 1, embedding dim]\n            patch_emb = torch.cat((cls_tokens, patch_emb), dim=1)\n\n        # dropout\n        patch_emb = self.emb_dropout(patch_emb)\n        return patch_emb, (num_patches_height, num_patches_width)\n\n    def _features_from_transformer(self, x: Tensor) -> Tuple[Tensor, Tuple[int, int]]:\n        \"\"\"Helper function to extract patch embeddings and learn inter-patch representations using transformers.\n\n        Args:\n            x: Input image tensor of size [batch, image channels, Height, Width]\n\n        Returns:\n            A tensor containing contextualized patch embeddings.The size of the tensor is [batch, number of patches, embedding dimension]. It also\n            returns a tuple containing the number of patches along height and width dimensions.\n        \"\"\"\n        x, (n_h, n_w) = self.extract_patch_embeddings(x)\n        x = self.transformer(x)\n        x = self.post_transformer_norm(x)\n\n        return x, (n_h, n_w)\n\n    def extract_features(\n        self, x: Tensor, return_image_embeddings: bool = False\n    ) -> Tuple[Tensor, Optional[Tensor]]:\n        \"\"\"Helper function for extraction features.\n\n        Args:\n            x: Input image tensor of size [batch, image channels, height, width].\n            return_image_embeddings: When enabled, image embeddings are also returned.\n\n        Returns:\n            If 'return_image_embeddings=True', then both CLS_TOKEN and image embeddings are returned. Otherwise,\n            CLS_TOKEN embedding and None are returned.\n\n            The shape of CLS_TOKEN embedding is [batch, embedding dim] while the shape of image embeddings is\n            [batch, embedding dim, num. patches height, num. patches width].\n        \"\"\"\n\n        # [Batch, image channels, height, Width] --> [batch, CLS_TOKEN + number of patches, embedding dim]\n        x, (n_h, n_w) = self._features_from_transformer(x)\n\n        if self.cls_token is not None:\n            # [batch, CLS_TOKEN + num. patches, embedding dim] --> [batch, embedding dim], [batch, number of patches, embedding dim]\n            cls_embedding, image_embedding = torch.split(\n                x, split_size_or_sections=[1, x.shape[1] - 1], dim=1\n            )\n            cls_embedding = cls_embedding.squeeze(1)\n        else:\n            # [batch, number of patches, embedding dim] -> [batch, embedding dim]\n            cls_embedding = torch.mean(x, dim=1)\n            # [batch, number of patches, embedding dim]\n            image_embedding = x\n\n        if return_image_embeddings:\n            # reshape image embedding to 4-D tensor\n            # [batch, number of patches, embedding dim] --> [batch, embedding dim, number of patches]\n            image_embedding = image_embedding.transpose(1, 2).contiguous()\n            # [batch, embedding dim, number of patches] --> [batch, embedding dim, number of patches along height, number of patches along width]\n            image_embedding = image_embedding.reshape(\n                image_embedding.shape[0], -1, n_h, n_w\n            )\n\n            return cls_embedding, image_embedding\n        else:\n            return cls_embedding, None\n\n    def forward_classifier(\n        self, x: Tensor, return_image_embeddings: bool = False\n    ) -> Tuple[Tensor, Optional[Tensor]]:\n        \"\"\"Forward function for classification tasks.\n\n        Args:\n            x: Input image tensor of size [batch, image channels, height, width].\n            return_image_embeddings: When enabled, image embeddings are also returned.\n\n        Returns:\n            The logits computed for CLS token are returned. If kwargs contain 'return_image_embeddings', then image embeddings\n            are also returned.\n\n            The shape of logits is [batch, number of classes] while the shape of image embeddings is\n            [batch, embedding dim, num. patches height, num. patches width].\n        \"\"\"\n        cls_embedding, image_embedding = self.extract_features(\n            x, return_image_embeddings\n        )\n        # classify based on CLS token\n        logits = self.classifier(cls_embedding)\n        return logits, image_embedding\n\n    def forward(\n        self, x: Tensor, return_image_embeddings: bool = False\n    ) -> Union[Tensor, Dict[str, Tensor]]:\n        \"\"\"Forward function for ViT.\n\n        Args:\n            x: Input image tensor of shape [Batch, 3, Height, Width].\n            return_image_embeddings: When enabled, image embeddings are also returned.\n\n        Returns:\n            The output of ViT model can be one of the following:\n            1. If range augmentation is enabled, then a dictionary is returned with following keys\n                'augmented_tensor': Contains the output after applying RangeAugment.\n                'logits': Logit tensor\n                'image_embeddings': Optionally tensor containing image embeddings\n            2. If range augment is not enabled and return_image_embeddings is enabled, then a\n               dictionary is returned with 'logits' and 'image_embeddings' keys.\n            3. A logit tensor is returned.\n        \"\"\"\n\n        if return_image_embeddings or self.neural_augmentor is not None:\n            out_dict = {\"augmented_tensor\": None}\n            if self.training and self.neural_augmentor is not None:\n                # neural augmentor is applied during training  only\n                x = self.neural_augmentor(x)\n                out_dict.update({\"augmented_tensor\": x})\n            logits, image_embedding = self.forward_classifier(\n                x, return_image_embeddings\n            )\n            out_dict.update({\"logits\": logits})\n            if image_embedding is not None:\n                out_dict.update({\"image_embeddings\": image_embedding})\n            return out_dict\n        else:\n            logits, _ = self.forward_classifier(x)\n            return logits\n\n    def extract_end_points_all(\n        self,\n        x: Tensor,\n        use_l5: Optional[bool] = True,\n        use_l5_exp: Optional[bool] = False,\n    ) -> Dict[str, Tensor]:\n        \"\"\"Extract feature maps from different spatial levels in the model.\n\n        This function is often used in down-stream applications (e.g., segmentation) where multi-scale features\n        are required for prediction.\n\n        Args:\n            x: Input image tensor of shape [batch, image channels, height, width].\n            use_l5: Extract features from spatial level 5.\n            use_l5_exp: Extract features from the expansion layer in level 5.\n\n        Returns:\n            A mapping containing the output at each spatial level. The output keys are 'out_l1', 'out_l2',\n            'out_l3', 'out_l4', 'out_l5', and 'out_l5_exp'.\n\n        ...note:\n            If 'use_l5_exp' is enabled, then features from expansion layer in level 5 are returned and 'out_l5' output\n            is set to None. Otherwise, 'out_l5_exp' is set to None.\n        \"\"\"\n        # this function is often used in down-stream applications (especially in segmentation and detection)\n        if self.cls_token:\n            logger.error(\"Please disable cls token for down-stream tasks\")\n\n        out_dict = {}\n        if self.training and self.neural_augmentor is not None:\n            x = self.neural_augmentor(x)\n            out_dict[\"augmented_tensor\"] = x\n\n        cls_emb, x = self.extract_features(x, return_image_embeddings=True)\n        out_dict[\"cls_embedding\"] = cls_emb\n\n        if self.simple_fpn is not None:\n            # build simple FPN, as suggested in https://arxiv.org/abs/2203.16527\n            for k, extra_layer in self.simple_fpn.items():\n                out_dict[k] = extra_layer(x)\n        else:\n            # ViT does not have hierarchical structure by default.\n            # Therefore, we set first four levels to None\n            out_dict[\"out_l1\"] = None\n            out_dict[\"out_l2\"] = None\n            out_dict[\"out_l3\"] = None\n            out_dict[\"out_l4\"] = None\n            if use_l5_exp:\n                out_dict[\"out_l5\"] = None\n                out_dict[\"out_l5_exp\"] = x\n            else:\n                out_dict[\"out_l5\"] = x\n                out_dict[\"out_l5_exp\"] = None\n        return out_dict\n\n    def get_activation_checkpoint_submodule_class(self) -> Callable:\n        \"\"\"Returns the activation checkpoint module class.\n\n        For ViT, the activation checkpoint module class is TransformerEncoder or FlashTransformerEncoder.\n        \"\"\"\n        return FlashTransformerEncoder if self.use_flash_attn else TransformerEncoder\n\n    def get_fsdp_wrap_policy(\n        self,\n    ) -> Optional[Callable[[torch.nn.Module, bool, int], bool]]:\n        \"\"\"Returns the FSDP wrapping policy.\n\n        For ViT, we use the Transformer's wrapping policy.\n        \"\"\"\n        vit_auto_wrap_policy = functools.partial(\n            transformer_auto_wrap_policy,\n            transformer_layer_cls={\n                FlashTransformerEncoder if self.use_flash_attn else TransformerEncoder\n            },\n        )\n        return vit_auto_wrap_policy\n"
  },
  {
    "path": "corenet/modeling/models/detection/__init__.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom collections import namedtuple\n\nDetectionPredTuple = namedtuple(\n    typename=\"DetectionPredTuple\",\n    field_names=(\"labels\", \"scores\", \"boxes\", \"masks\"),\n    defaults=(None, None, None, None),\n)\n"
  },
  {
    "path": "corenet/modeling/models/detection/base_detection.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nfrom typing import Dict\n\nfrom torch import nn\n\nfrom corenet.modeling.misc.init_utils import initialize_weights\nfrom corenet.modeling.models import MODEL_REGISTRY, BaseAnyNNModel, get_model\nfrom corenet.modeling.models.classification.base_image_encoder import BaseImageEncoder\nfrom corenet.utils import logger\n\n\n@MODEL_REGISTRY.register(name=\"__base__\", type=\"detection\")\nclass BaseDetection(BaseAnyNNModel):\n    \"\"\"Base class for the task of object detection\n\n    Args:\n        opts: Command-line arguments\n        encoder: Image-encoder model (e.g., MobileNet or ResNet)\n    \"\"\"\n\n    def __init__(\n        self, opts: argparse.Namespace, encoder: BaseImageEncoder, *args, **kwargs\n    ) -> None:\n        super().__init__(opts, *args, **kwargs)\n        assert isinstance(encoder, BaseImageEncoder)\n        self.encoder: BaseImageEncoder = encoder\n        self.n_detection_classes = getattr(opts, \"model.detection.n_classes\")\n\n        enc_conf = self.encoder.model_conf_dict\n\n        enc_ch_l5_out_proj = check_feature_map_output_channels(\n            enc_conf, \"exp_before_cls\"\n        )\n        enc_ch_l5_out = check_feature_map_output_channels(enc_conf, \"layer5\")\n        enc_ch_l4_out = check_feature_map_output_channels(enc_conf, \"layer4\")\n        enc_ch_l3_out = check_feature_map_output_channels(enc_conf, \"layer3\")\n        enc_ch_l2_out = check_feature_map_output_channels(enc_conf, \"layer2\")\n        enc_ch_l1_out = check_feature_map_output_channels(enc_conf, \"layer1\")\n\n        self.enc_l5_channels = enc_ch_l5_out\n        self.enc_l5_channels_exp = enc_ch_l5_out_proj\n        self.enc_l4_channels = enc_ch_l4_out\n        self.enc_l3_channels = enc_ch_l3_out\n        self.enc_l2_channels = enc_ch_l2_out\n        self.enc_l1_channels = enc_ch_l1_out\n\n        self.opts = opts\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        \"\"\"Add model specific arguments\"\"\"\n        if cls != BaseDetection:\n            # Don't re-register arguments in subclasses that don't override `add_arguments()`.\n            return parser\n\n        group = parser.add_argument_group(cls.__name__)\n\n        group.add_argument(\n            \"--model.detection.name\",\n            type=str,\n            default=None,\n            help=\"Detection model name\",\n        )\n        group.add_argument(\n            \"--model.detection.n-classes\",\n            type=int,\n            default=80,\n            help=\"Number of classes in the dataset. Defaults to 80.\",\n        )\n        group.add_argument(\n            \"--model.detection.pretrained\",\n            type=str,\n            default=None,\n            help=\"Path of the pretrained detection model. Defaults to None.\",\n        )\n        group.add_argument(\n            \"--model.detection.output-stride\",\n            type=int,\n            default=None,\n            help=\"Output stride of the classification network. Defaults to None.\",\n        )\n        group.add_argument(\n            \"--model.detection.replace-stride-with-dilation\",\n            action=\"store_true\",\n            default=False,\n            help=\"Replace stride with dilation\",\n        )\n        group.add_argument(\n            \"--model.detection.freeze-batch-norm\",\n            action=\"store_true\",\n            default=False,\n            help=\"Freeze batch norm layers in detection model. Defaults to False.\",\n        )\n\n        return parser\n\n    @staticmethod\n    def reset_layer_parameters(layer: nn.Module, opts: argparse.Namespace) -> None:\n        \"\"\"Initialize weights of a given layer\"\"\"\n        initialize_weights(opts=opts, modules=layer.modules())\n\n    @classmethod\n    def build_model(cls, opts: argparse.Namespace, *args, **kwargs) -> BaseAnyNNModel:\n        output_stride = getattr(opts, \"model.detection.output_stride\", None)\n\n        image_encoder = get_model(\n            opts=opts,\n            category=\"classification\",\n            output_stride=output_stride,\n            *args,\n            **kwargs\n        )\n\n        detection_model = cls(opts=opts, encoder=image_encoder, *args, **kwargs)\n\n        if getattr(opts, \"model.detection.freeze_batch_norm\"):\n            cls.freeze_norm_layers(opts, model=detection_model)\n        return detection_model\n\n\ndef check_feature_map_output_channels(config: Dict, layer_name: str) -> int:\n    enc_ch_l: Dict = config.get(layer_name, None)\n    if enc_ch_l is None or not enc_ch_l:\n        logger.error(\n            \"Encoder does not define input-output mapping for {}: Got: {}\".format(\n                layer_name, config\n            )\n        )\n\n    enc_ch_l_out = enc_ch_l.get(\"out\", None)\n    if enc_ch_l_out is None or not enc_ch_l_out:\n        logger.error(\n            \"Output channels are not defined in {} of the encoder. Got: {}\".format(\n                layer_name, enc_ch_l\n            )\n        )\n\n    return enc_ch_l_out\n"
  },
  {
    "path": "corenet/modeling/models/detection/mask_rcnn.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nfrom typing import Any, Callable, Dict, List, Optional, Tuple, Union\n\nimport torch\nfrom torch import Tensor, nn\nfrom torch.nn import functional as F\n\n# Faster and Mask-RCNN related imports\nfrom torchvision.models.detection.anchor_utils import AnchorGenerator\nfrom torchvision.models.detection.mask_rcnn import MaskRCNN\nfrom torchvision.ops import MultiScaleRoIAlign\n\nfrom corenet.modeling import parameter_list\nfrom corenet.modeling.layers import ConvLayer2d, Identity\nfrom corenet.modeling.models import MODEL_REGISTRY\nfrom corenet.modeling.models.classification.base_image_encoder import BaseImageEncoder\nfrom corenet.modeling.models.detection import DetectionPredTuple\nfrom corenet.modeling.models.detection.base_detection import BaseDetection\nfrom corenet.modeling.models.detection.utils.rcnn_utils import (\n    FastRCNNConvFCHead,\n    FastRCNNPredictor,\n    MaskRCNNHeads,\n    MaskRCNNPredictor,\n    RPNHead,\n)\nfrom corenet.utils import logger\n\n\nclass MaskRCNNEncoder(nn.Module):\n    def __init__(\n        self,\n        opts: argparse.Namespace,\n        encoder: BaseImageEncoder,\n        output_strides: List,\n        projection_channels: int,\n        encoder_lr_multiplier: Optional[float] = 1.0,\n        *args,\n        **kwargs,\n    ) -> None:\n        use_fpn = not getattr(opts, \"model.detection.mask_rcnn.disable_fpn\", False)\n        super().__init__()\n        # set classifier and exp layers to Identity\n        encoder.conv_1x1_exp = Identity()\n        encoder.classifier = Identity()\n\n        # add projection layers that projects encoder feature maps to `projection_channels`\n        backbone_proj_layers = nn.ModuleDict()\n        self.backbone_output_strides = sorted(\n            list({4, 8, 16, 32}.intersection(output_strides))\n        )\n        model_config = encoder.model_conf_dict\n        self.backbone_map = {}\n        fpn_proj_layers = nn.ModuleDict() if use_fpn else None\n        for os in self.backbone_output_strides:\n            if os == 4:\n                in_channels = model_config[\"layer2\"][\"out\"]\n                backbone_os_str = \"out_l2\"\n            elif os == 8:\n                in_channels = model_config[\"layer3\"][\"out\"]\n                backbone_os_str = \"out_l3\"\n            elif os == 16:\n                in_channels = model_config[\"layer4\"][\"out\"]\n                backbone_os_str = \"out_l4\"\n            elif os == 32:\n                in_channels = model_config[\"layer5\"][\"out\"]\n                backbone_os_str = \"out_l5\"\n            else:\n                raise NotImplementedError\n\n            conv_layer = ConvLayer2d(\n                opts=opts,\n                in_channels=in_channels,\n                out_channels=projection_channels,\n                kernel_size=1,\n                use_norm=True,\n                use_act=False,\n            )\n            backbone_proj_layers.add_module(str(os), conv_layer)\n            self.backbone_map[os] = backbone_os_str\n\n            if use_fpn:\n                fpn_layer = ConvLayer2d(\n                    opts=opts,\n                    in_channels=projection_channels,\n                    out_channels=projection_channels,\n                    kernel_size=3,\n                    use_norm=True,\n                    use_act=False,\n                )\n                fpn_proj_layers.add_module(str(os), fpn_layer)\n\n        # add extra layers if desired output stride is greater than 32.\n        extra_layers = nn.ModuleDict()\n        extra_layer_os = sorted(\n            list((set(self.backbone_output_strides) ^ set(output_strides)))\n        )\n        for os in extra_layer_os:\n            conv_layer = ConvLayer2d(\n                opts=opts,\n                in_channels=projection_channels,\n                out_channels=projection_channels,\n                kernel_size=3,\n                stride=2,\n                use_norm=True,\n                use_act=False,\n            )\n            extra_layers.add_module(str(os), conv_layer)\n        self.encoder = encoder\n        self.backbone_proj_layers = backbone_proj_layers\n        self.fpn_proj_layers = fpn_proj_layers\n        self.use_fpn = use_fpn\n        self.extra_layers = extra_layers\n        self.out_channels = projection_channels\n        self.augmented_tensor = None\n        self.encoder_lr_multiplier = encoder_lr_multiplier\n\n    def get_augmented_tensor(self) -> Tensor:\n        return self.augmented_tensor\n\n    def forward(self, x: Tensor) -> Dict[str, Tensor]:\n        # extract features from the backbone network\n        enc_end_points: Dict = self.encoder.extract_end_points_all(x)\n\n        self.augmented_tensor = enc_end_points.pop(\"augmented_tensor\", None)\n\n        outputs_backbone: Dict = {}\n        # project backbone features\n        for os, enc_key_name in self.backbone_map.items():\n            x_proj = self.backbone_proj_layers[str(os)](\n                enc_end_points.pop(enc_key_name)\n            )\n            outputs_backbone[f\"{os}\"] = x_proj\n\n        if self.fpn_proj_layers:\n            # FPN\n            last_os = self.backbone_output_strides[-1]\n            prev_fm = outputs_backbone[f\"{last_os}\"]\n            prev_fm = self.fpn_proj_layers[f\"{last_os}\"](prev_fm)\n            for os in self.backbone_output_strides[:-1][::-1]:\n                curr_fm = outputs_backbone[f\"{os}\"]\n                feat_shape = curr_fm.shape[-2:]\n                inner_top_down = F.interpolate(prev_fm, size=feat_shape, mode=\"nearest\")\n                prev_fm = self.fpn_proj_layers[f\"{os}\"](curr_fm + inner_top_down)\n                outputs_backbone[f\"{os}\"] = prev_fm\n\n        if self.extra_layers:\n            prev_os = self.backbone_output_strides[-1]\n            for os, extra_layer in self.extra_layers.items():\n                x_proj = extra_layer(outputs_backbone[f\"{prev_os}\"])\n                outputs_backbone[f\"{os}\"] = x_proj\n                prev_os = os\n        return outputs_backbone\n\n    def get_trainable_parameters(\n        self,\n        weight_decay: float = 0.0,\n        no_decay_bn_filter_bias: bool = False,\n        *args,\n        **kwargs,\n    ) -> Tuple[List, List]:\n        # We need to pop the module name. Otherwise, we may pass two\n        # variables with the same name to get_trainable_parameters function\n        module_name = kwargs.pop(\"module_name\", \"\")\n\n        \"\"\"Returns a list of trainable parameters\"\"\"\n        all_params = []\n        all_params_lr = []\n\n        # encoder parameters\n        if (\n            hasattr(self.encoder, \"enable_layer_wise_lr_decay\")\n            and self.encoder.enable_layer_wise_lr_decay\n        ):\n            (\n                backbone_param_list,\n                backbone_lr_list,\n            ) = self.encoder.get_trainable_parameters(\n                weight_decay=weight_decay,\n                no_decay_bn_filter_bias=no_decay_bn_filter_bias,\n                module_name=module_name + \"encoder.\",\n                *args,\n                **kwargs,\n            )\n\n            all_params.extend(backbone_param_list)\n\n            # Scale encoder LR, if applicable\n            if self.encoder_lr_multiplier != 1.0:\n                backbone_lr_list = [\n                    (lr * self.encoder_lr_multiplier) for lr in backbone_lr_list\n                ]\n\n            all_params_lr.extend(backbone_lr_list)\n        else:\n            backbone_param_list = parameter_list(\n                named_parameters=self.encoder.named_parameters,\n                weight_decay=weight_decay,\n                no_decay_bn_filter_bias=no_decay_bn_filter_bias,\n                module_name=module_name + \"encoder.\",\n                *args,\n                **kwargs,\n            )\n\n            all_params.extend(backbone_param_list)\n\n            all_params_lr.extend(\n                [self.encoder_lr_multiplier] * len(backbone_param_list)\n            )\n\n        if self.backbone_proj_layers:\n            # projection layer parameters\n            projection_param_list = parameter_list(\n                named_parameters=self.backbone_proj_layers.named_parameters,\n                weight_decay=weight_decay,\n                no_decay_bn_filter_bias=no_decay_bn_filter_bias,\n                module_name=module_name + \"backbone_proj_layers.\",\n                *args,\n                **kwargs,\n            )\n\n            all_params.extend(projection_param_list)\n\n            all_params_lr.extend([1.0] * len(projection_param_list))\n\n        if self.fpn_proj_layers:\n            # projection layer parameters\n            fpn_projection_param_list = parameter_list(\n                named_parameters=self.fpn_proj_layers.named_parameters,\n                weight_decay=weight_decay,\n                no_decay_bn_filter_bias=no_decay_bn_filter_bias,\n                module_name=module_name + \"fpn_proj_layers.\",\n                *args,\n                **kwargs,\n            )\n\n            all_params.extend(fpn_projection_param_list)\n\n            all_params_lr.extend([1.0] * len(fpn_projection_param_list))\n\n        if self.extra_layers:\n            # extra layer parameters\n            extra_layer_param_list = parameter_list(\n                named_parameters=self.extra_layers.named_parameters,\n                weight_decay=weight_decay,\n                no_decay_bn_filter_bias=no_decay_bn_filter_bias,\n                module_name=module_name + \"extra_layers.\",\n                *args,\n                **kwargs,\n            )\n\n            all_params.extend(extra_layer_param_list)\n\n            all_params_lr.extend([1.0] * len(extra_layer_param_list))\n        return all_params, all_params_lr\n\n    def get_activation_checkpoint_submodule_class(self) -> Callable:\n        \"\"\"Returns the activation checkpointing module in the encoder.\"\"\"\n        return self.encoder.get_activation_checkpoint_submodule_class()\n\n\n@MODEL_REGISTRY.register(name=\"mask_rcnn\", type=\"detection\")\nclass MaskRCNNDetector(BaseDetection):\n    \"\"\"This class implements a `Mask RCNN style object detector <https://arxiv.org/abs/1703.06870>`\n\n    Args:\n        opts: command-line arguments\n        encoder (BaseImageEncoder): Encoder network (e.g., ResNet or MobileViT)\n    \"\"\"\n\n    def __init__(self, opts, encoder: BaseImageEncoder, *args, **kwargs) -> None:\n        super().__init__(opts, encoder, *args, **kwargs)\n        default_norm = self.set_norm_layer_opts()\n\n        output_strides = getattr(\n            opts, \"model.detection.mask_rcnn.output_strides\", [4, 8, 16, 32, 64]\n        )\n        if len(output_strides) == 0:\n            logger.error(\n                \"Please specify output strides for extracting backbone feature maps \"\n                \"using --model.detection.mask-rcnn.output-strides\"\n            )\n        output_strides = sorted(output_strides)\n        projection_channels = getattr(\n            opts, \"model.detection.mask_rcnn.backbone_projection_channels\", 256\n        )\n\n        # anchor sizes and aspect ratios\n        anchor_sizes = getattr(\n            opts, \"model.detection.mask_rcnn.anchor_sizes\", [32, 64, 128, 256, 512]\n        )\n        # convert to a tuples\n        if anchor_sizes is None:\n            logger.error(\"Anchor sizes can't be None\")\n        elif len(anchor_sizes) != len(output_strides):\n            logger.error(\n                \"Number of anchor sizes should be the same as the output stride. Got: {} and {}\".format(\n                    anchor_sizes, output_strides\n                )\n            )\n        elif isinstance(anchor_sizes, List) and isinstance(anchor_sizes[0], List):\n            # anchor sizes is a list of list. Convert to tuple\n            anchor_sizes = tuple([tuple(a_size) for a_size in anchor_sizes])\n        elif isinstance(anchor_sizes, List) and isinstance(anchor_sizes[0], int):\n            # anchor sizes is a list of integers. Convert to tuple\n            anchor_sizes = tuple([(a_size,) for a_size in anchor_sizes])\n        else:\n            raise NotImplementedError\n\n        aspect_ratios = getattr(\n            opts, \"model.detection.mask_rcnn.aspect_ratio\", [0.5, 1.0, 2.0]\n        )  # ((0.5, 1.0, 2.0),) * len(anchor_sizes)\n        if aspect_ratios is None:\n            logger.error(\"Aspect ratios can't be None\")\n        elif isinstance(aspect_ratios, (int, float)):\n            aspect_ratios = ((aspect_ratios,),) * len(anchor_sizes)\n        elif isinstance(aspect_ratios, List):\n            aspect_ratios = (tuple(aspect_ratios),) * len(anchor_sizes)\n        else:\n            raise NotImplementedError\n\n        # feature map size for the bbox head\n        box_fm_size = getattr(opts, \"model.detection.mask_rcnn.bbox_head_fm_size\", 7)\n        mask_fm_size = getattr(opts, \"model.detection.mask_rcnn.mask_head_fm_size\", 14)\n\n        # set-up the backbone\n        backbone_lr_multiplier = getattr(\n            opts, \"model.detection.mask_rcnn.backbone_lr_multiplier\"\n        )\n        backbone = MaskRCNNEncoder(\n            opts,\n            encoder=encoder,\n            output_strides=output_strides,\n            projection_channels=projection_channels,\n            encoder_lr_multiplier=backbone_lr_multiplier,\n        )\n\n        # create RPN anchor generator\n        rpn_anchor_generator = AnchorGenerator(\n            sizes=anchor_sizes, aspect_ratios=aspect_ratios\n        )\n\n        # create RPN Head\n        rpn_head = RPNHead(\n            opts=opts,\n            in_channels=projection_channels,\n            num_anchors=rpn_anchor_generator.num_anchors_per_location()[0],\n            conv_depth=2,\n        )\n\n        # box related parameters\n        representation_size = getattr(\n            opts, \"model.detection.mask_rcnn.representation_size\", 1024\n        )\n        output_strides_str = [str(os) for os in output_strides]\n        box_roi_pool = MultiScaleRoIAlign(\n            featmap_names=output_strides_str, output_size=box_fm_size, sampling_ratio=2\n        )\n\n        box_fm_size_conv_layer = getattr(\n            opts, \"model.detection.mask_rcnn.box_fm_size_conv_layer\", [256] * 4\n        )\n        box_head = FastRCNNConvFCHead(\n            opts=opts,\n            input_size=(projection_channels, box_fm_size, box_fm_size),\n            conv_layers=box_fm_size_conv_layer,\n            fc_layers=[representation_size],\n        )\n\n        box_predictor = FastRCNNPredictor(\n            in_channels=representation_size, num_classes=self.n_detection_classes\n        )\n\n        # mask related parameters\n        mask_fm_size_conv_layer = getattr(\n            opts, \"model.detection.mask_rcnn.mask_fm_size_conv_layer\", [256] * 4\n        )\n        mask_dilation = getattr(opts, \"model.detection.mask_rcnn.mask_dilation\", 1)\n        mask_roi_pool = MultiScaleRoIAlign(\n            featmap_names=output_strides_str, output_size=mask_fm_size, sampling_ratio=2\n        )\n\n        mask_dilation = mask_dilation\n        mask_head = MaskRCNNHeads(\n            opts=opts,\n            in_channels=projection_channels,\n            layers=mask_fm_size_conv_layer,\n            dilation=mask_dilation,\n        )\n\n        mask_predictor = MaskRCNNPredictor(\n            opts=opts,\n            in_channels=mask_fm_size_conv_layer[-1],\n            dim_reduced=256,\n            num_classes=self.n_detection_classes,\n        )\n\n        # RPN and box detection related hyper-parameters\n        rpn_pre_nms_top_n_train = getattr(\n            opts, \"model.detection.mask_rcnn.rpn_pre_nms_top_n_train\", 2000\n        )\n        rpn_pre_nms_top_n_test = getattr(\n            opts, \"model.detection.mask_rcnn.rpn_pre_nms_top_n_test\", 1000\n        )\n        rpn_post_nms_top_n_train = getattr(\n            opts, \"model.detection.mask_rcnn.rpn_post_nms_top_n_train\", 2000\n        )\n        rpn_post_nms_top_n_test = getattr(\n            opts, \"model.detection.mask_rcnn.rpn_post_nms_top_n_test\", 1000\n        )\n        rpn_nms_thresh = getattr(opts, \"model.detection.mask_rcnn.rpn_nms_thresh\", 0.7)\n        rpn_fg_iou_thresh = getattr(\n            opts, \"model.detection.mask_rcnn.rpn_fg_iou_thresh\", 0.7\n        )\n        rpn_bg_iou_thresh = getattr(\n            opts, \"model.detection.mask_rcnn.rpn_bg_iou_thresh\", 0.3\n        )\n        rpn_batch_size_per_image = getattr(\n            opts, \"model.detection.mask_rcnn.rpn_batch_size_per_image\", 256\n        )\n        rpn_positive_fraction = getattr(\n            opts, \"model.detection.mask_rcnn.rpn_positive_fraction\", 0.5\n        )\n        rpn_score_thresh = getattr(\n            opts, \"model.detection.mask_rcnn.rpn_score_thresh\", 0.0\n        )\n\n        box_score_thresh = getattr(\n            opts, \"model.detection.mask_rcnn.box_score_thresh\", 0.05\n        )\n        box_nms_thresh = getattr(opts, \"model.detection.mask_rcnn.box_nms_thresh\", 0.5)\n        box_detections_per_img = getattr(\n            opts, \"model.detection.mask_rcnn.box_detections_per_img\", 100\n        )\n        box_fg_iou_thresh = getattr(\n            opts, \"model.detection.mask_rcnn.box_fg_iou_thresh\", 0.5\n        )\n        box_bg_iou_thresh = getattr(\n            opts, \"model.detection.mask_rcnn.box_bg_iou_thresh\", 0.5\n        )\n        box_batch_size_per_image = getattr(\n            opts, \"model.detection.mask_rcnn.box_batch_size_per_image\", 512\n        )\n        box_positive_fraction = getattr(\n            opts, \"model.detection.mask_rcnn.box_positive_fraction\", 0.25\n        )\n\n        # kwargs = {\"_skip_resize\": True}\n        self.model = MaskRCNN(\n            backbone=backbone,\n            # we don't use mean-std normalization\n            image_mean=[0.0] * 3,\n            image_std=[1.0] * 3,\n            # RPN parameters\n            rpn_anchor_generator=rpn_anchor_generator,\n            rpn_head=rpn_head,\n            rpn_pre_nms_top_n_train=rpn_pre_nms_top_n_train,\n            rpn_pre_nms_top_n_test=rpn_pre_nms_top_n_test,\n            rpn_post_nms_top_n_train=rpn_post_nms_top_n_train,\n            rpn_post_nms_top_n_test=rpn_post_nms_top_n_test,\n            rpn_nms_thresh=rpn_nms_thresh,\n            rpn_fg_iou_thresh=rpn_fg_iou_thresh,\n            rpn_bg_iou_thresh=rpn_bg_iou_thresh,\n            rpn_batch_size_per_image=rpn_batch_size_per_image,\n            rpn_positive_fraction=rpn_positive_fraction,\n            rpn_score_thresh=rpn_score_thresh,\n            # Box parameters\n            box_roi_pool=box_roi_pool,\n            box_head=box_head,\n            box_score_thresh=box_score_thresh,\n            box_nms_thresh=box_nms_thresh,\n            box_detections_per_img=box_detections_per_img,\n            box_fg_iou_thresh=box_fg_iou_thresh,\n            box_bg_iou_thresh=box_bg_iou_thresh,\n            box_batch_size_per_image=box_batch_size_per_image,\n            box_positive_fraction=box_positive_fraction,\n            bbox_reg_weights=None,\n            box_predictor=box_predictor,\n            # Mask parameters\n            mask_roi_pool=mask_roi_pool,\n            mask_head=mask_head,\n            mask_predictor=mask_predictor,\n            # **kwargs\n        )\n\n        del self.encoder\n\n        self.reset_norm_layer_opts(default_norm=default_norm)\n        self.update_layer_norm_eps()\n\n    def update_layer_norm_eps(self):\n        for m in self.modules():\n            if isinstance(m, nn.LayerNorm):\n                m.eps = 1e-6\n\n    def set_norm_layer_opts(self):\n        mask_rcnn_norm_layer = getattr(\n            self.opts, \"model.detection.mask_rcnn.norm_layer\", None\n        )\n        if mask_rcnn_norm_layer is None:\n            logger.error(\"Please specify norm layer\")\n\n        default_norm = getattr(self.opts, \"model.normalization.name\", None)\n        setattr(self.opts, \"model.normalization.name\", mask_rcnn_norm_layer)\n        return default_norm\n\n    def reset_norm_layer_opts(self, default_norm):\n        setattr(self.opts, \"model.normalization.name\", default_norm)\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        \"\"\"Add model specific arguments\"\"\"\n        group = parser.add_argument_group(cls.__name__)\n        group.add_argument(\n            \"--model.detection.mask-rcnn.backbone-projection-channels\",\n            type=int,\n            default=256,\n            help=\"Projection channels for the encoder in Mask-RCNN\",\n        )\n\n        group.add_argument(\n            \"--model.detection.mask-rcnn.backbone-lr-multiplier\",\n            type=float,\n            default=1.0,\n            help=\"LR multiplier for MASK RCNN head\",\n        )\n\n        group.add_argument(\n            \"--model.detection.mask-rcnn.output-strides\",\n            type=int,\n            nargs=\"+\",\n            default=[4, 8, 16, 32, 64],\n            help=\"Extract backbone feature maps from these output strides. \"\n            \"If output stride is greater than 32, extra layers are added.\",\n        )\n        group.add_argument(\n            \"--model.detection.mask-rcnn.anchor-sizes\",\n            type=int,\n            nargs=\"+\",\n            action=\"append\",\n            default=[32, 64, 128, 256, 512],\n            help=\"Anchor sizes at each output stride\",\n        )\n        group.add_argument(\n            \"--model.detection.mask-rcnn.aspect-ratio\",\n            type=float,\n            nargs=\"+\",\n            default=[0.5, 1.0, 2.0],\n            help=\"Aspect ratios. These are the same for all feature maps\",\n        )\n\n        group.add_argument(\n            \"--model.detection.mask-rcnn.bbox-head-fm-size\",\n            type=int,\n            default=7,\n            help=\"Feature map size for the box head\",\n        )\n        group.add_argument(\n            \"--model.detection.mask-rcnn.mask-head-fm-size\",\n            type=int,\n            default=14,\n            help=\"Feature map size for the max head\",\n        )\n        group.add_argument(\n            \"--model.detection.mask-rcnn.representation-size\",\n            type=int,\n            default=1024,\n            help=\"Size of the intermediate representation in Mask RCNN\",\n        )\n        # box_fm_size_conv_layer = getattr(opts, \"\", [256] * 4)\n        group.add_argument(\n            \"--model.detection.mask-rcnn.box-fm-size-conv-layer\",\n            type=int,\n            nargs=\"+\",\n            default=[256] * 4,\n            help=\"Feature dim of each Convolution layer in the Faster RCNN head. Defaults to [256, 256, 256, 256]\",\n        )\n        group.add_argument(\n            \"--model.detection.mask-rcnn.mask-fm-size-conv-layer\",\n            type=int,\n            nargs=\"+\",\n            default=[256] * 4,\n            help=\"Feature dim of each Convolution layer in the Mask RCNN head. Defaults to [256, 256, 256, 256]\",\n        )\n        group.add_argument(\n            \"--model.detection.mask-rcnn.mask-dilation\",\n            type=int,\n            default=1,\n            help=\"Dilation rate in Mask RCNN head. Defaults to 1\",\n        )\n\n        group.add_argument(\n            \"--model.detection.mask-rcnn.rpn-pre-nms-top-n-train\",\n            type=int,\n            default=2000,\n            help=\"Number of proposals to keep before applying NMS during training\",\n        )\n\n        group.add_argument(\n            \"--model.detection.mask-rcnn.rpn-pre-nms-top-n-test\",\n            type=int,\n            default=1000,\n            help=\"Number of proposals to keep before applying NMS during test\",\n        )\n\n        group.add_argument(\n            \"--model.detection.mask-rcnn.rpn-post-nms-top-n-train\",\n            type=int,\n            default=2000,\n            help=\"Number of proposals to keep after applying NMS during training\",\n        )\n\n        group.add_argument(\n            \"--model.detection.mask-rcnn.rpn-post-nms-top-n-test\",\n            type=int,\n            default=1000,\n            help=\"Number of proposals to keep after applying NMS during test\",\n        )\n\n        group.add_argument(\n            \"--model.detection.mask-rcnn.rpn-nms-thresh\",\n            type=float,\n            default=0.7,\n            help=\"NMS threshold used for postprocessing the RPN proposals\",\n        )\n\n        group.add_argument(\n            \"--model.detection.mask-rcnn.rpn-fg-iou-thresh\",\n            type=float,\n            default=0.7,\n            help=\"minimum IoU between the anchor and the GT box so that they can be \"\n            \"considered as positive during training of the RPN.\",\n        )\n\n        group.add_argument(\n            \"--model.detection.mask-rcnn.rpn-bg-iou-thresh\",\n            type=float,\n            default=0.7,\n            help=\"minimum IoU between the anchor and the GT box so that they can be \"\n            \"considered as negative during training of the RPN.\",\n        )\n\n        group.add_argument(\n            \"--model.detection.mask-rcnn.rpn-batch-size-per-image\",\n            type=int,\n            default=256,\n            help=\"Number of anchors that are sampled during training of the RPN for computing the loss\",\n        )\n\n        group.add_argument(\n            \"--model.detection.mask-rcnn.rpn-positive-fraction\",\n            type=float,\n            default=0.5,\n            help=\"Proportion of positive anchors in a mini-batch during training of the RPN\",\n        )\n\n        group.add_argument(\n            \"--model.detection.mask-rcnn.rpn-score-thresh\",\n            type=float,\n            default=0.0,\n            help=\"During inference, only return proposals with a classification score greater than rpn_score_thresh\",\n        )\n\n        #\n        group.add_argument(\n            \"--model.detection.mask-rcnn.box-score-thresh\",\n            type=float,\n            default=0.05,\n            help=\"During inference, only return proposals with a classification score greater than box_score_thresh\",\n        )\n\n        group.add_argument(\n            \"--model.detection.mask-rcnn.box-nms-thresh\",\n            type=float,\n            default=0.5,\n            help=\"During inference, NMS threshold for the prediction head.\",\n        )\n\n        group.add_argument(\n            \"--model.detection.mask-rcnn.box-detections-per-img\",\n            type=int,\n            default=100,\n            help=\"Maximum number of detections per image, for all classes\",\n        )\n\n        group.add_argument(\n            \"--model.detection.mask-rcnn.box-fg-iou-thresh\",\n            type=float,\n            default=0.5,\n            help=\"Minimum IoU between the proposals and the GT box so that they can be considered as \"\n            \"positive during training of the classification head\",\n        )\n\n        group.add_argument(\n            \"--model.detection.mask-rcnn.box-bg-iou-thresh\",\n            type=float,\n            default=0.5,\n            help=\"Minimum IoU between the proposals and the GT box so that they can be considered as \"\n            \"negative during training of the classification head\",\n        )\n\n        group.add_argument(\n            \"--model.detection.mask-rcnn.box-batch-size-per-image\",\n            type=int,\n            default=512,\n            help=\"Number of proposals that are sampled during training of the classification head\",\n        )\n\n        group.add_argument(\n            \"--model.detection.mask-rcnn.box-positive-fraction\",\n            type=float,\n            default=0.25,\n            help=\"Proportion of positive proposals in a mini-batch during training of the classification head\",\n        )\n\n        group.add_argument(\n            \"--model.detection.mask-rcnn.norm-layer\",\n            type=str,\n            default=None,\n            help=\"Mask RCNN Norm layer\",\n        )\n\n        group.add_argument(\n            \"--model.detection.mask-rcnn.disable-fpn\",\n            action=\"store_true\",\n            help=\"Do not use FPN\",\n        )\n        return parser\n\n    def reset_generalized_rcnn_transform(self, height, width):\n        self.model.transform.fixed_size = (width, height)\n\n    def get_trainable_parameters(\n        self,\n        weight_decay: float = 0.0,\n        no_decay_bn_filter_bias: bool = False,\n        *args,\n        **kwargs,\n    ) -> Tuple[List, List]:\n\n        all_params = []\n        all_params_lr = []\n\n        # backbone parameters\n        if hasattr(self.model.backbone, \"get_trainable_parameters\"):\n            (\n                backbone_params,\n                backbone_lrs,\n            ) = self.model.backbone.get_trainable_parameters(\n                weight_decay=weight_decay,\n                no_decay_bn_filter_bias=no_decay_bn_filter_bias,\n                module_name=\"model.backbone.\",\n            )\n            all_params.extend(backbone_params)\n            all_params_lr.extend(backbone_lrs)\n        else:\n            logger.error(\n                \"Backbone model must implement get_trainable_parameters function.\"\n            )\n\n        # rpn parameters\n        rpn_param_list = parameter_list(\n            named_parameters=self.model.rpn.named_parameters,\n            weight_decay=weight_decay,\n            no_decay_bn_filter_bias=no_decay_bn_filter_bias,\n            module_name=\"model.rpn.\",\n            *args,\n            **kwargs,\n        )\n\n        all_params.extend(rpn_param_list)\n        all_params_lr.extend([1.0] * len(rpn_param_list))\n\n        # ROI head params\n        roi_param_list = parameter_list(\n            named_parameters=self.model.roi_heads.named_parameters,\n            weight_decay=weight_decay,\n            no_decay_bn_filter_bias=no_decay_bn_filter_bias,\n            module_name=\"model.roi_heads.\",\n            *args,\n            **kwargs,\n        )\n\n        all_params.extend(roi_param_list)\n        all_params_lr.extend([1.0] * len(roi_param_list))\n\n        return all_params, all_params_lr\n\n    def forward(\n        self, x: Dict, *args, **kwargs\n    ) -> Union[Tuple[Tensor, ...], Tuple[Any, ...], Dict]:\n\n        if isinstance(x, Dict):\n            input_tensor = x[\"image\"]\n            input_labels = x[\"label\"]\n        else:\n            raise NotImplementedError(\n                \"Input to MaskRCNN should be a Dict of List of Tensors\"\n            )\n\n        assert isinstance(input_tensor, List)\n        assert isinstance(input_labels, List)\n\n        in_channels, in_height, in_width = input_tensor[0].shape\n\n        self.reset_generalized_rcnn_transform(height=in_height, width=in_width)\n\n        # The mask rcnn model expects labels, since it computes the loss.\n        outputs = self.model(input_tensor, targets=input_labels)\n\n        if not self.training:\n            detections = []\n            for i, elem in enumerate(outputs):\n                # We must normalize by image size, since this is what the downstream\n                # evaluator expects.\n                elem[\"boxes\"][:, 0::2] /= input_tensor[i].shape[2]\n                elem[\"boxes\"][:, 1::2] /= input_tensor[i].shape[1]\n\n                # predicted masks are in [N, 1, H, W] format\n                # for evaluation, we need them in [N, H, W] format\n                masks = elem[\"masks\"]\n                # [N, 1, H, W] --> [N, H, W]\n                masks = masks.squeeze(1)\n\n                elem_detections = DetectionPredTuple(\n                    labels=elem[\"labels\"],\n                    scores=elem[\"scores\"],\n                    boxes=elem[\"boxes\"],\n                    masks=masks,\n                )\n                detections.append(elem_detections)\n            return {\"detections\": detections}\n\n        if hasattr(self.model.backbone, \"get_augmented_tensor\"):\n            outputs[\"augmented_tensor\"] = self.model.backbone.get_augmented_tensor()\n\n        return outputs\n\n    @torch.no_grad()\n    def predict(self, x: Tensor, *args, **kwargs) -> DetectionPredTuple:\n        \"\"\"Predict the bounding boxes given an image tensor\"\"\"\n        assert isinstance(x, Tensor) and x.ndim == 4, \"Expected 4D tensor as an input\"\n\n        bsz, channels, in_height, in_width = x.shape\n        if bsz != 1:\n            logger.error(\n                \"Prediction is supported with a batch size of 1 in {}\".format(\n                    self.__class__.__name__\n                )\n            )\n\n        self.reset_generalized_rcnn_transform(height=in_height, width=in_width)\n\n        outputs = self.model(x)\n\n        if isinstance(outputs, List) and len(outputs) == 1:\n            outputs = outputs[0]\n\n        if isinstance(outputs, Dict) and {\"boxes\", \"labels\", \"scores\"}.issubset(\n            outputs.keys()\n        ):\n            # resize the boxes\n            outputs[\"boxes\"][:, 0::2] /= in_width\n            outputs[\"boxes\"][:, 1::2] /= in_height\n\n            # predicted masks are in [N, 1, H, W] format\n            # for evaluation, we need them in [N, H, W] format\n            masks = outputs[\"masks\"]\n            # [N, 1, H, W] --> [N, H, W]\n            masks = masks.squeeze(1)\n\n            detections = DetectionPredTuple(\n                labels=outputs[\"labels\"],\n                scores=outputs[\"scores\"],\n                boxes=outputs[\"boxes\"],\n                masks=masks,\n            )\n            return detections\n        else:\n            logger.error(\n                \"Output should be a dict with boxes, scores, and labels as keys. Got: {}\".format(\n                    type(outputs)\n                )\n            )\n\n    def dummy_input_and_label(self, batch_size: int) -> Dict:\n        \"\"\"Create dummy input and labels for CI/CD purposes.\"\"\"\n        img_channels = 3\n        height = 320\n        width = 320\n        n_classes = 80\n\n        # GT boxes have the same shape as anchors. So, we use anchors as GT boxes\n        n_boxes = 1\n\n        gt_boxes = torch.tensor([2, 20, 3, 40]).reshape(-1, 4).float()\n        gt_box_labels = torch.randint(\n            low=0,\n            high=n_classes,\n            size=(n_boxes,),\n            dtype=torch.long,\n        )\n\n        img_tensor = torch.randn(img_channels, height, width, dtype=torch.float)\n        labels = {\n            \"box_labels\": gt_box_labels,\n            \"box_coordinates\": gt_boxes,\n        }\n\n        return {\n            \"samples\": {\n                \"image\": [img_tensor] * batch_size,\n                \"label\": [\n                    {\n                        \"labels\": gt_box_labels,\n                        \"boxes\": gt_boxes,\n                        \"masks\": torch.zeros(1, height, width, dtype=torch.long),\n                    }\n                ]\n                * batch_size,\n            },\n            \"targets\": labels,\n        }\n\n    def get_activation_checkpoint_submodule_class(self) -> Callable:\n        \"\"\"Returns the activation checkpointing module class in the encoder.\"\"\"\n        return self.model.backbone.get_activation_checkpoint_submodule_class()\n"
  },
  {
    "path": "corenet/modeling/models/detection/ssd.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\n\nimport argparse\nimport math\nfrom typing import Any, Dict, List, Optional, Tuple, Union\n\nimport torch\nfrom torch import Tensor, nn\nfrom torchvision.ops import batched_nms\n\nfrom corenet.modeling.anchor_generator import build_anchor_generator\nfrom corenet.modeling.layers import AdaptiveAvgPool2d, ConvLayer2d, SeparableConv2d\nfrom corenet.modeling.matcher_det import build_matcher\nfrom corenet.modeling.misc.init_utils import initialize_conv_layer\nfrom corenet.modeling.models import MODEL_REGISTRY\nfrom corenet.modeling.models.classification.base_image_encoder import BaseImageEncoder\nfrom corenet.modeling.models.detection import DetectionPredTuple\nfrom corenet.modeling.models.detection.base_detection import BaseDetection\nfrom corenet.modeling.modules import SSDHead\nfrom corenet.utils import logger\nfrom corenet.utils.common_utils import is_coreml_conversion\n\n\n@MODEL_REGISTRY.register(name=\"ssd\", type=\"detection\")\nclass SingleShotMaskDetector(BaseDetection):\n    \"\"\"\n    This class implements a `Single Shot Object Detector <https://arxiv.org/abs/1512.02325>`_\n\n    Args:\n        opts: command-line arguments\n        encoder (BaseImageEncoder): Encoder network (e.g., ResNet or MobileViT)\n    \"\"\"\n\n    coordinates = 4  # 4 coordinates (x1, y1, x2, y2) or (x, y, w, h)\n\n    def __init__(self, opts, encoder: BaseImageEncoder) -> None:\n\n        anchor_gen_name = getattr(opts, \"anchor_generator.name\", None)\n        if anchor_gen_name is None or anchor_gen_name != \"ssd\":\n            logger.error(\"For SSD, we need --anchor-generator.name to be ssd\")\n        anchor_box_generator = build_anchor_generator(opts=opts)\n\n        output_strides_aspect_ratio = anchor_box_generator.output_strides_aspect_ratio\n        output_strides = list(output_strides_aspect_ratio.keys())\n        anchors_aspect_ratio = list(output_strides_aspect_ratio.values())\n\n        n_os = len(output_strides)\n\n        if getattr(opts, \"matcher.name\") != \"ssd\":\n            logger.error(\"For SSD, we need --matcher.name as ssd\")\n\n        super().__init__(opts=opts, encoder=encoder)\n\n        # delete layers that are not required in detection network\n        self.encoder.classifier = None\n        self.encoder.conv_1x1_exp = None\n\n        proj_channels = getattr(\n            opts, \"model.detection.ssd.proj_channels\", [512, 256, 256, 128, 128, 64]\n        )\n\n        proj_channels = proj_channels + [128] * (n_os - len(proj_channels))\n\n        if n_os != len(anchors_aspect_ratio) != len(proj_channels):\n            logger.error(\n                \"SSD model requires anchors to be defined for feature maps from each output stride. Also\"\n                \"len(anchors_aspect_ratio) == len(output_strides) == len(proj_channels). \"\n                \"Got len(output_strides)={}, len(anchors_aspect_ratio)={}, len(proj_channels)={}.\"\n                \" Please specify correct arguments using following arguments: \"\n                \"\\n--model.detection.ssd.anchors-aspect-ratio \"\n                \"\\n--model.detection.ssd.output-strides\"\n                \"\\n--model.detection.ssd.proj-channels\".format(\n                    n_os, len(anchors_aspect_ratio), len(proj_channels)\n                )\n            )\n        extra_layers = {}\n        enc_channels_list = []\n        in_channels = self.enc_l5_channels\n\n        extra_proj_list = [256] * (len(output_strides) - len(proj_channels))\n        proj_channels = proj_channels + extra_proj_list\n        for idx, os in enumerate(output_strides):\n            out_channels = proj_channels[idx]\n            if os == 8:\n                enc_channels_list.append(self.enc_l3_channels)\n            elif os == 16:\n                enc_channels_list.append(self.enc_l4_channels)\n            elif os == 32:\n                enc_channels_list.append(self.enc_l5_channels)\n            elif os > 32 and os != -1:\n                extra_layers[\"os_{}\".format(os)] = SeparableConv2d(\n                    opts=opts,\n                    in_channels=in_channels,\n                    out_channels=out_channels,\n                    kernel_size=3,\n                    use_act=True,\n                    use_norm=True,\n                    stride=2,\n                )\n                enc_channels_list.append(out_channels)\n                in_channels = out_channels\n            elif os == -1:\n                extra_layers[\"os_{}\".format(os)] = nn.Sequential(\n                    AdaptiveAvgPool2d(output_size=1),\n                    ConvLayer2d(\n                        opts=opts,\n                        in_channels=in_channels,\n                        out_channels=out_channels,\n                        kernel_size=1,\n                        use_act=True,\n                        use_norm=False,\n                    ),\n                )\n                enc_channels_list.append(out_channels)\n                in_channels = out_channels\n            else:\n                raise NotImplementedError\n        self.extra_layers = None if not extra_layers else nn.ModuleDict(extra_layers)\n        if self.extra_layers is not None:\n            self.reset_layers(module=self.extra_layers)\n\n        self.fpn = None\n        if getattr(opts, \"model.detection.ssd.use_fpn\", False):\n            from corenet.modeling.modules import FeaturePyramidNetwork\n\n            fpn_channels = getattr(opts, \"model.detection.ssd.fpn_out_channels\", 256)\n            self.fpn = FeaturePyramidNetwork(\n                opts=opts,\n                in_channels=enc_channels_list,\n                output_strides=output_strides,\n                out_channels=fpn_channels,\n            )\n            # update the enc_channels_list\n            enc_channels_list = [fpn_channels] * len(output_strides)\n            # for FPN, we do not need to do projections\n            proj_channels = enc_channels_list\n\n        # Anchor box related parameters\n        self.conf_threshold = getattr(opts, \"model.detection.ssd.conf_threshold\", 0.01)\n        self.nms_threshold = getattr(opts, \"model.detection.ssd.nms_iou_threshold\", 0.5)\n        self.top_k = getattr(opts, \"model.detection.ssd.top_k\", 400)\n        self.objects_per_image = getattr(\n            opts, \"model.detection.ssd.objects_per_image\", 200\n        )\n\n        self.anchor_box_generator = anchor_box_generator\n\n        anchors_aspect_ratio = self.anchor_box_generator.num_anchors_per_os()\n\n        # Create SSD detection and classification heads\n        anchor_steps = self.anchor_box_generator.step\n\n        self.ssd_heads = nn.ModuleList()\n\n        for os, in_dim, proj_dim, n_anchors, step in zip(\n            output_strides,\n            enc_channels_list,\n            proj_channels,\n            anchors_aspect_ratio,\n            anchor_steps,\n        ):\n            self.ssd_heads += [\n                SSDHead(\n                    opts=opts,\n                    in_channels=in_dim,\n                    n_classes=self.n_detection_classes,\n                    n_coordinates=self.coordinates,\n                    n_anchors=n_anchors,\n                    proj_channels=proj_dim,\n                    kernel_size=3 if os != -1 else 1,\n                    stride=step,\n                )\n            ]\n\n        self.anchors_aspect_ratio = anchors_aspect_ratio\n        self.output_strides = output_strides\n\n        self.match_prior = build_matcher(opts=opts)\n        self.step = self.anchor_box_generator.step\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        group = parser.add_argument_group(title=cls.__name__)\n        group.add_argument(\n            \"--model.detection.ssd.anchors-aspect-ratio\",\n            type=int,\n            nargs=\"+\",\n            action=\"append\",\n            default=[[2, 3]] * 4,\n            help=\"Anchors aspect ratio in each feature map obtained at different output strides.\",\n        )\n        group.add_argument(\n            \"--model.detection.ssd.output-strides\",\n            type=int,\n            nargs=\"+\",\n            default=[16, 32, 64, 128],\n            help=\"Extract feature maps from these output strides.\",\n        )\n        group.add_argument(\n            \"--model.detection.ssd.proj-channels\",\n            type=int,\n            nargs=\"+\",\n            default=[512] * 4,\n            help=\"Projection channels for feature map obtained at each output stride\",\n        )\n\n        # depreciated\n        group.add_argument(\n            \"--model.detection.ssd.min-box-size\",\n            type=float,\n            default=None,\n            help=\"Min. box size. Value between 0 and 1. Good default value is 0.1\",\n        )\n        group.add_argument(\n            \"--model.detection.ssd.max-box-size\",\n            type=float,\n            default=None,\n            help=\"Max. box size. Value between 0 and 1. Good default value is 1.05\",\n        )\n\n        # Depreciated\n        group.add_argument(\n            \"--model.detection.ssd.center-variance\",\n            type=float,\n            default=None,\n            help=\"Center variance.\",\n        )\n        group.add_argument(\n            \"--model.detection.ssd.size-variance\",\n            type=float,\n            default=None,\n            help=\"Size variance.\",\n        )\n        group.add_argument(\n            \"--model.detection.ssd.iou-threshold\",\n            type=float,\n            default=None,\n            help=\"IOU Threshold.\",\n        )\n\n        # inference related arguments\n        group.add_argument(\n            \"--model.detection.ssd.conf-threshold\",\n            type=float,\n            default=0.01,\n            help=\"Confidence threshold. For evaluation on COCO, set to 0.01, so that we can compute mAP\",\n        )\n        group.add_argument(\n            \"--model.detection.ssd.top-k\",\n            type=int,\n            default=400,\n            help=\"Keep only top-k objects before NMS\",\n        )\n        group.add_argument(\n            \"--model.detection.ssd.objects-per-image\",\n            type=int,\n            default=200,\n            help=\"Keep only these many objects after NMS\",\n        )\n        group.add_argument(\n            \"--model.detection.ssd.nms-iou-threshold\",\n            type=float,\n            default=0.5,\n            help=\"NMS IoU threshold \",\n        )\n\n        # FPN\n        group.add_argument(\n            \"--model.detection.ssd.fpn-out-channels\",\n            type=int,\n            default=256,\n            help=\"Number of output channels in FPN\",\n        )\n        group.add_argument(\n            \"--model.detection.ssd.use-fpn\",\n            action=\"store_true\",\n            help=\"Use SSD with FPN\",\n        )\n\n        return parser\n\n    @staticmethod\n    def reset_layers(module) -> None:\n        for layer in module.modules():\n            if isinstance(layer, nn.Conv2d):\n                initialize_conv_layer(module=layer, init_method=\"xavier_uniform\")\n\n    @staticmethod\n    def process_anchors_ar(anchor_ar: List) -> List:\n        assert isinstance(anchor_ar, list)\n        new_ar = []\n        for ar in anchor_ar:\n            if ar in new_ar:\n                continue\n            new_ar.append(ar)\n        return new_ar\n\n    def get_backbone_features(self, x: Tensor) -> Dict[str, Tensor]:\n        # extract features from the backbone network\n        enc_end_points: Dict = self.encoder.extract_end_points_all(x)\n\n        end_points: Dict = dict()\n        for idx, os in enumerate(self.output_strides):\n            if os == 8:\n                end_points[\"os_{}\".format(os)] = enc_end_points.pop(\"out_l3\")\n            elif os == 16:\n                end_points[\"os_{}\".format(os)] = enc_end_points.pop(\"out_l4\")\n            elif os == 32:\n                end_points[\"os_{}\".format(os)] = enc_end_points.pop(\"out_l5\")\n            else:\n                x = end_points[\"os_{}\".format(self.output_strides[idx - 1])]\n                end_points[\"os_{}\".format(os)] = self.extra_layers[\"os_{}\".format(os)](\n                    x\n                )\n\n        if self.fpn is not None:\n            # apply Feature Pyramid Network\n            end_points = self.fpn(end_points)\n\n        return end_points\n\n    def ssd_forward(\n        self,\n        end_points: Dict[str, Tensor],\n        device: Optional[torch.device] = torch.device(\"cpu\"),\n        *args,\n        **kwargs\n    ) -> Union[Tuple[Tensor, Tensor, Tensor], Tuple[Tensor, ...]]:\n\n        locations = []\n        confidences = []\n        anchors = []\n\n        for os, ssd_head in zip(self.output_strides, self.ssd_heads):\n            x = end_points[\"os_{}\".format(os)]\n            fm_h, fm_w = x.shape[2:]\n            loc, pred = ssd_head(x)\n\n            locations.append(loc)\n            confidences.append(pred)\n\n            anchors_fm_ctr = self.anchor_box_generator(\n                fm_height=fm_h, fm_width=fm_w, fm_output_stride=os, device=device\n            )\n            anchors.append(anchors_fm_ctr.to(device=device))\n\n        locations = torch.cat(locations, dim=1)\n        confidences = torch.cat(confidences, dim=1)\n\n        anchors = torch.cat(anchors, dim=0)\n        anchors = anchors.unsqueeze(dim=0)\n\n        return confidences, locations, anchors\n\n    def forward(\n        self, x: Union[Tensor, Dict]\n    ) -> Union[Tuple[Tensor, ...], Tuple[Any, ...], Dict]:\n        if isinstance(x, Dict):\n            input_tensor = x[\"image\"]\n        elif isinstance(x, Tensor):\n            input_tensor = x\n        else:\n            raise NotImplementedError(\n                \"Input to SSD should be either a Tensor or a Dict of Tensors\"\n            )\n\n        device = input_tensor.device\n        backbone_end_points: Dict = self.get_backbone_features(input_tensor)\n\n        if not is_coreml_conversion(self.opts):\n            confidences, locations, anchors = self.ssd_forward(\n                end_points=backbone_end_points, device=device\n            )\n\n            output_dict = {\"scores\": confidences, \"boxes\": locations}\n\n            if not self.training:\n                # compute the detection results during evaluation\n                scores = nn.Softmax(dim=-1)(confidences)\n                boxes = self.match_prior.convert_to_boxes(\n                    pred_locations=locations, anchors=anchors\n                )\n\n                detections = self.postprocess_detections(boxes=boxes, scores=scores)\n                output_dict[\"detections\"] = detections\n\n            return output_dict\n        else:\n            return self.ssd_forward(end_points=backbone_end_points, is_prediction=False)\n\n    @torch.no_grad()\n    def predict(self, x: Tensor, *args, **kwargs) -> DetectionPredTuple:\n        \"\"\"Predict the bounding boxes given an image tensor\"\"\"\n        bsz, channels, width, height = x.shape\n        if bsz != 1:\n            logger.error(\n                \"Prediction is supported with a batch size of 1 in {}\".format(\n                    self.__class__.__name__\n                )\n            )\n\n        device = x.device\n        enc_end_points: Dict = self.get_backbone_features(x)\n        confidences, locations, anchors = self.ssd_forward(\n            end_points=enc_end_points, device=device\n        )\n\n        scores = nn.Softmax(dim=-1)(confidences)\n\n        boxes = self.match_prior.convert_to_boxes(\n            pred_locations=locations, anchors=anchors\n        )\n        detections = self.postprocess_detections(boxes=boxes, scores=scores)[0]\n        return detections\n\n    @torch.no_grad()\n    def postprocess_detections(\n        self, boxes: Tensor, scores: Tensor\n    ) -> List[DetectionPredTuple]:\n        \"\"\"Post process detections, including NMS\"\"\"\n        # boxes [B, N, 4]\n        # scores [B, N]\n        # labels [B, N]\n\n        batch_size = boxes.shape[0]\n        n_classes = scores.shape[-1]\n\n        device = boxes.device\n        box_dtype = boxes.dtype\n        scores_dtype = scores.dtype\n\n        results = []\n        for b_id in range(batch_size):\n            object_labels = []\n            object_boxes = []\n            object_scores = []\n\n            for class_index in range(1, n_classes):\n                probs = scores[b_id, :, class_index]\n                mask = probs > self.conf_threshold\n                probs = probs[mask]\n                if probs.size(0) == 0:\n                    continue\n                masked_boxes = boxes[b_id, mask, :]\n\n                # keep only top-k indices\n                num_topk = min(self.top_k, probs.size(0))\n                probs, idxs = probs.topk(num_topk)\n                masked_boxes = masked_boxes[idxs, ...]\n\n                object_boxes.append(masked_boxes)\n                object_scores.append(probs)\n                object_labels.append(\n                    torch.full_like(\n                        probs, fill_value=class_index, dtype=torch.int64, device=device\n                    )\n                )\n\n            if len(object_scores) == 0:\n                output = DetectionPredTuple(\n                    labels=torch.empty(0, device=device, dtype=torch.long),\n                    scores=torch.empty(0, device=device, dtype=scores_dtype),\n                    boxes=torch.empty(0, 4, device=device, dtype=box_dtype),\n                )\n            else:\n                # concatenate all results\n                object_scores = torch.cat(object_scores, dim=0)\n                object_boxes = torch.cat(object_boxes, dim=0)\n                object_labels = torch.cat(object_labels, dim=0)\n\n                # non-maximum suppression\n                keep = batched_nms(\n                    object_boxes, object_scores, object_labels, self.nms_threshold\n                )\n                keep = keep[: self.objects_per_image]\n\n                output = DetectionPredTuple(\n                    labels=object_labels[keep],\n                    scores=object_scores[keep],\n                    boxes=object_boxes[keep],\n                )\n            results.append(output)\n        return results\n\n    def dummy_input_and_label(self, batch_size: int) -> Dict:\n        \"\"\"Create dummy input and labels for CI/CD purposes.\"\"\"\n        img_channels = 3\n        height = 320\n        width = 320\n        n_classes = 80\n\n        def generate_anchors(height, width):\n            \"\"\"Generate anchors **on-the-fly** based on the input resolution.\"\"\"\n            anchors = []\n            for output_stride in self.output_strides:\n                if output_stride == -1:\n                    fm_width = fm_height = 1\n                else:\n                    fm_width = int(math.ceil(width / output_stride))\n                    fm_height = int(math.ceil(height / output_stride))\n                fm_anchor = self.anchor_box_generator(\n                    fm_height=fm_height,\n                    fm_width=fm_width,\n                    fm_output_stride=output_stride,\n                )\n                anchors.append(fm_anchor)\n            anchors = torch.cat(anchors, dim=0)\n            return anchors\n\n        # GT boxes have the same shape as anchors. So, we use anchors as GT boxes\n        gt_boxes = generate_anchors(height=height, width=width)\n        gt_boxes = gt_boxes.unsqueeze(0).expand(batch_size, -1, -1)\n\n        gt_box_labels = torch.randint(\n            low=0,\n            high=n_classes,\n            size=(batch_size, gt_boxes.shape[1]),\n            dtype=torch.long,\n        )\n\n        img_tensor = torch.randn(\n            batch_size, img_channels, height, width, dtype=torch.float\n        )\n        labels = {\n            \"box_labels\": gt_box_labels,\n            \"box_coordinates\": gt_boxes,\n        }\n\n        return {\"samples\": img_tensor, \"targets\": labels}\n"
  },
  {
    "path": "corenet/modeling/models/detection/utils/__init__.py",
    "content": ""
  },
  {
    "path": "corenet/modeling/models/detection/utils/rcnn_utils.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom typing import List, Tuple\n\nimport torch\nfrom torch import Tensor, nn\n\nfrom corenet.modeling.layers import (\n    ConvLayer2d,\n    LinearLayer,\n    TransposeConvLayer2d,\n    get_normalization_layer,\n)\nfrom corenet.modeling.misc.init_utils import initialize_conv_layer, initialize_fc_layer\n\n# Below classes are adapted from Torchvision version=0.12 to make the code compatible with previous torch versions.\n\n\nclass FastRCNNConvFCHead(nn.Sequential):\n    def __init__(\n        self,\n        opts,\n        input_size: Tuple[int, int, int],\n        conv_layers: List[int],\n        fc_layers: List[int],\n        *args,\n        **kwargs,\n    ):\n        \"\"\"\n        Args:\n            input_size (Tuple[int, int, int]): the input size in CHW format.\n            conv_layers (list): feature dimensions of each Convolution layer\n            fc_layers (list): feature dimensions of each FCN layer\n        \"\"\"\n        in_channels, in_height, in_width = input_size\n\n        blocks = []\n        previous_channels = in_channels\n        for current_channels in conv_layers:\n            blocks.extend(\n                [\n                    ConvLayer2d(\n                        opts,\n                        in_channels=previous_channels,\n                        out_channels=current_channels,\n                        kernel_size=3,\n                        stride=1,\n                        use_norm=False,\n                        use_act=False,\n                    ),\n                    replace_syncbn_with_syncbnfp32(opts, num_features=current_channels),\n                    nn.ReLU(inplace=False),\n                ]\n            )\n            previous_channels = current_channels\n        blocks.append(nn.Flatten())\n        previous_channels = previous_channels * in_height * in_width\n\n        for current_channels in fc_layers:\n            blocks.append(LinearLayer(previous_channels, current_channels, bias=True))\n            blocks.append(nn.ReLU(inplace=True))\n            previous_channels = current_channels\n\n        super().__init__(*blocks)\n        for layer in self.modules():\n            if isinstance(layer, nn.Conv2d):\n                initialize_conv_layer(module=layer, init_method=\"kaiming_normal\")\n            elif isinstance(layer, LinearLayer):\n                initialize_fc_layer(module=layer, init_method=\"kaiming_uniform\")\n\n\nclass RPNHead(nn.Module):\n    \"\"\"\n    Adds a simple RPN Head with classification and regression heads\n\n    Args:\n        in_channels (int): number of channels of the input feature\n        num_anchors (int): number of anchors to be predicted\n        conv_depth (int, optional): number of convolutions\n    \"\"\"\n\n    def __init__(self, opts, in_channels: int, num_anchors: int, conv_depth=1) -> None:\n        super().__init__()\n        convs = []\n        for _ in range(conv_depth):\n            convs.extend(\n                [\n                    ConvLayer2d(\n                        opts,\n                        in_channels=in_channels,\n                        out_channels=in_channels,\n                        kernel_size=3,\n                        stride=1,\n                        use_norm=False,\n                        use_act=False,\n                        bias=False,\n                    ),\n                    replace_syncbn_with_syncbnfp32(opts, num_features=in_channels),\n                    nn.ReLU(inplace=False),\n                ]\n            )\n        self.conv = nn.Sequential(*convs)\n        self.cls_logits = ConvLayer2d(\n            opts,\n            in_channels=in_channels,\n            out_channels=num_anchors,\n            kernel_size=1,\n            stride=1,\n            use_norm=False,\n            use_act=False,\n            bias=True,\n        )\n        self.bbox_pred = ConvLayer2d(\n            opts,\n            in_channels=in_channels,\n            out_channels=num_anchors * 4,\n            kernel_size=1,\n            stride=1,\n            use_act=False,\n            use_norm=False,\n            bias=True,\n        )\n\n        for layer in self.modules():\n            if isinstance(layer, nn.Conv2d):\n                initialize_conv_layer(module=layer, init_method=\"normal\", std_val=0.01)\n\n    def forward(self, x: List[Tensor]) -> Tuple[List[Tensor], List[Tensor]]:\n        logits = []\n        bbox_reg = []\n        for feature in x:\n            t = self.conv(feature)\n            logits.append(self.cls_logits(t))\n            bbox_reg.append(self.bbox_pred(t))\n        return logits, bbox_reg\n\n\nclass MaskRCNNHeads(nn.Sequential):\n    def __init__(self, opts, in_channels: int, layers: List, dilation: int):\n        \"\"\"\n        Args:\n            in_channels (int): number of input channels\n            layers (list): feature dimensions of each FCN layer\n            dilation (int): dilation rate of kernel\n            norm_layer (callable, optional): Module specifying the normalization layer to use. Default: None\n        \"\"\"\n        blocks = []\n        next_feature = in_channels\n        for layer_features in layers:\n            blocks.extend(\n                [\n                    ConvLayer2d(\n                        opts=opts,\n                        in_channels=next_feature,\n                        out_channels=layer_features,\n                        kernel_size=3,\n                        stride=1,\n                        dilation=dilation,\n                        use_norm=False,\n                        use_act=False,\n                        bias=False,\n                    ),\n                    replace_syncbn_with_syncbnfp32(\n                        opts=opts, num_features=layer_features\n                    ),\n                    nn.ReLU(inplace=False),\n                ]\n            )\n            next_feature = layer_features\n\n        super().__init__(*blocks)\n\n        for layer in self.modules():\n            if isinstance(layer, nn.Conv2d):\n                initialize_conv_layer(module=layer, init_method=\"kaiming_normal\")\n\n\nclass MaskRCNNPredictor(nn.Sequential):\n    def __init__(\n        self, opts, in_channels: int, dim_reduced: int, num_classes: int\n    ) -> None:\n        super().__init__(\n            *[\n                TransposeConvLayer2d(\n                    opts,\n                    in_channels=in_channels,\n                    out_channels=dim_reduced,\n                    kernel_size=2,\n                    stride=2,\n                    padding=0,\n                    output_padding=0,\n                    use_norm=False,\n                    use_act=False,\n                    bias=False,\n                    groups=1,\n                ),\n                replace_syncbn_with_syncbnfp32(opts, num_features=dim_reduced),\n                nn.ReLU(inplace=False),\n                ConvLayer2d(\n                    opts,\n                    in_channels=dim_reduced,\n                    out_channels=num_classes,\n                    kernel_size=1,\n                    stride=1,\n                    bias=True,\n                    use_norm=False,\n                    use_act=False,\n                ),\n            ]\n        )\n\n        for layer in self.modules():\n            if isinstance(layer, (nn.Conv2d, nn.ConvTranspose2d)):\n                initialize_conv_layer(module=layer, init_method=\"kaiming_normal\")\n\n\nclass FastRCNNPredictor(nn.Module):\n    \"\"\"\n    Standard classification + bounding box regression layers\n    for Fast R-CNN.\n\n    Args:\n        in_channels (int): number of input channels\n        num_classes (int): number of output classes (including background)\n    \"\"\"\n\n    def __init__(self, in_channels: int, num_classes: int) -> None:\n        super().__init__()\n        self.cls_score = LinearLayer(in_channels, num_classes, bias=True)\n        self.bbox_pred = LinearLayer(in_channels, num_classes * 4, bias=True)\n\n        for layer in self.modules():\n            if isinstance(layer, LinearLayer):\n                initialize_fc_layer(module=layer, init_method=\"kaiming_uniform\")\n\n    def forward(self, x: Tensor) -> Tuple[Tensor, Tensor]:\n        if x.dim() == 4:\n            torch._assert(\n                list(x.shape[2:]) == [1, 1],\n                f\"x has the wrong shape, expecting the last two dimensions to be [1,1] instead of {list(x.shape[2:])}\",\n            )\n        x = x.flatten(start_dim=1)\n        scores = self.cls_score(x)\n        bbox_deltas = self.bbox_pred(x)\n\n        return scores, bbox_deltas\n\n\ndef replace_syncbn_with_syncbnfp32(opts, num_features: int) -> nn.Module:\n    # Sync-BN with 0 batch size does not work well with AMP. To avoid that,\n    # we replace all sync_bn in mask rcnn head with FP32 ones.\n    norm_layer = getattr(opts, \"model.normalization.name\", None)\n\n    if norm_layer.find(\"sync\") > -1:\n        return get_normalization_layer(\n            opts, num_features=num_features, norm_type=\"sync_batch_norm_fp32\"\n        )\n    else:\n        return get_normalization_layer(opts=opts, num_features=num_features)\n"
  },
  {
    "path": "corenet/modeling/models/fsdp_wrapper.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\n\nimport argparse\nimport inspect\nfrom typing import Any, Dict, Tuple\n\nimport torch\nfrom torch.distributed.fsdp import (\n    BackwardPrefetch,\n    CPUOffload,\n    FullStateDictConfig,\n    FullyShardedDataParallel,\n    MixedPrecision,\n    ShardingStrategy,\n    StateDictType,\n)\nfrom torch.distributed.fsdp.api import FullOptimStateDictConfig\n\nfrom corenet.modeling.models import BaseAnyNNModel\nfrom corenet.optims.base_optim import BaseOptim\nfrom corenet.utils import logger\nfrom corenet.utils.ddp_utils import is_master\n\nFSDP_SHARDING_STRATEGY_MAP = {\n    # In full shard, parameters, gradients, and optimizer states are sharded (aka ZERO 3)\n    \"full_shard\": ShardingStrategy.FULL_SHARD,\n    # hybrid_shard is the same as full shard, except sharding is done within a node.\n    # TODO: Revisit hybrid sharding in future because of the below issue.\n    # https://github.com/pytorch/pytorch/issues/102904\n    # \"hybrid_shard\": ShardingStrategy.HYBRID_SHARD,\n    # In no-shard, parameters, gradients, and optimizer states are not sharded\n    \"no_shard\": ShardingStrategy.NO_SHARD,\n    # In grad_op_shard, gradients and optimizer states are sharded (aka as Zero)\n    \"grad_op_shard\": ShardingStrategy.SHARD_GRAD_OP,\n}\n\nFSDP_DATATYPE_CONVERSION = {\n    \"float16\": torch.float16,\n    \"float32\": torch.float32,\n    \"bfloat16\": torch.bfloat16,\n}\n\nFSDP_BACKWARD_PREFETCH = {\n    # pre enables prefetching next set of parameters before computing gradients for current set of parameters.\n    \"pre\": BackwardPrefetch.BACKWARD_PRE,\n    # post enables prefetching next set of parameters after computing gradients for current set of parameters.\n    \"post\": BackwardPrefetch.BACKWARD_POST,\n}\n\n\nclass FullyShardedDataParallelWrapper(FullyShardedDataParallel):\n    def __init__(\n        self,\n        opts: argparse.Namespace,\n        model: BaseAnyNNModel,\n    ) -> None:\n\n        param_dtype = getattr(opts, \"fsdp.parameter_datatype\")\n        reduce_dtype = getattr(opts, \"fsdp.gradient_reduction_datatype\")\n        buffer_dtype = getattr(opts, \"fsdp.buffer_datatype\")\n\n        if param_dtype not in FSDP_DATATYPE_CONVERSION:\n            logger.error(\n                f\"Supported data type for parameters in FSDP are {list(FSDP_DATATYPE_CONVERSION.keys())}. \\\n                    Got: {param_dtype}.\"\n            )\n        if reduce_dtype not in FSDP_DATATYPE_CONVERSION:\n            logger.error(\n                f\"Supported data type for gradient reduction in FSDP are {list(FSDP_DATATYPE_CONVERSION.keys())}. \\\n                    Got: {reduce_dtype}.\"\n            )\n        if buffer_dtype not in FSDP_DATATYPE_CONVERSION:\n            logger.error(\n                f\"Supported data type for buffer in FSDP are {list(FSDP_DATATYPE_CONVERSION.keys())}. \\\n                    Got: {buffer_dtype}.\"\n            )\n\n        prefetching_option = getattr(opts, \"fsdp.backward_prefetching\")\n        if prefetching_option not in FSDP_BACKWARD_PREFETCH:\n            logger.error(\n                f\"Supported backward pre-fetching options are {list(FSDP_BACKWARD_PREFETCH.keys())}. \\\n                Got: {prefetching_option}.\"\n            )\n\n        fsdp_precision_policy = MixedPrecision(\n            param_dtype=FSDP_DATATYPE_CONVERSION[param_dtype],\n            reduce_dtype=FSDP_DATATYPE_CONVERSION[reduce_dtype],\n            buffer_dtype=FSDP_DATATYPE_CONVERSION[buffer_dtype],\n        )\n\n        fsdp_parameters = inspect.signature(FullyShardedDataParallel).parameters\n\n        # Enabling `use_orig_params` tells FSDP not to flatten parameters, and enables us to specify different LR/weight decay values.\n        # `use_orig_params` feature is available in PyTorch versions > 2.0\n        extra_args_fsdp = (\n            dict(use_orig_params=True)\n            if \"use_orig_params\" in fsdp_parameters\n            else dict()\n        )\n        if \"limit_all_gathers\" in fsdp_parameters and getattr(\n            opts, \"fsdp.limit_all_gathers\"\n        ):\n            extra_args_fsdp[\"limit_all_gathers\"] = True\n\n        if \"cpu_offload\" in fsdp_parameters and getattr(opts, \"fsdp.cpu_offload\"):\n            extra_args_fsdp[\"cpu_offload\"] = CPUOffload(offload_params=True)\n\n        sharding_strategy = getattr(opts, \"fsdp.sharding_strategy\")\n        if sharding_strategy not in FSDP_SHARDING_STRATEGY_MAP:\n            logger.error(\n                f\"Supported sharding strategies for FSDP are: {list(FSDP_SHARDING_STRATEGY_MAP.keys())}. Got: {sharding_strategy}.\"\n            )\n\n        # get fsdp wrapping policy\n        fsdp_wrap_policy = model.get_fsdp_wrap_policy()\n\n        super().__init__(\n            model,\n            sharding_strategy=FSDP_SHARDING_STRATEGY_MAP[sharding_strategy],\n            auto_wrap_policy=fsdp_wrap_policy,\n            mixed_precision=fsdp_precision_policy,\n            backward_prefetch=FSDP_BACKWARD_PREFETCH[prefetching_option],\n            **extra_args_fsdp,\n        )\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        \"\"\"Add FSDP-specific arguments\"\"\"\n        if cls == FullyShardedDataParallelWrapper:\n            group = parser.add_argument_group(title=cls.__name__)\n            group.add_argument(\n                \"--fsdp.sharding-strategy\",\n                type=str,\n                default=None,\n                choices=list(FSDP_SHARDING_STRATEGY_MAP.keys()),\n                help=\"Sharding strategy for FSDP. Defaults to None.\",\n            )\n            group.add_argument(\n                \"--fsdp.backward-prefetching\",\n                type=str,\n                default=\"pre\",\n                choices=[\"pre\", \"post\"],\n                help=\"Backward prefetching. Supported modes are `pre` and `post`. \\\n                    `pre` and `post` prefetches the next set of parameters before and after \\\n                    the current set of parameter's gradient computation respectively. \\\n                    Defaults to `pre`.\",\n            )\n            group.add_argument(\n                \"--fsdp.parameter-datatype\",\n                type=str,\n                default=\"bfloat16\",\n                choices=list(FSDP_DATATYPE_CONVERSION.keys()),\n                help=\"Specify the data type of model parameters.  See FSDP documentation for details. \\\n                    Defaults to `bfloat16`.\",\n            )\n            group.add_argument(\n                \"--fsdp.gradient-reduction-datatype\",\n                type=str,\n                default=\"bfloat16\",\n                choices=list(FSDP_DATATYPE_CONVERSION.keys()),\n                help=\"Specify the data type for gradient reduction. See FSDP documentation for details. \\\n                    Defaults to `bfloat16`.\",\n            )\n            group.add_argument(\n                \"--fsdp.buffer-datatype\",\n                type=str,\n                default=\"bfloat16\",\n                choices=list(FSDP_DATATYPE_CONVERSION.keys()),\n                help=\"Specify the data type for buffers. See FSDP documentation for details. \\\n                    Defaults to `bfloat16`.\",\n            )\n            group.add_argument(\n                \"--fsdp.limit-all-gathers\",\n                action=\"store_true\",\n                help=\"Enabling this flag allows FSDP to explicitly synchronize the CPU threads and \\\n                    prevent too many in-flight all-gathers. Enabling this can \\\n                    help lower the number of CUDA malloc retries. Defaults to `False`. \\\n                    Note: In older PyTorch versions, this flag may not be available.\",\n            )\n            group.add_argument(\n                \"--fsdp.cpu-offload\",\n                action=\"store_true\",\n                help=\"Enable CPU offloading. Defaults to `False`. \\\n                    Note: In older PyTorch versions, this flag may not be available.\",\n            )\n\n        return parser\n\n\ndef get_fsdp_model_optimizer_state_dict_on_rank0(\n    model: FullyShardedDataParallelWrapper, optimizer: BaseOptim\n) -> Tuple[Dict[str, Any], Dict[str, Any]]:\n    \"\"\"\n    Aggregates the model and optimizer states from all shards on rank0 and return it.\n\n    Args:\n        model: Model (partially) sharded by FSDP.\n        optimizer: Optimizer.\n    \"\"\"\n    with FullyShardedDataParallelWrapper.state_dict_type(\n        model,\n        StateDictType.FULL_STATE_DICT,\n        # config for model state aggregation\n        FullStateDictConfig(offload_to_cpu=True, rank0_only=True),\n        # config for optimizer state aggregation\n        FullOptimStateDictConfig(offload_to_cpu=True, rank0_only=True),\n    ):\n        model_state = model.state_dict()\n        # Returns the state dict of optimzier for the ``model`` that is (partially) sharded by FSDP.\n        optim_state = FullyShardedDataParallel.optim_state_dict(\n            model=model, optim=optimizer\n        )\n        return model_state, optim_state\n"
  },
  {
    "path": "corenet/modeling/models/language_modeling/__init__.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n"
  },
  {
    "path": "corenet/modeling/models/language_modeling/base_lm.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nfrom typing import Dict\n\nimport torch\nfrom torch import Tensor\n\nfrom corenet.modeling.models import MODEL_REGISTRY, BaseAnyNNModel\n\n\n@MODEL_REGISTRY.register(name=\"__base__\", type=\"language_modeling\")\nclass BaseLanguageModel(BaseAnyNNModel):\n    \"\"\"Base class for language modeling.\n\n    Args:\n        opts: Command-line arguments.\n    \"\"\"\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        \"\"\"Add LM model specific arguments\"\"\"\n        if cls == BaseLanguageModel:\n            group = parser.add_argument_group(title=cls.__name__)\n            group.add_argument(\n                \"--model.language-modeling.name\",\n                type=str,\n                default=None,\n                help=\"Name of the language model. Defaults to None (i.e., user need to specify the model name).\",\n            )\n\n            group.add_argument(\n                \"--model.language-modeling.pretrained\",\n                type=str,\n                default=None,\n                help=\"Path of the pre-trained model. Defaults to None (i.e., user needs to specify the path of pre-trained model).\",\n            )\n\n        return parser\n\n    def dummy_input_and_label(self, batch_size: int) -> Dict[str, Tensor]:\n        \"\"\"Create dummy input and labels for CI/CD purposes. Child classes must override it\n        if functionality is different.\n        \"\"\"\n        seq_length = 5\n        return {\n            \"samples\": torch.randint(\n                low=0, high=1, size=(batch_size, seq_length)\n            ).long(),\n            \"targets\": torch.randint(\n                low=0, high=1, size=(batch_size, seq_length)\n            ).long(),\n        }\n\n    @classmethod\n    def build_model(cls, opts: argparse.Namespace, *args, **kwargs) -> BaseAnyNNModel:\n        \"\"\"Helper function to build the language model.\n\n        Args:\n            opts: Command-line arguments.\n\n        Returns:\n            An instance of `corenet.modeling.models.BaseAnyNNModel`.\n        \"\"\"\n        model = cls(opts, *args, **kwargs)\n        return model\n"
  },
  {
    "path": "corenet/modeling/models/language_modeling/general_gpt.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nimport functools\nfrom dataclasses import dataclass\nfrom numbers import Number\nfrom typing import Callable, Dict, List, Optional, Tuple, Union\n\nimport numpy as np\nimport torch\nfrom torch import Tensor, nn\nfrom torch.distributed.fsdp.wrap import transformer_auto_wrap_policy\nfrom torch.nn import functional as F\n\nfrom corenet.modeling.layers import (\n    Embedding,\n    LinearLayer,\n    RotaryEmbedding,\n    get_normalization_layer,\n    norm_layers_tuple,\n)\nfrom corenet.modeling.layers.activation import build_activation_layer\nfrom corenet.modeling.models import MODEL_REGISTRY\nfrom corenet.modeling.models.language_modeling.base_lm import BaseLanguageModel\nfrom corenet.utils import logger\nfrom corenet.utils.math_utils import make_divisible\n\n\ndef compute_heads(model_dim: int, head_dim: int) -> int:\n    \"\"\"Compute the number of heads.\n\n    Args:\n        model_dim: Model dimension.\n        head_dim: Head dimension.\n\n    ...note:\n        If model dimension is not divisible by head dimension, ValueError is raised. Otherwise, integer denoting\n        number of heads in multi-head attention is returned.\n    \"\"\"\n    if model_dim % head_dim == 0:\n        return model_dim // head_dim\n    else:\n        raise ValueError(\n            f\"Model dimension should be divisible by head dimension. Got: {model_dim} and {head_dim}.\"\n        )\n\n\n@dataclass\nclass GPTConfig:\n    vocab_size: int = 32000\n    max_context_length: int = 2048\n\n    num_transformer_layers: int = 12\n    model_dim: int = 2048\n    head_dim: int = 128\n    qkv_multipliers: Union[Number, List[Number]] = 1.0\n    num_query_heads: int = compute_heads(model_dim=model_dim, head_dim=head_dim)\n    # This variable allows to switch between multi-head attention, group query attention, and multi-query attention.\n    # When num_gqa_groups == 1, then it is multi-head attention.\n    # When 1 < num_gqa_groups < num_heads and num_heads is divisible by num_gqa_groups, then it is group query attention\n    # When num_gqa_groups == num_heads, then it is multi-query attention\n    num_gqa_groups: int = 1\n\n    # Multipliers for the feed-forward network.\n    ffn_multipliers: Union[Number, List[Number]] = 4.0\n    # use FFN with Gated Linear Unit (GLU)\n    ffn_with_glu: bool = True\n    ffn_dim_divisor: int = 256\n\n    activation_fn_name: str = \"swish\"\n    normalization_layer_name: str = \"rms_norm\"\n    normalize_qk_projections: bool = False\n    share_input_output_layers: bool = False\n\n    rope_freq_constant: int = 10000\n    # Note that rope_max_length is set to twice of max_context_length.\n    # This allows flexibility in token lengths during training or fine-tuning.\n    rope_max_length: int = 4096\n\n    def __post_init__(self) -> None:\n        if self.num_gqa_groups is not None:\n            head_multiple_of = self.num_gqa_groups\n        else:\n            head_multiple_of = 2\n\n        if isinstance(self.qkv_multipliers, Number):\n            # All attention layers have the same latent dimensions, resulting in uniform allocation of parameters.\n            qkv_dim = make_divisible(\n                self.model_dim * self.qkv_multipliers,\n                divisor=self.head_dim * head_multiple_of,\n            )\n            query_dims = [int(qkv_dim)] * self.num_transformer_layers\n\n        elif (\n            isinstance(self.qkv_multipliers, (tuple, list))\n            and len(self.qkv_multipliers) == 2\n        ):\n            # Each attention layer have different latent dimensions assuming qkv_multipliers[0] != qkv_multipliers[1].\n            # This results in variable allocation of parameters in attention layer.\n            # This scaling is known as layer-wise or block-wise scaling: https://arxiv.org/abs/2008.00623\n            qkv_multipliers = [\n                round(v, 2)\n                for v in np.linspace(\n                    self.qkv_multipliers[0],\n                    self.qkv_multipliers[1],\n                    num=self.num_transformer_layers,\n                    dtype=float,\n                )\n            ]\n            # Make sure that scaled model dimension is divisible by scaled head dimension.\n            query_dims = [\n                int(\n                    make_divisible(\n                        self.model_dim * m, divisor=self.head_dim * head_multiple_of\n                    )\n                )\n                for m in qkv_multipliers\n            ]\n        else:\n            raise NotImplementedError(\n                f\"QKV multipliers should be a single number or a list containing exactly two numbers. Got: {qkv_multipliers}.\"\n            )\n\n        # compute the number of query, key, and value heads\n        # For multi-head and multi-query attention, the number of heads for query, key, and value are the same.\n        # For group query attention, the number of key and value heads are the same.\n        self.num_query_heads = [\n            int(compute_heads(q_dim, self.head_dim)) for q_dim in query_dims\n        ]\n        self.num_kv_heads = [\n            q_heads // self.num_gqa_groups for q_heads in self.num_query_heads\n        ]\n\n        # Feed-forward network (FFN) multipliers\n        if isinstance(self.ffn_multipliers, Number):\n            # All FFN layers have the same latent dimensions, resulting in uniform allocation of parameters.\n            self.ffn_multipliers = [self.ffn_multipliers] * self.num_transformer_layers\n        elif (\n            isinstance(self.ffn_multipliers, (tuple, list))\n            and len(self.ffn_multipliers) == 2\n        ):\n            # Each FFN layer have different latent dimensions assuming ffn_multipliers[0] != ffn_multipliers[1].\n            # This results in variable allocation of parameters in FFN layer.\n            # This scaling is known as layer-wise or block-wise scaling: https://arxiv.org/abs/2008.00623\n            self.ffn_multipliers = [\n                round(v, 2)\n                for v in np.linspace(\n                    self.ffn_multipliers[0],\n                    self.ffn_multipliers[1],\n                    num=self.num_transformer_layers,\n                    dtype=float,\n                )\n            ]\n        else:\n            raise NotImplementedError(\n                f\"FFN multipliers should be a single number or a list containing exactly two numbers. Got: {qkv_multipliers}.\"\n            )\n\n    @classmethod\n    def from_name(\n        cls, model_name: str, vocab_size: int, max_context_length: int\n    ) -> \"GPTConfig\":\n        if model_name in gpt_configs:\n            config = gpt_configs[model_name]\n        else:\n            raise NotImplementedError(f\"{model_name} is not yet implemented\")\n\n        config[\"vocab_size\"] = vocab_size\n        config[\"max_context_length\"] = max_context_length\n        return cls(**config)\n\n\ngpt_configs = {\n    \"gpt-test\": dict(\n        num_transformer_layers=1,\n        model_dim=128,\n        head_dim=64,\n        num_gqa_groups=1,\n        normalize_qk_projections=True,\n        share_input_output_layers=True,\n        # Vary the FFN and QKV multiplier to create variable FFN and attention layers respectively.\n        ffn_multipliers=(0.25, 0.75),\n        qkv_multipliers=(0.25, 0.5),\n    ),\n    # A sample GPT configuration.\n    \"gpt-1_3B\": dict(\n        num_transformer_layers=24,\n        model_dim=2048,\n        head_dim=64,\n        max_context_length=2048,\n        # For gated FFN, the value is around 3. while for standard FFN, the value is 4.0.\n        ffn_multipliers=3.0,\n        # Number of GQA groups.\n        num_gqa_groups=4,\n        normalize_qk_projections=True,\n        share_input_output_layers=True,\n    ),\n    \"OpenELM-270M\": dict(\n        num_transformer_layers=16,\n        model_dim=1280,\n        head_dim=64,\n        num_gqa_groups=4,\n        normalize_qk_projections=True,\n        share_input_output_layers=True,\n        # Vary the FFN and QKV multiplier to create variable FFN and attention layers respectively.\n        ffn_multipliers=(0.5, 4.0),\n        qkv_multipliers=(0.5, 1.0),\n    ),\n    \"OpenELM-450M\": dict(\n        num_transformer_layers=20,\n        model_dim=1536,\n        head_dim=64,\n        num_gqa_groups=4,\n        normalize_qk_projections=True,\n        share_input_output_layers=True,\n        # Vary the FFN and QKV multiplier to create variable FFN and attention layers respectively.\n        ffn_multipliers=(0.5, 4.0),\n        qkv_multipliers=(0.5, 1.0),\n    ),\n    \"OpenELM-1_1B\": dict(\n        num_transformer_layers=28,\n        model_dim=2048,\n        head_dim=64,\n        num_gqa_groups=4,\n        normalize_qk_projections=True,\n        share_input_output_layers=True,\n        # Vary the FFN and QKV multiplier to create variable FFN and attention layers respectively.\n        ffn_multipliers=(0.5, 4.0),\n        qkv_multipliers=(0.5, 1.0),\n    ),\n    \"OpenELM-3B\": dict(\n        num_transformer_layers=36,\n        model_dim=3072,\n        head_dim=128,\n        num_gqa_groups=4,\n        normalize_qk_projections=True,\n        share_input_output_layers=True,\n        # Vary the FFN and QKV multiplier to create variable FFN and attention layers respectively.\n        ffn_multipliers=(0.5, 4.0),\n        qkv_multipliers=(0.5, 1.0),\n    ),\n}\n\n\nclass MultiHeadCausalAttention(nn.Module):\n    \"\"\"Multi-head causal attention.\n\n    Args:\n        opts: Command-line arguments.\n        model_config: Model configuration.\n        layer_idx: Layer index.\n    \"\"\"\n\n    def __init__(\n        self, opts: argparse.Namespace, model_config: GPTConfig, layer_idx: int\n    ) -> None:\n        super().__init__()\n        assert (\n            model_config.num_query_heads[layer_idx]\n            % model_config.num_kv_heads[layer_idx]\n            == 0\n        ), f\"Number of query heads are not divisible by number of key/value heads. Got: {model_config.num_query_heads[layer_idx]} and {model_config.num_kv_heads[layer_idx]}.\"\n\n        head_dim = model_config.head_dim\n        q_heads = model_config.num_query_heads[layer_idx]\n        k_heads = model_config.num_kv_heads[layer_idx]\n        v_heads = model_config.num_kv_heads[layer_idx]\n\n        self.qkv_proj = LinearLayer(\n            in_features=model_config.model_dim,\n            out_features=(q_heads + k_heads + v_heads) * head_dim,\n            bias=False,\n        )\n\n        self.pos_embedding = RotaryEmbedding(\n            model_dim=model_config.head_dim,\n            max_seq_length=model_config.rope_max_length,\n            freq_constant=model_config.rope_freq_constant,\n        )\n\n        if model_config.normalize_qk_projections:\n            self.q_norm = get_normalization_layer(\n                opts,\n                num_features=model_config.head_dim,\n                norm_type=model_config.normalization_layer_name,\n            )\n            self.k_norm = get_normalization_layer(\n                opts,\n                num_features=model_config.head_dim,\n                norm_type=model_config.normalization_layer_name,\n            )\n        else:\n            self.q_norm = None\n            self.k_norm = None\n\n        self.out_proj = LinearLayer(\n            in_features=q_heads * head_dim,\n            out_features=model_config.model_dim,\n            bias=False,\n        )\n\n        self.head_dim = model_config.head_dim\n        self.num_q_heads = q_heads\n        self.num_k_heads = k_heads\n        self.num_v_heads = v_heads\n        self.model_dim = model_config.model_dim\n        self.num_groups = self.num_q_heads // self.num_k_heads\n\n    def extra_repr(self) -> str:\n        return (\n            super().extra_repr()\n            + f\"model_dim={self.model_dim}, num_query_heads={self.num_q_heads}, num_key_heads={self.num_k_heads}, num_value_heads={self.num_v_heads}\"\n        )\n\n    def forward(\n        self,\n        x: Tensor,\n        past_keys: Optional[Tensor] = None,\n        past_values: Optional[Tensor] = None,\n        use_kv_cache: bool = False,\n        is_causal: bool = True,\n        concat_kvs: bool = True,\n        apply_k_norm_to_past_keys_before_cache_write: bool = False,\n        apply_k_norm_before_cache_write: bool = True,\n    ) -> Tuple[Tensor, Optional[Tensor], Optional[Tensor]]:\n        \"\"\"\n        Forward pass of multi-head self-attention.\n\n        Args:\n            x: Input tensor of the shape [batch size, sequence length, model dimension].\n            past_keys: Tensor storing the cached keys.\n                The shape of tensor is [batch size, number of key heads, sequence length, head dimension].\n            past_values: Tensor storing the cached values. The shape of the tensor is the same as 'past_keys'.\n            use_kv_cache: Cache the output of key and value projection layers for faster inference.\n            is_causal: Specifies whether to apply causal masking in scaled dot-product attention.\n            concat_kvs: If set, the keys produced by the QKV projection will be concatenated\n                with the past keys. Usually this value should be True, but it needs to be False\n                for KV Prediction experiments.\n            apply_k_norm_to_past_keys_before_cache_write: If set, apply the key norm to past keys\n                before updating the KV cache. This usually should be False, but is set to True\n                for KV prediction experiments.\n            apply_k_norm_before_cache_write: If set, apply the key norm to the current keys\n                before concatenating them with the past keys. This usually should be True, but\n                is set to False for KV prediction experiments.\n\n        Returns:\n            The output of the same shape as the input, optionally with a tensor containing cached keys and values.\n        \"\"\"\n        batch_size, seq_length, d_model = x.shape\n\n        # [batch_size, seq_length, d_model] --> [batch_size, seq_length, (num_q_heads + num_k_heads + num_v_heads) * head_dim]\n        qkv = self.qkv_proj(x)\n        # [batch_size, seq_length, (num_q_heads + num_k_heads + num_v_heads) * head_dim] --> [batch_size, seq_length, (num_q_heads + num_k_heads + num_v_heads), head_dim]\n        qkv = qkv.reshape(\n            batch_size,\n            seq_length,\n            self.num_q_heads + self.num_k_heads + self.num_v_heads,\n            self.head_dim,\n        )\n        # [batch_size, seq_length, (num_q_heads + num_k_heads + num_v_heads), head_dim] --> [batch_size, (num_q_heads + num_k_heads + num_v_heads), seq_length, head_dim]\n        qkv = qkv.transpose(1, 2)\n        # [batch_size, (num_q_heads + num_k_heads + num_v_heads), seq_length, head_dim] --> [batch_size, num_q_heads, seq_length, head_dim], [batch_size, num_k_heads, seq_length, head_dim], [batch_size, num_v_heads, seq_length, head_dim]\n        queries, keys, values = qkv.split(\n            [self.num_q_heads, self.num_k_heads, self.num_v_heads], dim=1\n        )\n\n        if self.q_norm is not None:\n            queries = self.q_norm(queries)\n\n        if self.k_norm is not None and apply_k_norm_before_cache_write:\n            keys = self.k_norm(keys)\n\n        if (\n            self.k_norm is not None\n            and past_keys is not None\n            and apply_k_norm_to_past_keys_before_cache_write\n        ):\n            past_keys = self.k_norm(past_keys)\n\n        if use_kv_cache:\n            if past_keys is not None:\n                assert past_values is not None\n                # concatenate past and current keys along the sequence dimension.\n                if concat_kvs:\n                    keys = torch.cat([past_keys, keys], dim=-2)\n                    values = torch.cat([past_values, values], dim=-2)\n                else:\n                    # Use only the past_keys and past_values as keys and values.\n                    # NOTE: we can skip the KV projection in this case.\n                    assert queries.shape[-2] == past_keys.shape[-2]\n                    assert queries.shape[-2] == past_values.shape[-2]\n                    keys = past_keys\n                    values = past_values\n            past_keys = keys\n            past_values = values\n\n        if self.k_norm is not None and not apply_k_norm_before_cache_write:\n            assert (\n                not apply_k_norm_to_past_keys_before_cache_write\n            ), \"k_norm has already been applied.\"\n            keys = self.k_norm(keys)\n\n        # Add positional embedding\n        queries, keys = self.pos_embedding(queries, keys)\n\n        if self.num_groups != 1:\n            # Group-query attention.\n            # [batch_size, num_k_heads, seq_length, head_dim] --> [batch_size, num_q_heads, seq_length, head_dim]\n            keys = keys.repeat_interleave(self.num_groups, dim=1)\n            # [batch_size, num_v_heads, seq_length, head_dim] --> [batch_size, num_q_heads, seq_length, head_dim]\n            values = values.repeat_interleave(self.num_groups, dim=1)\n\n        # scaled dot-product attention.\n        # The output of this operation has size of [batch_size, num_q_heads, seq_length, head_dim]\n        attn_output = F.scaled_dot_product_attention(\n            queries,\n            keys,\n            values,\n            attn_mask=None,\n            dropout_p=0,\n            is_causal=is_causal,\n        )\n        # [batch_size, num_q_heads, seq_length, head_dim] --> [batch_size, seq_length, num_q_heads, head_dim]\n        attn_output = attn_output.transpose(1, 2).contiguous()\n        # [batch_size, seq_length, num_q_heads, head_dim] --> [batch_size, seq_length, num_q_heads * head_dim]\n        attn_output = attn_output.reshape(\n            batch_size, seq_length, self.num_q_heads * self.head_dim\n        )\n        # [batch_size, seq_length, num_q_heads * head_dim] --> [batch_size, seq_length, d_model]\n        out = self.out_proj(attn_output)\n        return out, past_keys, past_values\n\n\nclass FeedForwardNetwork(nn.Module):\n    \"\"\"Feed-forward network.\n\n    Args:\n        opts: Command-line arguments.\n        model_config: Model configuration.\n        layer_idx: Layer index.\n    \"\"\"\n\n    def __init__(\n        self, opts: argparse.Namespace, model_config: GPTConfig, layer_idx: int\n    ) -> None:\n        super().__init__()\n        ffn_multiplier = model_config.ffn_multipliers[layer_idx]\n        intermediate_dim = int(\n            make_divisible(\n                ffn_multiplier * model_config.model_dim,\n                divisor=model_config.ffn_dim_divisor,\n            )\n        )\n        if model_config.ffn_with_glu:\n            # FFN with Gated linear unit, as described in https://arxiv.org/abs/2002.05202v1.\n            self.proj_1 = LinearLayer(\n                in_features=model_config.model_dim,\n                out_features=2 * intermediate_dim,\n                bias=False,\n            )\n            self.proj_2 = LinearLayer(\n                in_features=intermediate_dim,\n                out_features=model_config.model_dim,\n                bias=False,\n            )\n            self.ffn_with_glu = True\n        else:\n            # Standard FFN, as described in https://arxiv.org/abs/1706.03762\n            self.proj_1 = LinearLayer(\n                in_features=model_config.model_dim,\n                out_features=intermediate_dim,\n                bias=False,\n            )\n            self.proj_2 = LinearLayer(\n                in_features=intermediate_dim,\n                out_features=model_config.model_dim,\n                bias=False,\n            )\n            self.ffn_with_glu = False\n\n        self.act = build_activation_layer(\n            opts=opts, act_type=model_config.activation_fn_name\n        )\n\n    def extra_repr(self) -> str:\n        return super().extra_repr() + f\"(ffn_with_glu) : {self.ffn_with_glu}\"\n\n    def forward(self, x: Tensor) -> Tensor:\n        \"\"\"Forward function of FFN layer.\n\n        Args:\n            x: Input tensor of the shape [batch size, sequence length, model dimension].\n\n        Returns:\n            A tensor of the same shape as the input.\n        \"\"\"\n        if self.ffn_with_glu:\n            y_12 = self.proj_1(x)\n            y_1, y_2 = y_12.chunk(2, dim=-1)\n            y = self.act(y_1) * y_2\n            return self.proj_2(y)\n        else:\n            return self.proj_2(self.act(self.proj_1(x)))\n\n\nclass TransformerDecoderLayer(nn.Module):\n    \"\"\"Transformer decoder layer.\n\n    Args:\n        opts: Command-line arguments.\n        model_config: Model configuration.\n        layer_idx: Layer index.\n    \"\"\"\n\n    def __init__(\n        self, opts: argparse.Namespace, model_config: GPTConfig, layer_idx: int\n    ) -> None:\n        super().__init__()\n        self.attn = MultiHeadCausalAttention(\n            opts, model_config=model_config, layer_idx=layer_idx\n        )\n        self.ffn = FeedForwardNetwork(\n            opts, model_config=model_config, layer_idx=layer_idx\n        )\n        self.ffn_norm = get_normalization_layer(\n            opts,\n            num_features=model_config.model_dim,\n            norm_type=model_config.normalization_layer_name,\n        )\n        self.attn_norm = get_normalization_layer(\n            opts,\n            num_features=model_config.model_dim,\n            norm_type=model_config.normalization_layer_name,\n        )\n\n    def forward(\n        self,\n        x: Tensor,\n        past_keys: Optional[Tensor] = None,\n        past_values: Optional[Tensor] = None,\n        use_kv_cache: bool = False,\n        is_causal: bool = True,\n        concat_kvs: bool = True,\n        apply_k_norm_to_past_keys_before_cache_write=False,\n        apply_k_norm_before_cache_write=True,\n    ) -> Tuple[Tensor, Optional[Tensor], Optional[Tensor]]:\n        \"\"\"\n        Forward pass of decoder layer.\n\n        Args:\n            x: Input tensor of the shape [batch size, sequence length, model dimension].\n            past_keys: Tensor storing the cached keys.\n                The shape of tensor is [batch size, number of key heads, sequence length, head dimension].\n            past_values: Tensor storing the cached values. The shape of the tensor is the same as 'past_keys'.\n            use_kv_cache: Cache the output of key and value projection layers for faster inference.\n            is_causal: Specifies whether to apply causal masking in scaled dot-product attention.\n\n        Returns:\n            The output of the same shape as the input, optionally with a tensor containing cached keys and values.\n        \"\"\"\n        # Pre-norm attention.\n        y_attn = self.attn_norm(x)\n        y_attn, past_keys, past_values = self.attn(\n            y_attn,\n            past_keys,\n            past_values,\n            use_kv_cache,\n            is_causal,\n            concat_kvs,\n            apply_k_norm_to_past_keys_before_cache_write,\n            apply_k_norm_before_cache_write,\n        )\n        y_attn = x + y_attn\n\n        # Pre-norm FFN.\n        y_ffn = y_attn + self.ffn(self.ffn_norm(y_attn))\n        return y_ffn, past_keys, past_values\n\n\n@MODEL_REGISTRY.register(name=\"general_gpt\", type=\"language_modeling\")\nclass GeneralGPTModel(BaseLanguageModel):\n    \"\"\"General GPT model.\n\n    Args:\n        opts: Command-line arguments.\n    \"\"\"\n\n    config = GPTConfig\n\n    def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None:\n        super().__init__(opts, *args, **kwargs)\n        model_name = getattr(opts, \"model.language_modeling.general_gpt.model_name\")\n        if model_name is None:\n            logger.error(\n                \"Please specify model name using 'model.language_modeling.general_gpt.model_name' parameter in your configuration file.\"\n            )\n\n        vocab_size = getattr(opts, \"model.language_modeling.general_gpt.vocab_size\")\n        if vocab_size is None:\n            logger.error(\n                \"Please specify vocabulary size using 'model.language_modeling.general_gpt.vocab_size' parameter in your configuration file.\"\n            )\n\n        max_context_length = getattr(\n            opts, \"model.language_modeling.general_gpt.max_context_length\"\n        )\n        if max_context_length is None:\n            logger.error(\n                \"Please specify maximum context length using 'model.language_modeling.general_gpt.max_context_length' parameter in your configuration file.\"\n            )\n\n        padding_index = getattr(\n            opts, \"model.language_modeling.general_gpt.padding_index\"\n        )\n\n        model_config = self.config.from_name(\n            model_name=model_name,\n            vocab_size=vocab_size,\n            max_context_length=max_context_length,\n        )\n        self.token_embeddings = Embedding(\n            opts,\n            embedding_dim=model_config.model_dim,\n            num_embeddings=model_config.vocab_size,\n            padding_idx=padding_index,\n        )\n\n        self.layers = nn.ModuleList(\n            TransformerDecoderLayer(\n                opts, model_config=model_config, layer_idx=layer_idx\n            )\n            for layer_idx in range(model_config.num_transformer_layers)\n        )\n        self.norm = get_normalization_layer(\n            opts,\n            num_features=model_config.model_dim,\n            norm_type=model_config.normalization_layer_name,\n        )\n\n        if model_config.share_input_output_layers:\n            self.classifier = None\n        else:\n            self.classifier = LinearLayer(\n                in_features=model_config.model_dim,\n                out_features=model_config.vocab_size,\n                bias=False,\n            )\n        self.reset_parameters(model_config=model_config)\n        self.num_transformer_layers = model_config.num_transformer_layers\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        \"\"\"Add General GPT model arguments.\"\"\"\n        if cls == GeneralGPTModel:\n            group = parser.add_argument_group(cls.__name__)\n            group.add_argument(\n                \"--model.language-modeling.general-gpt.model-name\",\n                type=str,\n                default=None,\n                choices=list(gpt_configs.keys()),\n                help=\"Name of the generative transformer-based LM model. Defaults to None (i.e., user need to specify the model name.).\",\n            )\n            group.add_argument(\n                \"--model.language-modeling.general-gpt.max-context-length\",\n                type=int,\n                default=None,\n                help=\"Maximum context length. Defaults to None (i.e., user needs to specify the maximum contenxt length value.).\",\n            )\n            group.add_argument(\n                \"--model.language-modeling.general-gpt.vocab-size\",\n                type=int,\n                default=None,\n                help=\"Vocabulary size. Defaults to None (i.e., user needs to specify the vocabulary size.).\",\n            )\n            group.add_argument(\n                \"--model.language-modeling.general-gpt.padding-index\",\n                type=int,\n                default=None,\n                help=\"Padding index. Defaults to None (i.e., no padding).\",\n            )\n        return parser\n\n    def forward(\n        self,\n        model_input: Union[Tensor, Dict[str, Tensor]],\n        concat_kvs: bool = True,\n        apply_k_norm_to_past_keys_before_cache_write=False,\n        apply_k_norm_before_cache_write=True,\n    ) -> Union[Tensor, Dict[str, Tensor]]:\n        \"\"\"Forward function of GPT model.\n\n        Args:\n            model_input: Input to the model. It can be a tensor or a dictionary.\n                In case of a tensor, the expected shape is [batch size, sequence length].\n                In case of a dictionary, the expected keys are 'input_ids', 'past_keys', 'past_values',\n                'use_kv_cache', and 'is_causal'. The shape of the values for each key is:\n                    {\n                        \"input_ids\": [batch size, sequence length],\n                        \"past_keys\": [ [batch size, number of key heads, sequence length, head dimension] ]* number of transformer layers,\n                        \"past_values\": [ [batch size, number of value heads, sequence length, head dimension] ] * number of transformer layers,\n                        \"use_kv_cache\": boolean,\n                        \"is_causal\": boolean,\n                    }\n                where\n                    'input_ids' represents input token indices.\n                    'past_keys' and 'past_values' represents the cached tensor outputs of key and value branch in multi-head attention respectively.\n                        These values can be None.\n                    'use_kv_cache' indicates to use KV caching or not.\n                    'is_causal' indicates to use causal masking in scaled dot-product attention or not.\n            concat_kvs: If set, the keys produced by the QKV projection will be concatenated\n                with the past keys. Usually this value should be True, but it needs to be False\n                for KV Prediction experiments.\n            apply_k_norm_to_past_keys_before_cache_write: If set, apply the key norm to past keys\n                before updating the KV cache. This usually should be False, but is set to True\n                for KV prediction experiments.\n            apply_k_norm_before_cache_write: If set, apply the key norm to the current keys\n                before concatenating them with the past keys. This usually should be True, but\n                is set to False for KV prediction experiments.\n\n        Returns:\n            Output of the model.\n            1. When 'use_kv_cache' is enabled, a dictionary with 'logits', 'past_keys', and 'past_values' is returned.\n            The expected shape of the values is\n                {\n                    \"logits\": [batch size, sequence length, vocabular size],\n                    \"past_keys\": [ [batch size, number of key heads, sequence length, head dimension] ] * number of transformer layers,\n                    \"past_values\": [ [batch size, number of value heads, sequence length, head dimension] ] * number of transformer layers,\n                }\n            2. Logits tensor is returned. The shape of logits tensor is [batch size, sequence length, vocabulary size].\n\n        ...note:\n            1. For pre-training, 'model_input' is typically a tensor.\n            2. For inference, we have two scenarios.\n                2.a. Processing prefix or prompt: When dealing with a prefix or prompt, it is expected that the 'sequence length' is more than one and past keys\n                    or values are None. If the intention of the user is to perform generation following a prefix, it's recommended to provide the prefix inputs\n                    as a dictionary, specifying 'use_kv_cache=True', 'is_causal=True', 'past_keys=None', and 'past_values=None'. Otherwise, users should pass token\n                    indices as a tensor.\n\n                2.b. Generation: In this case, 'sequence length' should be one. In other words, one token is generated at a time with KV caching.\n                    Ideally, when using KV caching, 'is_causal' should be set to False.\n\n            The generation logic may vary from task to task and we rely on user for correctly passing the inputs.\n        \"\"\"\n        if isinstance(model_input, dict):\n            expected_input_keys = {\n                \"input_ids\",\n                \"past_keys\",\n                \"past_values\",\n                \"use_kv_cache\",\n                \"is_causal\",\n            }\n\n            assert expected_input_keys == set(\n                model_input.keys()\n            ), f\"Model input does not contain all keys. Expected keys are {expected_input_keys}, but got {set(model_input.keys())}.\"\n\n            input_ids = model_input[\"input_ids\"]\n            past_keys = model_input[\"past_keys\"]\n            past_values = model_input[\"past_values\"]\n            use_kv_cache = model_input[\"use_kv_cache\"]\n            is_causal = model_input[\"is_causal\"]\n            if past_keys is None:\n                assert past_values is None\n                past_keys = [None] * self.num_transformer_layers\n                past_values = [None] * self.num_transformer_layers\n        elif isinstance(model_input, Tensor):\n            input_ids = model_input\n            past_keys = [None] * self.num_transformer_layers\n            past_values = [None] * self.num_transformer_layers\n            use_kv_cache = False\n            is_causal = True\n        else:\n            raise NotImplementedError(\n                f\"Supported input types are either Tensor or Dictionary. Got: {type(model_input)}.\"\n            )\n\n        x = self.token_embeddings(input_ids)\n\n        for layer_idx in range(self.num_transformer_layers):\n            past_keys_layer_i = past_keys[layer_idx]\n            past_values_layer_i = past_values[layer_idx]\n\n            x, past_keys_layer_i, past_values_layer_i = self.layers[layer_idx](\n                x,\n                past_keys_layer_i,\n                past_values_layer_i,\n                use_kv_cache,\n                is_causal,\n                concat_kvs,\n                apply_k_norm_to_past_keys_before_cache_write,\n                apply_k_norm_before_cache_write,\n            )\n            # update the kv cache\n            past_keys[layer_idx] = past_keys_layer_i\n            past_values[layer_idx] = past_values_layer_i\n\n        x = self.norm(x)\n        if self.classifier is None:\n            logits = F.linear(x, weight=self.token_embeddings.weight)\n        else:\n            logits = self.classifier(x)\n\n        if use_kv_cache:\n            return {\n                \"logits\": logits,\n                \"past_keys\": past_keys,\n                \"past_values\": past_values,\n            }\n        else:\n            return logits\n\n    def get_fsdp_wrap_policy(\n        self,\n    ) -> Callable[[torch.nn.Module, bool, int], bool]:\n        \"\"\"Returns the FSDP policy.\"\"\"\n        general_gpt_auto_wrap_policy = functools.partial(\n            transformer_auto_wrap_policy,\n            transformer_layer_cls={TransformerDecoderLayer},\n        )\n        return general_gpt_auto_wrap_policy\n\n    def get_activation_checkpoint_submodule_class(self) -> Callable:\n        \"\"\"Returns the layer that should be used for activation checkpointing.\"\"\"\n        return TransformerDecoderLayer\n\n    def reset_parameters(self, model_config: GPTConfig) -> None:\n        \"\"\"Initialize the parameters of language model.\n\n        Args:\n            model_config: Model configuration.\n        \"\"\"\n        for module in self.modules():\n            if isinstance(module, (LinearLayer, nn.Linear)):\n                std = module.in_features**-0.5\n                torch.nn.init.normal_(module.weight, mean=0.0, std=std)\n                if module.bias is not None:\n                    torch.nn.init.zeros_(module.bias)\n            elif isinstance(module, (nn.Embedding, Embedding)):\n                std = module.embedding_dim**-0.5\n                torch.nn.init.normal_(module.weight, mean=0.0, std=std)\n            elif isinstance(module, norm_layers_tuple):\n                if module.weight is not None:\n                    torch.nn.init.ones_(module.weight)\n                if hasattr(module, \"bias\") and module.bias is not None:\n                    torch.nn.init.zeros_(module.bias)\n\n        model_dim = model_config.model_dim\n        n_layers = model_config.num_transformer_layers\n        # standard deviation of output layers in transformer block is scaled,\n        # following https://arxiv.org/pdf/2205.01068.pdf\n        std = (model_dim**-0.5) * ((2 * n_layers) ** -0.5)\n        for param_name, param in self.named_parameters():\n            if param_name.endswith(\"out_proj.weight\") or param_name.endswith(\n                \"ffn.proj_2.weight\"\n            ):\n                torch.nn.init.normal_(param, mean=0.0, std=std)\n\n    def head_dim_at_layer(self, i: int) -> int:\n        return self.layers[i].attn.head_dim\n\n    def k_dim_at_layer(self, i: int) -> int:\n        return self.layers[i].attn.head_dim * self.layers[i].attn.num_k_heads\n\n    def v_dim_at_layer(self, i: int) -> int:\n        return self.layers[i].attn.head_dim * self.layers[i].attn.num_v_heads\n\n    def k_num_heads_at_layer(self, i: int) -> int:\n        return self.layers[i].attn.num_k_heads\n\n    def v_num_heads_at_layer(self, i: int) -> int:\n        return self.layers[i].attn.num_v_heads\n"
  },
  {
    "path": "corenet/modeling/models/language_modeling/kv_prediction.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\n\"\"\"\nA KV Prediction Model (https://arxiv.org/abs/2410.08391).\n\nThe model contains 2 submodels. The smaller \"auxiliary\"\nmodel is used to quickly process context. The larger\n\"base\" model is used to perform generation without\ncompromising accuracy.\n\"\"\"\n\nimport argparse\nimport copy\nimport itertools\nfrom dataclasses import dataclass\nfrom typing import Any, Callable, Dict, List, Optional, Tuple, Union\n\nimport torch\nfrom torch import Tensor, nn\n\nfrom corenet.modeling.models import MODEL_REGISTRY, get_model\nfrom corenet.modeling.models.language_modeling import general_gpt\nfrom corenet.modeling.models.language_modeling.base_lm import BaseLanguageModel\nfrom corenet.options.parse_args import JsonValidator\nfrom corenet.options.utils import flatten_yaml_as_dict\n\n\n@dataclass\nclass LayerPrunedGPTConfig(general_gpt.GPTConfig):\n    select_layers: Optional[List[int]] = None\n\n    def __post_init__(self) -> None:\n        super().__post_init__()\n\n        if self.select_layers is not None:\n            # Remove unselected layers.\n            self.num_transformer_layers = len(self.select_layers)\n            self.num_query_heads = [self.num_query_heads[i] for i in self.select_layers]\n            self.num_kv_heads = [self.num_kv_heads[i] for i in self.select_layers]\n            self.ffn_multipliers = [self.ffn_multipliers[i] for i in self.select_layers]\n\n    @classmethod\n    def from_name(\n        cls, model_name: str, vocab_size: int, max_context_length: int\n    ) -> \"LayerPrunedGPTConfig\":\n        if model_name in layer_pruned_gpt_configs:\n            config = layer_pruned_gpt_configs[model_name]\n        else:\n            raise NotImplementedError(f\"{model_name} is not yet implemented\")\n\n        config[\"vocab_size\"] = vocab_size\n        config[\"max_context_length\"] = max_context_length\n        return cls(**config)\n\n\nlayer_pruned_gpt_configs = {\n    \"gpt-test-base\": dict(\n        num_transformer_layers=3,\n        model_dim=128,\n        head_dim=64,\n        num_gqa_groups=1,\n        normalize_qk_projections=True,\n        share_input_output_layers=True,\n        # Vary the FFN and QKV multiplier to create variable FFN and attention layers respectively.\n        ffn_multipliers=(0.25, 0.75),\n        qkv_multipliers=(0.25, 0.5),\n    ),\n    \"gpt-test-aux\": dict(\n        num_transformer_layers=2,\n        model_dim=128,\n        head_dim=48,\n        num_gqa_groups=1,\n        normalize_qk_projections=True,\n        share_input_output_layers=True,\n        # Vary the FFN and QKV multiplier to create variable FFN and attention layers respectively.\n        ffn_multipliers=(0.25, 0.75),\n        qkv_multipliers=(0.25, 0.5),\n    ),\n    \"OpenELM-1_1B-0.25l\": dict(\n        num_transformer_layers=28,\n        model_dim=2048,\n        head_dim=64,\n        num_gqa_groups=4,\n        normalize_qk_projections=True,\n        share_input_output_layers=True,\n        # Vary the FFN and QKV multiplier to create variable FFN and attention layers respectively.\n        ffn_multipliers=(0.5, 4.0),\n        qkv_multipliers=(0.5, 1.0),\n        select_layers=[0, 4, 8, 12, 16, 20, 24],\n    ),\n    \"OpenELM-1_1B-0.50l\": dict(\n        num_transformer_layers=28 // 2,\n        model_dim=2048,\n        head_dim=64,\n        num_gqa_groups=4,\n        normalize_qk_projections=True,\n        share_input_output_layers=True,\n        # Vary the FFN and QKV multiplier to create variable FFN and attention layers respectively.\n        ffn_multipliers=(0.5, (4.0) - (1 / (28 - 1)) * (4.0 - 0.5)),\n        qkv_multipliers=(0.5, (1.0) - (1 / (28 - 1)) * (1.0 - 0.5)),\n    ),\n    \"OpenELM-1_1B-0.75l\": dict(\n        num_transformer_layers=28,\n        model_dim=2048,\n        head_dim=64,\n        num_gqa_groups=4,\n        normalize_qk_projections=True,\n        share_input_output_layers=True,\n        # Vary the FFN and QKV multiplier to create variable FFN and attention layers respectively.\n        ffn_multipliers=(0.5, 4.0),\n        qkv_multipliers=(0.5, 1.0),\n        select_layers=[\n            0,\n            1,\n            2,\n            4,\n            5,\n            6,\n            8,\n            9,\n            10,\n            12,\n            13,\n            14,\n            16,\n            17,\n            18,\n            20,\n            21,\n            22,\n            24,\n            25,\n            26,\n        ],\n    ),\n    \"OpenELM-3B-0.25l\": dict(\n        num_transformer_layers=36,\n        model_dim=3072,\n        head_dim=128,\n        num_gqa_groups=4,\n        normalize_qk_projections=True,\n        share_input_output_layers=True,\n        # Vary the FFN and QKV multiplier to create variable FFN and attention layers respectively.\n        ffn_multipliers=(0.5, 4.0),\n        qkv_multipliers=(0.5, 1.0),\n        select_layers=[0, 4, 8, 12, 16, 20, 24, 28, 32],\n    ),\n    \"OpenELM-3B-0.50l\": dict(\n        num_transformer_layers=36 // 2,\n        model_dim=3072,\n        head_dim=128,\n        num_gqa_groups=4,\n        normalize_qk_projections=True,\n        share_input_output_layers=True,\n        # Vary the FFN and QKV multiplier to create variable FFN and attention layers respectively.\n        ffn_multipliers=(0.5, (4.0) - (1 / (36 - 1)) * (4.0 - 0.5)),\n        qkv_multipliers=(0.5, (1.0) - (1 / (36 - 1)) * (1.0 - 0.5)),\n    ),\n    \"OpenELM-3B-0.75l\": dict(\n        num_transformer_layers=36,\n        model_dim=3072,\n        head_dim=128,\n        num_gqa_groups=4,\n        normalize_qk_projections=True,\n        share_input_output_layers=True,\n        # Vary the FFN and QKV multiplier to create variable FFN and attention layers respectively.\n        ffn_multipliers=(0.5, 4.0),\n        qkv_multipliers=(0.5, 1.0),\n        select_layers=[\n            0,\n            1,\n            2,\n            4,\n            5,\n            6,\n            8,\n            9,\n            10,\n            12,\n            13,\n            14,\n            16,\n            17,\n            18,\n            20,\n            21,\n            22,\n            24,\n            25,\n            26,\n            28,\n            29,\n            30,\n            32,\n            33,\n            34,\n        ],\n    ),\n}\n\n\n@MODEL_REGISTRY.register(name=\"layer_pruned_general_gpt\", type=\"language_modeling\")\nclass LayerPrunedGeneralGPTModel(general_gpt.GeneralGPTModel):\n    \"\"\"Layer Pruned General GPT model.\n\n    Functions the same as GeneralGPTModel, but provides different available\n    model configurations.\n    \"\"\"\n\n    config = LayerPrunedGPTConfig\n\n\nclass AuxLayerToBaseLayer(nn.Module):\n    \"\"\"\n    The mapping from auxiliary layers to base layers.\n\n    Used in KV Prediction to map auxiliary cache layers to base cache\n    layers.\n\n    Args:\n        auxkv_num_layers_to_basekv_num_layers: A list of length equal to\n            the number of layers in the base model. The ith element tells\n            which layer in the auxiliary cache gets mapped to the ith\n            layer in the base cache.\n    \"\"\"\n\n    def __init__(self, auxkv_num_layers_to_basekv_num_layers: List[int]) -> None:\n        super().__init__()\n        self.auxkv_num_layers_to_basekv_num_layers = (\n            auxkv_num_layers_to_basekv_num_layers\n        )\n\n    def forward(\n        self, past_keys: List[Tensor], past_values: List[Tensor]\n    ) -> List[Tensor]:\n        \"\"\"\n        Args:\n            past_keys: [ [batch size, number of key heads, sequence length, head dimension] ] * number of transformer layers,\n            past_values: Same shape as past_keys.\n        Returns:\n            The remapped cache.\n        \"\"\"\n        ret_keys = [past_keys[i] for i in self.auxkv_num_layers_to_basekv_num_layers]\n        ret_values = [\n            past_values[i] for i in self.auxkv_num_layers_to_basekv_num_layers\n        ]\n        return [ret_keys, ret_values]\n\n\nclass LinearAuxKVToBaseKV(nn.Module):\n    \"\"\"\n    A linear mapping from KV cache elements of one dimensionality\n    to KV cache elements of another dimensionality.\n\n    Args:\n        auxiliary_k_dims: A list containing the size of the auxiliary key dimension\n            for each layer of the auxiliary KV cache.\n        auxiliary_v_dims: A list containing the size of the auxiliary value dimension\n            for each layer of the auxiliary KV cache.\n        base_k_dims: A list containing the size of the base key dimension\n            for each layer of the base KV cache.\n        base_v_dims: A list containing the size of the base value dimension\n            for each layer of the base KV cache.\n        base_k_num_heads: A list containing the number of heads\n            for each layer of the base KV cache.\n        base_v_num_heads: A list containing the number of heads\n            for each layer of the base KV cache.\n    \"\"\"\n\n    def __init__(\n        self,\n        auxiliary_k_dims: List[int],\n        auxiliary_v_dims: List[int],\n        base_k_dims: List[int],\n        base_v_dims: List[int],\n        base_k_num_heads: List[int],\n        base_v_num_heads: List[int],\n    ) -> None:\n        super().__init__()\n\n        # Inputs will be [batch_size, seq_len, dim].\n        self.key_transforms = nn.ModuleList(\n            [\n                nn.Linear(auxiliary_k_dim, base_k_dim)\n                for auxiliary_k_dim, base_k_dim in zip(auxiliary_k_dims, base_k_dims)\n            ]\n        )\n        self.value_transforms = nn.ModuleList(\n            [\n                nn.Linear(auxiliary_v_dim, base_v_dim)\n                for auxiliary_v_dim, base_v_dim in zip(auxiliary_v_dims, base_v_dims)\n            ]\n        )\n\n        self.base_k_num_heads = base_k_num_heads\n        self.base_v_num_heads = base_v_num_heads\n\n    def forward(\n        self, past_keys: List[Tensor], past_values: List[Tensor]\n    ) -> List[List[Tensor]]:\n        \"\"\"\n        Args:\n            past_keys: [ [batch size, number of key heads, sequence length, head dimension] ] * number of transformer layers,\n            past_values: Same shape as past_keys.\n        Returns:\n            A list of two elements. The first contains the predicted keys, the second contains the predicted values. Their\n                shapes are:\n                  - [ [batch size, output number of key heads, sequence length, output head dimension] ] * number of\n                    transformer layers\n                  - [ [batch size, output number of value heads, sequence length, output head dimension] ] * number of\n                    transformer layers\n        \"\"\"\n\n        def get_transformed_cache(\n            transforms,\n            caches,\n            output_num_heads,\n        ):\n            rets = []\n            for layer_transform, layer_cache, output_num_head in zip(\n                transforms, caches, output_num_heads\n            ):\n                batch_size, num_heads, seq_len, head_dim = layer_cache.shape\n                layer_cache = layer_cache.permute(0, 2, 1, 3).reshape(\n                    batch_size, seq_len, num_heads * head_dim\n                )\n                layer_cache = layer_transform(layer_cache)\n                layer_cache = layer_cache.reshape(\n                    batch_size, seq_len, output_num_head, -1\n                )  # Inferred dim is new head dim.\n                layer_cache = layer_cache.permute(0, 2, 1, 3)\n                rets.append(layer_cache)\n            return rets\n\n        return [\n            get_transformed_cache(\n                self.key_transforms, past_keys, self.base_k_num_heads\n            ),\n            get_transformed_cache(\n                self.value_transforms, past_values, self.base_v_num_heads\n            ),\n        ]\n\n    def set_as_identity(self) -> None:\n        \"\"\"\n        Reset this layer to compute the identity. Mainly for testing.\n        \"\"\"\n        for t in itertools.chain(self.key_transforms, self.value_transforms):\n            dim1, dim2 = t.weight.shape\n            assert dim1 == dim2, f\"Expected a square matrix.\"\n            matr = torch.eye(dim1, dtype=t.weight.dtype, device=t.weight.device)\n            t.weight[:, :] = matr\n            t.bias.fill_(0)\n\n\nclass KVPredicter(nn.Module):\n    \"\"\"\n    Class containing tools needed to perform KV prediction.\n\n    Args:\n        auxkv_num_layers_to_basekv_num_layers: A list of length equal to\n            the number of layers in the base model. The ith element tells\n            which layer in the auxiliary cache gets mapped to the ith\n            layer in the base cache.\n        auxiliary_k_dims: A list containing the size of the auxiliary key dimension\n            for each layer of the auxiliary KV cache.\n        auxiliary_v_dims: A list containing the size of the auxiliary value dimension\n            for each layer of the auxiliary KV cache.\n        base_k_dims: A list containing the size of the base key dimension\n            for each layer of the base KV cache.\n        base_v_dims: A list containing the size of the base value dimension\n            for each layer of the base KV cache.\n        base_k_num_heads: A list containing the number of heads\n            for each layer of the base KV cache.\n        base_v_num_heads: A list containing the number of heads\n            for each layer of the base KV cache.\n    \"\"\"\n\n    def __init__(\n        self,\n        auxkv_num_layers_to_basekv_num_layers: List[int],\n        auxiliary_k_dims: List[int],\n        auxiliary_v_dims: List[int],\n        base_k_dims: List[int],\n        base_v_dims: List[int],\n        base_k_num_heads: List[int],\n        base_v_num_heads: List[int],\n    ) -> None:\n        super().__init__()\n        self.auxkv_num_layers_to_basekv_num_layers = (\n            auxkv_num_layers_to_basekv_num_layers\n        )\n        self.auxiliary_k_dims = auxiliary_k_dims\n        self.auxiliary_v_dims = auxiliary_v_dims\n        self.base_k_dims = base_k_dims\n        self.base_v_dims = base_v_dims\n        self.base_k_num_heads = base_k_num_heads\n        self.base_v_num_heads = base_v_num_heads\n\n        self.build_kv_cache_predicters()\n\n    @property\n    def base_layers(self) -> int:\n        return len(self.base_k_dims)\n\n    @property\n    def auxiliary_layers(self) -> int:\n        return len(self.auxiliary_k_dims)\n\n    def build_kv_cache_predicters(self) -> None:\n        \"\"\"\n        Initialize the KV cache prediction modules.\n        \"\"\"\n        # Each index should be [0, num_aux_layers).\n        if not all(\n            0 <= k < self.auxiliary_layers\n            for k in self.auxkv_num_layers_to_basekv_num_layers\n        ):\n            raise ValueError(\n                \"Expected layer mappings in the range \"\n                f\"[0, num_aux_layers={self.auxiliary_layers}). \"\n                f\"Invalid layer mappings {self.auxkv_num_layers_to_basekv_num_layers=}.\"\n            )\n        self.auxiliary_to_base_layer_mapping = AuxLayerToBaseLayer(\n            self.auxkv_num_layers_to_basekv_num_layers\n        )\n\n        auxkv_num_layers_to_basekv_num_layers = (\n            self.auxkv_num_layers_to_basekv_num_layers\n        )\n\n        def remap(x: List[int]) -> List[int]:\n            return [x[i] for i in auxkv_num_layers_to_basekv_num_layers]\n\n        self.auxkv_to_basekv = LinearAuxKVToBaseKV(\n            remap(self.auxiliary_k_dims),\n            remap(self.auxiliary_v_dims),\n            (self.base_k_dims),\n            (self.base_v_dims),\n            (self.base_k_num_heads),\n            (self.base_v_num_heads),\n        )\n\n    def forward(\n        self, auxiliary_outputs: Dict[str, Any]\n    ) -> Tuple[List[torch.Tensor], List[torch.Tensor]]:\n        \"\"\"\n        Get the predicted KV cache for the base model using the outputs\n        from the auxiliary model.\n\n        Our prediction operates on merged heads. Thus, we need to reorganize the key-value\n        cache to merge heads.\n\n        Args:\n            auxiliary_outputs: A dictionary with:\n                {\n                    \"logits\": [batch size, sequence length, vocabular size],\n                    \"past_keys\": [ [batch size, number of key heads, sequence length, head dimension] ] * num_aux_layers\n                    \"past_values\": [ [batch size, number of value heads, sequence length, head dimension] ] * num_aux_layers\n                }\n        Returns:\n            A tuple of 2 lists, containing the predictions of the KV cache for the base model:\n                (\n                    [ [batch size, number of key heads, sequence length, head dimension] ] * num_base_layers\n                    [ [batch size, number of value heads, sequence length, head dimension] ] * num_base_layers\n                )\n        \"\"\"\n        intermediate_cache = self.auxiliary_to_base_layer_mapping(\n            auxiliary_outputs[\"past_keys\"], auxiliary_outputs[\"past_values\"]\n        )\n        return self.auxkv_to_basekv(*intermediate_cache)\n\n\ndef get_overrided_opts(\n    opts: argparse.Namespace, config: Dict[str, Any]\n) -> argparse.Namespace:\n    \"\"\"\n    Get a copy of @opts with overrides from @config applied.\n\n    Args:\n        opts: The opts to copy.\n        config: A dictionary with overrides.\n\n    Returns:\n        A copy of @opts with the overrides applied.\n    \"\"\"\n    ret = copy.deepcopy(opts)\n    flattened_config = flatten_yaml_as_dict(config)\n    for k, v in flattened_config.items():\n        setattr(ret, k, v)\n    return ret\n\n\n@MODEL_REGISTRY.register(name=\"kv_prediction\", type=\"language_modeling\")\nclass KVPredictionLLM(BaseLanguageModel):\n    \"\"\"General KV Prediction LLM model.\n\n    Args:\n        opts: Command-line arguments.\n    \"\"\"\n\n    def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None:\n        super().__init__(opts, *args, **kwargs)\n\n        # As a workaround, we make this a list, to prevent the parser from throwing\n        # an error about unexpected keys.\n        base_model_config = getattr(\n            opts, \"model.language_modeling.kv_prediction.base_model\"\n        )[0]\n        base_opts = get_overrided_opts(opts, base_model_config)\n        self.base = get_model(base_opts)\n\n        auxiliary_model_config = getattr(\n            opts, \"model.language_modeling.kv_prediction.auxiliary_model\"\n        )[0]\n        auxiliary_opts = get_overrided_opts(opts, auxiliary_model_config)\n        self.auxiliary = get_model(auxiliary_opts)\n\n        # Process arguments and build the KVPredicter.\n        auxkv_num_layers_to_basekv_num_layers = getattr(\n            opts,\n            \"model.language_modeling.kv_prediction.auxkv_num_layers_to_basekv_num_layers\",\n        )\n        assert isinstance(auxkv_num_layers_to_basekv_num_layers, list)\n        assert all(isinstance(x, int) for x in auxkv_num_layers_to_basekv_num_layers)\n        auxiliary_k_dims = [\n            self.auxiliary.k_dim_at_layer(i) for i in range(len(self.auxiliary.layers))\n        ]\n        auxiliary_v_dims = [\n            self.auxiliary.v_dim_at_layer(i) for i in range(len(self.auxiliary.layers))\n        ]\n        base_k_dims = [\n            self.base.k_dim_at_layer(i) for i in range(len(self.base.layers))\n        ]\n        base_v_dims = [\n            self.base.v_dim_at_layer(i) for i in range(len(self.base.layers))\n        ]\n        base_k_num_heads = [\n            self.base.k_num_heads_at_layer(i) for i in range(len(self.base.layers))\n        ]\n        base_v_num_heads = [\n            self.base.v_num_heads_at_layer(i) for i in range(len(self.base.layers))\n        ]\n\n        self.predicter = KVPredicter(\n            auxkv_num_layers_to_basekv_num_layers=auxkv_num_layers_to_basekv_num_layers,\n            auxiliary_k_dims=auxiliary_k_dims,\n            auxiliary_v_dims=auxiliary_v_dims,\n            base_k_dims=base_k_dims,\n            base_v_dims=base_v_dims,\n            base_k_num_heads=base_k_num_heads,\n            base_v_num_heads=base_v_num_heads,\n        )\n\n        self.dtype = next(self.base.parameters()).dtype\n        self.predicter.to(self.dtype)\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        if cls == KVPredictionLLM:\n            group = parser.add_argument_group(cls.__name__)\n            group.add_argument(\n                \"--model.language-modeling.kv-prediction.auxkv-num-layers-to-basekv-num-layers\",\n                type=str,\n                help=\"The mapping from auxiliary layers to base model layers. The element \"\n                \"at index i is used to tell which Auxiliary layer is used to predict the KV \"\n                \"cache at Base layer i.\",\n            )\n            group.add_argument(\n                \"--model.language-modeling.kv-prediction.base-model\",\n                type=JsonValidator,\n                help=\"A config for the base model.\",\n            )\n            group.add_argument(\n                \"--model.language-modeling.kv-prediction.auxiliary-model\",\n                type=JsonValidator,\n                help=\"A config for the auxiliary model.\",\n            )\n        return parser\n\n    def predict_kv_cache(self, auxiliary_outputs: Dict[str, Any]) -> List[List[Tensor]]:\n        \"\"\"\n        Predict the base KV cache from the auxiliary KV cache.\n\n        Args:\n            auxiliary_outputs: The full outputs of the auxiliary model, as a dictionary:\n                {\n                    \"logits\": [batch size, sequence length, vocabular size],\n                    \"past_keys\": [ [batch size, number of key heads, sequence length, head dimension] ] * number of transformer layers,\n                    \"past_values\": [ [batch size, number of value heads, sequence length, head dimension] ] * number of transformer layers,\n                }\n        Returns:\n            The predicted KV cache for the base model. It is a list of two elements. The first contains\n            the predicted keys, the second contains the predicted values. Their shapes are:\n                  - [ [batch size, output number of key heads, sequence length, output head dimension] ] * number of\n                    transformer layers\n                  - [ [batch size, output number of value heads, sequence length, output head dimension] ] * number of\n                    transformer layers\n\n        \"\"\"\n        predicted_cache = self.predicter(auxiliary_outputs)\n        return [\n            [x for x in predicted_cache[0]],\n            [x for x in predicted_cache[1]],\n        ]\n\n    def forward(\n        self, model_input: Union[Tensor, Dict[str, Tensor]], base_only: bool = False\n    ) -> Tensor:\n        \"\"\"\n        Run the forward pass of the KVPredictionLLM.\n\n        If the KV cache is configured to be used, we assume evaluation is happening.\n        In this case:\n            1) If the cache is currently empty (which is a sign that we are still processing\n               the prompt), we predict the KV cache with the auxiliary model and the predicter\n               network (which contains linear layers). Then, we perform a step of generation.\n            2) If the cache is not currently empty, we only perform a step of generation.\n\n        If the KV cache is not configured to be used, we perform a training step. This\n        involves generating a cache prediction (using the auxiliary network and predicter\n        network), then generating outputs with the base model using the cache prediction.\n        Gradients flow back to the auxiliary model through the predicted KV cache.\n\n        NOTE: base_only is reserved exclusively for testing purposes.\n\n        Args:\n            model_input: A model input suitable for general_gpt.GeneralGPT.forward.\n            base_only: If set, only perform the forward pass with the base model.\n                Used for testing.\n        Returns:\n            The output logits and the updated KV cache.\n        \"\"\"\n        # Process the inputs.\n        if isinstance(model_input, dict):\n            expected_input_keys = {\n                \"input_ids\",\n                \"past_keys\",\n                \"past_values\",\n                \"use_kv_cache\",\n                \"is_causal\",\n            }\n            for expected_key in expected_input_keys:\n                assert (\n                    expected_key in model_input\n                ), f\"Model input does not contain {expected_key}\"\n\n            input_ids = model_input[\"input_ids\"]\n            past_keys = model_input[\"past_keys\"]\n            past_values = model_input[\"past_values\"]\n            use_kv_cache = model_input[\"use_kv_cache\"]\n            if past_keys is None:\n                assert past_values is None\n                past_keys = [None] * len(self.base.layers)\n                past_values = [None] * len(self.base.layers)\n        elif isinstance(model_input, Tensor):\n            input_ids = model_input\n            past_keys = [None] * len(self.base.layers)\n            past_values = [None] * len(self.base.layers)\n            use_kv_cache = False\n        else:\n            raise NotImplementedError(\n                f\"Supported input types are either Tensor or Dictionary. Got: {type(model_input)}.\"\n            )\n\n        if base_only:\n            if isinstance(model_input, dict):\n                is_causal = model_input.get(\"is_causal\", True)\n            else:\n                is_causal = True\n            return self.base(\n                {\n                    \"input_ids\": input_ids,\n                    \"past_keys\": past_keys,\n                    \"past_values\": past_values,\n                    \"use_kv_cache\": use_kv_cache,\n                    \"is_causal\": is_causal,\n                }\n            )\n\n        if use_kv_cache:\n            # A user-provided KV cache is given. We are in evaluation mode.\n            # There are two cases. If the past_keys and past_values\n            # are empty, we populate the cache with the auxiliary model, then\n            # perform a generation step. If they are not empty, we simply\n            # proceed with the base model in generation mode.\n            cache_is_empty = past_keys[0] is None\n            if cache_is_empty:\n                # Populate the KV cache, then perform a single-token\n                # generation step with the base model.\n                past_keys = [None] * len(self.auxiliary.layers)\n                past_values = [None] * len(self.auxiliary.layers)\n                auxiliary_outputs = self.auxiliary(\n                    {\n                        \"input_ids\": input_ids[:, :-1],\n                        \"past_keys\": past_keys,\n                        \"past_values\": past_values,\n                        \"use_kv_cache\": use_kv_cache,\n                        \"is_causal\": True,\n                    },\n                    concat_kvs=True,\n                    apply_k_norm_to_past_keys_before_cache_write=False,  # Do not apply K norm. It will be applied in the base model.\n                    apply_k_norm_before_cache_write=False,\n                )\n                past_keys, past_values = self.predict_kv_cache(auxiliary_outputs)\n\n                # Process the last token using the base model rather than the\n                # auxiliary model, to ensure that only prompt processing is done\n                # by the auxiliary model, and generation is done by the base\n                # model.\n                # NOTE: We also want to apply key norm to the past_keys, since\n                # it hasn't been applied. We cannot simply apply it in the\n                # @predict_kv_cache method because FSDP will not work properly\n                # if we call that wrapped module individually. The key norm will\n                # be applied because apply_k_norm_to_past_keys_before_cache_write is True.\n                base_outputs = self.base(\n                    {\n                        \"input_ids\": input_ids[:, -1:],\n                        \"past_keys\": past_keys,\n                        \"past_values\": past_values,\n                        \"use_kv_cache\": use_kv_cache,\n                        \"is_causal\": False,  # Attend to all the KVs.\n                    },\n                    concat_kvs=True,\n                    apply_k_norm_to_past_keys_before_cache_write=True,  # The auxiliary model didn't apply key norm. Do it with the base.\n                    apply_k_norm_before_cache_write=True,\n                )\n\n                # Return the auxiliary and base logits.\n                output_logits = self.merge_outputs(\n                    auxiliary_outputs[\"logits\"], base_outputs[\"logits\"]\n                )\n                assert (output_logits.shape[1]) == (input_ids.shape[1])\n\n                past_keys = base_outputs[\"past_keys\"]\n                past_values = base_outputs[\"past_values\"]\n                return {\n                    \"logits\": output_logits,\n                    \"past_keys\": past_keys,\n                    \"past_values\": past_values,\n                }\n\n            else:\n                # The cache is not empty. We assume the cache has already been populated\n                # by the auxiliary model, and we are in \"generation mode\".\n                assert input_ids.shape[1] == 1\n                return self.base(\n                    {\n                        \"input_ids\": input_ids,\n                        \"past_keys\": past_keys,\n                        \"past_values\": past_values,\n                        \"use_kv_cache\": use_kv_cache,\n                        \"is_causal\": False,\n                    },\n                    concat_kvs=True,\n                    apply_k_norm_to_past_keys_before_cache_write=False,\n                    apply_k_norm_before_cache_write=True,\n                )\n\n        else:\n            # We are not using the cache. This means we are in\n            # training mode, or we are performing likelihood\n            # evaluations.\n            past_keys = [None] * len(self.auxiliary.layers)\n            past_values = [None] * len(self.auxiliary.layers)\n            auxiliary_outputs = self.auxiliary(\n                {\n                    \"input_ids\": input_ids,\n                    \"past_keys\": past_keys,\n                    \"past_values\": past_values,\n                    \"use_kv_cache\": True,\n                    \"is_causal\": True,\n                },\n                concat_kvs=True,\n                apply_k_norm_to_past_keys_before_cache_write=False,  # Do not apply K norm. It will be applied in the base model.\n                apply_k_norm_before_cache_write=False,\n            )\n\n            past_keys, past_values = self.predict_kv_cache(auxiliary_outputs)\n\n            ret = self.base(\n                {\n                    \"input_ids\": input_ids,\n                    \"past_keys\": past_keys,\n                    \"past_values\": past_values,\n                    \"use_kv_cache\": True,\n                    \"is_causal\": True,\n                },\n                concat_kvs=False,\n                apply_k_norm_to_past_keys_before_cache_write=True,  # The auxiliary model didn't apply key norm. Do it with the base.\n                apply_k_norm_before_cache_write=True,\n            )\n            ret[\"auxiliary_logits\"] = auxiliary_outputs[\"logits\"]\n\n            if self.training:\n                # Get the ground-truth KV cache so we can compute a loss over it.\n                with torch.no_grad():\n                    ret2 = self.base(\n                        {\n                            \"input_ids\": input_ids,\n                            \"past_keys\": None,\n                            \"past_values\": None,\n                            \"use_kv_cache\": True,\n                            \"is_causal\": True,\n                        },\n                        # Make sure the key targets are normalized.\n                        apply_k_norm_before_cache_write=True,\n                    )\n                    ret.update(\n                        {\n                            \"base_past_keys\": ret2[\"past_keys\"],\n                            \"base_past_values\": ret2[\"past_values\"],\n                        }\n                    )\n\n            return ret\n\n    def merge_outputs(self, aux_logits: Tensor, base_logits: Tensor) -> Tensor:\n        \"\"\"\n        Merge the auxiliary and base logits.\n\n        Args:\n            aux_logits: The auxiliary logits.\n            base_logits: The base logits.\n        Returns:\n            The merged logits.\n        \"\"\"\n        return torch.cat([aux_logits, base_logits], dim=1)\n\n    def get_fsdp_wrap_policy(\n        self,\n    ) -> Callable[[torch.nn.Module, bool, int], bool]:\n        \"\"\"Returns the FSDP policy.\"\"\"\n        return self.auxiliary.get_fsdp_wrap_policy()\n\n    def get_activation_checkpoint_submodule_class(self) -> Callable:\n        \"\"\"Returns the layer that should be used for activation checkpointing.\"\"\"\n        return self.auxiliary.get_activation_checkpoint_submodule_class()\n"
  },
  {
    "path": "corenet/modeling/models/multi_modal_img_text/__init__.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n"
  },
  {
    "path": "corenet/modeling/models/multi_modal_img_text/base_multi_modal_img_text.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\n\nfrom corenet.modeling.models import MODEL_REGISTRY, BaseAnyNNModel\n\n\n@MODEL_REGISTRY.register(name=\"__base__\", type=\"multi_modal_image_text\")\nclass BaseMultiModalImageText(BaseAnyNNModel):\n    \"\"\"Base class for multi-modal image-text data\n\n    Args:\n        opts: Command-line arguments\n    \"\"\"\n\n    def __init__(self, opts, *args, **kwargs) -> None:\n        super().__init__(opts, *args, **kwargs)\n        self.lr_multiplier_img_encoder = getattr(\n            opts, \"model.multi_modal_image_text.lr_multiplier_img_encoder\"\n        )\n        self.lr_multiplier_text_encoder = getattr(\n            opts, \"model.multi_modal_image_text.lr_multiplier_text_encoder\"\n        )\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        \"\"\"Add model specific arguments\"\"\"\n        if cls != BaseMultiModalImageText:\n            # Don't re-register arguments in subclasses that don't override `add_arguments()`.\n            return parser\n        group = parser.add_argument_group(title=cls.__name__)\n        group.add_argument(\n            \"--model.multi-modal-image-text.name\",\n            type=str,\n            default=None,\n            help=\"Name of the multi-modal image-text model\",\n        )\n\n        group.add_argument(\n            \"--model.multi-modal-image-text.lr-multiplier-img-encoder\",\n            type=float,\n            default=1.0,\n            help=\"LR multiplier for the image encoder in {}\".format(cls.__name__),\n        )\n        group.add_argument(\n            \"--model.multi-modal-image-text.lr-multiplier-text-encoder\",\n            type=float,\n            default=1.0,\n            help=\"LR multiplier for the text encoder in {}\".format(cls.__name__),\n        )\n\n        group.add_argument(\n            \"--model.multi-modal-image-text.pretrained\",\n            type=str,\n            default=None,\n            help=\"Path of the pretrained backbone\",\n        )\n        group.add_argument(\n            \"--model.multi-modal-image-text.freeze-batch-norm\",\n            action=\"store_true\",\n            help=\"Freeze batch norm layers\",\n        )\n\n        return parser\n"
  },
  {
    "path": "corenet/modeling/models/multi_modal_img_text/clip.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nimport math\nfrom typing import Callable, Dict, List, Optional, Tuple, Union\n\nimport torch\nfrom torch import Tensor, nn\n\nfrom corenet.modeling.image_projection_layers import build_image_projection_head\nfrom corenet.modeling.image_projection_layers.base_image_projection import (\n    get_in_feature_dimension,\n)\nfrom corenet.modeling.models import MODEL_REGISTRY, BaseAnyNNModel, get_model\nfrom corenet.modeling.models.classification.base_image_encoder import BaseImageEncoder\nfrom corenet.modeling.models.multi_modal_img_text.base_multi_modal_img_text import (\n    BaseMultiModalImageText,\n)\nfrom corenet.modeling.text_encoders import BaseTextEncoder, build_text_encoder\nfrom corenet.utils import logger\nfrom corenet.utils.ddp_utils import is_master\n\n\n@MODEL_REGISTRY.register(name=\"clip\", type=\"multi_modal_image_text\")\nclass CLIP(BaseMultiModalImageText):\n    \"\"\"Model for contrastive language image pre-training.\n\n    See `CLIP <https://arxiv.org/abs/2103.00020>` paper for details.\n\n    Args:\n        opts: Command-line arguments.\n        image_encoder: Image encoder.\n        text_encoder: Text encoder.\n    \"\"\"\n\n    def __init__(\n        self,\n        opts: argparse.Namespace,\n        image_encoder: BaseImageEncoder,\n        text_encoder: BaseTextEncoder,\n        *args,\n        **kwargs,\n    ) -> None:\n        super().__init__(opts=opts, *args, **kwargs)\n        self.image_encoder: BaseImageEncoder = image_encoder\n        self.text_encoder: BaseTextEncoder = text_encoder\n        self.logit_scale = nn.Parameter(torch.ones([]) * math.log(1.0 / 0.07))\n        self.use_distributed = getattr(opts, \"ddp.use_distributed\", False)\n        self.cached_text_features = None\n        self.reset_parameters()\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser):\n        \"\"\"Add CLIP specific arguments\"\"\"\n        if cls == CLIP:\n            group = parser.add_argument_group(title=cls.__name__)\n            group.add_argument(\n                \"--model.multi-modal-image-text.clip.projection-dim\",\n                type=int,\n                default=256,\n                help=\"Project image and text features to this dimensionality\",\n            )\n        return parser\n\n    def reset_parameters(self) -> None:\n        \"\"\"Helper function to reset model weights.\n\n        Currently, we only reset the @logit_scale.\n        \"\"\"\n        torch.nn.init.constant_(self.logit_scale, math.log(1.0 / 0.07))\n\n    def get_trainable_parameters(\n        self,\n        weight_decay: Optional[float] = 0.0,\n        no_decay_bn_filter_bias: Optional[bool] = False,\n        *args,\n        **kwargs,\n    ) -> Tuple[List[Dict], List[float]]:\n        \"\"\"Get parameters for training along with the learning rate.\n\n        Args:\n            weight_decay: weight decay.\n            no_decay_bn_filter_bias: Do not decay BN and biases. Defaults to False.\n\n        Returns:\n             Returns a tuple of length 2. The first entry is a list of dictionary with three keys\n             (params, weight_decay, param_names). The second entry is a list of floats containing\n             learning rate for each parameter.\n\n        Note:\n            Kwargs may contain module_name. To avoid multiple arguments with the same name,\n            we pop it and concatenate with image and text encoders.\n        \"\"\"\n        prev_module_name = kwargs.pop(\"module_name\", \"\")\n        image_param_list, image_lr_mult = self.image_encoder.get_trainable_parameters(\n            weight_decay=weight_decay,\n            no_decay_bn_filter_bias=no_decay_bn_filter_bias,\n            module_name=prev_module_name + \"image_encoder.\",\n            *args,\n            **kwargs,\n        )\n        # The learning rate list from image encoder returns 1.0 as a LR multiplier.\n        # Update the learning rate to the specified value.\n        image_lr_mult = [self.lr_multiplier_img_encoder] * len(image_lr_mult)\n\n        text_param_list, text_lr_mult = self.text_encoder.get_trainable_parameters(\n            weight_decay=weight_decay,\n            no_decay_bn_filter_bias=no_decay_bn_filter_bias,\n            module_name=prev_module_name + \"text_encoder.\",\n            *args,\n            **kwargs,\n        )\n        # The learning rate list from text encoder returns 1.0 as a LR multiplier.\n        # Update the learning rate to the specified value.\n        text_lr_mult = [self.lr_multiplier_text_encoder] * len(text_lr_mult)\n\n        # We need to add the logit scale\n        logit_scale_param_list = [\n            {\n                \"params\": [self.logit_scale],\n                \"weight_decay\": 0.0,\n                \"param_names\": [\"logit_scale\"],\n            }\n        ]\n        logit_scale_lr_mult = [1.0] * len(logit_scale_param_list)\n\n        return (\n            image_param_list + text_param_list + logit_scale_param_list,\n            image_lr_mult + text_lr_mult + logit_scale_lr_mult,\n        )\n\n    def dummy_input_and_label(\n        self, batch_size: int\n    ) -> Dict[str, Union[Dict[str, Tensor], Tensor]]:\n        \"\"\"Create dummy input and labels for CI/CD purposes. Child classes must override it\n        if functionality is different.\n        \"\"\"\n        img_channels = 3\n        height = 224\n        width = 224\n        vocab_size = 10\n        seq_length = 5\n        num_obj_classes = 2\n        num_captions_per_class = 2\n        img_tensor = torch.randn(\n            batch_size, img_channels, height, width, dtype=torch.float\n        )\n\n        if self.training:\n            text_tensor = torch.randint(\n                low=0, high=vocab_size, size=(batch_size, seq_length)\n            ).long()\n        else:\n            text_tensor = torch.randint(\n                low=0,\n                high=vocab_size,\n                size=(batch_size, num_obj_classes, num_captions_per_class, seq_length),\n            ).long()\n\n        return {\n            \"samples\": {\"image\": img_tensor, \"text\": text_tensor},\n            \"targets\": text_tensor,\n        }\n\n    def _exponentiate_and_clip_logits(self, max_scale: float = 100.0) -> Tensor:\n        \"\"\"Exponentiate and clip the logit scale.\n\n        Args:\n            max_scale: Maximum value of logit scale.\n\n        Returns:\n            A tensor of shape [1].\n        \"\"\"\n        scale = self.logit_scale.exp()\n        scale = torch.clamp(scale, 0, max_scale)\n        return scale\n\n    def _reset_cached_text_features(self, mode_str: str) -> None:\n        \"\"\"Reset cached text features.\n\n        Args:\n            mode: String specifying the mode of the model (e.g., train or eval).\n        \"\"\"\n        if self.cached_text_features is not None:\n            if is_master(self.opts):\n                logger.log(\n                    f\"Resetting {self.__class__.__name__}'s cache in {mode_str} mode.\"\n                )\n            self.cached_text_features = None\n\n    def train(self, mode: bool = True):\n        \"\"\"Sets the module in training mode when @mode is enabled.\n\n        ...note:\n            We override this function to reset cached text features before starting evaluation or training.\n            This resetting is required so that features cached from one model may not be used by other model.\n            An example of such a use case is when training CLIP model with and without exponential\n            moving average.\n        \"\"\"\n        mode_str = \"train\" if mode else \"eval\"\n        self._reset_cached_text_features(mode_str=mode_str)\n        return super().train(mode)\n\n    def forward(self, input: Dict[str, Optional[Tensor]]) -> Dict[str, Tensor]:\n        \"\"\"Forward pass of CLIP model.\n\n        Args:\n            input: A dictionary containing tensors under keys 'image', 'text', and 'padding_mask'.\n                The shape of inputs is:\n                input[\"image\"]: The shape of tensor is [batch size, image channels, image width, image height]\n                input[\"text\"]:\n                    For pre-training, the shape of tensor is [batch size, sequence length]\n                    For zero-shot image classification, the shape of tensor is\n                        [batch size, number of classes, number of captions, sequence length].\n                input[\"padding_mask\"]: The shape of tensor is [batch size, sequence length]\n\n        Returns:\n            A dictionary containing tensors under keys 'image', 'text', 'logit_scale', 'zero_shot_image_logits',\n            and 'augmented_tensor'.\n\n            output[\"image\"]: The shape of image embeddings is [batch size, hidden dimension]\n            output[\"text\"]: The shape of text embeddings during pre-training is [hidden dimension, batch size]. For\n             zero-shot image classification, the shape is [hidden dimension, number of classes.]\n            output[\"logit_scale\"]: The shape of tensor is [1].\n            output[\"zero_shot_image_logits\"]: The shape of tensor is [batch size, number of classes]. This is returned\n                only during evaluation and is set to 'None' during training.\n            output[\"augmented_tensor\"]: The shape of tensor is [batch size, image channels, image width, image height].\n                This is only returned during training if RangeAugment (https://arxiv.org/abs/2212.10553) is enabled.\n                Otherwise, it is set to None.\n        \"\"\"\n\n        images = input.get(\"image\")\n        text_tokens = input.get(\"text\")\n        padding_mask = input.get(\"padding_mask\", None)\n\n        # [batch_size, image_channels, image_height, image_width] -> [batch_size, hidden_dim]\n        image_encoder_out = self.image_encoder(images)\n        augmented_tensor = None\n        if isinstance(image_encoder_out, Dict):\n            if not {\"augmented_tensor\", \"logits\"}.issubset(image_encoder_out.keys()):\n                logger.error(\n                    \"Output of image classifier must contain logits and augmented_tensor\"\n                    \" as keys. Got keys: {}\".format(image_encoder_out.keys())\n                )\n            image_embeddings = image_encoder_out[\"logits\"]\n            augmented_tensor = image_encoder_out[\"augmented_tensor\"]\n        elif isinstance(image_encoder_out, Tensor):\n            image_embeddings = image_encoder_out\n        else:\n            logger.error(\"The output of image encoder should be either Dict or Tensor\")\n\n        if not self.training:\n            # During zero-shot image classification, the embedding vector is returned for each class\n            # Because the captions and classes are the same for all images in a batch, embeddings are returned only\n            # for the first image.\n            # [batch_size, num_classes, num_captions, sequence_length] --> [hidden_dim, num_classes]\n            if self.cached_text_features is None:\n                text_embeddings = self.text_encoder(\n                    text_tokens=text_tokens, key_padding_mask=padding_mask\n                )\n                self.cached_text_features = text_embeddings\n            else:\n                text_embeddings = self.cached_text_features\n        else:\n            # During pre-training, the embeddings are only returned for end-of-text token.\n\n            # Note that text embeddings are transposed (i.e., batch is not the first dimension).\n            # [batch_size, sequence_length] --> [hidden_dim, batch_size]\n            text_embeddings = self.text_encoder(\n                text_tokens=text_tokens, key_padding_mask=padding_mask\n            )\n\n        if not self.training:\n            assert (\n                text_embeddings.shape[0] == image_embeddings.shape[1]\n            ), \"The hidden dimension of image and text towers is different. Please check.\"\n            # This means that we are running a zero-shot set-up.\n            # [batch_size, hidden_dim] x [hidden_dim, num_classes] --> [batch_size, num_classes]\n            zero_shot_image_logits = 100.0 * image_embeddings @ text_embeddings\n            return {\n                \"image\": None,\n                \"text\": None,\n                \"logit_scale\": self._exponentiate_and_clip_logits(),\n                \"zero_shot_image_logits\": zero_shot_image_logits,\n                \"augmented_tensor\": None,\n            }\n        else:\n            return {\n                \"image\": image_embeddings,\n                \"text\": text_embeddings,\n                \"logit_scale\": self._exponentiate_and_clip_logits(),\n                \"zero_shot_image_logits\": None,\n                \"augmented_tensor\": augmented_tensor,\n            }\n\n    @classmethod\n    def build_model(cls, opts: argparse.Namespace, *args, **kwargs) -> BaseAnyNNModel:\n        \"\"\"Build the CLIP model.\n\n        Args:\n            opts: Command-line arguments.\n\n        Returns:\n            An instance of CLIP model.\n        \"\"\"\n        projection_dim = getattr(\n            opts, \"model.multi_modal_image_text.clip.projection_dim\"\n        )\n        if projection_dim < 1:\n            logger.error(\"Projection dimension should be > 1. Got: {}.\")\n\n        image_encoder: BaseImageEncoder = get_model(\n            opts=opts, category=\"classification\", *args, **kwargs\n        )\n        text_encoder: BaseTextEncoder = build_text_encoder(\n            opts=opts, projection_dim=projection_dim, *args, **kwargs\n        )\n\n        # replace the classifier in image encoder with the task specific classifier\n        image_encoder.classifier = update_image_classifier(\n            opts,\n            image_classifier=image_encoder.classifier,\n            projection_dim=projection_dim,\n        )\n\n        model = cls(\n            opts,\n            image_encoder=image_encoder,\n            text_encoder=text_encoder,\n            *args,\n            **kwargs,\n        )\n\n        if getattr(opts, \"model.multi_modal_image_text.freeze_batch_norm\"):\n            cls.freeze_norm_layers(opts, model)\n        return model\n\n    def get_activation_checkpoint_submodule_class(\n        self,\n    ) -> Union[Callable, List[Callable]]:\n        \"\"\"Activation checkpoint sub-module classes.\n\n        Returns:\n            For CLIP, image and text encoders activation checkpoint sub-module classes are returned. If both of them are the same,\n            then only image encoder's activation checkpoint sub-module class is returned because activation checkpointing is applied\n            recursively.\n        \"\"\"\n        img_encoder_ckpt_module = (\n            self.image_encoder.get_activation_checkpoint_submodule_class()\n        )\n        text_encoder_ckpt_module = (\n            self.text_encoder.get_activation_checkpoint_submodule_class()\n        )\n        if img_encoder_ckpt_module == text_encoder_ckpt_module:\n            return img_encoder_ckpt_module\n        return [img_encoder_ckpt_module, text_encoder_ckpt_module]\n\n\ndef update_image_classifier(\n    opts, image_classifier: nn.Module, projection_dim: int, *args, **kwargs\n) -> nn.Module:\n    \"\"\"Update the classifier.\"\"\"\n    in_features = get_in_feature_dimension(image_classifier)\n    new_img_classifier = build_image_projection_head(\n        opts, in_dim=in_features, out_dim=projection_dim\n    )\n    return new_img_classifier\n"
  },
  {
    "path": "corenet/modeling/models/segmentation/__init__.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n"
  },
  {
    "path": "corenet/modeling/models/segmentation/base_seg.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nfrom typing import Any, Dict\n\nimport torch\n\nfrom corenet.modeling.models import MODEL_REGISTRY, BaseAnyNNModel\nfrom corenet.modeling.models.classification.base_image_encoder import BaseImageEncoder\n\n\n@MODEL_REGISTRY.register(name=\"__base__\", type=\"segmentation\")\nclass BaseSegmentation(BaseAnyNNModel):\n    \"\"\"Base class for segmentation networks.\n\n    Args:\n        opts: Command-line arguments\n        encoder: Image classification network\n    \"\"\"\n\n    def __init__(self, opts, encoder: BaseImageEncoder, *args, **kwargs) -> None:\n        super().__init__(opts, *args, **kwargs)\n        self.lr_multiplier = getattr(opts, \"model.segmentation.lr_multiplier\")\n        assert isinstance(\n            encoder, BaseImageEncoder\n        ), \"encoder should be an instance of BaseEncoder\"\n        self.encoder: BaseImageEncoder = encoder\n        self.default_norm = getattr(opts, \"model.normalization.name\")\n        self.opts = opts\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        \"\"\"Add segmentation model specific arguments\"\"\"\n        if cls != BaseSegmentation:\n            # Don't re-register arguments in subclasses that don't override `add_arguments()`.\n            return parser\n        group = parser.add_argument_group(title=cls.__name__)\n\n        group.add_argument(\n            \"--model.segmentation.name\",\n            type=str,\n            default=None,\n            help=\"Segmentation model name. Defaults to None.\",\n        )\n        group.add_argument(\n            \"--model.segmentation.n-classes\",\n            type=int,\n            # FIXME: In another PR make this default value to None and update configs.\n            default=21,\n            help=\"Number of classes in the dataset. Defaults to 21.\",\n        )\n        group.add_argument(\n            \"--model.segmentation.pretrained\",\n            type=str,\n            default=None,\n            help=\"Path of the pretrained segmentation model. Useful for evaluation\",\n        )\n        group.add_argument(\n            \"--model.segmentation.lr-multiplier\",\n            type=float,\n            default=1.0,\n            help=\"Multiply the learning rate in segmentation network (e.g., decoder) by this factor.\"\n            \"Defaults to 1.0.\",\n        )\n        group.add_argument(\n            \"--model.segmentation.classifier-dropout\",\n            type=float,\n            default=0.1,\n            help=\"Dropout rate in classifier\",\n        )\n        group.add_argument(\n            \"--model.segmentation.use-aux-head\",\n            action=\"store_true\",\n            help=\"Use auxiliary output\",\n        )\n        group.add_argument(\n            \"--model.segmentation.aux-dropout\",\n            default=0.1,\n            type=float,\n            help=\"Dropout in auxiliary branch\",\n        )\n\n        group.add_argument(\n            \"--model.segmentation.output-stride\",\n            type=int,\n            default=None,\n            help=\"Output stride in classification network\",\n        )\n        group.add_argument(\n            \"--model.segmentation.replace-stride-with-dilation\",\n            action=\"store_true\",\n            help=\"Replace stride with dilation\",\n        )\n\n        group.add_argument(\n            \"--model.segmentation.activation.name\",\n            default=None,\n            type=str,\n            help=\"Non-linear function type\",\n        )\n        group.add_argument(\n            \"--model.segmentation.activation.inplace\",\n            action=\"store_true\",\n            help=\"Inplace non-linear functions\",\n        )\n        group.add_argument(\n            \"--model.segmentation.activation.neg-slope\",\n            default=0.1,\n            type=float,\n            help=\"Negative slope in leaky relu\",\n        )\n        group.add_argument(\n            \"--model.segmentation.freeze-batch-norm\",\n            action=\"store_true\",\n            help=\"Freeze batch norm layers\",\n        )\n\n        group.add_argument(\n            \"--model.segmentation.use-level5-exp\",\n            action=\"store_true\",\n            default=False,\n            help=\"Use output of Level 5 expansion layer in base feature extractor\",\n        )\n\n        group.add_argument(\n            \"--model.segmentation.finetune-pretrained-model\",\n            action=\"store_true\",\n            default=False,\n            help=\"Finetune a pretrained segmentation model. Defaults to False.\",\n        )\n        group.add_argument(\n            \"--model.segmentation.n-pretrained-classes\",\n            type=int,\n            default=None,\n            help=\"Number of classes in the pre-trained segmentation model. \"\n            \"Defaults to None.\",\n        )\n\n        group.add_argument(\n            \"--model.segmentation.norm-layer\",\n            type=str,\n            default=\"batch_norm\",\n            help=\"Normalization layer for segmentation. Defaults to batch_norm.\",\n        )\n        return parser\n\n    def maybe_seg_norm_layer(self):\n        seg_norm_layer = getattr(self.opts, \"model.segmentation.norm_layer\")\n        if seg_norm_layer is not None:\n            # update the default norm layer\n            setattr(self.opts, \"model.normalization.name\", seg_norm_layer)\n\n    def set_default_norm_layer(self):\n        setattr(self.opts, \"model.normalization.name\", self.default_norm)\n\n    def dummy_input_and_label(self, batch_size: int) -> Dict:\n        \"\"\"Create dummy input and labels for CI/CD purposes. Child classes must override it\n        if functionality is different.\n        \"\"\"\n        img_channels = 3\n        height = 224\n        width = 224\n        n_classes = 10\n        img_tensor = torch.randn(\n            batch_size, img_channels, height, width, dtype=torch.float\n        )\n        label_tensor = torch.randint(\n            low=0, high=n_classes, size=(batch_size, height, width)\n        ).long()\n        return {\"samples\": img_tensor, \"targets\": label_tensor}\n\n    def update_classifier(self, opts, n_classes: int) -> None:\n        \"\"\"This function updates the classification layer in a model. Useful for finetuning purposes.\"\"\"\n        raise NotImplementedError\n\n    @classmethod\n    def set_model_specific_opts_before_model_building(\n        cls, opts: argparse.Namespace, *args, **kwargs\n    ) -> Dict[str, Any]:\n        seg_act_fn = getattr(opts, \"model.segmentation.activation.name\")\n        if seg_act_fn is not None:\n            # Override the general activation arguments\n            default_act_fn = getattr(opts, \"model.activation.name\", \"relu\")\n            default_act_inplace = getattr(opts, \"model.activation.inplace\", False)\n            default_act_neg_slope = getattr(opts, \"model.activation.neg_slope\", 0.1)\n\n            setattr(opts, \"model.activation.name\", seg_act_fn)\n            setattr(\n                opts,\n                \"model.activation.inplace\",\n                getattr(opts, \"model.segmentation.activation.inplace\", False),\n            )\n            setattr(\n                opts,\n                \"model.activation.neg_slope\",\n                getattr(opts, \"model.segmentation.activation.neg_slope\", 0.1),\n            )\n            return {\n                \"model.activation.name\": default_act_fn,\n                \"model.activation.inplace\": default_act_inplace,\n                \"model.activation.neg_slope\": default_act_neg_slope,\n            }\n        return {}\n\n\n# TODO: Find models and configurations that uses `set_model_specific_opts_before_model_building` and\n#  `unset_model_specific_opts_after_model_building` functions. Find a more explicit way of satisfying this requirement,\n#  such as namespacing config entries in a more composable way so that we no longer have conflicting config entries.\n\n\ndef set_model_specific_opts_before_model_building(\n    opts: argparse.Namespace,\n) -> Dict[str, Any]:\n    \"\"\"Override library-level defaults with model-specific default values.\n\n    Args:\n        opts: Command-line arguments\n\n    Returns:\n        A dictionary containing the name of arguments that are updated along with their original values.\n        This dictionary is used in `unset_model_specific_opts_after_model_building` function to unset the\n        model-specific to library-specific defaults.\n    \"\"\"\n    seg_act_fn = getattr(opts, \"model.segmentation.activation.name\")\n    if seg_act_fn is not None:\n        # Override the general activation arguments\n        default_act_fn = getattr(opts, \"model.activation.name\", \"relu\")\n        default_act_inplace = getattr(opts, \"model.activation.inplace\", False)\n        default_act_neg_slope = getattr(opts, \"model.activation.neg_slope\", 0.1)\n\n        setattr(opts, \"model.activation.name\", seg_act_fn)\n        setattr(\n            opts,\n            \"model.activation.inplace\",\n            getattr(opts, \"model.segmentation.activation.inplace\", False),\n        )\n        setattr(\n            opts,\n            \"model.activation.neg_slope\",\n            getattr(opts, \"model.segmentation.activation.neg_slope\", 0.1),\n        )\n        return {\n            \"model.activation.name\": default_act_fn,\n            \"model.activation.inplace\": default_act_inplace,\n            \"model.activation.neg_slope\": default_act_neg_slope,\n        }\n    return {}\n\n\ndef unset_model_specific_opts_after_model_building(\n    opts: argparse.Namespace, default_opts_info: Dict[str, Any], *ars, **kwargs\n) -> None:\n    \"\"\"Given command-line arguments and a mapping of opts that needs to be unset, this function\n    unsets the library-level defaults that were over-ridden previously\n    in `set_model_specific_opts_before_model_building`.\n    \"\"\"\n    assert isinstance(default_opts_info, dict), (\n        f\"Please ensure set_model_specific_opts_before_model_building() \"\n        f\"returns a dict.\"\n    )\n    for k, v in default_opts_info.items():\n        setattr(opts, k, v)\n"
  },
  {
    "path": "corenet/modeling/models/segmentation/enc_dec.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nfrom typing import Dict, Optional, Tuple, Union\n\nfrom torch import Tensor\n\nfrom corenet.modeling.models import MODEL_REGISTRY, BaseAnyNNModel, get_model\nfrom corenet.modeling.models.classification.base_image_encoder import BaseImageEncoder\nfrom corenet.modeling.models.segmentation.base_seg import (\n    BaseSegmentation,\n    set_model_specific_opts_before_model_building,\n    unset_model_specific_opts_after_model_building,\n)\n\n\n@MODEL_REGISTRY.register(name=\"encoder_decoder\", type=\"segmentation\")\nclass SegEncoderDecoder(BaseSegmentation):\n    \"\"\"\n    This class defines a encoder-decoder architecture for the task of semantic segmentation. Different segmentation\n    heads (e.g., PSPNet and DeepLabv3) can be used\n\n    Args:\n        opts: command-line arguments\n        encoder (BaseImageEncoder): Backbone network (e.g., MobileViT or ResNet)\n    \"\"\"\n\n    def __init__(\n        self, opts, encoder: BaseImageEncoder, seg_head, *args, **kwargs\n    ) -> None:\n        super().__init__(opts=opts, encoder=encoder)\n\n        # delete layers that are not required in segmentation network\n        self.encoder.classifier = None\n        use_l5_exp = getattr(opts, \"model.segmentation.use_level5_exp\")\n        if not use_l5_exp:\n            self.encoder.conv_1x1_exp = None\n\n        self.maybe_seg_norm_layer()\n        self.seg_head = seg_head\n        self.use_l5_exp = use_l5_exp\n        self.set_default_norm_layer()\n\n    def get_trainable_parameters(\n        self,\n        weight_decay: Optional[float] = 0.0,\n        no_decay_bn_filter_bias: Optional[bool] = False,\n        *args,\n        **kwargs\n    ):\n        \"\"\"This function separates the parameters for backbone and segmentation head, so that\n        different learning rates can be used for backbone and segmentation head\n        \"\"\"\n        if getattr(self.encoder, \"enable_layer_wise_lr_decay\"):\n            encoder_params, enc_lr_mult = self.encoder.get_trainable_parameters(\n                weight_decay=weight_decay,\n                no_decay_bn_filter_bias=no_decay_bn_filter_bias,\n                module_name=\"encoder.\",\n                *args,\n                **kwargs,\n            )\n        else:\n            encoder_params, enc_lr_mult = self.encoder.get_trainable_parameters(\n                weight_decay=weight_decay,\n                no_decay_bn_filter_bias=no_decay_bn_filter_bias,\n                module_name=\"encoder.\",\n                *args,\n                **kwargs,\n            )\n        decoder_params, dec_lr_mult = self.seg_head.get_trainable_parameters(\n            weight_decay=weight_decay,\n            no_decay_bn_filter_bias=no_decay_bn_filter_bias,\n            module_name=\"seg_head.\",\n            *args,\n            **kwargs,\n        )\n\n        total_params = sum([p.numel() for p in self.parameters()])\n        encoder_params_count = sum([p.numel() for p in self.encoder.parameters()])\n        decoder_params_count = sum([p.numel() for p in self.seg_head.parameters()])\n\n        assert total_params == encoder_params_count + decoder_params_count, (\n            \"Total network parameters are not equal to \"\n            \"the sum of encoder and decoder. \"\n            \"{} != {} + {}\".format(\n                total_params, encoder_params_count, decoder_params_count\n            )\n        )\n\n        return encoder_params + decoder_params, enc_lr_mult + dec_lr_mult\n\n    def forward(\n        self, x: Tensor, *args, **kwargs\n    ) -> Union[Tuple[Tensor, Tensor], Tensor, Dict]:\n        enc_end_points: Dict = self.encoder.extract_end_points_all(\n            x, use_l5=True, use_l5_exp=self.use_l5_exp\n        )\n\n        if \"augmented_tensor\" in enc_end_points:\n            output_dict = {\n                \"augmented_tensor\": enc_end_points.pop(\"augmented_tensor\"),\n                \"segmentation_output\": self.seg_head(\n                    enc_out=enc_end_points, *args, **kwargs\n                ),\n            }\n            return output_dict\n        else:\n            return self.seg_head(enc_out=enc_end_points, *args, **kwargs)\n\n    def update_classifier(self, opts, n_classes: int) -> None:\n        \"\"\"\n        This function updates the classification layer in a model. Useful for finetuning purposes.\n        \"\"\"\n        if hasattr(self.seg_head, \"update_classifier\"):\n            self.seg_head.update_classifier(opts, n_classes)\n\n    @classmethod\n    def build_model(cls, opts: argparse.Namespace, *args, **kwargs) -> BaseAnyNNModel:\n\n        output_stride = getattr(opts, \"model.segmentation.output_stride\", None)\n        image_encoder = get_model(\n            opts,\n            category=\"classification\",\n            output_stride=output_stride,\n            *args,\n            **kwargs,\n        )\n\n        default_opt_info = set_model_specific_opts_before_model_building(opts)\n        use_l5_exp = getattr(opts, \"model.segmentation.use_level5_exp\")\n\n        seg_head = get_model(\n            opts=opts,\n            category=\"segmentation_head\",\n            model_name=getattr(opts, \"model.segmentation.seg_head\"),\n            enc_conf=image_encoder.model_conf_dict,\n            use_l5_exp=use_l5_exp,\n            *args,\n            **kwargs,\n        )\n\n        seg_model = cls(opts, encoder=image_encoder, seg_head=seg_head, *args, **kwargs)\n\n        unset_model_specific_opts_after_model_building(\n            opts, default_opts_info=default_opt_info\n        )\n\n        if getattr(opts, \"model.segmentation.freeze_batch_norm\"):\n            cls.freeze_norm_layers(opts, model=seg_model)\n        return seg_model\n"
  },
  {
    "path": "corenet/modeling/models/segmentation/heads/__init__.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n"
  },
  {
    "path": "corenet/modeling/models/segmentation/heads/base_seg_head.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nfrom typing import Dict, Optional, Tuple, Union\n\nfrom torch import Tensor, nn\n\nfrom corenet.modeling.layers import ConvLayer2d, Dropout2d, UpSample\nfrom corenet.modeling.misc.common import parameter_list\nfrom corenet.modeling.misc.init_utils import initialize_weights\nfrom corenet.modeling.models import MODEL_REGISTRY, BaseAnyNNModel\nfrom corenet.utils import logger\n\n\n@MODEL_REGISTRY.register(name=\"__base__\", type=\"segmentation_head\")\nclass BaseSegHead(BaseAnyNNModel):\n    \"\"\"\n    Base class for segmentation heads\n    \"\"\"\n\n    def __init__(\n        self, opts, enc_conf: dict, use_l5_exp: Optional[bool] = False, *args, **kwargs\n    ):\n        enc_ch_l5_exp_out = _check_out_channels(enc_conf, \"exp_before_cls\")\n        enc_ch_l5_out = _check_out_channels(enc_conf, \"layer5\")\n        enc_ch_l4_out = _check_out_channels(enc_conf, \"layer4\")\n        enc_ch_l3_out = _check_out_channels(enc_conf, \"layer3\")\n        enc_ch_l2_out = _check_out_channels(enc_conf, \"layer2\")\n        enc_ch_l1_out = _check_out_channels(enc_conf, \"layer1\")\n\n        n_seg_classes = getattr(opts, \"model.segmentation.n_classes\")\n        if n_seg_classes is None:\n            logger.error(\n                \"Please specify number of segmentation classes using --model.segmentation.n-classes. Got None.\"\n            )\n\n        super().__init__(opts, *args, **kwargs)\n\n        self.use_l5_exp = use_l5_exp\n        self.enc_l5_exp_channels = enc_ch_l5_exp_out\n        self.enc_l5_channels = enc_ch_l5_out\n        self.enc_l4_channels = enc_ch_l4_out\n        self.enc_l3_channels = enc_ch_l3_out\n        self.enc_l2_channels = enc_ch_l2_out\n        self.enc_l1_channels = enc_ch_l1_out\n\n        self.n_seg_classes = n_seg_classes\n        self.lr_multiplier = getattr(opts, \"model.segmentation.lr_multiplier\", 1.0)\n        self.classifier_dropout = getattr(\n            opts, \"model.segmentation.classifier_dropout\", 0.1\n        )\n        self.output_stride = getattr(opts, \"model.segmentation.output_stride\", 16)\n\n        self.aux_head = None\n        if getattr(opts, \"model.segmentation.use_aux_head\", False):\n            drop_aux = getattr(opts, \"model.segmentation.aux_dropout\", 0.1)\n            inner_channels = max(int(self.enc_l4_channels // 4), 128)\n            self.aux_head = nn.Sequential(\n                ConvLayer2d(\n                    opts=opts,\n                    in_channels=self.enc_l4_channels,\n                    out_channels=inner_channels,\n                    kernel_size=3,\n                    stride=1,\n                    use_norm=True,\n                    use_act=True,\n                    bias=False,\n                    groups=1,\n                ),\n                Dropout2d(drop_aux),\n                ConvLayer2d(\n                    opts=opts,\n                    in_channels=inner_channels,\n                    out_channels=self.n_seg_classes,\n                    kernel_size=1,\n                    stride=1,\n                    use_norm=False,\n                    use_act=False,\n                    bias=True,\n                    groups=1,\n                ),\n            )\n\n        self.upsample_seg_out = None\n        if self.output_stride != 1.0:\n            self.upsample_seg_out = UpSample(\n                scale_factor=self.output_stride, mode=\"bilinear\", align_corners=True\n            )\n\n    def forward_aux_head(self, enc_out: Dict) -> Tensor:\n        aux_out = self.aux_head(enc_out[\"out_l4\"])\n        return aux_out\n\n    def forward_seg_head(self, enc_out: Dict) -> Tensor:\n        raise NotImplementedError\n\n    def forward(self, enc_out: Dict, *args, **kwargs) -> Union[Tensor, Tuple[Tensor]]:\n        out = self.forward_seg_head(enc_out=enc_out)\n\n        if self.upsample_seg_out is not None:\n            # resize the mask based on given size\n            mask_size = kwargs.get(\"orig_size\", None)\n            if mask_size is not None:\n                self.upsample_seg_out.scale_factor = None\n                self.upsample_seg_out.size = mask_size\n\n            out = self.upsample_seg_out(out)\n\n        if self.aux_head is not None and self.training:\n            aux_out = self.forward_aux_head(enc_out=enc_out)\n            return out, aux_out\n        return out\n\n    def reset_head_parameters(self, opts) -> None:\n        # weight initialization\n        initialize_weights(opts=opts, modules=self.modules())\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        \"\"\"Add segmentation head specific arguments\"\"\"\n        group = parser.add_argument_group(\n            title=\"Segmentation head arguments\",\n            description=\"Segmentation head arguments\",\n        )\n        group.add_argument(\n            \"--model.segmentation.seg-head\",\n            type=str,\n            default=None,\n            help=\"Segmentation head\",\n        )\n\n        return parser\n\n    def get_trainable_parameters(\n        self,\n        weight_decay: float = 0.0,\n        no_decay_bn_filter_bias: bool = False,\n        *args,\n        **kwargs\n    ):\n        param_list = parameter_list(\n            named_parameters=self.named_parameters,\n            weight_decay=weight_decay,\n            no_decay_bn_filter_bias=no_decay_bn_filter_bias,\n            *args,\n            **kwargs\n        )\n        return param_list, [self.lr_multiplier] * len(param_list)\n\n    def update_classifier(self, opts, n_classes: int) -> None:\n        \"\"\"\n        This function updates the classification layer in a model. Useful for finetuning purposes.\n        \"\"\"\n        raise NotImplementedError\n\n    @classmethod\n    def build_model(cls, opts: argparse.Namespace, *args, **kwargs) -> BaseAnyNNModel:\n        return cls(opts, *args, **kwargs)\n\n\ndef _check_out_channels(config: dict, layer_name: str) -> int:\n    enc_ch_l: dict = config.get(layer_name, None)\n    if enc_ch_l is None or not enc_ch_l:\n        logger.error(\n            \"Encoder does not define input-output mapping for {}: Got: {}\".format(\n                layer_name, config\n            )\n        )\n\n    enc_ch_l_out = enc_ch_l.get(\"out\", None)\n    if enc_ch_l_out is None or not enc_ch_l_out:\n        logger.error(\n            \"Output channels are not defined in {} of the encoder. Got: {}\".format(\n                layer_name, enc_ch_l\n            )\n        )\n\n    return enc_ch_l_out\n"
  },
  {
    "path": "corenet/modeling/models/segmentation/heads/deeplabv3.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nfrom typing import Dict, Optional, Tuple\n\nimport torch\nfrom torch import Tensor, nn\nfrom torch.nn import functional as F\n\nfrom corenet.modeling.layers import ConvLayer2d\nfrom corenet.modeling.models import MODEL_REGISTRY\nfrom corenet.modeling.models.segmentation.heads.base_seg_head import BaseSegHead\nfrom corenet.modeling.modules import ASPP\nfrom corenet.options.parse_args import JsonValidator\nfrom corenet.utils import logger\n\n\n@MODEL_REGISTRY.register(name=\"deeplabv3\", type=\"segmentation_head\")\nclass DeeplabV3(BaseSegHead):\n    \"\"\"\n    `DeepLabv3 <https://arxiv.org/abs/1706.05587>`_ segmentation head.\n\n    Args:\n        opts: Command-line arguments.\n        enc_conf: Image encoder's input-output configuration at each spatial level.\n        use_l5_exp: Deeplabv3 segmentation head uses features from level5 of the image encoder. However,\n            some of the models (e.g., MobileNetv3) have expansion layers at level5 of the image encoder.\n            Features from such layers can be used by setting 'use_l5_exp=True'.\n        aspp_in_channels: The number of channels in the input to the ASPP module. The default\n            behavior is None, i.e., determine automatically from image encoder's configuration.\n\n    ...note:\n        Image encoder's configuration is a mapping of the form\n        {\n            \"conv_1\": {\"in\": in_features_1, \"out\": out_features_1},\n            \"layer1\": {\"in\": out_features_1, \"out\": out_features_2},\n            \"layer2\": {\"in\": out_features_2, \"out\": out_features_3},\n            \"layer3\": {\"in\": out_features_3, \"out\": out_features_4},\n            \"layer4\": {\"in\": out_features_4, \"out\": out_features_5},\n            \"layer5\": {\"in\": out_features_5, \"out\": out_features_6},\n            \"exp_before_cls\": {\"in\": out_features_6, \"out\": out_features_7},\n        }\n\n        When 'use_l5_exp' is enabled, then output of expansion layer before classification (i.e., exp_before_cls)\n        is used. Otherwise, the output of 'layer5' is used.\n    \"\"\"\n\n    def __init__(\n        self,\n        opts,\n        enc_conf: Dict,\n        use_l5_exp: bool = False,\n        aspp_in_channels: Optional[int] = None,\n        *args,\n        **kwargs,\n    ) -> None:\n        atrous_rates = getattr(opts, \"model.segmentation.deeplabv3.aspp_rates\")\n        out_channels = getattr(opts, \"model.segmentation.deeplabv3.aspp_out_channels\")\n        is_sep_conv = getattr(opts, \"model.segmentation.deeplabv3.aspp_sep_conv\")\n        dropout = getattr(opts, \"model.segmentation.deeplabv3.aspp_dropout\")\n\n        super().__init__(opts=opts, enc_conf=enc_conf, use_l5_exp=use_l5_exp)\n\n        self.aspp = nn.Sequential()\n        if aspp_in_channels is None:\n            aspp_in_channels = (\n                self.enc_l5_channels\n                if not self.use_l5_exp\n                else self.enc_l5_exp_channels\n            )\n        self.aspp.add_module(\n            name=\"aspp_layer\",\n            module=ASPP(\n                opts=opts,\n                in_channels=aspp_in_channels,\n                out_channels=out_channels,\n                atrous_rates=atrous_rates,\n                is_sep_conv=is_sep_conv,\n                dropout=dropout,\n            ),\n        )\n\n        self.classifier = ConvLayer2d(\n            opts=opts,\n            in_channels=out_channels,\n            out_channels=self.n_seg_classes,\n            kernel_size=1,\n            stride=1,\n            use_norm=False,\n            use_act=False,\n            bias=True,\n        )\n        self.encoder_level5_output_key = \"out_l5_exp\" if self.use_l5_exp else \"out_l5\"\n\n        self.reset_head_parameters(opts=opts)\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        \"\"\"DeepLabv3 specific arguments\"\"\"\n        if cls == DeeplabV3:\n            group = parser.add_argument_group(title=cls.__name__)\n            group.add_argument(\n                \"--model.segmentation.deeplabv3.aspp-rates\",\n                type=JsonValidator(Tuple[int, int, int]),\n                default=(6, 12, 18),\n                help=f\"Atrous rates to be used in the ASPP module in {cls.__name__} segmentation head. \\\n                    Defaults to (6, 12, 18).\",\n            )\n            group.add_argument(\n                \"--model.segmentation.deeplabv3.aspp-out-channels\",\n                type=int,\n                default=256,\n                help=f\"Output channels of ASPP module in {cls.__name__} segmentation head. \\\n                    Defaults to 256.\",\n            )\n            group.add_argument(\n                \"--model.segmentation.deeplabv3.aspp-sep-conv\",\n                action=\"store_true\",\n                default=False,\n                help=f\"Use separable convolution in the ASPP module in {cls.__name__} segmentation head. \\\n                    Defaults to False.\",\n            )\n            group.add_argument(\n                \"--model.segmentation.deeplabv3.aspp-dropout\",\n                type=float,\n                default=0.1,\n                help=f\"Dropout value in the ASPP module in {cls.__name__} segmentation head. \\\n                    Defaults to 0.1.\",\n            )\n        return parser\n\n    def forward_seg_head(self, enc_out: Dict) -> Tensor:\n        \"\"\"Forward method for DeeplabV3 segmentation head.\n\n        Args:\n            enc_out: A dictionary containing the feature maps from different spatial levels in the image encoder.\n\n        Returns:\n            A 4D tensor whose spatial size is 1/output of the input image.\n\n        ...note:\n            The input to the ASPP module is a low-resolution feature map from image encoder's level 5, optionally\n            with adjusted strides and dilation rates to (1) increase the effective receptive field, and (2) adjust\n            the feature map size to produce high-quality segmentation outputs.\n        \"\"\"\n        x = enc_out[self.encoder_level5_output_key]\n        x = self.aspp(x)\n        x = self.classifier(x)\n        return x\n\n\n@MODEL_REGISTRY.register(name=\"msc_deeplabv3\", type=\"segmentation_head\")\nclass MultiScaleDeeplabV3(DeeplabV3):\n    \"\"\"Multi-scale DeepLabv3.\n\n    The feature maps with different spatial levels are brought to the same spatial size using\n    pixel shuffle and unshuffle operations. They are then concatenated and projected\n    using a point-wise convolution.\n\n    Note that CNN-based models typically down-sample the input by a factor of 32, but output stride of\n    level 4 and level 5 are adjusted to obtain feature maps at higher resolution. On the other hand,\n    ViT-based models down-sample the input by a factor of 16. Below is an example shown for multi-scale\n    feature aggregation for image encoder backbone (ViT) whose expected output spatial dimension (before classification layer)\n    is expected to be 1/16th of the the input image's spatial dimension.\n\n    input (HxW) --> L1 --> L2 (H/2 * W/2) --> L3 (H/4 * W/4) --> L4 (H/8 * W/8) --> L5 (H/16 * W/16)\n                                |x0.5      | x1.              | 2x              | 4x\n                                |------> Concat <-------------------------------|\n\n    ...note:\n        Below is the naming convention that is used in CoreNet for layer and output key name mapping.\n                                    ------------------------------\n                                    Model Layer  | Output key name\n                                    -------------|----------------\n                                    layer_1      |    out_l1\n                                    layer_2      |    out_l2\n                                    layer_3      |    out_l3\n                                    layer_4      |    out_l4\n                                    layer_5      |    out_l5\n                                    conv_1x1_exp |    out_l5_exp\n                                    ------------------------------\n    \"\"\"\n\n    def __init__(self, opts, enc_conf: Dict, *args, **kwargs) -> None:\n\n        expected_encoder_output_keys = [\"out_l2\", \"out_l3\", \"out_l4\", \"out_l5\"]\n        encoder_level5_output_key = \"out_l5\"\n        if \"use_l5_exp\" in kwargs and kwargs[\"use_l5_exp\"]:\n            # some of the models (e.g., MobileNetv3) uses expansion layer in the classification backbone\n            # When enabled, the output of expansion layer is used.\n            expected_encoder_output_keys = [\"out_l2\", \"out_l3\", \"out_l4\", \"out_l5_exp\"]\n            encoder_level5_output_key = \"out_l5_exp\"\n\n        aspp_in_channels = getattr(\n            opts, \"model.segmentation.deeplabv3.aspp_in_channels\"\n        )\n\n        super().__init__(\n            opts, enc_conf, aspp_in_channels=aspp_in_channels, *args, **kwargs\n        )\n\n        proj_in_channels = (\n            # Increase in latent dimension due to pixel shuffle.\n            (self.enc_l2_channels * 4)\n            + (self.enc_l3_channels)\n            # decrease in latent dimension due to pixel unshuffle.\n            + (self.enc_l4_channels // 4)\n            + (\n                (self.enc_l5_channels // 16)\n                if encoder_level5_output_key == \"out_l5\"\n                else (self.enc_l5_exp_channels // 16)\n            )\n        )\n\n        self.msc_fusion = ConvLayer2d(\n            opts,\n            in_channels=proj_in_channels,\n            # The output of multi-scale fusion block is fed to ASPP. Therefore,\n            # the output channels of this block is equal to input channels in the ASPP block.\n            out_channels=aspp_in_channels,\n            bias=False,\n            kernel_size=1,\n            use_norm=True,\n            use_act=True,\n        )\n        if self.upsample_seg_out is not None:\n            # The feature maps from different levels are fused at spatial level 3 (or L3) whose spatial size is\n            # 1/4th of the original input image. Therefore, the output of this block should be upsampled by 4x\n            # inside the 'forward' method.\n            output_upsample_factor = getattr(\n                opts, \"model.segmentation.deeplabv3.output_upsample_factor\"\n            )\n            if output_upsample_factor is None:\n                logger.error(\n                    f\"Please specify --model.segmentation.deeplabv3.output-upsample-factor in {self.__class__.__name__}.\"\n                )\n            self.upsample_seg_out.scale_factor = output_upsample_factor\n        self.expected_encoder_output_keys = expected_encoder_output_keys\n        self.encoder_level5_output_key = encoder_level5_output_key\n\n        self.reset_head_parameters(opts)\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        \"\"\"MultiScaleDeeplabV3 specific arguments\"\"\"\n        if cls == MultiScaleDeeplabV3:\n            group = parser.add_argument_group(title=cls.__name__)\n            group.add_argument(\n                \"--model.segmentation.deeplabv3.aspp-in-channels\",\n                type=int,\n                default=512,\n                help=f\"Input channels of the ASPP module. This is only used in {cls.__name__}. \\\n                    Defaults to 512.\",\n            )\n            group.add_argument(\n                \"--model.segmentation.deeplabv3.output-upsample-factor\",\n                type=int,\n                default=None,\n                help=f\"Output stide of the image encoder. This argument is used on {cls.__name__}. \\\n                    Default value is None.\",\n            )\n        return parser\n\n    def forward_seg_head(self, enc_out: Dict) -> Tensor:\n        \"\"\"Forward method for MultiScaleDeeplabV3 segmentation head.\n\n        Args:\n            enc_out: A dictionary containing the feature maps from different spatial levels in the image encoder.\n\n        Returns:\n            A 4D tensor whose spatial size is 1/4th of the input image.\n\n        ...note:\n            Often times, strides of a model are adjusted to produce a high resolution feature map. In such cases,\n            the spatial dimensions from different levels may be different than the expected size. To address this,\n            we dynamically check the output size of a given level is equal to output of level 3 or not. If not, feature\n            map is interpolated using bilinear interpolation to the same size as level 3.\n        \"\"\"\n\n        if not set(self.expected_encoder_output_keys).issubset(enc_out.keys()):\n            logger.error(\n                f\"{self.__class__.__name__} requires featuers from {self.expected_encoder_output_keys} levels \\\n                for multi-scale fusion, but got only following levels: {enc_out.keys()}.\"\n            )\n\n        # encoder outputs are in [batch, channel, height, width] format\n        level3_spatial_dims = enc_out[\"out_l3\"].shape[2:]\n\n        out_l2_to_l3 = F.pixel_unshuffle(enc_out[\"out_l2\"], downscale_factor=2)\n        if out_l2_to_l3.shape[2:] != level3_spatial_dims:\n            out_l2_to_l3 = F.interpolate(\n                out_l2_to_l3,\n                size=list(level3_spatial_dims),\n                mode=\"bilinear\",\n                align_corners=True,\n            )\n\n        out_l3 = enc_out[\"out_l3\"]\n\n        out_l4_to_l3 = F.pixel_shuffle(enc_out[\"out_l4\"], upscale_factor=2)\n        if out_l4_to_l3.shape[2:] != level3_spatial_dims:\n            out_l4_to_l3 = F.interpolate(\n                out_l4_to_l3,\n                size=list(level3_spatial_dims),\n                mode=\"bilinear\",\n                align_corners=True,\n            )\n\n        out_l5_to_l3 = F.pixel_shuffle(\n            enc_out[self.encoder_level5_output_key], upscale_factor=4\n        )\n        if out_l5_to_l3.shape[2:] != level3_spatial_dims:\n            out_l5_to_l3 = F.interpolate(\n                out_l5_to_l3,\n                size=list(level3_spatial_dims),\n                mode=\"bilinear\",\n                align_corners=True,\n            )\n\n        out = torch.cat([out_l2_to_l3, out_l3, out_l4_to_l3, out_l5_to_l3], dim=1)\n        out = self.msc_fusion(out)\n\n        out = super().forward_seg_head({\"out_l5\": out})\n        return out\n"
  },
  {
    "path": "corenet/modeling/models/segmentation/heads/pspnet.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nfrom typing import Dict, Optional\n\nfrom torch import Tensor\n\nfrom corenet.modeling.layers import ConvLayer2d\nfrom corenet.modeling.misc.init_utils import initialize_weights\nfrom corenet.modeling.models import MODEL_REGISTRY\nfrom corenet.modeling.models.segmentation.heads.base_seg_head import BaseSegHead\nfrom corenet.modeling.modules import PSP\n\n\n@MODEL_REGISTRY.register(name=\"pspnet\", type=\"segmentation_head\")\nclass PSPNet(BaseSegHead):\n    \"\"\"\n    This class defines the segmentation head in `PSPNet architecture <https://arxiv.org/abs/1612.01105>`_\n    Args:\n        opts: command-line arguments\n        enc_conf (Dict): Encoder input-output configuration at each spatial level\n        use_l5_exp (Optional[bool]): Use features from expansion layer in Level5 in the encoder\n    \"\"\"\n\n    def __init__(\n        self, opts, enc_conf: dict, use_l5_exp: Optional[bool] = False, *args, **kwargs\n    ) -> None:\n        psp_out_channels = getattr(\n            opts, \"model.segmentation.pspnet.psp_out_channels\", 512\n        )\n        psp_pool_sizes = getattr(\n            opts, \"model.segmentation.pspnet.psp_pool_sizes\", [1, 2, 3, 6]\n        )\n        psp_dropout = getattr(opts, \"model.segmentation.pspnet.psp_dropout\", 0.1)\n\n        super().__init__(opts=opts, enc_conf=enc_conf, use_l5_exp=use_l5_exp)\n\n        psp_in_channels = (\n            self.enc_l5_channels if not self.use_l5_exp else self.enc_l5_exp_channels\n        )\n        self.psp_layer = PSP(\n            opts=opts,\n            in_channels=psp_in_channels,\n            out_channels=psp_out_channels,\n            pool_sizes=psp_pool_sizes,\n            dropout=psp_dropout,\n        )\n        self.classifier = ConvLayer2d(\n            opts=opts,\n            in_channels=psp_out_channels,\n            out_channels=self.n_seg_classes,\n            kernel_size=1,\n            stride=1,\n            use_norm=False,\n            use_act=False,\n            bias=True,\n        )\n        self.reset_head_parameters(opts=opts)\n\n    def update_classifier(self, opts, n_classes: int) -> None:\n        \"\"\"\n        This function updates the classification layer in a model. Useful for finetuning purposes.\n        \"\"\"\n        in_channels = self.classifier.in_channels\n        conv_layer = ConvLayer2d(\n            opts=opts,\n            in_channels=in_channels,\n            out_channels=n_classes,\n            kernel_size=1,\n            stride=1,\n            use_norm=False,\n            use_act=False,\n            bias=True,\n        )\n\n        initialize_weights(opts, modules=conv_layer)\n        self.classifier = conv_layer\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        group = parser.add_argument_group(title=cls.__name__)\n        group.add_argument(\n            \"--model.segmentation.pspnet.psp-pool-sizes\",\n            type=int,\n            nargs=\"+\",\n            default=[1, 2, 3, 6],\n            help=\"Pool sizes in the PSPNet module\",\n        )\n        group.add_argument(\n            \"--model.segmentation.pspnet.psp-out-channels\",\n            type=int,\n            default=512,\n            help=\"Output channels of PSPNet module\",\n        )\n        group.add_argument(\n            \"--model.segmentation.pspnet.psp-dropout\",\n            type=float,\n            default=0.1,\n            help=\"Dropout in the PSPNet module\",\n        )\n        return parser\n\n    def forward_seg_head(self, enc_out: Dict) -> Tensor:\n        # low resolution features\n        x = enc_out[\"out_l5_exp\"] if self.use_l5_exp else enc_out[\"out_l5\"]\n\n        # Apply PSP layer\n        x = self.psp_layer(x)\n\n        out = self.classifier(x)\n\n        return out\n"
  },
  {
    "path": "corenet/modeling/models/segmentation/heads/simple_seg_head.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nfrom typing import Dict, Optional\n\nfrom torch import Tensor\n\nfrom corenet.modeling.layers import ConvLayer2d\nfrom corenet.modeling.models import MODEL_REGISTRY\nfrom corenet.modeling.models.segmentation.heads.base_seg_head import BaseSegHead\n\n\n@MODEL_REGISTRY.register(name=\"simple_seg_head\", type=\"segmentation_head\")\nclass SimpleSegHead(BaseSegHead):\n    \"\"\"\n    This class defines the simple segmentation head with merely a classification layer. This is useful for performing\n    linear probling on segmentation task.\n    Args:\n        opts: command-line arguments\n        enc_conf (Dict): Encoder input-output configuration at each spatial level\n        use_l5_exp (Optional[bool]): Use features from expansion layer in Level5 in the encoder\n    \"\"\"\n\n    def __init__(\n        self, opts, enc_conf: Dict, use_l5_exp: Optional[bool] = False, *args, **kwargs\n    ) -> None:\n\n        super().__init__(opts=opts, enc_conf=enc_conf, use_l5_exp=use_l5_exp)\n\n        in_channels = (\n            self.enc_l5_channels if not self.use_l5_exp else self.enc_l5_exp_channels\n        )\n\n        self.classifier = ConvLayer2d(\n            opts=opts,\n            in_channels=in_channels,\n            out_channels=self.n_seg_classes,\n            kernel_size=1,\n            stride=1,\n            use_norm=False,\n            use_act=False,\n            bias=True,\n        )\n\n        self.reset_head_parameters(opts=opts)\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        return parser\n\n    def forward_seg_head(self, enc_out: Dict) -> Tensor:\n        x = enc_out[\"out_l5_exp\"] if self.use_l5_exp else enc_out[\"out_l5\"]\n        # classify\n        x = self.classifier(x)\n        return x\n"
  },
  {
    "path": "corenet/modeling/models/video_classification/__init__.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n"
  },
  {
    "path": "corenet/modeling/models/video_classification/base_video_encoder.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\n\nfrom corenet.constants import SUPPORTED_VIDEO_CLIP_VOTING_FN\nfrom corenet.modeling.misc.init_utils import initialize_weights\nfrom corenet.modeling.models import MODEL_REGISTRY, BaseAnyNNModel\n\n\n@MODEL_REGISTRY.register(name=\"__base__\", type=\"video_classification\")\nclass BaseVideoEncoder(BaseAnyNNModel):\n    \"\"\"Base class for the video backbones\n\n    Args:\n        opts: Command-line arguments\n    \"\"\"\n\n    def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None:\n        super().__init__(opts, *args, **kwargs)\n        self.round_nearest = 8\n        self.model_conf_dict = dict()\n        self.inference_mode = getattr(\n            opts, \"model.video_classification.inference_mode\", False\n        )\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        if cls != BaseVideoEncoder:\n            # Don't re-register arguments in subclasses that don't override `add_arguments()`.\n            return parser\n\n        group = parser.add_argument_group(cls.__name__)\n        group.add_argument(\n            \"--model.video-classification.classifier-dropout\",\n            type=float,\n            default=0.0,\n            help=\"Dropout rate in classifier\",\n        )\n\n        group.add_argument(\n            \"--model.video-classification.name\",\n            type=str,\n            default=\"mobilevit\",\n            help=\"Model name\",\n        )\n        group.add_argument(\n            \"--model.video-classification.n-classes\",\n            type=int,\n            default=1000,\n            help=\"Number of classes in the dataset\",\n        )\n        group.add_argument(\n            \"--model.video-classification.pretrained\",\n            type=str,\n            default=None,\n            help=\"Path of the pretrained backbone\",\n        )\n        group.add_argument(\n            \"--model.video-classification.freeze-batch-norm\",\n            action=\"store_true\",\n            help=\"Freeze batch norm layers\",\n        )\n\n        group.add_argument(\n            \"--model.video-classification.activation.name\",\n            default=None,\n            type=str,\n            help=\"Non-linear function type\",\n        )\n        group.add_argument(\n            \"--model.video-classification.activation.inplace\",\n            action=\"store_true\",\n            help=\"Inplace non-linear functions\",\n        )\n        group.add_argument(\n            \"--model.video-classification.activation.neg-slope\",\n            default=0.1,\n            type=float,\n            help=\"Negative slope in leaky relu\",\n        )\n        group.add_argument(\n            \"--model.video-classification.clip-out-voting-fn\",\n            type=str,\n            default=\"sum\",\n            choices=SUPPORTED_VIDEO_CLIP_VOTING_FN,\n            help=\"How to fuse the outputs of different clips in a video\",\n        )\n\n        group.add_argument(\n            \"--model.video-classification.inference-mode\",\n            action=\"store_true\",\n            help=\"Inference mode\",\n        )\n\n        return parser\n\n    @staticmethod\n    def reset_module_parameters(opts, module) -> None:\n        \"\"\"Reset parameters for a specific module in the network\"\"\"\n        initialize_weights(opts=opts, modules=module)\n"
  },
  {
    "path": "corenet/modeling/modules/__init__.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n# isort: skip_file\nfrom corenet.modeling.modules.base_module import BaseModule\nfrom corenet.modeling.modules.squeeze_excitation import SqueezeExcitation\nfrom corenet.modeling.modules.mobilenetv2 import InvertedResidual, InvertedResidualSE\nfrom corenet.modeling.modules.resnet_modules import (\n    BasicResNetBlock,\n    BottleneckResNetBlock,\n)\nfrom corenet.modeling.modules.aspp_block import ASPP\nfrom corenet.modeling.modules.transformer import TransformerEncoder\nfrom corenet.modeling.modules.windowed_transformer import WindowedTransformerEncoder\nfrom corenet.modeling.modules.pspnet_module import PSP\nfrom corenet.modeling.modules.mobilevit_block import MobileViTBlock, MobileViTBlockv2\nfrom corenet.modeling.modules.feature_pyramid import FeaturePyramidNetwork\nfrom corenet.modeling.modules.ssd_heads import SSDHead, SSDInstanceHead\nfrom corenet.modeling.modules.efficientnet import EfficientNetBlock\nfrom corenet.modeling.modules.mobileone_block import MobileOneBlock, RepLKBlock\nfrom corenet.modeling.modules.swin_transformer_block import (\n    SwinTransformerBlock,\n    PatchMerging,\n    Permute,\n)\nfrom corenet.modeling.modules.regnet_modules import XRegNetBlock, AnyRegNetStage\nfrom corenet.modeling.modules.flash_transformer import FlashTransformerEncoder\n\n\n__all__ = [\n    \"InvertedResidual\",\n    \"InvertedResidualSE\",\n    \"BasicResNetBlock\",\n    \"BottleneckResNetBlock\",\n    \"ASPP\",\n    \"TransformerEncoder\",\n    \"WindowedTransformerEncoder\",\n    \"SqueezeExcitation\",\n    \"PSP\",\n    \"MobileViTBlock\",\n    \"MobileViTBlockv2\",\n    \"MobileOneBlock\",\n    \"RepLKBlock\",\n    \"FeaturePyramidNetwork\",\n    \"SSDHead\",\n    \"SSDInstanceHead\",\n    \"EfficientNetBlock\",\n    \"SwinTransformerBlock\",\n    \"PatchMerging\",\n    \"Permute\",\n    \"XRegNetBlock\",\n    \"AnyRegNetStage\",\n    \"FlashTransformerEncoder\",\n]\n"
  },
  {
    "path": "corenet/modeling/modules/aspp_block.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\nimport argparse\nfrom typing import Optional, Tuple\n\nimport torch\nimport torch.nn.functional as F\nfrom torch import Tensor, nn\n\nfrom corenet.modeling.layers import (\n    AdaptiveAvgPool2d,\n    BaseLayer,\n    ConvLayer2d,\n    Dropout2d,\n    SeparableConv2d,\n)\nfrom corenet.modeling.modules import BaseModule\nfrom corenet.utils import logger\nfrom corenet.utils.ddp_utils import is_master\n\n\nclass ASPP(BaseModule):\n    \"\"\"\n    ASPP module defined in DeepLab papers, `here <https://arxiv.org/abs/1606.00915>`_ and `here <https://arxiv.org/abs/1706.05587>`_\n\n    Args:\n        opts: command-line arguments\n        in_channels (int): :math:`C_{in}` from an expected input of size :math:`(N, C_{in}, H, W)`\n        out_channels (int): :math:`C_{out}` from an expected output of size :math:`(N, C_{out}, H, W)`\n        atrous_rates (Tuple[int]): atrous rates for different branches.\n        is_sep_conv (Optional[bool]): Use separable convolution instead of standaard conv. Default: False\n        dropout (Optional[float]): Apply dropout. Default is 0.0\n\n    Shape:\n        - Input: :math:`(N, C_{in}, H, W)`\n        - Output: :math:`(N, C_{out}, H, W)`\n    \"\"\"\n\n    def __init__(\n        self,\n        opts,\n        in_channels: int,\n        out_channels: int,\n        atrous_rates: Tuple[int],\n        is_sep_conv: Optional[bool] = False,\n        dropout: Optional[float] = 0.0,\n        *args,\n        **kwargs\n    ) -> None:\n        in_proj = ConvLayer2d(\n            opts=opts,\n            in_channels=in_channels,\n            out_channels=out_channels,\n            kernel_size=1,\n            stride=1,\n            use_norm=True,\n            use_act=True,\n        )\n        out_proj = ConvLayer2d(\n            opts=opts,\n            in_channels=5 * out_channels,\n            out_channels=out_channels,\n            kernel_size=1,\n            stride=1,\n            use_norm=True,\n            use_act=True,\n        )\n        aspp_layer = ASPPSeparableConv2d if is_sep_conv else ASPPConv2d\n\n        assert len(atrous_rates) == 3\n\n        modules = [in_proj]\n        modules.extend(\n            [\n                aspp_layer(\n                    opts=opts,\n                    in_channels=in_channels,\n                    out_channels=out_channels,\n                    dilation=rate,\n                )\n                for rate in atrous_rates\n            ]\n        )\n        modules.append(\n            ASPPPooling(opts=opts, in_channels=in_channels, out_channels=out_channels)\n        )\n\n        if not (0.0 <= dropout < 1.0):\n            if is_master(opts):\n                logger.warning(\n                    \"Dropout value in {} should be between 0 and 1. Got: {}. Setting it to 0.0\".format(\n                        self.__class__.__name__, dropout\n                    )\n                )\n            dropout = 0.0\n\n        super().__init__()\n        self.convs = nn.ModuleList(modules)\n        self.project = out_proj\n\n        self.in_channels = in_channels\n        self.out_channels = out_channels\n        self.atrous_rates = atrous_rates\n        self.is_sep_conv_layer = is_sep_conv\n        self.n_atrous_branches = len(atrous_rates)\n        self.dropout_layer = Dropout2d(p=dropout)\n\n    def forward(self, x: Tensor, *args, **kwargs) -> Tensor:\n        out = []\n        for conv in self.convs:\n            out.append(conv(x))\n        out = torch.cat(out, dim=1)\n        out = self.project(out)\n        out = self.dropout_layer(out)\n        return out\n\n    def __repr__(self):\n        return \"{}(in_channels={}, out_channels={}, atrous_rates={}, is_aspp_sep={}, dropout={})\".format(\n            self.__class__.__name__,\n            self.in_channels,\n            self.out_channels,\n            self.atrous_rates,\n            self.is_sep_conv_layer,\n            self.dropout_layer.p,\n        )\n\n\nclass ASPPConv2d(ConvLayer2d):\n    \"\"\"\n    Convolution with a dilation  for the ASPP module\n    Args:\n        opts: command-line arguments\n        in_channels (int): :math:`C_{in}` from an expected input of size :math:`(N, C_{in}, H, W)`\n        out_channels (int): :math:`C_{out}` from an expected output of size :math:`(N, C_{out}, H, W)`\n        dilation (int): Dilation rate\n\n    Shape:\n        - Input: :math:`(N, C_{in}, H, W)`\n        - Output: :math:`(N, C_{out}, H, W)`\n    \"\"\"\n\n    def __init__(\n        self, opts, in_channels: int, out_channels: int, dilation: int, *args, **kwargs\n    ) -> None:\n        super().__init__(\n            opts=opts,\n            in_channels=in_channels,\n            out_channels=out_channels,\n            kernel_size=3,\n            stride=1,\n            use_norm=True,\n            use_act=True,\n            dilation=dilation,\n        )\n\n    def adjust_atrous_rate(self, rate: int) -> None:\n        \"\"\"This function allows to adjust the dilation rate\"\"\"\n        self.block.conv.dilation = rate\n        # padding is the same here\n        # see ConvLayer to see the method for computing padding\n        self.block.conv.padding = rate\n\n\nclass ASPPSeparableConv2d(SeparableConv2d):\n    \"\"\"\n    Separable Convolution with a dilation for the ASPP module\n    Args:\n        opts: command-line arguments\n        in_channels (int): :math:`C_{in}` from an expected input of size :math:`(N, C_{in}, H, W)`\n        out_channels (int): :math:`C_{out}` from an expected output of size :math:`(N, C_{out}, H, W)`\n        dilation (int): Dilation rate\n\n    Shape:\n        - Input: :math:`(N, C_{in}, H, W)`\n        - Output: :math:`(N, C_{out}, H, W)`\n    \"\"\"\n\n    def __init__(\n        self, opts, in_channels: int, out_channels: int, dilation: int, *args, **kwargs\n    ) -> None:\n        super().__init__(\n            opts=opts,\n            in_channels=in_channels,\n            out_channels=out_channels,\n            kernel_size=3,\n            stride=1,\n            dilation=dilation,\n            use_norm=True,\n            use_act=True,\n        )\n\n    def adjust_atrous_rate(self, rate: int) -> None:\n        \"\"\"This function allows to adjust the dilation rate\"\"\"\n        self.dw_conv.block.conv.dilation = rate\n        # padding is the same here\n        # see ConvLayer to see the method for computing padding\n        self.dw_conv.block.conv.padding = rate\n\n\nclass ASPPPooling(BaseLayer):\n    \"\"\"\n    ASPP pooling layer\n    Args:\n        opts: command-line arguments\n        in_channels (int): :math:`C_{in}` from an expected input of size :math:`(N, C_{in}, H, W)`\n        out_channels (int): :math:`C_{out}` from an expected output of size :math:`(N, C_{out}, H, W)`\n\n    Shape:\n        - Input: :math:`(N, C_{in}, H, W)`\n        - Output: :math:`(N, C_{out}, H, W)`\n    \"\"\"\n\n    def __init__(\n        self, opts, in_channels: int, out_channels: int, *args, **kwargs\n    ) -> None:\n        super().__init__()\n        self.aspp_pool = nn.Sequential()\n        self.aspp_pool.add_module(\n            name=\"global_pool\", module=AdaptiveAvgPool2d(output_size=1)\n        )\n        self.aspp_pool.add_module(\n            name=\"conv_1x1\",\n            module=ConvLayer2d(\n                opts=opts,\n                in_channels=in_channels,\n                out_channels=out_channels,\n                kernel_size=1,\n                stride=1,\n                use_norm=True,\n                use_act=True,\n            ),\n        )\n\n        self.in_channels = in_channels\n        self.out_channels = out_channels\n\n    def forward(self, x: Tensor) -> Tensor:\n        x_size = x.shape[-2:]\n        x = self.aspp_pool(x)\n        x = F.interpolate(x, size=x_size, mode=\"bilinear\", align_corners=False)\n        return x\n\n    def __repr__(self):\n        return \"{}(in_channels={}, out_channels={})\".format(\n            self.__class__.__name__, self.in_channels, self.out_channels\n        )\n"
  },
  {
    "path": "corenet/modeling/modules/base_module.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom typing import Any\n\nimport torch\nfrom torch import Tensor, nn\n\n\nclass BaseModule(nn.Module):\n    \"\"\"Base class for all modules\"\"\"\n\n    def __init__(self, *args, **kwargs):\n        super(BaseModule, self).__init__()\n\n    def forward(self, x: Any, *args, **kwargs) -> Any:\n        raise NotImplementedError\n\n    def __repr__(self):\n        return \"{}\".format(self.__class__.__name__)\n"
  },
  {
    "path": "corenet/modeling/modules/efficientnet.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom torch import Tensor, nn\n\nfrom corenet.modeling.layers import StochasticDepth\nfrom corenet.modeling.modules import InvertedResidualSE\n\n\nclass EfficientNetBlock(InvertedResidualSE):\n    \"\"\"\n    This class implements a variant of the inverted residual block with squeeze-excitation unit,\n    as described in `MobileNetv3 <https://arxiv.org/abs/1905.02244>`_ paper. This variant\n    includes stochastic depth, as used in `EfficientNet <https://arxiv.org/abs/1905.11946>`_ paper.\n\n    Args:\n        stochastic_depth_prob: float,\n        For other arguments, refer to the parent class.\n\n    Shape:\n        - Input: :math:`(N, C_{in}, H_{in}, W_{in})`\n        - Output: :math:`(N, C_{out}, H_{out}, W_{out})`\n    \"\"\"\n\n    def __init__(self, stochastic_depth_prob: float, *args, **kwargs) -> None:\n        super().__init__(*args, **kwargs)\n        self.stochastic_depth = StochasticDepth(p=stochastic_depth_prob, mode=\"row\")\n\n    def forward(self, x: Tensor, *args, **kwargs) -> Tensor:\n        y = self.block(x)\n        if self.use_res_connect:\n            # Pass the output through the stochastic layer module, potentially zeroing it.\n            y = self.stochastic_depth(y)\n            # residual connection\n            y = y + x\n        return y\n\n    def __repr__(self) -> str:\n        return (\n            super().__repr__()[:-1]\n            + f\", stochastic_depth_prob={self.stochastic_depth.p})\"\n        )\n"
  },
  {
    "path": "corenet/modeling/modules/fastvit.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\nimport argparse\nfrom typing import Optional, Tuple, Union\n\nimport torch\nimport torch.nn as nn\n\nfrom corenet.modeling.layers import ConvLayer2d, MultiHeadAttention, StochasticDepth\nfrom corenet.modeling.layers.normalization.batch_norm import BatchNorm2d\nfrom corenet.modeling.modules import BaseModule\nfrom corenet.modeling.modules.mobileone_block import MobileOneBlock, RepLKBlock\n\n\ndef convolutional_stem(\n    opts: argparse.Namespace, in_channels: int, out_channels: int\n) -> nn.Sequential:\n    \"\"\"\n    Build convolutional stem with MobileOne blocks.\n\n    Args:\n        opts: Command line arguments.\n        in_channels: Number of input channels.\n        out_channels: Number of output channels.\n\n    Returns:\n        nn.Sequential object with stem elements.\n    \"\"\"\n    inference_mode = getattr(opts, \"model.classification.fastvit.inference_mode\")\n    return nn.Sequential(\n        MobileOneBlock(\n            opts,\n            in_channels=in_channels,\n            out_channels=out_channels,\n            kernel_size=3,\n            stride=2,\n            padding=1,\n            groups=1,\n            inference_mode=inference_mode,\n            use_se=False,\n            num_conv_branches=1,\n        ),\n        MobileOneBlock(\n            opts,\n            in_channels=out_channels,\n            out_channels=out_channels,\n            kernel_size=3,\n            stride=2,\n            padding=1,\n            groups=out_channels,\n            inference_mode=inference_mode,\n            use_se=False,\n            num_conv_branches=1,\n        ),\n        MobileOneBlock(\n            opts,\n            in_channels=out_channels,\n            out_channels=out_channels,\n            kernel_size=1,\n            stride=1,\n            padding=0,\n            groups=1,\n            inference_mode=inference_mode,\n            use_se=False,\n            num_conv_branches=1,\n        ),\n    )\n\n\nclass PatchEmbed(BaseModule):\n    \"\"\"\n    Convolutional Patch embedding layer.\n\n    Args:\n        opts: Command line arguments.\n        patch_size: Patch size for embedding computation.\n        stride: Stride for convolutional embedding layer.\n        in_channels: Number of channels of input tensor.\n        embed_dim: Number of embedding dimensions.\n    \"\"\"\n\n    def __init__(\n        self,\n        opts: argparse.Namespace,\n        patch_size: int,\n        stride: int,\n        in_channels: int,\n        embed_dim: int,\n    ):\n        super().__init__()\n\n        inference_mode = getattr(opts, \"model.classification.fastvit.inference_mode\")\n        block = list()\n        block.append(\n            RepLKBlock(\n                opts,\n                in_channels=in_channels,\n                out_channels=embed_dim,\n                kernel_size=patch_size,\n                stride=stride,\n                groups=in_channels,\n                small_kernel_size=3,\n                inference_mode=inference_mode,\n            )\n        )\n        block.append(\n            MobileOneBlock(\n                opts,\n                in_channels=embed_dim,\n                out_channels=embed_dim,\n                kernel_size=1,\n                stride=1,\n                padding=0,\n                groups=1,\n                inference_mode=inference_mode,\n                use_se=False,\n                num_conv_branches=1,\n            )\n        )\n        self.proj = nn.Sequential(*block)\n\n    def forward(self, x: torch.Tensor, *args, **kwargs) -> torch.Tensor:\n        \"\"\"\n        Forward pass\n\n        Args:\n            x: Input tensor of shape :math:`(B, C, H, W)`.\n\n        Returns:\n            torch.Tensor of shape :math:`(B, C, H//s, W//s)`,\n            where `s` is the stride provide while instantiating the layer.\n        \"\"\"\n        x = self.proj(x)\n        return x\n\n\nclass RepMixer(BaseModule):\n    \"\"\"\n    Reparameterizable token mixer\n\n    For more details, please refer to our paper:\n    `FastViT: A Fast Hybrid Vision Transformer using Structural Reparameterization`\n\n    Args:\n        opts: Command line arguments.\n        dim: Input feature map dimension. :math:`C_{in}` from an expected input of size :math:`(B, C_{in}, H, W)`.\n        kernel_size: Kernel size for spatial mixing. Default: 3\n        use_layer_scale: If True, learnable layer scale is used. Default: ``True``\n        layer_scale_init_value: Initial value for layer scale. Default: 1e-5\n        inference_mode: If True, instantiates model in inference mode. Default: ``False``\n    \"\"\"\n\n    def __init__(\n        self,\n        opts: argparse.Namespace,\n        dim: int,\n        kernel_size: int = 3,\n        use_layer_scale: bool = True,\n        layer_scale_init_value: float = 1e-5,\n        inference_mode: bool = False,\n    ):\n        super().__init__()\n        self.dim = dim\n        self.kernel_size = kernel_size\n\n        if inference_mode:\n            self.reparam_conv = nn.Conv2d(\n                in_channels=self.dim,\n                out_channels=self.dim,\n                kernel_size=self.kernel_size,\n                stride=1,\n                padding=self.kernel_size // 2,\n                groups=self.dim,\n                bias=True,\n            )\n        else:\n            self.norm = MobileOneBlock(\n                opts,\n                dim,\n                dim,\n                kernel_size,\n                padding=kernel_size // 2,\n                groups=dim,\n                use_act=False,\n                use_scale_branch=False,\n                num_conv_branches=0,\n            )\n            self.mixer = MobileOneBlock(\n                opts,\n                dim,\n                dim,\n                kernel_size,\n                padding=kernel_size // 2,\n                groups=dim,\n                use_act=False,\n            )\n            self.use_layer_scale = use_layer_scale\n            if use_layer_scale:\n                self.layer_scale = nn.Parameter(\n                    layer_scale_init_value * torch.ones((dim, 1, 1)),\n                )\n\n    def forward(self, x: torch.Tensor, *args, **kwargs) -> torch.Tensor:\n        \"\"\"\n        Forward pass implements inference logic for module\n        before and after reparameterization.\n\n        Args:\n            x: Input tensor of shape :math:`(B, C, H, W)`.\n\n        Returns:\n            torch.Tensor of shape :math:`(B, C, H, W)`.\n        \"\"\"\n        if hasattr(self, \"reparam_conv\"):\n            x = self.reparam_conv(x)\n            return x\n        else:\n            if self.use_layer_scale:\n                x = x + self.layer_scale * (self.mixer(x) - self.norm(x))\n            else:\n                x = x + self.mixer(x) - self.norm(x)\n            return x\n\n    def reparameterize(self) -> None:\n        \"\"\"\n        Reparameterize mixer and norm into a single\n        convolutional layer for efficient inference.\n        \"\"\"\n        self.mixer.reparameterize()\n        self.norm.reparameterize()\n\n        if self.use_layer_scale:\n            w = self.mixer.id_tensor + self.layer_scale.unsqueeze(-1) * (\n                self.mixer.reparam_conv.weight - self.norm.reparam_conv.weight\n            )\n            b = torch.squeeze(self.layer_scale) * (\n                self.mixer.reparam_conv.bias - self.norm.reparam_conv.bias\n            )\n        else:\n            w = (\n                self.mixer.id_tensor\n                + self.mixer.reparam_conv.weight\n                - self.norm.reparam_conv.weight\n            )\n            b = self.mixer.reparam_conv.bias - self.norm.reparam_conv.bias\n\n        self.reparam_conv = nn.Conv2d(\n            in_channels=self.dim,\n            out_channels=self.dim,\n            kernel_size=self.kernel_size,\n            stride=1,\n            padding=self.kernel_size // 2,\n            groups=self.dim,\n            bias=True,\n        )\n        self.reparam_conv.weight.data = w\n        self.reparam_conv.bias.data = b\n\n        for para in self.parameters():\n            para.detach_()\n        self.__delattr__(\"mixer\")\n        self.__delattr__(\"norm\")\n\n\nclass ConvFFN(BaseModule):\n    \"\"\"\n    Convolutional FFN Module.\n\n    Args:\n        opts: Command line arguments.\n        in_channels: Number of input channels.\n        hidden_channels: Number of channels after expansion. Default: None\n        out_channels: Number of output channels. Default: None\n        drop: Dropout rate. Default: ``0.0``.\n    \"\"\"\n\n    def __init__(\n        self,\n        opts: argparse.Namespace,\n        in_channels: int,\n        hidden_channels: Optional[int] = None,\n        out_channels: Optional[int] = None,\n        drop: float = 0.0,\n    ):\n        super().__init__()\n        out_channels = out_channels or in_channels\n        hidden_channels = hidden_channels or in_channels\n        self.conv = ConvLayer2d(\n            opts,\n            in_channels=in_channels,\n            out_channels=in_channels,\n            kernel_size=7,\n            padding=3,\n            groups=in_channels,\n            bias=False,\n            use_act=False,\n        )\n        self.fc1 = ConvLayer2d(\n            opts, in_channels, hidden_channels, kernel_size=1, use_norm=False, bias=True\n        )\n        self.fc2 = ConvLayer2d(\n            opts,\n            hidden_channels,\n            out_channels,\n            kernel_size=1,\n            use_norm=False,\n            use_act=False,\n            bias=True,\n        )\n        self.drop = nn.Dropout(drop)\n\n    def forward(self, x: torch.Tensor, *args, **kwargs) -> torch.Tensor:\n        \"\"\"\n        Forward pass\n\n        Args:\n            x: Input tensor of shape :math:`(B, C, H, W)`.\n\n        Returns:\n            torch.Tensor of shape :math:`(B, C, H, W)`.\n        \"\"\"\n        x = self.conv(x)\n        x = self.fc1(x)\n        x = self.drop(x)\n        x = self.fc2(x)\n        x = self.drop(x)\n        return x\n\n\nclass RepMixerBlock(BaseModule):\n    \"\"\"\n    Implementation of Metaformer block with RepMixer as token mixer.\n    For more details on Metaformer structure, please refer to:\n    `MetaFormer Is Actually What You Need for Vision <https://arxiv.org/pdf/2111.11418.pdf>`_\n\n    Args:\n        opts: Command line arguments.\n        dim: Number of embedding dimensions.\n        kernel_size: Kernel size for repmixer. Default: 3\n        mlp_ratio: MLP expansion ratio. Default: 4.0\n        drop: Dropout rate. Default: 0.0\n        drop_path: Drop path rate. Default: 0.0\n        use_layer_scale: Flag to turn on layer scale. Default: ``True``\n        layer_scale_init_value: Layer scale value at initialization. Default: 1e-5\n        inference_mode: Flag to instantiate block in inference mode. Default: ``False``\n    \"\"\"\n\n    def __init__(\n        self,\n        opts: argparse.Namespace,\n        dim: int,\n        kernel_size: int = 3,\n        mlp_ratio: float = 4.0,\n        drop: float = 0.0,\n        drop_path: float = 0.0,\n        use_layer_scale: bool = True,\n        layer_scale_init_value: float = 1e-5,\n        inference_mode: bool = False,\n    ):\n\n        super().__init__()\n        self.token_mixer = RepMixer(\n            opts,\n            dim=dim,\n            kernel_size=kernel_size,\n            use_layer_scale=use_layer_scale,\n            layer_scale_init_value=layer_scale_init_value,\n            inference_mode=inference_mode,\n        )\n\n        assert mlp_ratio > 0, \"MLP ratio should be greater than 0, found: {}\".format(\n            mlp_ratio\n        )\n        hidden_dim = int(dim * mlp_ratio)\n        self.convffn = ConvFFN(\n            opts, in_channels=dim, hidden_channels=hidden_dim, drop=drop\n        )\n\n        self.drop_path = (\n            StochasticDepth(drop_path, mode=\"row\") if drop_path > 0.0 else nn.Identity()\n        )\n        self.use_layer_scale = use_layer_scale\n        if use_layer_scale:\n            self.layer_scale = nn.Parameter(\n                layer_scale_init_value * torch.ones((dim, 1, 1)),\n            )\n\n    def forward(self, x: torch.Tensor, *args, **kwargs) -> torch.Tensor:\n        \"\"\"\n        Forward pass\n\n        Args:\n            x: Input tensor of shape :math:`(B, C, H, W)`.\n\n        Returns:\n            torch.Tensor of shape :math:`(B, C, H, W)`.\n        \"\"\"\n        if self.use_layer_scale:\n            x = self.token_mixer(x)\n            x = x + self.drop_path(self.layer_scale * self.convffn(x))\n        else:\n            x = self.token_mixer(x)\n            x = x + self.drop_path(self.convffn(x))\n        return x\n\n\nclass AttentionBlock(BaseModule):\n    \"\"\"\n    Implementation of metaformer block with MHSA as token mixer.\n    For more details on Metaformer structure, please refer to:\n    `MetaFormer Is Actually What You Need for Vision <https://arxiv.org/pdf/2111.11418.pdf>`_\n\n    Args:\n        opts: Command line arguments.\n        dim: Number of embedding dimensions.\n        mlp_ratio: MLP expansion ratio. Default: 4.0\n        drop: Dropout rate. Default: 0.0\n        drop_path: Drop path rate. Default: 0.0\n        use_layer_scale: Flag to turn on layer scale. Default: ``True``\n        layer_scale_init_value: Layer scale value at initialization. Default: 1e-5\n    \"\"\"\n\n    def __init__(\n        self,\n        opts: argparse.Namespace,\n        dim: int,\n        mlp_ratio: float = 4.0,\n        drop: float = 0.0,\n        drop_path: float = 0.0,\n        use_layer_scale: bool = True,\n        layer_scale_init_value: float = 1e-5,\n    ):\n\n        super().__init__()\n        self.norm = BatchNorm2d(num_features=dim)\n        self.head_dim = 32\n        num_heads = dim // self.head_dim\n        self.token_mixer = MultiHeadAttention(\n            embed_dim=dim, num_heads=num_heads, bias=False\n        )\n\n        assert mlp_ratio > 0, \"MLP ratio should be greater than 0, found: {}\".format(\n            mlp_ratio\n        )\n        hidden_dim = int(dim * mlp_ratio)\n        self.convffn = ConvFFN(\n            opts, in_channels=dim, hidden_channels=hidden_dim, drop=drop\n        )\n\n        self.drop_path = (\n            StochasticDepth(drop_path, mode=\"row\") if drop_path > 0.0 else nn.Identity()\n        )\n        self.use_layer_scale = use_layer_scale\n        if use_layer_scale:\n            self.layer_scale_1 = nn.Parameter(\n                layer_scale_init_value * torch.ones((dim, 1, 1)),\n            )\n            self.layer_scale_2 = nn.Parameter(\n                layer_scale_init_value * torch.ones((dim, 1, 1)),\n            )\n\n    def _apply_mhsa(self, x: torch.Tensor) -> torch.Tensor:\n        \"\"\"\n        Perform appropriate reshaping before and after MHSA block.\n\n        Args:\n            x: Input tensor of shape :math:`(B, C, H, W)`.\n\n        Returns:\n            torch.Tensor of shape :math:`(B, C, H, W)`.\n        \"\"\"\n        x_norm = self.norm(x)\n        B, C, H, W = x_norm.shape\n        x_norm_reshaped = torch.flatten(x_norm, start_dim=2).transpose(\n            -2, -1\n        )  # (B, N, C), where N = H * W\n        out = self.token_mixer(x_norm_reshaped)\n        out = out.transpose(-2, -1).reshape(B, C, H, W)\n        return out\n\n    def forward(self, x: torch.Tensor, *args, **kwargs) -> torch.Tensor:\n        \"\"\"\n        Forward pass\n\n        Args:\n            x: Input tensor of shape :math:`(B, C, H, W)`.\n\n        Returns:\n            torch.Tensor output from the attention block.\n        \"\"\"\n        if self.use_layer_scale:\n            x = x + self.drop_path(self.layer_scale_1 * self._apply_mhsa(x))\n            x = x + self.drop_path(self.layer_scale_2 * self.convffn(x))\n        else:\n            x = x + self.drop_path(self._apply_mhsa(x))\n            x = x + self.drop_path(self.convffn(x))\n        return x\n\n\nclass RepCPE(BaseModule):\n    \"\"\"\n    Implementation of reparameterizable conditional positional encoding.\n    For more details refer to paper:\n    `Conditional Positional Encodings for Vision Transformers <https://arxiv.org/pdf/2102.10882.pdf>`_\n\n    Args:\n        opts: Command line arguments.\n        in_channels: Number of input channels.\n        embed_dim: Number of embedding dimensions. Default: 768\n        spatial_shape: Spatial shape of kernel for positional encoding. Default: (7, 7)\n        inference_mode: Flag to instantiate block in inference mode. Default: ``False``\n    \"\"\"\n\n    def __init__(\n        self,\n        opts: argparse.Namespace,\n        in_channels: int,\n        embed_dim: int = 768,\n        spatial_shape: Union[int, Tuple[int, int]] = (7, 7),\n        inference_mode: bool = False,\n    ):\n        super(RepCPE, self).__init__()\n        if isinstance(spatial_shape, int):\n            spatial_shape = tuple([spatial_shape] * 2)\n        assert isinstance(spatial_shape, Tuple), (\n            f'\"spatial_shape\" must by a sequence or int, '\n            f\"get {type(spatial_shape)} instead.\"\n        )\n        assert len(spatial_shape) == 2, (\n            f'Length of \"spatial_shape\" should be 2, '\n            f\"got {len(spatial_shape)} instead.\"\n        )\n\n        self.spatial_shape = spatial_shape\n        self.embed_dim = embed_dim\n        self.in_channels = in_channels\n        self.groups = embed_dim\n\n        if inference_mode:\n            self.reparam_conv = nn.Conv2d(\n                in_channels=self.in_channels,\n                out_channels=self.embed_dim,\n                kernel_size=self.spatial_shape,\n                stride=1,\n                padding=int(self.spatial_shape[0] // 2),\n                groups=self.embed_dim,\n                bias=True,\n            )\n        else:\n            self.pe = ConvLayer2d(\n                opts,\n                in_channels=in_channels,\n                out_channels=embed_dim,\n                kernel_size=spatial_shape,\n                stride=1,\n                padding=int(spatial_shape[0] // 2),\n                use_norm=False,\n                use_act=False,\n                bias=True,\n                groups=embed_dim,\n            )\n\n    def forward(self, x: torch.Tensor, *args, **kwargs) -> torch.Tensor:\n        \"\"\"\n        Forward pass implements inference logic for module\n        before and after reparameterization.\n\n        Args:\n            x: Input tensor of shape :math:`(B, C, H, W)`.\n\n        Returns:\n            torch.Tensor of shape :math:`(B, C, H, W)`.\n        \"\"\"\n        if hasattr(self, \"reparam_conv\"):\n            x = self.reparam_conv(x)\n            return x\n        else:\n            x = self.pe(x) + x\n            return x\n\n    def reparameterize(self) -> None:\n        \"\"\"Reparameterize linear branches.\"\"\"\n        # Build equivalent Id tensor\n        input_dim = self.in_channels // self.groups\n        kernel_value = torch.zeros(\n            (\n                self.in_channels,\n                input_dim,\n                self.spatial_shape[0],\n                self.spatial_shape[1],\n            ),\n            dtype=self.pe.block.conv.weight.dtype,\n            device=self.pe.block.conv.weight.device,\n        )\n        for i in range(self.in_channels):\n            kernel_value[\n                i,\n                i % input_dim,\n                self.spatial_shape[0] // 2,\n                self.spatial_shape[1] // 2,\n            ] = 1\n        id_tensor = kernel_value\n\n        # Reparameterize Id tensor and conv\n        w_final = id_tensor + self.pe.block.conv.weight\n        b_final = self.pe.block.conv.bias\n\n        # Introduce reparam conv\n        self.reparam_conv = nn.Conv2d(\n            in_channels=self.in_channels,\n            out_channels=self.embed_dim,\n            kernel_size=self.spatial_shape,\n            stride=1,\n            padding=int(self.spatial_shape[0] // 2),\n            groups=self.embed_dim,\n            bias=True,\n        )\n        self.reparam_conv.weight.data = w_final\n        self.reparam_conv.bias.data = b_final\n\n        for para in self.parameters():\n            para.detach_()\n        self.__delattr__(\"pe\")\n"
  },
  {
    "path": "corenet/modeling/modules/feature_pyramid.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom typing import Dict, List\n\nimport torch\nimport torch.nn.functional as F\nfrom torch import Tensor, nn\n\nfrom corenet.modeling.layers import ConvLayer2d, norm_layers_tuple\nfrom corenet.modeling.misc.init_utils import (\n    initialize_conv_layer,\n    initialize_norm_layers,\n)\nfrom corenet.modeling.modules import BaseModule\nfrom corenet.utils import logger\n\n\nclass FeaturePyramidNetwork(BaseModule):\n    \"\"\"\n    This class implements the `Feature Pyramid Network <https://arxiv.org/abs/1612.03144>`_ module for object detection.\n\n    Args:\n        opts: command-line arguments\n        in_channels (List[int]): List of channels at different output strides\n        output_strides (List[int]): Feature maps from these output strides will be used in FPN\n        out_channels (int): Output channels\n\n    \"\"\"\n\n    def __init__(\n        self,\n        opts,\n        in_channels: List[int],\n        output_strides: List[str],\n        out_channels: int,\n        *args,\n        **kwargs\n    ) -> None:\n\n        if isinstance(in_channels, int):\n            in_channels = [in_channels]\n        if isinstance(output_strides, int):\n            output_strides = [output_strides]\n\n        if len(in_channels) != len(output_strides):\n            logger.error(\n                \"For {}, we need the length of input_channels to be the same as the length of output stride. \"\n                \"Got: {} and {}\".format(\n                    self.__class__.__name__, len(in_channels), len(output_strides)\n                )\n            )\n        assert len(in_channels) == len(output_strides)\n        super().__init__(*args, **kwargs)\n\n        self.proj_layers = nn.ModuleDict()\n        self.nxn_convs = nn.ModuleDict()\n\n        for os, in_channel in zip(output_strides, in_channels):\n            proj_layer = ConvLayer2d(\n                opts=opts,\n                in_channels=in_channel,\n                out_channels=out_channels,\n                kernel_size=1,\n                bias=False,\n                use_norm=True,\n                use_act=False,\n            )\n            nxn_conv = ConvLayer2d(\n                opts=opts,\n                in_channels=out_channels,\n                out_channels=out_channels,\n                kernel_size=3,\n                bias=False,\n                use_norm=True,\n                use_act=False,\n            )\n\n            self.proj_layers.add_module(name=\"os_{}\".format(os), module=proj_layer)\n            self.nxn_convs.add_module(name=\"os_{}\".format(os), module=nxn_conv)\n\n        self.num_fpn_layers = len(in_channels)\n        self.out_channels = out_channels\n        self.in_channels = in_channels\n        self.output_strides = output_strides\n\n        self.reset_weights()\n\n    def reset_weights(self) -> None:\n        \"\"\"Resets the weights of FPN layers\"\"\"\n        for m in self.modules():\n            if isinstance(m, nn.Conv2d):\n                initialize_conv_layer(m, init_method=\"xavier_uniform\")\n            elif isinstance(m, norm_layers_tuple):\n                initialize_norm_layers(m)\n\n    def forward(self, x: Dict[str, Tensor], *args, **kwargs) -> Dict[str, Tensor]:\n        assert len(x) == self.num_fpn_layers\n\n        # dictionary to store results for fpn\n        fpn_out_dict = {\"os_\".format(os): None for os in self.output_strides}\n\n        # process the last output stride\n        os_key = \"os_{}\".format(self.output_strides[-1])\n        prev_x = self.proj_layers[os_key](x[os_key])\n        prev_x = self.nxn_convs[os_key](prev_x)\n        fpn_out_dict[os_key] = prev_x\n\n        remaining_output_strides = self.output_strides[:-1]\n\n        # bottom-up processing\n        for os in remaining_output_strides[::-1]:\n            os_key = \"os_{}\".format(os)\n            # 1x1 conv\n            curr_x = self.proj_layers[os_key](x[os_key])\n            # upsample\n            prev_x = F.interpolate(prev_x, size=curr_x.shape[-2:], mode=\"nearest\")\n            # add\n            prev_x = curr_x + prev_x\n            prev_x = self.nxn_convs[os_key](prev_x)\n            fpn_out_dict[os_key] = prev_x\n\n        return fpn_out_dict\n\n    def __repr__(self):\n        return \"{}(in_channels={}, output_strides={} out_channels={})\".format(\n            self.__class__.__name__,\n            self.in_channels,\n            self.output_strides,\n            self.out_channels,\n        )\n"
  },
  {
    "path": "corenet/modeling/modules/flash_transformer.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\nimport argparse\nimport math\nfrom typing import Optional\n\nfrom torch import Tensor, nn\n\nfrom corenet.modeling.layers import (\n    Dropout,\n    FlashMultiHeadSelfAttention,\n    Identity,\n    LinearLayer,\n    StochasticDepth,\n    get_normalization_layer,\n)\nfrom corenet.modeling.layers.activation import build_activation_layer\nfrom corenet.modeling.modules import BaseModule\nfrom corenet.utils import logger\n\n\nclass FlashTransformerEncoder(BaseModule):\n    \"\"\"Pre-norm `Transformer encoder <https://arxiv.org/abs/1706.03762>`_ with `flash attention <https://arxiv.org/abs/2205.14135>`_.\n\n    Args:\n        opts: Command line arguments.\n        in_features: Number of channels in the input.\n        head_dim: Head dimension in multi-head attention.\n        attn_dropout_prob: Dropout rate for attention in multi-head attention. Default: 0.0\n        qkv_features: Number of features after linear projection in QKV branch in multi-head\n            attention. If none, qkv_features=in_features. Defaults to None.\n        bias: Use bias. Defaults to False.\n        dropout: Dropout rate. Defaults to 0.0.\n        ffn_dropout: Dropout between FFN layers. Defaults to 0.0.\n        ffn_multiplier: Multiplier for controlling the width in Feed-forward network (FFN). Defaults to 4.0.\n        stochastic_dropout: Stochastic dropout setting. Default: 0.0.\n        norm_layer_name: Normalization layer name. Defaults to \"layer_norm\".\n        divisible_by: Ensure that FFN dimensions are divisible by this factor. Defaults to 16.\n\n    ...note:\n        * Enabling 'stochastic dropout' by setting 0 < stochastic_dropout < 1 drops the multi-head attention and feed-forward network\n        layers, thus reducing the depth of the network during training. This is also known as `stochastic depth <https://arxiv.org/abs/1603.09382v3>`_.\n        On the other hand, 'dropout' drops the activations and do not change the depth of the network.\n\n        * 'dropout', 'ffn_dropout', and 'stochastic_dropout' allows to address over-fitting issue. The values of these parameters\n         are dependent on a task and should be chosen empirically.\n    \"\"\"\n\n    def __init__(\n        self,\n        opts: argparse.Namespace,\n        in_features: int,\n        head_dim: int,\n        attn_dropout_prob: float = 0.0,\n        qkv_features: Optional[int] = None,\n        bias: bool = True,\n        dropout: float = 0.0,\n        ffn_dropout: float = 0.0,\n        ffn_multiplier: float = 4.0,\n        stochastic_dropout: float = 0.0,\n        norm_layer_name: str = \"layer_norm\",\n        divisible_by: int = 16,\n    ) -> None:\n\n        super().__init__()\n        attn_unit = FlashMultiHeadSelfAttention(\n            in_features=in_features,\n            head_dim=head_dim,\n            attn_dropout_prob=attn_dropout_prob,\n            qkv_features=qkv_features,\n            bias=bias,\n        )\n\n        self.pre_norm_mha = nn.Sequential(\n            get_normalization_layer(\n                opts=opts, norm_type=norm_layer_name, num_features=in_features\n            ),\n            attn_unit,\n            Dropout(p=dropout),\n        )\n\n        ffn_dim = int(\n            math.ceil(in_features * ffn_multiplier / divisible_by) * divisible_by\n        )\n        self.pre_norm_ffn = nn.Sequential(\n            get_normalization_layer(\n                opts=opts, norm_type=norm_layer_name, num_features=in_features\n            ),\n            LinearLayer(in_features=in_features, out_features=ffn_dim, bias=bias),\n            build_activation_layer(opts, num_parameters=1),\n            Dropout(p=ffn_dropout),\n            LinearLayer(in_features=ffn_dim, out_features=in_features, bias=bias),\n            Dropout(p=dropout),\n        )\n\n        self.drop_path = Identity()\n        if stochastic_dropout > 0.0:\n            if dropout > 0.0:\n                logger.error(\n                    \"Stochastic dropout and dropout are mutually exclusive. \"\n                    \"Use either of them, but not both.\"\n                    \"Got: {} and {}\".format(stochastic_dropout, dropout)\n                )\n            self.drop_path = StochasticDepth(p=stochastic_dropout, mode=\"row\")\n\n    def forward(self, x: Tensor) -> Tensor:\n        \"\"\"Forward function.\n\n        Args:\n            x: Input tensor of size :math:`(N, S, d)` where :math:`N` is batch size, :math:`S` is the sequence length,\n        and :math:`d` is input embedding dim.\n\n        Returns:\n            Output tensor of the size as the input.\n        \"\"\"\n        x = x + self.drop_path(self.pre_norm_mha(x))\n        x = x + self.drop_path(self.pre_norm_ffn(x))\n        return x\n"
  },
  {
    "path": "corenet/modeling/modules/mobilenetv2.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom typing import Optional, Union\n\nfrom torch import Tensor, nn\n\nfrom corenet.modeling.layers import ConvLayer2d\nfrom corenet.modeling.layers.activation import build_activation_layer\nfrom corenet.modeling.modules import BaseModule, SqueezeExcitation\nfrom corenet.utils.math_utils import make_divisible\n\n\nclass InvertedResidualSE(BaseModule):\n    \"\"\"\n    This class implements the inverted residual block with squeeze-excitation unit, as described in\n    `MobileNetv3 <https://arxiv.org/abs/1905.02244>`_ paper\n\n    Args:\n        opts: command-line arguments\n        in_channels (int): :math:`C_{in}` from an expected input of size :math:`(N, C_{in}, H_{in}, W_{in})`\n        out_channels (int): :math:`C_{out}` from an expected output of size :math:`(N, C_{out}, H_{out}, W_{out)`\n        expand_ratio (Union[int, float]): Expand the input channels by this factor in depth-wise conv\n        dilation (Optional[int]): Use conv with dilation. Default: 1\n        stride (Optional[int]): Use convolutions with a stride. Default: 1\n        use_se (Optional[bool]): Use squeeze-excitation block. Default: False\n        act_fn_name (Optional[str]): Activation function name. Default: relu\n        se_scale_fn_name (Optional [str]): Scale activation function inside SE unit. Defaults to hard_sigmoid\n        kernel_size (Optional[int]): Kernel size in depth-wise convolution. Defaults to 3.\n        squeeze_factor (Optional[bool]): Squeezing factor in SE unit. Defaults to 4.\n\n    Shape:\n        - Input: :math:`(N, C_{in}, H_{in}, W_{in})`\n        - Output: :math:`(N, C_{out}, H_{out}, W_{out})`\n    \"\"\"\n\n    def __init__(\n        self,\n        opts,\n        in_channels: int,\n        out_channels: int,\n        expand_ratio: Union[int, float],\n        dilation: Optional[int] = 1,\n        stride: Optional[int] = 1,\n        use_se: Optional[bool] = False,\n        act_fn_name: Optional[str] = \"relu\",\n        se_scale_fn_name: Optional[str] = \"hard_sigmoid\",\n        kernel_size: Optional[int] = 3,\n        squeeze_factor: Optional[int] = 4,\n        *args,\n        **kwargs\n    ) -> None:\n        hidden_dim = make_divisible(int(round(in_channels * expand_ratio)), 8)\n        act_fn = build_activation_layer(opts, act_type=act_fn_name, inplace=True)\n\n        super().__init__()\n\n        block = nn.Sequential()\n        if expand_ratio != 1:\n            block.add_module(\n                name=\"exp_1x1\",\n                module=ConvLayer2d(\n                    opts,\n                    in_channels=in_channels,\n                    out_channels=hidden_dim,\n                    kernel_size=1,\n                    use_act=False,\n                    use_norm=True,\n                ),\n            )\n            block.add_module(name=\"act_fn_1\", module=act_fn)\n\n        block.add_module(\n            name=\"conv_3x3\",\n            module=ConvLayer2d(\n                opts,\n                in_channels=hidden_dim,\n                out_channels=hidden_dim,\n                stride=stride,\n                kernel_size=kernel_size,\n                groups=hidden_dim,\n                use_act=False,\n                use_norm=True,\n                dilation=dilation,\n            ),\n        )\n        block.add_module(name=\"act_fn_2\", module=act_fn)\n\n        if use_se:\n            se = SqueezeExcitation(\n                opts=opts,\n                in_channels=hidden_dim,\n                squeeze_factor=squeeze_factor,\n                scale_fn_name=se_scale_fn_name,\n            )\n            block.add_module(name=\"se\", module=se)\n\n        block.add_module(\n            name=\"red_1x1\",\n            module=ConvLayer2d(\n                opts,\n                in_channels=hidden_dim,\n                out_channels=out_channels,\n                kernel_size=1,\n                use_act=False,\n                use_norm=True,\n            ),\n        )\n\n        self.block = block\n        self.in_channels = in_channels\n        self.out_channels = out_channels\n        self.exp = expand_ratio\n        self.dilation = dilation\n        self.use_se = use_se\n        self.stride = stride\n        self.act_fn_name = act_fn_name\n        self.kernel_size = kernel_size\n        self.use_res_connect = self.stride == 1 and in_channels == out_channels\n\n    def forward(self, x: Tensor, *args, **kwargs) -> Tensor:\n        y = self.block(x)\n        return x + y if self.use_res_connect else y\n\n    def __repr__(self) -> str:\n        return \"{}(in_channels={}, out_channels={}, stride={}, exp={}, dilation={}, use_se={}, kernel_size={}, act_fn={})\".format(\n            self.__class__.__name__,\n            self.in_channels,\n            self.out_channels,\n            self.stride,\n            self.exp,\n            self.dilation,\n            self.use_se,\n            self.kernel_size,\n            self.act_fn_name,\n        )\n\n\nclass InvertedResidual(BaseModule):\n    \"\"\"\n    This class implements the inverted residual block, as described in `MobileNetv2 <https://arxiv.org/abs/1801.04381>`_ paper\n\n    Args:\n        opts: command-line arguments\n        in_channels (int): :math:`C_{in}` from an expected input of size :math:`(N, C_{in}, H_{in}, W_{in})`\n        out_channels (int): :math:`C_{out}` from an expected output of size :math:`(N, C_{out}, H_{out}, W_{out)`\n        stride (Optional[int]): Use convolutions with a stride. Default: 1\n        expand_ratio (Union[int, float]): Expand the input channels by this factor in depth-wise conv\n        dilation (Optional[int]): Use conv with dilation. Default: 1\n        skip_connection (Optional[bool]): Use skip-connection. Default: True\n\n    Shape:\n        - Input: :math:`(N, C_{in}, H_{in}, W_{in})`\n        - Output: :math:`(N, C_{out}, H_{out}, W_{out})`\n\n    .. note::\n        If `in_channels =! out_channels` and `stride > 1`, we set `skip_connection=False`\n\n    \"\"\"\n\n    def __init__(\n        self,\n        opts,\n        in_channels: int,\n        out_channels: int,\n        stride: int,\n        expand_ratio: Union[int, float],\n        dilation: int = 1,\n        skip_connection: Optional[bool] = True,\n        *args,\n        **kwargs\n    ) -> None:\n        assert stride in [1, 2]\n        hidden_dim = make_divisible(int(round(in_channels * expand_ratio)), 8)\n\n        super().__init__()\n\n        block = nn.Sequential()\n        if expand_ratio != 1:\n            block.add_module(\n                name=\"exp_1x1\",\n                module=ConvLayer2d(\n                    opts,\n                    in_channels=in_channels,\n                    out_channels=hidden_dim,\n                    kernel_size=1,\n                    use_act=True,\n                    use_norm=True,\n                ),\n            )\n\n        block.add_module(\n            name=\"conv_3x3\",\n            module=ConvLayer2d(\n                opts,\n                in_channels=hidden_dim,\n                out_channels=hidden_dim,\n                stride=stride,\n                kernel_size=3,\n                groups=hidden_dim,\n                use_act=True,\n                use_norm=True,\n                dilation=dilation,\n            ),\n        )\n\n        block.add_module(\n            name=\"red_1x1\",\n            module=ConvLayer2d(\n                opts,\n                in_channels=hidden_dim,\n                out_channels=out_channels,\n                kernel_size=1,\n                use_act=False,\n                use_norm=True,\n            ),\n        )\n\n        self.block = block\n        self.in_channels = in_channels\n        self.out_channels = out_channels\n        self.exp = expand_ratio\n        self.dilation = dilation\n        self.stride = stride\n        self.use_res_connect = (\n            self.stride == 1 and in_channels == out_channels and skip_connection\n        )\n\n    def forward(self, x: Tensor, *args, **kwargs) -> Tensor:\n        if self.use_res_connect:\n            return x + self.block(x)\n        else:\n            return self.block(x)\n\n    def __repr__(self) -> str:\n        return \"{}(in_channels={}, out_channels={}, stride={}, exp={}, dilation={}, skip_conn={})\".format(\n            self.__class__.__name__,\n            self.in_channels,\n            self.out_channels,\n            self.stride,\n            self.exp,\n            self.dilation,\n            self.use_res_connect,\n        )\n"
  },
  {
    "path": "corenet/modeling/modules/mobileone_block.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\nimport argparse\nfrom typing import Tuple, Union\n\nimport torch\nimport torch.nn as nn\n\nfrom corenet.modeling.layers import ConvLayer2d, Identity\nfrom corenet.modeling.layers.activation import build_activation_layer\nfrom corenet.modeling.layers.normalization.batch_norm import BatchNorm2d\nfrom corenet.modeling.modules import BaseModule, SqueezeExcitation\n\n\nclass MobileOneBlock(BaseModule):\n    \"\"\"\n    MobileOne building block.\n\n    For more details, please refer to our paper:\n    `An Improved One millisecond Mobile Backbone <https://arxiv.org/pdf/2206.04040.pdf>`\n    \"\"\"\n\n    def __init__(\n        self,\n        opts: argparse.Namespace,\n        in_channels: int,\n        out_channels: int,\n        kernel_size: int,\n        stride: int = 1,\n        padding: int = 0,\n        dilation: int = 1,\n        groups: int = 1,\n        inference_mode: bool = False,\n        use_se: bool = False,\n        use_act: bool = True,\n        use_scale_branch: bool = True,\n        num_conv_branches: int = 1,\n    ) -> None:\n        \"\"\"\n        Construct a MobileOneBlock.\n\n        Args:\n            opts: Command line arguments.\n            in_channels: Number of channels in the input.\n            out_channels: Number of channels produced by the block.\n            kernel_size: Size of the convolution kernel.\n            stride: Stride size. Default: 1\n            padding: Zero-padding size. Default: 0\n            dilation: Kernel dilation factor. Default: 1\n            groups: Group number. Default: 1\n            inference_mode: If True, instantiates model in inference mode. Default: ``False``\n            use_se: Whether to use SE-ReLU activations. Default: ``False``\n            use_act: Whether to use activation. Default: ``True``\n            use_scale_branch: Whether to use scale branch. Default: ``True``\n            num_conv_branches: Number of linear conv branches. Default: 1\n        \"\"\"\n        super(MobileOneBlock, self).__init__()\n        self.inference_mode = inference_mode\n        self.groups = groups\n        self.stride = stride\n        self.padding = padding\n        self.dilation = dilation\n        self.kernel_size = kernel_size\n        self.in_channels = in_channels\n        self.out_channels = out_channels\n        self.num_conv_branches = num_conv_branches\n\n        # Check if SE-ReLU is requested\n        if use_se:\n            self.se = SqueezeExcitation(opts, out_channels, squeeze_factor=16)\n        else:\n            self.se = Identity()\n\n        # Activation\n        if use_act:\n            self.activation = build_activation_layer(opts)\n        else:\n            self.activation = Identity()\n\n        if inference_mode:\n            self.reparam_conv = nn.Conv2d(\n                in_channels=in_channels,\n                out_channels=out_channels,\n                kernel_size=kernel_size,\n                stride=stride,\n                padding=padding,\n                dilation=dilation,\n                groups=groups,\n                bias=True,\n            )\n        else:\n            # Re-parameterizable skip connection\n            self.rbr_skip = (\n                BatchNorm2d(num_features=in_channels, affine=True)\n                if out_channels == in_channels and stride == 1\n                else None\n            )\n\n            # Re-parameterizable conv branches\n            if num_conv_branches > 0:\n                rbr_conv = list()\n                for _ in range(self.num_conv_branches):\n                    rbr_conv.append(\n                        ConvLayer2d(\n                            opts,\n                            in_channels=self.in_channels,\n                            out_channels=self.out_channels,\n                            kernel_size=kernel_size,\n                            stride=self.stride,\n                            padding=padding,\n                            groups=self.groups,\n                            bias=False,\n                            use_act=False,\n                        )\n                    )\n                self.rbr_conv = nn.ModuleList(rbr_conv)\n            else:\n                self.rbr_conv = None\n\n            # Re-parameterizable scale branch\n            self.rbr_scale = None\n            if (kernel_size > 1) and use_scale_branch:\n                self.rbr_scale = ConvLayer2d(\n                    opts,\n                    in_channels=self.in_channels,\n                    out_channels=self.out_channels,\n                    kernel_size=1,\n                    stride=self.stride,\n                    padding=0,\n                    groups=self.groups,\n                    bias=False,\n                    use_act=False,\n                )\n\n    def forward(self, x: torch.Tensor, *args, **kwargs) -> torch.Tensor:\n        \"\"\"\n        Forward pass implements inference logic for module\n        before and after reparameterization.\n\n        Args:\n            x: Input tensor of shape :math:`(B, C, H, W)`.\n\n        Returns:\n            torch.Tensor of shape :math:`(B, C, H, W)`.\n        \"\"\"\n        # Inference mode forward pass.\n        if self.inference_mode:\n            return self.activation(self.se(self.reparam_conv(x)))\n\n        # Multi-branched train-time forward pass.\n        # Skip branch output\n        identity_out = 0\n        if self.rbr_skip is not None:\n            identity_out = self.rbr_skip(x)\n\n        # Scale branch output\n        scale_out = 0\n        if self.rbr_scale is not None:\n            scale_out = self.rbr_scale(x)\n\n        # Other branches\n        out = scale_out + identity_out\n        if self.rbr_conv is not None:\n            for ix in range(self.num_conv_branches):\n                out += self.rbr_conv[ix](x)\n\n        return self.activation(self.se(out))\n\n    def reparameterize(self) -> None:\n        \"\"\"\n        Following works like `RepVGG: Making VGG-style ConvNets Great Again` -\n        https://arxiv.org/pdf/2101.03697.pdf. We re-parameterize multi-branched\n        architecture used at training time to obtain a plain CNN-like structure\n        for inference.\n        \"\"\"\n        if self.inference_mode:\n            return\n        kernel, bias = self._get_kernel_bias()\n        self.reparam_conv = nn.Conv2d(\n            in_channels=self.in_channels,\n            out_channels=self.out_channels,\n            kernel_size=self.kernel_size,\n            stride=self.stride,\n            padding=self.padding,\n            dilation=self.dilation,\n            groups=self.groups,\n            bias=True,\n        )\n        self.reparam_conv.weight.data = kernel\n        self.reparam_conv.bias.data = bias\n\n        # Delete un-used branches\n        for para in self.parameters():\n            para.detach_()\n\n        if hasattr(self, \"rbr_conv\"):\n            self.__delattr__(\"rbr_conv\")\n        if hasattr(self, \"rbr_scale\"):\n            self.__delattr__(\"rbr_scale\")\n        if hasattr(self, \"rbr_skip\"):\n            self.__delattr__(\"rbr_skip\")\n\n        self.inference_mode = True\n\n    def _get_kernel_bias(self) -> Tuple[torch.Tensor, torch.Tensor]:\n        \"\"\"\n        Method to obtain re-parameterized kernel and bias.\n        Reference: https://github.com/DingXiaoH/RepVGG/blob/main/repvgg.py#L83\n\n        Returns:\n            Tuple of (kernel, bias) after fusing branches.\n        \"\"\"\n        # get weights and bias of scale branch\n        kernel_scale = 0\n        bias_scale = 0\n        if self.rbr_scale is not None:\n            kernel_scale, bias_scale = self._fuse_branch_ops(self.rbr_scale.block)\n            # Pad scale branch kernel to match conv branch kernel size.\n            pad = self.kernel_size // 2\n            kernel_scale = torch.nn.functional.pad(kernel_scale, [pad, pad, pad, pad])\n\n        # get weights and bias of skip branch\n        kernel_identity = 0\n        bias_identity = 0\n        if self.rbr_skip is not None:\n            kernel_identity, bias_identity = self._fuse_branch_ops(self.rbr_skip)\n\n        # get weights and bias of conv branches\n        kernel_conv = 0\n        bias_conv = 0\n        if self.rbr_conv is not None:\n            for ix in range(self.num_conv_branches):\n                _kernel, _bias = self._fuse_branch_ops(self.rbr_conv[ix].block)\n                kernel_conv += _kernel\n                bias_conv += _bias\n\n        kernel_final = kernel_conv + kernel_scale + kernel_identity\n        bias_final = bias_conv + bias_scale + bias_identity\n        return kernel_final, bias_final\n\n    def _fuse_branch_ops(\n        self, branch: Union[nn.Sequential, nn.BatchNorm2d]\n    ) -> Tuple[torch.Tensor, torch.Tensor]:\n        \"\"\"\n        Method to fuse all linear ops in a branch.\n        Reference: https://github.com/DingXiaoH/RepVGG/blob/main/repvgg.py#L95\n\n        Args:\n            branch: Sequence of ops to be fused.\n\n        Returns:\n            Tuple of (kernel, bias) after fusing batchnorm.\n        \"\"\"\n        if isinstance(branch, nn.Sequential):\n            kernel = branch.conv.weight\n            return self._fuse_conv_bn(kernel, branch.norm)\n        else:\n            assert isinstance(branch, nn.BatchNorm2d)\n            if not hasattr(self, \"id_tensor\"):\n                input_dim = self.in_channels // self.groups\n                kernel_value = torch.zeros(\n                    (self.in_channels, input_dim, self.kernel_size, self.kernel_size),\n                    dtype=branch.weight.dtype,\n                    device=branch.weight.device,\n                )\n                for i in range(self.in_channels):\n                    kernel_value[\n                        i, i % input_dim, self.kernel_size // 2, self.kernel_size // 2\n                    ] = 1\n                self.id_tensor = kernel_value\n            kernel = self.id_tensor\n            return self._fuse_conv_bn(kernel, branch)\n\n    @staticmethod\n    def _fuse_conv_bn(\n        kernel: torch.Tensor, bn: nn.BatchNorm2d\n    ) -> Tuple[torch.Tensor, torch.Tensor]:\n        \"\"\"\n        Method to fuse batchnorm layer with conv layer.\n\n        Args:\n            kernel: Convolutional kernel weights.\n            bn: Batchnorm 2d layer.\n\n        Returns:\n            Tuple of (kernel, bias) after fusing batchnorm.\n        \"\"\"\n        assert bn.affine, (\n            \"Expected BatchNorm layer to have affine parameters \"\n            \"instead got BatchNorm layer without affine parameters.\"\n        )\n        running_mean = bn.running_mean\n        running_var = bn.running_var\n        gamma = bn.weight\n        beta = bn.bias\n        eps = bn.eps\n        std = (running_var + eps).sqrt()\n        t = (gamma / std).reshape(-1, 1, 1, 1)\n        return kernel * t, beta - running_mean * gamma / std\n\n\nclass RepLKBlock(BaseModule):\n    \"\"\"\n    This class defines overparameterized large kernel conv block in `RepLKNet <https://arxiv.org/abs/2203.06717>`_\n    Reference: https://github.com/DingXiaoH/RepLKNet-pytorch\n\n    Args:\n        opts: Command-line arguments.\n        in_channels: Number of input channels.\n        out_channels: Number of output channels.\n        kernel_size: Kernel size of the large kernel conv branch.\n        stride: Stride size. Default: 1\n        dilation: Kernel dilation factor. Default: 1\n        groups: Group number. Default: 1\n        small_kernel_size: Kernel size of small kernel conv branch.\n        inference_mode: If True, instantiates model in inference mode. Default: ``False``\n        use_act: If True, activation is used. Default: ``True``\n    \"\"\"\n\n    def __init__(\n        self,\n        opts: argparse.Namespace,\n        in_channels: int,\n        out_channels: int,\n        kernel_size: int,\n        stride: int = 1,\n        dilation: int = 1,\n        groups: int = 1,\n        small_kernel_size: int = None,\n        inference_mode: bool = False,\n        use_act: bool = True,\n    ) -> None:\n        super().__init__()\n        self.stride = stride\n        self.groups = groups\n        self.dilation = dilation\n        self.in_channels = in_channels\n        self.out_channels = out_channels\n\n        # Activation\n        if use_act:\n            self.activation = build_activation_layer(opts)\n        else:\n            self.activation = Identity()\n\n        self.kernel_size = kernel_size\n        self.small_kernel_size = small_kernel_size\n        self.padding = kernel_size // 2\n        if inference_mode:\n            self.lkb_reparam = nn.Conv2d(\n                in_channels=in_channels,\n                out_channels=out_channels,\n                kernel_size=kernel_size,\n                stride=stride,\n                padding=self.padding,\n                dilation=self.dilation,\n                groups=groups,\n                bias=True,\n            )\n        else:\n            self.lkb_origin = ConvLayer2d(\n                opts,\n                in_channels=self.in_channels,\n                out_channels=self.out_channels,\n                kernel_size=self.kernel_size,\n                stride=self.stride,\n                padding=self.padding,\n                groups=self.groups,\n                bias=False,\n                use_act=False,\n            )\n            if small_kernel_size is not None:\n                assert (\n                    small_kernel_size <= kernel_size\n                ), \"The kernel size for re-param cannot be larger than the large kernel\"\n                self.small_conv = ConvLayer2d(\n                    opts,\n                    in_channels=self.in_channels,\n                    out_channels=self.out_channels,\n                    kernel_size=self.small_kernel_size,\n                    stride=self.stride,\n                    padding=self.small_kernel_size // 2,\n                    groups=self.groups,\n                    bias=False,\n                    use_act=False,\n                )\n\n    def forward(self, x: torch.Tensor, *args, **kwargs) -> torch.Tensor:\n        \"\"\"\n        Forward pass implements inference logic for module\n        before and after reparameterization.\n\n        Args:\n            x: Input tensor of shape :math:`(B, C, H, W)`.\n\n        Returns:\n            torch.Tensor of shape :math:`(B, C, H, W)`.\n        \"\"\"\n        if hasattr(self, \"lkb_reparam\"):\n            out = self.lkb_reparam(x)\n        else:\n            out = self.lkb_origin(x)\n            if hasattr(self, \"small_conv\"):\n                out += self.small_conv(x)\n\n        self.activation(out)\n        return out\n\n    def _get_kernel_bias(self) -> Tuple[torch.Tensor, torch.Tensor]:\n        \"\"\"\n        Method to obtain re-parameterized kernel and bias.\n        Reference: https://github.com/DingXiaoH/RepLKNet-pytorch\n\n        Returns:\n            Tuple of (kernel, bias) after fusing branches.\n        \"\"\"\n        lk_kernel, lk_bias = MobileOneBlock._fuse_conv_bn(\n            self.lkb_origin.block.conv.weight, self.lkb_origin.block.norm\n        )\n        if hasattr(self, \"small_conv\"):\n            sk_kernel, sk_bias = MobileOneBlock._fuse_conv_bn(\n                self.small_conv.block.conv.weight, self.small_conv.block.norm\n            )\n            lk_bias += sk_bias\n            #   add to the central part\n            lk_kernel += nn.functional.pad(\n                sk_kernel, [(self.kernel_size - self.small_kernel_size) // 2] * 4\n            )\n        return lk_kernel, lk_bias\n\n    def reparameterize(self) -> None:\n        \"\"\"\n        Following works like `RepVGG: Making VGG-style ConvNets Great Again` -\n        https://arxiv.org/pdf/2101.03697.pdf. We re-parameterize multi-branched\n        architecture used at training time to obtain a plain CNN-like structure\n        for inference.\n        \"\"\"\n        kernel, bias = self._get_kernel_bias()\n        self.lkb_reparam = nn.Conv2d(\n            in_channels=self.in_channels,\n            out_channels=self.out_channels,\n            kernel_size=self.kernel_size,\n            stride=self.stride,\n            padding=self.padding,\n            dilation=self.dilation,\n            groups=self.groups,\n            bias=True,\n        )\n        self.lkb_reparam.weight.data = kernel\n        self.lkb_reparam.bias.data = bias\n        self.__delattr__(\"lkb_origin\")\n        if hasattr(self, \"small_conv\"):\n            self.__delattr__(\"small_conv\")\n"
  },
  {
    "path": "corenet/modeling/modules/mobilevit_block.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport math\nfrom typing import Dict, Optional, Sequence, Tuple, Union\n\nimport numpy as np\nimport torch\nfrom torch import Tensor, nn\nfrom torch.nn import functional as F\n\nfrom corenet.modeling.layers import ConvLayer2d, get_normalization_layer\nfrom corenet.modeling.modules.base_module import BaseModule\nfrom corenet.modeling.modules.transformer import LinearAttnFFN, TransformerEncoder\n\n\nclass MobileViTBlock(BaseModule):\n    \"\"\"\n    This class defines the `MobileViT block <https://arxiv.org/abs/2110.02178?context=cs.LG>`_\n\n    Args:\n        opts: command line arguments\n        in_channels (int): :math:`C_{in}` from an expected input of size :math:`(N, C_{in}, H, W)`\n        transformer_dim (int): Input dimension to the transformer unit\n        ffn_dim (int): Dimension of the FFN block\n        n_transformer_blocks (Optional[int]): Number of transformer blocks. Default: 2\n        head_dim (Optional[int]): Head dimension in the multi-head attention. Default: 32\n        attn_dropout (Optional[float]): Dropout in multi-head attention. Default: 0.0\n        dropout (Optional[float]): Dropout rate. Default: 0.0\n        ffn_dropout (Optional[float]): Dropout between FFN layers in transformer. Default: 0.0\n        patch_h (Optional[int]): Patch height for unfolding operation. Default: 8\n        patch_w (Optional[int]): Patch width for unfolding operation. Default: 8\n        transformer_norm_layer (Optional[str]): Normalization layer in the transformer block. Default: layer_norm\n        conv_ksize (Optional[int]): Kernel size to learn local representations in MobileViT block. Default: 3\n        dilation (Optional[int]): Dilation rate in convolutions. Default: 1\n        no_fusion (Optional[bool]): Do not combine the input and output feature maps. Default: False\n    \"\"\"\n\n    def __init__(\n        self,\n        opts,\n        in_channels: int,\n        transformer_dim: int,\n        ffn_dim: int,\n        n_transformer_blocks: Optional[int] = 2,\n        head_dim: Optional[int] = 32,\n        attn_dropout: Optional[float] = 0.0,\n        dropout: Optional[int] = 0.0,\n        ffn_dropout: Optional[int] = 0.0,\n        patch_h: Optional[int] = 8,\n        patch_w: Optional[int] = 8,\n        transformer_norm_layer: Optional[str] = \"layer_norm\",\n        conv_ksize: Optional[int] = 3,\n        dilation: Optional[int] = 1,\n        no_fusion: Optional[bool] = False,\n        *args,\n        **kwargs\n    ) -> None:\n        conv_3x3_in = ConvLayer2d(\n            opts=opts,\n            in_channels=in_channels,\n            out_channels=in_channels,\n            kernel_size=conv_ksize,\n            stride=1,\n            use_norm=True,\n            use_act=True,\n            dilation=dilation,\n        )\n        conv_1x1_in = ConvLayer2d(\n            opts=opts,\n            in_channels=in_channels,\n            out_channels=transformer_dim,\n            kernel_size=1,\n            stride=1,\n            use_norm=False,\n            use_act=False,\n        )\n\n        conv_1x1_out = ConvLayer2d(\n            opts=opts,\n            in_channels=transformer_dim,\n            out_channels=in_channels,\n            kernel_size=1,\n            stride=1,\n            use_norm=True,\n            use_act=True,\n        )\n        conv_3x3_out = None\n        if not no_fusion:\n            conv_3x3_out = ConvLayer2d(\n                opts=opts,\n                in_channels=2 * in_channels,\n                out_channels=in_channels,\n                kernel_size=conv_ksize,\n                stride=1,\n                use_norm=True,\n                use_act=True,\n            )\n        super().__init__()\n        self.local_rep = nn.Sequential()\n        self.local_rep.add_module(name=\"conv_3x3\", module=conv_3x3_in)\n        self.local_rep.add_module(name=\"conv_1x1\", module=conv_1x1_in)\n\n        assert transformer_dim % head_dim == 0\n        num_heads = transformer_dim // head_dim\n\n        global_rep = [\n            TransformerEncoder(\n                opts=opts,\n                embed_dim=transformer_dim,\n                ffn_latent_dim=ffn_dim,\n                num_heads=num_heads,\n                attn_dropout=attn_dropout,\n                dropout=dropout,\n                ffn_dropout=ffn_dropout,\n                transformer_norm_layer=transformer_norm_layer,\n            )\n            for _ in range(n_transformer_blocks)\n        ]\n        global_rep.append(\n            get_normalization_layer(\n                opts=opts,\n                norm_type=transformer_norm_layer,\n                num_features=transformer_dim,\n            )\n        )\n        self.global_rep = nn.Sequential(*global_rep)\n\n        self.conv_proj = conv_1x1_out\n\n        self.fusion = conv_3x3_out\n\n        self.patch_h = patch_h\n        self.patch_w = patch_w\n        self.patch_area = self.patch_w * self.patch_h\n\n        self.cnn_in_dim = in_channels\n        self.cnn_out_dim = transformer_dim\n        self.n_heads = num_heads\n        self.ffn_dim = ffn_dim\n        self.dropout = dropout\n        self.attn_dropout = attn_dropout\n        self.ffn_dropout = ffn_dropout\n        self.dilation = dilation\n        self.n_blocks = n_transformer_blocks\n        self.conv_ksize = conv_ksize\n\n    def __repr__(self) -> str:\n        repr_str = \"{}(\".format(self.__class__.__name__)\n\n        repr_str += \"\\n\\t Local representations\"\n        if isinstance(self.local_rep, nn.Sequential):\n            for m in self.local_rep:\n                repr_str += \"\\n\\t\\t {}\".format(m)\n        else:\n            repr_str += \"\\n\\t\\t {}\".format(self.local_rep)\n\n        repr_str += \"\\n\\t Global representations with patch size of {}x{}\".format(\n            self.patch_h, self.patch_w\n        )\n        if isinstance(self.global_rep, nn.Sequential):\n            for m in self.global_rep:\n                repr_str += \"\\n\\t\\t {}\".format(m)\n        else:\n            repr_str += \"\\n\\t\\t {}\".format(self.global_rep)\n\n        if isinstance(self.conv_proj, nn.Sequential):\n            for m in self.conv_proj:\n                repr_str += \"\\n\\t\\t {}\".format(m)\n        else:\n            repr_str += \"\\n\\t\\t {}\".format(self.conv_proj)\n\n        if self.fusion is not None:\n            repr_str += \"\\n\\t Feature fusion\"\n            if isinstance(self.fusion, nn.Sequential):\n                for m in self.fusion:\n                    repr_str += \"\\n\\t\\t {}\".format(m)\n            else:\n                repr_str += \"\\n\\t\\t {}\".format(self.fusion)\n\n        repr_str += \"\\n)\"\n        return repr_str\n\n    def unfolding(self, feature_map: Tensor) -> Tuple[Tensor, Dict]:\n        patch_w, patch_h = self.patch_w, self.patch_h\n        patch_area = int(patch_w * patch_h)\n        batch_size, in_channels, orig_h, orig_w = feature_map.shape\n\n        new_h = int(math.ceil(orig_h / self.patch_h) * self.patch_h)\n        new_w = int(math.ceil(orig_w / self.patch_w) * self.patch_w)\n\n        interpolate = False\n        if new_w != orig_w or new_h != orig_h:\n            # Note: Padding can be done, but then it needs to be handled in attention function.\n            feature_map = F.interpolate(\n                feature_map, size=(new_h, new_w), mode=\"bilinear\", align_corners=False\n            )\n            interpolate = True\n\n        # number of patches along width and height\n        num_patch_w = new_w // patch_w  # n_w\n        num_patch_h = new_h // patch_h  # n_h\n        num_patches = num_patch_h * num_patch_w  # N\n\n        # [B, C, H, W] --> [B * C * n_h, p_h, n_w, p_w]\n        reshaped_fm = feature_map.reshape(\n            batch_size * in_channels * num_patch_h, patch_h, num_patch_w, patch_w\n        )\n        # [B * C * n_h, p_h, n_w, p_w] --> [B * C * n_h, n_w, p_h, p_w]\n        transposed_fm = reshaped_fm.transpose(1, 2)\n        # [B * C * n_h, n_w, p_h, p_w] --> [B, C, N, P] where P = p_h * p_w and N = n_h * n_w\n        reshaped_fm = transposed_fm.reshape(\n            batch_size, in_channels, num_patches, patch_area\n        )\n        # [B, C, N, P] --> [B, P, N, C]\n        transposed_fm = reshaped_fm.transpose(1, 3)\n        # [B, P, N, C] --> [BP, N, C]\n        patches = transposed_fm.reshape(batch_size * patch_area, num_patches, -1)\n\n        info_dict = {\n            \"orig_size\": (orig_h, orig_w),\n            \"batch_size\": batch_size,\n            \"interpolate\": interpolate,\n            \"total_patches\": num_patches,\n            \"num_patches_w\": num_patch_w,\n            \"num_patches_h\": num_patch_h,\n        }\n\n        return patches, info_dict\n\n    def folding(self, patches: Tensor, info_dict: Dict) -> Tensor:\n        n_dim = patches.dim()\n        assert n_dim == 3, \"Tensor should be of shape BPxNxC. Got: {}\".format(\n            patches.shape\n        )\n        # [BP, N, C] --> [B, P, N, C]\n        patches = patches.contiguous().view(\n            info_dict[\"batch_size\"], self.patch_area, info_dict[\"total_patches\"], -1\n        )\n\n        batch_size, pixels, num_patches, channels = patches.size()\n        num_patch_h = info_dict[\"num_patches_h\"]\n        num_patch_w = info_dict[\"num_patches_w\"]\n\n        # [B, P, N, C] --> [B, C, N, P]\n        patches = patches.transpose(1, 3)\n\n        # [B, C, N, P] --> [B*C*n_h, n_w, p_h, p_w]\n        feature_map = patches.reshape(\n            batch_size * channels * num_patch_h, num_patch_w, self.patch_h, self.patch_w\n        )\n        # [B*C*n_h, n_w, p_h, p_w] --> [B*C*n_h, p_h, n_w, p_w]\n        feature_map = feature_map.transpose(1, 2)\n        # [B*C*n_h, p_h, n_w, p_w] --> [B, C, H, W]\n        feature_map = feature_map.reshape(\n            batch_size, channels, num_patch_h * self.patch_h, num_patch_w * self.patch_w\n        )\n        if info_dict[\"interpolate\"]:\n            feature_map = F.interpolate(\n                feature_map,\n                size=info_dict[\"orig_size\"],\n                mode=\"bilinear\",\n                align_corners=False,\n            )\n        return feature_map\n\n    def forward_spatial(self, x: Tensor) -> Tensor:\n        res = x\n\n        fm = self.local_rep(x)\n\n        # convert feature map to patches\n        patches, info_dict = self.unfolding(fm)\n\n        # learn global representations\n        for transformer_layer in self.global_rep:\n            patches = transformer_layer(patches)\n\n        # [B x Patch x Patches x C] --> [B x C x Patches x Patch]\n        fm = self.folding(patches=patches, info_dict=info_dict)\n\n        fm = self.conv_proj(fm)\n\n        if self.fusion is not None:\n            fm = self.fusion(torch.cat((res, fm), dim=1))\n        return fm\n\n    def forward_temporal(\n        self, x: Tensor, x_prev: Optional[Tensor] = None\n    ) -> Union[Tensor, Tuple[Tensor, Tensor]]:\n\n        res = x\n        fm = self.local_rep(x)\n\n        # convert feature map to patches\n        patches, info_dict = self.unfolding(fm)\n\n        # learn global representations\n        for global_layer in self.global_rep:\n            if isinstance(global_layer, TransformerEncoder):\n                patches = global_layer(x=patches, x_prev=x_prev)\n            else:\n                patches = global_layer(patches)\n\n        # [B x Patch x Patches x C] --> [B x C x Patches x Patch]\n        fm = self.folding(patches=patches, info_dict=info_dict)\n\n        fm = self.conv_proj(fm)\n\n        if self.fusion is not None:\n            fm = self.fusion(torch.cat((res, fm), dim=1))\n        return fm, patches\n\n    def forward(\n        self, x: Union[Tensor, Tuple[Tensor]], *args, **kwargs\n    ) -> Union[Tensor, Tuple[Tensor, Tensor]]:\n        if isinstance(x, Tuple) and len(x) == 2:\n            # for spatio-temporal MobileViT\n            return self.forward_temporal(x=x[0], x_prev=x[1])\n        elif isinstance(x, Tensor):\n            # For image data\n            return self.forward_spatial(x)\n        else:\n            raise NotImplementedError\n\n\nclass MobileViTBlockv2(BaseModule):\n    \"\"\"\n    This class defines the `MobileViTv2 <https://arxiv.org/abs/2206.02680>`_ block\n\n    Args:\n        opts: command line arguments\n        in_channels (int): :math:`C_{in}` from an expected input of size :math:`(N, C_{in}, H, W)`\n        attn_unit_dim (int): Input dimension to the attention unit\n        ffn_multiplier (int): Expand the input dimensions by this factor in FFN. Default is 2.\n        n_attn_blocks (Optional[int]): Number of attention units. Default: 2\n        attn_dropout (Optional[float]): Dropout in multi-head attention. Default: 0.0\n        dropout (Optional[float]): Dropout rate. Default: 0.0\n        ffn_dropout (Optional[float]): Dropout between FFN layers in transformer. Default: 0.0\n        patch_h (Optional[int]): Patch height for unfolding operation. Default: 8\n        patch_w (Optional[int]): Patch width for unfolding operation. Default: 8\n        conv_ksize (Optional[int]): Kernel size to learn local representations in MobileViT block. Default: 3\n        dilation (Optional[int]): Dilation rate in convolutions. Default: 1\n        attn_norm_layer (Optional[str]): Normalization layer in the attention block. Default: layer_norm_2d\n    \"\"\"\n\n    def __init__(\n        self,\n        opts,\n        in_channels: int,\n        attn_unit_dim: int,\n        ffn_multiplier: Optional[Union[Sequence[Union[int, float]], int, float]] = 2.0,\n        n_attn_blocks: Optional[int] = 2,\n        attn_dropout: Optional[float] = 0.0,\n        dropout: Optional[float] = 0.0,\n        ffn_dropout: Optional[float] = 0.0,\n        patch_h: Optional[int] = 8,\n        patch_w: Optional[int] = 8,\n        conv_ksize: Optional[int] = 3,\n        dilation: Optional[int] = 1,\n        attn_norm_layer: Optional[str] = \"layer_norm_2d\",\n        *args,\n        **kwargs\n    ) -> None:\n        cnn_out_dim = attn_unit_dim\n\n        conv_3x3_in = ConvLayer2d(\n            opts=opts,\n            in_channels=in_channels,\n            out_channels=in_channels,\n            kernel_size=conv_ksize,\n            stride=1,\n            use_norm=True,\n            use_act=True,\n            dilation=dilation,\n            groups=in_channels,\n        )\n        conv_1x1_in = ConvLayer2d(\n            opts=opts,\n            in_channels=in_channels,\n            out_channels=cnn_out_dim,\n            kernel_size=1,\n            stride=1,\n            use_norm=False,\n            use_act=False,\n        )\n\n        super(MobileViTBlockv2, self).__init__()\n        self.local_rep = nn.Sequential(conv_3x3_in, conv_1x1_in)\n\n        self.global_rep, attn_unit_dim = self._build_attn_layer(\n            opts=opts,\n            d_model=attn_unit_dim,\n            ffn_mult=ffn_multiplier,\n            n_layers=n_attn_blocks,\n            attn_dropout=attn_dropout,\n            dropout=dropout,\n            ffn_dropout=ffn_dropout,\n            attn_norm_layer=attn_norm_layer,\n        )\n\n        self.conv_proj = ConvLayer2d(\n            opts=opts,\n            in_channels=cnn_out_dim,\n            out_channels=in_channels,\n            kernel_size=1,\n            stride=1,\n            use_norm=True,\n            use_act=False,\n        )\n\n        self.patch_h = patch_h\n        self.patch_w = patch_w\n        self.patch_area = self.patch_w * self.patch_h\n\n        self.cnn_in_dim = in_channels\n        self.cnn_out_dim = cnn_out_dim\n        self.transformer_in_dim = attn_unit_dim\n        self.dropout = dropout\n        self.attn_dropout = attn_dropout\n        self.ffn_dropout = ffn_dropout\n        self.n_blocks = n_attn_blocks\n        self.conv_ksize = conv_ksize\n        self.enable_coreml_compatible_fn = getattr(\n            opts, \"common.enable_coreml_compatible_module\", False\n        )\n\n        if self.enable_coreml_compatible_fn:\n            # we set persistent to false so that these weights are not part of model's state_dict\n            self.register_buffer(\n                name=\"unfolding_weights\",\n                tensor=self._compute_unfolding_weights(),\n                persistent=False,\n            )\n\n    def _compute_unfolding_weights(self) -> Tensor:\n        # [P_h * P_w, P_h * P_w]\n        weights = torch.eye(self.patch_h * self.patch_w, dtype=torch.float)\n        # [P_h * P_w, P_h * P_w] --> [P_h * P_w, 1, P_h, P_w]\n        weights = weights.reshape(\n            (self.patch_h * self.patch_w, 1, self.patch_h, self.patch_w)\n        )\n        # [P_h * P_w, 1, P_h, P_w] --> [P_h * P_w * C, 1, P_h, P_w]\n        weights = weights.repeat(self.cnn_out_dim, 1, 1, 1)\n        return weights\n\n    def _build_attn_layer(\n        self,\n        opts,\n        d_model: int,\n        ffn_mult: Union[Sequence, int, float],\n        n_layers: int,\n        attn_dropout: float,\n        dropout: float,\n        ffn_dropout: float,\n        attn_norm_layer: str,\n        *args,\n        **kwargs\n    ) -> Tuple[nn.Module, int]:\n\n        if isinstance(ffn_mult, Sequence) and len(ffn_mult) == 2:\n            ffn_dims = (\n                np.linspace(ffn_mult[0], ffn_mult[1], n_layers, dtype=float) * d_model\n            )\n        elif isinstance(ffn_mult, Sequence) and len(ffn_mult) == 1:\n            ffn_dims = [ffn_mult[0] * d_model] * n_layers\n        elif isinstance(ffn_mult, (int, float)):\n            ffn_dims = [ffn_mult * d_model] * n_layers\n        else:\n            raise NotImplementedError\n\n        # ensure that dims are multiple of 16\n        ffn_dims = [int((d // 16) * 16) for d in ffn_dims]\n\n        global_rep = [\n            LinearAttnFFN(\n                opts=opts,\n                embed_dim=d_model,\n                ffn_latent_dim=ffn_dims[block_idx],\n                attn_dropout=attn_dropout,\n                dropout=dropout,\n                ffn_dropout=ffn_dropout,\n                norm_layer=attn_norm_layer,\n            )\n            for block_idx in range(n_layers)\n        ]\n        global_rep.append(\n            get_normalization_layer(\n                opts=opts, norm_type=attn_norm_layer, num_features=d_model\n            )\n        )\n\n        return nn.Sequential(*global_rep), d_model\n\n    def __repr__(self) -> str:\n        repr_str = \"{}(\".format(self.__class__.__name__)\n\n        repr_str += \"\\n\\t Local representations\"\n        if isinstance(self.local_rep, nn.Sequential):\n            for m in self.local_rep:\n                repr_str += \"\\n\\t\\t {}\".format(m)\n        else:\n            repr_str += \"\\n\\t\\t {}\".format(self.local_rep)\n\n        repr_str += \"\\n\\t Global representations with patch size of {}x{}\".format(\n            self.patch_h,\n            self.patch_w,\n        )\n        if isinstance(self.global_rep, nn.Sequential):\n            for m in self.global_rep:\n                repr_str += \"\\n\\t\\t {}\".format(m)\n        else:\n            repr_str += \"\\n\\t\\t {}\".format(self.global_rep)\n\n        if isinstance(self.conv_proj, nn.Sequential):\n            for m in self.conv_proj:\n                repr_str += \"\\n\\t\\t {}\".format(m)\n        else:\n            repr_str += \"\\n\\t\\t {}\".format(self.conv_proj)\n\n        repr_str += \"\\n)\"\n        return repr_str\n\n    def unfolding_pytorch(self, feature_map: Tensor) -> Tuple[Tensor, Tuple[int, int]]:\n\n        batch_size, in_channels, img_h, img_w = feature_map.shape\n\n        # [B, C, H, W] --> [B, C, P, N]\n        patches = F.unfold(\n            feature_map,\n            kernel_size=(self.patch_h, self.patch_w),\n            stride=(self.patch_h, self.patch_w),\n        )\n        patches = patches.reshape(\n            batch_size, in_channels, self.patch_h * self.patch_w, -1\n        )\n\n        return patches, (img_h, img_w)\n\n    def folding_pytorch(self, patches: Tensor, output_size: Tuple[int, int]) -> Tensor:\n        batch_size, in_dim, patch_size, n_patches = patches.shape\n\n        # [B, C, P, N]\n        patches = patches.reshape(batch_size, in_dim * patch_size, n_patches)\n\n        feature_map = F.fold(\n            patches,\n            output_size=output_size,\n            kernel_size=(self.patch_h, self.patch_w),\n            stride=(self.patch_h, self.patch_w),\n        )\n\n        return feature_map\n\n    def unfolding_coreml(self, feature_map: Tensor) -> Tuple[Tensor, Tuple[int, int]]:\n        # im2col is not implemented in Coreml, so here we hack its implementation using conv2d\n        # we compute the weights\n\n        # [B, C, H, W] --> [B, C, P, N]\n        batch_size, in_channels, img_h, img_w = feature_map.shape\n        #\n        patches = F.conv2d(\n            feature_map,\n            self.unfolding_weights,\n            bias=None,\n            stride=(self.patch_h, self.patch_w),\n            padding=0,\n            dilation=1,\n            groups=in_channels,\n        )\n        patches = patches.reshape(\n            batch_size, in_channels, self.patch_h * self.patch_w, -1\n        )\n        return patches, (img_h, img_w)\n\n    def folding_coreml(self, patches: Tensor, output_size: Tuple[int, int]) -> Tensor:\n        # col2im is not supported on coreml, so tracing fails\n        # We hack folding function via pixel_shuffle to enable coreml tracing\n        batch_size, in_dim, patch_size, n_patches = patches.shape\n\n        n_patches_h = output_size[0] // self.patch_h\n        n_patches_w = output_size[1] // self.patch_w\n\n        feature_map = patches.reshape(\n            batch_size, in_dim * self.patch_h * self.patch_w, n_patches_h, n_patches_w\n        )\n        assert (\n            self.patch_h == self.patch_w\n        ), \"For Coreml, we need patch_h and patch_w are the same\"\n        feature_map = F.pixel_shuffle(feature_map, upscale_factor=self.patch_h)\n        return feature_map\n\n    def resize_input_if_needed(self, x):\n        batch_size, in_channels, orig_h, orig_w = x.shape\n        if orig_h % self.patch_h != 0 or orig_w % self.patch_w != 0:\n            new_h = int(math.ceil(orig_h / self.patch_h) * self.patch_h)\n            new_w = int(math.ceil(orig_w / self.patch_w) * self.patch_w)\n            x = F.interpolate(\n                x, size=(new_h, new_w), mode=\"bilinear\", align_corners=True\n            )\n        return x\n\n    def forward_spatial(self, x: Tensor, *args, **kwargs) -> Tensor:\n        x = self.resize_input_if_needed(x)\n\n        fm = self.local_rep(x)\n\n        # convert feature map to patches\n        if self.enable_coreml_compatible_fn:\n            patches, output_size = self.unfolding_coreml(fm)\n        else:\n            patches, output_size = self.unfolding_pytorch(fm)\n\n        # learn global representations on all patches\n        patches = self.global_rep(patches)\n\n        # [B x Patch x Patches x C] --> [B x C x Patches x Patch]\n        if self.enable_coreml_compatible_fn:\n            fm = self.folding_coreml(patches=patches, output_size=output_size)\n        else:\n            fm = self.folding_pytorch(patches=patches, output_size=output_size)\n        fm = self.conv_proj(fm)\n\n        return fm\n\n    def forward_temporal(\n        self, x: Tensor, x_prev: Tensor, *args, **kwargs\n    ) -> Union[Tensor, Tuple[Tensor, Tensor]]:\n        x = self.resize_input_if_needed(x)\n\n        fm = self.local_rep(x)\n\n        # convert feature map to patches\n        if self.enable_coreml_compatible_fn:\n            patches, output_size = self.unfolding_coreml(fm)\n        else:\n            patches, output_size = self.unfolding_pytorch(fm)\n\n        # learn global representations\n        for global_layer in self.global_rep:\n            if isinstance(global_layer, LinearAttnFFN):\n                patches = global_layer(x=patches, x_prev=x_prev)\n            else:\n                patches = global_layer(patches)\n\n        # [B x Patch x Patches x C] --> [B x C x Patches x Patch]\n        if self.enable_coreml_compatible_fn:\n            fm = self.folding_coreml(patches=patches, output_size=output_size)\n        else:\n            fm = self.folding_pytorch(patches=patches, output_size=output_size)\n        fm = self.conv_proj(fm)\n\n        return fm, patches\n\n    def forward(\n        self, x: Union[Tensor, Tuple[Tensor]], *args, **kwargs\n    ) -> Union[Tensor, Tuple[Tensor, Tensor]]:\n        if isinstance(x, Tuple) and len(x) == 2:\n            # for spatio-temporal data (e.g., videos)\n            return self.forward_temporal(x=x[0], x_prev=x[1])\n        elif isinstance(x, Tensor):\n            # for image data\n            return self.forward_spatial(x)\n        else:\n            raise NotImplementedError\n"
  },
  {
    "path": "corenet/modeling/modules/pspnet_module.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom typing import Optional, Tuple\n\nimport torch\nimport torch.nn.functional as F\nfrom torch import Tensor, nn\n\nfrom corenet.modeling.layers import AdaptiveAvgPool2d, ConvLayer2d, Dropout2d\nfrom corenet.modeling.modules import BaseModule\nfrom corenet.utils import logger\n\n\nclass PSP(BaseModule):\n    \"\"\"\n    This class defines the Pyramid Scene Parsing module in the `PSPNet paper <https://arxiv.org/abs/1612.01105>`_\n\n    Args:\n        opts: command-line arguments\n        in_channels (int): :math:`C_{in}` from an expected input of size :math:`(N, C_{in}, H, W)`\n        out_channels (int): :math:`C_{out}` from an expected output of size :math:`(N, C_{out}, H, W)`\n        pool_sizes Optional[Tuple[int, ...]]: List or Tuple of pool sizes. Default: (1, 2, 3, 6)\n        dropout (Optional[float]): Apply dropout. Default is 0.0\n    \"\"\"\n\n    def __init__(\n        self,\n        opts,\n        in_channels: int,\n        out_channels: int,\n        pool_sizes: Optional[Tuple[int, ...]] = (1, 2, 3, 6),\n        dropout: Optional[float] = 0.0,\n        *args,\n        **kwargs\n    ) -> None:\n        if not (0.0 <= dropout < 1.0):\n            logger.error(\n                \"Dropout value in {} should be between 0 and 1. Got: {}\".format(\n                    self.__class__.__name__, dropout\n                )\n            )\n        reduction_dim = in_channels // len(pool_sizes)\n        reduction_dim = (reduction_dim // 16) * 16\n        channels_after_concat = (reduction_dim * len(pool_sizes)) + in_channels\n\n        super().__init__()\n        self.psp_branches = nn.ModuleList(\n            [\n                self._make_psp_layer(\n                    opts, o_size=ps, in_channels=in_channels, out_channels=reduction_dim\n                )\n                for ps in pool_sizes\n            ]\n        )\n        self.fusion = nn.Sequential(\n            ConvLayer2d(\n                opts=opts,\n                in_channels=channels_after_concat,\n                out_channels=out_channels,\n                kernel_size=3,\n                stride=1,\n                use_norm=True,\n                use_act=True,\n            ),\n            Dropout2d(p=dropout),\n        )\n\n        self.in_channels = in_channels\n        self.out_channels = out_channels\n        self.pool_sizes = pool_sizes\n        self.inner_channels = reduction_dim\n        self.dropout = dropout\n\n    @staticmethod\n    def _make_psp_layer(\n        opts, o_size: int, in_channels: int, out_channels: int\n    ) -> nn.Module:\n        return nn.Sequential(\n            AdaptiveAvgPool2d(output_size=(o_size, o_size)),\n            ConvLayer2d(\n                opts,\n                in_channels=in_channels,\n                out_channels=out_channels,\n                kernel_size=1,\n                bias=False,\n                use_norm=True,\n                use_act=True,\n            ),\n        )\n\n    def forward(self, x: Tensor, *args, **kwargs) -> Tensor:\n        x_size = x.shape[2:]\n        out = [x] + [\n            F.interpolate(\n                input=psp_branch(x), size=x_size, mode=\"bilinear\", align_corners=True\n            )\n            for psp_branch in self.psp_branches\n        ]\n        out = torch.cat(out, dim=1)\n        out = self.fusion(out)\n        return out\n\n    def __repr__(self):\n        return \"{}(in_channels={}, out_channels={}, pool_sizes={}, inner_channels={}, dropout_2d={})\".format(\n            self.__class__.__name__,\n            self.in_channels,\n            self.out_channels,\n            self.pool_sizes,\n            self.inner_channels,\n            self.dropout,\n        )\n"
  },
  {
    "path": "corenet/modeling/modules/regnet_modules.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nfrom typing import List, Optional, Tuple\n\nfrom torch import Tensor, nn\n\nfrom corenet.modeling.layers import ConvLayer2d, Identity, StochasticDepth\nfrom corenet.modeling.layers.activation import build_activation_layer\nfrom corenet.modeling.modules import BaseModule, SqueezeExcitation\n\n\nclass XRegNetBlock(BaseModule):\n    \"\"\"\n    This class implements the `X` block based on the ResNet bottleneck block. See figure 4 of RegNet\n    paper `RegNet model <https://arxiv.org/pdf/2003.13678.pdf>`_\n\n    Args:\n        opts: command-line arguments\n        width_in: The number of input channels\n        width_out: The number of output channels\n        stride: Stride for convolution\n        groups: Number of groups for convolution\n        bottleneck_multiplier: The number of in/out channels of the intermediate\n            conv layer will be scaled by this value\n        se_ratio: The number squeeze-excitation ratio. The number of channels in the SE\n            module will be scaled by this value\n        stochastic_depth_prob: The stochastic depth probability\n    \"\"\"\n\n    def __init__(\n        self,\n        opts: argparse.Namespace,\n        width_in: int,\n        width_out: int,\n        stride: int,\n        groups: int,\n        bottleneck_multiplier: float,\n        se_ratio: float,\n        stochastic_depth_prob: float = 0.0,  # drop probability (= 1 - survival_prob)\n    ) -> None:\n        super().__init__()\n\n        bottleneck_width = int(round(width_out * bottleneck_multiplier))\n        bottleneck_groups = bottleneck_width // groups\n\n        conv_1x1_1 = ConvLayer2d(\n            opts=opts,\n            in_channels=width_in,\n            out_channels=bottleneck_width,\n            kernel_size=1,\n            stride=1,\n            use_norm=True,\n            use_act=True,\n        )\n\n        conv_3x3 = ConvLayer2d(\n            opts=opts,\n            in_channels=bottleneck_width,\n            out_channels=bottleneck_width,\n            kernel_size=3,\n            stride=stride,\n            groups=bottleneck_groups,\n            use_norm=True,\n            use_act=True,\n        )\n\n        se = Identity()\n        if se_ratio > 0:\n            squeeze_channels = int(round(se_ratio * width_in))\n            se = SqueezeExcitation(\n                opts,\n                in_channels=bottleneck_width,\n                squeeze_channels=squeeze_channels,\n            )\n\n        conv_1x1_2 = ConvLayer2d(\n            opts=opts,\n            in_channels=bottleneck_width,\n            out_channels=width_out,\n            kernel_size=1,\n            stride=1,\n            use_norm=True,\n            use_act=True,\n        )\n\n        block = nn.Sequential()\n        block.add_module(\"conv_1x1_1\", module=conv_1x1_1)\n        block.add_module(\"conv_3x3\", module=conv_3x3)\n        block.add_module(\"se\", module=se)\n        block.add_module(\"conv_1x1_2\", module=conv_1x1_2)\n\n        down_sample = Identity()\n        if stride != 1 or width_out != width_in:\n            down_sample = ConvLayer2d(\n                opts,\n                in_channels=width_in,\n                out_channels=width_out,\n                kernel_size=1,\n                stride=stride,\n                use_act=False,\n            )\n\n        act_type = getattr(opts, \"model.activation.name\")\n        neg_slope = getattr(opts, \"model.activation.neg_slope\")\n        inplace = getattr(opts, \"model.activation.inplace\")\n        final_act = build_activation_layer(\n            opts=opts,\n            act_type=act_type,\n            inplace=inplace,\n            negative_slope=neg_slope,\n            num_parameters=width_out,\n        )\n\n        self.stochastic_depth = StochasticDepth(p=stochastic_depth_prob, mode=\"row\")\n\n        self.block = block\n        self.down_sample = down_sample\n        self.final_act = final_act\n        self.width_in = width_in\n        self.width_out = width_out\n        self.stride = stride\n        self.groups = groups\n        self.bottleneck_multiplier = bottleneck_multiplier\n        self.se_ratio = se_ratio\n        self.stochastic_depth_prob = stochastic_depth_prob\n\n    def forward(self, x: Tensor) -> Tensor:\n        \"\"\"Forward pass for XRegNetBlock.\n\n        Args:\n            x: Batch of images\n\n        Returns:\n            * output of XRegNetBlock including stochastic depth layer and\n                residual.\n\n        Shape:\n            x: :math:`(N, C_{in}, H_{in}, W_{in})`\n            Output: :math:`(N, C_{out}, H_{out}, W_{out})`\n        \"\"\"\n        out = self.block(x)\n        out = self.stochastic_depth(out)\n        res = self.down_sample(x)\n        out = res + out\n        return self.final_act(out)\n\n    def __repr__(self) -> str:\n        return \"{}(width_in={}, width_out={}, stride={}, groups={}, bottleneck_multiplier={}, se_ratio={}, stochastic_depth_prob={})\".format(\n            self.__class__.__name__,\n            self.width_in,\n            self.width_out,\n            self.stride,\n            self.groups,\n            self.bottleneck_multiplier,\n            self.se_ratio,\n            self.stochastic_depth_prob,\n        )\n\n\nclass AnyRegNetStage(BaseModule):\n    \"\"\"\n    This class implements a 'stage' as defined in the `RegNet paper <https://arxiv.org/pdf/2003.13678.pdf>`_.\n    It consists of a sequence of bottleneck blocks.\n\n    Args:\n        opts: command-line arguments\n        depth: The number of XRegNetBlocks in the stage\n        width_in: The number of input channels of the first block\n        width_out: The number of output channels of each block\n        stride: Stride for convolution of first block\n        groups: Number of groups for the intermediate convolution (bottleneck) layer in each block\n        bottleneck_multiplier: The number of in/out channels of the intermediate\n            conv layer of each block will be scaled by this value\n        se_ratio: The number squeeze-excitation ratio. The number of channels in the SE\n            module of each block will be scaled by this value\n        stage_depths: A list of the number of blocks in each stage\n        stage_index: The index of the current stage being constructed\n        stochastic_depth_prob: The stochastic depth probability\n    \"\"\"\n\n    def __init__(\n        self,\n        opts: argparse.Namespace,\n        depth: int,\n        width_in: int,\n        width_out: int,\n        stride: int,\n        groups: int,\n        bottleneck_multiplier: float,\n        se_ratio: float,\n        stage_index: int,\n        stochastic_depth_probs: List[float],\n    ) -> None:\n\n        super().__init__()\n\n        stage_blocks = nn.Sequential()\n\n        for i, sd_prob in enumerate(stochastic_depth_probs):\n            block = XRegNetBlock(\n                opts,\n                width_in=width_in if i == 0 else width_out,\n                width_out=width_out,\n                stride=stride if i == 0 else 1,\n                groups=groups,\n                bottleneck_multiplier=bottleneck_multiplier,\n                se_ratio=se_ratio,\n                stochastic_depth_prob=sd_prob,\n            )\n            stage_blocks.add_module(f\"Stage{stage_index}-Block{i}\", module=block)\n\n        self.stage = stage_blocks\n        self.depth = depth\n        self.width_in = width_in\n        self.width_out = width_out\n        self.stride = stride\n        self.groups = groups\n        self.bottleneck_multiplier = bottleneck_multiplier\n        self.se_ratio = se_ratio\n        self.stage_index = stage_index\n        self.stochastic_depth_probs = stochastic_depth_probs\n\n    def forward(self, x: Tensor) -> Tensor:\n        \"\"\"Forward pass through all blocks in the stage.\n\n        Args:\n            x: Batch of images.\n\n        Returns:\n            * output of passing x through all blocks in the stage.\n\n        Shape:\n            x: :math:`(N, C_{in}, H_{in}, W_{in})`\n            Output: :math:`(N, C_{out}, H_{out}, W_{out})`\n        \"\"\"\n        return self.stage(x)\n\n    def __repr__(self) -> str:\n        return \"{}(depth={}, width_in={}, width_out={}, stride={}, groups={}, bottleneck_multiplier={}, se_ratio={}, stage_index={}, stochastic_depth_probs={})\".format(\n            self.__class__.__name__,\n            self.depth,\n            self.width_in,\n            self.width_out,\n            self.stride,\n            self.groups,\n            self.bottleneck_multiplier,\n            self.se_ratio,\n            self.stage_index,\n            self.stochastic_depth_probs,\n        )\n"
  },
  {
    "path": "corenet/modeling/modules/resnet_modules.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nfrom typing import Optional\n\nfrom torch import Tensor, nn\n\nfrom corenet.modeling.layers import ConvLayer2d, Dropout, Identity, StochasticDepth\nfrom corenet.modeling.layers.activation import build_activation_layer\nfrom corenet.modeling.modules import BaseModule, SqueezeExcitation\n\n\nclass BasicResNetBlock(BaseModule):\n    \"\"\"\n    This class defines the Basic block in the `ResNet model <https://arxiv.org/abs/1512.03385>`_\n    Args:\n        opts: command-line arguments\n        in_channels (int): :math:`C_{in}` from an expected input of size :math:`(N, C_{in}, H_{in}, W_{in})`\n        mid_channels (int): :math:`C_{mid}` from an expected tensor of size :math:`(N, C_{mid}, H_{out}, W_{out})`\n        out_channels (int): :math:`C_{out}` from an expected output of size :math:`(N, C_{out}, H_{out}, W_{out})`\n        stride (Optional[int]): Stride for convolution. Default: 1\n        dilation (Optional[int]): Dilation for convolution. Default: 1\n        dropout (Optional[float]): Dropout after second convolution. Default: 0.0\n        stochastic_depth_prob (Optional[float]): Stochastic depth drop probability (1 - survival_prob). Default: 0.0\n        squeeze_channels (Optional[int]): The number of channels to use in the Squeeze-Excitation block for SE-ResNet.\n            Default: None.\n\n    Shape:\n        - Input: :math:`(N, C_{in}, H_{in}, W_{in})`\n        - Output: :math:`(N, C_{out}, H_{out}, W_{out})`\n\n    \"\"\"\n\n    expansion: int = 1\n\n    def __init__(\n        self,\n        opts: argparse.Namespace,\n        in_channels: int,\n        mid_channels: int,\n        out_channels: int,\n        stride: Optional[int] = 1,\n        dilation: Optional[int] = 1,\n        dropout: Optional[float] = 0.0,\n        stochastic_depth_prob: Optional[float] = 0.0,\n        squeeze_channels: Optional[int] = None,\n        *args,\n        **kwargs\n    ) -> None:\n\n        act_type = getattr(opts, \"model.activation.name\")\n        neg_slope = getattr(opts, \"model.activation.neg_slope\")\n        inplace = getattr(opts, \"model.activation.inplace\")\n\n        cbr_1 = ConvLayer2d(\n            opts=opts,\n            in_channels=in_channels,\n            out_channels=mid_channels,\n            kernel_size=3,\n            stride=stride,\n            dilation=dilation,\n            use_norm=True,\n            use_act=True,\n        )\n        cb_2 = ConvLayer2d(\n            opts=opts,\n            in_channels=mid_channels,\n            out_channels=out_channels,\n            kernel_size=3,\n            stride=1,\n            use_norm=True,\n            use_act=False,\n            dilation=dilation,\n        )\n\n        block = nn.Sequential()\n        block.add_module(name=\"conv_batch_act_1\", module=cbr_1)\n        block.add_module(name=\"conv_batch_2\", module=cb_2)\n        if 0.0 < dropout < 1.0:\n            block.add_module(name=\"dropout\", module=Dropout(p=dropout))\n\n        down_sample = Identity()\n        if stride == 2:\n            down_sample = ConvLayer2d(\n                opts=opts,\n                in_channels=in_channels,\n                out_channels=out_channels,\n                kernel_size=1,\n                stride=stride,\n                use_norm=True,\n                use_act=False,\n            )\n\n        se_block = Identity()\n        if squeeze_channels is not None:\n            se_block = SqueezeExcitation(\n                opts=opts,\n                in_channels=out_channels,\n                squeeze_channels=squeeze_channels,\n            )\n\n        super().__init__()\n        # Both self.conv1 and self.downsample layers downsample the input when stride != 1\n        self.block = block\n        self.down_sample = down_sample\n\n        self.final_act = build_activation_layer(\n            opts,\n            act_type=act_type,\n            inplace=inplace,\n            negative_slope=neg_slope,\n            num_parameters=out_channels,\n        )\n\n        self.stochastic_depth = StochasticDepth(p=stochastic_depth_prob, mode=\"row\")\n        self.se_block = se_block\n\n        self.stride = stride\n        self.in_channels = in_channels\n        self.out_channels = out_channels\n        self.dilation = dilation\n        self.dropout = dropout\n        self.stochastic_depth_prob = stochastic_depth_prob\n        self.squeeze_channels = squeeze_channels\n\n    def forward(self, x: Tensor, *args, **kwargs) -> Tensor:\n        out = self.block(x)\n        out = self.se_block(out)\n        res = self.down_sample(x)\n        out = self.stochastic_depth(out)\n        out = out + res\n        return self.final_act(out)\n\n    def __repr__(self) -> str:\n        return \"{}(in_channels={}, out_channels={}, stride={}, dilation={}, dropout={}, stochastic_depth_prob={}, squeeze_channels={})\".format(\n            self.__class__.__name__,\n            self.in_channels,\n            self.out_channels,\n            self.stride,\n            self.dilation,\n            self.dropout,\n            self.stochastic_depth_prob,\n            self.squeeze_channels,\n        )\n\n\nclass BottleneckResNetBlock(BaseModule):\n    \"\"\"\n    This class defines the Bottleneck block in the `ResNet model <https://arxiv.org/abs/1512.03385>`_\n    Args:\n        opts: command-line arguments\n        in_channels (int): :math:`C_{in}` from an expected input of size :math:`(N, C_{in}, H_{in}, W_{in})`\n        mid_channels (int): :math:`C_{mid}` from an expected tensor of size :math:`(N, C_{mid}, H_{out}, W_{out})`\n        out_channels (int): :math:`C_{out}` from an expected output of size :math:`(N, C_{out}, H_{out}, W_{out})`\n        stride (Optional[int]): Stride for convolution. Default: 1\n        dilation (Optional[int]): Dilation for convolution. Default: 1\n        dropout (Optional[float]): Dropout after third convolution. Default: 0.0\n        stochastic_depth_prob (Optional[float]): Stochastic depth drop probability (1 - survival_prob). Default: 0.0\n        squeeze_channels (Optional[int]): The number of channels to use in the Squeeze-Excitation block for SE-ResNet.\n\n    Shape:\n        - Input: :math:`(N, C_{in}, H_{in}, W_{in})`\n        - Output: :math:`(N, C_{out}, H_{out}, W_{out})`\n\n    \"\"\"\n\n    expansion: int = 4\n\n    def __init__(\n        self,\n        opts: argparse.Namespace,\n        in_channels: int,\n        mid_channels: int,\n        out_channels: int,\n        stride: Optional[int] = 1,\n        dilation: Optional[int] = 1,\n        dropout: Optional[float] = 0.0,\n        stochastic_depth_prob: Optional[float] = 0.0,\n        squeeze_channels: Optional[int] = None,\n        *args,\n        **kwargs\n    ) -> None:\n        act_type = getattr(opts, \"model.activation.name\")\n        neg_slope = getattr(opts, \"model.activation.neg_slope\")\n        inplace = getattr(opts, \"model.activation.inplace\")\n\n        cbr_1 = ConvLayer2d(\n            opts=opts,\n            in_channels=in_channels,\n            out_channels=mid_channels,\n            kernel_size=1,\n            stride=1,\n            use_norm=True,\n            use_act=True,\n        )\n        cbr_2 = ConvLayer2d(\n            opts=opts,\n            in_channels=mid_channels,\n            out_channels=mid_channels,\n            kernel_size=3,\n            stride=stride,\n            use_norm=True,\n            use_act=True,\n            dilation=dilation,\n        )\n        cb_3 = ConvLayer2d(\n            opts=opts,\n            in_channels=mid_channels,\n            out_channels=out_channels,\n            kernel_size=1,\n            stride=1,\n            use_norm=True,\n            use_act=False,\n        )\n        block = nn.Sequential()\n        block.add_module(name=\"conv_batch_act_1\", module=cbr_1)\n        block.add_module(name=\"conv_batch_act_2\", module=cbr_2)\n        block.add_module(name=\"conv_batch_3\", module=cb_3)\n        if 0.0 < dropout < 1.0:\n            block.add_module(name=\"dropout\", module=Dropout(p=dropout))\n\n        down_sample = Identity()\n        if stride == 2:\n            down_sample = ConvLayer2d(\n                opts=opts,\n                in_channels=in_channels,\n                out_channels=out_channels,\n                kernel_size=1,\n                stride=stride,\n                use_norm=True,\n                use_act=False,\n            )\n        elif in_channels != out_channels:\n            down_sample = ConvLayer2d(\n                opts=opts,\n                in_channels=in_channels,\n                out_channels=out_channels,\n                kernel_size=1,\n                stride=1,\n                use_norm=True,\n                use_act=False,\n            )\n\n        se_block = Identity()\n        if squeeze_channels is not None:\n            se_block = SqueezeExcitation(\n                opts=opts,\n                in_channels=out_channels,\n                squeeze_channels=squeeze_channels,\n            )\n\n        super().__init__()\n        self.block = block\n\n        self.down_sample = down_sample\n        self.final_act = build_activation_layer(\n            opts,\n            act_type=act_type,\n            inplace=inplace,\n            negative_slope=neg_slope,\n            num_parameters=out_channels,\n        )\n\n        self.stochastic_depth = StochasticDepth(p=stochastic_depth_prob, mode=\"row\")\n        self.se_block = se_block\n\n        self.stride = stride\n        self.in_channels = in_channels\n        self.out_channels = out_channels\n        self.mid_channels = mid_channels\n        self.dilation = dilation\n        self.dropout = dropout\n        self.stochastic_depth_prob = stochastic_depth_prob\n        self.squeeze_channels = squeeze_channels\n\n    def forward(self, x: Tensor, *args, **kwargs) -> Tensor:\n        out = self.block(x)\n        out = self.se_block(out)\n        res = self.down_sample(x)\n        out = self.stochastic_depth(out)\n        out = out + res\n        return self.final_act(out)\n\n    def __repr__(self) -> str:\n        return \"{}(in_channels={}, mid_channels={}, out_channels={}, stride={}, dilation={}, dropout={}, stochastic_depth_prob={}, squeeze_channels={})\".format(\n            self.__class__.__name__,\n            self.in_channels,\n            self.mid_channels,\n            self.out_channels,\n            self.stride,\n            self.dilation,\n            self.dropout,\n            self.stochastic_depth_prob,\n            self.squeeze_channels,\n        )\n"
  },
  {
    "path": "corenet/modeling/modules/squeeze_excitation.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom typing import Optional\n\nimport torch\nfrom torch import Tensor, nn\n\nfrom corenet.modeling.layers import AdaptiveAvgPool2d, ConvLayer2d\nfrom corenet.modeling.layers.activation import build_activation_layer\nfrom corenet.modeling.modules import BaseModule\nfrom corenet.utils.math_utils import make_divisible\n\n\nclass SqueezeExcitation(BaseModule):\n    \"\"\"\n    This class defines the Squeeze-excitation module, in the `SENet paper <https://arxiv.org/abs/1709.01507>`_\n\n    Args:\n        opts: command-line arguments\n        in_channels (int): :math:`C` from an expected input of size :math:`(N, C, H, W)`\n        squeeze_factor (Optional[int]): Reduce :math:`C` by this factor. Default: 4\n        squeeze_channels (Optional[int]): This module's output channels. Overrides squeeze_factor if specified\n        scale_fn_name (Optional[str]): Scaling function name. Default: sigmoid\n\n    Shape:\n        - Input: :math:`(N, C, H, W)`\n        - Output: :math:`(N, C, H, W)`\n    \"\"\"\n\n    def __init__(\n        self,\n        opts,\n        in_channels: int,\n        squeeze_factor: Optional[int] = 4,\n        squeeze_channels: Optional[int] = None,\n        scale_fn_name: Optional[str] = \"sigmoid\",\n        *args,\n        **kwargs\n    ) -> None:\n        if squeeze_channels is None:\n            squeeze_channels = max(make_divisible(in_channels // squeeze_factor, 8), 32)\n\n        fc1 = ConvLayer2d(\n            opts=opts,\n            in_channels=in_channels,\n            out_channels=squeeze_channels,\n            kernel_size=1,\n            stride=1,\n            bias=True,\n            use_norm=False,\n            use_act=True,\n        )\n        fc2 = ConvLayer2d(\n            opts=opts,\n            in_channels=squeeze_channels,\n            out_channels=in_channels,\n            kernel_size=1,\n            stride=1,\n            bias=True,\n            use_norm=False,\n            use_act=False,\n        )\n        act_fn = build_activation_layer(opts, act_type=scale_fn_name, inplace=True)\n        super().__init__()\n        self.se_layer = nn.Sequential()\n        self.se_layer.add_module(\n            name=\"global_pool\", module=AdaptiveAvgPool2d(output_size=1)\n        )\n        self.se_layer.add_module(name=\"fc1\", module=fc1)\n        self.se_layer.add_module(name=\"fc2\", module=fc2)\n        self.se_layer.add_module(name=\"scale_act\", module=act_fn)\n\n        self.in_channels = in_channels\n        self.squeeze_factor = squeeze_factor\n        self.scale_fn = scale_fn_name\n\n    def forward(self, x: Tensor, *args, **kwargs) -> Tensor:\n        return x * self.se_layer(x)\n\n    def __repr__(self) -> str:\n        return \"{}(in_channels={}, squeeze_factor={}, scale_fn={})\".format(\n            self.__class__.__name__,\n            self.in_channels,\n            self.squeeze_factor,\n            self.scale_fn,\n        )\n"
  },
  {
    "path": "corenet/modeling/modules/ssd_heads.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom typing import Optional, Tuple\n\nimport torch\nfrom torch import Tensor, nn\nfrom torchvision.ops.roi_align import RoIAlign\n\nfrom corenet.modeling.layers import ConvLayer2d, SeparableConv2d, TransposeConvLayer2d\nfrom corenet.modeling.misc.init_utils import initialize_conv_layer\nfrom corenet.modeling.modules import BaseModule\n\n\nclass SSDHead(BaseModule):\n    \"\"\"\n    This class defines the `SSD object detection Head <https://arxiv.org/abs/1512.02325>`_\n\n    Args:\n        opts: command-line arguments\n        in_channels (int): :math:`C` from an expected input of size :math:`(N, C, H, W)`\n        n_anchors (int): Number of anchors\n        n_classes (int): Number of classes in the dataset\n        n_coordinates (Optional[int]): Number of coordinates. Default: 4 (x, y, w, h)\n        proj_channels (Optional[int]): Number of projected channels. If `-1`, then projection layer is not used\n        kernel_size (Optional[int]): Kernel size in convolutional layer. If kernel_size=1, then standard\n            point-wise convolution is used. Otherwise, separable convolution is used\n        stride (Optional[int]): stride for feature map. If stride > 1, then feature map is sampled at this rate\n            and predictions are made on fewer pixels as compared to the input tensor. Default: 1\n    \"\"\"\n\n    def __init__(\n        self,\n        opts,\n        in_channels: int,\n        n_anchors: int,\n        n_classes: int,\n        n_coordinates: Optional[int] = 4,\n        proj_channels: Optional[int] = -1,\n        kernel_size: Optional[int] = 3,\n        stride: Optional[int] = 1,\n        *args,\n        **kwargs\n    ) -> None:\n        super().__init__()\n        proj_layer = None\n        self.proj_channels = None\n        if proj_channels != -1 and proj_channels != in_channels and kernel_size > 1:\n            proj_layer = ConvLayer2d(\n                opts=opts,\n                in_channels=in_channels,\n                out_channels=proj_channels,\n                kernel_size=1,\n                stride=1,\n                groups=1,\n                bias=False,\n                use_norm=True,\n                use_act=True,\n            )\n            in_channels = proj_channels\n            self.proj_channels = proj_channels\n\n        self.proj_layer = proj_layer\n\n        conv_fn = ConvLayer2d if kernel_size == 1 else SeparableConv2d\n        if kernel_size > 1 and stride > 1:\n            kernel_size = max(kernel_size, stride if stride % 2 != 0 else stride + 1)\n        self.loc_cls_layer = conv_fn(\n            opts=opts,\n            in_channels=in_channels,\n            out_channels=n_anchors * (n_coordinates + n_classes),\n            kernel_size=kernel_size,\n            stride=1,\n            groups=1,\n            bias=True,\n            use_norm=False,\n            use_act=False,\n        )\n\n        self.n_coordinates = n_coordinates\n        self.n_classes = n_classes\n        self.n_anchors = n_anchors\n        self.k_size = kernel_size\n        self.stride = stride\n        self.in_channel = in_channels\n\n        self.reset_parameters()\n\n    def __repr__(self) -> str:\n        repr_str = \"{}(in_channels={}, n_anchors={}, n_classes={}, n_coordinates={}, kernel_size={}, stride={}\".format(\n            self.__class__.__name__,\n            self.in_channel,\n            self.n_anchors,\n            self.n_classes,\n            self.n_coordinates,\n            self.k_size,\n            self.stride,\n        )\n        if self.proj_layer is not None:\n            repr_str += \", proj=True, proj_channels={}\".format(self.proj_channels)\n\n        repr_str += \")\"\n        return repr_str\n\n    def reset_parameters(self) -> None:\n        for layer in self.modules():\n            if isinstance(layer, nn.Conv2d):\n                initialize_conv_layer(module=layer, init_method=\"xavier_uniform\")\n\n    def _sample_fm(self, x: Tensor) -> Tensor:\n        height, width = x.shape[-2:]\n        device = x.device\n        start_step = max(0, self.stride // 2)\n        indices_h = torch.arange(\n            start=start_step,\n            end=height,\n            step=self.stride,\n            dtype=torch.int64,\n            device=device,\n        )\n        indices_w = torch.arange(\n            start=start_step,\n            end=width,\n            step=self.stride,\n            dtype=torch.int64,\n            device=device,\n        )\n\n        x_sampled = torch.index_select(x, dim=-1, index=indices_w)\n        x_sampled = torch.index_select(x_sampled, dim=-2, index=indices_h)\n        return x_sampled\n\n    def forward(self, x: Tensor, *args, **kwargs) -> Tuple[Tensor, Tensor]:\n        batch_size = x.shape[0]\n\n        if self.proj_layer is not None:\n            x = self.proj_layer(x)\n\n        # [B x C x H x W] --> [B x Anchors * (coordinates + classes) x H x W]\n        x = self.loc_cls_layer(x)\n\n        if self.stride > 1:\n            x = self._sample_fm(x)\n\n        # [B x Anchors * (coordinates + classes) x H x W] --> [B x H x W x Anchors * (coordinates + classes)]\n        x = x.permute(0, 2, 3, 1)\n        # [B x H x W x Anchors * (coordinates + classes)] --> [B x H*W*Anchors X (coordinates + classes)]\n        x = x.contiguous().view(batch_size, -1, self.n_coordinates + self.n_classes)\n\n        # [B x H*W*Anchors X (coordinates + classes)] --> [B x H*W*Anchors X coordinates], [B x H*W*Anchors X classes]\n        box_locations, box_classes = torch.split(\n            x, [self.n_coordinates, self.n_classes], dim=-1\n        )\n        return box_locations, box_classes\n\n\nclass SSDInstanceHead(BaseModule):\n    \"\"\"\n    Instance segmentation head for SSD model.\n    \"\"\"\n\n    def __init__(\n        self,\n        opts,\n        in_channels: int,\n        n_classes: Optional[int] = 1,\n        inner_dim: Optional[int] = 256,\n        output_stride: Optional[int] = 1,\n        output_size: Optional[int] = 8,\n        *args,\n        **kwargs\n    ) -> None:\n        \"\"\"\n\n        Args:\n            opts: command-line arguments\n            in_channels (int): :math:`C` from an expected input of size :math:`(N, C, H, W)`\n            n_classes (Optional[int]): Number of classes. Default: 1\n            inner_dim: (Optional[int]): Inner dimension of the instance head. Default: 256\n            output_stride (Optional[int]): Output stride of the feature map. Output stride is the ratio of input to\n                the feature map size. Default: 1\n            output_size (Optional[int]): Output size of the instances extracted from RoIAlign layer. Default: 8\n        \"\"\"\n        super().__init__()\n        self.roi_align = RoIAlign(\n            output_size=output_size,\n            spatial_scale=1.0 / output_stride,\n            sampling_ratio=2,\n            aligned=True,\n        )\n\n        self.seg_head = nn.Sequential(\n            TransposeConvLayer2d(\n                opts=opts,\n                in_channels=in_channels,\n                out_channels=inner_dim,\n                kernel_size=2,\n                stride=2,\n                bias=True,\n                use_norm=False,\n                use_act=True,\n                auto_padding=False,\n                padding=0,\n                output_padding=0,\n            ),\n            ConvLayer2d(\n                opts=opts,\n                in_channels=inner_dim,\n                out_channels=n_classes,\n                kernel_size=1,\n                stride=1,\n                use_norm=False,\n                use_act=False,\n                bias=True,\n            ),\n        )\n        self.inner_channels = inner_dim\n        self.in_channels = in_channels\n        self.mask_classes = n_classes\n        self.reset_parameters()\n\n    def __repr__(self) -> str:\n        return \"{}(in_channels={}, up_out_channels={}, n_classes={})\".format(\n            self.__class__.__name__,\n            self.in_channels,\n            self.inner_channels,\n            self.mask_classes,\n        )\n\n    def reset_parameters(self) -> None:\n        for layer in self.modules():\n            if isinstance(layer, (nn.Conv2d, nn.ConvTranspose2d)):\n                initialize_conv_layer(module=layer, init_method=\"kaiming_normal\")\n\n    def forward(self, x: Tensor, boxes: Tensor, *args, **kwargs) -> Tensor:\n        rois = self.roi_align(x, boxes)\n        rois = self.seg_head(rois)\n        return rois\n"
  },
  {
    "path": "corenet/modeling/modules/swin_transformer_block.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom typing import List, Optional\n\nimport torch\nfrom torch import Tensor, nn\nfrom torch.nn import functional as F\n\nfrom corenet.modeling.layers import (\n    Dropout,\n    LinearLayer,\n    StochasticDepth,\n    get_normalization_layer,\n)\nfrom corenet.modeling.layers.activation import build_activation_layer\nfrom corenet.modeling.modules import BaseModule\n\n\"\"\"\nMost of the functions and classes below are heavily borrowed from torchvision https://github.com/pytorch/vision\n\"\"\"\n\n\ndef _patch_merging_pad(x):\n    H, W, _ = x.shape[-3:]\n    x = F.pad(x, (0, 0, 0, W % 2, 0, H % 2))\n    return x\n\n\nclass Permute(BaseModule):\n    \"\"\"This module returns a view of the tensor input with its dimensions permuted.\n    Args:\n        dims (List[int]): The desired ordering of dimensions\n    \"\"\"\n\n    def __init__(self, dims: List[int]):\n        super().__init__()\n        self.dims = dims\n\n    def forward(self, x: Tensor) -> Tensor:\n        return torch.permute(x, self.dims)\n\n    def __repr__(self) -> str:\n        s = f\"{self.__class__.__name__}(dims={self.dims})\"\n        return s\n\n\nclass PatchMerging(BaseModule):\n    \"\"\"Patch Merging Layer.\n    Args:\n        dim (int): Number of input channels.\n        norm_layer (str): Normalization layer name.\n        strided (Optional[bool]): Down-sample the input by a factor of 2. Default is True.\n    \"\"\"\n\n    def __init__(self, opts, dim: int, norm_layer: str, strided: Optional[bool] = True):\n        super().__init__()\n        self.dim = dim\n        self.reduction = LinearLayer(\n            in_features=4 * dim, out_features=2 * dim, bias=False\n        )\n        self.norm = get_normalization_layer(\n            opts=opts, norm_type=norm_layer, num_features=4 * dim\n        )\n        self.strided = strided\n\n    def forward(self, x: Tensor, *args, **kwargs) -> Tensor:\n        \"\"\"\n        Args:\n            x (Tensor): input tensor with expected layout of [..., H, W, C]\n        Returns:\n            Tensor with layout of [..., H/2, W/2, 2*C]\n        \"\"\"\n        x = _patch_merging_pad(x)\n\n        if self.strided:\n            x0 = x[..., 0::2, 0::2, :]  # ... H/s W/s C\n            x1 = x[..., 1::2, 0::2, :]  # ... H/s W/s C\n            x2 = x[..., 0::2, 1::2, :]  # ... H/s W/s C\n            x3 = x[..., 1::2, 1::2, :]  # ... H/s W/s C\n            x = torch.cat([x0, x1, x2, x3], -1)  # ... H/s W/s 4*C\n        else:\n            x = torch.cat([x, x, x, x], -1)  # H W 4*C\n\n        x = self.norm(x)\n        x = self.reduction(x)  # ... H/2 W/2 2*C\n        return x\n\n    def __repr__(self) -> str:\n        s = f\"{self.__class__.__name__}(dim={self.dim})\"\n        return s\n\n\ndef shifted_window_attention(\n    input: Tensor,\n    qkv_weight: Tensor,\n    proj_weight: Tensor,\n    relative_position_bias: Tensor,\n    window_size: List[int],\n    num_heads: int,\n    shift_size: List[int],\n    attention_dropout: float = 0.0,\n    dropout: float = 0.0,\n    qkv_bias: Optional[Tensor] = None,\n    proj_bias: Optional[Tensor] = None,\n):\n    \"\"\"\n    Window based multi-head self attention (W-MSA) module with relative position bias.\n    It supports both of shifted and non-shifted window.\n    Args:\n        input (Tensor[N, H, W, C]): The input tensor or 4-dimensions.\n        qkv_weight (Tensor[in_dim, out_dim]): The weight tensor of query, key, value.\n        proj_weight (Tensor[out_dim, out_dim]): The weight tensor of projection.\n        relative_position_bias (Tensor): The learned relative position bias added to attention.\n        window_size (List[int]): Window size.\n        num_heads (int): Number of attention heads.\n        shift_size (List[int]): Shift size for shifted window attention.\n        attention_dropout (float): Dropout ratio of attention weight. Default: 0.0.\n        dropout (float): Dropout ratio of output. Default: 0.0.\n        qkv_bias (Tensor[out_dim], optional): The bias tensor of query, key, value. Default: None.\n        proj_bias (Tensor[out_dim], optional): The bias tensor of projection. Default: None.\n    Returns:\n        Tensor[N, H, W, C]: The output tensor after shifted window attention.\n    \"\"\"\n    B, H, W, C = input.shape\n    # pad feature maps to multiples of window size\n    pad_r = (window_size[1] - W % window_size[1]) % window_size[1]\n    pad_b = (window_size[0] - H % window_size[0]) % window_size[0]\n    x = F.pad(input, (0, 0, 0, pad_r, 0, pad_b))\n    _, pad_H, pad_W, _ = x.shape\n\n    shift_size = shift_size.copy()\n    # If window size is larger than feature size, there is no need to shift window\n    if window_size[0] >= pad_H:\n        shift_size[0] = 0\n    if window_size[1] >= pad_W:\n        shift_size[1] = 0\n\n    # cyclic shift\n    if sum(shift_size) > 0:\n        x = torch.roll(x, shifts=(-shift_size[0], -shift_size[1]), dims=(1, 2))\n\n    # partition windows\n    num_windows = (pad_H // window_size[0]) * (pad_W // window_size[1])\n    x = x.view(\n        B,\n        pad_H // window_size[0],\n        window_size[0],\n        pad_W // window_size[1],\n        window_size[1],\n        C,\n    )\n    x = x.permute(0, 1, 3, 2, 4, 5).reshape(\n        B * num_windows, window_size[0] * window_size[1], C\n    )  # B*nW, Ws*Ws, C\n\n    # multi-head attention\n    qkv = F.linear(x, qkv_weight, qkv_bias)\n    qkv = qkv.reshape(x.size(0), x.size(1), 3, num_heads, C // num_heads).permute(\n        2, 0, 3, 1, 4\n    )\n    q, k, v = qkv[0], qkv[1], qkv[2]\n    q = q * (C // num_heads) ** -0.5\n    attn = q.matmul(k.transpose(-2, -1))\n    # add relative position bias\n    attn = attn + relative_position_bias\n\n    if sum(shift_size) > 0:\n        # generate attention mask\n        attn_mask = x.new_zeros((pad_H, pad_W))\n        h_slices = (\n            (0, -window_size[0]),\n            (-window_size[0], -shift_size[0]),\n            (-shift_size[0], None),\n        )\n        w_slices = (\n            (0, -window_size[1]),\n            (-window_size[1], -shift_size[1]),\n            (-shift_size[1], None),\n        )\n        count = 0\n        for h in h_slices:\n            for w in w_slices:\n                attn_mask[h[0] : h[1], w[0] : w[1]] = count\n                count += 1\n        attn_mask = attn_mask.view(\n            pad_H // window_size[0],\n            window_size[0],\n            pad_W // window_size[1],\n            window_size[1],\n        )\n        attn_mask = attn_mask.permute(0, 2, 1, 3).reshape(\n            num_windows, window_size[0] * window_size[1]\n        )\n        attn_mask = attn_mask.unsqueeze(1) - attn_mask.unsqueeze(2)\n        attn_mask = attn_mask.masked_fill(attn_mask != 0, float(-100.0)).masked_fill(\n            attn_mask == 0, float(0.0)\n        )\n        attn = attn.view(\n            x.size(0) // num_windows, num_windows, num_heads, x.size(1), x.size(1)\n        )\n        attn = attn + attn_mask.unsqueeze(1).unsqueeze(0)\n        attn = attn.view(-1, num_heads, x.size(1), x.size(1))\n\n    attn = F.softmax(attn, dim=-1)\n    attn = F.dropout(attn, p=attention_dropout)\n\n    x = attn.matmul(v).transpose(1, 2).reshape(x.size(0), x.size(1), C)\n    x = F.linear(x, proj_weight, proj_bias)\n    x = F.dropout(x, p=dropout)\n\n    # reverse windows\n    x = x.view(\n        B,\n        pad_H // window_size[0],\n        pad_W // window_size[1],\n        window_size[0],\n        window_size[1],\n        C,\n    )\n    x = x.permute(0, 1, 3, 2, 4, 5).reshape(B, pad_H, pad_W, C)\n\n    # reverse cyclic shift\n    if sum(shift_size) > 0:\n        x = torch.roll(x, shifts=(shift_size[0], shift_size[1]), dims=(1, 2))\n\n    # unpad features\n    x = x[:, :H, :W, :].contiguous()\n    return x\n\n\nclass ShiftedWindowAttention(BaseModule):\n    \"\"\"\n    See :func:`shifted_window_attention`.\n    \"\"\"\n\n    def __init__(\n        self,\n        dim: int,\n        window_size: List[int],\n        shift_size: List[int],\n        num_heads: int,\n        qkv_bias: bool = True,\n        proj_bias: bool = True,\n        attention_dropout: float = 0.0,\n        dropout: float = 0.0,\n    ):\n        super().__init__()\n        if len(window_size) != 2 or len(shift_size) != 2:\n            raise ValueError(\"window_size and shift_size must be of length 2\")\n        self.window_size = window_size\n        self.shift_size = shift_size\n        self.num_heads = num_heads\n        self.attention_dropout = attention_dropout\n        self.dropout = dropout\n\n        self.qkv = nn.Linear(dim, dim * 3, bias=qkv_bias)\n        self.proj = nn.Linear(dim, dim, bias=proj_bias)\n\n        # define a parameter table of relative position bias\n        self.relative_position_bias_table = nn.Parameter(\n            torch.zeros((2 * window_size[0] - 1) * (2 * window_size[1] - 1), num_heads)\n        )  # 2*Wh-1 * 2*Ww-1, nH\n\n        # get pair-wise relative position index for each token inside the window\n        coords_h = torch.arange(self.window_size[0])\n        coords_w = torch.arange(self.window_size[1])\n        coords = torch.stack(\n            torch.meshgrid(coords_h, coords_w, indexing=\"ij\")\n        )  # 2, Wh, Ww\n        coords_flatten = torch.flatten(coords, 1)  # 2, Wh*Ww\n        relative_coords = (\n            coords_flatten[:, :, None] - coords_flatten[:, None, :]\n        )  # 2, Wh*Ww, Wh*Ww\n        relative_coords = relative_coords.permute(\n            1, 2, 0\n        ).contiguous()  # Wh*Ww, Wh*Ww, 2\n        relative_coords[:, :, 0] += self.window_size[0] - 1  # shift to start from 0\n        relative_coords[:, :, 1] += self.window_size[1] - 1\n        relative_coords[:, :, 0] *= 2 * self.window_size[1] - 1\n        relative_position_index = relative_coords.sum(-1).view(-1)  # Wh*Ww*Wh*Ww\n        self.register_buffer(\"relative_position_index\", relative_position_index)\n\n        nn.init.trunc_normal_(self.relative_position_bias_table, std=0.02)\n\n        self.embed_dim = dim\n\n    def __repr__(self) -> str:\n        return \"{}(embed_dim={}, window_size={}, shift_size={}, num_heads={}, dropout={}, attn_dropout={}, dropout={})\".format(\n            self.__class__.__name__,\n            self.embed_dim,\n            self.window_size,\n            self.shift_size,\n            self.num_heads,\n            self.attention_dropout,\n            self.dropout,\n        )\n\n    def forward(self, x: Tensor, *args, **kwargs) -> Tensor:\n        \"\"\"\n        Args:\n            x (Tensor): Tensor with layout of [B, H, W, C]\n        Returns:\n            Tensor with same layout as input, i.e. [B, H, W, C]\n        \"\"\"\n\n        N = self.window_size[0] * self.window_size[1]\n        relative_position_bias = self.relative_position_bias_table[self.relative_position_index]  # type: ignore[index]\n        relative_position_bias = relative_position_bias.view(N, N, -1)\n        relative_position_bias = (\n            relative_position_bias.permute(2, 0, 1).contiguous().unsqueeze(0)\n        )\n\n        return shifted_window_attention(\n            x,\n            self.qkv.weight,\n            self.proj.weight,\n            relative_position_bias,\n            self.window_size,\n            self.num_heads,\n            shift_size=self.shift_size,\n            attention_dropout=self.attention_dropout,\n            dropout=self.dropout,\n            qkv_bias=self.qkv.bias,\n            proj_bias=self.proj.bias,\n        )\n\n\nclass SwinTransformerBlock(BaseModule):\n    \"\"\"\n    Swin Transformer Block.\n    Args:\n        dim (int): Number of input channels.\n        num_heads (int): Number of attention heads.\n        window_size (List[int]): Window size.\n        shift_size (List[int]): Shift size for shifted window attention.\n        mlp_ratio (float): Ratio of mlp hidden dim to embedding dim. Default: 4.0.\n        dropout (float): Dropout rate. Default: 0.0.\n        attention_dropout (float): Attention dropout rate. Default: 0.0.\n        stochastic_depth_prob: (float): Stochastic depth rate. Default: 0.0.\n        norm_layer (nn.Module): Normalization layer.  Default: nn.LayerNorm.\n        attn_layer (nn.Module): Attention layer. Default: ShiftedWindowAttention\n    \"\"\"\n\n    def __init__(\n        self,\n        opts,\n        embed_dim: int,\n        num_heads: int,\n        window_size: List[int],\n        shift_size: List[int],\n        mlp_ratio: float = 4.0,\n        dropout: float = 0.0,\n        attn_dropout: Optional[float] = 0.0,\n        ffn_dropout: Optional[float] = 0.0,\n        stochastic_depth_prob: float = 0.0,\n        norm_layer: Optional[str] = \"layer_norm\",\n    ):\n        super().__init__()\n\n        attn_unit = ShiftedWindowAttention(\n            embed_dim,\n            window_size,\n            shift_size,\n            num_heads,\n            attention_dropout=attn_dropout,\n            dropout=dropout,\n        )\n        self.attn = nn.Sequential(\n            get_normalization_layer(\n                opts=opts, norm_type=norm_layer, num_features=embed_dim\n            ),\n            attn_unit,\n            Dropout(p=dropout),\n        )\n\n        self.stochastic_depth = StochasticDepth(stochastic_depth_prob, \"row\")\n        ffn_latent_dim = int(embed_dim * mlp_ratio)\n        act_name = build_activation_layer(opts, num_parameters=1)\n        self.mlp = nn.Sequential(\n            get_normalization_layer(\n                opts=opts, norm_type=norm_layer, num_features=embed_dim\n            ),\n            LinearLayer(in_features=embed_dim, out_features=ffn_latent_dim, bias=True),\n            act_name,\n            Dropout(p=ffn_dropout),\n            LinearLayer(in_features=ffn_latent_dim, out_features=embed_dim, bias=True),\n            Dropout(p=dropout),\n        )\n        self.embed_dim = embed_dim\n        self.ffn_dim = ffn_latent_dim\n        self.ffn_dropout = ffn_dropout\n        self.std_dropout = dropout\n        self.attn_fn_name = attn_unit.__class__.__name__\n        self.act_fn_name = act_name.__class__.__name__\n        self.norm_type = norm_layer\n\n    def __repr__(self) -> str:\n        return \"{}(embed_dim={}, ffn_dim={}, dropout={}, ffn_dropout={}, attn_fn={}, act_fn={}, norm_fn={})\".format(\n            self.__class__.__name__,\n            self.embed_dim,\n            self.ffn_dim,\n            self.std_dropout,\n            self.ffn_dropout,\n            self.attn_fn_name,\n            self.act_fn_name,\n            self.norm_type,\n        )\n\n    def forward(self, x: Tensor, *args, **kwargs) -> Tensor:\n        x = x + self.stochastic_depth(self.attn(x))\n        x = x + self.stochastic_depth(self.mlp(x))\n        return x\n"
  },
  {
    "path": "corenet/modeling/modules/transformer.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\nimport argparse\nfrom typing import Optional\n\nfrom torch import Tensor, nn\n\nfrom corenet.modeling.layers import (\n    ConvLayer2d,\n    Dropout,\n    Identity,\n    LinearLayer,\n    LinearSelfAttention,\n    MultiHeadAttention,\n    SingleHeadAttention,\n    StochasticDepth,\n    get_normalization_layer,\n)\nfrom corenet.modeling.layers.activation import build_activation_layer\nfrom corenet.modeling.modules import BaseModule\nfrom corenet.utils import logger\n\n\nclass TransformerEncoder(BaseModule):\n    \"\"\"\n    This class defines the pre-norm `Transformer encoder <https://arxiv.org/abs/1706.03762>`_\n    Args:\n        opts: Command line arguments.\n        embed_dim: :math:`C_{in}` from an expected input of size :math:`(N, P, C_{in})`.\n        ffn_latent_dim: Inner dimension of the FFN.\n        num_heads: Number of heads in multi-head attention. Default: 8.\n        attn_dropout: Dropout rate for attention in multi-head attention. Default: 0.0\n        dropout: Dropout rate. Default: 0.0.\n        ffn_dropout: Dropout between FFN layers. Default: 0.0.\n        transformer_norm_layer: Normalization layer. Default: layer_norm.\n        stochastic_dropout: Stochastic dropout setting. Default: 0.0.\n\n    Shape:\n        - Input: :math:`(N, P, C_{in})` where :math:`N` is batch size, :math:`P` is number of patches,\n        and :math:`C_{in}` is input embedding dim\n        - Output: same shape as the input\n    \"\"\"\n\n    def __init__(\n        self,\n        opts: argparse.Namespace,\n        embed_dim: int,\n        ffn_latent_dim: int,\n        num_heads: Optional[int] = 8,\n        attn_dropout: Optional[float] = 0.0,\n        dropout: Optional[float] = 0.0,\n        ffn_dropout: Optional[float] = 0.0,\n        transformer_norm_layer: Optional[str] = \"layer_norm\",\n        stochastic_dropout: Optional[float] = 0.0,\n        *args,\n        **kwargs,\n    ) -> None:\n\n        super().__init__()\n\n        attn_unit = SingleHeadAttention(\n            embed_dim=embed_dim, attn_dropout=attn_dropout, bias=True\n        )\n        if num_heads > 1:\n            attn_unit = MultiHeadAttention(\n                embed_dim,\n                num_heads,\n                attn_dropout=attn_dropout,\n                bias=True,\n                coreml_compatible=getattr(\n                    opts, \"common.enable_coreml_compatible_module\", False\n                ),\n            )\n\n        self.pre_norm_mha = nn.Sequential(\n            get_normalization_layer(\n                opts=opts, norm_type=transformer_norm_layer, num_features=embed_dim\n            ),\n            attn_unit,\n            Dropout(p=dropout),\n        )\n\n        act_name = build_activation_layer(opts, num_parameters=1)\n        self.pre_norm_ffn = nn.Sequential(\n            get_normalization_layer(\n                opts=opts, norm_type=transformer_norm_layer, num_features=embed_dim\n            ),\n            LinearLayer(in_features=embed_dim, out_features=ffn_latent_dim, bias=True),\n            act_name,\n            Dropout(p=ffn_dropout),\n            LinearLayer(in_features=ffn_latent_dim, out_features=embed_dim, bias=True),\n            Dropout(p=dropout),\n        )\n\n        self.drop_path = Identity()\n        if stochastic_dropout > 0.0:\n            if dropout > 0.0:\n                logger.error(\n                    \"Stochastic dropout and dropout are mutually exclusive. \"\n                    \"Use either of them, but not both.\"\n                    \"Got: {} and {}\".format(stochastic_dropout, dropout)\n                )\n            self.drop_path = StochasticDepth(p=stochastic_dropout, mode=\"row\")\n\n        self.embed_dim = embed_dim\n        self.ffn_dim = ffn_latent_dim\n        self.ffn_dropout = ffn_dropout\n        self.stochastic_dropout = stochastic_dropout\n        self.std_dropout = dropout\n        self.attn_fn_name = attn_unit.__class__.__name__\n        self.act_fn_name = act_name.__class__.__name__\n        self.norm_type = transformer_norm_layer\n\n    def __repr__(self) -> str:\n        return \"{}(embed_dim={}, ffn_dim={}, dropout={}, ffn_dropout={}, stochastic_dropout={}, attn_fn={}, act_fn={}, norm_fn={})\".format(\n            self.__class__.__name__,\n            self.embed_dim,\n            self.ffn_dim,\n            self.std_dropout,\n            self.ffn_dropout,\n            self.stochastic_dropout,\n            self.attn_fn_name,\n            self.act_fn_name,\n            self.norm_type,\n        )\n\n    def forward(\n        self,\n        x: Tensor,\n        x_prev: Optional[Tensor] = None,\n        key_padding_mask: Optional[Tensor] = None,\n        attn_mask: Optional[Tensor] = None,\n        *args,\n        **kwargs,\n    ) -> Tensor:\n\n        # Multi-head attention\n        res = x\n        x = self.pre_norm_mha[0](x)  # norm\n        x = self.pre_norm_mha[1](\n            x_q=x,\n            x_kv=x_prev,\n            key_padding_mask=key_padding_mask,\n            attn_mask=attn_mask,\n            *args,\n            **kwargs,\n        )  # mha\n\n        x = self.drop_path(self.pre_norm_mha[2](x))  # applying stochastic depth\n        x = x + res\n\n        # Feed forward network\n        x = x + self.drop_path(self.pre_norm_ffn(x))\n        return x\n\n\nclass LinearAttnFFN(BaseModule):\n    \"\"\"\n    This class defines the pre-norm transformer encoder with linear self-attention in `MobileViTv2 <https://arxiv.org/abs/2206.02680>`_ paper\n    Args:\n        opts: command line arguments\n        embed_dim (int): :math:`C_{in}` from an expected input of size :math:`(B, C_{in}, P, N)`\n        ffn_latent_dim (int): Inner dimension of the FFN\n        attn_dropout (Optional[float]): Dropout rate for attention in multi-head attention. Default: 0.0\n        dropout (Optional[float]): Dropout rate. Default: 0.0\n        ffn_dropout (Optional[float]): Dropout between FFN layers. Default: 0.0\n        norm_layer (Optional[str]): Normalization layer. Default: layer_norm_2d\n\n    Shape:\n        - Input: :math:`(B, C_{in}, P, N)` where :math:`B` is batch size, :math:`C_{in}` is input embedding dim,\n            :math:`P` is number of pixels in a patch, and :math:`N` is number of patches,\n        - Output: same shape as the input\n    \"\"\"\n\n    def __init__(\n        self,\n        opts,\n        embed_dim: int,\n        ffn_latent_dim: int,\n        attn_dropout: Optional[float] = 0.0,\n        dropout: Optional[float] = 0.1,\n        ffn_dropout: Optional[float] = 0.0,\n        norm_layer: Optional[str] = \"layer_norm_2d\",\n        *args,\n        **kwargs,\n    ) -> None:\n        super().__init__()\n        attn_unit = LinearSelfAttention(\n            opts, embed_dim=embed_dim, attn_dropout=attn_dropout, bias=True\n        )\n\n        self.pre_norm_attn = nn.Sequential(\n            get_normalization_layer(\n                opts=opts, norm_type=norm_layer, num_features=embed_dim\n            ),\n            attn_unit,\n            Dropout(p=dropout),\n        )\n\n        self.pre_norm_ffn = nn.Sequential(\n            get_normalization_layer(\n                opts=opts, norm_type=norm_layer, num_features=embed_dim\n            ),\n            ConvLayer2d(\n                opts=opts,\n                in_channels=embed_dim,\n                out_channels=ffn_latent_dim,\n                kernel_size=1,\n                stride=1,\n                bias=True,\n                use_norm=False,\n                use_act=True,\n            ),\n            Dropout(p=ffn_dropout),\n            ConvLayer2d(\n                opts=opts,\n                in_channels=ffn_latent_dim,\n                out_channels=embed_dim,\n                kernel_size=1,\n                stride=1,\n                bias=True,\n                use_norm=False,\n                use_act=False,\n            ),\n            Dropout(p=dropout),\n        )\n\n        self.embed_dim = embed_dim\n        self.ffn_dim = ffn_latent_dim\n        self.ffn_dropout = ffn_dropout\n        self.std_dropout = dropout\n        self.attn_fn_name = attn_unit.__repr__()\n        self.norm_name = norm_layer\n\n    def __repr__(self) -> str:\n        return \"{}(embed_dim={}, ffn_dim={}, dropout={}, ffn_dropout={}, attn_fn={}, norm_layer={})\".format(\n            self.__class__.__name__,\n            self.embed_dim,\n            self.ffn_dim,\n            self.std_dropout,\n            self.ffn_dropout,\n            self.attn_fn_name,\n            self.norm_name,\n        )\n\n    def forward(\n        self, x: Tensor, x_prev: Optional[Tensor] = None, *args, **kwargs\n    ) -> Tensor:\n        if x_prev is None:\n            # self-attention\n            x = x + self.pre_norm_attn(x)\n        else:\n            # cross-attention\n            res = x\n            x = self.pre_norm_attn[0](x)  # norm\n            x = self.pre_norm_attn[1](x, x_prev)  # attn\n            x = self.pre_norm_attn[2](x)  # drop\n            x = x + res  # residual\n\n        # Feed forward network\n        x = x + self.pre_norm_ffn(x)\n        return x\n"
  },
  {
    "path": "corenet/modeling/modules/windowed_transformer.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nfrom typing import Optional, Tuple\n\nimport torch\nfrom torch import Tensor\n\nfrom corenet.modeling.layers import token_merging\nfrom corenet.modeling.modules import transformer\n\n\ndef window_partition(t: torch.Tensor, window_size: int) -> torch.Tensor:\n    \"\"\"\n    Partition tensor @t into chunks of size @window_size.\n\n    @t's sequence length must be divisible by @window_size.\n\n    Args:\n        t: A tensor of shape [batch_size, sequence_length, embed_dim].\n        window_size: The desired window size.\n\n    Returns:\n        A tensor of shape [batch_size * sequence_length // window_size,\n        window_size, embed_dim].\n    \"\"\"\n    B, N, C = t.shape\n\n    if not N % window_size == 0:\n        raise ValueError(\n            f\"sequence length {N} must be divisible by window size {window_size}\"\n        )\n\n    t = t.reshape(B * N // window_size, window_size, C)\n    return t\n\n\ndef window_partition_reverse(\n    t: torch.Tensor, B: int, num_windows: int, C: int\n) -> torch.Tensor:\n    \"\"\"\n    Undo the @window_partition operation.\n\n    Args:\n        t: The input tensor of shape [batch_size * num_windows, window_size,\n            embed_dim].\n        B: The batch size.\n        num_windows: The number of windows.\n        C: The embedding dimension.\n\n    Returns:\n        A tensor of shape [batch_size, num_windows * window_size, embed_dim].\n    \"\"\"\n    t = t.reshape(B, num_windows * t.shape[1], C)\n    return t\n\n\ndef get_windows_shift_mask(\n    N: int, window_size: int, window_shift: int, device: torch.device\n) -> torch.Tensor:\n    \"\"\"\n    Get the mask window required due to window shifting (needed for shifted\n    window attention).\n\n    This produces a tensor with mask values for each window. Most windows don't\n    require masking, but windows that bleed across the beginning/end of the\n    tensor (due to shifting) require it.\n\n    Args:\n        N: The sequence length.\n        window_size: The window size.\n        window_shift: The window shift.\n        device: The device on which to create the tensor.\n\n    Returns:\n        A tensor of shape [N // window_size, window_size, window_size]\n        containing mask values. The values are 0 (unmasked) or float(\"-inf\")\n        (masked).\n    \"\"\"\n    ret = torch.zeros(N // window_size, window_size, window_size, device=device)\n    ret[-1].fill_(float(\"-inf\"))\n    ret[-1, : window_size - window_shift, : window_size - window_shift] = 0\n    ret[-1, -window_shift:, -window_shift:] = 0\n    return ret\n\n\ndef window_x_and_key_padding_mask(\n    x: torch.Tensor, key_padding_mask: torch.Tensor, window_size: int, window_shift: int\n) -> Tuple[torch.Tensor, torch.Tensor, torch.Tensor]:\n    \"\"\"\n    Perform windowing on @x and @key_padding_mask in preparation for windowed\n    attention.\n\n    Args:\n        x: The input tensor of shape [batch_size, sequence_length, num_channels].\n        key_padding_mask: The mask, as a tensor of shape [batch_size, sequence_length].\n        window_size: The window size to be used for windowed attention.\n        window_shift: The window shift to be used for windowed attention.\n\n    Returns:\n        A tuple containing 3 tensors. The first is the windowed input. The second\n        is the windowed mask. The third is the mask needed to perform shifted\n        window attention (to avoid the first and last windows from bleeding\n        into each other).\n    \"\"\"\n    B, N = key_padding_mask.shape\n    assert x.shape[:2] == (B, N)\n\n    x, key_padding_mask = token_merging.pad_x_and_mask(x, key_padding_mask, window_size)\n\n    # Now, perform the windowing.\n    if window_shift > 0:\n        x = torch.roll(x, shifts=(-window_shift), dims=1)\n        key_padding_mask = torch.roll(key_padding_mask, shifts=(-window_shift), dims=1)\n\n    x_windows = window_partition(x, window_size)\n    token_mask_windows = key_padding_mask.reshape(\n        B * x.shape[1] // window_size, window_size\n    )\n    window_mask = get_windows_shift_mask(\n        x.shape[1], window_size, window_shift, x_windows.device\n    ).expand(B, -1, -1, -1)\n    window_mask = window_mask.reshape(\n        window_mask.shape[0] * window_mask.shape[1],\n        window_mask.shape[2],\n        window_mask.shape[3],\n    )\n\n    return x_windows, token_mask_windows, window_mask\n\n\ndef unwindow_x(x_windows: torch.Tensor, B: int, N: int, C: int, window_shift: int):\n    \"\"\"\n    Undoes the operation of @window_x_and_attention on the input tensor @x_windows.\n\n    Args:\n        x_windows: The input tensor to unwindow. Its shape is [batch_size *\n              padded_sequence_length // window_size, window_size, embed_dim].\n        B: The batch size. Referred to as batch_size in this docstring.\n        N: The sequence length of the tensor before windowing. Referred to as\n            sequence_length in this docstring.\n        C: The number of channels. Referred to as embed_dim in this docstring.\n        window_shift: The shift applied to the sequence before the windowing\n            originally occurred.\n\n    Returns:\n        A tensor of shape [batch_size, sequence_length, embed_dim].\n    \"\"\"\n    num_windows = x_windows.shape[0] // B\n    x = window_partition_reverse(x_windows, B, num_windows, C)\n\n    if window_shift > 0:\n        x = torch.roll(x, shifts=window_shift, dims=1)\n    x = x[:, :N]\n\n    return x\n\n\nclass WindowedTransformerEncoder(transformer.TransformerEncoder):\n    \"\"\"\n    This class defines the pre-norm `Transformer encoder <https://arxiv.org/abs/1706.03762>`_\n    with the addition of windowed attention.\n\n    This class first partitions the input sequence into a series of windows (with\n    an optional offset to use when defining windows). Then, it calls a\n    TransformerEncoder module. Then, it undoes windowing.\n\n    Args:\n        opts: Command line arguments.\n        embed_dim: :math:`C_{in}` from an expected input of size :math:`(N, P, C_{in})`.\n        ffn_latent_dim: Inner dimension of the FFN.\n        num_heads: Number of heads in multi-head attention. Default: 8.\n        attn_dropout: Dropout rate for attention in multi-head attention. Default: 0.0.\n        dropout: Dropout rate. Default: 0.0.\n        ffn_dropout: Dropout between FFN layers. Default: 0.0.\n        transformer_norm_layer: Normalization layer. Default: layer_norm.\n        stochastic_dropout: Stochastic dropout setting. Default: 0.0.\n        window_size: The size of the window, if using windowed attention. Default: None.\n        window_shift: The size of the shift, if using shifted windowed attention. Default: None.\n\n    Shape:\n        - Input: :math:`(N, P, C_{in})` where :math:`N` is batch size, :math:`P` is number of patches,\n        and :math:`C_{in}` is input embedding dim\n        - Output: same shape as the input\n    \"\"\"\n\n    def __init__(\n        self,\n        opts: argparse.Namespace,\n        embed_dim: int,\n        ffn_latent_dim: int,\n        num_heads: Optional[int] = 8,\n        attn_dropout: Optional[float] = 0.0,\n        dropout: Optional[float] = 0.0,\n        ffn_dropout: Optional[float] = 0.0,\n        transformer_norm_layer: Optional[str] = \"layer_norm\",\n        stochastic_dropout: Optional[float] = 0.0,\n        window_size: Optional[int] = None,\n        window_shift: Optional[int] = None,\n        *args,\n        **kwargs,\n    ) -> None:\n        super().__init__(\n            opts=opts,\n            embed_dim=embed_dim,\n            ffn_latent_dim=ffn_latent_dim,\n            num_heads=num_heads,\n            attn_dropout=attn_dropout,\n            dropout=dropout,\n            ffn_dropout=ffn_dropout,\n            transformer_norm_layer=transformer_norm_layer,\n            stochastic_dropout=stochastic_dropout,\n        )\n        if window_size is None:\n            raise ValueError(\"Please specify window_size\")\n        if window_shift is None:\n            raise ValueError(\"Please specify window_shift\")\n        self.window_size: int = window_size\n        self.window_shift: int = window_shift\n\n    def forward(\n        self,\n        x: Tensor,\n        x_prev: Optional[Tensor] = None,\n        key_padding_mask: Optional[Tensor] = None,\n        attn_mask: Optional[Tensor] = None,\n        *args,\n        **kwargs,\n    ) -> Tensor:\n        \"\"\"\n        Compute the outputs of the WindowedTransformerEncoder on an input.\n\n        Args:\n            x: The input tensor, of shape [batch_size, sequence_length, embed_dim].\n            x_prev: The context input, if using cross-attention. Its shape is\n                [batch_size, sequence_length_2, embed_dim].\n            key_padding_mask: An optional tensor of masks to be applied to the\n                inputs @x. Its shape is [batch_size, sequence_length].\n            attn_mask: An optional attention mask. Its shape is [batch_size,\n                sequence_length, sequence_length_2]. (If using self-attention,\n                the sequence lengths will be equal.)\n\n        Returns:\n            The WindowedTransformerEncoder output.\n        \"\"\"\n        B, N, C = x.shape\n        x, windowed_key_padding_mask, windows_mask = window_x_and_key_padding_mask(\n            x, key_padding_mask, self.window_size, self.window_shift\n        )\n        total_mask = windowed_key_padding_mask.unsqueeze(1) + windows_mask\n\n        if attn_mask is not None:\n            total_mask += attn_mask\n\n        # If an entire window is masked out, attention is computed across\n        # only -inf values, which gives NaN. We instead set these masks to\n        # 0 to avoid this.\n        fully_masked_windows = total_mask.max(dim=-1).values == float(\"-inf\")\n        total_mask[fully_masked_windows] = 0\n\n        x = super().forward(x, x_prev, attn_mask=attn_mask)\n\n        # Undo windowing.\n        x = unwindow_x(x, B, N, C, self.window_shift)\n        return x\n\n    def __repr__(self) -> str:\n        # Remove closing parentheses from parent __repr__ call.\n        ret = super().__repr__()[:-1]\n        return f\"{ret}, {self.window_size}, {self.window_shift})\"\n"
  },
  {
    "path": "corenet/modeling/neural_augmentor/__init__.py",
    "content": "# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\n\nfrom corenet.modeling.neural_augmentor.neural_aug import (\n    BaseNeuralAugmentor,\n    build_neural_augmentor,\n)\n\n\ndef arguments_neural_augmentor(\n    parser: argparse.ArgumentParser,\n) -> argparse.ArgumentParser:\n    return BaseNeuralAugmentor.add_arguments(parser=parser)\n"
  },
  {
    "path": "corenet/modeling/neural_augmentor/neural_aug.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nimport random\nfrom typing import List, Optional\n\nimport torch\nfrom torch import Tensor, nn\n\nfrom corenet.modeling.misc.common import parameter_list\nfrom corenet.modeling.neural_augmentor.utils.neural_aug_utils import (\n    Clip,\n    FixedSampler,\n    UniformSampler,\n    random_brightness,\n    random_contrast,\n    random_noise,\n)\nfrom corenet.utils import logger\n\n_distribution_tuple = (UniformSampler,)\n\n\nclass BaseNeuralAugmentor(nn.Module):\n    \"\"\"\n    Base class for `neural (or range) augmentation <https://arxiv.org/abs/2212.10553>`_\n    \"\"\"\n\n    def __init__(self, opts, *args, **kwargs):\n        super().__init__()\n        self.opts = opts\n\n        self.lr_multiplier = getattr(\n            opts, \"model.learn_augmentation.lr_multiplier\", 1.0\n        )\n\n        # Set variables corresponding to different transforms to None.\n        # We will override them in child classes with learnable versions\n        self.brightness = None\n        self.contrast = None\n        self.noise = None\n\n        self.aug_fns = []\n\n    def _is_valid_aug_fn_list(self, aug_fns):\n        if self.training:\n            if len(aug_fns) == 0:\n                logger.error(\n                    \"{} needs at least one learnable function.\".format(\n                        self.__class__.__name__\n                    )\n                )\n\n    def get_trainable_parameters(\n        self,\n        weight_decay: Optional[float] = 0.0,\n        no_decay_bn_filter_bias: Optional[bool] = False,\n        *args,\n        **kwargs\n    ):\n        \"\"\"Get trainable parameters\"\"\"\n        param_list = parameter_list(\n            named_parameters=self.named_parameters,\n            weight_decay=weight_decay,\n            no_decay_bn_filter_bias=no_decay_bn_filter_bias,\n        )\n        return param_list, [self.lr_multiplier] * len(param_list)\n\n    def __repr__(self):\n        aug_str = \"{}(\".format(self.__class__.__name__)\n\n        if self.brightness is not None:\n            aug_str += \"\\n\\tBrightness={}, \".format(\n                self.brightness.data.shape\n                if isinstance(self.brightness, nn.Parameter)\n                else self.brightness\n            )\n\n        if self.contrast is not None:\n            aug_str += \"\\n\\tContrast={}, \".format(\n                self.contrast.data.shape\n                if isinstance(self.contrast, nn.Parameter)\n                else self.contrast\n            )\n\n        if self.noise is not None:\n            aug_str += \"\\n\\tNoise={}, \".format(\n                self.noise.data.shape\n                if isinstance(self.noise, nn.Parameter)\n                else self.noise\n            )\n\n        aug_str += self.extra_repr()\n        aug_str += \")\"\n        return aug_str\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser):\n        \"\"\"Add model-specific arguments\"\"\"\n        group = parser.add_argument_group(title=cls.__name__)\n\n        group.add_argument(\n            \"--model.learn-augmentation.mode\",\n            type=str,\n            default=None,\n            choices=[\"basic\", \"distribution\"],\n            help=\"Neural augmentation mode\",\n        )\n\n        group.add_argument(\n            \"--model.learn-augmentation.brightness\",\n            action=\"store_true\",\n            help=\"Learn parameters for brightness\",\n        )\n\n        group.add_argument(\n            \"--model.learn-augmentation.contrast\",\n            action=\"store_true\",\n            help=\"Learn parameters for contrast\",\n        )\n\n        group.add_argument(\n            \"--model.learn-augmentation.noise\",\n            action=\"store_true\",\n            help=\"Learn parameters for noise\",\n        )\n\n        # LR multiplier\n        group.add_argument(\n            \"--model.learn-augmentation.lr-multiplier\",\n            type=float,\n            default=1.0,\n            help=\"LR multiplier for neural aug parameters\",\n        )\n\n        return parser\n\n    def _build_aug_fns(self, opts) -> List:\n        raise NotImplementedError\n\n    def _apply_brightness(self, x: Tensor, *args, **kwargs) -> Tensor:\n        \"\"\"\n        Apply brightness augmentation function with learnable parameters.\n        \"\"\"\n        # self._check_brightness_bounds()\n        x_shape = [*x.shape]\n        x_shape[1:] = [1] * (len(x_shape) - 1)\n        if isinstance(self.brightness, nn.Parameter):\n            # learning a fixed number of parameters\n            magnitude = self.brightness\n        elif isinstance(self.brightness, _distribution_tuple):\n            # learning a distribution range from which parameter is sampled.\n            magnitude = self.brightness(x_shape, device=x.device, data_type=x.dtype)\n        else:\n            raise NotImplementedError\n        return random_brightness(x, magnitude, *args, **kwargs)\n\n    def _apply_contrast(self, x: Tensor, *args, **kwargs) -> Tensor:\n        \"\"\"\n        Apply contrast augmentation function with learnable parameters.\n        \"\"\"\n        # self._check_contrast_bounds()\n        x_shape = [*x.shape]\n        x_shape[1:] = [1] * (len(x_shape) - 1)\n\n        if isinstance(self.contrast, nn.Parameter):\n            # learning a fixed number of parameters\n            magnitude = self.contrast\n        elif isinstance(self.contrast, _distribution_tuple):\n            # learning a distribution range from which parameter is sampled.\n            magnitude = self.contrast(x_shape, device=x.device, data_type=x.dtype)\n        else:\n            raise NotImplementedError\n        return random_contrast(x, magnitude, *args, *kwargs)\n\n    def _apply_noise(self, x: Tensor, *args, **kwargs) -> Tensor:\n        # self._check_noise_bounds()\n        x_shape = [*x.shape]\n        x_shape[1:] = [1] * (len(x_shape) - 1)\n\n        if isinstance(self.noise, nn.Parameter):\n            # learning a fixed number of parameters\n            variance = self.noise\n        elif isinstance(self.noise, _distribution_tuple):\n            # learning a distribution range from which parameter is sampled.\n            variance = self.noise(x_shape, device=x.device, data_type=x.dtype)\n        else:\n            raise NotImplementedError\n        return random_noise(x, variance, *args, *kwargs)\n\n    def forward(self, x: Tensor, *args, **kwargs) -> Tensor:\n        batch_size, in_channels, in_height, in_width = x.shape\n\n        # Randomly apply augmentation to 50% of the samples\n        n_aug_samples = max(1, (batch_size // 2))\n\n        # shuffle the order of augmentations\n        random.shuffle(self.aug_fns)\n\n        for aug_fn in self.aug_fns:\n            # select 50% samples for augmentation\n            sample_ids = torch.randperm(\n                n=batch_size, dtype=torch.long, device=x.device\n            )[:n_aug_samples]\n            x_aug = torch.index_select(x, dim=0, index=sample_ids)\n            # apply augmentation\n            x_aug = aug_fn(x=x_aug)\n            # copy augmented samples to tensor\n            x = torch.index_copy(x, dim=0, source=x_aug, index=sample_ids)\n\n        # clip the values so that they are between 0 and 1\n        x = torch.clip(x, min=0.0, max=1.0)\n        return x\n\n\nclass BasicNeuralAugmentor(BaseNeuralAugmentor):\n    \"\"\"\n    Basic neural augmentation. This class learns per-channel augmentation parameters\n    and apply the same parameter to all images in a batch.\n\n    See `neural (or range) augmentation <https://arxiv.org/abs/2212.10553>`_ paper for details.\n    \"\"\"\n\n    def __init__(self, opts, *args, **kwargs) -> None:\n        super().__init__(opts=opts, *args, **kwargs)\n        aug_fns = self._build_aug_fns(opts=opts)\n\n        self._is_valid_aug_fn_list(aug_fns)\n\n        self.aug_fns = aug_fns\n\n    def _build_aug_fns(self, opts) -> List:\n        aug_fns = []\n        if getattr(opts, \"model.learn_augmentation.brightness\", False):\n            self.brightness = FixedSampler(\n                value=1.0, clip_fn=Clip(min_val=0.1, max_val=10.0)\n            )\n            aug_fns.append(self._apply_brightness)\n\n        if getattr(opts, \"model.learn_augmentation.contrast\", False):\n            self.contrast = FixedSampler(\n                value=1.0, clip_fn=Clip(min_val=0.1, max_val=10.0)\n            )\n            aug_fns.append(self._apply_contrast)\n\n        if getattr(opts, \"model.learn_augmentation.noise\", False):\n            self.noise = FixedSampler(value=0.0, clip_fn=Clip(min_val=0.0, max_val=1.0))\n            aug_fns.append(self._apply_noise)\n\n        return aug_fns\n\n\nclass DistributionNeuralAugmentor(BaseNeuralAugmentor):\n    \"\"\"\n    Distribution-based neural (or range) augmentation. This class samples the augmentation parameters\n    from a specified distribution with learnable range.\n\n    See `neural (or range) augmentation <https://arxiv.org/abs/2212.10553>`_ paper for details.\n    \"\"\"\n\n    def __init__(self, opts, *args, **kwargs) -> None:\n        super().__init__(opts=opts, *args, **kwargs)\n\n        aug_fns = self._build_aug_fns_with_uniform_dist(opts=opts)\n        self._is_valid_aug_fn_list(aug_fns)\n        self.aug_fns = aug_fns\n\n    def _build_aug_fns_with_uniform_dist(self, opts) -> List:\n        # need to define the learnable parameters in a way that are compatible with bucketing\n        aug_fns = []\n        if getattr(opts, \"model.learn_augmentation.brightness\", False):\n            self.brightness = UniformSampler(\n                low=0.5,\n                high=1.5,\n                min_fn=Clip(min_val=0.1, max_val=0.9),\n                max_fn=Clip(min_val=1.1, max_val=10.0),\n            )\n            aug_fns.append(self._apply_brightness)\n\n        if getattr(opts, \"model.learn_augmentation.contrast\", False):\n            self.contrast = UniformSampler(\n                low=0.5,\n                high=1.5,\n                min_fn=Clip(min_val=0.1, max_val=0.9),\n                max_fn=Clip(min_val=1.1, max_val=10.0),\n            )\n            aug_fns.append(self._apply_contrast)\n\n        if getattr(opts, \"model.learn_augmentation.noise\", False):\n            self.noise = UniformSampler(\n                low=0.0,\n                high=0.1,\n                min_fn=Clip(min_val=0.0, max_val=0.00005),\n                max_fn=Clip(min_val=0.0001, max_val=1.0),\n            )\n            aug_fns.append(self._apply_noise)\n\n        return aug_fns\n\n\ndef build_neural_augmentor(opts, *args, **kwargs):\n    mode = getattr(opts, \"model.learn_augmentation.mode\", None)\n\n    if mode is None:\n        mode = \"none\"\n\n    mode = mode.lower()\n    if mode == \"distribution\":\n        return DistributionNeuralAugmentor(opts=opts, *args, **kwargs)\n    elif mode == \"basic\":\n        return BasicNeuralAugmentor(opts=opts, *args, **kwargs)\n    else:\n        return None\n"
  },
  {
    "path": "corenet/modeling/neural_augmentor/utils/__init__.py",
    "content": ""
  },
  {
    "path": "corenet/modeling/neural_augmentor/utils/neural_aug_utils.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom typing import Any, Optional\n\nimport torch\nfrom torch import Tensor, nn\n\n\nclass Clip(nn.Module):\n    def __init__(\n        self,\n        min_val: float,\n        max_val: float,\n        hard_clip: Optional[bool] = False,\n        *args,\n        **kwargs,\n    ) -> None:\n        super().__init__()\n        self.min_val = min_val\n        self.max_val = max_val\n        self.hard_clip = hard_clip\n\n    def forward(self, x: Any) -> Any:\n        if self.hard_clip:\n            with torch.no_grad():\n                return x.clamp_(min=self.min_val, max=self.max_val)\n        else:\n            return (torch.sigmoid(x) * (self.max_val - self.min_val)) + self.min_val\n\n    def __repr__(self):\n        return \"{}(min={}, max={}, clipping={})\".format(\n            self.__class__.__name__,\n            self.min_val,\n            self.max_val,\n            \"hard\" if self.hard_clip else \"soft\",\n        )\n\n\nclass Identity(nn.Module):\n    def __init__(self, *args, **kwargs):\n        super().__init__()\n\n    def forward(self, x: Any) -> Any:\n        return x\n\n\nclass FixedSampler(nn.Module):\n    def __init__(\n        self,\n        value: float,\n        clip_fn: Optional[nn.Module] = Identity(),\n        *args,\n        **kwargs,\n    ):\n        super().__init__()\n        self._value = nn.Parameter(torch.FloatTensor(1, 3, 1, 1).fill_(value))\n        self.clip_fn = clip_fn\n\n    def forward(\n        self, sample_shape=(), data_type=torch.float, device=torch.device(\"cpu\")\n    ) -> Tensor:\n        # sample values from uniform distribution\n        return self.clip_fn(self._value)\n\n    def __repr__(self):\n        return \"{}(clip_fn={})\".format(\n            self.__class__.__name__,\n            self.clip_fn,\n        )\n\n\nclass UniformSampler(nn.Module):\n    def __init__(\n        self,\n        low: float,\n        high: float,\n        min_fn: Optional[nn.Module] = Identity(),\n        max_fn: Optional[nn.Module] = Identity(),\n        *args,\n        **kwargs,\n    ):\n        super().__init__()\n        self._low = nn.Parameter(torch.tensor(low, dtype=torch.float))\n        self._high = nn.Parameter(torch.tensor(high, dtype=torch.float))\n        self.min_fn = min_fn\n        self.max_fn = max_fn\n\n    def forward(\n        self, sample_shape=(), data_type=torch.float, device=torch.device(\"cpu\")\n    ) -> Tensor:\n        # sample values from uniform distribution\n        rand_tensor = torch.rand(sample_shape, dtype=data_type, device=device)\n        return self.low + rand_tensor * (self.high - self.low)\n\n    @property\n    def high(self):\n        return self.max_fn(self._high)\n\n    @property\n    def low(self):\n        return self.min_fn(self._low)\n\n    def __repr__(self):\n        return \"{}(min_fn={}, max_fn={})\".format(\n            self.__class__.__name__,\n            self.min_fn,\n            self.max_fn,\n        )\n\n\ndef random_noise(x: Tensor, variance: Tensor, *args, **kwargs) -> Tensor:\n    \"\"\"Apply random noise sampled.\"\"\"\n    noise = torch.randn_like(x) * variance\n    x = x + noise\n    return x\n\n\ndef random_contrast(x: Tensor, magnitude: Tensor, *args, **kwargs) -> Tensor:\n    # compute per-channel mean\n    per_channel_mean = torch.mean(x, dim=[-1, -2], keepdim=True)\n\n    # contrast can be written as\n    # (1 - contrast_factor) * per_channel_mean + img * contrast_factor\n    x = ((1.0 - magnitude) * per_channel_mean) + (x * magnitude)\n    return x\n\n\ndef random_brightness(x: Tensor, magnitude: Tensor, *args, **kwargs) -> Tensor:\n    \"\"\"\n    Brightness function.\n    \"\"\"\n    x = x * magnitude\n    return x\n\n\ndef identity(x: Tensor, *args, **kwargs) -> Tensor:\n    \"\"\"Identity function\"\"\"\n    return x\n"
  },
  {
    "path": "corenet/modeling/text_encoders/__init__.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\n\nfrom corenet.modeling.text_encoders.base_text_encoder import BaseTextEncoder\nfrom corenet.utils import logger\nfrom corenet.utils.registry import Registry\n\nTEXT_ENCODER_REGISTRY = Registry(\n    \"text_encoder\",\n    base_class=BaseTextEncoder,\n    lazy_load_dirs=[\"corenet/modeling/text_encoders\"],\n    internal_dirs=[\"corenet/internal\", \"corenet/internal/projects/*\"],\n)\n\n\ndef arguments_text_encoder(parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n    \"\"\"Register arguments of all text encoders.\"\"\"\n    # add arguments for text_encoder\n    parser = BaseTextEncoder.add_arguments(parser)\n\n    # add class specific arguments\n    parser = TEXT_ENCODER_REGISTRY.all_arguments(parser)\n    return parser\n\n\ndef build_text_encoder(opts, projection_dim: int, *args, **kwargs) -> BaseTextEncoder:\n    \"\"\"Helper function to build the text encoder from command-line arguments.\n\n    Args:\n        opts: Command-line arguments\n        projection_dim: The dimensionality of the projection head after text encoder.\n\n    Returns:\n        Text encoder module.\n    \"\"\"\n    text_encoder_name = getattr(opts, \"model.text.name\")\n\n    # We registered the base class using a special `name` (i.e., `__base__`)\n    # in order to access the arguments defined inside those classes. However, these classes are not supposed to\n    # be used. Therefore, we raise an error for such cases\n    if text_encoder_name == \"__base__\":\n        logger.error(\"__base__ can't be used as a projection name. Please check.\")\n\n    text_encoder = TEXT_ENCODER_REGISTRY[text_encoder_name](\n        opts, projection_dim, *args, **kwargs\n    )\n    return text_encoder\n"
  },
  {
    "path": "corenet/modeling/text_encoders/base_text_encoder.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nfrom typing import Any, Callable, Dict, Optional\n\nimport torch\nfrom torch import Tensor, nn\n\nfrom corenet.modeling import parameter_list\nfrom corenet.modeling.layers import norm_layers_tuple\nfrom corenet.modeling.misc.init_utils import initialize_weights\nfrom corenet.utils.ddp_utils import is_master\n\n\nclass BaseTextEncoder(nn.Module):\n    \"\"\"Base class for text encoder\"\"\"\n\n    def __init__(self, opts, projection_dim: int, *args, **kwargs) -> None:\n        is_master_node = is_master(opts)\n        super(BaseTextEncoder, self).__init__()\n        self.opts = opts\n        self.projection_dim = projection_dim\n        self.is_master_node = is_master_node\n\n    @property\n    def vocab_size(self):\n        vocab_size = getattr(self.opts, \"model.text.vocab_size\")\n        assert (\n            vocab_size is not None\n        ), \"Vocab size can't be None. Please specify 'model.text.vocab_size' argument.\"\n        return vocab_size\n\n    @property\n    def context_length(self):\n        context_length = getattr(self.opts, \"model.text.context_length\")\n        assert (\n            context_length is not None\n        ), \"Context length can't be None. Please specify 'model.text.context_length' argument.\"\n        return context_length\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        \"\"\"Add model specific arguments\"\"\"\n        if cls == BaseTextEncoder:\n            group = parser.add_argument_group(title=cls.__name__)\n\n            group.add_argument(\n                \"--model.text.name\",\n                type=str,\n                default=None,\n                help=\"Name of the text encoder\",\n            )\n            group.add_argument(\n                \"--model.text.padding-index\",\n                default=None,\n                type=int,\n                help=\"Padding index. Defaults to None.\",\n            )\n\n            group.add_argument(\n                \"--model.text.context-length\",\n                default=None,\n                type=int,\n                help=\"Context length. Defaults to None.\",\n            )\n            group.add_argument(\n                \"--model.text.vocab-size\",\n                default=None,\n                type=int,\n                help=\"Vocabulary size. Defaults to None.\",\n            )\n\n        return parser\n\n    @property\n    def padding_index(self) -> int:\n        \"\"\"Padding index.\"\"\"\n        pad_index = getattr(self.opts, \"model.text.padding_index\")\n        assert (\n            pad_index is None or pad_index > -1\n        ), \"Padding index should be None or a non-negative number.\"\n        return pad_index\n\n    def reset_parameters(self):\n        \"\"\"Initialize model weights\"\"\"\n        initialize_weights(opts=self.opts, modules=self.modules())\n\n    def get_trainable_parameters(\n        self,\n        weight_decay: Optional[float] = 0.0,\n        no_decay_bn_filter_bias: Optional[bool] = False,\n        *args,\n        **kwargs\n    ):\n\n        param_list = parameter_list(\n            named_parameters=self.named_parameters,\n            weight_decay=weight_decay,\n            no_decay_bn_filter_bias=no_decay_bn_filter_bias,\n            *args,\n            **kwargs\n        )\n        return param_list, [1.0] * len(param_list)\n\n    def freeze_norm_layers(self) -> None:\n        for m in self.modules():\n            if isinstance(m, norm_layers_tuple):\n                m.eval()\n                m.weight.requires_grad = False\n                m.bias.requires_grad = False\n                m.training = False\n\n    def forward(\n        self,\n        text_tokens: Tensor,\n        key_padding_mask: Optional[Tensor] = None,\n        attn_mask: Optional[Tensor] = None,\n        *args,\n        **kwargs\n    ) -> Any:\n        raise NotImplementedError\n\n    def dummy_input_and_label(self, batch_size: int) -> Dict:\n        \"\"\"Create dummy input and labels for CI/CD purposes. Child classes must override it\n        if functionality is different.\n        \"\"\"\n        seq_length = 77\n        vocab_size = 10\n        text_tensor = torch.randint(\n            low=0, high=vocab_size, size=(batch_size, seq_length)\n        ).long()\n        return {\"text\": text_tensor}\n\n    def get_activation_checkpoint_submodule_class(self) -> Callable:\n        \"\"\"Returns model's submodule that needs to be checkpointed.\n\n        Activations of checkpointed module are stored, and recomputed during the backward pass,\n        thus providing a trade-off between memory and compute.\n        \"\"\"\n        raise NotImplementedError(\"Activation checkpoint module is not implemented.\")\n"
  },
  {
    "path": "corenet/modeling/text_encoders/transformer.py",
    "content": "# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nimport math\nfrom typing import Callable, Optional, Sequence\n\nimport torch\nfrom torch import Tensor, nn\nfrom torch.nn import functional as F\n\nfrom corenet.modeling.layers import (\n    Dropout,\n    Embedding,\n    PositionalEmbedding,\n    get_normalization_layer,\n)\nfrom corenet.modeling.modules import TransformerEncoder\nfrom corenet.modeling.text_encoders import TEXT_ENCODER_REGISTRY, BaseTextEncoder\nfrom corenet.utils import logger\n\n\n@TEXT_ENCODER_REGISTRY.register(name=\"transformer\")\nclass TextTransformer(BaseTextEncoder):\n    \"\"\"Transformer-based text encoder.\n\n    Args:\n        opts: Command-line arguments.\n        projection_dim: Projection dimension.\n    \"\"\"\n\n    def __init__(self, opts, projection_dim: int, *args, **kwargs) -> None:\n        model_dim = getattr(opts, \"model.text.transformer.model_dim\")\n        no_scale_embedding = getattr(opts, \"model.text.transformer.no_scale_embedding\")\n        no_pos_embedding = getattr(opts, \"model.text.transformer.no_pos_embedding\")\n        embed_dropout = getattr(opts, \"model.text.transformer.embed_dropout\")\n        dropout = getattr(opts, \"model.text.transformer.dropout\")\n        attn_dropout = getattr(opts, \"model.text.transformer.attn_dropout\")\n        ffn_dropout = getattr(opts, \"model.text.transformer.ffn_dropout\")\n        norm_layer = getattr(opts, \"model.text.transformer.norm_layer\")\n\n        if norm_layer is None:\n            logger.error(\n                \"Normalization layer can not be None in {}\".format(\n                    self.__class__.__name__\n                )\n            )\n\n        super().__init__(opts=opts, projection_dim=projection_dim, *args, **kwargs)\n\n        # token embedding layer\n        self.embedding_layer = Embedding(\n            opts=opts,\n            embedding_dim=model_dim,\n            padding_idx=self.padding_index,\n            num_embeddings=self.vocab_size,\n        )\n        self.embed_scale = 1.0 if no_scale_embedding else model_dim**-0.5\n\n        self.positional_embedding = (\n            None\n            if no_pos_embedding\n            else PositionalEmbedding(\n                opts=opts,\n                num_embeddings=self.context_length,\n                embedding_dim=model_dim,\n                padding_idx=self.padding_index,\n                is_learnable=not getattr(\n                    opts, \"model.text.transformer.sinusoidal_pos_emb\"\n                ),\n            )\n        )\n\n        self.embedding_dropout = Dropout(p=embed_dropout)\n\n        n_transformer_layers = getattr(\n            opts, \"model.text.transformer.n_transformer_layers\"\n        )\n        # FFN multipliers for transformer layer\n        ffn_multipliers = getattr(\n            opts, \"model.text.transformer.ffn_multiplier_per_layer\"\n        )\n        if isinstance(ffn_multipliers, (float, int)):\n            ffn_multipliers = [ffn_multipliers] * n_transformer_layers\n\n        if not isinstance(ffn_multipliers, Sequence):\n            logger.error(\n                \"{} expects FFN multipliers as a list, whose length is the same as number of \"\n                \"transformer layers. Got: {}\".format(\n                    self.__class__.__name__, type(ffn_multipliers)\n                )\n            )\n        elif (\n            isinstance(ffn_multipliers, Sequence)\n            and len(ffn_multipliers) != n_transformer_layers\n        ):\n            logger.error(\n                \"We need FFN multiplier for each transformer layer. Got {} ffn multipliers while number of \"\n                \"transformer layers = {}\".format(\n                    len(ffn_multipliers), n_transformer_layers\n                )\n            )\n        ffn_dims = [\n            int(math.ceil(model_dim * ffn_mult / 16.0) * 16.0)\n            for ffn_mult in ffn_multipliers\n        ]\n\n        # Heads for transformer layers\n        mha_heads = getattr(opts, \"model.text.transformer.n_heads_per_layer\")\n        if isinstance(mha_heads, int):\n            mha_heads = [mha_heads] * n_transformer_layers\n\n        if not isinstance(mha_heads, Sequence):\n            logger.error(\n                \"{} expects MHA heads as a list, whose length is the same as number of \"\n                \"transformer layers. Got: {}\".format(\n                    self.__class__.__name__, type(mha_heads)\n                )\n            )\n        elif isinstance(mha_heads, Sequence) and len(mha_heads) != n_transformer_layers:\n            logger.error(\n                \"{} needs MHA heads for each transformer layer. Got {} mha heads while number of \"\n                \"transformer layers = {}\".format(\n                    self.__class__.__name__, len(mha_heads), n_transformer_layers\n                )\n            )\n\n        self.transformer = nn.ModuleList(\n            [\n                TransformerEncoder(\n                    opts=opts,\n                    embed_dim=model_dim,\n                    num_heads=mha_heads[layer_idx],\n                    ffn_latent_dim=ffn_dims[layer_idx],\n                    attn_dropout=attn_dropout,\n                    ffn_dropout=ffn_dropout,\n                    dropout=dropout,\n                    transformer_norm_layer=norm_layer,\n                )\n                for layer_idx in range(n_transformer_layers)\n            ]\n        )\n        self.final_layer_norm = get_normalization_layer(\n            opts, num_features=model_dim, norm_type=norm_layer\n        )\n\n        self.projection_layer = nn.Parameter(\n            torch.empty(model_dim, self.projection_dim)\n        )\n        self.model_dim = model_dim\n        self.reset_parameters_clip_style()\n\n        self.classes_per_split_zero_shot = max(\n            1, int(getattr(opts, \"model.text.transformer.classes_per_split_zero_shot\"))\n        )\n        self.cached_attn_mask = None\n\n    def build_causal_attention_mask(\n        self,\n        context_length: int,\n        batch_size: int,\n        device: torch.device,\n        dtype: torch.dtype,\n    ) -> Optional[Tensor]:\n        \"\"\"Builds the causal attention mask.\n\n        Args:\n            context_length: Context length.\n            batch_size: Batch size.\n            device: Device on which mask should be created.\n            dtype: Data type of the mask.\n\n        Returns:\n            An output tensor of the [batch size, context length, context length] if causal masking is enabled\n            using 'model.text.transformer.causal_masking'. Otherwise, None is returned.\n        \"\"\"\n        if getattr(self.opts, \"model.text.transformer.causal_masking\"):\n            if self.cached_attn_mask is None:\n                assert context_length <= self.context_length\n                mask = torch.empty(\n                    self.context_length, self.context_length, device=device, dtype=dtype\n                )\n                mask.fill_(float(\"-inf\"))\n                mask.triu_(1)\n                self.cached_attn_mask = mask\n            mask = self.cached_attn_mask[:context_length, :context_length]\n            # add a dummy batch dimension and repeat it.\n            mask = mask.unsqueeze(0)\n            mask = mask.expand(batch_size, -1, -1)\n            return mask.to(device=device, dtype=dtype)\n        return None\n\n    def reset_parameters_clip_style(self) -> None:\n        \"\"\"This function resets the weights of Transformer model as done in the CLIP paper\"\"\"\n\n        # reset the weights of the embedding and positional embedding layers\n        nn.init.normal_(self.embedding_layer.weight, mean=0.0, std=0.02)\n\n        # compute standard deviation for different linear layers in transformer model\n        attn_std = self.model_dim**-0.5\n        proj_std = attn_std * ((2 * len(self.transformer)) ** -0.5)\n        fc_std = (2 * self.model_dim) ** -0.5\n\n        for block in self.transformer:\n            # multi-head attention QKV projection layer\n            nn.init.normal_(\n                block.pre_norm_mha[1].qkv_proj.weight, mean=0.0, std=attn_std\n            )\n            # multi-head attention output projection layer\n            nn.init.normal_(\n                block.pre_norm_mha[1].out_proj.weight, mean=0.0, std=proj_std\n            )\n            # FFN expansion layer\n            nn.init.normal_(block.pre_norm_ffn[1].weight, mean=0.0, std=fc_std)\n            # FFN reduction layer\n            nn.init.normal_(block.pre_norm_ffn[4].weight, mean=0.0, std=proj_std)\n\n        nn.init.normal_(self.projection_layer, mean=0.0, std=attn_std)\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        if cls != TextTransformer:\n            return parser\n        group = parser.add_argument_group(title=cls.__name__)\n        group.add_argument(\n            \"--model.text.transformer.model-dim\",\n            type=int,\n            default=512,\n            help=\"Model dimension of the transformer model\",\n        )\n\n        group.add_argument(\n            \"--model.text.transformer.no-scale-embedding\",\n            action=\"store_true\",\n            help=\"Do not scale the output of embedding layer in {}\".format(\n                cls.__name__\n            ),\n        )\n\n        group.add_argument(\n            \"--model.text.transformer.no-pos-embedding\",\n            action=\"store_true\",\n            help=\"Do not add positional embeddings to the output of embedding layer in {}\".format(\n                cls.__name__\n            ),\n        )\n\n        group.add_argument(\n            \"--model.text.transformer.embed-dropout\",\n            type=float,\n            default=0.0,\n            help=\"Dropout in embedding layer\",\n        )\n\n        # transformer layer parameters\n        default_layers = 6\n        group.add_argument(\n            \"--model.text.transformer.n-transformer-layers\",\n            type=int,\n            default=default_layers,\n            help=\"Number of transformer layers in {}\".format(cls.__name__),\n        )\n        group.add_argument(\n            \"--model.text.transformer.n-heads-per-layer\",\n            type=int,\n            default=[8] * default_layers,\n            nargs=\"+\",\n            help=\"Number of transformer heads per transformer layer\",\n        )\n\n        group.add_argument(\n            \"--model.text.transformer.ffn-multiplier-per-layer\",\n            type=float,\n            default=[4.0] * default_layers,\n            nargs=\"+\",\n            help=\"FFN multiplier for each transformer layer\",\n        )\n        group.add_argument(\n            \"--model.text.transformer.attn-dropout\",\n            type=float,\n            default=0.0,\n            help=\"Dropout in multi-head attention\",\n        )\n        group.add_argument(\n            \"--model.text.transformer.ffn-dropout\",\n            type=float,\n            default=0.0,\n            help=\"Dropout between linear layers in FFN\",\n        )\n        group.add_argument(\n            \"--model.text.transformer.dropout\",\n            type=float,\n            default=0.0,\n            help=\"Dropout in transformer\",\n        )\n\n        group.add_argument(\n            \"--model.text.transformer.norm-layer\",\n            type=str,\n            default=\"layer_norm\",\n            help=\"Normalization layer\",\n        )\n\n        group.add_argument(\n            \"--model.text.transformer.sinusoidal-pos-emb\",\n            action=\"store_true\",\n            help=\"Use sinusoidal positional embedding\",\n        )\n\n        group.add_argument(\n            \"--model.text.transformer.causal-masking\",\n            action=\"store_true\",\n            help=\"Use causal masking\",\n        )\n\n        group.add_argument(\n            \"--model.text.transformer.classes-per-split-zero-shot\",\n            type=int,\n            default=20,\n            help=\"Divide zero-shot classes into these many chunks, for faster processing\",\n        )\n\n        return parser\n\n    def forward_embedding(self, text_tokens: Tensor) -> Tensor:\n        \"\"\"Converts the token indexes into vectors.\n\n        Args:\n            text_tokens: A tensor containing token indices. The shape  of the\n                tensor is [batch, sequence length].\n\n        Returns:\n            An output tensor whose shape is [batch, sequence length, hidden dimension].\n        \"\"\"\n        token_emb = self.embedding_layer(text_tokens)\n        seq_len = token_emb.shape[1]\n        if self.positional_embedding is not None:\n            token_emb = token_emb + self.positional_embedding(seq_len).to(\n                token_emb.dtype\n            )\n        token_emb = self.embedding_dropout(token_emb)\n        return token_emb\n\n    def encode_text(\n        self,\n        text_tokens: Tensor,\n        key_padding_mask: Optional[Tensor] = None,\n        return_all_tokens: bool = False,\n    ) -> Tensor:\n        \"\"\"\n        Returns token embeddings.\n\n        Args:\n            text_tokens: A tensor containing token indices. The shape of tensor is\n                [batch size, sequence length].\n            key_padding_mask: A boolean tensor indicating padding token indices.\n            return_all_tokens: A boolean flag to return all tokens. Defaults to False\n                to return end-of-text embedding.\n\n        Returns:\n            A tensor of shape [batch size, sequence length, hidden dimension] if 'return_all_tokens'\n            is True. Otherwise, a tensor containing end-of-text token embedding is returned. The shape\n            is [batch size, sequence length].\n        \"\"\"\n        token_emb = self.forward_embedding(text_tokens)\n\n        attn_mask = self.build_causal_attention_mask(\n            context_length=text_tokens.shape[1],\n            batch_size=text_tokens.shape[0],\n            device=token_emb.device,\n            dtype=token_emb.dtype,\n        )\n\n        for layer in self.transformer:\n            token_emb = layer(\n                token_emb,\n                key_padding_mask=key_padding_mask,\n                attn_mask=attn_mask,\n            )\n\n        token_emb = self.final_layer_norm(token_emb)\n\n        if return_all_tokens:\n            return token_emb\n        else:\n            # return the token embedding corresponding to end-of-text token.\n            token_emb = token_emb[\n                torch.arange(text_tokens.shape[0]), text_tokens.argmax(dim=-1)\n            ]\n            token_emb = token_emb @ self.projection_layer\n            token_emb = F.normalize(token_emb, dim=-1)\n            return token_emb\n\n    def forward_zero_shot(\n        self,\n        text_tokens: Tensor,\n        key_padding_mask: Optional[Tensor] = None,\n    ) -> Tensor:\n        \"\"\"Forward function for computing text features for zero-shot image classification.\n\n        Args:\n            text_tokens: A tensor containing token indices. The shape of tensor is\n                [batch size, number of classes, number of captions, sequence length].\n            key_padding_mask: A boolean tensor indicating padding token indices.\n\n        Returns:\n            A tensor of shape [number of classes, sequence length].\n        \"\"\"\n        if self.training:\n            raise NotImplementedError(\n                \"Zero-shot evaluation is only supported with eval mode\"\n            )\n\n        if text_tokens.ndim != 4:\n            logger.error(\n                f\"For zero-shot evaluation, expected a 4D tensor whose shape is [batch size, number of classes, number of captions, sequence length]. Got: {text_tokens.shape}.\"\n            )\n\n        batch_size, num_classes, num_captions, context_len = text_tokens.shape\n\n        if batch_size > 1:\n            text_tokens = text_tokens[0:1]\n            batch_size = 1\n            logger.warning(\n                \"For zero-shot evaluation, text templates are the same across all images in the batch.\"\n                \"Got: {}. Please consider adjusting collate function.\".format(\n                    batch_size\n                )\n            )\n\n        text_features = []\n\n        # The input 4D tensor could be very large and lead to out of memory issues. As an example,\n        # the ImageNet dataset has 1000 classes and 80 captions per class. Processing such a large tensor\n        # is very expensive. For efficiency, we split the tensor along the class dimension\n        # and then compute features.\n        for start_idx in range(0, num_classes, self.classes_per_split_zero_shot):\n            end_idx = min(start_idx + self.classes_per_split_zero_shot, num_classes)\n\n            text_tokens_split = text_tokens[0, start_idx:end_idx, ...]\n            num_classes_split = text_tokens_split.shape[0]\n            text_tokens_split = text_tokens_split.reshape(\n                num_classes_split * num_captions, context_len\n            )\n\n            key_padding_mask_split = None\n            if key_padding_mask is not None:\n                key_padding_mask_split = key_padding_mask[0, start_idx:end_idx, ...]\n                key_padding_mask_split = key_padding_mask_split.reshape(\n                    num_classes_split * num_captions, context_len\n                )\n\n            # [num_classes_per_split * num_captions, sequence_length] --> [num_classes_per_split * num_captions, hidden_dim]\n            class_embedding_split = self.encode_text(\n                text_tokens=text_tokens_split, key_padding_mask=key_padding_mask_split\n            )\n\n            # [num_classes_per_split * num_captions, hidden_dim] --> [num_classes_per_split, num_captions, hidden_dim]\n            class_embedding_split = class_embedding_split.reshape(\n                num_classes_split, num_captions, class_embedding_split.shape[-1]\n            )\n\n            # Compute mean of all captions for a given class.\n            # [num_classes_per_split, num_captions, hidden_dim] --> [num_classes_per_split, hidden_dim]\n            mean_class_embedding_split = class_embedding_split.mean(dim=1)\n\n            # Normalize the embeddings\n            mean_class_embedding_split = F.normalize(mean_class_embedding_split, dim=-1)\n\n            text_features.append(mean_class_embedding_split)\n\n        # [num_classes_per_split, hidden_dim] * num_splits --> [num_classes, hidden_dim]\n        text_features = torch.cat(text_features, dim=0)\n        # [num_classes, hidden_dim] --> [hidden_dim, num_classes]\n        text_features = text_features.transpose(0, 1)\n        return text_features.contiguous()\n\n    def forward(\n        self,\n        text_tokens: Tensor,\n        key_padding_mask: Optional[Tensor] = None,\n        return_all_tokens: bool = False,\n    ) -> Tensor:\n        \"\"\"Forward function for text encoder.\n\n        Args:\n            text_tokens: A tensor containing token indices. The shape of tensor could be:\n                1. [batch size, sequence length] -> This input size typically corresponds to\n                    pre-training tasks (e.g., Image-Text pretraining in CLIP).\n                2. [batch size, number of classes, number of captions, sequence length] -> This input size\n                    typically corresponds to zero-shot image classification tasks.\n                3. [batch size, number of captions, sequence length] -> This input size typically corresponds\n                    to captioning tasks.\n            key_padding_mask: A boolean tensor indicating padding token indices.\n            return_all_tokens: A boolean flag to return all tokens.\n\n        Returns:\n            An output tensor. The shape of the output tensor is one of the following:\n            1. When input tensor is 4D, then the shape of the output is [hidden_dim, number of classes].\n            2. When input tensor is 2D, then the shape of the output is [batch size, hidden dim]. If 'return_all_tokens' is\n                enabled, then shape of the output is [batch size, sequence length, hidden dim].\n            3. When input tensor is 3D, then the shape of the output is [batch size, number of captions, hidden dim].\n                If 'return_all_tokens' is enabled, then shape of the output is [batch size, number of captions, sequence length, hidden dim].\n        \"\"\"\n\n        if text_tokens.dim() == 4:\n            # Example use case is zero-shot image-classification evaluation\n            return self.forward_zero_shot(\n                text_tokens=text_tokens,\n                key_padding_mask=key_padding_mask,\n            )\n        elif text_tokens.dim() == 2:\n            # Example use case is image-text pre-training where each image\n            # has single caption.\n            text_tokens = self.encode_text(\n                text_tokens=text_tokens,\n                key_padding_mask=key_padding_mask,\n                return_all_tokens=return_all_tokens,\n            )\n            return text_tokens\n        elif text_tokens.dim() == 3:\n            # Example use case is image-text pre-training where each image\n            # has multiple captions.\n            batch_size, num_captions, _ = text_tokens.shape\n            text_tokens = text_tokens.reshape(batch_size * num_captions, -1)\n            if key_padding_mask:\n                key_padding_mask = key_padding_mask.reshape(\n                    batch_size * num_captions, -1\n                )\n            text_tokens = self.encode_text(\n                text_tokens=text_tokens,\n                key_padding_mask=key_padding_mask,\n                return_all_tokens=return_all_tokens,\n            )\n            text_tokens = text_tokens.reshape(batch_size, num_captions, -1)\n            return text_tokens\n        else:\n            raise NotImplementedError(\n                f\"Only 2-, 3-, and 4-D tensors are supported. Got: {text_tokens.dim()}-D tensor.\"\n            )\n\n    def get_activation_checkpoint_submodule_class(self) -> Callable:\n        \"\"\"Returns TextTransformer's submodule, TransformerEncoder, class needs to be checkpointed.\"\"\"\n        return TransformerEncoder\n"
  },
  {
    "path": "corenet/optims/__init__.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nfrom typing import Any, Dict, List\n\nimport torch.nn\n\nfrom corenet.optims.base_optim import BaseOptim\nfrom corenet.utils import logger\nfrom corenet.utils.common_utils import unwrap_model_fn\nfrom corenet.utils.registry import Registry\n\nOPTIM_REGISTRY = Registry(\n    registry_name=\"optimizer_registry\",\n    base_class=BaseOptim,\n    lazy_load_dirs=[\"corenet/optims\"],\n    internal_dirs=[\"corenet/internal\", \"corenet/internal/projects/*\"],\n)\n\n\ndef check_trainable_parameters(\n    model: torch.nn.Module, model_params: List[Dict[str, Any]]\n) -> None:\n    \"\"\"Helper function to check if any model parameters w/ gradients are not part of model_params.\n\n    'get_trainable_parameters' is a custom function. However, there may be instances where not all parameters\n    are passed to the optimizer, potentially causing training instabilities and yielding undesired results.\n    This function compares the named parameters obtained with 'get_trainable_parameters' with\n    PyTorch's function 'model.named_parameters()'. This helps mitigate potential issues during the training phase.\n\n    Args:\n        model: An instance of torch.nn.Module.\n        model_params: Model parameters computed using 'get_trainable_parameters' function.\n    \"\"\"\n\n    # get model parameter names\n    model_trainable_params = []\n\n    # Activation checkpointing, enabled using --model.activation-checkpointing, adds a\n    # prefix '_checkpoint_wrapped_module' to sub-module name.\n    # If prefix is present in the parameter name, remove it\n    act_ckpt_wrapped_module_name = \"._checkpoint_wrapped_module\"\n    for p_name, param in model.named_parameters():\n        if param.requires_grad:\n            p_name = p_name.replace(act_ckpt_wrapped_module_name, \"\")\n            model_trainable_params.append(p_name)\n\n    initialized_params = []\n    for param_info in model_params:\n        if not isinstance(param_info, Dict):\n            logger.error(\n                \"Expected format is a Dict with three keys: params, weight_decay, param_names\"\n            )\n\n        if not {\"params\", \"weight_decay\", \"param_names\"}.issubset(param_info.keys()):\n            logger.error(\n                \"Parameter dict should have three keys: params, weight_decay, param_names\"\n            )\n\n        param_names = param_info[\"param_names\"]\n        if isinstance(param_names, List):\n            param_names = [\n                param_name.replace(act_ckpt_wrapped_module_name, \"\")\n                for param_name in param_names\n            ]\n            initialized_params.extend(param_names)\n        elif isinstance(param_names, str):\n            param_names = param_names.replace(act_ckpt_wrapped_module_name, \"\")\n            initialized_params.append(param_names)\n        else:\n            raise NotImplementedError\n\n    uninitialized_params = set(model_trainable_params) ^ set(initialized_params)\n    if len(uninitialized_params) > 0:\n        logger.error(\n            \"Following parameters are defined in the model, but won't be part of optimizer. \"\n            \"Please check get_trainable_parameters function. \"\n            \"Use --optim.bypass-parameters-check flag to bypass this check. \"\n            \"Parameter list = {}\".format(uninitialized_params)\n        )\n\n\ndef remove_param_name_key(model_params: List) -> None:\n    \"\"\"Helper function to remove param_names key from model_params.\n\n    Optimizer only takes params and weight decay as keys. However, 'get_trainable_parameters' return three keys:\n    (1) params, (2) weight_decay and (3) param_names. The 'param_names' key is used for sanity checking in\n    'check_trainable_parameters' function, and is removed inside this function so that model_params can be passed\n    to optimzier.\n\n    Args:\n        model_params: A list of dictionaries, where each dictionary element is expected to have\n            three keys: (1) params: an instance of torch.nn.Parameter, (2) weight decay, and (3) param_names.\n\n    ...note:\n        This function should be called after 'check_trainable_parameters' function.\n    \"\"\"\n    for param_info in model_params:\n        if not isinstance(param_info, Dict):\n            logger.error(\n                \"Expected format is a Dict with three keys: params, weight_decay, param_names\"\n            )\n\n        if not {\"params\", \"weight_decay\", \"param_names\"}.issubset(param_info.keys()):\n            logger.error(\n                \"Parameter dict should have three keys: params, weight_decay, param_names\"\n            )\n\n        param_info.pop(\"param_names\")\n\n\ndef build_optimizer(model: torch.nn.Module, opts, *args, **kwargs) -> BaseOptim:\n    \"\"\"Helper function to build an optimizer\n\n    Args:\n        model: A model\n        opts: command-line arguments\n\n    Returns:\n        An instance of BaseOptim\n    \"\"\"\n    optim_name = getattr(opts, \"optim.name\")\n    weight_decay = getattr(opts, \"optim.weight_decay\")\n    no_decay_bn_filter_bias = getattr(opts, \"optim.no_decay_bn_filter_bias\")\n\n    unwrapped_model = unwrap_model_fn(model)\n\n    model_params, lr_mult = unwrapped_model.get_trainable_parameters(\n        weight_decay=weight_decay,\n        no_decay_bn_filter_bias=no_decay_bn_filter_bias,\n        *args,\n        **kwargs\n    )\n\n    # check to ensure that all trainable model parameters are passed to the model\n    if not getattr(opts, \"optim.bypass_parameters_check\", False):\n        check_trainable_parameters(model=unwrapped_model, model_params=model_params)\n\n    remove_param_name_key(model_params=model_params)\n\n    # set the learning rate multiplier for each parameter\n    setattr(opts, \"optim.lr_multipliers\", lr_mult)\n\n    return OPTIM_REGISTRY[optim_name](opts, model_params, *args, **kwargs)\n\n\ndef arguments_optimizer(parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n    parser = BaseOptim.add_arguments(parser)\n    parser = OPTIM_REGISTRY.all_arguments(parser)\n    return parser\n"
  },
  {
    "path": "corenet/optims/adam.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nfrom typing import Dict, Iterable, Union\n\nfrom torch import Tensor\nfrom torch.optim import Adam\n\nfrom corenet.optims import OPTIM_REGISTRY\nfrom corenet.optims.base_optim import BaseOptim\n\n\n@OPTIM_REGISTRY.register(name=\"adam\")\nclass AdamOptimizer(BaseOptim, Adam):\n    \"\"\"\n    `Adam <https://arxiv.org/abs/1412.6980>`_ optimizer\n\n    Args:\n        opts: Command-line arguments\n        model_params: Model parameters\n    \"\"\"\n\n    def __init__(\n        self,\n        opts: argparse.Namespace,\n        model_params: Iterable[Union[Tensor, Dict]],\n        *args,\n        **kwargs\n    ) -> None:\n        BaseOptim.__init__(self, opts=opts)\n        beta1 = getattr(opts, \"optim.adam.beta1\")\n        beta2 = getattr(opts, \"optim.adam.beta2\")\n        ams_grad = getattr(opts, \"optim.adam.amsgrad\")\n        eps = getattr(opts, \"optim.adam.eps\", None)\n        Adam.__init__(\n            self,\n            params=model_params,\n            lr=self.lr,\n            betas=(beta1, beta2),\n            eps=self.eps if eps is None else eps,\n            weight_decay=self.weight_decay,\n            amsgrad=ams_grad,\n        )\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        \"\"\"Add arguments for ADAM optimizer\"\"\"\n        if cls != AdamOptimizer:\n            # Don't re-register arguments in subclasses that don't override `add_arguments()`.\n            return parser\n        group = parser.add_argument_group(cls.__name__)\n        group.add_argument(\n            \"--optim.adam.beta1\",\n            type=float,\n            default=0.9,\n            help=\"Value of Beta1 in ADAM optimizer. Defaults to 0.9.\",\n        )\n        group.add_argument(\n            \"--optim.adam.beta2\",\n            type=float,\n            default=0.98,\n            help=\"Value of Beta2 in ADAM optimizer. Defaults to 0.98.\",\n        )\n        group.add_argument(\n            \"--optim.adam.amsgrad\",\n            action=\"store_true\",\n            default=False,\n            help=\"Use AMSGrad in ADAM. Defaults to False.\",\n        )\n        group.add_argument(\n            \"--optim.adam.eps\",\n            type=float,\n            default=None,\n            help=\"Value of epsilon in Adam optimizer. Defaults to None.\"\n            \"When this value is None, the default value in base optimizer is used.\",\n        )\n        return parser\n"
  },
  {
    "path": "corenet/optims/adamw.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nfrom typing import Dict, Iterable, Union\n\nfrom torch import Tensor\nfrom torch.optim import AdamW\n\nfrom corenet.optims import OPTIM_REGISTRY\nfrom corenet.optims.base_optim import BaseOptim\n\n\n@OPTIM_REGISTRY.register(name=\"adamw\")\nclass AdamWOptimizer(BaseOptim, AdamW):\n    \"\"\"\n    `AdamW <https://arxiv.org/abs/1711.05101>`_ optimizer\n\n    Args:\n        opts: Command-line arguments\n        model_params: Model parameters\n    \"\"\"\n\n    def __init__(\n        self,\n        opts: argparse.Namespace,\n        model_params: Iterable[Union[Tensor, Dict]],\n        *args,\n        **kwargs\n    ) -> None:\n        BaseOptim.__init__(self, opts=opts)\n        beta1 = getattr(opts, \"optim.adamw.beta1\")\n        beta2 = getattr(opts, \"optim.adamw.beta2\")\n        ams_grad = getattr(opts, \"optim.adamw.amsgrad\")\n        eps = getattr(opts, \"optim.adamw.eps\", None)\n        AdamW.__init__(\n            self,\n            params=model_params,\n            lr=self.lr,\n            betas=(beta1, beta2),\n            eps=self.eps if eps is None else eps,\n            weight_decay=self.weight_decay,\n            amsgrad=ams_grad,\n        )\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        \"\"\"Add arguments for AdamW optimizer\"\"\"\n        if cls != AdamWOptimizer:\n            # Don't re-register arguments in subclasses that don't override `add_arguments()`.\n            return parser\n        group = parser.add_argument_group(cls.__name__)\n        group.add_argument(\n            \"--optim.adamw.beta1\",\n            type=float,\n            default=0.9,\n            help=\"Value of Beta1 in AdamW optimizer. Defaults to 0.9.\",\n        )\n        group.add_argument(\n            \"--optim.adamw.beta2\",\n            type=float,\n            default=0.98,\n            help=\"Value of Beta2 in AdamW optimizer. Defaults to 0.98.\",\n        )\n        group.add_argument(\n            \"--optim.adamw.amsgrad\",\n            action=\"store_true\",\n            default=False,\n            help=\"Use AMSGrad in AdamW. Defaults to False.\",\n        )\n        group.add_argument(\n            \"--optim.adamw.eps\",\n            type=float,\n            default=None,\n            help=\"Value of epsilon in AdamW optimizer. Defaults to None.\"\n            \"When this value is None, the default value in base optimizer is used.\",\n        )\n        return parser\n"
  },
  {
    "path": "corenet/optims/base_optim.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\n\nfrom corenet.utils import logger\n\n\nclass BaseOptim(object):\n    \"\"\"Base class for optimizer\n\n    Args:\n        opts: Command-line arguments\n    \"\"\"\n\n    def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None:\n        self.eps = 1e-8\n        self.lr = getattr(opts, \"scheduler.lr\")\n        self.weight_decay = getattr(opts, \"optim.weight_decay\")\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        \"\"\"Add optimizer arguments\"\"\"\n        if cls != BaseOptim:\n            # Don't re-register arguments in subclasses that don't override `add_arguments()`.\n            return parser\n\n        group = parser.add_argument_group(cls.__name__)\n        group.add_argument(\n            \"--optim.name\",\n            type=str,\n            default=\"sgd\",\n            help=\"Name of the optimizer. Defaults to SGD.\",\n        )\n        group.add_argument(\n            \"--optim.eps\",\n            type=float,\n            default=1e-8,\n            help=\"Optimizer epsilon value. Defaults to 1.e-8.\",\n        )\n        group.add_argument(\n            \"--optim.weight-decay\",\n            default=4e-5,\n            type=float,\n            help=\"Weight decay (or L2 penalty). Defaults to 4.e-5.\",\n        )\n        group.add_argument(\n            \"--optim.no-decay-bn-filter-bias\",\n            action=\"store_true\",\n            default=False,\n            help=\"When enabled, the weight in normalization layers and biases in the model are not decayed.\"\n            \"Defaults to False.\",\n        )\n        group.add_argument(\n            \"--optim.bypass-parameters-check\",\n            action=\"store_true\",\n            default=False,\n            help=\"Bypass parameter check when creating optimizer. Defaults to False\",\n        )\n        return parser\n\n    def __repr__(self) -> str:\n        group_dict = dict()\n        for i, group in enumerate(self.param_groups):\n            for key in sorted(group.keys()):\n                if key == \"params\":\n                    continue\n                if key not in group_dict:\n                    group_dict[key] = [group[key]]\n                else:\n                    group_dict[key].append(group[key])\n\n        format_string = self.__class__.__name__ + \" (\"\n        format_string += \"\\n\"\n        for k, v in group_dict.items():\n            format_string += \"\\t {0}: {1}\\n\".format(k, v)\n        format_string += \")\"\n        return format_string\n"
  },
  {
    "path": "corenet/optims/scheduler/__init__.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\n\nfrom corenet.optims.scheduler.base_scheduler import BaseLRScheduler\nfrom corenet.utils import logger\nfrom corenet.utils.registry import Registry\n\nSCHEDULER_REGISTRY = Registry(\n    \"scheduler\",\n    base_class=BaseLRScheduler,\n    lazy_load_dirs=[\"corenet/optims/scheduler\"],\n    internal_dirs=[\"corenet/internal\", \"corenet/internal/projects/*\"],\n)\n\n\ndef build_scheduler(opts: argparse.Namespace, *args, **kwargs) -> BaseLRScheduler:\n    scheduler_name = getattr(opts, \"scheduler.name\").lower()\n\n    # We registered the base class using a special `name` (i.e., `__base__`)\n    # in order to access the arguments defined inside those classes. However, these classes are not supposed to\n    # be used. Therefore, we raise an error for such cases\n    if scheduler_name == \"__base__\":\n        logger.error(\"__base__ can't be used as a projection name. Please check.\")\n\n    scheduler = SCHEDULER_REGISTRY[scheduler_name](opts, *args, **kwargs)\n    return scheduler\n\n\ndef general_lr_sch_args(parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n    group = parser.add_argument_group(\n        title=\"LR scheduler arguments\", description=\"LR scheduler arguments\"\n    )\n\n    group.add_argument(\n        \"--scheduler.name\", type=str, default=\"cosine\", help=\"LR scheduler name\"\n    )\n    group.add_argument(\"--scheduler.lr\", type=float, default=0.1, help=\"Learning rate\")\n    group.add_argument(\n        \"--scheduler.max-epochs\",\n        type=int,\n        default=None,\n        help=\"Max. epochs for training\",\n    )\n    group.add_argument(\n        \"--scheduler.max-iterations\",\n        type=int,\n        default=None,\n        help=\"Max. iterations for training\",\n    )\n    group.add_argument(\n        \"--scheduler.warmup-iterations\",\n        type=int,\n        default=None,\n        help=\"Warm-up iterations\",\n    )\n    group.add_argument(\n        \"--scheduler.warmup-init-lr\", type=float, default=1e-7, help=\"Warm-up init lr\"\n    )\n    group.add_argument(\n        \"--scheduler.is-iteration-based\",\n        action=\"store_true\",\n        help=\"Is iteration type or epoch type\",\n    )\n\n    group.add_argument(\n        \"--scheduler.adjust-period-for-epochs\",\n        action=\"store_true\",\n        help=\"Adjust the period for epoch-based scheduler.\",\n    )\n\n    return parser\n\n\ndef arguments_scheduler(parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n    parser = general_lr_sch_args(parser=parser)\n\n    # add scheduler specific arguments\n    parser = SCHEDULER_REGISTRY.all_arguments(parser)\n    return parser\n"
  },
  {
    "path": "corenet/optims/scheduler/base_scheduler.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\n\nfrom corenet.utils import logger\n\n\nclass BaseLRScheduler(object):\n    def __init__(self, opts) -> None:\n        warmup_iterations = getattr(opts, \"scheduler.warmup_iterations\", None)\n        super().__init__()\n        self.opts = opts\n        self.round_places = 8\n        self.lr_multipliers = getattr(opts, \"optim.lr_multipliers\", None)\n\n        self.warmup_iterations = (\n            max(warmup_iterations, 0) if warmup_iterations is not None else 0\n        )\n\n        warmup_init_lr = getattr(opts, \"scheduler.warmup_init_lr\", 1e-7)\n        self.warmup_init_lr = warmup_init_lr\n\n        # Because of variable batch sizes, we can't determine exact number of epochs in warm-up phase. This\n        # may result in different LR schedules when we run epoch- and iteration-based schedulers.\n        # To reduce these differences, we use adjust_period_for_epochs arguments.\n        # For epoch-based scheduler, this parameter value should be enabled.\n        self.adjust_period = getattr(opts, \"scheduler.adjust_period_for_epochs\", False)\n        self.warmup_epochs = 0\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        return parser\n\n    def get_lr(self, epoch: int, curr_iter: int):\n        raise NotImplementedError\n\n    def update_lr(self, optimizer, epoch: int, curr_iter: int):\n        lr = self.get_lr(epoch=epoch, curr_iter=curr_iter)\n        lr = max(0.0, lr)\n        if self.lr_multipliers is not None:\n            assert len(self.lr_multipliers) == len(optimizer.param_groups)\n            for g_id, param_group in enumerate(optimizer.param_groups):\n                param_group[\"lr\"] = round(\n                    lr * self.lr_multipliers[g_id], self.round_places\n                )\n        else:\n            for param_group in optimizer.param_groups:\n                param_group[\"lr\"] = round(lr, self.round_places)\n        return optimizer\n\n    @staticmethod\n    def retrieve_lr(optimizer) -> list:\n        lr_list = []\n        for param_group in optimizer.param_groups:\n            lr_list.append(param_group[\"lr\"])\n        return lr_list\n\n    def extra_repr(self) -> str:\n        \"\"\"Extra information to be represented in __repr__. Each line in the output\n        string should be prefixed with ``\\n\\t``.\"\"\"\n        return \"\"\n\n    def __repr__(self) -> str:\n        return f\"{self.__class__.__name__}({self.extra_repr()}\\n)\"\n"
  },
  {
    "path": "corenet/optims/scheduler/cosine.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nimport math\n\nfrom corenet.optims.scheduler import SCHEDULER_REGISTRY\nfrom corenet.optims.scheduler.base_scheduler import BaseLRScheduler\n\n\n@SCHEDULER_REGISTRY.register(\"cosine\")\nclass CosineScheduler(BaseLRScheduler):\n    \"\"\"\n    Cosine learning rate scheduler: https://arxiv.org/abs/1608.03983\n    \"\"\"\n\n    def __init__(self, opts, **kwargs) -> None:\n        is_iter_based = getattr(opts, \"scheduler.is_iteration_based\", True)\n        super(CosineScheduler, self).__init__(opts=opts)\n\n        max_iterations = getattr(opts, \"scheduler.max_iterations\", 150000)\n\n        self.min_lr = getattr(opts, \"scheduler.cosine.min_lr\", 1e-5)\n        self.max_lr = getattr(opts, \"scheduler.cosine.max_lr\", 0.4)\n\n        if self.warmup_iterations > 0:\n            self.warmup_step = (\n                self.max_lr - self.warmup_init_lr\n            ) / self.warmup_iterations\n\n        self.period = (\n            max_iterations - self.warmup_iterations + 1\n            if is_iter_based\n            else getattr(opts, \"scheduler.max_epochs\", 350)\n        )\n\n        self.is_iter_based = is_iter_based\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        group = parser.add_argument_group(\n            title=\"Cosine LR arguments\", description=\"Cosine LR arguments\"\n        )\n\n        group.add_argument(\n            \"--scheduler.cosine.min-lr\",\n            type=float,\n            default=1e-5,\n            help=\"Minimum LR in Cosine LR scheduler\",\n        )\n        group.add_argument(\n            \"--scheduler.cosine.max-lr\",\n            type=float,\n            default=0.1,\n            help=\"Maximum LR in Cosine LR scheduler\",\n        )\n        return parser\n\n    def get_lr(self, epoch: int, curr_iter: int) -> float:\n        if curr_iter < self.warmup_iterations:\n            curr_lr = self.warmup_init_lr + curr_iter * self.warmup_step\n            self.warmup_epochs = epoch\n        else:\n            if self.is_iter_based:\n                curr_iter = curr_iter - self.warmup_iterations\n                curr_lr = self.min_lr + 0.5 * (self.max_lr - self.min_lr) * (\n                    1 + math.cos(math.pi * curr_iter / self.period)\n                )\n            else:\n                adjust_num = self.warmup_epochs + 1 if self.adjust_period else 0\n                adjust_den = self.warmup_epochs if self.adjust_period else 0\n                curr_lr = self.min_lr + 0.5 * (self.max_lr - self.min_lr) * (\n                    1\n                    + math.cos(\n                        math.pi * (epoch - adjust_num) / (self.period - adjust_den)\n                    )\n                )\n        return max(0.0, curr_lr)\n\n    def __repr__(self) -> str:\n        repr_str = \"{}(\".format(self.__class__.__name__)\n        repr_str += \"\\n \\t min_lr={}\\n \\t max_lr={}\\n \\t period={}\".format(\n            self.min_lr, self.max_lr, self.period\n        )\n        if self.warmup_iterations > 0:\n            repr_str += \"\\n \\t warmup_init_lr={}\\n \\t warmup_iters={}\".format(\n                self.warmup_init_lr, self.warmup_iterations\n            )\n\n        repr_str += \"\\n )\"\n        return repr_str\n"
  },
  {
    "path": "corenet/optims/scheduler/cyclic.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nimport math\n\nimport numpy as np\n\nfrom corenet.optims.scheduler import SCHEDULER_REGISTRY\nfrom corenet.optims.scheduler.base_scheduler import BaseLRScheduler\nfrom corenet.utils import logger\n\nSUPPORTED_LAST_CYCLES = [\"cosine\", \"linear\"]\n\n\n@SCHEDULER_REGISTRY.register(\"cyclic\")\nclass CyclicLRScheduler(BaseLRScheduler):\n    \"\"\"\n    Cyclic LR: https://arxiv.org/abs/1811.11431\n    \"\"\"\n\n    def __init__(self, opts, **kwargs) -> None:\n\n        cycle_steps = getattr(opts, \"scheduler.cyclic.steps\", [25])\n        if cycle_steps is not None and isinstance(cycle_steps, int):\n            cycle_steps = [cycle_steps]\n        gamma = getattr(opts, \"scheduler.cyclic.gamma\", 0.5)\n        anneal_type = getattr(opts, \"scheduler.cyclic.last_cycle_type\", \"linear\")\n        min_lr = getattr(opts, \"scheduler.cyclic.min_lr\", 0.1)\n        end_lr = getattr(opts, \"scheduler.cyclic.last_cycle_end_lr\", 1e-3)\n        ep_per_cycle = getattr(opts, \"scheduler.cyclic.epochs_per_cycle\", 5)\n        warmup_iterations = getattr(opts, \"scheduler.warmup_iterations\", 0)\n        n_cycles = getattr(opts, \"scheduler.cyclic.total_cycles\", 10) - 1\n        max_epochs = getattr(opts, \"scheduler.max_epochs\", 100)\n\n        if anneal_type not in SUPPORTED_LAST_CYCLES:\n            logger.error(\n                \"Supported anneal types for {} are: {}\".format(\n                    self.__class__.__name__, SUPPORTED_LAST_CYCLES\n                )\n            )\n        if min_lr < end_lr:\n            logger.error(\n                \"Min LR should be greater than end LR. Got: {} and {}\".format(\n                    min_lr, end_lr\n                )\n            )\n\n        super(CyclicLRScheduler, self).__init__(opts=opts)\n        self.min_lr = min_lr\n        self.cycle_length = ep_per_cycle\n        self.end_lr = end_lr\n        self.max_lr = self.min_lr * self.cycle_length\n        self.last_cycle_anneal_type = anneal_type\n\n        if self.warmup_iterations > 0:\n            self.warmup_step = (\n                self.min_lr - self.warmup_init_lr\n            ) / self.warmup_iterations\n\n        self.n_cycles = n_cycles\n\n        self.cyclic_epochs = self.cycle_length * self.n_cycles\n        self.max_epochs = max_epochs\n        self.last_cycle_epochs = self.max_epochs - self.cyclic_epochs\n\n        assert self.max_epochs == self.cyclic_epochs + self.last_cycle_epochs\n\n        self.steps = [self.max_epochs] if cycle_steps is None else cycle_steps\n        self.gamma = gamma if cycle_steps is not None else 1\n\n        self._lr_per_cycle()\n        self.epochs_lr_stepped = []\n\n    def _lr_per_cycle(self) -> None:\n        lrs = list(\n            np.linspace(self.max_lr, self.min_lr, self.cycle_length, dtype=np.float32)\n        )\n        lrs = [lrs[-1]] + lrs[:-1]\n        self.cycle_lrs = lrs\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        group = parser.add_argument_group(\n            title=\"Cyclic LR arguments\", description=\"Cyclic LR arguments\"\n        )\n        group.add_argument(\n            \"--scheduler.cyclic.min-lr\",\n            default=0.1,\n            type=float,\n            help=\"Min. lr for a cycle\",\n        )\n        group.add_argument(\n            \"--scheduler.cyclic.last-cycle-end-lr\",\n            default=1e-3,\n            type=float,\n            help=\"End LR for the last cycle\",\n        )\n        group.add_argument(\n            \"--scheduler.cyclic.total-cycles\",\n            default=11,\n            type=int,\n            help=\"Number of cycles. Default is 10\",\n        )\n        group.add_argument(\n            \"--scheduler.cyclic.epochs-per-cycle\",\n            default=5,\n            type=int,\n            help=\"Number of epochs per cycle. Default is 5\",\n        )\n        group.add_argument(\n            \"--scheduler.cyclic.steps\",\n            default=None,\n            type=int,\n            nargs=\"+\",\n            help=\"steps at which LR should be decreased\",\n        )\n        group.add_argument(\n            \"--scheduler.cyclic.gamma\",\n            default=0.5,\n            type=float,\n            help=\"Factor by which LR should be decreased\",\n        )\n        group.add_argument(\n            \"--scheduler.cyclic.last-cycle-type\",\n            default=\"linear\",\n            type=str,\n            choices=SUPPORTED_LAST_CYCLES,\n            help=\"Annealing in last cycle\",\n        )\n        return parser\n\n    def get_lr(self, epoch: int, curr_iter: int) -> float:\n        if curr_iter < self.warmup_iterations:\n            curr_lr = self.warmup_init_lr + curr_iter * self.warmup_step\n        else:\n            if epoch <= self.cyclic_epochs:\n                if epoch in self.steps and epoch not in self.epochs_lr_stepped:\n                    self.min_lr *= self.gamma ** (self.steps.index(epoch) + 1)\n                    self.max_lr *= self.gamma ** (self.steps.index(epoch) + 1)\n                    self._lr_per_cycle()\n                    self.epochs_lr_stepped.append(epoch)\n                idx = epoch % self.cycle_length\n                curr_lr = self.cycle_lrs[idx]\n            else:\n                base_lr = self.min_lr\n                if self.last_cycle_anneal_type == \"linear\":\n                    lr_step = (base_lr - self.end_lr) / self.last_cycle_epochs\n                    curr_lr = base_lr - (epoch - self.cyclic_epochs + 1) * lr_step\n                elif self.last_cycle_anneal_type == \"cosine\":\n                    curr_epoch = epoch - self.cyclic_epochs\n                    period = self.max_epochs - self.cyclic_epochs + 1\n                    curr_lr = self.end_lr + 0.5 * (base_lr - self.end_lr) * (\n                        1 + math.cos(math.pi * curr_epoch / period)\n                    )\n                else:\n                    raise NotImplementedError\n        return max(0.0, curr_lr)\n\n    def __repr__(self):\n        repr_str = (\n            \"{}(\\n \\t C={},\\n \\t C_length={},\\n \\t C_last={},\\n \\t Total_Epochs={}, \"\n            \"\\n \\t steps={},\\n \\t gamma={},\\n \\t last_cycle_anneal_method={} \"\n            \"\\n \\t min_lr={}, \\n\\t max_lr={}, \\n\\t end_lr={}\\n)\".format(\n                self.__class__.__name__,\n                self.n_cycles,\n                self.cycle_length,\n                self.last_cycle_epochs,\n                self.max_epochs,\n                self.steps,\n                self.gamma,\n                self.last_cycle_anneal_type,\n                self.min_lr,\n                self.min_lr * self.cycle_length,\n                self.end_lr,\n            )\n        )\n        return repr_str\n"
  },
  {
    "path": "corenet/optims/scheduler/fixed.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\n\nfrom corenet.optims.scheduler import SCHEDULER_REGISTRY\nfrom corenet.optims.scheduler.base_scheduler import BaseLRScheduler\n\n\n@SCHEDULER_REGISTRY.register(\"fixed\")\nclass FixedLRScheduler(BaseLRScheduler):\n    \"\"\"\n    Fixed learning rate scheduler with optional linear warm-up strategy\n    \"\"\"\n\n    def __init__(self, opts, **kwargs) -> None:\n        is_iter_based = getattr(opts, \"scheduler.is_iteration_based\", True)\n        super(FixedLRScheduler, self).__init__(opts=opts)\n\n        max_iterations = getattr(opts, \"scheduler.max_iterations\", 150000)\n\n        self.fixed_lr = getattr(opts, \"scheduler.fixed.lr\", None)\n        assert self.fixed_lr is not None\n\n        if self.warmup_iterations > 0:\n            self.warmup_step = (\n                self.fixed_lr - self.warmup_init_lr\n            ) / self.warmup_iterations\n\n        self.period = (\n            max_iterations - self.warmup_iterations + 1\n            if is_iter_based\n            else getattr(opts, \"scheduler.max_epochs\", 350)\n        )\n\n        self.is_iter_based = is_iter_based\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        group = parser.add_argument_group(\n            title=\"Fixed LR arguments\", description=\"Fixed LR arguments\"\n        )\n\n        group.add_argument(\n            \"--scheduler.fixed.lr\", type=float, default=None, help=\"LR value\"\n        )\n\n        return parser\n\n    def get_lr(self, epoch: int, curr_iter: int) -> float:\n        if curr_iter < self.warmup_iterations:\n            curr_lr = self.warmup_init_lr + curr_iter * self.warmup_step\n        else:\n            curr_lr = self.fixed_lr\n        return max(0.0, curr_lr)\n\n    def __repr__(self) -> str:\n        repr_str = \"{}(\".format(self.__class__.__name__)\n        repr_str += \"\\n\\tlr={}\".format(self.fixed_lr)\n        if self.warmup_iterations > 0:\n            repr_str += \"\\n\\twarmup_init_lr={}\\n\\twarmup_iters={}\".format(\n                self.warmup_init_lr, self.warmup_iterations\n            )\n\n        repr_str += \"\\n )\"\n        return repr_str\n"
  },
  {
    "path": "corenet/optims/scheduler/multi_step.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\n\nfrom corenet.optims.scheduler import SCHEDULER_REGISTRY\nfrom corenet.optims.scheduler.base_scheduler import BaseLRScheduler\n\n\n@SCHEDULER_REGISTRY.register(\"multi_step\")\nclass MultiStepLRScheduler(BaseLRScheduler):\n    \"\"\"\n    Multi-step learning rate scheduler with optional linear warm-up strategy\n    \"\"\"\n\n    def __init__(self, opts, **kwargs) -> None:\n        is_iter_based = getattr(opts, \"scheduler.is_iteration_based\", True)\n        super().__init__(opts=opts)\n\n        max_iterations = getattr(opts, \"scheduler.max_iterations\", 150000)\n\n        self.lr = getattr(opts, \"scheduler.multi_step.lr\", None)\n        assert self.lr is not None\n\n        if self.warmup_iterations > 0:\n            self.warmup_step = (self.lr - self.warmup_init_lr) / self.warmup_iterations\n\n        milestones = getattr(opts, \"scheduler.multi_step.milestones\", None)\n        if milestones is None:\n            milestones = [-1]\n        elif isinstance(milestones, int):\n            milestones = [milestones]\n\n        self.milestones = sorted(\n            list(set(milestones))\n        )  # remove duplicates and sort them\n        self.gamma = getattr(opts, \"scheduler.multi_step.gamma\", 1.0)\n\n        self.period = (\n            max_iterations - self.warmup_iterations + 1\n            if is_iter_based\n            else getattr(opts, \"scheduler.max_epochs\", 350)\n        )\n\n        self.is_iter_based = is_iter_based\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        group = parser.add_argument_group(\n            title=\"{} arguments\".format(cls.__name__),\n            description=\"{} arguments\".format(cls.__name__),\n        )\n\n        group.add_argument(\n            \"--scheduler.multi-step.lr\", type=float, default=0.1, help=\"LR value\"\n        )\n        group.add_argument(\n            \"--scheduler.multi-step.gamma\",\n            type=float,\n            default=None,\n            help=\"Decay LR value by this factor\",\n        )\n        group.add_argument(\n            \"--scheduler.multi-step.milestones\",\n            type=int,\n            nargs=\"+\",\n            default=None,\n            help=\"Decay LR value at these epoch\",\n        )\n        return parser\n\n    def get_lr(self, epoch: int, curr_iter: int) -> float:\n        if curr_iter < self.warmup_iterations:\n            return max(0.0, self.warmup_init_lr + curr_iter * self.warmup_step)\n        else:\n            if epoch in self.milestones:\n                self.lr = self.lr * self.gamma\n                self.milestones.remove(epoch)\n            return max(0.0, self.lr)\n\n    def __repr__(self) -> str:\n        repr_str = \"{}(\".format(self.__class__.__name__)\n        repr_str += \"\\n\\tlr={}\\n\\tmilestones={}\\n\\tgamma={}\".format(\n            self.lr, self.milestones, self.gamma\n        )\n        if self.warmup_iterations > 0:\n            repr_str += \"\\n\\twarmup_init_lr={}\\n\\twarmup_iters={}\".format(\n                self.warmup_init_lr, self.warmup_iterations\n            )\n\n        repr_str += \"\\n )\"\n        return repr_str\n"
  },
  {
    "path": "corenet/optims/scheduler/polynomial.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\n\nfrom corenet.optims.scheduler import SCHEDULER_REGISTRY\nfrom corenet.optims.scheduler.base_scheduler import BaseLRScheduler\n\n\n@SCHEDULER_REGISTRY.register(\"polynomial\")\nclass PolynomialScheduler(BaseLRScheduler):\n    \"\"\"\n    Polynomial LR scheduler\n    \"\"\"\n\n    def __init__(self, opts, **kwargs) -> None:\n        is_iter_based = getattr(opts, \"scheduler.is_iteration_based\", False)\n        max_iterations = getattr(opts, \"scheduler.max_iterations\", 50000)\n        max_epochs = getattr(opts, \"scheduler.max_epochs\", 350)\n\n        super(PolynomialScheduler, self).__init__(opts=opts)\n\n        self.start_lr = getattr(opts, \"scheduler.polynomial.start_lr\", 0.1)\n        self.end_lr = getattr(opts, \"scheduler.polynomial.end_lr\", 0.0)\n        self.power = getattr(opts, \"scheduler.polynomial.power\", 0.9)\n\n        if self.warmup_iterations > 0:\n            self.warmup_step = (\n                self.start_lr - self.warmup_init_lr\n            ) / self.warmup_iterations\n\n        self.is_iter_based = is_iter_based\n        self.max_iterations = max_iterations - self.warmup_iterations + 1\n        self.max_epochs = max_epochs\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        group = parser.add_argument_group(\n            title=\"Polynomial LR arguments\", description=\"Polynomial LR arguments\"\n        )\n\n        group.add_argument(\n            \"--scheduler.polynomial.power\",\n            type=float,\n            default=0.9,\n            help=\"Polynomial power\",\n        )\n        group.add_argument(\n            \"--scheduler.polynomial.start-lr\",\n            type=float,\n            default=0.1,\n            help=\"Start LR in Poly LR scheduler\",\n        )\n        group.add_argument(\n            \"--scheduler.polynomial.end-lr\",\n            type=float,\n            default=0.0,\n            help=\"End LR in Poly LR scheduler\",\n        )\n\n        return parser\n\n    def get_lr(self, epoch: int, curr_iter: int) -> float:\n        if curr_iter < self.warmup_iterations:\n            curr_lr = self.warmup_init_lr + curr_iter * self.warmup_step\n            self.warmup_epochs = epoch\n        else:\n            if self.is_iter_based:\n                factor = (curr_iter - self.warmup_iterations) / self.max_iterations\n            else:\n                adjust_num = self.warmup_epochs + 1 if self.adjust_period else 0\n                adjust_den = self.warmup_epochs if self.adjust_period else 0\n                factor = (epoch - adjust_num) / (self.max_epochs - adjust_den)\n            curr_lr = (self.start_lr - self.end_lr) * (\n                (1.0 - factor) ** self.power\n            ) + self.end_lr\n        return max(0.0, curr_lr)\n\n    def __repr__(self) -> str:\n        repr_str = \"{}(\".format(self.__class__.__name__)\n        repr_str += \"\\n\\tpower={}\\n\\tstart_lr={}\".format(self.power, self.start_lr)\n        if self.end_lr > 0:\n            repr_str += \"\\n\\tend_lr={}\".format(self.end_lr)\n\n        if self.warmup_iterations > 0:\n            repr_str += \"\\n\\twarmup_init_lr={}\\n\\twarmup_iters={}\".format(\n                self.warmup_init_lr, self.warmup_iterations\n            )\n\n        repr_str += \"\\n )\"\n        return repr_str\n"
  },
  {
    "path": "corenet/optims/sgd.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nfrom typing import Dict, Iterable, Union\n\nfrom torch import Tensor\nfrom torch.optim import SGD\n\nfrom corenet.optims import OPTIM_REGISTRY\nfrom corenet.optims.base_optim import BaseOptim\n\n\n@OPTIM_REGISTRY.register(name=\"sgd\")\nclass SGDOptimizer(BaseOptim, SGD):\n    \"\"\"\n    `SGD <http://www.cs.toronto.edu/%7Ehinton/absps/momentum.pdf>`_ optimizer\n\n    Args:\n        opts: Command-line arguments\n        model_params: Model parameters\n    \"\"\"\n\n    def __init__(\n        self,\n        opts: argparse.Namespace,\n        model_params: Iterable[Union[Tensor, Dict]],\n        *args,\n        **kwargs\n    ) -> None:\n        BaseOptim.__init__(self, opts=opts)\n        nesterov = getattr(opts, \"optim.sgd.nesterov\")\n        momentum = getattr(opts, \"optim.sgd.momentum\")\n\n        SGD.__init__(\n            self,\n            params=model_params,\n            lr=self.lr,\n            momentum=momentum,\n            weight_decay=self.weight_decay,\n            nesterov=nesterov,\n        )\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        if cls != SGDOptimizer:\n            # Don't re-register arguments in subclasses that don't override `add_arguments()`.\n            return parser\n        group = parser.add_argument_group(cls.__name__)\n        group.add_argument(\n            \"--optim.sgd.momentum\",\n            default=0.9,\n            type=float,\n            help=\"The value of momemtum in SGD. Defaults to 0.9\",\n        )\n        group.add_argument(\n            \"--optim.sgd.nesterov\",\n            action=\"store_true\",\n            default=False,\n            help=\"Use nesterov momentum in SGD. Defaults to False.\",\n        )\n        return parser\n"
  },
  {
    "path": "corenet/options/__init__.py",
    "content": ""
  },
  {
    "path": "corenet/options/errors.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom corenet.constants import is_test_env\n\n\nclass UnrecognizedYamlConfigEntry(Warning):\n    # TODO: consider converting UnrecognizedYamlConfigEntry Warning to an Exception.\n    def __init__(self, key: str) -> None:\n        message = (\n            f\"Yaml config key '{key}' was not recognized by argparser. If you think that you have already added \"\n            f\"argument in corenet/options/opts.py file, then check for typos. If not, then please add it to corenet/options/opts.py.\"\n        )\n        super().__init__(message)\n\n        if is_test_env():\n            # Currently, we only raise an exception in test environment.\n            raise ValueError(message)\n"
  },
  {
    "path": "corenet/options/opts.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nfrom typing import Callable, List, Optional, Union\n\nimport coremltools as ct\n\nfrom corenet.constants import DEFAULT_LOGS_DIR, DEFAULT_RESULTS_DIR\nfrom corenet.data.collate_fns import arguments_collate_fn\nfrom corenet.data.datasets import arguments_dataset\nfrom corenet.data.io.transfer_clients import transfer_client_arguments\nfrom corenet.data.sampler import add_sampler_arguments\nfrom corenet.data.text_tokenizer import arguments_tokenizer\nfrom corenet.data.transforms import arguments_augmentation\nfrom corenet.data.video_reader import arguments_video_reader\nfrom corenet.loss_fn import add_loss_fn_arguments\nfrom corenet.metrics import METRICS_REGISTRY, arguments_stats\nfrom corenet.modeling import modeling_arguments\nfrom corenet.optims import arguments_optimizer\nfrom corenet.optims.scheduler import arguments_scheduler\nfrom corenet.options.parse_args import JsonValidator\nfrom corenet.options.utils import load_config_file\nfrom corenet.utils import logger\n\n\nclass ParseKwargs(argparse.Action):\n    def __call__(self, parser, namespace, values, option_string=None):\n        # convert values into dict\n        override_dict = {}\n        for val in values:\n            if val.find(\"=\") < 0:\n                logger.error(\n                    \"For override arguments, a key-value pair of the form key=value is expected. Got: {}\".format(\n                        val\n                    )\n                )\n            val_list = val.split(\"=\")\n            if len(val_list) != 2:\n                logger.error(\n                    \"For override arguments, a key-value pair of the form key=value is expected with only one value per key. Got: {}\".format(\n                        val\n                    )\n                )\n            override_dict[val_list[0]] = val_list[1]\n\n        # determine the type of each value from parser actions and set accordingly\n        options = parser._actions\n        for option in options:\n            option_dest = option.dest\n            if option_dest in override_dict:\n                val = override_dict[option_dest]\n                if type(option.default) == bool and option.nargs == 0:\n                    # Boolean argument\n                    # value could be false, False, true, True\n                    override_dict[option_dest] = (\n                        True if val.lower().find(\"true\") > -1 else False\n                    )\n                elif option.nargs is None:\n                    # when nargs is not defined, it is usually a string, int, and float.\n                    override_dict[option_dest] = option.type(val)\n                elif option.nargs in [\"+\", \"*\"]:\n                    # for list, we expect value to be comma separated\n                    val_list = val.split(\",\")\n                    override_dict[option_dest] = [option.type(v) for v in val_list]\n                else:\n                    logger.error(\n                        \"Following option is not yet supported for overriding. Please specify in config file. Got: {}\".format(\n                            option\n                        )\n                    )\n        setattr(namespace, \"override_args\", override_dict)\n\n\ndef arguments_common(parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n    group = parser.add_argument_group(\n        title=\"Common arguments\", description=\"Common arguments\"\n    )\n\n    group.add_argument(\n        \"--taskname\",\n        type=str,\n        default=\"\",\n        help=\"Name of the task (can have arbitrary values)\",\n    )\n    group.add_argument(\"--common.seed\", type=int, default=0, help=\"Random seed\")\n    group.add_argument(\n        \"--common.config-file\", type=str, default=None, help=\"Configuration file\"\n    )\n    group.add_argument(\n        \"--common.results-loc\",\n        type=str,\n        default=DEFAULT_RESULTS_DIR,\n        help=f\"Directory where results will be stored. Defaults to {DEFAULT_RESULTS_DIR}.\",\n    )\n    group.add_argument(\n        \"--common.logs-loc\",\n        type=str,\n        default=DEFAULT_LOGS_DIR,\n        help=f\"Directory where logs will be stored. Defaults to {DEFAULT_LOGS_DIR}.\",\n    )\n    group.add_argument(\n        \"--common.run-label\",\n        type=str,\n        default=\"run_1\",\n        help=\"Label id for the current run\",\n    )\n    group.add_argument(\n        \"--common.eval-stage-name\",\n        type=str,\n        default=\"evaluation\",\n        help=\"Name to be used while logging in evaluation stage.\",\n    )\n\n    group.add_argument(\n        \"--common.resume\", type=str, default=None, help=\"Resume location\"\n    )\n    group.add_argument(\n        \"--common.finetune\",\n        type=str,\n        default=None,\n        help=\"Checkpoint location to be used for finetuning\",\n    )\n    group.add_argument(\n        \"--common.finetune-ema\",\n        type=str,\n        default=None,\n        help=\"EMA Checkpoint location to be used for finetuning\",\n    )\n\n    group.add_argument(\n        \"--common.mixed-precision\",\n        action=\"store_true\",\n        help=\"Enable mixed precision training. Defaults to False. \\\n            Note that this argument is not applicable for FSDP training. For mixed precision training with FSDP, \\\n            please see respective arguments in FSDP.\",\n    )\n    group.add_argument(\n        \"--common.mixed-precision-dtype\",\n        type=str,\n        default=\"float16\",\n        help=\"Mixed precision training data type\",\n    )\n    group.add_argument(\n        \"--common.accum-freq\",\n        type=int,\n        default=1,\n        help=\"Accumulate gradients for this number of iterations\",\n    )\n    group.add_argument(\n        \"--common.accum-after-epoch\",\n        type=int,\n        default=0,\n        help=\"Start accumulation after this many epochs\",\n    )\n    group.add_argument(\n        \"--common.log-freq\",\n        type=int,\n        default=100,\n        help=\"Display after these many iterations\",\n    )\n    group.add_argument(\n        \"--common.auto-resume\",\n        action=\"store_true\",\n        help=\"Resume training from the last checkpoint\",\n    )\n    group.add_argument(\n        \"--common.grad-clip\", type=float, default=None, help=\"Gradient clipping value\"\n    )\n    group.add_argument(\n        \"--common.k-best-checkpoints\",\n        type=int,\n        default=5,\n        help=\"Keep k-best checkpoints\",\n    )\n    group.add_argument(\n        \"--common.save-all-checkpoints\",\n        action=\"store_true\",\n        default=False,\n        help=\"If True, will save checkpoints from all epochs\",\n    )\n\n    group.add_argument(\n        \"--common.channels-last\",\n        action=\"store_true\",\n        default=False,\n        help=\"Use channel last format during training. \"\n        \"Note that some models may not support it, so we recommend to use it with caution.\",\n    )\n\n    group.add_argument(\n        \"--common.tensorboard-logging\",\n        action=\"store_true\",\n        help=\"Enable tensorboard logging\",\n    )\n    group.add_argument(\n        \"--common.file-logging\", action=\"store_true\", help=\"Enable file logging.\"\n    )\n    group.add_argument(\n        \"--common.override-kwargs\",\n        nargs=\"*\",\n        action=ParseKwargs,\n        help=\"Override arguments. Example. To override the value of --sampler.vbs.crop-size-width, \"\n        \"we can pass override argument as \"\n        \"--common.override-kwargs sampler.vbs.crop_size_width=512 \\n \"\n        \"Note that keys in override arguments do not contain -- or -\",\n    )\n\n    group.add_argument(\n        \"--common.enable-coreml-compatible-module\",\n        action=\"store_true\",\n        help=\"Use coreml compatible modules (if applicable) during inference\",\n    )\n\n    group.add_argument(\n        \"--common.debug-mode\",\n        action=\"store_true\",\n        help=\"You can use this flag for debugging purposes.\",\n    )\n\n    # intermediate checkpoint related args\n    group.add_argument(\n        \"--common.save-interval-freq\",\n        type=int,\n        default=0,\n        help=\"Save checkpoints every N updates. Defaults to 0\",\n    )\n\n    group.add_argument(\n        \"--common.eval-every-k-iterations\",\n        type=int,\n        default=0,\n        help=\"Evaluate model every k iterations. Defaults to 0.\",\n    )\n    group.add_argument(\n        \"--common.set-grad-to-none\",\n        action=\"store_true\",\n        help=\"Set gradients to none instead of zero after optimization step. This can help in reducing \\\n            GPU memory usage and can moderately improve training speed. Defaults to False. \\\n            Please be cautious when computing grad_norm for debugging purposes.\",\n    )\n\n    try:\n        from corenet.internal.utils.opts import arguments_internal\n\n        parser = arguments_internal(parser=parser)\n    except ModuleNotFoundError:\n        logger.debug(\"Cannot load internal arguments, skipping.\")\n\n    return parser\n\n\ndef arguments_ddp(parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n    group = parser.add_argument_group(title=\"DDP arguments\")\n    group.add_argument(\n        \"--ddp.rank\",\n        type=int,\n        default=0,\n        help=\"Node rank for distributed training. Defaults to 0.\",\n    )\n    group.add_argument(\n        \"--ddp.world-size\",\n        type=int,\n        default=-1,\n        help=\"World size for DDP. Defaults to -1, meaning use all GPUs.\",\n    )\n    group.add_argument(\n        \"--ddp.dist-url\", type=str, default=None, help=\"DDP URL. Defaults to None.\"\n    )\n    group.add_argument(\n        \"--ddp.dist-port\",\n        type=int,\n        default=30786,\n        help=\"DDP Port. Only used when --ddp.dist-url is not specified. Defaults to 30768.\",\n    )\n    group.add_argument(\n        \"--ddp.device-id\", type=int, default=None, help=\"Device ID. Defaults to None.\"\n    )\n    group.add_argument(\n        \"--ddp.backend\", type=str, default=\"nccl\", help=\"DDP backend. Default is nccl\"\n    )\n    group.add_argument(\n        \"--ddp.find-unused-params\",\n        action=\"store_true\",\n        default=False,\n        help=\"Find unused params in model. useful for debugging with DDP. Defaults to False.\",\n    )\n\n    group.add_argument(\n        \"--ddp.use-deprecated-data-parallel\",\n        action=\"store_true\",\n        default=False,\n        help=\"Use Data parallel for training. This flag is not recommended for training and should be used only for debugging. \\\n            The support for this flag will be deprecating in future.\",\n    )\n\n    return parser\n\n\ndef arguments_train_eval_pipeline(\n    parser: argparse.ArgumentParser,\n) -> argparse.ArgumentParser:\n    group = parser.add_argument_group(title=\"TrainEvalPipeline\")\n    group.add_argument(\n        \"--train-eval-pipeline.name\",\n        type=str,\n        default=\"default\",\n        help=(\n            \"Name of the TrainEvalPipeline to use for constructing pipeline components.\"\n            \" Defaults to 'default' pipeline (see corenet/train_eval_pipelines/train_eval.py)\"\n        ),\n    )\n    return parser\n\n\ndef arguments_lm_eval(parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n    \"\"\"\n    Add arguments related to 3rd party LM evaluation.\n\n    Args:\n        parser: The parser to add arguments to.\n    Returns:\n        The updated parser.\n    \"\"\"\n    group = parser.add_argument_group(\"LM Evaluation arguments\")\n    group.add_argument(\n        \"--lm-eval-wrapper.add-sot-token\",\n        action=\"store_true\",\n        default=False,\n        help=\"Certain tokenizers (e.g., Llamav1 Tokenizer) adds start of text token. However, by default, \\\n             some libraries set it to false, leading to inconsistent results. This flags allows to control if start of \\\n            text token to be added to input sentence or not. \",\n    )\n    group.add_argument(\n        \"--llmadapters-evaluation.datasets\",\n        type=str,\n        default=(\n            \"boolq\",\n            \"piqa\",\n            \"social_i_qa\",\n            \"hellaswag\",\n            \"winogrande\",\n            \"ARC-Easy\",\n            \"ARC-Challenge\",\n            \"openbookqa\",\n        ),\n        help=\"The commonsense datasets on which to evaluate. Options include boolq, piqa, social_i_qa, hellaswag, winogrande, ARC-Easy, ARC-Challenge, and openbookqa.\",\n        nargs=\"+\",\n        choices=(\n            \"boolq\",\n            \"piqa\",\n            \"social_i_qa\",\n            \"hellaswag\",\n            \"winogrande\",\n            \"ARC-Easy\",\n            \"ARC-Challenge\",\n            \"openbookqa\",\n        ),\n    )\n    group.add_argument(\n        \"--llmadapters-evaluation.multiple-choice\",\n        action=\"store_true\",\n        help=\"If set, do multiple-choice evaluation. Otherwise, use generation-style evaluation.\",\n    )\n    group.add_argument(\n        \"--llmadapters-evaluation.limit\",\n        type=int,\n        help=\"If set, run a limited number of evaluation samples.\",\n        default=None,\n    )\n    group.add_argument(\n        \"--llmadapters-evaluation.dataset-dir\",\n        type=str,\n        help=\"Directory that contains the datasets on which to evaluate.\",\n        default=\"LLM-Adapters/dataset/\",\n    )\n    group.add_argument(\n        \"--lm-harness-evaluation.tasks-info\",\n        type=JsonValidator,\n        help=\"Task dictionary for LM Harness evaluation.\",\n        default=None,\n    )\n\n    return parser\n\n\ndef parser_to_opts(parser: argparse.ArgumentParser, args: Optional[List[str]] = None):\n    # parse args\n    opts = parser.parse_args(args)\n    opts = load_config_file(opts)\n    return opts\n\n\ndef get_training_arguments(\n    args: Optional[List[str]] = None,\n    parse_args: bool = True,\n    add_arguments: Optional[\n        Callable[[argparse.ArgumentParser], argparse.ArgumentParser]\n    ] = None,\n) -> Union[argparse.ArgumentParser, argparse.Namespace]:\n    \"\"\"Adds the CoreNet training arguments to the argument parser.\n\n    Args:\n        args: If provided, argparser ignores the CLI arguments and parses the given\n            list. Defaults to None, that parses CLI arguments from `sys.argv`.\n        parse_args: If true, parses the arguments. Otherwise, just creates the parser.\n            Defaults to True.\n        add_arguments: If provided, wraps the argument parser to modify the parser or\n            to add additional arguments dynamically. Useful for entrypoint-specific\n            arguments. Defaults to None.\n\n    Returns:\n        By default, returns the `opts` config object. If parse_args=True is passed,\n        returns the argument parser.\n    \"\"\"\n    parser = argparse.ArgumentParser(description=\"Training arguments\", add_help=True)\n\n    # transfer client related arguments\n    parser = transfer_client_arguments(parser)\n\n    # dataset related arguments\n    parser = arguments_dataset(parser=parser)\n\n    # cvnet arguments, including models\n    parser = modeling_arguments(parser=parser)\n\n    # sampler related arguments\n    parser = add_sampler_arguments(parser=parser)\n\n    # collate fn  related arguments\n    parser = arguments_collate_fn(parser=parser)\n\n    # transform related arguments\n    parser = arguments_augmentation(parser=parser)\n\n    # Video reader related arguments\n    # Should appear after arguments_augmentations(parser=parser) because \"--frame-augmentation.*\" depends on \"--image-augmentation.*\"\n    parser = arguments_video_reader(parser=parser)\n\n    # loss function arguments\n    parser = add_loss_fn_arguments(parser=parser)\n\n    # optimizer arguments\n    parser = arguments_optimizer(parser=parser)\n    parser = arguments_scheduler(parser=parser)\n\n    # DDP arguments\n    parser = arguments_ddp(parser=parser)\n\n    # stats arguments\n    parser = arguments_stats(parser=parser)\n\n    # common\n    parser = arguments_common(parser=parser)\n\n    # text tokenizer arguments\n    parser = arguments_tokenizer(parser=parser)\n\n    # metric arguments\n    parser = METRICS_REGISTRY.all_arguments(parser=parser)\n\n    parser = arguments_train_eval_pipeline(parser=parser)\n\n    if add_arguments is not None:\n        parser = add_arguments(parser)\n\n    if parse_args:\n        return parser_to_opts(parser, args)\n    else:\n        return parser\n\n\ndef get_lm_eval_arguments(\n    parse_args: Optional[bool] = True, args: Optional[List[str]] = None\n) -> argparse.ArgumentParser:\n    parser = get_training_arguments(\n        parse_args=False,\n        args=args,\n    )\n    parser = arguments_lm_eval(parser)\n\n    if parse_args:\n        return parser_to_opts(parser, args)\n    else:\n        return parser\n\n\ndef get_conversion_arguments(args: Optional[List[str]] = None):\n    parser = get_training_arguments(parse_args=False)\n\n    # Arguments related to coreml conversion\n    group = parser.add_argument_group(\"Conversion arguments\")\n    group.add_argument(\n        \"--conversion.coreml-extn\",\n        type=str,\n        default=\"mlmodel\",\n        help=\"Extension for converted model. Default is mlmodel\",\n    )\n    group.add_argument(\n        \"--conversion.input-image-path\",\n        type=str,\n        default=None,\n        help=\"Path of the image to be used for conversion\",\n    )\n\n    group.add_argument(\n        \"--conversion.minimum-deployment-target\",\n        type=str,\n        default=None,\n        choices=list([target.name for target in ct.target]),\n        help=\"A member of the coremltools.target enum. Defaults to None\",\n    )\n    group.add_argument(\n        \"--conversion.compute-precision\",\n        type=str,\n        default=None,\n        choices=list([precision.name for precision in ct.precision]),\n        help=\"A member of the coremltools.precision enum. Defaults to None\",\n    )\n\n    # Arguments related to server.\n    group.add_argument(\n        \"--conversion.bucket-name\", type=str, help=\"Model job's bucket name\"\n    )\n    group.add_argument(\"--conversion.task-id\", type=str, help=\"Model job's id\")\n    group.add_argument(\n        \"--conversion.viewers\",\n        type=str,\n        nargs=\"+\",\n        default=None,\n        help=\"Users who can view your models on server\",\n    )\n\n    # parse args\n    return parser_to_opts(parser, args=args)\n\n\ndef get_benchmarking_arguments(args: Optional[List[str]] = None):\n    parser = get_training_arguments(parse_args=False)\n\n    #\n    group = parser.add_argument_group(\"Benchmarking arguments\")\n    group.add_argument(\n        \"--benchmark.batch-size\",\n        type=int,\n        default=1,\n        help=\"Batch size for benchmarking\",\n    )\n    group.add_argument(\n        \"--benchmark.warmup-iter\", type=int, default=10, help=\"Warm-up iterations\"\n    )\n    group.add_argument(\n        \"--benchmark.n-iter\",\n        type=int,\n        default=100,\n        help=\"Number of iterations for benchmarking\",\n    )\n    group.add_argument(\n        \"--benchmark.use-jit-model\",\n        action=\"store_true\",\n        help=\"Convert the model to JIT and then benchmark it\",\n    )\n\n    # parse args\n    return parser_to_opts(parser, args=args)\n"
  },
  {
    "path": "corenet/options/parse_args.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\nimport json\nimport typing\nfrom typing import Any\n\n\ndef parse_validation_metric_names(opts):\n    \"\"\"\n    This function contains common command-line parsing logic for validation metrics\n    \"\"\"\n    metric_names = getattr(opts, \"stats.val\", [\"loss\"])\n    if isinstance(metric_names, str):\n        metric_names = [metric_names]\n    assert isinstance(\n        metric_names, list\n    ), \"Type of metric names should be list. Got: {}\".format(type(metric_names))\n\n    if \"loss\" not in metric_names:\n        metric_names.append(\"loss\")\n\n    ckpt_metric_str = getattr(opts, \"stats.checkpoint_metric\", \"loss\")\n    ckpt_metric_arr = ckpt_metric_str.split(\".\")\n    ckpt_metric = ckpt_metric_arr[0]\n    if len(ckpt_metric_arr) == 1:\n        ckpt_submetric_name = None\n    else:\n        ckpt_submetric_name = ckpt_metric_arr[-1]\n\n    ckpt_metric = ckpt_metric\n    ckpt_submetric = ckpt_submetric_name\n    if ckpt_metric is None:\n        # if checkpoint metric is not specified, then use loss\n        ckpt_metric = \"loss\"\n\n    assert (\n        ckpt_metric in metric_names\n    ), \"Checkpoint metric should be part of metric names. Metric names: {}, Checkpoint metric: {}\".format(\n        metric_names, ckpt_metric\n    )\n    ckpt_metric = ckpt_metric.lower()\n\n    return metric_names, ckpt_metric, ckpt_submetric\n\n\nclass JsonValidator:\n    def __init__(self, expected_type: type):\n        \"\"\"\n        JsonValidator(T) is function (s)->x that parses json string s into python value x, where x is of type T.\n\n        Example Usage:\n        >>> from typing import Union, List\n        >>> import argparse\n        >>> parser = argparse.ArgumentParser()\n        >>> parser.add_argument(\"--x\", type=JsonValidator(Union[int, List[float]]))\n        >>> assert parser.parse_args([\"--x=123\"]).x == 123\n        >>> assert parser.parse_args([\"--x=[1, 2]\"]).x == [1., 2.]\n        \"\"\"\n        self.expected_type = expected_type\n\n    @classmethod\n    def _validate_and_cast(cls, json_value: Any, expected_type: Any):\n        type_cls = (\n            typing.get_origin(expected_type) or expected_type\n        )  # typing.get_origin() returns None for non-generic types like `Any` and `int`\n        type_args = typing.get_args(expected_type)\n        if type_cls is typing.Any:\n            return json_value\n        if type_cls is float and isinstance(json_value, (int, float)):\n            return float(json_value)\n        elif type_cls in (int, str, bool) and isinstance(json_value, type_cls):\n            return json_value\n        elif type_cls is None and json_value is None:\n            return None\n        elif type_cls is typing.Union:\n            for arg in type_args:\n                try:\n                    return cls._validate_and_cast(json_value, arg)\n                except TypeError:\n                    continue\n        elif type_cls is dict and isinstance(json_value, dict):\n            if not type_args:\n                type_args = (Any, Any)\n            type_key, type_value = type_args\n            return {\n                cls._validate_and_cast(key, type_key): cls._validate_and_cast(\n                    value, type_value\n                )\n                for key, value in json_value.items()\n            }\n        elif type_cls is list and isinstance(json_value, list):\n            if not type_args:\n                type_args = [Any]\n            return [cls._validate_and_cast(x, type_args[0]) for x in json_value]\n        elif (\n            type_cls is tuple\n            and isinstance(json_value, list)\n            and (type_args is None or len(type_args) == len(json_value))\n        ):\n            if type_args is None:\n                type_args = [Any] * len(json_value)\n            return tuple(\n                type_cls(\n                    cls._validate_and_cast(item, type_arg)\n                    for item, type_arg in zip(json_value, type_args)\n                )\n            )\n        raise TypeError(\n            f\"Cannot cast {json_value} with type {type(json_value)} to {expected_type}\"\n        )\n\n    def __call__(self, str_value: str) -> Any:\n        try:\n            value = json.loads(str_value)\n        except json.JSONDecodeError:\n            raise TypeError(f\"Cannot parse json value '{str_value}' for {self}\")\n        return self._validate_and_cast(value, self.expected_type)\n\n    def __repr__(self):\n        return f\"JSON[{self.expected_type}]\"\n"
  },
  {
    "path": "corenet/options/utils.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nimport collections\nimport os\nimport re\n\nimport yaml\n\nfrom corenet.options.errors import UnrecognizedYamlConfigEntry\nfrom corenet.utils import logger\nfrom corenet.utils.ddp_utils import is_master\nfrom corenet.utils.download_utils import get_local_path\n\ntry:\n    # Workaround for DeprecationWarning when importing Collections\n    collections_abc = collections.abc\nexcept AttributeError:\n    collections_abc = collections\n\nDEFAULT_CONFIG_DIR = \"config\"\nMETA_PARAMS_REGEX = r\"tasks|include_configs\"\n# To remove dummy entries corresponding to anchors, which are defined with a prefix `_anchor_`\nMETA_PARAMS_REGEX += r\"|_anchor_.*\"\ntry:\n    from corenet.internal.utils.opts import (\n        META_PARAMS_REGEX as INTERNAL_META_PARAMS_REGEX,\n    )\nexcept ModuleNotFoundError:\n    pass  # public version does not contain \"internal\"\nelse:\n    META_PARAMS_REGEX += \"|\" + INTERNAL_META_PARAMS_REGEX\n\n\ndef flatten_yaml_as_dict(d, parent_key=\"\", sep=\".\"):\n    items = []\n    for k, v in d.items():\n        new_key = parent_key + sep + k if parent_key else k\n        if isinstance(v, collections_abc.MutableMapping):\n            items.extend(flatten_yaml_as_dict(v, new_key, sep=sep).items())\n        else:\n            items.append((new_key, v))\n    return dict(items)\n\n\ndef load_config_file(opts):\n    config_file_name = getattr(opts, \"common.config_file\", None)\n    if config_file_name is None:\n        return opts\n    is_master_node = is_master(opts)\n\n    if is_master_node:\n        config_file_name = get_local_path(opts=opts, path=config_file_name)\n\n    if not os.path.isfile(config_file_name):\n        if len(config_file_name.split(\"/\")) == 1:\n            # loading files from default config folder\n            new_config_file_name = \"{}/{}\".format(DEFAULT_CONFIG_DIR, config_file_name)\n            if not os.path.isfile(new_config_file_name) and is_master_node:\n                logger.error(\n                    \"Configuration file neither exists at {} nor at {}\".format(\n                        config_file_name, new_config_file_name\n                    )\n                )\n            else:\n                config_file_name = new_config_file_name\n        else:\n            # If absolute path of the file is passed\n            if not os.path.isfile(config_file_name) and is_master_node:\n                logger.error(\n                    \"Configuration file does not exists at {}\".format(config_file_name)\n                )\n\n    setattr(opts, \"common.config_file\", config_file_name)\n    with open(config_file_name, \"r\") as yaml_file:\n        try:\n            cfg = yaml.load(yaml_file, Loader=yaml.FullLoader)\n            flat_cfg = flatten_yaml_as_dict(cfg)\n            for k, v in flat_cfg.items():\n                if hasattr(opts, k):\n                    setattr(opts, k, v)\n                elif \"local_\" not in k and not re.match(META_PARAMS_REGEX, k):\n                    logger.warning(UnrecognizedYamlConfigEntry(k))\n        except yaml.YAMLError as exc:\n            if is_master_node:\n                logger.error(\n                    \"Error while loading config file: {}. Error message: {}\".format(\n                        config_file_name, str(exc)\n                    )\n                )\n\n    # override arguments\n    override_args = getattr(opts, \"override_args\", None)\n    if override_args is not None:\n        for override_k, override_v in override_args.items():\n            if hasattr(opts, override_k):\n                setattr(opts, override_k, override_v)\n            elif \"local_\" not in k and not re.match(META_PARAMS_REGEX, k):\n                logger.warning(UnrecognizedYamlConfigEntry(override_k))\n\n    return opts\n\n\ndef extend_selected_args_with_prefix(\n    parser: argparse.ArgumentParser, match_prefix: str, additional_prefix: str\n) -> argparse.ArgumentParser:\n    \"\"\"\n    Helper function to select arguments with certain prefix and duplicate them with a replaced prefix.\n    An example use case is distillation, where we want to add --teacher.model.* as a prefix to all --model.* arguments.\n\n    In that case, we provide the following arguments:\n    * match_prefix=\"--model.\"\n    * additional_prefix=\"--teacher.model.\"\n\n    Args:\n        match_prefix: Prefix to select arguments for duplication.\n            The value should start with \"--\", contain no underscores, and with \".\".\n        additional_prefix: Prefix to replace the @match_prefix in duplicated arguments.\n            The value should start with \"--\", contain no underscores, and with \".\".\n    \"\"\"\n    # all arguments are stored as actions\n    options = parser._actions\n\n    regexp = r\"--[^_]+\\.\"\n    assert re.match(\n        regexp, match_prefix\n    ), f\"match prefix '{match_prefix}' should match regexp '{regexp}'\"\n    assert re.match(\n        regexp, additional_prefix\n    ), f\"additional prefix '{additional_prefix}' should match regexp '{regexp}'\"\n\n    for option in options:\n        option_strings = option.option_strings\n        # option strings are stored as a list\n        for option_string in option_strings:\n            if option_string.startswith(match_prefix):\n                parser.add_argument(\n                    option_string.replace(match_prefix, additional_prefix),\n                    nargs=(\n                        \"?\"\n                        if isinstance(option, argparse._StoreTrueAction)\n                        else option.nargs\n                    ),\n                    const=option.const,\n                    default=option.default,\n                    type=option.type,\n                    choices=option.choices,\n                    help=option.help,\n                    metavar=option.metavar,\n                )\n    return parser\n\n\ndef extract_opts_with_prefix_replacement(\n    opts: argparse.Namespace,\n    match_prefix: str,\n    replacement_prefix: str,\n) -> argparse.Namespace:\n    \"\"\"\n    Helper function to extract a copy options with certain prefix and return them with an alternative prefix.\n    An example usage is distillation, when we have used @extend_selected_args_with_prefix to add --teacher.model.*\n        arguments to argparser, and now we want to re-use the handlers of model.* opts by teacher.model.* opts\n\n    Args:\n        match_prefix: Prefix to select opts for extraction.\n            The value should not contain dashes and should end with \".\"\n        replacement_prefix: Prefix to replace the @match_prefix\n            The value should not contain dashes and should end with \".\"\n    \"\"\"\n    regexp = r\"[^-]+\\.\"\n    assert re.match(\n        regexp, match_prefix\n    ), f\"match prefix '{match_prefix}' should match regexp '{regexp}'\"\n    assert re.match(\n        regexp, replacement_prefix\n    ), f\"replacement prefix '{replacement_prefix}' should match regexp '{regexp}'\"\n\n    opts_dict = vars(opts)\n    result_dict = {\n        # replace teacher with empty string in \"teacher.model.*\" to get model.*\n        key.replace(match_prefix, replacement_prefix): value\n        for key, value in opts_dict.items()\n        # filter keys related to teacher\n        if key.startswith(match_prefix)\n    }\n\n    return argparse.Namespace(**result_dict)\n"
  },
  {
    "path": "corenet/third_party/__init__.py",
    "content": ""
  },
  {
    "path": "corenet/third_party/data/__init__.py",
    "content": ""
  },
  {
    "path": "corenet/third_party/data/text_tokenizer/__init__.py",
    "content": ""
  },
  {
    "path": "corenet/third_party/data/text_tokenizer/openai_clip_tokenizer.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nimport gzip\nfrom functools import lru_cache\nfrom typing import Dict, List, Set, Tuple, Union\n\nimport regex as re\nimport torch\nfrom torch import Tensor\n\nfrom corenet.data.text_tokenizer import TOKENIZER_REGISTRY, BaseTextTokenizer\nfrom corenet.utils import logger\nfrom corenet.utils.download_utils import get_local_path\n\n\n@lru_cache()\ndef bytes_to_unicode() -> Dict[int, str]:\n    \"\"\"\n    Returns list of utf-8 byte and a corresponding list of unicode strings.\n    The reversible bpe codes work on unicode strings.\n    This means you need a large # of unicode characters in your vocab if you want to avoid UNKs.\n    When you're at something like a 10B token dataset you end up needing around 5K for decent coverage.\n    This is a significant percentage of your normal, say, 32K bpe vocab.\n    To avoid that, we want lookup tables between utf-8 bytes and unicode strings.\n    This also avoids mapping to whitespace/control characters the bpe code barfs on.\n    \"\"\"\n    bs = (\n        list(range(ord(\"!\"), ord(\"~\") + 1))\n        + list(range(ord(\"¡\"), ord(\"¬\") + 1))\n        + list(range(ord(\"®\"), ord(\"ÿ\") + 1))\n    )\n    cs = bs[:]\n    n = 0\n    for b in range(2**8):\n        if b not in bs:\n            bs.append(b)\n            cs.append(2**8 + n)\n            n += 1\n    cs = [chr(n) for n in cs]\n    return dict(zip(bs, cs))\n\n\ndef get_pairs(word: Tuple[str, ...]) -> Set[Tuple[str, str]]:\n    \"\"\"Return set of symbol pairs in a word.\n    Word is represented as tuple of symbols (symbols being variable-length strings).\n    \"\"\"\n    pairs = set()\n    prev_char = word[0]\n    for char in word[1:]:\n        pairs.add((prev_char, char))\n        prev_char = char\n    return pairs\n\n\n@TOKENIZER_REGISTRY.register(name=\"openai_clip\")\nclass OpenAIClipTokenizer(BaseTextTokenizer):\n    \"\"\"OpenAI's CLIP tokenizer.\n\n    The code is taken from https://github.com/openai/CLIP.\n\n    Args:\n        opts: Command-line arguments.\n\n    Example:\n        >>> tokenizer = OpenAIClipTokenizer(opts)\n        >>> input_sentence = \"the quick brown fox jumped over the lazy dog\"\n        >>> tokenized_sentence = tokenizer(input_sentence)\n        >>> print(tokenized_sentence)\n            tensor([49406,   518,  3712,  2866,  3240, 16901,   962,   518, 10753,  1929, 49407])\n        >>> tokenizer.tok_decode(tokenized_sentence)\n            '<|startoftext|>the quick brown fox jumped over the lazy dog <|endoftext|>'\n\n    ...note:\n        1. BPE file can be downloaded from OpenAI's CLIP github as:\n        ```\n            wget https://raw.githubusercontent.com/openai/CLIP/main/clip/bpe_simple_vocab_16e6.txt.gz\n        ```\n    \"\"\"\n\n    def __init__(self, opts: argparse.Namespace) -> None:\n        super().__init__(opts)\n        bpe_path = getattr(opts, \"text_tokenizer.openai_clip.bpe_path\")\n        if bpe_path is None:\n            logger.error(\n                f\"BPE path cannot be None in {self.__class__.__name__}. Please check.\"\n            )\n\n        bpe_path = get_local_path(\n            opts,\n            path=bpe_path,\n            force_delete=False,\n        )\n\n        # merges contain pair of tokens that are frequently appearing in the corpora.\n        # Example: ['i n', 't h', 'a n', 'r e', 'a r', 'e r', 'th e</w>', 'in g</w>', 'o u']\n        merges = gzip.open(bpe_path).read().decode(\"utf-8\").split(\"\\n\")\n\n        # Note 1: index 0 in merges file contain version information (e.g., 'bpe_simple_vocab_16e6.txt#version: 0.2').\n        # Note 2: The OpenAI CLIP model operates on a lower-cased byte pair encoding (BPE) representation of the text with a 49,152 vocab size.\n        # Note 3a: For each byte, we have ['a', 'a</w>']. so, 256 is subtracted.\n        # Note 3b: We also add SOT and EOT tokens to the vocab, so we further subtract 2.\n        merges = merges[1 : 49152 - 256 - 2 + 1]\n        merges = [tuple(merge.split()) for merge in merges]\n\n        vocab = list(bytes_to_unicode().values())\n        vocab = vocab + [v + \"</w>\" for v in vocab]\n        for merge in merges:\n            vocab.append(\"\".join(merge))\n        vocab.extend([self.sot_token, self.eot_token])\n\n        self.encoder = dict(zip(vocab, range(len(vocab))))\n        self.decoder = {v: k for k, v in self.encoder.items()}\n\n        self.byte_encoder = bytes_to_unicode()\n        self.byte_decoder = {v: k for k, v in self.byte_encoder.items()}\n\n        self.bpe_ranks = dict(zip(merges, range(len(merges))))\n\n        self.cache = {\n            self.sot_token: self.sot_token,\n            self.eot_token: self.eot_token,\n        }\n        self.pat = re.compile(\n            r\"\"\"<\\|startoftext\\|>|<\\|endoftext\\|>|'s|'t|'re|'ve|'m|'ll|'d|[\\p{L}]+|[\\p{N}]|[^\\s\\p{L}\\p{N}]+\"\"\",\n            re.IGNORECASE,\n        )\n\n    @classmethod\n    def add_arguments(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        \"\"\"OpenAIClipTokenizer arguments.\"\"\"\n        if cls == OpenAIClipTokenizer:\n            group = parser.add_argument_group(cls.__name__)\n\n            openai_tokenizer_file_permanent_path = \"https://github.com/openai/CLIP/raw/a1d071733d7111c9c014f024669f959182114e33/clip/bpe_simple_vocab_16e6.txt.gz\"\n\n            group.add_argument(\n                \"--text-tokenizer.openai-clip.bpe-path\",\n                type=str,\n                default=openai_tokenizer_file_permanent_path,\n                help=f\"Path to BPE file. Defaults to '{openai_tokenizer_file_permanent_path}'.\",\n            )\n        return parser\n\n    @property\n    def vocab_size(self) -> int:\n        \"\"\"Text vocabulary size.\"\"\"\n        return len(self.encoder)\n\n    @property\n    def eot_token(self) -> str:\n        \"\"\"End of text token.\"\"\"\n        return \"<|endoftext|>\"\n\n    @property\n    def eot_token_id(self) -> int:\n        \"\"\"Token index for EOT token.\"\"\"\n        return self.encoder[self.eot_token]\n\n    @property\n    def sot_token(self) -> str:\n        \"\"\"Start of text token.\"\"\"\n        return \"<|startoftext|>\"\n\n    @property\n    def sot_token_id(self) -> int:\n        \"\"\"Start of token index.\"\"\"\n        return self.encoder[self.sot_token]\n\n    @property\n    def pad_token_id(self) -> int:\n        \"\"\"Padding token index.\"\"\"\n        return self.encoder[self.pad_token]\n\n    def _bpe(self, token: str) -> str:\n        \"\"\"Convert token to byte pair encoding (BPE).\n\n        Args:\n            token: Text token (e.g., the word 'the')\n\n        Returns:\n            Byte-pair encoding of the @token (e.g., 'the</w>').\n        \"\"\"\n        if token in self.cache:\n            return self.cache[token]\n        word = tuple(token[:-1]) + (token[-1] + \"</w>\",)\n        pairs = get_pairs(word)\n\n        if not pairs:\n            return token + \"</w>\"\n\n        while True:\n            bigram = min(pairs, key=lambda pair: self.bpe_ranks.get(pair, float(\"inf\")))\n            if bigram not in self.bpe_ranks:\n                break\n            first, second = bigram\n            new_word = []\n            i = 0\n            while i < len(word):\n                try:\n                    j = word.index(first, i)\n                    new_word.extend(word[i:j])\n                    i = j\n                except:\n                    new_word.extend(word[i:])\n                    break\n\n                if word[i] == first and i < len(word) - 1 and word[i + 1] == second:\n                    new_word.append(first + second)\n                    i += 2\n                else:\n                    new_word.append(word[i])\n                    i += 1\n            new_word = tuple(new_word)\n            word = new_word\n            if len(word) == 1:\n                break\n            else:\n                pairs = get_pairs(word)\n        word = \" \".join(word)\n        self.cache[token] = word\n        return word\n\n    def tok_encode(self, input_sentence: str) -> Tensor:\n        \"\"\"Encodes a sentence into a tensor of token IDs.\n\n        The byte-pair encodings are obtained for text tokens, which are subsequently converted into\n        token ids and returned as a tensor.\n\n        Args:\n            input_sentence: The input sentence to be tokenized and encoded.\n\n        Returns:\n            A 1D tensor containing token IDs representing the encoded input sentence. The length of\n            tokenized sentence is dependent on 'input_sentence'.\n\n        ...note:\n            Special tokens SOT (Start of Text) and EOT (End of Text) are added to the input\n            sentence before tokenization.\n        \"\"\"\n        input_sentence = f\"{self.sot_token} {input_sentence} {self.eot_token}\"\n        bpe_tokens = []\n        for token in re.findall(self.pat, input_sentence):\n            token = \"\".join(self.byte_encoder[b] for b in token.encode(\"utf-8\"))\n            bpe_tokens.extend(\n                self.encoder[bpe_token] for bpe_token in self._bpe(token).split(\" \")\n            )\n        bpe_tokens_tensor = torch.tensor(bpe_tokens, dtype=torch.long)\n        return bpe_tokens_tensor\n\n    def tok_decode(self, token_ids: Union[List[int], Tensor]) -> str:\n        \"\"\"Decodes list of token ids into a sentence.\n\n        Args:\n            token_ids: A list of token ids or a 1D tensor containing token ids.\n\n        Returns:\n            The decoded sentence.\n        \"\"\"\n        if isinstance(token_ids, Tensor):\n            token_ids = token_ids.numpy().tolist()\n        text = \"\".join([self.decoder[token] for token in token_ids])\n        text = (\n            bytearray([self.byte_decoder[c] for c in text])\n            .decode(\"utf-8\", errors=\"replace\")\n            .replace(\"</w>\", \" \")\n        )\n        return text\n"
  },
  {
    "path": "corenet/third_party/modeling/__init__.py",
    "content": ""
  },
  {
    "path": "corenet/third_party/modeling/lora.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\n\"\"\"\nLoRA and DoRA models for parameter-efficient finetuning.\n\nAdapted from: https://github.com/huggingface/peft/blob/main/src/peft/tuners/lora/layer.py\n\"\"\"\nfrom __future__ import annotations\n\nimport math\nimport re\nimport warnings\nfrom abc import ABC\nfrom dataclasses import asdict, dataclass\nfrom typing import Any, Dict, List, Optional, Union\n\nimport torch\nimport torch.nn as nn\nimport torch.nn.functional as F\n\nfrom corenet.modeling.layers import embedding, linear_layer\n\n\ndef check_adapters_to_merge(\n    module: BaseTunerLayer, adapter_names: Optional[List[str]] = None\n) -> List[str]:\n    \"\"\"\n    Helper function to check which adapters should be merged.\n\n    Only return those adapters that are not already merged. Give a warning if some or all of the adapters are already\n    merged.\n\n    Args:\n        module: The module in which to check the adapters.\n        adapter_names: The names of the adapters to check.\n\n    Returns:\n        A list of adapters that are not merged.\n    \"\"\"\n    if adapter_names is None:\n        adapter_names = module.active_adapters\n\n    if module.merged:\n        merged_adapters = set(module.merged_adapters)\n        adapter_names = [name for name in adapter_names if name not in merged_adapters]\n\n        if adapter_names:\n            warnings.warn(\n                f\"Already following adapters were merged {','.join(module.merged_adapters)}. \"\n                f\"You are now additionally merging {','.join(adapter_names)}.\"\n            )\n        else:\n            warnings.warn(\"All adapters are already merged, nothing to do.\")\n\n    return adapter_names\n\n\nclass BaseTunerLayer(ABC):\n    \"\"\"\n    A tuner layer mixin that provides the common methods and attributes for all tuners.\n\n    Args:\n        is_pluggable:\n            Whether the adapter layer can be plugged to any pytorch module\n        active_adapters:\n            The name of the active adapter.\n    \"\"\"\n\n    active_adapter = None\n\n    # All names of layers that may contain adapter (trainable) weights.\n    adapter_layer_names: Tuple[str, ...] = ()\n    # All names of other parameters that may contain adapter-related parameters.\n    other_param_names: Tuple[str, ...] = ()\n\n    # Indicates whether all adapters should be disabled.\n    _disable_adapters: bool = False\n\n    # The currently active adapter(s).\n    _active_adapter: Union[List[str], str] = \"default\"\n\n    # All merged adapter(s).\n    merged_adapters: List[str] = []\n\n    def get_base_layer(self) -> nn.Module:\n        \"\"\"\n        (Recursively) get the base_layer that the adapter wraps.\n\n        This is necessary for the case that the tuner layer wraps another tuner layer.\n\n        Returns:\n            The base layer.\n        \"\"\"\n        base_layer = self\n        while hasattr(base_layer, \"base_layer\"):\n            base_layer = base_layer.base_layer\n        return base_layer\n\n    @property\n    def weight(self) -> torch.Tensor:\n        \"\"\"\n        Get the weight of the base layer that this adapter.\n\n        Returns:\n            The base layer's weight.\n        \"\"\"\n        return self.get_base_layer().weight\n\n    @property\n    def bias(self) -> torch.Tensor:\n        \"\"\"\n        Get the bias of the base layer that this adapter.\n\n        Returns:\n            The base layer's bias.\n        \"\"\"\n        return self.get_base_layer().bias\n\n    def merge(\n        self, safe_merge: bool = False, adapter_names: Optional[List[str]] = None\n    ) -> None:\n        \"\"\"\n        Merge the active adapter weights into the base weights.\n\n        Args:\n            safe_merge: If True, the merge operation will be performed in a copy of the original weights and check for NaNs\n                before merging the weights. This is useful if you want to check if the merge operation will produce\n                NaNs. Defaults to `False`.\n            adapter_names: The list of adapter names that should be merged. If None, all active adapters will be merged. Defaults\n                to `None`.\n        \"\"\"\n        raise NotImplementedError\n\n    def unmerge(self) -> None:\n        \"\"\"\n        Unmerge the adapters.\n        \"\"\"\n        raise NotImplementedError\n\n    @property\n    def merged(self) -> bool:\n        \"\"\"\n        Check whether the adapters are merged.\n\n        Returns:\n            True if the adapters are merged.\n        \"\"\"\n        return bool(self.merged_adapters)\n\n    @property\n    def disable_adapters(self) -> bool:\n        \"\"\"\n        Check if all adapters are disabled.\n\n        Returns:\n            True if the adapters are all disabled.\n        \"\"\"\n        # Use a property to ensure that disable_adapters is not set directly.\n        # See also @enable_adapters.\n        return self._disable_adapters\n\n    @property\n    def active_adapter(self) -> Union[List[str], str]:\n        \"\"\"\n        Get the active adapter.\n\n        Returns:\n            The name of the active adapter.\n        \"\"\"\n        # Use a property to ensure that active_adapter is not set directly.\n        # See also @set_adapter.\n        return self._active_adapter\n\n    @property\n    def active_adapters(self) -> List[str]:\n        \"\"\"\n        Get all active adapters.\n\n        Returns:\n            A list of active adapters.\n        \"\"\"\n        if isinstance(self.active_adapter, str):\n            return [self.active_adapter]\n        # is already a list of str\n        return self.active_adapter\n\n    def enable_adapters(self, enabled: bool) -> None:\n        \"\"\"Toggle the enabling and disabling of adapters\n\n        Takes care of setting the requires_grad flag for the adapter weights.\n\n        Args:\n            enabled: If True, adapters will be enabled. If False, they will be disabled.\n        \"\"\"\n        if enabled:\n            self.set_adapter(self.active_adapters)\n            self._disable_adapters = False\n        else:\n            # disable grads on all adapter layers\n            for layer_name in self.adapter_layer_names:\n                layer = getattr(self, layer_name)\n                layer.requires_grad_(False)\n            self._disable_adapters = True\n\n    def set_adapter(self, adapter_names: Union[str, List[str]]) -> None:\n        \"\"\"Set the active adapter(s).\n\n        Additionally, this function will set the specified adapters to trainable (i.e., requires_grad=True). If this is\n        not desired, use the following code.\n\n        ```py\n        >>> for name, param in model_peft.named_parameters():\n        ...     if ...:  # some check on name (ex. if 'lora' in name)\n        ...         param.requires_grad = False\n        ```\n\n        Args:\n            adapter_names: Name of the adapter(s) to be activated.\n        \"\"\"\n        if isinstance(adapter_names, str):\n            adapter_names = [adapter_names]\n\n        # Deactivate grads on the inactive adapter and activate grads on the active adapter.\n        for layer_name in self.adapter_layer_names:\n            module_dict = getattr(self, layer_name)\n            for key, layer in module_dict.items():\n                if key in adapter_names:\n                    # Note: It is possible that not a single layer is called with requires_grad_(True) here. This may\n                    # happen if a completely different adapter layer is being activated.\n                    layer.requires_grad_(True)\n                else:\n                    layer.requires_grad_(False)\n\n        self._active_adapter = adapter_names\n\n    def _all_available_adapter_names(self) -> List[str]:\n        \"\"\"\n        Return a sorted list of all available adapter names.\n\n        Returns:\n            A sorted list of adapter names.\n        \"\"\"\n        adapter_names = set()\n        for name in self.adapter_layer_names + self.other_param_names:\n            # We check each possible attribute and if it's a dict or ModuleDict, we assume that the keys are the adapter\n            # names\n            attr = getattr(self, name)\n            if hasattr(attr, \"keys\"):\n                adapter_names.update(attr.keys())\n        return sorted(adapter_names)\n\n    def delete_adapter(self, adapter_name: str) -> None:\n        \"\"\"\n        Delete an adapter from the layer\n\n        This should be called on all adapter layers, or else we will get an inconsistent state.\n\n        This method will also set a new active adapter if the deleted adapter was an active adapter. It is important\n        that the new adapter is chosen in a deterministic way, so that the same adapter is chosen on all layers.\n\n        Args:\n            adapter_name: The name of the adapter to delete.\n        \"\"\"\n        for attr in self.adapter_layer_names + self.other_param_names:\n            if adapter_name in getattr(self, attr):\n                del getattr(self, attr)[adapter_name]\n\n        if adapter_name in self.active_adapters:\n            # Choose a new active adapter.\n            active_adapters = self.active_adapters[:]\n            active_adapters.remove(adapter_name)\n            if active_adapters:\n                self.set_adapter(active_adapters)\n            else:\n                # No active adapters left, set a new default adapter. To do so,\n                # get the list of all adapters existing adapter names and\n                # choose the first one.\n                remaining_adapters = self._all_available_adapter_names()\n                if not remaining_adapters:\n                    self.set_adapter([])\n                else:\n                    new_active_adapter = remaining_adapters[0]\n                    warnings.warn(\n                        f\"Adapter {adapter_name} was active which is now deleted. Setting active adapter to \"\n                        f\"{new_active_adapter}.\"\n                    )\n                    self.set_adapter(remaining_adapters[0])\n\n\nclass LoraLayer(BaseTunerLayer):\n    \"\"\"A LoRA (https://arxiv.org/abs/2106.09685) layer.\n\n    See also DoRA, an extension of LoRA: https://arxiv.org/abs/2402.09353.\n\n    As per the HuggingFace API, this layer can contain multiple different adapters.\n\n    Args:\n        base_layer: The layer to wrap with LoRA.\n    \"\"\"\n\n    # All names of layers that may contain (trainable) adapter weights\n    adapter_layer_names = (\"lora_A\", \"lora_B\", \"lora_embedding_A\", \"lora_embedding_B\")\n    # All names of other parameters that may contain adapter-related parameters\n    other_param_names = (\"r\", \"lora_alpha\", \"scaling\", \"lora_dropout\")\n\n    def __init__(self, base_layer: nn.Module) -> None:\n        super().__init__()\n        self.base_layer = base_layer\n        self.r = {}\n        self.lora_alpha = {}\n        self.scaling = {}\n        self.lora_dropout = nn.ModuleDict({})\n        self.lora_A = nn.ModuleDict({})\n        self.lora_B = nn.ModuleDict({})\n        # For Embedding layers.\n        self.lora_embedding_A = nn.ParameterDict({})\n        self.lora_embedding_B = nn.ParameterDict({})\n        # Mark the weight as unmerged.\n        self._disable_adapters = False\n        self.merged_adapters = []\n        self.use_dora: dict[str, bool] = {}\n        self.lora_magnitude_vector: Optional[torch.nn.ParameterDict] = None  # for DoRA\n        self._caches: dict[str, Any] = {}\n\n        base_layer = self.get_base_layer()\n        if isinstance(base_layer, linear_layer.LinearLayer):\n            in_features, out_features = base_layer.in_features, base_layer.out_features\n        elif isinstance(base_layer, embedding.Embedding):\n            in_features, out_features = (\n                base_layer.num_embeddings,\n                base_layer.embedding_dim,\n            )\n        else:\n            raise ValueError(f\"Unsupported layer type {type(base_layer)}\")\n\n        self.in_features = in_features\n        self.out_features = out_features\n\n    def update_layer(\n        self,\n        adapter_name: str,\n        r: int,\n        lora_alpha: float,\n        lora_dropout: float,\n        init_lora_weights: Union[str, bool],\n        use_rslora: bool,\n        use_dora: bool = False,\n    ) -> None:\n        \"\"\"\n        Create an adapter with the given name.\n\n        Args:\n            adapter_name: The name of the new adapter.\n            r: The LoRA rank.\n            lora_alpha: The LoRA alpha parameter.\n            lora_dropout: The dropout to use with the LoRA module.\n            init_lora_weights: If a string, it specifies the style of initialization. If a bool value, it specifies\n                whether to initialize the weights with Kaiming uniform, or whether to skip initialization.\n        \"\"\"\n        raise NotImplementedError(f\"Implement @update_layer in the base class.\")\n\n    def reset_lora_parameters(\n        self, adapter_name: str, init_lora_weights: Union[str, bool]\n    ) -> None:\n        \"\"\"\n        Reset the LoRA parameters.\n\n        Args:\n            adapter_name: The adapter on which to reset the parameters.\n            init_lora_weights: If a string, it specifies the style of initialization. If a bool value, it specifies\n                whether to initialize the weights with Kaiming uniform, or whether to skip initialization.\n        \"\"\"\n        if init_lora_weights is False:\n            return\n\n        if adapter_name in self.lora_A.keys():\n            if init_lora_weights is True:\n                nn.init.kaiming_uniform_(\n                    self.lora_A[adapter_name].weight, a=math.sqrt(5)\n                )\n            elif init_lora_weights.lower() == \"gaussian\":\n                nn.init.normal_(\n                    self.lora_A[adapter_name].weight, std=1 / self.r[adapter_name]\n                )\n            else:\n                raise ValueError(f\"Unknown initialization {init_lora_weights=}\")\n            nn.init.zeros_(self.lora_B[adapter_name].weight)\n        if adapter_name in self.lora_embedding_A.keys():\n            nn.init.zeros_(self.lora_embedding_A[adapter_name])\n            nn.init.normal_(self.lora_embedding_B[adapter_name])\n\n    def _get_weight_norm(\n        self, weight: torch.Tensor, lora_weight: torch.Tensor, scaling: float\n    ) -> torch.Tensor:\n        \"\"\"\n        Calculate L2 norm of the combination of @weight and\n        @lora_weight * @scaling. The norm is taken across the\n        dimension with index 1.\n\n        No specific shape is required, but normally, the dimension with\n        index 1 will be the \"input_dim\" dimension of the weight tensor.\n\n        Args:\n            weight: The matrix whose norm to calculate.\n            lora_weight: The LoRA weight to add to the weight matrix.\n            scaling: The scaling to apply to the LoRA weight.\n\n        Returns:\n            The norm of the dimension with index 1 (typically the input\n            feature dimension).\n        \"\"\"\n        weight = weight + scaling * lora_weight\n        weight_norm = torch.linalg.norm(weight, dim=1).to(weight.dtype)\n        return weight_norm\n\n    def dora_init(self, adapter_name: str) -> None:\n        \"\"\"\n        Initialize the adapter with DoRA (https://arxiv.org/abs/2402.09353).\n\n        Args:\n            adapter_name: The name of the adapter to initialize.\n        \"\"\"\n        lora_A = self.lora_A[adapter_name]\n        lora_B = self.lora_B[adapter_name]\n        scaling = self.scaling[adapter_name]\n        weight = self.weight\n        if weight.data.ndim == 4:  # For handling LoRAs applied to Conv2Ds.\n            # Leave this check to make it clear that this codepath needs to\n            # be edited if Conv2d support is added.\n            raise NotImplementedError(f\"Conv2d is not currently supported.\")\n        else:\n            lora_weight = lora_B.weight @ lora_A.weight\n        weight_norm = self._get_weight_norm(weight, lora_weight, scaling)\n\n        self.lora_magnitude_vector = nn.ParameterDict()\n        self.lora_magnitude_vector[adapter_name] = nn.Parameter(\n            weight_norm, requires_grad=True\n        )\n        self.adapter_layer_names = self.adapter_layer_names[:] + (\n            \"lora_magnitude_vector\",\n        )\n\n    def _cache_store(self, key: str, value: Any) -> None:\n        \"\"\"\n        Store @value in the cache using @key.\n\n        Args:\n            key: The key to use.\n            value: The value to store.\n        \"\"\"\n        self._caches[key] = value\n\n    def _cache_pop(self, key: str) -> Any:\n        \"\"\"\n        Pop a value from the cache with index @key.\n\n        Args:\n            key: The key to use.\n\n        Returns:\n            The value corresponding to the key.\n        \"\"\"\n        value = self._caches.pop(key)\n        return value\n\n    def _apply_dora(\n        self,\n        x: torch.Tensor,\n        lora_A: torch.Tensor,\n        lora_B: torch.Tensor,\n        scaling: float,\n        active_adapter: str,\n    ) -> torch.Tensor:\n        \"\"\"\n        For DoRA, calculate the extra output from LoRA with DoRA applied. This should be added on top of the base layer\n        output.\n\n        Args:\n            x: The inputs. The shape depends on the type of the wrapped\n                layer, but the inputs will be a suitable shape for the\n                wrapped layer.\n            lora_A: LoRA's A matrix. The shape depends on the type of the\n                wrapped layer.\n            lora_B: LoRA's B matrix. The shape depends on the type of the\n                wrapped layer.\n            scaling: The LoRA scale parameter.\n            active_adapter: The adapter to use.\n\n        Returns:\n            The weight combined with DoRA.\n        \"\"\"\n        lora_weight = lora_B.weight @ lora_A.weight\n        magnitude = self.lora_magnitude_vector[active_adapter]\n        weight = self.get_base_layer().weight\n        quant_state = getattr(self.get_base_layer(), \"state\", None)\n        weight = weight.to(x.dtype)\n        weight_norm = self._get_weight_norm(weight, lora_weight, scaling)\n        # See section 4.3 of DoRA (https://arxiv.org/abs/2402.09353)\n        # \"[...] we suggest treating ||V + \\delta V ||_c in\n        # Eq. (5) as a constant, thereby detaching it from the gradient\n        # graph. This means that while ||V + \\delta V ||_c dynamically\n        # reflects the updates of \\delta V , it won’t receive any gradient\n        # during backpropagation\".\n        weight_norm = weight_norm.detach()\n        mag_norm_scale = (magnitude / weight_norm).view(1, -1)\n        result_dora = (mag_norm_scale - 1) * (\n            F.linear(x, weight)\n        ) + mag_norm_scale * lora_B(lora_A(x)) * scaling\n\n        return result_dora\n\n    def set_scale(self, adapter: str, scale: float) -> None:\n        \"\"\"\n        Set the LoRA scale.\n\n        Args:\n            adapter: The adapter to use.\n            scale: The scale to set.\n        \"\"\"\n\n        if adapter not in self.scaling:\n            # Ignore the case where the adapter is not in the layer\n            return\n        self.scaling[adapter] = scale * self.lora_alpha[adapter] / self.r[adapter]\n\n    def scale_layer(self, scale: float) -> None:\n        \"\"\"\n        Apply @scale to the active adapter.\n\n        Args:\n            scale: The scale to apply.\n        \"\"\"\n        if scale == 1:\n            return\n\n        for active_adapter in self.active_adapters:\n            if active_adapter in self.lora_A.keys():\n                self.scaling[active_adapter] *= scale\n\n    def unscale_layer(self, scale: float = None) -> None:\n        \"\"\"\n        If @scale is not None, apply the inverse of @scale to the active adapter.\n\n        If scale is None, set the active adapter's scale to (alpha / r).\n\n        Args:\n            scale: The scale to apply, or None.\n        \"\"\"\n        for active_adapter in self.active_adapters:\n            if active_adapter in self.lora_A.keys():\n                if scale is None:\n                    self.scaling[active_adapter] = (\n                        self.lora_alpha[active_adapter] / self.r[active_adapter]\n                    )\n                else:\n                    self.scaling[active_adapter] /= scale\n\n    def _check_forward_args(\n        self, x: torch.Tensor, *args: List[Any], **kwargs: Dict[str, Any]\n    ):\n        \"\"\"\n        Check if the arguments are compatible with the configs and state of the model.\n\n        Args:\n            x: The input.\n            args: The forward pass args.\n            kwargs: The forward pass kwargs.\n        \"\"\"\n        adapter_names = kwargs.get(\"adapter_names\", None)\n        if adapter_names is None:\n            return\n\n        if len(x) != len(adapter_names):\n            msg = (\n                \"Length of `adapter_names` should be the same as the number of inputs, but got \"\n                f\"{len(adapter_names)} and {len(x)} respectively.\"\n            )\n            raise ValueError(msg)\n\n        if self.merged:\n            # It is unclear what would be the right thing to do if users pass adapter_names and there are merged\n            # adapters. Therefore, it is better to raise an error in this case.\n            msg = \"Cannot pass `adapter_names` when there are merged adapters, please call `unmerge_adapter` first.\"\n            raise ValueError(msg)\n\n        unique_adapters = set(self.active_adapters)\n        for adapter_name in unique_adapters:\n            if self.use_dora.get(adapter_name, False):\n                msg = \"Cannot pass `adapter_names` when DoRA is enabled.\"\n                raise ValueError(msg)\n\n    def _mixed_batch_forward(\n        self,\n        x: torch.Tensor,\n        *args: List[Any],\n        adapter_names: List[str],\n        **kwargs: Dict[str, Any],\n    ) -> torch.Tensor:\n        \"\"\"\n        This is a special method that handles the case when users pass the argument `adapter_names`. This is an\n        extra argument that allows mixing different adapters in the same batch at inference time.\n\n        Args:\n            x: The input. Its shape is suitable for input to the wrapped layer.\n            args: The forward pass args.\n            adapter_names: The adapters to use for each batch element. Its length should equal the batch size.\n            kwargs: The forward pass kwargs.\n        \"\"\"\n        result = self.base_layer(x, *args, **kwargs)\n        torch_result_dtype = result.dtype\n\n        unique_adapters = set(adapter_names)\n        sub_batch_indices_list = []\n        for adapter in unique_adapters:\n            sub_batch_indices_list.append(\n                [index for index, item in enumerate(adapter_names) if item == adapter]\n            )\n\n        for i, active_adapter in enumerate(unique_adapters):\n            if active_adapter == \"__base__\":\n                continue\n            if active_adapter not in self.lora_A.keys():\n                continue\n\n            lora_A = self.lora_A[active_adapter]\n            lora_B = self.lora_B[active_adapter]\n            dropout = self.lora_dropout[active_adapter]\n            scaling = self.scaling[active_adapter]\n\n            # Getting the sub-batch, passing it to LoRA layers and updating the\n            # corresponding indices of the linear layer output.\n            sub_batch = x[sub_batch_indices_list[i]].to(lora_A.weight.dtype)\n            lora_output = lora_B(lora_A(dropout(sub_batch))) * scaling\n            result[sub_batch_indices_list[i]] += lora_output.to(torch_result_dtype)\n\n        return result\n\n\nclass Linear(nn.Module, LoraLayer):\n    \"\"\"\n    Create a LoRA linear layer.\n\n    Args:\n        base_layer: The layer to wrap.\n        adapter_name: The name of the adapter. Needed since BaseFineTune\n            supports using multiple adapters at once.\n        r: The LoRA rank.\n        lora_alpha: The LoRA alpha parameter.\n        lora_dropout: The LoRA dropout parameter.\n        init_lora_weights: Whether to initialize LoRA weights.\n        use_rslora: Whether to use RS Lora.\n        use_dora: Whether to use DoRA.\n    \"\"\"\n\n    def __init__(\n        self,\n        base_layer: nn.Module,\n        adapter_name: str,\n        r: int = 0,\n        lora_alpha: int = 1,\n        lora_dropout: float = 0.0,\n        init_lora_weights: Union[bool, str] = True,\n        use_rslora: bool = False,\n        use_dora: bool = False,\n    ) -> None:\n        nn.Module.__init__(self)\n        LoraLayer.__init__(self, base_layer)\n\n        self._active_adapter = adapter_name\n        self.update_layer(\n            adapter_name,\n            r,\n            lora_alpha=lora_alpha,\n            lora_dropout=lora_dropout,\n            init_lora_weights=init_lora_weights,\n            use_rslora=use_rslora,\n            use_dora=use_dora,\n        )\n\n    def update_layer(\n        self,\n        adapter_name: str,\n        r: int,\n        lora_alpha: float,\n        lora_dropout: float,\n        init_lora_weights: str,\n        use_rslora: bool,\n        use_dora: bool = False,\n    ) -> None:\n        \"\"\"\n        Create an adapter with the given name.\n\n        Args:\n            adapter_name: The name of the new adapter.\n            r: The LoRA rank.\n            lora_alpha: The LoRA alpha parameter.\n            lora_dropout: The dropout to use with the LoRA module.\n            init_lora_weights: If a string, it specifies the style of initialization. If a bool value, it specifies\n                whether to initialize the weights with Kaiming uniform, or whether to skip initialization.\n        \"\"\"\n\n        if r <= 0:\n            raise ValueError(f\"Unexpected lora rank {r=}\")\n\n        self.r[adapter_name] = r\n        self.lora_alpha[adapter_name] = lora_alpha\n        if lora_dropout > 0.0:\n            lora_dropout_layer = nn.Dropout(p=lora_dropout)\n        else:\n            lora_dropout_layer = nn.Identity()\n\n        self.lora_dropout.update(nn.ModuleDict({adapter_name: lora_dropout_layer}))\n        # Create the LoRA parameters.\n        self.lora_A[adapter_name] = nn.Linear(self.in_features, r, bias=False)\n        self.lora_B[adapter_name] = nn.Linear(r, self.out_features, bias=False)\n        if use_rslora:\n            self.scaling[adapter_name] = lora_alpha / math.sqrt(r)\n        else:\n            self.scaling[adapter_name] = lora_alpha / r\n\n        if init_lora_weights:\n            self.reset_lora_parameters(adapter_name, init_lora_weights)\n\n        if self.weight.dtype.is_floating_point or self.weight.dtype.is_complex:\n            self.to(self.weight.device, dtype=self.weight.dtype)\n        else:\n            self.to(self.weight.device)\n\n        if use_dora:\n            self.dora_init(adapter_name)\n            self.use_dora[adapter_name] = True\n        else:\n            self.use_dora[adapter_name] = False\n\n        self.set_adapter(self.active_adapters)\n\n    def merge(\n        self, safe_merge: bool = False, adapter_names: Optional[List[str]] = None\n    ) -> None:\n        \"\"\"\n        Merge the active adapter weights into the base weights.\n\n        Args:\n            safe_merge: If True, the merge operation will be performed in a copy of the original weights and check for NaNs\n                before merging the weights. This is useful if you want to check if the merge operation will produce\n                NaNs. Defaults to `False`.\n            adapter_names: The list of adapter names that should be merged. If None, all active adapters will be merged. Defaults\n                to `None`.\n        \"\"\"\n\n        adapter_names = check_adapters_to_merge(self, adapter_names)\n        if not adapter_names:\n            return\n\n        for active_adapter in adapter_names:\n            if active_adapter in self.lora_A.keys():\n                base_layer = self.get_base_layer()\n                if safe_merge:\n                    # Note that safe_merge will be slower than the normal merge\n                    # because of the copy operation.\n                    orig_weights = base_layer.weight.data.clone()\n                    delta_weight = self.get_delta_weight(active_adapter)\n                    if not self.use_dora[active_adapter]:\n                        orig_weights = orig_weights + delta_weight\n                    else:\n                        # Handle dora.\n                        # Since delta_weight already includes scaling, set it to 1 here\n                        weight_norm = self._get_weight_norm(\n                            orig_weights, delta_weight, scaling=1\n                        ).detach()\n                        # We need to cache weight_norm because it has to be based on the original weights. We\n                        # cannot calculate it on the fly based on the merged weights when unmerging because its a\n                        # different value.\n                        self._cache_store(f\"{active_adapter}-weight_norm\", weight_norm)\n                        dora_factor = (\n                            self.lora_magnitude_vector[active_adapter] / weight_norm\n                        )\n                        orig_weights = dora_factor.view(-1, 1) * (\n                            orig_weights + delta_weight\n                        )\n\n                    if not torch.isfinite(orig_weights).all():\n                        raise ValueError(\n                            f\"NaNs detected in the merged weights. The adapter {active_adapter} seems to be broken\"\n                        )\n\n                    base_layer.weight.data = orig_weights\n                else:\n                    delta_weight = self.get_delta_weight(active_adapter)\n                    if not self.use_dora[active_adapter]:\n                        base_layer.weight.data = base_layer.weight.data + delta_weight\n                    else:\n                        # Handle dora.\n                        # Since delta_weight already includes scaling, set it to 1 here\n                        weight_norm = self._get_weight_norm(\n                            base_layer.weight, delta_weight, scaling=1\n                        ).detach()\n                        # We need to cache weight_norm because it has to be based on the original weights. We\n                        # cannot calculate it on the fly based on the merged weights when unmerging because its a\n                        # different value\n                        self._cache_store(f\"{active_adapter}-weight_norm\", weight_norm)\n                        dora_factor = (\n                            self.lora_magnitude_vector[active_adapter] / weight_norm\n                        )\n                        new_weight = dora_factor.view(-1, 1) * (\n                            base_layer.weight.data + delta_weight\n                        )\n                        base_layer.weight.data = new_weight\n\n                self.merged_adapters.append(active_adapter)\n\n    def unmerge(self) -> None:\n        \"\"\"\n        Unmerge the adapters.\n        \"\"\"\n        if not self.merged:\n            warnings.warn(\"Already unmerged. Nothing to do.\")\n            return\n        while len(self.merged_adapters) > 0:\n            active_adapter = self.merged_adapters.pop()\n            if active_adapter in self.lora_A.keys():\n                weight = self.get_base_layer().weight\n                delta_weight = self.get_delta_weight(active_adapter)\n                if not self.use_dora[active_adapter]:\n                    weight.data -= delta_weight\n                else:\n                    weight_norm = self._cache_pop(f\"{active_adapter}-weight_norm\")\n                    dora_factor = (\n                        self.lora_magnitude_vector[active_adapter] / weight_norm\n                    )\n                    weight_orig = weight.data / dora_factor.view(-1, 1) - delta_weight\n                    weight.data = weight_orig\n\n    def get_delta_weight(self, adapter: str) -> torch.Tensor:\n        \"\"\"\n        Compute the delta weight for the given adapter.\n\n        Args:\n            adapter:\n                The name of the adapter for which the delta weight should be computed.\n\n        Returns:\n            The delta weight. It will be a 2-dimensional tensor of the same\n            shape as the wrapped layer's weight.\n        \"\"\"\n        device = self.lora_B[adapter].weight.device\n        dtype = self.lora_B[adapter].weight.dtype\n\n        # In case users wants to merge the adapter weights that are in\n        # float16 while being on CPU, we need to cast the weights to float32, perform the merge and then cast back to\n        # float16 because the `@` and matmul operation in general is not supported in torch + cpu + fp16.\n        cast_to_fp32 = device.type == \"cpu\" and dtype == torch.float16\n\n        weight_A = self.lora_A[adapter].weight\n        weight_B = self.lora_B[adapter].weight\n\n        if cast_to_fp32:\n            weight_A = weight_A.float()\n            weight_B = weight_B.float()\n\n        output_tensor = (weight_B @ weight_A) * self.scaling[adapter]\n\n        if cast_to_fp32:\n            output_tensor = output_tensor.to(dtype=dtype)\n\n            # cast back the weights\n            self.lora_A[adapter].weight.data = weight_A.to(dtype)\n            self.lora_B[adapter].weight.data = weight_B.to(dtype)\n\n        return output_tensor\n\n    def forward(\n        self, x: torch.Tensor, *args: List[Any], **kwargs: Dict[str, Any]\n    ) -> torch.Tensor:\n        \"\"\"\n        Run a forward pass with the active adapters.\n\n        Args:\n            x: The input of shape [batch_size, ..., feature_dim].\n            args: Forward pass args.\n            kwargs: Forward pass kwargs.\n        \"\"\"\n        self._check_forward_args(x, *args, **kwargs)\n        adapter_names = kwargs.pop(\"adapter_names\", None)\n\n        if self.disable_adapters:\n            if self.merged:\n                self.unmerge()\n            result = self.base_layer(x, *args, **kwargs)\n        elif adapter_names is not None:\n            result = self._mixed_batch_forward(\n                x, *args, adapter_names=adapter_names, **kwargs\n            )\n        elif self.merged:\n            result = self.base_layer(x, *args, **kwargs)\n        else:\n            result = self.base_layer(x, *args, **kwargs)\n            torch_result_dtype = result.dtype\n            for active_adapter in self.active_adapters:\n                if active_adapter not in self.lora_A.keys():\n                    continue\n                lora_A = self.lora_A[active_adapter]\n                lora_B = self.lora_B[active_adapter]\n                dropout = self.lora_dropout[active_adapter]\n                scaling = self.scaling[active_adapter]\n                x = x.to(lora_A.weight.dtype)\n\n                if not self.use_dora[active_adapter]:\n                    result = result + lora_B(lora_A(dropout(x))) * scaling\n                else:\n                    x = dropout(x)\n                    result = result + self._apply_dora(\n                        x, lora_A, lora_B, scaling, active_adapter\n                    )\n\n            result = result.to(torch_result_dtype)\n\n        return result\n\n    def __repr__(self) -> str:\n        \"\"\"\n        Get a string representation of the layer.\n\n        Returns:\n            A string representation of the layer.\n        \"\"\"\n        rep = super().__repr__()\n        return \"lora.\" + rep\n\n\nclass Embedding(nn.Module, LoraLayer):\n    \"\"\"\n    Create a LoRA embedding layer.\n\n    Args:\n        base_layer: The layer to wrap.\n        adapter_name: The name of the adapter. Needed since BaseFineTune\n            supports using multiple adapters at once.\n        r: The LoRA rank.\n        lora_alpha: The LoRA alpha parameter.\n        lora_dropout: The LoRA dropout parameter.\n        init_lora_weights: Whether to initialize LoRA weights.\n        use_rslora: Whether to use RS Lora.\n        use_dora: Whether to use DoRA.\n    \"\"\"\n\n    def __init__(\n        self,\n        base_layer: nn.Module,\n        adapter_name: str,\n        r: int = 0,\n        lora_alpha: int = 1,\n        lora_dropout: float = 0.0,\n        init_lora_weights: Union[bool, str] = True,\n        use_rslora: bool = False,\n        use_dora: bool = False,\n    ) -> None:\n        nn.Module.__init__(self)\n        LoraLayer.__init__(self, base_layer)\n\n        # DoRA is not supported yet.\n        if use_dora:\n            raise ValueError(\"DoRA is not yet supported for Embedding layers.\")\n\n        self._active_adapter = adapter_name\n        self.update_layer(\n            adapter_name,\n            r,\n            lora_alpha=lora_alpha,\n            lora_dropout=lora_dropout,\n            init_lora_weights=init_lora_weights,\n            use_rslora=use_rslora,\n            use_dora=use_dora,\n        )\n\n    def update_layer(\n        self,\n        adapter_name: str,\n        r: int,\n        lora_alpha: float,\n        lora_dropout: float,\n        init_lora_weights: Union[str, bool],\n        use_rslora: bool,\n        use_dora: bool = False,\n    ) -> None:\n        \"\"\"\n        Create an adapter with the given name.\n\n        Args:\n            adapter_name: The name of the new adapter.\n            r: The LoRA rank.\n            lora_alpha: The LoRA alpha parameter.\n            lora_dropout: The dropout to use with the LoRA module.\n            init_lora_weights: If a string, it specifies the style of initialization. If a bool value, it specifies\n                whether to initialize the weights with Kaiming uniform, or whether to skip initialization.\n        \"\"\"\n        if use_dora:\n            raise ValueError(f\"DoRA is not yet supported.\")\n        if r <= 0:\n            raise ValueError(f\"Invalid LoRA rank {r=}\")\n\n        self.r[adapter_name] = r\n        self.lora_alpha[adapter_name] = lora_alpha\n        if lora_dropout > 0.0:\n            lora_dropout_layer = nn.Dropout(p=lora_dropout)\n        else:\n            lora_dropout_layer = nn.Identity()\n\n        self.lora_dropout[adapter_name] = lora_dropout_layer\n        # Actual trainable parameters\n        weight_A = torch.randn((r, self.in_features))\n        weight_B = torch.randn((self.out_features, r))\n        self.lora_embedding_A[adapter_name] = nn.Parameter(weight_A)\n        self.lora_embedding_B[adapter_name] = nn.Parameter(weight_B)\n        if use_rslora:\n            self.scaling[adapter_name] = lora_alpha / math.sqrt(r)\n        else:\n            self.scaling[adapter_name] = lora_alpha / r\n\n        if init_lora_weights:\n            self.reset_lora_parameters(adapter_name, init_lora_weights)\n\n        base_layer = self.get_base_layer()\n        weight = getattr(base_layer, \"weight\", None)\n        if weight is not None:\n            # The layer is already completely initialized, this is an update.\n            self.to(base_layer.weight.device, dtype=weight.dtype)\n\n        self.set_adapter(self.active_adapters)\n\n    def merge(\n        self, safe_merge: bool = False, adapter_names: Optional[List[str]] = None\n    ) -> None:\n        \"\"\"\n        Merge the active adapter weights into the base weights.\n\n        Args:\n            safe_merge: If True, the merge operation will be performed in a copy of the original weights and check for NaNs\n                before merging the weights. This is useful if you want to check if the merge operation will produce\n                NaNs. Defaults to `False`.\n            adapter_names: The list of adapter names that should be merged. If None, all active adapters will be merged. Defaults\n                to `None`.\n        \"\"\"\n\n        adapter_names = check_adapters_to_merge(self, adapter_names)\n        if not adapter_names:\n            # no adapter to merge\n            return\n\n        for active_adapter in adapter_names:\n            if active_adapter in self.lora_embedding_A.keys():\n                base_layer = self.get_base_layer()\n                if safe_merge:\n                    # Note that safe_merge will be slower than the normal merge\n                    # because of the copy operation.\n                    orig_weights = base_layer.weight.data.clone()\n                    orig_weights = orig_weights + self.get_delta_weight(active_adapter)\n\n                    if not torch.isfinite(orig_weights).all():\n                        raise ValueError(\n                            f\"NaNs detected in the merged weights. The adapter {active_adapter} seems to be broken\"\n                        )\n\n                    base_layer.weight.data = orig_weights\n                else:\n                    base_layer.weight.data = (\n                        base_layer.weight.data + self.get_delta_weight(active_adapter)\n                    )\n                self.merged_adapters.append(active_adapter)\n\n    def unmerge(self) -> None:\n        \"\"\"\n        Unmerge the adapters.\n        \"\"\"\n        if not self.merged:\n            warnings.warn(\"Already unmerged. Nothing to do.\")\n            return\n        while len(self.merged_adapters) > 0:\n            active_adapter = self.merged_adapters.pop()\n            if active_adapter in self.lora_embedding_A.keys():\n                self.get_base_layer().weight.data -= self.get_delta_weight(\n                    active_adapter\n                )\n\n    def get_delta_weight(self, adapter: str) -> torch.Tensor:\n        \"\"\"\n        Compute the delta weight for the given adapter.\n\n        Args:\n            adapter:\n                The name of the adapter for which the delta weight should be\n                computed.\n        Returns:\n            The delta weight. It will have the same shape as the wrapped\n            layer's weight.\n        \"\"\"\n        device = self.lora_embedding_B[adapter].device\n        dtype = self.lora_embedding_A[adapter].dtype\n\n        # In case users wants to merge the adapter weights that are in\n        # float16 while being on CPU, we need to cast the weights to float32, perform the merge and then cast back to\n        # float16 because the `@` and matmul operation in general is not supported in torch + cpu + fp16.\n        cast_to_fp32 = device.type == \"cpu\" and dtype == torch.float16\n\n        weight_A = self.lora_embedding_A[adapter]\n        weight_B = self.lora_embedding_B[adapter]\n\n        if cast_to_fp32:\n            weight_A = weight_A.float()\n            weight_B = weight_B.float()\n\n        output_tensor = (weight_B @ weight_A) * self.scaling[adapter]\n\n        if cast_to_fp32:\n            output_tensor = output_tensor.to(dtype=dtype)\n\n            # cast back the weights\n            self.lora_embedding_A[adapter] = weight_A.to(dtype)\n            self.lora_embedding_B[adapter] = weight_B.to(dtype)\n\n        return output_tensor\n\n    def _mixed_batch_forward(\n        self,\n        x: torch.Tensor,\n        *args: List[Any],\n        adapter_names: List[str],\n        **kwargs: Dict[str, Any],\n    ) -> torch.Tensor:\n        \"\"\"\n        This is a special method that handles the case when users pass the argument `adapter_names`. This is an\n        extra argument that allows mixing different adapters in the same batch at inference time.\n\n        Args:\n            x: The input.\n            args: The forward pass args.\n            adapter_names: The adapters to use for each batch element. Its length should equal the batch size.\n            kwargs: The forward pass kwargs.\n        Returns:\n            The result of the forward pass.\n        \"\"\"\n        result = self.base_layer(x, *args, **kwargs)\n\n        unique_adapters = set(adapter_names)\n        sub_batch_indices_list = []\n        for adapter in unique_adapters:\n            sub_batch_indices_list.append(\n                [index for index, item in enumerate(adapter_names) if item == adapter]\n            )\n\n        for i, active_adapter in enumerate(unique_adapters):\n            if active_adapter == \"__base__\":\n                continue\n            if active_adapter not in self.lora_embedding_A.keys():\n                continue\n\n            embedding_A = self.lora_embedding_A[active_adapter].T\n            embedding_B = self.lora_embedding_B[active_adapter].T\n            scaling = self.scaling[active_adapter]\n\n            # getting the sub-batch, passing it to LoRA layers and updating the corresponding indices of the linear\n            # layer output\n            sub_batch = x[sub_batch_indices_list[i]]\n            after_A = self._embed(sub_batch, embedding_A)\n            result[sub_batch_indices_list[i]] += (after_A @ embedding_B) * scaling\n\n        return result\n\n    def _embed(self, input: torch.Tensor, weight: torch.Tensor) -> torch.Tensor:\n        \"\"\"\n        Embed the inputs using self.base_layer and the given LoRA weight.\n\n        Args:\n            input: The inputs to embed, of shape [batch_size, seq_len].\n            weight: The LoRA weight to use.\n        Returns:\n            The output embedding, of shape [batch_size, seq_len, feature_dim].\n        \"\"\"\n        base_layer = self.get_base_layer()\n        return F.embedding(\n            input,\n            weight,\n            padding_idx=base_layer.padding_idx,\n            max_norm=base_layer.max_norm,\n            norm_type=base_layer.norm_type,\n            scale_grad_by_freq=base_layer.scale_grad_by_freq,\n            sparse=base_layer.sparse,\n        )\n\n    def forward(\n        self, x: torch.Tensor, *args: List[Any], **kwargs: Dict[str, Any]\n    ) -> torch.Tensor:\n        \"\"\"\n        Run a forward pass with the active adapters.\n\n        Args:\n            x: The input of shape [batch_size, seq_len].\n            args: Forward pass args.\n            kwargs: Forward pass kwargs.\n        Returns:\n            The output of shape [batch_size, seq_len, feature_dim].\n        \"\"\"\n        self._check_forward_args(x, *args, **kwargs)\n        adapter_names = kwargs.pop(\"adapter_names\", None)\n\n        if self.disable_adapters:\n            if self.merged:\n                self.unmerge()\n            result = self.base_layer(x, *args, **kwargs)\n        elif adapter_names is not None:\n            result = self._mixed_batch_forward(\n                x, *args, adapter_names=adapter_names, **kwargs\n            )\n        elif self.merged:\n            result = self.base_layer(x, *args, **kwargs)\n        else:\n            result = self.base_layer(x, *args, **kwargs)\n            torch_result_dtype = result.dtype\n            for active_adapter in self.active_adapters:\n                if active_adapter not in self.lora_embedding_A:\n                    continue\n                embedding_A = self.lora_embedding_A[active_adapter].T\n                embedding_B = self.lora_embedding_B[active_adapter].T\n                scaling = self.scaling[active_adapter]\n                after_A = self._embed(x, embedding_A)\n                result = result + (after_A @ embedding_B) * scaling\n            result = result.to(torch_result_dtype)\n\n        return result\n\n    def __repr__(self) -> str:\n        \"\"\"\n        Get a string representation of the layer.\n\n        Returns:\n            A string representation of the layer.\n        \"\"\"\n        rep = super().__repr__()\n        return \"lora.\" + rep\n\n\n@dataclass\nclass LoRAParams:\n    \"\"\"\n    The LoRA parameters used to construct a layer.\n\n    Args:\n        adapter_name: The name of the adapter. Needed since BaseFineTune\n            supports using multiple adapters at once.\n        r: The LoRA rank.\n        lora_alpha: The LoRA alpha parameter.\n        lora_dropout: The LoRA dropout parameter.\n        init_lora_weights: Whether to initialize LoRA weights.\n        use_rslora: Whether to use RS Lora.\n        use_dora: Whether to use DoRA.\n    \"\"\"\n\n    adapter_name: str\n    r: int\n    lora_alpha: int\n    lora_dropout: float\n    init_lora_weights: Union[bool, str]\n    use_rslora: bool\n    use_dora: bool\n\n    @classmethod\n    def from_json(cls, config: Dict[str, Any]) -> LayerConfig:\n        \"\"\"\n        Build a LoRAParams from a dictionary.\n\n        Args:\n            config: The dictionary.\n\n        Returns:\n            The LayerConfig.\n        \"\"\"\n        return LoRAParams(**config)\n\n    def to_json(self) -> Dict[str, Any]:\n        \"\"\"\n        Convert the LoRAParams to a dictionary.\n\n        Returns:\n            The dictionary.\n        \"\"\"\n        return asdict(self)\n\n\n@dataclass\nclass LayerConfig:\n    \"\"\"\n    A configuration that gives which layers to apply a LoRAParams config to.\n\n    Args:\n        regex: A regex specifying which modules the LoRAParams apply to. Every matching\n            layer will be wrapped with LoRA.\n        module_type: The type of LoRA module.\n        params: The LoRAParams specifying the LoRA configuration.\n    \"\"\"\n\n    regex: str\n    module_type: str\n    params: LoRAParams\n\n    @classmethod\n    def from_json(cls, config: Dict[str, Any]) -> LayerConfig:\n        \"\"\"\n        Build a LayerConfig from a dictionary.\n\n        Args:\n            config: The dictionary.\n\n        Returns:\n            The LayerConfig.\n        \"\"\"\n        return LayerConfig(\n            config[\"regex\"],\n            config[\"module_type\"],\n            LoRAParams.from_json(config[\"params\"]),\n        )\n\n\n@dataclass\nclass LoRAConfig:\n    \"\"\"\n    A configuration of LoRA parameters for a model.\n\n    Args:\n        layer_configs: A list of LayerConfigs that specify where to apply LoRA parameters for a model.\n    \"\"\"\n\n    layer_configs: List[LayerConfig]\n\n    @classmethod\n    def from_json(cls, config: Dict[str, Any]) -> LoRAConfig:\n        \"\"\"\n        Build a LayerConfig from a dictionary.\n\n        Args:\n            config: The dictionary.\n\n        Returns:\n            The LayerConfig.\n        \"\"\"\n\n        layer_configs = []\n        for elem in config:\n            layer_configs.append(LayerConfig.from_json(elem))\n        return LoRAConfig(layer_configs)\n\n\ndef make_lora_layer(module: nn.Module, layer_config: LoRAConfig) -> LoraLayer:\n    \"\"\"\n    Create a LoRA layer that wraps @module using the given @layer_config.\n\n    Args:\n        module: The module to wrap.\n        layer_config: The LoRA layer config.\n\n    Returns:\n        The LoRA layer.\n    \"\"\"\n    return {\"embedding\": Embedding, \"linear\": Linear}[layer_config.module_type](\n        module, **layer_config.params.to_json()\n    )\n\n\ndef get_module_to_parents(\n    model: nn.Module,\n) -> Dict[nn.Module, List[Tuple[str, nn.Module]]]:\n    \"\"\"\n    Get a dictionary mapping a module to all of its parents.\n\n    Note that a module can have multiple parents, e.g. if a layer is shared.\n\n    Args:\n        model: The model for which to build the mapping.\n\n    Returns:\n        A dictionary containing:\n            {\n                child_module: [(\"name_of_parent_1\", parent1), ...]\n            }\n    \"\"\"\n    ret = {module: [] for module in model.modules()}\n    for parent in model.modules():\n        for child_name, child in parent.named_children():\n            ret[child].append([parent, child_name])\n    return ret\n\n\ndef add_lora_layers(model: nn.Module, lora_config: Dict[str, Any]) -> None:\n    \"\"\"\n    Add LoRA layers to the given @model using the given @lora_config.\n\n    Args:\n        model: The model to add LoRA parameters to.\n        lora_config: The configuration specifying where to add LoRA parameters.\n    \"\"\"\n    lora_config = LoRAConfig.from_json(lora_config)\n\n    # Create a graph pointing from each module to its parents.\n    # Each module can have multiple parents (e.g. in the case of\n    # a shared layer).\n    module_to_parents = get_module_to_parents(model)\n\n    replaced_layers = set()\n    module_remapping = {}\n\n    for name, module in model.named_modules(remove_duplicate=False):\n        for layer_config in lora_config.layer_configs:\n            if re.match(layer_config.regex, name):\n                if name in replaced_layers:\n                    # We do not allow @name to match multiple different regexes. It leads to ambiguity\n                    # in which LoRAConfig should be used.\n                    raise ValueError(\n                        f\"Layer {name} matched multiple regexes. Invalid lora_config:\\n{lora_config}.\"\n                    )\n                replaced_layers.add(name)\n\n                if module in module_remapping:\n                    # This can happen even if the check above (making sure @name wasn't already in @replaced_layers)\n                    # succeeds. This is because a module can have multiple names (e.g. if it is shared between two layers),\n                    # which means it can match multiple different regexes without the @name having already been encountered.\n                    raise ValueError(\n                        f\"Module with name {name} has already been converted to LoRA, and would be again.\"\n                    )\n\n                module_remapping[module] = make_lora_layer(module, layer_config)\n\n    for module, new_module in module_remapping.items():\n        for parent, child_name in module_to_parents[module]:\n            setattr(parent, child_name, new_module)\n"
  },
  {
    "path": "corenet/third_party/modeling/ssd_utils.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport math\nfrom typing import Optional, Tuple\n\nimport torch\nfrom torch import Tensor\n\n\"\"\"\nThis source code in this file is adapted from following repos, both of which are released under MIT license.\n    Repository Link:\n        https://github.com/sacmehta/EdgeNets\n        https://github.com/qfgaohao/pytorch-ssd\n    File Link:\n        https://github.com/sacmehta/EdgeNets/blob/master/model/detection/match_priors.py\n\"\"\"\n\n\ndef assign_priors(\n    gt_boxes: Tensor,\n    gt_labels: Tensor,\n    corner_form_priors: Tensor,\n    iou_threshold: float,\n    background_id: Optional[int] = 0,\n    *args,\n    **kwargs\n) -> Tuple[Tensor, Tensor]:\n    \"\"\"\n    Assign ground truth boxes and targets to priors (or anchors)\n\n    Args:\n        gt_boxes (Tensor): Ground-truth boxes tensor of shape (num_targets, 4)\n        gt_labels (Tensor): Ground-truth labels of shape (num_targets)\n        corner_form_priors (Tensor): Priors in corner form and has shape (num_priors, 4)\n        iou_threshold (float): Overlap between priors and gt_boxes.\n        background_id (int): Background class index. Default: 0\n\n    Returns:\n        boxes (Tensor): Boxes mapped to priors and has shape (num_priors, 4)\n        labels (Tensor): Labels for mapped boxes and has shape (num_priors)\n    \"\"\"\n\n    if gt_labels.nelement() == 0:\n        # Images may not have any labels\n        dev = corner_form_priors.device\n        gt_boxes = torch.zeros((1, 4), dtype=torch.float32, device=dev)\n        gt_labels = torch.zeros(1, dtype=torch.int64, device=dev)\n\n    ious = box_iou(gt_boxes.unsqueeze(0), corner_form_priors.unsqueeze(1))\n\n    # size: num_priors\n    best_target_per_prior, best_target_per_prior_index = ious.max(1)\n    # size: num_targets\n    best_prior_per_target, best_prior_per_target_index = ious.max(0)\n\n    for target_index, prior_index in enumerate(best_prior_per_target_index):\n        best_target_per_prior_index[prior_index] = target_index\n    # 2.0 is used to make sure every target has a prior assigned\n    best_target_per_prior.index_fill_(0, best_prior_per_target_index, 2)\n    # size: num_priors\n    labels = gt_labels[best_target_per_prior_index]\n    labels[best_target_per_prior < iou_threshold] = background_id\n    boxes = gt_boxes[best_target_per_prior_index]\n    return boxes, labels\n\n\ndef box_iou(\n    boxes0: Tensor, boxes1: Tensor, eps: Optional[float] = 1e-5, *args, **kwargs\n) -> Tensor:\n    \"\"\"\n    Computes intersection-over-union between two boxes\n    Args:\n        boxes0 (Tensor): Boxes 0 of shape (N, 4)\n        boxes1 (Tensor): Boxes 1 of shape (N or 1, 4)\n        eps (Optional[float]): A small value is added to denominator for numerical stability\n\n    Returns:\n        iou (Tensor): IoU values between boxes0 and boxes1 and has shape (N)\n    \"\"\"\n\n    def area_of(left_top, right_bottom) -> torch.Tensor:\n        \"\"\"\n        Given two corners of the rectangle, compute the area\n        Args:\n            left_top (N, 2): left top corner.\n            right_bottom (N, 2): right bottom corner.\n        Returns:\n            area (N): return the area.\n        \"\"\"\n        hw = torch.clamp(right_bottom - left_top, min=0.0)\n        return hw[..., 0] * hw[..., 1]\n\n    overlap_left_top = torch.max(boxes0[..., :2], boxes1[..., :2])\n    overlap_right_bottom = torch.min(boxes0[..., 2:], boxes1[..., 2:])\n\n    overlap_area = area_of(overlap_left_top, overlap_right_bottom)\n    area0 = area_of(boxes0[..., :2], boxes0[..., 2:])\n    area1 = area_of(boxes1[..., :2], boxes1[..., 2:])\n    return overlap_area / (area0 + area1 - overlap_area + eps)\n\n\ndef hard_negative_mining(\n    loss: Tensor, labels: Tensor, neg_pos_ratio: int, *args, **kwargs\n) -> Tensor:\n    \"\"\"\n    This function is used to suppress the presence of a large number of negative predictions. For any example/image,\n    it keeps all the positive predictions and cut the number of negative predictions to make sure the ratio\n    between the negative examples and positive examples is no more than the given ratio for an image.\n    Args:\n        loss (Tensor): the loss for each example and has shape (N, num_priors).\n        labels (Tensor): the labels and has shape (N, num_priors).\n        neg_pos_ratio (int):  the ratio between the negative examples and positive examples. Usually, it is set as 3.\n\n    \"\"\"\n    pos_mask = labels > 0\n    num_pos = pos_mask.long().sum(dim=1, keepdim=True)\n    num_neg = num_pos * neg_pos_ratio\n\n    loss[pos_mask] = -math.inf\n    _, indexes = loss.sort(dim=1, descending=True)\n    _, orders = indexes.sort(dim=1)\n    neg_mask = orders < num_neg\n    return pos_mask | neg_mask\n"
  },
  {
    "path": "corenet/train_eval_pipelines/__init__.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom corenet.train_eval_pipelines.base import (\n    TRAIN_EVAL_PIPELINE_REGISTRY,\n    BaseTrainEvalPipeline,\n)\nfrom corenet.train_eval_pipelines.default_train_eval import DefaultTrainEvalPipeline\n"
  },
  {
    "path": "corenet/train_eval_pipelines/base.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nfrom typing import Any, Callable\n\nfrom corenet.engine.default_trainer import DefaultTrainer\nfrom corenet.engine.evaluation_engine import Evaluator\nfrom corenet.utils.registry import Registry\n\n\ndef Callback(Protocol):\n    def __call__(self, train_eval_pipeline: BaseTrainEvalPipeline) -> Any: ...\n\n\nclass BaseTrainEvalPipeline:\n    def __init__(\n        self,\n        opts: argparse.Namespace,\n    ) -> None:\n        \"\"\"TrainEvalPipeline class is responsible for instantiating the components of\n        training, evaluation, and/or pipelines that use those common components.\n\n        The consumers of this class should be able to get an instance of any component\n        by accessing the corresponding property. Example usage:\n\n        >>> cfg = get_training_arguments()\n        >>> pipeline = TrainEvalPipeline(cfg)\n        >>> dataset, model = pipeline.dataset, pipeline.model\n\n        Args:\n            opts: Commandline options.\n        \"\"\"\n        self.opts = opts\n\n    def __init_subclass__(cls) -> None:\n        for attr in dir(cls):\n            if attr.startswith(\"_\"):\n                continue\n            if isinstance(getattr(cls, attr), Callable):\n                raise TypeError(\n                    f\"TrainEvalPipelines should only have [cached] properties.\"\n                    f\"'{cls}.{attr}' should not be a Callable. However, you can have a\"\n                    f\"property/cached_property that returns a Callable. Also, you can\"\n                    f\"have private methods that are named with '_' prefix.\"\n                )\n\n    def __getstate__(self) -> argparse.Namespace:\n        return self.opts\n\n    def __setstate__(self, opts: argparse.Namespace) -> None:\n        self.opts = opts\n\n    @property\n    def evaluation_engine(self) -> Evaluator:\n        \"\"\"Creates the Evaluator instance that is used by main_eval.py\"\"\"\n        raise NotImplementedError()\n\n    @property\n    def training_engine(self) -> DefaultTrainer:\n        \"\"\"Creates the Trainer instance that is used by corenet/cli/main_train.py\"\"\"\n        raise NotImplementedError()\n\n    @property\n    def launcher(self) -> Callable[[Callback], None]:\n        \"\"\"Creates the entrypoints that spawn training and evaluation subprocesses.\"\"\"\n        raise NotImplementedError()\n\n\nTRAIN_EVAL_PIPELINE_REGISTRY = Registry(\n    registry_name=\"train_eval_pipeline\",\n    base_class=BaseTrainEvalPipeline,\n    lazy_load_dirs=[\"corenet/train_eval_pipelines\"],\n    internal_dirs=[\"corenet/internal\", \"corenet/internal/projects/*\"],\n)\n"
  },
  {
    "path": "corenet/train_eval_pipelines/default_train_eval.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom __future__ import annotations\n\nimport math\nfrom functools import cached_property\nfrom typing import Callable, Optional, Tuple\n\nimport torch\nfrom torch.cuda.amp import GradScaler\n\nfrom corenet.constants import (\n    DEFAULT_EPOCHS,\n    DEFAULT_ITERATIONS,\n    DEFAULT_MAX_EPOCHS,\n    DEFAULT_MAX_ITERATIONS,\n)\nfrom corenet.data.data_loaders import create_test_loader, create_train_val_loader\nfrom corenet.data.loader.dataloader import CoreNetDataLoader\nfrom corenet.data.sampler.base_sampler import BaseSampler\nfrom corenet.engine.default_trainer import DefaultTrainer\nfrom corenet.engine.evaluation_engine import Evaluator\nfrom corenet.loss_fn import build_loss_fn\nfrom corenet.loss_fn.base_criteria import BaseCriteria\nfrom corenet.modeling import get_model\nfrom corenet.modeling.misc.averaging_utils import EMA\nfrom corenet.modeling.models.base_model import BaseAnyNNModel\nfrom corenet.optims import build_optimizer\nfrom corenet.optims.base_optim import BaseOptim\nfrom corenet.optims.scheduler import build_scheduler\nfrom corenet.optims.scheduler.base_scheduler import BaseLRScheduler\nfrom corenet.train_eval_pipelines.base import (\n    TRAIN_EVAL_PIPELINE_REGISTRY,\n    BaseTrainEvalPipeline,\n    Callback,\n)\nfrom corenet.utils import logger, resources\nfrom corenet.utils.activation_checkpointing_wrapper import activation_checkpointing\nfrom corenet.utils.checkpoint_utils import load_checkpoint, load_model_state\nfrom corenet.utils.common_utils import create_directories, device_setup\nfrom corenet.utils.ddp_utils import distributed_init, is_master\n\n\n@TRAIN_EVAL_PIPELINE_REGISTRY.register(\"default\")\nclass DefaultTrainEvalPipeline(BaseTrainEvalPipeline):\n    \"\"\"TrainEvalPipeline class is responsible for instantiating the components of\n    training, evaluation, and/or pipelines that use those common components.\n\n    The consumers of this class should be able to get an instance of any component\n    by accessing the corresponding property. Example usage:\n\n    >>> cfg = get_training_arguments()\n    >>> pipeline = TrainEvalPipeline(cfg)\n    >>> dataset, model = pipeline.dataset, pipeline.model\n\n    Args:\n        opts: Commandline options.\n    \"\"\"\n\n    @cached_property\n    def is_master_node(self) -> bool:\n        \"\"\"\n        Returns True iff ddp rank is 0.\n        \"\"\"\n        opts = self.opts\n        node_rank = getattr(opts, \"ddp.rank\")\n        if node_rank < 0:\n            logger.error(\"--ddp.rank should be >=0. Got {}\".format(node_rank))\n\n        return is_master(opts)\n\n    @cached_property\n    def device(self) -> torch.device:\n        return getattr(self.opts, \"dev.device\", torch.device(\"cpu\"))\n\n    @cached_property\n    def _train_val_loader_sampler(\n        self,\n    ) -> Tuple[CoreNetDataLoader, CoreNetDataLoader, BaseSampler]:\n        \"\"\"\n        Returns (train_loader, val_loader, train_sampler) tuple.\n        \"\"\"\n        opts = self.opts\n        return create_train_val_loader(opts)\n\n    @cached_property\n    def train_val_loader(self) -> Tuple[CoreNetDataLoader, CoreNetDataLoader]:\n        \"\"\"\n        Returns (train_loader, val_loader) tuple.\n        \"\"\"\n        train_loader, val_loader, _ = self._train_val_loader_sampler\n        return train_loader, val_loader\n\n    @cached_property\n    def train_sampler(self) -> BaseSampler:\n        \"\"\"\n        Returns training sampler.\n        \"\"\"\n        _, _, train_sampler = self._train_val_loader_sampler\n        return train_sampler\n\n    @cached_property\n    def test_loader(self) -> CoreNetDataLoader:\n        opts = self.opts\n        return create_test_loader(opts)\n\n    @cached_property\n    def scheduler(self) -> BaseLRScheduler:\n        opts = self.opts\n        is_master_node = self.is_master_node\n\n        is_iteration_based = getattr(opts, \"scheduler.is_iteration_based\")\n        if is_iteration_based:\n            max_iter = getattr(opts, \"scheduler.max_iterations\")\n            if max_iter is None or max_iter <= 0:\n                logger.log(\"Setting max. iterations to {}\".format(DEFAULT_ITERATIONS))\n                setattr(opts, \"scheduler.max_iterations\", DEFAULT_ITERATIONS)\n                max_iter = DEFAULT_ITERATIONS\n            setattr(opts, \"scheduler.max_epochs\", DEFAULT_MAX_EPOCHS)\n            if is_master_node:\n                logger.log(\"Max. iteration for training: {}\".format(max_iter))\n        else:\n            max_epochs = getattr(opts, \"scheduler.max_epochs\")\n            if max_epochs is None or max_epochs <= 0:\n                logger.log(\"Setting max. epochs to {}\".format(DEFAULT_EPOCHS))\n                setattr(opts, \"scheduler.max_epochs\", DEFAULT_EPOCHS)\n            setattr(opts, \"scheduler.max_iterations\", DEFAULT_MAX_ITERATIONS)\n            max_epochs = getattr(opts, \"scheduler.max_epochs\")\n            if is_master_node:\n                logger.log(\"Max. epochs for training: {}\".format(max_epochs))\n        scheduler = build_scheduler(opts=opts)\n        if is_master_node:\n            logger.log(logger.color_text(\"Learning rate scheduler\"))\n            print(scheduler)\n        return scheduler\n\n    def _prepare_model(self) -> Tuple[BaseAnyNNModel, Optional[torch.nn.Module]]:\n        \"\"\"\n        Returns a model optionally with a module whose activation needs to be checkpointed.\n        \"\"\"\n        # set-up the model\n        model = get_model(self.opts)\n\n        # print model information on master node\n        if self.is_master_node:\n            model.info()\n\n        submodule_class_to_checkpoint = None\n\n        if getattr(self.opts, \"model.activation_checkpointing\"):\n            try:\n                submodule_class_to_checkpoint = (\n                    model.get_activation_checkpoint_submodule_class()\n                )\n            except NotImplementedError:\n                logger.error(\n                    f\"Activation checkpoint module is not implemented for {model.__class__.__name__}. \\\n                    Please implement 'get_activation_checkpoint_submodule_class' method.\"\n                )\n\n        # memory format\n        memory_format = (\n            torch.channels_last\n            if getattr(self.opts, \"common.channels_last\")\n            else torch.contiguous_format\n        )\n        model = model.to(device=self.device, memory_format=memory_format)\n        return model, submodule_class_to_checkpoint\n\n    @cached_property\n    def model(self) -> torch.nn.Module:\n        \"\"\"\n        Returns a model to be used by train and eval pipelines, given the selected yaml configs.\n        \"\"\"\n        opts = self.opts\n        is_master_node = self.is_master_node\n        device = self.device\n        dev_id = getattr(opts, \"dev.device_id\", None)\n        use_distributed = getattr(opts, \"ddp.use_distributed\")\n\n        model, wrapper_cls_for_act_ckpt = self._prepare_model()\n\n        if getattr(opts, \"ddp.use_deprecated_data_parallel\"):\n            logger.warning(\n                \"DataParallel is not recommended for training, and is not tested exhaustively. \\\n                    Please use it only for debugging purposes. We will deprecated the support for DataParallel in future and \\\n                        encourage you to use DistributedDataParallel.\"\n            )\n            model = model.to(device=torch.device(\"cpu\"))\n            model = torch.nn.DataParallel(model)\n            model = model.to(device=device)\n        elif use_distributed:\n            model = torch.nn.parallel.DistributedDataParallel(\n                model,\n                device_ids=[dev_id],\n                output_device=dev_id,\n                find_unused_parameters=getattr(opts, \"ddp.find_unused_params\"),\n            )\n            if is_master_node:\n                logger.log(\"Using DistributedDataParallel.\")\n\n        if wrapper_cls_for_act_ckpt is not None:\n            activation_checkpointing(\n                model=model, submodule_class=wrapper_cls_for_act_ckpt\n            )\n        return model\n\n    @cached_property\n    def criteria(self) -> BaseCriteria:\n        opts = self.opts\n        device = self.device\n        is_master_node = self.is_master_node\n        criteria = build_loss_fn(opts)\n        if is_master_node:\n            logger.log(logger.color_text(\"Loss function\"))\n            print(criteria)\n        criteria = criteria.to(device=device)\n        return criteria\n\n    @cached_property\n    def optimizer(self) -> BaseOptim:\n        opts = self.opts\n        model = self.model\n        is_master_node = self.is_master_node\n\n        optimizer = build_optimizer(model, opts=opts)\n        if is_master_node:\n            logger.log(logger.color_text(\"Optimizer\"))\n            print(optimizer)\n        return optimizer\n\n    @cached_property\n    def gradient_scaler(self) -> GradScaler:\n        opts = self.opts\n        enable_grad_scaler = (\n            getattr(opts, \"common.mixed_precision\")\n            and getattr(opts, \"common.mixed_precision_dtype\") == \"float16\"\n        )\n        return GradScaler(enabled=enable_grad_scaler)\n\n    @cached_property\n    def launcher(self) -> Callable[[Callback], None]:\n        \"\"\"\n        Creates the entrypoints that spawn training and evaluation subprocesses.\n\n        The number of subprocesses depend on the number of gpus and distributed nodes.\n\n        Returns a function that once called, spawns as many subprocesses as needed for\n        training or evaluation. The returned function accepts a Callback as an argument.\n        The Callback will be invoked on each subprocess.\n        \"\"\"\n        opts = self.opts\n        opts = device_setup(opts)\n        is_master_node = self.is_master_node\n\n        # create the directory for saving results\n        save_dir = getattr(opts, \"common.results_loc\")\n        run_label = getattr(opts, \"common.run_label\")\n        exp_dir = \"{}/{}\".format(save_dir, run_label)\n        setattr(opts, \"common.exp_loc\", exp_dir)\n        create_directories(dir_path=exp_dir, is_master_node=is_master_node)\n\n        num_gpus = getattr(opts, \"dev.num_gpus\")\n\n        use_deprecated_data_parallel = getattr(opts, \"ddp.use_deprecated_data_parallel\")\n        use_distributed = num_gpus >= 1 and not use_deprecated_data_parallel\n        setattr(opts, \"ddp.use_distributed\", use_distributed)\n\n        if num_gpus > 0:\n            assert torch.cuda.is_available(), \"We need CUDA for training on GPUs.\"\n\n        # No of data workers = no of CPUs (if not specified or -1)\n        n_cpus = resources.cpu_count()\n        dataset_workers = getattr(opts, \"dataset.workers\")\n\n        num_gpus_ge_1 = max(1, num_gpus)\n\n        if not use_distributed:\n            if dataset_workers == -1:\n                logger.log(f\"Setting dataset.workers to {n_cpus}.\")\n                setattr(opts, \"dataset.workers\", n_cpus)\n\n            # adjust the batch size\n            train_bsize = getattr(opts, \"dataset.train_batch_size0\") * num_gpus_ge_1\n            val_bsize = getattr(opts, \"dataset.val_batch_size0\") * num_gpus_ge_1\n            setattr(opts, \"dataset.train_batch_size0\", train_bsize)\n            setattr(opts, \"dataset.val_batch_size0\", val_bsize)\n            setattr(opts, \"dev.device_id\", None)\n            return lambda callback: callback(self)\n\n        else:\n            # DDP is the default for training\n            # get device id\n            dev_id = getattr(opts, \"ddp.device_id\")\n            # set the dev.device_id to the same as ddp.device_id.\n            # note that dev arguments are not accessible through CLI.\n            setattr(opts, \"dev.device_id\", dev_id)\n\n            if dataset_workers == -1 or dataset_workers is None:\n                logger.log(f\"Setting dataset.workers to {n_cpus // num_gpus_ge_1}.\")\n                setattr(opts, \"dataset.workers\", n_cpus // num_gpus_ge_1)\n\n            start_rank = getattr(opts, \"ddp.rank\")\n            # we need to set rank to None as it is reset inside the _launcher_distributed_spawn_fn function\n            setattr(opts, \"ddp.rank\", None)\n            setattr(opts, \"ddp.start_rank\", start_rank)\n            return lambda callback: torch.multiprocessing.spawn(\n                fn=self._launcher_distributed_spawn_fn,\n                args=(callback, self),\n                nprocs=num_gpus_ge_1,\n            )\n\n    @cached_property\n    def model_ema(self) -> Optional[EMA]:\n        opts = self.opts\n        device = self.device\n        model = self.model\n        is_master_node = self.is_master_node\n\n        model_ema = None\n        use_ema = getattr(opts, \"ema.enable\")\n\n        if use_ema:\n            ema_momentum = getattr(opts, \"ema.momentum\")\n            model_ema = EMA(model=model, ema_momentum=ema_momentum, device=device)\n            if is_master_node:\n                logger.log(\"Using EMA\")\n        return model_ema\n\n    @cached_property\n    def training_engine(self) -> DefaultTrainer:\n        opts = self.opts\n        is_master_node = self.is_master_node\n        train_loader, val_loader = self.train_val_loader\n\n        model = self.model\n        criteria = self.criteria\n        optimizer = self.optimizer\n        gradient_scaler = self.gradient_scaler\n        scheduler = self.scheduler\n\n        model_ema = self.model_ema\n        best_metric = (\n            -math.inf if getattr(opts, \"stats.checkpoint_metric_max\") else math.inf\n        )\n\n        start_epoch = 0\n        start_iteration = 0\n        resume_loc = getattr(opts, \"common.resume\")\n        finetune_loc = getattr(opts, \"common.finetune\")\n        auto_resume = getattr(opts, \"common.auto_resume\")\n        if resume_loc is not None or auto_resume:\n            (\n                model,\n                optimizer,\n                gradient_scaler,\n                start_epoch,\n                start_iteration,\n                best_metric,\n                model_ema,\n            ) = load_checkpoint(\n                opts=opts,\n                model=model,\n                optimizer=optimizer,\n                model_ema=model_ema,\n                gradient_scaler=gradient_scaler,\n            )\n        elif finetune_loc is not None:\n            model, model_ema = load_model_state(\n                opts=opts, model=model, model_ema=model_ema\n            )\n            if is_master_node:\n                logger.log(\"Finetuning model from checkpoint {}\".format(finetune_loc))\n\n        training_engine = DefaultTrainer(\n            opts=opts,\n            model=model,\n            validation_loader=val_loader,\n            training_loader=train_loader,\n            optimizer=optimizer,\n            criteria=criteria,\n            scheduler=scheduler,\n            start_epoch=start_epoch,\n            start_iteration=start_iteration,\n            best_metric=best_metric,\n            model_ema=model_ema,\n            gradient_scaler=gradient_scaler,\n        )\n        return training_engine\n\n    @cached_property\n    def evaluation_engine(self) -> Evaluator:\n        opts = self.opts\n        test_loader = self.test_loader\n        model = self.model\n        criteria = self.criteria\n        return Evaluator(\n            opts=opts, model=model, test_loader=test_loader, criteria=criteria\n        )\n\n    @staticmethod\n    def _launcher_distributed_spawn_fn(\n        device_id: int,\n        callback: Callback,\n        train_eval_pipeline: DefaultTrainEvalPipeline,\n    ) -> None:\n        \"\"\"\n        Wraps a callback function for `torch.multiprocessing.spawn` to spawn DDP workers. The rank information will be set in `opts` before the wrapped callback is invoked.\n\n        Args:\n            device_id: GPU device number.\n            callback: The wrapped callback function to be invoked after the rank information are set in `opts`.\n            train_eval_pipeline: The instance of TrainEvalPipeline that will be passed as the only input argument to `callback`.\n\n        \"\"\"\n        opts = train_eval_pipeline.opts\n        setattr(opts, \"dev.device_id\", device_id)\n        torch.cuda.set_device(device_id)\n        setattr(opts, \"dev.device\", torch.device(f\"cuda:{device_id}\"))\n\n        ddp_rank = getattr(opts, \"ddp.rank\", None)\n        if ddp_rank is None:\n            ddp_rank = getattr(opts, \"ddp.start_rank\", 0) + device_id\n            setattr(opts, \"ddp.rank\", ddp_rank)\n\n        node_rank = distributed_init(opts)\n        setattr(opts, \"ddp.rank\", node_rank)\n        callback(train_eval_pipeline)\n"
  },
  {
    "path": "corenet/train_eval_pipelines/fsdp_train_eval.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom __future__ import annotations\n\nimport math\nfrom functools import cached_property\n\nimport torch\nfrom torch.cuda.amp import GradScaler\n\nfrom corenet.engine.fsdp_trainer import FSDPTrainer\nfrom corenet.modeling.models.fsdp_wrapper import FullyShardedDataParallelWrapper\nfrom corenet.train_eval_pipelines.default_train_eval import (\n    TRAIN_EVAL_PIPELINE_REGISTRY,\n    DefaultTrainEvalPipeline,\n)\nfrom corenet.utils import logger\nfrom corenet.utils.activation_checkpointing_wrapper import activation_checkpointing\nfrom corenet.utils.checkpoint_utils import load_checkpoint, load_model_state\n\n\n@TRAIN_EVAL_PIPELINE_REGISTRY.register(\"fsdp_train_eval_pipeline\")\nclass FSDPTrainEvalPipeline(DefaultTrainEvalPipeline):\n    \"\"\"FSDPTrainEvalPipeline class is responsible for instantiating the components of\n    training, evaluation, and/or pipelines that use FSDP.\n\n    Args:\n        opts: Commandline options.\n    \"\"\"\n\n    @cached_property\n    def gradient_scaler(self) -> GradScaler:\n        raise NotImplementedError(\n            \"FSDP does not use autocast for mixed-precision training and handles it internally.\"\n        )\n\n    @cached_property\n    def model(self) -> torch.nn.Module:\n        opts = self.opts\n        use_distributed = getattr(opts, \"ddp.use_distributed\")\n        assert use_distributed, \"DDP needs to be enabled when using FSDP\"\n\n        model, wrapper_cls_for_act_ckpt = self._prepare_model()\n\n        fsdp_model = FullyShardedDataParallelWrapper(opts=self.opts, model=model)\n        if wrapper_cls_for_act_ckpt is not None:\n            activation_checkpointing(\n                model=fsdp_model, submodule_class=wrapper_cls_for_act_ckpt\n            )\n\n        return fsdp_model\n\n    @cached_property\n    def training_engine(self) -> FSDPTrainer:\n        opts = self.opts\n        is_master_node = self.is_master_node\n        train_loader, val_loader = self.train_val_loader\n\n        model = self.model\n        criteria = self.criteria\n        optimizer = self.optimizer\n        scheduler = self.scheduler\n\n        model_ema = self.model_ema\n        best_metric = (\n            -math.inf if getattr(opts, \"stats.checkpoint_metric_max\") else math.inf\n        )\n\n        start_epoch = 0\n        start_iteration = 0\n        resume_loc = getattr(opts, \"common.resume\")\n        finetune_loc = getattr(opts, \"common.finetune\")\n        auto_resume = getattr(opts, \"common.auto_resume\")\n        if resume_loc is not None or auto_resume:\n            (\n                model,\n                optimizer,\n                gradient_scaler,\n                start_epoch,\n                start_iteration,\n                best_metric,\n                model_ema,\n            ) = load_checkpoint(\n                opts=opts,\n                model=model,\n                optimizer=optimizer,\n                model_ema=model_ema,\n            )\n        elif finetune_loc is not None:\n            model, model_ema = load_model_state(\n                opts=opts, model=model, model_ema=model_ema\n            )\n            if is_master_node:\n                logger.log(\"Finetuning model from checkpoint {}\".format(finetune_loc))\n\n        training_engine = FSDPTrainer(\n            opts=opts,\n            model=model,\n            validation_loader=val_loader,\n            training_loader=train_loader,\n            optimizer=optimizer,\n            criteria=criteria,\n            scheduler=scheduler,\n            start_epoch=start_epoch,\n            start_iteration=start_iteration,\n            best_metric=best_metric,\n            model_ema=model_ema,\n        )\n        return training_engine\n"
  },
  {
    "path": "corenet/utils/__init__.py",
    "content": ""
  },
  {
    "path": "corenet/utils/activation_checkpointing_wrapper.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\n\nfrom functools import partial\nfrom typing import Callable, List, Union\n\nimport torch\n\n\ndef activation_checkpointing(\n    model: torch.nn.Module,\n    submodule_class: Union[List[Callable], Callable],\n) -> None:\n    \"\"\"\n    Applies activation checkpointing to `module_to_checkpoint`, a sub-module(s) inside 'model'.\n\n    Args:\n        model: The model whose submodules should be wrapped with activation checkpointing.\n        submodule_class: Submodule class to be wrapped with activation checkpointing.\n\n    Usage::\n        model = nn.Sequential(\n                    nn.Linear(10, 10), nn.Linear(10, 10), nn.Linear(10, 10)\n                )\n        module_to_checkpoint = nn.Linear\n        # checkpoint activations\n        activation_checkpointing(model, module_to_checkpoint)\n    \"\"\"\n    from torch.distributed.algorithms._checkpoint.checkpoint_wrapper import (\n        CheckpointImpl,\n        apply_activation_checkpointing,\n        checkpoint_wrapper,\n    )\n\n    non_reentrant_wrapper = partial(\n        checkpoint_wrapper,\n        checkpoint_impl=CheckpointImpl.NO_REENTRANT,\n    )\n\n    if isinstance(submodule_class, list):\n        for m in submodule_class:\n            check_fn = lambda submodule: isinstance(submodule, m)\n            apply_activation_checkpointing(\n                model, checkpoint_wrapper_fn=non_reentrant_wrapper, check_fn=check_fn\n            )\n    else:\n        check_fn = lambda submodule: isinstance(submodule, submodule_class)\n        apply_activation_checkpointing(\n            model, checkpoint_wrapper_fn=non_reentrant_wrapper, check_fn=check_fn\n        )\n"
  },
  {
    "path": "corenet/utils/check.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport inspect\nimport sys\nimport types\nfrom typing import Any, Union\n\n\ndef check(\n    value: Any, on_failure: Union[str, Exception, types.FunctionType] = \"Check failed\"\n) -> Any:\n    \"\"\"\n    Checks if value is truthy and raises an exception if not.\n\n    This is a replacement for assert, with the following advantages:\n     - Cannot be disabled by the -O flag\n     - Can raise any exception type\n     - Returns the checked value for concise code\n\n    on_failure can be:\n     - A string, in which case a AssertionError is raised with that message.\n     - A constructed exception to be raised.\n     - A lambda returning any of the above, so that the message/exception\n         doesn't need to be constructed if the check succeeds. If the lambda\n         takes an argument it will be the value.\n    \"\"\"\n    if value:\n        return value\n\n    if isinstance(on_failure, types.FunctionType):\n        nparams = len(inspect.signature(on_failure).parameters)\n\n        if nparams == 0:\n            on_failure = on_failure()\n        elif nparams == 1:\n            on_failure = on_failure(value)\n        else:\n            raise ValueError(\"Expect at most 1 element lambda\")\n\n    if not isinstance(on_failure, Exception):\n        on_failure = AssertionError(str(on_failure))\n\n    # This used to pop the call stack from the exception traceback,\n    # so that it would appear to come from the check() call itself,\n    # but that seems to no longer work in python3.10\n    check_failed = on_failure\n\n    raise check_failed\n"
  },
  {
    "path": "corenet/utils/checkpoint_utils.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nimport glob\nimport math\nimport os\nfrom typing import Any, Dict, List, Optional, Tuple, Union\n\nimport torch\n\nfrom corenet.modeling import EMA\nfrom corenet.modeling.models.fsdp_wrapper import (\n    FullyShardedDataParallelWrapper,\n    get_fsdp_model_optimizer_state_dict_on_rank0,\n)\nfrom corenet.optims import BaseOptim\nfrom corenet.utils import logger\nfrom corenet.utils.common_utils import unwrap_model_fn\nfrom corenet.utils.ddp_utils import is_master\nfrom corenet.utils.download_utils import get_local_path\n\nCHECKPOINT_EXTN = \"pt\"\n\n\ndef get_model_optimizer_state_dict(\n    model: torch.nn.Module, optimizer: BaseOptim\n) -> Tuple[Dict[str, Any], Dict[str, Any]]:\n    \"\"\"Returns `state_dict` of a given model and optimizer.\n\n    Args:\n        model: A torch model (it can be also a wrapped model, e.g., with DDP).\n        optimizer: An instance of BaseOptim.\n\n    Returns:\n        `state_dict` of the model and optimizer. If model is an EMA instance, the\n        `state_dict` corresponding to EMA parameters is returned.\n    \"\"\"\n    if isinstance(model, FullyShardedDataParallelWrapper):\n        return get_fsdp_model_optimizer_state_dict_on_rank0(\n            model=model, optimizer=optimizer\n        )\n    if isinstance(model, EMA):\n        return get_model_optimizer_state_dict(model.ema_model, optimizer)\n    else:\n        unwrapped_model = unwrap_model_fn(model)\n        return unwrapped_model.state_dict(), optimizer.state_dict()\n\n\ndef load_state_dict(\n    model: torch.nn.Module, state_dict: Dict, strict: bool = True\n) -> torch.nn.Module:\n    \"\"\"Load the given `state_dict` into the model.\n\n    Args:\n        model: A torch model (it can be also a wrapped model, e.g., with DDP).\n        state_dict: A state dict dictionary to load model parameters from.\n        strict: whether to strictly enforce that the keys in `state_dict` match the keys\n            returned by this module's `state_dict` function. Default: ``True``.\n\n    Returns:\n        model loaded with parameters from the given state_dict\n    \"\"\"\n    if hasattr(model, \"module\"):\n        model.module.load_state_dict(state_dict, strict=strict)\n    else:\n        model.load_state_dict(state_dict, strict=strict)\n    return model\n\n\ndef average_ckpts(ckpt_loc_list: List[str]) -> Dict[str, Any]:\n    \"\"\"Compute averaged parameters from a list of checkpoints.\n\n    Args:\n        ckpt_loc_list: List of paths to model checkpoints to be averaged.\n\n    Returns:\n        `state_dict` corresponding to the averaged parameters.\n    \"\"\"\n    avg_state_dict = dict()\n    key_count = dict()\n    key_dtype = dict()\n\n    for c in ckpt_loc_list:\n        if not os.path.isfile(c):\n            pass\n        ckpt_state_dict = torch.load(c, map_location=\"cpu\")\n\n        for k, v in ckpt_state_dict.items():\n            if k not in avg_state_dict:\n                key_dtype[k] = v.dtype\n                avg_state_dict[k] = v.clone().to(dtype=torch.float64)\n                key_count[k] = 1.0\n            else:\n                avg_state_dict[k] += v.to(dtype=torch.float64)\n                key_count[k] += 1.0\n\n    for k, v in avg_state_dict.items():\n        avg_state_dict[k] = v.div(key_count[k]).to(dtype=key_dtype[k])\n    return avg_state_dict\n\n\ndef avg_and_save_k_checkpoints(\n    model_state: Dict,\n    best_metric: float,\n    k_best_checkpoints: int,\n    max_ckpt_metric: bool,\n    ckpt_str: str,\n) -> None:\n    \"\"\"Save top-k checkpoints and their average.\n\n    Args:\n        model_state: `state_dict` containing model parameters.\n        best_metric: Best observed value of the tracking validation metric. For example,\n            best top-1 validation accuracy that is observed until the current iteration.\n        k_best_checkpoints: An integer k determining number of top (based on validation\n            metric) checkpoints to keep. If `k_best_checkpoints` is smaller than 1, only\n            best checkpoint is stored.\n        max_ckpt_metric: A boolean demonstrating whether the tracking validation metric\n            is higher the better, or lower the better.\n        ckpt_str: String determining path prefix for checkpoints to be saved.\n    \"\"\"\n    try:\n        ckpt_fname = \"{}_score_{:.4f}.{}\".format(ckpt_str, best_metric, CHECKPOINT_EXTN)\n        torch.save(model_state, ckpt_fname)\n\n        best_fnames = glob.glob(\"{}_score_*\".format(ckpt_str))\n        best_scores = [\n            float(f.split(\"_score_\")[-1].replace(\".{}\".format(CHECKPOINT_EXTN), \"\"))\n            for f in best_fnames\n        ]\n\n        best_scores_keep = []\n        if len(best_scores) > k_best_checkpoints:\n            best_scores = sorted(best_scores)\n            if not max_ckpt_metric:\n                best_scores = best_scores[::-1]\n            best_scores_keep = best_scores[-k_best_checkpoints:]\n            for k in best_scores:\n                if k in best_scores_keep:\n                    continue\n                rm_ckpt = \"{}_score_{:.4f}.{}\".format(ckpt_str, k, CHECKPOINT_EXTN)\n                os.remove(rm_ckpt)\n                logger.log(\"Deleting checkpoint: {}\".format(rm_ckpt))\n\n        if len(best_scores_keep) > 1:\n            avg_fnames = [\n                \"{}_score_{:.4f}.{}\".format(ckpt_str, k, CHECKPOINT_EXTN)\n                for k in best_scores_keep\n            ]\n            logger.log(\n                \"Averaging checkpoints: {}\".format(\n                    [f.split(\"/\")[-1] for f in avg_fnames]\n                )\n            )\n            # save the average model\n            avg_model_state = average_ckpts(ckpt_loc_list=avg_fnames)\n            if avg_model_state:\n                ckpt_fname = \"{}_avg.{}\".format(ckpt_str, CHECKPOINT_EXTN)\n                torch.save(avg_model_state, ckpt_fname)\n                logger.log(\"Averaged checkpoint saved at: {}\".format(ckpt_fname))\n    except Exception as e:\n        logger.log(f\"Error while averaging {k_best_checkpoints}-best checkpoints.\")\n        print(e)\n\n\ndef get_training_state(\n    iterations: int,\n    epoch: int,\n    model: torch.nn.Module,\n    optimizer: Union[BaseOptim, torch.optim.Optimizer],\n    best_metric: float,\n    gradient_scaler: Optional[torch.cuda.amp.GradScaler] = None,\n    model_ema: Optional[torch.nn.Module] = None,\n    is_interval_ckpt: bool = False,\n) -> Dict:\n    \"\"\"Create a checkpoint dictionary that includes all required states to resume the\n    training from its current state.\n\n    Args:\n        iterations: An integer denoting training iteration number. Each iteration\n            corresponds to forward-backward passes on a batch with all GPUs.\n        epoch: An integer denoting epoch number.\n        model: The model being trained.\n        optimizer: Optimizer object, which possibly store training optimization state\n            variables.\n        best_metric: Best observed value of the tracking validation metric. For example,\n            best top-1 validation accuracy that is observed until the current iteration.\n        gradient_scaler: Optional `GradScaler` object storing required automatic mixed\n            precision state.\n        model_ema: EMA model to be stored in the checkpoint.\n        is_interval_ckpt: If True, the the checkpoint is saved in the middle; otherwise\n            it as at the end of an epoch. Default to False.\n\n    Returns:\n        A dictionary that includes all required states to resume the training from its\n        current state.\n    \"\"\"\n    model_state, optim_state = get_model_optimizer_state_dict(\n        model, optimizer=optimizer\n    )\n    training_state = {\n        \"iterations\": iterations,\n        \"epoch\": epoch,\n        \"model_state_dict\": model_state,\n        \"optim_state_dict\": optim_state,\n        \"best_metric\": best_metric,\n        \"is_interval_ckpt\": is_interval_ckpt,\n    }\n    if gradient_scaler is not None:\n        training_state[\"gradient_scaler_state_dict\"] = gradient_scaler.state_dict()\n\n    if model_ema is not None:\n        model_state, _ = get_model_optimizer_state_dict(model_ema, optimizer=optimizer)\n        training_state[\"ema_state_dict\"] = model_state\n    return training_state\n\n\ndef save_checkpoint(\n    iterations: int,\n    epoch: int,\n    model: torch.nn.Module,\n    optimizer: Union[BaseOptim, torch.optim.Optimizer],\n    best_metric: float,\n    is_best: bool,\n    save_dir: str,\n    is_master_node: bool,\n    gradient_scaler: Optional[torch.cuda.amp.GradScaler] = None,\n    model_ema: Optional[torch.nn.Module] = None,\n    is_ema_best: bool = False,\n    ema_best_metric: Optional[float] = None,\n    max_ckpt_metric: bool = False,\n    k_best_checkpoints: int = -1,\n    save_all_checkpoints: bool = False,\n    is_interval_ckpt: bool = False,\n    *args,\n    **kwargs,\n) -> None:\n    \"\"\"Save checkpoints corresponding to the current state of the training.\n\n    Args:\n        iterations: An integer denoting training iteration number. Each iteration\n            corresponds to forward-backward passes on a batch with all GPUs.\n        epoch: An integer denoting epoch number.\n        model: The model being trained.\n        optimizer: Optimizer object, which possibly store training optimization state\n            variables.\n        best_metric: Best observed value of the tracking validation metric. For example,\n            best top-1 validation accuracy that is observed until the current iteration.\n        is_best: A boolean demonstrating whether the current model obtains the best\n            validation metric compared to the previously saved checkpoints.\n        save_dir: Path to a directory to save checkpoints.\n        is_master_node: Master node (a.k.a. rank0) or node.\n        gradient_scaler: Optional `GradScaler` object storing required automatic mixed\n            precision state.\n        model_ema: EMA model to be stored in the checkpoint.\n        is_ema_best: A boolean demonstrating whether the current EMA model obtains the\n            best validation metric compared to the previously saved checkpoints.\n        ema_best_metric: Best observed value of the tracking validation metric by the\n            EMA model.\n        max_ckpt_metric: A boolean demonstrating whether the tracking validation metric\n            is higher the better, or lowerer the better.\n        k_best_checkpoints: An integer k determining number of top (based on validation\n            metric) checkpoints to keep. If `k_best_checkpoints` is smaller than 1, only\n            best checkpoint is stored.\n        save_all_checkpoints: If True, will save model_state checkpoints (main model and\n            its EMA) for all epochs.\n        is_interval_ckpt: If True, the the checkpoint is saved in the middle; otherwise\n            it as at the end of an epoch. Default to False.\n    \"\"\"\n    checkpoint = get_training_state(\n        iterations,\n        epoch,\n        model,\n        optimizer,\n        best_metric,\n        gradient_scaler,\n        model_ema,\n        is_interval_ckpt,\n    )\n\n    if is_master_node:\n        model_state = checkpoint.get(\"model_state_dict\")\n        ckpt_str = \"{}/checkpoint\".format(save_dir)\n        epoch_iter_str = f\"epoch_{epoch}_iter_{iterations}\"\n        if is_best:\n            best_model_fname = \"{}_best.{}\".format(ckpt_str, CHECKPOINT_EXTN)\n            if os.path.isfile(best_model_fname):\n                os.remove(best_model_fname)\n\n            torch.save(model_state, best_model_fname)\n            logger.log(\n                \"Best checkpoint with score {:.2f} saved at {}\".format(\n                    best_metric, best_model_fname\n                )\n            )\n\n            if k_best_checkpoints > 1:\n                avg_and_save_k_checkpoints(\n                    model_state,\n                    best_metric,\n                    k_best_checkpoints,\n                    max_ckpt_metric,\n                    ckpt_str,\n                )\n\n        ckpt_fname = \"{}/training_checkpoint_last.{}\".format(save_dir, CHECKPOINT_EXTN)\n        torch.save(checkpoint, ckpt_fname)\n        logger.log(f\"Last training checkpoint is saved at: {ckpt_fname}\")\n\n        ckpt_fname = \"{}_last.{}\".format(ckpt_str, CHECKPOINT_EXTN)\n        torch.save(model_state, ckpt_fname)\n        logger.log(f\"Last checkpoint's model state is saved at: {ckpt_fname}\")\n\n        if save_all_checkpoints:\n            ckpt_fname = (\n                f\"{save_dir}/training_checkpoint_{epoch_iter_str}.{CHECKPOINT_EXTN}\"\n            )\n            torch.save(checkpoint, ckpt_fname)\n            logger.log(\n                f\"Training checkpoint for epoch {epoch}/iteration {iterations} is saved at: {ckpt_fname}\"\n            )\n\n            ckpt_fname = f\"{ckpt_str}_{epoch_iter_str}.{CHECKPOINT_EXTN}\"\n            torch.save(model_state, ckpt_fname)\n            logger.log(\n                f\"Model state for epoch {epoch}/iteration {iterations} is saved at: {ckpt_fname}\"\n            )\n\n        # Save EMA model state and checkpoints.\n        if model_ema is not None:\n            ema_fname = \"{}_ema_last.{}\".format(ckpt_str, CHECKPOINT_EXTN)\n            ema_model_state = checkpoint.get(\"ema_state_dict\")\n            torch.save(ema_model_state, ema_fname)\n            logger.log(f\"Last EMA model state is saved at: {ema_fname}\")\n\n            if is_ema_best:\n                ema_best_fname = \"{}_ema_best.{}\".format(ckpt_str, CHECKPOINT_EXTN)\n                if os.path.isfile(ema_best_fname):\n                    os.remove(ema_best_fname)\n                torch.save(ema_model_state, ema_best_fname)\n                logger.log(\n                    \"Best EMA checkpoint with score {:.2f} is saved at {}\".format(\n                        ema_best_metric, ema_best_fname\n                    )\n                )\n\n                if k_best_checkpoints > 1 and ema_best_metric is not None:\n                    avg_and_save_k_checkpoints(\n                        model_state=ema_model_state,\n                        best_metric=ema_best_metric,\n                        k_best_checkpoints=k_best_checkpoints,\n                        max_ckpt_metric=max_ckpt_metric,\n                        ckpt_str=\"{}_ema\".format(ckpt_str),\n                    )\n            if save_all_checkpoints:\n                ema_fname = f\"{ckpt_str}_ema_{epoch_iter_str}.{CHECKPOINT_EXTN}\"\n                torch.save(ema_model_state, ema_fname)\n                logger.log(\n                    f\"EMA model state for epoch {epoch}/iteration {iterations} is saved at: {ema_fname}\"\n                )\n\n\ndef load_checkpoint(\n    opts: argparse.Namespace,\n    model: torch.nn.Module,\n    optimizer: Union[BaseOptim, torch.optim.Optimizer],\n    gradient_scaler: Optional[torch.cuda.amp.GradScaler] = None,\n    model_ema: Optional[torch.nn.Module] = None,\n) -> Tuple[\n    torch.nn.Module,\n    Union[BaseOptim, torch.optim.Optimizer],\n    Optional[torch.cuda.amp.GradScaler],\n    int,\n    int,\n    float,\n    Optional[torch.nn.Module],\n]:\n    \"\"\"Load a training checkpoint to resume training.\n\n    Args:\n        opts: Input arguments.\n        model: The model to be loaded with `model_state_dict` from the checkpoint.\n        optimizer: Optimizer object to be loaded with `optim_state_dict` from the\n            checkpoint.\n        gradient_scaler: An optional `GradScaler` object to be loaded with\n            `gradient_scaler_state_dict`  from the checkpoint.\n        model_ema: (Optional) EMA model to be loaded with `ema_state_dict` from the\n            checkpoint.\n\n    Returns:\n        Tuple of loaded objects and value:\n        (model, optimizer, gradient_scaler, start_epoch, start_iteration, best_metric,\n        model_ema)\n    \"\"\"\n    resume_loc = getattr(opts, \"common.resume\", None)\n    dev_id = getattr(opts, \"dev.device_id\", None)\n    device = getattr(opts, \"dev.device\", torch.device(\"cpu\"))\n    start_epoch = start_iteration = 0\n    best_metric = (\n        0.0 if getattr(opts, \"stats.checkpoint_metric_max\", False) else math.inf\n    )\n    auto_resume = getattr(opts, \"common.auto_resume\", False)\n    exp_dir = getattr(opts, \"common.exp_loc\", None)\n    is_master_node = is_master(opts)\n    if resume_loc is None and auto_resume and exp_dir is not None:\n        resume_loc = \"{}/training_checkpoint_last.{}\".format(exp_dir, CHECKPOINT_EXTN)\n\n    resume_loc = get_local_path(opts, path=resume_loc)\n    if resume_loc is not None and os.path.isfile(resume_loc):\n        if dev_id is None:\n            checkpoint = torch.load(resume_loc, map_location=device)\n        else:\n            checkpoint = torch.load(resume_loc, map_location=\"cuda:{}\".format(dev_id))\n\n        is_interval_ckpt = (\n            checkpoint[\"is_interval_ckpt\"]\n            if \"is_interval_ckpt\" in checkpoint\n            else False\n        )\n        # There are two use cases of when we reload the checkpoint:\n        # 1. Reload a checkpoint at the end of an epoch: this is usually the case when\n        #    we reload a checkpoint for finetuning or resume a training job from the\n        #    previous epoch.\n        # 2. Reload a checkpoint in the middle of an epoch, this is the case when we\n        #    train a large language model, where the model is only trained for 1 epoch,\n        #    and an interval checkpoint is reloaded.\n        start_epoch = (\n            checkpoint[\"epoch\"] if is_interval_ckpt else checkpoint[\"epoch\"] + 1\n        )\n        start_iteration = checkpoint[\"iterations\"] + 1\n        best_metric = checkpoint[\"best_metric\"]\n\n        model = load_state_dict(model, checkpoint[\"model_state_dict\"])\n        optimizer.load_state_dict(checkpoint[\"optim_state_dict\"])\n        if gradient_scaler is not None:\n            gradient_scaler.load_state_dict(checkpoint[\"gradient_scaler_state_dict\"])\n\n        if model_ema is not None and \"ema_state_dict\" in checkpoint:\n            model_ema.ema_model = load_state_dict(\n                model_ema.ema_model, checkpoint[\"ema_state_dict\"]\n            )\n\n        if is_master_node:\n            logger.log(\"Loaded checkpoint from {}\".format(resume_loc))\n            logger.log(\"Resuming training for epoch {}\".format(start_epoch))\n    else:\n        if is_master_node:\n            logger.log(\"No checkpoint found at '{}'\".format(resume_loc))\n    return (\n        model,\n        optimizer,\n        gradient_scaler,\n        start_epoch,\n        start_iteration,\n        best_metric,\n        model_ema,\n    )\n\n\ndef load_model_state(\n    opts: argparse.Namespace,\n    model: torch.nn.Module,\n    model_ema: Optional[torch.nn.Module] = None,\n) -> Tuple[torch.nn.Module, Optional[torch.nn.Module]]:\n    \"\"\"Load the model (and optionally the EMA model) for finetuning.\n\n    Args:\n        opts: Input arguments.\n        model: The model to be loaded with checkpoint at `common.finetune`.\n        model_ema: The EMA model to be loaded with checkpoint at `common.finetune_ema`.\n\n    Returns:\n        Tuple of loaded model and EMA model. The second returned value is None when\n        model_ema is not passed.\n    \"\"\"\n    dev_id = getattr(opts, \"dev.device_id\", None)\n    device = getattr(opts, \"dev.device\", torch.device(\"cpu\"))\n    finetune_loc = getattr(opts, \"common.finetune\", None)\n    finetune_ema_loc = getattr(opts, \"common.finetune_ema\", None)\n\n    def load_state(path):\n        path = get_local_path(opts, path=path)\n        if dev_id is None:\n            model_state = torch.load(path, map_location=device)\n        else:\n            model_state = torch.load(path, map_location=\"cuda:{}\".format(dev_id))\n        return model_state\n\n    if finetune_loc is not None and os.path.isfile(finetune_loc):\n        # load model dict\n        model = load_state_dict(model, load_state(finetune_loc))\n\n        # load ema dict\n        if model_ema is not None and os.path.isfile(finetune_ema_loc):\n            model_ema = load_state_dict(model, load_state(finetune_ema_loc))\n\n    return model, model_ema\n"
  },
  {
    "path": "corenet/utils/color_map.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom typing import List, Optional\n\nimport numpy as np\n\n\nclass Colormap(object):\n    \"\"\"\n    Generate colormap for visualizing segmentation masks or bounding boxes.\n\n    This is based on the MATLab code in the PASCAL VOC repository:\n        http://host.robots.ox.ac.uk/pascal/VOC/voc2012/index.html#devkit\n    \"\"\"\n\n    def __init__(self, n: Optional[int] = 256, normalized: Optional[bool] = False):\n        super(Colormap, self).__init__()\n        self.n = n\n        self.normalized = normalized\n\n    @staticmethod\n    def get_bit_at_idx(val, idx):\n        return (val & (1 << idx)) != 0\n\n    def get_color_map(self) -> np.ndarray:\n\n        dtype = \"float32\" if self.normalized else \"uint8\"\n        color_map = np.zeros((self.n, 3), dtype=dtype)\n        for i in range(self.n):\n            r = g = b = 0\n            c = i\n            for j in range(8):\n                r = r | (self.get_bit_at_idx(c, 0) << 7 - j)\n                g = g | (self.get_bit_at_idx(c, 1) << 7 - j)\n                b = b | (self.get_bit_at_idx(c, 2) << 7 - j)\n                c = c >> 3\n\n            color_map[i] = np.array([r, g, b])\n        color_map = color_map / 255 if self.normalized else color_map\n        return color_map\n\n    def get_box_color_codes(self) -> List:\n        box_codes = []\n\n        for i in range(self.n):\n            r = g = b = 0\n            c = i\n            for j in range(8):\n                r = r | (self.get_bit_at_idx(c, 0) << 7 - j)\n                g = g | (self.get_bit_at_idx(c, 1) << 7 - j)\n                b = b | (self.get_bit_at_idx(c, 2) << 7 - j)\n                c = c >> 3\n            box_codes.append((int(r), int(g), int(b)))\n        return box_codes\n\n    def get_color_map_list(self) -> List:\n        cmap = self.get_color_map()\n        cmap = np.asarray(cmap).flatten()\n        return list(cmap)\n"
  },
  {
    "path": "corenet/utils/common_utils.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nimport os\nimport random\nfrom pathlib import Path\nfrom typing import Any, Dict, List, Optional, Tuple\nfrom urllib.parse import urlparse\n\nimport numpy as np\nimport torch\nfrom packaging import version\nfrom torch import Tensor\n\nfrom corenet.constants import MIN_TORCH_VERSION\nfrom corenet.utils import logger\nfrom corenet.utils.ddp_utils import is_master\n\n\ndef construct_local_path_from_remote(remote_path: str, local_dir: str) -> str:\n    \"\"\"\n    Obtain the local file path given a remote file path WITHOUT downloading the file. The directories\n    in the returned path are created if they don't exist.\n\n    Args:\n        remote_path: The remote file path.\n        local_dir: Local directory.\n\n    Returns:\n        The corresponding local file path.\n\n    Example:\n        Assume 'remote_path=s3://bucket_name/file.pkl' and 'local_dir=/tmp', then\n        the file path on a local machine will be `/tmp/bucket_name/file.pkl'.\n\n        >>> remote_path=\"s3://bucket_name/file.pkl\"\n        >>> local_dir=\"/tmp\"\n        >>> local_path = construct_local_path_from_remote(remote_path, local_dir)\n        >>> print(local_path)\n        /tmp/bucket_name/file.pkl\n    \"\"\"\n    parsed_path = urlparse(remote_path)\n    local_path = os.path.join(local_dir, parsed_path.netloc + parsed_path.path)\n    Path(local_path).parent.mkdir(parents=True, exist_ok=True)\n    return local_path\n\n\ndef unwrap_model_fn(model: torch.nn.Module) -> torch.nn.Module:\n    \"\"\"Helper function to unwrap the model.\n\n    Args:\n        model: An instance of torch.nn.Module.\n\n    Returns:\n        Unwrapped instance of torch.nn.Module.\n    \"\"\"\n    unwrapped_model = model\n    while True:\n        if hasattr(unwrapped_model, \"module\"):\n            # added by DataParallel and DistributedDataParallel\n            unwrapped_model = unwrapped_model.module\n        elif hasattr(unwrapped_model, \"_fsdp_wrapped_module\"):\n            # FSDP wraps the model with _fsdp_wrapped_module\n            unwrapped_model = unwrapped_model._fsdp_wrapped_module\n        elif hasattr(unwrapped_model, \"_orig_mod\"):\n            # torch.compile wraps the model with _orig_mod\n            return unwrapped_model._orig_mod\n        else:\n            break\n    return unwrapped_model\n\n\ndef check_compatibility() -> None:\n    curr_torch_version = torch.__version__\n    if version.parse(curr_torch_version) < version.parse(MIN_TORCH_VERSION):\n        logger.error(\n            \"Min. pytorch version required is {}. Got: {}\".format(\n                MIN_TORCH_VERSION, curr_torch_version\n            )\n        )\n\n\ndef check_frozen_norm_layer(model: torch.nn.Module) -> Tuple[bool, int]:\n    from corenet.modeling.layers import norm_layers_tuple\n\n    unwrapped_model = unwrap_model_fn(model)\n\n    count_norm = 0\n    frozen_state = False\n    for m in unwrapped_model.modules():\n        if isinstance(m, norm_layers_tuple):\n            frozen_state = m.weight.requires_grad\n\n    return frozen_state, count_norm\n\n\ndef device_setup(opts: argparse.Namespace) -> argparse.Namespace:\n    \"\"\"Helper function for setting up the device.\n\n    Args:\n        opts: An instance of argparse.Namespace.\n\n    Returns:\n        An instance of argparse.Namespace with updated `dev.*` entries.\n    \"\"\"\n    random_seed = getattr(opts, \"common.seed\", 0)\n    random.seed(random_seed)\n    torch.manual_seed(random_seed)\n    np.random.seed(random_seed)\n\n    is_master_node = is_master(opts)\n    if is_master_node:\n        logger.log(\"Random seeds are set to {}\".format(random_seed))\n        logger.log(\"Using PyTorch version {}\".format(torch.__version__))\n\n    n_gpus = torch.cuda.device_count()\n    if n_gpus == 0:\n        if is_master_node:\n            logger.warning(\"No GPUs available. Using CPU\")\n        device = torch.device(\"cpu\")\n        n_gpus = 0\n    else:\n        if is_master_node:\n            logger.log(\"Available GPUs: {}\".format(n_gpus))\n        device = torch.device(\"cuda\")\n\n        if torch.backends.cudnn.is_available():\n            import torch.backends.cudnn as cudnn\n\n            torch.backends.cudnn.enabled = True\n            torch.backends.cudnn.benchmark = False\n            torch.backends.cudnn.deterministic = True\n            if is_master_node:\n                logger.log(\"CUDNN is enabled\")\n\n        allow_tf32 = not getattr(opts, \"common.disable_tf32\", False)\n        if torch.cuda.is_available():\n            # TF32 is enabled by default in PyTorch < 1.12, but disabled in new versions.\n            # See for details: https://github.com/pytorch/pytorch/issues/67384\n            # Disable it using common.disable_tf32 flag\n            torch.backends.cuda.matmul.allow_tf32 = allow_tf32\n\n    setattr(opts, \"dev.device\", device)\n    setattr(opts, \"dev.num_gpus\", n_gpus)\n\n    world_size = getattr(opts, \"ddp.world_size\")\n    if world_size == -1:\n        setattr(opts, \"ddp.world_size\", n_gpus)\n        logger.log(\"Setting --ddp.world-size the same as the number of available gpus.\")\n\n    return opts\n\n\ndef create_directories(dir_path: str, is_master_node: bool) -> None:\n    \"\"\"Helper function to create directories\"\"\"\n    if not os.path.isdir(dir_path):\n        os.makedirs(dir_path, exist_ok=True)\n        if is_master_node:\n            logger.log(\"Directory created at: {}\".format(dir_path))\n    else:\n        if is_master_node:\n            logger.log(\"Directory exists at: {}\".format(dir_path))\n\n\ndef move_to_device(\n    opts,\n    x: Any,\n    device: Optional[str] = \"cpu\",\n    non_blocking: Optional[bool] = True,\n    *args,\n    **kwargs\n) -> Any:\n    \"\"\"Helper function to move data to a device\"\"\"\n    if isinstance(x, Dict):\n        for k, v in x.items():\n            x[k] = move_to_device(\n                opts=opts, x=v, device=device, non_blocking=non_blocking\n            )\n\n    elif isinstance(x, Tensor):\n        # only tensors can be moved to a device\n        x = x.to(device=device, non_blocking=non_blocking)\n    elif isinstance(x, List):\n        x = [move_to_device(opts, a, device, non_blocking) for a in x]\n    return x\n\n\ndef is_coreml_conversion(opts) -> bool:\n    if getattr(opts, \"common.enable_coreml_compatible_module\", False):\n        return True\n    return False\n"
  },
  {
    "path": "corenet/utils/context_managers.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom contextlib import contextmanager\nfrom typing import ContextManager\n\n\n@contextmanager\ndef context_env_vars(**env: str) -> ContextManager[None]:\n    \"\"\"\n    Temporarily sets the environment variables within its context.\n\n    Example usage:\n    ```\n    os.environ[\"X\"] = 2\n    with context_env_vars(X=3):\n        print(os.environ[\"X\"])  # prints 3\n    print(os.environ[\"X\"])  # prints 2\n    ```\n    \"\"\"\n    original_values = {}\n    try:\n        for key, value in env.items():\n            original_values[key] = env.get(key, None)\n            if value is None:\n                env.pop(key, None)\n            else:\n                env[key] = value\n        yield\n    finally:\n        for key, value in original_values.items():\n            if value is None:\n                env.pop(key, None)\n            else:\n                env[key] = value\n\n\n@contextmanager\ndef context_tensor_threads(num_cpu_threads: int) -> ContextManager[None]:\n    \"\"\"\n    Temporarily, instructs numpy and torch to use @n cpu threads for processing tensors\n    and arrays within the context.\n    \"\"\"\n    num_cpu_threads = str(num_cpu_threads)\n    with context_env_vars(\n        MKL_NUM_THREADS=num_cpu_threads,\n        OMP_NUM_THREADS=num_cpu_threads,\n        NUMEXPR_NUM_THREADS=num_cpu_threads,\n    ):\n        yield\n"
  },
  {
    "path": "corenet/utils/ddp_utils.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nimport datetime\nimport socket\nfrom typing import Optional\n\nimport torch\nimport torch.distributed as dist\n\nfrom corenet.utils import logger\n\n\ndef is_master(opts) -> bool:\n    node_rank = getattr(opts, \"ddp.rank\", 0)\n    return node_rank == 0\n\n\ndef dist_barrier():\n    dist.barrier()\n\n\ndef dist_monitored_barrier(\n    timeout: Optional[float] = None,\n    wait_all_ranks: Optional[bool] = False,\n    group: Optional = None,\n):\n    dist.monitored_barrier(group=group, timeout=timeout, wait_all_ranks=wait_all_ranks)\n\n\ndef is_start_rank_node(opts) -> bool:\n    node_rank = getattr(opts, \"ddp.rank\", 0)\n    def_rank = getattr(opts, \"ddp.start_rank\", 0)\n    return node_rank == def_rank\n\n\ndef get_world_size():\n    return dist.get_world_size()\n\n\ndef get_node_rank():\n    return dist.get_rank()\n\n\ndef distributed_init(opts) -> int:\n    ddp_url = getattr(opts, \"ddp.dist_url\", None)\n    is_master_node = is_master(opts)\n    if ddp_url is None:\n        ddp_port = getattr(opts, \"ddp.dist_port\", 6006)\n        hostname = socket.gethostname()\n        ddp_url = \"tcp://{}:{}\".format(hostname, ddp_port)\n        setattr(opts, \"ddp.dist_url\", ddp_url)\n\n    node_rank = getattr(opts, \"ddp.rank\")\n    world_size = getattr(opts, \"ddp.world_size\")\n    if world_size < 1:\n        logger.error(\"World size should be > 0 for DDP.\")\n    if node_rank < 0:\n        logger.error(\"Node rank should be >=0 for DDP.\")\n\n    if torch.distributed.is_initialized():\n        logger.warning(\"DDP is already initialized and cannot be initialize twice!\")\n    else:\n        logger.info(\"distributed init (rank {}): {}\".format(node_rank, ddp_url))\n\n        dist_backend = getattr(opts, \"ddp.backend\", \"nccl\")  # \"gloo\"\n\n        if dist_backend is None and dist.is_nccl_available():\n            dist_backend = \"nccl\"\n            if is_master_node:\n                logger.log(\n                    \"Using NCCL as distributed backend with version={}\".format(\n                        torch.cuda.nccl.version()\n                    )\n                )\n        elif dist_backend is None:\n            dist_backend = \"gloo\"\n\n        dist.init_process_group(\n            backend=dist_backend,\n            init_method=ddp_url,\n            timeout=datetime.timedelta(seconds=3600),\n            world_size=world_size,\n            rank=node_rank,\n        )\n\n        # perform a dummy all-reduce to initialize the NCCL communicator\n        if torch.cuda.is_available():\n            dist.all_reduce(torch.zeros(1).cuda())\n\n    node_rank = torch.distributed.get_rank()\n    setattr(opts, \"ddp.rank\", node_rank)\n    return node_rank\n\n\ndef is_rank_0_worker_0(opts: argparse.Namespace) -> bool:\n    \"\"\"Check if the current process is worker 0 of rank 0.\n\n    Args:\n        opts: Command-line arguments.\n\n    Returns:\n        A boolean indicating whether the current process is worker 0 of rank 0\n    \"\"\"\n    worker_info = torch.utils.data.get_worker_info()\n    if worker_info is not None and worker_info.id == 0 and is_master(opts):\n        return True\n    return False\n"
  },
  {
    "path": "corenet/utils/dict_utils.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\nfrom typing import Collection, Dict, Optional\n\n\ndef filter_keys(\n    d: Dict,\n    whitelist: Optional[Collection[str]] = None,\n) -> Dict:\n    \"\"\"Returns a copy of the input dict @d, with a subset of keys that are in\n    @whitelist.\n\n    Args:\n        d: Input dictionary that will be copied with a subset of keys.\n        whitelist: List of keys to keep in the output (if exist in input dict).\n    \"\"\"\n\n    return {key: d[key] for key in whitelist if key in d}\n"
  },
  {
    "path": "corenet/utils/download_utils.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nimport math\nimport time\nfrom multiprocessing import Pool\nfrom pathlib import Path\nfrom typing import Any, Dict, List, Optional, Protocol\nfrom urllib.parse import urlsplit\n\nimport torch\n\nfrom corenet.constants import TMP_CACHE_LOC\nfrom corenet.utils import logger, resources\nfrom corenet.utils.ddp_utils import dist_barrier, is_start_rank_node\n\n\ndef get_local_path(\n    opts: argparse.Namespace,\n    path: str,\n    cache_loc: str = TMP_CACHE_LOC,\n    force_delete: Optional[bool] = None,\n    use_start_rank: bool = True,\n    sync_ranks: bool = True,\n    max_retries: int = 5,\n    parallel_download: bool = False,\n    max_download_workers: int = 1,\n    *args,\n    **kwargs,\n) -> str:\n    \"\"\"\n    Helper function to download data from remote servers (e.g., S3/HTTP/HTTPS).\n\n    Args:\n        opts: Command-line arguments.\n        path: Path of the remote file that needs to be downloaded.\n        cache_loc: Location where file needs to be stored after downloading.\n        force_delete: Force the file to be deleted if it is present in the `cache_loc`.\n        use_start_rank: Download the files on the start rank of each node.\n        sync_ranks: Synchronize DDP ranks after downloading.\n        max_retries: Maximum download retries. Defaults to 5.\n        parallel_download: If enabled, files are downloaded in parallel.\n        max_download_workers: Maximum number of workers for downloading. Should satisfy 1 <= 'max_download_workers' <= num_cpus.\n\n    Returns:\n        If file(s) is(are) remote, this function downloads it to `cache_loc` and\n        returns the local path(s). Otherwise, its a noop.\n    \"\"\"\n    # To avoid circular imports, get_transfer_client is imported inside get_local_path.\n    from corenet.data.io.transfer_clients import get_transfer_client\n\n    client_name = urlsplit(path).scheme.lower()\n\n    client = get_transfer_client(\n        opts,\n        transfer_client_name=client_name,\n        max_retries=max_retries,\n        force_delete=force_delete,\n        only_download_on_start_rank=use_start_rank,\n        synchronize_distributed_ranks=sync_ranks,\n        parallel_download=parallel_download,\n        max_download_workers=max_download_workers,\n        raise_error_if_transfer_client_not_present=False,\n    )\n\n    if client is None:\n        # For 'get_local_path', it is a no-op if file is locally present or client is not present\n        # However, 'get_transfer_client()' can raise an error (if required) by enabling 'raise_error_if_transfer_client_not_present'.\n        return path\n    else:\n        return client.download(path, cache_loc)\n\n\nclass DownloadFunc(Protocol):\n    def __call__(\n        file_idx: int, local_dst_dir: str, args: List[Any], kwargs: Dict[Any, Any]\n    ) -> Any:\n        \"\"\"Protocol for a callable that downloads an index of a dataset to `dst_location`.\n        Args:\n            file_idx: Index of the asset to be downloaded.\n            local_dst_dir: Local directory path where asset should be stored after downloading locally.\n            args: 'download_func' specific args.\n            kwargs: 'download_func' specific kwargs.\n        \"\"\"\n        ...\n\n\ndef download_assets_in_parallel(\n    opts: argparse.Namespace,\n    download_func: DownloadFunc,\n    local_dst_dir: str,\n    num_assets: int,\n    shard_asset: bool = False,\n    max_threads: Optional[int] = None,\n    index_padding: bool = False,\n    *args,\n    **kwargs,\n) -> List[Any]:\n    \"\"\"\n    Helper function to download assets in parallel.\n\n    Args:\n        opts: Command-line arguments.\n        download_func: Custom function to be used for downloading/processing assets.\n        dst_dir: Local directory path where assets should be stored after downloading. If 'dst_dir' does not exist, it will be created.\n        num_assets: Total number of assets to be downloaded.\n        shard_asset: Shard assets among nodes.\n        max_threads: Maximum number of threads. If not specified, then max_threads=num_cpus.\n        index_padding: Pad indices to download the same number of assets on each node.\n        args and kwargs: 'download_func' specific args and kwargs.\n\n    Returns:\n        A list of indices.\n\n    ...note:\n        Users need to specify the 'num_assets'. This can be pre-computed (e.g., number of files in the S3 bucket) and passed\n        to 'download_assets_in_parallel' function.\n\n    \"\"\"\n    Path(local_dst_dir).mkdir(exist_ok=True, parents=True)\n\n    cuda_available = torch.cuda.is_available()\n\n    # For CPU, world_size and n_gpus_per_node should be 1 to avoid division-by-zero errors\n    world_size = max(getattr(opts, \"ddp.world_size\"), 1)\n    n_gpus_per_node = torch.cuda.device_count() if cuda_available else 1\n    current_device = torch.cuda.current_device() if cuda_available else 0\n\n    curr_node_rank = getattr(opts, \"ddp.rank\")\n    node_id = curr_node_rank // n_gpus_per_node\n\n    total_assets = int(math.ceil(num_assets / world_size)) * world_size\n    asset_indices = [idx for idx in range(num_assets)]\n    if index_padding:\n        asset_indices += asset_indices[: (total_assets - num_assets)]\n\n    if shard_asset:\n        # Each node downloads portion of the assets.\n        # Note that total number of GPUs (a.k.a world size) = Total number of nodes * number of GPUs per Node\n        n_nodes = max(1, world_size // n_gpus_per_node)\n        assets_per_node = int(math.ceil(len(asset_indices) / n_nodes))\n    else:\n        # Each node downloads all assets.\n        assets_per_node = len(asset_indices)\n\n    asset_indices_node_i = asset_indices[\n        node_id * assets_per_node : (node_id + 1) * assets_per_node\n    ]\n\n    # now divide the assets among each GPU in the node to download in parallel\n    asset_indices_node_i_rank_j = asset_indices_node_i[\n        current_device : len(asset_indices_node_i) : n_gpus_per_node\n    ]\n\n    start_time = time.time()\n\n    # download assets in parallel on each rank\n    n_cpus = resources.cpu_count()\n    if max_threads is None:\n        # use all CPUs\n        max_threads = n_cpus\n\n    n_process_per_gpu = min(max(1, n_cpus // n_gpus_per_node), max_threads)\n    with Pool(processes=n_process_per_gpu) as pool:\n        pool.starmap(\n            download_func,\n            [\n                (file_idx, local_dst_dir, args, kwargs)\n                for file_idx in asset_indices_node_i_rank_j\n            ],\n        )\n\n    # We set the default value of ddp.use_distributed here as it is not an exposed\n    # parameter using command-line arguments\n    if getattr(opts, \"ddp.use_distributed\", False):\n        # synchronize between all DDP jobs\n        dist_barrier()\n\n    download_time = round((time.time() - start_time) / 60.0, 3)\n\n    if is_start_rank_node(opts):\n        # display information on start ranks\n        logger.log(\n            f\"Function {download_func.__name__} took {download_time:.2f} minutes to process/download {len(asset_indices_node_i_rank_j)} assets.\"\n        )\n\n    return asset_indices_node_i\n"
  },
  {
    "path": "corenet/utils/file_logger.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport os\nimport shutil\nimport tempfile\nfrom typing import Any, Dict, Optional, Union\n\nimport torch\n\n\nclass FileLogger:\n    \"\"\"\n    A logger that writes scalar values to a file.\n    \"\"\"\n\n    def __init__(self, fname: str) -> None:\n        \"\"\"\n        Initialize a FileLogger.\n\n        Since logged values may include tensors, the file is saved with\n        torch.save.\n\n        Args:\n            fname: The name of the pytorch file to which the logger will save\n                logs.\n        \"\"\"\n        self.fname = fname\n\n        if os.path.exists(self.fname):\n            self.stats = torch.load(self.fname)\n        else:\n            # We hold stats in a dictionary keyed by epoch number. We use a\n            # dictionary rather than a list to avoid the assumption that\n            # len(self.stats) gives the current epoch. Such an assumption is\n            # inconvenient if, for instance, we resume training mid-way through,\n            # and suddenly enabling this FileLogger when it wasn't enabled\n            # before.\n            self.stats: Dict[int, Dict[str, Any]] = {\"epochs\": {}}\n\n    def add_scalar(\n        self,\n        metric_name: str,\n        metric_value: Union[float, int],\n        epoch: int,\n    ) -> None:\n        \"\"\"\n        Add a scalar to the FileLogger.\n\n        Args:\n            metric_name: The name of the metric.\n            metric_value: The value of the metric.\n            epoch: The epoch number.\n        \"\"\"\n        if epoch not in self.stats[\"epochs\"]:\n            self.stats[\"epochs\"][epoch] = {\"metrics\": {}}\n\n        self.stats[\"epochs\"][epoch][\"metrics\"][metric_name] = metric_value\n\n    def close(self) -> None:\n        # Write to a temporary file, then use shutil.move (to make the write\n        # atomic). This avoids creating a malformed file if the job crashes\n        # during writing.\n        temporary_file = tempfile.NamedTemporaryFile(delete=False)\n        torch.save(self.stats, temporary_file.name)\n        temporary_file.close()\n\n        # NOTE: Do not use os.rename to avoid 'OSError: Invalid cross-device link'.\n        # See: https://stackoverflow.com/questions/42392600/oserror-errno-18-invalid-cross-device-link\n        shutil.move(temporary_file.name, self.fname)\n"
  },
  {
    "path": "corenet/utils/fpdb.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport fcntl\nimport pdb\nimport sys\n\n\nclass _ForkedPdb(pdb.Pdb):\n    \"\"\"A Pdb subclass for forked subprocesses. The first subprocess (or main process)\n    that invokes this class launches the pdb, and the rest of the processes will wait.\n    Uses a simple file-based lock mechanism for synchronization that works on Unix, but\n    has not been tested on other operation systems.\n\n    Usage:\n\n    ```\n    from corenet.utils import fpdb; fpdb.set_trace()\n    ```\n\n    Inspired by https://github.com/Lightning-AI/forked-pdb/blob/master/fpdb.py\n    \"\"\"\n\n    def __init__(self, lockfile: str) -> None:\n        self.lockfile = lockfile\n        super().__init__()\n\n    def interaction(self, *args, **kwargs) -> None:\n        \"\"\"Acquires the lockfile, then attaches the input stream of the subprocess to\n        /dev/stdin, so that subprocess debugger can receive keyboard inputs.\n        \"\"\"\n        with open(self.lockfile, \"a\") as lock:\n            try:\n                fcntl.lockf(lock, fcntl.LOCK_EX)\n\n                _stdin = sys.stdin\n                try:\n                    sys.stdin = open(\"/dev/stdin\")\n                    pdb.Pdb.interaction(self, *args, **kwargs)\n                finally:\n                    sys.stdin = _stdin\n\n            finally:\n                fcntl.lockf(lock, fcntl.LOCK_UN)\n\n\ndef set_trace(lockfile: str = \"/tmp/_corenet_fpdb.lockfile\") -> None:\n    \"\"\"\n    Launches a pdb debugger in a single-node multi-process job.  The first subprocess\n    that invokes this function launches the pdb and makes the rest of subprocesses,\n    that invoke this function, wait for the first subprocess's debugger.\n\n    Args:\n        lockfile: The path to the lockfile for synchronization between subprocesses.\n        Defaults to a constant path in ``/tmp``. As long as there is a single concurrent\n        training job running, the user won't need to override this argument.\n    \"\"\"\n    _ForkedPdb(lockfile).set_trace(frame=sys._getframe().f_back)\n"
  },
  {
    "path": "corenet/utils/hf_adapter_utils.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nfrom typing import Any, Dict, List, Optional, Tuple\n\nimport torch\n\nfrom corenet.modeling.models import get_model\n\ntry:\n    from transformers import PretrainedConfig, PreTrainedModel\n    from transformers.modeling_outputs import CausalLMOutputWithPast\nexcept ModuleNotFoundError:\n    PretrainedConfig = object\n    PreTrainedModel = object\n    CausalLMOutputWithPast = None\n\n\nclass CorenetToHFPretrainedConfig(PretrainedConfig):\n    \"\"\"\n    An adapter to build a CoreNet config that inherits from\n    PreTrainedConfig.\n\n    Mainly used for adaptation to 3rd party code.\n\n    Args:\n        kwargs: Arguments to pass to PretrainedConfig.\n    \"\"\"\n\n    model_type = \"causal_lm\"\n\n    def __init__(self, **kwargs: Dict[str, Any]) -> None:\n        super().__init__(**kwargs)\n\n\nclass CorenetToHFPretrainedModel(PreTrainedModel):\n    \"\"\"\n    An adapter to build a CoreNet model that inherits from\n    PreTrainedModel.\n\n    Mainly used for adaptation to 3rd party code.\n\n    Args:\n        config: The _CorenetToHFPretrainedConfig\n            that defines the model. This essentially\n            contains the standard CoreNet model arguments.\n        vocab_size: The vocabulary size.\n    \"\"\"\n\n    config_class = CorenetToHFPretrainedConfig\n\n    def __init__(self, config: CorenetToHFPretrainedConfig, vocab_size: int) -> None:\n        super().__init__(config)\n        opts = argparse.Namespace(**vars(config))\n\n        model = get_model(opts)\n        model.eval()\n\n        self.lm_head = None\n        self.model = model\n        self.vocab_size = vocab_size\n        self.post_init()\n\n    def forward(\n        self,\n        input_ids: Optional[torch.LongTensor] = None,\n        past_key_values: Optional[List[torch.Tensor]] = None,\n        attention_mask: Optional[\n            torch.FloatTensor\n        ] = None,  # No need, internally apply causal masking\n        token_type_ids: Optional[\n            torch.LongTensor\n        ] = None,  # No need, we do not differentiate between tokens\n        position_ids: Optional[\n            torch.LongTensor\n        ] = None,  # Needed for llama mdoels, not needed for openelm\n        head_mask: Optional[\n            torch.FloatTensor\n        ] = None,  # No need, we are not masking heads\n        inputs_embeds: Optional[\n            torch.FloatTensor\n        ] = None,  # No need, they will be computed internally\n        encoder_hidden_states: Optional[\n            torch.Tensor\n        ] = None,  # No need, we don't have encoder\n        encoder_attention_mask: Optional[\n            torch.FloatTensor\n        ] = None,  # No need, we don't have encoder\n        use_cache: Optional[\n            bool\n        ] = None,  # We can use it, map to `use_kv_cache` args internally\n        output_attentions: Optional[bool] = None,  # No need, we are not using them\n        output_hidden_states: Optional[bool] = None,  # No need, we are not using them\n        return_dict: Optional[\n            bool\n        ] = None,  # We can return as a dict, we internally deal with it\n        cache_position: Optional[torch.LongTensor] = None,  # No need, not used.\n    ) -> CausalLMOutputWithPast:\n        \"\"\"\n        The forward function to compute model outputs.\n\n        Note, many arguments are not supported, and are only\n        present due to inheritance. Additionally, the model is\n        assumed to use causal attention.\n\n        Args:\n            input_ids: The input token ids.\n            past_key_values: The key-value cache.\n            attention_mask: Unused.\n            token_type_ids: Unused.\n            position_ids: Unused.\n            head_mask: Unused.\n            inputs_embeds: Unused.\n            encoder_hidden_states: Unused.\n            encoder_attention_mask: Unused.\n            use_cache: Whether we are going to use the cache or not.\n            output_attentions: Unused.\n            output_hidden_states: Unused.\n            return_dict: Unused.\n            cache_position: Unused\n        \"\"\"\n        assert token_type_ids is None\n        # assert position_ids is None\n        assert head_mask is None\n        assert inputs_embeds is None\n        assert encoder_hidden_states is None\n        assert encoder_attention_mask is None\n        assert not output_attentions\n        assert not output_hidden_states\n        assert return_dict is None or return_dict\n\n        is_causal = True\n        if use_cache:\n            # For generative tasks, we have two scenarios: (1) processing prefix and (2) generation\n            # For the first case, @n_input_tokens > 1 and we do not have past_key_values. Therefore,\n            # we need to run model with causal mask\n            # For the second case, @n_input_tokens should be 1. In this case, we have already processed\n            # prefix and will use it's cached keys and values for the current token.\n\n            # input_ids are of the shape [Batch, Seq_length]\n            n_input_tokens = input_ids.shape[1]\n\n            if n_input_tokens == 1 and past_key_values is not None:\n                is_causal = False\n            elif n_input_tokens > 1 and past_key_values is None:\n                is_causal = True\n            else:\n                raise NotImplementedError(\"Not yet supported\")\n            if past_key_values is None:\n                past_keys = None\n                past_values = None\n            else:\n                past_keys, past_values = past_key_values\n\n            model_inputs = {\n                \"input_ids\": input_ids,\n                \"past_keys\": past_keys,\n                \"past_values\": past_values,\n                \"use_kv_cache\": use_cache,\n                \"is_causal\": is_causal,\n            }\n        else:\n            model_inputs = input_ids\n\n        model_outputs = self.model(model_inputs)\n        if isinstance(model_outputs, dict):\n            logits = model_outputs[\"logits\"]\n            past_key_values = model_outputs[\"past_keys\"], model_outputs[\"past_values\"]\n        elif isinstance(model_outputs, torch.Tensor):\n            logits = model_outputs\n            past_key_values = None\n\n        # We may have added extra tokens in the LM classifier to make training faster. Remove such tokens\n        logits = logits[..., : self.vocab_size]\n\n        return CausalLMOutputWithPast(\n            logits=logits,\n            past_key_values=past_key_values,\n        )\n\n    def prepare_inputs_for_generation(\n        self,\n        input_ids: torch.Tensor,\n        past_key_values: Optional[Tuple[torch.Tensor, torch.Tensor]] = None,\n        use_cache: bool = False,\n        attention_mask: Optional[torch.Tensor] = None,\n        **kwargs,\n    ):\n        \"\"\"\n        Prepare inputs to be passed to the model by building a dictionary of\n        arguments from the inputs.\n\n        Args:\n            input_ids: The input ids.\n            past_key_values: The key-value cache.\n            use_cache: If set, use the key-value cache.\n            attention_mask: The attention mask to use in attention layers.\n\n            Other keyword arguments are ignored.\n        \"\"\"\n        if past_key_values is not None:\n            # All tokens except the last token were processed in the previous time step.\n            # so, we do not need to process them again.\n            input_ids = input_ids[:, -1:]\n\n        position_ids = kwargs.get(\"position_ids\", None)\n        if attention_mask is not None and position_ids is None:\n            # create position_ids on the fly for batch generation\n            position_ids = attention_mask.long().cumsum(-1) - 1\n            position_ids.masked_fill_(attention_mask == 0, 1)\n            if past_key_values is not None:\n                position_ids = position_ids[:, -input_ids.shape[1] :]\n\n        model_inputs = {\n            \"input_ids\": input_ids,\n            \"position_ids\": position_ids,\n            \"past_key_values\": past_key_values,\n            \"use_cache\": use_cache,\n            \"attention_mask\": attention_mask,\n        }\n        return model_inputs\n"
  },
  {
    "path": "corenet/utils/import_utils.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport importlib\nimport os\nimport re\nimport sys\nfrom typing import Optional, Sequence\n\nfrom corenet.constants import LIBRARY_ROOT\nfrom corenet.utils import logger\n\n\ndef import_modules_from_folder(\n    folder_name: str, extra_roots: Optional[Sequence[str]] = None\n) -> None:\n    \"\"\"Automatically import all modules from public library root folder, in addition\n    to the @extra_roots directories.\n\n    The @folder_name directory must exist in LIBRARY_ROOT, but existence in @extra_roots\n    is optional.\n\n    Args:\n        folder_name: Name of the folder to search for its internal and public modules.\n        extra_roots: By default, this function only imports from\n            `LIBRARY_ROOT/{folder_name}/**/*.py`. For any extra_root provided, it will\n            also import `LIBRARY_ROOT/{extra_root}/{folder_name}/**/*.py` modules.\n    \"\"\"\n    if not LIBRARY_ROOT.joinpath(folder_name).exists():\n        logger.error(\n            f\"{folder_name} doesn't exist in the public library root directory.\"\n        )\n\n    base_dirs = [\".\"]\n    if extra_roots is not None:\n        base_dirs += sorted(extra_roots)\n    for base_dir in base_dirs:\n        if base_dir.startswith(\"corenet/\") and folder_name.startswith(\"corenet/\"):\n            base_dir = os.path.join(base_dir, re.sub(\"^corenet/\", \"\", folder_name))\n        else:\n            base_dir = os.path.join(base_dir, folder_name)\n        for path in sorted(LIBRARY_ROOT.glob(os.path.join(base_dir, \"**/*.py\"))):\n            filename = path.name\n            if (\n                filename[0] not in (\".\", \"_\")\n                and not filename.endswith(\"_test.py\")\n                and not filename.startswith(\"test_\")\n            ):\n                module_name = str(\n                    path.relative_to(LIBRARY_ROOT).with_suffix(\"\")\n                ).replace(os.sep, \".\")\n                importlib.import_module(module_name)\n\n\n# For some libraries, the name of the module to be imported is different with the name\n# of the library (i.e. to install using pip).\nMODULE_NAME_2_LIBRARY_NAME_MAPPING = {\n    \"ffmpeg\": \"ffmpeg-python\",\n}\n\n\ndef ensure_library_is_available(module_name: str) -> None:\n    \"\"\"Ensures @module_name is imported, when the corresponding library is an optional\n    dependency.\n\n    Args:\n        module_name: Name of the module that should be imported before calling this\n            function using the following snippet:\n            ```\n                try:\n                    import <module_name>\n                    # OR: import <module_name>.<member1>.<member2>\n                    # OR: from <module_name>.<member1> import <member2>\n                except ModuleNotFoundError:\n                    pass\n            ```\n\n    Returns: None if optional dependency is installed. Otherwise, raises an error.\n    \"\"\"\n    if module_name in sys.modules:\n        # The above condition has confirmed that module_name is already imported.\n        return\n\n    try:\n        importlib.import_module(module_name)\n    except ModuleNotFoundError:\n        library_name = MODULE_NAME_2_LIBRARY_NAME_MAPPING.get(module_name, module_name)\n        logger.error(\n            f\"{library_name} (an optional dependency) is not installed. Please\"\n            f\" run 'pip install {library_name}'.\"\n        )\n\n    # Module is available, but not imported yet. Otherwise, the `if` condition at the\n    # top of this function would have returned before reaching this line.\n    raise RuntimeError(\n        f\"Please import {module_name} before calling\"\n        f' ensure_library_is_available(\"{module_name}\")'\n    )\n\n\ndef import_core_modules():\n    \"\"\"\n    This function imports the core functionality of CoreNet, consisting of all modules\n    that contain registered classes (e.g. datasets, models, etc.) and entrypoints.\n\n    For further details, please see the docstring of\n    ``corenet.utils.import_utils.test_ensure_pythonpath_is_not_required``.\n    \"\"\"\n    from corenet.options.opts import get_training_arguments\n\n    get_training_arguments(args=[])  # Imports registered classes.\n\n    from corenet.cli.entrypoints import entrypoints\n\n    for module_name, _ in entrypoints.values():\n        importlib.import_module(module_name)\n"
  },
  {
    "path": "corenet/utils/io_utils.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport tempfile\nfrom typing import Optional\n\n\ndef make_temp_file(\n    suffix: str = None,\n    prefix: Optional[str] = \"corenet-tmp-\",\n    dir: Optional[str] = None,\n) -> str:\n    \"\"\"Create a temporary file and return its path.\"\"\"\n    tmp_file = tempfile.NamedTemporaryFile(\n        delete=False,\n        suffix=suffix,\n        prefix=prefix,\n        dir=dir,\n    )\n    tmp_file.close()\n    return tmp_file.name\n"
  },
  {
    "path": "corenet/utils/logger.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport os\nimport re\nimport sys\nimport time\nimport traceback\nfrom typing import Optional, Union\n\ntext_colors = {\n    \"logs\": \"\\033[34m\",  # 033 is the escape code and 34 is the color code\n    \"info\": \"\\033[32m\",\n    \"warning\": \"\\033[33m\",\n    \"debug\": \"\\033[93m\",\n    \"error\": \"\\033[31m\",\n    \"bold\": \"\\033[1m\",\n    \"end_color\": \"\\033[0m\",\n    \"light_red\": \"\\033[36m\",\n}\n\n\ndef get_curr_time_stamp() -> str:\n    return time.strftime(\"%Y-%m-%d %H:%M:%S\")\n\n\ndef error(message: str) -> None:\n    time_stamp = get_curr_time_stamp()\n    error_str = (\n        text_colors[\"error\"]\n        + text_colors[\"bold\"]\n        + \"ERROR  \"\n        + text_colors[\"end_color\"]\n    )\n\n    # exiting with code -1 does not tell any information about the error (e.g., NaN encountered in the loss).\n    # For more descriptive error messages, we replace exit(-1) with sys.exit(ERROR_MESSAGE).\n    # This allows us to handle specific exceptions in the tests.\n\n    # print(\"{} - {} - {}\".format(time_stamp, error_str, message), flush=True)\n    # print(\"{} - {} - {}\".format(time_stamp, error_str, \"Exiting!!!\"), flush=True)\n    # exit(-1)\n\n    if sys.exc_info()[0] is None:\n        traceback.print_stack()\n    else:\n        traceback.print_exc()\n    sys.exit(\"{} - {} - {}. Exiting!!!\".format(time_stamp, error_str, message))\n\n\ndef color_text(in_text: str) -> str:\n    return text_colors[\"light_red\"] + in_text + text_colors[\"end_color\"]\n\n\ndef log(message: str, end=\"\\n\") -> None:\n    time_stamp = get_curr_time_stamp()\n    log_str = (\n        text_colors[\"logs\"] + text_colors[\"bold\"] + \"LOGS   \" + text_colors[\"end_color\"]\n    )\n    print(\"{} - {} - {}\".format(time_stamp, log_str, message), end=end)\n\n\ndef warning(message: Union[str, Warning]) -> None:\n    if isinstance(message, Warning):\n        message = f\"{type(message).__name__}({','.join(map(repr, message.args))}\"\n\n    time_stamp = get_curr_time_stamp()\n    warn_str = (\n        text_colors[\"warning\"]\n        + text_colors[\"bold\"]\n        + \"WARNING\"\n        + text_colors[\"end_color\"]\n    )\n    print(\"{} - {} - {}\".format(time_stamp, warn_str, message))\n\n\ndef ignore_exception_with_warning(message: str) -> None:\n    \"\"\"\n    After catching a tolerable exception E1 (e.g. when Model.forward() fails during\n    profiling with try-catch, it'll be helpful to log the exception for future\n    investigation. But printing the error stack trace, as is, could be confusing\n    when an uncaught (non-tolerable) exception \"E2\" raises down the road. Then, the log\n    will contain two stack traces for E1, E2. When looking for errors in logs, users\n    should look for E2, but they may find E1.\n\n    This function appends \"(WARNING)\" at the end of all lines of the E1 traceback, so\n    that the user can distinguish E1 from uncaught exception E2.\n\n    Args:\n        message: Extra explanation and context for debugging. (Note: the exception obj\n    will be automatically fetched from python. No need to pass it as an argument or as\n    message)\n    \"\"\"\n    warning(f\"{message}:\\n{traceback.format_exc()}\".replace(\"\\n\", \"\\n(WARNING)\"))\n\n\ndef info(message: str, print_line: Optional[bool] = False) -> None:\n    time_stamp = get_curr_time_stamp()\n    info_str = (\n        text_colors[\"info\"] + text_colors[\"bold\"] + \"INFO   \" + text_colors[\"end_color\"]\n    )\n    print(\"{} - {} - {}\".format(time_stamp, info_str, message))\n    if print_line:\n        double_dash_line(dashes=150)\n\n\ndef debug(message: str) -> None:\n    time_stamp = get_curr_time_stamp()\n    log_str = (\n        text_colors[\"debug\"]\n        + text_colors[\"bold\"]\n        + \"DEBUG   \"\n        + text_colors[\"end_color\"]\n    )\n    print(\"{} - {} - {}\".format(time_stamp, log_str, message))\n\n\ndef double_dash_line(dashes: Optional[int] = 75) -> None:\n    print(text_colors[\"error\"] + \"=\" * dashes + text_colors[\"end_color\"])\n\n\ndef singe_dash_line(dashes: Optional[int] = 67) -> None:\n    print(\"-\" * dashes)\n\n\ndef print_header(header: str) -> None:\n    double_dash_line()\n    print(\n        text_colors[\"info\"]\n        + text_colors[\"bold\"]\n        + \"=\" * 50\n        + str(header)\n        + text_colors[\"end_color\"]\n    )\n    double_dash_line()\n\n\ndef print_header_minor(header: str) -> None:\n    print(\n        text_colors[\"warning\"]\n        + text_colors[\"bold\"]\n        + \"=\" * 25\n        + str(header)\n        + text_colors[\"end_color\"]\n    )\n\n\ndef disable_printing():\n    sys.stdout = open(os.devnull, \"w\")\n\n\ndef enable_printing():\n    sys.stdout = sys.__stdout__\n\n\ndef match_warning_message(*message_segments: str) -> str:\n    \"\"\"Creates a regex that matches warnings given a partial warning message.\n\n    It escapes the dots and special characters and also replaces whitespaces with \\\\s+,\n    so that the users copy-paste the warning message to the input of this function.\n\n    Args:\n        message_segments: The warning message, copy-pasted from console logs. When\n            multiple segments are passed as inputs, the regex will match warnings that\n            contain all of segments in order they were provided.\n\n    Returns:\n        A regex that matches the message robustly, handling whitespaces and escaping.\n    \"\"\"\n    regex_segments = [\"\"]\n\n    for segment in message_segments:\n        segment = re.sub(r\"\\s+\", \" \", segment)  # Replace all whitespaces with \" \"\n        segment = re.escape(segment)  # The input pattern is not a regular expression\n        segment = re.sub(r\"\\\\ \", r\"\\\\s+\", segment)\n        regex_segments.append(segment)\n\n    return \".*\".join(regex_segments)\n\n\ndef indent(multiline_str: str, prefix: str = \"\\t\") -> str:\n    \"\"\"Indents each line in of the input string.\n\n    Args:\n        multiline_str: The input string to indent.\n        prefix: The prefix insert at the beginning of each line for indentation.\n            Defaults to the tab character.\n\n    Returns:\n        The input @multiline_str, modified by prefixing each line with @prefix.\n    \"\"\"\n    lines = multiline_str.split(\"\\n\")\n    lines = (prefix + line for line in lines)\n    lines = \"\\n\".join(lines)\n    return lines\n\n\ndef truncate(text: str, max_len: int = 79) -> str:\n    \"\"\"Truncates a string by a maximum length limit, to keep the logs readable.\n\n    Args:\n        text: The input string to truncate.\n\n    Returns:\n        The input @text string, truncated by a maximum length of @max_len.\n    \"\"\"\n    assert max_len > 5\n\n    if len(text) <= max_len:\n        return text\n\n    return text[: max_len - 5] + \"[...]\"\n"
  },
  {
    "path": "corenet/utils/math_utils.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom typing import Optional, Union\n\n\ndef make_divisible(\n    v: Union[float, int],\n    divisor: Optional[int] = 8,\n    min_value: Optional[Union[float, int]] = None,\n) -> Union[float, int]:\n    \"\"\"\n    This function is taken from the original tf repo.\n    It ensures that all layers have a channel number that is divisible by 8\n    It can be seen here:\n    https://github.com/tensorflow/models/blob/master/research/slim/nets/mobilenet/mobilenet.py\n    :param v:\n    :param divisor:\n    :param min_value:\n    :return:\n    \"\"\"\n    if min_value is None:\n        min_value = divisor\n    new_v = max(min_value, int(v + divisor / 2) // divisor * divisor)\n    # Make sure that round down does not go down by more than 10%.\n    if new_v < 0.9 * v:\n        new_v += divisor\n    return new_v\n\n\ndef bound_fn(\n    min_val: Union[float, int], max_val: Union[float, int], value: Union[float, int]\n) -> Union[float, int]:\n    return max(min_val, min(max_val, value))\n"
  },
  {
    "path": "corenet/utils/object_utils.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport sys\nfrom numbers import Number\nfrom typing import Dict\n\nfrom corenet.constants import is_test_env\nfrom corenet.utils import logger\n\n\ndef is_iterable(x):\n    return hasattr(x, \"__iter__\") and not isinstance(x, (str, bytes))\n\n\ndef apply_recursively(x, cb, *args, **kwargs):\n    if isinstance(x, dict):\n        return {k: apply_recursively(v, cb, *args, **kwargs) for k, v in x.items()}\n    elif is_iterable(x):\n        x_type = type(x)\n        return x_type([apply_recursively(y, cb, *args, **kwargs) for y in x])\n    else:\n        return cb(x, *args, **kwargs)\n\n\ndef flatten_to_dict(\n    x, name: str, dict_sep: str = \"/\", list_sep: str = \"_\"\n) -> Dict[str, Number]:\n    if x is None:\n        return {}\n    elif isinstance(x, Number):\n        return {name: x}\n    elif isinstance(x, list):\n        return {\n            k: v\n            for i, inner in enumerate(x)\n            for k, v in flatten_to_dict(\n                inner,\n                name=name + list_sep + str(i),\n                dict_sep=dict_sep,\n                list_sep=list_sep,\n            ).items()\n        }\n    elif isinstance(x, dict):\n        return {\n            k: v\n            for iname, inner in x.items()\n            for k, v in flatten_to_dict(\n                inner,\n                name=name + dict_sep + iname,\n                dict_sep=dict_sep,\n                list_sep=list_sep,\n            ).items()\n        }\n\n    logger.error(\"This should never be reached!\")\n    return {}\n\n\ndef is_pytest_environment() -> bool:\n    \"\"\"Helper function to check if pytest environment or not\"\"\"\n    logger.warning(\n        DeprecationWarning(\n            \"utils.object_utils.is_pytest_environment is deprecated. Please use\"\n            \" common.is_test_env instead.\"\n        )\n    )\n    return is_test_env()\n"
  },
  {
    "path": "corenet/utils/object_utils_test.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom corenet.utils.object_utils import apply_recursively, flatten_to_dict\n\n\ndef test_apply_on_values():\n    d = {\n        \"top1\": 1.112311,\n        \"prob_hist\": {\"max\": [0.10003, 0.3, 0.5, 0.09997]},\n        \"accuracy_per_class\": [0.8286, 0.9124],\n    }\n\n    new_d = apply_recursively(d, lambda x: round(x, 2))\n\n    assert str(new_d[\"top1\"]) == \"1.11\"\n    assert str(new_d[\"prob_hist\"][\"max\"][0]) == \"0.1\"\n\n\ndef test_flatten_to_dict():\n    original = {\n        \"top1\": 1.112311,\n        \"prob_hist\": {\"max\": [0.10003, 0.3, 0.5, 0.09997]},\n        \"accuracy_per_class\": [0.8286, 0.9124],\n    }\n    flattened = {\n        \"metric/top1\": 1.112311,\n        \"metric/prob_hist/max_0\": 0.10003,\n        \"metric/prob_hist/max_1\": 0.3,\n        \"metric/prob_hist/max_2\": 0.5,\n        \"metric/prob_hist/max_3\": 0.09997,\n        \"metric/accuracy_per_class_0\": 0.8286,\n        \"metric/accuracy_per_class_1\": 0.9124,\n    }\n    assert flatten_to_dict(original, \"metric\") == flattened\n"
  },
  {
    "path": "corenet/utils/pytorch_to_coreml.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom typing import Dict, Optional, Tuple, Union\n\nimport coremltools as ct\nimport numpy as np\nimport torch\nfrom PIL import Image\nfrom torch import Tensor\nfrom torch.utils.mobile_optimizer import optimize_for_mobile\nfrom torchvision.transforms import functional as F\n\nfrom corenet.utils import logger\nfrom corenet.utils.tensor_utils import create_rand_tensor\n\n\ndef convert_pytorch_to_coreml(\n    opts,\n    pytorch_model: torch.nn.Module,\n    jit_model_only: Optional[bool] = False,\n    convert_to: str = \"neuralnetwork\",\n    minimum_deployment_target: Optional[ct.target] = None,\n    compute_precision: Optional[ct.precision] = None,\n) -> Dict:\n    \"\"\"\n    Convert Pytorch model to CoreML\n\n    Args:\n        pytorch_model: Pytorch model that needs to be converted to JIT or CoreML\n        jit_model_only: If set, do not create the optimized or CoreML model.\n        convert_to: If 'neuralnetwork', convert to espresso format. If 'mlpackage',\n            convert to the MIL format.\n        minimum_deployment_target: The minimal version of the system  to converted model\n            supports on device.\n            The converter produces a neural network (neuralnetwork) if:\n\n                minimum_deployment_target <= coremltools.target.iOS14/\n                             coremltools.target.macOS11/\n                             coremltools.target.watchOS7/\n                             coremltools.target.tvOS14:\n            The converter produces an ML program (mlprogram) if:\n\n                minimum_deployment_target >= coremltools.target.iOS15/\n                              coremltools.target.macOS12/\n                              coremltools.target.watchOS8/\n                              coremltools.target.tvOS15:\n            If neither the minimum_deployment_target nor the convert_to parameter is\n            specified, the converter produces an ML program model type with as minimum\n            of a deployment target as possible.\n\n            If this parameter is specified and convert_to is also specified, they must\n            be compatible.\n\n        compute_precision: Precision of converted model.\n\n    Returns:\n        A dict containing the JIT model, the optimized model, and the CoreML model.\n    \"\"\"\n\n    input_image_path = getattr(opts, \"conversion.input_image_path\", None)\n    if input_image_path is not None:\n        input_pil_img = Image.open(input_image_path).convert(\"RGB\")\n        input_pil_img = F.resize(\n            img=input_pil_img, size=256, interpolation=F.InterpolationMode.BILINEAR\n        )\n        input_pil_img = F.center_crop(img=input_pil_img, output_size=224)\n        input_tensor = F.pil_to_tensor(input_pil_img).float()\n        input_tensor.div_(255.0)\n        input_tensor = input_tensor.unsqueeze(0)  # add dummy batch dimension\n        input_tuple = (input_tensor,)\n    elif hasattr(pytorch_model, \"conversion_inputs\"):\n        input_pil_img = None\n        input_tuple = pytorch_model.conversion_inputs()\n    else:\n        input_pil_img = None\n        input_tensor = create_rand_tensor(opts=opts, device=\"cpu\")\n        input_tuple = (input_tensor,)\n\n    if pytorch_model.training:\n        pytorch_model.eval()\n\n    # Prepare model to be exported (only if implemented)\n    if hasattr(pytorch_model, \"get_exportable_model\"):\n        logger.log(\"Preparing model for export.\")\n        pytorch_model = pytorch_model.get_exportable_model()\n\n    with torch.no_grad():\n        pytorch_out = pytorch_model(*input_tuple)\n\n        jit_model = torch.jit.trace(pytorch_model, input_tuple)\n        jit_out = jit_model(*input_tuple)\n        assertion_check(py_out=pytorch_out, jit_out=jit_out)\n\n        jit_model_optimized = optimize_for_mobile(jit_model)\n        jit_optimized_out = jit_model_optimized(*input_tuple)\n        assertion_check(py_out=pytorch_out, jit_out=jit_optimized_out)\n\n        if jit_model_only and torch.cuda.device_count() > 0:\n            # For inference on GPU\n            return {\"coreml\": None, \"jit\": jit_model, \"jit_optimized\": None}\n        elif jit_model_only and torch.cuda.device_count() == 0:\n            # For inference on CPU\n            return {\"coreml\": None, \"jit\": jit_model_optimized, \"jit_optimized\": None}\n\n        if hasattr(pytorch_model, \"ct_convert_inputs_outputs_types\"):\n            inputs, outputs = pytorch_model.ct_convert_inputs_outputs_types(input_tuple)\n        else:\n            inputs = [\n                ct.ImageType(\n                    name=\"input\", shape=input_tuple[0].shape, scale=1.0 / 255.0\n                )\n            ]\n            outputs = None\n\n        coreml_model = ct.convert(\n            model=jit_model,\n            inputs=inputs,\n            outputs=outputs,\n            convert_to=convert_to,\n            minimum_deployment_target=minimum_deployment_target,\n            compute_precision=compute_precision,\n        )\n\n        if input_pil_img is not None:\n            out = coreml_model.predict({\"input\": input_pil_img})\n\n        return {\n            \"coreml\": coreml_model,\n            \"jit\": jit_model,\n            \"jit_optimized\": jit_model_optimized,\n        }\n\n\ndef assertion_check(\n    py_out: Union[Tensor, Dict, Tuple], jit_out: Union[Tensor, Dict, Tuple]\n) -> None:\n    if isinstance(py_out, Dict):\n        assert isinstance(jit_out, Dict)\n        keys = py_out.keys()\n        for k in keys:\n            np.testing.assert_almost_equal(\n                py_out[k].cpu().numpy(),\n                jit_out[k].cpu().numpy(),\n                decimal=3,\n                verbose=True,\n            )\n    elif isinstance(py_out, Tensor):\n        assert isinstance(jit_out, Tensor)\n        np.testing.assert_almost_equal(\n            py_out.cpu().numpy(), jit_out.cpu().numpy(), decimal=3, verbose=True\n        )\n    elif isinstance(py_out, Tuple):\n        assert isinstance(jit_out, Tuple)\n        for x, y in zip(py_out, jit_out):\n            np.testing.assert_almost_equal(\n                x.cpu().numpy(), y.cpu().numpy(), decimal=3, verbose=True\n            )\n\n    else:\n        raise NotImplementedError(\n            \"Only Dictionary[Tensors] or Tuple[Tensors] or Tensors are supported as outputs\"\n        )\n"
  },
  {
    "path": "corenet/utils/registry.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nfrom functools import partial\nfrom typing import (\n    Callable,\n    Dict,\n    Iterable,\n    List,\n    Optional,\n    Sequence,\n    Tuple,\n    TypeVar,\n    Union,\n)\n\nfrom corenet.utils import logger\nfrom corenet.utils.import_utils import import_modules_from_folder\n\nRegistryItem = TypeVar(\"RegistryItem\", bound=Callable)\n\n\nclass Registry:\n    \"\"\"\n    A key/object registry class.\n    This class is used to do Dependency Injection in configs,\n    so when you write \"resnet\" in a config, it knows which module to load.\n    You can potentially provide a `base_class` to ensures that all items\n    in the registry are of type `base_class`.\n\n    Registry also allows for passing arguments to a registered item:\n    For example: \"top1\" -> \"top1(pred=logits)\"\n\n    Usage:\n    >>> my_registry = Registry(\"registry_name\")\n    >>> @my_registry.register(\"awesome_class_or_func\")\n    ... def my_awesome_class_or_func():\n    ...    pass\n    >>> assert \"awesome_class_or_func\" in my_registry\n\n    It allows for vanilla key/object definition as well as functional argument injection:\n    >>> reg = Registry(\"registry_name\")\n    >>> reg.register(\"awesome_dict\")(dict)\n    >>> reg[\"awesome_dict(name=hello, type=fifo)]()\n    {'name': 'hello', 'type': 'fifo'}\n    \"\"\"\n\n    def __init__(\n        self,\n        registry_name: str,\n        base_class: Optional[type] = None,\n        separator: Optional[str] = \":\",\n        lazy_load_dirs: Optional[List[str]] = None,\n        internal_dirs: Optional[Sequence[str]] = None,\n    ) -> None:\n        \"\"\"\n        Args:\n            registry_name: registry name, used for debugging and error messages\n            base_class: If provided, will ensure that all items inside the registry\n                are of type `base_class`.\n            separator: Separator between name and type in `register` function.\n            lazy_load_dirs: If provided, will load all directories under these\n                directories when inspecting for the modules of the registry.\n        \"\"\"\n        self.registry_name = registry_name\n        self.base_class = base_class\n        self.registry = {}\n        # For debugging purposes we want to throw a warning if someone accesses\n        # arguments before registering all items.\n        self.arguments_accessed = False\n        self.separator = separator\n        # Lazy loading to get rid of possible circular dependencies\n        self._modules_loaded = False\n        self._lazy_load_dirs = lazy_load_dirs\n        self.internal_dirs = internal_dirs\n        if self._lazy_load_dirs is None:\n            self._lazy_load_dirs = []\n\n    def _load_all(self) -> None:\n        \"\"\"\n        This function allows for lazily loading modules from pre-specified directories.\n        The main reason for its existence is to prevent circular imports.\n\n        This function should be called before any \"pull/get\" kind of action from\n        Registry to make sure it has loaded all registered models, which is pretty\n        much any operation except for \"register\".\n\n        If self._modules_loaded is not True, it will load all modules under\n        self._lazy_load_dirs.\n        \"\"\"\n        if not self._modules_loaded:\n            self._modules_loaded = True\n            for dir_name in sorted(self._lazy_load_dirs):\n                import_modules_from_folder(dir_name, extra_roots=self.internal_dirs)\n\n    def items(self) -> List[Tuple[str, RegistryItem]]:\n        self._load_all()\n        return self.registry.items()\n\n    def keys(self) -> List[str]:\n        self._load_all()\n        return self.registry.keys()\n\n    def __iter__(self) -> Iterable[str]:\n        self._load_all()\n        return iter(self.registry)\n\n    def __getitem__(self, key: Union[Tuple[str, str], str]) -> RegistryItem:\n        self._load_all()\n\n        type_ = None\n        if isinstance(key, Tuple) and len(key) == 2:\n            key, type_ = key\n\n        assert isinstance(\n            key, str\n        ), f\"Key should be an instance of string. Got {type(key)}\"\n        name, params = self.parse_key(key)\n        if type_:\n            name = f\"{type_}{self.separator}{name}\"\n\n        if name not in self.registry:\n            registry_keys = list(self.registry.keys())\n            temp_str = (\n                f\"\\n{name} not yet supported in {self.registry_name} registry.\"\n                f\"\\nSupported values are:\"\n            )\n            for i, supp_val in enumerate(registry_keys):\n                temp_str += f\"\\n\\t {i}: {supp_val}\"\n            logger.error(temp_str + \"\\n\")\n\n        reg_item = self.registry[name]\n\n        if params:\n            reg_item = partial(reg_item, **params)\n        return reg_item\n\n    def __contains__(self, key: str) -> bool:\n        self._load_all()\n        name, _ = self.parse_key(key)\n        return name in self.registry\n\n    def register(self, name: str, type: str = \"\") -> Callable:\n        if type:\n            name = \"{}{}{}\".format(type, self.separator, name)\n\n        if self.arguments_accessed:\n            logger.warning(\n                f\"Found item `{name}` being registered after all_item_arguments\"\n                f\" was called for `{self.registry_name}` registry.\"\n            )\n\n        def register_with_name(item: RegistryItem) -> RegistryItem:\n            if item is not self.registry.get(name, item):\n                raise ValueError(\n                    \"Cannot register duplicate {} ({})\".format(self.registry_name, name)\n                )\n            if self.base_class and not issubclass(item, self.base_class):\n                raise ValueError(\n                    \"{} class ({}: {}) must extend {}\".format(\n                        self.registry_name, name, item.__name__, self.base_class\n                    )\n                )\n\n            self.registry[name] = item\n            return item\n\n        return register_with_name\n\n    def all_arguments(self, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:\n        \"\"\"\n        Iterates through all items and fetches their arguments.\n\n        Note: make sure that all items are already registered before calling this method.\n        \"\"\"\n        self._load_all()\n        self.arguments_accessed = True\n\n        for _, item in self.items():\n            parser = item.add_arguments(parser)\n\n        return parser\n\n    def parse_key(self, key: str) -> Tuple[str, Dict[str, str]]:\n        \"\"\"\n        Parses `key` which can contain arguments in the form of:\n        <key_name>(arg1=value1, arg2=value2, ...)\n\n        Returns:\n            Tuple: (base_name: str, parameters: dict)\n        \"\"\"\n        name = key.split(\"(\")[0]\n\n        params = {}\n        if \"(\" in key:\n            params_str = key.split(\"(\")[1].split(\")\")[0]\n\n            try:\n                params = dict(\n                    [\n                        [x.strip() for x in arg.split(\"=\")]\n                        for arg in params_str.split(\",\")\n                    ]\n                )\n            except Exception as e:\n                logger.error(\n                    \"Could not correctly parse key parameters `{}` for registry {}.\"\n                    \" Please make sure to key parameters have the format:\"\n                    \" <key_name>(arg1=value1, arg2=value2, ...)\".format(\n                        key, self.registry_name\n                    )\n                )\n                raise e\n\n        return name, params\n"
  },
  {
    "path": "corenet/utils/registry_test.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom corenet.utils.registry import Registry\n\n\ndef test_functional_registry() -> None:\n    reg = Registry(\"registry_name\")\n    reg.register(\"awesome_dict\")(dict)\n\n    assert \"awesome_dict\" in reg\n    assert \"awesome_dict(name=hello)\" in reg\n\n    obj = reg[\"awesome_dict(name=hello, type=fifo)\"]()\n\n    assert obj == {\"name\": \"hello\", \"type\": \"fifo\"}\n\n\ndef test_basic_registration() -> None:\n    my_registry = Registry(\"registry_name\")\n\n    @my_registry.register(\"awesome_class_or_func\")\n    def my_awesome_class_or_func(param):\n        pass\n\n    assert \"awesome_class_or_func\" in my_registry\n    assert \"awesome_class_or_func(param=value)\" in my_registry\n"
  },
  {
    "path": "corenet/utils/resources.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\ntry:\n    from corenet.internal.utils.resources import cpu_count\nexcept ImportError:\n    from multiprocessing import cpu_count\n\n__all__ = [\"cpu_count\"]\n"
  },
  {
    "path": "corenet/utils/retry_utils.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport random\nimport time\nfrom typing import Any, Callable, Dict, List, Optional\n\nfrom corenet.utils import logger\n\n\ndef run_with_retries(\n    fn: Callable,\n    max_retries: int,\n    args: Optional[List] = None,\n    kwargs: Optional[Dict] = None,\n    function_name: Optional[str] = None,\n) -> Any:\n    \"\"\"Runs a function with retries (using exponential backoff method) on failure.\n\n    Args:\n        fn: Function to run.\n        max_retries: Maximum number of attempts before giving up.\n        args: Args to be passed to the @fn as *args. Defaults to None that translates\n            to empty args.\n        kwargs: Kwargs to be passed to the @fn as **kwargs. Defaults to None that\n            translates to empty kwargs.\n        function_name: A label for the task that @fn performs, to be used in warning\n            and error messages. Defaults to None that translates to \"run {fn.__name__}\".\n\n    Returns:\n        The value the @fn returns.\n    \"\"\"\n    if args is None:\n        args = []\n    if kwargs is None:\n        kwargs = {}\n    if function_name is None:\n        function_name = f\"run {fn.__name__}\"\n\n    for attempt in range(max_retries - 1):\n        try:\n            return fn(*args, **kwargs)\n        except Exception as e:\n            wait_duration = 2**attempt * random.uniform(0.5, 1.0)\n            logger.warning(\n                f\"Failed to {function_name} at attempt {attempt+1}/\"\n                f\"{max_retries} with error {e}; retrying in {wait_duration} seconds.\"\n            )\n            time.sleep(wait_duration)\n    try:\n        return fn(*args, **kwargs)\n    except Exception as e:\n        raise RuntimeError(\n            f\"Unable to {function_name} after {max_retries} attempts with error {e}.\"\n        ) from e\n"
  },
  {
    "path": "corenet/utils/tensor_utils.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom typing import Dict, List, Optional, Tuple, Union\n\nimport numpy as np\nimport torch\nfrom torch import Tensor\nfrom torch import distributed as dist\nfrom torch.distributed.nn import all_gather as all_gather_with_backward\n\nfrom corenet.constants import (\n    DEFAULT_IMAGE_CHANNELS,\n    DEFAULT_IMAGE_HEIGHT,\n    DEFAULT_IMAGE_WIDTH,\n    DEFAULT_VIDEO_FRAMES,\n)\n\n\ndef image_size_from_opts(opts) -> Tuple[int, int]:\n    try:\n        sampler_name = getattr(opts, \"sampler.name\", \"variable_batch_sampler\").lower()\n        if sampler_name.find(\"var\") > -1:\n            im_w = getattr(opts, \"sampler.vbs.crop_size_width\", DEFAULT_IMAGE_WIDTH)\n            im_h = getattr(opts, \"sampler.vbs.crop_size_height\", DEFAULT_IMAGE_HEIGHT)\n        elif sampler_name.find(\"multi\") > -1:\n            im_w = getattr(opts, \"sampler.msc.crop_size_width\", DEFAULT_IMAGE_WIDTH)\n            im_h = getattr(opts, \"sampler.msc.crop_size_height\", DEFAULT_IMAGE_HEIGHT)\n        else:\n            im_w = getattr(opts, \"sampler.bs.crop_size_width\", DEFAULT_IMAGE_WIDTH)\n            im_h = getattr(opts, \"sampler.bs.crop_size_height\", DEFAULT_IMAGE_HEIGHT)\n    except Exception as e:\n        im_h = DEFAULT_IMAGE_HEIGHT\n        im_w = DEFAULT_IMAGE_WIDTH\n    return im_h, im_w\n\n\ndef video_size_from_opts(opts) -> Tuple[int, int, int]:\n    try:\n        sampler_name = getattr(opts, \"sampler.name\", \"video_batch_sampler\").lower()\n        if sampler_name.find(\"var\") > -1:\n            im_w = getattr(opts, \"sampler.vbs.crop_size_width\", DEFAULT_IMAGE_WIDTH)\n            im_h = getattr(opts, \"sampler.vbs.crop_size_height\", DEFAULT_IMAGE_HEIGHT)\n            n_frames = getattr(\n                opts, \"sampler.vbs.num_frames_per_clip\", DEFAULT_IMAGE_HEIGHT\n            )\n        else:\n            im_w = getattr(opts, \"sampler.bs.crop_size_width\", DEFAULT_IMAGE_WIDTH)\n            im_h = getattr(opts, \"sampler.bs.crop_size_height\", DEFAULT_IMAGE_HEIGHT)\n            n_frames = getattr(\n                opts, \"sampler.bs.num_frames_per_clip\", DEFAULT_IMAGE_HEIGHT\n            )\n    except Exception as e:\n        im_h = DEFAULT_IMAGE_HEIGHT\n        im_w = DEFAULT_IMAGE_WIDTH\n        n_frames = DEFAULT_VIDEO_FRAMES\n    return im_h, im_w, n_frames\n\n\ndef create_rand_tensor(\n    opts, device: Optional[str] = \"cpu\", batch_size: Optional[int] = 1\n) -> Tensor:\n    sampler = getattr(opts, \"sampler.name\", \"batch_sampler\")\n    if sampler.lower().find(\"video\") > -1:\n        video_stack = getattr(opts, \"video_reader.frame_stack_format\", \"channel_first\")\n        im_h, im_w, n_frames = video_size_from_opts(opts=opts)\n        if video_stack == \"channel_first\":\n            inp_tensor = torch.randint(\n                low=0,\n                high=255,\n                size=(batch_size, DEFAULT_IMAGE_CHANNELS, n_frames, im_h, im_w),\n                device=device,\n            )\n        else:\n            inp_tensor = torch.randint(\n                low=0,\n                high=255,\n                size=(batch_size, n_frames, DEFAULT_IMAGE_CHANNELS, im_h, im_w),\n                device=device,\n            )\n    else:\n        im_h, im_w = image_size_from_opts(opts=opts)\n        inp_tensor = torch.randint(\n            low=0,\n            high=255,\n            size=(batch_size, DEFAULT_IMAGE_CHANNELS, im_h, im_w),\n            device=device,\n        )\n    inp_tensor = inp_tensor.float().div(255.0)\n    return inp_tensor\n\n\ndef reduce_tensor(inp_tensor: torch.Tensor) -> torch.Tensor:\n    size = dist.get_world_size() if dist.is_initialized() else 1\n    inp_tensor_clone = inp_tensor.clone().detach()\n    # dist_barrier()\n    dist.all_reduce(inp_tensor_clone, op=dist.ReduceOp.SUM)\n    inp_tensor_clone /= size\n    return inp_tensor_clone\n\n\ndef reduce_tensor_sum(inp_tensor: torch.Tensor) -> torch.Tensor:\n    inp_tensor_clone = inp_tensor.clone().detach()\n    # dist_barrier()\n    dist.all_reduce(inp_tensor_clone, op=dist.ReduceOp.SUM)\n    return inp_tensor_clone\n\n\ndef all_gather_list(data: Union[List, Tensor, Dict[str, Tensor]]):\n    world_size = dist.get_world_size()\n    data_list = [None] * world_size\n    # dist_barrier()\n    dist.all_gather_object(data_list, data)\n    return data_list\n\n\ndef gather_all_features(features: Tensor, dim=0):\n    return torch.cat(all_gather_with_backward(features), dim=dim)\n    # world_size = dist.get_world_size()\n    # gathered_data = [torch.zeros_like(features)] * world_size\n    # dist.all_gather(gathered_data, features)\n    # gathered_data = torch.cat(gathered_data, dim=dim)\n    # return gathered_data\n\n\ndef tensor_to_python_float(\n    inp_tensor: Union[int, float, torch.Tensor],\n    is_distributed: bool,\n    reduce_op: str = \"mean\",\n) -> Union[int, float, np.ndarray]:\n    \"\"\"\n    Given a number or a Tensor (potentially in distributed setting) returns the float value.\n    If is_distributed is true, the Tensor must be aggregated first.\n\n    Args:\n        inp_tensor: the input tensor\n        is_distributed: indicates whether we are in distributed mode\n        reduce_op: reduce operation for aggregation\n            If equals to mean, will reduce using mean, otherwise sum operation\n    \"\"\"\n    if is_distributed and isinstance(inp_tensor, torch.Tensor):\n        if reduce_op == \"mean\":\n            inp_tensor = reduce_tensor(inp_tensor=inp_tensor)\n        else:\n            inp_tensor = reduce_tensor_sum(inp_tensor=inp_tensor)\n\n    if isinstance(inp_tensor, torch.Tensor) and inp_tensor.numel() > 1:\n        # For IOU, we get a C-dimensional tensor (C - number of classes)\n        # so, we convert here to a numpy array\n        return inp_tensor.cpu().numpy()\n    elif hasattr(inp_tensor, \"item\"):\n        return inp_tensor.item()\n    elif isinstance(inp_tensor, (int, float)):\n        return inp_tensor * 1.0\n    else:\n        raise NotImplementedError(\n            \"The data type is not supported yet in tensor_to_python_float function\"\n        )\n\n\ndef to_numpy(img_tensor: torch.Tensor) -> np.ndarray:\n    # [0, 1] --> [0, 255]\n    img_tensor = torch.mul(img_tensor, 255.0)\n    # BCHW --> BHWC\n    img_tensor = img_tensor.permute(0, 2, 3, 1)\n\n    img_np = img_tensor.byte().cpu().numpy()\n    return img_np\n"
  },
  {
    "path": "corenet/utils/visualization_utils.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\nimport copy\nimport random\nimport sys\nfrom typing import List, Optional\n\nfrom torch import Tensor\n\ntry:\n    import cv2\n\n    FONT_SIZE = cv2.FONT_HERSHEY_PLAIN\nexcept ImportError:\n    FONT_SIZE = None\nimport numpy as np\nfrom matplotlib.colors import hsv_to_rgb\nfrom torch import Tensor\n\nfrom corenet.utils import logger\nfrom corenet.utils.color_map import Colormap\n\nLABEL_COLOR = [255, 255, 255]\nTEXT_THICKNESS = 1\nRECT_BORDER_THICKNESS = 2\n\n\ndef visualize_boxes_xyxy(image: np.ndarray, boxes: np.ndarray) -> np.ndarray:\n    \"\"\"Utility function to draw bounding boxes of objects on a given image\"\"\"\n    if \"cv2\" not in sys.modules:\n        logger.error(\n            \"OpenCV is an optional dependency. Please run pip install opencv-contrib-python==4.5.5.64.\"\n        )\n    boxes = boxes.astype(np.int)\n\n    new_image = copy.deepcopy(image)\n    for box_idx in range(boxes.shape[0]):\n        coords = boxes[box_idx]\n        r, g, b = 255, 0, 0\n        # top -left corner\n        start_coord = (coords[0], coords[1])\n        # bottom-right corner\n        end_coord = (coords[2], coords[3])\n        cv2.rectangle(new_image, end_coord, start_coord, (r, g, b), thickness=1)\n    return new_image\n\n\ndef create_colored_mask(\n    mask: np.ndarray, num_classes: int, *args, **kwargs\n) -> np.ndarray:\n    \"\"\"Create a colored mask with random colors\"\"\"\n    colored_mask = np.ones((mask.shape[0], mask.shape[1], 3), dtype=np.uint8)\n    # 0 for background.\n    random_hue = random.randint(1, num_classes)\n\n    random_mask_color = hsv_to_rgb((random_hue / num_classes, 0.75, 0.75))\n    colored_mask[..., :] = [int(c * 255.0) for c in random_mask_color]\n    colored_mask *= mask[..., None]\n    return colored_mask\n\n\ndef draw_bounding_boxes(\n    image: np.ndarray,\n    boxes: np.ndarray,\n    labels: np.ndarray,\n    scores: np.ndarray,\n    masks: Optional[np.ndarray] = None,\n    color_map: Optional = None,\n    object_names: Optional[List] = None,\n    is_bgr_format: Optional[bool] = False,\n    save_path: Optional[str] = None,\n    num_classes: Optional[int] = 81,\n) -> None:\n    \"\"\"Utility function to draw bounding boxes of objects along with their labels and score on a given image\"\"\"\n    if \"cv2\" not in sys.modules:\n        logger.error(\n            \"OpenCV is an optional dependency. Please run pip install opencv-contrib-python==4.5.5.64.\"\n        )\n\n    boxes = boxes.astype(int)\n\n    if is_bgr_format:\n        # convert from BGR to RGB colorspace\n        image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)\n\n    if color_map is None:\n        color_map = Colormap().get_box_color_codes()\n\n    if masks is None:\n        masks = [None] * len(boxes)\n\n    for label, score, coords, mask in zip(labels, scores, boxes, masks):\n        r, g, b = color_map[label]\n        c1 = (coords[0], coords[1])\n        c2 = (coords[2], coords[3])\n\n        if mask is not None:\n            mask = create_colored_mask(mask=mask, num_classes=num_classes)\n            image = cv2.addWeighted(image, 1.0, mask, 1.0, gamma=0.0)\n\n        cv2.rectangle(image, c1, c2, (r, g, b), thickness=RECT_BORDER_THICKNESS)\n        if object_names is not None:\n            label_text = \"{label}: {score:.2f}\".format(\n                label=object_names[label], score=score\n            )\n            t_size = cv2.getTextSize(label_text, FONT_SIZE, 1, TEXT_THICKNESS)[0]\n            new_c2 = c1[0] + t_size[0] + 3, c1[1] + t_size[1] + 4\n\n            cv2.rectangle(image, c1, new_c2, (r, g, b), -1)\n            cv2.putText(\n                image,\n                label_text,\n                (c1[0], c1[1] + t_size[1] + 4),\n                FONT_SIZE,\n                1,\n                LABEL_COLOR,\n                TEXT_THICKNESS,\n            )\n\n    if save_path is not None:\n        cv2.imwrite(save_path, image)\n        logger.log(\"Detection results stored at: {}\".format(save_path))\n    return image\n\n\ndef convert_to_cityscape_format(img: Tensor) -> Tensor:\n    \"\"\"Utility to map predicted segmentation labels to cityscapes format\"\"\"\n    img[img == 19] = 255\n    img[img == 18] = 33\n    img[img == 17] = 32\n    img[img == 16] = 31\n    img[img == 15] = 28\n    img[img == 14] = 27\n    img[img == 13] = 26\n    img[img == 12] = 25\n    img[img == 11] = 24\n    img[img == 10] = 23\n    img[img == 9] = 22\n    img[img == 8] = 21\n    img[img == 7] = 20\n    img[img == 6] = 19\n    img[img == 5] = 17\n    img[img == 4] = 13\n    img[img == 3] = 12\n    img[img == 2] = 11\n    img[img == 1] = 8\n    img[img == 0] = 7\n    img[img == 255] = 0\n    return img\n"
  },
  {
    "path": "mlx_examples/clip/README.md",
    "content": "# MLX port of CLIP\n\nThis is an example to convert CoreNet's CLIP model implementation to\n[MLX](https://github.com/ml-explore/mlx)'s CLIP example with some customized modification. MLX is a machine learning framework that provides native Apple Silicon hardware support.\n\n## Conversion\n\nTo convert an example CoreNet's CLIP model to the example MLX CLIP using the files in this directory:\n\n```bash\ncd mlx_examples/clip/\n\n# Install required dependencies\n# We assume that the main requirements.txt is already installed.\npip install -r requirements.txt\n\n# Convert the model\npython main_clip_to_mlx.py \\\n    --common.config-file \"../../projects/range_augment/clip/clip_vit_base.yaml\" \\\n    --model.multi-modal-image-text.pretrained https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/clip/clip_vit_base_16.pt \\\n    --common.results-loc results/mlx_model/\n\n# Try example inference\npython clip.py\n```\n\n## Benchmarking results\n\nComparing to PyTorch, given the input as `[\"a photo of cat\", \"a photo of dog\"]` prompt\nand the `assets/{cat,dog}.jpeg` images. The results are the following on a M2 Ultra:\n\n\n| Model | PyTorch time 100iters (s) | MLX time 100iters (s) | Speedup (%) |\n| :-----| :----------------------------- | :------------------------- | :---------- |\n| FP16 Base variant  | 2.7322 | 1.0743 | 60.68% |\n| FP16 Huge variant  | 4.9098 | 4.3189 | 12.04% |\n"
  },
  {
    "path": "mlx_examples/clip/__init__.py",
    "content": ""
  },
  {
    "path": "mlx_examples/clip/clip.py",
    "content": "# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\n# Taken from https://github.com/ml-explore/mlx-examples/blob/main/clip/image_processor.py\n# with modifications about imports and default model loading location.\n\nimport os\nfrom typing import Tuple\n\nimport mlx.core as mx\nfrom image_processor import CLIPImageProcessor\nfrom model import CLIPModel\nfrom PIL import Image\nfrom tokenizer import CLIPTokenizer\n\n\ndef load(model_dir: str) -> Tuple[CLIPModel, CLIPTokenizer, CLIPImageProcessor]:\n    model = CLIPModel.from_pretrained(model_dir)\n    tokenizer = CLIPTokenizer.from_pretrained(model_dir)\n    img_processor = CLIPImageProcessor.from_pretrained(model_dir)\n    return model, tokenizer, img_processor\n\n\ndef main() -> None:\n    example_class_names = [\"cat\", \"dog\"]\n\n    model, tokenizer, img_processor = load(\"results/mlx_model\")\n    assert os.getcwd().endswith(\n        \"mlx_examples/clip\"\n    ), \"Please run this script from 'mlx_examples/clip' folder.\"\n    inputs = {\n        \"input_ids\": tokenizer(\n            [f\"a photo of a {class_name}\" for class_name in example_class_names]\n        ),\n        \"pixel_values\": img_processor(\n            [\n                Image.open(f\"../../assets/{class_name}.jpeg\")\n                for class_name in example_class_names\n            ]\n        ),\n    }\n    output = model(**inputs)\n\n    # Get text and image embeddings:\n    text_embeds = output.text_embeds\n    image_embeds = output.image_embeds\n    logits = image_embeds @ text_embeds.T\n    logits = mx.softmax(logits, axis=-1)\n    predicted_class_prob = mx.max(logits, axis=-1).tolist()\n    predicted_class_id = mx.argmax(logits, axis=-1).tolist()\n\n    for batch_id in range(len(predicted_class_prob)):\n        print(\n            f\"Predicted class for sample {batch_id} is\"\n            f\" {example_class_names[predicted_class_id[batch_id]]} \"\n            f\"p=({predicted_class_prob[batch_id]:.3f})\"\n        )\n\n\nif __name__ == \"__main__\":\n    main()\n"
  },
  {
    "path": "mlx_examples/clip/image_processor.py",
    "content": "# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\n# Taken from https://github.com/ml-explore/mlx-examples/blob/main/clip/image_processor.py\n# with modifications about doc-string and typing.\n\nimport json\nfrom pathlib import Path\nfrom typing import List, Tuple\n\nimport mlx.core as mx\nimport numpy as np\nfrom PIL.Image import Image\n\n\nclass CLIPImageProcessor:\n    \"\"\"Constructs an image processor that converts a PIL image into MX array.\n\n    A simple port of\n    https://github.com/huggingface/transformers/blob/main/src/transformers/models/clip/image_processing_clip.py.\n    \"\"\"\n\n    def __init__(\n        self,\n        crop_size: int = 224,\n        do_center_crop: bool = True,\n        do_normalize: bool = True,\n        do_resize: bool = True,\n        image_mean: List[float] = [0.48145466, 0.4578275, 0.40821073],\n        image_std: List[float] = [0.26862954, 0.26130258, 0.27577711],\n        size: int = 224,\n        **kwargs\n    ) -> None:\n        self.crop_size = crop_size\n        self.do_center_crop = do_center_crop\n        self.do_normalize = do_normalize\n        self.do_resize = do_resize\n        self.image_mean = mx.array(image_mean)\n        self.image_std = mx.array(image_std)\n        self.size = size\n\n    def __call__(self, images: List[Image]) -> mx.array:\n        return mx.concatenate(\n            [self._preprocess(image)[None] for image in images], axis=0\n        )\n\n    def _preprocess(self, image: Image) -> mx.array:\n        if self.do_resize:\n            image = resize(image, self.size)\n        if self.do_center_crop:\n            image = center_crop(image, (self.crop_size, self.crop_size))\n        image = mx.array(np.array(image))\n        image = rescale(image)\n        if self.do_normalize:\n            image = normalize(image, self.image_mean, self.image_std)\n        return image\n\n    @staticmethod\n    def from_pretrained(path: str) -> \"CLIPImageProcessor\":\n        path = Path(path)\n        with open(path / \"preprocessor_config.json\", encoding=\"utf-8\") as f:\n            config = json.load(f)\n        return CLIPImageProcessor(**config)\n\n\ndef resize(image: Image, short_size: int) -> Image:\n    \"\"\"\n    Resize image to short_size.\n    \"\"\"\n    width, height = image.size\n    short = min(width, height)\n    long = max(width, height)\n    if short == short_size:\n        return image\n    new_short = short_size\n    new_long = int(short_size * long / short)\n    new_size = (new_short, new_long) if width <= height else (new_long, new_short)\n    return image.resize(new_size)\n\n\ndef center_crop(image: Image, size: Tuple[int, int]) -> Image:\n    \"\"\"\n    Perform a crop of a image in the center of given size.\n    \"\"\"\n    if size[0] % 2 != 0 or size[1] % 2 != 0:\n        raise ValueError(\"Only even crop sizes supported.\")\n    original_width, original_height = image.size\n    crop_height, crop_width = size\n    top = (original_height - crop_height) // 2\n    bottom = top + crop_height\n    left = (original_width - crop_width) // 2\n    right = left + crop_width\n    return image.crop((left, top, right, bottom))\n\n\ndef rescale(image: mx.array) -> mx.array:\n    \"\"\"Rescale an image to 0.0-1.0 region\"\"\"\n    return image.astype(mx.float32) * (1 / 255.0)\n\n\ndef normalize(image: mx.array, mean: mx.array, std: mx.array) -> mx.array:\n    \"\"\"Normalize an image with given mean and standard deviation\"\"\"\n    return (image - mean) / std\n"
  },
  {
    "path": "mlx_examples/clip/main_clip_to_mlx.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport json\nimport platform\nimport shutil\nfrom pathlib import Path\nfrom typing import Any, Dict, List, Union\n\ntry:\n    import mlx.core as mx\n    from huggingface_hub import snapshot_download\nexcept ModuleNotFoundError:\n    pass\n\nimport numpy as np\nimport torch\n\nfrom corenet.constants import TMP_RES_FOLDER\nfrom corenet.modeling import get_model\nfrom corenet.modeling.models.classification.config.vit import get_configuration\nfrom corenet.options.opts import get_training_arguments\nfrom corenet.utils import logger\nfrom corenet.utils.import_utils import ensure_library_is_available\n\n\ndef is_apple_silicon_macos() -> bool:\n    return platform.machine() == \"arm64\" and platform.system() == \"Darwin\"\n\n\ndef mlx_naming_remap(corenet_k: str) -> str:\n    \"\"\"Translate CoreNet's CLIP weight mapping to MLX's naming scheme.\n\n    Args: a single string represents the name of the parameter from CoreNet's\n        state dict.\n    Returns:\n        a remapped string that will be honored by the MLX CLIP example.\n    \"\"\"\n    trivial_mapping = {\n        \"text_encoder\": \"text_model\",\n        \"image_encoder\": \"vision_model\",\n        \"transformer\": \"encoder.layers\",\n        \"positional_embedding.pos_embed.pos_embed\": \"embeddings.position_embedding.weight\",\n        \"embedding_layer.weight\": \"embeddings.token_embedding.weight\",\n        \"pre_norm_ffn.0\": \"layer_norm2\",\n        # NOTE: pre_norm_ffn.{2, 3} are act layer that do not have weights, and dropout layer,\n        # it will not be part of the state dict.\n        \"pre_norm_ffn.1\": \"mlp.fc1\",\n        \"pre_norm_ffn.4\": \"mlp.fc2\",\n        \"pre_norm_mha.0\": \"layer_norm1\",\n        \"pre_norm_mha.1.out_proj\": \"self_attn.out_proj\",\n        \"pre_norm_mha.1\": \"self_attn\",\n        \"cls_token\": \"embeddings.class_embedding\",\n        \"post_encoder.layers_norm\": \"post_layernorm\",\n        \"pos_embed.pos_embed.pos_embed\": \"embeddings.position_embedding.weight\",\n        \"patch_emb.0.block.conv.weight\": \"embeddings.patch_embedding.layers.0.weight\",\n        \"patch_emb.0.block.norm.bias\": \"embeddings.patch_embedding.layers.1.bias\",\n        \"patch_emb.0.block.norm.running_mean\": \"embeddings.patch_embedding.layers.1.running_mean\",\n        \"patch_emb.0.block.norm.running_var\": \"embeddings.patch_embedding.layers.1.running_var\",\n        \"patch_emb.0.block.norm.weight\": \"embeddings.patch_embedding.layers.1.weight\",\n        \"patch_emb.1.block.conv.weight\": \"embeddings.patch_embedding.layers.3.weight\",\n        \"patch_emb.1.block.norm.bias\": \"embeddings.patch_embedding.layers.4.bias\",\n        \"patch_emb.1.block.norm.running_mean\": \"embeddings.patch_embedding.layers.4.running_mean\",\n        \"patch_emb.1.block.norm.running_var\": \"embeddings.patch_embedding.layers.4.running_var\",\n        \"patch_emb.1.block.norm.weight\": \"embeddings.patch_embedding.layers.4.weight\",\n        \"patch_emb.2.block.conv.weight\": \"embeddings.patch_embedding.layers.6.weight\",\n        \"patch_emb.2.block.conv.bias\": \"embeddings.patch_embedding.layers.6.bias\",\n    }\n    for k, v in trivial_mapping.items():\n        if k in corenet_k:\n            corenet_k = corenet_k.replace(k, v)\n\n    # Depended on the trivial mapping to be done.\n    non_trivial_mapping = {\n        \"text_model.projection_layer\": \"text_projection.weight\",\n        \"vision_model.classifier.proj\": \"visual_projection.weight\",\n    }\n    for k, v in non_trivial_mapping.items():\n        if k in corenet_k:\n            corenet_k = corenet_k.replace(k, v)\n\n    return corenet_k\n\n\ndef make_shards(\n    weights: Dict[str, Any], *, max_file_size_gb: int\n) -> List[Dict[str, Any]]:\n    \"\"\"Split weights into separate shards given @max_file_size_gb limits for each shard.\n    Each shard contains a mapping between the tensor name and its weights.\n    \"\"\"\n    max_file_size_bytes = max_file_size_gb << 30\n    shards = []\n    shard, shard_size = {}, 0\n    for k, v in weights.items():\n        if shard_size + v.nbytes > max_file_size_bytes:\n            shards.append(shard)\n            shard, shard_size = {}, 0\n        shard[k] = v\n        shard_size += v.nbytes\n    shards.append(shard)\n    return shards\n\n\ndef save_weights(save_path: Union[str, Path], weights: Dict[str, Any]) -> None:\n    \"\"\"Save model weights into specified directory with MLX's safetensors format.\n\n    Provide the given @weights, it will save it in MLX's safetensors format to @save_path.\n    Shards will be created in 5GB chunk.\n    \"\"\"\n    if isinstance(save_path, str):\n        save_path = Path(save_path)\n    save_path.mkdir(parents=True, exist_ok=True)\n\n    shards = make_shards(weights, max_file_size_gb=5)\n    shards_count = len(shards)\n    shard_file_format = (\n        \"model-{:05d}-of-{:05d}.safetensors\"\n        if shards_count > 1\n        else \"model.safetensors\"\n    )\n\n    total_byte_size = sum(v.nbytes for v in weights.values())\n    # A json string that will encode the tensor info.\n    index_data = {\n        \"metadata\": {\"total_size\": total_byte_size},  # Provide the total size\n        # Provide the mapping between weight tensor's name and the shard it\n        # was put to.\n        \"weight_map\": {},\n    }\n\n    # Partition weights into shard\n    for i, shard in enumerate(shards):\n        shard_name = shard_file_format.format(i + 1, shards_count)\n        shard_path = save_path / shard_name\n\n        # Save the tensor\n        mx.save_safetensors(str(shard_path), shard)\n\n        for weight_name in shard.keys():\n            index_data[\"weight_map\"][weight_name] = shard_name\n\n    # Sort\n    index_data[\"weight_map\"] = {\n        k: index_data[\"weight_map\"][k] for k in sorted(index_data[\"weight_map\"])\n    }\n\n    # Save the index.\n    with open(save_path / \"model.safetensors.index.json\", \"w\") as f:\n        json.dump(\n            index_data,\n            f,\n            indent=4,\n        )\n\n\ndef get_hf_clip_model_path() -> Path:\n    \"\"\"Get the configuration files and vocab using OpenAI's clip model, since\n    MLX digests the model configurations and vocab through those files.\n\n    We will need to modify the preprocessing and config, so it matches the definition\n    of CoreNet's CLIP base's/huge's implementation.\n    \"\"\"\n    HF_REPO = \"openai/clip-vit-base-patch32\"\n    model_path = Path(\n        snapshot_download(\n            repo_id=HF_REPO,\n            allow_patterns=[\n                \"*.json\",\n                \"*.txt\",\n            ],\n        )\n    )\n    return model_path\n\n\ndef ascontiguousarray(mx_array: mx.array) -> mx.array:\n    \"\"\"Convert a mx array to a contiguous mx array\"\"\"\n    # save_safetensors requires row_contiguous array (mlx==0.8.1), while mlx does\n    # not provide the API to do that, which we could only convert to numpy and and\n    # copy back to mlx to achieve this.\n    # This is expensive, but currently there are no way around it.\n    # TODO(Frank): revisit to see if newer version of mlx will have\n    # `ascontiguousarray` exposed.\n    np_arr = np.ascontiguousarray(np.array(mx_array))\n    return mx.array(np_arr, dtype=mx_array.dtype)\n\n\ndef sanitize(state_dict: Dict[str, mx.array]) -> Dict[str, mx.array]:\n    \"\"\"Perform some cleaning and transformations so MLX could load the sanitized\n    weights faithfully under `strict=True` mode.\n    \"\"\"\n    new_state_dict = {}\n    for k, v in state_dict.items():\n        if k in [\n            \"text_model.embeddings.position_embedding.weight\",\n            \"vision_model.embeddings.position_embedding.weight\",\n            \"vision_model.embeddings.class_embedding\",\n        ]:\n            new_state_dict[k] = ascontiguousarray(v.squeeze(0).squeeze(0))\n        elif k in [\"visual_projection.weight\", \"text_projection.weight\"]:\n            # NOTE: There are more weights require transposition, but they will be\n            # handled within MLX's `sanitize` function, similar to how OpenAI's\n            # code was ported:\n            # https://github.com/ml-explore/mlx-examples/blob/main/clip/model.py#L412\n            new_state_dict[k] = ascontiguousarray(v.T)\n        elif \"qkv_proj\" in k:\n            q_proj_name = k.replace(\"qkv_proj\", \"q_proj\")\n            k_proj_name = k.replace(\"qkv_proj\", \"k_proj\")\n            v_proj_name = k.replace(\"qkv_proj\", \"v_proj\")\n\n            dim_size = v.shape[0] // 3\n            if v.ndim == 1:  # Bias\n                new_state_dict[q_proj_name] = ascontiguousarray(v[0:dim_size])\n                new_state_dict[k_proj_name] = ascontiguousarray(\n                    v[dim_size : 2 * dim_size]\n                )\n                new_state_dict[v_proj_name] = ascontiguousarray(v[2 * dim_size :])\n            else:  # Weights\n                new_state_dict[q_proj_name] = ascontiguousarray(v[0:dim_size, :])\n                new_state_dict[k_proj_name] = ascontiguousarray(\n                    v[dim_size : 2 * dim_size, :]\n                )\n                new_state_dict[v_proj_name] = ascontiguousarray(v[2 * dim_size :, :])\n        elif \"num_batches_tracked\" in k or \"neural_augmentor\" in k:\n            # parameters we don't need for the conversion\n            continue\n        else:\n            new_state_dict[k] = v\n    return new_state_dict\n\n\ndef torch_to_mx(a: torch.Tensor, *, dtype: str) -> mx.array:\n    \"\"\"Convert torch tensor to MLX tensor\"\"\"\n    # bfloat16 is not numpy convertible. Upcast to float32 to avoid precision loss\n    a = a.to(torch.float32) if dtype == \"bfloat16\" else a.to(getattr(torch, dtype))\n    return mx.array(a.numpy(), getattr(mx, dtype))\n\n\ndef main() -> None:\n    if not is_apple_silicon_macos():\n        raise ValueError(\n            \"Expected to install MLX dependencies while on non-Apple Silicon MacOS. \"\n            \"MLX is only available on Apple Silicon MacOS\"\n        )\n    ensure_library_is_available(\"mlx\")\n    ensure_library_is_available(\"huggingface_hub\")\n\n    opts = get_training_arguments()\n\n    pretrained_ckpt_loc = getattr(opts, \"model.multi_modal_image_text.pretrained\")\n    config_file = getattr(opts, \"common.config_file\")\n    logger.info(f\"Loading config: {config_file} with ckpt: {pretrained_ckpt_loc}\")\n\n    model = get_model(opts)\n\n    results_folder = getattr(opts, \"common.results_loc\")\n    results_path = Path(results_folder)\n    if results_path.is_file():\n        raise ValueError(\n            f\"Result location specified is a regular file: {results_folder}\"\n        )\n    results_path.mkdir(parents=True, exist_ok=True)\n\n    logger.info(f\"Save converted model to path: {results_folder}\")\n    logger.info(\"Converting\")\n\n    state_dict = model.state_dict()\n    mlx_weights = {\n        mlx_naming_remap(k): torch_to_mx(v, dtype=\"float32\")\n        for k, v in state_dict.items()\n    }\n    mlx_weights = sanitize(mlx_weights)\n\n    logger.info(\"Saving weights\")\n    save_weights(results_path, mlx_weights)\n\n    logger.info(\"Saving configs\")\n    hf_path = get_hf_clip_model_path()\n    # Direct copy\n    for fn in [\"merges.txt\", \"vocab.json\"]:\n        shutil.copyfile(\n            str(hf_path / f\"{fn}\"),\n            str(results_path / f\"{fn}\"),\n        )\n\n    # Save the configuration about the input preprocessing.\n    with open(str(hf_path / \"preprocessor_config.json\"), \"r\") as f:\n        preprocessor_config = json.load(f)\n        # 1. Set `do_normalize` to `false`.\n        preprocessor_config[\"do_normalize\"] = False\n        # 2. Add entry `\"use_clip_corenet_variant\": true`\n        preprocessor_config[\"use_clip_corenet_variant\"] = True\n    with open(str(results_path / \"preprocessor_config.json\"), \"w\") as f:\n        json.dump(preprocessor_config, f, indent=2)\n\n    vit_config = get_configuration(opts)\n    text_n_header_per_layer = getattr(opts, \"model.text.transformer.n_heads_per_layer\")\n    text_model_dim = getattr(opts, \"model.text.transformer.model_dim\")\n\n    # Convert our yaml file to HF style config for model architecture.\n    with open(str(hf_path / \"config.json\"), \"r\") as f:\n        config = json.load(f)\n        # 1. `\"model_type\": \"clip_corenet\",`  (originally configured as `\"clip\"`)\n        config[\"model_type\"] = \"clip_corenet\"\n        # 2. `\"hidden_act\": \"gelu\",` (originally configured as `\"quick_gelu\"`)\n        config[\"text_config\"][\"hidden_act\"] = \"gelu\"\n        config[\"vision_config\"][\"hidden_act\"] = \"gelu\"\n        # 3. `\"layer_norm_eps\": 1e-06,` (originally configured as `1e-05`)\n        config[\"text_config\"][\"layer_norm_eps\"] = 1e-06\n        config[\"vision_config\"][\"layer_norm_eps\"] = 1e-06\n        # 4. `\"patch_size\": 16,` (originally configured as `32`)\n        config[\"vision_config\"][\"patch_size\"] = 16\n        # 5. `\"num_attention_heads\": 8/16` for `\"text_config\"` depending on base/huge model\n        config[\"text_config\"][\"num_attention_heads\"] = text_n_header_per_layer\n        # 6. Configure the text's dimension since base/huge variant has different cfg\n        config[\"text_config\"][\"hidden_size\"] = text_model_dim\n        config[\"text_config\"][\"intermediate_size\"] = text_model_dim * 4\n        # 7. Configure the vision's parameters since base/huge variant has different cfg\n        config[\"vision_config\"][\"hidden_size\"] = vit_config[\"embed_dim\"]\n        config[\"vision_config\"][\"num_attention_heads\"] = vit_config[\"n_attn_heads\"]\n        config[\"vision_config\"][\"intermediate_size\"] = vit_config[\"ffn_dim\"]\n        config[\"vision_config\"][\"num_hidden_layers\"] = vit_config[\n            \"n_transformer_layers\"\n        ]\n    with open(str(results_path / \"config.json\"), \"w\") as f:\n        json.dump(config, f, indent=2)\n\n    logger.info(\"Done\")\n\n\nif __name__ == \"__main__\":\n    main()\n"
  },
  {
    "path": "mlx_examples/clip/main_test_clip_mlx.py",
    "content": "# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\n\"\"\"\nTest that MLX output match with CoreNet's output.\n\nThe test requires a conversion using `main_clip_to_mlx.py` script to\ndump the converted model to `results/mlx_model/` directory\n\nExample invocation:\n\npython main_test_clip_mlx.py \\\n    --common.config-file \"../../projects/range_augment/clip/clip_vit_base.yaml\" \\\n    --model.multi-modal-image-text.pretrained https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/clip/clip_vit_base_16.pt\n\"\"\"\n\nimport argparse\nfrom os import path\nfrom typing import Dict, List, Tuple\n\ntry:\n    import mlx.core as mx\nexcept ModuleNotFoundError:\n    pass\nimport numpy as np\nimport torch\n\n# Clip specific\nfrom model import CLIPModel, CLIPModelOutput\nfrom PIL import Image\nfrom torchvision.transforms import CenterCrop, Compose, Resize, ToTensor\n\n# CoreNet specific\nfrom corenet.data.text_tokenizer import build_tokenizer\nfrom corenet.modeling.models import get_model\nfrom corenet.modeling.models.base_model import BaseAnyNNModel\nfrom corenet.options.opts import get_training_arguments\nfrom corenet.utils import logger\nfrom corenet.utils.import_utils import ensure_library_is_available\n\n\ndef load_mlx_model(model_dir: str) -> CLIPModel:\n    \"\"\"Load the MLX model from @model_dir\"\"\"\n    if not path.exists(model_dir):\n        raise ValueError(f\"Model does not exist at: {model_dir}\")\n    model = CLIPModel.from_pretrained(model_dir)\n    return model\n\n\ndef get_mlx_output(\n    tokenized_input_ids: mx.array, pixel_values: mx.array\n) -> CLIPModelOutput:\n    \"\"\"Load the MLX model and get the forward output given the inputs\"\"\"\n    model = load_mlx_model(\"results/mlx_model\")\n    model.eval()\n\n    inputs = {\n        \"input_ids\": tokenized_input_ids,\n        \"pixel_values\": pixel_values,\n    }\n    return model(**inputs)\n\n\ndef transform_image(img: Image.Image, size: int = 224) -> torch.Tensor:\n    \"\"\"Convert the PIL image to Tensor with pre-processing.\"\"\"\n\n    input_image_transform = Compose(\n        [Resize(size=size), CenterCrop(size=size), ToTensor()]\n    )\n    input_img_tensor = input_image_transform(img)\n    return input_img_tensor\n\n\ndef text_transform(tokeized_text_tensor: torch.Tensor) -> torch.Tensor:\n    \"\"\"Transform the text.\n\n    No need to transform the text given the example.\n    \"\"\"\n    return tokeized_text_tensor\n\n\ndef get_tokenized_input(\n    opts: argparse.Namespace, class_names: List[str]\n) -> torch.Tensor:\n    \"\"\"Build the tokenizer and get the tokenized input.\"\"\"\n    text_tokenizer = build_tokenizer(opts)\n\n    input_text_templates = [\n        \"a photo of a {}\".format(class_name) for class_name in class_names\n    ]\n    input_tokenized_templates = [\n        text_transform(text_tokenizer(inp_template))\n        for inp_template in input_text_templates\n    ]\n    input_tokenized_templates = torch.stack(input_tokenized_templates, dim=0)\n    return input_tokenized_templates\n\n\ndef get_preprocessed_img(class_names: List[str]) -> torch.Tensor:\n    \"\"\"Build the image process pipeline and get preprocessed image.\"\"\"\n    input_img_batch = []\n    for class_name in class_names:\n        input_img = Image.open(f\"assets/{class_name}.jpeg\").convert(\"RGB\")\n        input_img_tensor = transform_image(input_img)\n        input_img_batch.append(input_img_tensor)\n    # stack input images to form a batch\n    input_img_batch = torch.stack(input_img_batch, dim=0)\n    return input_img_batch\n\n\ndef get_input_images_and_tokenized_text(\n    opts: argparse.Namespace, class_names: List[str]\n) -> Tuple[torch.Tensor, torch.Tensor]:\n    \"\"\"Get the example pre-processed/tokenized text/images\"\"\"\n    torch_images = get_preprocessed_img(class_names)\n    torch_tokens = get_tokenized_input(opts, class_names)\n    return torch_tokens, torch_images\n\n\ndef get_torch_output(\n    opts: argparse.Namespace,\n    torch_tokens: torch.Tensor,\n    torch_images: torch.Tensor,\n) -> Dict[str, torch.Tensor]:\n    \"\"\"Perform the forward function and get the result given tokens and images\"\"\"\n    mps_device = torch.device(\"mps\")\n\n    logger.disable_printing()\n    clip_model = get_model(opts)\n    clip_model.to(torch.float32).to(mps_device)\n    clip_model.eval()\n    logger.enable_printing()\n\n    return clip_model.forward(\n        input={\n            \"text\": torch_tokens.to(mps_device),\n            \"image\": torch_images.to(mps_device),\n        }\n    )\n\n\ndef torch_to_mx(a: torch.Tensor, *, dtype: str) -> mx.array:\n    \"\"\"Convert torch tensor to MLX tensor\"\"\"\n    # bfloat16 is not numpy convertible. Upcast to float32 to avoid precision loss\n    a = a.to(torch.float32) if dtype == \"bfloat16\" else a.to(getattr(torch, dtype))\n    return mx.array(a.numpy(), getattr(mx, dtype))\n\n\ndef main_test() -> None:\n    ensure_library_is_available(\"mlx\")\n\n    class_names = [\"cat\", \"dog\"]\n    opts = get_training_arguments()\n\n    torch_tokens, torch_images = get_input_images_and_tokenized_text(opts, class_names)\n    torch_output = get_torch_output(opts, torch_tokens, torch_images)\n    mlx_output = get_mlx_output(\n        tokenized_input_ids=torch_to_mx(torch_tokens, dtype=\"int32\"),\n        pixel_values=torch_to_mx(torch_images, dtype=\"float32\").transpose((0, 2, 3, 1)),\n    )\n\n    assert np.all(\n        np.argmax(mlx_output.text_embeds, axis=1)\n        == torch.argmax(torch_output[\"text\"], axis=1).cpu().numpy()\n    )\n    assert np.all(\n        np.argmax(mlx_output.image_embeds, axis=1)\n        == torch.argmax(torch_output[\"image\"], axis=1).cpu().numpy()\n    )\n    logger.info(\"Results matched.\")\n\n\nif __name__ == \"__main__\":\n    main_test()\n"
  },
  {
    "path": "mlx_examples/clip/model.py",
    "content": "# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\n# Taken from https://github.com/ml-explore/mlx-examples/blob/main/clip/model.py\n# with modifications.\n\nimport glob\nimport json\nimport logging\nimport math\nimport re\nfrom dataclasses import dataclass\nfrom pathlib import Path\nfrom typing import Callable, Dict, Optional, Union\n\nimport mlx.core as mx\nimport mlx.nn as nn\nfrom mlx.core import linalg as LA\nfrom mlx.nn.losses import cross_entropy\n\n\n@dataclass\nclass CLIPVisionOutput:\n    pooler_output: mx.array\n    last_hidden_state: mx.array\n    hidden_states: Optional[mx.array]\n\n\n@dataclass\nclass CLIPTextOutput:\n    pooler_output: mx.array\n    last_hidden_state: mx.array\n\n\n@dataclass\nclass CLIPModelOutput:\n    loss: Optional[mx.array]\n    text_embeds: Optional[mx.array]\n    image_embeds: Optional[mx.array]\n    text_model_output: CLIPTextOutput\n    vision_model_output: CLIPVisionOutput\n\n\n@dataclass\nclass CLIPTextConfig:\n    num_hidden_layers: int\n    hidden_size: int  # equivalent to embedding dimension\n    intermediate_size: int  # equivalent to d_ffn\n    num_attention_heads: int\n    max_position_embeddings: int\n    vocab_size: int\n    layer_norm_eps: float\n    hidden_act: str\n    use_clip_corenet_variant: bool\n\n\n@dataclass\nclass CLIPVisionConfig:\n    num_hidden_layers: int\n    hidden_size: int\n    intermediate_size: int\n    num_attention_heads: int\n    num_channels: int\n    image_size: int\n    patch_size: int\n    layer_norm_eps: float\n    hidden_act: str\n    use_clip_corenet_variant: bool\n\n\n@dataclass\nclass CLIPConfig:\n    text_config: CLIPTextConfig\n    vision_config: CLIPVisionConfig\n    projection_dim: int\n    use_clip_corenet_variant: bool\n\n\ndef quick_gelu(x: mx.array) -> mx.array:\n    \"\"\"\n    A fast GELU approximation https://github.com/hendrycks/GELUs\n    \"\"\"\n    return x * mx.sigmoid(1.702 * x)\n\n\ndef get_hidden_act(\n    config: Union[CLIPTextConfig, CLIPVisionConfig]\n) -> Callable[[mx.array], mx.array]:\n    \"\"\"Get attention based on the configuration\"\"\"\n    if config.hidden_act == \"quick_gelu\":\n        return quick_gelu\n    elif config.hidden_act == \"gelu\":\n        return nn.gelu\n    else:\n        raise ValueError(f\"Unknown hidden act: {config.hidden_act}.\")\n\n\ndef clip_loss(logits: mx.array) -> mx.array:\n    \"\"\"Get the clip loss\"\"\"\n    N, M = logits.shape\n    caption_loss = cross_entropy(logits, mx.arange(N), reduction=\"mean\")\n    image_loss = cross_entropy(logits.T, mx.arange(M), reduction=\"mean\")\n    return (caption_loss + image_loss) / 2.0\n\n\nclass Attention(nn.Module):\n    \"\"\"Implements the attention layer\"\"\"\n\n    def __init__(\n        self,\n        dims: int,\n        num_heads: int,\n        query_input_dims: Optional[int] = None,\n        key_input_dims: Optional[int] = None,\n        value_input_dims: Optional[int] = None,\n        value_dims: Optional[int] = None,\n        value_output_dims: Optional[int] = None,\n        bias: bool = False,\n    ) -> None:\n        super().__init__()\n\n        if (dims % num_heads) != 0:\n            raise ValueError(\n                \"The input feature dimensions should be divisible by the \"\n                f\"number of heads ({dims} % {num_heads}) != 0\"\n            )\n\n        query_input_dims = query_input_dims or dims\n        key_input_dims = key_input_dims or dims\n        value_input_dims = value_input_dims or key_input_dims\n        value_dims = value_dims or dims\n        value_output_dims = value_output_dims or dims\n\n        self.num_heads = num_heads\n        self.q_proj = nn.Linear(query_input_dims, dims, bias=bias)\n        self.k_proj = nn.Linear(key_input_dims, dims, bias=bias)\n        self.v_proj = nn.Linear(value_input_dims, value_dims, bias=bias)\n        self.out_proj = nn.Linear(value_dims, value_output_dims, bias=bias)\n\n    def __call__(\n        self,\n        queries: mx.array,\n        keys: mx.array,\n        values: mx.array,\n        mask: Optional[mx.array] = None,\n    ) -> mx.array:\n        queries = self.q_proj(queries)\n        keys = self.k_proj(keys)\n        values = self.v_proj(values)\n\n        num_heads = self.num_heads\n        B, L, D = queries.shape\n        _, S, _ = keys.shape\n        queries = queries.reshape(B, L, num_heads, -1).transpose(0, 2, 1, 3)\n        keys = keys.reshape(B, S, num_heads, -1).transpose(0, 2, 3, 1)\n        values = values.reshape(B, S, num_heads, -1).transpose(0, 2, 1, 3)\n\n        scale = math.sqrt(1 / queries.shape[-1])\n        scores = (queries * scale) @ keys\n        if mask is not None:\n            scores = scores + mask.astype(scores.dtype)\n        scores = mx.softmax(scores, axis=-1)\n        values_hat = (scores @ values).transpose(0, 2, 1, 3).reshape(B, L, -1)\n        return self.out_proj(values_hat)\n\n\nclass MLP(nn.Module):\n    \"\"\"Implements the MLP layer\"\"\"\n\n    def __init__(self, config: CLIPTextConfig) -> None:\n        super().__init__()\n        self.config = config\n        self.activation_fn = get_hidden_act(config)\n        self.fc1 = nn.Linear(config.hidden_size, config.intermediate_size)\n        self.fc2 = nn.Linear(config.intermediate_size, config.hidden_size)\n\n    def __call__(self, x: mx.array) -> mx.array:\n        x = self.activation_fn(self.fc1(x))\n        x = self.fc2(x)\n        return x\n\n\nclass EncoderLayer(nn.Module):\n    \"\"\"The transformer encoder layer from CLIP.\"\"\"\n\n    def __init__(self, config: CLIPTextConfig) -> None:\n        super().__init__()\n        self.embed_dim = config.hidden_size\n        # Add biases to the attention projections\n        self.self_attn = Attention(\n            config.hidden_size, config.num_attention_heads, bias=True\n        )\n        self.layer_norm1 = nn.LayerNorm(self.embed_dim, eps=config.layer_norm_eps)\n        self.mlp = MLP(config)\n        self.layer_norm2 = nn.LayerNorm(self.embed_dim, eps=config.layer_norm_eps)\n\n    def __call__(self, x: mx.array, mask: Optional[mx.array] = None) -> mx.array:\n        y = self.layer_norm1(x)\n        y = self.self_attn(y, y, y, mask)\n        x = x + y\n        y = self.layer_norm2(x)\n        y = self.mlp(y)\n        return x + y\n\n\nclass TextEmbeddings(nn.Module):\n    \"\"\"Implement the text embeddings layer\"\"\"\n\n    def __init__(self, config: CLIPTextConfig) -> None:\n        super().__init__()\n        embed_dim = config.hidden_size\n\n        self.token_embedding = nn.Embedding(config.vocab_size, embed_dim)\n        self.position_embedding = nn.Embedding(\n            config.max_position_embeddings, embed_dim\n        )\n\n    def __call__(self, x: mx.array) -> mx.array:\n        embeddings = self.token_embedding(x)\n        embeddings += self.position_embedding.weight[: x.shape[1]]\n        return embeddings\n\n\nclass Encoder(nn.Module):\n    \"\"\"Implement the transformer encoder layer\"\"\"\n\n    def __init__(self, config: Union[CLIPTextConfig, CLIPVisionConfig]) -> None:\n        self.layers = [EncoderLayer(config) for _ in range(config.num_hidden_layers)]\n\n    def __call__(self) -> None:\n        raise NotImplemented(\"Please use `for l in self.layers: x = l(x)`\")\n\n\ndef create_additive_causual_mask(\n    N: int, dtype: mx.Dtype, use_clip_corenet_variant: bool\n) -> mx.array:\n    if use_clip_corenet_variant:\n        indices = mx.arange(N)\n        mask = indices[:, None] < indices[None]\n        mask = mask.astype(dtype) * -3.4028235e38\n        return mask\n    else:\n        return nn.MultiHeadAttention.create_additive_causal_mask(N, dtype)\n\n\nclass ClipTextModel(nn.Module):\n    \"\"\"Implements the text encoder transformer from CLIP.\"\"\"\n\n    def __init__(self, config: CLIPTextConfig) -> None:\n        super().__init__()\n        self.embeddings = TextEmbeddings(config)\n        self.encoder = Encoder(config)\n        self.final_layer_norm = nn.LayerNorm(config.hidden_size)\n        self.use_clip_corenet_variant = config.use_clip_corenet_variant\n\n    def __call__(self, x: mx.array) -> CLIPTextOutput:\n        B, N = x.shape\n        eot_tokens = mx.argmax(x, axis=-1)\n        x = self.embeddings(x)\n        mask = create_additive_causual_mask(N, x.dtype, self.use_clip_corenet_variant)\n        for l in self.encoder.layers:\n            x = l(x, mask)\n\n        last_hidden_state = self.final_layer_norm(x)\n        pooler_output = last_hidden_state[mx.arange(B), eot_tokens]\n\n        return CLIPTextOutput(\n            pooler_output=pooler_output, last_hidden_state=last_hidden_state\n        )\n\n\nclass VisionEmbeddings(nn.Module):\n    \"\"\"Implement the vision embeddings layer\"\"\"\n\n    def __init__(self, config: CLIPVisionConfig) -> None:\n        super().__init__()\n        self.config = config\n        self.embed_dim = config.hidden_size\n        self.image_size = config.image_size\n        self.patch_size = config.patch_size\n\n        self.class_embedding = mx.zeros((config.hidden_size,))\n        self.num_patches = (self.image_size // self.patch_size) ** 2\n\n        if self.config.use_clip_corenet_variant:\n            self.num_positions = max(32, self.embed_dim // 4)\n            self.patch_embedding = nn.Sequential(\n                nn.Conv2d(\n                    in_channels=config.num_channels,\n                    out_channels=self.num_positions,\n                    kernel_size=4,\n                    stride=(4, 4),\n                    padding=(1, 1),\n                    bias=False,\n                ),\n                nn.BatchNorm(num_features=self.num_positions),\n                get_hidden_act(config),\n                nn.Conv2d(\n                    in_channels=self.num_positions,\n                    out_channels=self.num_positions,\n                    kernel_size=2,\n                    stride=(2, 2),\n                    bias=False,\n                ),\n                nn.BatchNorm(num_features=self.num_positions),\n                get_hidden_act(config),\n                nn.Conv2d(\n                    in_channels=self.num_positions,\n                    out_channels=self.embed_dim,\n                    kernel_size=2,\n                    stride=(2, 2),\n                    bias=True,\n                ),\n            )\n            self.position_embedding = nn.Embedding(self.num_patches, self.embed_dim)\n        else:\n            self.patch_embedding = nn.Conv2d(\n                in_channels=config.num_channels,\n                out_channels=self.embed_dim,\n                kernel_size=self.patch_size,\n                stride=self.patch_size,\n                bias=False,\n            )\n            self.num_positions = self.num_patches + 1\n            self.position_embedding = nn.Embedding(self.num_positions, self.embed_dim)\n\n    def __call__(self, x: mx.array) -> mx.array:\n        batch_size = x.shape[0]\n\n        # Patchify using conv:\n        # [batch_size, sqrt(num_patches), sqrt(num_patches), embed_dim]\n        patch_embeddings = self.patch_embedding(x)\n\n        # [batch_size, num_patches, embed_dim]\n        patch_embeddings = mx.flatten(patch_embeddings, start_axis=1, end_axis=2)\n        embed_dim = patch_embeddings.shape[-1]\n\n        if self.config.use_clip_corenet_variant:\n            # Add positional encoding\n            patch_embeddings += self.position_embedding.weight\n\n            # Prepend <CLS> embeddings\n            # [batch_size, 1, embed_dim]\n            cls_embeddings = mx.broadcast_to(\n                self.class_embedding, (batch_size, 1, embed_dim)\n            )\n            # [batch_size, num_patches + 1, embed_dim]\n            embeddings = mx.concatenate((cls_embeddings, patch_embeddings), axis=1)\n        else:\n            # Prepend <CLS> embeddings\n            # [batch_size, 1, embed_dim]\n            cls_embeddings = mx.broadcast_to(\n                self.class_embedding, (batch_size, 1, embed_dim)\n            )\n            # [batch_size, num_patches + 1, embed_dim]\n            embeddings = mx.concatenate((cls_embeddings, patch_embeddings), axis=1)\n            # Add positional encoding\n            embeddings += self.position_embedding.weight\n        return embeddings\n\n\nclass ClipVisionModel(nn.Module):\n    \"\"\"Implements the vision encoder transformer from CLIP.\"\"\"\n\n    def __init__(self, config: CLIPVisionConfig) -> None:\n        super().__init__()\n        self.embeddings = VisionEmbeddings(config)\n        if config.use_clip_corenet_variant:\n            self.pre_layernorm = nn.Identity()\n        else:\n            self.pre_layernorm = nn.LayerNorm(config.hidden_size)\n        self.encoder = Encoder(config)\n        self.post_layernorm = nn.LayerNorm(config.hidden_size)\n\n    def __call__(\n        self,\n        x: mx.array,\n        output_hidden_states: Optional[bool] = None,\n    ) -> CLIPVisionOutput:\n        x = self.embeddings(x)\n        x = self.pre_layernorm(x)\n\n        encoder_states = (x,) if output_hidden_states else None\n\n        for l in self.encoder.layers:\n            x = l(x, mask=None)\n\n            if output_hidden_states:\n                encoder_states = encoder_states + (x,)\n\n        # Extract <CLS> token embedding\n        pooler_output = self.post_layernorm(x[:, 0, :])\n        return CLIPVisionOutput(\n            pooler_output=pooler_output,\n            last_hidden_state=x,\n            hidden_states=encoder_states,\n        )\n\n\nclass CLIPModel(nn.Module):\n    \"\"\"Implements the MPS CLIP model\"\"\"\n\n    def __init__(self, config: CLIPConfig) -> None:\n        self.text_model = ClipTextModel(config.text_config)\n        self.vision_model = ClipVisionModel(config.vision_config)\n\n        text_embed_dim = config.text_config.hidden_size\n        vision_embed_dim = config.vision_config.hidden_size\n        projection_dim = config.projection_dim\n\n        self.visual_projection = nn.Linear(vision_embed_dim, projection_dim, bias=False)\n        self.text_projection = nn.Linear(text_embed_dim, projection_dim, bias=False)\n        self.logit_scale = mx.array(0.0)\n\n        self.use_clip_corenet_variant = config.use_clip_corenet_variant\n\n    def get_text_features(self, x: mx.array) -> mx.array:\n        return self.text_projection(self.text_model(x).pooler_output)\n\n    def get_image_features(self, x: mx.array) -> mx.array:\n        return self.visual_projection(self.vision_model(x).pooler_output)\n\n    def __call__(\n        self,\n        input_ids: Optional[mx.array] = None,\n        pixel_values: Optional[mx.array] = None,\n        return_loss: bool = False,\n    ) -> CLIPModelOutput:\n        if input_ids is not None:\n            text_model_output = self.text_model(input_ids)\n            text_embeds = self.text_projection(text_model_output.pooler_output)\n            text_embeds = text_embeds / LA.norm(text_embeds, axis=-1, keepdims=True)\n        else:\n            text_embeds = None\n            text_model_output = None\n\n        if pixel_values is not None:\n            vision_model_output = self.vision_model(pixel_values)\n            image_embeds = self.visual_projection(vision_model_output.pooler_output)\n            image_embeds = image_embeds / LA.norm(image_embeds, axis=-1, keepdims=True)\n        else:\n            image_embeds = None\n            vision_model_output = None\n\n        if return_loss and (input_ids is None or pixel_values is None):\n            raise ValueError(\"Must provide text and image inputs to compute loss.\")\n\n        if return_loss:\n            logit_scale = mx.exp(self.logit_scale)\n            logits = (text_embeds @ image_embeds.T) * logit_scale\n            loss = clip_loss(logits)\n        else:\n            loss = None\n\n        return CLIPModelOutput(\n            loss=loss,\n            text_embeds=text_embeds,\n            image_embeds=image_embeds,\n            vision_model_output=vision_model_output,\n            text_model_output=text_model_output,\n        )\n\n    @staticmethod\n    def from_pretrained(path: str) -> \"CLIPModel\":\n        path = Path(path)\n\n        with open(path / \"config.json\", \"r\") as fid:\n            config = json.load(fid)\n\n        use_clip_corenet_variant = config[\"model_type\"] == \"clip_corenet\"\n\n        text_config = config[\"text_config\"]\n        text_config = CLIPTextConfig(\n            num_hidden_layers=text_config[\"num_hidden_layers\"],\n            hidden_size=text_config[\"hidden_size\"],\n            intermediate_size=text_config[\"intermediate_size\"],\n            num_attention_heads=text_config[\"num_attention_heads\"],\n            max_position_embeddings=text_config[\"max_position_embeddings\"],\n            vocab_size=text_config[\"vocab_size\"],\n            layer_norm_eps=text_config[\"layer_norm_eps\"],\n            hidden_act=text_config[\"hidden_act\"],\n            use_clip_corenet_variant=use_clip_corenet_variant,\n        )\n\n        vision_config = config[\"vision_config\"]\n        vision_config = CLIPVisionConfig(\n            num_hidden_layers=vision_config[\"num_hidden_layers\"],\n            hidden_size=vision_config[\"hidden_size\"],\n            intermediate_size=vision_config[\"intermediate_size\"],\n            num_attention_heads=vision_config[\"num_attention_heads\"],\n            num_channels=3,\n            image_size=vision_config[\"image_size\"],\n            patch_size=vision_config[\"patch_size\"],\n            layer_norm_eps=vision_config[\"layer_norm_eps\"],\n            hidden_act=vision_config[\"hidden_act\"],\n            use_clip_corenet_variant=use_clip_corenet_variant,\n        )\n\n        config = CLIPConfig(\n            text_config=text_config,\n            vision_config=vision_config,\n            projection_dim=config[\"projection_dim\"],\n            use_clip_corenet_variant=use_clip_corenet_variant,\n        )\n        model = CLIPModel(config)\n        weight_files = glob.glob(str(path / \"*.safetensors\"))\n        if not weight_files:\n            logging.error(f\"No safetensors found in {path}\")\n            raise FileNotFoundError(f\"No safetensors found in {path}\")\n\n        weights = {}\n        for wf in weight_files:\n            weights.update(mx.load(wf))\n\n        weights = model.sanitize(weights)\n        model.load_weights(list(weights.items()))\n        return model\n\n    @staticmethod\n    def sanitize(weights: Dict[str, mx.array]) -> Dict[str, mx.array]:\n        sanitized_weights = {}\n        for k, v in weights.items():\n            if \"position_ids\" in k:\n                # Remove unused position_ids\n                continue\n            elif \"patch_embedding.weight\" in k or re.match(\n                r\".*patch_embedding\\.layers\\.[036]\\.weight\", k\n            ):\n                # pytorch conv2d expects the weight tensor to be of shape [out_channels, in_channels, kH, KW]\n                # mlx conv2d expects the weight tensor to be of shape [out_channels, kH, KW, in_channels]\n                sanitized_weights[k] = v.transpose(0, 2, 3, 1)\n            else:\n                sanitized_weights[k] = v\n\n        return sanitized_weights\n"
  },
  {
    "path": "mlx_examples/clip/requirements.txt",
    "content": "transformers==4.40.0\nhuggingface_hub==0.21.4\n-r ../requirements.txt\n"
  },
  {
    "path": "mlx_examples/clip/results/.gitkeep",
    "content": ""
  },
  {
    "path": "mlx_examples/clip/tokenizer.py",
    "content": "# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\n# Taken from https://github.com/ml-explore/mlx-examples/blob/main/clip/tokenizer.py\n# with modifications about doc-string and typing.\n\nimport json\nfrom pathlib import Path\nfrom typing import Any, Dict, List, Tuple\n\nimport mlx.core as mx\nimport regex\n\n\nclass CLIPTokenizer:\n    \"\"\"Convert a text to tokenized index.\n\n    A simple port of CLIPTokenizer from https://github.com/huggingface/transformers/\n    \"\"\"\n\n    def __init__(self, bpe_ranks: Dict[Tuple[str], int], vocab: Dict[str, int]):\n        self.bpe_ranks = bpe_ranks\n        self.vocab = vocab\n        self.pat = regex.compile(\n            r\"\"\"<\\|startoftext\\|>|<\\|endoftext\\|>|'s|'t|'re|'ve|'m|'ll|'d|[\\p{L}]+|[\\p{N}]|[^\\s\\p{L}\\p{N}]+\"\"\",\n            regex.IGNORECASE,\n        )\n        self._cache = {self.bos: self.bos, self.eos: self.eos}\n\n    @property\n    def bos(self) -> str:\n        return \"<|startoftext|>\"\n\n    @property\n    def bos_token(self) -> int:\n        return self.vocab[self.bos]\n\n    @property\n    def eos(self) -> str:\n        return \"<|endoftext|>\"\n\n    @property\n    def eos_token(self) -> int:\n        return self.vocab[self.eos]\n\n    def bpe(self, text: str) -> List[str]:\n        if text in self._cache:\n            return self._cache[text]\n\n        unigrams = list(text[:-1]) + [text[-1] + \"</w>\"]\n        unique_bigrams = set(zip(unigrams, unigrams[1:]))\n\n        if not unique_bigrams:\n            return unigrams\n\n        # In every iteration try to merge the two most likely bigrams. If none\n        # was merged we are done.\n        #\n        # Ported from https://github.com/huggingface/transformers/blob/e74d793a3c3c0bc9bf3fb94bb31dd16934b1b0db/src/transformers/models/clip/tokenization_clip.py\n        while unique_bigrams:\n            bigram = min(\n                unique_bigrams, key=lambda pair: self.bpe_ranks.get(pair, float(\"inf\"))\n            )\n            if bigram not in self.bpe_ranks:\n                break\n\n            new_unigrams = []\n            skip = False\n            for a, b in zip(unigrams, unigrams[1:]):\n                if skip:\n                    skip = False\n                    continue\n\n                if (a, b) == bigram:\n                    new_unigrams.append(a + b)\n                    skip = True\n\n                else:\n                    new_unigrams.append(a)\n\n            if not skip:\n                new_unigrams.append(b)\n\n            unigrams = new_unigrams\n            unique_bigrams = set(zip(unigrams, unigrams[1:]))\n\n        self._cache[text] = unigrams\n\n        return unigrams\n\n    def __call__(self, *args: Any, **kwargs: Any) -> Any:\n        return self.tokenize(*args, **kwargs)\n\n    def tokenize(\n        self, text: str, prepend_bos: bool = True, append_eos: bool = True\n    ) -> mx.array:\n        if isinstance(text, list):\n            return mx.array([self.tokenize(t, prepend_bos, append_eos) for t in text])\n\n        # Lower case, cleanup, and split. Hugging Face does a much,\n        # more thorough job here but this should suffice for 95% of\n        # cases.\n        clean_text = regex.sub(r\"\\s+\", \" \", text.lower())\n        tokens = regex.findall(self.pat, clean_text)\n\n        # Split the tokens according to the byte-pair merge file\n        bpe_tokens = [ti for t in tokens for ti in self.bpe(t)]\n\n        # Map to token ids and return\n        tokens = []\n        if prepend_bos:\n            tokens.append(self.bos_token)\n        tokens.extend(self.vocab[t] for t in bpe_tokens)\n        if append_eos:\n            tokens.append(self.eos_token)\n        return mx.array(tokens)\n\n    @staticmethod\n    def from_pretrained(path: str) -> \"CLIPTokenizer\":\n        path = Path(path)\n\n        with open(path / \"vocab.json\", encoding=\"utf-8\") as f:\n            vocab = json.load(f)\n        with open(path / \"merges.txt\", encoding=\"utf-8\") as f:\n            bpe_merges = f.read().strip().split(\"\\n\")[1 : 49152 - 256 - 2 + 1]\n\n        bpe_merges = [tuple(m.split()) for m in bpe_merges]\n        bpe_ranks = dict(map(reversed, enumerate(bpe_merges)))\n\n        return CLIPTokenizer(bpe_ranks, vocab)\n"
  },
  {
    "path": "mlx_examples/open_elm/README.md",
    "content": "# MLX port of OpenELM\n\nThis directory contains an MLX port of OpenELM model trained with CoreNet. MLX\nis an Apple deep learning framework similar in spirit to PyTorch, which is\noptimized for Apple Silicon based hardware.\n\nThis code requires the MLX-specific dependencies from `../requirements.txt` to\nbe installed. We assume that the main requirements.txt is already installed.\n\n\n## Downloading pre-converted checkpoints\n\nThe pre-converted checkpoints are available at the following URLs.\n\n| Model | Weights | Config |\n| ---- | ---- | ---- |\n| 270M | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/mlx/270M/weights.safetensors) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/mlx/270M/config.json) |\n| 270M - 4bit | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/mlx/270M-4bit/weights.safetensors) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/mlx/270M-4bit/config.json) |\n| 450M | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/mlx/450M/weights.safetensors) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/mlx/450M/config.json) |\n| 450M - 4bit | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/mlx/450M-4bit/weights.safetensors) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/mlx/450M-4bit/config.json) |\n| 1.1B | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/mlx/1.1B/weights.safetensors) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/mlx/1.1B/config.json) |\n| 1.1B - 4bit | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/mlx/1.1B-4bit/weights.safetensors) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/mlx/1.1B-4bit/config.json) |\n| 3B | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/mlx/3B/weights.safetensors) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/mlx/3B/config.json) |\n| 3B - 4bit | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/mlx/3B-4bit/weights.safetensors) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/mlx/3B-4bit/config.json) |\n\n Note that these checkpoints do not contain a tokenizer model file, which is\n required for inference with `inference.py`. Simply place Meta LLaMA2's\n `tokenizer.model` into the directories to load model using our provided\n `inference.py`, or if you prefer to use the models directly, use the\n corresponding tokenizer from Huggingface Transformers.\n\n## Running the model\n\nIn order to run the model, the `inference.py` script is provided. It also\nprovides documentation for how to load and use the model if you are not\nfamiliar with language modeling in MLX.\n\nHere's a usage example:\n\n```\nPYTHONPATH=. python3 mlx_examples/open_elm/inference.py \\\n    --model-dir <MLX model directory> \\\n    --prompt \"Once upon a time in a land far away\" \\\n    --max-tokens=1024\n```\n\nThis should produce a completion for your prompt.\n\n## Converting the weights\n\nThis port includes a conversion script, which can also do quantization. We have\ntested this script with fp16/bf16 and 4-bit quantized models with group size 32\nand 64. Because of the similarities between MLX and PyTorch the naming of all\nvariables in checkpoints is identical.\n\nA note on the tokenizer model: OpenELM uses Meta LLaMA tokenizer, which you will\nneed to obtain from Meta.\n\nTo run a fp16 conversion, download the training YAML configuration with which\nthe model was trained, and the `*.pt` checkpoint that corresponds to that\nconfiguration. Then, execute the following command from the root of this\nrepository:\n\n```\nPYTHONPATH=. python3 mlx_examples/open_elm/convert.py \\\n    --input-checkpoint <PyTorch/CoreNet checkpoint> \\\n    --config-yaml <CoreNet training configuration YAML> \\\n    --tokenizer-path <path to tokenizer.model> \\\n    --dtype=\"float16\" \\\n    --output-dir <output dir>\n```\n\nThis will produce two files: an `*.npz` checkpoint, and `config.json` configuration\nfile necessary to load the checkpoint.\n\nIn order to convert to a 4-bit quantized checkpoint, simply add the required\nflags like so:\n\n```\nPYTHONPATH=. python3 mlx_examples/open_elm/convert.py \\\n    --input-checkpoint <PyTorch checkpoint> \\\n    --config-yaml <CoreNet training configuration YAML> \\\n    --tokenizer-path <path to tokenizer.model> \\\n    --dtype=\"float16\" \\\n    --quantize \\\n    --output-dir <output dir>\n```\n\nBoth of these commands will produce self-contained model directories with\nweights, configuration and tokenizer files inside.\n\nNote that OpenELM 3B should use BFloat16 for both 16-bit and quantized\ninference. It requires a greater activation range than the other model sizes.\n"
  },
  {
    "path": "mlx_examples/open_elm/__init__.py",
    "content": ""
  },
  {
    "path": "mlx_examples/open_elm/convert.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nimport copy\nimport json\nimport pathlib\nimport shutil\nimport sys\nfrom typing import Any, Dict, Tuple\n\nimport numpy as np\nimport safetensors\nimport torch\nimport yaml\n\nfrom mlx_examples.open_elm import open_elm\n\ntry:\n    import mlx\n    from mlx import core as mx\n    from mlx import nn\nexcept ImportError:\n    sys.exit(\"You must install Apple MLX to use this program.\")\n\n\ndef torch_to_mlx(x: torch.Tensor) -> mx.array:\n    \"\"\"Converts a PyTorch tensor to an MLX tensor with the same dtype.\n\n    Args:\n        x: PyTorch tensor to convert\n\n    Returns:\n        An MLX version with the same dtype and contents.\n    \"\"\"\n    x = x.detach()\n    torch_dtype = str(x.dtype).split(\".\")[-1]\n    mlx_dtype = getattr(mx, torch_dtype)\n    # MLX mentions that converting to bfloat16 under NumPy could result in\n    # precision loss, so we first up-cast to fp32.\n    if torch_dtype == \"bfloat16\":\n        x = x.to(torch.float32)\n    return mx.array(x.cpu().numpy(), dtype=mlx_dtype)\n\n\ndef quantize_weights(\n    weights: Dict[str, mx.array],\n    model_config: Dict[str, Any],\n    bits: int = 4,\n    group_size: int = 64,\n) -> Tuple[Dict[str, Any], Dict[str, Any]]:\n    \"\"\"Quantizes model weights to a given bit depth and group size.\n\n    Args:\n        weights: weights dictionary for the model\n        model_config: model configuration from the JSON config file\n        bits: quantization depth\n        group_size: quantization group size\n\n    Returns:\n        Quantized weights dictionary and the updated model config.\n    \"\"\"\n    model_config = copy.deepcopy(model_config)\n    model = open_elm.OpenELM(**model_config)\n    weights = mlx.utils.tree_map(mx.array, weights)\n    model.update(mlx.utils.tree_unflatten(list(weights.items())))\n\n    nn.QuantizedLinear.quantize_module(model, group_size=group_size, bits=bits)\n\n    quantized_weights = dict(mlx.utils.tree_flatten(model.parameters()))\n    model_config[\"quantization\"] = {\n        \"group_size\": group_size,\n        \"bits\": bits,\n    }\n\n    return quantized_weights, model_config\n\n\ndef convert_open_elm(\n    torch_checkpoint_path: pathlib.Path,\n    tokenizer_path: pathlib.Path,\n    config_yaml_path: pathlib.Path,\n    output_dir: pathlib.Path,\n    quantize: bool = False,\n    quantization_bits: int = 4,\n    quantization_group_size: int = 64,\n    dtype: mx.Dtype = mx.float16,\n) -> None:\n    \"\"\"Converts Apple OpenELM LLM checkpoint and configuration from\n    PyTorch/CoreNet format to MLX format.\n\n\n    Args:\n        torch_checkpoint_path: path to the input *.pt checkpoint file\n        tokenizer_path: path to the tokenizer file to copy to the output\n        config_yaml_path: path to the training config *.yaml file\n        output_dir: output directory to write the checkpoint\n        quantize: set to true to enable quantization (default 4 bit, group size 64)\n        quantization_bits: number of bits to quantize to\n        quantization_group_size: quantization group size\n\n    Returns:\n        None\n    \"\"\"\n    assert torch_checkpoint_path.is_file(), torch_checkpoint_path\n    assert config_yaml_path.is_file(), config_yaml_path\n\n    output_dir.mkdir(parents=True, exist_ok=True)\n\n    # Extract the relevant part of YAML config.\n    with config_yaml_path.open(\"r\") as f:\n        config = yaml.safe_load(f)\n\n    model_config = config[\"model\"][\"language_modeling\"][\"general_gpt\"]\n    # Padding index is used in CoreNet for training, and is not required for inference.\n    model_config.pop(\"padding_index\")\n\n    # Load PyTorch checkpoint.\n    ckpt = torch.load(torch_checkpoint_path, map_location=\"cpu\")\n    weights = {k: torch_to_mlx(v).astype(dtype) for k, v in ckpt.items()}\n\n    if quantize:\n        weights, model_config = quantize_weights(\n            weights,\n            model_config,\n            bits=quantization_bits,\n            group_size=quantization_group_size,\n        )\n\n    checkpoint_file = output_dir / \"weights.safetensors\"\n    with checkpoint_file.open(\"wb\") as f:\n        mx.save_safetensors(f, weights)\n    print(f\"Wrote converted checkpoint to {checkpoint_file}.\")\n\n    config_file = output_dir / \"config.json\"\n    with config_file.open(\"w\") as f:\n        json.dump(model_config, f, indent=2)\n    print(f\"Wrote config to {config_file}.\")\n\n    shutil.copy2(tokenizer_path, output_dir / \"tokenizer.model\")\n\n\nif __name__ == \"__main__\":\n    parser = argparse.ArgumentParser(\n        description=\"Converts OpenELM checkpoints from PyTorch to MLX.\",\n        formatter_class=argparse.ArgumentDefaultsHelpFormatter,\n    )\n    parser.add_argument(\n        \"--input-checkpoint\",\n        type=pathlib.Path,\n        required=True,\n        help=\"Input PyTorch / CoreNet checkpoint for Apple OpenELM model.\",\n    )\n    parser.add_argument(\n        \"--tokenizer-path\",\n        type=pathlib.Path,\n        required=True,\n        help=\"SentencePiece tokenizer model file to copy into the output directory.\",\n    )\n    parser.add_argument(\n        \"--config-yaml\",\n        type=pathlib.Path,\n        required=True,\n        help=\"Path to the YAML file containing the CoreNet training configuration.\",\n    )\n    parser.add_argument(\n        \"--output-dir\",\n        type=pathlib.Path,\n        required=True,\n        help=\"Output directory for MLX checkpoint.\",\n    )\n    parser.add_argument(\n        \"--dtype\",\n        default=\"float16\",\n        type=str,\n        choices=[\"float16\", \"bfloat16\", \"float32\"],\n        help=\"Data type to use for the converted model.\",\n    )\n    parser.add_argument(\n        \"--quantize\",\n        help=\"Generate a quantized model.\",\n        action=\"store_true\",\n    )\n    parser.add_argument(\n        \"--quantization-group-size\",\n        help=\"Group size for quantization.\",\n        type=int,\n        default=64,\n    )\n    parser.add_argument(\n        \"--quantization-bits\",\n        help=\"Bits per weight for quantization.\",\n        type=int,\n        default=4,\n    )\n\n    args = parser.parse_args()\n\n    dtype = args.dtype.lower()\n    if dtype == \"float16\":\n        dtype = mx.float16\n    elif dtype == \"bfloat16\":\n        dtype = mx.bfloat16\n    elif dtype == \"float32\":\n        dtype = mx.float32\n    else:\n        raise ValueError(f\"Unsupported dtype {dtype}.\")\n\n    convert_open_elm(\n        args.input_checkpoint,\n        args.tokenizer_path,\n        args.config_yaml,\n        args.output_dir,\n        quantize=args.quantize,\n        quantization_bits=args.quantization_bits,\n        quantization_group_size=args.quantization_group_size,\n        dtype=dtype,\n    )\n"
  },
  {
    "path": "mlx_examples/open_elm/inference.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nimport pathlib\nimport time\nfrom typing import Generator\n\nimport sentencepiece\nfrom mlx import core as mx\n\nfrom mlx_examples.open_elm import open_elm\n\n# From \"The Treasure Island\" by R.L.Stevenson, public domain.\nPROMPT = (\n    \"Squire Trelawney, Dr. Livesey, and the rest of these gentlemen having \"\n    \"asked me to write down the whole particulars about Treasure Island, \"\n    \"from the\"\n)\n\n\ndef generate_token(\n    prompt_tokens: mx.array, model: open_elm.OpenELM, sampling_temperature: float = 0.0\n) -> Generator[int, None, None]:\n    \"\"\"Generates a single output token at a time for a given set of prompt tokens.\n\n    Args:\n        prompt_tokens: Tokenized prompt from SentencePiece tokenizer.\n        model: An OpenELM model instance used for generating text completions.\n        sampling_temperature: A float specifying the sampling temperature for generation,\n            which affects the randomness of the generated text. A value of 0 (default) means\n            deterministic output, while higher values introduce more randomness.\n\n    Returns:\n        A generator object which produces one output token at a time.\n    \"\"\"\n\n    def sample(logits):\n        if sampling_temperature == 0:\n            return mx.argmax(logits, axis=-1)\n        return mx.random.categorical(logits * (1.0 / sampling_temperature))\n\n    # Process the prompt.\n    output = model(\n        {\n            \"input_ids\": prompt_tokens,\n            \"past_key_values\": None,\n            \"use_kv_cache\": True,\n            \"is_causal\": True,\n        }\n    )\n    cache = output[\"past_key_values\"]\n    logits = output[\"logits\"]\n    y = sample(logits[:, -1])\n    yield y\n\n    while True:\n        output = model(\n            {\n                \"input_ids\": y[:, None],\n                \"past_key_values\": cache,\n                \"use_kv_cache\": True,\n                \"is_causal\": True,\n            }\n        )\n        cache = output[\"past_key_values\"]\n        logits = output[\"logits\"]\n        y = sample(logits.squeeze(1))\n        yield y\n\n\ndef generate(\n    model: open_elm.OpenELM,\n    tokenizer: sentencepiece.SentencePieceProcessor,\n    prompt: str,\n    max_tokens: int,\n    sampling_temperature: float = 0.0,\n    print_output: bool = False,\n):\n    \"\"\"Generates and prints a response for a given prompt.\n\n    Args:\n        model: An OpenELM model instance used for generating text completions.\n        tokenizer: A SentencePieceProcessor instance for tokenizing text for the model.\n        prompt: The initial text prompt to generate completions for.\n        max_tokens: The maximum number of tokens to generate for the completion.\n        sampling_temperature: A float specifying the sampling temperature for generation,\n            which affects the randomness of the generated text. A value of 0 (default) means\n            deterministic output, while higher values introduce more randomness.\n\n    Returns:\n        None. The function directly prints the generated text completion to the standard output.\n    \"\"\"\n    tokenized_prompt = mx.array([[tokenizer.bos_id()] + tokenizer.Encode(prompt)])\n    num_prompt_tokens = len(tokenized_prompt.flatten())\n    print(f\"{num_prompt_tokens} token(s) in the prompt.\")\n\n    # Evaluation is done lazily, graph is built for several tokens each time,\n    # except for the first token after the prompt. The first token is evaluated\n    # in order to measure the prompt processing throughput.\n    tokens_per_eval = 8\n    start = time.perf_counter()\n    tokens = []\n\n    # Warm up the model.\n    _ = generate_token(tokenized_prompt, model, sampling_temperature)\n\n    generated_tokens = 0\n    elapsed_prompt = 0.0\n    for token, ntoks in zip(\n        generate_token(tokenized_prompt, model, sampling_temperature),\n        range(max_tokens),\n    ):\n        tokens.append(token)\n        if ntoks == 0:\n            mx.eval(tokens)\n            elapsed_prompt = time.perf_counter() - start\n\n        if (len(tokens) % tokens_per_eval) == 0:\n            mx.eval(tokens)\n            if print_output:\n                s = tokenizer.Decode([t.item() for t in tokens])\n                print(s, end=\"\", flush=True)\n            tokens = []\n        generated_tokens += 1\n\n    mx.eval(tokens)\n    if print_output:\n        s = tokenizer.Decode([t.item() for t in tokens])\n        print(s, flush=True)\n\n    elapsed_total = time.perf_counter() - start\n    elapsed_generation = elapsed_total - elapsed_prompt\n    prompt_tps = tokenized_prompt.size / elapsed_prompt\n    generation_tps = generated_tokens / elapsed_generation\n    total_tps = (generated_tokens + num_prompt_tokens) / elapsed_total\n\n    print(\n        f\"Throughput: prompt {prompt_tps:.2f} t/s, generation {generation_tps:.2f} t/s. \"\n        f\"{generated_tokens} tokens generated in {elapsed_total - elapsed_prompt}s. \"\n        f\"Total throughput: {total_tps} t/s.\"\n    )\n\n\nif __name__ == \"__main__\":\n    parser = argparse.ArgumentParser(\n        description=\"Test loading checkpoints and inference for MLX port of Apple OpenELM LLM.\"\n    )\n    parser.add_argument(\n        \"--model-dir\",\n        type=pathlib.Path,\n        required=True,\n        help=\"Path to MLX model directory containing model weights, JSON config and the \"\n        \"tokenizer file.\",\n    )\n    parser.add_argument(\"--prompt\", default=PROMPT, help=\"Prompt for inference.\")\n    parser.add_argument(\n        \"--max-tokens\",\n        type=int,\n        default=1024,\n        help=\"Maximum number of tokens to generate.\",\n    )\n    parser.add_argument(\n        \"--sampling-temperature\", type=float, default=0.0, help=\"Sampling temperature.\"\n    )\n    parser.add_argument(\n        \"--print-output\",\n        action=\"store_true\",\n        help=\"When specified, output will be printed to console.\",\n    )\n\n    args = parser.parse_args()\n\n    assert args.sampling_temperature >= 0.0, args.sampling_temperature\n    assert args.max_tokens > 0, args.max_tokens\n\n    model, tokenizer = open_elm.load_model(args.model_dir)\n\n    print(\"Prompt:\", args.prompt)\n\n    generate(\n        model,\n        tokenizer,\n        args.prompt,\n        args.max_tokens,\n        sampling_temperature=args.sampling_temperature,\n        print_output=args.print_output,\n    )\n"
  },
  {
    "path": "mlx_examples/open_elm/open_elm.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport dataclasses\nimport json\nimport pathlib\nfrom numbers import Number\nfrom typing import Any, Callable, Dict, List, Optional, Tuple, Union\n\nimport mlx\nimport sentencepiece\nfrom mlx import core as mx\nfrom mlx import nn\n\n\ndef get_normalization_layer(num_features: int, norm_type: str) -> nn.Module:\n    if norm_type == \"rms_norm\":\n        return nn.RMSNorm(dims=num_features, eps=1e-6)\n    raise ValueError(f\"Unsupported normalization layer: {norm_type}.\")\n\n\ndef compute_heads(model_dim: int, head_dim: int) -> int:\n    if model_dim % head_dim == 0:\n        return model_dim // head_dim\n    raise ValueError(\n        \"Model dimension should be divisible by head dimension. Got: \"\n        f\"{model_dim} and {head_dim}.\"\n    )\n\n\ndef make_divisible(val: Union[int, float], divisor: int) -> int:\n    \"\"\"Make val divisible by divisor, rounding down no more than 10%, otherwise\n    rounding up. If val is less than divisor, returns divisor.\"\"\"\n    assert val >= 0.0, val\n    assert divisor > 0, divisor\n    assert isinstance(divisor, int)\n\n    if val < divisor:\n        return divisor\n\n    # First round down to a whole multiple of divisor and see if it's within 10%\n    # of val. If it is, return it, if not, add another `divisor` to get the\n    # upper rounding.\n    round_down = int(val + divisor / 2) // divisor * divisor\n\n    if round_down <= 0.9 * val:\n        return round_down + divisor\n    else:\n        return round_down\n\n\n@dataclasses.dataclass\nclass GPTConfig:\n    vocab_size: int = 32000\n    max_context_length: int = 2048\n\n    num_transformer_layers: int = 12\n    model_dim: int = 2048\n\n    head_dim: int = 128\n    qkv_multipliers: Union[Number, List[Number]] = 1.0\n    num_query_heads: int = compute_heads(model_dim=model_dim, head_dim=head_dim)\n    # This variable allows to switch between multi-head attention, group query\n    # attention, and multi-query attention.\n    # When num_gqa_groups == 1, then it is multi-head attention.\n    # When 1 < num_gqa_groups < num_heads and num_heads is divisible by\n    # num_gqa_groups, then it is group query attention\n    # When num_gqa_groups == num_heads, then it is multi-query attention\n    num_gqa_groups: int = 1\n\n    ffn_multipliers: Union[Number, List[Number]] = 4.0\n    # use FFN with Gated Linear Unit (GLU)\n    ffn_with_glu: bool = True\n    ffn_dim_divisor: int = 256\n\n    activation_fn_name: str = \"swish\"\n    normalization_layer_name: str = \"rms_norm\"\n    normalize_qk_projections: bool = False\n    share_input_output_layers: bool = False\n\n    rope_freq_constant: int = 10000\n    # Note that rope_max_length is set to twice of max_context_length.\n    # This allows flexibility in token lengths during training or fine-tuning.\n    rope_max_length: int = 4096\n\n    def __post_init__(self) -> None:\n        if self.num_gqa_groups is not None:\n            head_multiple_of = self.num_gqa_groups\n        else:\n            head_multiple_of = 2\n\n        if isinstance(self.qkv_multipliers, Number):\n            qkv_dim = make_divisible(\n                int(self.model_dim * self.qkv_multipliers),\n                divisor=self.head_dim * head_multiple_of,\n            )\n            query_dims = [int(qkv_dim)] * self.num_transformer_layers\n\n        elif (\n            isinstance(self.qkv_multipliers, (tuple, list))\n            and len(self.qkv_multipliers) == 2\n        ):\n            # Each attention layer have different latent dimensions assuming\n            # qkv_multipliers[0] != qkv_multipliers[1].\n            # This results in variable allocation of parameters in attention layer.\n            # This scaling is known as layer-wise or block-wise scaling:\n            # https://arxiv.org/abs/2008.00623\n            qkv_multipliers = [\n                round(v.item(), 2)\n                for v in mx.linspace(\n                    self.qkv_multipliers[0],\n                    self.qkv_multipliers[1],\n                    num=self.num_transformer_layers,\n                    dtype=mx.float32,\n                )\n            ]\n            query_dims = [\n                make_divisible(\n                    self.model_dim * mult, divisor=self.head_dim * head_multiple_of\n                )\n                for mult in qkv_multipliers\n            ]\n        else:\n            raise NotImplementedError(\n                \"QKV multipliers should be a single number or a list containing exactly \"\n                f\"two numbers. Got: {qkv_multipliers}.\"\n            )\n\n        # compute the number of query, key, and value heads\n        # For multi-head and multi-query attention, the number of heads for\n        # query, key, and value are the same.\n        # For group query attention, the number of key and value heads are the same.\n        self.num_query_heads = [\n            compute_heads(q_dim, self.head_dim) for q_dim in query_dims\n        ]\n        self.num_kv_heads = [\n            q_heads // self.num_gqa_groups for q_heads in self.num_query_heads\n        ]\n\n        # Feed-forward network (FFN) multipliers\n        if isinstance(self.ffn_multipliers, Number):\n            # All FFN layers have the same latent dimensions, resulting in\n            # uniform allocation of parameters.\n            self.ffn_multipliers = [self.ffn_multipliers] * self.num_transformer_layers\n        elif (\n            isinstance(self.ffn_multipliers, (tuple, list))\n            and len(self.ffn_multipliers) == 2\n        ):\n            # Each FFN layer have different latent dimensions assuming\n            # ffn_multipliers[0] != ffn_multipliers[1].\n            # This results in variable allocation of parameters in FFN layer.\n            # This scaling is known as layer-wise or block-wise scaling:\n            # https://arxiv.org/abs/2008.00623\n            self.ffn_multipliers = [\n                round(v.item(), 2)\n                for v in mx.linspace(\n                    self.ffn_multipliers[0],\n                    self.ffn_multipliers[1],\n                    num=self.num_transformer_layers,\n                    dtype=mx.float32,\n                )\n            ]\n        else:\n            raise NotImplementedError(\n                \"FFN multipliers should be a single number or a list containing exactly \"\n                f\"two numbers. Got: {qkv_multipliers}.\"\n            )\n\n    @classmethod\n    def from_name(\n        cls, model_name: str, vocab_size: int, max_context_length: int\n    ) -> \"GPTConfig\":\n        if model_name in gpt_configs:\n            config = gpt_configs[model_name]\n        else:\n            raise NotImplementedError(f\"{model_name} is not yet implemented\")\n\n        config[\"vocab_size\"] = vocab_size\n        config[\"max_context_length\"] = max_context_length\n        return cls(**config)\n\n\ngpt_configs = {\n    \"OpenELM-270M\": {\n        \"num_transformer_layers\": 16,\n        \"model_dim\": 1280,\n        \"head_dim\": 64,\n        \"num_gqa_groups\": 4,\n        \"normalize_qk_projections\": True,\n        \"share_input_output_layers\": True,\n        # Vary the FFN and QKV multiplier to create variable FFN and attention\n        # layers respectively.\n        \"ffn_multipliers\": (0.5, 4.0),\n        \"qkv_multipliers\": (0.5, 1.0),\n    },\n    \"OpenELM-450M\": {\n        \"num_transformer_layers\": 20,\n        \"model_dim\": 1536,\n        \"head_dim\": 64,\n        \"num_gqa_groups\": 4,\n        \"normalize_qk_projections\": True,\n        \"share_input_output_layers\": True,\n        \"ffn_multipliers\": (0.5, 4.0),\n        \"qkv_multipliers\": (0.5, 1.0),\n    },\n    \"OpenELM-1_1B\": {\n        \"num_transformer_layers\": 28,\n        \"model_dim\": 2048,\n        \"head_dim\": 64,\n        \"num_gqa_groups\": 4,\n        \"normalize_qk_projections\": True,\n        \"share_input_output_layers\": True,\n        \"ffn_multipliers\": (0.5, 4.0),\n        \"qkv_multipliers\": (0.5, 1.0),\n    },\n    \"OpenELM-3B\": {\n        \"num_transformer_layers\": 36,\n        \"model_dim\": 3072,\n        \"head_dim\": 128,\n        \"num_gqa_groups\": 4,\n        \"normalize_qk_projections\": True,\n        \"share_input_output_layers\": True,\n        \"ffn_multipliers\": (0.5, 4.0),\n        \"qkv_multipliers\": (0.5, 1.0),\n    },\n}\n\n\nclass MultiHeadCausalAttention(nn.Module):\n    \"\"\"Multi-head causal attention.\n\n    Args:\n        model_config: Model configuration.\n        layer_idx: Layer index.\n    \"\"\"\n\n    def __init__(self, model_config: GPTConfig, layer_idx: int) -> None:\n        super().__init__()\n        assert (\n            model_config.num_query_heads[layer_idx]\n            % model_config.num_kv_heads[layer_idx]\n            == 0\n        )\n\n        head_dim = model_config.head_dim\n        q_heads = model_config.num_query_heads[layer_idx]\n        k_heads = model_config.num_kv_heads[layer_idx]\n        v_heads = model_config.num_kv_heads[layer_idx]\n\n        self.qkv_proj = nn.Linear(\n            input_dims=model_config.model_dim,\n            output_dims=(q_heads + k_heads + v_heads) * head_dim,\n            bias=False,\n        )\n\n        self.pos_embedding = nn.RoPE(\n            model_config.head_dim, base=model_config.rope_freq_constant\n        )\n\n        if model_config.normalize_qk_projections:\n            self.q_norm = get_normalization_layer(\n                num_features=model_config.head_dim,\n                norm_type=model_config.normalization_layer_name,\n            )\n            self.k_norm = get_normalization_layer(\n                num_features=model_config.head_dim,\n                norm_type=model_config.normalization_layer_name,\n            )\n        else:\n            self.q_norm = None\n            self.k_norm = None\n\n        self.out_proj = nn.Linear(\n            input_dims=q_heads * head_dim,\n            output_dims=model_config.model_dim,\n            bias=False,\n        )\n\n        self.head_dim = model_config.head_dim\n        self.num_q_heads = q_heads\n        self.num_k_heads = k_heads\n        self.num_v_heads = v_heads\n        self.model_dim = model_config.model_dim\n        self.num_groups = self.num_q_heads // self.num_k_heads\n        self.scale = head_dim**-0.5\n\n    def extra_repr(self) -> str:\n        return (\n            super().__repr__()\n            + f\", query_heads={self.num_q_heads}, \"\n            + f\"key_heads={self.num_k_heads}, \"\n            + f\"value_heads={self.num_v_heads}\"\n        )\n\n    def __call__(\n        self,\n        x: mx.array,\n        past_key_value: Optional[Tuple[mx.array, mx.array]] = None,\n        use_kv_cache: bool = False,\n        causal_mask: Optional[mx.array] = None,\n    ) -> Tuple[mx.array, Optional[Tuple[mx.array, mx.array]]]:\n        \"\"\"\n        Forward pass of multi-head self-attention.\n\n        Args:\n            x: Input tensor of the shape [batch size, sequence length, model dimension].\n            past_keys: Tensor storing the cached keys.\n                The shape of tensor is [batch size, number of key heads, sequence length, head dimension].\n            past_values: Tensor storing the cached values. The shape of the tensor is the same as 'past_keys'.\n            use_kv_cache: Cache the output of key and value projection layers for faster inference.\n            is_causal: Specifies whether to apply causal masking in scaled dot-product attention.\n\n        Returns:\n            The output of the same shape as the input, optionally with a tensor containing cached keys and values.\n        \"\"\"\n        batch_size, seq_length, d_model = x.shape\n\n        # [batch_size, seq_length, d_model] --> [batch_size, seq_length,\n        # (num_q_heads + num_k_heads + num_v_heads) * head_dim]\n        qkv = self.qkv_proj(x)\n        # [batch_size, seq_length, (num_q_heads + num_k_heads + num_v_heads) * head_dim] --> [batch_size, seq_length, (num_q_heads + num_k_heads + num_v_heads), head_dim]\n        qkv = qkv.reshape(\n            batch_size,\n            seq_length,\n            self.num_q_heads + self.num_k_heads + self.num_v_heads,\n            self.head_dim,\n        )\n        # [batch_size, seq_length, (num_q_heads + num_k_heads + num_v_heads), head_dim] --> [batch_size, (num_q_heads + num_k_heads + num_v_heads), seq_length, head_dim]\n        qkv = qkv.transpose(0, 2, 1, 3)\n        # [batch_size, (num_q_heads + num_k_heads + num_v_heads), seq_length, head_dim] --> [batch_size, num_q_heads, seq_length, head_dim], [batch_size, num_k_heads, seq_length, head_dim], [batch_size, num_v_heads, seq_length, head_dim]\n        queries, keys, values = qkv.split(\n            [self.num_q_heads, self.num_q_heads + self.num_k_heads], axis=1\n        )\n\n        if self.q_norm is not None:\n            queries = self.q_norm(queries)\n\n        if self.k_norm is not None:\n            keys = self.k_norm(keys)\n\n        if use_kv_cache:\n            if past_key_value is not None:\n                past_keys = past_key_value[0]\n                past_values = past_key_value[1]\n                queries = self.pos_embedding(queries, offset=past_keys.shape[2])\n                keys = self.pos_embedding(keys, offset=past_keys.shape[2])\n                # concatenate past and current keys along the sequence dimension.\n                keys = mx.concatenate([past_keys, keys], axis=2)\n                values = mx.concatenate([past_values, values], axis=2)\n            else:\n                queries = self.pos_embedding(queries)\n                keys = self.pos_embedding(keys)\n\n            past_key_value = (keys, values)\n\n        if self.num_groups != 1:\n            # Group-query attention.\n            # [batch_size, num_k_heads, seq_length, head_dim] --> [batch_size, num_q_heads, seq_length, head_dim]\n            keys = mx.repeat(keys, self.num_groups, axis=1)\n            # [batch_size, num_v_heads, seq_length, head_dim] --> [batch_size, num_q_heads, seq_length, head_dim]\n            values = mx.repeat(values, self.num_groups, axis=1)\n\n        # scaled dot-product attention.\n        # The output of this operation has size of [batch_size, num_q_heads, seq_length, head_dim]\n        attn_output = mx.fast.scaled_dot_product_attention(\n            queries,\n            keys,\n            values,\n            scale=self.scale,\n            mask=causal_mask,\n        )\n        # [batch_size, num_q_heads, seq_length, head_dim] --> [batch_size, seq_length, num_q_heads, head_dim]\n        attn_output = attn_output.transpose(0, 2, 1, 3)\n        # [batch_size, seq_length, num_q_heads, head_dim] --> [batch_size, seq_length, num_q_heads * head_dim]\n        attn_output = attn_output.reshape(\n            batch_size, seq_length, self.num_q_heads * self.head_dim\n        )\n        # [batch_size, seq_length, num_q_heads * head_dim] --> [batch_size, seq_length, d_model]\n        out = self.out_proj(attn_output)\n\n        return out, past_key_value\n\n\nclass FeedForwardNetwork(nn.Module):\n    \"\"\"Feed-forward network.\n\n    Args:\n        opts: Command-line arguments.\n        model_config: Model configuration.\n        layer_idx: Layer index.\n    \"\"\"\n\n    def __init__(self, model_config: GPTConfig, layer_idx: int) -> None:\n        super().__init__()\n        ffn_multiplier = model_config.ffn_multipliers[layer_idx]\n        intermediate_dim = int(\n            make_divisible(\n                ffn_multiplier * model_config.model_dim,\n                divisor=model_config.ffn_dim_divisor,\n            )\n        )\n        if model_config.ffn_with_glu:\n            # FFN with Gated linear unit\n            self.proj_1 = nn.Linear(\n                input_dims=model_config.model_dim,\n                output_dims=2 * intermediate_dim,\n                bias=False,\n            )\n            self.proj_2 = nn.Linear(\n                input_dims=intermediate_dim,\n                output_dims=model_config.model_dim,\n                bias=False,\n            )\n            self.ffn_with_glu = True\n        else:\n            # Standard FFN, as described in https://arxiv.org/abs/1706.03762\n            self.proj_1 = nn.Linear(\n                input_dims=model_config.model_dim,\n                output_dims=intermediate_dim,\n                bias=False,\n            )\n            self.proj_2 = nn.Linear(\n                input_dims=intermediate_dim,\n                output_dims=model_config.model_dim,\n                bias=False,\n            )\n            self.ffn_with_glu = False\n\n        assert (\n            model_config.activation_fn_name == \"swish\"\n        ), model_config.activation_fn_name\n        self.act = nn.SiLU()  # AKA Swish.\n\n    def extra_repr(self) -> str:\n        return super().__repr__() + f\"(ffn_with_glu) : {self.ffn_with_glu}\"\n\n    def __call__(self, x):\n        \"\"\"Forward function of FFN layer.\n\n        Args:\n            x: Input tensor of the shape [batch size, sequence length, model dimension].\n\n        Returns:\n            A tensor of the same shape as the input.\n        \"\"\"\n        if self.ffn_with_glu:\n            y_12 = self.proj_1(x)\n            y_1, y_2 = y_12.split(2, axis=-1)\n            y = self.act(y_1) * y_2\n            return self.proj_2(y)\n        else:\n            return self.proj_2(self.act(self.proj_1(x)))\n\n\nclass TransformerDecoderLayer(nn.Module):\n    \"\"\"Transformer decoder layer.\n\n    Args:\n        opts: Command-line arguments.\n        model_config: Model configuration.\n        layer_idx: Layer index.\n    \"\"\"\n\n    def __init__(self, model_config: GPTConfig, layer_idx: int) -> None:\n        super().__init__()\n        self.attn_norm = get_normalization_layer(\n            num_features=model_config.model_dim,\n            norm_type=model_config.normalization_layer_name,\n        )\n        self.attn = MultiHeadCausalAttention(\n            model_config=model_config, layer_idx=layer_idx\n        )\n        self.ffn_norm = get_normalization_layer(\n            num_features=model_config.model_dim,\n            norm_type=model_config.normalization_layer_name,\n        )\n        self.ffn = FeedForwardNetwork(model_config=model_config, layer_idx=layer_idx)\n\n    def __call__(\n        self,\n        x: mx.array,\n        past_key_value: Optional[mx.array] = None,\n        use_kv_cache: bool = False,\n        causal_mask: Optional[mx.array] = None,\n    ) -> Tuple[mx.array, Optional[mx.array]]:\n        \"\"\"\n        Forward pass of decoder layer.\n\n        Args:\n            x: Input tensor of the shape [batch size, sequence length, model dimension].\n            past_keys: Tensor storing the cached keys.\n                The shape of tensor is [batch size, number of key heads, sequence length, head dimension].\n            past_values: Tensor storing the cached values. The shape of the tensor is the same as 'past_keys'.\n            use_kv_cache: Cache the output of key and value projection layers for faster inference.\n            is_causal: Specifies whether to apply causal masking in scaled dot-product attention.\n\n        Returns:\n            The output of the same shape as the input, optionally with a tensor containing cached keys and values.\n        \"\"\"\n        # Pre-norm attention.\n        y_attn = self.attn_norm(x)\n        y_attn, past_key_value = self.attn(\n            y_attn, past_key_value, use_kv_cache, causal_mask\n        )\n        y_attn = x + y_attn\n\n        # Pre-norm FFN.\n        y_ffn = y_attn + self.ffn(self.ffn_norm(y_attn))\n        return y_ffn, past_key_value\n\n\nclass OpenELM(nn.Module):\n    \"\"\"General GPT model.\n\n    Args:\n        model_name: name key for the predefined configuration\n        vocab_size: the size of the input token embedding table\n        max_context_length: max context length this model will be able to process\n\n    Returns:\n        None\n    \"\"\"\n\n    def __init__(\n        self,\n        model_name: str,\n        vocab_size: int,\n        max_context_length: int,\n    ) -> None:\n        super().__init__()\n        model_config = GPTConfig.from_name(\n            model_name=model_name,\n            vocab_size=vocab_size,\n            max_context_length=max_context_length,\n        )\n\n        self.token_embeddings = nn.Embedding(\n            num_embeddings=model_config.vocab_size,\n            dims=model_config.model_dim,\n        )\n\n        self.layers = [\n            TransformerDecoderLayer(model_config=model_config, layer_idx=layer_idx)\n            for layer_idx in range(model_config.num_transformer_layers)\n        ]\n        self.norm = get_normalization_layer(\n            num_features=model_config.model_dim,\n            norm_type=model_config.normalization_layer_name,\n        )\n        if model_config.share_input_output_layers:\n            self.classifier = None\n        else:\n            self.classifier = nn.Linear(\n                input_dims=model_config.model_dim,\n                output_dims=model_config.vocab_size,\n                bias=False,\n            )\n        self.reset_parameters(model_config=model_config)\n        self.num_transformer_layers = model_config.num_transformer_layers\n\n    def __call__(\n        self, model_input: Union[mx.array, Dict[str, Any]]\n    ) -> Union[mx.array, Dict[str, mx.array]]:\n        if isinstance(model_input, dict):\n            assert {\n                \"input_ids\",\n                \"past_key_values\",\n                \"use_kv_cache\",\n                \"is_causal\",\n            }.issubset(model_input.keys())\n            input_ids = model_input[\"input_ids\"]\n            past_key_values = model_input[\"past_key_values\"]\n            use_kv_cache = model_input[\"use_kv_cache\"]\n            is_causal = model_input[\"is_causal\"]\n            if past_key_values is None:\n                past_key_values = [None] * self.num_transformer_layers\n        elif isinstance(model_input, mx.array):\n            input_ids = model_input\n            past_key_values = [None] * self.num_transformer_layers\n            use_kv_cache = False\n            is_causal = True\n        else:\n            raise NotImplementedError(\n                \"Supported input types are either mx.array or Dictionary. \"\n                f\"Got: {type(model_input)}.\"\n            )\n\n        x = self.token_embeddings(input_ids)\n\n        causal_mask = None\n        seq_length = x.shape[1]\n        if is_causal and seq_length > 1:\n            causal_mask = nn.MultiHeadAttention.create_additive_causal_mask(seq_length)\n            causal_mask = causal_mask.astype(x.dtype)\n\n        for layer_idx in range(self.num_transformer_layers):\n            x, past_key_values[layer_idx] = self.layers[layer_idx](\n                x, past_key_values[layer_idx], use_kv_cache, causal_mask\n            )\n\n        x = self.norm(x)\n        if self.classifier is None:\n            logits = mx.matmul(x, self.token_embeddings.weight.transpose())\n        else:\n            logits = self.classifier(x)\n\n        if use_kv_cache:\n            return {\"logits\": logits, \"past_key_values\": past_key_values}\n        else:\n            return logits\n\n    def reset_parameters(self, model_config: GPTConfig) -> None:\n        \"\"\"Initialize the layers in Language Model\n\n        The initialization scheme is followed, following `OPT\n        <https://arxiv.org/pdf/2205.01068.pdf>`_.\n\n        Returns:\n            None\n        \"\"\"\n\n        def name_filter(value_name: str) -> Callable[[Any, str, Any], bool]:\n            def filter(layer: nn.Module, name: str, val: mx.array) -> bool:\n                return name == value_name\n\n            return filter\n\n        model_dim = model_config.model_dim\n        for module in self.modules():\n            if isinstance(module, (nn.Linear)):\n                std = module.weight.shape[0] ** -0.5\n                module.apply(nn.init.normal(std=std), filter_fn=name_filter(\"weight\"))\n                module.apply(nn.init.constant(0.0), filter_fn=name_filter(\"bias\"))\n            elif isinstance(module, (nn.Embedding)):\n                std = model_dim**-0.5\n                module.apply(nn.init.normal(std), filter_fn=name_filter(\"weight\"))\n            elif isinstance(module, (nn.RMSNorm, nn.LayerNorm)):\n                module.apply(nn.init.constant(1.0), filter_fn=name_filter(\"weight\"))\n                module.apply(nn.init.constant(0.0), filter_fn=name_filter(\"bias\"))\n\n        n_layers = model_config.num_transformer_layers\n        std = (model_dim**-0.5) * ((2 * n_layers) ** -0.5)\n        proj_init_fn = nn.init.normal(std=std)\n        updates = []\n        for param_name, param in mlx.utils.tree_flatten(self.parameters()):\n            if param_name.endswith(\"out_proj.weight\") or param_name.endswith(\n                \"ffn.proj_2.weight\"\n            ):\n                updates.append((param_name, proj_init_fn(param)))\n        self.update(mlx.utils.tree_unflatten(updates))\n\n\ndef load_model(\n    model_dir: pathlib.Path,\n) -> Tuple[OpenELM, sentencepiece.SentencePieceProcessor]:\n    assert model_dir.is_dir(), f\"{model_dir} must be a directory.\"\n    weights_path = model_dir / \"weights.safetensors\"\n    config_path = model_dir / \"config.json\"\n\n    # Load tokenizer.\n    tokenizer_path = model_dir / \"tokenizer.model\"\n    if not tokenizer_path.is_file():\n        raise ValueError(\n            f\"Tokenizer model not found at {tokenizer_path}. Please copy \"\n            \"the LLaMA tokenizer.model file into the model directory.\"\n        )\n    tokenizer = sentencepiece.SentencePieceProcessor(model_file=str(tokenizer_path))\n\n    # Load the model.\n    with config_path.open(\"r\") as f:\n        config = json.load(f)\n    quantization = config.pop(\"quantization\", None)\n    model = OpenELM(**config)\n    if quantization is not None:\n        # Quanitzation is not backwards compatible in 0.11.0.\n        assert (\n            mx.__version__ == \"0.10.0\"\n        ), f\"Quantization support requires version 0.10.0. You have {mx.__version__}.\"\n        nn.QuantizedLinear.quantize_module(model, **quantization)\n    with weights_path.open(\"rb\") as f:\n        model_state = mx.load(f)\n    model_state = mlx.utils.tree_unflatten(list(model_state.items()))\n    model.update(model_state)\n    mx.eval(model.parameters())\n\n    return model, tokenizer\n"
  },
  {
    "path": "mlx_examples/requirements.txt",
    "content": "mlx==0.10.0 ; sys_platform == 'darwin'\nsentencepiece==0.2.0\nsafetensors==0.4.2\n"
  },
  {
    "path": "projects/byteformer/README.md",
    "content": "# Bytes Are All You Need: Transformers Operating Directly On File Bytes\n\n[ByteFormer](https://arxiv.org/abs/2306.00238) is a Transformer architecture able to perform inference directly on file bytes. It achieves accuracy greater than traditional image transformers at similar parameter settings (77.33% on ImageNet, compared to 72.2% for the original [DeiT-Ti](https://arxiv.org/pdf/2012.12877.pdf)), without the need for any inference-time image decoding. As our network only consumes bytes, we experiment with different image encodings and different modalities. Without modifying architecture or training hyperparameters, it can achieve competitive performance on Speech Commands v2 (95.42%, compared to state-of-the-art accuracy of 98.7%). We also experiment with obfuscated inputs to our network, to enhance privacy at inference time. See our paper for details.\n\n<p align=\"center\">\n<img src=\"model_arch.png\" width=\"50%\" align=\"center\">\n</p>\n\n## Training and Evaluation\n\nTraining occurred on single node machines with 8 A100 GPUs (for ImageNet) or 4 A100 GPUs (for Speech Commands V2). Training can be done with the configs in subdirectories of the folder in which this README is found. Training uses the following command:\n\n```corenet-train --common.config-file $CONFIG_FILE```\n\nEvaluation can be done using the below example command:\n\n```bash\nexport CFG_FILE=projects/byteformer/imagenet_file_encodings/encoding_type=TIFF.yaml\nexport MODEL_WEIGHTS=https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/multimodal_classification/imagenet_tiff.pt\nexport DATASET_PATH=/mnt/vision_datasets/imagenet/validation/\n\nCUDA_VISIBLE_DEVICES=0 corenet-eval --common.config-file $CFG_FILE --model.classification.pretrained $MODEL_WEIGHTS --common.override-kwargs dataset.root_val=$DATASET_PATH\n```\n\n\nEach subdirectory corresponds to the experiments in a different table in our paper.\n\n- `imagenet_file_encodings/` contains experiments using TIFF or other encodings.\n- `imagenet_jpeg_q100/` contains experiments using JPEG quality factor of 100.\n- `imagenet_jpeg_q60/` contains experiments using JPEG quality factor of 60.\n- `imagenet_jpeg_shuffle_bytes/` contains ablations that shuffle the byte order.\n- `imagenet_obfuscation/` contains experiments swapping byte values (see paper for details).\n- `imagenet_privacy_preserving_camera/` contains experiments that mask pixel values.\n- `speech_commands_mp3/` contains audio classification experiments on Speech Commands v2 using MP3 files.\n- `speech_commands_wav/` contains audio classification experiments on Speech Commands v2 using WAV files.\n\n***Note on reproducing FLOPs/Model Size Estimates***: By default, the embedding sizes (set by `--model.classification.byteformer.max-num-tokens`) set in the configs are larger than necessary, to allow experimentation without having to change the value (e.g. if the kernel size of the Conv1D is lowered, which would result in longer token lengths input to the Transformer backbone). When estimating performance in our paper, we set this value to the average token length (after BF-Ti's Conv1D downsampling) for the given input type (TIFF images, JPEG images, etc.). However, if the values are set to the average input length during training, an error will occur in the case of variable-length inputs (such as JPEG), because an input longer than the `max-num-tokens` will inevitably occur.  Similarly, `--model.classification.byteformer.dummy-input-token-length` should be set to your expected input length (before BF-Ti's Conv1D downsampling) for your particular input domain, for accurate performance estimates.\n\n## Pre-Trained Models\n\n| Dataset                              | Task                 | Top-1 | Config                                                                                               | Weights                                                                                                                                                                                | \n|--------------------------------------|----------------------|-------|------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| ImageNet             | Image Classification | 77.05 | [IN TIFF](imagenet_file_encodings/encoding_type=TIFF.yaml)                                      | [IN TIFF](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/multimodal_classification/imagenet_tiff.pt)                                              | \n| ImageNet             | Image Classification | 67.64 | [IN JPEG Q100 k=8 w=128](imagenet_jpeg_q100/conv_kernel_size=8.yaml)                                 | [IN JPEG Q100 k=8 w=128](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/multimodal_classification/imagenet_jpeg_q100_k8_w128.pt)                                 | \n| ImageNet             | Image Classification | 62.43 | [IN JPEG Q60 k=4 w=128](imagenet_jpeg_q60/conv_kernel_size=4,window_sizes=[128].yaml)                | [IN JPEG Q60 k=4 w=128](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/multimodal_classification/imagenet_jpeg_q60_k4_w128.pt)                                   | \n| ImageNet (Shuffle Bytes)             | Image Classification | 61.14 | [IN Shuffle Bytes Reverse](imagenet_jpeg_shuffle_bytes/mode=reverse.yaml)                            | [IN Shuffle Bytes Reverse](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/multimodal_classification/imagenet_shuffle_bytes_reverse.pt) | \n| ImageNet (Obfuscation)               | Image Classification | 76.00 | [IN Random Uniform [-20, 20]](imagenet_obfuscation/width_range=[-20,20].yaml)                        | [IN Random Uniform [-20, 20]](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/multimodal_classification/imagenet_obfuscation.pt)                                  | \n| ImageNet (Privacy Preserving Camera) | Image Classification | 68.10 | [IN k=4 keep_pixels=0.05](imagenet_privacy_preserving_camera/keep_frac=0.05,conv_kernel_size=4.yaml) | [IN k=4 keep_pixels=0.05](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/multimodal_classification/imagenet_privacy_preserving_camera_k4_f0.05.pt)               |\n| Speech Commands v2 12-Way            | Audio Classification | 94.95 | [SC WAV FP32 k=32 w=128](speech_commands_wav/encoding_dtype=float32,conv_kernel_size=32.yaml)        | [SC WAV FP32 k=32 w=128](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/multimodal_classification/speech_commands_wav.pt)                                        | \n| Speech Commands v2 12-Way            | Audio Classification | 90.25 | [SC MP3 k=4 w=32](speech_commands_mp3/conv_kernel_size=4,window_size=[32].yaml)                      | [SC MP3 k=4 w=32](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/multimodal_classification/speech_commands_mp3_k4_w32.pt)                                        | \n\n***Note on model sizes***: As described in the above note on reproducing estimates of FLOPs and model sizes, the above checkpoints include larger embeddings than necessary to facilitate easier experimentation without repeated config changes. See the above note for more details.\n\n## Citation\n\nIf you find our work useful, please cite:\n\n```BibTeX\n@article{Horton2023BytesAA,\n  title={Bytes Are All You Need: Transformers Operating Directly On File Bytes},\n  author={Maxwell Horton and Sachin Mehta and Ali Farhadi and Mohammad Rastegari},\n  journal={ArXiv},\n  year={2023},\n  volume={abs/2306.00238}\n}\n\n@inproceedings{mehta2022cvnets, \n     author = {Mehta, Sachin and Abdolhosseini, Farzad and Rastegari, Mohammad}, \n     title = {CVNets: High Performance Library for Computer Vision}, \n     year = {2022}, \n     booktitle = {Proceedings of the 30th ACM International Conference on Multimedia}, \n     series = {MM '22} \n}\n```\n"
  },
  {
    "path": "projects/byteformer/imagenet_file_encodings/encoding_type=PNG.yaml",
    "content": "# pytest: disable\ncommon:\n  run_label: train\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\n  tensorboard_logging: false\n  accum_freq: 2\ndataset:\n  root_train: /mnt/imagenet/training\n  root_val: /mnt/imagenet/validation\n  name: imagenet\n  category: classification\n  train_batch_size0: 48\n  val_batch_size0: 48\n  eval_batch_size0: 48\n  workers: 10\n  persistent_workers: false\n  pin_memory: true\n  collate_fn_name_train: byteformer_image_collate_fn\n  collate_fn_name_val: byteformer_image_collate_fn\n  collate_fn_name_test: byteformer_image_collate_fn\nimage_augmentation:\n  random_resized_crop:\n    enable: true\n    interpolation: bicubic\n  resize:\n    enable: true\n    size: 256\n    interpolation: bicubic\n  center_crop:\n    enable: true\n    size: 224\n  random_horizontal_flip:\n    enable: true\n  rand_augment:\n    enable: true\n  random_erase:\n    enable: true\n    p: 0.25\n  mixup:\n    enable: false\n  cutmix:\n    enable: false\n  pil_save:\n    enable: true\n    file_encoding: PNG\nsampler:\n  name: batch_sampler\n  bs:\n    crop_size_width: 224\n    crop_size_height: 224\nloss:\n  category: classification\n  classification:\n    name: cross_entropy\n    cross_entropy:\n      label_smoothing: 0.1\noptim:\n  name: adamw\n  weight_decay: 0.05\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.999\nscheduler:\n  name: cosine\n  is_iteration_based: false\n  max_epochs: 300\n  warmup_iterations: 7500\n  warmup_init_lr: 1.0e-06\n  cosine:\n    max_lr: 0.001\n    min_lr: 2.0e-05\nmodel:\n  classification:\n    name: byteformer\n    n_classes: 1000\n    byteformer:\n      mode: tiny\n      max_num_tokens: 50000\n      conv_kernel_size: 32\n      window_sizes:\n      - 128\n  activation:\n    name: gelu\n  layer:\n    global_pool: mean\n    conv_init: kaiming_uniform\n    linear_init: trunc_normal\n    linear_init_std_dev: 0.02\nema:\n  enable: true\n  momentum: 0.0001\nstats:\n  val:\n  - loss\n  - top1\n  - top5\n  train:\n  - loss\n  checkpoint_metric: top1\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "projects/byteformer/imagenet_file_encodings/encoding_type=TIFF.yaml",
    "content": "common:\n  run_label: train\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\n  tensorboard_logging: false\n  accum_freq: 2\ndataset:\n  root_train: /mnt/imagenet/training\n  root_val: /mnt/imagenet/validation\n  name: imagenet\n  category: classification\n  train_batch_size0: 48\n  val_batch_size0: 48\n  eval_batch_size0: 48\n  workers: 10\n  persistent_workers: false\n  pin_memory: true\n  collate_fn_name_train: byteformer_image_collate_fn\n  collate_fn_name_val: byteformer_image_collate_fn\n  collate_fn_name_test: byteformer_image_collate_fn\nimage_augmentation:\n  random_resized_crop:\n    enable: true\n    interpolation: bicubic\n  resize:\n    enable: true\n    size: 256\n    interpolation: bicubic\n  center_crop:\n    enable: true\n    size: 224\n  random_horizontal_flip:\n    enable: true\n  rand_augment:\n    enable: true\n  random_erase:\n    enable: true\n    p: 0.25\n  mixup:\n    enable: false\n  cutmix:\n    enable: false\n  pil_save:\n    enable: true\n    file_encoding: TIFF\nsampler:\n  name: batch_sampler\n  bs:\n    crop_size_width: 224\n    crop_size_height: 224\nloss:\n  category: classification\n  classification:\n    name: cross_entropy\n    cross_entropy:\n      label_smoothing: 0.1\noptim:\n  name: adamw\n  weight_decay: 0.05\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.999\nscheduler:\n  name: cosine\n  is_iteration_based: false\n  max_epochs: 300\n  warmup_iterations: 7500\n  warmup_init_lr: 1.0e-06\n  cosine:\n    max_lr: 0.001\n    min_lr: 2.0e-05\nmodel:\n  classification:\n    name: byteformer\n    n_classes: 1000\n    byteformer:\n      mode: tiny\n      max_num_tokens: 50000\n      conv_kernel_size: 32\n      window_sizes:\n      - 128\n  activation:\n    name: gelu\n  layer:\n    global_pool: mean\n    conv_init: kaiming_uniform\n    linear_init: trunc_normal\n    linear_init_std_dev: 0.02\nema:\n  enable: true\n  momentum: 0.0001\nstats:\n  val:\n  - loss\n  - top1\n  - top5\n  train:\n  - loss\n  checkpoint_metric: top1\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "projects/byteformer/imagenet_file_encodings/encoding_type=fCHW.yaml",
    "content": "# pytest: disable\ncommon:\n  run_label: train\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\n  tensorboard_logging: false\n  accum_freq: 2\ndataset:\n  root_train: /mnt/imagenet/training\n  root_val: /mnt/imagenet/validation\n  name: imagenet\n  category: classification\n  train_batch_size0: 48\n  val_batch_size0: 48\n  eval_batch_size0: 48\n  workers: 10\n  persistent_workers: false\n  pin_memory: true\n  collate_fn_name_train: byteformer_image_collate_fn\n  collate_fn_name_val: byteformer_image_collate_fn\n  collate_fn_name_test: byteformer_image_collate_fn\nimage_augmentation:\n  random_resized_crop:\n    enable: true\n    interpolation: bicubic\n  resize:\n    enable: true\n    size: 256\n    interpolation: bicubic\n  center_crop:\n    enable: true\n    size: 224\n  random_horizontal_flip:\n    enable: true\n  rand_augment:\n    enable: true\n  random_erase:\n    enable: true\n    p: 0.25\n  mixup:\n    enable: false\n  cutmix:\n    enable: false\n  pil_save:\n    enable: true\n    file_encoding: fCHW\nsampler:\n  name: batch_sampler\n  bs:\n    crop_size_width: 224\n    crop_size_height: 224\nloss:\n  category: classification\n  classification:\n    name: cross_entropy\n    cross_entropy:\n      label_smoothing: 0.1\noptim:\n  name: adamw\n  weight_decay: 0.05\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.999\nscheduler:\n  name: cosine\n  is_iteration_based: false\n  max_epochs: 300\n  warmup_iterations: 7500\n  warmup_init_lr: 1.0e-06\n  cosine:\n    max_lr: 0.001\n    min_lr: 2.0e-05\nmodel:\n  classification:\n    name: byteformer\n    n_classes: 1000\n    byteformer:\n      mode: tiny\n      max_num_tokens: 50000\n      conv_kernel_size: 32\n      window_sizes:\n      - 128\n  activation:\n    name: gelu\n  layer:\n    global_pool: mean\n    conv_init: kaiming_uniform\n    linear_init: trunc_normal\n    linear_init_std_dev: 0.02\nema:\n  enable: true\n  momentum: 0.0001\nstats:\n  val:\n  - loss\n  - top1\n  - top5\n  train:\n  - loss\n  checkpoint_metric: top1\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "projects/byteformer/imagenet_file_encodings/encoding_type=fHWC.yaml",
    "content": "# pytest: disable\ncommon:\n  run_label: train\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\n  tensorboard_logging: false\n  accum_freq: 2\ndataset:\n  root_train: /mnt/imagenet/training\n  root_val: /mnt/imagenet/validation\n  name: imagenet\n  category: classification\n  train_batch_size0: 48\n  val_batch_size0: 48\n  eval_batch_size0: 48\n  workers: 10\n  persistent_workers: false\n  pin_memory: true\n  collate_fn_name_train: byteformer_image_collate_fn\n  collate_fn_name_val: byteformer_image_collate_fn\n  collate_fn_name_test: byteformer_image_collate_fn\nimage_augmentation:\n  random_resized_crop:\n    enable: true\n    interpolation: bicubic\n  resize:\n    enable: true\n    size: 256\n    interpolation: bicubic\n  center_crop:\n    enable: true\n    size: 224\n  random_horizontal_flip:\n    enable: true\n  rand_augment:\n    enable: true\n  random_erase:\n    enable: true\n    p: 0.25\n  mixup:\n    enable: false\n  cutmix:\n    enable: false\n  pil_save:\n    enable: true\n    file_encoding: fHWC\nsampler:\n  name: batch_sampler\n  bs:\n    crop_size_width: 224\n    crop_size_height: 224\nloss:\n  category: classification\n  classification:\n    name: cross_entropy\n    cross_entropy:\n      label_smoothing: 0.1\noptim:\n  name: adamw\n  weight_decay: 0.05\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.999\nscheduler:\n  name: cosine\n  is_iteration_based: false\n  max_epochs: 300\n  warmup_iterations: 7500\n  warmup_init_lr: 1.0e-06\n  cosine:\n    max_lr: 0.001\n    min_lr: 2.0e-05\nmodel:\n  classification:\n    name: byteformer\n    n_classes: 1000\n    byteformer:\n      mode: tiny\n      max_num_tokens: 50000\n      conv_kernel_size: 32\n      window_sizes:\n      - 128\n  activation:\n    name: gelu\n  layer:\n    global_pool: mean\n    conv_init: kaiming_uniform\n    linear_init: trunc_normal\n    linear_init_std_dev: 0.02\nema:\n  enable: true\n  momentum: 0.0001\nstats:\n  val:\n  - loss\n  - top1\n  - top5\n  train:\n  - loss\n  checkpoint_metric: top1\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "projects/byteformer/imagenet_jpeg_q100/conv_kernel_size=16.yaml",
    "content": "# pytest: disable\ncommon:\n  run_label: train\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\n  tensorboard_logging: false\n  accum_freq: 2\ndataset:\n  root_train: /mnt/imagenet/training\n  root_val: /mnt/imagenet/validation\n  name: imagenet\n  category: classification\n  train_batch_size0: 48\n  val_batch_size0: 48\n  eval_batch_size0: 48\n  workers: 10\n  persistent_workers: false\n  pin_memory: true\n  collate_fn_name_train: byteformer_image_collate_fn\n  collate_fn_name_val: byteformer_image_collate_fn\n  collate_fn_name_test: byteformer_image_collate_fn\nimage_augmentation:\n  random_resized_crop:\n    enable: true\n    interpolation: bicubic\n  resize:\n    enable: true\n    size: 256\n    interpolation: bicubic\n  center_crop:\n    enable: true\n    size: 224\n  random_horizontal_flip:\n    enable: true\n  rand_augment:\n    enable: true\n  random_erase:\n    enable: true\n    p: 0.25\n  mixup:\n    enable: false\n  cutmix:\n    enable: false\n  pil_save:\n    enable: true\n    file_encoding: JPEG\n    quality: 100\nsampler:\n  name: batch_sampler\n  bs:\n    crop_size_width: 224\n    crop_size_height: 224\nloss:\n  category: classification\n  classification:\n    name: cross_entropy\n    cross_entropy:\n      label_smoothing: 0.1\noptim:\n  name: adamw\n  weight_decay: 0.05\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.999\nscheduler:\n  name: cosine\n  is_iteration_based: false\n  max_epochs: 300\n  warmup_iterations: 7500\n  warmup_init_lr: 1.0e-06\n  cosine:\n    max_lr: 0.001\n    min_lr: 2.0e-05\nmodel:\n  classification:\n    name: byteformer\n    n_classes: 1000\n    byteformer:\n      mode: tiny\n      max_num_tokens: 50000\n      conv_kernel_size: 16\n      window_sizes:\n      - 128\n  activation:\n    name: gelu\n  layer:\n    global_pool: mean\n    conv_init: kaiming_uniform\n    linear_init: trunc_normal\n    linear_init_std_dev: 0.02\nema:\n  enable: true\n  momentum: 0.0001\nstats:\n  val:\n  - loss\n  - top1\n  - top5\n  train:\n  - loss\n  checkpoint_metric: top1\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "projects/byteformer/imagenet_jpeg_q100/conv_kernel_size=32.yaml",
    "content": "# pytest: disable\ncommon:\n  run_label: train\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\n  tensorboard_logging: false\n  accum_freq: 2\ndataset:\n  root_train: /mnt/imagenet/training\n  root_val: /mnt/imagenet/validation\n  name: imagenet\n  category: classification\n  train_batch_size0: 48\n  val_batch_size0: 48\n  eval_batch_size0: 48\n  workers: 10\n  persistent_workers: false\n  pin_memory: true\n  collate_fn_name_train: byteformer_image_collate_fn\n  collate_fn_name_val: byteformer_image_collate_fn\n  collate_fn_name_test: byteformer_image_collate_fn\nimage_augmentation:\n  random_resized_crop:\n    enable: true\n    interpolation: bicubic\n  resize:\n    enable: true\n    size: 256\n    interpolation: bicubic\n  center_crop:\n    enable: true\n    size: 224\n  random_horizontal_flip:\n    enable: true\n  rand_augment:\n    enable: true\n  random_erase:\n    enable: true\n    p: 0.25\n  mixup:\n    enable: false\n  cutmix:\n    enable: false\n  pil_save:\n    enable: true\n    file_encoding: JPEG\n    quality: 100\nsampler:\n  name: batch_sampler\n  bs:\n    crop_size_width: 224\n    crop_size_height: 224\nloss:\n  category: classification\n  classification:\n    name: cross_entropy\n    cross_entropy:\n      label_smoothing: 0.1\noptim:\n  name: adamw\n  weight_decay: 0.05\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.999\nscheduler:\n  name: cosine\n  is_iteration_based: false\n  max_epochs: 300\n  warmup_iterations: 7500\n  warmup_init_lr: 1.0e-06\n  cosine:\n    max_lr: 0.001\n    min_lr: 2.0e-05\nmodel:\n  classification:\n    name: byteformer\n    n_classes: 1000\n    byteformer:\n      mode: tiny\n      max_num_tokens: 50000\n      conv_kernel_size: 32\n      window_sizes:\n      - 128\n  activation:\n    name: gelu\n  layer:\n    global_pool: mean\n    conv_init: kaiming_uniform\n    linear_init: trunc_normal\n    linear_init_std_dev: 0.02\nema:\n  enable: true\n  momentum: 0.0001\nstats:\n  val:\n  - loss\n  - top1\n  - top5\n  train:\n  - loss\n  checkpoint_metric: top1\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "projects/byteformer/imagenet_jpeg_q100/conv_kernel_size=8.yaml",
    "content": "common:\n  run_label: train\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\n  tensorboard_logging: false\n  accum_freq: 2\ndataset:\n  root_train: /mnt/imagenet/training\n  root_val: /mnt/imagenet/validation\n  name: imagenet\n  category: classification\n  train_batch_size0: 48\n  val_batch_size0: 48\n  eval_batch_size0: 48\n  workers: 10\n  persistent_workers: false\n  pin_memory: true\n  collate_fn_name_train: byteformer_image_collate_fn\n  collate_fn_name_val: byteformer_image_collate_fn\n  collate_fn_name_test: byteformer_image_collate_fn\nimage_augmentation:\n  random_resized_crop:\n    enable: true\n    interpolation: bicubic\n  resize:\n    enable: true\n    size: 256\n    interpolation: bicubic\n  center_crop:\n    enable: true\n    size: 224\n  random_horizontal_flip:\n    enable: true\n  rand_augment:\n    enable: true\n  random_erase:\n    enable: true\n    p: 0.25\n  mixup:\n    enable: false\n  cutmix:\n    enable: false\n  pil_save:\n    enable: true\n    file_encoding: JPEG\n    quality: 100\nsampler:\n  name: batch_sampler\n  bs:\n    crop_size_width: 224\n    crop_size_height: 224\nloss:\n  category: classification\n  classification:\n    name: cross_entropy\n    cross_entropy:\n      label_smoothing: 0.1\noptim:\n  name: adamw\n  weight_decay: 0.05\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.999\nscheduler:\n  name: cosine\n  is_iteration_based: false\n  max_epochs: 300\n  warmup_iterations: 7500\n  warmup_init_lr: 1.0e-06\n  cosine:\n    max_lr: 0.001\n    min_lr: 2.0e-05\nmodel:\n  classification:\n    name: byteformer\n    n_classes: 1000\n    byteformer:\n      mode: tiny\n      max_num_tokens: 50000\n      conv_kernel_size: 8\n      window_sizes:\n      - 128\n  activation:\n    name: gelu\n  layer:\n    global_pool: mean\n    conv_init: kaiming_uniform\n    linear_init: trunc_normal\n    linear_init_std_dev: 0.02\nema:\n  enable: true\n  momentum: 0.0001\nstats:\n  val:\n  - loss\n  - top1\n  - top5\n  train:\n  - loss\n  checkpoint_metric: top1\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "projects/byteformer/imagenet_jpeg_q60/conv_kernel_size=16,window_sizes=[128].yaml",
    "content": "# pytest: disable\ncommon:\n  run_label: train\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\n  tensorboard_logging: false\n  accum_freq: 2\ndataset:\n  root_train: /mnt/imagenet/training\n  root_val: /mnt/imagenet/validation\n  name: imagenet\n  category: classification\n  train_batch_size0: 48\n  val_batch_size0: 48\n  eval_batch_size0: 48\n  workers: 10\n  persistent_workers: false\n  pin_memory: true\n  collate_fn_name_train: byteformer_image_collate_fn\n  collate_fn_name_val: byteformer_image_collate_fn\n  collate_fn_name_test: byteformer_image_collate_fn\nimage_augmentation:\n  random_resized_crop:\n    enable: true\n    interpolation: bicubic\n  resize:\n    enable: true\n    size: 256\n    interpolation: bicubic\n  center_crop:\n    enable: true\n    size: 224\n  random_horizontal_flip:\n    enable: true\n  rand_augment:\n    enable: true\n  random_erase:\n    enable: true\n    p: 0.25\n  mixup:\n    enable: false\n  cutmix:\n    enable: false\n  pil_save:\n    enable: true\n    file_encoding: JPEG\n    quality: 60\nsampler:\n  name: batch_sampler\n  bs:\n    crop_size_width: 224\n    crop_size_height: 224\nloss:\n  category: classification\n  classification:\n    name: cross_entropy\n    cross_entropy:\n      label_smoothing: 0.1\noptim:\n  name: adamw\n  weight_decay: 0.05\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.999\nscheduler:\n  name: cosine\n  is_iteration_based: false\n  max_epochs: 300\n  warmup_iterations: 7500\n  warmup_init_lr: 1.0e-06\n  cosine:\n    max_lr: 0.001\n    min_lr: 2.0e-05\nmodel:\n  classification:\n    name: byteformer\n    n_classes: 1000\n    byteformer:\n      mode: tiny\n      max_num_tokens: 50000\n      conv_kernel_size: 16\n      window_sizes:\n      - 128\n  activation:\n    name: gelu\n  layer:\n    global_pool: mean\n    conv_init: kaiming_uniform\n    linear_init: trunc_normal\n    linear_init_std_dev: 0.02\nema:\n  enable: true\n  momentum: 0.0001\nstats:\n  val:\n  - loss\n  - top1\n  - top5\n  train:\n  - loss\n  checkpoint_metric: top1\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "projects/byteformer/imagenet_jpeg_q60/conv_kernel_size=16,window_sizes=[32].yaml",
    "content": "# pytest: disable\ncommon:\n  run_label: train\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\n  tensorboard_logging: false\n  accum_freq: 2\ndataset:\n  root_train: /mnt/imagenet/training\n  root_val: /mnt/imagenet/validation\n  name: imagenet\n  category: classification\n  train_batch_size0: 48\n  val_batch_size0: 48\n  eval_batch_size0: 48\n  workers: 10\n  persistent_workers: false\n  pin_memory: true\n  collate_fn_name_train: byteformer_image_collate_fn\n  collate_fn_name_val: byteformer_image_collate_fn\n  collate_fn_name_test: byteformer_image_collate_fn\nimage_augmentation:\n  random_resized_crop:\n    enable: true\n    interpolation: bicubic\n  resize:\n    enable: true\n    size: 256\n    interpolation: bicubic\n  center_crop:\n    enable: true\n    size: 224\n  random_horizontal_flip:\n    enable: true\n  rand_augment:\n    enable: true\n  random_erase:\n    enable: true\n    p: 0.25\n  mixup:\n    enable: false\n  cutmix:\n    enable: false\n  pil_save:\n    enable: true\n    file_encoding: JPEG\n    quality: 60\nsampler:\n  name: batch_sampler\n  bs:\n    crop_size_width: 224\n    crop_size_height: 224\nloss:\n  category: classification\n  classification:\n    name: cross_entropy\n    cross_entropy:\n      label_smoothing: 0.1\noptim:\n  name: adamw\n  weight_decay: 0.05\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.999\nscheduler:\n  name: cosine\n  is_iteration_based: false\n  max_epochs: 300\n  warmup_iterations: 7500\n  warmup_init_lr: 1.0e-06\n  cosine:\n    max_lr: 0.001\n    min_lr: 2.0e-05\nmodel:\n  classification:\n    name: byteformer\n    n_classes: 1000\n    byteformer:\n      mode: tiny\n      max_num_tokens: 50000\n      conv_kernel_size: 16\n      window_sizes:\n      - 32\n  activation:\n    name: gelu\n  layer:\n    global_pool: mean\n    conv_init: kaiming_uniform\n    linear_init: trunc_normal\n    linear_init_std_dev: 0.02\nema:\n  enable: true\n  momentum: 0.0001\nstats:\n  val:\n  - loss\n  - top1\n  - top5\n  train:\n  - loss\n  checkpoint_metric: top1\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "projects/byteformer/imagenet_jpeg_q60/conv_kernel_size=32,window_sizes=[128].yaml",
    "content": "# pytest: disable\ncommon:\n  run_label: train\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\n  tensorboard_logging: false\n  accum_freq: 2\ndataset:\n  root_train: /mnt/imagenet/training\n  root_val: /mnt/imagenet/validation\n  name: imagenet\n  category: classification\n  train_batch_size0: 48\n  val_batch_size0: 48\n  eval_batch_size0: 48\n  workers: 10\n  persistent_workers: false\n  pin_memory: true\n  collate_fn_name_train: byteformer_image_collate_fn\n  collate_fn_name_val: byteformer_image_collate_fn\n  collate_fn_name_test: byteformer_image_collate_fn\nimage_augmentation:\n  random_resized_crop:\n    enable: true\n    interpolation: bicubic\n  resize:\n    enable: true\n    size: 256\n    interpolation: bicubic\n  center_crop:\n    enable: true\n    size: 224\n  random_horizontal_flip:\n    enable: true\n  rand_augment:\n    enable: true\n  random_erase:\n    enable: true\n    p: 0.25\n  mixup:\n    enable: false\n  cutmix:\n    enable: false\n  pil_save:\n    enable: true\n    file_encoding: JPEG\n    quality: 60\nsampler:\n  name: batch_sampler\n  bs:\n    crop_size_width: 224\n    crop_size_height: 224\nloss:\n  category: classification\n  classification:\n    name: cross_entropy\n    cross_entropy:\n      label_smoothing: 0.1\noptim:\n  name: adamw\n  weight_decay: 0.05\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.999\nscheduler:\n  name: cosine\n  is_iteration_based: false\n  max_epochs: 300\n  warmup_iterations: 7500\n  warmup_init_lr: 1.0e-06\n  cosine:\n    max_lr: 0.001\n    min_lr: 2.0e-05\nmodel:\n  classification:\n    name: byteformer\n    n_classes: 1000\n    byteformer:\n      mode: tiny\n      max_num_tokens: 50000\n      conv_kernel_size: 32\n      window_sizes:\n      - 128\n  activation:\n    name: gelu\n  layer:\n    global_pool: mean\n    conv_init: kaiming_uniform\n    linear_init: trunc_normal\n    linear_init_std_dev: 0.02\nema:\n  enable: true\n  momentum: 0.0001\nstats:\n  val:\n  - loss\n  - top1\n  - top5\n  train:\n  - loss\n  checkpoint_metric: top1\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "projects/byteformer/imagenet_jpeg_q60/conv_kernel_size=32,window_sizes=[32].yaml",
    "content": "# pytest: disable\ncommon:\n  run_label: train\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\n  tensorboard_logging: false\n  accum_freq: 2\ndataset:\n  root_train: /mnt/imagenet/training\n  root_val: /mnt/imagenet/validation\n  name: imagenet\n  category: classification\n  train_batch_size0: 48\n  val_batch_size0: 48\n  eval_batch_size0: 48\n  workers: 10\n  persistent_workers: false\n  pin_memory: true\n  collate_fn_name_train: byteformer_image_collate_fn\n  collate_fn_name_val: byteformer_image_collate_fn\n  collate_fn_name_test: byteformer_image_collate_fn\nimage_augmentation:\n  random_resized_crop:\n    enable: true\n    interpolation: bicubic\n  resize:\n    enable: true\n    size: 256\n    interpolation: bicubic\n  center_crop:\n    enable: true\n    size: 224\n  random_horizontal_flip:\n    enable: true\n  rand_augment:\n    enable: true\n  random_erase:\n    enable: true\n    p: 0.25\n  mixup:\n    enable: false\n  cutmix:\n    enable: false\n  pil_save:\n    enable: true\n    file_encoding: JPEG\n    quality: 60\nsampler:\n  name: batch_sampler\n  bs:\n    crop_size_width: 224\n    crop_size_height: 224\nloss:\n  category: classification\n  classification:\n    name: cross_entropy\n    cross_entropy:\n      label_smoothing: 0.1\noptim:\n  name: adamw\n  weight_decay: 0.05\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.999\nscheduler:\n  name: cosine\n  is_iteration_based: false\n  max_epochs: 300\n  warmup_iterations: 7500\n  warmup_init_lr: 1.0e-06\n  cosine:\n    max_lr: 0.001\n    min_lr: 2.0e-05\nmodel:\n  classification:\n    name: byteformer\n    n_classes: 1000\n    byteformer:\n      mode: tiny\n      max_num_tokens: 50000\n      conv_kernel_size: 32\n      window_sizes:\n      - 32\n  activation:\n    name: gelu\n  layer:\n    global_pool: mean\n    conv_init: kaiming_uniform\n    linear_init: trunc_normal\n    linear_init_std_dev: 0.02\nema:\n  enable: true\n  momentum: 0.0001\nstats:\n  val:\n  - loss\n  - top1\n  - top5\n  train:\n  - loss\n  checkpoint_metric: top1\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "projects/byteformer/imagenet_jpeg_q60/conv_kernel_size=4,window_sizes=[128].yaml",
    "content": "common:\n  run_label: train\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\n  tensorboard_logging: false\n  accum_freq: 2\ndataset:\n  root_train: /mnt/imagenet/training\n  root_val: /mnt/imagenet/validation\n  name: imagenet\n  category: classification\n  train_batch_size0: 48\n  val_batch_size0: 48\n  eval_batch_size0: 48\n  workers: 10\n  persistent_workers: false\n  pin_memory: true\n  collate_fn_name_train: byteformer_image_collate_fn\n  collate_fn_name_val: byteformer_image_collate_fn\n  collate_fn_name_test: byteformer_image_collate_fn\nimage_augmentation:\n  random_resized_crop:\n    enable: true\n    interpolation: bicubic\n  resize:\n    enable: true\n    size: 256\n    interpolation: bicubic\n  center_crop:\n    enable: true\n    size: 224\n  random_horizontal_flip:\n    enable: true\n  rand_augment:\n    enable: true\n  random_erase:\n    enable: true\n    p: 0.25\n  mixup:\n    enable: false\n  cutmix:\n    enable: false\n  pil_save:\n    enable: true\n    file_encoding: JPEG\n    quality: 60\nsampler:\n  name: batch_sampler\n  bs:\n    crop_size_width: 224\n    crop_size_height: 224\nloss:\n  category: classification\n  classification:\n    name: cross_entropy\n    cross_entropy:\n      label_smoothing: 0.1\noptim:\n  name: adamw\n  weight_decay: 0.05\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.999\nscheduler:\n  name: cosine\n  is_iteration_based: false\n  max_epochs: 300\n  warmup_iterations: 7500\n  warmup_init_lr: 1.0e-06\n  cosine:\n    max_lr: 0.001\n    min_lr: 2.0e-05\nmodel:\n  classification:\n    name: byteformer\n    n_classes: 1000\n    byteformer:\n      mode: tiny\n      max_num_tokens: 50000\n      conv_kernel_size: 4\n      window_sizes:\n      - 128\n  activation:\n    name: gelu\n  layer:\n    global_pool: mean\n    conv_init: kaiming_uniform\n    linear_init: trunc_normal\n    linear_init_std_dev: 0.02\nema:\n  enable: true\n  momentum: 0.0001\nstats:\n  val:\n  - loss\n  - top1\n  - top5\n  train:\n  - loss\n  checkpoint_metric: top1\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "projects/byteformer/imagenet_jpeg_q60/conv_kernel_size=4,window_sizes=[32].yaml",
    "content": "# pytest: disable\ncommon:\n  run_label: train\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\n  tensorboard_logging: false\n  accum_freq: 2\ndataset:\n  root_train: /mnt/imagenet/training\n  root_val: /mnt/imagenet/validation\n  name: imagenet\n  category: classification\n  train_batch_size0: 48\n  val_batch_size0: 48\n  eval_batch_size0: 48\n  workers: 10\n  persistent_workers: false\n  pin_memory: true\n  collate_fn_name_train: byteformer_image_collate_fn\n  collate_fn_name_val: byteformer_image_collate_fn\n  collate_fn_name_test: byteformer_image_collate_fn\nimage_augmentation:\n  random_resized_crop:\n    enable: true\n    interpolation: bicubic\n  resize:\n    enable: true\n    size: 256\n    interpolation: bicubic\n  center_crop:\n    enable: true\n    size: 224\n  random_horizontal_flip:\n    enable: true\n  rand_augment:\n    enable: true\n  random_erase:\n    enable: true\n    p: 0.25\n  mixup:\n    enable: false\n  cutmix:\n    enable: false\n  pil_save:\n    enable: true\n    file_encoding: JPEG\n    quality: 60\nsampler:\n  name: batch_sampler\n  bs:\n    crop_size_width: 224\n    crop_size_height: 224\nloss:\n  category: classification\n  classification:\n    name: cross_entropy\n    cross_entropy:\n      label_smoothing: 0.1\noptim:\n  name: adamw\n  weight_decay: 0.05\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.999\nscheduler:\n  name: cosine\n  is_iteration_based: false\n  max_epochs: 300\n  warmup_iterations: 7500\n  warmup_init_lr: 1.0e-06\n  cosine:\n    max_lr: 0.001\n    min_lr: 2.0e-05\nmodel:\n  classification:\n    name: byteformer\n    n_classes: 1000\n    byteformer:\n      mode: tiny\n      max_num_tokens: 50000\n      conv_kernel_size: 4\n      window_sizes:\n      - 32\n  activation:\n    name: gelu\n  layer:\n    global_pool: mean\n    conv_init: kaiming_uniform\n    linear_init: trunc_normal\n    linear_init_std_dev: 0.02\nema:\n  enable: true\n  momentum: 0.0001\nstats:\n  val:\n  - loss\n  - top1\n  - top5\n  train:\n  - loss\n  checkpoint_metric: top1\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "projects/byteformer/imagenet_jpeg_q60/conv_kernel_size=8,window_sizes=[128].yaml",
    "content": "# pytest: disable\ncommon:\n  run_label: train\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\n  tensorboard_logging: false\n  accum_freq: 2\ndataset:\n  root_train: /mnt/imagenet/training\n  root_val: /mnt/imagenet/validation\n  name: imagenet\n  category: classification\n  train_batch_size0: 48\n  val_batch_size0: 48\n  eval_batch_size0: 48\n  workers: 10\n  persistent_workers: false\n  pin_memory: true\n  collate_fn_name_train: byteformer_image_collate_fn\n  collate_fn_name_val: byteformer_image_collate_fn\n  collate_fn_name_test: byteformer_image_collate_fn\nimage_augmentation:\n  random_resized_crop:\n    enable: true\n    interpolation: bicubic\n  resize:\n    enable: true\n    size: 256\n    interpolation: bicubic\n  center_crop:\n    enable: true\n    size: 224\n  random_horizontal_flip:\n    enable: true\n  rand_augment:\n    enable: true\n  random_erase:\n    enable: true\n    p: 0.25\n  mixup:\n    enable: false\n  cutmix:\n    enable: false\n  pil_save:\n    enable: true\n    file_encoding: JPEG\n    quality: 60\nsampler:\n  name: batch_sampler\n  bs:\n    crop_size_width: 224\n    crop_size_height: 224\nloss:\n  category: classification\n  classification:\n    name: cross_entropy\n    cross_entropy:\n      label_smoothing: 0.1\noptim:\n  name: adamw\n  weight_decay: 0.05\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.999\nscheduler:\n  name: cosine\n  is_iteration_based: false\n  max_epochs: 300\n  warmup_iterations: 7500\n  warmup_init_lr: 1.0e-06\n  cosine:\n    max_lr: 0.001\n    min_lr: 2.0e-05\nmodel:\n  classification:\n    name: byteformer\n    n_classes: 1000\n    byteformer:\n      mode: tiny\n      max_num_tokens: 50000\n      conv_kernel_size: 8\n      window_sizes:\n      - 128\n  activation:\n    name: gelu\n  layer:\n    global_pool: mean\n    conv_init: kaiming_uniform\n    linear_init: trunc_normal\n    linear_init_std_dev: 0.02\nema:\n  enable: true\n  momentum: 0.0001\nstats:\n  val:\n  - loss\n  - top1\n  - top5\n  train:\n  - loss\n  checkpoint_metric: top1\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "projects/byteformer/imagenet_jpeg_q60/conv_kernel_size=8,window_sizes=[32].yaml",
    "content": "# pytest: disable\ncommon:\n  run_label: train\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\n  tensorboard_logging: false\n  accum_freq: 2\ndataset:\n  root_train: /mnt/imagenet/training\n  root_val: /mnt/imagenet/validation\n  name: imagenet\n  category: classification\n  train_batch_size0: 48\n  val_batch_size0: 48\n  eval_batch_size0: 48\n  workers: 10\n  persistent_workers: false\n  pin_memory: true\n  collate_fn_name_train: byteformer_image_collate_fn\n  collate_fn_name_val: byteformer_image_collate_fn\n  collate_fn_name_test: byteformer_image_collate_fn\nimage_augmentation:\n  random_resized_crop:\n    enable: true\n    interpolation: bicubic\n  resize:\n    enable: true\n    size: 256\n    interpolation: bicubic\n  center_crop:\n    enable: true\n    size: 224\n  random_horizontal_flip:\n    enable: true\n  rand_augment:\n    enable: true\n  random_erase:\n    enable: true\n    p: 0.25\n  mixup:\n    enable: false\n  cutmix:\n    enable: false\n  pil_save:\n    enable: true\n    file_encoding: JPEG\n    quality: 60\nsampler:\n  name: batch_sampler\n  bs:\n    crop_size_width: 224\n    crop_size_height: 224\nloss:\n  category: classification\n  classification:\n    name: cross_entropy\n    cross_entropy:\n      label_smoothing: 0.1\noptim:\n  name: adamw\n  weight_decay: 0.05\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.999\nscheduler:\n  name: cosine\n  is_iteration_based: false\n  max_epochs: 300\n  warmup_iterations: 7500\n  warmup_init_lr: 1.0e-06\n  cosine:\n    max_lr: 0.001\n    min_lr: 2.0e-05\nmodel:\n  classification:\n    name: byteformer\n    n_classes: 1000\n    byteformer:\n      mode: tiny\n      max_num_tokens: 50000\n      conv_kernel_size: 8\n      window_sizes:\n      - 32\n  activation:\n    name: gelu\n  layer:\n    global_pool: mean\n    conv_init: kaiming_uniform\n    linear_init: trunc_normal\n    linear_init_std_dev: 0.02\nema:\n  enable: true\n  momentum: 0.0001\nstats:\n  val:\n  - loss\n  - top1\n  - top5\n  train:\n  - loss\n  checkpoint_metric: top1\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "projects/byteformer/imagenet_jpeg_shuffle_bytes/mode=cyclic_half_length.yaml",
    "content": "# pytest: disable\ncommon:\n  run_label: train\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\n  tensorboard_logging: false\n  accum_freq: 2\ndataset:\n  root_train: /mnt/imagenet/training\n  root_val: /mnt/imagenet/validation\n  name: imagenet\n  category: classification\n  train_batch_size0: 48\n  val_batch_size0: 48\n  eval_batch_size0: 48\n  workers: 10\n  persistent_workers: false\n  pin_memory: true\n  collate_fn_name_train: byteformer_image_collate_fn\n  collate_fn_name_val: byteformer_image_collate_fn\n  collate_fn_name_test: byteformer_image_collate_fn\nimage_augmentation:\n  random_resized_crop:\n    enable: true\n    interpolation: bicubic\n  resize:\n    enable: true\n    size: 256\n    interpolation: bicubic\n  center_crop:\n    enable: true\n    size: 224\n  random_horizontal_flip:\n    enable: true\n  rand_augment:\n    enable: true\n  random_erase:\n    enable: true\n    p: 0.25\n  mixup:\n    enable: false\n  cutmix:\n    enable: false\n  pil_save:\n    enable: true\n    file_encoding: JPEG\n    quality: 100\n  shuffle_bytes:\n    enable: true\n    stride: 1024\n    window_size: 1024\n    mode: cyclic_half_length\nsampler:\n  name: batch_sampler\n  bs:\n    crop_size_width: 224\n    crop_size_height: 224\nloss:\n  category: classification\n  classification:\n    name: cross_entropy\n    cross_entropy:\n      label_smoothing: 0.1\noptim:\n  name: adamw\n  weight_decay: 0.05\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.999\nscheduler:\n  name: cosine\n  is_iteration_based: false\n  max_epochs: 300\n  warmup_iterations: 7500\n  warmup_init_lr: 1.0e-06\n  cosine:\n    max_lr: 0.001\n    min_lr: 2.0e-05\nmodel:\n  classification:\n    name: byteformer\n    n_classes: 1000\n    byteformer:\n      mode: tiny\n      max_num_tokens: 50000\n      conv_kernel_size: 32\n      window_sizes:\n      - 128\n  activation:\n    name: gelu\n  layer:\n    global_pool: mean\n    conv_init: kaiming_uniform\n    linear_init: trunc_normal\n    linear_init_std_dev: 0.02\nema:\n  enable: true\n  momentum: 0.0001\nstats:\n  val:\n  - loss\n  - top1\n  - top5\n  train:\n  - loss\n  checkpoint_metric: top1\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "projects/byteformer/imagenet_jpeg_shuffle_bytes/mode=random_shuffle.yaml",
    "content": "# pytest: disable\ncommon:\n  run_label: train\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\n  tensorboard_logging: false\n  accum_freq: 2\ndataset:\n  root_train: /mnt/imagenet/training\n  root_val: /mnt/imagenet/validation\n  name: imagenet\n  category: classification\n  train_batch_size0: 48\n  val_batch_size0: 48\n  eval_batch_size0: 48\n  workers: 10\n  persistent_workers: false\n  pin_memory: true\n  collate_fn_name_train: byteformer_image_collate_fn\n  collate_fn_name_val: byteformer_image_collate_fn\n  collate_fn_name_test: byteformer_image_collate_fn\nimage_augmentation:\n  random_resized_crop:\n    enable: true\n    interpolation: bicubic\n  resize:\n    enable: true\n    size: 256\n    interpolation: bicubic\n  center_crop:\n    enable: true\n    size: 224\n  random_horizontal_flip:\n    enable: true\n  rand_augment:\n    enable: true\n  random_erase:\n    enable: true\n    p: 0.25\n  mixup:\n    enable: false\n  cutmix:\n    enable: false\n  pil_save:\n    enable: true\n    file_encoding: JPEG\n    quality: 100\n  shuffle_bytes:\n    enable: true\n    stride: 1024\n    window_size: 1024\n    mode: random_shuffle\nsampler:\n  name: batch_sampler\n  bs:\n    crop_size_width: 224\n    crop_size_height: 224\nloss:\n  category: classification\n  classification:\n    name: cross_entropy\n    cross_entropy:\n      label_smoothing: 0.1\noptim:\n  name: adamw\n  weight_decay: 0.05\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.999\nscheduler:\n  name: cosine\n  is_iteration_based: false\n  max_epochs: 300\n  warmup_iterations: 7500\n  warmup_init_lr: 1.0e-06\n  cosine:\n    max_lr: 0.001\n    min_lr: 2.0e-05\nmodel:\n  classification:\n    name: byteformer\n    n_classes: 1000\n    byteformer:\n      mode: tiny\n      max_num_tokens: 50000\n      conv_kernel_size: 32\n      window_sizes:\n      - 128\n  activation:\n    name: gelu\n  layer:\n    global_pool: mean\n    conv_init: kaiming_uniform\n    linear_init: trunc_normal\n    linear_init_std_dev: 0.02\nema:\n  enable: true\n  momentum: 0.0001\nstats:\n  val:\n  - loss\n  - top1\n  - top5\n  train:\n  - loss\n  checkpoint_metric: top1\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "projects/byteformer/imagenet_jpeg_shuffle_bytes/mode=reverse.yaml",
    "content": "common:\n  run_label: train\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\n  tensorboard_logging: false\n  accum_freq: 2\ndataset:\n  root_train: /mnt/imagenet/training\n  root_val: /mnt/imagenet/validation\n  name: imagenet\n  category: classification\n  train_batch_size0: 48\n  val_batch_size0: 48\n  eval_batch_size0: 48\n  workers: 10\n  persistent_workers: false\n  pin_memory: true\n  collate_fn_name_train: byteformer_image_collate_fn\n  collate_fn_name_val: byteformer_image_collate_fn\n  collate_fn_name_test: byteformer_image_collate_fn\nimage_augmentation:\n  random_resized_crop:\n    enable: true\n    interpolation: bicubic\n  resize:\n    enable: true\n    size: 256\n    interpolation: bicubic\n  center_crop:\n    enable: true\n    size: 224\n  random_horizontal_flip:\n    enable: true\n  rand_augment:\n    enable: true\n  random_erase:\n    enable: true\n    p: 0.25\n  mixup:\n    enable: false\n  cutmix:\n    enable: false\n  pil_save:\n    enable: true\n    file_encoding: JPEG\n    quality: 100\n  shuffle_bytes:\n    enable: true\n    stride: 1024\n    window_size: 1024\n    mode: reverse\nsampler:\n  name: batch_sampler\n  bs:\n    crop_size_width: 224\n    crop_size_height: 224\nloss:\n  category: classification\n  classification:\n    name: cross_entropy\n    cross_entropy:\n      label_smoothing: 0.1\noptim:\n  name: adamw\n  weight_decay: 0.05\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.999\nscheduler:\n  name: cosine\n  is_iteration_based: false\n  max_epochs: 300\n  warmup_iterations: 7500\n  warmup_init_lr: 1.0e-06\n  cosine:\n    max_lr: 0.001\n    min_lr: 2.0e-05\nmodel:\n  classification:\n    name: byteformer\n    n_classes: 1000\n    byteformer:\n      mode: tiny\n      max_num_tokens: 50000\n      conv_kernel_size: 32\n      window_sizes:\n      - 128\n  activation:\n    name: gelu\n  layer:\n    global_pool: mean\n    conv_init: kaiming_uniform\n    linear_init: trunc_normal\n    linear_init_std_dev: 0.02\nema:\n  enable: true\n  momentum: 0.0001\nstats:\n  val:\n  - loss\n  - top1\n  - top5\n  train:\n  - loss\n  checkpoint_metric: top1\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "projects/byteformer/imagenet_jpeg_shuffle_bytes/mode=stride.yaml",
    "content": "# pytest: disable\ncommon:\n  run_label: train\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\n  tensorboard_logging: false\n  accum_freq: 2\ndataset:\n  root_train: /mnt/imagenet/training\n  root_val: /mnt/imagenet/validation\n  name: imagenet\n  category: classification\n  train_batch_size0: 48\n  val_batch_size0: 48\n  eval_batch_size0: 48\n  workers: 10\n  persistent_workers: false\n  pin_memory: true\n  collate_fn_name_train: byteformer_image_collate_fn\n  collate_fn_name_val: byteformer_image_collate_fn\n  collate_fn_name_test: byteformer_image_collate_fn\nimage_augmentation:\n  random_resized_crop:\n    enable: true\n    interpolation: bicubic\n  resize:\n    enable: true\n    size: 256\n    interpolation: bicubic\n  center_crop:\n    enable: true\n    size: 224\n  random_horizontal_flip:\n    enable: true\n  rand_augment:\n    enable: true\n  random_erase:\n    enable: true\n    p: 0.25\n  mixup:\n    enable: false\n  cutmix:\n    enable: false\n  pil_save:\n    enable: true\n    file_encoding: JPEG\n    quality: 100\n  shuffle_bytes:\n    enable: true\n    stride: 1024\n    window_size: 1024\n    mode: stride\nsampler:\n  name: batch_sampler\n  bs:\n    crop_size_width: 224\n    crop_size_height: 224\nloss:\n  category: classification\n  classification:\n    name: cross_entropy\n    cross_entropy:\n      label_smoothing: 0.1\noptim:\n  name: adamw\n  weight_decay: 0.05\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.999\nscheduler:\n  name: cosine\n  is_iteration_based: false\n  max_epochs: 300\n  warmup_iterations: 7500\n  warmup_init_lr: 1.0e-06\n  cosine:\n    max_lr: 0.001\n    min_lr: 2.0e-05\nmodel:\n  classification:\n    name: byteformer\n    n_classes: 1000\n    byteformer:\n      mode: tiny\n      max_num_tokens: 50000\n      conv_kernel_size: 32\n      window_sizes:\n      - 128\n  activation:\n    name: gelu\n  layer:\n    global_pool: mean\n    conv_init: kaiming_uniform\n    linear_init: trunc_normal\n    linear_init_std_dev: 0.02\nema:\n  enable: true\n  momentum: 0.0001\nstats:\n  val:\n  - loss\n  - top1\n  - top5\n  train:\n  - loss\n  checkpoint_metric: top1\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "projects/byteformer/imagenet_jpeg_shuffle_bytes/mode=window_shuffle.yaml",
    "content": "# pytest: disable\ncommon:\n  run_label: train\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\n  tensorboard_logging: false\n  accum_freq: 2\ndataset:\n  root_train: /mnt/imagenet/training\n  root_val: /mnt/imagenet/validation\n  name: imagenet\n  category: classification\n  train_batch_size0: 48\n  val_batch_size0: 48\n  eval_batch_size0: 48\n  workers: 10\n  persistent_workers: false\n  pin_memory: true\n  collate_fn_name_train: byteformer_image_collate_fn\n  collate_fn_name_val: byteformer_image_collate_fn\n  collate_fn_name_test: byteformer_image_collate_fn\nimage_augmentation:\n  random_resized_crop:\n    enable: true\n    interpolation: bicubic\n  resize:\n    enable: true\n    size: 256\n    interpolation: bicubic\n  center_crop:\n    enable: true\n    size: 224\n  random_horizontal_flip:\n    enable: true\n  rand_augment:\n    enable: true\n  random_erase:\n    enable: true\n    p: 0.25\n  mixup:\n    enable: false\n  cutmix:\n    enable: false\n  pil_save:\n    enable: true\n    file_encoding: JPEG\n    quality: 100\n  shuffle_bytes:\n    enable: true\n    stride: 1024\n    window_size: 1024\n    mode: window_shuffle\nsampler:\n  name: batch_sampler\n  bs:\n    crop_size_width: 224\n    crop_size_height: 224\nloss:\n  category: classification\n  classification:\n    name: cross_entropy\n    cross_entropy:\n      label_smoothing: 0.1\noptim:\n  name: adamw\n  weight_decay: 0.05\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.999\nscheduler:\n  name: cosine\n  is_iteration_based: false\n  max_epochs: 300\n  warmup_iterations: 7500\n  warmup_init_lr: 1.0e-06\n  cosine:\n    max_lr: 0.001\n    min_lr: 2.0e-05\nmodel:\n  classification:\n    name: byteformer\n    n_classes: 1000\n    byteformer:\n      mode: tiny\n      max_num_tokens: 50000\n      conv_kernel_size: 32\n      window_sizes:\n      - 128\n  activation:\n    name: gelu\n  layer:\n    global_pool: mean\n    conv_init: kaiming_uniform\n    linear_init: trunc_normal\n    linear_init_std_dev: 0.02\nema:\n  enable: true\n  momentum: 0.0001\nstats:\n  val:\n  - loss\n  - top1\n  - top5\n  train:\n  - loss\n  checkpoint_metric: top1\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "projects/byteformer/imagenet_obfuscation/width_range=[-10,10].yaml",
    "content": "# pytest: disable\ncommon:\n  run_label: train\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\n  tensorboard_logging: false\n  accum_freq: 2\ndataset:\n  root_train: /mnt/imagenet/training\n  root_val: /mnt/imagenet/validation\n  name: imagenet\n  category: classification\n  train_batch_size0: 48\n  val_batch_size0: 48\n  eval_batch_size0: 48\n  workers: 10\n  persistent_workers: false\n  pin_memory: true\n  collate_fn_name_train: byteformer_image_collate_fn\n  collate_fn_name_val: byteformer_image_collate_fn\n  collate_fn_name_test: byteformer_image_collate_fn\nimage_augmentation:\n  random_resized_crop:\n    enable: true\n    interpolation: bicubic\n  resize:\n    enable: true\n    size: 256\n    interpolation: bicubic\n  center_crop:\n    enable: true\n    size: 224\n  random_horizontal_flip:\n    enable: true\n  rand_augment:\n    enable: true\n  random_erase:\n    enable: true\n    p: 0.25\n  mixup:\n    enable: false\n  cutmix:\n    enable: false\n  pil_save:\n    enable: true\n    file_encoding: fHWC\n  byte_permutation:\n    enable: true\n  random_uniform:\n    enable: true\n    width_range:\n    - -10\n    - 10\nsampler:\n  name: batch_sampler\n  bs:\n    crop_size_width: 224\n    crop_size_height: 224\nloss:\n  category: classification\n  classification:\n    name: cross_entropy\n    cross_entropy:\n      label_smoothing: 0.1\noptim:\n  name: adamw\n  weight_decay: 0.05\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.999\nscheduler:\n  name: cosine\n  is_iteration_based: false\n  max_epochs: 300\n  warmup_iterations: 7500\n  warmup_init_lr: 1.0e-06\n  cosine:\n    max_lr: 0.001\n    min_lr: 2.0e-05\nmodel:\n  classification:\n    name: byteformer\n    n_classes: 1000\n    byteformer:\n      mode: tiny\n      max_num_tokens: 50000\n      conv_kernel_size: 32\n      window_sizes:\n      - 128\n  activation:\n    name: gelu\n  layer:\n    global_pool: mean\n    conv_init: kaiming_uniform\n    linear_init: trunc_normal\n    linear_init_std_dev: 0.02\nema:\n  enable: true\n  momentum: 0.0001\nstats:\n  val:\n  - loss\n  - top1\n  - top5\n  train:\n  - loss\n  checkpoint_metric: top1\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "projects/byteformer/imagenet_obfuscation/width_range=[-20,20].yaml",
    "content": "common:\n  run_label: train\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\n  tensorboard_logging: false\n  accum_freq: 2\ndataset:\n  root_train: /mnt/imagenet/training\n  root_val: /mnt/imagenet/validation\n  name: imagenet\n  category: classification\n  train_batch_size0: 48\n  val_batch_size0: 48\n  eval_batch_size0: 48\n  workers: 10\n  persistent_workers: false\n  pin_memory: true\n  collate_fn_name_train: byteformer_image_collate_fn\n  collate_fn_name_val: byteformer_image_collate_fn\n  collate_fn_name_test: byteformer_image_collate_fn\nimage_augmentation:\n  random_resized_crop:\n    enable: true\n    interpolation: bicubic\n  resize:\n    enable: true\n    size: 256\n    interpolation: bicubic\n  center_crop:\n    enable: true\n    size: 224\n  random_horizontal_flip:\n    enable: true\n  rand_augment:\n    enable: true\n  random_erase:\n    enable: true\n    p: 0.25\n  mixup:\n    enable: false\n  cutmix:\n    enable: false\n  pil_save:\n    enable: true\n    file_encoding: fHWC\n  byte_permutation:\n    enable: true\n  random_uniform:\n    enable: true\n    width_range:\n    - -20\n    - 20\nsampler:\n  name: batch_sampler\n  bs:\n    crop_size_width: 224\n    crop_size_height: 224\nloss:\n  category: classification\n  classification:\n    name: cross_entropy\n    cross_entropy:\n      label_smoothing: 0.1\noptim:\n  name: adamw\n  weight_decay: 0.05\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.999\nscheduler:\n  name: cosine\n  is_iteration_based: false\n  max_epochs: 300\n  warmup_iterations: 7500\n  warmup_init_lr: 1.0e-06\n  cosine:\n    max_lr: 0.001\n    min_lr: 2.0e-05\nmodel:\n  classification:\n    name: byteformer\n    n_classes: 1000\n    byteformer:\n      mode: tiny\n      max_num_tokens: 50000\n      conv_kernel_size: 32\n      window_sizes:\n      - 128\n  activation:\n    name: gelu\n  layer:\n    global_pool: mean\n    conv_init: kaiming_uniform\n    linear_init: trunc_normal\n    linear_init_std_dev: 0.02\nema:\n  enable: true\n  momentum: 0.0001\nstats:\n  val:\n  - loss\n  - top1\n  - top5\n  train:\n  - loss\n  checkpoint_metric: top1\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "projects/byteformer/imagenet_obfuscation/width_range=[-5,5].yaml",
    "content": "# pytest: disable\ncommon:\n  run_label: train\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\n  tensorboard_logging: false\n  accum_freq: 2\ndataset:\n  root_train: /mnt/imagenet/training\n  root_val: /mnt/imagenet/validation\n  name: imagenet\n  category: classification\n  train_batch_size0: 48\n  val_batch_size0: 48\n  eval_batch_size0: 48\n  workers: 10\n  persistent_workers: false\n  pin_memory: true\n  collate_fn_name_train: byteformer_image_collate_fn\n  collate_fn_name_val: byteformer_image_collate_fn\n  collate_fn_name_test: byteformer_image_collate_fn\nimage_augmentation:\n  random_resized_crop:\n    enable: true\n    interpolation: bicubic\n  resize:\n    enable: true\n    size: 256\n    interpolation: bicubic\n  center_crop:\n    enable: true\n    size: 224\n  random_horizontal_flip:\n    enable: true\n  rand_augment:\n    enable: true\n  random_erase:\n    enable: true\n    p: 0.25\n  mixup:\n    enable: false\n  cutmix:\n    enable: false\n  pil_save:\n    enable: true\n    file_encoding: fHWC\n  byte_permutation:\n    enable: true\n  random_uniform:\n    enable: true\n    width_range:\n    - -5\n    - 5\nsampler:\n  name: batch_sampler\n  bs:\n    crop_size_width: 224\n    crop_size_height: 224\nloss:\n  category: classification\n  classification:\n    name: cross_entropy\n    cross_entropy:\n      label_smoothing: 0.1\noptim:\n  name: adamw\n  weight_decay: 0.05\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.999\nscheduler:\n  name: cosine\n  is_iteration_based: false\n  max_epochs: 300\n  warmup_iterations: 7500\n  warmup_init_lr: 1.0e-06\n  cosine:\n    max_lr: 0.001\n    min_lr: 2.0e-05\nmodel:\n  classification:\n    name: byteformer\n    n_classes: 1000\n    byteformer:\n      mode: tiny\n      max_num_tokens: 50000\n      conv_kernel_size: 32\n      window_sizes:\n      - 128\n  activation:\n    name: gelu\n  layer:\n    global_pool: mean\n    conv_init: kaiming_uniform\n    linear_init: trunc_normal\n    linear_init_std_dev: 0.02\nema:\n  enable: true\n  momentum: 0.0001\nstats:\n  val:\n  - loss\n  - top1\n  - top5\n  train:\n  - loss\n  checkpoint_metric: top1\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "projects/byteformer/imagenet_obfuscation/width_range=[0,0].yaml",
    "content": "# pytest: disable\ncommon:\n  run_label: train\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\n  tensorboard_logging: false\n  accum_freq: 2\ndataset:\n  root_train: /mnt/imagenet/training\n  root_val: /mnt/imagenet/validation\n  name: imagenet\n  category: classification\n  train_batch_size0: 48\n  val_batch_size0: 48\n  eval_batch_size0: 48\n  workers: 10\n  persistent_workers: false\n  pin_memory: true\n  collate_fn_name_train: byteformer_image_collate_fn\n  collate_fn_name_val: byteformer_image_collate_fn\n  collate_fn_name_test: byteformer_image_collate_fn\nimage_augmentation:\n  random_resized_crop:\n    enable: true\n    interpolation: bicubic\n  resize:\n    enable: true\n    size: 256\n    interpolation: bicubic\n  center_crop:\n    enable: true\n    size: 224\n  random_horizontal_flip:\n    enable: true\n  rand_augment:\n    enable: true\n  random_erase:\n    enable: true\n    p: 0.25\n  mixup:\n    enable: false\n  cutmix:\n    enable: false\n  pil_save:\n    enable: true\n    file_encoding: fHWC\n  byte_permutation:\n    enable: true\n  random_uniform:\n    enable: true\n    width_range:\n    - 0\n    - 0\nsampler:\n  name: batch_sampler\n  bs:\n    crop_size_width: 224\n    crop_size_height: 224\nloss:\n  category: classification\n  classification:\n    name: cross_entropy\n    cross_entropy:\n      label_smoothing: 0.1\noptim:\n  name: adamw\n  weight_decay: 0.05\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.999\nscheduler:\n  name: cosine\n  is_iteration_based: false\n  max_epochs: 300\n  warmup_iterations: 7500\n  warmup_init_lr: 1.0e-06\n  cosine:\n    max_lr: 0.001\n    min_lr: 2.0e-05\nmodel:\n  classification:\n    name: byteformer\n    n_classes: 1000\n    byteformer:\n      mode: tiny\n      max_num_tokens: 50000\n      conv_kernel_size: 32\n      window_sizes:\n      - 128\n  activation:\n    name: gelu\n  layer:\n    global_pool: mean\n    conv_init: kaiming_uniform\n    linear_init: trunc_normal\n    linear_init_std_dev: 0.02\nema:\n  enable: true\n  momentum: 0.0001\nstats:\n  val:\n  - loss\n  - top1\n  - top5\n  train:\n  - loss\n  checkpoint_metric: top1\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "projects/byteformer/imagenet_privacy_preserving_camera/keep_frac=0.03,conv_kernel_size=4.yaml",
    "content": "# pytest: disable\ncommon:\n  run_label: train\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\n  tensorboard_logging: false\n  accum_freq: 2\ndataset:\n  root_train: /mnt/imagenet/training\n  root_val: /mnt/imagenet/validation\n  name: imagenet\n  category: classification\n  train_batch_size0: 48\n  val_batch_size0: 48\n  eval_batch_size0: 48\n  workers: 10\n  persistent_workers: false\n  pin_memory: true\n  collate_fn_name_train: byteformer_image_collate_fn\n  collate_fn_name_val: byteformer_image_collate_fn\n  collate_fn_name_test: byteformer_image_collate_fn\nimage_augmentation:\n  random_resized_crop:\n    enable: true\n    interpolation: bicubic\n  resize:\n    enable: true\n    size: 256\n    interpolation: bicubic\n  center_crop:\n    enable: true\n    size: 224\n  random_horizontal_flip:\n    enable: true\n  rand_augment:\n    enable: true\n  random_erase:\n    enable: true\n    p: 0.25\n  mixup:\n    enable: false\n  cutmix:\n    enable: false\n  pil_save:\n    enable: true\n    file_encoding: fHWC\n  mask_positions:\n    enable: true\n    keep_frac: 0.03\nsampler:\n  name: batch_sampler\n  bs:\n    crop_size_width: 224\n    crop_size_height: 224\nloss:\n  category: classification\n  classification:\n    name: cross_entropy\n    cross_entropy:\n      label_smoothing: 0.1\noptim:\n  name: adamw\n  weight_decay: 0.05\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.999\nscheduler:\n  name: cosine\n  is_iteration_based: false\n  max_epochs: 300\n  warmup_iterations: 7500\n  warmup_init_lr: 1.0e-06\n  cosine:\n    max_lr: 0.001\n    min_lr: 2.0e-05\nmodel:\n  classification:\n    name: byteformer\n    n_classes: 1000\n    byteformer:\n      mode: tiny\n      max_num_tokens: 50000\n      conv_kernel_size: 4\n      window_sizes:\n      - 128\n  activation:\n    name: gelu\n  layer:\n    global_pool: mean\n    conv_init: kaiming_uniform\n    linear_init: trunc_normal\n    linear_init_std_dev: 0.02\nema:\n  enable: true\n  momentum: 0.0001\nstats:\n  val:\n  - loss\n  - top1\n  - top5\n  train:\n  - loss\n  checkpoint_metric: top1\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "projects/byteformer/imagenet_privacy_preserving_camera/keep_frac=0.05,conv_kernel_size=4.yaml",
    "content": "common:\n  run_label: train\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\n  tensorboard_logging: false\n  accum_freq: 2\ndataset:\n  root_train: /mnt/imagenet/training\n  root_val: /mnt/imagenet/validation\n  name: imagenet\n  category: classification\n  train_batch_size0: 48\n  val_batch_size0: 48\n  eval_batch_size0: 48\n  workers: 10\n  persistent_workers: false\n  pin_memory: true\n  collate_fn_name_train: byteformer_image_collate_fn\n  collate_fn_name_val: byteformer_image_collate_fn\n  collate_fn_name_test: byteformer_image_collate_fn\nimage_augmentation:\n  random_resized_crop:\n    enable: true\n    interpolation: bicubic\n  resize:\n    enable: true\n    size: 256\n    interpolation: bicubic\n  center_crop:\n    enable: true\n    size: 224\n  random_horizontal_flip:\n    enable: true\n  rand_augment:\n    enable: true\n  random_erase:\n    enable: true\n    p: 0.25\n  mixup:\n    enable: false\n  cutmix:\n    enable: false\n  pil_save:\n    enable: true\n    file_encoding: fHWC\n  mask_positions:\n    enable: true\n    keep_frac: 0.05\nsampler:\n  name: batch_sampler\n  bs:\n    crop_size_width: 224\n    crop_size_height: 224\nloss:\n  category: classification\n  classification:\n    name: cross_entropy\n    cross_entropy:\n      label_smoothing: 0.1\noptim:\n  name: adamw\n  weight_decay: 0.05\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.999\nscheduler:\n  name: cosine\n  is_iteration_based: false\n  max_epochs: 300\n  warmup_iterations: 7500\n  warmup_init_lr: 1.0e-06\n  cosine:\n    max_lr: 0.001\n    min_lr: 2.0e-05\nmodel:\n  classification:\n    name: byteformer\n    n_classes: 1000\n    byteformer:\n      mode: tiny\n      max_num_tokens: 50000\n      conv_kernel_size: 4\n      window_sizes:\n      - 128\n  activation:\n    name: gelu\n  layer:\n    global_pool: mean\n    conv_init: kaiming_uniform\n    linear_init: trunc_normal\n    linear_init_std_dev: 0.02\nema:\n  enable: true\n  momentum: 0.0001\nstats:\n  val:\n  - loss\n  - top1\n  - top5\n  train:\n  - loss\n  checkpoint_metric: top1\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "projects/byteformer/imagenet_privacy_preserving_camera/keep_frac=0.1,conv_kernel_size=4.yaml",
    "content": "# pytest: disable\ncommon:\n  run_label: train\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\n  tensorboard_logging: false\n  accum_freq: 2\ndataset:\n  root_train: /mnt/imagenet/training\n  root_val: /mnt/imagenet/validation\n  name: imagenet\n  category: classification\n  train_batch_size0: 48\n  val_batch_size0: 48\n  eval_batch_size0: 48\n  workers: 10\n  persistent_workers: false\n  pin_memory: true\n  collate_fn_name_train: byteformer_image_collate_fn\n  collate_fn_name_val: byteformer_image_collate_fn\n  collate_fn_name_test: byteformer_image_collate_fn\nimage_augmentation:\n  random_resized_crop:\n    enable: true\n    interpolation: bicubic\n  resize:\n    enable: true\n    size: 256\n    interpolation: bicubic\n  center_crop:\n    enable: true\n    size: 224\n  random_horizontal_flip:\n    enable: true\n  rand_augment:\n    enable: true\n  random_erase:\n    enable: true\n    p: 0.25\n  mixup:\n    enable: false\n  cutmix:\n    enable: false\n  pil_save:\n    enable: true\n    file_encoding: fHWC\n  mask_positions:\n    enable: true\n    keep_frac: 0.1\nsampler:\n  name: batch_sampler\n  bs:\n    crop_size_width: 224\n    crop_size_height: 224\nloss:\n  category: classification\n  classification:\n    name: cross_entropy\n    cross_entropy:\n      label_smoothing: 0.1\noptim:\n  name: adamw\n  weight_decay: 0.05\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.999\nscheduler:\n  name: cosine\n  is_iteration_based: false\n  max_epochs: 300\n  warmup_iterations: 7500\n  warmup_init_lr: 1.0e-06\n  cosine:\n    max_lr: 0.001\n    min_lr: 2.0e-05\nmodel:\n  classification:\n    name: byteformer\n    n_classes: 1000\n    byteformer:\n      mode: tiny\n      max_num_tokens: 50000\n      conv_kernel_size: 4\n      window_sizes:\n      - 128\n  activation:\n    name: gelu\n  layer:\n    global_pool: mean\n    conv_init: kaiming_uniform\n    linear_init: trunc_normal\n    linear_init_std_dev: 0.02\nema:\n  enable: true\n  momentum: 0.0001\nstats:\n  val:\n  - loss\n  - top1\n  - top5\n  train:\n  - loss\n  checkpoint_metric: top1\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "projects/byteformer/imagenet_privacy_preserving_camera/keep_frac=0.25,conv_kernel_size=8.yaml",
    "content": "# pytest: disable\ncommon:\n  run_label: train\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\n  tensorboard_logging: false\n  accum_freq: 2\ndataset:\n  root_train: /mnt/imagenet/training\n  root_val: /mnt/imagenet/validation\n  name: imagenet\n  category: classification\n  train_batch_size0: 48\n  val_batch_size0: 48\n  eval_batch_size0: 48\n  workers: 10\n  persistent_workers: false\n  pin_memory: true\n  collate_fn_name_train: byteformer_image_collate_fn\n  collate_fn_name_val: byteformer_image_collate_fn\n  collate_fn_name_test: byteformer_image_collate_fn\nimage_augmentation:\n  random_resized_crop:\n    enable: true\n    interpolation: bicubic\n  resize:\n    enable: true\n    size: 256\n    interpolation: bicubic\n  center_crop:\n    enable: true\n    size: 224\n  random_horizontal_flip:\n    enable: true\n  rand_augment:\n    enable: true\n  random_erase:\n    enable: true\n    p: 0.25\n  mixup:\n    enable: false\n  cutmix:\n    enable: false\n  pil_save:\n    enable: true\n    file_encoding: fHWC\n  mask_positions:\n    enable: true\n    keep_frac: 0.25\nsampler:\n  name: batch_sampler\n  bs:\n    crop_size_width: 224\n    crop_size_height: 224\nloss:\n  category: classification\n  classification:\n    name: cross_entropy\n    cross_entropy:\n      label_smoothing: 0.1\noptim:\n  name: adamw\n  weight_decay: 0.05\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.999\nscheduler:\n  name: cosine\n  is_iteration_based: false\n  max_epochs: 300\n  warmup_iterations: 7500\n  warmup_init_lr: 1.0e-06\n  cosine:\n    max_lr: 0.001\n    min_lr: 2.0e-05\nmodel:\n  classification:\n    name: byteformer\n    n_classes: 1000\n    byteformer:\n      mode: tiny\n      max_num_tokens: 50000\n      conv_kernel_size: 8\n      window_sizes:\n      - 128\n  activation:\n    name: gelu\n  layer:\n    global_pool: mean\n    conv_init: kaiming_uniform\n    linear_init: trunc_normal\n    linear_init_std_dev: 0.02\nema:\n  enable: true\n  momentum: 0.0001\nstats:\n  val:\n  - loss\n  - top1\n  - top5\n  train:\n  - loss\n  checkpoint_metric: top1\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "projects/byteformer/imagenet_privacy_preserving_camera/keep_frac=0.5,conv_kernel_size=16.yaml",
    "content": "# pytest: disable\ncommon:\n  run_label: train\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\n  tensorboard_logging: false\n  accum_freq: 2\ndataset:\n  root_train: /mnt/imagenet/training\n  root_val: /mnt/imagenet/validation\n  name: imagenet\n  category: classification\n  train_batch_size0: 48\n  val_batch_size0: 48\n  eval_batch_size0: 48\n  workers: 10\n  persistent_workers: false\n  pin_memory: true\n  collate_fn_name_train: byteformer_image_collate_fn\n  collate_fn_name_val: byteformer_image_collate_fn\n  collate_fn_name_test: byteformer_image_collate_fn\nimage_augmentation:\n  random_resized_crop:\n    enable: true\n    interpolation: bicubic\n  resize:\n    enable: true\n    size: 256\n    interpolation: bicubic\n  center_crop:\n    enable: true\n    size: 224\n  random_horizontal_flip:\n    enable: true\n  rand_augment:\n    enable: true\n  random_erase:\n    enable: true\n    p: 0.25\n  mixup:\n    enable: false\n  cutmix:\n    enable: false\n  pil_save:\n    enable: true\n    file_encoding: fHWC\n  mask_positions:\n    enable: true\n    keep_frac: 0.5\nsampler:\n  name: batch_sampler\n  bs:\n    crop_size_width: 224\n    crop_size_height: 224\nloss:\n  category: classification\n  classification:\n    name: cross_entropy\n    cross_entropy:\n      label_smoothing: 0.1\noptim:\n  name: adamw\n  weight_decay: 0.05\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.999\nscheduler:\n  name: cosine\n  is_iteration_based: false\n  max_epochs: 300\n  warmup_iterations: 7500\n  warmup_init_lr: 1.0e-06\n  cosine:\n    max_lr: 0.001\n    min_lr: 2.0e-05\nmodel:\n  classification:\n    name: byteformer\n    n_classes: 1000\n    byteformer:\n      mode: tiny\n      max_num_tokens: 50000\n      conv_kernel_size: 16\n      window_sizes:\n      - 128\n  activation:\n    name: gelu\n  layer:\n    global_pool: mean\n    conv_init: kaiming_uniform\n    linear_init: trunc_normal\n    linear_init_std_dev: 0.02\nema:\n  enable: true\n  momentum: 0.0001\nstats:\n  val:\n  - loss\n  - top1\n  - top5\n  train:\n  - loss\n  checkpoint_metric: top1\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "projects/byteformer/imagenet_privacy_preserving_camera/keep_frac=0.75,conv_kernel_size=32.yaml",
    "content": "# pytest: disable\ncommon:\n  run_label: train\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\n  tensorboard_logging: false\n  accum_freq: 2\ndataset:\n  root_train: /mnt/imagenet/training\n  root_val: /mnt/imagenet/validation\n  name: imagenet\n  category: classification\n  train_batch_size0: 48\n  val_batch_size0: 48\n  eval_batch_size0: 48\n  workers: 10\n  persistent_workers: false\n  pin_memory: true\n  collate_fn_name_train: byteformer_image_collate_fn\n  collate_fn_name_val: byteformer_image_collate_fn\n  collate_fn_name_test: byteformer_image_collate_fn\nimage_augmentation:\n  random_resized_crop:\n    enable: true\n    interpolation: bicubic\n  resize:\n    enable: true\n    size: 256\n    interpolation: bicubic\n  center_crop:\n    enable: true\n    size: 224\n  random_horizontal_flip:\n    enable: true\n  rand_augment:\n    enable: true\n  random_erase:\n    enable: true\n    p: 0.25\n  mixup:\n    enable: false\n  cutmix:\n    enable: false\n  pil_save:\n    enable: true\n    file_encoding: fHWC\n  mask_positions:\n    enable: true\n    keep_frac: 0.75\nsampler:\n  name: batch_sampler\n  bs:\n    crop_size_width: 224\n    crop_size_height: 224\nloss:\n  category: classification\n  classification:\n    name: cross_entropy\n    cross_entropy:\n      label_smoothing: 0.1\noptim:\n  name: adamw\n  weight_decay: 0.05\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.999\nscheduler:\n  name: cosine\n  is_iteration_based: false\n  max_epochs: 300\n  warmup_iterations: 7500\n  warmup_init_lr: 1.0e-06\n  cosine:\n    max_lr: 0.001\n    min_lr: 2.0e-05\nmodel:\n  classification:\n    name: byteformer\n    n_classes: 1000\n    byteformer:\n      mode: tiny\n      max_num_tokens: 50000\n      conv_kernel_size: 32\n      window_sizes:\n      - 128\n  activation:\n    name: gelu\n  layer:\n    global_pool: mean\n    conv_init: kaiming_uniform\n    linear_init: trunc_normal\n    linear_init_std_dev: 0.02\nema:\n  enable: true\n  momentum: 0.0001\nstats:\n  val:\n  - loss\n  - top1\n  - top5\n  train:\n  - loss\n  checkpoint_metric: top1\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "projects/byteformer/speech_commands_mp3/conv_kernel_size=4,window_size=[128].yaml",
    "content": "# pytest: disable\ncommon:\n  run_label: train\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\n  tensorboard_logging: false\n  accum_freq: 2\ndataset:\n  root_train: /mnt/audio_datasets/google_speech_recognition_v2\n  root_val: /mnt/audio_datasets/google_speech_recognition_v2\n  name: speech_commands_v2\n  category: audio_classification\n  train_batch_size0: 48\n  val_batch_size0: 48\n  eval_batch_size0: 48\n  workers: 10\n  persistent_workers: false\n  pin_memory: true\n  collate_fn_name_train: byteformer_audio_collate_fn\n  collate_fn_name_val: byteformer_audio_collate_fn\n  collate_fn_name_test: byteformer_audio_collate_fn\n  speech_commands_v2:\n    mixup: true\naudio_augmentation:\n  noise:\n    enable: true\n    levels:\n    - -50\n    refresh_freq: 100\n  roll:\n    enable: true\n    window: 0.1\n  torchaudio_save:\n    enable: true\n    format: mp3\nsampler:\n  name: batch_sampler\nloss:\n  category: classification\n  classification:\n    name: cross_entropy\n    cross_entropy:\n      label_smoothing: 0.1\noptim:\n  name: adamw\n  weight_decay: 0.05\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.999\nscheduler:\n  name: cosine\n  is_iteration_based: false\n  max_epochs: 300\n  warmup_iterations: 500\n  warmup_init_lr: 1.0e-06\n  cosine:\n    max_lr: 0.001\n    min_lr: 2.0e-05\nmodel:\n  audio_classification:\n    name: byteformer\n  classification:\n    name: byteformer\n    byteformer:\n      mode: tiny\n      max_num_tokens: 50000\n      conv_kernel_size: 4\n      window_sizes:\n      - 128\n    n_classes: 12\n  activation:\n    name: gelu\n  layer:\n    global_pool: mean\n    conv_init: kaiming_uniform\n    linear_init: trunc_normal\n    linear_init_std_dev: 0.02\nema:\n  enable: true\n  momentum: 0.0001\nstats:\n  val:\n  - loss\n  - top1\n  - top5\n  train:\n  - loss\n  checkpoint_metric: top1\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "projects/byteformer/speech_commands_mp3/conv_kernel_size=4,window_size=[32].yaml",
    "content": "common:\n  run_label: train\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\n  tensorboard_logging: false\n  accum_freq: 2\ndataset:\n  root_train: /mnt/audio_datasets/google_speech_recognition_v2\n  root_val: /mnt/audio_datasets/google_speech_recognition_v2\n  name: speech_commands_v2\n  category: audio_classification\n  train_batch_size0: 48\n  val_batch_size0: 48\n  eval_batch_size0: 48\n  workers: 10\n  persistent_workers: false\n  pin_memory: true\n  collate_fn_name_train: byteformer_audio_collate_fn\n  collate_fn_name_val: byteformer_audio_collate_fn\n  collate_fn_name_test: byteformer_audio_collate_fn\n  speech_commands_v2:\n    mixup: true\naudio_augmentation:\n  noise:\n    enable: true\n    levels:\n    - -50\n    refresh_freq: 100\n  roll:\n    enable: true\n    window: 0.1\n  torchaudio_save:\n    enable: true\n    format: mp3\nsampler:\n  name: batch_sampler\nloss:\n  category: classification\n  classification:\n    name: cross_entropy\n    cross_entropy:\n      label_smoothing: 0.1\noptim:\n  name: adamw\n  weight_decay: 0.05\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.999\nscheduler:\n  name: cosine\n  is_iteration_based: false\n  max_epochs: 300\n  warmup_iterations: 500\n  warmup_init_lr: 1.0e-06\n  cosine:\n    max_lr: 0.001\n    min_lr: 2.0e-05\nmodel:\n  audio_classification:\n    name: byteformer\n  classification:\n    name: byteformer\n    byteformer:\n      mode: tiny\n      max_num_tokens: 50000\n      conv_kernel_size: 4\n      window_sizes:\n      - 32\n    n_classes: 12\n  activation:\n    name: gelu\n  layer:\n    global_pool: mean\n    conv_init: kaiming_uniform\n    linear_init: trunc_normal\n    linear_init_std_dev: 0.02\nema:\n  enable: true\n  momentum: 0.0001\nstats:\n  val:\n  - loss\n  - top1\n  - top5\n  train:\n  - loss\n  checkpoint_metric: top1\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "projects/byteformer/speech_commands_mp3/conv_kernel_size=8,window_size=[128].yaml",
    "content": "# pytest: disable\ncommon:\n  run_label: train\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\n  tensorboard_logging: false\n  accum_freq: 2\ndataset:\n  root_train: /mnt/audio_datasets/google_speech_recognition_v2\n  root_val: /mnt/audio_datasets/google_speech_recognition_v2\n  name: speech_commands_v2\n  category: audio_classification\n  train_batch_size0: 48\n  val_batch_size0: 48\n  eval_batch_size0: 48\n  workers: 10\n  persistent_workers: false\n  pin_memory: true\n  collate_fn_name_train: byteformer_audio_collate_fn\n  collate_fn_name_val: byteformer_audio_collate_fn\n  collate_fn_name_test: byteformer_audio_collate_fn\n  speech_commands_v2:\n    mixup: true\naudio_augmentation:\n  noise:\n    enable: true\n    levels:\n    - -50\n    refresh_freq: 100\n  roll:\n    enable: true\n    window: 0.1\n  torchaudio_save:\n    enable: true\n    format: mp3\nsampler:\n  name: batch_sampler\nloss:\n  category: classification\n  classification:\n    name: cross_entropy\n    cross_entropy:\n      label_smoothing: 0.1\noptim:\n  name: adamw\n  weight_decay: 0.05\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.999\nscheduler:\n  name: cosine\n  is_iteration_based: false\n  max_epochs: 300\n  warmup_iterations: 500\n  warmup_init_lr: 1.0e-06\n  cosine:\n    max_lr: 0.001\n    min_lr: 2.0e-05\nmodel:\n  audio_classification:\n    name: byteformer\n  classification:\n    name: byteformer\n    byteformer:\n      mode: tiny\n      max_num_tokens: 50000\n      conv_kernel_size: 8\n      window_sizes:\n      - 128\n    n_classes: 12\n  activation:\n    name: gelu\n  layer:\n    global_pool: mean\n    conv_init: kaiming_uniform\n    linear_init: trunc_normal\n    linear_init_std_dev: 0.02\nema:\n  enable: true\n  momentum: 0.0001\nstats:\n  val:\n  - loss\n  - top1\n  - top5\n  train:\n  - loss\n  checkpoint_metric: top1\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "projects/byteformer/speech_commands_mp3/conv_kernel_size=8,window_size=[32].yaml",
    "content": "# pytest: disable\ncommon:\n  run_label: train\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\n  tensorboard_logging: false\n  accum_freq: 2\ndataset:\n  root_train: /mnt/audio_datasets/google_speech_recognition_v2\n  root_val: /mnt/audio_datasets/google_speech_recognition_v2\n  name: speech_commands_v2\n  category: audio_classification\n  train_batch_size0: 48\n  val_batch_size0: 48\n  eval_batch_size0: 48\n  workers: 10\n  persistent_workers: false\n  pin_memory: true\n  collate_fn_name_train: byteformer_audio_collate_fn\n  collate_fn_name_val: byteformer_audio_collate_fn\n  collate_fn_name_test: byteformer_audio_collate_fn\n  speech_commands_v2:\n    mixup: true\naudio_augmentation:\n  noise:\n    enable: true\n    levels:\n    - -50\n    refresh_freq: 100\n  roll:\n    enable: true\n    window: 0.1\n  torchaudio_save:\n    enable: true\n    format: mp3\nsampler:\n  name: batch_sampler\nloss:\n  category: classification\n  classification:\n    name: cross_entropy\n    cross_entropy:\n      label_smoothing: 0.1\noptim:\n  name: adamw\n  weight_decay: 0.05\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.999\nscheduler:\n  name: cosine\n  is_iteration_based: false\n  max_epochs: 300\n  warmup_iterations: 500\n  warmup_init_lr: 1.0e-06\n  cosine:\n    max_lr: 0.001\n    min_lr: 2.0e-05\nmodel:\n  audio_classification:\n    name: byteformer\n  classification:\n    name: byteformer\n    byteformer:\n      mode: tiny\n      max_num_tokens: 50000\n      conv_kernel_size: 8\n      window_sizes:\n      - 32\n    n_classes: 12\n  activation:\n    name: gelu\n  layer:\n    global_pool: mean\n    conv_init: kaiming_uniform\n    linear_init: trunc_normal\n    linear_init_std_dev: 0.02\nema:\n  enable: true\n  momentum: 0.0001\nstats:\n  val:\n  - loss\n  - top1\n  - top5\n  train:\n  - loss\n  checkpoint_metric: top1\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "projects/byteformer/speech_commands_wav/encoding_dtype=float32,conv_kernel_size=16.yaml",
    "content": "# pytest: disable\ncommon:\n  run_label: train\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\n  tensorboard_logging: false\n  accum_freq: 2\ndataset:\n  root_train: /mnt/audio_datasets/google_speech_recognition_v2\n  root_val: /mnt/audio_datasets/google_speech_recognition_v2\n  name: speech_commands_v2\n  category: audio_classification\n  train_batch_size0: 48\n  val_batch_size0: 48\n  eval_batch_size0: 48\n  workers: 10\n  persistent_workers: false\n  pin_memory: true\n  collate_fn_name_train: byteformer_audio_collate_fn\n  collate_fn_name_val: byteformer_audio_collate_fn\n  collate_fn_name_test: byteformer_audio_collate_fn\n  speech_commands_v2:\n    mixup: true\naudio_augmentation:\n  noise:\n    enable: true\n    levels:\n    - -50\n    refresh_freq: 100\n  roll:\n    enable: true\n    window: 0.1\n  torchaudio_save:\n    enable: true\n    encoding_dtype: float32\n    format: wav\nsampler:\n  name: batch_sampler\nloss:\n  category: classification\n  classification:\n    name: cross_entropy\n    cross_entropy:\n      label_smoothing: 0.1\noptim:\n  name: adamw\n  weight_decay: 0.05\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.999\nscheduler:\n  name: cosine\n  is_iteration_based: false\n  max_epochs: 300\n  warmup_iterations: 500\n  warmup_init_lr: 1.0e-06\n  cosine:\n    max_lr: 0.001\n    min_lr: 2.0e-05\nmodel:\n  audio_classification:\n    name: byteformer\n  classification:\n    name: byteformer\n    byteformer:\n      mode: tiny\n      max_num_tokens: 50000\n      conv_kernel_size: 16\n      window_sizes:\n      - 128\n    n_classes: 12\n  activation:\n    name: gelu\n  layer:\n    global_pool: mean\n    conv_init: kaiming_uniform\n    linear_init: trunc_normal\n    linear_init_std_dev: 0.02\nema:\n  enable: true\n  momentum: 0.0001\nstats:\n  val:\n  - loss\n  - top1\n  - top5\n  train:\n  - loss\n  checkpoint_metric: top1\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "projects/byteformer/speech_commands_wav/encoding_dtype=float32,conv_kernel_size=32.yaml",
    "content": "common:\n  run_label: train\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\n  tensorboard_logging: false\n  accum_freq: 2\ndataset:\n  root_train: /mnt/audio_datasets/google_speech_recognition_v2\n  root_val: /mnt/audio_datasets/google_speech_recognition_v2\n  name: speech_commands_v2\n  category: audio_classification\n  train_batch_size0: 48\n  val_batch_size0: 48\n  eval_batch_size0: 48\n  workers: 10\n  persistent_workers: false\n  pin_memory: true\n  collate_fn_name_train: byteformer_audio_collate_fn\n  collate_fn_name_val: byteformer_audio_collate_fn\n  collate_fn_name_test: byteformer_audio_collate_fn\n  speech_commands_v2:\n    mixup: true\naudio_augmentation:\n  noise:\n    enable: true\n    levels:\n    - -50\n    refresh_freq: 100\n  roll:\n    enable: true\n    window: 0.1\n  torchaudio_save:\n    enable: true\n    encoding_dtype: float32\n    format: wav\nsampler:\n  name: batch_sampler\nloss:\n  category: classification\n  classification:\n    name: cross_entropy\n    cross_entropy:\n      label_smoothing: 0.1\noptim:\n  name: adamw\n  weight_decay: 0.05\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.999\nscheduler:\n  name: cosine\n  is_iteration_based: false\n  max_epochs: 300\n  warmup_iterations: 500\n  warmup_init_lr: 1.0e-06\n  cosine:\n    max_lr: 0.001\n    min_lr: 2.0e-05\nmodel:\n  audio_classification:\n    name: byteformer\n  classification:\n    name: byteformer\n    byteformer:\n      mode: tiny\n      max_num_tokens: 50000\n      conv_kernel_size: 32\n      window_sizes:\n      - 128\n    n_classes: 12\n  activation:\n    name: gelu\n  layer:\n    global_pool: mean\n    conv_init: kaiming_uniform\n    linear_init: trunc_normal\n    linear_init_std_dev: 0.02\nema:\n  enable: true\n  momentum: 0.0001\nstats:\n  val:\n  - loss\n  - top1\n  - top5\n  train:\n  - loss\n  checkpoint_metric: top1\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "projects/byteformer/speech_commands_wav/encoding_dtype=int16,conv_kernel_size=16.yaml",
    "content": "# pytest: disable\ncommon:\n  run_label: train\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\n  tensorboard_logging: false\n  accum_freq: 2\ndataset:\n  root_train: /mnt/audio_datasets/google_speech_recognition_v2\n  root_val: /mnt/audio_datasets/google_speech_recognition_v2\n  name: speech_commands_v2\n  category: audio_classification\n  train_batch_size0: 48\n  val_batch_size0: 48\n  eval_batch_size0: 48\n  workers: 10\n  persistent_workers: false\n  pin_memory: true\n  collate_fn_name_train: byteformer_audio_collate_fn\n  collate_fn_name_val: byteformer_audio_collate_fn\n  collate_fn_name_test: byteformer_audio_collate_fn\n  speech_commands_v2:\n    mixup: true\naudio_augmentation:\n  noise:\n    enable: true\n    levels:\n    - -50\n    refresh_freq: 100\n  roll:\n    enable: true\n    window: 0.1\n  torchaudio_save:\n    enable: true\n    encoding_dtype: int16\n    format: wav\nsampler:\n  name: batch_sampler\nloss:\n  category: classification\n  classification:\n    name: cross_entropy\n    cross_entropy:\n      label_smoothing: 0.1\noptim:\n  name: adamw\n  weight_decay: 0.05\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.999\nscheduler:\n  name: cosine\n  is_iteration_based: false\n  max_epochs: 300\n  warmup_iterations: 500\n  warmup_init_lr: 1.0e-06\n  cosine:\n    max_lr: 0.001\n    min_lr: 2.0e-05\nmodel:\n  audio_classification:\n    name: byteformer\n  classification:\n    name: byteformer\n    byteformer:\n      mode: tiny\n      max_num_tokens: 50000\n      conv_kernel_size: 16\n      window_sizes:\n      - 128\n    n_classes: 12\n  activation:\n    name: gelu\n  layer:\n    global_pool: mean\n    conv_init: kaiming_uniform\n    linear_init: trunc_normal\n    linear_init_std_dev: 0.02\nema:\n  enable: true\n  momentum: 0.0001\nstats:\n  val:\n  - loss\n  - top1\n  - top5\n  train:\n  - loss\n  checkpoint_metric: top1\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "projects/byteformer/speech_commands_wav/encoding_dtype=int16,conv_kernel_size=32.yaml",
    "content": "# pytest: disable\ncommon:\n  run_label: train\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\n  tensorboard_logging: false\n  accum_freq: 2\ndataset:\n  root_train: /mnt/audio_datasets/google_speech_recognition_v2\n  root_val: /mnt/audio_datasets/google_speech_recognition_v2\n  name: speech_commands_v2\n  category: audio_classification\n  train_batch_size0: 48\n  val_batch_size0: 48\n  eval_batch_size0: 48\n  workers: 10\n  persistent_workers: false\n  pin_memory: true\n  collate_fn_name_train: byteformer_audio_collate_fn\n  collate_fn_name_val: byteformer_audio_collate_fn\n  collate_fn_name_test: byteformer_audio_collate_fn\n  speech_commands_v2:\n    mixup: true\naudio_augmentation:\n  noise:\n    enable: true\n    levels:\n    - -50\n    refresh_freq: 100\n  roll:\n    enable: true\n    window: 0.1\n  torchaudio_save:\n    enable: true\n    encoding_dtype: int16\n    format: wav\nsampler:\n  name: batch_sampler\nloss:\n  category: classification\n  classification:\n    name: cross_entropy\n    cross_entropy:\n      label_smoothing: 0.1\noptim:\n  name: adamw\n  weight_decay: 0.05\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.999\nscheduler:\n  name: cosine\n  is_iteration_based: false\n  max_epochs: 300\n  warmup_iterations: 500\n  warmup_init_lr: 1.0e-06\n  cosine:\n    max_lr: 0.001\n    min_lr: 2.0e-05\nmodel:\n  audio_classification:\n    name: byteformer\n  classification:\n    name: byteformer\n    byteformer:\n      mode: tiny\n      max_num_tokens: 50000\n      conv_kernel_size: 32\n      window_sizes:\n      - 128\n    n_classes: 12\n  activation:\n    name: gelu\n  layer:\n    global_pool: mean\n    conv_init: kaiming_uniform\n    linear_init: trunc_normal\n    linear_init_std_dev: 0.02\nema:\n  enable: true\n  momentum: 0.0001\nstats:\n  val:\n  - loss\n  - top1\n  - top5\n  train:\n  - loss\n  checkpoint_metric: top1\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "projects/byteformer/speech_commands_wav/encoding_dtype=int16,conv_kernel_size=8.yaml",
    "content": "# pytest: disable\ncommon:\n  run_label: train\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\n  tensorboard_logging: false\n  accum_freq: 2\ndataset:\n  root_train: /mnt/audio_datasets/google_speech_recognition_v2\n  root_val: /mnt/audio_datasets/google_speech_recognition_v2\n  name: speech_commands_v2\n  category: audio_classification\n  train_batch_size0: 48\n  val_batch_size0: 48\n  eval_batch_size0: 48\n  workers: 10\n  persistent_workers: false\n  pin_memory: true\n  collate_fn_name_train: byteformer_audio_collate_fn\n  collate_fn_name_val: byteformer_audio_collate_fn\n  collate_fn_name_test: byteformer_audio_collate_fn\n  speech_commands_v2:\n    mixup: true\naudio_augmentation:\n  noise:\n    enable: true\n    levels:\n    - -50\n    refresh_freq: 100\n  roll:\n    enable: true\n    window: 0.1\n  torchaudio_save:\n    enable: true\n    encoding_dtype: int16\n    format: wav\nsampler:\n  name: batch_sampler\nloss:\n  category: classification\n  classification:\n    name: cross_entropy\n    cross_entropy:\n      label_smoothing: 0.1\noptim:\n  name: adamw\n  weight_decay: 0.05\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.999\nscheduler:\n  name: cosine\n  is_iteration_based: false\n  max_epochs: 300\n  warmup_iterations: 500\n  warmup_init_lr: 1.0e-06\n  cosine:\n    max_lr: 0.001\n    min_lr: 2.0e-05\nmodel:\n  audio_classification:\n    name: byteformer\n  classification:\n    name: byteformer\n    byteformer:\n      mode: tiny\n      max_num_tokens: 50000\n      conv_kernel_size: 8\n      window_sizes:\n      - 128\n    n_classes: 12\n  activation:\n    name: gelu\n  layer:\n    global_pool: mean\n    conv_init: kaiming_uniform\n    linear_init: trunc_normal\n    linear_init_std_dev: 0.02\nema:\n  enable: true\n  momentum: 0.0001\nstats:\n  val:\n  - loss\n  - top1\n  - top5\n  train:\n  - loss\n  checkpoint_metric: top1\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "projects/byteformer/speech_commands_wav/encoding_dtype=int32,conv_kernel_size=16.yaml",
    "content": "# pytest: disable\ncommon:\n  run_label: train\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\n  tensorboard_logging: false\n  accum_freq: 2\ndataset:\n  root_train: /mnt/audio_datasets/google_speech_recognition_v2\n  root_val: /mnt/audio_datasets/google_speech_recognition_v2\n  name: speech_commands_v2\n  category: audio_classification\n  train_batch_size0: 48\n  val_batch_size0: 48\n  eval_batch_size0: 48\n  workers: 10\n  persistent_workers: false\n  pin_memory: true\n  collate_fn_name_train: byteformer_audio_collate_fn\n  collate_fn_name_val: byteformer_audio_collate_fn\n  collate_fn_name_test: byteformer_audio_collate_fn\n  speech_commands_v2:\n    mixup: true\naudio_augmentation:\n  noise:\n    enable: true\n    levels:\n    - -50\n    refresh_freq: 100\n  roll:\n    enable: true\n    window: 0.1\n  torchaudio_save:\n    enable: true\n    encoding_dtype: int32\n    format: wav\nsampler:\n  name: batch_sampler\nloss:\n  category: classification\n  classification:\n    name: cross_entropy\n    cross_entropy:\n      label_smoothing: 0.1\noptim:\n  name: adamw\n  weight_decay: 0.05\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.999\nscheduler:\n  name: cosine\n  is_iteration_based: false\n  max_epochs: 300\n  warmup_iterations: 500\n  warmup_init_lr: 1.0e-06\n  cosine:\n    max_lr: 0.001\n    min_lr: 2.0e-05\nmodel:\n  audio_classification:\n    name: byteformer\n  classification:\n    name: byteformer\n    byteformer:\n      mode: tiny\n      max_num_tokens: 50000\n      conv_kernel_size: 16\n      window_sizes:\n      - 128\n    n_classes: 12\n  activation:\n    name: gelu\n  layer:\n    global_pool: mean\n    conv_init: kaiming_uniform\n    linear_init: trunc_normal\n    linear_init_std_dev: 0.02\nema:\n  enable: true\n  momentum: 0.0001\nstats:\n  val:\n  - loss\n  - top1\n  - top5\n  train:\n  - loss\n  checkpoint_metric: top1\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "projects/byteformer/speech_commands_wav/encoding_dtype=int32,conv_kernel_size=32.yaml",
    "content": "# pytest: disable\ncommon:\n  run_label: train\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\n  tensorboard_logging: false\n  accum_freq: 2\ndataset:\n  root_train: /mnt/audio_datasets/google_speech_recognition_v2\n  root_val: /mnt/audio_datasets/google_speech_recognition_v2\n  name: speech_commands_v2\n  category: audio_classification\n  train_batch_size0: 48\n  val_batch_size0: 48\n  eval_batch_size0: 48\n  workers: 10\n  persistent_workers: false\n  pin_memory: true\n  collate_fn_name_train: byteformer_audio_collate_fn\n  collate_fn_name_val: byteformer_audio_collate_fn\n  collate_fn_name_test: byteformer_audio_collate_fn\n  speech_commands_v2:\n    mixup: true\naudio_augmentation:\n  noise:\n    enable: true\n    levels:\n    - -50\n    refresh_freq: 100\n  roll:\n    enable: true\n    window: 0.1\n  torchaudio_save:\n    enable: true\n    encoding_dtype: int32\n    format: wav\nsampler:\n  name: batch_sampler\nloss:\n  category: classification\n  classification:\n    name: cross_entropy\n    cross_entropy:\n      label_smoothing: 0.1\noptim:\n  name: adamw\n  weight_decay: 0.05\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.999\nscheduler:\n  name: cosine\n  is_iteration_based: false\n  max_epochs: 300\n  warmup_iterations: 500\n  warmup_init_lr: 1.0e-06\n  cosine:\n    max_lr: 0.001\n    min_lr: 2.0e-05\nmodel:\n  audio_classification:\n    name: byteformer\n  classification:\n    name: byteformer\n    byteformer:\n      mode: tiny\n      max_num_tokens: 50000\n      conv_kernel_size: 32\n      window_sizes:\n      - 128\n    n_classes: 12\n  activation:\n    name: gelu\n  layer:\n    global_pool: mean\n    conv_init: kaiming_uniform\n    linear_init: trunc_normal\n    linear_init_std_dev: 0.02\nema:\n  enable: true\n  momentum: 0.0001\nstats:\n  val:\n  - loss\n  - top1\n  - top5\n  train:\n  - loss\n  checkpoint_metric: top1\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "projects/byteformer/speech_commands_wav/encoding_dtype=uint8,conv_kernel_size=16.yaml",
    "content": "# pytest: disable\ncommon:\n  run_label: train\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\n  tensorboard_logging: false\n  accum_freq: 2\ndataset:\n  root_train: /mnt/audio_datasets/google_speech_recognition_v2\n  root_val: /mnt/audio_datasets/google_speech_recognition_v2\n  name: speech_commands_v2\n  category: audio_classification\n  train_batch_size0: 48\n  val_batch_size0: 48\n  eval_batch_size0: 48\n  workers: 10\n  persistent_workers: false\n  pin_memory: true\n  collate_fn_name_train: byteformer_audio_collate_fn\n  collate_fn_name_val: byteformer_audio_collate_fn\n  collate_fn_name_test: byteformer_audio_collate_fn\n  speech_commands_v2:\n    mixup: true\naudio_augmentation:\n  noise:\n    enable: true\n    levels:\n    - -50\n    refresh_freq: 100\n  roll:\n    enable: true\n    window: 0.1\n  torchaudio_save:\n    enable: true\n    encoding_dtype: uint8\n    format: wav\nsampler:\n  name: batch_sampler\nloss:\n  category: classification\n  classification:\n    name: cross_entropy\n    cross_entropy:\n      label_smoothing: 0.1\noptim:\n  name: adamw\n  weight_decay: 0.05\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.999\nscheduler:\n  name: cosine\n  is_iteration_based: false\n  max_epochs: 300\n  warmup_iterations: 500\n  warmup_init_lr: 1.0e-06\n  cosine:\n    max_lr: 0.001\n    min_lr: 2.0e-05\nmodel:\n  audio_classification:\n    name: byteformer\n  classification:\n    name: byteformer\n    byteformer:\n      mode: tiny\n      max_num_tokens: 50000\n      conv_kernel_size: 16\n      window_sizes:\n      - 128\n    n_classes: 12\n  activation:\n    name: gelu\n  layer:\n    global_pool: mean\n    conv_init: kaiming_uniform\n    linear_init: trunc_normal\n    linear_init_std_dev: 0.02\nema:\n  enable: true\n  momentum: 0.0001\nstats:\n  val:\n  - loss\n  - top1\n  - top5\n  train:\n  - loss\n  checkpoint_metric: top1\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "projects/byteformer/speech_commands_wav/encoding_dtype=uint8,conv_kernel_size=32.yaml",
    "content": "# pytest: disable\ncommon:\n  run_label: train\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\n  tensorboard_logging: false\n  accum_freq: 2\ndataset:\n  root_train: /mnt/audio_datasets/google_speech_recognition_v2\n  root_val: /mnt/audio_datasets/google_speech_recognition_v2\n  name: speech_commands_v2\n  category: audio_classification\n  train_batch_size0: 48\n  val_batch_size0: 48\n  eval_batch_size0: 48\n  workers: 10\n  persistent_workers: false\n  pin_memory: true\n  collate_fn_name_train: byteformer_audio_collate_fn\n  collate_fn_name_val: byteformer_audio_collate_fn\n  collate_fn_name_test: byteformer_audio_collate_fn\n  speech_commands_v2:\n    mixup: true\naudio_augmentation:\n  noise:\n    enable: true\n    levels:\n    - -50\n    refresh_freq: 100\n  roll:\n    enable: true\n    window: 0.1\n  torchaudio_save:\n    enable: true\n    encoding_dtype: uint8\n    format: wav\nsampler:\n  name: batch_sampler\nloss:\n  category: classification\n  classification:\n    name: cross_entropy\n    cross_entropy:\n      label_smoothing: 0.1\noptim:\n  name: adamw\n  weight_decay: 0.05\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.999\nscheduler:\n  name: cosine\n  is_iteration_based: false\n  max_epochs: 300\n  warmup_iterations: 500\n  warmup_init_lr: 1.0e-06\n  cosine:\n    max_lr: 0.001\n    min_lr: 2.0e-05\nmodel:\n  audio_classification:\n    name: byteformer\n  classification:\n    name: byteformer\n    byteformer:\n      mode: tiny\n      max_num_tokens: 50000\n      conv_kernel_size: 32\n      window_sizes:\n      - 128\n    n_classes: 12\n  activation:\n    name: gelu\n  layer:\n    global_pool: mean\n    conv_init: kaiming_uniform\n    linear_init: trunc_normal\n    linear_init_std_dev: 0.02\nema:\n  enable: true\n  momentum: 0.0001\nstats:\n  val:\n  - loss\n  - top1\n  - top5\n  train:\n  - loss\n  checkpoint_metric: top1\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "projects/byteformer/speech_commands_wav/encoding_dtype=uint8,conv_kernel_size=4.yaml",
    "content": "# pytest: disable\ncommon:\n  run_label: train\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\n  tensorboard_logging: false\n  accum_freq: 2\ndataset:\n  root_train: /mnt/audio_datasets/google_speech_recognition_v2\n  root_val: /mnt/audio_datasets/google_speech_recognition_v2\n  name: speech_commands_v2\n  category: audio_classification\n  train_batch_size0: 48\n  val_batch_size0: 48\n  eval_batch_size0: 48\n  workers: 10\n  persistent_workers: false\n  pin_memory: true\n  collate_fn_name_train: byteformer_audio_collate_fn\n  collate_fn_name_val: byteformer_audio_collate_fn\n  collate_fn_name_test: byteformer_audio_collate_fn\n  speech_commands_v2:\n    mixup: true\naudio_augmentation:\n  noise:\n    enable: true\n    levels:\n    - -50\n    refresh_freq: 100\n  roll:\n    enable: true\n    window: 0.1\n  torchaudio_save:\n    enable: true\n    encoding_dtype: uint8\n    format: wav\nsampler:\n  name: batch_sampler\nloss:\n  category: classification\n  classification:\n    name: cross_entropy\n    cross_entropy:\n      label_smoothing: 0.1\noptim:\n  name: adamw\n  weight_decay: 0.05\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.999\nscheduler:\n  name: cosine\n  is_iteration_based: false\n  max_epochs: 300\n  warmup_iterations: 500\n  warmup_init_lr: 1.0e-06\n  cosine:\n    max_lr: 0.001\n    min_lr: 2.0e-05\nmodel:\n  audio_classification:\n    name: byteformer\n  classification:\n    name: byteformer\n    byteformer:\n      mode: tiny\n      max_num_tokens: 50000\n      conv_kernel_size: 4\n      window_sizes:\n      - 128\n    n_classes: 12\n  activation:\n    name: gelu\n  layer:\n    global_pool: mean\n    conv_init: kaiming_uniform\n    linear_init: trunc_normal\n    linear_init_std_dev: 0.02\nema:\n  enable: true\n  momentum: 0.0001\nstats:\n  val:\n  - loss\n  - top1\n  - top5\n  train:\n  - loss\n  checkpoint_metric: top1\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "projects/byteformer/speech_commands_wav/encoding_dtype=uint8,conv_kernel_size=8.yaml",
    "content": "# pytest: disable\ncommon:\n  run_label: train\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\n  tensorboard_logging: false\n  accum_freq: 2\ndataset:\n  root_train: /mnt/audio_datasets/google_speech_recognition_v2\n  root_val: /mnt/audio_datasets/google_speech_recognition_v2\n  name: speech_commands_v2\n  category: audio_classification\n  train_batch_size0: 48\n  val_batch_size0: 48\n  eval_batch_size0: 48\n  workers: 10\n  persistent_workers: false\n  pin_memory: true\n  collate_fn_name_train: byteformer_audio_collate_fn\n  collate_fn_name_val: byteformer_audio_collate_fn\n  collate_fn_name_test: byteformer_audio_collate_fn\n  speech_commands_v2:\n    mixup: true\naudio_augmentation:\n  noise:\n    enable: true\n    levels:\n    - -50\n    refresh_freq: 100\n  roll:\n    enable: true\n    window: 0.1\n  torchaudio_save:\n    enable: true\n    encoding_dtype: uint8\n    format: wav\nsampler:\n  name: batch_sampler\nloss:\n  category: classification\n  classification:\n    name: cross_entropy\n    cross_entropy:\n      label_smoothing: 0.1\noptim:\n  name: adamw\n  weight_decay: 0.05\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.999\nscheduler:\n  name: cosine\n  is_iteration_based: false\n  max_epochs: 300\n  warmup_iterations: 500\n  warmup_init_lr: 1.0e-06\n  cosine:\n    max_lr: 0.001\n    min_lr: 2.0e-05\nmodel:\n  audio_classification:\n    name: byteformer\n  classification:\n    name: byteformer\n    byteformer:\n      mode: tiny\n      max_num_tokens: 50000\n      conv_kernel_size: 8\n      window_sizes:\n      - 128\n    n_classes: 12\n  activation:\n    name: gelu\n  layer:\n    global_pool: mean\n    conv_init: kaiming_uniform\n    linear_init: trunc_normal\n    linear_init_std_dev: 0.02\nema:\n  enable: true\n  momentum: 0.0001\nstats:\n  val:\n  - loss\n  - top1\n  - top5\n  train:\n  - loss\n  checkpoint_metric: top1\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "projects/catlip/README-multi-label-object-classification.md",
    "content": "# Multi-label Object Classification using CatLIP\n\nBelow are instructions for [training](#training-on-coco) a pre-trained CatLIP model on the COCO dataset and [evaluating](#evaluation) its accuracy. \n\nWe also provide [pre-trained model weights](#pretrained-model-weights-on-coco) for different multi-label classification models.\n\n## Training on COCO\n\nTo finetune ViT-B, pretrained using CatLIP, on COCO using four A100 GPU, run the following command:\n\n```bash\nexport CFG_FILE=projects/catlip/multi_label_image_classification/vit_base.yaml\ncorenet-train --common.config-file $CFG_FILE --common.results-loc classification_results\n```\n\nWe assume that the training and validation data is located at `/mnt/vision_datasets/coco`. \n\n## Evaluation\n\nTo evaluate the finetuned `ViT-B` model on the validation set of the COCO, run the following command:\n\n```bash\nexport CFG_FILE=projects/catlip/multi_label_image_classification/vit_base.yaml\nexport DATASET_PATH=\"/mnt/vision_datasets/coco\" # change to the COCO validation path\nexport MODEL_WEIGHTS=https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/multi-label-classification/coco/vit_base.pt\nCUDA_VISIBLE_DEVICES=0 corenet-eval --common.config-file $CFG_FILE --common.override-kwargs dataset.root_val=$DATASET_PATH model.classification.pretrained=$MODEL_WEIGHTS model.resume_exclude_scopes=''\n```\n\nThis should give\n```\n'micro': 0.9118, 'macro': 0.8806, 'weighted': 0.8907\n```\n\n## Pretrained Model Weights on COCO\n\n| Model | Macro mAP | Pretrained weights |\n| ---- | ---- | ---- |\n| ViT-B/16 | 88.06 | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/multi-label-classification/coco/vit_base.pt) |\n| ViT-L/16 | 90.75 | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/multi-label-classification/coco/vit_large.pt) |\n"
  },
  {
    "path": "projects/catlip/README-object-detection.md",
    "content": "# Training and Evaluating CatLIP Pre-trained Models on the MS-COCO dataset for Object Detection\n\nBelow are instructions for [training](#training-mask-r-cnn) a pre-trained CatLIP model with Mask R-CNN on the COCO dataset and [evaluating](#evaluating-mask-r-cnn) its accuracy.\n\nWe also provide [pre-trained model weights](#pre-trained-models) for different detection model variants.\n\n## Training Mask R-CNN\n\nThe following command trains Mask R-CNN with CatLIP's ViT-B/16 image backbone assuming 8 nodes each with 8 80GB GPUs (verified on A100s):\n\n```bash\nexport CFG_FILE=projects/catlip/object_detection/maskrcnn_vit_base.yaml\ncorenet-train --common.config-file $CFG_FILE --common.results-loc detection_results\n```\n\nPlease see [detection](./object_detection) folder for configuration files of different ViT variants.\n\n***Note***: Do not forget to change the training and validation dataset locations in configuration files.\n\n## Evaluating Mask R-CNN\n\nEvaluation on the validation set can be done using the command below:\n\n```bash\nexport CFG_FILE=projects/catlip/object_detection/maskrcnn_vit_base.yaml\nexport DATASET_PATH=\"/mnt/vision_datasets/coco\" # Change the path\nexport MODEL_WEIGHTS=https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/object-detection/coco/maskrcnn_vit_base.pt\nCUDA_VISIBLE_DEVICES=0 corenet-eval-det --common.config-file $CFG_FILE \\\n--model.detection.pretrained $MODEL_WEIGHTS \\\n--common.override-kwargs dataset.root_val=$DATASET_PATH\n```\n\nThis should give\n\n```shell\nEvaluate annotation type *bbox* \nDONE (t=25.77s). \nAccumulating evaluation results...             \nDONE (t=4.29s). \nAverage Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.499 \nAverage Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 0.727 \nAverage Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 0.546 \nAverage Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.339 \nAverage Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.532 \nAverage Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.652 \nAverage Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.374 \nAverage Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.598 \nAverage Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.629 \nAverage Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.474 \nAverage Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.668 \nAverage Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.771 \n\nRunning per image evaluation... \nEvaluate annotation type *segm* \nDONE (t=29.50s). \nAccumulating evaluation results... \nDONE (t=4.24s). \nAverage Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.436 \nAverage Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 0.694 \nAverage Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 0.464 \nAverage Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.243 \nAverage Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.466 \nAverage Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.638 \nAverage Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.340 \nAverage Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.531 \nAverage Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.556 \nAverage Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.387 \nAverage Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.595 \nAverage Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.724\n```\n\n## Pretrained Model Weights\n\n| Model | mAP (bbox) | mAP (segm) | Pretrained weights |\n| ---- | ---- | ---- | ---- |\n| Mask R-CNN w/ ViT-B/16 | 49.9 | 43.6 | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/object-detection/coco/maskrcnn_vit_base.pt) |\n| Mask R-CNN w/ ViT-L/16 | 52.8 | 46.0 | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/object-detection/coco/maskrcnn_vit_large.pt) |\n| Mask R-CNN w/ ViT-H/16 | 53.3 | 46.4 | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/object-detection/coco/maskrcnn_vit_huge.pt) |\n"
  },
  {
    "path": "projects/catlip/README-pretraining.md",
    "content": "# Training CatLIP Models on Noisy Image-text Datasets\n\n## Setup instructions\n\nBesides set-up instructions in CoreNet, please install NLTK library for CatLIP pre-training using below commands:\n\n```bash\npython3 -m pip install nltk==3.8.1 \npython3 -m nltk.downloader all\n```\n\n## Dataset preparation\n\nTo prepare the dataset, see the documentation in the [img_text_tar_dataset.py](../../corenet/data/datasets/multi_modal_img_text/img_text_tar_dataset.py) file. In our experiments, we produce multi-class labels from text captions `on-the-fly`. However, they can be cached for efficiency. See [wordnet_tagged_classification.py](../../corenet/data/datasets/classification/wordnet_tagged_classification.py) for details.\n\n## Training CatLIP on image-text pair dataset\n\nCatLIP leverages our custom ViT implementation that can be used with multi-scale variable batch sampler. CatLIP models are \ntrained on multiple nodes, each node with multiple GPUs. Please see comments in configuration files for exact number of \nGPUs and nodes used in our experiments.\n\n\nAn example command for training on `i-th` node is\n```bash\nexport CFG_FILE=\"PATH_TO_MODEL_CONFIGURATION_FILE\"\nexport RANK=<NODE_ID> * <NUM_GPUS_PER_NODE> # For Node-0, RANK=0; For Node-1, Rank=8, For Node-2, RANK=16, and so on.\nexport WORLD_SIZE=<NUM_NODES> * <NUM_GPUS_PER_NODE> # WORLD_SIZE=32 nodes * 8 GPUS per node = 256\ncorenet-train --common.config-file $CFG_FILE --common.results-loc results_catlip --ddp.rank $RANK --ddp.world-size $WORLD_SIZE --ddp.dist-url 'tcp://IP_OF_NODE0:FREEPORT'\n```\n\n***Note***: Do not forget to change the `metadata_file` and `vocab_file` paths in the configuration files.\n\n## Pretraining checkpoints and vocabulary file\n\nThe pre-training checkpoints and vocabulary files for DataComp-1.3B can be downloaded using below links:\n\n| Name | Link |\n| ---- | ---- |\n| Vocabulary file | [Vocabulary](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/pretraining_vocab/datacomp_1_2B_vocab.pkl) |\n| ViT-B/16 | [ViT-B/16 Pre-trained weights](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/pretrained_models/vit_base.pt) |\n| ViT-L/16 | [ViT-L/16 Pre-trained weights](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/pretrained_models/vit_large.pt) |\n| ViT-H/16 | [ViT-H/16 Pre-trained weights](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/pretrained_models/vit_huge.pt) |\n\nThe pre-training checkpoints are the checkpoints obtained with EMA at the end of training.\n"
  },
  {
    "path": "projects/catlip/README-semantic-segmentation.md",
    "content": "# Training and Evaluating CatLIP Pre-trained Models on the ADE20k dataset for Semantic Segmentation\n\nBelow are instructions for [training](#training-deeplabv3) a pre-trained CatLIP model with DeepLabv3 on the ADE20k dataset and [evaluating](#evaluating-deeplabv3) its accuracy.\n\nWe also provide [pre-trained model weights](#pre-trained-models) for different segmentation models.\n\n## Training DeepLabv3\n\nSingle node `8 A100 GPU` training of DeepLabv3 with CatLIP's ViT-B/16 image backbone can be done using below command:\n\n```bash\nexport CFG_FILE=projects/catlip/semantic_segmentation/deeplabv3_vit_base.yaml\ncorenet-train --common.config-file $CFG_FILE --common.results-loc detection_results\n```\n\nPlease see [semantic segmentation](./semantic_segmentation) folder for configuration files of different ViT variants.\n\n***Note***: Do not forget to change the training and validation dataset locations in configuration files.\n\n## Evaluating DeepLabv3\n\nEvaluation on the validation set can be done using the below command:\n\n```bash\nexport DATASET_PATH=\"/mnt/vision_datasets/ADEChallengeData2016/\" # Change the path\nexport CFG_FILE=projects/catlip/semantic_segmentation/deeplabv3_vit_base.yaml\nexport MODEL_WEIGHTS=https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/semantic-segmentation/ade20k/deeplabv3_vit_base.pt\nCUDA_VISIBLE_DEVICES=0 corenet-eval-seg --common.config-file $CFG_FILE \\\n--model.segmentation.pretrained $MODEL_WEIGHTS \\\n--common.override-kwargs dataset.root_val=$DATASET_PATH\n```\n\nThis should give\n\n```\nmean IoU: 50.12\n```\n\n## Pretrained Model Weights\n\n| Model | mIoU | Pretrained weights |\n| ---- | ---- | ---- |\n| Mask R-CNN w/ ViT-B/16 | 50.1 | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/semantic-segmentation/ade20k/deeplabv3_vit_base.pt) |\n| Mask R-CNN w/ ViT-L/16 | 54.8 | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/semantic-segmentation/ade20k/deeplabv3_vit_large.pt) |\n| Mask R-CNN w/ ViT-H/16 | 55.6 | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/semantic-segmentation/ade20k/deeplabv3_vit_huge.pt) |\n"
  },
  {
    "path": "projects/catlip/README-single-label-object-classification.md",
    "content": "# Training CatLIP Models on the Single-label Object Classification Datasets\n\nBelow are instructions for [training](#training) a pre-trained CatLIP model on the ImageNet dataset and [evaluating](#evaluation) its accuracy. Similarly, this fine-tuning process can be applied to the Places365 dataset. \n\nWe also provide [pre-trained model weights](#pretrained-model-weights) for different classification models.\n\n## Training\n\nTo train ViT-B, pretrained using CatLIP, on [ImageNet](https://image-net.org) using a single A100 GPU, run the following command:\n\n```bash\nexport CFG_FILE=projects/catlip/image_classification/imagenet/vit_base.yaml\ncorenet-train --common.config-file $CFG_FILE --common.results-loc classification_results\n```\n\nWe assume that the training and validation data is located at `/mnt/imagenet/training` and `/mnt/imagenet/validation` folders, respectively. \n\n## Evaluation\n\nTo evaluate the finetuned `ViT-B` model on the validation set of the ImageNet, run the following command:\n\n```bash\nexport CFG_FILE=projects/catlip/image_classification/imagenet/vit_base.yaml\nexport DATASET_PATH=\"/mnt/vision_datasets/imagenet/validation/\" # change to the ImageNet validation path\nexport MODEL_WEIGHTS=https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/image-classification/imagenet-1k/vit_base.pt\nCUDA_VISIBLE_DEVICES=0 corenet-eval --common.config-file $CFG_FILE --common.override-kwargs dataset.root_val=$DATASET_PATH model.classification.pretrained=$MODEL_WEIGHTS model.resume_exclude_scopes=''\n```\n\nThis should give\n```\ntop1={'logits': 84.158} || top5={'logits': 97.006}\n```\n\n## Pretrained Model Weights\n\n### ImageNet-1k\n\n| Model | Resolution | Top-1 | Pretrained weights |\n| ---- | ---- | ---- | ---- |\n| ViT-B/16 | 224x224 | 84.2 | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/image-classification/imagenet-1k/vit_base.pt) |\n| ViT-L/16 | 224x224 | 86.8 | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/image-classification/imagenet-1k/vit_large.pt) |\n| ViT-H/16 | 224x224 | 87.1 | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/image-classification/imagenet-1k/vit_huge.pt) |\n| ---- | ---- | ---- | ---- |\n| ViT-B/16 | 512x512 | 86.1 | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/image-classification/imagenet-1k/vit_base_512x512.pt) |\n| ViT-L/16 | 512x512 | 88.6 | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/image-classification/imagenet-1k/vit_large_512x512.pt) |\n| ViT-H/16 | 512x512 | 88.7 | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/image-classification/imagenet-1k/vit_huge_512x512.pt) |\n\n### Places365\n\n| Model | Resolution | Top-1 | Pretrained weights |\n| ---- | ---- | ---- | ---- |\n| ViT-B/16 | 224x224 | 59.3 | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/image-classification/places365/vit_base.pt) |\n| ViT-L/16 | 224x224 | 60.4 | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/image-classification/places365/vit_large.pt) |\n| ViT-H/16 | 224x224 | 60.3 | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/image-classification/places365/vit_huge.pt) |\n| ---- | ---- | ---- | ---- |\n| ViT-B/16 | 512x512 | 59.4 | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/image-classification/places365/vit_base_512x512.pt) |\n| ViT-L/16 | 224x224 | 60.7 | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/image-classification/places365/vit_large_512x512.pt) |\n| ViT-H/16 | 224x224 | 61.1 | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/image-classification/places365/vit_huge_512x512.pt) |\n"
  },
  {
    "path": "projects/catlip/README.md",
    "content": "# CatLIP: CLIP-level Visual Recognition Accuracy with 2.7x Faster Pre-training on Web-scale Image-Text Data \n[![arXiv](https://img.shields.io/badge/arXiv-2404.15653-a6dba0.svg)](https://arxiv.org/abs/2404.15653)\n\n`CatLIP` introduces a novel weakly supervised pre-training approach for vision models on web-scale noisy image-text data, *reframing pre-training as a classification task to circumvent computational challenges associated with pairwise similarity computations in contrastive learning*, resulting in a significant 2.7x acceleration in training speed while maintaining high representation quality across various vision tasks.\n\nWe provide training and evaluation code along with pretrained models and configuration files for the following tasks:\n\n1. [CatLIP Pre-training](./README-pretraining.md)\n2. [Single-label Object Classification with CatLIP](./README-single-label-object-classification.md)\n3. [Multi-label Object Classification with CatLIP](./README-multi-label-object-classification.md)\n4. [Object Detection with CatLIP](./README-object-detection.md)\n4. [Semantic Segmentation with CatLIP](./README-semantic-segmentation.md)\n\n## Citation\n\nIf you find our work useful, please cite:\n\n```BibTex \n@article{mehta2024catlip,\n  title={CatLIP: CLIP-level Visual Recognition Accuracy with 2.7x Faster Pre-training on Web-scale Image-Text Data}, \n  author={Sachin Mehta and Maxwell Horton and Fartash Faghri and Mohammad Hossein Sekhavat and Mahyar Najibi and Mehrdad Farajtabar and Oncel Tuzel and Mohammad Rastegari},\n  year={2024},\n  eprint={2404.15653},\n  archivePrefix={arXiv},\n  primaryClass={cs.CV}\n}\n\n@inproceedings{mehta2022cvnets, \n     author = {Mehta, Sachin and Abdolhosseini, Farzad and Rastegari, Mohammad}, \n     title = {CVNets: High Performance Library for Computer Vision}, \n     year = {2022}, \n     booktitle = {Proceedings of the 30th ACM International Conference on Multimedia}, \n     series = {MM '22} \n}\n```\n"
  },
  {
    "path": "projects/catlip/image_classification/imagenet/vit_base.yaml",
    "content": "# pytest: disable\n\ntaskname: '+ ViT-B/16 [FT-IN1k]'\n\ncommon:\n  run_label: \"train\"\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\n  mixed_precision_dtype: \"bfloat16\"\n  grad_clip: 1.0\n  save_all_checkpoints: true\n\ndataset:\n  root_train: \"/mnt/vision_datasets/imagenet/training\"\n  root_val: \"/mnt/vision_datasets/imagenet/validation\"\n  # effective batch size is 512 (512 * 1 A100 80 GB GPU)\n  train_batch_size0: 512\n  val_batch_size0: 100\n  eval_batch_size0: 100\n  workers: -1 # use all CPUs\n  persistent_workers: true\n  pin_memory: true\n  name: \"imagenet\"\n  category: \"classification\"\n\nimage_augmentation:\n  # training related augmentation\n  random_resized_crop:\n    enable: true\n    interpolation: \"bilinear\"\n  random_horizontal_flip:\n    enable: true\n  # validation related augmentation\n  resize:\n    enable: true\n    size: 232\n    interpolation: \"bilinear\"\n  center_crop:\n    enable: true\n    size: 224\n\nsampler:\n  name: \"variable_batch_sampler\"\n  vbs:\n    crop_size_width: 224\n    crop_size_height: 224\n    max_n_scales: 25\n    min_crop_size_width: 128\n    max_crop_size_width: 320\n    min_crop_size_height: 128\n    max_crop_size_height: 320\n    check_scale: 32\n\nloss:\n  category: \"composite_loss\"\n  composite_loss:\n    - loss_category: \"classification\"\n      loss_weight: 1.0\n      classification:\n        name: \"cross_entropy\"\n        cross_entropy:\n          label_smoothing: 0.1\n    - loss_category: \"neural_augmentation\"\n      loss_weight: 1.0\n      neural_augmentation:\n        perceptual_metric: \"psnr\"\n        target_value: [ 40, 20 ]\n        curriculum_method: \"cosine\"\n\noptim:\n  name: \"adamw\"\n  weight_decay: 0.05\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.999\n\nscheduler:\n  name: \"cosine\"\n  max_epochs: 10\n  warmup_iterations: 500\n  warmup_init_lr: 1.e-6\n  cosine:\n    max_lr: 0.00003\n    min_lr: 0.000003\n\nmodel:\n  activation_checkpointing: true\n  # during finetuning, we need to skip loading the classifier from a pre-trained model\n  # because the number of classes in down-stream task and pre-training are different.\n  resume_exclude_scopes: [ \"classifier\" ]\n  classification:\n    name: \"vit\"\n    n_classes: 1000\n    # Initalize the model with a pre-trained model and finetune it.\n    # Note that during evaluation, we need to set 'resume_exclude_scopes' to an empty string\n    # and replace the 'pretrained' with the fine-tuned model path.\n    pretrained: \"https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/pretrained_models/vit_base.pt\"\n    vit:\n      mode: \"base\"\n      norm_layer: \"layer_norm_fp32\"\n      use_flash_attention: true\n  # use rangeaugment\n  learn_augmentation: \n    brightness: true\n    contrast: true\n    noise: true\n    mode: \"distribution\"\n  activation:\n    name: \"gelu\"\n  layer:\n    conv_init: \"kaiming_normal\"\n    linear_init: \"trunc_normal\"\n    linear_init_std_dev: 0.02\n  \nema:\n  enable: true\n  momentum: 0.0005\n\nstats:\n  train: [\"loss\"]\n  val: [ \"loss\", \"top1\", \"top5\" ]\n  checkpoint_metric: \"top1.logits\"\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "projects/catlip/image_classification/imagenet/vit_base_512x512.yaml",
    "content": "# pytest: disable\n\ntaskname: '+ ViT-B/16 [FT-IN1k-512x512]'\n\ncommon:\n  run_label: \"train\"\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\n  mixed_precision_dtype: \"bfloat16\"\n  grad_clip: 1.0\n  save_all_checkpoints: true\n\ndataset:\n  root_train: \"/mnt/vision_datasets/imagenet/training\"\n  root_val: \"/mnt/vision_datasets/imagenet/validation\"\n  # effective batch size is 512 (64 * 8 A100 80 GB GPU)\n  train_batch_size0: 64\n  val_batch_size0: 100\n  eval_batch_size0: 100\n  workers: -1 # use all CPUs\n  persistent_workers: true\n  pin_memory: true\n  name: \"imagenet\"\n  category: \"classification\"\n\nimage_augmentation:\n  # training related augmentation\n  random_resized_crop:\n    enable: true\n    interpolation: \"bilinear\"\n  random_horizontal_flip:\n    enable: true\n  # validation related augmentation\n  resize:\n    enable: true\n    size: 512\n    interpolation: \"bilinear\"\n  center_crop:\n    enable: true\n    size: 512\n\nsampler:\n  name: \"variable_batch_sampler\"\n  vbs:\n    crop_size_width: 512\n    crop_size_height: 512\n    max_n_scales: 25\n    min_crop_size_width: 256\n    max_crop_size_width: 512\n    min_crop_size_height: 256\n    max_crop_size_height: 512\n    check_scale: 32\n\nloss:\n  category: \"composite_loss\"\n  composite_loss:\n    - loss_category: \"classification\"\n      loss_weight: 1.0\n      classification:\n        name: \"cross_entropy\"\n        cross_entropy:\n          label_smoothing: 0.1\n    - loss_category: \"neural_augmentation\"\n      loss_weight: 1.0\n      neural_augmentation:\n        perceptual_metric: \"psnr\"\n        target_value: [ 40, 20 ]\n        curriculum_method: \"cosine\"\n\noptim:\n  name: \"adamw\"\n  weight_decay: 0.05\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.999\n\nscheduler:\n  name: \"cosine\"\n  max_epochs: 10\n  warmup_iterations: 500\n  warmup_init_lr: 1.e-6\n  cosine:\n    max_lr: 0.00003\n    min_lr: 0.000003\n\nmodel:\n  activation_checkpointing: true\n  # during finetuning, we need to skip loading the classifier from a pre-trained model\n  # because the number of classes in down-stream task and pre-training are different.\n  resume_exclude_scopes: [ \"classifier\" ]\n  classification:\n    name: \"vit\"\n    n_classes: 1000\n    # Initalize the model with a pre-trained model and finetune it.\n    # Note that during evaluation, we need to set 'resume_exclude_scopes' to an empty string\n    # and replace the 'pretrained' with the fine-tuned model path.\n    pretrained: \"https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/pretrained_models/vit_base.pt\"\n    vit:\n      mode: \"base\"\n      norm_layer: \"layer_norm_fp32\"\n      use_flash_attention: true\n  # use rangeaugment\n  learn_augmentation: \n    brightness: true\n    contrast: true\n    noise: true\n    mode: \"distribution\"\n  activation:\n    name: \"gelu\"\n  layer:\n    conv_init: \"kaiming_normal\"\n    linear_init: \"trunc_normal\"\n    linear_init_std_dev: 0.02\n  \nema:\n  enable: true\n  momentum: 0.0005\n\nstats:\n  train: [\"loss\"]\n  val: [ \"loss\", \"top1\", \"top5\" ]\n  checkpoint_metric: \"top1.logits\"\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "projects/catlip/image_classification/imagenet/vit_huge.yaml",
    "content": "# pytest: disable\n\ntaskname: '+ ViT-H/16 [FT-IN1k]'\n\ncommon:\n  run_label: \"train\"\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\n  mixed_precision_dtype: \"bfloat16\"\n  grad_clip: 1.0\n  save_all_checkpoints: true\n\ndataset:\n  root_train: \"/mnt/vision_datasets/imagenet/training\"\n  root_val: \"/mnt/vision_datasets/imagenet/validation\"\n  # effective batch size is 512 (128 * 4 A100 80 GB GPU)\n  train_batch_size0: 128\n  val_batch_size0: 100\n  eval_batch_size0: 100\n  workers: -1 # use all CPUs\n  persistent_workers: true\n  pin_memory: true\n  name: \"imagenet\"\n  category: \"classification\"\n\nimage_augmentation:\n  # training related augmentation\n  random_resized_crop:\n    enable: true\n    interpolation: \"bilinear\"\n  random_horizontal_flip:\n    enable: true\n  # validation related augmentation\n  resize:\n    enable: true\n    size: 232\n    interpolation: \"bilinear\"\n  center_crop:\n    enable: true\n    size: 224\n\nsampler:\n  name: \"variable_batch_sampler\"\n  vbs:\n    crop_size_width: 224\n    crop_size_height: 224\n    max_n_scales: 25\n    min_crop_size_width: 128\n    max_crop_size_width: 320\n    min_crop_size_height: 128\n    max_crop_size_height: 320\n    check_scale: 32\n\nloss:\n  category: \"composite_loss\"\n  composite_loss:\n    - loss_category: \"classification\"\n      loss_weight: 1.0\n      classification:\n        name: \"cross_entropy\"\n        cross_entropy:\n          label_smoothing: 0.1\n    - loss_category: \"neural_augmentation\"\n      loss_weight: 1.0\n      neural_augmentation:\n        perceptual_metric: \"psnr\"\n        target_value: [ 40, 20 ]\n        curriculum_method: \"cosine\"\n\noptim:\n  name: \"adamw\"\n  weight_decay: 0.05\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.999\n\nscheduler:\n  name: \"cosine\"\n  max_epochs: 10\n  warmup_iterations: 500\n  warmup_init_lr: 1.e-6\n  cosine:\n    max_lr: 0.00003\n    min_lr: 0.000003\n\nmodel:\n  activation_checkpointing: true\n  # during finetuning, we need to skip loading the classifier from a pre-trained model\n  # because the number of classes in down-stream task and pre-training are different.\n  resume_exclude_scopes: [ \"classifier\" ]\n  classification:\n    name: \"vit\"\n    n_classes: 1000\n    # Initalize the model with a pre-trained model and finetune it.\n    # Note that during evaluation, we need to set 'resume_exclude_scopes' to an empty string\n    # and replace the 'pretrained' with the fine-tuned model path.\n    pretrained: \"https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/pretrained_models/vit_huge.pt\"\n    vit:\n      mode: \"huge\"\n      norm_layer: \"layer_norm_fp32\"\n      use_flash_attention: true\n  # use rangeaugment\n  learn_augmentation: \n    brightness: true\n    contrast: true\n    noise: true\n    mode: \"distribution\"\n  activation:\n    name: \"gelu\"\n  layer:\n    conv_init: \"kaiming_normal\"\n    linear_init: \"trunc_normal\"\n    linear_init_std_dev: 0.02\n  \nema:\n  enable: true\n  momentum: 0.0005\n\nstats:\n  train: [\"loss\"]\n  val: [ \"loss\", \"top1\", \"top5\" ]\n  checkpoint_metric: \"top1.logits\"\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "projects/catlip/image_classification/imagenet/vit_huge_512x512.yaml",
    "content": "# pytest: disable\n\ntaskname: '+ ViT-H/16 [FT-IN1k-512x512]'\n\ncommon:\n  run_label: \"train\"\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\n  mixed_precision_dtype: \"bfloat16\"\n  grad_clip: 1.0\n  save_all_checkpoints: true\n\ndataset:\n  root_train: \"/mnt/vision_datasets/imagenet/training\"\n  root_val: \"/mnt/vision_datasets/imagenet/validation\"\n  # effective batch size is 512 (32 * 8 A100 80 GB GPU * 2 nodes)\n  train_batch_size0: 32\n  val_batch_size0: 100\n  eval_batch_size0: 100\n  workers: -1 # use all CPUs\n  persistent_workers: true\n  pin_memory: true\n  name: \"imagenet\"\n  category: \"classification\"\n\nimage_augmentation:\n  # training related augmentation\n  random_resized_crop:\n    enable: true\n    interpolation: \"bilinear\"\n  random_horizontal_flip:\n    enable: true\n  # validation related augmentation\n  resize:\n    enable: true\n    size: 512\n    interpolation: \"bilinear\"\n  center_crop:\n    enable: true\n    size: 512\n\nsampler:\n  name: \"variable_batch_sampler\"\n  vbs:\n    crop_size_width: 512\n    crop_size_height: 512\n    max_n_scales: 25\n    min_crop_size_width: 256\n    max_crop_size_width: 512\n    min_crop_size_height: 256\n    max_crop_size_height: 512\n    check_scale: 32\n\nloss:\n  category: \"composite_loss\"\n  composite_loss:\n    - loss_category: \"classification\"\n      loss_weight: 1.0\n      classification:\n        name: \"cross_entropy\"\n        cross_entropy:\n          label_smoothing: 0.1\n    - loss_category: \"neural_augmentation\"\n      loss_weight: 1.0\n      neural_augmentation:\n        perceptual_metric: \"psnr\"\n        target_value: [ 40, 20 ]\n        curriculum_method: \"cosine\"\n\noptim:\n  name: \"adamw\"\n  weight_decay: 0.05\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.999\n\nscheduler:\n  name: \"cosine\"\n  max_epochs: 10\n  warmup_iterations: 500\n  warmup_init_lr: 1.e-6\n  cosine:\n    max_lr: 0.00003\n    min_lr: 0.000003\n\nmodel:\n  activation_checkpointing: true\n  # during finetuning, we need to skip loading the classifier from a pre-trained model\n  # because the number of classes in down-stream task and pre-training are different.\n  resume_exclude_scopes: [ \"classifier\" ]\n  classification:\n    name: \"vit\"\n    n_classes: 1000\n    # Initalize the model with a pre-trained model and finetune it.\n    # Note that during evaluation, we need to set 'resume_exclude_scopes' to an empty string\n    # and replace the 'pretrained' with the fine-tuned model path.\n    pretrained: \"https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/pretrained_models/vit_huge.pt\"\n    vit:\n      mode: \"huge\"\n      norm_layer: \"layer_norm_fp32\"\n      use_flash_attention: true\n  # use rangeaugment\n  learn_augmentation: \n    brightness: true\n    contrast: true\n    noise: true\n    mode: \"distribution\"\n  activation:\n    name: \"gelu\"\n  layer:\n    conv_init: \"kaiming_normal\"\n    linear_init: \"trunc_normal\"\n    linear_init_std_dev: 0.02\n  \nema:\n  enable: true\n  momentum: 0.0005\n\nstats:\n  train: [\"loss\"]\n  val: [ \"loss\", \"top1\", \"top5\" ]\n  checkpoint_metric: \"top1.logits\"\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "projects/catlip/image_classification/imagenet/vit_large.yaml",
    "content": "# pytest: disable\n\ntaskname: '+ ViT-L/16 [FT-IN1k]'\n\ncommon:\n  run_label: \"train\"\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\n  mixed_precision_dtype: \"bfloat16\"\n  grad_clip: 1.0\n  save_all_checkpoints: true\n\ndataset:\n  root_train: \"/mnt/vision_datasets/imagenet/training\"\n  root_val: \"/mnt/vision_datasets/imagenet/validation\"\n  # effective batch size is 512 (128 * 4 A100 80 GB GPU)\n  train_batch_size0: 128\n  val_batch_size0: 100\n  eval_batch_size0: 100\n  workers: -1 # use all CPUs\n  persistent_workers: true\n  pin_memory: true\n  name: \"imagenet\"\n  category: \"classification\"\n\nimage_augmentation:\n  # training related augmentation\n  random_resized_crop:\n    enable: true\n    interpolation: \"bilinear\"\n  random_horizontal_flip:\n    enable: true\n  # validation related augmentation\n  resize:\n    enable: true\n    size: 232\n    interpolation: \"bilinear\"\n  center_crop:\n    enable: true\n    size: 224\n\nsampler:\n  name: \"variable_batch_sampler\"\n  vbs:\n    crop_size_width: 224\n    crop_size_height: 224\n    max_n_scales: 25\n    min_crop_size_width: 128\n    max_crop_size_width: 320\n    min_crop_size_height: 128\n    max_crop_size_height: 320\n    check_scale: 32\n\nloss:\n  category: \"composite_loss\"\n  composite_loss:\n    - loss_category: \"classification\"\n      loss_weight: 1.0\n      classification:\n        name: \"cross_entropy\"\n        cross_entropy:\n          label_smoothing: 0.1\n    - loss_category: \"neural_augmentation\"\n      loss_weight: 1.0\n      neural_augmentation:\n        perceptual_metric: \"psnr\"\n        target_value: [ 40, 20 ]\n        curriculum_method: \"cosine\"\n\noptim:\n  name: \"adamw\"\n  weight_decay: 0.05\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.999\n\nscheduler:\n  name: \"cosine\"\n  max_epochs: 10\n  warmup_iterations: 500\n  warmup_init_lr: 1.e-6\n  cosine:\n    max_lr: 0.00003\n    min_lr: 0.000003\n\nmodel:\n  activation_checkpointing: true\n  # during finetuning, we need to skip loading the classifier from a pre-trained model\n  # because the number of classes in down-stream task and pre-training are different.\n  resume_exclude_scopes: [ \"classifier\" ]\n  classification:\n    name: \"vit\"\n    n_classes: 1000\n    # Initalize the model with a pre-trained model and finetune it.\n    # Note that during evaluation, we need to set 'resume_exclude_scopes' to an empty string\n    # and replace the 'pretrained' with the fine-tuned model path.\n    pretrained: \"https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/pretrained_models/vit_large.pt\"\n    vit:\n      mode: \"large\"\n      norm_layer: \"layer_norm_fp32\"\n      use_flash_attention: true\n  # use rangeaugment\n  learn_augmentation: \n    brightness: true\n    contrast: true\n    noise: true\n    mode: \"distribution\"\n  activation:\n    name: \"gelu\"\n  layer:\n    conv_init: \"kaiming_normal\"\n    linear_init: \"trunc_normal\"\n    linear_init_std_dev: 0.02\n  \nema:\n  enable: true\n  momentum: 0.0005\n\nstats:\n  train: [\"loss\"]\n  val: [ \"loss\", \"top1\", \"top5\" ]\n  checkpoint_metric: \"top1.logits\"\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "projects/catlip/image_classification/imagenet/vit_large_512x512.yaml",
    "content": "# pytest: disable\n\ntaskname: '+ ViT-L/16 [FT-IN1k-512x512]'\n\ncommon:\n  run_label: \"train\"\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\n  mixed_precision_dtype: \"bfloat16\"\n  grad_clip: 1.0\n  save_all_checkpoints: true\n\ndataset:\n  root_train: \"/mnt/vision_datasets/imagenet/training\"\n  root_val: \"/mnt/vision_datasets/imagenet/validation\"\n  # effective batch size is 512 (64 * 8 A100 80 GB GPU)\n  train_batch_size0: 64\n  val_batch_size0: 100\n  eval_batch_size0: 100\n  workers: -1 # use all CPUs\n  persistent_workers: true\n  pin_memory: true\n  name: \"imagenet\"\n  category: \"classification\"\n\nimage_augmentation:\n  # training related augmentation\n  random_resized_crop:\n    enable: true\n    interpolation: \"bilinear\"\n  random_horizontal_flip:\n    enable: true\n  # validation related augmentation\n  resize:\n    enable: true\n    size: 512\n    interpolation: \"bilinear\"\n  center_crop:\n    enable: true\n    size: 512\n\nsampler:\n  name: \"variable_batch_sampler\"\n  vbs:\n    crop_size_width: 512\n    crop_size_height: 512\n    max_n_scales: 25\n    min_crop_size_width: 256\n    max_crop_size_width: 512\n    min_crop_size_height: 256\n    max_crop_size_height: 512\n    check_scale: 32\n\nloss:\n  category: \"composite_loss\"\n  composite_loss:\n    - loss_category: \"classification\"\n      loss_weight: 1.0\n      classification:\n        name: \"cross_entropy\"\n        cross_entropy:\n          label_smoothing: 0.1\n    - loss_category: \"neural_augmentation\"\n      loss_weight: 1.0\n      neural_augmentation:\n        perceptual_metric: \"psnr\"\n        target_value: [ 40, 20 ]\n        curriculum_method: \"cosine\"\n\noptim:\n  name: \"adamw\"\n  weight_decay: 0.05\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.999\n\nscheduler:\n  name: \"cosine\"\n  max_epochs: 10\n  warmup_iterations: 500\n  warmup_init_lr: 1.e-6\n  cosine:\n    max_lr: 0.00003\n    min_lr: 0.000003\n\nmodel:\n  activation_checkpointing: true\n  # during finetuning, we need to skip loading the classifier from a pre-trained model\n  # because the number of classes in down-stream task and pre-training are different.\n  resume_exclude_scopes: [ \"classifier\" ]\n  classification:\n    name: \"vit\"\n    n_classes: 1000\n    # Initalize the model with a pre-trained model and finetune it.\n    # Note that during evaluation, we need to set 'resume_exclude_scopes' to an empty string\n    # and replace the 'pretrained' with the fine-tuned model path.\n    pretrained: \"https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/pretrained_models/vit_large.pt\"\n    vit:\n      mode: \"large\"\n      norm_layer: \"layer_norm_fp32\"\n      use_flash_attention: true\n  # use rangeaugment\n  learn_augmentation: \n    brightness: true\n    contrast: true\n    noise: true\n    mode: \"distribution\"\n  activation:\n    name: \"gelu\"\n  layer:\n    conv_init: \"kaiming_normal\"\n    linear_init: \"trunc_normal\"\n    linear_init_std_dev: 0.02\n  \nema:\n  enable: true\n  momentum: 0.0005\n\nstats:\n  train: [\"loss\"]\n  val: [ \"loss\", \"top1\", \"top5\" ]\n  checkpoint_metric: \"top1.logits\"\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "projects/catlip/image_classification/places365/vit_base.yaml",
    "content": "# pytest: disable\n\ntaskname: '+ ViT-B/16 [FT-Places365]'\n\ncommon:\n  run_label: \"train\"\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\n  mixed_precision_dtype: \"bfloat16\"\n  grad_clip: 1.0\n  save_all_checkpoints: true\n\ndataset:\n  root_train: \"/mnt/vision_datasets/places365/training\"\n  root_val: \"/mnt/vision_datasets/places365/validation\"\n  # effective batch size is 512 (128 * 4 A100 80 GB GPU)\n  train_batch_size0: 128\n  val_batch_size0: 100\n  eval_batch_size0: 100\n  workers: -1 # use all CPUs\n  persistent_workers: true\n  pin_memory: true\n  name: \"places365\"\n  category: \"classification\"\n\nimage_augmentation:\n  # training related augmentation\n  random_resized_crop:\n    enable: true\n    interpolation: \"bilinear\"\n  random_horizontal_flip:\n    enable: true\n  # validation related augmentation\n  resize:\n    enable: true\n    size: 232\n    interpolation: \"bilinear\"\n  center_crop:\n    enable: true\n    size: 224\n\nsampler:\n  name: \"variable_batch_sampler\"\n  vbs:\n    crop_size_width: 224\n    crop_size_height: 224\n    max_n_scales: 25\n    min_crop_size_width: 128\n    max_crop_size_width: 320\n    min_crop_size_height: 128\n    max_crop_size_height: 320\n    check_scale: 32\n\nloss:\n  category: \"composite_loss\"\n  composite_loss:\n    - loss_category: \"classification\"\n      loss_weight: 1.0\n      classification:\n        name: \"cross_entropy\"\n        cross_entropy:\n          label_smoothing: 0.1\n    - loss_category: \"neural_augmentation\"\n      loss_weight: 1.0\n      neural_augmentation:\n        perceptual_metric: \"psnr\"\n        target_value: [ 40, 20 ]\n        curriculum_method: \"cosine\"\n\noptim:\n  name: \"adamw\"\n  weight_decay: 0.05\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.999\n\nscheduler:\n  name: \"cosine\"\n  max_epochs: 10\n  warmup_iterations: 500\n  warmup_init_lr: 1.e-6\n  cosine:\n    max_lr: 0.00003\n    min_lr: 0.000003\n\nmodel:\n  activation_checkpointing: true\n  # during finetuning, we need to skip loading the classifier from a pre-trained model\n  # because the number of classes in down-stream task and pre-training are different.\n  resume_exclude_scopes: [ \"classifier\" ]\n  classification:\n    name: \"vit\"\n    n_classes: 365\n    # Initalize the model with a pre-trained model and finetune it.\n    # Note that during evaluation, we need to set 'resume_exclude_scopes' to an empty string\n    # and replace the 'pretrained' with the fine-tuned model path.\n    pretrained: \"https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/pretrained_models/vit_base.pt\"\n    vit:\n      mode: \"base\"\n      norm_layer: \"layer_norm_fp32\"\n      use_flash_attention: true\n  # use rangeaugment\n  learn_augmentation: \n    brightness: true\n    contrast: true\n    noise: true\n    mode: \"distribution\"\n  activation:\n    name: \"gelu\"\n  layer:\n    conv_init: \"kaiming_normal\"\n    linear_init: \"trunc_normal\"\n    linear_init_std_dev: 0.02\n  \nema:\n  enable: true\n  momentum: 0.0005\n\nstats:\n  train: [\"loss\"]\n  val: [ \"loss\", \"top1\", \"top5\" ]\n  checkpoint_metric: \"top1.logits\"\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "projects/catlip/image_classification/places365/vit_base_512x512.yaml",
    "content": "# pytest: disable\n\ntaskname: '+ ViT-B/16 [FT-Places365 512x512]'\n\ncommon:\n  run_label: \"train\"\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\n  mixed_precision_dtype: \"bfloat16\"\n  grad_clip: 1.0\n  save_all_checkpoints: true\n\ndataset:\n  root_train: \"/mnt/vision_datasets/places365/training\"\n  root_val: \"/mnt/vision_datasets/places365/validation\"\n  # effective batch size is 512 (64 * 8 A100 80 GB GPU)\n  train_batch_size0: 64\n  val_batch_size0: 100\n  eval_batch_size0: 100\n  workers: -1 # use all CPUs\n  persistent_workers: true\n  pin_memory: true\n  name: \"places365\"\n  category: \"classification\"\n\nimage_augmentation:\n  # training related augmentation\n  random_resized_crop:\n    enable: true\n    interpolation: \"bilinear\"\n  random_horizontal_flip:\n    enable: true\n  # validation related augmentation\n  resize:\n    enable: true\n    size: 512\n    interpolation: \"bilinear\"\n  center_crop:\n    enable: true\n    size: 512\n\nsampler:\n  name: \"variable_batch_sampler\"\n  vbs:\n    crop_size_width: 512\n    crop_size_height: 512\n    max_n_scales: 25\n    min_crop_size_width: 256\n    max_crop_size_width: 512\n    min_crop_size_height: 256\n    max_crop_size_height: 512\n    check_scale: 32\n\nloss:\n  category: \"composite_loss\"\n  composite_loss:\n    - loss_category: \"classification\"\n      loss_weight: 1.0\n      classification:\n        name: \"cross_entropy\"\n        cross_entropy:\n          label_smoothing: 0.1\n    - loss_category: \"neural_augmentation\"\n      loss_weight: 1.0\n      neural_augmentation:\n        perceptual_metric: \"psnr\"\n        target_value: [ 40, 20 ]\n        curriculum_method: \"cosine\"\n\noptim:\n  name: \"adamw\"\n  weight_decay: 0.05\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.999\n\nscheduler:\n  name: \"cosine\"\n  max_epochs: 10\n  warmup_iterations: 500\n  warmup_init_lr: 1.e-6\n  cosine:\n    max_lr: 0.00003\n    min_lr: 0.000003\n\nmodel:\n  activation_checkpointing: true\n  # during finetuning, we need to skip loading the classifier from a pre-trained model\n  # because the number of classes in down-stream task and pre-training are different.\n  resume_exclude_scopes: [ \"classifier\" ]\n  classification:\n    name: \"vit\"\n    n_classes: 365\n    # Initalize the model with a pre-trained model and finetune it.\n    # Note that during evaluation, we need to set 'resume_exclude_scopes' to an empty string\n    # and replace the 'pretrained' with the fine-tuned model path.\n    pretrained: \"https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/pretrained_models/vit_base.pt\"\n    vit:\n      mode: \"base\"\n      norm_layer: \"layer_norm_fp32\"\n      use_flash_attention: true\n  # use rangeaugment\n  learn_augmentation: \n    brightness: true\n    contrast: true\n    noise: true\n    mode: \"distribution\"\n  activation:\n    name: \"gelu\"\n  layer:\n    conv_init: \"kaiming_normal\"\n    linear_init: \"trunc_normal\"\n    linear_init_std_dev: 0.02\n  \nema:\n  enable: true\n  momentum: 0.0005\n\nstats:\n  train: [\"loss\"]\n  val: [ \"loss\", \"top1\", \"top5\" ]\n  checkpoint_metric: \"top1.logits\"\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "projects/catlip/image_classification/places365/vit_huge.yaml",
    "content": "# pytest: disable\n\ntaskname: '+ ViT-H/16 [FT-Places365]'\n\ncommon:\n  run_label: \"train\"\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\n  mixed_precision_dtype: \"bfloat16\"\n  grad_clip: 1.0\n  save_all_checkpoints: true\n\ndataset:\n  root_train: \"/mnt/vision_datasets/places365/training\"\n  root_val: \"/mnt/vision_datasets/places365/validation\"\n  # effective batch size is 512 (128 * 4 A100 80 GB GPU)\n  train_batch_size0: 128\n  val_batch_size0: 100\n  eval_batch_size0: 100\n  workers: -1 # use all CPUs\n  persistent_workers: true\n  pin_memory: true\n  name: \"places365\"\n  category: \"classification\"\n\nimage_augmentation:\n  # training related augmentation\n  random_resized_crop:\n    enable: true\n    interpolation: \"bilinear\"\n  random_horizontal_flip:\n    enable: true\n  # validation related augmentation\n  resize:\n    enable: true\n    size: 232\n    interpolation: \"bilinear\"\n  center_crop:\n    enable: true\n    size: 224\n\nsampler:\n  name: \"variable_batch_sampler\"\n  vbs:\n    crop_size_width: 224\n    crop_size_height: 224\n    max_n_scales: 25\n    min_crop_size_width: 128\n    max_crop_size_width: 320\n    min_crop_size_height: 128\n    max_crop_size_height: 320\n    check_scale: 32\n\nloss:\n  category: \"composite_loss\"\n  composite_loss:\n    - loss_category: \"classification\"\n      loss_weight: 1.0\n      classification:\n        name: \"cross_entropy\"\n        cross_entropy:\n          label_smoothing: 0.1\n    - loss_category: \"neural_augmentation\"\n      loss_weight: 1.0\n      neural_augmentation:\n        perceptual_metric: \"psnr\"\n        target_value: [ 40, 20 ]\n        curriculum_method: \"cosine\"\n\noptim:\n  name: \"adamw\"\n  weight_decay: 0.05\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.999\n\nscheduler:\n  name: \"cosine\"\n  max_epochs: 10\n  warmup_iterations: 500\n  warmup_init_lr: 1.e-6\n  cosine:\n    max_lr: 0.00003\n    min_lr: 0.000003\n\nmodel:\n  activation_checkpointing: true\n  # during finetuning, we need to skip loading the classifier from a pre-trained model\n  # because the number of classes in down-stream task and pre-training are different.\n  resume_exclude_scopes: [ \"classifier\" ]\n  classification:\n    name: \"vit\"\n    n_classes: 365\n    # Initalize the model with a pre-trained model and finetune it.\n    # Note that during evaluation, we need to set 'resume_exclude_scopes' to an empty string\n    # and replace the 'pretrained' with the fine-tuned model path.\n    pretrained: \"https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/pretrained_models/vit_huge.pt\"\n    vit:\n      mode: \"huge\"\n      norm_layer: \"layer_norm_fp32\"\n      use_flash_attention: true\n  # use rangeaugment\n  learn_augmentation: \n    brightness: true\n    contrast: true\n    noise: true\n    mode: \"distribution\"\n  activation:\n    name: \"gelu\"\n  layer:\n    conv_init: \"kaiming_normal\"\n    linear_init: \"trunc_normal\"\n    linear_init_std_dev: 0.02\n  \nema:\n  enable: true\n  momentum: 0.0005\n\nstats:\n  train: [\"loss\"]\n  val: [ \"loss\", \"top1\", \"top5\" ]\n  checkpoint_metric: \"top1.logits\"\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "projects/catlip/image_classification/places365/vit_huge_512x512.yaml",
    "content": "# pytest: disable\n\ntaskname: '+ ViT-H/16 [FT-Places365 512x512]'\n\ncommon:\n  run_label: \"train\"\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\n  mixed_precision_dtype: \"bfloat16\"\n  grad_clip: 1.0\n  save_all_checkpoints: true\n\ndataset:\n  root_train: \"/mnt/vision_datasets/places365/training\"\n  root_val: \"/mnt/vision_datasets/places365/validation\"\n  # effective batch size is 512 (32 * 8 A100 80 GB GPU * 2 nodes)\n  train_batch_size0: 32\n  val_batch_size0: 100\n  eval_batch_size0: 100\n  workers: -1 # use all CPUs\n  persistent_workers: true\n  pin_memory: true\n  name: \"places365\"\n  category: \"classification\"\n\nimage_augmentation:\n  # training related augmentation\n  random_resized_crop:\n    enable: true\n    interpolation: \"bilinear\"\n  random_horizontal_flip:\n    enable: true\n  # validation related augmentation\n  resize:\n    enable: true\n    size: 512\n    interpolation: \"bilinear\"\n  center_crop:\n    enable: true\n    size: 512\n\nsampler:\n  name: \"variable_batch_sampler\"\n  vbs:\n    crop_size_width: 512\n    crop_size_height: 512\n    max_n_scales: 25\n    min_crop_size_width: 256\n    max_crop_size_width: 512\n    min_crop_size_height: 256\n    max_crop_size_height: 512\n    check_scale: 32\n\nloss:\n  category: \"composite_loss\"\n  composite_loss:\n    - loss_category: \"classification\"\n      loss_weight: 1.0\n      classification:\n        name: \"cross_entropy\"\n        cross_entropy:\n          label_smoothing: 0.1\n    - loss_category: \"neural_augmentation\"\n      loss_weight: 1.0\n      neural_augmentation:\n        perceptual_metric: \"psnr\"\n        target_value: [ 40, 20 ]\n        curriculum_method: \"cosine\"\n\noptim:\n  name: \"adamw\"\n  weight_decay: 0.05\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.999\n\nscheduler:\n  name: \"cosine\"\n  max_epochs: 10\n  warmup_iterations: 500\n  warmup_init_lr: 1.e-6\n  cosine:\n    max_lr: 0.00003\n    min_lr: 0.000003\n\nmodel:\n  activation_checkpointing: true\n  # during finetuning, we need to skip loading the classifier from a pre-trained model\n  # because the number of classes in down-stream task and pre-training are different.\n  resume_exclude_scopes: [ \"classifier\" ]\n  classification:\n    name: \"vit\"\n    n_classes: 365\n    # Initalize the model with a pre-trained model and finetune it.\n    # Note that during evaluation, we need to set 'resume_exclude_scopes' to an empty string\n    # and replace the 'pretrained' with the fine-tuned model path.\n    pretrained: \"https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/pretrained_models/vit_huge.pt\"\n    vit:\n      mode: \"huge\"\n      norm_layer: \"layer_norm_fp32\"\n      use_flash_attention: true\n  # use rangeaugment\n  learn_augmentation: \n    brightness: true\n    contrast: true\n    noise: true\n    mode: \"distribution\"\n  activation:\n    name: \"gelu\"\n  layer:\n    conv_init: \"kaiming_normal\"\n    linear_init: \"trunc_normal\"\n    linear_init_std_dev: 0.02\n  \nema:\n  enable: true\n  momentum: 0.0005\n\nstats:\n  train: [\"loss\"]\n  val: [ \"loss\", \"top1\", \"top5\" ]\n  checkpoint_metric: \"top1.logits\"\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "projects/catlip/image_classification/places365/vit_large.yaml",
    "content": "# pytest: disable\n\ntaskname: '+ ViT-L/16 [FT-Places365]'\n\ncommon:\n  run_label: \"train\"\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\n  mixed_precision_dtype: \"bfloat16\"\n  grad_clip: 1.0\n  save_all_checkpoints: true\n\ndataset:\n  root_train: \"/mnt/vision_datasets/places365/training\"\n  root_val: \"/mnt/vision_datasets/places365/validation\"\n  # effective batch size is 512 (128 * 4 A100 80 GB GPU)\n  train_batch_size0: 128\n  val_batch_size0: 100\n  eval_batch_size0: 100\n  workers: -1 # use all CPUs\n  persistent_workers: true\n  pin_memory: true\n  name: \"places365\"\n  category: \"classification\"\n\nimage_augmentation:\n  # training related augmentation\n  random_resized_crop:\n    enable: true\n    interpolation: \"bilinear\"\n  random_horizontal_flip:\n    enable: true\n  # validation related augmentation\n  resize:\n    enable: true\n    size: 232\n    interpolation: \"bilinear\"\n  center_crop:\n    enable: true\n    size: 224\n\nsampler:\n  name: \"variable_batch_sampler\"\n  vbs:\n    crop_size_width: 224\n    crop_size_height: 224\n    max_n_scales: 25\n    min_crop_size_width: 128\n    max_crop_size_width: 320\n    min_crop_size_height: 128\n    max_crop_size_height: 320\n    check_scale: 32\n\nloss:\n  category: \"composite_loss\"\n  composite_loss:\n    - loss_category: \"classification\"\n      loss_weight: 1.0\n      classification:\n        name: \"cross_entropy\"\n        cross_entropy:\n          label_smoothing: 0.1\n    - loss_category: \"neural_augmentation\"\n      loss_weight: 1.0\n      neural_augmentation:\n        perceptual_metric: \"psnr\"\n        target_value: [ 40, 20 ]\n        curriculum_method: \"cosine\"\n\noptim:\n  name: \"adamw\"\n  weight_decay: 0.05\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.999\n\nscheduler:\n  name: \"cosine\"\n  max_epochs: 10\n  warmup_iterations: 500\n  warmup_init_lr: 1.e-6\n  cosine:\n    max_lr: 0.00003\n    min_lr: 0.000003\n\nmodel:\n  activation_checkpointing: true\n  # during finetuning, we need to skip loading the classifier from a pre-trained model\n  # because the number of classes in down-stream task and pre-training are different.\n  resume_exclude_scopes: [ \"classifier\" ]\n  classification:\n    name: \"vit\"\n    n_classes: 365\n    # Initalize the model with a pre-trained model and finetune it.\n    # Note that during evaluation, we need to set 'resume_exclude_scopes' to an empty string\n    # and replace the 'pretrained' with the fine-tuned model path.\n    pretrained: \"https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/pretrained_models/vit_large.pt\"\n    vit:\n      mode: \"large\"\n      norm_layer: \"layer_norm_fp32\"\n      use_flash_attention: true\n  # use rangeaugment\n  learn_augmentation: \n    brightness: true\n    contrast: true\n    noise: true\n    mode: \"distribution\"\n  activation:\n    name: \"gelu\"\n  layer:\n    conv_init: \"kaiming_normal\"\n    linear_init: \"trunc_normal\"\n    linear_init_std_dev: 0.02\n  \nema:\n  enable: true\n  momentum: 0.0005\n\nstats:\n  train: [\"loss\"]\n  val: [ \"loss\", \"top1\", \"top5\" ]\n  checkpoint_metric: \"top1.logits\"\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "projects/catlip/image_classification/places365/vit_large_512x512.yaml",
    "content": "# pytest: disable\n\ntaskname: '+ ViT-L/16 [FT-Places365 512x512]'\n\ncommon:\n  run_label: \"train\"\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\n  mixed_precision_dtype: \"bfloat16\"\n  grad_clip: 1.0\n  save_all_checkpoints: true\n\ndataset:\n  root_train: \"/mnt/vision_datasets/places365/training\"\n  root_val: \"/mnt/vision_datasets/places365/validation\"\n  # effective batch size is 512 (64 * 8 A100 80 GB GPU)\n  train_batch_size0: 64\n  val_batch_size0: 100\n  eval_batch_size0: 100\n  workers: -1 # use all CPUs\n  persistent_workers: true\n  pin_memory: true\n  name: \"places365\"\n  category: \"classification\"\n\nimage_augmentation:\n  # training related augmentation\n  random_resized_crop:\n    enable: true\n    interpolation: \"bilinear\"\n  random_horizontal_flip:\n    enable: true\n  # validation related augmentation\n  resize:\n    enable: true\n    size: 512\n    interpolation: \"bilinear\"\n  center_crop:\n    enable: true\n    size: 512\n\nsampler:\n  name: \"variable_batch_sampler\"\n  vbs:\n    crop_size_width: 512\n    crop_size_height: 512\n    max_n_scales: 25\n    min_crop_size_width: 256\n    max_crop_size_width: 512\n    min_crop_size_height: 256\n    max_crop_size_height: 512\n    check_scale: 32\n\nloss:\n  category: \"composite_loss\"\n  composite_loss:\n    - loss_category: \"classification\"\n      loss_weight: 1.0\n      classification:\n        name: \"cross_entropy\"\n        cross_entropy:\n          label_smoothing: 0.1\n    - loss_category: \"neural_augmentation\"\n      loss_weight: 1.0\n      neural_augmentation:\n        perceptual_metric: \"psnr\"\n        target_value: [ 40, 20 ]\n        curriculum_method: \"cosine\"\n\noptim:\n  name: \"adamw\"\n  weight_decay: 0.05\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.999\n\nscheduler:\n  name: \"cosine\"\n  max_epochs: 10\n  warmup_iterations: 500\n  warmup_init_lr: 1.e-6\n  cosine:\n    max_lr: 0.00003\n    min_lr: 0.000003\n\nmodel:\n  activation_checkpointing: true\n  # during finetuning, we need to skip loading the classifier from a pre-trained model\n  # because the number of classes in down-stream task and pre-training are different.\n  resume_exclude_scopes: [ \"classifier\" ]\n  classification:\n    name: \"vit\"\n    n_classes: 365\n    # Initalize the model with a pre-trained model and finetune it.\n    # Note that during evaluation, we need to set 'resume_exclude_scopes' to an empty string\n    # and replace the 'pretrained' with the fine-tuned model path.\n    pretrained: \"https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/pretrained_models/vit_large.pt\"\n    vit:\n      mode: \"large\"\n      norm_layer: \"layer_norm_fp32\"\n      use_flash_attention: true\n  # use rangeaugment\n  learn_augmentation: \n    brightness: true\n    contrast: true\n    noise: true\n    mode: \"distribution\"\n  activation:\n    name: \"gelu\"\n  layer:\n    conv_init: \"kaiming_normal\"\n    linear_init: \"trunc_normal\"\n    linear_init_std_dev: 0.02\n  \nema:\n  enable: true\n  momentum: 0.0005\n\nstats:\n  train: [\"loss\"]\n  val: [ \"loss\", \"top1\", \"top5\" ]\n  checkpoint_metric: \"top1.logits\"\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "projects/catlip/multi_label_image_classification/vit_base.yaml",
    "content": "# pytest: disable\ntaskname: '+ ViT-B/16 [COCO-CLS]'\n\ncommon:\n  run_label: \"train\"\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\n  mixed_precision_dtype: \"bfloat16\"\n  grad_clip: 1.0\n  save_all_checkpoints: true\n\ndataset:\n  root_train: \"/mnt/vision_datasets/coco\"\n  root_val: \"/mnt/vision_datasets/coco\"\n  # effective batch size is 128 (32 * 4 A100 80 GB GPU)\n  train_batch_size0: 32\n  val_batch_size0: 50\n  eval_batch_size0: 50\n  workers: -1 # use all CPUs\n  persistent_workers: true\n  pin_memory: true\n  name: \"coco\"\n  category: \"classification\"\n\nimage_augmentation:\n  # training related augmentations\n  random_resized_crop:\n    enable: true\n    interpolation: \"bilinear\"\n  random_horizontal_flip:\n    enable: true\n  # evaluation related augmentations\n  resize:\n    enable: true\n    size: 512\n    interpolation: \"bilinear\"\n  center_crop:\n    enable: true\n    size: 512\n\nsampler:\n  name: \"variable_batch_sampler\"\n  vbs:\n    crop_size_width: 512\n    crop_size_height: 512\n    max_n_scales: 25\n    min_crop_size_width: 256\n    max_crop_size_width: 768\n    min_crop_size_height: 256\n    max_crop_size_height: 768\n    check_scale: 16\n\nloss:\n  category: \"composite_loss\"\n  composite_loss:\n    - loss_category: \"classification\"\n      loss_weight: 1.0\n      classification:\n        name: \"binary_cross_entropy\"\n        binary_cross_entropy:\n          reduction: \"batch_mean\"\n    - loss_category: \"neural_augmentation\"\n      loss_weight: 1.0\n      neural_augmentation:\n        perceptual_metric: \"psnr\"\n        target_value: [ 40, 20 ]\n        curriculum_method: \"cosine\"\n\noptim:\n  name: \"adamw\"\n  weight_decay: 0.05\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.999\n\nscheduler:\n  name: \"cosine\"\n  max_epochs: 10\n  warmup_iterations: 500\n  warmup_init_lr: 1.e-6\n  cosine:\n    max_lr: 0.00001\n    min_lr: 0.000001\n\nmodel:\n  activation_checkpointing: true\n  # The number of classes in pre-trained model are 24320 while COCO has 80 classes.\n  # so, we exclude the classifier while loading the pre-trained weights\n  resume_exclude_scopes: [ \"classifier\" ]\n  classification:\n    name: \"vit\"\n    n_classes: 80\n    pretrained: https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/pretrained_models/vit_base.pt\n    vit:\n      mode: \"base\"\n      norm_layer: \"layer_norm_fp32\"\n      use_flash_attention: true\n  # use rangeaugment\n  learn_augmentation: \n    brightness: true\n    contrast: true\n    noise: true\n    mode: \"distribution\"\n  activation:\n    name: \"gelu\"\n  layer:\n    conv_init: \"kaiming_normal\"\n    linear_init: \"trunc_normal\"\n    linear_init_std_dev: 0.02\n  \nema:\n  enable: true\n  momentum: 0.0005\n\nstats:\n  train: [ \"loss\" ]\n  val: [ \"loss\" , \"multiclass_classification_pr(pred=logits)\"]\n  checkpoint_metric: \"multiclass_classification_pr(pred=logits).macro\"\n  checkpoint_metric_max: true\n  metrics:\n    multiclass_classification_pr:\n      suppress_warnings: true\n"
  },
  {
    "path": "projects/catlip/multi_label_image_classification/vit_large.yaml",
    "content": "# pytest: disable\n\ntaskname: '+ ViT-L/16 [COCO-CLS]'\n\ncommon:\n  run_label: \"train\"\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\n  mixed_precision_dtype: \"bfloat16\"\n  grad_clip: 1.0\n  save_all_checkpoints: true\n\ndataset:\n  root_train: \"/mnt/vision_datasets/coco\"\n  root_val: \"/mnt/vision_datasets/coco\"\n  # effective batch size is 128 (32 * 4 A100 80 GB GPU)\n  train_batch_size0: 32\n  val_batch_size0: 32\n  eval_batch_size0: 32\n  workers: -1 # use all CPUs\n  persistent_workers: true\n  pin_memory: true\n  name: \"coco\"\n  category: \"classification\"\n\nimage_augmentation:\n  # training related augmentations\n  random_resized_crop:\n    enable: true\n    interpolation: \"bilinear\"\n  random_horizontal_flip:\n    enable: true\n  # evaluation related augmentations\n  resize:\n    enable: true\n    size: 512\n    interpolation: \"bilinear\"\n  center_crop:\n    enable: true\n    size: 512\n\nsampler:\n  name: \"variable_batch_sampler\"\n  vbs:\n    crop_size_width: 512\n    crop_size_height: 512\n    max_n_scales: 25\n    min_crop_size_width: 256\n    max_crop_size_width: 768\n    min_crop_size_height: 256\n    max_crop_size_height: 768\n    check_scale: 16\n\nloss:\n  category: \"composite_loss\"\n  composite_loss:\n    - loss_category: \"classification\"\n      loss_weight: 1.0\n      classification:\n        name: \"binary_cross_entropy\"\n        binary_cross_entropy:\n          reduction: \"batch_mean\"\n    - loss_category: \"neural_augmentation\"\n      loss_weight: 1.0\n      neural_augmentation:\n        perceptual_metric: \"psnr\"\n        target_value: [ 40, 20 ]\n        curriculum_method: \"cosine\"\n\noptim:\n  name: \"adamw\"\n  weight_decay: 0.05\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.999\n\nscheduler:\n  name: \"cosine\"\n  max_epochs: 10\n  warmup_iterations: 500\n  warmup_init_lr: 1.e-6\n  cosine:\n    max_lr: 0.00001\n    min_lr: 0.000001\n\nmodel:\n  activation_checkpointing: true\n  # The number of classes in pre-trained model are 24320 while COCO has 80 classes.\n  # so, we exclude the classifier while loading the pre-trained weights.\n  resume_exclude_scopes: [ \"classifier\" ]\n  classification:\n    name: \"vit\"\n    n_classes: 80\n    pretrained: https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/pretrained_models/vit_large.pt\n    vit:\n      mode: \"large\"\n      norm_layer: \"layer_norm_fp32\"\n      use_flash_attention: true\n  # use rangeaugment\n  learn_augmentation: \n    brightness: true\n    contrast: true\n    noise: true\n    mode: \"distribution\"\n  activation:\n    name: \"gelu\"\n  layer:\n    conv_init: \"kaiming_normal\"\n    linear_init: \"trunc_normal\"\n    linear_init_std_dev: 0.02\n  \nema:\n  enable: true\n  momentum: 0.0005\n\nstats:\n  train: [ \"loss\" ]\n  val: [ \"loss\" , \"multiclass_classification_pr(pred=logits)\"]\n  checkpoint_metric: \"multiclass_classification_pr(pred=logits).macro\"\n  checkpoint_metric_max: true\n  metrics:\n    multiclass_classification_pr:\n      suppress_warnings: true\n\n"
  },
  {
    "path": "projects/catlip/object_detection/maskrcnn_vit_base.yaml",
    "content": "# pytest: disable\n\ntaskname: '+ ViT-B/16 Mask R-CNN'\n\ncommon:\n  run_label: \"train\"\n  accum_freq: 1\n  log_freq: 500\n  auto_resume: true\n  save_all_checkpoints: true\n  # We find mixed_precision results in training instability on 80 GB A100 GPUs. But, if you are\n  # using GPUs with less memory, please try enabling mixed_precision.\n  # mixed_precision: true\n\ndataset:\n  root_train: \"/mnt/vision_datasets/coco\"\n  root_val: \"/mnt/vision_datasets/coco\"\n  category: \"detection\"\n  # effective base batch size is 128 (8 nodes * 8 GPUs per node * 2 batch size per 8 A100 80 GB GPU)\n  train_batch_size0: 2\n  val_batch_size0: 4\n  workers: 8\n  persistent_workers: false\n  pin_memory: true\n  name: \"coco_mask_rcnn\"\n  collate_fn_name_train: \"coco_mask_rcnn_collate_fn\"\n  collate_fn_name_val: \"coco_mask_rcnn_collate_fn\"\n\nimage_augmentation:\n  # for evaluation\n  resize:\n    enable: true\n    size: [1024, 1024]\n    interpolation: \"bilinear\"\n\nsampler:\n  name: variable_batch_sampler\n  num_repeats: 4\n  vbs:\n    check_scale: 32 # do not change it. Mask R-CNN transforms divides by 32\n    crop_size_height: 1024\n    crop_size_width: 1024\n    max_crop_size_height: 1280\n    max_crop_size_width: 1280\n    max_n_scales: 25\n    min_crop_size_height: 512\n    min_crop_size_width: 512\n\nloss:\n  category: \"composite_loss\"\n  composite_loss:\n    - loss_category: \"detection\"\n      loss_weight: 1.0\n      detection:\n        name: \"mask_rcnn_loss\"\n        mask_rcnn_loss:\n          classifier_weight: 1\n          box_reg_weight: 1\n          mask_weight: 1\n          objectness_weight: 1\n          rpn_box_reg: 1\n    - loss_category: \"neural_augmentation\"\n      loss_weight: 1.0\n      neural_augmentation:\n        perceptual_metric: \"psnr\"\n        target_value: [ 40, 10 ]\n        curriculum_method: \"cosine\"\n\noptim:\n  name: \"adamw\"\n  no_decay_bn_filter_bias: true\n  weight_decay: 0.1\n  adamw:\n    beta1: 0.9\n    beta2: 0.999\n\nscheduler:\n  name: \"multi_step\"\n  max_epochs: 25\n  warmup_iterations: 250\n  warmup_init_lr: 0.00001\n  multi_step:\n    gamma: 0.1\n    lr: 0.0003\n    milestones: [22, 24]\n\nmodel:\n  activation_checkpointing: true\n  # During object detection training, we do not use classifier and cls_token, so we exclude them\n  # Also, \"simple_fpn\" is not part of the pre-trained image encoder, so we have to exclude that too.\n  resume_exclude_scopes: [ \"classifier\", \"cls_token\", \"simple_fpn\" ]\n  detection:\n    name: \"mask_rcnn\"\n    n_classes: 81\n    mask_rcnn:\n      norm_layer: \"layer_norm_fp32\"\n      backbone_lr_multiplier: 1.0\n  classification:\n    name: \"vit\"\n    # Initalize the model with a pre-trained model and finetune it.\n    pretrained: \"https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/pretrained_models/vit_base.pt\"\n    enable_layer_wise_lr_decay: true\n    layer_wise_lr_decay_rate: 0.7\n    n_classes: 24320\n    vit:\n      mode: \"base\"\n      norm_layer: \"layer_norm_fp32\"\n      use_flash_attention: true\n      stochastic_dropout: 0.1\n      # disable cls token and enable simple FPN for detection tasks\n      no_cls_token: true\n      use_simple_fpn: true\n  learn_augmentation:\n    brightness: true\n    contrast: true\n    noise: true\n    mode: \"distribution\"\n  activation:\n    name: \"gelu\"\n  layer:\n    global_pool: \"mean\"\n    conv_init: \"kaiming_normal\"\n    linear_init: \"normal\"\n\nema:\n  enable: true\n  momentum: 0.0001\n\nstats:\n  val: [ \"loss\", \"coco_map\"]\n  train: [\"loss\"]\n  checkpoint_metric: \"coco_map.bbox\"\n  checkpoint_metric_max: true\n  coco_map:\n    iou_types: [ \"bbox\", \"segm\" ]\n\n\n# For evaluation on the validation set using 'corenet-eval-det', we follow the steps below:\n#  1. Determine and store the size of input image as metadata.\n#  2. Resize image to a fixed size.\n#  3. Make a prediction.\n#  4. Resize the predictions to the same size as original input image.\n#  5. Compute results.\nevaluation:\n  detection:\n    mode: \"validation_set\"\n    resize_input_images: true\n"
  },
  {
    "path": "projects/catlip/object_detection/maskrcnn_vit_huge.yaml",
    "content": "# pytest: disable\n\ntaskname: '+ ViT-H/16 Mask R-CNN'\n\ncommon:\n  run_label: \"train\"\n  accum_freq: 1\n  log_freq: 500\n  auto_resume: true\n  save_all_checkpoints: true\n  # We find mixed_precision results in training instability on 80 GB A100 GPUs. But, if you are\n  # using GPUs with less memory, please try enabling mixed_precision.\n  # mixed_precision: true\n\ndataset:\n  root_train: \"/mnt/vision_datasets/coco\"\n  root_val: \"/mnt/vision_datasets/coco\"\n  category: \"detection\"\n  # effective base batch size is 128 (8 nodes * 8 GPUs per node * 2 batch size per 8 A100 80 GB GPU)\n  train_batch_size0: 2\n  val_batch_size0: 4\n  workers: 8\n  persistent_workers: false\n  pin_memory: true\n  name: \"coco_mask_rcnn\"\n  collate_fn_name_train: \"coco_mask_rcnn_collate_fn\"\n  collate_fn_name_val: \"coco_mask_rcnn_collate_fn\"\n\nimage_augmentation:\n  # for evaluation\n  resize:\n    enable: true\n    size: [1024, 1024]\n    interpolation: \"bilinear\"\n\nsampler:\n  name: variable_batch_sampler\n  num_repeats: 4\n  vbs:\n    check_scale: 32 # do not change it. Mask R-CNN transforms divides by 32\n    crop_size_height: 1024\n    crop_size_width: 1024\n    max_crop_size_height: 1280\n    max_crop_size_width: 1280\n    max_n_scales: 25\n    min_crop_size_height: 512\n    min_crop_size_width: 512\n\nloss:\n  category: \"composite_loss\"\n  composite_loss:\n    - loss_category: \"detection\"\n      loss_weight: 1.0\n      detection:\n        name: \"mask_rcnn_loss\"\n        mask_rcnn_loss:\n          classifier_weight: 1\n          box_reg_weight: 1\n          mask_weight: 1\n          objectness_weight: 1\n          rpn_box_reg: 1\n    - loss_category: \"neural_augmentation\"\n      loss_weight: 1.0\n      neural_augmentation:\n        perceptual_metric: \"psnr\"\n        target_value: [ 40, 10 ]\n        curriculum_method: \"cosine\"\n\noptim:\n  name: \"adamw\"\n  no_decay_bn_filter_bias: true\n  weight_decay: 0.1\n  adamw:\n    beta1: 0.9\n    beta2: 0.999\n\nscheduler:\n  name: \"multi_step\"\n  max_epochs: 20\n  warmup_iterations: 250\n  warmup_init_lr: 0.00001\n  multi_step:\n    gamma: 0.1\n    lr: 0.0003\n    milestones: [17, 19]\n\nmodel:\n  activation_checkpointing: true\n  # During object detection training, we do not use classifier and cls_token, so we exclude them\n  # Also, \"simple_fpn\" is not part of the pre-trained image encoder, so we have to exclude that too.\n  resume_exclude_scopes: [ \"classifier\", \"cls_token\", \"simple_fpn\" ]\n  detection:\n    name: \"mask_rcnn\"\n    n_classes: 81\n    mask_rcnn:\n      norm_layer: \"layer_norm_fp32\"\n      backbone_lr_multiplier: 1.0\n  classification:\n    name: \"vit\"\n    # Initalize the model with a pre-trained model and finetune it.\n    pretrained: \"https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/pretrained_models/vit_huge.pt\"\n    enable_layer_wise_lr_decay: true\n    layer_wise_lr_decay_rate: 0.9\n    n_classes: 24320\n    vit:\n      mode: \"huge\"\n      norm_layer: \"layer_norm_fp32\"\n      use_flash_attention: true\n      stochastic_dropout: 0.5\n      # disable cls token and enable simple FPN for detection tasks\n      no_cls_token: true\n      use_simple_fpn: true\n  learn_augmentation:\n    brightness: true\n    contrast: true\n    noise: true\n    mode: \"distribution\"\n  activation:\n    name: \"gelu\"\n  layer:\n    global_pool: \"mean\"\n    conv_init: \"kaiming_normal\"\n    linear_init: \"normal\"\n\nema:\n  enable: true\n  momentum: 0.0001\n\nstats:\n  val: [ \"loss\", \"coco_map\"]\n  train: [\"loss\"]\n  checkpoint_metric: \"coco_map.bbox\"\n  checkpoint_metric_max: true\n  coco_map:\n    iou_types: [ \"bbox\", \"segm\" ]\n\n\n# For evaluation on the validation set using 'corenet-eval-det', we follow the steps below:\n#  1. Determine and store the size of input image as metadata.\n#  2. Resize image to a fixed size.\n#  3. Make a prediction.\n#  4. Resize the predictions to the same size as original input image.\n#  5. Compute results.\nevaluation:\n  detection:\n    mode: \"validation_set\"\n    resize_input_images: true\n"
  },
  {
    "path": "projects/catlip/object_detection/maskrcnn_vit_large.yaml",
    "content": "# pytest: disable\n\ntaskname: '+ ViT-L/16 Mask R-CNN'\n\ncommon:\n  run_label: \"train\"\n  accum_freq: 1\n  log_freq: 500\n  auto_resume: true\n  save_all_checkpoints: true\n  # We find mixed_precision results in training instability on 80 GB A100 GPUs. But, if you are\n  # using GPUs with less memory, please try enabling mixed_precision.\n  # mixed_precision: true\n\ndataset:\n  root_train: \"/mnt/vision_datasets/coco\"\n  root_val: \"/mnt/vision_datasets/coco\"\n  category: \"detection\"\n  # effective base batch size is 128 (8 nodes * 8 GPUs per node * 2 batch size per 8 A100 80 GB GPU)\n  train_batch_size0: 2\n  val_batch_size0: 4\n  workers: 8\n  persistent_workers: false\n  pin_memory: true\n  name: \"coco_mask_rcnn\"\n  collate_fn_name_train: \"coco_mask_rcnn_collate_fn\"\n  collate_fn_name_val: \"coco_mask_rcnn_collate_fn\"\n\nimage_augmentation:\n  # for evaluation\n  resize:\n    enable: true\n    size: [1024, 1024]\n    interpolation: \"bilinear\"\n\nsampler:\n  name: variable_batch_sampler\n  num_repeats: 4\n  vbs:\n    check_scale: 32 # do not change it. Mask R-CNN transforms divides by 32\n    crop_size_height: 1024\n    crop_size_width: 1024\n    max_crop_size_height: 1280\n    max_crop_size_width: 1280\n    max_n_scales: 25\n    min_crop_size_height: 512\n    min_crop_size_width: 512\n\nloss:\n  category: \"composite_loss\"\n  composite_loss:\n    - loss_category: \"detection\"\n      loss_weight: 1.0\n      detection:\n        name: \"mask_rcnn_loss\"\n        mask_rcnn_loss:\n          classifier_weight: 1\n          box_reg_weight: 1\n          mask_weight: 1\n          objectness_weight: 1\n          rpn_box_reg: 1\n    - loss_category: \"neural_augmentation\"\n      loss_weight: 1.0\n      neural_augmentation:\n        perceptual_metric: \"psnr\"\n        target_value: [ 40, 10 ]\n        curriculum_method: \"cosine\"\n\noptim:\n  name: \"adamw\"\n  no_decay_bn_filter_bias: true\n  weight_decay: 0.1\n  adamw:\n    beta1: 0.9\n    beta2: 0.999\n\nscheduler:\n  name: \"multi_step\"\n  max_epochs: 25\n  warmup_iterations: 250\n  warmup_init_lr: 0.00001\n  multi_step:\n    gamma: 0.1\n    lr: 0.0003\n    milestones: [22, 24]\n\nmodel:\n  activation_checkpointing: true\n  # During object detection training, we do not use classifier and cls_token, so we exclude them\n  # Also, \"simple_fpn\" is not part of the pre-trained image encoder, so we have to exclude that too.\n  resume_exclude_scopes: [ \"classifier\", \"cls_token\", \"simple_fpn\" ]\n  detection:\n    name: \"mask_rcnn\"\n    n_classes: 81\n    mask_rcnn:\n      norm_layer: \"layer_norm_fp32\"\n      backbone_lr_multiplier: 1.0\n  classification:\n    name: \"vit\"\n    # Initalize the model with a pre-trained model and finetune it.\n    pretrained: \"https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/pretrained_models/vit_large.pt\"\n    enable_layer_wise_lr_decay: true\n    layer_wise_lr_decay_rate: 0.8\n    n_classes: 24320\n    vit:\n      mode: \"large\"\n      norm_layer: \"layer_norm_fp32\"\n      use_flash_attention: true\n      stochastic_dropout: 0.4\n      # disable cls token and enable simple FPN for detection tasks\n      no_cls_token: true\n      use_simple_fpn: true\n  learn_augmentation:\n    brightness: true\n    contrast: true\n    noise: true\n    mode: \"distribution\"\n  activation:\n    name: \"gelu\"\n  layer:\n    global_pool: \"mean\"\n    conv_init: \"kaiming_normal\"\n    linear_init: \"normal\"\n\nema:\n  enable: true\n  momentum: 0.0001\n\nstats:\n  val: [ \"loss\", \"coco_map\"]\n  train: [\"loss\"]\n  checkpoint_metric: \"coco_map.bbox\"\n  checkpoint_metric_max: true\n  coco_map:\n    iou_types: [ \"bbox\", \"segm\" ]\n\n\n# For evaluation on the validation set using 'corenet-eval-det', we follow the steps below:\n#  1. Determine and store the size of input image as metadata.\n#  2. Resize image to a fixed size.\n#  3. Make a prediction.\n#  4. Resize the predictions to the same size as original input image.\n#  5. Compute results.\nevaluation:\n  detection:\n    mode: \"validation_set\"\n    resize_input_images: true\n"
  },
  {
    "path": "projects/catlip/pretraining/vit_base.yaml",
    "content": "# pytest: disable\n\ntaskname: '+ CatLIP ViT-B/16 [DataComp]'\n\n_anchor_vocab_size: &_anchor_vocab_size 24320\n\ncommon:\n  run_label: \"train\"\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\n  mixed_precision_dtype: \"bfloat16\"\n  grad_clip: 1.0\n  save_all_checkpoints: true\n  save_interval_freq: 5000\n\ndataset:\n  # root_train does not matter for img_text_tar dataset because dataset information is expected\n  # to be contained in metadata file.\n  root_train: \"\"\n  disable_val: true\n  # effective batch size is 65k (1024 images per GPU * 8 A100 40 GB GPUs * 8 Nodes)\n  train_batch_size0: 1024\n  workers: -1 # use all CPUs\n  persistent_workers: true\n  pin_memory: true\n  name: \"wordnet_tagged_classification\"\n  category: \"classification\"\n  wordnet_tagged_classification:\n    vocab_size: *_anchor_vocab_size\n    # Uncomment these lines and replace with the path to metadata file containing dataset information\n    # and vocabulary file containing synset information.\n    # metadata_file: \"PATH_TO_METADADATA_FILE\"\n    # vocab_file: \"PATH_TO_VOCAB_FILE\"\n\nimage_augmentation:\n  # training related augmentations\n  random_resized_crop:\n    enable: true\n    interpolation: \"bilinear\"\n  random_horizontal_flip:\n    enable: true\n\nsampler:\n  name: \"variable_batch_sampler\"\n  use_shards: true\n  # In the 0-th epoch, data is downloaded to local machine from remote location.\n  # Therefore, we process the data sequentially in the 0-th epoch and start shuffling\n  # from first epoch onwards.\n  start_shuffling_from_epoch: 1\n  vbs:\n    crop_size_width: 224\n    crop_size_height: 224\n    max_n_scales: 25\n    min_crop_size_width: 128\n    max_crop_size_width: 320\n    min_crop_size_height: 128\n    max_crop_size_height: 320\n    check_scale: 16\n\nloss:\n  category: \"composite_loss\"\n  composite_loss:\n    - loss_category: \"classification\"\n      loss_weight: 1.0\n      classification:\n        name: \"binary_cross_entropy\"\n        binary_cross_entropy:\n          reduction: \"batch_mean\"\n    - loss_category: \"neural_augmentation\"\n      loss_weight: 1.0\n      neural_augmentation:\n        perceptual_metric: \"psnr\"\n        target_value: [ 40, 20 ]\n        curriculum_method: \"cosine\"\n\noptim:\n  no_decay_bn_filter_bias: true\n  weight_decay: 0.2\n  name: \"adamw\"\n  adamw:\n    beta1: 0.9\n    beta2: 0.999\n\nscheduler:\n  is_iteration_based: true\n  max_iterations: 200000\n  name: cosine\n  warmup_init_lr: 1.e-06\n  warmup_iterations: 10000\n  cosine:\n    max_lr: 0.001\n    min_lr: 0.00001\n\nmodel:\n  activation_checkpointing: true\n  classification:\n    name: \"vit\"\n    n_classes: *_anchor_vocab_size\n    vit:\n      mode: \"base\"\n      norm_layer: \"layer_norm_fp32\"\n      use_flash_attention: true\n  # use rangeaugment\n  learn_augmentation: \n    brightness: true\n    contrast: true\n    noise: true\n    mode: \"distribution\"\n  activation:\n    name: \"gelu\"\n  layer:\n    conv_init: \"kaiming_normal\"\n    linear_init: \"trunc_normal\"\n    linear_init_std_dev: 0.02\n  \nema:\n  enable: true\n  momentum: 0.0005\n\nstats:\n  train: [\"loss\"]\n  val: [ \"loss\" ]\n  checkpoint_metric: \"loss\"\n  checkpoint_metric_max: false\n"
  },
  {
    "path": "projects/catlip/pretraining/vit_huge.yaml",
    "content": "# pytest: disable\n\ntaskname: '+ CatLIP ViT-H/16 [DataComp]'\n\n_anchor_vocab_size: &_anchor_vocab_size 24320\n\ncommon:\n  run_label: \"train\"\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\n  mixed_precision_dtype: \"bfloat16\"\n  grad_clip: 1.0\n  save_all_checkpoints: true\n  save_interval_freq: 5000\n\ndataset:\n  # root_train does not matter for img_text_tar dataset because dataset information is expected\n  # to be contained in metadata file.\n  root_train: \"\"\n  disable_val: true\n  # effective batch size is 65k (256 images per GPU * 8 A100 40 GB GPUs * 32 Nodes)\n  train_batch_size0: 256\n  workers: -1 # use all CPUs\n  persistent_workers: true\n  pin_memory: true\n  name: \"wordnet_tagged_classification\"\n  category: \"classification\"\n  wordnet_tagged_classification:\n    vocab_size: *_anchor_vocab_size\n    # Uncomment these lines and replace with the path to metadata file containing dataset information\n    # and vocabulary file containing synset information.\n    # metadata_file: \"PATH_TO_METADADATA_FILE\"\n    # vocab_file: \"PATH_TO_VOCAB_FILE\"\n\nimage_augmentation:\n  # training related augmentations\n  random_resized_crop:\n    enable: true\n    interpolation: \"bilinear\"\n  random_horizontal_flip:\n    enable: true\n\nsampler:\n  name: \"variable_batch_sampler\"\n  use_shards: true\n  # In the 0-th epoch, data is downloaded to local machine from remote location.\n  # Therefore, we process the data sequentially in the 0-th epoch and start shuffling\n  # from first epoch onwards.\n  start_shuffling_from_epoch: 1\n  vbs:\n    crop_size_width: 224\n    crop_size_height: 224\n    max_n_scales: 25\n    min_crop_size_width: 128\n    max_crop_size_width: 320\n    min_crop_size_height: 128\n    max_crop_size_height: 320\n    check_scale: 16\n\nloss:\n  category: \"composite_loss\"\n  composite_loss:\n    - loss_category: \"classification\"\n      loss_weight: 1.0\n      classification:\n        name: \"binary_cross_entropy\"\n        binary_cross_entropy:\n          reduction: \"batch_mean\"\n    - loss_category: \"neural_augmentation\"\n      loss_weight: 1.0\n      neural_augmentation:\n        perceptual_metric: \"psnr\"\n        target_value: [ 40, 20 ]\n        curriculum_method: \"cosine\"\n\noptim:\n  no_decay_bn_filter_bias: true\n  weight_decay: 0.2\n  name: \"adamw\"\n  adamw:\n    beta1: 0.9\n    beta2: 0.999\n\nscheduler:\n  is_iteration_based: true\n  max_iterations: 200000\n  name: cosine\n  warmup_init_lr: 1.e-06\n  warmup_iterations: 10000\n  cosine:\n    max_lr: 0.0004\n    min_lr: 0.000004\n\nmodel:\n  activation_checkpointing: true\n  classification:\n    name: \"vit\"\n    n_classes: *_anchor_vocab_size\n    vit:\n      mode: \"huge\"\n      norm_layer: \"layer_norm_fp32\"\n      use_flash_attention: true\n  # use rangeaugment\n  learn_augmentation: \n    brightness: true\n    contrast: true\n    noise: true\n    mode: \"distribution\"\n  activation:\n    name: \"gelu\"\n  layer:\n    conv_init: \"kaiming_normal\"\n    linear_init: \"trunc_normal\"\n    linear_init_std_dev: 0.02\n  \nema:\n  enable: true\n  momentum: 0.0005\n\nstats:\n  train: [\"loss\"]\n  val: [ \"loss\" ]\n  checkpoint_metric: \"loss\"\n  checkpoint_metric_max: false\n"
  },
  {
    "path": "projects/catlip/pretraining/vit_large.yaml",
    "content": "# pytest: disable\n\ntaskname: '+ CatLIP ViT-L/16 [DataComp]'\n\n_anchor_vocab_size: &_anchor_vocab_size 24320\n\ncommon:\n  run_label: \"train\"\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\n  mixed_precision_dtype: \"bfloat16\"\n  grad_clip: 1.0\n  save_all_checkpoints: true\n  save_interval_freq: 5000\n\ndataset:\n  # root_train does not matter for img_text_tar dataset because dataset information is expected\n  # to be contained in metadata file.\n  root_train: \"\"\n  disable_val: true\n  # effective batch size is 65k (512 images per GPU * 8 A100 40 GB GPUs * 16 Nodes)\n  train_batch_size0: 512\n  workers: -1 # use all CPUs\n  persistent_workers: true\n  pin_memory: true\n  name: \"wordnet_tagged_classification\"\n  category: \"classification\"\n  wordnet_tagged_classification:\n    vocab_size: *_anchor_vocab_size\n    # Uncomment these lines and replace with the path to metadata file containing dataset information\n    # and vocabulary file containing synset information.\n    # metadata_file: \"PATH_TO_METADADATA_FILE\"\n    # vocab_file: \"PATH_TO_VOCAB_FILE\"\n\nimage_augmentation:\n  # training related augmentations\n  random_resized_crop:\n    enable: true\n    interpolation: \"bilinear\"\n  random_horizontal_flip:\n    enable: true\n\nsampler:\n  name: \"variable_batch_sampler\"\n  use_shards: true\n  # In the 0-th epoch, data is downloaded to local machine from remote location.\n  # Therefore, we process the data sequentially in the 0-th epoch and start shuffling\n  # from first epoch onwards.\n  start_shuffling_from_epoch: 1\n  vbs:\n    crop_size_width: 224\n    crop_size_height: 224\n    max_n_scales: 25\n    min_crop_size_width: 128\n    max_crop_size_width: 320\n    min_crop_size_height: 128\n    max_crop_size_height: 320\n    check_scale: 16\n\nloss:\n  category: \"composite_loss\"\n  composite_loss:\n    - loss_category: \"classification\"\n      loss_weight: 1.0\n      classification:\n        name: \"binary_cross_entropy\"\n        binary_cross_entropy:\n          reduction: \"batch_mean\"\n    - loss_category: \"neural_augmentation\"\n      loss_weight: 1.0\n      neural_augmentation:\n        perceptual_metric: \"psnr\"\n        target_value: [ 40, 20 ]\n        curriculum_method: \"cosine\"\n\noptim:\n  no_decay_bn_filter_bias: true\n  weight_decay: 0.2\n  name: \"adamw\"\n  adamw:\n    beta1: 0.9\n    beta2: 0.999\n\nscheduler:\n  is_iteration_based: true\n  max_iterations: 200000\n  name: cosine\n  warmup_init_lr: 1.e-06\n  warmup_iterations: 10000\n  cosine:\n    max_lr: 0.0006\n    min_lr: 0.000006\n\nmodel:\n  activation_checkpointing: true\n  classification:\n    name: \"vit\"\n    n_classes: *_anchor_vocab_size\n    vit:\n      mode: \"large\"\n      norm_layer: \"layer_norm_fp32\"\n      use_flash_attention: true\n  # use rangeaugment\n  learn_augmentation: \n    brightness: true\n    contrast: true\n    noise: true\n    mode: \"distribution\"\n  activation:\n    name: \"gelu\"\n  layer:\n    conv_init: \"kaiming_normal\"\n    linear_init: \"trunc_normal\"\n    linear_init_std_dev: 0.02\n  \nema:\n  enable: true\n  momentum: 0.0005\n\nstats:\n  train: [\"loss\"]\n  val: [ \"loss\" ]\n  checkpoint_metric: \"loss\"\n  checkpoint_metric_max: false\n"
  },
  {
    "path": "projects/catlip/semantic_segmentation/deeplabv3_vit_base.yaml",
    "content": "# pytest: disable\n\ntaskname: '+ DeepLabv3 ViT-B'\n\ncommon:\n  run_label: \"train\"\n  accum_freq: 1\n  log_freq: 100\n  auto_resume: true\n  save_all_checkpoints: true\n\ndataset:\n  root_train: \"/mnt/vision_datasets/ADEChallengeData2016/\"\n  root_val: \"/mnt/vision_datasets/ADEChallengeData2016/\"\n  name: \"ade20k\"\n  category: \"segmentation\"\n  # effective base batch size is 32 (4 images per GPU * 8 A100 GPUs)\n  train_batch_size0: 4\n  val_batch_size0: 4\n  workers: -1 # use all CPUs\n  persistent_workers: true\n  pin_memory: true\n\nimage_augmentation:\n  random_crop:\n    enable: true\n    seg_class_max_ratio: 0.75\n    pad_if_needed: true\n    mask_fill: 0 # background idx is 0\n  random_horizontal_flip:\n    enable: true\n  resize:\n    enable: true\n    size: [512, 512]\n    interpolation: \"bicubic\"\n  random_short_size_resize:\n    enable: true\n    interpolation: \"bicubic\"\n    short_side_min: 256\n    short_side_max: 768\n    max_img_dim: 1024\n\nsampler:\n  name: \"batch_sampler\"\n  bs:\n    crop_size_width: 512\n    crop_size_height: 512\n\nloss:\n  category: \"composite_loss\"\n  composite_loss:\n    - loss_category: \"segmentation\"\n      loss_weight: 1.0\n      segmentation:\n        name: \"cross_entropy\"\n        cross_entropy:\n          ignore_index: -1\n    - loss_category: \"neural_augmentation\"\n      loss_weight: 1.0\n      neural_augmentation:\n        perceptual_metric: \"psnr\"\n        target_value: [ 40, 20 ]\n        curriculum_method: \"cosine\"\n\noptim:\n  name: \"adamw\"\n  no_decay_bn_filter_bias: true\n  weight_decay: 0.1\n  adamw:\n    beta1: 0.9\n    beta2: 0.999\n\nscheduler:\n  name: \"cosine\"\n  max_epochs: 50\n  warmup_iterations: 500\n  warmup_init_lr: 1.e-6\n  cosine:\n    max_lr: 3.e-5\n    min_lr: 3.e-6\n\nmodel:\n  activation_checkpointing: true\n  # During object detection training, we do not use classifier and cls_token, so we exclude them\n  resume_exclude_scopes: [ \"classifier\" , \"cls_token\" ]\n  segmentation:\n    name: \"encoder_decoder\"\n    n_classes: 150\n    norm_layer: \"layer_norm_fp32\"\n    seg_head: \"deeplabv3\"\n    output_stride: 8\n    deeplabv3:\n      aspp_dropout: 0.1\n      aspp_out_channels: 512\n      aspp_rates: [ 12, 24, 36 ]\n  classification:\n    name: \"vit\"\n    # Initalize the model with a pre-trained model and finetune it.\n    pretrained: \"https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/pretrained_models/vit_base.pt\"\n    n_classes: 24320\n    vit:\n      mode: \"base\"\n      norm_layer: \"layer_norm_fp32\"\n      use_flash_attention: true\n      no_cls_token: true\n  learn_augmentation:\n    brightness: true\n    contrast: true\n    noise: true\n    mode: \"distribution\"\n  activation:\n    name: \"gelu\"\n  layer:\n    global_pool: \"mean\"\n    conv_init: \"kaiming_normal\"\n    linear_init: \"normal\"\n\nema:\n  enable: true\n  momentum: 0.0001\n\nstats:\n  val: [ \"loss\", \"iou\"]\n  train: [\"loss\"]\n  checkpoint_metric: \"iou\"\n  checkpoint_metric_max: true\n\n# During evaluation (with corenet-eval-seg), we follow following steps:\n#  1. Determine and store the size of input image as metadata.\n#  2. Resize image to a fixed size.\n#  3. Make a prediction.\n#  4. Resize the predicted mask to the same size as original input image.\n#  5. Compute results.\nevaluation:\n  segmentation:\n    resize_input_images_fixed_size: true\n    mode: \"validation_set\"\n"
  },
  {
    "path": "projects/catlip/semantic_segmentation/deeplabv3_vit_huge.yaml",
    "content": "# pytest: disable\n\ntaskname: '+ DeepLabv3 ViT-H'\n\ncommon:\n  run_label: \"train\"\n  accum_freq: 1\n  log_freq: 100\n  auto_resume: true\n  save_all_checkpoints: true\n\ndataset:\n  root_train: \"/mnt/vision_datasets/ADEChallengeData2016/\"\n  root_val: \"/mnt/vision_datasets/ADEChallengeData2016/\"\n  name: \"ade20k\"\n  category: \"segmentation\"\n  # effective base batch size is 32 (4 images per GPU * 8 A100 GPUs)\n  train_batch_size0: 4\n  val_batch_size0: 4\n  workers: -1 # use all CPUs\n  persistent_workers: true\n  pin_memory: true\n\nimage_augmentation:\n  random_crop:\n    enable: true\n    seg_class_max_ratio: 0.75\n    pad_if_needed: true\n    mask_fill: 0 # background idx is 0\n  random_horizontal_flip:\n    enable: true\n  resize:\n    enable: true\n    size: [512, 512]\n    interpolation: \"bicubic\"\n  random_short_size_resize:\n    enable: true\n    interpolation: \"bicubic\"\n    short_side_min: 256\n    short_side_max: 768\n    max_img_dim: 1024\n\nsampler:\n  name: \"batch_sampler\"\n  bs:\n    crop_size_width: 512\n    crop_size_height: 512\n\nloss:\n  category: \"composite_loss\"\n  composite_loss:\n    - loss_category: \"segmentation\"\n      loss_weight: 1.0\n      segmentation:\n        name: \"cross_entropy\"\n        cross_entropy:\n          ignore_index: -1\n    - loss_category: \"neural_augmentation\"\n      loss_weight: 1.0\n      neural_augmentation:\n        perceptual_metric: \"psnr\"\n        target_value: [ 40, 20 ]\n        curriculum_method: \"cosine\"\n\noptim:\n  name: \"adamw\"\n  no_decay_bn_filter_bias: true\n  weight_decay: 0.1\n  adamw:\n    beta1: 0.9\n    beta2: 0.999\n\nscheduler:\n  name: \"cosine\"\n  max_epochs: 50\n  warmup_iterations: 500\n  warmup_init_lr: 1.e-6\n  cosine:\n    max_lr: 3.e-5\n    min_lr: 3.e-6\n\nmodel:\n  activation_checkpointing: true\n  # During object detection training, we do not use classifier and cls_token, so we exclude them\n  resume_exclude_scopes: [ \"classifier\" , \"cls_token\" ]\n  segmentation:\n    name: \"encoder_decoder\"\n    n_classes: 150\n    norm_layer: \"layer_norm_fp32\"\n    seg_head: \"deeplabv3\"\n    output_stride: 8\n    deeplabv3:\n      aspp_dropout: 0.1\n      aspp_out_channels: 512\n      aspp_rates: [ 12, 24, 36 ]\n  classification:\n    name: \"vit\"\n    # Initalize the model with a pre-trained model and finetune it.\n    pretrained: \"https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/pretrained_models/vit_huge.pt\"\n    n_classes: 24320\n    vit:\n      mode: \"huge\"\n      norm_layer: \"layer_norm_fp32\"\n      use_flash_attention: true\n      no_cls_token: true\n  learn_augmentation:\n    brightness: true\n    contrast: true\n    noise: true\n    mode: \"distribution\"\n  activation:\n    name: \"gelu\"\n  layer:\n    global_pool: \"mean\"\n    conv_init: \"kaiming_normal\"\n    linear_init: \"normal\"\n\nema:\n  enable: true\n  momentum: 0.0001\n\nstats:\n  val: [ \"loss\", \"iou\"]\n  train: [\"loss\"]\n  checkpoint_metric: \"iou\"\n  checkpoint_metric_max: true\n\n# During evaluation (with corenet-eval-seg), we follow following steps:\n#  1. Determine and store the size of input image as metadata.\n#  2. Resize image to fixed size.\n#  3. Make a prediction.\n#  4. Resize the predicted mask to the same size as original input image.\n#  5. Compute results.\nevaluation:\n  segmentation:\n    resize_input_images_fixed_size: true\n    mode: \"validation_set\"\n"
  },
  {
    "path": "projects/catlip/semantic_segmentation/deeplabv3_vit_large.yaml",
    "content": "# pytest: disable\n\ntaskname: '+ DeepLabv3 ViT-L'\n\ncommon:\n  run_label: \"train\"\n  accum_freq: 1\n  log_freq: 100\n  auto_resume: true\n  save_all_checkpoints: true\n\ndataset:\n  root_train: \"/mnt/vision_datasets/ADEChallengeData2016/\"\n  root_val: \"/mnt/vision_datasets/ADEChallengeData2016/\"\n  name: \"ade20k\"\n  category: \"segmentation\"\n  # effective base batch size is 32 (4 images per GPU * 8 A100 GPUs)\n  train_batch_size0: 4\n  val_batch_size0: 4\n  workers: -1 # use all CPUs\n  persistent_workers: true\n  pin_memory: true\n\nimage_augmentation:\n  random_crop:\n    enable: true\n    seg_class_max_ratio: 0.75\n    pad_if_needed: true\n    mask_fill: 0 # background idx is 0\n  random_horizontal_flip:\n    enable: true\n  resize:\n    enable: true\n    size: [512, 512]\n    interpolation: \"bicubic\"\n  random_short_size_resize:\n    enable: true\n    interpolation: \"bicubic\"\n    short_side_min: 256\n    short_side_max: 768\n    max_img_dim: 1024\n\nsampler:\n  name: \"batch_sampler\"\n  bs:\n    crop_size_width: 512\n    crop_size_height: 512\n\nloss:\n  category: \"composite_loss\"\n  composite_loss:\n    - loss_category: \"segmentation\"\n      loss_weight: 1.0\n      segmentation:\n        name: \"cross_entropy\"\n        cross_entropy:\n          ignore_index: -1\n    - loss_category: \"neural_augmentation\"\n      loss_weight: 1.0\n      neural_augmentation:\n        perceptual_metric: \"psnr\"\n        target_value: [ 40, 20 ]\n        curriculum_method: \"cosine\"\n\noptim:\n  name: \"adamw\"\n  no_decay_bn_filter_bias: true\n  weight_decay: 0.1\n  adamw:\n    beta1: 0.9\n    beta2: 0.999\n\nscheduler:\n  name: \"cosine\"\n  max_epochs: 50\n  warmup_iterations: 500\n  warmup_init_lr: 1.e-6\n  cosine:\n    max_lr: 3.e-5\n    min_lr: 3.e-6\n\nmodel:\n  activation_checkpointing: true\n  # During object detection training, we do not use classifier and cls_token, so we exclude them\n  resume_exclude_scopes: [ \"classifier\" , \"cls_token\" ]\n  segmentation:\n    name: \"encoder_decoder\"\n    n_classes: 150\n    norm_layer: \"layer_norm_fp32\"\n    seg_head: \"deeplabv3\"\n    output_stride: 8\n    deeplabv3:\n      aspp_dropout: 0.1\n      aspp_out_channels: 512\n      aspp_rates: [ 12, 24, 36 ]\n  classification:\n    name: \"vit\"\n    # Initalize the model with a pre-trained model and finetune it.\n    pretrained: \"https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/catlip/pretrained_models/vit_large.pt\"\n    n_classes: 24320\n    vit:\n      mode: \"large\"\n      norm_layer: \"layer_norm_fp32\"\n      use_flash_attention: true\n      no_cls_token: true\n  learn_augmentation:\n    brightness: true\n    contrast: true\n    noise: true\n    mode: \"distribution\"\n  activation:\n    name: \"gelu\"\n  layer:\n    global_pool: \"mean\"\n    conv_init: \"kaiming_normal\"\n    linear_init: \"normal\"\n\nema:\n  enable: true\n  momentum: 0.0001\n\nstats:\n  val: [ \"loss\", \"iou\"]\n  train: [\"loss\"]\n  checkpoint_metric: \"iou\"\n  checkpoint_metric_max: true\n\n# During evaluation (with corenet-eval-seg), we follow following steps:\n#  1. Determine and store the size of input image as metadata.\n#  2. Resize image to fixed size.\n#  3. Make a prediction.\n#  4. Resize the predicted mask to the same size as original input image.\n#  5. Compute results.\nevaluation:\n  segmentation:\n    resize_input_images_fixed_size: true\n    mode: \"validation_set\"\n"
  },
  {
    "path": "projects/clip/README.md",
    "content": "# Training CLIP Models on Image-Text Dataset\n\nBelow is an example for [training](#training-clip) a CLIP model on image-text dataset, and evaluating it's [zero-shot image classification](#zero-shot-image-classification) accuracy on the ImageNet dataset. In our experiments, we used [DataComp-1.3B](https://arxiv.org/abs/2304.14108).\n\n## Image-text dataset preparation\n\nTo prepare the dataset, see the documentation in the [img_text_tar_dataset.py](../../corenet/data/datasets/multi_modal_img_text/img_text_tar_dataset.py) file.\n\n## Training CLIP\n\nCLIP leverages our custom ViT implementation that can be used with multi-scale variable batch sampler. CLIP models are \ntrained with [RangeAugment](https://arxiv.org/abs/2212.10553) on multiple nodes, each node with multiple GPUs. Please see comments in configuration files for exact number of GPUs and nodes used in our experiments.\n\n\nAn example command for training on `i-th` node is\n```bash\nexport CFG_FILE=\"PATH_TO_MODEL_CONFIGURATION_FILE\"\nexport RANK=<NODE_ID> * <NUM_GPUS_PER_NODE> # For Node-0, RANK=0; For Node-1, Rank=8, For Node-2, RANK=16, and so on.\nexport WORLD_SIZE=<NUM_NODES> * <NUM_GPUS_PER_NODE> # WORLD_SIZE=32 nodes * 8 GPUS per node = 256\ncorenet-train --common.config-file $CFG_FILE --common.results-loc results_clip --ddp.rank $RANK --ddp.world-size $WORLD_SIZE --ddp.dist-url 'tcp://IP_OF_NODE0:FREEPORT'\n```\n\n***Note***: Do not forget to change the training and validation dataset locations in configuration files.\n\n## Zero-shot image classification\n\nCLIP model, pretrained on DataComp-1.3B, with ViT-B image backbone can be evaluated at an input resolution of 224x224 using below shell script:\n\n```bash\nexport CONFIG_FILE=\"projects/clip/clip_vit_base.yaml\"\nexport MODEL_WEIGHTS=https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/clip/clip_vit_base.pt\nexport DATASET_PATH=\"/mnt/vision_datasets/imagenet/validation/\" # change to the ImageNet validation path\nCUDA_VISIBLE_DEVICES=0 corenet-eval --common.config-file $CONFIG_FILE --model.multi-modal-image-text.pretrained $MODEL_WEIGHTS --common.override-kwargs dataset.multi_modal_img_text.zero_shot_img_cls_dataset_name=imagenet dataset.root_val=$DATASET_PATH\n```\n\nThis should give\n```\ntop1={'zero_shot_image_logits': 75.042}\n```\n\n## Citation\n\nIf you find our work useful, please cite:\n\n```BibTex \n\n@inproceedings{radford2021learning,\n  title={Learning transferable visual models from natural language supervision},\n  author={Radford, Alec and Kim, Jong Wook and Hallacy, Chris and Ramesh, Aditya and Goh, Gabriel and Agarwal, Sandhini and Sastry, Girish and Askell, Amanda and Mishkin, Pamela and Clark, Jack and others},\n  booktitle={International conference on machine learning},\n  pages={8748--8763},\n  year={2021},\n  organization={PMLR}\n}\n\n@article{mehta2022rangeaugment,\n  title={RangeAugment: Efficient Online Augmentation with Range Learning},\n  author = {Mehta, Sachin and Naderiparizi, Saeid and Faghri, Fartash and Horton, Maxwell and Chen, Lailin and Farhadi, Ali and Tuzel, Oncel and Rastegari, Mohammad},\n  journal={arXiv preprint arXiv:2212.10553},\n  year={2022},\n  url={https://arxiv.org/abs/2212.10553},\n}\n\n@inproceedings{mehta2022cvnets, \n     author = {Mehta, Sachin and Abdolhosseini, Farzad and Rastegari, Mohammad}, \n     title = {CVNets: High Performance Library for Computer Vision}, \n     year = {2022}, \n     booktitle = {Proceedings of the 30th ACM International Conference on Multimedia}, \n     series = {MM '22} \n}\n```\n\n\n"
  },
  {
    "path": "projects/clip/clip_vit_base.yaml",
    "content": "# pytest: disable\n\ntaskname: '+ CLIP-ViT-B/16'\n\n_anchor_context_length: &_anchor_context_length 77\n\ncommon:\n  run_label: \"train\"\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\n  save_all_checkpoints: true\n  save_interval_freq: 5000\n\ndataset:\n  # root_train does not matter for img_text_tar dataset because dataset is information is expected\n  # to be contained in metadata file.\n  root_train: \"\"\n  root_val: \"/mnt/vision_datasets/imagenet/validation\"\n  name: \"img_text_tar\"\n  # effective batch size is > 65536 as we use multi-scale variable-batch sampler\n  # 65k = (32 nodes * 8 gpus per node * 256 batches per GPU; each GPU is A100 with 40 GB memory)\n  train_batch_size0: 256\n  val_batch_size0: 4\n  eval_batch_size0: 4\n  persistent_workers: true\n  pin_memory: true\n  # use all CPUs as workers\n  workers: -1\n  collate_fn_name_train: \"multi_modal_img_text_collate_fn\"\n  collate_fn_name_val: \"multi_modal_img_text_collate_fn\"\n  collate_fn_name_test: \"multi_modal_img_text_collate_fn\"\n  name: \"img_text_tar\"\n  category: \"multi_modal_image_text\"\n  multi_modal_img_text:\n    zero_shot_img_cls_dataset_name: \"imagenet\"\n    context_length: *_anchor_context_length\n    img_text_tar:\n      # Uncomment below line to add metadata file's path.\n      # metadata_file: \"PATH_OF_METADATA_FILE\"\n\ntext_tokenizer:\n  name: \"openai_clip\"\n\nimage_augmentation:\n  random_resized_crop:\n    enable: true\n    interpolation: \"bilinear\"\n    scale: [0.9, 1.0]\n  resize:\n    enable: true\n    size: 224 # shorter size is 224\n    interpolation: \"bilinear\"\n  center_crop:\n    enable: true\n    size: 224\n\nsampler:\n  name: \"variable_batch_sampler\"\n  use_shards: true\n  start_shuffling_from_epoch: 1\n  vbs:\n    crop_size_width: 224\n    crop_size_height: 224\n    max_n_scales: 5\n    min_crop_size_width: 160\n    max_crop_size_width: 320\n    min_crop_size_height: 160\n    max_crop_size_height: 320\n    check_scale: 32\n\nloss:\n  category: \"composite_loss\"\n  composite_loss:\n    - loss_category: \"multi_modal_image_text\"\n      loss_weight: 1.0\n      multi_modal_image_text:\n        name: \"contrastive_loss_clip\"\n    - loss_category: \"neural_augmentation\"\n      loss_weight: 1.0\n      neural_augmentation:\n        perceptual_metric: \"psnr\"\n        target_value: [ 40, 20 ]\n        curriculum_method: \"cosine\"\n\noptim:\n  name: \"adamw\"\n  weight_decay: 0.2\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.98\n    eps: 1.e-6\n\nscheduler:\n  is_iteration_based: true\n  max_iterations: 200000\n  name: cosine\n  warmup_init_lr: 1.e-06\n  warmup_iterations: 10000\n  cosine:\n    max_lr: 0.001\n    min_lr: 1.e-06\n\nmodel:\n  activation_checkpointing: true\n  multi_modal_image_text:\n    name: \"clip\"\n    lr_multiplier_img_encoder: 1.0\n    lr_multiplier_text_encoder: 1.0\n    clip:\n      projection_dim: 512\n  classification:\n    name: \"vit\"\n    vit:\n      mode: \"base\"\n      norm_layer: \"layer_norm_fp32\"\n  image_projection_head:\n    name: \"simple_projection_nc2nc\"\n  text:\n    name: \"transformer\"\n    vocab_size: 49408\n    context_length: *_anchor_context_length\n    transformer:\n      causal_masking: true\n      model_dim: 512\n      n_transformer_layers: 12\n      ffn_multiplier_per_layer: 4.0\n      n_heads_per_layer: 8\n      norm_layer: \"layer_norm_fp32\"\n  # Use RangeAugment: https://arxiv.org/abs/2212.10553\n  learn_augmentation:\n    brightness: true\n    contrast: true\n    noise: true\n    mode: \"distribution\"\n  activation:\n    name: \"gelu\"\n    inplace: true\n  layer:\n    global_pool: \"mean\"\n    conv_init: \"kaiming_uniform\"\n    linear_init: \"trunc_normal\"\n    linear_init_std_dev: 0.02\n\nema:\n  enable: true\n  momentum: 0.0005\n\nstats:\n  val: [ \"top1\" ]\n  train: [\"loss\", \"grad_norm\" ]\n  checkpoint_metric: \"top1.zero_shot_image_logits\"\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "projects/fastvit/README.md",
    "content": "# FastViT: A Fast Hybrid Vision Transformer using Structural Reparameterization\n\n[FastViT](https://arxiv.org/abs/2303.14189) is an efficient hybrid ViT architecture that attains state-of-the-art accuracy to latency tradeoff.\n\nWe provide training and evaluation code of FastVit, along with pretrained models and configuration files for image classification on the imagenet dataset.\n\n## ImageNet classification\n\n### Training\nSingle node 8 A100 GPU training of `FastVit-T8` model can be done using below command:\n\n```bash\nexport CFG_FILE=projects/fastvit/classification/fastvit_t8_in1k.yaml\ncorenet-train --common.config-file $CFG_FILE --common.results-loc classification_results\n```\n\n***Note***: Do not forget to change the training and validation dataset locations in configuration files.\n\n### Evaluation and Results\n\nWe evaluate the model on a single GPU using following command:\n\n```bash\n export CFG_FILE=projects/fastvit/classification/fastvit_t8_in1k.yaml\n export MODEL_WEIGHTS=\"https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/fastvit/imagenet-1k/fastvit-t8.pt\"\n export DATASET_PATH=\"/mnt/vision_datasets/imagenet/validation/\" # change to the ImageNet validation path\n CUDA_VISIBLE_DEVICES=0 corenet-eval --common.config-file $CFG_FILE --model.classification.pretrained $MODEL_WEIGHTS --common.override-kwargs dataset.root_val=$DATASET_PATH\n```\n\nThis should give\n```\ntop1=76.284 || top5=93.244\n```\n\n### Citation\nIf you find the work useful, please cite following papers:\n\n```BibTeX\n@inproceedings{vasufastvit2023,\n  author = {Pavan Kumar Anasosalu Vasu and James Gabriel and Jeff Zhu and Oncel Tuzel and Anurag Ranjan},\n  title = {FastViT:  A Fast Hybrid Vision Transformer using Structural Reparameterization},\n  booktitle={Proceedings of the IEEE/CVF International Conference on Computer Vision},\n  year = {2023}\n}\n\n@inproceedings{mehta2022cvnets, \n     author = {Mehta, Sachin and Abdolhosseini, Farzad and Rastegari, Mohammad}, \n     title = {CVNets: High Performance Library for Computer Vision}, \n     year = {2022}, \n     booktitle = {Proceedings of the 30th ACM International Conference on Multimedia}, \n     series = {MM '22} \n}\n```\n\n"
  },
  {
    "path": "projects/fastvit/classification/fastvit_t8_in1k.yaml",
    "content": "taskname: '+ FastViT T8'\ncommon:\n  run_label: \"train\"\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\n  channels_last: true\ndataset:\n  root_train: \"/mnt/imagenet/training\"\n  root_val: \"/mnt/imagenet/validation\"\n  name: \"imagenet\"\n  category: \"classification\"\n  train_batch_size0: 128 # effective batch size is 1024 (128 * 8 GPUs)\n  val_batch_size0: 100\n  eval_batch_size0: 100\n  workers: 8\n  persistent_workers: true\n  pin_memory: true\n  collate_fn_name_train: \"image_classification_data_collate_fn\"\n  collate_fn_name_val: \"image_classification_data_collate_fn\"\n  collate_fn_name_test: \"image_classification_data_collate_fn\"\n\nimage_augmentation:\n  random_resized_crop:\n    enable: true\n    interpolation: \"bilinear\"\n  random_horizontal_flip:\n    enable: true\n  rand_augment:\n    enable: true\n  random_erase:\n    enable: true\n    p: 0.25\n  mixup:\n    enable: true\n    alpha: 0.2\n  cutmix:\n    enable: true\n    alpha: 1.0\n  resize:\n    enable: true\n    size: 284 # shorter size is 284\n    interpolation: \"bilinear\"\n  center_crop:\n    enable: true\n    size: 256\nsampler:\n  name: \"variable_batch_sampler\"\n  vbs:\n    crop_size_width: 256\n    crop_size_height: 256\n    max_n_scales: 5\n    min_crop_size_width: 128\n    max_crop_size_width: 320\n    min_crop_size_height: 128\n    max_crop_size_height: 320\n    check_scale: 32\nloss:\n  category: \"classification\"\n  classification:\n    name: \"cross_entropy\"\n    cross_entropy:\n      label_smoothing: 0.1\noptim:\n  name: \"adamw\"\n  weight_decay: 0.05\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.999\nscheduler:\n  name: \"cosine\"\n  is_iteration_based: false\n  max_epochs: 300\n  warmup_iterations: 7500\n  warmup_init_lr: 1.e-6\n  cosine:\n    max_lr: 0.002\n    min_lr: 0.00002\nmodel:\n  classification:\n    name: \"fastvit\"\n    activation:\n      name: \"gelu\"\n    fastvit:\n      variant: \"T8\"\n      inference_mode: false\n      dropout: 0.0\n      drop_path: 0.0\n      use_layer_scale: true\n      layer_scale_init_value: 1.e-5\n    n_classes: 1000\n  normalization:\n    name: \"batch_norm\"\n    momentum: 0.1\n  activation:\n    name: \"gelu\"\n    inplace: false\n  layer:\n    global_pool: \"mean\"\n    conv_init: \"kaiming_normal\"\n    linear_init: \"trunc_normal\"\n    linear_init_std_dev: 0.02\nema:\n  enable: true\n  momentum: 0.0005\nstats:\n  val: [ \"loss\", \"top1\", \"top5\" ]\n  train: [\"loss\"]\n  checkpoint_metric: \"top1\"\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "projects/kv-prediction/README.md",
    "content": "# KV Prediction For Improved Time To First Token\n\n[KV Prediction](https://arxiv.org/abs/2410.08391) is a method for improving the time to first token (TTFT) of transformer models. It uses a small \"auxiliary\" transformer network to process the prompt efficiently. It then uses the KV cache of the auxiliary network to predict the KV cache of a larger \"base\" network. The base network is then used for inference without the need to query the auxiliary model again during autoregressive generation. Our method creates a pareto-optimal efficiency-accuracy trade-off for TTFT compared to baselines on benchmark datasets. See our paper for details.\n\n<p align=\"center\">\n<img src=\"model_arch.png\" width=\"50%\" align=\"center\">\n</p>\n\n## Training\n\nWe experiment with OpenELM models. Configs are located in the `openelm/` subdirectory. We used multinode training jobs with 8 nodes and 8 H100 GPUs per node.\n\nAn example command for training on the `i-th` node is\n\n```bash\nexport CFG_FILE=\"PATH_TO_KV_PREDICTION_MODEL_CONFIGURATION_FILE\"\nexport RANK=<NODE_ID> * <NUM_GPUS_PER_NODE>\nexport WORLD_SIZE=<NUM_NODES> * <NUM_GPUS_PER_NODE>\ncorenet-train --common.config-file $CFG_FILE --ddp.rank $RANK --ddp.world-size $WORLD_SIZE --ddp.dist-url 'tcp://IP_OF_NODE0:FREEPORT'\n```\n\n## Evaluation\n\nWe evaluate in the [LM Eval Harness](https://github.com/EleutherAI/lm-evaluation-harness) on commit `3196e907fa195b684470a913c7235ed7f08a4383`. We use the prompt template in `triviaqa-template.yaml`, since we noticed that the default template added an extra question mark to the question.\n\n## Citation\n\nIf you find our work useful, please cite:\n\n```BibTeX\n@misc{horton2024kvpredictionimprovedtime,\n      title={KV Prediction for Improved Time to First Token},\n      author={Maxwell Horton and Qingqing Cao and Chenfan Sun and Yanzi Jin and Sachin Mehta and Mohammad Rastegari and Moin Nabi},\n      year={2024},\n      eprint={2410.08391},\n      archivePrefix={arXiv},\n      primaryClass={cs.CL},\n      url={https://arxiv.org/abs/2410.08391},\n}\n\n@inproceedings{mehta2022cvnets, \n     author = {Mehta, Sachin and Abdolhosseini, Farzad and Rastegari, Mohammad}, \n     title = {CVNets: High Performance Library for Computer Vision}, \n     year = {2022}, \n     booktitle = {Proceedings of the 30th ACM International Conference on Multimedia}, \n     series = {MM '22} \n}\n```\n"
  },
  {
    "path": "projects/kv-prediction/openelm/openelm_1_1B_0_25.yaml",
    "content": "taskname: '+ [OpenELM-1.1B-0.25l Short PT]'\n\n_anchor_context_length: &_anchor_context_length 2048\n# actual vocab size is 32001 after adding padding token, so we add few extra tokens to make it more hardware friendly\n# for classification layer in LM model\n_anchor_vocab_size: &_anchor_vocab_size 32128\n_anchor_padding_index: &_anchor_padding_index 32000\n_anchor_forward_dtype: &_anchor_forward_dtype \"bfloat16\"\n_anchor_backward_dtype: &_anchor_backward_dtype \"float32\"\n\ncommon:\n  run_label: \"train\"\n  log_freq: 500\n  auto_resume: true\n  grad_clip: 1.0\n  save_all_checkpoints: true\n  save_interval_freq: 5000\n  eval_every_k_iterations: 10000\n  mixed_precision: true\n  mixed_precision_dtype: \"bfloat16\"\n\ndataset:\n  root_train: \"\"\n  disable_val: true\n  # effective batch size is ~2M tokens (16 sequences x 8 A100 80 GB GPUs x 8 nodes x 2048 tokens per seq )\n  # we use more nodes here because FSDP is not used.\n  train_batch_size0: 16\n  workers: 4\n  persistent_workers: true\n  pin_memory: true\n\n  # dataset details\n  category: \"language_modeling\"\n  name: \"general_lm\"\n  language_modeling:\n    sequence_length: *_anchor_context_length\n    # filter text that have less than 256 tokens after tokenization to avoid excessive padding\n    min_tokens_per_text: 256\n    # filter text that have less than 200 characters before tokenization\n    min_characters_per_text: 200\n    shuffle_data: true\n    general_lm:\n      train_data_info: [\n        {\n        # Uncomment below line and add path to parquet, jsonl, and json.gz files from pre-training corpora.\n        # We expect the path to be of the form \"/path/to/train-{file_id:05d}-05534.parquet\n          # \"file_name\": PATH_TO_PARQUET_FILES.\n          \"text_key\": \"content\",\n          \"file_id_range\": [0, 5535],\n        },\n      ]\n\ntext_tokenizer:\n  name: \"sentence_piece\"\n  sentence_piece:\n    enable_nfc_normalization: true\n    append_sot_token: true\n    append_eot_token: true\n    # Uncomment the below line and update the path of LLAMA SentencePiece model file\n    # model_path: <PATH_OF_LLAMA_SPM_MODEL>\n\n\nloss:\n  category: \"language_modeling\"\n  language_modeling:\n    name: \"cross_entropy\"\n    cross_entropy:\n      ignore_index: *_anchor_padding_index\n      use_z_loss: true\n\noptim:\n  name: \"adamw\"\n  weight_decay: 0.1\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.95\n    eps: 1.e-8\n\nscheduler:\n  is_iteration_based: true\n  # Train for about 1.4-1.5T tokens\n  max_iterations: 70000\n  name: cosine\n  warmup_init_lr: 1.e-06\n  warmup_iterations: 5000\n  cosine:\n    max_lr: 0.0024\n    # papers use min_lr= 0.1 x max_lr\n    min_lr: 0.00024\n\nmodel:\n  activation_checkpointing: true\n  language_modeling:\n    name: \"layer_pruned_general_gpt\"\n    general_gpt:\n      model_name: \"OpenELM-1_1B-0.25l\"\n      vocab_size: *_anchor_vocab_size\n      max_context_length: *_anchor_context_length\n      padding_index: *_anchor_padding_index\n    pretrained: \"https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/1.1B/checkpoint_average.pt\"\n  rename_scopes_map:\n    - [\"layers\\\\.4\\\\.\", \"layers.1.\"]\n    - [\"layers\\\\.8\\\\.\", \"layers.2.\"]\n    - [\"layers\\\\.12\\\\.\", \"layers.3.\"]\n    - [\"layers\\\\.16\\\\.\", \"layers.4.\"]\n    - [\"layers\\\\.20\\\\.\", \"layers.5.\"]\n    - [\"layers\\\\.24\\\\.\", \"layers.6.\"]\n    - [\"layers\\\\.28\\\\.\", \"layers.7.\"]\n    - [\"layers\\\\.32\\\\.\", \"layers.8.\"]\n  # Note: exclude_scopes happens first, before renaming.\n  resume_exclude_scopes: [\"layers\\\\.1\\\\.\", \"layers\\\\.2\\\\.\", \"layers\\\\.3\\\\.\", \"layers\\\\.5\\\\.\", \"layers\\\\.6\\\\.\", \"layers\\\\.7\\\\.\", \"layers\\\\.9\\\\.\", \"layers\\\\.10\\\\.\", \"layers\\\\.11\\\\.\", \"layers\\\\.13\\\\.\", \"layers\\\\.14\\\\.\", \"layers\\\\.15\\\\.\", \"layers\\\\.17\\\\.\", \"layers\\\\.18\\\\.\", \"layers\\\\.19\\\\.\", \"layers\\\\.21\\\\.\", \"layers\\\\.22\\\\.\", \"layers\\\\.23\\\\.\", \"layers\\\\.25\\\\.\", \"layers\\\\.26\\\\.\", \"layers\\\\.27\\\\.\", \"layers\\\\.29\\\\.\", \"layers\\\\.30\\\\.\", \"layers\\\\.31\\\\.\", \"layers\\\\.33\\\\.\", \"layers\\\\.34\\\\.\", \"layers\\\\.35\\\\.\"]\n\n\nstats:\n  val: [ \"loss\"]\n  train: [\"loss\"]\n  checkpoint_metric: \"loss.total_loss\"\n  checkpoint_metric_max: false\n"
  },
  {
    "path": "projects/kv-prediction/openelm/openelm_1_1B_0_50.yaml",
    "content": "# pytest: disable\n\ntaskname: '+ [OpenELM-1.1B-50l Short PT]'\n\n_anchor_context_length: &_anchor_context_length 2048\n# actual vocab size is 32001 after adding padding token, so we add few extra tokens to make it more hardware friendly\n# for classification layer in LM model\n_anchor_vocab_size: &_anchor_vocab_size 32128\n_anchor_padding_index: &_anchor_padding_index 32000\n_anchor_forward_dtype: &_anchor_forward_dtype \"bfloat16\"\n_anchor_backward_dtype: &_anchor_backward_dtype \"float32\"\n\ncommon:\n  run_label: \"train\"\n  log_freq: 500\n  auto_resume: true\n  grad_clip: 1.0\n  save_all_checkpoints: true\n  save_interval_freq: 5000\n  eval_every_k_iterations: 10000\n  mixed_precision: true\n  mixed_precision_dtype: \"bfloat16\"\n\ndataset:\n  root_train: \"\"\n  disable_val: true\n  # effective batch size is ~2M tokens (16 sequences x 8 A100 80 GB GPUs x 8 nodes x 2048 tokens per seq )\n  # we use more nodes here because FSDP is not used.\n  train_batch_size0: 16\n  workers: 4\n  persistent_workers: true\n  pin_memory: true\n\n  # dataset details\n  category: \"language_modeling\"\n  name: \"general_lm\"\n  language_modeling:\n    sequence_length: *_anchor_context_length\n    # filter text that have less than 256 tokens after tokenization to avoid excessive padding\n    min_tokens_per_text: 256\n    # filter text that have less than 200 characters before tokenization\n    min_characters_per_text: 200\n    shuffle_data: true\n    general_lm:\n      train_data_info: [\n        {\n        # Uncomment below line and add path to parquet, jsonl, and json.gz files from pre-training corpora.\n        # We expect the path to be of the form \"/path/to/train-{file_id:05d}-05534.parquet\n          # \"file_name\": PATH_TO_PARQUET_FILES.\n          \"text_key\": \"content\",\n          \"file_id_range\": [0, 5535],\n        },\n      ]\n\ntext_tokenizer:\n  name: \"sentence_piece\"\n  sentence_piece:\n    enable_nfc_normalization: true\n    append_sot_token: true\n    append_eot_token: true\n    # Uncomment the below line and update the path of LLAMA SentencePiece model file\n    # model_path: <PATH_OF_LLAMA_SPM_MODEL>\n\n\nloss:\n  category: \"language_modeling\"\n  language_modeling:\n    name: \"cross_entropy\"\n    cross_entropy:\n      ignore_index: *_anchor_padding_index\n      use_z_loss: true\n\noptim:\n  name: \"adamw\"\n  weight_decay: 0.1\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.95\n    eps: 1.e-8\n\nscheduler:\n  is_iteration_based: true\n  # Train for about 1.4-1.5T tokens\n  max_iterations: 70000\n  name: cosine\n  warmup_init_lr: 1.e-06\n  warmup_iterations: 5000\n  cosine:\n    max_lr: 0.0024\n    # papers use min_lr= 0.1 x max_lr\n    min_lr: 0.00024\n\nmodel:\n  activation_checkpointing: true\n  language_modeling:\n    name: \"layer_pruned_general_gpt\"\n    general_gpt:\n      model_name: \"OpenELM-1_1B-0.50l\"\n      vocab_size: *_anchor_vocab_size\n      max_context_length: *_anchor_context_length\n      padding_index: *_anchor_padding_index\n    pretrained: \"https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/1.1B/checkpoint_average.pt\"\n  rename_scopes_map:\n    - [\"layers\\\\.2\\\\.\", \"layers.1.\"]\n    - [\"layers\\\\.4\\\\.\", \"layers.2.\"]\n    - [\"layers\\\\.6\\\\.\", \"layers.3.\"]\n    - [\"layers\\\\.8\\\\.\", \"layers.4.\"]\n    - [\"layers\\\\.10\\\\.\", \"layers.5.\"]\n    - [\"layers\\\\.12\\\\.\", \"layers.6.\"]\n    - [\"layers\\\\.14\\\\.\", \"layers.7.\"]\n    - [\"layers\\\\.16\\\\.\", \"layers.8.\"]\n    - [\"layers\\\\.18\\\\.\", \"layers.9.\"]\n    - [\"layers\\\\.20\\\\.\", \"layers.10.\"]\n    - [\"layers\\\\.22\\\\.\", \"layers.11.\"]\n    - [\"layers\\\\.24\\\\.\", \"layers.12.\"]\n    - [\"layers\\\\.26\\\\.\", \"layers.13.\"]\n    - [\"layers\\\\.28\\\\.\", \"layers.14.\"]\n    - [\"layers\\\\.30\\\\.\", \"layers.15.\"]\n    - [\"layers\\\\.32\\\\.\", \"layers.16.\"]\n    - [\"layers\\\\.34\\\\.\", \"layers.17.\"]\n  # Note: exclude_scopes happens first, before renaming.\n  resume_exclude_scopes: [\"layers\\\\.1\\\\.\", \"layers\\\\.3\\\\.\", \"layers\\\\.5\\\\.\", \"layers\\\\.7\\\\.\", \"layers\\\\.9\\\\.\", \"layers\\\\.11\\\\.\", \"layers\\\\.13\\\\.\", \"layers\\\\.15\\\\.\", \"layers\\\\.17\\\\.\", \"layers\\\\.19\\\\.\", \"layers\\\\.21\\\\.\", \"layers\\\\.23\\\\.\", \"layers\\\\.25\\\\.\", \"layers\\\\.27\\\\.\", \"layers\\\\.29\\\\.\", \"layers\\\\.31\\\\.\", \"layers\\\\.33\\\\.\", \"layers\\\\.35\\\\.\"]\n\n\nstats:\n  val: [ \"loss\"]\n  train: [\"loss\"]\n  checkpoint_metric: \"loss.total_loss\"\n  checkpoint_metric_max: false\n"
  },
  {
    "path": "projects/kv-prediction/openelm/openelm_1_1B_0_75.yaml",
    "content": "# pytest: disable\n\ntaskname: '+ [OpenELM-1.1B-75l Short PT]'\n\n_anchor_context_length: &_anchor_context_length 2048\n# actual vocab size is 32001 after adding padding token, so we add few extra tokens to make it more hardware friendly\n# for classification layer in LM model\n_anchor_vocab_size: &_anchor_vocab_size 32128\n_anchor_padding_index: &_anchor_padding_index 32000\n_anchor_forward_dtype: &_anchor_forward_dtype \"bfloat16\"\n_anchor_backward_dtype: &_anchor_backward_dtype \"float32\"\n\ncommon:\n  run_label: \"train\"\n  log_freq: 500\n  auto_resume: true\n  grad_clip: 1.0\n  save_all_checkpoints: true\n  save_interval_freq: 5000\n  eval_every_k_iterations: 10000\n  mixed_precision: true\n  mixed_precision_dtype: \"bfloat16\"\n\ndataset:\n  root_train: \"\"\n  disable_val: true\n  # effective batch size is ~2M tokens (16 sequences x 8 A100 80 GB GPUs x 8 nodes x 2048 tokens per seq )\n  # we use more nodes here because FSDP is not used.\n  train_batch_size0: 16\n  workers: 4\n  persistent_workers: true\n  pin_memory: true\n\n  # dataset details\n  category: \"language_modeling\"\n  name: \"general_lm\"\n  language_modeling:\n    sequence_length: *_anchor_context_length\n    # filter text that have less than 256 tokens after tokenization to avoid excessive padding\n    min_tokens_per_text: 256\n    # filter text that have less than 200 characters before tokenization\n    min_characters_per_text: 200\n    shuffle_data: true\n    general_lm:\n      train_data_info: [\n        {\n        # Uncomment below line and add path to parquet, jsonl, and json.gz files from pre-training corpora.\n        # We expect the path to be of the form \"/path/to/train-{file_id:05d}-05534.parquet\n          # \"file_name\": PATH_TO_PARQUET_FILES.\n          \"text_key\": \"content\",\n          \"file_id_range\": [0, 5535],\n        },\n      ]\n\ntext_tokenizer:\n  name: \"sentence_piece\"\n  sentence_piece:\n    enable_nfc_normalization: true\n    append_sot_token: true\n    append_eot_token: true\n    # Uncomment the below line and update the path of LLAMA SentencePiece model file\n    # model_path: <PATH_OF_LLAMA_SPM_MODEL>\n\n\nloss:\n  category: \"language_modeling\"\n  language_modeling:\n    name: \"cross_entropy\"\n    cross_entropy:\n      ignore_index: *_anchor_padding_index\n      use_z_loss: true\n\noptim:\n  name: \"adamw\"\n  weight_decay: 0.1\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.95\n    eps: 1.e-8\n\nscheduler:\n  is_iteration_based: true\n  # Train for about 1.4-1.5T tokens\n  max_iterations: 70000\n  name: cosine\n  warmup_init_lr: 1.e-06\n  warmup_iterations: 5000\n  cosine:\n    max_lr: 0.0024\n    # papers use min_lr= 0.1 x max_lr\n    min_lr: 0.00024\n\nmodel:\n  activation_checkpointing: true\n  language_modeling:\n    name: \"layer_pruned_general_gpt\"\n    general_gpt:\n      model_name: \"OpenELM-1_1B-0.75l\"\n      vocab_size: *_anchor_vocab_size\n      max_context_length: *_anchor_context_length\n      padding_index: *_anchor_padding_index\n    pretrained: \"https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/1.1B/checkpoint_average.pt\"\n  rename_scopes_map:\n    - [\"layers\\\\.0\\\\.\", \"layers.0.\"]\n    - [\"layers\\\\.1\\\\.\", \"layers.1.\"]\n    - [\"layers\\\\.2\\\\.\", \"layers.2.\"]\n    - [\"layers\\\\.4\\\\.\", \"layers.3.\"]\n    - [\"layers\\\\.5\\\\.\", \"layers.4.\"]\n    - [\"layers\\\\.6\\\\.\", \"layers.5.\"]\n    - [\"layers\\\\.8\\\\.\", \"layers.6.\"]\n    - [\"layers\\\\.9\\\\.\", \"layers.7.\"]\n    - [\"layers\\\\.10\\\\.\", \"layers.8.\"]\n    - [\"layers\\\\.12\\\\.\", \"layers.9.\"]\n    - [\"layers\\\\.13\\\\.\", \"layers.10.\"]\n    - [\"layers\\\\.14\\\\.\", \"layers.11.\"]\n    - [\"layers\\\\.16\\\\.\", \"layers.12.\"]\n    - [\"layers\\\\.17\\\\.\", \"layers.13.\"]\n    - [\"layers\\\\.18\\\\.\", \"layers.14.\"]\n    - [\"layers\\\\.20\\\\.\", \"layers.15.\"]\n    - [\"layers\\\\.21\\\\.\", \"layers.16.\"]\n    - [\"layers\\\\.22\\\\.\", \"layers.17.\"]\n    - [\"layers\\\\.24\\\\.\", \"layers.18.\"]\n    - [\"layers\\\\.25\\\\.\", \"layers.19.\"]\n    - [\"layers\\\\.26\\\\.\", \"layers.20.\"]\n  # Note: exclude_scopes happens first, before renaming.\n  resume_exclude_scopes: [\"layers\\\\.3\\\\.\", \"layers\\\\.7\\\\.\", \"layers\\\\.11\\\\.\", \"layers\\\\.15\\\\.\", \"layers\\\\.19\\\\.\", \"layers\\\\.23\\\\.\", \"layers\\\\.27\\\\.\"]\n\n\nstats:\n  val: [ \"loss\"]\n  train: [\"loss\"]\n  checkpoint_metric: \"loss.total_loss\"\n  checkpoint_metric_max: false\n"
  },
  {
    "path": "projects/kv-prediction/openelm/openelm_1_1B_kvp_c_270M.yaml",
    "content": "taskname: '+ [KV Prediction Base OpenELM-1.1B Aux OpenELM-270M]'\n\n_anchor_context_length: &_anchor_context_length 2048\n# actual vocab size is 32001 after adding padding token, so we add few extra tokens to make it more hardware friendly\n# for classification layer in LM model\n_anchor_vocab_size: &_anchor_vocab_size 32128\n_anchor_padding_index: &_anchor_padding_index 32000\n_anchor_forward_dtype: &_anchor_forward_dtype \"bfloat16\"\n_anchor_backward_dtype: &_anchor_backward_dtype \"float32\"\n\ncommon:\n  run_label: \"train\"\n  log_freq: 500\n  auto_resume: true\n  grad_clip: 1.0\n  save_all_checkpoints: true\n  save_interval_freq: 5000\n  eval_every_k_iterations: 10000\n  mixed_precision: true\n  mixed_precision_dtype: \"bfloat16\"\n  accum_freq: 2\n\ndataset:\n  root_train: \"\"\n  disable_val: true\n  # effective batch size is ~2M tokens (16 sequences x 8 A100 80 GB GPUs x 8 nodes x 2048 tokens per seq )\n  # we use more nodes here because FSDP is not used.\n  #train_batch_size0: 16\n  train_batch_size0: 8\n  workers: 4\n  persistent_workers: true\n  pin_memory: true\n\n  # dataset details\n  category: \"language_modeling\"\n  name: \"general_lm\"\n  language_modeling:\n    sequence_length: *_anchor_context_length\n    # filter text that have less than 256 tokens after tokenization to avoid excessive padding\n    min_tokens_per_text: 256\n    # filter text that have less than 200 characters before tokenization\n    min_characters_per_text: 200\n    shuffle_data: true\n    general_lm:\n      train_data_info: [\n        {\n        # Uncomment below line and add path to parquet, jsonl, and json.gz files from pre-training corpora.\n        # We expect the path to be of the form \"/path/to/train-{file_id:05d}-05534.parquet\n          # \"file_name\": PATH_TO_PARQUET_FILES.\n          \"text_key\": \"content\",\n          \"file_id_range\": [0, 5535],\n        },\n      ]\n\ntext_tokenizer:\n  name: \"sentence_piece\"\n  sentence_piece:\n    enable_nfc_normalization: true\n    append_sot_token: true\n    append_eot_token: true\n    # Uncomment the below line and update the path of LLAMA SentencePiece model file\n    # model_path: <PATH_OF_LLAMA_SPM_MODEL>\n\n\nloss:\n  category: \"language_modeling\"\n  language_modeling:\n    name: \"cross_entropy_for_kv_prediction\"\n    cross_entropy_for_kv_prediction:\n      ignore_index: *_anchor_padding_index\n      use_z_loss: true\n      auxiliary_loss: 1\n      kv_loss: 1\n\noptim:\n  name: \"adamw\"\n  weight_decay: 0.1\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.95\n    eps: 1.e-8\n\nscheduler:\n  is_iteration_based: true\n  # Train for about 140-150B tokens\n  max_iterations: 70000\n  name: cosine\n  warmup_init_lr: 1.e-06\n  warmup_iterations: 5000\n  cosine:\n    # This value should be the actual lr divided by the number of nodes.\n    max_lr: 0.0012\n    # papers use min_lr= 0.1 x max_lr\n    min_lr: 0.00012\n\nmodel:\n  activation_checkpointing: true\n  freeze_modules: [\"base.*\"]\n  language_modeling:\n    name: \"kv_prediction\"\n    kv_prediction:\n      auxkv_num_layers_to_basekv_num_layers: [0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 13, 14, 15]\n      base_model:\n       - model:\n          language_modeling:\n            name: \"general_gpt\"\n            pretrained: \"https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/1.1B/checkpoint_average.pt\"\n            general_gpt:\n              model_name: \"OpenELM-1_1B\"\n      auxiliary_model:\n       - model:\n          language_modeling:\n            name: \"general_gpt\"\n            pretrained: \"https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/270M/checkpoint_average.pt\"\n            general_gpt:\n              model_name: \"OpenELM-270M\"\n    general_gpt:\n      model_name: \"OpenELM-1_1B\"\n      vocab_size: *_anchor_vocab_size\n      max_context_length: *_anchor_context_length\n      padding_index: *_anchor_padding_index\n\nstats:\n  val: [ \"loss\"]\n  train: [\"loss\"]\n  checkpoint_metric: \"loss.total_loss\"\n  checkpoint_metric_max: false\n"
  },
  {
    "path": "projects/kv-prediction/openelm/openelm_1_1B_kvp_c_450M.yaml",
    "content": "# pytest: disable\n\ntaskname: '+ [KV Prediction Base OpenELM-1.1B Aux OpenELM-450M]'\n\n_anchor_context_length: &_anchor_context_length 2048\n# actual vocab size is 32001 after adding padding token, so we add few extra tokens to make it more hardware friendly\n# for classification layer in LM model\n_anchor_vocab_size: &_anchor_vocab_size 32128\n_anchor_padding_index: &_anchor_padding_index 32000\n_anchor_forward_dtype: &_anchor_forward_dtype \"bfloat16\"\n_anchor_backward_dtype: &_anchor_backward_dtype \"float32\"\n\ncommon:\n  run_label: \"train\"\n  log_freq: 500\n  auto_resume: true\n  grad_clip: 1.0\n  save_all_checkpoints: true\n  save_interval_freq: 5000\n  eval_every_k_iterations: 10000\n  mixed_precision: true\n  mixed_precision_dtype: \"bfloat16\"\n  accum_freq: 2\n\ndataset:\n  root_train: \"\"\n  disable_val: true\n  # effective batch size is ~2M tokens (16 sequences x 8 A100 80 GB GPUs x 8 nodes x 2048 tokens per seq )\n  # we use more nodes here because FSDP is not used.\n  #train_batch_size0: 16\n  train_batch_size0: 8\n  workers: 4\n  persistent_workers: true\n  pin_memory: true\n\n  # dataset details\n  category: \"language_modeling\"\n  name: \"general_lm\"\n  language_modeling:\n    sequence_length: *_anchor_context_length\n    # filter text that have less than 256 tokens after tokenization to avoid excessive padding\n    min_tokens_per_text: 256\n    # filter text that have less than 200 characters before tokenization\n    min_characters_per_text: 200\n    shuffle_data: true\n    general_lm:\n      train_data_info: [\n        {\n        # Uncomment below line and add path to parquet, jsonl, and json.gz files from pre-training corpora.\n        # We expect the path to be of the form \"/path/to/train-{file_id:05d}-05534.parquet\n          # \"file_name\": PATH_TO_PARQUET_FILES.\n          \"text_key\": \"content\",\n          \"file_id_range\": [0, 5535],\n        },\n      ]\n\ntext_tokenizer:\n  name: \"sentence_piece\"\n  sentence_piece:\n    enable_nfc_normalization: true\n    append_sot_token: true\n    append_eot_token: true\n    # Uncomment the below line and update the path of LLAMA SentencePiece model file\n    # model_path: <PATH_OF_LLAMA_SPM_MODEL>\n\n\nloss:\n  category: \"language_modeling\"\n  language_modeling:\n    name: \"cross_entropy_for_kv_prediction\"\n    cross_entropy_for_kv_prediction:\n      ignore_index: *_anchor_padding_index\n      use_z_loss: true\n      auxiliary_loss: 1\n      kv_loss: 1\n\noptim:\n  name: \"adamw\"\n  weight_decay: 0.1\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.95\n    eps: 1.e-8\n\nscheduler:\n  is_iteration_based: true\n  # Train for about 140-150B tokens\n  max_iterations: 70000\n  name: cosine\n  warmup_init_lr: 1.e-06\n  warmup_iterations: 5000\n  cosine:\n    # This value should be the actual lr divided by the number of nodes.\n    max_lr: 0.0012\n    # papers use min_lr= 0.1 x max_lr\n    min_lr: 0.00012\n\nmodel:\n  activation_checkpointing: true\n  freeze_modules: [\"base.*\"]\n  language_modeling:\n    name: \"kv_prediction\"\n    kv_prediction:\n      auxkv_num_layers_to_basekv_num_layers: [0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]\n      base_model:\n       - model:\n          language_modeling:\n            name: \"general_gpt\"\n            pretrained: \"https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/1.1B/checkpoint_average.pt\"\n            general_gpt:\n              model_name: \"OpenELM-1_1B\"\n      auxiliary_model:\n       - model:\n          language_modeling:\n            name: \"general_gpt\"\n            pretrained: \"https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/450M/checkpoint_average.pt\"\n            general_gpt:\n              model_name: \"OpenELM-450M\"\n    general_gpt:\n      model_name: \"OpenELM-1_1B\"\n      vocab_size: *_anchor_vocab_size\n      max_context_length: *_anchor_context_length\n      padding_index: *_anchor_padding_index\n\nstats:\n  val: [ \"loss\"]\n  train: [\"loss\"]\n  checkpoint_metric: \"loss.total_loss\"\n  checkpoint_metric_max: false\n"
  },
  {
    "path": "projects/kv-prediction/openelm/openelm_1_1B_kvp_lp_0_25.yaml",
    "content": "# pytest: disable\n\ntaskname: '+ [KV Prediction Base OpenELM-1.1B Aux OpenELM-1.1B-0.25l]'\n\n_anchor_context_length: &_anchor_context_length 2048\n# actual vocab size is 32001 after adding padding token, so we add few extra tokens to make it more hardware friendly\n# for classification layer in LM model\n_anchor_vocab_size: &_anchor_vocab_size 32128\n_anchor_padding_index: &_anchor_padding_index 32000\n_anchor_forward_dtype: &_anchor_forward_dtype \"bfloat16\"\n_anchor_backward_dtype: &_anchor_backward_dtype \"float32\"\n\ncommon:\n  run_label: \"train\"\n  log_freq: 500\n  auto_resume: true\n  grad_clip: 1.0\n  save_all_checkpoints: true\n  save_interval_freq: 5000\n  eval_every_k_iterations: 10000\n  mixed_precision: true\n  mixed_precision_dtype: \"bfloat16\"\n  accum_freq: 2\n\ndataset:\n  root_train: \"\"\n  disable_val: true\n  # effective batch size is ~2M tokens (16 sequences x 8 A100 80 GB GPUs x 8 nodes x 2048 tokens per seq )\n  # we use more nodes here because FSDP is not used.\n  #train_batch_size0: 16\n  train_batch_size0: 8\n  workers: 4\n  persistent_workers: true\n  pin_memory: true\n\n  # dataset details\n  category: \"language_modeling\"\n  name: \"general_lm\"\n  language_modeling:\n    sequence_length: *_anchor_context_length\n    # filter text that have less than 256 tokens after tokenization to avoid excessive padding\n    min_tokens_per_text: 256\n    # filter text that have less than 200 characters before tokenization\n    min_characters_per_text: 200\n    shuffle_data: true\n    general_lm:\n      train_data_info: [\n        {\n        # Uncomment below line and add path to parquet, jsonl, and json.gz files from pre-training corpora.\n        # We expect the path to be of the form \"/path/to/train-{file_id:05d}-05534.parquet\n          # \"file_name\": PATH_TO_PARQUET_FILES.\n          \"text_key\": \"content\",\n          \"file_id_range\": [0, 5535],\n        },\n      ]\n\ntext_tokenizer:\n  name: \"sentence_piece\"\n  sentence_piece:\n    enable_nfc_normalization: true\n    append_sot_token: true\n    append_eot_token: true\n    # Uncomment the below line and update the path of LLAMA SentencePiece model file\n    # model_path: <PATH_OF_LLAMA_SPM_MODEL>\n\n\nloss:\n  category: \"language_modeling\"\n  language_modeling:\n    name: \"cross_entropy_for_kv_prediction\"\n    cross_entropy_for_kv_prediction:\n      ignore_index: *_anchor_padding_index\n      use_z_loss: true\n      auxiliary_loss: 1\n      kv_loss: 1\n\noptim:\n  name: \"adamw\"\n  weight_decay: 0.1\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.95\n    eps: 1.e-8\n\nscheduler:\n  is_iteration_based: true\n  # Train for about 140-150B tokens\n  max_iterations: 70000\n  name: cosine\n  warmup_init_lr: 1.e-06\n  warmup_iterations: 5000\n  cosine:\n    # This value should be the actual lr divided by the number of nodes.\n    max_lr: 0.0012\n    # papers use min_lr= 0.1 x max_lr\n    min_lr: 0.00012\n\nmodel:\n  activation_checkpointing: true\n  freeze_modules: [\"base.*\"]\n  language_modeling:\n    name: \"kv_prediction\"\n    kv_prediction:\n      auxkv_num_layers_to_basekv_num_layers: [0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6]\n      base_model:\n       - model:\n          language_modeling:\n            name: \"general_gpt\"\n            pretrained: \"https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/1.1B/checkpoint_average.pt\"\n            general_gpt:\n              model_name: \"OpenELM-1_1B\"\n      auxiliary_model:\n       - model:\n          language_modeling:\n            name: \"layer_pruned_general_gpt\"\n            pretrained: \"https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/1.1B/checkpoint_average.pt\"\n            general_gpt:\n              model_name: \"OpenELM-1_1B-0.25l\"\n          rename_scopes_map:\n            - [\"layers\\\\.4\\\\.\", \"layers.1.\"]\n            - [\"layers\\\\.8\\\\.\", \"layers.2.\"]\n            - [\"layers\\\\.12\\\\.\", \"layers.3.\"]\n            - [\"layers\\\\.16\\\\.\", \"layers.4.\"]\n            - [\"layers\\\\.20\\\\.\", \"layers.5.\"]\n            - [\"layers\\\\.24\\\\.\", \"layers.6.\"]\n            - [\"layers\\\\.28\\\\.\", \"layers.7.\"]\n            - [\"layers\\\\.32\\\\.\", \"layers.8.\"]\n          # Note: exclude_scopes happens first, before renaming.\n          resume_exclude_scopes: [\"layers\\\\.1\\\\.\", \"layers\\\\.2\\\\.\", \"layers\\\\.3\\\\.\", \"layers\\\\.5\\\\.\", \"layers\\\\.6\\\\.\", \"layers\\\\.7\\\\.\", \"layers\\\\.9\\\\.\", \"layers\\\\.10\\\\.\", \"layers\\\\.11\\\\.\", \"layers\\\\.13\\\\.\", \"layers\\\\.14\\\\.\", \"layers\\\\.15\\\\.\", \"layers\\\\.17\\\\.\", \"layers\\\\.18\\\\.\", \"layers\\\\.19\\\\.\", \"layers\\\\.21\\\\.\", \"layers\\\\.22\\\\.\", \"layers\\\\.23\\\\.\", \"layers\\\\.25\\\\.\", \"layers\\\\.26\\\\.\", \"layers\\\\.27\\\\.\", \"layers\\\\.29\\\\.\", \"layers\\\\.30\\\\.\", \"layers\\\\.31\\\\.\", \"layers\\\\.33\\\\.\", \"layers\\\\.34\\\\.\", \"layers\\\\.35\\\\.\"]\n    general_gpt:\n      model_name: \"OpenELM-1_1B\"\n      vocab_size: *_anchor_vocab_size\n      max_context_length: *_anchor_context_length\n      padding_index: *_anchor_padding_index\n\nstats:\n  val: [ \"loss\"]\n  train: [\"loss\"]\n  checkpoint_metric: \"loss.total_loss\"\n  checkpoint_metric_max: false\n"
  },
  {
    "path": "projects/kv-prediction/openelm/openelm_1_1B_kvp_lp_0_50.yaml",
    "content": "# pytest: disable\n\ntaskname: '+ [KV Prediction Base OpenELM-1.1B Aux OpenELM-1.1B-0.50l]'\n\n_anchor_context_length: &_anchor_context_length 2048\n# actual vocab size is 32001 after adding padding token, so we add few extra tokens to make it more hardware friendly\n# for classification layer in LM model\n_anchor_vocab_size: &_anchor_vocab_size 32128\n_anchor_padding_index: &_anchor_padding_index 32000\n_anchor_forward_dtype: &_anchor_forward_dtype \"bfloat16\"\n_anchor_backward_dtype: &_anchor_backward_dtype \"float32\"\n\ncommon:\n  run_label: \"train\"\n  log_freq: 500\n  auto_resume: true\n  grad_clip: 1.0\n  save_all_checkpoints: true\n  save_interval_freq: 5000\n  eval_every_k_iterations: 10000\n  mixed_precision: true\n  mixed_precision_dtype: \"bfloat16\"\n  accum_freq: 2\n\ndataset:\n  root_train: \"\"\n  disable_val: true\n  # effective batch size is ~2M tokens (16 sequences x 8 A100 80 GB GPUs x 8 nodes x 2048 tokens per seq )\n  # we use more nodes here because FSDP is not used.\n  #train_batch_size0: 16\n  train_batch_size0: 8\n  workers: 4\n  persistent_workers: true\n  pin_memory: true\n\n  # dataset details\n  category: \"language_modeling\"\n  name: \"general_lm\"\n  language_modeling:\n    sequence_length: *_anchor_context_length\n    # filter text that have less than 256 tokens after tokenization to avoid excessive padding\n    min_tokens_per_text: 256\n    # filter text that have less than 200 characters before tokenization\n    min_characters_per_text: 200\n    shuffle_data: true\n    general_lm:\n      train_data_info: [\n        {\n        # Uncomment below line and add path to parquet, jsonl, and json.gz files from pre-training corpora.\n        # We expect the path to be of the form \"/path/to/train-{file_id:05d}-05534.parquet\n          # \"file_name\": PATH_TO_PARQUET_FILES.\n          \"text_key\": \"content\",\n          \"file_id_range\": [0, 5535],\n        },\n      ]\n\ntext_tokenizer:\n  name: \"sentence_piece\"\n  sentence_piece:\n    enable_nfc_normalization: true\n    append_sot_token: true\n    append_eot_token: true\n    # Uncomment the below line and update the path of LLAMA SentencePiece model file\n    # model_path: <PATH_OF_LLAMA_SPM_MODEL>\n\n\nloss:\n  category: \"language_modeling\"\n  language_modeling:\n    name: \"cross_entropy_for_kv_prediction\"\n    cross_entropy_for_kv_prediction:\n      ignore_index: *_anchor_padding_index\n      use_z_loss: true\n      auxiliary_loss: 1\n      kv_loss: 1\n\noptim:\n  name: \"adamw\"\n  weight_decay: 0.1\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.95\n    eps: 1.e-8\n\nscheduler:\n  is_iteration_based: true\n  # Train for about 140-150B tokens\n  max_iterations: 70000\n  name: cosine\n  warmup_init_lr: 1.e-06\n  warmup_iterations: 5000\n  cosine:\n    # This value should be the actual lr divided by the number of nodes.\n    max_lr: 0.0012\n    # papers use min_lr= 0.1 x max_lr\n    min_lr: 0.00012\n\nmodel:\n  activation_checkpointing: true\n  freeze_modules: [\"base.*\"]\n  language_modeling:\n    name: \"kv_prediction\"\n    kv_prediction:\n      auxkv_num_layers_to_basekv_num_layers: [0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13]\n      base_model:\n       - model:\n          language_modeling:\n            name: \"general_gpt\"\n            pretrained: \"https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/1.1B/checkpoint_average.pt\"\n            general_gpt:\n              model_name: \"OpenELM-1_1B\"\n      auxiliary_model:\n       - model:\n          language_modeling:\n            name: \"layer_pruned_general_gpt\"\n            pretrained: \"https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/1.1B/checkpoint_average.pt\"\n            general_gpt:\n              model_name: \"OpenELM-1_1B-0.50l\"\n          rename_scopes_map:\n            - [\"layers\\\\.2\\\\.\", \"layers.1.\"]\n            - [\"layers\\\\.4\\\\.\", \"layers.2.\"]\n            - [\"layers\\\\.6\\\\.\", \"layers.3.\"]\n            - [\"layers\\\\.8\\\\.\", \"layers.4.\"]\n            - [\"layers\\\\.10\\\\.\", \"layers.5.\"]\n            - [\"layers\\\\.12\\\\.\", \"layers.6.\"]\n            - [\"layers\\\\.14\\\\.\", \"layers.7.\"]\n            - [\"layers\\\\.16\\\\.\", \"layers.8.\"]\n            - [\"layers\\\\.18\\\\.\", \"layers.9.\"]\n            - [\"layers\\\\.20\\\\.\", \"layers.10.\"]\n            - [\"layers\\\\.22\\\\.\", \"layers.11.\"]\n            - [\"layers\\\\.24\\\\.\", \"layers.12.\"]\n            - [\"layers\\\\.26\\\\.\", \"layers.13.\"]\n          # Note: exclude_scopes happens first, before renaming.\n          resume_exclude_scopes: [\"layers\\\\.1\\\\.\", \"layers\\\\.3\\\\.\", \"layers\\\\.5\\\\.\", \"layers\\\\.7\\\\.\", \"layers\\\\.9\\\\.\", \"layers\\\\.11\\\\.\", \"layers\\\\.13\\\\.\", \"layers\\\\.15\\\\.\", \"layers\\\\.17\\\\.\", \"layers\\\\.19\\\\.\", \"layers\\\\.21\\\\.\", \"layers\\\\.23\\\\.\", \"layers\\\\.25\\\\.\", \"layers\\\\.27\\\\.\"]\n    general_gpt:\n      model_name: \"OpenELM-1_1B\"\n      vocab_size: *_anchor_vocab_size\n      max_context_length: *_anchor_context_length\n      padding_index: *_anchor_padding_index\n\nstats:\n  val: [ \"loss\"]\n  train: [\"loss\"]\n  checkpoint_metric: \"loss.total_loss\"\n  checkpoint_metric_max: false\n"
  },
  {
    "path": "projects/kv-prediction/openelm/openelm_1_1B_kvp_lp_0_75.yaml",
    "content": "# pytest: disable\n\ntaskname: '+ [KV Prediction Base OpenELM-1.1B Aux OpenELM-1.1B-0.75l]'\n\n_anchor_context_length: &_anchor_context_length 2048\n# actual vocab size is 32001 after adding padding token, so we add few extra tokens to make it more hardware friendly\n# for classification layer in LM model\n_anchor_vocab_size: &_anchor_vocab_size 32128\n_anchor_padding_index: &_anchor_padding_index 32000\n_anchor_forward_dtype: &_anchor_forward_dtype \"bfloat16\"\n_anchor_backward_dtype: &_anchor_backward_dtype \"float32\"\n\ncommon:\n  run_label: \"train\"\n  log_freq: 500\n  auto_resume: true\n  grad_clip: 1.0\n  save_all_checkpoints: true\n  save_interval_freq: 5000\n  eval_every_k_iterations: 10000\n  mixed_precision: true\n  mixed_precision_dtype: \"bfloat16\"\n  accum_freq: 2\n\ndataset:\n  root_train: \"\"\n  disable_val: true\n  # effective batch size is ~2M tokens (16 sequences x 8 A100 80 GB GPUs x 8 nodes x 2048 tokens per seq )\n  # we use more nodes here because FSDP is not used.\n  #train_batch_size0: 16\n  train_batch_size0: 8\n  workers: 4\n  persistent_workers: true\n  pin_memory: true\n\n  # dataset details\n  category: \"language_modeling\"\n  name: \"general_lm\"\n  language_modeling:\n    sequence_length: *_anchor_context_length\n    # filter text that have less than 256 tokens after tokenization to avoid excessive padding\n    min_tokens_per_text: 256\n    # filter text that have less than 200 characters before tokenization\n    min_characters_per_text: 200\n    shuffle_data: true\n    general_lm:\n      train_data_info: [\n        {\n        # Uncomment below line and add path to parquet, jsonl, and json.gz files from pre-training corpora.\n        # We expect the path to be of the form \"/path/to/train-{file_id:05d}-05534.parquet\n          # \"file_name\": PATH_TO_PARQUET_FILES.\n          \"text_key\": \"content\",\n          \"file_id_range\": [0, 5535],\n        },\n      ]\n\ntext_tokenizer:\n  name: \"sentence_piece\"\n  sentence_piece:\n    enable_nfc_normalization: true\n    append_sot_token: true\n    append_eot_token: true\n    # Uncomment the below line and update the path of LLAMA SentencePiece model file\n    # model_path: <PATH_OF_LLAMA_SPM_MODEL>\n\n\nloss:\n  category: \"language_modeling\"\n  language_modeling:\n    name: \"cross_entropy_for_kv_prediction\"\n    cross_entropy_for_kv_prediction:\n      ignore_index: *_anchor_padding_index\n      use_z_loss: true\n      auxiliary_loss: 1\n      kv_loss: 1\n\noptim:\n  name: \"adamw\"\n  weight_decay: 0.1\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.95\n    eps: 1.e-8\n\nscheduler:\n  is_iteration_based: true\n  # Train for about 140-150B tokens\n  max_iterations: 70000\n  name: cosine\n  warmup_init_lr: 1.e-06\n  warmup_iterations: 5000\n  cosine:\n    # This value should be the actual lr divided by the number of nodes.\n    max_lr: 0.0012\n    # papers use min_lr= 0.1 x max_lr\n    min_lr: 0.00012\n\nmodel:\n  activation_checkpointing: true\n  freeze_modules: [\"base.*\"]\n  language_modeling:\n    name: \"kv_prediction\"\n    kv_prediction:\n      auxkv_num_layers_to_basekv_num_layers: [0, 1, 2, 2, 3, 4, 5, 5, 6, 7, 8, 8, 9, 10, 11, 11, 12, 13, 14, 14, 15, 16, 17, 17, 18, 19, 20, 20]\n      base_model:\n       - model:\n          language_modeling:\n            name: \"general_gpt\"\n            pretrained: \"https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/1.1B/checkpoint_average.pt\"\n            general_gpt:\n              model_name: \"OpenELM-1_1B\"\n      auxiliary_model:\n       - model:\n          language_modeling:\n            name: \"layer_pruned_general_gpt\"\n            pretrained: \"https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/1.1B/checkpoint_average.pt\"\n            general_gpt:\n              model_name: \"OpenELM-1_1B-0.75l\"\n          rename_scopes_map:\n            - [\"layers\\\\.0\\\\.\", \"layers.0.\"]\n            - [\"layers\\\\.1\\\\.\", \"layers.1.\"]\n            - [\"layers\\\\.2\\\\.\", \"layers.2.\"]\n            - [\"layers\\\\.4\\\\.\", \"layers.3.\"]\n            - [\"layers\\\\.5\\\\.\", \"layers.4.\"]\n            - [\"layers\\\\.6\\\\.\", \"layers.5.\"]\n            - [\"layers\\\\.8\\\\.\", \"layers.6.\"]\n            - [\"layers\\\\.9\\\\.\", \"layers.7.\"]\n            - [\"layers\\\\.10\\\\.\", \"layers.8.\"]\n            - [\"layers\\\\.12\\\\.\", \"layers.9.\"]\n            - [\"layers\\\\.13\\\\.\", \"layers.10.\"]\n            - [\"layers\\\\.14\\\\.\", \"layers.11.\"]\n            - [\"layers\\\\.16\\\\.\", \"layers.12.\"]\n            - [\"layers\\\\.17\\\\.\", \"layers.13.\"]\n            - [\"layers\\\\.18\\\\.\", \"layers.14.\"]\n            - [\"layers\\\\.20\\\\.\", \"layers.15.\"]\n            - [\"layers\\\\.21\\\\.\", \"layers.16.\"]\n            - [\"layers\\\\.22\\\\.\", \"layers.17.\"]\n            - [\"layers\\\\.24\\\\.\", \"layers.18.\"]\n            - [\"layers\\\\.25\\\\.\", \"layers.19.\"]\n            - [\"layers\\\\.26\\\\.\", \"layers.20.\"]\n          # Note: exclude_scopes happens first, before renaming.\n          resume_exclude_scopes: [\"layers\\\\.3\\\\.\", \"layers\\\\.7\\\\.\", \"layers\\\\.11\\\\.\", \"layers\\\\.15\\\\.\", \"layers\\\\.19\\\\.\", \"layers\\\\.23\\\\.\", \"layers\\\\.27\\\\.\"]\n    general_gpt:\n      model_name: \"OpenELM-1_1B\"\n      vocab_size: *_anchor_vocab_size\n      max_context_length: *_anchor_context_length\n      padding_index: *_anchor_padding_index\n\nstats:\n  val: [ \"loss\"]\n  train: [\"loss\"]\n  checkpoint_metric: \"loss.total_loss\"\n  checkpoint_metric_max: false\n"
  },
  {
    "path": "projects/kv-prediction/openelm/openelm_3B_kvp_c_1_1B.yaml",
    "content": "# pytest: disable\n\ntaskname: '+ [KV Prediction Base OpenELM-3B Aux OpenELM-3B-Aux-1.1B Short PT]'\n\n_anchor_context_length: &_anchor_context_length 2048\n# actual vocab size is 32001 after adding padding token, so we add few extra tokens to make it more hardware friendly\n# for classification layer in LM model\n_anchor_vocab_size: &_anchor_vocab_size 32128\n_anchor_padding_index: &_anchor_padding_index 32000\n_anchor_forward_dtype: &_anchor_forward_dtype \"bfloat16\"\n_anchor_backward_dtype: &_anchor_backward_dtype \"float32\"\n\ncommon:\n  run_label: \"train\"\n  log_freq: 500\n  auto_resume: true\n  grad_clip: 1.0\n  save_all_checkpoints: true\n  save_interval_freq: 5000\n  eval_every_k_iterations: 10000\n\ntrain_eval_pipeline:\n name: \"fsdp_train_eval_pipeline\"\n\nfsdp:\n  sharding_strategy: \"full_shard\"\n  parameter_datatype: *_anchor_forward_dtype\n  gradient_reduction_datatype: *_anchor_backward_dtype\n  buffer_datatype: *_anchor_forward_dtype\n  cpu_offload: false\n  limit_all_gathers: true\n\ndataset:\n  root_train: \"\"\n  disable_val: true\n  # effective batch size is ~2M tokens (16 sequences x 8 H100 80 GB GPUs x 8 nodes x 2048 tokens per seq )\n  train_batch_size0: 16\n  workers: 4\n  persistent_workers: true\n  pin_memory: true\n  # dataset details\n  category: \"language_modeling\"\n  name: \"general_lm\"\n  language_modeling:\n    sequence_length: *_anchor_context_length\n    # filter text that have less than 256 tokens after tokenization to avoid excessive padding\n    min_tokens_per_text: 256\n    # filter text that have less than 200 characters before tokenization\n    min_characters_per_text: 200\n    shuffle_data: true\n    general_lm:\n      train_data_info: [\n        {\n        # Uncomment below line and add path to parquet, jsonl, and json.gz files from pre-training corpora.\n        # We expect the path to be of the form \"/path/to/train-{file_id:05d}-05534.parquet\n          # \"file_name\": PATH_TO_PARQUET_FILES.\n          \"text_key\": \"content\",\n          \"file_id_range\": [0, 5535],\n        },\n      ]\n\ntext_tokenizer:\n  name: \"sentence_piece\"\n  sentence_piece:\n    enable_nfc_normalization: true\n    append_sot_token: true\n    append_eot_token: true\n    # Uncomment the below line and update the path of LLAMA SentencePiece model file\n    # model_path: <PATH_OF_LLAMA_SPM_MODEL>\n\nloss:\n  category: \"language_modeling\"\n  language_modeling:\n    name: \"cross_entropy_for_kv_prediction\"\n    cross_entropy_for_kv_prediction:\n      ignore_index: *_anchor_padding_index\n      use_z_loss: true\n      auxiliary_loss: 1\n      kv_loss: 1\n\noptim:\n  name: \"adamw\"\n  weight_decay: 0.1\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.95\n    eps: 1.e-8\n\nscheduler:\n  is_iteration_based: true\n  # Train for about 140-150B tokens\n  max_iterations: 70000\n  name: cosine\n  warmup_init_lr: 1.e-06\n  warmup_iterations: 5000\n  cosine:\n    max_lr: 0.0012\n    # papers use min_lr= 0.1 x max_lr\n    min_lr: 0.00012\n\nmodel:\n  activation_checkpointing: true\n  freeze_modules: [\"base.*\"]\n  language_modeling:\n    name: \"kv_prediction\"\n    kv_prediction:\n      auxkv_num_layers_to_basekv_num_layers: [0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27]\n      base_model:\n       - model:\n          language_modeling:\n            name: \"general_gpt\"\n            pretrained: \"https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/3B/checkpoint_average.pt\"\n            general_gpt:\n              model_name: \"OpenELM-3B\"\n      auxiliary_model:\n       - model:\n          language_modeling:\n            name: \"general_gpt\"\n            pretrained: \"https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/1.1B/checkpoint_average.pt\"\n            general_gpt:\n              model_name: \"OpenELM-1_1B\"\n    general_gpt:\n      model_name: \"OpenELM-3B\"\n      vocab_size: *_anchor_vocab_size\n      max_context_length: *_anchor_context_length\n      padding_index: *_anchor_padding_index\n\nstats:\n  val: [ \"loss\"]\n  train: [\"loss\"]\n  checkpoint_metric: \"loss.total_loss\"\n  checkpoint_metric_max: false\n"
  },
  {
    "path": "projects/kv-prediction/openelm/openelm_3B_kvp_c_270M.yaml",
    "content": "# pytest: disable\n\ntaskname: '+ [KV Prediction Base OpenELM-3B Aux OpenELM-270M Short PT]'\n\n_anchor_context_length: &_anchor_context_length 2048\n# actual vocab size is 32001 after adding padding token, so we add few extra tokens to make it more hardware friendly\n# for classification layer in LM model\n_anchor_vocab_size: &_anchor_vocab_size 32128\n_anchor_padding_index: &_anchor_padding_index 32000\n_anchor_forward_dtype: &_anchor_forward_dtype \"bfloat16\"\n_anchor_backward_dtype: &_anchor_backward_dtype \"float32\"\n\ncommon:\n  run_label: \"train\"\n  log_freq: 500\n  auto_resume: true\n  grad_clip: 1.0\n  save_all_checkpoints: true\n  save_interval_freq: 5000\n  eval_every_k_iterations: 10000\n\ntrain_eval_pipeline:\n name: \"fsdp_train_eval_pipeline\"\n\nfsdp:\n  sharding_strategy: \"full_shard\"\n  parameter_datatype: *_anchor_forward_dtype\n  gradient_reduction_datatype: *_anchor_backward_dtype\n  buffer_datatype: *_anchor_forward_dtype\n  cpu_offload: false\n  limit_all_gathers: true\n\ndataset:\n  root_train: \"\"\n  disable_val: true\n  # effective batch size is ~2M tokens (16 sequences x 8 H100 80 GB GPUs x 8 nodes x 2048 tokens per seq )\n  train_batch_size0: 16\n  workers: 4\n  persistent_workers: true\n  pin_memory: true\n  # dataset details\n  category: \"language_modeling\"\n  name: \"general_lm\"\n  language_modeling:\n    sequence_length: *_anchor_context_length\n    # filter text that have less than 256 tokens after tokenization to avoid excessive padding\n    min_tokens_per_text: 256\n    # filter text that have less than 200 characters before tokenization\n    min_characters_per_text: 200\n    shuffle_data: true\n    general_lm:\n      train_data_info: [\n        {\n        # Uncomment below line and add path to parquet, jsonl, and json.gz files from pre-training corpora.\n        # We expect the path to be of the form \"/path/to/train-{file_id:05d}-05534.parquet\n          # \"file_name\": PATH_TO_PARQUET_FILES.\n          \"text_key\": \"content\",\n          \"file_id_range\": [0, 5535],\n        },\n      ]\n\ntext_tokenizer:\n  name: \"sentence_piece\"\n  sentence_piece:\n    enable_nfc_normalization: true\n    append_sot_token: true\n    append_eot_token: true\n    # Uncomment the below line and update the path of LLAMA SentencePiece model file\n    # model_path: <PATH_OF_LLAMA_SPM_MODEL>\n\nloss:\n  category: \"language_modeling\"\n  language_modeling:\n    name: \"cross_entropy_for_kv_prediction\"\n    cross_entropy_for_kv_prediction:\n      ignore_index: *_anchor_padding_index\n      use_z_loss: true\n      auxiliary_loss: 1\n      kv_loss: 1\n\noptim:\n  name: \"adamw\"\n  weight_decay: 0.1\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.95\n    eps: 1.e-8\n\nscheduler:\n  is_iteration_based: true\n  # Train for about 140-150B tokens\n  max_iterations: 70000\n  name: cosine\n  warmup_init_lr: 1.e-06\n  warmup_iterations: 5000\n  cosine:\n    max_lr: 0.0012\n    # papers use min_lr= 0.1 x max_lr\n    min_lr: 0.00012\nmodel:\n  activation_checkpointing: true\n  freeze_modules: [\"base.*\"]\n  language_modeling:\n    name: \"kv_prediction\"\n    kv_prediction:\n      auxkv_num_layers_to_basekv_num_layers: [0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15]\n      base_model:\n       - model:\n          language_modeling:\n            name: \"general_gpt\"\n            pretrained: \"https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/3B/checkpoint_average.pt\"\n            general_gpt:\n              model_name: \"OpenELM-3B\"\n      auxiliary_model:\n       - model:\n          language_modeling:\n            name: \"general_gpt\"\n            pretrained: \"https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/270M/checkpoint_average.pt\"\n            general_gpt:\n              model_name: \"OpenELM-270M\"\n    general_gpt:\n      model_name: \"OpenELM-3B\"\n      vocab_size: *_anchor_vocab_size\n      max_context_length: *_anchor_context_length\n      padding_index: *_anchor_padding_index\nstats:\n  val: [ \"loss\"]\n  train: [\"loss\"]\n  checkpoint_metric: \"loss.total_loss\"\n  checkpoint_metric_max: false\n"
  },
  {
    "path": "projects/kv-prediction/openelm/openelm_3B_kvp_c_450M.yaml",
    "content": "# pytest: disable\n\ntaskname: '+ [KV Prediction Base OpenELM-3B Aux OpenELM-450M Short PT]'\n\n_anchor_context_length: &_anchor_context_length 2048\n# actual vocab size is 32001 after adding padding token, so we add few extra tokens to make it more hardware friendly\n# for classification layer in LM model\n_anchor_vocab_size: &_anchor_vocab_size 32128\n_anchor_padding_index: &_anchor_padding_index 32000\n_anchor_forward_dtype: &_anchor_forward_dtype \"bfloat16\"\n_anchor_backward_dtype: &_anchor_backward_dtype \"float32\"\n\ncommon:\n  run_label: \"train\"\n  log_freq: 500\n  auto_resume: true\n  grad_clip: 1.0\n  save_all_checkpoints: true\n  save_interval_freq: 5000\n  eval_every_k_iterations: 10000\n\ntrain_eval_pipeline:\n name: \"fsdp_train_eval_pipeline\"\n\nfsdp:\n  sharding_strategy: \"full_shard\"\n  parameter_datatype: *_anchor_forward_dtype\n  gradient_reduction_datatype: *_anchor_backward_dtype\n  buffer_datatype: *_anchor_forward_dtype\n  cpu_offload: false\n  limit_all_gathers: true\n\ndataset:\n  root_train: \"\"\n  disable_val: true\n  # effective batch size is ~2M tokens (16 sequences x 8 H100 80 GB GPUs x 8 nodes x 2048 tokens per seq )\n  train_batch_size0: 16\n  workers: 4\n  persistent_workers: true\n  pin_memory: true\n  # dataset details\n  category: \"language_modeling\"\n  name: \"general_lm\"\n  language_modeling:\n    sequence_length: *_anchor_context_length\n    # filter text that have less than 256 tokens after tokenization to avoid excessive padding\n    min_tokens_per_text: 256\n    # filter text that have less than 200 characters before tokenization\n    min_characters_per_text: 200\n    shuffle_data: true\n    general_lm:\n      train_data_info: [\n        {\n        # Uncomment below line and add path to parquet, jsonl, and json.gz files from pre-training corpora.\n        # We expect the path to be of the form \"/path/to/train-{file_id:05d}-05534.parquet\n          # \"file_name\": PATH_TO_PARQUET_FILES.\n          \"text_key\": \"content\",\n          \"file_id_range\": [0, 5535],\n        },\n      ]\n\ntext_tokenizer:\n  name: \"sentence_piece\"\n  sentence_piece:\n    enable_nfc_normalization: true\n    append_sot_token: true\n    append_eot_token: true\n    # Uncomment the below line and update the path of LLAMA SentencePiece model file\n    # model_path: <PATH_OF_LLAMA_SPM_MODEL>\n\nloss:\n  category: \"language_modeling\"\n  language_modeling:\n    name: \"cross_entropy_for_kv_prediction\"\n    cross_entropy_for_kv_prediction:\n      ignore_index: *_anchor_padding_index\n      use_z_loss: true\n      auxiliary_loss: 1\n      kv_loss: 1\n\noptim:\n  name: \"adamw\"\n  weight_decay: 0.1\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.95\n    eps: 1.e-8\n\nscheduler:\n  is_iteration_based: true\n  # Train for about 140-150B tokens\n  max_iterations: 70000\n  name: cosine\n  warmup_init_lr: 1.e-06\n  warmup_iterations: 5000\n  cosine:\n    max_lr: 0.0012\n    # papers use min_lr= 0.1 x max_lr\n    min_lr: 0.00012\n\nmodel:\n  activation_checkpointing: true\n  freeze_modules: [\"base.*\"]\n  language_modeling:\n    name: \"kv_prediction\"\n    kv_prediction:\n      auxkv_num_layers_to_basekv_num_layers: [0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 16, 17, 18, 19]\n      base_model:\n       - model:\n          language_modeling:\n            name: \"general_gpt\"\n            pretrained: \"https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/3B/checkpoint_average.pt\"\n            general_gpt:\n              model_name: \"OpenELM-3B\"\n      auxiliary_model:\n       - model:\n          language_modeling:\n            name: \"general_gpt\"\n            pretrained: \"https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/450M/checkpoint_average.pt\"\n            general_gpt:\n              model_name: \"OpenELM-450M\"\n    general_gpt:\n      model_name: \"OpenELM-3B\"\n      vocab_size: *_anchor_vocab_size\n      max_context_length: *_anchor_context_length\n      padding_index: *_anchor_padding_index\n\nstats:\n  val: [ \"loss\"]\n  train: [\"loss\"]\n  checkpoint_metric: \"loss.total_loss\"\n  checkpoint_metric_max: false\n"
  },
  {
    "path": "projects/kv-prediction/openelm/openelm_3B_kvp_lp_0_25.yaml",
    "content": "# pytest: disable\n\ntaskname: '+ [OpenELM-3B-0.25l Short PT]'\n\n_anchor_context_length: &_anchor_context_length 2048\n# actual vocab size is 32001 after adding padding token, so we add few extra tokens to make it more hardware friendly\n# for classification layer in LM model\n_anchor_vocab_size: &_anchor_vocab_size 32128\n_anchor_padding_index: &_anchor_padding_index 32000\n_anchor_forward_dtype: &_anchor_forward_dtype \"bfloat16\"\n_anchor_backward_dtype: &_anchor_backward_dtype \"float32\"\n\ncommon:\n  run_label: \"train\"\n  log_freq: 500\n  auto_resume: true\n  grad_clip: 1.0\n  save_all_checkpoints: true\n  save_interval_freq: 5000\n  eval_every_k_iterations: 10000\n\ntrain_eval_pipeline:\n name: \"fsdp_train_eval_pipeline\"\n\nfsdp:\n  sharding_strategy: \"full_shard\"\n  parameter_datatype: *_anchor_forward_dtype\n  gradient_reduction_datatype: *_anchor_backward_dtype\n  buffer_datatype: *_anchor_forward_dtype\n  cpu_offload: false\n  limit_all_gathers: true\n\ndataset:\n  root_train: \"\"\n  disable_val: true\n  # effective batch size is ~2M tokens (16 sequences x 8 H100 80 GB GPUs x 8 nodes x 2048 tokens per seq )\n  train_batch_size0: 16\n  workers: 4\n  persistent_workers: true\n  pin_memory: true\n  # dataset details\n  category: \"language_modeling\"\n  name: \"general_lm\"\n  language_modeling:\n    sequence_length: *_anchor_context_length\n    # filter text that have less than 256 tokens after tokenization to avoid excessive padding\n    min_tokens_per_text: 256\n    # filter text that have less than 200 characters before tokenization\n    min_characters_per_text: 200\n    shuffle_data: true\n    general_lm:\n      train_data_info: [\n        {\n        # Uncomment below line and add path to parquet, jsonl, and json.gz files from pre-training corpora.\n        # We expect the path to be of the form \"/path/to/train-{file_id:05d}-05534.parquet\n          # \"file_name\": PATH_TO_PARQUET_FILES.\n          \"text_key\": \"content\",\n          \"file_id_range\": [0, 5535],\n        },\n      ]\n\ntext_tokenizer:\n  name: \"sentence_piece\"\n  sentence_piece:\n    enable_nfc_normalization: true\n    append_sot_token: true\n    append_eot_token: true\n    # Uncomment the below line and update the path of LLAMA SentencePiece model file\n    # model_path: <PATH_OF_LLAMA_SPM_MODEL>\n\nloss:\n  category: \"language_modeling\"\n  language_modeling:\n    name: \"cross_entropy\"\n    cross_entropy:\n      ignore_index: *_anchor_padding_index\n      use_z_loss: true\n\noptim:\n  name: \"adamw\"\n  weight_decay: 0.1\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.95\n    eps: 1.e-8\n\nscheduler:\n  is_iteration_based: true\n  # Train for about 1.4-1.5T tokens\n  max_iterations: 70000\n  name: cosine\n  warmup_init_lr: 1.e-06\n  warmup_iterations: 5000\n  cosine:\n    max_lr: 0.0012\n    # papers use min_lr= 0.1 x max_lr\n    min_lr: 0.00012\n\nmodel:\n  activation_checkpointing: true\n  language_modeling:\n    name: \"layer_pruned_general_gpt\"\n    general_gpt:\n      model_name: \"OpenELM-3B-0.25l\"\n      vocab_size: *_anchor_vocab_size\n      max_context_length: *_anchor_context_length\n      padding_index: *_anchor_padding_index\n    pretrained: \"https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/3B/checkpoint_average.pt\"\n  rename_scopes_map:\n    - [\"layers\\\\.4\\\\.\", \"layers.1.\"]\n    - [\"layers\\\\.8\\\\.\", \"layers.2.\"]\n    - [\"layers\\\\.12\\\\.\", \"layers.3.\"]\n    - [\"layers\\\\.16\\\\.\", \"layers.4.\"]\n    - [\"layers\\\\.20\\\\.\", \"layers.5.\"]\n    - [\"layers\\\\.24\\\\.\", \"layers.6.\"]\n    - [\"layers\\\\.28\\\\.\", \"layers.7.\"]\n    - [\"layers\\\\.32\\\\.\", \"layers.8.\"]\n  # Note: exclude_scopes happens first, before renaming.\n  resume_exclude_scopes: [\"layers\\\\.1\\\\.\", \"layers\\\\.2\\\\.\", \"layers\\\\.3\\\\.\", \"layers\\\\.5\\\\.\", \"layers\\\\.6\\\\.\", \"layers\\\\.7\\\\.\", \"layers\\\\.9\\\\.\", \"layers\\\\.10\\\\.\", \"layers\\\\.11\\\\.\", \"layers\\\\.13\\\\.\", \"layers\\\\.14\\\\.\", \"layers\\\\.15\\\\.\", \"layers\\\\.17\\\\.\", \"layers\\\\.18\\\\.\", \"layers\\\\.19\\\\.\", \"layers\\\\.21\\\\.\", \"layers\\\\.22\\\\.\", \"layers\\\\.23\\\\.\", \"layers\\\\.25\\\\.\", \"layers\\\\.26\\\\.\", \"layers\\\\.27\\\\.\", \"layers\\\\.29\\\\.\", \"layers\\\\.30\\\\.\", \"layers\\\\.31\\\\.\", \"layers\\\\.33\\\\.\", \"layers\\\\.34\\\\.\", \"layers\\\\.35\\\\.\"]\n\nstats:\n  val: [ \"loss\"]\n  train: [\"loss\"]\n  checkpoint_metric: \"loss.total_loss\"\n  checkpoint_metric_max: false\n"
  },
  {
    "path": "projects/kv-prediction/openelm/openelm_3B_kvp_lp_0_50.yaml",
    "content": "# pytest: disable\n\ntaskname: '+ [OpenELM-3B-0.50l Short PT]'\n\n_anchor_context_length: &_anchor_context_length 2048\n# actual vocab size is 32001 after adding padding token, so we add few extra tokens to make it more hardware friendly\n# for classification layer in LM model\n_anchor_vocab_size: &_anchor_vocab_size 32128\n_anchor_padding_index: &_anchor_padding_index 32000\n_anchor_forward_dtype: &_anchor_forward_dtype \"bfloat16\"\n_anchor_backward_dtype: &_anchor_backward_dtype \"float32\"\n\ncommon:\n  run_label: \"train\"\n  log_freq: 500\n  auto_resume: true\n  grad_clip: 1.0\n  save_all_checkpoints: true\n  save_interval_freq: 5000\n  eval_every_k_iterations: 10000\n\ntrain_eval_pipeline:\n name: \"fsdp_train_eval_pipeline\"\n\nfsdp:\n  sharding_strategy: \"full_shard\"\n  parameter_datatype: *_anchor_forward_dtype\n  gradient_reduction_datatype: *_anchor_backward_dtype\n  buffer_datatype: *_anchor_forward_dtype\n  cpu_offload: false\n  limit_all_gathers: true\n\ndataset:\n  root_train: \"\"\n  disable_val: true\n  # effective batch size is ~2M tokens (16 sequences x 8 H100 80 GB GPUs x 8 nodes x 2048 tokens per seq )\n  train_batch_size0: 16\n  workers: 4\n  persistent_workers: true\n  pin_memory: true\n  # dataset details\n  category: \"language_modeling\"\n  name: \"general_lm\"\n  language_modeling:\n    sequence_length: *_anchor_context_length\n    # filter text that have less than 256 tokens after tokenization to avoid excessive padding\n    min_tokens_per_text: 256\n    # filter text that have less than 200 characters before tokenization\n    min_characters_per_text: 200\n    shuffle_data: true\n    general_lm:\n      train_data_info: [\n        {\n        # Uncomment below line and add path to parquet, jsonl, and json.gz files from pre-training corpora.\n        # We expect the path to be of the form \"/path/to/train-{file_id:05d}-05534.parquet\n          # \"file_name\": PATH_TO_PARQUET_FILES.\n          \"text_key\": \"content\",\n          \"file_id_range\": [0, 5535],\n        },\n      ]\n\ntext_tokenizer:\n  name: \"sentence_piece\"\n  sentence_piece:\n    enable_nfc_normalization: true\n    append_sot_token: true\n    append_eot_token: true\n    # Uncomment the below line and update the path of LLAMA SentencePiece model file\n    # model_path: <PATH_OF_LLAMA_SPM_MODEL>\n\nloss:\n  category: \"language_modeling\"\n  language_modeling:\n    name: \"cross_entropy\"\n    cross_entropy:\n      ignore_index: *_anchor_padding_index\n      use_z_loss: true\n\noptim:\n  name: \"adamw\"\n  weight_decay: 0.1\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.95\n    eps: 1.e-8\n\nscheduler:\n  is_iteration_based: true\n  # Train for about 1.4-1.5T tokens\n  max_iterations: 70000\n  name: cosine\n  warmup_init_lr: 1.e-06\n  warmup_iterations: 5000\n  cosine:\n    max_lr: 0.0012\n    # papers use min_lr= 0.1 x max_lr\n    min_lr: 0.00012\n\nmodel:\n  activation_checkpointing: true\n  language_modeling:\n    name: \"layer_pruned_general_gpt\"\n    general_gpt:\n      model_name: \"OpenELM-3B-0.50l\"\n      vocab_size: *_anchor_vocab_size\n      max_context_length: *_anchor_context_length\n      padding_index: *_anchor_padding_index\n    pretrained: \"https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/3B/checkpoint_average.pt\"\n  rename_scopes_map:\n    - [\"layers\\\\.2\\\\.\", \"layers.1.\"]\n    - [\"layers\\\\.4\\\\.\", \"layers.2.\"]\n    - [\"layers\\\\.6\\\\.\", \"layers.3.\"]\n    - [\"layers\\\\.8\\\\.\", \"layers.4.\"]\n    - [\"layers\\\\.10\\\\.\", \"layers.5.\"]\n    - [\"layers\\\\.12\\\\.\", \"layers.6.\"]\n    - [\"layers\\\\.14\\\\.\", \"layers.7.\"]\n    - [\"layers\\\\.16\\\\.\", \"layers.8.\"]\n    - [\"layers\\\\.18\\\\.\", \"layers.9.\"]\n    - [\"layers\\\\.20\\\\.\", \"layers.10.\"]\n    - [\"layers\\\\.22\\\\.\", \"layers.11.\"]\n    - [\"layers\\\\.24\\\\.\", \"layers.12.\"]\n    - [\"layers\\\\.26\\\\.\", \"layers.13.\"]\n    - [\"layers\\\\.28\\\\.\", \"layers.14.\"]\n    - [\"layers\\\\.30\\\\.\", \"layers.15.\"]\n    - [\"layers\\\\.32\\\\.\", \"layers.16.\"]\n    - [\"layers\\\\.34\\\\.\", \"layers.17.\"]\n  # Note: exclude_scopes happens first, before renaming.\n  resume_exclude_scopes: [\"layers\\\\.1\\\\.\", \"layers\\\\.3\\\\.\", \"layers\\\\.5\\\\.\", \"layers\\\\.7\\\\.\", \"layers\\\\.9\\\\.\", \"layers\\\\.11\\\\.\", \"layers\\\\.13\\\\.\", \"layers\\\\.15\\\\.\", \"layers\\\\.17\\\\.\", \"layers\\\\.19\\\\.\", \"layers\\\\.21\\\\.\", \"layers\\\\.23\\\\.\", \"layers\\\\.25\\\\.\", \"layers\\\\.27\\\\.\", \"layers\\\\.29\\\\.\", \"layers\\\\.31\\\\.\", \"layers\\\\.33\\\\.\", \"layers\\\\.35\\\\.\"]\n\nstats:\n  val: [ \"loss\"]\n  train: [\"loss\"]\n  checkpoint_metric: \"loss.total_loss\"\n  checkpoint_metric_max: false\n"
  },
  {
    "path": "projects/kv-prediction/openelm/openelm_3B_kvp_lp_0_75.yaml",
    "content": "# pytest: disable\n\ntaskname: '+ [OpenELM-3B-0.75l Short PT]'\n\n_anchor_context_length: &_anchor_context_length 2048\n# actual vocab size is 32001 after adding padding token, so we add few extra tokens to make it more hardware friendly\n# for classification layer in LM model\n_anchor_vocab_size: &_anchor_vocab_size 32128\n_anchor_padding_index: &_anchor_padding_index 32000\n_anchor_forward_dtype: &_anchor_forward_dtype \"bfloat16\"\n_anchor_backward_dtype: &_anchor_backward_dtype \"float32\"\n\ncommon:\n  run_label: \"train\"\n  log_freq: 500\n  auto_resume: true\n  grad_clip: 1.0\n  save_all_checkpoints: true\n  save_interval_freq: 5000\n  eval_every_k_iterations: 10000\n\ntrain_eval_pipeline:\n name: \"fsdp_train_eval_pipeline\"\n\nfsdp:\n  sharding_strategy: \"full_shard\"\n  parameter_datatype: *_anchor_forward_dtype\n  gradient_reduction_datatype: *_anchor_backward_dtype\n  buffer_datatype: *_anchor_forward_dtype\n  cpu_offload: false\n  limit_all_gathers: true\n\ndataset:\n  root_train: \"\"\n  disable_val: true\n  # effective batch size is ~2M tokens (16 sequences x 8 H100 80 GB GPUs x 8 nodes x 2048 tokens per seq )\n  train_batch_size0: 16\n  workers: 4\n  persistent_workers: true\n  pin_memory: true\n  # dataset details\n  category: \"language_modeling\"\n  name: \"general_lm\"\n  language_modeling:\n    sequence_length: *_anchor_context_length\n    # filter text that have less than 256 tokens after tokenization to avoid excessive padding\n    min_tokens_per_text: 256\n    # filter text that have less than 200 characters before tokenization\n    min_characters_per_text: 200\n    shuffle_data: true\n    general_lm:\n      train_data_info: [\n        {\n        # Uncomment below line and add path to parquet, jsonl, and json.gz files from pre-training corpora.\n        # We expect the path to be of the form \"/path/to/train-{file_id:05d}-05534.parquet\n          # \"file_name\": PATH_TO_PARQUET_FILES.\n          \"text_key\": \"content\",\n          \"file_id_range\": [0, 5535],\n        },\n      ]\n\ntext_tokenizer:\n  name: \"sentence_piece\"\n  sentence_piece:\n    enable_nfc_normalization: true\n    append_sot_token: true\n    append_eot_token: true\n    # Uncomment the below line and update the path of LLAMA SentencePiece model file\n    # model_path: <PATH_OF_LLAMA_SPM_MODEL>\n\nloss:\n  category: \"language_modeling\"\n  language_modeling:\n    name: \"cross_entropy\"\n    cross_entropy:\n      ignore_index: *_anchor_padding_index\n      use_z_loss: true\n\noptim:\n  name: \"adamw\"\n  weight_decay: 0.1\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.95\n    eps: 1.e-8\n\nscheduler:\n  is_iteration_based: true\n  # Train for about 1.4-1.5T tokens\n  max_iterations: 70000\n  name: cosine\n  warmup_init_lr: 1.e-06\n  warmup_iterations: 5000\n  cosine:\n    max_lr: 0.0012\n    # papers use min_lr= 0.1 x max_lr\n    min_lr: 0.00012\n\nmodel:\n  activation_checkpointing: true\n  language_modeling:\n    name: \"layer_pruned_general_gpt\"\n    general_gpt:\n      model_name: \"OpenELM-3B-0.75l\"\n      vocab_size: *_anchor_vocab_size\n      max_context_length: *_anchor_context_length\n      padding_index: *_anchor_padding_index\n    pretrained: \"https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/3B/checkpoint_average.pt\"\n  rename_scopes_map:\n    - [\"layers\\\\.0\\\\.\", \"layers.0.\"]\n    - [\"layers\\\\.1\\\\.\", \"layers.1.\"]\n    - [\"layers\\\\.2\\\\.\", \"layers.2.\"]\n    - [\"layers\\\\.4\\\\.\", \"layers.3.\"]\n    - [\"layers\\\\.5\\\\.\", \"layers.4.\"]\n    - [\"layers\\\\.6\\\\.\", \"layers.5.\"]\n    - [\"layers\\\\.8\\\\.\", \"layers.6.\"]\n    - [\"layers\\\\.9\\\\.\", \"layers.7.\"]\n    - [\"layers\\\\.10\\\\.\", \"layers.8.\"]\n    - [\"layers\\\\.12\\\\.\", \"layers.9.\"]\n    - [\"layers\\\\.13\\\\.\", \"layers.10.\"]\n    - [\"layers\\\\.14\\\\.\", \"layers.11.\"]\n    - [\"layers\\\\.16\\\\.\", \"layers.12.\"]\n    - [\"layers\\\\.17\\\\.\", \"layers.13.\"]\n    - [\"layers\\\\.18\\\\.\", \"layers.14.\"]\n    - [\"layers\\\\.20\\\\.\", \"layers.15.\"]\n    - [\"layers\\\\.21\\\\.\", \"layers.16.\"]\n    - [\"layers\\\\.22\\\\.\", \"layers.17.\"]\n    - [\"layers\\\\.24\\\\.\", \"layers.18.\"]\n    - [\"layers\\\\.25\\\\.\", \"layers.19.\"]\n    - [\"layers\\\\.26\\\\.\", \"layers.20.\"]\n    - [\"layers\\\\.28\\\\.\", \"layers.21.\"]\n    - [\"layers\\\\.29\\\\.\", \"layers.22.\"]\n    - [\"layers\\\\.30\\\\.\", \"layers.23.\"]\n    - [\"layers\\\\.32\\\\.\", \"layers.24.\"]\n    - [\"layers\\\\.33\\\\.\", \"layers.25.\"]\n    - [\"layers\\\\.34\\\\.\", \"layers.26.\"]\n  # Note: exclude_scopes happens first, before renaming.\n  resume_exclude_scopes: [\"layers\\\\.3\\\\.\", \"layers\\\\.7\\\\.\", \"layers\\\\.11\\\\.\", \"layers\\\\.15\\\\.\", \"layers\\\\.19\\\\.\", \"layers\\\\.23\\\\.\", \"layers\\\\.27\\\\.\", \"layers\\\\.31\\\\.\", \"layers\\\\.35\\\\.\"]\n\nstats:\n  val: [ \"loss\"]\n  train: [\"loss\"]\n  checkpoint_metric: \"loss.total_loss\"\n  checkpoint_metric_max: false\n"
  },
  {
    "path": "projects/kv-prediction/openelm/openelm_base_3B_aux_0_25l.yaml",
    "content": "# pytest: disable\n\ntaskname: '+ [KV Prediction Base OpenELM-3B Aux OpenELM-3B-0.25l Short PT]'\n\n_anchor_context_length: &_anchor_context_length 2048\n# actual vocab size is 32001 after adding padding token, so we add few extra tokens to make it more hardware friendly\n# for classification layer in LM model\n_anchor_vocab_size: &_anchor_vocab_size 32128\n_anchor_padding_index: &_anchor_padding_index 32000\n_anchor_forward_dtype: &_anchor_forward_dtype \"bfloat16\"\n_anchor_backward_dtype: &_anchor_backward_dtype \"float32\"\n\ncommon:\n  run_label: \"train\"\n  log_freq: 500\n  auto_resume: true\n  grad_clip: 1.0\n  save_all_checkpoints: true\n  save_interval_freq: 5000\n  eval_every_k_iterations: 10000\n\ntrain_eval_pipeline:\n name: \"fsdp_train_eval_pipeline\"\n\nfsdp:\n  sharding_strategy: \"full_shard\"\n  parameter_datatype: *_anchor_forward_dtype\n  gradient_reduction_datatype: *_anchor_backward_dtype\n  buffer_datatype: *_anchor_forward_dtype\n  cpu_offload: false\n  limit_all_gathers: true\n\ndataset:\n  root_train: \"\"\n  disable_val: true\n  # effective batch size is ~2M tokens (16 sequences x 8 H100 80 GB GPUs x 8 nodes x 2048 tokens per seq )\n  train_batch_size0: 16\n  workers: 4\n  persistent_workers: true\n  pin_memory: true\n  # dataset details\n  category: \"language_modeling\"\n  name: \"general_lm\"\n  language_modeling:\n    sequence_length: *_anchor_context_length\n    # filter text that have less than 256 tokens after tokenization to avoid excessive padding\n    min_tokens_per_text: 256\n    # filter text that have less than 200 characters before tokenization\n    min_characters_per_text: 200\n    shuffle_data: true\n    general_lm:\n      train_data_info: [\n        {\n        # Uncomment below line and add path to parquet, jsonl, and json.gz files from pre-training corpora.\n        # We expect the path to be of the form \"/path/to/train-{file_id:05d}-05534.parquet\n          # \"file_name\": PATH_TO_PARQUET_FILES.\n          \"text_key\": \"content\",\n          \"file_id_range\": [0, 5535],\n        },\n      ]\n\ntext_tokenizer:\n  name: \"sentence_piece\"\n  sentence_piece:\n    enable_nfc_normalization: true\n    append_sot_token: true\n    append_eot_token: true\n    # Uncomment the below line and update the path of LLAMA SentencePiece model file\n    # model_path: <PATH_OF_LLAMA_SPM_MODEL>\n\nloss:\n  category: \"language_modeling\"\n  language_modeling:\n    name: \"cross_entropy_for_kv_prediction\"\n    cross_entropy_for_kv_prediction:\n      ignore_index: *_anchor_padding_index\n      use_z_loss: true\n      auxiliary_loss: 1\n      kv_loss: 1\n\noptim:\n  name: \"adamw\"\n  weight_decay: 0.1\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.95\n    eps: 1.e-8\n\nscheduler:\n  is_iteration_based: true\n  # Train for about 140-150B tokens\n  max_iterations: 70000\n  name: cosine\n  warmup_init_lr: 1.e-06\n  warmup_iterations: 5000\n  cosine:\n    max_lr: 0.0012\n    # papers use min_lr= 0.1 x max_lr\n    min_lr: 0.00012\n\nmodel:\n  activation_checkpointing: true\n  freeze_modules: [\"base.*\"]\n  language_modeling:\n    name: \"kv_prediction\"\n    kv_prediction:\n      auxkv_num_layers_to_basekv_num_layers: [0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8]\n      base_model:\n       - model:\n          language_modeling:\n            name: \"general_gpt\"\n            pretrained: \"https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/3B/checkpoint_average.pt\"\n            general_gpt:\n              model_name: \"OpenELM-3B\"\n      auxiliary_model:\n       - model:\n          language_modeling:\n            name: \"layer_pruned_general_gpt\"\n            pretrained: \"https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/3B/checkpoint_average.pt\"\n            general_gpt:\n              model_name: \"OpenELM-3B-0.25l\"\n          rename_scopes_map:\n            - [\"layers\\\\.4\\\\.\", \"layers.1.\"]\n            - [\"layers\\\\.8\\\\.\", \"layers.2.\"]\n            - [\"layers\\\\.12\\\\.\", \"layers.3.\"]\n            - [\"layers\\\\.16\\\\.\", \"layers.4.\"]\n            - [\"layers\\\\.20\\\\.\", \"layers.5.\"]\n            - [\"layers\\\\.24\\\\.\", \"layers.6.\"]\n            - [\"layers\\\\.28\\\\.\", \"layers.7.\"]\n            - [\"layers\\\\.32\\\\.\", \"layers.8.\"]\n          # Note: exclude_scopes happens first, before renaming.\n          resume_exclude_scopes: [\"layers\\\\.1\\\\.\", \"layers\\\\.2\\\\.\", \"layers\\\\.3\\\\.\", \"layers\\\\.5\\\\.\", \"layers\\\\.6\\\\.\", \"layers\\\\.7\\\\.\", \"layers\\\\.9\\\\.\", \"layers\\\\.10\\\\.\", \"layers\\\\.11\\\\.\", \"layers\\\\.13\\\\.\", \"layers\\\\.14\\\\.\", \"layers\\\\.15\\\\.\", \"layers\\\\.17\\\\.\", \"layers\\\\.18\\\\.\", \"layers\\\\.19\\\\.\", \"layers\\\\.21\\\\.\", \"layers\\\\.22\\\\.\", \"layers\\\\.23\\\\.\", \"layers\\\\.25\\\\.\", \"layers\\\\.26\\\\.\", \"layers\\\\.27\\\\.\", \"layers\\\\.29\\\\.\", \"layers\\\\.30\\\\.\", \"layers\\\\.31\\\\.\", \"layers\\\\.33\\\\.\", \"layers\\\\.34\\\\.\", \"layers\\\\.35\\\\.\"]\n    general_gpt:\n      model_name: \"OpenELM-3B\"\n      vocab_size: *_anchor_vocab_size\n      max_context_length: *_anchor_context_length\n      padding_index: *_anchor_padding_index\n\nstats:\n  val: [ \"loss\"]\n  train: [\"loss\"]\n  checkpoint_metric: \"loss.total_loss\"\n  checkpoint_metric_max: false\n"
  },
  {
    "path": "projects/kv-prediction/openelm/openelm_base_3B_aux_0_50l.yaml",
    "content": "# pytest: disable\n\ntaskname: '+ [KV Prediction Base OpenELM-3B Aux OpenELM-3B-0.50l Short PT]'\n\n_anchor_context_length: &_anchor_context_length 2048\n# actual vocab size is 32001 after adding padding token, so we add few extra tokens to make it more hardware friendly\n# for classification layer in LM model\n_anchor_vocab_size: &_anchor_vocab_size 32128\n_anchor_padding_index: &_anchor_padding_index 32000\n_anchor_forward_dtype: &_anchor_forward_dtype \"bfloat16\"\n_anchor_backward_dtype: &_anchor_backward_dtype \"float32\"\n\ncommon:\n  run_label: \"train\"\n  log_freq: 500\n  auto_resume: true\n  grad_clip: 1.0\n  save_all_checkpoints: true\n  save_interval_freq: 5000\n  eval_every_k_iterations: 10000\n\ntrain_eval_pipeline:\n name: \"fsdp_train_eval_pipeline\"\n\nfsdp:\n  sharding_strategy: \"full_shard\"\n  parameter_datatype: *_anchor_forward_dtype\n  gradient_reduction_datatype: *_anchor_backward_dtype\n  buffer_datatype: *_anchor_forward_dtype\n  cpu_offload: false\n  limit_all_gathers: true\n\ndataset:\n  root_train: \"\"\n  disable_val: true\n  # effective batch size is ~2M tokens (16 sequences x 8 H100 80 GB GPUs x 8 nodes x 2048 tokens per seq )\n  train_batch_size0: 16\n  workers: 4\n  persistent_workers: true\n  pin_memory: true\n  # dataset details\n  category: \"language_modeling\"\n  name: \"general_lm\"\n  language_modeling:\n    sequence_length: *_anchor_context_length\n    # filter text that have less than 256 tokens after tokenization to avoid excessive padding\n    min_tokens_per_text: 256\n    # filter text that have less than 200 characters before tokenization\n    min_characters_per_text: 200\n    shuffle_data: true\n    general_lm:\n      train_data_info: [\n        {\n        # Uncomment below line and add path to parquet, jsonl, and json.gz files from pre-training corpora.\n        # We expect the path to be of the form \"/path/to/train-{file_id:05d}-05534.parquet\n          # \"file_name\": PATH_TO_PARQUET_FILES.\n          \"text_key\": \"content\",\n          \"file_id_range\": [0, 5535],\n        },\n      ]\n\ntext_tokenizer:\n  name: \"sentence_piece\"\n  sentence_piece:\n    enable_nfc_normalization: true\n    append_sot_token: true\n    append_eot_token: true\n    # Uncomment the below line and update the path of LLAMA SentencePiece model file\n    # model_path: <PATH_OF_LLAMA_SPM_MODEL>\n\nloss:\n  category: \"language_modeling\"\n  language_modeling:\n    name: \"cross_entropy_for_kv_prediction\"\n    cross_entropy_for_kv_prediction:\n      ignore_index: *_anchor_padding_index\n      use_z_loss: true\n      auxiliary_loss: 1\n      kv_loss: 1\n\noptim:\n  name: \"adamw\"\n  weight_decay: 0.1\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.95\n    eps: 1.e-8\n\nscheduler:\n  is_iteration_based: true\n  # Train for about 140-150B tokens\n  max_iterations: 70000\n  name: cosine\n  warmup_init_lr: 1.e-06\n  warmup_iterations: 5000\n  cosine:\n    max_lr: 0.0012\n    # papers use min_lr= 0.1 x max_lr\n    min_lr: 0.00012\n\nmodel:\n  activation_checkpointing: true\n  freeze_modules: [\"base.*\"]\n  language_modeling:\n    name: \"kv_prediction\"\n    kv_prediction:\n      auxkv_num_layers_to_basekv_num_layers: [0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 16, 16, 17, 17]\n      base_model:\n       - model:\n          language_modeling:\n            name: \"general_gpt\"\n            pretrained: \"https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/3B/checkpoint_average.pt\"\n            general_gpt:\n              model_name: \"OpenELM-3B\"\n      auxiliary_model:\n       - model:\n          language_modeling:\n            name: \"layer_pruned_general_gpt\"\n            pretrained: \"https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/3B/checkpoint_average.pt\"\n            general_gpt:\n              model_name: \"OpenELM-3B-0.50l\"\n          rename_scopes_map:\n            - [\"layers\\\\.2\\\\.\", \"layers.1.\"]\n            - [\"layers\\\\.4\\\\.\", \"layers.2.\"]\n            - [\"layers\\\\.6\\\\.\", \"layers.3.\"]\n            - [\"layers\\\\.8\\\\.\", \"layers.4.\"]\n            - [\"layers\\\\.10\\\\.\", \"layers.5.\"]\n            - [\"layers\\\\.12\\\\.\", \"layers.6.\"]\n            - [\"layers\\\\.14\\\\.\", \"layers.7.\"]\n            - [\"layers\\\\.16\\\\.\", \"layers.8.\"]\n            - [\"layers\\\\.18\\\\.\", \"layers.9.\"]\n            - [\"layers\\\\.20\\\\.\", \"layers.10.\"]\n            - [\"layers\\\\.22\\\\.\", \"layers.11.\"]\n            - [\"layers\\\\.24\\\\.\", \"layers.12.\"]\n            - [\"layers\\\\.26\\\\.\", \"layers.13.\"]\n            - [\"layers\\\\.28\\\\.\", \"layers.14.\"]\n            - [\"layers\\\\.30\\\\.\", \"layers.15.\"]\n            - [\"layers\\\\.32\\\\.\", \"layers.16.\"]\n            - [\"layers\\\\.34\\\\.\", \"layers.17.\"]\n          # Note: exclude_scopes happens first, before renaming.\n          resume_exclude_scopes: [\"layers\\\\.1\\\\.\", \"layers\\\\.3\\\\.\", \"layers\\\\.5\\\\.\", \"layers\\\\.7\\\\.\", \"layers\\\\.9\\\\.\", \"layers\\\\.11\\\\.\", \"layers\\\\.13\\\\.\", \"layers\\\\.15\\\\.\", \"layers\\\\.17\\\\.\", \"layers\\\\.19\\\\.\", \"layers\\\\.21\\\\.\", \"layers\\\\.23\\\\.\", \"layers\\\\.25\\\\.\", \"layers\\\\.27\\\\.\", \"layers\\\\.29\\\\.\", \"layers\\\\.31\\\\.\", \"layers\\\\.33\\\\.\", \"layers\\\\.35\\\\.\"]\n    general_gpt:\n      model_name: \"OpenELM-3B\"\n      vocab_size: *_anchor_vocab_size\n      max_context_length: *_anchor_context_length\n      padding_index: *_anchor_padding_index\n\nstats:\n  val: [ \"loss\"]\n  train: [\"loss\"]\n  checkpoint_metric: \"loss.total_loss\"\n  checkpoint_metric_max: false\n"
  },
  {
    "path": "projects/kv-prediction/openelm/openelm_base_3B_aux_0_75l.yaml",
    "content": "# pytest: disable\n\ntaskname: '+ [KV Prediction Base OpenELM-3B Aux OpenELM-3B-0.75l Short PT]'\n\n_anchor_context_length: &_anchor_context_length 2048\n# actual vocab size is 32001 after adding padding token, so we add few extra tokens to make it more hardware friendly\n# for classification layer in LM model\n_anchor_vocab_size: &_anchor_vocab_size 32128\n_anchor_padding_index: &_anchor_padding_index 32000\n_anchor_forward_dtype: &_anchor_forward_dtype \"bfloat16\"\n_anchor_backward_dtype: &_anchor_backward_dtype \"float32\"\n\ncommon:\n  run_label: \"train\"\n  log_freq: 500\n  auto_resume: true\n  grad_clip: 1.0\n  save_all_checkpoints: true\n  save_interval_freq: 5000\n  eval_every_k_iterations: 10000\n\ntrain_eval_pipeline:\n name: \"fsdp_train_eval_pipeline\"\n\nfsdp:\n  sharding_strategy: \"full_shard\"\n  parameter_datatype: *_anchor_forward_dtype\n  gradient_reduction_datatype: *_anchor_backward_dtype\n  buffer_datatype: *_anchor_forward_dtype\n  cpu_offload: false\n  limit_all_gathers: true\n\ndataset:\n  root_train: \"\"\n  disable_val: true\n  # effective batch size is ~2M tokens (16 sequences x 8 H100 80 GB GPUs x 8 nodes x 2048 tokens per seq )\n  train_batch_size0: 16\n  workers: 4\n  persistent_workers: true\n  pin_memory: true\n  # dataset details\n  category: \"language_modeling\"\n  name: \"general_lm\"\n  language_modeling:\n    sequence_length: *_anchor_context_length\n    # filter text that have less than 256 tokens after tokenization to avoid excessive padding\n    min_tokens_per_text: 256\n    # filter text that have less than 200 characters before tokenization\n    min_characters_per_text: 200\n    shuffle_data: true\n    general_lm:\n      train_data_info: [\n        {\n        # Uncomment below line and add path to parquet, jsonl, and json.gz files from pre-training corpora.\n        # We expect the path to be of the form \"/path/to/train-{file_id:05d}-05534.parquet\n          # \"file_name\": PATH_TO_PARQUET_FILES.\n          \"text_key\": \"content\",\n          \"file_id_range\": [0, 5535],\n        },\n      ]\n\ntext_tokenizer:\n  name: \"sentence_piece\"\n  sentence_piece:\n    enable_nfc_normalization: true\n    append_sot_token: true\n    append_eot_token: true\n    # Uncomment the below line and update the path of LLAMA SentencePiece model file\n    # model_path: <PATH_OF_LLAMA_SPM_MODEL>\n\nloss:\n  category: \"language_modeling\"\n  language_modeling:\n    name: \"cross_entropy_for_kv_prediction\"\n    cross_entropy_for_kv_prediction:\n      ignore_index: *_anchor_padding_index\n      use_z_loss: true\n      auxiliary_loss: 1\n      kv_loss: 1\n\noptim:\n  name: \"adamw\"\n  weight_decay: 0.1\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.95\n    eps: 1.e-8\n\nscheduler:\n  is_iteration_based: true\n  # Train for about 140-150B tokens\n  max_iterations: 70000\n  name: cosine\n  warmup_init_lr: 1.e-06\n  warmup_iterations: 5000\n  cosine:\n    max_lr: 0.0012\n    # papers use min_lr= 0.1 x max_lr\n    min_lr: 0.00012\n\nmodel:\n  activation_checkpointing: true\n  freeze_modules: [\"base.*\"]\n  language_modeling:\n    name: \"kv_prediction\"\n    kv_prediction:\n      auxkv_num_layers_to_basekv_num_layers: [0, 1, 2, 2, 3, 4, 5, 5, 6, 7, 8, 8, 9, 10, 11, 11, 12, 13, 14, 14, 15, 16, 17, 17, 18, 19, 20, 20, 21, 22, 23, 23, 24, 25, 26, 26]\n      base_model:\n       - model:\n          language_modeling:\n            name: \"general_gpt\"\n            pretrained: \"https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/3B/checkpoint_average.pt\"\n            general_gpt:\n              model_name: \"OpenELM-3B\"\n      auxiliary_model:\n       - model:\n          language_modeling:\n            name: \"layer_pruned_general_gpt\"\n            pretrained: \"https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/3B/checkpoint_average.pt\"\n            general_gpt:\n              model_name: \"OpenELM-3B-0.75l\"\n          rename_scopes_map:\n            - [\"layers\\\\.0\\\\.\", \"layers.0.\"]\n            - [\"layers\\\\.1\\\\.\", \"layers.1.\"]\n            - [\"layers\\\\.2\\\\.\", \"layers.2.\"]\n            - [\"layers\\\\.4\\\\.\", \"layers.3.\"]\n            - [\"layers\\\\.5\\\\.\", \"layers.4.\"]\n            - [\"layers\\\\.6\\\\.\", \"layers.5.\"]\n            - [\"layers\\\\.8\\\\.\", \"layers.6.\"]\n            - [\"layers\\\\.9\\\\.\", \"layers.7.\"]\n            - [\"layers\\\\.10\\\\.\", \"layers.8.\"]\n            - [\"layers\\\\.12\\\\.\", \"layers.9.\"]\n            - [\"layers\\\\.13\\\\.\", \"layers.10.\"]\n            - [\"layers\\\\.14\\\\.\", \"layers.11.\"]\n            - [\"layers\\\\.16\\\\.\", \"layers.12.\"]\n            - [\"layers\\\\.17\\\\.\", \"layers.13.\"]\n            - [\"layers\\\\.18\\\\.\", \"layers.14.\"]\n            - [\"layers\\\\.20\\\\.\", \"layers.15.\"]\n            - [\"layers\\\\.21\\\\.\", \"layers.16.\"]\n            - [\"layers\\\\.22\\\\.\", \"layers.17.\"]\n            - [\"layers\\\\.24\\\\.\", \"layers.18.\"]\n            - [\"layers\\\\.25\\\\.\", \"layers.19.\"]\n            - [\"layers\\\\.26\\\\.\", \"layers.20.\"]\n            - [\"layers\\\\.28\\\\.\", \"layers.21.\"]\n            - [\"layers\\\\.29\\\\.\", \"layers.22.\"]\n            - [\"layers\\\\.30\\\\.\", \"layers.23.\"]\n            - [\"layers\\\\.32\\\\.\", \"layers.24.\"]\n            - [\"layers\\\\.33\\\\.\", \"layers.25.\"]\n            - [\"layers\\\\.34\\\\.\", \"layers.26.\"]\n          # Note: exclude_scopes happens first, before renaming.\n          resume_exclude_scopes: [\"layers\\\\.3\\\\.\", \"layers\\\\.7\\\\.\", \"layers\\\\.11\\\\.\", \"layers\\\\.15\\\\.\", \"layers\\\\.19\\\\.\", \"layers\\\\.23\\\\.\", \"layers\\\\.27\\\\.\", \"layers\\\\.31\\\\.\", \"layers\\\\.35\\\\.\"]\n    general_gpt:\n      model_name: \"OpenELM-3B\"\n      vocab_size: *_anchor_vocab_size\n      max_context_length: *_anchor_context_length\n      padding_index: *_anchor_padding_index\n\nstats:\n  val: [ \"loss\"]\n  train: [\"loss\"]\n  checkpoint_metric: \"loss.total_loss\"\n  checkpoint_metric_max: false\n"
  },
  {
    "path": "projects/kv-prediction/triviaqa-template.yaml",
    "content": "# pytest: disable\ntask: triviaqa-fixed\ndataset_path: trivia_qa\ndataset_name: rc.nocontext\noutput_type: generate_until\ntraining_split: train\nvalidation_split: validation\ndoc_to_text: \"Question: {{question}}\\nAnswer:\"\ndoc_to_target: \"{{answer.aliases}}\"\nshould_decontaminate: true\ndoc_to_decontamination_query: question\nfewshot_delimiter: \"\\n\"\ngeneration_kwargs:\n  until:\n    - \"\\n\"\n    - \".\"\n    - \",\"\n  do_sample: false\n  temperature: 0.0\nfilter_list:\n  - name: remove_whitespace\n    filter:\n      - function: remove_whitespace\n      - function: take_first\ntarget_delimiter: \" \"\nmetric_list:\n  - metric: exact_match\n    aggregation: mean\n    higher_is_better: true\n    ignore_case: true\n    ignore_punctuation: true\nmetadata:\n  version: 3.0\n"
  },
  {
    "path": "projects/mobilenet_v1/README.md",
    "content": "# MobileNetv1\n\n[MobileNetv1](https://arxiv.org/abs/1704.04861) introduces an efficient backbone that leverages depthwise separable convolutions.\n\nWe provide training and evaluation code of MobileNetv1, along with pretrained models and configuration files for image classification on the ImageNet dataset.\n\n## Image classification on the ImageNet dataset\n\n### Training\nTo train MobileNetv1-1.0 on [ImageNet](https://image-net.org) using a single node with 4 A100 GPUs, run the following command:\n\n```bash\nexport CFG_FILE=projects/mobilenet_v1/classification/mobilenetv1_1.0_in1k.yaml\ncorenet-train --common.config-file $CFG_FILE --common.results-loc classification_results\n```\n\nWe assume that the training and validation data is located at `/mnt/imagenet/training` and `/mnt/imagenet/validation` folders, respectively. \n\n### Evaluation\n\nTo evaluate the pre-trained `MobileNetv1-1.0` model on the validation set of the ImageNet, run the following command:\n\n```bash\nexport CFG_FILE=projects/mobilenet_v1/classification/mobilenetv1_1.0_in1k.yaml\nexport DATASET_PATH=\"/mnt/vision_datasets/imagenet/validation/\" # change to the ImageNet validation path\nexport MODEL_WEIGHTS=https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilenetv1-1.00.pt\nCUDA_VISIBLE_DEVICES=0 corenet-eval --common.config-file $CFG_FILE --model.classification.pretrained $MODEL_WEIGHTS --common.override-kwargs dataset.root_val=$DATASET_PATH\n```\n\nThis should give\n```\ntop1=74.044 || top5=91.578\n```\n\n## Pretrained Models on ImageNet-1k\n\n| Model | Parameters | Top-1 | Pretrained weights | Config file | Logs |\n| ---  | --- | --- | --- | --- | --- |\n| MobileNetv1-0.25 | 0.5 M | 54.45 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilenetv1-0.25.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilenetv1-0.25.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilenetv1-0.25.logs) |\n| MobileNetv1-0.5 | 1.3 M | 65.93 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilenetv1-0.5.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilenetv1-0.5.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilenetv1-0.5.logs) |\n| MobileNetv1-0.75 | 2.6 M | 71.44 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilenetv1-0.75.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilenetv1-0.75.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilenetv1-0.75.logs) |\n| MobileNetv1-1.00 | 4.2 M | 74.04 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilenetv1-1.00.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilenetv1-1.00.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilenetv1-1.00.logs) |\n\n## Citation\nIf you find our work useful, please cite following papers:\n\n```BibTeX\n@article{Howard2017MobileNetsEC,\n  title={MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications},\n  author={Andrew G. Howard and Menglong Zhu and Bo Chen and Dmitry Kalenichenko and Weijun Wang and Tobias Weyand and Marco Andreetto and Hartwig Adam},\n  journal={ArXiv},\n  year={2017},\n  volume={abs/1704.04861},\n  url={https://api.semanticscholar.org/CorpusID:12670695}\n}\n\n@inproceedings{mehta2022cvnets, \n     author = {Mehta, Sachin and Abdolhosseini, Farzad and Rastegari, Mohammad}, \n     title = {CVNets: High Performance Library for Computer Vision}, \n     year = {2022}, \n     booktitle = {Proceedings of the 30th ACM International Conference on Multimedia}, \n     series = {MM '22} \n}\n```\n"
  },
  {
    "path": "projects/mobilenet_v1/classification/mobilenetv1_1.0_in1k.yaml",
    "content": "taskname: '+ MobileNetv1-1.0'\n\ncommon:\n  run_label: \"train\"\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\n  channels_last: true\n\ndataset:\n  root_train: \"/mnt/imagenet/training\"\n  root_val: \"/mnt/imagenet/validation\"\n  name: \"imagenet\"\n  category: \"classification\"\n  train_batch_size0: 128 # effective batch size is 512 (128 * 4 GPUs)\n  val_batch_size0: 100\n  eval_batch_size0: 100\n  workers: 8\n  persistent_workers: true\n  pin_memory: true\n  collate_fn_name_train: \"image_classification_data_collate_fn\"\n  collate_fn_name_val: \"image_classification_data_collate_fn\"\n  collate_fn_name_test: \"image_classification_data_collate_fn\"\n\nimage_augmentation:\n  random_resized_crop:\n    enable: true\n    interpolation: \"bilinear\"\n  random_horizontal_flip:\n    enable: true\n  resize:\n    enable: true\n    size: 256 # shorter size is 256\n    interpolation: \"bilinear\"\n  center_crop:\n    enable: true\n    size: 224\nsampler:\n  name: \"variable_batch_sampler\"\n  vbs:\n    crop_size_width: 224\n    crop_size_height: 224\n    max_n_scales: 5\n    min_crop_size_width: 128\n    max_crop_size_width: 320\n    min_crop_size_height: 128\n    max_crop_size_height: 320\n    check_scale: 32\nloss:\n  category: \"classification\"\n  classification:\n    name: \"cross_entropy\"\n    cross_entropy:\n      label_smoothing: 0.1\noptim:\n  name: \"sgd\"\n  weight_decay: 4.e-5\n  no_decay_bn_filter_bias: true\n  sgd:\n    momentum: 0.9\n    nesterov: true\nscheduler:\n  name: \"cosine\"\n  is_iteration_based: false\n  max_epochs: 300\n  warmup_iterations: 7500\n  warmup_init_lr: 0.05\n  cosine:\n    max_lr: 0.4\n    min_lr: 2.e-4\nmodel:\n  classification:\n    name: \"mobilenetv1\"\n    n_classes: 1000\n    activation:\n      name: \"relu\"\n    mobilenetv1:\n      width_multiplier: 1.0\n  normalization:\n    name: \"batch_norm\"\n    momentum: 0.1\n  activation:\n    name: \"relu\"\n    inplace: false\n  layer:\n    global_pool: \"mean\"\n    conv_init: \"kaiming_normal\"\n    linear_init: \"normal\"\nema:\n  enable: true\n  momentum: 0.0005\nstats:\n  val: [ \"loss\", \"top1\", \"top5\" ]\n  train: [\"loss\"]\n  checkpoint_metric: \"top1\"\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "projects/mobilenet_v2/README.md",
    "content": "# MobileNetv2\n\n[MobileNetv2](https://arxiv.org/abs/1801.04381) leverages an inverted residual structure to build an efficient backbone.\n\nWe provide training and evaluation code of MobileNetv2, along with pretrained models and configuration files for the following tasks:\n\n## Image classification on the ImageNet dataset\n\n### Training\nTo train MobileNetv2 model on [ImageNet](https://image-net.org) using a single node with 4 A100 GPUs, run the following command:\n\n```bash\nexport CFG_FILE=\"projects/mobilenet_v2/classification/mobilenetv2_1.0_in1k.yaml\"\ncorenet-train --common.config-file $CFG_FILE --common.results-loc classification_results\n```\n\nWe assume that the training and validation data is located in `/mnt/imagenet/training` and `/mnt/imagenet/validation` folders, respectively. \n\n### Evaluation\n\nTo evaluate the pre-trained MobileNetv2 model on the validation set of the ImageNet, run the following command:\n\n```bash\nexport CFG_FILE=\"projects/mobilenet_v2/classification/mobilenetv2_1.0_in1k.yaml\"\nexport DATASET_PATH=\"/mnt/vision_datasets/imagenet/validation/\" # change to the ImageNet validation path\nexport MODEL_WEIGHTS=https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilenetv2-1.00.pt\nCUDA_VISIBLE_DEVICES=0 corenet-eval --common.config-file $CFG_FILE --model.classification.pretrained $MODEL_WEIGHTS --common.override-kwargs dataset.root_val=$DATASET_PATH\n```\n\nThis should give\n```\ntop1=72.926 || top5=91.174\n```\n\n## Semantic Segmentation using DeepLabv3 on the ADE20K dataset\n\n### Training\nTo train DeepLabv3-MobileNetv2 model on ADE20K using a single node with 4 A100 GPUs, run the following command:\n\n```bash\nexport CFG_FILE=\"projects/mobilenet_v2/segmentation/deeplabv3_ade20k.yaml\"\ncorenet-train --common.config-file $CFG_FILE --common.results-loc segmentation_results\n```\n\nWe assume that the training and validation datasets are located in `/mnt/vision_datasets/ADEChallengeData2016/` directory. \n\n### Evaluation\n\nTo evaluate the pre-trained DeepLabv3-MobileNetv2 model on the validation set of ADE20k, run the following command:\n\n```bash\nexport CFG_FILE=\"projects/mobilenet_v2/segmentation/deeplabv3_ade20k.yaml\"\nexport DATASET_PATH=\"/mnt/vision_datasets/ADEChallengeData2016/\" # change to the ADE20k's path\nexport MODEL_WEIGHTS=https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/ade20k/deeplabv3-mobilenetv2.pt\nCUDA_VISIBLE_DEVICES=0 corenet-eval-seg --common.config-file $CFG_FILE --model.segmentation.pretrained $MODEL_WEIGHTS --common.override-kwargs dataset.root_val=$DATASET_PATH\n```\n\nThis should give\n```\nmean IoU: 35.20\n```\n\n## Pretrained Models\n### Classification (ImageNet-1k)\n| Model | Parameters | Top-1 | Pretrained weights | Config file | Logs |\n| ---  | --- | --- | --- | --- | --- |\n| MobileNetv2-0.25 | 1.5 M | 53.57 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilenetv2-0.25.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilenetv2-0.25.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilenetv2-0.25.logs) |\n| MobileNetv2-0.5 | 2.0 M | 65.28 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilenetv2-0.5.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilenetv2-0.5.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilenetv2-0.5.logs) |\n| MobileNetv2-0.75 | 2.6 M | 70.42 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilenetv2-0.75.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilenetv2-0.75.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilenetv2-0.75.logs) |\n| MobileNetv2-1.00 | 3.5 M | 72.93 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilenetv2-1.00.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilenetv2-1.00.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilenetv2-1.00.logs) |\n\n### Segmentation (ADE20k)\n\nNote: The number of parameters reported does not include the auxiliary branches.\n\n| Model | Parameters | mIoU | Pretrained weights | Config file | Logs |\n| ---  | --- | --- | --- | --- |  --- |\n| DeepLabv3 MobileNetv2 | 8.0 M | 35.20 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/ade20k/deeplabv3-mobilenetv2.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/ade20k/deeplabv3-mobilenetv2.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/ade20k/deeplabv3-mobilenetv2.logs) |\n\n## Citation\nIf you find our work useful, please cite following papers:\n\n```BibTeX\n@article{Sandler2018MobileNetV2IR,\n  title={MobileNetV2: Inverted Residuals and Linear Bottlenecks},\n  author={Mark Sandler and Andrew G. Howard and Menglong Zhu and Andrey Zhmoginov and Liang-Chieh Chen},\n  journal={2018 IEEE/CVF Conference on Computer Vision and Pattern Recognition},\n  year={2018},\n  pages={4510-4520},\n  url={https://api.semanticscholar.org/CorpusID:4555207}\n}\n\n@inproceedings{mehta2022cvnets, \n     author = {Mehta, Sachin and Abdolhosseini, Farzad and Rastegari, Mohammad}, \n     title = {CVNets: High Performance Library for Computer Vision}, \n     year = {2022}, \n     booktitle = {Proceedings of the 30th ACM International Conference on Multimedia}, \n     series = {MM '22} \n}\n```\n"
  },
  {
    "path": "projects/mobilenet_v2/classification/mobilenetv2_1.0_in1k.yaml",
    "content": "taskname: '+ MobileNetv2-1.0'\ncommon:\n  run_label: \"train\"\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\n  channels_last: true\n\ndataset:\n  root_train: \"/mnt/imagenet/training\"\n  root_val: \"/mnt/imagenet/validation\"\n  name: \"imagenet\"\n  category: \"classification\"\n  train_batch_size0: 256 # effective batch size is 1024 (256 * 4 GPUs)\n  val_batch_size0: 100\n  eval_batch_size0: 100\n  workers: 8\n  persistent_workers: true\n  pin_memory: true\n  collate_fn_name_train: \"image_classification_data_collate_fn\"\n  collate_fn_name_val: \"image_classification_data_collate_fn\"\n  collate_fn_name_test: \"image_classification_data_collate_fn\"\n\nimage_augmentation:\n  random_resized_crop:\n    enable: true\n    interpolation: \"bilinear\"\n  random_horizontal_flip:\n    enable: true\n  resize:\n    enable: true\n    size: 256 # shorter size is 256\n    interpolation: \"bilinear\"\n  center_crop:\n    enable: true\n    size: 224\nsampler:\n  name: \"variable_batch_sampler\"\n  vbs:\n    crop_size_width: 224\n    crop_size_height: 224\n    max_n_scales: 5\n    min_crop_size_width: 128\n    max_crop_size_width: 320\n    min_crop_size_height: 128\n    max_crop_size_height: 320\n    check_scale: 32\nloss:\n  category: \"classification\"\n  classification:\n    name: \"cross_entropy\"\n    cross_entropy:\n      label_smoothing: 0.1\noptim:\n  name: \"sgd\"\n  weight_decay: 4.e-5\n  no_decay_bn_filter_bias: true\n  sgd:\n    momentum: 0.9\n    nesterov: true\nscheduler:\n  name: \"cosine\"\n  is_iteration_based: false\n  max_epochs: 300\n  warmup_iterations: 7500\n  warmup_init_lr: 0.05\n  cosine:\n    max_lr: 0.4\n    min_lr: 2.e-4\nmodel:\n  classification:\n    name: \"mobilenetv2\"\n    n_classes: 1000\n    activation:\n      name: \"relu6\"\n    mobilenetv2:\n      width_multiplier: 1.0\n  normalization:\n    name: \"batch_norm\"\n    momentum: 0.1\n  activation:\n    name: \"relu\"\n    inplace: false\n  layer:\n    global_pool: \"mean\"\n    conv_init: \"kaiming_normal\"\n    linear_init: \"normal\"\nema:\n  enable: true\n  momentum: 0.0005\nstats:\n  val: [ \"loss\", \"top1\", \"top5\" ]\n  train: [\"loss\"]\n  checkpoint_metric: \"top1\"\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "projects/mobilenet_v2/segmentation/deeplabv3_ade20k.yaml",
    "content": "taskname: '+ MobileNetv2-1.0 DeepLabv3'\ncommon:\n  run_label: \"train\"\n  accum_freq: 1\n  accum_after_epoch: -1\n  log_freq: 200\n  auto_resume: false\n  mixed_precision: true\ndataset:\n  root_train: \"/mnt/vision_datasets/ADEChallengeData2016/\"\n  root_val: \"/mnt/vision_datasets/ADEChallengeData2016/\"\n  name: \"ade20k\"\n  category: \"segmentation\"\n  train_batch_size0: 4 # effective batch size is 16 ( 4 * 4 GPUs)\n  val_batch_size0: 4\n  eval_batch_size0: 1\n  workers: 4\n  persistent_workers: false\n  pin_memory: false\nimage_augmentation:\n  random_crop:\n    enable: true\n    seg_class_max_ratio: 0.75\n    pad_if_needed: true\n    mask_fill: 0 # background idx is 0\n  random_horizontal_flip:\n    enable: true\n  resize:\n    enable: true\n    size: [512, 512]\n    interpolation: \"bilinear\"\n  random_short_size_resize:\n    enable: true\n    interpolation: \"bilinear\"\n    short_side_min: 256\n    short_side_max: 768\n    max_img_dim: 1024\n  photo_metric_distort:\n    enable: true\n  random_rotate:\n    enable: true\n    angle: 10\n    mask_fill: 0 # background idx is 0\n  random_gaussian_noise:\n    enable: true\nsampler:\n  name: \"batch_sampler\"\n  bs:\n    crop_size_width: 512\n    crop_size_height: 512\nloss:\n  category: \"segmentation\"\n  segmentation:\n    name: \"cross_entropy\"\n    cross_entropy:\n      aux_weight: 0.4\n      ignore_index: -1\noptim:\n  name: \"sgd\"\n  weight_decay: 1.e-4\n  no_decay_bn_filter_bias: true\n  sgd:\n    momentum: 0.9\nscheduler:\n  name: \"cosine\"\n  is_iteration_based: false\n  max_epochs: 50\n  cosine:\n    max_lr: 0.02\n    min_lr: 0.0001\nmodel:\n  segmentation:\n    name: \"encoder_decoder\"\n    n_classes: 150\n    lr_multiplier: 1\n    seg_head: \"deeplabv3\"\n    output_stride: 8\n    classifier_dropout: 0.1\n    use_aux_head: true\n    activation:\n      name: \"relu\"\n    deeplabv3:\n      aspp_dropout: 0.1\n      aspp_sep_conv: false\n      aspp_out_channels: 512\n      aspp_rates: [ 12, 24, 36 ]\n  classification:\n    name: \"mobilenetv2\"\n    n_classes: 1000\n    pretrained: \"https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilenetv2-1.00.pt\"\n    activation:\n      name: \"relu6\"\n    mobilenetv2:\n      width_multiplier: 1.0\n  normalization:\n    name: \"sync_batch_norm\"\n    momentum: 0.1\n  activation:\n    name: \"relu6\"\n    inplace: false\n  layer:\n    global_pool: \"mean\"\n    conv_init: \"kaiming_normal\"\n    linear_init: \"normal\"\nema:\n  enable: true\n  momentum: 0.0001\nstats:\n  val: [ \"loss\", \"iou\" ]\n  train: [ \"loss\" ]\n  checkpoint_metric: \"iou\"\n  checkpoint_metric_max: true\n\n\n# During evaluation (with corenet-eval-seg), we follow following steps:\n#  1. Determine and store the size of input image as metadata\n#  2. Resize image while maintaining the aspect ratio\n#  3. Make a prediction\n#  4. Resize the predicted mask to the same size as original input image\n#  5. compute results\nevaluation:\n  segmentation:\n    resize_input_images: true\n    mode: \"validation_set\"\n"
  },
  {
    "path": "projects/mobilenet_v3/README.md",
    "content": "# MobileNetv3\n\n[MobileNetv3](https://arxiv.org/abs/1905.02244) uses an architecture search to design an efficient vision backbone.\n\nWe provide training and evaluation code of MobileNetv3, along with pretrained models and configuration files for the following tasks:\n\n## Image classification on the ImageNet dataset\n\n### Training\nTo train `MobileNetv3-Large` on the [ImageNet](https://image-net.org) using a single node with 4 A100 GPUs, run the following command:\n\n```bash\nexport CFG_FILE=\"projects/mobilenet_v3/classification/mobilenetv3_large_in1k.yaml\"\ncorenet-train --common.config-file $CFG_FILE --common.results-loc classification_results\n```\n\nWe assume that the training and validation data is located in `/mnt/imagenet/training` and `/mnt/imagenet/validation` folders, respectively. \n\n### Evaluation\n\nTo evaluate the pre-trained `MobileNetv3-Large` model on the validation set of the ImageNet dataset, run the following command:\n\n```bash\nexport CFG_FILE=\"projects/mobilenet_v3/classification/mobilenetv3_large_in1k.yaml\"\nexport DATASET_PATH=\"/mnt/vision_datasets/imagenet/validation/\" # change to the ImageNet validation path\nexport MODEL_WEIGHTS=\"https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilenetv3-large.pt\"\nCUDA_VISIBLE_DEVICES=0 corenet-eval --common.config-file $CFG_FILE --model.classification.pretrained $MODEL_WEIGHTS --common.override-kwargs dataset.root_val=$DATASET_PATH\n```\n\nThis should give:\n```\ntop1=75.138 || top5=92.424\n```\n\n## Pretrained Models\n\n### Classification (ImageNet)\n| Model | Parameters | Top-1 | Pretrained weights | Config file | Logs |\n| ---  | --- | --- | --- | --- | --- |\n| MobileNetv3-small | 2.5 M | 66.65 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilenetv3-small.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilenetv3-small.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilenetv3-small.logs) |\n| MobileNetv3-large | 5.4 M | 75.13 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilenetv3-large.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilenetv3-large.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilenetv3-large.logs) |\n\n\n## Citation\nIf you find our work useful, please cite following papers:\n\n```BibTeX \n@article{Howard2019SearchingFM,\n  title={Searching for MobileNetV3},\n  author={Andrew G. Howard and Mark Sandler and Grace Chu and Liang-Chieh Chen and Bo Chen and Mingxing Tan and Weijun Wang and Yukun Zhu and Ruoming Pang and Vijay Vasudevan and Quoc V. Le and Hartwig Adam},\n  journal={2019 IEEE/CVF International Conference on Computer Vision (ICCV)},\n  year={2019},\n  pages={1314-1324},\n  url={https://api.semanticscholar.org/CorpusID:146808333}\n}\n\n@inproceedings{mehta2022cvnets, \n     author = {Mehta, Sachin and Abdolhosseini, Farzad and Rastegari, Mohammad}, \n     title = {CVNets: High Performance Library for Computer Vision}, \n     year = {2022}, \n     booktitle = {Proceedings of the 30th ACM International Conference on Multimedia}, \n     series = {MM '22} \n}\n```\n"
  },
  {
    "path": "projects/mobilenet_v3/classification/mobilenetv3_large_in1k.yaml",
    "content": "taskname: '+ MobileNetv3-Large'\ncommon:\n  run_label: \"train\"\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\n  channels_last: true\ndataset:\n  root_train: \"/mnt/imagenet/training\"\n  root_val: \"/mnt/imagenet/validation\"\n  name: \"imagenet\"\n  category: \"classification\"\n  train_batch_size0: 512 # effective batch size is 2048 (512 * 4 GPUs)\n  val_batch_size0: 100\n  eval_batch_size0: 100\n  workers: 8\n  persistent_workers: true\n  pin_memory: true\n  collate_fn_name_train: \"image_classification_data_collate_fn\"\n  collate_fn_name_val: \"image_classification_data_collate_fn\"\n  collate_fn_name_test: \"image_classification_data_collate_fn\"\n\nimage_augmentation:\n  random_resized_crop:\n    enable: true\n    interpolation: \"bilinear\"\n  random_horizontal_flip:\n    enable: true\n  resize:\n    enable: true\n    size: 256 # shorter size is 256\n    interpolation: \"bilinear\"\n  center_crop:\n    enable: true\n    size: 224\nsampler:\n  name: \"variable_batch_sampler\"\n  vbs:\n    crop_size_width: 224\n    crop_size_height: 224\n    max_n_scales: 5\n    min_crop_size_width: 128\n    max_crop_size_width: 320\n    min_crop_size_height: 128\n    max_crop_size_height: 320\n    check_scale: 32\nloss:\n  category: \"classification\"\n  classification:\n    name: \"cross_entropy\"\n    cross_entropy:\n      label_smoothing: 0.1\noptim:\n  name: \"sgd\"\n  weight_decay: 4.e-5\n  no_decay_bn_filter_bias: true\n  sgd:\n    momentum: 0.9\n    nesterov: true\nscheduler:\n  name: \"cosine\"\n  is_iteration_based: false\n  max_epochs: 300\n  warmup_iterations: 3000\n  warmup_init_lr: 0.1\n  cosine:\n    max_lr: 0.8\n    min_lr: 4.e-4\nmodel:\n  classification:\n    name: \"mobilenetv3\"\n    n_classes: 1000\n    mobilenetv3:\n      mode: \"large\"\n      width_multiplier: 1.0\n  normalization:\n    name: \"batch_norm\"\n    momentum: 0.1\n  layer:\n    global_pool: \"mean\"\n    conv_init: \"kaiming_normal\"\n    linear_init: \"normal\"\nema:\n  enable: true\n  momentum: 0.0005\nstats:\n  val: [ \"loss\", \"top1\", \"top5\" ]\n  train: [\"loss\"]\n  checkpoint_metric: \"top1\"\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "projects/mobileone/README.md",
    "content": "# MobileOne: An Improved One millisecond Mobile Backbone\n\n[MobileOne](https://arxiv.org/abs/2206.04040) is an efficient CNN architecture that attains SOTA accuracy to latency tradeoff.\n\nWe provide training and evaluation code of MobileOne, along with pretrained models and configuration files for the following tasks:\n\n## ImageNet classification\n\n### Training\nSingle node training with 4 A100 GPUs of `MobileOne-S1` model can be done using below command:\n\n```bash\nexport CFG_FILE=\"projects/mobileone/classification/mobileone_s1_in1k.yaml\"\ncorenet-train --common.config-file $CFG_FILE --common.results-loc classification_results\n```\n\n***Note***: Do not forget to change the training and validation dataset locations in configuration files.\n\n### Evaluation\n\nWe evaluate the model on a single GPU using following command:\n\n```bash\n export MODEL_WEIGHTS=\"https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/mobileone/imagenet-1k/mobileone-s1.pt\"\n export CFG_FILE=\"projects/mobileone/classification/mobileone_s1_in1k.yaml\"\n export DATASET_PATH=\"/mnt/vision_datasets/imagenet/validation/\" # change to the ImageNet validation path\n CUDA_VISIBLE_DEVICES=0 corenet-eval --common.config-file $CFG_FILE --model.classification.pretrained $MODEL_WEIGHTS --common.override-kwargs dataset.root_val=$DATASET_PATH\n```\n\nThis should give:\n```\ntop1=75.316 || top5=92.544\n```\n\n## Citation\nIf you find our work useful, please cite following papers:\n\n```BibTeX\n@article{mobileone2022,\n  title={An Improved One millisecond Mobile Backbone},\n  author={Vasu, Pavan Kumar Anasosalu and Gabriel, James and Zhu, Jeff and Tuzel, Oncel and Ranjan, Anurag},\n  journal={arXiv preprint arXiv:2206.04040},\n  year={2022}\n}\n\n@inproceedings{mehta2022cvnets,\n     author = {Mehta, Sachin and Abdolhosseini, Farzad and Rastegari, Mohammad},\n     title = {CVNets: High Performance Library for Computer Vision},\n     year = {2022},\n     booktitle = {Proceedings of the 30th ACM International Conference on Multimedia},\n     series = {MM '22}\n}\n```\n"
  },
  {
    "path": "projects/mobileone/classification/mobileone_s1_in1k.yaml",
    "content": "taskname: '+ MobileOne S1'\ncommon:\n  run_label: \"train\"\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\n  channels_last: true\n\ndataset:\n  root_train: \"/mnt/imagenet/training\"\n  root_val: \"/mnt/imagenet/validation\"\n  name: \"imagenet\"\n  category: \"classification\"\n  train_batch_size0: 128 # effective batch size is 512 (128 * 4 GPUs)\n  val_batch_size0: 100\n  eval_batch_size0: 100\n  workers: 8\n  persistent_workers: true\n  pin_memory: true\n  collate_fn_name_train: \"image_classification_data_collate_fn\"\n  collate_fn_name_val: \"image_classification_data_collate_fn\"\n  collate_fn_name_test: \"image_classification_data_collate_fn\"\n\nimage_augmentation:\n  random_resized_crop:\n    enable: true\n    interpolation: \"bilinear\"\n  random_horizontal_flip:\n    enable: true\n  resize:\n    enable: true\n    size: 256 # shorter size is 256\n    interpolation: \"bilinear\"\n  center_crop:\n    enable: true\n    size: 224\n\nsampler:\n  name: \"variable_batch_sampler\"\n  vbs:\n    crop_size_width: 224\n    crop_size_height: 224\n    max_n_scales: 5\n    min_crop_size_width: 128\n    max_crop_size_width: 320\n    min_crop_size_height: 128\n    max_crop_size_height: 320\n    check_scale: 32\n\nloss:\n  category: \"classification\"\n  classification:\n    name: \"cross_entropy\"\n    cross_entropy:\n      label_smoothing: 0.1\n\noptim:\n  name: \"sgd\"\n  weight_decay: 4.e-5\n  no_decay_bn_filter_bias: true\n  sgd:\n    momentum: 0.9\n    nesterov: true\n\nscheduler:\n  name: \"cosine\"\n  is_iteration_based: false\n  max_epochs: 300\n  warmup_iterations: 7500\n  warmup_init_lr: 0.05\n  cosine:\n    max_lr: 0.4\n    min_lr: 2.e-4\n    \nmodel:\n  classification:\n    name: \"mobileone\"\n    activation:\n      name: \"relu\"\n    mobileone:\n      variant: \"s1\"\n      inference_mode: false\n    n_classes: 1000\n  normalization:\n    name: \"batch_norm\"\n    momentum: 0.1\n  activation:\n    name: \"relu\"\n    inplace: false\n  layer:\n    global_pool: \"mean\"\n    conv_init: \"kaiming_normal\"\n    linear_init: \"normal\"\nema:\n  enable: true\n  momentum: 0.0005\nstats:\n  val: [ \"loss\", \"top1\", \"top5\" ]\n  train: [\"loss\"]\n  checkpoint_metric: \"top1\"\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "projects/mobilevit/README.md",
    "content": "# MobileViT: Light-weight, General-purpose, and Mobile-friendly Vision Transformer\n\n[MobileViT](https://arxiv.org/abs/2110.02178) is a light-weight vision transformer that combines the strengths of CNNs and transformers. See [paper](https://arxiv.org/abs/2110.02178) for details.\n\nWe provide training and evaluation code of MobileViT, trained with [RangeAugment](https://arxiv.org/abs/2212.10553), along with pretrained models and configuration files for the following tasks:\n\n## Image classification on the ImageNet dataset\n\n### Training\nTo train `MobileViT-Small` model on the [ImageNet](https://image-net.org) using a single node with 8 A100 GPUs, run the following command:\n\n```bash\nexport CFG_FILE=\"projects/range_augment/classification/mobilevit_v1.yaml\"\ncorenet-train --common.config-file $CFG_FILE --common.results-loc classification_results\n```\n\nWe assume that the training and validation data is located in `/mnt/imagenet/training` and `/mnt/imagenet/validation` folders, respectively. \n\n### Evaluation\n\nTo evaluate the pre-trained `MobileViT-Small` model on the validation set of the ImageNet on a single GPU, run the following command:\n\n```bash\nexport CFG_FILE=\"projects/range_augment/classification/mobilevit_v1.yaml\"\nexport DATASET_PATH=\"/mnt/vision_datasets/imagenet/validation/\" # change to the ImageNet validation path\nexport MODEL_WEIGHTS=https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/mobilevit_small.pt\nCUDA_VISIBLE_DEVICES=0 corenet-eval --common.config-file $CFG_FILE --model.classification.pretrained $MODEL_WEIGHTS --common.override-kwargs dataset.root_val=$DATASET_PATH\n```\n\nThis should give\n```\ntop1={'logits': 78.194} || top5={'logits': 94.064}\n```\n\n## Object detection and instance segmentation using Mask R-CNN on COCO\n\n### Training\n\nTo train the MobileViT-Small with [Mask R-CNN](https://arxiv.org/abs/1703.06870) as a detection backbone on the [COCO](https://cocodataset.org/#home) dataset using a single node with 8 A100 GPUs, run the following command:\n\n```bash \nexport CFG_FILE=\"projects/range_augment/detection/maskrcnn_mobilevit.yaml\"\ncorenet-train --common.config-file $CFG_FILE --common.results-loc detection_results\n```\n\nWe assume that the training and validation datasets are located in `/mnt/vision_datasets/coco` directory. \n\n### Evaluation\n\nTo evaluate the pre-trained detection model on the validation set of the COCO on a single GPU, run the following command:\n\n```bash\n export CFG_FILE=\"projects/range_augment/detection/maskrcnn_mobilevit.yaml\"\n export MODEL_WEIGHTS=\"https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/detection/maskrcnn_mobilevit.pt\"\n CUDA_VISIBLE_DEVICES=0 corenet-eval-det --common.config-file $CFG_FILE --model.detection.pretrained $MODEL_WEIGHTS --evaluation.detection.resize-input-images --evaluation.detection.mode validation_set \n```\n\nThis should give for annotation type *bbox*\n```\n Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.420\n Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 0.640\n Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 0.456\n Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.277\n Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.452\n Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.537\n Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.336\n Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.549\n Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.581\n Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.411\n Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.612\n Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.712\n```\nand for annotation type *segm*\n```\n Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.377\n Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 0.606\n Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 0.403\n Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.206\n Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.404\n Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.543\n Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.313\n Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.498\n Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.524\n Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.348\n Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.559\n Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.669\n```\n\n## Semantic segmentation on the ADE20k dataset\n\n### Training\n\nTo train the MobileViT-Small with [DeepLabv3](https://arxiv.org/abs/1706.05587) as a segmentation head on the [ADE20k](https://groups.csail.mit.edu/vision/datasets/ADE20K/) dataset using a single A100 GPUs, run the following command:\n\n```bash\nexport CFG_FILE=\"projects/range_augment/segmentation/ade20k/deeplabv3_mobilevit.yaml\"\ncorenet-train --common.config-file $CFG_FILE --common.results-loc segmentation_results\n```\n\nWe assume that the training and validation datasets are located in `/mnt/vision_datasets/ADEChallengeData2016/` directory. \n\n### Evaluation\n\nTo evaluate the pre-trained segmentation model on the validation set of the ADE20k dataset on a single GPU, run the following command:\n\n```bash\nexport CFG_FILE=\"projects/range_augment/segmentation/ade20k/deeplabv3_mobilevit.yaml\"\nexport DATASET_PATH=\"/mnt/vision_datasets/ADEChallengeData2016/\" # change to the ADE20k's path\nexport MODEL_WEIGHTS=https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/segmentation/ade20k/deeplabv3_mobilevit.pt\nCUDA_VISIBLE_DEVICES=0 corenet-eval-seg --common.config-file $CFG_FILE --model.segmentation.pretrained $MODEL_WEIGHTS --common.override-kwargs dataset.root_val=$DATASET_PATH\n```\n\nThis should give\n```\nmean IoU: 38.49\n```\n\n## Citation\n\nIf you find our work useful, please cite:\n\n```BibTex\n@inproceedings{mehta2022mobilevit,\n    title={MobileViT: Light-weight, General-purpose, and Mobile-friendly Vision Transformer},\n    author={Sachin Mehta and Mohammad Rastegari},\n    booktitle={International Conference on Learning Representations},\n    year={2022},\n    url={https://openreview.net/forum?id=vh-0sUt8HlG}\n}\n\n@inproceedings{mehta2022cvnets, \n     author = {Mehta, Sachin and Abdolhosseini, Farzad and Rastegari, Mohammad}, \n     title = {CVNets: High Performance Library for Computer Vision}, \n     year = {2022}, \n     booktitle = {Proceedings of the 30th ACM International Conference on Multimedia}, \n     series = {MM '22} \n}\n```\n\n## Code and pre-trained models released with the paper\n\nFor code and pre-trained models released with the paper, please check [CVNets v0.1](https://github.com/apple/ml-cvnets/tree/cvnets-v0.1).\n"
  },
  {
    "path": "projects/mobilevit_v2/README.md",
    "content": "# MobileViTv2: Separable Self-attention for Mobile Vision Transformers\n\n[MobileViTv2](https://arxiv.org/abs/2206.02680) is an enhancement of MobileViT that adds separable self-attention. See [paper](https://arxiv.org/abs/2206.02680) for details.\n\nWe provide training and evaluation code of MobileViTv2, along with pretrained models and configuration files for the following tasks:\n\n## Image classification on the ImageNet dataset\n\n### Training\nTo train `MobileViTv2-2.0` model on [ImageNet](https://image-net.org) using a single node with 8 A100 GPUs, run the following command:\n\n```bash\nexport CFG_FILE=\"projects/mobilevit_v2/classification/mobilevitv2_2.0_in1k.yaml\"\ncorenet-train --common.config-file $CFG_FILE --common.results-loc classification_results\n```\n\nWe assume that the training and validation data is located in `/mnt/imagenet/training` and `/mnt/imagenet/validation` folders, respectively. \n\n### Evaluation\n\nTo evaluate the pre-trained MobileViTv2 2.0 model on the validation set of the ImageNet, run the following command:\n\n```bash\nexport MODEL_WEIGHTS=https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet1k/256x256/mobilevitv2-2.0.pt\nexport CFG_FILE=\"projects/mobilevit_v2/classification/mobilevitv2_2.0_in1k.yaml\"\nexport DATASET_PATH=\"/mnt/vision_datasets/imagenet/validation/\" # change to the ImageNet validation path\nCUDA_VISIBLE_DEVICES=0 corenet-eval --common.config-file $CFG_FILE --model.classification.pretrained $MODEL_WEIGHTS --common.override-kwargs dataset.root_val=$DATASET_PATH\n```\n\nThis should give\n```\ntop1=81.17 || top5=95.378\n```\n\nTo evaluate the fine-tuned model at higher resolution, run the following command:\n```bash\nexport MODEL_WEIGHTS=https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet1k/384x384/mobilevitv2-2.0.pt\nexport CFG_FILE=\"projects/mobilevit_v2/classification/mobilevitv2_2.0_ft_384x384.yaml\"\nexport DATASET_PATH=\"/mnt/vision_datasets/imagenet/validation/\" # change to the ImageNet validation path\nCUDA_VISIBLE_DEVICES=0 corenet-eval --common.config-file $CFG_FILE --common.override-kwargs dataset.root_val=$DATASET_PATH model.classification.pretrained=$MODEL_WEIGHTS\n```\n\nThis should give\n```\ntop1=82.18 || top5=95.928\n```\n\n## Object detection using SSD on COCO\n\n### Training\n\nTo train the MobileViTv2 2.0 with [SSD](https://arxiv.org/abs/1512.02325) as a detection backbone on the [COCO](https://cocodataset.org/#home) dataset using a single node with 4 A100 GPUs, run the following command:\n\n```bash\nexport CFG_FILE=\"projects/mobilevit_v2/detection/mobilevitv2_2.0_ssd_coco.yaml\"\ncorenet-train --common.config-file $CFG_FILE --common.results-loc detection_results\n```\n\nWe assume that the training and validation datasets are located in `/mnt/vision_datasets/coco` directory. \n\n### Evaluation\n\nTo evaluate the pre-trained detection model on the validation set of the COCO, run the following command:\n\n```bash\nexport CFG_FILE=\"projects/mobilevit_v2/detection/mobilevitv2_2.0_ssd_coco.yaml\"\nexport MODEL_WEIGHTS=https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/detection/mobilevitv2/coco-ssd-mobilevitv2-2.0.pt\nCUDA_VISIBLE_DEVICES=0 corenet-eval-det --common.config-file $CFG_FILE --common.results-loc seg_results --model.detection.pretrained $MODEL_WEIGHTS --evaluation.detection.resize-input-images --evaluation.detection.mode validation_set \n```\n\nThis should give\n```\n Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.302\n Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 0.501\n Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 0.308\n Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.092\n Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.319\n Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.514\n Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.266\n Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.402\n Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.425\n Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.153\n Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.477\n Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.663\n```\n\n## Semantic segmentation on the ADE20k dataset\n\n### Training\n\nTo train the MobileViTv2 1.0 with [DeepLabv3](https://arxiv.org/abs/1706.05587) as a segmentation head on the [ADE20k](https://groups.csail.mit.edu/vision/datasets/ADE20K/) dataset using a single A100 GPUs, run the following command:\n\n```bash\nexport CFG_FILE=\"projects/mobilevit_v2/segmentation/deeplabv3_mobilevitv2_1.0_ade20k.yaml\"\ncorenet-train --common.config-file $CFG_FILE --common.results-loc segmentation_results\n```\n\nWe assume that the training and validation datasets are located in `/mnt/vision_datasets/ADEChallengeData2016/` directory. \n\n### Evaluation\n\nTo evaluate the pre-trained segmentation model on the validation set of the ADE20k dataset, run the following command:\n\n```bash\nexport CFG_FILE=\"projects/mobilevit_v2/segmentation/deeplabv3_mobilevitv2_1.0_ade20k.yaml\"\nexport DATASET_PATH=\"/mnt/vision_datasets/ADEChallengeData2016/\" # change to the ADE20k's path\nexport MODEL_WEIGHTS=https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/ade20k/mobilevitv2/deeplabv3-mobilevitv2-1.0.pt\nCUDA_VISIBLE_DEVICES=0 corenet-eval-seg --common.config-file $CFG_FILE --model.segmentation.pretrained $MODEL_WEIGHTS --common.override-kwargs dataset.root_val=$DATASET_PATH\n```\n\nThis should give\n```\nmean IoU: 37.06\n```\n\n## Pretrained Models\n\n<details>\n  <summary>Exapnd the section to see available pre-trained models across different tasks.</summary>\n\n### Classification\n#### MobileViTv2 (256x256)\n| Model | Parameters | Top-1 | Pretrained weights | Config file | Logs |\n| ---  | --- | --- | --- | --- |  --- |\n| MobileViTv2-0.5 | 1.4 M | 70.18 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet1k/256x256/mobilevitv2-0.5.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet1k/256x256/mobilevitv2-0.5.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet1k/256x256/mobilevitv2-0.5.logs) |\n| MobileViTv2-0.75 | 2.9 M | 75.56 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet1k/256x256/mobilevitv2-0.75.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet1k/256x256/mobilevitv2-0.75.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet1k/256x256/mobilevitv2-0.75.logs) |\n| MobileViTv2-1.0 | 4.9 M | 78.09 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet1k/256x256/mobilevitv2-1.0.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet1k/256x256/mobilevitv2-1.0.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet1k/256x256/mobilevitv2-1.0.logs) |\n| MobileViTv2-1.25 | 7.5 M | 79.65 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet1k/256x256/mobilevitv2-1.25.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet1k/256x256/mobilevitv2-1.25.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet1k/256x256/mobilevitv2-1.25.logs) |\n| MobileViTv2-1.5 | 10.6 M | 80.38 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet1k/256x256/mobilevitv2-1.5.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet1k/256x256/mobilevitv2-1.5.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet1k/256x256/mobilevitv2-1.5.logs) |\n| MobileViTv2-1.75 | 14.3 M | 80.84 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet1k/256x256/mobilevitv2-1.75.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet1k/256x256/mobilevitv2-1.75.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet1k/256x256/mobilevitv2-1.75.logs) |\n| MobileViTv2-2.0 | 18.4 M | 81.17 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet1k/256x256/mobilevitv2-2.0.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet1k/256x256/mobilevitv2-2.0.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet1k/256x256/mobilevitv2-2.0.logs) |\n\n#### MobileViTv2 (Trained on 256x256 and Finetuned on 384x384)\n| Model | Parameters | Top-1 | Pretrained weights | Config file | Logs |\n| ---  | --- | --- | --- | --- |  --- |\n| MobileViTv2-0.5 | 1.4 M | 72.14 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet1k/384x384/mobilevitv2-0.5.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet1k/384x384/mobilevitv2-0.5.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet1k/384x384/mobilevitv2-0.5.logs) |\n| MobileViTv2-0.75 | 2.9 M | 76.98 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet1k/384x384/mobilevitv2-0.75.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet1k/384x384/mobilevitv2-0.75.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet1k/384x384/mobilevitv2-0.75.logs) |\n| MobileViTv2-1.0 | 4.9 M | 79.68 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet1k/384x384/mobilevitv2-1.0.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet1k/384x384/mobilevitv2-1.0.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet1k/384x384/mobilevitv2-1.0.logs) |\n| MobileViTv2-1.25 | 7.5 M | 80.94 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet1k/384x384/mobilevitv2-1.25.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet1k/384x384/mobilevitv2-1.25.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet1k/384x384/mobilevitv2-1.25.logs) |\n| MobileViTv2-1.5 | 10.6 M | 81.50 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet1k/384x384/mobilevitv2-1.5.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet1k/384x384/mobilevitv2-1.5.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet1k/384x384/mobilevitv2-1.5.logs) |\n| MobileViTv2-1.75 | 14.3 M | 82.04 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet1k/384x384/mobilevitv2-1.75.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet1k/384x384/mobilevitv2-1.75.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet1k/384x384/mobilevitv2-1.75.logs) |\n| MobileViTv2-2.0 | 18.4 M | 82.17 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet1k/384x384/mobilevitv2-2.0.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet1k/384x384/mobilevitv2-2.0.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet1k/384x384/mobilevitv2-2.0.logs) |\n\n\n#### MobileViTv2 (Trained on ImageNet-21k and Finetuned on ImageNet-1k 256x256)\n| Model | Parameters | Top-1 | Pretrained weights | Config file | Logs |\n| ---  | --- | --- | --- | --- |  --- |\n| MobileViTv2-1.5 | 10.6 M | 81.46 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet21k_to_1k/256x256/mobilevitv2-1.5.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet21k_to_1k/256x256/mobilevitv2-1.5.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet21k_to_1k/256x256/mobilevitv2-1.5.logs) |\n| MobileViTv2-1.75 | 14.3 M | 81.94 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet21k_to_1k/256x256/mobilevitv2-1.75.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet21k_to_1k/256x256/mobilevitv2-1.75.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet21k_to_1k/256x256/mobilevitv2-1.75.logs) |\n| MobileViTv2-2.0 | 18.4 M | 82.36 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet21k_to_1k/256x256/mobilevitv2-2.0.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet21k_to_1k/256x256/mobilevitv2-2.0.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet21k_to_1k/256x256/mobilevitv2-2.0.logs) |\n\n#### MobileViTv2 (Trained on ImageNet-21k, Finetuned on ImageNet-1k 256x256, and Finetuned on ImageNet-1k 384x384)\n| Model | Parameters | Top-1 | Pretrained weights | Config file | Logs |\n| ---  | --- | --- | --- | --- |  --- |\n| MobileViTv2-1.5 | 10.6 M | 82.60 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet21k_to_1k/384x384/mobilevitv2-1.5.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet21k_to_1k/384x384/mobilevitv2-1.5.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet21k_to_1k/384x384/mobilevitv2-1.5.logs) |\n| MobileViTv2-1.75 | 14.3 M | 82.93 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet21k_to_1k/384x384/mobilevitv2-1.75.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet21k_to_1k/384x384/mobilevitv2-1.75.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet21k_to_1k/384x384/mobilevitv2-1.75.logs) |\n| MobileViTv2-2.0 | 18.4 M | 83.41 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet21k_to_1k/384x384/mobilevitv2-2.0.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet21k_to_1k/384x384/mobilevitv2-2.0.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet21k_to_1k/384x384/mobilevitv2-2.0.logs) |\n\n### Object Detection (MS-COCO)\n\n| Model | Parameters | MAP | Pretrained weights | Config file | Logs |\n| ---  | --- | --- | --- | --- |  --- |\n| SSD MobileViTv2-0.5 | 2.0 M | 21.24 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/detection/mobilevitv2/coco-ssd-mobilevitv2-0.5.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/detection/mobilevitv2/coco-ssd-mobilevitv2-0.5.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/detection/mobilevitv2/coco-ssd-mobilevitv2-0.5.logs) |\n| SSD MobileViTv2-0.75 | 3.6 M | 24.57 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/detection/mobilevitv2/coco-ssd-mobilevitv2-0.75.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/detection/mobilevitv2/coco-ssd-mobilevitv2-0.75.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/detection/mobilevitv2/coco-ssd-mobilevitv2-0.75.logs) |\n| SSD MobileViTv2-1.0 | 5.6 M | 26.47 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/detection/mobilevitv2/coco-ssd-mobilevitv2-1.0.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/detection/mobilevitv2/coco-ssd-mobilevitv2-1.0.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/detection/mobilevitv2/coco-ssd-mobilevitv2-1.0.logs) |\n| SSD MobileViTv2-1.25 | 8.2 M | 27.85 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/detection/mobilevitv2/coco-ssd-mobilevitv2-1.25.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/detection/mobilevitv2/coco-ssd-mobilevitv2-1.25.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/detection/mobilevitv2/coco-ssd-mobilevitv2-1.25.logs) |\n| SSD MobileViTv2-1.5 | 11.3 M | 28.83 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/detection/mobilevitv2/coco-ssd-mobilevitv2-1.5.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/detection/mobilevitv2/coco-ssd-mobilevitv2-1.5.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/detection/mobilevitv2/coco-ssd-mobilevitv2-1.5.logs) |\n| SSD MobileViTv2-1.75 | 14.9 M | 29.52 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/detection/mobilevitv2/coco-ssd-mobilevitv2-1.75.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/detection/mobilevitv2/coco-ssd-mobilevitv2-1.75.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/detection/mobilevitv2/coco-ssd-mobilevitv2-1.75.logs) |\n| SSD MobileViTv2-2.0 | 19.1 M | 30.21 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/detection/mobilevitv2/coco-ssd-mobilevitv2-2.0.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/detection/mobilevitv2/coco-ssd-mobilevitv2-2.0.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/detection/mobilevitv2/coco-ssd-mobilevitv2-2.0.logs) |\n\n### Segmentation (ADE 20K)\nNote: The number of parameters reported does not include the auxiliary branches.\n\n| Model | Parameters | mIoU | Pretrained weights | Config file | Logs |\n| ---  | --- | --- | --- | --- |  --- |\n| PSPNet MobileViTv2-0.5 | 3.6 M | 31.77 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/ade20k/mobilevitv2/pspnet-mobilevitv2-0.5.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/ade20k/mobilevitv2/pspnet-mobilevitv2-0.5.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/ade20k/mobilevitv2/pspnet-mobilevitv2-0.5.logs) |\n| PSPNet MobileViTv2-0.75 | 6.2 M | 35.22 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/ade20k/mobilevitv2/pspnet-mobilevitv2-0.75.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/ade20k/mobilevitv2/pspnet-mobilevitv2-0.75.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/ade20k/mobilevitv2/pspnet-mobilevitv2-0.75.logs) |\n| PSPNet MobileViTv2-1.0 | 9.4 M | 36.57 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/ade20k/mobilevitv2/pspnet-mobilevitv2-1.0.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/ade20k/mobilevitv2/pspnet-mobilevitv2-1.0.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/ade20k/mobilevitv2/pspnet-mobilevitv2-1.0.logs) |\n| PSPNet MobileViTv2-1.25 | 13.2 M | 38.76 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/ade20k/mobilevitv2/pspnet-mobilevitv2-1.25.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/ade20k/mobilevitv2/pspnet-mobilevitv2-1.25.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/ade20k/mobilevitv2/pspnet-mobilevitv2-1.25.logs) |\n| PSPNet MobileViTv2-1.5 | 17.6 M | 38.74 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/ade20k/mobilevitv2/pspnet-mobilevitv2-1.5.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/ade20k/mobilevitv2/pspnet-mobilevitv2-1.5.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/ade20k/mobilevitv2/pspnet-mobilevitv2-1.5.logs) |\n| PSPNet MobileViTv2-1.75 | 22.5 M | 39.82 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/ade20k/mobilevitv2/pspnet-mobilevitv2-1.75.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/ade20k/mobilevitv2/pspnet-mobilevitv2-1.75.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/ade20k/mobilevitv2/pspnet-mobilevitv2-1.75.logs) |\n| DeepLabv3 MobileViTv2-0.5 | 6.3 M | 31.93 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/ade20k/mobilevitv2/deeplabv3-mobilevitv2-0.5.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/ade20k/mobilevitv2/deeplabv3-mobilevitv2-0.5.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/ade20k/mobilevitv2/deeplabv3-mobilevitv2-0.5.logs) |\n| DeepLabv3 MobileViTv2-0.75 | 9.6 M | 34.70 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/ade20k/mobilevitv2/deeplabv3-mobilevitv2-0.75.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/ade20k/mobilevitv2/deeplabv3-mobilevitv2-0.75.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/ade20k/mobilevitv2/deeplabv3-mobilevitv2-0.75.logs) |\n| DeepLabv3 MobileViTv2-1.0 | 13.4 M | 37.06 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/ade20k/mobilevitv2/deeplabv3-mobilevitv2-1.0.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/ade20k/mobilevitv2/deeplabv3-mobilevitv2-1.0.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/ade20k/mobilevitv2/deeplabv3-mobilevitv2-1.0.logs) |\n| DeepLabv3 MobileViTv2-1.25 | 17.7 M | 38.42 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/ade20k/mobilevitv2/deeplabv3-mobilevitv2-1.25.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/ade20k/mobilevitv2/deeplabv3-mobilevitv2-1.25.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/ade20k/mobilevitv2/deeplabv3-mobilevitv2-1.25.logs) |\n| DeepLabv3 MobileViTv2-1.5 | 22.6 M | 38.91 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/ade20k/mobilevitv2/deeplabv3-mobilevitv2-1.5.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/ade20k/mobilevitv2/deeplabv3-mobilevitv2-1.5.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/ade20k/mobilevitv2/deeplabv3-mobilevitv2-1.5.logs) |\n| DeepLabv3 MobileViTv2-1.75 | 28.1 M | 39.53 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/ade20k/mobilevitv2/deeplabv3-mobilevitv2-1.75.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/ade20k/mobilevitv2/deeplabv3-mobilevitv2-1.75.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/ade20k/mobilevitv2/deeplabv3-mobilevitv2-1.75.logs) |\n| DeepLabv3 MobileViTv2-2.0 | 34.0 M | 40.94 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/ade20k/mobilevitv2/deeplabv3-mobilevitv2-2.0.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/ade20k/mobilevitv2/deeplabv3-mobilevitv2-2.0.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/ade20k/mobilevitv2/deeplabv3-mobilevitv2-2.0.logs) |\n\n### Segmentation (Pascal VOC 2012)\n| Model | Parameters | mIoU | Pretrained weights | Config file | Logs |\n| ---  | --- | --- | --- | --- |  --- |\n| PSPNet MobileViTv2-0.5 | 3.6 M | 74.62 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/pascalvoc/mobilevitv2/pspnet-mobilevitv2-0.5.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/pascalvoc/mobilevitv2/pspnet-mobilevitv2-0.5.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/pascalvoc/mobilevitv2/pspnet-mobilevitv2-0.5.logs) |\n| PSPNet MobileViTv2-0.75 | 6.2 M | 77.44 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/pascalvoc/mobilevitv2/pspnet-mobilevitv2-0.75.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/pascalvoc/mobilevitv2/pspnet-mobilevitv2-0.75.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/pascalvoc/mobilevitv2/pspnet-mobilevitv2-0.75.logs) |\n| PSPNet MobileViTv2-1.0 | 9.4 M | 78.92 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/pascalvoc/mobilevitv2/pspnet-mobilevitv2-1.0.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/pascalvoc/mobilevitv2/pspnet-mobilevitv2-1.0.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/pascalvoc/mobilevitv2/pspnet-mobilevitv2-1.0.logs) |\n| PSPNet MobileViTv2-1.25 | 13.2 M | 79.40 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/pascalvoc/mobilevitv2/pspnet-mobilevitv2-1.25.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/pascalvoc/mobilevitv2/pspnet-mobilevitv2-1.25.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/pascalvoc/mobilevitv2/pspnet-mobilevitv2-1.25.logs) |\n| PSPNet MobileViTv2-1.5 | 17.5 M | 79.93 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/pascalvoc/mobilevitv2/pspnet-mobilevitv2-1.5.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/pascalvoc/mobilevitv2/pspnet-mobilevitv2-1.5.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/pascalvoc/mobilevitv2/pspnet-mobilevitv2-1.5.logs) |\n| DeepLabv3 MobileViTv2-0.5 | 6.2 M | 75.07 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/pascalvoc/mobilevitv2/deeplabv3-mobilevitv2-0.5.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/pascalvoc/mobilevitv2/deeplabv3-mobilevitv2-0.5.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/pascalvoc/mobilevitv2/deeplabv3-mobilevitv2-0.5.logs) |\n| DeepLabv3 MobileViTv2-1.0 | 13.3 M | 78.94 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/pascalvoc/mobilevitv2/deeplabv3-mobilevitv2-1.0.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/pascalvoc/mobilevitv2/deeplabv3-mobilevitv2-1.0.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/pascalvoc/mobilevitv2/deeplabv3-mobilevitv2-1.0.logs) |\n| DeepLabv3 MobileViTv2-1.25 | 17.7 M | 79.68 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/pascalvoc/mobilevitv2/deeplabv3-mobilevitv2-1.25.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/pascalvoc/mobilevitv2/deeplabv3-mobilevitv2-1.25.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/pascalvoc/mobilevitv2/deeplabv3-mobilevitv2-1.25.logs) |\n| DeepLabv3 MobileViTv2-1.5 | 22.6 M | 80.30 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/pascalvoc/mobilevitv2/deeplabv3-mobilevitv2-1.5.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/pascalvoc/mobilevitv2/deeplabv3-mobilevitv2-1.5.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/segmentation/pascalvoc/mobilevitv2/deeplabv3-mobilevitv2-1.5.logs) |\n\n</details>\n\n## Citation\n\nIf you find our work useful, please cite:\n\n```BibTex\n@article{mehta2023separable,\n  title={Separable Self-attention for Mobile Vision Transformers},\n  author={Sachin Mehta and Mohammad Rastegari},\n  journal={Transactions on Machine Learning Research},\n  issn={2835-8856},\n  year={2023},\n  url={https://openreview.net/forum?id=tBl4yBEjKi},\n  note={}\n}\n\n@inproceedings{mehta2022cvnets, \n     author = {Mehta, Sachin and Abdolhosseini, Farzad and Rastegari, Mohammad}, \n     title = {CVNets: High Performance Library for Computer Vision}, \n     year = {2022}, \n     booktitle = {Proceedings of the 30th ACM International Conference on Multimedia}, \n     series = {MM '22} \n}\n```\n"
  },
  {
    "path": "projects/mobilevit_v2/classification/mobilevitv2_2.0_ft_384x384.yaml",
    "content": "taskname: '+ MobileViTv2-2.0 384x384'\ncommon:\n  run_label: \"train\"\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\n  channels_last: true\n  tensorboard_logging: false\n  grad_clip: 10.0\ndataset:\n  root_train: \"/mnt/imagenet/training\"\n  root_val: \"/mnt/imagenet/validation\"\n  name: \"imagenet\"\n  category: \"classification\"\n  train_batch_size0: 64 # effective batch size of 128 (64 x 2 GPUs)\n  val_batch_size0: 50\n  eval_batch_size0: 50\n  workers: 8\n  persistent_workers: false\n  pin_memory: true\n  collate_fn_name_train: \"image_classification_data_collate_fn\"\n  collate_fn_name_val: \"image_classification_data_collate_fn\"\n  collate_fn_name_test: \"image_classification_data_collate_fn\"\n\nimage_augmentation:\n  random_resized_crop:\n    enable: true\n    interpolation: \"bicubic\"\n  random_horizontal_flip:\n    enable: true\n  resize:\n    enable: true\n    size: 384 # shorter size is 384\n    interpolation: \"bicubic\"\n  center_crop:\n    enable: true\n    size: 384\nsampler:\n  name: \"batch_sampler\"\n  bs:\n    crop_size_width: 384\n    crop_size_height: 384\nloss:\n  category: \"classification\"\n  classification:\n    name: \"cross_entropy\"\n    cross_entropy:\n      label_smoothing: 0.1\noptim:\n  name: \"sgd\"\n  weight_decay: 4.e-5\n  no_decay_bn_filter_bias: true\n  sgd:\n    momentum: 0.9\nscheduler:\n  name: \"fixed\"\n  max_epochs: 10\n  fixed:\n    lr: 1.e-3\nmodel:\n  classification:\n    name: \"mobilevit_v2\"\n    n_classes: 1000\n    pretrained: \"https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet1k/256x256/mobilevitv2-2.0.pt\"\n    mitv2:\n      width_multiplier: 2.0\n      attn_norm_layer: \"layer_norm_2d\"\n    activation:\n      name: \"swish\"\n  normalization:\n    name: \"batch_norm\"\n    momentum: 0.1\n  activation:\n    name: \"swish\"\nema:\n  enable: true\n  momentum: 0.00005\nstats:\n  val: [ \"loss\", \"top1\", \"top5\" ]\n  train: [\"loss\"]\n  checkpoint_metric: \"top1\"\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "projects/mobilevit_v2/classification/mobilevitv2_2.0_in1k.yaml",
    "content": "taskname: '+ MobileViTv2-2.0'\ncommon:\n  run_label: \"train\"\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\n  channels_last: true\n  tensorboard_logging: false\n  grad_clip: 10.0\ndataset:\n  root_train: \"/mnt/imagenet/training\"\n  root_val: \"/mnt/imagenet/validation\"\n  name: \"imagenet\"\n  category: \"classification\"\n  train_batch_size0: 128 # effective batch size is 128 images per GPU * 8 GPUs = 1024\n  val_batch_size0: 100\n  eval_batch_size0: 100\n  workers: 8\n  prefetch_factor: 2\n  persistent_workers: false\n  pin_memory: true\nimage_augmentation:\n  random_resized_crop:\n    enable: true\n    interpolation: \"bicubic\"\n  random_horizontal_flip:\n    enable: true\n  rand_augment:\n    enable: true\n  random_erase:\n    enable: true\n    p: 0.25\n  mixup:\n    enable: true\n    alpha: 0.2\n  cutmix:\n    enable: true\n    alpha: 1.0\n  resize:\n    enable: true\n    size: 288 # shorter size is 288\n    interpolation: \"bicubic\"\n  center_crop:\n    enable: true\n    size: 256\nsampler:\n  name: \"batch_sampler\"\n  bs:\n    crop_size_width: 256\n    crop_size_height: 256\nloss:\n  category: \"classification\"\n  classification:\n    name: \"cross_entropy\"\n    cross_entropy:\n      label_smoothing: 0.1\noptim:\n  name: \"adamw\"\n  weight_decay: 0.05\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.999\nscheduler:\n  name: \"cosine\"\n  is_iteration_based: false\n  max_epochs: 300\n  warmup_iterations: 20000\n  warmup_init_lr: 1.e-6\n  cosine:\n    max_lr: 0.002\n    min_lr: 0.0002\nmodel:\n  classification:\n    name: \"mobilevit_v2\"\n    n_classes: 1000\n    mitv2:\n      width_multiplier: 2.0\n      attn_norm_layer: \"layer_norm_2d\"\n    activation:\n      name: \"swish\"\n  normalization:\n    name: \"batch_norm\"\n    momentum: 0.1\n  activation:\n    name: \"swish\"\n  layer:\n    global_pool: \"mean\"\n    conv_init:  \"kaiming_normal\"\n    conv_init_std_dev: 0.02\n    linear_init: \"trunc_normal\"\n    linear_init_std_dev: 0.02\nema:\n  enable: true\n  momentum: 0.0005\nstats:\n  val: [ \"loss\", \"top1\", \"top5\" ]\n  train: [\"loss\"]\n  checkpoint_metric: \"top1\"\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "projects/mobilevit_v2/detection/mobilevitv2_2.0_ssd_coco.yaml",
    "content": "taskname: '+ MobileViTv2-2.0 SSD'\ncommon:\n  run_label: \"train\"\n  accum_freq: 1\n  accum_after_epoch: -1\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\ndataset:\n  root_train: \"/mnt/vision_datasets/coco\"\n  root_val: \"/mnt/vision_datasets/coco\"\n  name: \"coco_ssd\"\n  category: \"detection\"\n  train_batch_size0: 32 # effective batch size is 128 (32 * 4 GPUs)\n  val_batch_size0: 32\n  workers: 8\n  persistent_workers: false\n  pin_memory: true\n  collate_fn_name_train: \"coco_ssd_collate_fn\"\n  collate_fn_name_val: \"coco_ssd_collate_fn\"\n\nimage_augmentation:\n  resize:\n    enable: true\n    size: [320, 320]\n    interpolation: \"bicubic\"\nsampler:\n  name: \"batch_sampler\"\n  bs:\n    crop_size_width: 320\n    crop_size_height: 320\nloss:\n  category: \"detection\"\n  detection:\n    name: \"ssd_multibox_loss\"\n    ssd_multibox_loss:\n      neg_pos_ratio: 3\noptim:\n  name: \"adamw\"\n  weight_decay: 0.05\n  no_decay_bn_filter_bias: false\n  adamw:\n    beta1: 0.9\n    beta2: 0.999\nscheduler:\n  name: \"cosine\"\n  is_iteration_based: false\n  max_epochs: 200\n  warmup_iterations: 500\n  warmup_init_lr: 0.00009\n  cosine:\n    max_lr: 0.0009\n    min_lr: 1.e-6\nanchor_generator:\n  name: \"ssd\"\n  ssd:\n    output_strides: [ 16, 32, 64, 128, 256, -1 ]\n    aspect_ratios: [ [ 2, 3 ], [ 2, 3 ], [ 2, 3 ], [ 2, 3 ], [ 2, 3 ], [2] ]\n    min_scale_ratio: 0.1\n    max_scale_ratio: 1.05\nmatcher:\n  name: \"ssd\"\n  ssd:\n    center_variance: 0.1\n    size_variance: 0.2\n    iou_threshold: 0.5\nmodel:\n  detection:\n    name: \"ssd\"\n    n_classes: 81\n    ssd:\n      proj_channels: [512, 256, 256, 128, 128, 64]\n      nms_iou_threshold: 0.5\n  classification:\n    name: \"mobilevit_v2\"\n    n_classes: 1000\n    pretrained: \"https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet1k/384x384/mobilevitv2-2.0.pt\"\n    mitv2:\n      width_multiplier: 2.0\n      attn_norm_layer: \"layer_norm_2d\"\n    activation:\n      name: \"swish\"\n  normalization:\n    name: \"sync_batch_norm\"\n    momentum: 0.1\n  activation:\n    name: \"relu\"\n    inplace: false\n  layer:\n    global_pool: \"mean\"\n    conv_init: \"kaiming_normal\"\n    linear_init: \"normal\"\nema:\n  enable: true\n  momentum: 0.0005\nstats:\n  val: [ \"loss\", \"coco_map\"]\n  train: [\"loss\"]\n  checkpoint_metric: \"coco_map.bbox\"\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "projects/mobilevit_v2/segmentation/deeplabv3_mobilevitv2_1.0_ade20k.yaml",
    "content": "taskname: '+ MobileViTv2-1.0 DeepLabv3'\ncommon:\n  run_label: \"train\"\n  accum_freq: 1\n  accum_after_epoch: -1\n  log_freq: 200\n  auto_resume: false\n  mixed_precision: true\n  grad_clip: 10.0\ndataset:\n  root_train: \"/mnt/vision_datasets/ADEChallengeData2016/\"\n  root_val: \"/mnt/vision_datasets/ADEChallengeData2016/\"\n  name: \"ade20k\"\n  category: \"segmentation\"\n  train_batch_size0: 4 # effective batch size is 16 ( 4 * 4 GPUs)\n  val_batch_size0: 4\n  eval_batch_size0: 1\n  workers: 4\n  persistent_workers: false\n  pin_memory: false\nimage_augmentation:\n  random_crop:\n    enable: true\n    seg_class_max_ratio: 0.75\n    pad_if_needed: true\n    mask_fill: 0 # background idx is 0\n  random_horizontal_flip:\n    enable: true\n  resize:\n    enable: true\n    size: [512, 512]\n    interpolation: \"bicubic\"\n  random_short_size_resize:\n    enable: true\n    interpolation: \"bicubic\"\n    short_side_min: 256\n    short_side_max: 768\n    max_img_dim: 1024\n  photo_metric_distort:\n    enable: true\n  random_rotate:\n    enable: true\n    angle: 10\n    mask_fill: 0 # background idx is 0\n  random_gaussian_noise:\n    enable: true\nsampler:\n  name: \"batch_sampler\"\n  bs:\n    crop_size_width: 512\n    crop_size_height: 512\nloss:\n  category: \"segmentation\"\n  segmentation:\n    name: \"cross_entropy\"\n    cross_entropy:\n      aux_weight: 0.4\n      ignore_index: -1\noptim:\n  name: \"sgd\"\n  weight_decay: 1.e-4\n  no_decay_bn_filter_bias: true\n  sgd:\n    momentum: 0.9\nscheduler:\n  name: \"cosine\"\n  is_iteration_based: false\n  max_epochs: 120\n  cosine:\n    max_lr: 0.02\n    min_lr: 0.0002\nmodel:\n  segmentation:\n    name: \"encoder_decoder\"\n    n_classes: 150\n    lr_multiplier: 1\n    seg_head: \"deeplabv3\"\n    output_stride: 8\n    use_aux_head: true\n    activation:\n      name: \"relu\"\n    deeplabv3:\n      aspp_dropout: 0.1\n      aspp_out_channels: 512\n      aspp_rates: [ 12, 24, 36 ]\n  classification:\n    name: \"mobilevit_v2\"\n    n_classes: 1000\n    pretrained: \"https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/mobilevitv2/imagenet1k/256x256/mobilevitv2-1.0.pt\"\n    mitv2:\n      width_multiplier: 1.0\n      attn_norm_layer: \"layer_norm_2d\"\n    activation:\n      name: \"swish\"\n  normalization:\n    name: \"sync_batch_norm\"\n    momentum: 0.1\n  activation:\n    name: \"swish\"\n    inplace: false\n  layer:\n    global_pool: \"mean\"\n    conv_init: \"kaiming_uniform\"\n    linear_init: \"normal\"\nema:\n  enable: true\n  momentum: 0.0005\nstats:\n  val: [ \"loss\", \"iou\" ]\n  train: [ \"loss\", \"grad_norm\" ]\n  checkpoint_metric: \"iou\"\n  checkpoint_metric_max: true\n\n# During evaluation (with corenet-eval-seg), we follow following steps:\n#  1. Determine and store the size of input image as metadata\n#  2. Resize image while maintaining the aspect ratio\n#  3. Make a prediction\n#  4. Resize the predicted mask to the same size as original input image\n#  5. compute results\nevaluation:\n  segmentation:\n    resize_input_images: true\n    mode: \"validation_set\"\n"
  },
  {
    "path": "projects/openelm/README-instruct.md",
    "content": "# OpenELM Instruction Tuning\n\nWe use [The Alignment Handbook](https://github.com/huggingface/alignment-handbook.git) library to finetune OpenELM models on the [UltraFeedback dataset](https://huggingface.co/datasets/csarron/argilla-ultrafeedback-binarized-preferences-cleaned). Below is the instrution to produce the instruction-tuned OpenELM models.\n\n```bash\n# Change this to the path that you've cloned the repository\ncd /path/to/corenet \n\n# Install dependencies.\n\ngit clone https://github.com/huggingface/alignment-handbook.git hf-align\n# 70769f9 is the main branch on 2024-04-11.\ncd hf-align && git checkout 70769f9 && cd .. \n\npip install -e ./hf-align\n\n# Copy openelm-instruct recipe to hf-align/recipes.\ncp projects/openelm/instruction_tuning/openelm-instruct.yaml hf-align/recipes/\n\n# Prepare the converted OpenELM Huggingface model to ckpt_dir.\nckpt_dir=<your_converted_OpenELM_hf_model>\n# Prepare tokenizer.\nlocal_tokenizer_dir=<your_downloaded_Llama-2-7b-hf-tokenizer>\n# Set output checkpoint dir.\ndpo_ckpt_dir=<your_output_checkpoint_dir>\n\n# Set lr, epochs, and loss_type based on the paper, also see the table below.\n# e.g. for OpenELM-270M model:\nep=5\nlr=2e-5\nloss_type=hinge\n\naccelerate launch --config_file hf-align/recipes/accelerate_configs/deepspeed_zero3.yaml \\\nhf-align/scripts/run_dpo.py hf-align/recipes/openelm-instruct.yaml \\\n--trust_remote_code=true \\\n--model_name_or_path=${ckpt_dir} \\\n--tokenizer_name_or_path=${local_tokenizer_dir} \\\n--output_dir=${dpo_ckpt_dir} \\\n--num_train_epochs=$ep \\\n--learning_rate=$lr \\\n--loss_type=$loss_type\n\n# Results will be in ${dpo_ckpt_dir}/all_results.json.\n\n```\n\nOpenELM instruction tuning hyperparameters:\n\n| Hyperparameters                    | **270M**      | **450M**      | **1.1B**      | **3B**      |\n|------------------------------------|:-------------:|:-------------:|:-------------:|:-----------:|\n| Training epochs                    |       5       |       8       |       5       |      10     |\n| Learning rate                      |      2e-5     |      3e-5     |      5e-5     |     1e-4    |\n| Loss function                      |     hinge     |     hinge     |    sigmoid    |    hinge    |\n\n"
  },
  {
    "path": "projects/openelm/README-peft.md",
    "content": "# OpenELM Parameter-Efficient Finetuning (PEFT)\n\nWe fine-tune models using the evaluation setup described in [LLM Adapters](https://arxiv.org/abs/2304.01933). This involves jointly fine-tuning on 8 commonsense reasoning datasets with a training set of size 170k. We follow the evaluation setup of [the official code release of LLM Adapters](https://github.com/AGI-Edgerunners/LLM-Adapters), with the exception that we use log-likelihood rather than regex parsing to determine the model's output.\n\n## Setup\n\nTo ensure consistency of evaluations with LLM Adapters, we use helper functions defined in their code. To set up for evaluations, run the following command:\n\n```bash\n# Change this to the path to CoreNet\ncd /path/to/corenet\n\n# Install LM Harness.\ngit clone https://github.com/EleutherAI/lm-evaluation-harness.git\ncd lm-evaluation-harness\ngit checkout 3196e907fa195b684470a913c7235ed7f08a4383\npython3 -m pip install -e . -c ../requirements.txt\ncd ..\n\n# Install LLM Adapters.\ngit clone https://github.com/AGI-Edgerunners/LLM-Adapters.git\ncd LLM-Adapters\ngit checkout 816657208af4db747803f87ba40a4c71383fed7a\ntouch __init__.py\npython3 -m pip install -r requirements.txt -c ../requirements.txt\ncd ..\n\n# Install Huggingface and its dependencies.\npython3 -m pip install --upgrade \\\n    transformers==4.36.2 \\\n    datasets==2.19.0 \\\n    accelerate==0.29.3 \\\n    sentencepiece==0.2.0 \\\n    -c requirements.txt\n```\n\nIn our experiments, we used LLamav1/v2 tokenizer. Please download the tokenizer from the [official repository](https://github.com/meta-llama/llama).\n\n## Training\n\nTo fine-tune a 270M-parameter model with [LoRA](https://arxiv.org/abs/2106.09685), use the following command:\n\n```bash\nCFG_FILE=\"projects/openelm/peft_configs/openelm_lora_270M.yaml\"\nWTS_FILE=\"https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/270M/checkpoint_average.pt\"\nTOKENIZER_FILE=\"<PATH_TO_TOKENIZER_FILE>\"\n# NOTE: The dataset can currently be obtained from https://github.com/AGI-Edgerunners/LLM-Adapters/blob/main/ft-training_set/commonsense_170k.json.\nDATASET_FILE=\"<PATH_TO_COMMONSENSE_170K>\"\ncorenet-train --common.config-file $CFG_FILE \\\n    --model.language-modeling.pretrained $WTS_FILE \\\n    --text-tokenizer.sentence-piece.model-path $TOKENIZER_FILE \\\n    --dataset.language-modeling.commonsense-170k.path $DATASET_FILE\n```\n\nTo train with [DoRA](https://arxiv.org/abs/2402.09353) instead, edit the config file to set `use_dora` to True.\n\n## Evaluation\nTo evaluate a pre-trained LoRA 270M model, use the following command:\n\n```bash\nCFG_FILE=\"projects/openelm/peft_configs/openelm_lora_270M_eval.yaml\"\nWTS_FILE=\"https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/peft/openelm_lora_270M.pt\"\nTOKENIZER_FILE=\"<PATH_TO_TOKENIZER_FILE>\"\ncorenet-eval-llmadapters --common.config-file $CFG_FILE \\\n    --model.language-modeling.pretrained $WTS_FILE \\\n    --text-tokenizer.sentence-piece.model-path $TOKENIZER_FILE\n```\n\nThe expected results are:\n\n| boolq | piqa | siqa | hellaswag | winogrande | arc-easy | arc-challenge | obqa |\n| ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- |\n| 62.14 | 50.05 | 42.02 | 24.84 | 49.88 | 26.60 | 24.57 | 28.00 |\n\nTo evaluate other pretrained models, edit the config file to use different backbones. To evaluate [DoRA](https://arxiv.org/abs/2402.09353) models, edit the config file to set `use_dora` to True.\n\n### Pretraining checkpoints\n| Model | LoRA/DoRA | Weights |\n| ---- | ---- | ---- |\n| OpenELM-270M | LoRA | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/peft/openelm_lora_270M.pt)\n| OpenELM-450M | LoRA | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/peft/openelm_lora_450M.pt)\n| OpenELM-1.1B | LoRA | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/peft/openelm_lora_1.1B.pt)\n| OpenELM-3B | LoRA | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/peft/openelm_lora_3B.pt)\n| OpenELM-270M | DoRA | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/peft/openelm_dora_270M.pt)\n| OpenELM-450M | DoRA | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/peft/openelm_dora_450M.pt)\n| OpenELM-1.1B | DoRA | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/peft/openelm_dora_1.1B.pt)\n| OpenELM-3B | DoRA | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/peft/openelm_dora_3B.pt)\n"
  },
  {
    "path": "projects/openelm/README-pretraining.md",
    "content": "# Pretraining OpenELM\n\n## Dataset preparation\n\nOpenELM was pretrained on public datasets. Specifically, our pre-training dataset contains RefinedWeb, PILE, a subset of RedPajama, and a subset of Dolma v1.6. \n\n> **NOTE:**  Please accept the license of each individual dataset before using it. \n\nPlease process the dataset according to the instructions provided in the following YAML snippet. We used the same structure during our experiments.\n\n```yaml\ndataset:\n  language_modeling:\n    shuffle_data: true\n    general_lm:\n      # path to HF dataset\n      train_data_info: [\n        ####### RefinedWeb ########\n        # The dataset can be downloaded from HuggingFace and contains 5535 parquet files.\n        # https://huggingface.co/datasets/tiiuae/falcon-refinedweb/tree/main/data\n        # We renamed the files to 'refinedweb-{file_id:05d}-of-05534.parquet' format.\n        {\n          # \"file_name\": \"REPLACE_WITH_LOCATION_OF_DOWNLOADED_REFINED_WEB_DATA/refinedweb-{file_id:05d}-of-05534.parquet\",\n          \"text_key\": \"content\",\n          \"file_id_range\": [0, 5534]\n        },\n        ####### RedPAJAMA ########\n        # The urls for Redpajama data are available at https://data.together.xyz/redpajama-data-1T/v1.0.0/urls.txt.\n        # The data can be downloaded from the above URL.\n        # The name of the files is different from the format that is expected in CoreNet, so we recommend to rename the files # to the expected format. In general, we expect the redpajama data in following format:\n        #     LOCATION_OF_DOWNLOADED_REDPAJAMA_DATA/REDPAJAMA_SUBSET_NAME/REDPAJAMA_SUBSET_NAME-FILE_ID-TOTAL_FILES.jsonl\n        # where \n        #   LOCATION_OF_DOWNLOADED_REDPAJAMA_DATA corresponds to the root location (local or s3) of downloaded RedPajama dataset\n        #   REDPAJAMA_SUBSET_NAME corresponds to the subset name (e.g., arxiv)\n        #   FILE_ID: Uniqiue identifier for the file (e.g., 00001) for the first file in the subset\n        #   TOTAL_FILES: Total files in the subset (e.g., 00099)\n\n        # Assume that the subset name is 'arxiv' and it has 100 files (e.g., arxiv-00000-00099.jsonl, arxiv-00001-00099.jsonl, and so on). We can pass it as a below dictionary.\n        ### Arxiv\n        {\n          # \"file_name\": \"LOCATION_OF_DOWNLOADED_REDPAJAMA_DATA/arxiv/arxiv-{file_id:05d}-00099.jsonl\", \n          \"text_key\": \"text\",\n          \"file_id_range\": [0, 100]\n        },\n        ### Books\n        {\n          # Note that there is only one book file in the RedPajama dataset.\n          # \"file_name\": \"LOCATION_OF_DOWNLOADED_REDPAJAMA_DATA/book/book-{file_id:05d}-00001.jsonl\",\n          \"text_key\": \"text\",\n          \"file_id_range\": [0, 1]\n        },\n        ### Github\n        {\n          # \"file_name\": \"LOCATION_OF_DOWNLOADED_REDPAJAMA_DATA/github/github-{file_id:05d}-00098.jsonl\",\n          \"text_key\": \"text\",\n          \"file_id_range\": [0, 98]\n        },\n        ### Stackexchange\n        {\n          # \"file_name\": \"LOCATION_OF_DOWNLOADED_REDPAJAMA_DATA/stackexchange/stackexchange-{file_id:05d}-00001.jsonl\",\n          \"text_key\": \"text\",\n          \"file_id_range\": [0, 1]\n        },\n        ### wikipedia\n        {\n          # \"file_name\": \"LOCATION_OF_DOWNLOADED_REDPAJAMA_DATA/wikipedia/wiki-{file_id:05d}-00001.jsonl\",\n          \"text_key\": \"text\",\n          \"file_id_range\": [0, 1]\n        },\n        ### C4\n        {\n          # \"file_name\": \"LOCATION_OF_DOWNLOADED_REDPAJAMA_DATA/c4/c4-{file_id:05d}-01024.jsonl\",\n          \"text_key\": \"text\",\n          \"file_id_range\": [0, 1024]\n        },\n        ####### PILE ########\n        # The PILE dataset can be downloaded from HuggingFace. THe dataset contains 1650 parquet files.\n        # https://huggingface.co/datasets/EleutherAI/the_pile_deduplicated\n        # Similar to RefinedWeb, please rename the files to the expected format.\n        {\n          # \"file_name\": \"LOCATION_OF_DOWNLOADED_PILE_DATA/pile-{file_id:05d}-of-01650.parquet\",\n          \"text_key\": \"text\",\n          \"file_id_range\": [0, 1650]\n        },\n        ####### Dolma v1.6 ########\n        # The urls for Dolma v1.6 are available at: https://huggingface.co/datasets/allenai/dolma/blob/main/urls/v1_6.txt\n        # The dataset files are available as 'json.gz' format. We follow similar steps as RedPajama to rename the files.\n        # We recommend users to follow the similar steps and rename the files. Expected format for each subset is \n        # mentioned below.\n\n        ### Gutenberg books\n        {\n          # \"file_name\": \"LOCATION_OF_DOWNLOADED_DOLMAv1.6_DATA/books/books-{file_id:04d}.json.gz\",\n          \"text_key\": \"text\",\n          \"file_id_range\": [0, 3]\n        },\n        ### peS2o\n        {\n          # \"file_name\": \"LOCATION_OF_DOWNLOADED_DOLMAv1.6_DATA/pes2o/pes2o_v2-{file_id:04d}.json.gz\",\n          \"text_key\": \"text\",\n          \"file_id_range\": [0, 26]\n        },\n        ### reddit\n        {\n          #\"file_name\": \"LOCATION_OF_DOWNLOADED_DOLMAv1.6_DATA/reddit/reddit-v5-dedupe-pii-nsfw-toxic-{file_id:04d}.json.gz\",\n          \"text_key\": \"text\",\n          \"file_id_range\": [0, 78]\n        },\n        # stack\n        {\n          #\"file_name\": \"LOCATION_OF_DOWNLOADED_DOLMAv1.6_DATA/stack/stack-v4-train-{file_id:04d}.json.gz\",\n          \"text_key\": \"text\",\n          \"file_id_range\": [0, 149]\n        },\n        # wiki\n        {\n          #\"file_name\": \"LOCATION_OF_DOWNLOADED_DOLMAv1.6_DATA/wiki/en_simple_wiki_v0-{file_id:04d}.json.gz\",\n          \"text_key\": \"text\",\n          \"file_id_range\": [0, 2]\n        },\n      ]\n```\n\n## Training OpenELM models\n\nOpenELM models are trained on multiple nodes, each node with multiple GPUs. Please see comments in [configuration files](../../projects/openelm/pretraining_configs/) for exact number of GPUs and nodes used in our experiments.\n\n\nAn example command for training on `i-th` node is\n```bash\nexport CFG_FILE=\"PATH_TO_OPENELM_MODEL_CONFIGURATION_FILE\"\nexport RANK=<NODE_ID> * <NUM_GPUS_PER_NODE>\nexport WORLD_SIZE=<NUM_NODES> * <NUM_GPUS_PER_NODE>\ncorenet-train --common.config-file $CFG_FILE --ddp.rank $RANK --ddp.world-size $WORLD_SIZE --ddp.dist-url 'tcp://IP_OF_NODE0:FREEPORT'\n```\n\n## Pretraining checkpoints, model weights, and logs\n\n### Model weight checkpoints\n\nThe following checkpoints include only the model weights. These maybe useful for evaluation or fine-tuning purporses.\n\n| Iteration | OpenELM-270M | OpenELM-450M | OpenELM-1.1B | OpenELM-3B |\n| ---- | ---- | ---- | ---- | ---- | \n| 50k | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/270M/checkpoint_epoch_0_iter_49999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/450M/checkpoint_epoch_0_iter_49999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/1.1B/checkpoint_epoch_0_iter_49999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/3B/checkpoint_epoch_0_iter_49999.pt) |\n| 100k | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/270M/checkpoint_epoch_0_iter_99999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/450M/checkpoint_epoch_0_iter_99999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/1.1B/checkpoint_epoch_0_iter_99999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/3B/checkpoint_epoch_0_iter_99999.pt) |\n| 150k | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/270M/checkpoint_epoch_0_iter_149999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/450M/checkpoint_epoch_0_iter_149999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/1.1B/checkpoint_epoch_0_iter_149999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/3B/checkpoint_epoch_0_iter_149999.pt) |\n| 200k | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/270M/checkpoint_epoch_0_iter_199999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/450M/checkpoint_epoch_0_iter_199999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/1.1B/checkpoint_epoch_0_iter_199999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/3B/checkpoint_epoch_0_iter_199999.pt) |\n| 250k | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/270M/checkpoint_epoch_0_iter_249999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/450M/checkpoint_epoch_0_iter_249999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/1.1B/checkpoint_epoch_0_iter_249999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/3B/checkpoint_epoch_0_iter_249999.pt) |\n| 300k | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/270M/checkpoint_epoch_0_iter_299999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/450M/checkpoint_epoch_0_iter_299999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/1.1B/checkpoint_epoch_0_iter_299999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/3B/checkpoint_epoch_0_iter_299999.pt) |\n| 330k | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/270M/checkpoint_epoch_0_iter_329999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/450M/checkpoint_epoch_0_iter_329999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/1.1B/checkpoint_epoch_0_iter_329999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/3B/checkpoint_epoch_0_iter_329999.pt) |\n| 335k | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/270M/checkpoint_epoch_0_iter_334999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/450M/checkpoint_epoch_0_iter_334999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/1.1B/checkpoint_epoch_0_iter_334999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/3B/checkpoint_epoch_0_iter_334999.pt) |\n| 340k | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/270M/checkpoint_epoch_0_iter_339999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/450M/checkpoint_epoch_0_iter_339999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/1.1B/checkpoint_epoch_0_iter_339999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/3B/checkpoint_epoch_0_iter_339999.pt) |\n| 345k | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/270M/checkpoint_epoch_0_iter_344999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/450M/checkpoint_epoch_0_iter_344999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/1.1B/checkpoint_epoch_0_iter_344999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/3B/checkpoint_epoch_0_iter_344999.pt) |\n| 350k | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/270M/checkpoint_epoch_0_iter_349999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/450M/checkpoint_epoch_0_iter_349999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/1.1B/checkpoint_epoch_0_iter_349999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/3B/checkpoint_epoch_0_iter_349999.pt) |\n| Avg. last 5 ckpts | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/270M/checkpoint_average.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/450M/checkpoint_average.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/1.1B/checkpoint_average.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/3B/checkpoint_average.pt) |\n| Training logs | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/270M/training_logs.txt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/450M/training_logs.txt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/1.1B/training_logs.txt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/3B/training_logs.txt) |\n\n### Full checkpoints\n\nThe following checkpoints contain training state information, such as model and optimizer states, which maybe useful in resuming the training.\n\n| Iteration | OpenELM-270M | OpenELM-450M | OpenELM-1.1B | OpenELM-3B |\n| ---- | ---- | ---- | ---- | ---- | \n| 50k | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/270M/training_checkpoint_epoch_0_iter_49999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/450M/training_checkpoint_epoch_0_iter_49999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/1.1B/training_checkpoint_epoch_0_iter_49999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/3B/training_checkpoint_epoch_0_iter_49999.pt) |\n| 100k | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/270M/training_checkpoint_epoch_0_iter_99999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/450M/training_checkpoint_epoch_0_iter_99999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/1.1B/training_checkpoint_epoch_0_iter_99999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/3B/training_checkpoint_epoch_0_iter_99999.pt) |\n| 150k | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/270M/training_checkpoint_epoch_0_iter_149999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/450M/training_checkpoint_epoch_0_iter_149999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/1.1B/training_checkpoint_epoch_0_iter_149999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/3B/training_checkpoint_epoch_0_iter_149999.pt) |\n| 200k | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/270M/training_checkpoint_epoch_0_iter_199999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/450M/training_checkpoint_epoch_0_iter_199999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/1.1B/training_checkpoint_epoch_0_iter_199999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/3B/training_checkpoint_epoch_0_iter_199999.pt) |\n| 250k | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/270M/training_checkpoint_epoch_0_iter_249999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/450M/training_checkpoint_epoch_0_iter_249999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/1.1B/training_checkpoint_epoch_0_iter_249999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/3B/training_checkpoint_epoch_0_iter_249999.pt) |\n| 300k | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/270M/training_checkpoint_epoch_0_iter_299999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/450M/training_checkpoint_epoch_0_iter_299999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/1.1B/training_checkpoint_epoch_0_iter_299999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/3B/training_checkpoint_epoch_0_iter_299999.pt) |\n| 330k | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/270M/training_checkpoint_epoch_0_iter_329999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/450M/training_checkpoint_epoch_0_iter_329999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/1.1B/training_checkpoint_epoch_0_iter_329999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/3B/training_checkpoint_epoch_0_iter_329999.pt) |\n| 335k | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/270M/training_checkpoint_epoch_0_iter_334999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/450M/training_checkpoint_epoch_0_iter_334999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/1.1B/training_checkpoint_epoch_0_iter_334999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/3B/training_checkpoint_epoch_0_iter_334999.pt) |\n| 340k | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/270M/training_checkpoint_epoch_0_iter_339999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/450M/training_checkpoint_epoch_0_iter_339999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/1.1B/training_checkpoint_epoch_0_iter_339999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/3B/training_checkpoint_epoch_0_iter_339999.pt) |\n| 345k | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/270M/training_checkpoint_epoch_0_iter_344999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/450M/training_checkpoint_epoch_0_iter_344999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/1.1B/training_checkpoint_epoch_0_iter_344999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/3B/training_checkpoint_epoch_0_iter_344999.pt) |\n| 350k | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/270M/training_checkpoint_epoch_0_iter_349999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/450M/training_checkpoint_epoch_0_iter_349999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/1.1B/training_checkpoint_epoch_0_iter_349999.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/3B/training_checkpoint_epoch_0_iter_349999.pt) |\n| End of training| [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/270M/training_checkpoint_last.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/450M/training_checkpoint_last.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/1.1B/training_checkpoint_last.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/openelm/pretrained/3B/training_checkpoint_last.pt) |\n\n"
  },
  {
    "path": "projects/openelm/README.md",
    "content": "# OpenELM: An Efficient Language Model Family with Open Training and Inference Framework\n\n[![arXiv](https://img.shields.io/badge/arXiv-2404.14619-a6dba0.svg)](https://arxiv.org/abs/2404.14619)\n\nWe provide pretraining, evaluation, instruction tuning, and parameter-efficient finetuning instructions along with pretrained models and checkpoints:\n\n1. [Pre-training](./README-pretraining.md)\n2. [Evaluation](https://huggingface.co/apple/OpenELM#evaluation)\n3. [Instruction Tuning](./README-instruct.md)\n4. [Parameter-Efficient Finetuning](./README-peft.md)\n5. [MLX Conversion](../../mlx_examples/open_elm/README.md)\n6. [HuggingFace](https://huggingface.co/apple/OpenELM)\n\n## Tokenizer\n\nIn our experiments, we used LLama v1/v2 tokenizer. Please download the tokenizer from the [official repository](https://github.com/meta-llama/llama).\n\n## Bias, Risks, and Limitations\n\nThe release of OpenELM models aims to empower and enrich the open research community by providing access to state-of-the-art language models. Trained on publicly available datasets, these models are made available without any safety guarantees. Consequently, there exists the possibility of these models producing outputs that are inaccurate, harmful, biased, or objectionable in response to user prompts. Thus, it is imperative for users and developers to undertake thorough safety testing and implement appropriate filtering mechanisms tailored to their specific requirements.\n\n## Citation\n\nIf you find our work useful, please cite:\n\n```BibTex \n@article{mehta2024openelm,\n  title={OpenELM: An Efficient Language Model Family with Open Training and Inference Framework},\n  author = {Sachin Mehta and Mohammad Hossein Sekhavat and Qingqing Cao and Maxwell Horton and Yanzi Jin and Chenfan Sun and Iman Mirzadeh and Mahyar Najibi and Dmitry Belenko and Peter Zatloukal and Mohammad Rastegari},\n  year={2024},\n  eprint={2404.14619},\n  archivePrefix={arXiv},\n  primaryClass={cs.CL}\n}\n\n@inproceedings{mehta2022cvnets, \n     author = {Mehta, Sachin and Abdolhosseini, Farzad and Rastegari, Mohammad}, \n     title = {CVNets: High Performance Library for Computer Vision}, \n     year = {2022}, \n     booktitle = {Proceedings of the 30th ACM International Conference on Multimedia}, \n     series = {MM '22} \n}\n```\n"
  },
  {
    "path": "projects/openelm/instruction_tuning/openelm-instruct.yaml",
    "content": "# pytest: disable\n# Model arguments\nmodel_name_or_path: OpenELM-500M\ntorch_dtype: null\nuse_flash_attention_2: false\n\nchat_template: \"{% for message in messages %}\\n{% if message['role'] == 'user' %}\\n{{ '<|user|>\\n' + message['content'] + eos_token }}\\n{% elif message['role'] == 'system' %}\\n{{ '<|system|>\\n' + message['content'] + eos_token }}\\n{% elif message['role'] == 'assistant' %}\\n{{ '<|assistant|>\\n'  + message['content'] + eos_token }}\\n{% endif %}\\n{% if loop.last and add_generation_prompt %}\\n{{ '<|assistant|>' }}\\n{% endif %}\\n{% endfor %}\"\n# Data training arguments\n# For definitions, see: src/h4/training/config.py\ndataset_mixer:\n  csarron/argilla-ultrafeedback-binarized-preferences-cleaned: 1.0\ndataset_splits:\n- train\n- test\npreprocessing_num_workers: 16\n\n# DPOTrainer arguments\nbf16: true\nbeta: 0.01\ndo_eval: true\nevaluation_strategy: steps\neval_steps: 100\ngradient_accumulation_steps: 2\ngradient_checkpointing: true\ngradient_checkpointing_kwargs:\n  use_reentrant: False\nhub_model_id: OpenELM-500M-dpo\nlearning_rate: 5.0e-5\nlog_level: info\nlogging_steps: 10\nlr_scheduler_type: cosine\nmax_length: 1024\nmax_prompt_length: 512\nnum_train_epochs: 3\noptim: adamw_torch\noutput_dir: data/OpenELM-500M-dpo\nper_device_train_batch_size: 8\nper_device_eval_batch_size: 8\npush_to_hub: false\nsave_strategy: \"steps\"\nsave_steps: 100\nsave_total_limit: 1\nseed: 42\nwarmup_ratio: 0.1\n"
  },
  {
    "path": "projects/openelm/peft_configs/openelm_lora_1_1B.yaml",
    "content": "# pytest: disable\n\ntaskname: '+ [OpenELM-LoRA-1.1B]'\n\n_anchor_context_length: &_anchor_context_length 2048\n# actual vocab size is 32001 after adding padding token, so we add few extra tokens to make it more hardware friendly\n# for classification layer in LM model\n_anchor_vocab_size: &_anchor_vocab_size 32128 \n_anchor_padding_index: &_anchor_padding_index 32000\n_anchor_forward_dtype: &_anchor_forward_dtype \"bfloat16\"\n_anchor_backward_dtype: &_anchor_backward_dtype \"float32\"\n\ncommon:\n  run_label: \"train\"\n  log_freq: 500\n  auto_resume: true\n  grad_clip: 1.0\n  save_all_checkpoints: true\n  save_interval_freq: 5000\n  eval_every_k_iterations: 10000\n  mixed_precision: true\n  mixed_precision_dtype: \"bfloat16\"\n  accum_freq: 2\n\ndataset:\n  root_train: \"\"\n  disable_val: true\n  train_batch_size0: 8\n  workers: 4\n  persistent_workers: true\n  pin_memory: true\n\n  category: \"language_modeling\"\n  name: \"commonsense_170k\"\n  language_modeling:\n    commonsense_170k:\n      # Uncomment the below line and update the path to CommonSense170k.\n      # path: <PATH_TO_COMMONSENSE170K>\n    sequence_length: *_anchor_context_length\n    min_tokens_per_text: 0\n    min_characters_per_text: 0\n    shuffle_data: true\n\ntext_tokenizer:\n  name: \"sentence_piece\"\n  sentence_piece:\n    enable_nfc_normalization: true\n    append_sot_token: true\n    append_eot_token: true\n    # Uncomment the below line and update the path of LLAMA SentencePiece model file\n    # model_path: <PATH_OF_LLAMA_SPM_MODEL>\n\nloss:\n  category: \"language_modeling\"\n  language_modeling:\n    name: \"cross_entropy\"\n    cross_entropy:\n      ignore_index: *_anchor_padding_index\n      use_z_loss: true\n\noptim:\n  name: \"adamw\"\n  weight_decay: 0\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.95\n    eps: 1.e-8\n\nscheduler:\n  is_iteration_based: true\n  # Train for 3 epochs.\n  max_iterations: 4375\n  name: cosine\n  warmup_init_lr: 1.e-06\n  warmup_iterations: 1000\n  cosine:\n    max_lr: 0.0003\n    # papers use min_lr= 0.1 x max_lr\n    min_lr: 0.00003\n\nmodel:\n  # Allow reloading the pretrained model.\n  rename_scopes_map:\n    - ['token_embeddings.weight', 'token_embeddings.base_layer.weight']\n    - ['layers.(.*).qkv_proj.weight', 'layers.\\1.qkv_proj.base_layer.weight']\n    - ['layers.(.*).out_proj.weight', 'layers.\\1.out_proj.base_layer.weight']\n    - ['layers.(.*).proj_(\\d).weight', 'layers.\\1.proj_\\2.base_layer.weight']\n  ignore_missing_scopes:\n    - \".*lora.*\"\n  freeze_modules: [\".*base_layer.*\", \".*norm.*\"]\n  activation_checkpointing: true\n  language_modeling:\n    name: \"general_gpt\"\n    general_gpt:\n      model_name: \"OpenELM-1_1B\"\n      vocab_size: *_anchor_vocab_size\n      max_context_length: *_anchor_context_length\n      padding_index: *_anchor_padding_index\n  lora:\n    use_lora: true\n    config:\n      - regex: '.*token_embedding.*'\n        module_type: 'embedding'\n        params:\n          adapter_name: lora\n          r: &r 32\n          lora_alpha: &alpha 32\n          lora_dropout: &dropout 0.1\n          init_lora_weights: &ilw true\n          use_rslora: &ur false\n          use_dora: &ud false\n      - regex: '.*out_proj.*'\n        module_type: 'linear'\n        params:\n          adapter_name: lora\n          r: *r\n          lora_alpha: *alpha\n          lora_dropout: *dropout\n          init_lora_weights: *ilw\n          use_rslora: *ur\n          use_dora: *ud\n      - regex: '.*qkv_proj.*'\n        module_type: 'linear'\n        params:\n          adapter_name: lora\n          r: *r\n          lora_alpha: *alpha\n          lora_dropout: *dropout\n          init_lora_weights: *ilw\n          use_rslora: *ur\n          use_dora: *ud\n      - regex: '.*proj_\\d.*'\n        module_type: 'linear'\n        params:\n          adapter_name: lora\n          r: *r\n          lora_alpha: *alpha\n          lora_dropout: *dropout\n          init_lora_weights: *ilw\n          use_rslora: *ur\n          use_dora: *ud\n\nstats:\n  val: [ \"loss\"]\n  train: [\"loss\"]\n  checkpoint_metric: \"loss.total_loss\"\n  checkpoint_metric_max: false\n\nlm_eval_wrapper:\n  add_sot_token: true\n"
  },
  {
    "path": "projects/openelm/peft_configs/openelm_lora_270M.yaml",
    "content": "# pytest: disable\n\ntaskname: '+ [OpenELM-LoRA-270M]'\n\n_anchor_context_length: &_anchor_context_length 2048\n# actual vocab size is 32001 after adding padding token, so we add few extra tokens to make it more hardware friendly\n# for classification layer in LM model\n_anchor_vocab_size: &_anchor_vocab_size 32128 \n_anchor_padding_index: &_anchor_padding_index 32000\n\ncommon:\n  run_label: \"train\"\n  log_freq: 500\n  auto_resume: true\n  grad_clip: 1.0\n  save_all_checkpoints: true\n  save_interval_freq: 5000\n  eval_every_k_iterations: 10000\n  mixed_precision: true\n  mixed_precision_dtype: \"bfloat16\"\n  accum_freq: 2\n\ndataset:\n  root_train: \"\"\n  disable_val: true\n  train_batch_size0: 8\n  workers: 4\n  persistent_workers: true\n  pin_memory: true\n\n  category: \"language_modeling\"\n  name: \"commonsense_170k\"\n  language_modeling:\n    commonsense_170k:\n      # Uncomment the below line and update the path to CommonSense170k.\n      # path: <PATH_TO_COMMONSENSE170K>\n    sequence_length: *_anchor_context_length\n    min_tokens_per_text: 0\n    min_characters_per_text: 0\n    shuffle_data: true\n\ntext_tokenizer:\n  name: \"sentence_piece\"\n  sentence_piece:\n    enable_nfc_normalization: true\n    append_sot_token: true\n    append_eot_token: true\n    # Uncomment the below line and update the path of LLAMA SentencePiece model file\n    # model_path: <PATH_OF_LLAMA_SPM_MODEL>\n\nloss:\n  category: \"language_modeling\"\n  language_modeling:\n    name: \"cross_entropy\"\n    cross_entropy:\n      ignore_index: *_anchor_padding_index\n      use_z_loss: true\n\noptim:\n  name: \"adamw\"\n  weight_decay: 0\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.95\n    eps: 1.e-8\n\nscheduler:\n  is_iteration_based: true\n  # Train for 3 epochs.\n  max_iterations: 4375\n  name: cosine\n  warmup_init_lr: 1.e-06\n  warmup_iterations: 1000\n  cosine:\n    max_lr: 0.0003\n    # papers use min_lr= 0.1 x max_lr\n    min_lr: 0.00003\n\nmodel:\n  # Allow reloading the pretrained model.\n  rename_scopes_map:\n    - ['token_embeddings.weight', 'token_embeddings.base_layer.weight']\n    - ['layers.(.*).qkv_proj.weight', 'layers.\\1.qkv_proj.base_layer.weight']\n    - ['layers.(.*).out_proj.weight', 'layers.\\1.out_proj.base_layer.weight']\n    - ['layers.(.*).proj_(\\d).weight', 'layers.\\1.proj_\\2.base_layer.weight']\n  ignore_missing_scopes:\n    - \".*lora.*\"\n  freeze_modules: [\".*base_layer.*\", \".*norm.*\"]\n  activation_checkpointing: false\n  language_modeling:\n    name: \"general_gpt\"\n    general_gpt:\n      model_name: \"OpenELM-270M\"\n      vocab_size: *_anchor_vocab_size\n      max_context_length: *_anchor_context_length\n      padding_index: *_anchor_padding_index\n  lora:\n    use_lora: true\n    config:\n      - regex: '.*token_embedding.*'\n        module_type: 'embedding'\n        params:\n          adapter_name: lora\n          r: &r 32\n          lora_alpha: &alpha 32\n          lora_dropout: &dropout 0.1\n          init_lora_weights: &ilw true\n          use_rslora: &ur false\n          use_dora: &ud false\n      - regex: '.*out_proj.*'\n        module_type: 'linear'\n        params:\n          adapter_name: lora\n          r: *r\n          lora_alpha: *alpha\n          lora_dropout: *dropout\n          init_lora_weights: *ilw\n          use_rslora: *ur\n          use_dora: *ud\n      - regex: '.*qkv_proj.*'\n        module_type: 'linear'\n        params:\n          adapter_name: lora\n          r: *r\n          lora_alpha: *alpha\n          lora_dropout: *dropout\n          init_lora_weights: *ilw\n          use_rslora: *ur\n          use_dora: *ud\n      - regex: '.*proj_\\d.*'\n        module_type: 'linear'\n        params:\n          adapter_name: lora\n          r: *r\n          lora_alpha: *alpha\n          lora_dropout: *dropout\n          init_lora_weights: *ilw\n          use_rslora: *ur\n          use_dora: *ud\n\nstats:\n  val: [ \"loss\"]\n  train: [\"loss\"]\n  checkpoint_metric: \"loss.total_loss\"\n  checkpoint_metric_max: false\n\nlm_eval_wrapper:\n  add_sot_token: true\n"
  },
  {
    "path": "projects/openelm/peft_configs/openelm_lora_270M_eval.yaml",
    "content": "# pytest: disable\n\ntaskname: '+ [OpenELM-LoRA-270M Eval]'\n\n_anchor_context_length: &_anchor_context_length 2048\n# actual vocab size is 32001 after adding padding token, so we add few extra tokens to make it more hardware friendly\n# for classification layer in LM model\n_anchor_vocab_size: &_anchor_vocab_size 32128 \n_anchor_padding_index: &_anchor_padding_index 32000\n\ncommon:\n  run_label: \"eval\"\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\n  mixed_precision_dtype: \"bfloat16\"\n\ndataset:\n  category: \"language_modeling\"\n  # NOTE: dataset paths are set by llmadapters-evaluation.dataset-dir.\n  # The default value is usually suitable.\n\nmodel:\n  activation_checkpointing: false\n  language_modeling:\n    name: \"general_gpt\"\n    general_gpt:\n      model_name: \"OpenELM-270M\"\n      vocab_size: *_anchor_vocab_size\n      max_context_length: *_anchor_context_length\n      padding_index: *_anchor_padding_index\n  lora:\n    use_lora: true\n    config:\n      - regex: '.*token_embedding.*'\n        module_type: 'embedding'\n        params:\n          adapter_name: lora\n          r: &r 32\n          lora_alpha: &alpha 32\n          lora_dropout: &dropout 0.1\n          init_lora_weights: &ilw true\n          use_rslora: &ur false\n          use_dora: &ud false\n      - regex: '.*out_proj.*'\n        module_type: 'linear'\n        params:\n          adapter_name: lora\n          r: *r\n          lora_alpha: *alpha\n          lora_dropout: *dropout\n          init_lora_weights: *ilw\n          use_rslora: *ur\n          use_dora: *ud\n      - regex: '.*qkv_proj.*'\n        module_type: 'linear'\n        params:\n          adapter_name: lora\n          r: *r\n          lora_alpha: *alpha\n          lora_dropout: *dropout\n          init_lora_weights: *ilw\n          use_rslora: *ur\n          use_dora: *ud\n      - regex: '.*proj_\\d.*'\n        module_type: 'linear'\n        params:\n          adapter_name: lora\n          r: *r\n          lora_alpha: *alpha\n          lora_dropout: *dropout\n          init_lora_weights: *ilw\n          use_rslora: *ur\n          use_dora: *ud\n\nlm_eval_wrapper:\n  add_sot_token: true\nllmadapters_evaluation:\n  multiple_choice: true\n"
  },
  {
    "path": "projects/openelm/peft_configs/openelm_lora_3B.yaml",
    "content": "# pytest: disable\n\ntaskname: '+ [OpenELM-LoRA-3B]'\n\n_anchor_context_length: &_anchor_context_length 2048\n# actual vocab size is 32001 after adding padding token, so we add few extra tokens to make it more hardware friendly\n# for classification layer in LM model\n_anchor_vocab_size: &_anchor_vocab_size 32128 \n_anchor_padding_index: &_anchor_padding_index 32000\n_anchor_forward_dtype: &_anchor_forward_dtype \"bfloat16\"\n_anchor_backward_dtype: &_anchor_backward_dtype \"float32\"\n\ncommon:\n  run_label: \"train\"\n  log_freq: 500\n  auto_resume: true\n  grad_clip: 1.0\n  save_all_checkpoints: true\n  save_interval_freq: 5000\n  eval_every_k_iterations: 10000\n  accum_freq: 2\n\ntrain_eval_pipeline:\n name: \"fsdp_train_eval_pipeline\"\n\nfsdp:\n  sharding_strategy: \"full_shard\"\n  parameter_datatype: *_anchor_forward_dtype\n  gradient_reduction_datatype: *_anchor_backward_dtype\n  buffer_datatype: *_anchor_forward_dtype\n  cpu_offload: false\n  limit_all_gathers: true\n\ndataset:\n  root_train: \"\"\n  disable_val: true\n  train_batch_size0: 8\n  workers: 4\n  persistent_workers: true\n  pin_memory: true\n\n  category: \"language_modeling\"\n  name: \"commonsense_170k\"\n  language_modeling:\n    commonsense_170k:\n      # Uncomment the below line and update the path to CommonSense170k.\n      # path: <PATH_TO_COMMONSENSE170K>\n    sequence_length: *_anchor_context_length\n    min_tokens_per_text: 0\n    min_characters_per_text: 0\n    shuffle_data: true\n\ntext_tokenizer:\n  name: \"sentence_piece\"\n  sentence_piece:\n    enable_nfc_normalization: true\n    append_sot_token: true\n    append_eot_token: true\n    # Uncomment the below line and update the path of LLAMA SentencePiece model file\n    # model_path: <PATH_OF_LLAMA_SPM_MODEL>\n\nloss:\n  category: \"language_modeling\"\n  language_modeling:\n    name: \"cross_entropy\"\n    cross_entropy:\n      ignore_index: *_anchor_padding_index\n      use_z_loss: true\n\noptim:\n  name: \"adamw\"\n  weight_decay: 0\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.95\n    eps: 1.e-8\n\nscheduler:\n  is_iteration_based: true\n  # Train for 3 epochs.\n  max_iterations: 4375\n  name: cosine\n  warmup_init_lr: 1.e-06\n  warmup_iterations: 1000\n  cosine:\n    max_lr: 0.0003\n    # papers use min_lr= 0.1 x max_lr\n    min_lr: 0.00003\n\nmodel:\n  # Allow reloading the pretrained model.\n  rename_scopes_map:\n    - ['token_embeddings.weight', 'token_embeddings.base_layer.weight']\n    - ['layers.(.*).qkv_proj.weight', 'layers.\\1.qkv_proj.base_layer.weight']\n    - ['layers.(.*).out_proj.weight', 'layers.\\1.out_proj.base_layer.weight']\n    - ['layers.(.*).proj_(\\d).weight', 'layers.\\1.proj_\\2.base_layer.weight']\n  ignore_missing_scopes:\n    - \".*lora.*\"\n  freeze_modules: [\".*base_layer.*\", \".*norm.*\"]\n  activation_checkpointing: true\n  language_modeling:\n    name: \"general_gpt\"\n    general_gpt:\n      model_name: \"OpenELM-3B\"\n      vocab_size: *_anchor_vocab_size\n      max_context_length: *_anchor_context_length\n      padding_index: *_anchor_padding_index\n  lora:\n    use_lora: true\n    config:\n      - regex: '.*token_embedding.*'\n        module_type: 'embedding'\n        params:\n          adapter_name: lora\n          r: &r 32\n          lora_alpha: &alpha 32\n          lora_dropout: &dropout 0.1\n          init_lora_weights: &ilw true\n          use_rslora: &ur false\n          use_dora: &ud false\n      - regex: '.*out_proj.*'\n        module_type: 'linear'\n        params:\n          adapter_name: lora\n          r: *r\n          lora_alpha: *alpha\n          lora_dropout: *dropout\n          init_lora_weights: *ilw\n          use_rslora: *ur\n          use_dora: *ud\n      - regex: '.*qkv_proj.*'\n        module_type: 'linear'\n        params:\n          adapter_name: lora\n          r: *r\n          lora_alpha: *alpha\n          lora_dropout: *dropout\n          init_lora_weights: *ilw\n          use_rslora: *ur\n          use_dora: *ud\n      - regex: '.*proj_\\d.*'\n        module_type: 'linear'\n        params:\n          adapter_name: lora\n          r: *r\n          lora_alpha: *alpha\n          lora_dropout: *dropout\n          init_lora_weights: *ilw\n          use_rslora: *ur\n          use_dora: *ud\n\nstats:\n  val: [ \"loss\"]\n  train: [\"loss\"]\n  checkpoint_metric: \"loss.total_loss\"\n  checkpoint_metric_max: false\n\nlm_eval_wrapper:\n  add_sot_token: true\n"
  },
  {
    "path": "projects/openelm/peft_configs/openelm_lora_450M.yaml",
    "content": "# pytest: disable\n\ntaskname: '+ [OpenELM-LoRA-450M]'\n\n_anchor_context_length: &_anchor_context_length 2048\n# actual vocab size is 32001 after adding padding token, so we add few extra tokens to make it more hardware friendly\n# for classification layer in LM model\n_anchor_vocab_size: &_anchor_vocab_size 32128 \n_anchor_padding_index: &_anchor_padding_index 32000\n\ncommon:\n  run_label: \"train\"\n  log_freq: 500\n  auto_resume: true\n  grad_clip: 1.0\n  save_all_checkpoints: true\n  save_interval_freq: 5000\n  eval_every_k_iterations: 10000\n  mixed_precision: true\n  mixed_precision_dtype: \"bfloat16\"\n  accum_freq: 2\n\ndataset:\n  root_train: \"\"\n  disable_val: true\n  train_batch_size0: 8\n  workers: 4\n  persistent_workers: true\n  pin_memory: true\n\n  category: \"language_modeling\"\n  name: \"commonsense_170k\"\n  language_modeling:\n    commonsense_170k:\n      # Uncomment the below line and update the path to CommonSense170k.\n      # path: <PATH_TO_COMMONSENSE170K>\n    sequence_length: *_anchor_context_length\n    min_tokens_per_text: 0\n    min_characters_per_text: 0\n    shuffle_data: true\n\ntext_tokenizer:\n  name: \"sentence_piece\"\n  sentence_piece:\n    enable_nfc_normalization: true\n    append_sot_token: true\n    append_eot_token: true\n    # Uncomment the below line and update the path of LLAMA SentencePiece model file\n    # model_path: <PATH_OF_LLAMA_SPM_MODEL>\n\nloss:\n  category: \"language_modeling\"\n  language_modeling:\n    name: \"cross_entropy\"\n    cross_entropy:\n      ignore_index: *_anchor_padding_index\n      use_z_loss: true\n\noptim:\n  name: \"adamw\"\n  weight_decay: 0\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.95\n    eps: 1.e-8\n\nscheduler:\n  is_iteration_based: true\n  # Train for 3 epochs.\n  max_iterations: 4375\n  name: cosine\n  warmup_init_lr: 1.e-06\n  warmup_iterations: 1000\n  cosine:\n    max_lr: 0.0003\n    # papers use min_lr= 0.1 x max_lr\n    min_lr: 0.00003\n\nmodel:\n  # Allow reloading the pretrained model.\n  rename_scopes_map:\n    - ['token_embeddings.weight', 'token_embeddings.base_layer.weight']\n    - ['layers.(.*).qkv_proj.weight', 'layers.\\1.qkv_proj.base_layer.weight']\n    - ['layers.(.*).out_proj.weight', 'layers.\\1.out_proj.base_layer.weight']\n    - ['layers.(.*).proj_(\\d).weight', 'layers.\\1.proj_\\2.base_layer.weight']\n  ignore_missing_scopes:\n    - \".*lora.*\"\n  freeze_modules: [\".*base_layer.*\", \".*norm.*\"]\n  activation_checkpointing: true\n  language_modeling:\n    name: \"general_gpt\"\n    general_gpt:\n      model_name: \"OpenELM-450M\"\n      vocab_size: *_anchor_vocab_size\n      max_context_length: *_anchor_context_length\n      padding_index: *_anchor_padding_index\n  lora:\n    use_lora: true\n    config:\n      - regex: '.*token_embedding.*'\n        module_type: 'embedding'\n        params:\n          adapter_name: lora\n          r: &r 32\n          lora_alpha: &alpha 32\n          lora_dropout: &dropout 0.1\n          init_lora_weights: &ilw true\n          use_rslora: &ur false\n          use_dora: &ud false\n      - regex: '.*out_proj.*'\n        module_type: 'linear'\n        params:\n          adapter_name: lora\n          r: *r\n          lora_alpha: *alpha\n          lora_dropout: *dropout\n          init_lora_weights: *ilw\n          use_rslora: *ur\n          use_dora: *ud\n      - regex: '.*qkv_proj.*'\n        module_type: 'linear'\n        params:\n          adapter_name: lora\n          r: *r\n          lora_alpha: *alpha\n          lora_dropout: *dropout\n          init_lora_weights: *ilw\n          use_rslora: *ur\n          use_dora: *ud\n      - regex: '.*proj_\\d.*'\n        module_type: 'linear'\n        params:\n          adapter_name: lora\n          r: *r\n          lora_alpha: *alpha\n          lora_dropout: *dropout\n          init_lora_weights: *ilw\n          use_rslora: *ur\n          use_dora: *ud\n\nstats:\n  val: [ \"loss\"]\n  train: [\"loss\"]\n  checkpoint_metric: \"loss.total_loss\"\n  checkpoint_metric_max: false\n\nlm_eval_wrapper:\n  add_sot_token: true\n"
  },
  {
    "path": "projects/openelm/pretraining_configs/openelm_1_1B.yaml",
    "content": "# pytest: disable\n\ntaskname: '+ [OpenELM-1.1B]'\n\n_anchor_context_length: &_anchor_context_length 2048\n# actual vocab size is 32001 after adding padding token, so we add few extra tokens to make it more hardware friendly\n# for classification layer in LM model\n_anchor_vocab_size: &_anchor_vocab_size 32128 \n_anchor_padding_index: &_anchor_padding_index 32000\n_anchor_forward_dtype: &_anchor_forward_dtype \"bfloat16\"\n_anchor_backward_dtype: &_anchor_backward_dtype \"float32\"\n\ncommon:\n  run_label: \"train\"\n  log_freq: 500\n  auto_resume: true\n  grad_clip: 1.0\n  save_all_checkpoints: true\n  save_interval_freq: 5000\n  eval_every_k_iterations: 10000\n  mixed_precision: true\n  mixed_precision_dtype: \"bfloat16\"\n\ndataset:\n  root_train: \"\"\n  disable_val: true\n  # effective batch size is ~4M tokens (16 sequences x 8 A100 80 GB GPUs x 16 nodes x 2048 tokens per seq )\n  # we use more nodes here because FSDP is not used.\n  train_batch_size0: 16\n  workers: 4\n  persistent_workers: true\n  pin_memory: true\n\n  # dataset details\n  category: \"language_modeling\"\n  name: \"general_lm\"\n  language_modeling:\n    sequence_length: *_anchor_context_length\n    # filter text that have less than 256 tokens after tokenization to avoid excessive padding\n    min_tokens_per_text: 256\n    # filter text that have less than 200 characters before tokenization\n    min_characters_per_text: 200\n    shuffle_data: true\n    general_lm:\n      train_data_info: [\n        {\n        # Uncomment below line and add path to parquet, jsonl, and json.gz files from pre-training corpora.\n        # We expect the path to be of the form \"/path/to/train-{file_id:05d}-05534.parquet\n          # \"file_name\": PATH_TO_PARQUET_FILES.\n          \"text_key\": \"content\",\n          \"file_id_range\": [0, 5535], \n        },\n      ]\n\ntext_tokenizer:\n  name: \"sentence_piece\"\n  sentence_piece:\n    enable_nfc_normalization: true\n    append_sot_token: true\n    append_eot_token: true\n    # Uncomment the below line and update the path of LLAMA SentencePiece model file\n    # model_path: <PATH_OF_LLAMA_SPM_MODEL>\n\n\nloss:\n  category: \"language_modeling\"\n  language_modeling:\n    name: \"cross_entropy\"\n    cross_entropy:\n      ignore_index: *_anchor_padding_index\n      use_z_loss: true\n\noptim:\n  name: \"adamw\"\n  weight_decay: 0.1\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.95\n    eps: 1.e-8\n\nscheduler:\n  is_iteration_based: true\n  # Train for about 1.4-1.5T tokens\n  max_iterations: 350000 \n  name: cosine\n  warmup_init_lr: 1.e-06\n  # warm-up for about 20B tokens (5000 * 4M tokens per iteration)\n  warmup_iterations: 5000\n  cosine:\n    max_lr: 0.0024\n    # papers use min_lr= 0.1 x max_lr\n    min_lr: 0.00024\n\nmodel:\n  activation_checkpointing: true\n  language_modeling:\n    name: \"general_gpt\"\n    general_gpt:\n      model_name: \"OpenELM-1_1B\"\n      vocab_size: *_anchor_vocab_size\n      max_context_length: *_anchor_context_length\n      padding_index: *_anchor_padding_index\n\nstats:\n  val: [ \"loss\"]\n  train: [\"loss\"]\n  checkpoint_metric: \"loss.total_loss\"\n  checkpoint_metric_max: false\n"
  },
  {
    "path": "projects/openelm/pretraining_configs/openelm_270M.yaml",
    "content": "# pytest: disable\n\ntaskname: '+ [OpenELM-270M]'\n\n_anchor_context_length: &_anchor_context_length 2048\n# actual vocab size is 32001 after adding padding token, so we add few extra tokens to make it more hardware friendly\n# for classification layer in LM model\n_anchor_vocab_size: &_anchor_vocab_size 32128 \n_anchor_padding_index: &_anchor_padding_index 32000\n\ncommon:\n  run_label: \"train\"\n  log_freq: 500\n  auto_resume: true\n  grad_clip: 1.0\n  save_all_checkpoints: true\n  save_interval_freq: 5000\n  eval_every_k_iterations: 10000\n  mixed_precision: true\n  mixed_precision_dtype: \"bfloat16\"\n\ndataset:\n  root_train: \"\"\n  disable_val: true\n  # effective batch size is ~4M tokens (16 sequences x 8 A100 80 GB GPUs x 16 nodes x 2048 tokens per seq )\n  # we use more nodes here because FSDP + Activation checkpointing are not used.\n  train_batch_size0: 16\n  workers: 4\n  persistent_workers: true\n  pin_memory: true\n\n  category: \"language_modeling\"\n  name: \"general_lm\"\n  language_modeling:\n    sequence_length: *_anchor_context_length\n    # filter text that have less than 512 tokens after tokenization to avoid excessive padding\n    min_tokens_per_text: 256\n    # filter text that have less than 200 characters before tokenization\n    min_characters_per_text: 200\n    shuffle_data: true\n    general_lm:\n      train_data_info: [\n        {\n        # Uncomment below line and add path to parquet, jsonl, and json.gz files from pre-training corpora.\n        # We expect the path to be of the form \"/path/to/train-{file_id:05d}-05534.parquet\n          # \"file_name\": PATH_TO_PARQUET_FILES.\n          \"text_key\": \"content\",\n          \"file_id_range\": [0, 5535], \n        },\n      ]\n\ntext_tokenizer:\n  name: \"sentence_piece\"\n  sentence_piece:\n    enable_nfc_normalization: true\n    append_sot_token: true\n    append_eot_token: true\n    # Uncomment the below line and update the path of LLAMA SentencePiece model file\n    # model_path: <PATH_OF_LLAMA_SPM_MODEL>\n\nloss:\n  category: \"language_modeling\"\n  language_modeling:\n    name: \"cross_entropy\"\n    cross_entropy:\n      ignore_index: *_anchor_padding_index\n      use_z_loss: true\n\noptim:\n  name: \"adamw\"\n  weight_decay: 0.1\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.95\n    eps: 1.e-8\n\nscheduler:\n  is_iteration_based: true\n  # Train for about 1.4-1.5T tokens\n  max_iterations: 350000 \n  name: cosine\n  warmup_init_lr: 1.e-06\n  # warm-up for about 20B tokens (5000 * 4M tokens per iteration)\n  warmup_iterations: 5000\n  cosine:\n    max_lr: 0.0053\n    # papers use min_lr= 0.1 x max_lr\n    min_lr: 0.00053\n\nmodel:\n  activation_checkpointing: false\n  language_modeling:\n    name: \"general_gpt\"\n    general_gpt:\n      model_name: \"OpenELM-270M\"\n      vocab_size: *_anchor_vocab_size\n      max_context_length: *_anchor_context_length\n      padding_index: *_anchor_padding_index\n\nstats:\n  val: [ \"loss\"]\n  train: [\"loss\"]\n  checkpoint_metric: \"loss.total_loss\"\n  checkpoint_metric_max: false\n"
  },
  {
    "path": "projects/openelm/pretraining_configs/openelm_3B.yaml",
    "content": "# pytest: disable\n\ntaskname: '+ [OpenELM-3B]'\n\n_anchor_context_length: &_anchor_context_length 2048\n# actual vocab size is 32001 after adding padding token, so we add few extra tokens to make it more hardware friendly\n# for classification layer in LM model\n_anchor_vocab_size: &_anchor_vocab_size 32128 \n_anchor_padding_index: &_anchor_padding_index 32000\n_anchor_forward_dtype: &_anchor_forward_dtype \"bfloat16\"\n_anchor_backward_dtype: &_anchor_backward_dtype \"float32\"\n\ncommon:\n  run_label: \"train\"\n  log_freq: 500\n  auto_resume: true\n  grad_clip: 1.0\n  save_all_checkpoints: true\n  save_interval_freq: 5000\n  eval_every_k_iterations: 10000\n\ntrain_eval_pipeline:\n name: \"fsdp_train_eval_pipeline\"\n\nfsdp:\n  sharding_strategy: \"full_shard\"\n  parameter_datatype: *_anchor_forward_dtype\n  gradient_reduction_datatype: *_anchor_backward_dtype\n  buffer_datatype: *_anchor_forward_dtype\n  cpu_offload: false\n  limit_all_gathers: true\n\ndataset:\n  root_train: \"\"\n  disable_val: true\n  # effective batch size is ~4M tokens (16 sequences x 8 H100 80 GB GPUs x 16 nodes x 2048 tokens per seq )\n  train_batch_size0: 16\n  workers: 4\n  persistent_workers: true\n  pin_memory: true\n  # dataset details\n  category: \"language_modeling\"\n  name: \"general_lm\"\n  language_modeling:\n    sequence_length: *_anchor_context_length\n    # filter text that have less than 256 tokens after tokenization to avoid excessive padding\n    min_tokens_per_text: 256\n    # filter text that have less than 200 characters before tokenization\n    min_characters_per_text: 200\n    shuffle_data: true\n    general_lm:\n      train_data_info: [\n        {\n        # Uncomment below line and add path to parquet, jsonl, and json.gz files from pre-training corpora.\n        # We expect the path to be of the form \"/path/to/train-{file_id:05d}-05534.parquet\n          # \"file_name\": PATH_TO_PARQUET_FILES.\n          \"text_key\": \"content\",\n          \"file_id_range\": [0, 5535], \n        },\n      ]\n\ntext_tokenizer:\n  name: \"sentence_piece\"\n  sentence_piece:\n    enable_nfc_normalization: true\n    append_sot_token: true\n    append_eot_token: true\n    # Uncomment the below line and update the path of LLAMA SentencePiece model file\n    # model_path: <PATH_OF_LLAMA_SPM_MODEL>\n\nloss:\n  category: \"language_modeling\"\n  language_modeling:\n    name: \"cross_entropy\"\n    cross_entropy:\n      ignore_index: *_anchor_padding_index\n      use_z_loss: true\n\noptim:\n  name: \"adamw\"\n  weight_decay: 0.1\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.95\n    eps: 1.e-8\n\nscheduler:\n  is_iteration_based: true\n  # Train for about 1.4-1.5T tokens\n  max_iterations: 350000 \n  name: cosine\n  warmup_init_lr: 1.e-06\n  # warm-up for about 20B tokens (5000 * 4M tokens per iteration)\n  warmup_iterations: 5000\n  cosine:\n    max_lr: 0.0012\n    # papers use min_lr= 0.1 x max_lr\n    min_lr: 0.00012\n\nmodel:\n  activation_checkpointing: true\n  language_modeling:\n    name: \"general_gpt\"\n    general_gpt:\n      model_name: \"OpenELM-3B\"\n      vocab_size: *_anchor_vocab_size\n      max_context_length: *_anchor_context_length\n      padding_index: *_anchor_padding_index\n\nstats:\n  val: [ \"loss\"]\n  train: [\"loss\"]\n  checkpoint_metric: \"loss.total_loss\"\n  checkpoint_metric_max: false\n\n"
  },
  {
    "path": "projects/openelm/pretraining_configs/openelm_450M.yaml",
    "content": "# pytest: disable\n\ntaskname: '+ [OpenELM-450M]'\n\n_anchor_context_length: &_anchor_context_length 2048\n# actual vocab size is 32001 after adding padding token, so we add few extra tokens to make it more hardware friendly\n# for classification layer in LM model\n_anchor_vocab_size: &_anchor_vocab_size 32128 \n_anchor_padding_index: &_anchor_padding_index 32000\n\ncommon:\n  run_label: \"train\"\n  log_freq: 500\n  auto_resume: true\n  grad_clip: 1.0\n  save_all_checkpoints: true\n  save_interval_freq: 5000\n  eval_every_k_iterations: 10000\n  mixed_precision: true\n  mixed_precision_dtype: \"bfloat16\"\n\ndataset:\n  root_train: \"\"\n  disable_val: true\n  # effective batch size is ~4M tokens (16 sequences x 8 H100 80 GB GPUs x 16 nodes x 2048 tokens per seq )\n  # we use more nodes here because FSDP is not used.\n  train_batch_size0: 16\n  workers: 4\n  persistent_workers: true\n  pin_memory: true\n\n  # dataset details\n  category: \"language_modeling\"\n  name: \"general_lm\"\n  language_modeling:\n    sequence_length: *_anchor_context_length\n    # filter text that have less than 256 tokens after tokenization to avoid excessive padding\n    min_tokens_per_text: 256\n    # filter text that have less than 200 characters before tokenization\n    min_characters_per_text: 200\n    shuffle_data: true\n    general_lm:\n      train_data_info: [\n        {\n        # Uncomment below line and add path to parquet, jsonl, and json.gz files from pre-training corpora.\n        # We expect the path to be of the form \"/path/to/train-{file_id:05d}-05534.parquet\n          # \"file_name\": PATH_TO_PARQUET_FILES.\n          \"text_key\": \"content\",\n          \"file_id_range\": [0, 5535], \n        },\n      ]\n\ntext_tokenizer:\n  name: \"sentence_piece\"\n  sentence_piece:\n    enable_nfc_normalization: true\n    append_sot_token: true\n    append_eot_token: true\n    # Uncomment the below line and update the path of LLAMA SentencePiece model file\n    # model_path: <PATH_OF_LLAMA_SPM_MODEL>\n\nloss:\n  category: \"language_modeling\"\n  language_modeling:\n    name: \"cross_entropy\"\n    cross_entropy:\n      ignore_index: *_anchor_padding_index\n      use_z_loss: true\n\noptim:\n  name: \"adamw\"\n  weight_decay: 0.1\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.95\n    eps: 1.e-8\n\nscheduler:\n  is_iteration_based: true\n  # Train for about 1.4-1.5T tokens\n  max_iterations: 350000 \n  name: cosine\n  warmup_init_lr: 1.e-06\n  # warm-up for about 20B tokens (5000 * 4M tokens per iteration)\n  warmup_iterations: 5000\n  cosine:\n    max_lr: 0.0039\n    # papers use min_lr= 0.1 x max_lr\n    min_lr: 0.00039\n\nmodel:\n  activation_checkpointing: true\n  language_modeling:\n    name: \"general_gpt\"\n    general_gpt:\n      model_name: \"OpenELM-450M\"\n      vocab_size: *_anchor_vocab_size\n      max_context_length: *_anchor_context_length\n      padding_index: *_anchor_padding_index\n\nstats:\n  val: [ \"loss\"]\n  train: [\"loss\"]\n  checkpoint_metric: \"loss.total_loss\"\n  checkpoint_metric_max: false\n"
  },
  {
    "path": "projects/range_augment/README-classification.md",
    "content": "# Training Classification Models with RangeAugment\n\n## Training on the ImageNet dataset\n\nSingle node 8 A100 GPU training of different mobile and non-mobile classification backbones studied in RangeAugment paper \ncan be done using below command:\n\n```bash \nexport CFG_FILE=\"PATH_TO_MODEL_CONFIGURATION_FILE\"\ncorenet-train --common.config-file $CFG_FILE --common.results-loc classification_results\n```\n\nPlease see [classification](./classification) folder for configuration files of different models.\n\n***Note***: Do not forget to change the training and validation dataset locations in configuration files.\n\n## Evaluating the classification model\n\nEvaluation can be done using the below command:\n\n```bash\n export CFG_FILE=\"PATH_TO_MODEL_CONFIGURATION_FILE\"\n export MODEL_WEIGHTS=\"PATH_TO_MODEL_WEIGHTS_FILE\"\n export DATASET_PATH=\"PATH_TO_DATASET\"\n CUDA_VISIBLE_DEVICES=0 corenet-eval --common.config-file $CFG_FILE --common.results-loc classification_results --model.classification.pretrained $MODEL_WEIGHTS --common.override-kwargs dataset.root_val=$DATASET_PATH\n```\n\n## Results on the ImageNet dataset\n\n| Model             | Top-1 | Config                                                            | Weights                                                                                                   | Logs                                                                                                              | \n|-------------------|-------|-------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------|\n| MobileNetv1-1.0   | 73.8  | [MV1-1.0-config](classification/mobilenet_v1.yaml)              | [MV1-1.0-WT](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/mobilenetv1_1.0.pt)     | [MV1-1.0-Logs](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/mobilenetv1_1.0_logs.txt)     |\n| MobileNetv2-1.0   | 73.0  | [MV2-1.0-config](classification/mobilenet_v2.yaml)              | [MV2-1.0-WT](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/mobilenetv2_1.0.pt)     | [MV2-1.0-Logs](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/mobilenetv2_1.0_logs.txt)     |\n| MobileNetv3-Large | 75.1  | [MV3-Large-config](classification/mobilenet_v3.yaml)            | [MV3-Large-WT](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/mobilenetv3_large.pt) | [MV3-Large-Logs](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/mobilenetv3_large_logs.txt) |\n| MobileViTv1-Small | 78.2  | [MViT-Small-config](classification/mobilevit_v1.yaml)           | [MViT-Small-WT](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/mobilevit_small.pt)  | [MViT-Small-Logs](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/mobilevit_small_logs.txt)  |\n| EfficientNet-B0      | 77.3  | [EB0-config](classification/efficientnet_b0.yaml)               | [EB0-WT](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/efficientnet_b0.pt)         | [EB0-Logs](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/efficientnet_b0_logs.txt)         |\n| EfficientNet-B1      | 79.5  | [EB1-config](classification/efficientnet_b1.yaml)               | [EB1-WT](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/efficientnet_b1.pt)         | [EB1-Logs](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/efficientnet_b1_logs.txt)         |\n| EfficientNet-B2      | 81.3  | [EB2-config](classification/efficientnet_b2.yaml)               | [EB2-WT](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/efficientnet_b2.pt)         | [EB2-Logs](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/efficientnet_b2_logs.txt)         |\n| EfficientNet-B3      | 81.9  | [EB3-config](classification/efficientnet_b3.yaml)               | [EB3-WT](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/efficientnet_b3.pt)         | [EB3-Logs](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/efficientnet_b3_logs.txt)         |\n| ResNet-50            | 80.2  | [R50-config](classification/resnet_50.yaml)                     | [R50-WT](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/resnet_50.pt)               | [R50-Logs](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/resnet_50_logs.txt)               |\n| ResNet-101           | 81.9  | [R101-config](classification/resnet_101.yaml)                   | [R101-WT](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/resnet_101.pt)             | [R50-Logs](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/resnet_101_logs.txt)              |\n| SwinTransformer-Tiny | 81.1  | [Swin-Tiny-config](classification/swin_transformer_tiny.yaml)   | [Swin-Tiny-WT](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/swin_tiny.pt)         | [Swin-Tiny-Logs](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/swin_tiny_logs.txt)         |\n| SwinTransformer-Small | 82.8  | [Swin-Small-config](classification/swin_transformer_small.yaml) | [Swin-Small-WT](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/swin_small.pt)      | [Swin-Small-Logs](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/swin_small_logs.txt)       |\n\n ***Note:*** For MobileViT, we report results with EMA (as suggested in the paper) while for other models, we use the best checkpoint.\n"
  },
  {
    "path": "projects/range_augment/README-clip.md",
    "content": "# Training CLIP Models with RangeAugment\n\n## Image-text dataset preparation\n\nTo prepare the dataset, see the documentation in the [img_text_tar_dataset.py](../../corenet/data/datasets/multi_modal_img_text/img_text_tar_dataset.py) file.\n\n## Training CLIP on image-text pair dataset\n\nCLIP leverages our custom ViT implementation that can be used with multi-scale variable batch sampler. CLIP models are \ntrained on multiple nodes, each node with multiple GPUs. Please see comments in configuration files for exact number of \nGPUs and nodes used in our experiments.\n\n\nAn example command for training on `i-th` node is\n```bash\nexport CFG_FILE=\"PATH_TO_MODEL_CONFIGURATION_FILE\"\nexport RANK=<NODE_ID> * <NUM_GPUS_PER_NODE> # For Node-0, RANK=0; For Node-1, Rank=8, For Node-2, RANK=16, and so on.\nexport WORLD_SIZE=<NUM_NODES> * <NUM_GPUS_PER_NODE> # WORLD_SIZE=32 nodes * 8 GPUS per node = 256\ncorenet-train --common.config-file $CFG_FILE --common.results-loc results_clip --ddp.rank $RANK --ddp.world-size $WORLD_SIZE --ddp.dist-url 'tcp://IP_OF_NODE0:FREEPORT'\n```\n\n***Note***: Do not forget to change the training and validation dataset locations in configuration files.\n\n## Zero-shot evaluation of CLIP models on the ImageNet dataset\n\nCLIP model with ViT-B image backbone can be evaluated at an input resolution of 224x224 using below shell script:\n\n```bash\nexport CONFIG_FILE=\"projects/range_augment/clip/clip_vit_base.yaml\"\nexport MODEL_WEIGHTS=https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/clip/clip_vit_base_16.pt\nexport DATASET_PATH=\"/mnt/vision_datasets/imagenet/validation/\" # change to the ImageNet validation path\nCUDA_VISIBLE_DEVICES=0 corenet-eval --common.config-file $CONFIG_FILE --model.multi-modal-image-text.pretrained $MODEL_WEIGHTS --common.override-kwargs dataset.multi_modal_img_text.zero_shot_img_cls_dataset_name=\"imagenet\" dataset.root_val=$DATASET_PATH\n```\n\n## Results\n\nWe should get the following zero-shot top-1 accuracy when CLIP models are evaluated on the ImageNet at different input resolutions.\n\n| Model            | 160   | 192   | 224   | 256   | 288   | Config                                          | Weights                                                                                             | Logs                                                                                                       |\n|------------------|-------|-------|-------|-------|-------|-------------------------------------------------|-----------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------|\n| CLIP w/ ViT-B/16 | 69.26 | 71.07 | 71.84 | 72.34 | 72.82 | [CLIP-ViT-B/16_Config](clip/clip_vit_base.yaml) | [CLIP-ViT-B/16_Wts](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/clip/clip_vit_base_16.pt) | [CLIP-ViT-B/16_Logs](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/clip/clip_vit_base_16_logs.txt) |\n| CLIP w/ ViT-H/16 | 76.13 | 77.35 | 77.92 | 78.41 | 78.56 | [CLIP-ViT-H/16_Config](clip/clip_vit_huge.yaml) | [CLIP-ViT-H/16_Wts](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/clip/clip_vit_huge_16.pt) | [CLIP-ViT-H/16_Logs](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/clip/clip_vit_huge_16_logs.txt) |\n\n***Note:*** For CLIP models, we found EMA and best checkpoints deliver similar performance. Here, we report the results for best checkpoint.\n\n## Fine-tuning CLIP on the ImageNet dataset\n\nConfiguration files for fine-tuning clip model are [here](./clip_finetune_imagenet/). Please follow instructions for training and evaluation in the [classification readme file](README-classification.md).\n\nWe finetune the ViT backbone from CLIP model on the ImageNet dataset for 10 epochs. Below are the results:\n\n| Model    | Top-1 @ 224x224 | Config                                                               | Weights         | Logs                                                                                                             |\n|----------|-----------------|----------------------------------------------------------------------|-----------------|------------------------------------------------------------------------------------------------------------------|\n| ViT-B/16 | 84.31           | [CLIP-ViT-B/16_FT_Config](clip_finetune_imagenet/clip_vit_base.yaml) | [CLIP-ViT-B/16_FT_Wts](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/clip/vit_base_16_ft_in1k.pt) | [CLIP-ViT-B/16_FT_Logs](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/clip/vit_huge_16_ft_in1k_logs.txt) |\n| ViT-H/16 | 86.90           | [CLIP-ViT-H/16_FT_Config](clip_finetune_imagenet/clip_vit_huge.yaml) | [CLIP-ViT-H/16_FT_Wts](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/clip/vit_huge_16_ft_in1k.pt) | [CLIP-ViT-H/16_FT_Logs](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/clip/vit_base_16_ft_in1k_logs.txt) |\n"
  },
  {
    "path": "projects/range_augment/README-distillation.md",
    "content": "# Distillation with RangeAugment\n\nWe use ResNet-101 trained with RangeAugment as a teacher and trained four mobile models using knowledge distillation. The config files used in our distillation experiments are [here](distillation). Please follow instructions [here](README-classification.md) for training and evaluation on the ImageNet dataset.\n\n## Results on the ImageNet dataset\n\n| Student Model | Top-1 (ERM) | Top-1 (Distillation) | Config                                                                        | Weights                                                                                                                        | Logs                                                                                                                                  |\n| --- |----------------------|---------------------|-------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------|\n| MobileNetv1 | 73.8 | 75.2  | [Distil-MV1-config](distillation/teacher_resnet101_student_mobilenet_v1.yaml) | [Distil-MV1-Wts](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/distillation/teacher_resnet101_student_mobilenet_v1.pt) | [Distil-MV1-Logs](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/distillation/teacher_resnet101_student_mobilenet_v1_logs.txt) |\n| MobileNetv2 | 73.0 | 73.4  | [Distil-MV2-config](distillation/teacher_resnet101_student_mobilenet_v2.yaml) | [Distil-MV2-Wts](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/distillation/teacher_resnet101_student_mobilenet_v2.pt) | [Distil-MV2-Logs](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/distillation/teacher_resnet101_student_mobilenet_v2_logs.txt) |\n| MobileNetv3 | 75.1 | 76.0  | [Distil-MV3-config](distillation/teacher_resnet101_student_mobilenet_v3.yaml) | [Distil-MV3-Wts](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/distillation/teacher_resnet101_student_mobilenet_v3.pt) | [Distil-MV3-Logs](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/distillation/teacher_resnet101_student_mobilenet_v3_logs.txt) |\n| MobileViT | 78.2 | 79.4  | [Distil-MViT-config](distillation/teacher_resnet101_student_mobilevit.yaml)   | [Distil-MViT-Wts](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/distillation/teacher_resnet101_student_mobilevit.pt)   | [Distil-MViT-Logs](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/distillation/teacher_resnet101_student_mobilevit_logs.txt)   |\n\n***Note***:\n   * ERM results are from [here](README-classification.md)\n   * For MobileViT, we use EMA checkpoint (as suggested in the paper).\n"
  },
  {
    "path": "projects/range_augment/README-object-detection.md",
    "content": "# Training Mask R-CNN for object detection and instance segmentation with RangeAugment\n\n## Training Mask R-CNN on the MS-COCO dataset\n\nSingle node `8 A100 GPU` training of different mobile and non-mobile backbones with Mask R-CNN \ncan be done using below command:\n\n``` \nexport CFG_FILE=\"PATH_TO_MODEL_CONFIGURATION_FILE\"\ncorenet-train --common.config-file $CFG_FILE --common.results-loc detection_results\n```\n\nPlease see [detection](./detection) folder for configuration files of different models.\n\n***Note***: Do not forget to change the training and validation dataset locations in configuration files.\n\n## Evaluating the detection model\n\nEvaluation on the validation set can be done using the below command:\n\n```bash\n export CFG_FILE=\"PATH_TO_MODEL_CONFIGURATION_FILE\"\n export MODEL_WEIGHTS=\"PATH_TO_MODEL_WEIGHTS_FILE\"\n export DATASET_PATH=\"PATH_TO_DATASET\"\n CUDA_VISIBLE_DEVICES=0 corenet-eval-det --common.config-file $CFG_FILE \\\n --common.results-loc seg_results \\\n --model.detection.pretrained $MODEL_WEIGHTS --evaluation.detection.resize-input-images \\\n --evaluation.detection.mode validation_set \\\n --common.override-kwargs dataset.root_val=$DATASET_PATH\n```\n\n## Results on the MS-COCO dataset\n\n| Backbone             | BBox mAP | Seg mAP | Config                                                         | Weights                                                                                                                         | Logs                                                                                                                   |\n|----------------------|----------|---------|----------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------|\n| MobileNetv1-1.0      | 39.4     | 35.6    | [MaskRCNN-MV1-config](detection/maskrcnn_mobilenet_v1.yaml)    | [MaskRCNN-MV1-Wts](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/detection/maskrcnn_mobilenet_v1.pt)    | [MaskRCNN-MV1-Logs](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/detection/maskrcnn_mobilenet_v1_logs.txt)    |\n| MobileNetv2-1.0      | 38.4     | 34.7    | [MaskRCNN-MV2-config](detection/maskrcnn_mobilenet_v2.yaml)    | [MaskRCNN-MV2-Wts](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/detection/maskrcnn_mobilenet_v2.pt)    | [MaskRCNN-MV2-Logs](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/detection/maskrcnn_mobilenet_v2_logs.txt)    |\n| MobileNetv3-Large    | 35.6     | 32.5    | [MaskRCNN-MV3-config](detection/maskrcnn_mobilenet_v3.yaml)    | [MaskRCNN-MV3-Wts](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/detection/maskrcnn_mobilenet_v3.pt)    | [MaskRCNN-MV3-Logs](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/detection/maskrcnn_mobilenet_v3_logs.txt)    |\n| MobileViT-Small      | 42.0     | 37.7    | [MaskRCNN-MViT-config](detection/maskrcnn_mobilevit.yaml)      | [MaskRCNN-MViT-Wts](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/detection/maskrcnn_mobilevit.pt)    | [MaskRCNN-MV3-Logs](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/detection/maskrcnn_mobilevit_logs.txt)       |\n| EfficientNet-B3      | 44.5     | 39.5    | [MaskRCNN-EB3-config](detection/maskrcnn_efficientnet_b3.yaml) | [MaskRCNN-EB3-Wts](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/detection/maskrcnn_efficientnet_b3.pt) | [MaskRCNN-EB3-Logs](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/detection/maskrcnn_efficientnet_b3_logs.txt) |\n| ResNet-50            | 44.0     | 39.5    | [MaskRCNN-R50-config](detection/maskrcnn_resnet_50.yaml)       | [MaskRCNN-R50-Wts](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/detection/maskrcnn_resnet_50.pt)  | [MaskRCNN-R50-Logs](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/detection/maskrcnn_resnet_50_logs.txt)       |\n| ResNet-101           | 46.1     | 41.1    | [MaskRCNN-R101-config](detection/maskrcnn_resnet_101.yaml)     | [MaskRCNN-R101-Wts](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/detection/maskrcnn_resnet_101.pt)     | [MaskRCNN-R101-Logs](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/detection/maskrcnn_resnet_101_logs.txt)     |\n\n\n## Demo\n\n```bash\n export IMG_PATH=\"http://farm2.staticflickr.com/1173/678795137_bb1a91f659_z.jpg\"\n export CFG_FILE=\"projects/range_augment/detection/maskrcnn_resnet_50.yaml\"\n export MODEL_WEIGHTS=\"https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/detection/maskrcnn_resnet_50.pt\"\n corenet-eval-det --common.config-file $CFG_FILE \\\n --common.results-loc results \\\n --model.detection.pretrained $MODEL_WEIGHTS \\\n --model.detection.n-classes 81 \\\n --evaluation.detection.resize-input-images \\\n --evaluation.detection.mode single_image \\\n --evaluation.detection.path \"${IMG_PATH}\" \\\n --model.detection.mask-rcnn.box-score-thresh 0.7\n```\n\n***Notes***\n   * Adjust the value of bounding box threshold using `--model.detection.mask-rcnn.box-score-thresh` to control the number of boxes and mask instances to be displayed. \n   * If running on CPU, please disable mixed precision by adding following arguments to above command `--common.override-kwargs common.mixed_precision=false`\n"
  },
  {
    "path": "projects/range_augment/README-segmentation.md",
    "content": "# Training Segmentations Models with RangeAugment\n\n## Training DeepLabv3 on the ADE20k and PASCAL VOC datasets\n\nSingle node `1 A100 GPU` training of different mobile and non-mobile backbones with Deeplabv3 segmentation head \ncan be done using below command:\n\n``` \nexport CFG_FILE=\"PATH_TO_MODEL_CONFIGURATION_FILE\"\ncorenet-train --common.config-file $CFG_FILE --common.results-loc segmentation_results\n```\n\nPlease see [ade20k](./segmentation/ade20k) and [pascal_voc](./segmentation/pascal_voc) folder for configuration files of different models.\n\n***Note***: Do not forget to change the training and validation dataset locations in configuration files.\n\n## Evaluating the segmentation model\n\nEvaluation on the validation set can be done using the below command:\n\n```bash\nexport CFG_FILE=\"PATH_TO_MODEL_CONFIGURATION_FILE\"\nexport MODEL_WEIGHTS=\"PATH_TO_MODEL_WEIGHTS_FILE\"\nCUDA_VISIBLE_DEVICES=0 corenet-eval-seg --common.config-file $CFG_FILE --common.results-loc seg_results --model.segmentation.pretrained $MODEL_WEIGHTS\n```\n\n## Results on the ADE20k dataset\n\n| Backbone             | Top-1 | Config                                                                     | Weights                                                                                                                     | Logs                                                                                                                               |\n|----------------------|-------|----------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------|\n| MobileNetv1-1.0      | 39.4  | [DeepLabv3-MV1-config](segmentation/ade20k/deeplabv3_mobilenet_v1.yaml)    | [DeepLabv3-MV1-Wts](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/segmentation/ade20k/deeplabv3_mobilenet_v1.pt)    | [DeepLabv3-MV1-Logs](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/segmentation/ade20k/deeplabv3_mobilenet_v1_logs.txt)    |\n| MobileNetv2-1.0      | 38.6  | [DeepLabv3-MV2-config](segmentation/ade20k/deeplabv3_mobilenet_v2.yaml)    | [DeepLabv3-MV2-Wts](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/segmentation/ade20k/deeplabv3_mobilenet_v2.pt)    | [DeepLabv3-MV2-Logs](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/segmentation/ade20k/deeplabv3_mobilenet_v2_logs.txt)    |\n| MobileNetv3-Large    | 38.9  | [DeepLabv3-MV3-config](segmentation/ade20k/deeplabv3_mobilenet_v3.yaml)    | [DeepLabv3-MV3-Wts](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/segmentation/ade20k/deeplabv3_mobilenet_v3.pt)    | [DeepLabv3-MV3-Logs](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/segmentation/ade20k/deeplabv3_mobilenet_v3_logs.txt)    |\n| MobileViTv1-Small    | 38.5  | [DeepLabv3-MViT-config](segmentation/ade20k/deeplabv3_mobilevit.yaml)      | [DeepLabv3-MViT-Wts](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/segmentation/ade20k/deeplabv3_mobilevit.pt)      | [DeepLabv3-MViT-Logs](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/segmentation/ade20k/deeplabv3_mobilevit_logs.txt)      |\n| EfficientNet-B3      | 43.9  | [DeepLabv3-EB3-config](segmentation/ade20k/deeplabv3_efficientnet_b3.yaml) | [DeepLabv3-EB3-Wts](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/segmentation/ade20k/deeplabv3_efficientnet_b3.pt) | [DeepLabv3-R50-Logs](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/segmentation/ade20k/deeplabv3_efficientnet_b3_logs.txt) |\n| ResNet-50            | 44.0  | [DeepLabv3-R50-config](segmentation/ade20k/deeplabv3_resnet_50.yaml)       | [DeepLabv3-R50-Wts](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/segmentation/ade20k/deeplabv3_resnet_50.pt)       | [DeepLabv3-R50-Logs](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/segmentation/ade20k/deeplabv3_resnet_50_logs.txt)       |\n| ResNet-101           | 46.5  | [DeepLabv3-R101-config](segmentation/ade20k/deeplabv3_resnet_101.yaml)     | [DeepLabv3-R101-Wts](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/segmentation/ade20k/deeplabv3_resnet_101.pt)     | [DeepLabv3-R101-Logs](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/segmentation/ade20k/deeplabv3_resnet_101_logs.txt)     |\n\n\n## Results on the PASCAL VOC 2012 dataset\n\n| Backbone             | Top-1 | Config                                                                         | Weights                                                                                                                         | Logs                                                                                                                               |\n|----------------------|-------|--------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------|\n| MobileNetv1-1.0      | 77.2  | [DeepLabv3-MV1-config](segmentation/pascal_voc/deeplabv3_mobilenet_v1.yaml)    | [DeepLabv3-MV1-Wts](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/segmentation/pascal_voc/deeplabv3_mobilenet_v1.pt)    | [DeepLabv3-MV1-Logs](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/segmentation/pascal_voc/deeplabv3_mobilenet_v1_log.txt) |\n| MobileNetv2-1.0      | 76.7  | [DeepLabv3-MV2-config](segmentation/pascal_voc/deeplabv3_mobilenet_v2.yaml)    | [DeepLabv3-MV2-Wts](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/segmentation/pascal_voc/deeplabv3_mobilenet_v2.pt)    | [DeepLabv3-MV2-Logs](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/segmentation/pascal_voc/deeplabv3_mobilenet_v2_log.txt) |\n| MobileNetv3-Large    | 77.0  | [DeepLabv3-MV3-config](segmentation/pascal_voc/deeplabv3_mobilenet_v3.yaml)    | [DeepLabv3-MV3-Wts](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/segmentation/pascal_voc/deeplabv3_mobilenet_v3.pt)    | [DeepLabv3-MV3-Logs](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/segmentation/pascal_voc/deeplabv3_mobilenet_v3_log.txt) |\n| EfficientNet-B3      | 82.0  | [DeepLabv3-EB3-config](segmentation/pascal_voc/deeplabv3_efficientnet_b3.yaml) | [DeepLabv3-EB3-Wts](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/segmentation/pascal_voc/deeplabv3_efficientnet_b3.pt) | [DeepLabv3-EB3-Logs](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/segmentation/pascal_voc/deeplabv3_efficientnet_b3_log.txt) |\n| ResNet-50            | 81.2  | [DeepLabv3-R50-config](segmentation/pascal_voc/deeplabv3_resnet_50.yaml)       | [DeepLabv3-R50-Wts](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/segmentation/pascal_voc/deeplabv3_resnet_50.pt)       | [DeepLabv3-R50-Logs](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/segmentation/pascal_voc/deeplabv3_resnet_50_logs.txt)   |\n| ResNet-101           | 84.0  | [DeepLabv3-R101-config](segmentation/pascal_voc/deeplabv3_resnet_101.yaml)     | [DeepLabv3-R101-Wts](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/segmentation/pascal_voc/deeplabv3_resnet_101.pt)     | [DeepLabv3-R101-Logs](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/segmentation/pascal_voc/deeplabv3_resnet_101_logs.txt) |\n\n \n## Demo\n\n```bash\nexport IMG_PATH=\"http://farm2.staticflickr.com/1173/678795137_bb1a91f659_z.jpg\"\nexport CFG_FILE=\"projects/range_augment/segmentation/pascal_voc/deeplabv3_resnet_50.yaml\"\nexport MODEL_WEIGHTS=\"https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/segmentation/pascal_voc/deeplabv3_resnet_50.pt\"\ncorenet-eval-seg --common.config-file $CFG_FILE \\\n --common.results-loc results \\\n --model.segmentation.pretrained $MODEL_WEIGHTS \\\n --evaluation.segmentation.mode single_image \\\n --evaluation.segmentation.path \"${IMG_PATH}\" \\\n --evaluation.segmentation.apply-color-map \\\n --evaluation.segmentation.save-overlay-rgb-pred\n```\n\n***Notes***\n   * If running on CPU, please disable mixed precision by adding following arguments to above command `--common.override-kwargs common.mixed_precision=false`\n"
  },
  {
    "path": "projects/range_augment/README.md",
    "content": "# RangeAugment: Efficient Online Augmentation with Range Learning\n\n[RangeAugment](https://arxiv.org/abs/2212.10553) is an automatic augmentation method that allows us to learn `model- and task-specific` magnitude range of each augmentation operation.\n\nWe provide training and evaluation code along with pretrained models and configuration files for the following tasks:\n\n1. [Image Classification on the ImageNet dataset](./README-classification.md)\n2. [Semantic segmentation on the ADE20k and the PASCAL VOC datasets](./README-segmentation.md)\n3. [Object detection on the MS-COCO dataset](./README-object-detection.md)\n4. [Contrastive Learning using Image-Text pairs](./README-clip.md)\n5. [Distillation on the ImageNet dataset](./README-distillation.md)\n\n***Note***: In the [codebase](../../corenet/modeling/neural_augmentor), we refer RangeAugment as Neural Augmentor (or NA).\n\n\n## Citation\n\nIf you find our work useful, please cite:\n\n```BibTex \n@article{mehta2022rangeaugment,\n  title={RangeAugment: Efficient Online Augmentation with Range Learning},\n  author = {Mehta, Sachin and Naderiparizi, Saeid and Faghri, Fartash and Horton, Maxwell and Chen, Lailin and Farhadi, Ali and Tuzel, Oncel and Rastegari, Mohammad},\n  journal={arXiv preprint arXiv:2212.10553},\n  year={2022},\n  url={https://arxiv.org/abs/2212.10553},\n}\n\n@inproceedings{mehta2022cvnets, \n     author = {Mehta, Sachin and Abdolhosseini, Farzad and Rastegari, Mohammad}, \n     title = {CVNets: High Performance Library for Computer Vision}, \n     year = {2022}, \n     booktitle = {Proceedings of the 30th ACM International Conference on Multimedia}, \n     series = {MM '22} \n}\n```\n"
  },
  {
    "path": "projects/range_augment/classification/efficientnet_b0.yaml",
    "content": "taskname: '+ EfficientNet-B0'\ncommon:\n  run_label: \"train\"\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\n  channels_last: true\ndataset:\n  root_train: \"/mnt/imagenet/training\"\n  root_val: \"/mnt/imagenet/validation\"\n  name: \"imagenet\"\n  category: \"classification\"\n  train_batch_size0: 256 # effective batch size is 2048 (256 * 8 GPUs)\n  val_batch_size0: 100\n  eval_batch_size0: 100\n  workers: -1\n  persistent_workers: true\n  pin_memory: true\n  collate_fn_name_train: \"image_classification_data_collate_fn\"\n  collate_fn_name_val: \"image_classification_data_collate_fn\"\n  collate_fn_name_test: \"image_classification_data_collate_fn\"\n\nimage_augmentation:\n  # training related parameters\n  random_resized_crop:\n    enable: true\n    interpolation: \"bilinear\"\n  random_horizontal_flip:\n    enable: true\n  # validation related parameters\n  resize:\n    enable: true\n    size: 232\n    interpolation: \"bilinear\"\n  center_crop:\n    enable: true\n    size: 224\nsampler:\n  name: \"variable_batch_sampler\"\n  vbs:\n    crop_size_width: 224\n    crop_size_height: 224\n    max_n_scales: 10\n    min_crop_size_width: 128\n    max_crop_size_width: 320\n    min_crop_size_height: 128\n    max_crop_size_height: 320\n    check_scale: 32\nloss:\n  category: \"composite_loss\"\n  composite_loss:\n    - loss_category: \"classification\"\n      loss_weight: 1.0\n      classification:\n        name: \"cross_entropy\"\n        cross_entropy:\n          label_smoothing: 0.1\n    - loss_category: \"neural_augmentation\"\n      loss_weight: 1.0\n      neural_augmentation:\n        perceptual_metric: \"psnr\"\n        target_value: [ 40, 10 ]\n        curriculum_method: \"cosine\"\noptim:\n  name: \"sgd\"\n  weight_decay: 4.e-5\n  no_decay_bn_filter_bias: true\n  sgd:\n    momentum: 0.9\n    nesterov: true\nscheduler:\n  name: \"cosine\"\n  is_iteration_based: false\n  max_epochs: 400\n  warmup_iterations: 3000\n  warmup_init_lr: 0.1\n  cosine:\n    max_lr: 0.8\n    min_lr: 4.e-4\nmodel:\n  classification:\n    name: \"efficientnet\"\n    n_classes: 1000\n    activation:\n      name: \"swish\"\n    efficientnet:\n      mode: \"b0\"\n      stochastic_depth_prob: 0.0\n    classifier_dropout: 0.0\n  learn_augmentation:\n    brightness: true\n    contrast: true\n    noise: true\n    mode: \"distribution\"\n  normalization:\n    name: \"batch_norm\"\n    momentum: 0.1\n  activation:\n    name: \"swish\"\n    inplace: true\n  layer:\n    global_pool: \"mean\"\n    conv_init: \"kaiming_normal\"\n    linear_init: \"normal\"\nema:\n  enable: true\n  momentum: 0.0005\nstats:\n  val: [ \"loss\", \"top1\", \"top5\" ]\n  train: [\"loss\"]\n  checkpoint_metric: \"top1.logits\"\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "projects/range_augment/classification/efficientnet_b1.yaml",
    "content": "taskname: '+ EfficientNet-B1'\ncommon:\n  run_label: \"train\"\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\n  channels_last: true\ndataset:\n  root_train: \"/mnt/imagenet/training\"\n  root_val: \"/mnt/imagenet/validation\"\n  name: \"imagenet\"\n  category: \"classification\"\n  train_batch_size0: 256 # effective batch size is 2048 (256 * 8 GPUs)\n  val_batch_size0: 100\n  eval_batch_size0: 100\n  workers: -1\n  persistent_workers: true\n  pin_memory: true\n  collate_fn_name_train: \"image_classification_data_collate_fn\"\n  collate_fn_name_val: \"image_classification_data_collate_fn\"\n  collate_fn_name_test: \"image_classification_data_collate_fn\"\n\nimage_augmentation:\n  # training related parameters\n  random_resized_crop:\n    enable: true\n    interpolation: \"bilinear\"\n  random_horizontal_flip:\n    enable: true\n  mixup:\n    enable: true\n    alpha: 0.2\n    p: 1.0\n  cutmix:\n    enable: true\n    alpha: 1.0\n    p: 1.0\n  # validation related parameters\n  resize:\n    enable: true\n    size: 256\n    interpolation: \"bilinear\"\n  center_crop:\n    enable: true\n    size: 256\nsampler:\n  name: \"variable_batch_sampler\"\n  vbs:\n    crop_size_width: 240\n    crop_size_height: 240\n    max_n_scales: 10\n    min_crop_size_width: 128\n    max_crop_size_width: 352\n    min_crop_size_height: 128\n    max_crop_size_height: 352\n    check_scale: 32\nloss:\n  category: \"composite_loss\"\n  composite_loss:\n    - loss_category: \"classification\"\n      loss_weight: 1.0\n      classification:\n        name: \"cross_entropy\"\n        cross_entropy:\n          label_smoothing: 0.1\n    - loss_category: \"neural_augmentation\"\n      loss_weight: 1.0\n      neural_augmentation:\n        perceptual_metric: \"psnr\"\n        target_value: [ 40, 5 ]\n        curriculum_method: \"cosine\"\noptim:\n  name: \"sgd\"\n  weight_decay: 4.e-5\n  no_decay_bn_filter_bias: true\n  sgd:\n    momentum: 0.9\n    nesterov: true\nscheduler:\n  name: \"cosine\"\n  is_iteration_based: false\n  max_epochs: 400\n  warmup_iterations: 3000\n  warmup_init_lr: 0.1\n  cosine:\n    max_lr: 0.8\n    min_lr: 4.e-4\nmodel:\n  classification:\n    name: \"efficientnet\"\n    n_classes: 1000\n    activation:\n      name: \"swish\"\n    efficientnet:\n      mode: \"b1\"\n      stochastic_depth_prob: 0.0\n    classifier_dropout: 0.0\n  learn_augmentation:\n    brightness: true\n    contrast: true\n    noise: true\n    mode: \"distribution\"\n  normalization:\n    name: \"batch_norm\"\n    momentum: 0.1\n  activation:\n    name: \"swish\"\n    inplace: true\n  layer:\n    global_pool: \"mean\"\n    conv_init: \"kaiming_normal\"\n    linear_init: \"normal\"\nema:\n  enable: true\n  momentum: 0.0005\nstats:\n  val: [ \"loss\", \"top1\", \"top5\" ]\n  train: [\"loss\"]\n  checkpoint_metric: \"top1.logits\"\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "projects/range_augment/classification/efficientnet_b2.yaml",
    "content": "taskname: '+ EfficientNet-B2'\ncommon:\n  run_label: \"train\"\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\n  channels_last: true\ndataset:\n  root_train: \"/mnt/imagenet/training\"\n  root_val: \"/mnt/imagenet/validation\"\n  name: \"imagenet\"\n  category: \"classification\"\n  train_batch_size0: 256 # effective batch size is 2048 (256 * 8 GPUs)\n  val_batch_size0: 100\n  eval_batch_size0: 100\n  workers: -1\n  persistent_workers: true\n  pin_memory: true\n  collate_fn_name_train: \"image_classification_data_collate_fn\"\n  collate_fn_name_val: \"image_classification_data_collate_fn\"\n  collate_fn_name_test: \"image_classification_data_collate_fn\"\n\nimage_augmentation:\n  # training related parameters\n  random_resized_crop:\n    enable: true\n    interpolation: \"bilinear\"\n  random_horizontal_flip:\n    enable: true\n  mixup:\n    enable: true\n    alpha: 0.2\n    p: 1.0\n  cutmix:\n    enable: true\n    alpha: 1.0\n    p: 1.0\n  # validation related parameters\n  resize:\n    enable: true\n    size: 288\n    interpolation: \"bilinear\"\n  center_crop:\n    enable: true\n    size: 288\nsampler:\n  name: \"variable_batch_sampler\"\n  vbs:\n    crop_size_width: 260\n    crop_size_height: 260\n    max_n_scales: 10\n    min_crop_size_width: 160\n    max_crop_size_width: 384\n    min_crop_size_height: 160\n    max_crop_size_height: 384\n    check_scale: 32\nloss:\n  category: \"composite_loss\"\n  composite_loss:\n    - loss_category: \"classification\"\n      loss_weight: 1.0\n      classification:\n        name: \"cross_entropy\"\n        cross_entropy:\n          label_smoothing: 0.1\n    - loss_category: \"neural_augmentation\"\n      loss_weight: 1.0\n      neural_augmentation:\n        perceptual_metric: \"psnr\"\n        target_value: [ 40, 5 ]\n        curriculum_method: \"cosine\"\noptim:\n  name: \"sgd\"\n  weight_decay: 4.e-5\n  no_decay_bn_filter_bias: true\n  sgd:\n    momentum: 0.9\n    nesterov: true\nscheduler:\n  name: \"cosine\"\n  is_iteration_based: false\n  max_epochs: 400\n  warmup_iterations: 3000\n  warmup_init_lr: 0.1\n  cosine:\n    max_lr: 0.8\n    min_lr: 4.e-4\nmodel:\n  classification:\n    name: \"efficientnet\"\n    n_classes: 1000\n    activation:\n      name: \"swish\"\n    efficientnet:\n      mode: \"b3\"\n      stochastic_depth_prob: 0.0\n    classifier_dropout: 0.0\n  learn_augmentation:\n    brightness: true\n    contrast: true\n    noise: true\n    mode: \"distribution\"\n  normalization:\n    name: \"batch_norm\"\n    momentum: 0.1\n  activation:\n    name: \"swish\"\n    inplace: true\n  layer:\n    global_pool: \"mean\"\n    conv_init: \"kaiming_normal\"\n    linear_init: \"normal\"\nema:\n  enable: true\n  momentum: 0.0005\nstats:\n  val: [ \"loss\", \"top1\", \"top5\" ]\n  train: [\"loss\"]\n  checkpoint_metric: \"top1.logits\"\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "projects/range_augment/classification/efficientnet_b3.yaml",
    "content": "taskname: '+ EfficientNet-B3'\ncommon:\n  run_label: \"train\"\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\n  channels_last: true\n  accum_freq: 2\ndataset:\n  root_train: \"/mnt/imagenet/training\"\n  root_val: \"/mnt/imagenet/validation\"\n  name: \"imagenet\"\n  category: \"classification\"\n  train_batch_size0: 128 # effective batch size is 2048 (128 * 2 * 8 GPUs)\n  val_batch_size0: 100\n  eval_batch_size0: 100\n  workers: -1\n  persistent_workers: true\n  pin_memory: true\n  collate_fn_name_train: \"image_classification_data_collate_fn\"\n  collate_fn_name_val: \"image_classification_data_collate_fn\"\n  collate_fn_name_test: \"image_classification_data_collate_fn\"\n\nimage_augmentation:\n  # training related parameters\n  random_resized_crop:\n    enable: true\n    interpolation: \"bilinear\"\n  random_horizontal_flip:\n    enable: true\n  mixup:\n    enable: true\n    alpha: 0.2\n    p: 1.0\n  cutmix:\n    enable: true\n    alpha: 1.0\n    p: 1.0\n  # validation related parameters\n  resize:\n    enable: true\n    size: 320\n    interpolation: \"bilinear\"\n  center_crop:\n    enable: true\n    size: 320\nsampler:\n  name: \"variable_batch_sampler\"\n  vbs:\n    crop_size_width: 300\n    crop_size_height: 300\n    max_n_scales: 10\n    min_crop_size_width: 160\n    max_crop_size_width: 448\n    min_crop_size_height: 160\n    max_crop_size_height: 448\n    check_scale: 32\nloss:\n  category: \"composite_loss\"\n  composite_loss:\n    - loss_category: \"classification\"\n      loss_weight: 1.0\n      classification:\n        name: \"cross_entropy\"\n        cross_entropy:\n          label_smoothing: 0.1\n    - loss_category: \"neural_augmentation\"\n      loss_weight: 1.0\n      neural_augmentation:\n        perceptual_metric: \"psnr\"\n        target_value: [ 40, 5 ]\n        curriculum_method: \"cosine\"\noptim:\n  name: \"sgd\"\n  weight_decay: 4.e-5\n  no_decay_bn_filter_bias: true\n  sgd:\n    momentum: 0.9\n    nesterov: true\nscheduler:\n  name: \"cosine\"\n  is_iteration_based: false\n  max_epochs: 400\n  warmup_iterations: 3000\n  warmup_init_lr: 0.1\n  cosine:\n    max_lr: 0.8\n    min_lr: 4.e-4\nmodel:\n  classification:\n    name: \"efficientnet\"\n    n_classes: 1000\n    activation:\n      name: \"swish\"\n    efficientnet:\n      mode: \"b3\"\n      stochastic_depth_prob: 0.0\n    classifier_dropout: 0.0\n  learn_augmentation:\n    brightness: true\n    contrast: true\n    noise: true\n    mode: \"distribution\"\n  normalization:\n    name: \"batch_norm\"\n    momentum: 0.1\n  activation:\n    name: \"swish\"\n    inplace: true\n  layer:\n    global_pool: \"mean\"\n    conv_init: \"kaiming_normal\"\n    linear_init: \"normal\"\nema:\n  enable: true\n  momentum: 0.0005\nstats:\n  val: [ \"loss\", \"top1\", \"top5\" ]\n  train: [\"loss\"]\n  checkpoint_metric: \"top1.logits\"\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "projects/range_augment/classification/mobilenet_v1.yaml",
    "content": "taskname: '+ MobileNetv1-1.0'\ncommon:\n  run_label: \"train\"\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\n  channels_last: true\ndataset:\n  root_train: \"/mnt/imagenet/training\"\n  root_val: \"/mnt/imagenet/validation\"\n  name: \"imagenet\"\n  category: \"classification\"\n  train_batch_size0: 128 # effective batch size is 512 (128 * 4 GPUs)\n  val_batch_size0: 100\n  eval_batch_size0: 100\n  workers: -1\n  persistent_workers: true\n  pin_memory: true\n  collate_fn_name_train: \"image_classification_data_collate_fn\"\n  collate_fn_name_val: \"image_classification_data_collate_fn\"\n  collate_fn_name_test: \"image_classification_data_collate_fn\"\n\nimage_augmentation:\n  # training transforms\n  random_resized_crop:\n    enable: true\n    interpolation: \"bilinear\"\n  random_horizontal_flip:\n    enable: true\n  # validation transforms\n  resize:\n    enable: true\n    size: 232 # shorter size is 232\n    interpolation: \"bilinear\"\n  center_crop:\n    enable: true\n    size: 224\nsampler:\n  name: \"variable_batch_sampler\"\n  vbs:\n    crop_size_width: 224\n    crop_size_height: 224\n    max_n_scales: 5\n    min_crop_size_width: 128\n    max_crop_size_width: 320\n    min_crop_size_height: 128\n    max_crop_size_height: 320\n    check_scale: 32\nloss:\n  category: \"composite_loss\"\n  composite_loss:\n    - loss_category: \"classification\"\n      loss_weight: 1.0\n      classification:\n        name: \"cross_entropy\"\n        cross_entropy:\n          label_smoothing: 0.1\n    - loss_category: \"neural_augmentation\"\n      loss_weight: 1.0\n      neural_augmentation:\n        perceptual_metric: \"psnr\"\n        target_value: [ 40, 30 ]\n        curriculum_method: \"cosine\"\noptim:\n  name: \"sgd\"\n  weight_decay: 4.e-5\n  no_decay_bn_filter_bias: true\n  sgd:\n    momentum: 0.9\n    nesterov: true\nscheduler:\n  name: \"cosine\"\n  is_iteration_based: false\n  max_epochs: 300\n  warmup_iterations: 7500\n  warmup_init_lr: 0.05\n  cosine:\n    max_lr: 0.4\n    min_lr: 2.e-4\nmodel:\n  learn_augmentation:\n    brightness: true\n    contrast: true\n    mode: distribution\n    noise: true\n  classification:\n    name: \"mobilenetv1\"\n    n_classes: 1000\n    activation:\n      name: \"relu\"\n    mobilenetv1:\n      width_multiplier: 1.0\n  normalization:\n    name: \"batch_norm\"\n    momentum: 0.1\n  activation:\n    name: \"relu\"\n    inplace: false\n  layer:\n    global_pool: \"mean\"\n    conv_init: \"kaiming_normal\"\n    linear_init: \"normal\"\nema:\n  enable: true\n  momentum: 0.0005\nstats:\n  val: [ \"loss\", \"top1\", \"top5\" ]\n  train: [\"loss\"]\n  checkpoint_metric: \"top1.logits\"\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "projects/range_augment/classification/mobilenet_v2.yaml",
    "content": "taskname: '+ MobileNetv2-1.0'\ncommon:\n  run_label: \"train\"\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\n  channels_last: true\ndataset:\n  root_train: \"/mnt/imagenet/training\"\n  root_val: \"/mnt/imagenet/validation\"\n  name: \"imagenet\"\n  category: \"classification\"\n  train_batch_size0: 256 # effective batch size is 1024 (256 * 4 GPUs)\n  val_batch_size0: 100\n  eval_batch_size0: 100\n  workers: -1 # use all CPU cores\n  persistent_workers: true\n  pin_memory: true\n  collate_fn_name_train: \"image_classification_data_collate_fn\"\n  collate_fn_name_val: \"image_classification_data_collate_fn\"\n  collate_fn_name_test: \"image_classification_data_collate_fn\"\n\nimage_augmentation:\n  random_resized_crop:\n    enable: true\n    interpolation: \"bilinear\"\n  random_horizontal_flip:\n    enable: true\n  resize:\n    enable: true\n    size: 232 # shorter size is 232\n    interpolation: \"bilinear\"\n  center_crop:\n    enable: true\n    size: 224\nsampler:\n  name: \"variable_batch_sampler\"\n  vbs:\n    crop_size_width: 224\n    crop_size_height: 224\n    max_n_scales: 5\n    min_crop_size_width: 128\n    max_crop_size_width: 320\n    min_crop_size_height: 128\n    max_crop_size_height: 320\n    check_scale: 32\nloss:\n  category: \"composite_loss\"\n  composite_loss:\n    - loss_category: \"classification\"\n      loss_weight: 1.0\n      classification:\n        name: \"cross_entropy\"\n        cross_entropy:\n          label_smoothing: 0.1\n    - loss_category: \"neural_augmentation\"\n      loss_weight: 1.0\n      neural_augmentation:\n        perceptual_metric: \"psnr\"\n        target_value: [ 40, 30 ]\n        curriculum_method: \"cosine\"\noptim:\n  name: \"sgd\"\n  weight_decay: 4.e-5\n  no_decay_bn_filter_bias: true\n  sgd:\n    momentum: 0.9\n    nesterov: true\nscheduler:\n  name: \"cosine\"\n  is_iteration_based: false\n  max_epochs: 300\n  warmup_iterations: 7500\n  warmup_init_lr: 0.05\n  cosine:\n    max_lr: 0.4\n    min_lr: 2.e-4\nmodel:\n  learn_augmentation:\n    brightness: true\n    contrast: true\n    mode: distribution\n    noise: true\n  classification:\n    name: \"mobilenetv2\"\n    n_classes: 1000\n    activation:\n      name: \"relu6\"\n    mobilenetv2:\n      width_multiplier: 1.0\n  normalization:\n    name: \"batch_norm\"\n    momentum: 0.1\n  activation:\n    name: \"relu\"\n    inplace: false\n  layer:\n    global_pool: \"mean\"\n    conv_init: \"kaiming_normal\"\n    linear_init: \"normal\"\nema:\n  enable: true\n  momentum: 0.0005\nstats:\n  val: [ \"loss\", \"top1\", \"top5\" ]\n  train: [\"loss\"]\n  checkpoint_metric: \"top1.logits\"\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "projects/range_augment/classification/mobilenet_v3.yaml",
    "content": "taskname: '+ MobileNetv3-Large'\ncommon:\n  run_label: \"train\"\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\n  channels_last: true\ndataset:\n  root_train: \"/mnt/imagenet/training\"\n  root_val: \"/mnt/imagenet/validation\"\n  name: \"imagenet\"\n  category: \"classification\"\n  train_batch_size0: 512 # effective batch size is 2048 (512 * 4 GPUs)\n  val_batch_size0: 100\n  eval_batch_size0: 100\n  workers: 8\n  persistent_workers: true\n  pin_memory: true\n  collate_fn_name_train: \"image_classification_data_collate_fn\"\n  collate_fn_name_val: \"image_classification_data_collate_fn\"\n  collate_fn_name_test: \"image_classification_data_collate_fn\"\n\nimage_augmentation:\n  random_resized_crop:\n    enable: true\n    interpolation: \"bilinear\"\n  random_horizontal_flip:\n    enable: true\n  resize:\n    enable: true\n    size: 232 # shorter size is 232\n    interpolation: \"bilinear\"\n  center_crop:\n    enable: true\n    size: 224\nsampler:\n  name: \"variable_batch_sampler\"\n  vbs:\n    crop_size_width: 224\n    crop_size_height: 224\n    max_n_scales: 5\n    min_crop_size_width: 128\n    max_crop_size_width: 320\n    min_crop_size_height: 128\n    max_crop_size_height: 320\n    check_scale: 32\nloss:\n  category: \"composite_loss\"\n  composite_loss:\n    - loss_category: \"classification\"\n      loss_weight: 1.0\n      classification:\n        name: \"cross_entropy\"\n        cross_entropy:\n          label_smoothing: 0.1\n    - loss_category: \"neural_augmentation\"\n      loss_weight: 1.0\n      neural_augmentation:\n        perceptual_metric: \"psnr\"\n        target_value: [ 40, 30 ]\n        curriculum_method: \"cosine\"\noptim:\n  name: \"sgd\"\n  weight_decay: 4.e-5\n  no_decay_bn_filter_bias: true\n  sgd:\n    momentum: 0.9\n    nesterov: true\nscheduler:\n  name: \"cosine\"\n  is_iteration_based: false\n  max_epochs: 300\n  warmup_iterations: 3000\n  warmup_init_lr: 0.1\n  cosine:\n    max_lr: 0.8\n    min_lr: 4.e-4\nmodel:\n  learn_augmentation:\n    brightness: true\n    contrast: true\n    mode: distribution\n    noise: true\n  classification:\n    name: \"mobilenetv3\"\n    n_classes: 1000\n    mobilenetv3:\n      mode: \"large\"\n      width_multiplier: 1.0\n  normalization:\n    name: \"batch_norm\"\n    momentum: 0.1\n  layer:\n    global_pool: \"mean\"\n    conv_init: \"kaiming_normal\"\n    linear_init: \"normal\"\nema:\n  enable: true\n  momentum: 0.0005\nstats:\n  val: [ \"loss\", \"top1\", \"top5\" ]\n  train: [\"loss\"]\n  checkpoint_metric: \"top1.logits\"\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "projects/range_augment/classification/mobilevit_v1.yaml",
    "content": "taskname: '+ MobileViT-Small'\ncommon:\n  run_label: \"train\"\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\ndataset:\n  root_train: \"/mnt/imagenet/training\" # Please update the location of training set\n  root_val: \"/mnt/imagenet/validation\" # Please update the location of validation set\n  name: \"imagenet\"\n  category: \"classification\"\n  train_batch_size0: 128 # In our experiments, we used an effective batch size of 1024 (128 images/GPU * 8 GPUs)\n  val_batch_size0: 100\n  eval_batch_size0: 100\n  workers: 8\n  persistent_workers: true\n  pin_memory: true\n  collate_fn_name_train: \"image_classification_data_collate_fn\"\n  collate_fn_name_val: \"image_classification_data_collate_fn\"\n  collate_fn_name_test: \"image_classification_data_collate_fn\"\n  \nimage_augmentation:\n  # training related parameters\n  random_resized_crop:\n    enable: true\n    interpolation: \"bilinear\"\n  random_horizontal_flip:\n    enable: true\n  # validation related parameters\n  resize:\n    enable: true\n    size: 256 # shorter size is 256\n    interpolation: \"bilinear\"\n  center_crop:\n    enable: true\n    size: 256\nsampler:\n  name: \"variable_batch_sampler\"\n  vbs:\n    crop_size_width: 256\n    crop_size_height: 256\n    max_n_scales: 5\n    min_crop_size_width: 160\n    max_crop_size_width: 320\n    min_crop_size_height: 160\n    max_crop_size_height: 320\n    check_scale: 32\nloss:\n  category: \"composite_loss\"\n  composite_loss:\n    - loss_category: \"classification\"\n      loss_weight: 1.0\n      classification:\n        name: \"cross_entropy\"\n        cross_entropy:\n          label_smoothing: 0.1\n    - loss_category: \"neural_augmentation\"\n      loss_weight: 1.0\n      neural_augmentation:\n        perceptual_metric: \"psnr\"\n        target_value: [ 40, 30 ]\n        curriculum_method: \"cosine\"\noptim:\n  name: \"adamw\"\n  no_decay_bn_filter_bias: false\n  weight_decay: 0.01\n  adamw:\n    beta1: 0.9\n    beta2: 0.999\nscheduler:\n  name: \"cosine\"\n  is_iteration_based: false\n  max_epochs: 300\n  warmup_iterations: 20000 # longer warm-up\n  warmup_init_lr: 0.0002\n  cosine:\n    max_lr: 0.002\n    min_lr: 0.0002\nmodel:\n  learn_augmentation:\n    brightness: true\n    contrast: true\n    mode: distribution\n    noise: true\n  classification:\n    name: \"mobilevit\"\n    classifier_dropout: 0.1\n    n_classes: 1000\n    mit:\n      mode: \"small\"\n      ffn_dropout: 0.0\n      attn_dropout: 0.0\n      dropout: 0.1\n      number_heads: 4\n      no_fuse_local_global_features: false\n      conv_kernel_size: 3\n    activation:\n      name: \"swish\"\n  normalization:\n    name: \"batch_norm\"\n    momentum: 0.1\n  activation:\n    name: \"swish\"\n  layer:\n    global_pool: \"mean\"\n    conv_init: \"kaiming_normal\"\n    linear_init: \"trunc_normal\"\n    linear_init_std_dev: 0.02\nema:\n  enable: true\n  momentum: 0.0005\nstats:\n  val: [ \"loss\", \"top1\", \"top5\" ]\n  train: [\"loss\"]\n  checkpoint_metric: \"top1.logits\"\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "projects/range_augment/classification/regnety_16gf.yaml",
    "content": "taskname: '+ RegNetY-16GF'\ncommon:\n  run_label: \"train\"\n  log_freq: 100\n  auto_resume: true\n  mixed_precision: true\n  channels_last: true\ndataset:\n  root_train: \"/mnt/imagenet/training\"\n  root_val: \"/mnt/imagenet/validation\"\n  name: \"imagenet\"\n  category: \"classification\"\n  train_batch_size0: 256 # effective batch size is 1024 (256 * 4 GPUs)\n  val_batch_size0: 100\n  eval_batch_size0: 100\n  workers: -1\n  persistent_workers: true\n  pin_memory: true\n  collate_fn_name_train: \"image_classification_data_collate_fn\"\n  collate_fn_name_val: \"image_classification_data_collate_fn\"\n  collate_fn_name_test: \"image_classification_data_collate_fn\"\n  \nimage_augmentation:\n  # training related transform parameters\n  random_resized_crop:\n    enable: true\n    interpolation: \"bilinear\"\n  random_horizontal_flip:\n    enable: true\n  mixup:\n    enable: true\n    alpha: 0.2\n    p: 1.0\n  cutmix:\n    enable: true\n    alpha: 1.0\n    p: 1.0\n  # validation related transform parameters\n  resize:\n    enable: true\n    size: 232 # shorter size is 232\n    interpolation: \"bilinear\"\n  center_crop:\n    enable: true\n    size: 224\nsampler:\n  name: \"variable_batch_sampler\"\n  num_repeats: 4\n  truncated_repeat_aug_sampler: true\n  vbs:\n    crop_size_width: 224\n    crop_size_height: 224\n    max_n_scales: 10\n    min_crop_size_width: 128\n    max_crop_size_width: 320\n    min_crop_size_height: 128\n    max_crop_size_height: 320\n    check_scale: 32\nloss:\n  category: \"composite_loss\"\n  composite_loss:\n    - loss_category: \"classification\"\n      loss_weight: 1.0\n      classification:\n        name: \"cross_entropy\"\n        cross_entropy:\n          label_smoothing: 0.1\n    - loss_category: \"neural_augmentation\"\n      loss_weight: 1.0\n      neural_augmentation:\n        perceptual_metric: \"psnr\"\n        target_value: [ 40, 5 ]\n        curriculum_method: \"cosine\"\noptim:\n  name: \"sgd\"\n  weight_decay: 4.e-5\n  no_decay_bn_filter_bias: true\n  sgd:\n    momentum: 0.9\nscheduler:\n  name: \"cosine\"\n  is_iteration_based: false\n  max_epochs: 150\n  warmup_iterations: 5000 # roughly 5 epochs\n  warmup_init_lr: 0.05\n  cosine:\n    max_lr: 0.5\n    min_lr: 2.e-4\nmodel:\n  classification:\n    name: \"regnet\"\n    n_classes: 1000\n    activation:\n      name: \"relu\"\n    regnet:\n      mode: \"y_16gf\"\n  learn_augmentation:\n    brightness: true\n    contrast: true\n    noise: true\n    mode: \"distribution\"\n  normalization:\n    name: \"batch_norm\"\n    momentum: 0.1\n  activation:\n    name: \"relu\"\n    inplace: true\n  layer:\n    global_pool: \"mean\"\n    conv_init: \"kaiming_normal\"\n    linear_init: \"normal\"\nema:\n  enable: true\n  momentum: 0.0005\nstats:\n  val: [ \"loss\", \"top1\", \"top5\" ]\n  train: [\"loss\"]\n  checkpoint_metric: \"top1.logits\"\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "projects/range_augment/classification/resnet_101.yaml",
    "content": "taskname: '+ ResNet-101'\ncommon:\n  run_label: \"train\"\n  log_freq: 100\n  auto_resume: true\n  mixed_precision: true\n  channels_last: true\ndataset:\n  root_train: \"/mnt/imagenet/training\"\n  root_val: \"/mnt/imagenet/validation\"\n  name: \"imagenet\"\n  category: \"classification\"\n  train_batch_size0: 128 # effective batch size is 1024 (128 * 8 GPUs)\n  val_batch_size0: 100\n  eval_batch_size0: 100\n  workers: -1\n  persistent_workers: true\n  pin_memory: true\n  collate_fn_name_train: \"image_classification_data_collate_fn\"\n  collate_fn_name_val: \"image_classification_data_collate_fn\"\n  collate_fn_name_test: \"image_classification_data_collate_fn\"\n\nimage_augmentation:\n  # training related transform parameters\n  random_resized_crop:\n    enable: true\n    interpolation: \"bilinear\"\n  random_horizontal_flip:\n    enable: true\n  mixup:\n    enable: true\n    alpha: 0.2\n    p: 1.0\n  cutmix:\n    enable: true\n    alpha: 1.0\n    p: 1.0\n  # validation related transform parameters\n  resize:\n    enable: true\n    size: 232 # shorter size is 232\n    interpolation: \"bilinear\"\n  center_crop:\n    enable: true\n    size: 224\nsampler:\n  name: \"variable_batch_sampler\"\n  num_repeats: 4\n  truncated_repeat_aug_sampler: true\n  vbs:\n    crop_size_width: 224\n    crop_size_height: 224\n    max_n_scales: 10\n    min_crop_size_width: 128\n    max_crop_size_width: 320\n    min_crop_size_height: 128\n    max_crop_size_height: 320\n    check_scale: 32\nloss:\n  category: \"composite_loss\"\n  composite_loss:\n    - loss_category: \"classification\"\n      loss_weight: 1.0\n      classification:\n        name: \"cross_entropy\"\n        cross_entropy:\n          label_smoothing: 0.1\n    - loss_category: \"neural_augmentation\"\n      loss_weight: 1.0\n      neural_augmentation:\n        perceptual_metric: \"psnr\"\n        target_value: [ 40, 5 ]\n        curriculum_method: \"cosine\"\noptim:\n  name: \"sgd\"\n  weight_decay: 4.e-5\n  no_decay_bn_filter_bias: true\n  sgd:\n    momentum: 0.9\nscheduler:\n  name: \"cosine\"\n  is_iteration_based: false\n  max_epochs: 600\n  warmup_iterations: 5000 # roughly 5 epochs\n  warmup_init_lr: 0.05\n  cosine:\n    max_lr: 0.5\n    min_lr: 2.e-4\nmodel:\n  classification:\n    name: \"resnet\"\n    n_classes: 1000\n    activation:\n      name: \"relu\"\n    resnet:\n      depth: 101\n  learn_augmentation:\n    brightness: true\n    contrast: true\n    noise: true\n    mode: \"distribution\"\n  normalization:\n    name: \"batch_norm\"\n    momentum: 0.1\n  activation:\n    name: \"relu\"\n    inplace: true\n  layer:\n    global_pool: \"mean\"\n    conv_init: \"kaiming_normal\"\n    linear_init: \"normal\"\nema:\n  enable: true\n  momentum: 0.0005\nstats:\n  val: [ \"loss\", \"top1\", \"top5\" ]\n  train: [\"loss\"]\n  checkpoint_metric: \"top1.logits\"\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "projects/range_augment/classification/resnet_50.yaml",
    "content": "taskname: '+ ResNet-50'\ncommon:\n  run_label: \"train\"\n  log_freq: 100\n  auto_resume: true\n  mixed_precision: true\n  channels_last: true\ndataset:\n  root_train: \"/mnt/imagenet/training\"\n  root_val: \"/mnt/imagenet/validation\"\n  name: \"imagenet\"\n  category: \"classification\"\n  train_batch_size0: 128 # effective batch size is 1024 (128 * 8 GPUs)\n  val_batch_size0: 100\n  eval_batch_size0: 100\n  workers: -1\n  persistent_workers: true\n  pin_memory: true\n  collate_fn_name_train: \"image_classification_data_collate_fn\"\n  collate_fn_name_val: \"image_classification_data_collate_fn\"\n  collate_fn_name_test: \"image_classification_data_collate_fn\"\n\nimage_augmentation:\n  # training related transform parameters\n  random_resized_crop:\n    enable: true\n    interpolation: \"bilinear\"\n  random_horizontal_flip:\n    enable: true\n  mixup:\n    enable: true\n    alpha: 0.2\n    p: 1.0\n  cutmix:\n    enable: true\n    alpha: 1.0\n    p: 1.0\n  # validation related transform parameters\n  resize:\n    enable: true\n    size: 232 # shorter size is 232\n    interpolation: \"bilinear\"\n  center_crop:\n    enable: true\n    size: 224\nsampler:\n  name: \"variable_batch_sampler\"\n  num_repeats: 4\n  truncated_repeat_aug_sampler: true\n  vbs:\n    crop_size_width: 224\n    crop_size_height: 224\n    max_n_scales: 10\n    min_crop_size_width: 128\n    max_crop_size_width: 320\n    min_crop_size_height: 128\n    max_crop_size_height: 320\n    check_scale: 32\nloss:\n  category: \"composite_loss\"\n  composite_loss:\n    - loss_category: \"classification\"\n      loss_weight: 1.0\n      classification:\n        name: \"cross_entropy\"\n        cross_entropy:\n          label_smoothing: 0.1\n    - loss_category: \"neural_augmentation\"\n      loss_weight: 1.0\n      neural_augmentation:\n        perceptual_metric: \"psnr\"\n        target_value: [ 40, 5 ]\n        curriculum_method: \"cosine\"\noptim:\n  name: \"sgd\"\n  weight_decay: 4.e-5\n  no_decay_bn_filter_bias: true\n  sgd:\n    momentum: 0.9\nscheduler:\n  name: \"cosine\"\n  is_iteration_based: false\n  max_epochs: 600\n  warmup_iterations: 5000 # roughly 5 epochs\n  warmup_init_lr: 0.05\n  cosine:\n    max_lr: 0.5\n    min_lr: 2.e-4\nmodel:\n  classification:\n    name: \"resnet\"\n    n_classes: 1000\n    activation:\n      name: \"relu\"\n    resnet:\n      depth: 50\n  learn_augmentation:\n    brightness: true\n    contrast: true\n    noise: true\n    mode: \"distribution\"\n  normalization:\n    name: \"batch_norm\"\n    momentum: 0.1\n  activation:\n    name: \"relu\"\n    inplace: true\n  layer:\n    global_pool: \"mean\"\n    conv_init: \"kaiming_normal\"\n    linear_init: \"normal\"\nema:\n  enable: true\n  momentum: 0.0005\nstats:\n  val: [ \"loss\", \"top1\", \"top5\" ]\n  train: [\"loss\"]\n  checkpoint_metric: \"top1.logits\"\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "projects/range_augment/classification/se_resnet_50.yaml",
    "content": "taskname: '+ SE-ResNet-50'\ncommon:\n  run_label: \"train\"\n  log_freq: 100\n  auto_resume: true\n  mixed_precision: true\n  channels_last: true\ndataset:\n  root_train: \"/mnt/imagenet/training\"\n  root_val: \"/mnt/imagenet/validation\"\n  name: \"imagenet\"\n  category: \"classification\"\n  train_batch_size0: 256 # effective batch size is 1024 (128 * 4 GPUs)\n  val_batch_size0: 100\n  eval_batch_size0: 100\n  workers: -1\n  persistent_workers: true\n  pin_memory: true\n  collate_fn_name_train: \"image_classification_data_collate_fn\"\n  collate_fn_name_val: \"image_classification_data_collate_fn\"\n  collate_fn_name_test: \"image_classification_data_collate_fn\"\n  \nimage_augmentation:\n  # training related transform parameters\n  random_resized_crop:\n    enable: true\n    interpolation: \"bilinear\"\n  random_horizontal_flip:\n    enable: true\n  mixup:\n    enable: true\n    alpha: 0.2\n    p: 1.0\n  cutmix:\n    enable: true\n    alpha: 1.0\n    p: 1.0\n  # validation related transform parameters\n  resize:\n    enable: true\n    size: 232 # shorter size is 232\n    interpolation: \"bilinear\"\n  center_crop:\n    enable: true\n    size: 224\nsampler:\n  name: \"variable_batch_sampler\"\n  num_repeats: 4\n  truncated_repeat_aug_sampler: true\n  vbs:\n    crop_size_width: 224\n    crop_size_height: 224\n    max_n_scales: 10\n    min_crop_size_width: 128\n    max_crop_size_width: 320\n    min_crop_size_height: 128\n    max_crop_size_height: 320\n    check_scale: 32\nloss:\n  category: \"composite_loss\"\n  composite_loss:\n    - loss_category: \"classification\"\n      loss_weight: 1.0\n      classification:\n        name: \"cross_entropy\"\n        cross_entropy:\n          label_smoothing: 0.1\n    - loss_category: \"neural_augmentation\"\n      loss_weight: 1.0\n      neural_augmentation:\n        perceptual_metric: \"psnr\"\n        target_value: [ 40, 5 ]\n        curriculum_method: \"cosine\"\noptim:\n  name: \"sgd\"\n  weight_decay: 4.e-5\n  no_decay_bn_filter_bias: true\n  sgd:\n    momentum: 0.9\nscheduler:\n  name: \"cosine\"\n  is_iteration_based: false\n  max_epochs: 600\n  warmup_iterations: 5000 # roughly 5 epochs\n  warmup_init_lr: 0.05\n  cosine:\n    max_lr: 0.5\n    min_lr: 2.e-4\nmodel:\n  classification:\n    name: \"resnet\"\n    n_classes: 1000\n    activation:\n      name: \"relu\"\n    resnet:\n      depth: 50\n      se_resnet: true\n  learn_augmentation:\n    brightness: true\n    contrast: true\n    noise: true\n    mode: \"distribution\"\n  normalization:\n    name: \"batch_norm\"\n    momentum: 0.1\n  activation:\n    name: \"relu\"\n    inplace: true\n  layer:\n    global_pool: \"mean\"\n    conv_init: \"kaiming_normal\"\n    linear_init: \"normal\"\nema:\n  enable: true\n  momentum: 0.0005\nstats:\n  val: [ \"loss\", \"top1\", \"top5\" ]\n  train: [\"loss\"]\n  checkpoint_metric: \"top1.logits\"\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "projects/range_augment/classification/swin_transformer_small.yaml",
    "content": "taskname: '+ SwinTransformer-Small'\ncommon:\n  run_label: \"train\"\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\n  tensorboard_logging: false\n  grad_clip: 5.0\n  save_all_checkpoints: true\ndataset:\n  root_train: \"/mnt/imagenet/training\"\n  root_val: \"/mnt/imagenet/validation\"\n  name: \"imagenet\"\n  category: \"classification\"\n  train_batch_size0: 128 # effective batch size is 1024 (128 * 8 GPUs)\n  val_batch_size0: 100\n  eval_batch_size0: 100\n  workers: -1\n  persistent_workers: true\n  pin_memory: true\n  collate_fn_name_train: \"image_classification_data_collate_fn\"\n  collate_fn_name_val: \"image_classification_data_collate_fn\"\n  collate_fn_name_test: \"image_classification_data_collate_fn\"\n\nimage_augmentation:\n  # training related parameters\n  random_resized_crop:\n    enable: true\n    interpolation: \"bilinear\"\n  random_horizontal_flip:\n    enable: true\n  mixup:\n    enable: true\n    alpha: 0.2\n    p: 1.0\n  cutmix:\n    enable: true\n    alpha: 1.0\n    p: 1.0\n  # validation related transforms\n  resize:\n    enable: true\n    size: 232 # shorter size is 232\n    interpolation: \"bilinear\"\n  center_crop:\n    enable: true\n    size: 224\nsampler:\n  name: \"batch_sampler\"\n  num_repeats: 4\n  truncated_repeat_aug_sampler: true\n  bs:\n    crop_size_width: 224\n    crop_size_height: 224\nloss:\n  category: \"composite_loss\"\n  composite_loss:\n    - loss_category: \"classification\"\n      loss_weight: 1.0\n      classification:\n        name: \"cross_entropy\"\n        cross_entropy:\n          label_smoothing: 0.1\n    - loss_category: \"neural_augmentation\"\n      loss_weight: 1.0\n      neural_augmentation:\n        perceptual_metric: \"psnr\"\n        target_value: [ 40, 5 ]\n        curriculum_method: \"cosine\"\noptim:\n  name: \"adamw\"\n  weight_decay: 0.05\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.999\nscheduler:\n  name: \"cosine\"\n  is_iteration_based: true\n  max_iterations: 375000  # 300 epochs * 1250 iterations per epoch\n  warmup_iterations: 25000  # roughly 20 epochs\n  warmup_init_lr: 1.e-6\n  cosine:\n    max_lr: 0.001\n    min_lr: 0.00001\nmodel:\n  classification:\n    name: \"swin\"\n    n_classes: 1000\n    swin:\n      mode: \"small\"\n    activation:\n      name: \"gelu\"\n  learn_augmentation:\n    brightness: true\n    contrast: true\n    noise: true\n    mode: \"distribution\"\n  activation:\n    name: \"gelu\"\n  layer:\n    global_pool: \"mean\"\n    conv_init: \"kaiming_uniform\"\n    linear_init: \"trunc_normal\"\n    linear_init_std_dev: 0.02\nema:\n  enable: true\n  momentum: 0.0005\nstats:\n  val: [ \"loss\", \"top1\", \"top5\" ]\n  train: [\"loss\"]\n  checkpoint_metric: \"top1.logits\"\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "projects/range_augment/classification/swin_transformer_tiny.yaml",
    "content": "taskname: '+ SwinTransformer-tiny'\ncommon:\n  run_label: \"train\"\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\n  tensorboard_logging: false\n  grad_clip: 5.0\n  save_all_checkpoints: true\ndataset:\n  root_train: \"/mnt/imagenet/training\"\n  root_val: \"/mnt/imagenet/validation\"\n  name: \"imagenet\"\n  category: \"classification\"\n  train_batch_size0: 128 # effective batch size is 1024 (128 * 8 GPUs)\n  val_batch_size0: 100\n  eval_batch_size0: 100\n  workers: -1\n  persistent_workers: true\n  pin_memory: true\n  collate_fn_name_train: \"image_classification_data_collate_fn\"\n  collate_fn_name_val: \"image_classification_data_collate_fn\"\n  collate_fn_name_test: \"image_classification_data_collate_fn\"\n\nimage_augmentation:\n  # training related parameters\n  random_resized_crop:\n    enable: true\n    interpolation: \"bilinear\"\n  random_horizontal_flip:\n    enable: true\n  mixup:\n    enable: true\n    alpha: 0.2\n    p: 1.0\n  cutmix:\n    enable: true\n    alpha: 1.0\n    p: 1.0\n  # validation related transforms\n  resize:\n    enable: true\n    size: 256 # shorter size is 256\n    interpolation: \"bilinear\"\n  center_crop:\n    enable: true\n    size: 224\nsampler:\n  name: \"batch_sampler\"\n  num_repeats: 4\n  truncated_repeat_aug_sampler: true\n  bs:\n    crop_size_width: 224\n    crop_size_height: 224\nloss:\n  category: \"composite_loss\"\n  composite_loss:\n    - loss_category: \"classification\"\n      loss_weight: 1.0\n      classification:\n        name: \"cross_entropy\"\n        cross_entropy:\n          label_smoothing: 0.1\n    - loss_category: \"neural_augmentation\"\n      loss_weight: 1.0\n      neural_augmentation:\n        perceptual_metric: \"psnr\"\n        target_value: [ 40, 5 ]\n        curriculum_method: \"cosine\"\noptim:\n  name: \"adamw\"\n  weight_decay: 0.05\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.999\nscheduler:\n  name: \"cosine\"\n  is_iteration_based: true\n  max_iterations: 375000  # 300 epochs * 1250 iterations per epoch\n  warmup_iterations: 25000  # roughly 20 epochs\n  warmup_init_lr: 1.e-6\n  cosine:\n    max_lr: 0.001\n    min_lr: 0.00001\nmodel:\n  classification:\n    name: \"swin\"\n    n_classes: 1000\n    swin:\n      mode: \"tiny\"\n    activation:\n      name: \"gelu\"\n  learn_augmentation:\n    brightness: true\n    contrast: true\n    noise: true\n    mode: \"distribution\"\n  activation:\n    name: \"gelu\"\n  layer:\n    global_pool: \"mean\"\n    conv_init: \"kaiming_uniform\"\n    linear_init: \"trunc_normal\"\n    linear_init_std_dev: 0.02\nema:\n  enable: true\n  momentum: 0.0005\nstats:\n  val: [ \"loss\", \"top1\", \"top5\" ]\n  train: [\"loss\"]\n  checkpoint_metric: \"top1.logits\"\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "projects/range_augment/clip/clip_vit_base.yaml",
    "content": "taskname: '+ CLIP-ViT-B/16'\n\ncommon:\n  run_label: \"train\"\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\n  accum_freq: 1\n  save_all_checkpoints: true\n  save_interval_freq: 5000\n\ndataset:\n  # root_train does not matter for img_text_tar dataset because dataset is information is expected\n  # to be contained in metadata file.\n  root_train: \"\"\n  root_val: \"/mnt/vision_datasets/imagenet/validation\"\n  name: \"img_text_tar\"\n  # effective batch size is > 65536 as we use multi-scale variable-batch sampler\n  # 65k = (32 nodes * 8 gpus per node * 256 batches per GPU; each GPU is A100 with 80 GB memory)\n  train_batch_size0: 256\n  val_batch_size0: 4\n  eval_batch_size0: 4\n  persistent_workers: false\n  pin_memory: true\n  workers: 16\n  collate_fn_name_train: \"multi_modal_img_text_collate_fn\"\n  collate_fn_name_val: \"multi_modal_img_text_collate_fn\"\n  collate_fn_name_test: \"multi_modal_img_text_collate_fn\"\n  name: \"img_text_tar\"\n  category: \"multi_modal_image_text\"\n  multi_modal_img_text:\n    zero_shot_img_cls_dataset_name: \"imagenet\"\n    context_length: 77\n    img_text_tar:\n      # ADD PATH OF METADATA FILE\n      metadata_file: \"PATH_OF_METADATA_FILE\"\n\ntext_tokenizer:\n  name: \"clip\"\n  clip:\n    merges_path: \"http://download.pytorch.org/models/text/clip_merges.bpe\"\n    encoder_json_path: \"http://download.pytorch.org/models/text/clip_encoder.json\"\n\nimage_augmentation:\n  random_resized_crop:\n    enable: true\n    interpolation: \"bilinear\"\n    scale: [0.9, 1.0]\n  resize:\n    enable: true\n    size: 224\n    interpolation: \"bilinear\"\n  center_crop:\n    enable: true\n    size: 224\n\nsampler:\n  name: \"variable_batch_sampler\"\n  use_shards: true\n  vbs:\n    crop_size_width: 224\n    crop_size_height: 224\n    max_n_scales: 5\n    min_crop_size_width: 160\n    max_crop_size_width: 320\n    min_crop_size_height: 160\n    max_crop_size_height: 320\n    check_scale: 32\n\nloss:\n  category: \"composite_loss\"\n  composite_loss:\n    - loss_category: \"multi_modal_image_text\"\n      loss_weight: 1.0\n      multi_modal_image_text:\n        name: \"contrastive_loss_clip\"\n    - loss_category: \"neural_augmentation\"\n      loss_weight: 1.0\n      neural_augmentation:\n        perceptual_metric: \"psnr\"\n        target_value: [ 40, 20 ]\n        curriculum_method: \"cosine\"\n\noptim:\n  name: \"adamw\"\n  weight_decay: 0.2\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.98\n    eps: 1.e-6\n\nscheduler:\n  is_iteration_based: true\n  max_epochs: 12\n  max_iterations: 150000\n  name: cosine\n  warmup_init_lr: 1.e-06\n  warmup_iterations: 1000\n  cosine:\n    max_lr: 0.0005\n    min_lr: 1.e-06\n\nmodel:\n  activation_checkpointing: true\n  multi_modal_image_text:\n    name: \"clip\"\n    lr_multiplier_img_encoder: 1.0\n    lr_multiplier_text_encoder: 1.0\n    clip:\n      projection_dim: 512\n  classification:\n    name: \"vit\"\n    vit:\n      mode: \"base\"\n      norm_layer: \"layer_norm_fp32\"\n    activation:\n      name: \"gelu\"\n  image_projection_head:\n    name: \"simple_projection_nc2nc\"\n  text: # text encoder\n    name: \"transformer\"\n    vocab_size: 49408\n    context_length: 77\n    transformer:\n      causal_masking: true\n      model_dim: 512\n      no_scale_embedding: false\n      no_pos_embedding: false\n      embed_dropout: 0.0\n      dropout: 0.0\n      attn_dropout: 0.0\n      ffn_dropout: 0.0\n      n_transformer_layers: 12\n      ffn_multiplier_per_layer: 4.0\n      n_heads_per_layer: 8\n      norm_layer: \"layer_norm_fp32\"\n  learn_augmentation:\n    brightness: true\n    contrast: true\n    noise: true\n    mode: \"distribution\"\n  normalization:\n    name: \"batch_norm\"\n    momentum: 0.1\n  activation:\n    name: \"gelu\"\n    inplace: true\n  layer:\n    global_pool: \"mean\"\n    conv_init: \"kaiming_uniform\"\n    linear_init: \"trunc_normal\"\n    linear_init_std_dev: 0.02\n\nema:\n  enable: true\n  momentum: 0.0005\n\nstats:\n  val: [ \"top1\" ]\n  train: [\"loss\", \"grad_norm\" ]\n  checkpoint_metric: \"top1.zero_shot_image_logits\"\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "projects/range_augment/clip/clip_vit_huge.yaml",
    "content": "# pytest: disable\ntaskname: '+ CLIP-ViT-H/16'\ncommon:\n  run_label: \"train\"\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\n  # for larger models, we found bfloat16 leads to more stable training\n  mixed_precision_dtype: \"bfloat16\"\n  accum_freq: 1\n  save_all_checkpoints: true\n  save_interval_freq: 5000\n\ndataset:\n  # root_train does not matter for img_text_tar dataset because dataset is information is expected\n  # to be contained in metadata file.\n  root_train: \"\"\n  root_val: \"/mnt/vision_datasets/imagenet/validation\"\n  # effective batch size is > 131k as we use multi-scale variable-batch sampler\n  # 131k = (64 nodes * 8 gpus per node * 256 batches per GPU; each GPU is A100 with 80 GB memory)\n  train_batch_size0: 256\n  val_batch_size0: 4\n  eval_batch_size0: 4\n  persistent_workers: false\n  pin_memory: true\n  workers: 16\n  collate_fn_name_train: \"multi_modal_img_text_collate_fn\"\n  collate_fn_name_val: \"multi_modal_img_text_collate_fn\"\n  collate_fn_name_test: \"multi_modal_img_text_collate_fn\"\n  name: \"img_text_tar\"\n  category: \"multi_modal_image_text\"\n  multi_modal_img_text:\n    zero_shot_img_cls_dataset_name: \"imagenet\"\n    context_length: 77\n    img_text_tar:\n      # ADD PATH OF METADATA FILE\n      metadata_file: \"PATH_OF_METADATA_FILE\"\n\ntext_tokenizer:\n  name: \"clip\"\n  clip:\n    merges_path: \"http://download.pytorch.org/models/text/clip_merges.bpe\"\n    encoder_json_path: \"http://download.pytorch.org/models/text/clip_encoder.json\"\n\nimage_augmentation:\n  random_resized_crop:\n    enable: true\n    interpolation: \"bilinear\"\n    scale: [0.9, 1.0]\n  resize:\n    enable: true\n    size: 224\n    interpolation: \"bilinear\"\n  center_crop:\n    enable: true\n    size: 224\n\nsampler:\n  name: \"variable_batch_sampler\"\n  use_shards: true\n  vbs:\n    crop_size_width: 224\n    crop_size_height: 224\n    max_n_scales: 5\n    min_crop_size_width: 160\n    max_crop_size_width: 320\n    min_crop_size_height: 160\n    max_crop_size_height: 320\n    check_scale: 32\n\nloss:\n  category: \"composite_loss\"\n  composite_loss:\n    - loss_category: \"multi_modal_image_text\"\n      loss_weight: 1.0\n      multi_modal_image_text:\n        name: \"contrastive_loss_clip\"\n    - loss_category: \"neural_augmentation\"\n      loss_weight: 1.0\n      neural_augmentation:\n        perceptual_metric: \"psnr\"\n        target_value: [ 40, 20 ]\n        curriculum_method: \"cosine\"\n\noptim:\n  name: \"adamw\"\n  weight_decay: 0.2\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.98\n    eps: 1.e-6\n\nscheduler:\n  name: \"cosine\"\n  is_iteration_based: true\n  max_iterations: 120000\n  warmup_iterations: 1000\n  warmup_init_lr: 1.e-6\n  cosine:\n    max_lr: 5.e-4\n    min_lr: 1.e-6\n\nmodel:\n  activation_checkpointing: true\n  multi_modal_image_text: # multi-modal image-text model\n    name: \"clip\"\n    lr_multiplier_img_encoder: 1.0\n    lr_multiplier_text_encoder: 1.0\n    clip:\n      projection_dim: 512\n  classification:\n    name: \"vit\"\n    vit:\n      mode: \"huge\"\n      norm_layer: \"layer_norm_fp32\"\n    activation:\n      name: \"gelu\"\n  image_projection_head:\n    name: \"simple_projection_nc2nc\"\n  text: # text encoder\n    name: \"transformer\"\n    vocab_size: 49408\n    context_length: 77\n    transformer:\n      causal_masking: true\n      model_dim: 768\n      no_scale_embedding: false\n      no_pos_embedding: false\n      embed_dropout: 0.0\n      dropout: 0.0\n      attn_dropout: 0.0\n      ffn_dropout: 0.0\n      n_transformer_layers: 12\n      ffn_multiplier_per_layer: 4.0\n      n_heads_per_layer: 12\n      norm_layer: \"layer_norm_fp32\"\n  learn_augmentation:\n    brightness: true\n    contrast: true\n    noise: true\n    mode: \"distribution\"\n  normalization:\n    name: \"batch_norm\"\n    momentum: 0.1\n  activation:\n    name: \"gelu\"\n    inplace: true\n  layer:\n    global_pool: \"mean\"\n    conv_init: \"kaiming_uniform\"\n    linear_init: \"trunc_normal\"\n    linear_init_std_dev: 0.02\n\nema:\n  enable: true\n  momentum: 0.0005\n\nstats:\n  val: [ \"top1\" ]\n  train: [\"loss\", \"grad_norm\" ]\n  checkpoint_metric: \"top1.zero_shot_image_logits\"\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "projects/range_augment/clip_finetune_imagenet/clip_vit_base.yaml",
    "content": "taskname: '+ CLIP-ViT-B/16 + FT-IN1k'\ncommon:\n  run_label: \"train\"\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\n  mixed_precision_dtype: \"bfloat16\"\n  save_all_checkpoints: true\ndataset:\n  root_train: \"/mnt/imagenet/training\"\n  root_val: \"/mnt/imagenet/validation\"\n  name: \"imagenet\"\n  category: \"classification\"\n  train_batch_size0: 64 # effective batch size is 512 (64 * 8 GPUs)\n  val_batch_size0: 100\n  eval_batch_size0: 100\n  workers: 8\n  persistent_workers: true\n  pin_memory: true\nimage_augmentation:\n  random_resized_crop:\n    enable: true\n    interpolation: \"bilinear\"\n  random_horizontal_flip:\n    enable: true\n  resize:\n    enable: true\n    size: 232\n    interpolation: \"bilinear\"\n  center_crop:\n    enable: true\n    size: 224\nsampler:\n  name: \"variable_batch_sampler\"\n  vbs:\n    crop_size_width: 224\n    crop_size_height: 224\n    max_n_scales: 10\n    min_crop_size_width: 128\n    max_crop_size_width: 320\n    min_crop_size_height: 128\n    max_crop_size_height: 320\n    check_scale: 16\nloss:\n  category: \"composite_loss\"\n  composite_loss:\n    - loss_category: \"classification\"\n      loss_weight: 1.0\n      classification:\n        name: \"cross_entropy\"\n        cross_entropy:\n          label_smoothing: 0.1\n    - loss_category: \"neural_augmentation\"\n      loss_weight: 1.0\n      neural_augmentation:\n        perceptual_metric: \"psnr\"\n        target_value: [ 40, 20 ]\n        curriculum_method: \"cosine\"\noptim:\n  name: \"adamw\"\n  weight_decay: 0.05\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.999\n    eps: 1.e-6\nscheduler:\n  name: \"cosine\"\n  is_iteration_based: false\n  max_epochs: 10\n  warmup_iterations: 500\n  warmup_init_lr: 1.e-6\n  cosine:\n    max_lr: 0.00003\n    min_lr: 1.e-6\nmodel:\n  resume_exclude_scopes: [\"text_encoder\", \"logit_scale\", \"image_encoder.classifier.proj\", \"simple_fpn\"]\n  ignore_missing_scopes: [\"classifier\"]\n  rename_scopes_map: [[\"image_encoder.\", \"\"]]\n  activation_checkpointing: true\n  classification:\n    name: \"vit\"\n    pretrained: \"https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/clip/clip_vit_base_16.pt\"\n    vit:\n      mode: \"base\"\n      norm_layer: \"layer_norm_fp32\"\n    activation:\n      name: \"gelu\"\n  learn_augmentation:\n    brightness: true\n    contrast: true\n    noise: true\n    mode: \"distribution\"\n  normalization:\n    name: \"batch_norm\"\n    momentum: 0.1\n  activation:\n    name: \"gelu\"\n  layer:\n    global_pool: \"mean\"\n    conv_init: \"kaiming_uniform\"\n    linear_init: \"trunc_normal\"\n    linear_init_std_dev: 0.02\nema:\n  enable: true\n  momentum: 0.0005\nstats:\n  val: [ \"loss\", \"top1\", \"top5\" ]\n  train: [\"loss\"]\n  checkpoint_metric: \"top1.logits\"\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "projects/range_augment/clip_finetune_imagenet/clip_vit_huge.yaml",
    "content": "# pytest: disable\ntaskname: '+ CLIP-ViT-H/16 + FT-IN1k'\ncommon:\n  run_label: \"train\"\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\n  mixed_precision_dtype: \"bfloat16\"\n  save_all_checkpoints: true\ndataset:\n  root_train: \"/mnt/imagenet/training\"\n  root_val: \"/mnt/imagenet/validation\"\n  name: \"imagenet\"\n  category: \"classification\"\n  train_batch_size0: 64 # effective batch size is 512 (64 * 8 GPUs)\n  val_batch_size0: 100\n  eval_batch_size0: 100\n  workers: 8\n  persistent_workers: true\n  pin_memory: true\nimage_augmentation:\n  random_resized_crop:\n    enable: true\n    interpolation: \"bilinear\"\n  random_horizontal_flip:\n    enable: true\n  resize:\n    enable: true\n    size: 232\n    interpolation: \"bilinear\"\n  center_crop:\n    enable: true\n    size: 224\nsampler:\n  name: \"variable_batch_sampler\"\n  vbs:\n    crop_size_width: 224\n    crop_size_height: 224\n    max_n_scales: 10\n    min_crop_size_width: 128\n    max_crop_size_width: 320\n    min_crop_size_height: 128\n    max_crop_size_height: 320\n    check_scale: 16\nloss:\n  category: \"composite_loss\"\n  composite_loss:\n    - loss_category: \"classification\"\n      loss_weight: 1.0\n      classification:\n        name: \"cross_entropy\"\n        cross_entropy:\n          label_smoothing: 0.1\n    - loss_category: \"neural_augmentation\"\n      loss_weight: 1.0\n      neural_augmentation:\n        perceptual_metric: \"psnr\"\n        target_value: [ 40, 20 ]\n        curriculum_method: \"cosine\"\noptim:\n  name: \"adamw\"\n  weight_decay: 0.05\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.999\n    eps: 1.e-6\nscheduler:\n  name: \"cosine\"\n  is_iteration_based: false\n  max_epochs: 10\n  warmup_iterations: 500\n  warmup_init_lr: 1.e-6\n  cosine:\n    max_lr: 0.00003\n    min_lr: 1.e-6\nmodel:\n  activation_checkpointing: true\n  resume_exclude_scopes: [\"text_encoder\", \"logit_scale\", \"image_encoder.classifier.proj\", \"simple_fpn\"]\n  ignore_missing_scopes: [\"classifier\"]\n  rename_scopes_map: [[\"image_encoder.\", \"\"]]\n  classification:\n    name: \"vit\"\n    pretrained: \"https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/clip/clip_vit_huge_16.pt\"\n    vit:\n      mode: \"huge\"\n      norm_layer: \"layer_norm_fp32\"\n    activation:\n      name: \"gelu\"\n  learn_augmentation:\n    brightness: true\n    contrast: true\n    noise: true\n    mode: \"distribution\"\n  normalization:\n    name: \"batch_norm\"\n    momentum: 0.1\n  activation:\n    name: \"gelu\"\n    inplace: true\n  layer:\n    global_pool: \"mean\"\n    conv_init: \"kaiming_uniform\"\n    linear_init: \"trunc_normal\"\n    linear_init_std_dev: 0.02\nema:\n  enable: true\n  momentum: 0.0005\nstats:\n  val: [ \"loss\", \"top1\", \"top5\" ]\n  train: [\"loss\"]\n  checkpoint_metric: \"top1.logits\"\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "projects/range_augment/detection/maskrcnn_efficientnet_b3.yaml",
    "content": "taskname: '+ EfficientNet-B3 Mask RCNN'\ncommon:\n  run_label: \"train\"\n  accum_freq: 1\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\ndataset:\n  root_train: \"/mnt/vision_datasets/coco\"\n  root_val: \"/mnt/vision_datasets/coco\"\n  category: \"detection\"\n  # In order to have a batch size of 2 for max. resolution in VBS, we set base batch size on GPU0 to 4\n  # Effective base batch size for 1024x1024 is 32 (4 * 8 GPUs)\n  # Note that because of variable batch sampler, batch size is different. As a result, our MaskRCNN implementation\n  # takes fewer optimization updates for training.\n  train_batch_size0: 4\n  val_batch_size0: 4\n  workers: 8\n  persistent_workers: false\n  pin_memory: true\n  name: \"coco_mask_rcnn\"\n  collate_fn_name_train: \"coco_mask_rcnn_collate_fn\"\n  collate_fn_name_val: \"coco_mask_rcnn_collate_fn\"\n\nimage_augmentation:\n  # for evaluation\n  resize:\n    enable: true\n    size: [1024, 1024]\n    interpolation: \"bilinear\"\nsampler:\n  name: variable_batch_sampler\n  vbs:\n    check_scale: 32\n    crop_size_height: 1024\n    crop_size_width: 1024\n    max_crop_size_height: 1280\n    max_crop_size_width: 1280\n    max_n_scales: 10\n    min_crop_size_height: 512\n    min_crop_size_width: 512\nloss:\n  category: \"composite_loss\"\n  composite_loss:\n    - loss_category: \"detection\"\n      loss_weight: 1.0\n      detection:\n        name: \"mask_rcnn_loss\"\n        mask_rcnn_loss:\n          classifier_weight: 1\n          box_reg_weight: 1\n          mask_weight: 1\n          objectness_weight: 1\n          rpn_box_reg: 1\n    - loss_category: \"neural_augmentation\"\n      loss_weight: 1.0\n      neural_augmentation:\n        perceptual_metric: \"psnr\"\n        target_value: [ 40, 10 ]\n        curriculum_method: \"cosine\"\noptim:\n  name: \"sgd\"\n  weight_decay: 4.e-5\n  no_decay_bn_filter_bias: true\n  sgd:\n    momentum: 0.9\nscheduler:\n  name: \"multi_step\"\n  max_epochs: 100\n  warmup_iterations: 500\n  warmup_init_lr: 0.001\n  multi_step:\n    gamma: 0.1\n    lr: 0.05\n    milestones: [60, 84]\nmodel:\n  activation_checkpointing: true\n  detection:\n    name: \"mask_rcnn\"\n    n_classes: 81\n    mask_rcnn:\n      backbone_lr_multiplier: 0.1\n      norm_layer: \"sync_batch_norm\"\n  classification:\n    name: \"efficientnet\"\n    activation:\n      name: \"swish\"\n    efficientnet:\n      mode: \"b3\"\n      stochastic_depth_prob: 0.0\n    classifier_dropout: 0.0\n    n_classes: 1000\n    pretrained: \"https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/efficientnet_b3.pt\"\n  learn_augmentation:\n    brightness: true\n    contrast: true\n    noise: true\n    mode: \"distribution\"\n  normalization:\n    name: \"sync_batch_norm\"\n    momentum: 0.1\n  activation:\n    name: \"relu\"\n    inplace: false\n  layer:\n    global_pool: \"mean\"\n    conv_init: \"kaiming_normal\"\n    linear_init: \"normal\"\nema:\n  enable: true\n  momentum: 0.0005\nstats:\n  val: [ \"loss\", \"coco_map\"]\n  train: [\"loss\"]\n  checkpoint_metric: \"coco_map.bbox\"\n  checkpoint_metric_max: true\n  coco_map:\n    iou_types: [ \"bbox\", \"segm\" ]\n"
  },
  {
    "path": "projects/range_augment/detection/maskrcnn_mobilenet_v1.yaml",
    "content": "taskname: '+ MobileNetv1 Mask RCNN'\ncommon:\n  run_label: \"train\"\n  accum_freq: 1\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\ndataset:\n  root_train: \"/mnt/vision_datasets/coco\"\n  root_val: \"/mnt/vision_datasets/coco\"\n  category: \"detection\"\n  # In order to have a batch size of 2 for max. resolution in VBS, we set base batch size on GPU0 to 4\n  # Effective base batch size for 1024x1024 is 32 (4 * 8 GPUs)\n  # Note that because of variable batch sampler, batch size is different. As a result, our MaskRCNN implementation\n  # takes fewer optimization updates for training.\n  train_batch_size0: 4\n  val_batch_size0: 4\n  workers: 8\n  persistent_workers: false\n  pin_memory: true\n  name: \"coco_mask_rcnn\"\n  collate_fn_name_train: \"coco_mask_rcnn_collate_fn\"\n  collate_fn_name_val: \"coco_mask_rcnn_collate_fn\"\n\nimage_augmentation:\n  # for evaluation\n  resize:\n    enable: true\n    size: [1024, 1024]\n    interpolation: \"bilinear\"\nsampler:\n  name: variable_batch_sampler\n  vbs:\n    check_scale: 32\n    crop_size_height: 1024\n    crop_size_width: 1024\n    max_crop_size_height: 1280\n    max_crop_size_width: 1280\n    max_n_scales: 10\n    min_crop_size_height: 512\n    min_crop_size_width: 512\nloss:\n  category: \"composite_loss\"\n  composite_loss:\n    - loss_category: \"detection\"\n      loss_weight: 1.0\n      detection:\n        name: \"mask_rcnn_loss\"\n        mask_rcnn_loss:\n          classifier_weight: 1\n          box_reg_weight: 1\n          mask_weight: 1\n          objectness_weight: 1\n          rpn_box_reg: 1\n    - loss_category: \"neural_augmentation\"\n      loss_weight: 1.0\n      neural_augmentation:\n        perceptual_metric: \"psnr\"\n        target_value: [ 40, 10 ]\n        curriculum_method: \"cosine\"\noptim:\n  name: \"sgd\"\n  weight_decay: 4.e-5\n  no_decay_bn_filter_bias: true\n  sgd:\n    momentum: 0.9\nscheduler:\n  name: \"multi_step\"\n  max_epochs: 100\n  warmup_iterations: 500\n  warmup_init_lr: 0.001\n  multi_step:\n    gamma: 0.1\n    lr: 0.1\n    milestones: [60, 84]\nmodel:\n  detection:\n    name: \"mask_rcnn\"\n    n_classes: 81\n    mask_rcnn:\n      backbone_lr_multiplier: 0.1\n      norm_layer: \"sync_batch_norm\"\n  classification:\n    name: \"mobilenetv1\"\n    n_classes: 1000\n    pretrained: \"https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/mobilenetv1_1.0.pt\"\n    activation:\n      name: \"relu\"\n    mobilenetv1:\n      width_multiplier: 1.0\n  learn_augmentation:\n    brightness: true\n    contrast: true\n    noise: true\n    mode: \"distribution\"\n  normalization:\n    name: \"sync_batch_norm\"\n    momentum: 0.1\n  activation:\n    name: \"relu\"\n    inplace: false\n  layer:\n    global_pool: \"mean\"\n    conv_init: \"kaiming_normal\"\n    linear_init: \"normal\"\nema:\n  enable: true\n  momentum: 0.0005\nstats:\n  val: [ \"loss\", \"coco_map\"]\n  train: [\"loss\"]\n  checkpoint_metric: \"coco_map.bbox\"\n  checkpoint_metric_max: true\n  coco_map:\n    iou_types: [ \"bbox\", \"segm\" ]\n"
  },
  {
    "path": "projects/range_augment/detection/maskrcnn_mobilenet_v2.yaml",
    "content": "taskname: '+ MobileNetv2 Mask RCNN'\ncommon:\n  run_label: \"train\"\n  accum_freq: 1\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\ndataset:\n  root_train: \"/mnt/vision_datasets/coco\"\n  root_val: \"/mnt/vision_datasets/coco\"\n  category: \"detection\"\n  # In order to have a batch size of 2 for max. resolution in VBS, we set base batch size on GPU0 to 4\n  # Effective base batch size for 1024x1024 is 32 (4 * 8 GPUs)\n  # Note that because of variable batch sampler, batch size is different. As a result, our MaskRCNN implementation\n  # takes fewer optimization updates for training.\n  train_batch_size0: 4\n  val_batch_size0: 4\n  workers: 8\n  persistent_workers: false\n  pin_memory: true\n  name: \"coco_mask_rcnn\"\n  collate_fn_name_train: \"coco_mask_rcnn_collate_fn\"\n  collate_fn_name_val: \"coco_mask_rcnn_collate_fn\"\n\nimage_augmentation:\n  # for evaluation\n  resize:\n    enable: true\n    size: [1024, 1024]\n    interpolation: \"bilinear\"\nsampler:\n  name: variable_batch_sampler\n  vbs:\n    check_scale: 32\n    crop_size_height: 1024\n    crop_size_width: 1024\n    max_crop_size_height: 1280\n    max_crop_size_width: 1280\n    max_n_scales: 10\n    min_crop_size_height: 512\n    min_crop_size_width: 512\nloss:\n  category: \"composite_loss\"\n  composite_loss:\n    - loss_category: \"detection\"\n      loss_weight: 1.0\n      detection:\n        name: \"mask_rcnn_loss\"\n        mask_rcnn_loss:\n          classifier_weight: 1\n          box_reg_weight: 1\n          mask_weight: 1\n          objectness_weight: 1\n          rpn_box_reg: 1\n    - loss_category: \"neural_augmentation\"\n      loss_weight: 1.0\n      neural_augmentation:\n        perceptual_metric: \"psnr\"\n        target_value: [ 40, 10 ]\n        curriculum_method: \"cosine\"\noptim:\n  name: \"sgd\"\n  weight_decay: 4.e-5\n  no_decay_bn_filter_bias: true\n  sgd:\n    momentum: 0.9\nscheduler:\n  name: \"multi_step\"\n  max_epochs: 100\n  warmup_iterations: 500\n  warmup_init_lr: 0.001\n  multi_step:\n    gamma: 0.1\n    lr: 0.1\n    milestones: [60, 84]\nmodel:\n  detection:\n    name: \"mask_rcnn\"\n    n_classes: 81\n    mask_rcnn:\n      backbone_lr_multiplier: 0.1\n      norm_layer: \"sync_batch_norm\"\n  classification:\n    name: \"mobilenetv2\"\n    n_classes: 1000\n    pretrained: \"https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/mobilenetv2_1.0.pt\"\n    activation:\n      name: \"relu6\"\n    mobilenetv2:\n      width_multiplier: 1.0\n  learn_augmentation:\n    brightness: true\n    contrast: true\n    noise: true\n    mode: \"distribution\"\n  normalization:\n    name: \"sync_batch_norm\"\n    momentum: 0.1\n  activation:\n    name: \"relu\"\n    inplace: false\n  layer:\n    global_pool: \"mean\"\n    conv_init: \"kaiming_normal\"\n    linear_init: \"normal\"\nema:\n  enable: true\n  momentum: 0.0005\nstats:\n  val: [ \"loss\", \"coco_map\"]\n  train: [\"loss\"]\n  checkpoint_metric: \"coco_map.bbox\"\n  checkpoint_metric_max: true\n  coco_map:\n    iou_types: [ \"bbox\", \"segm\" ]\n"
  },
  {
    "path": "projects/range_augment/detection/maskrcnn_mobilenet_v3.yaml",
    "content": "taskname: '+ MobileNetv3 Mask RCNN'\ncommon:\n  run_label: \"train\"\n  accum_freq: 1\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\ndataset:\n  root_train: \"/mnt/vision_datasets/coco\"\n  root_val: \"/mnt/vision_datasets/coco\"\n  category: \"detection\"\n  # In order to have a batch size of 2 for max. resolution in VBS, we set base batch size on GPU0 to 4\n  # Effective base batch size for 1024x1024 is 32 (4 * 8 GPUs)\n  # Note that because of variable batch sampler, batch size is different. As a result, our MaskRCNN implementation\n  # takes fewer optimization updates for training.\n  train_batch_size0: 4\n  val_batch_size0: 4\n  workers: 8\n  persistent_workers: false\n  pin_memory: true\n  name: \"coco_mask_rcnn\"\n  collate_fn_name_train: \"coco_mask_rcnn_collate_fn\"\n  collate_fn_name_val: \"coco_mask_rcnn_collate_fn\"\n\nimage_augmentation:\n  # for evaluation\n  resize:\n    enable: true\n    size: [1024, 1024]\n    interpolation: \"bilinear\"\nsampler:\n  name: variable_batch_sampler\n  vbs:\n    check_scale: 32\n    crop_size_height: 1024\n    crop_size_width: 1024\n    max_crop_size_height: 1280\n    max_crop_size_width: 1280\n    max_n_scales: 10\n    min_crop_size_height: 512\n    min_crop_size_width: 512\nloss:\n  category: \"composite_loss\"\n  composite_loss:\n    - loss_category: \"detection\"\n      loss_weight: 1.0\n      detection:\n        name: \"mask_rcnn_loss\"\n        mask_rcnn_loss:\n          classifier_weight: 1\n          box_reg_weight: 1\n          mask_weight: 1\n          objectness_weight: 1\n          rpn_box_reg: 1\n    - loss_category: \"neural_augmentation\"\n      loss_weight: 1.0\n      neural_augmentation:\n        perceptual_metric: \"psnr\"\n        target_value: [ 40, 10 ]\n        curriculum_method: \"cosine\"\noptim:\n  name: \"sgd\"\n  weight_decay: 4.e-5\n  no_decay_bn_filter_bias: true\n  sgd:\n    momentum: 0.9\nscheduler:\n  name: \"multi_step\"\n  max_epochs: 100\n  warmup_iterations: 500\n  warmup_init_lr: 0.001\n  multi_step:\n    gamma: 0.1\n    lr: 0.1\n    milestones: [60, 84]\nmodel:\n  detection:\n    name: \"mask_rcnn\"\n    n_classes: 81\n    mask_rcnn:\n      backbone_lr_multiplier: 0.1\n      norm_layer: \"sync_batch_norm\"\n  classification:\n    name: \"mobilenetv3\"\n    n_classes: 1000\n    pretrained: \"https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/mobilenetv3_large.pt\"\n    mobilenetv3:\n      mode: \"large\"\n      width_multiplier: 1.0\n  learn_augmentation:\n    brightness: true\n    contrast: true\n    noise: true\n    mode: \"distribution\"\n  normalization:\n    name: \"sync_batch_norm\"\n    momentum: 0.1\n  activation:\n    name: \"relu\"\n    inplace: false\n  layer:\n    global_pool: \"mean\"\n    conv_init: \"kaiming_normal\"\n    linear_init: \"normal\"\nema:\n  enable: true\n  momentum: 0.0005\nstats:\n  val: [ \"loss\", \"coco_map\"]\n  train: [\"loss\"]\n  checkpoint_metric: \"coco_map.bbox\"\n  checkpoint_metric_max: true\n  coco_map:\n    iou_types: [ \"bbox\", \"segm\" ]\n"
  },
  {
    "path": "projects/range_augment/detection/maskrcnn_mobilevit.yaml",
    "content": "taskname: '+ MobileViT Mask RCNN'\ncommon:\n  run_label: \"train\"\n  accum_freq: 1\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\ndataset:\n  root_train: \"/mnt/vision_datasets/coco\"\n  root_val: \"/mnt/vision_datasets/coco\"\n  category: \"detection\"\n  # In order to have a batch size of 2 for max. resolution in VBS, we set base batch size on GPU0 to 4\n  # Effective base batch size for 1024x1024 is 32 (4 * 8 GPUs)\n  # Note that because of variable batch sampler, batch size is different. As a result, our MaskRCNN implementation\n  # takes fewer optimization updates for training.\n  train_batch_size0: 4\n  val_batch_size0: 4\n  workers: 8\n  persistent_workers: false\n  pin_memory: true\n  name: \"coco_mask_rcnn\"\n  collate_fn_name_train: \"coco_mask_rcnn_collate_fn\"\n  collate_fn_name_val: \"coco_mask_rcnn_collate_fn\"\n  \nimage_augmentation:\n  # for evaluation\n  resize:\n    enable: true\n    size: [1024, 1024]\n    interpolation: \"bilinear\"\nsampler:\n  name: variable_batch_sampler\n  vbs:\n    check_scale: 32\n    crop_size_height: 1024\n    crop_size_width: 1024\n    max_crop_size_height: 1280\n    max_crop_size_width: 1280\n    max_n_scales: 10\n    min_crop_size_height: 512\n    min_crop_size_width: 512\nloss:\n  category: \"composite_loss\"\n  composite_loss:\n    - loss_category: \"detection\"\n      loss_weight: 1.0\n      detection:\n        name: \"mask_rcnn_loss\"\n        mask_rcnn_loss:\n          classifier_weight: 1\n          box_reg_weight: 1\n          mask_weight: 1\n          objectness_weight: 1\n          rpn_box_reg: 1\n    - loss_category: \"neural_augmentation\"\n      loss_weight: 1.0\n      neural_augmentation:\n        perceptual_metric: \"psnr\"\n        target_value: [ 40, 10 ]\n        curriculum_method: \"cosine\"\noptim:\n  name: \"sgd\"\n  weight_decay: 4.e-5\n  no_decay_bn_filter_bias: true\n  sgd:\n    momentum: 0.9\nscheduler:\n  name: \"multi_step\"\n  max_epochs: 100\n  warmup_iterations: 500\n  warmup_init_lr: 0.001\n  multi_step:\n    gamma: 0.1\n    lr: 0.1\n    milestones: [60, 84]\nmodel:\n  detection:\n    name: \"mask_rcnn\"\n    n_classes: 81\n    mask_rcnn:\n      backbone_lr_multiplier: 0.1\n      norm_layer: \"sync_batch_norm\"\n  classification:\n    name: \"mobilevit\"\n    n_classes: 1000\n    pretrained: \"https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/mobilevit_small.pt\"\n    classifier_dropout: 0.1\n    mit:\n      mode: \"small\"\n      ffn_dropout: 0.0\n      attn_dropout: 0.0\n      dropout: 0.1\n      number_heads: 4\n      no_fuse_local_global_features: false\n      conv_kernel_size: 3\n    activation:\n      name: \"swish\"\n  learn_augmentation:\n    brightness: true\n    contrast: true\n    noise: true\n    mode: \"distribution\"\n  normalization:\n    name: \"sync_batch_norm\"\n    momentum: 0.1\n  activation:\n    name: \"relu\"\n    inplace: false\n  layer:\n    global_pool: \"mean\"\n    conv_init: \"kaiming_normal\"\n    linear_init: \"normal\"\nema:\n  enable: true\n  momentum: 0.0005\nstats:\n  val: [ \"loss\", \"coco_map\"]\n  train: [\"loss\"]\n  checkpoint_metric: \"coco_map.bbox\"\n  checkpoint_metric_max: true\n  coco_map:\n    iou_types: [ \"bbox\", \"segm\" ]\n"
  },
  {
    "path": "projects/range_augment/detection/maskrcnn_resnet_101.yaml",
    "content": "taskname: '+ ResNet-101 Mask RCNN'\ncommon:\n  run_label: \"train\"\n  accum_freq: 1\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\ndataset:\n  root_train: \"/mnt/vision_datasets/coco\"\n  root_val: \"/mnt/vision_datasets/coco\"\n  category: \"detection\"\n  # In order to have a batch size of 2 for max. resolution in VBS, we set base batch size on GPU0 to 4\n  # Effective base batch size for 1024x1024 is 32 (4 * 8 GPUs)\n  # Note that because of variable batch sampler, batch size is different. As a result, our MaskRCNN implementation\n  # takes fewer optimization updates for training.\n  train_batch_size0: 4\n  val_batch_size0: 4\n  workers: 8\n  persistent_workers: false\n  pin_memory: true\n  name: \"coco_mask_rcnn\"\n  collate_fn_name_train: \"coco_mask_rcnn_collate_fn\"\n  collate_fn_name_val: \"coco_mask_rcnn_collate_fn\"\n\nimage_augmentation:\n  # for evaluation\n  resize:\n    enable: true\n    size: [1024, 1024]\n    interpolation: \"bilinear\"\nsampler:\n  name: variable_batch_sampler\n  vbs:\n    check_scale: 32\n    crop_size_height: 1024\n    crop_size_width: 1024\n    max_crop_size_height: 1280\n    max_crop_size_width: 1280\n    max_n_scales: 10\n    min_crop_size_height: 512\n    min_crop_size_width: 512\nloss:\n  category: \"composite_loss\"\n  composite_loss:\n    - loss_category: \"detection\"\n      loss_weight: 1.0\n      detection:\n        name: \"mask_rcnn_loss\"\n        mask_rcnn_loss:\n          classifier_weight: 1\n          box_reg_weight: 1\n          mask_weight: 1\n          objectness_weight: 1\n          rpn_box_reg: 1\n    - loss_category: \"neural_augmentation\"\n      loss_weight: 1.0\n      neural_augmentation:\n        perceptual_metric: \"psnr\"\n        target_value: [ 40, 10 ]\n        curriculum_method: \"cosine\"\noptim:\n  name: \"sgd\"\n  weight_decay: 4.e-5\n  no_decay_bn_filter_bias: true\n  sgd:\n    momentum: 0.9\nscheduler:\n  name: \"multi_step\"\n  max_epochs: 100\n  warmup_iterations: 500\n  warmup_init_lr: 0.001\n  multi_step:\n    gamma: 0.1\n    lr: 0.1\n    milestones: [60, 84]\nmodel:\n  detection:\n    name: \"mask_rcnn\"\n    n_classes: 81\n    mask_rcnn:\n      backbone_lr_multiplier: 0.1\n      norm_layer: \"sync_batch_norm\"\n  classification:\n    name: \"resnet\"\n    n_classes: 1000\n    pretrained: \"https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/resnet_101.pt\"\n    activation:\n      name: \"relu\"\n    resnet:\n      depth: 101\n  learn_augmentation:\n    brightness: true\n    contrast: true\n    noise: true\n    mode: \"distribution\"\n  normalization:\n    name: \"sync_batch_norm\"\n    momentum: 0.1\n  activation:\n    name: \"relu\"\n    inplace: false\n  layer:\n    global_pool: \"mean\"\n    conv_init: \"kaiming_normal\"\n    linear_init: \"normal\"\nema:\n  enable: true\n  momentum: 0.0005\nstats:\n  val: [ \"loss\", \"coco_map\"]\n  train: [\"loss\"]\n  checkpoint_metric: \"coco_map.bbox\"\n  checkpoint_metric_max: true\n  coco_map:\n    iou_types: [ \"bbox\", \"segm\" ]\n"
  },
  {
    "path": "projects/range_augment/detection/maskrcnn_resnet_50.yaml",
    "content": "taskname: '+ ResNet-50 Mask RCNN'\ncommon:\n  run_label: \"train\"\n  accum_freq: 1\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\ndataset:\n  root_train: \"/mnt/vision_datasets/coco\"\n  root_val: \"/mnt/vision_datasets/coco\"\n  category: \"detection\"\n  # In order to have a batch size of 2 for max. resolution in VBS, we set base batch size on GPU0 to 4\n  # Effective base batch size for 1024x1024 is 32 (4 * 8 GPUs)\n  # Note that because of variable batch sampler, batch size is different. As a result, our MaskRCNN implementation\n  # takes fewer optimization updates for training.\n  train_batch_size0: 4\n  val_batch_size0: 4\n  workers: 8\n  persistent_workers: false\n  pin_memory: true\n  name: \"coco_mask_rcnn\"\n  collate_fn_name_train: \"coco_mask_rcnn_collate_fn\"\n  collate_fn_name_val: \"coco_mask_rcnn_collate_fn\"\n\nimage_augmentation:\n  # for evaluation\n  resize:\n    enable: true\n    size: [1024, 1024]\n    interpolation: \"bilinear\"\nsampler:\n  name: variable_batch_sampler\n  vbs:\n    check_scale: 32\n    crop_size_height: 1024\n    crop_size_width: 1024\n    max_crop_size_height: 1280\n    max_crop_size_width: 1280\n    max_n_scales: 10\n    min_crop_size_height: 512\n    min_crop_size_width: 512\nloss:\n  category: \"composite_loss\"\n  composite_loss:\n    - loss_category: \"detection\"\n      loss_weight: 1.0\n      detection:\n        name: \"mask_rcnn_loss\"\n        mask_rcnn_loss:\n          classifier_weight: 1\n          box_reg_weight: 1\n          mask_weight: 1\n          objectness_weight: 1\n          rpn_box_reg: 1\n    - loss_category: \"neural_augmentation\"\n      loss_weight: 1.0\n      neural_augmentation:\n        perceptual_metric: \"psnr\"\n        target_value: [ 40, 10 ]\n        curriculum_method: \"cosine\"\noptim:\n  name: \"sgd\"\n  weight_decay: 4.e-5\n  no_decay_bn_filter_bias: true\n  sgd:\n    momentum: 0.9\nscheduler:\n  name: \"multi_step\"\n  max_epochs: 100\n  warmup_iterations: 500\n  warmup_init_lr: 0.001\n  multi_step:\n    gamma: 0.1\n    lr: 0.1\n    milestones: [60, 84]\nmodel:\n  detection:\n    name: \"mask_rcnn\"\n    n_classes: 81\n    mask_rcnn:\n      backbone_lr_multiplier: 0.1\n      norm_layer: \"sync_batch_norm\"\n  classification:\n    name: \"resnet\"\n    n_classes: 1000\n    pretrained: \"https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/resnet_50.pt\"\n    activation:\n      name: \"relu\"\n    resnet:\n      depth: 50\n  learn_augmentation:\n    brightness: true\n    contrast: true\n    noise: true\n    mode: \"distribution\"\n  normalization:\n    name: \"sync_batch_norm\"\n    momentum: 0.1\n  activation:\n    name: \"relu\"\n    inplace: false\n  layer:\n    global_pool: \"mean\"\n    conv_init: \"kaiming_normal\"\n    linear_init: \"normal\"\nema:\n  enable: true\n  momentum: 0.0005\nstats:\n  val: [ \"loss\", \"coco_map\"]\n  train: [\"loss\"]\n  checkpoint_metric: \"coco_map.bbox\"\n  checkpoint_metric_max: true\n  coco_map:\n    iou_types: [ \"bbox\", \"segm\" ]\n"
  },
  {
    "path": "projects/range_augment/distillation/teacher_resnet101_student_mobilenet_v1.yaml",
    "content": "taskname: '+ Student: MobileNetv1-1.0; Teacher: ResNet-101'\ncommon:\n  run_label: \"train\"\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\n  channels_last: true\n  save_all_checkpoints: true\ndataset:\n  root_train: \"/mnt/imagenet/training\"\n  root_val: \"/mnt/imagenet/validation\"\n  name: \"imagenet\"\n  category: \"classification\"\n  train_batch_size0: 128 # effective batch size is 512 (128 * 4 GPUs)\n  val_batch_size0: 100\n  eval_batch_size0: 100\n  workers: -1\n  persistent_workers: true\n  pin_memory: true\nimage_augmentation:\n  # training transforms\n  random_resized_crop:\n    enable: true\n    interpolation: \"bilinear\"\n  random_horizontal_flip:\n    enable: true\n  # validation transforms\n  resize:\n    enable: true\n    size: 232 # shorter size is 232\n    interpolation: \"bilinear\"\n  center_crop:\n    enable: true\n    size: 224\nsampler:\n  name: \"variable_batch_sampler\"\n  vbs:\n    crop_size_width: 224\n    crop_size_height: 224\n    max_n_scales: 5\n    min_crop_size_width: 128\n    max_crop_size_width: 320\n    min_crop_size_height: 128\n    max_crop_size_height: 320\n    check_scale: 32\nloss:\n  category: \"composite_loss\"\n  composite_loss:\n    - loss_category: \"distillation\"\n      loss_weight: 1.0\n      distillation:\n        name: \"soft_kl_loss\"\n        soft_kl_loss:\n          temperature: 1.0\n    - loss_category: \"neural_augmentation\"\n      loss_weight: 1.0\n      neural_augmentation:\n        perceptual_metric: \"psnr\"\n        target_value: [ 40, 20 ]\n        curriculum_method: \"cosine\"\noptim:\n  name: \"sgd\"\n  weight_decay: 4.e-5\n  no_decay_bn_filter_bias: true\n  sgd:\n    momentum: 0.9\n    nesterov: true\nscheduler:\n  name: \"cosine\"\n  is_iteration_based: false\n  max_epochs: 300\n  warmup_iterations: 7500\n  warmup_init_lr: 0.05\n  cosine:\n    max_lr: 0.4\n    min_lr: 2.e-4\nteacher:\n  model:\n    classification:\n      name: \"resnet\"\n      n_classes: 1000\n      pretrained: \"https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/resnet_101.pt\"\n      activation:\n        name: \"relu\"\n      resnet:\n        depth: 101\n    learn_augmentation:\n      brightness: true\n      contrast: true\n      noise: true\n      mode: \"distribution\"\n    normalization:\n      name: \"batch_norm\"\n      momentum: 0.1\n    activation:\n      name: \"relu\"\n      inplace: true\n    layer:\n      global_pool: \"mean\"\n      conv_init: \"kaiming_normal\"\n      linear_init: \"normal\"\nmodel:\n  learn_augmentation:\n    brightness: true\n    contrast: true\n    mode: distribution\n    noise: true\n  classification:\n    name: \"mobilenetv1\"\n    n_classes: 1000\n    activation:\n      name: \"relu\"\n    mobilenetv1:\n      width_multiplier: 1.0\n  normalization:\n    name: \"batch_norm\"\n    momentum: 0.1\n  activation:\n    name: \"relu\"\n    inplace: false\n  layer:\n    global_pool: \"mean\"\n    conv_init: \"kaiming_normal\"\n    linear_init: \"normal\"\nema:\n  enable: true\n  momentum: 0.0005\nstats:\n  val: [ \"loss\", \"top1\", \"top5\" ]\n  train: [\"loss\"]\n  checkpoint_metric: \"top1.logits\"\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "projects/range_augment/distillation/teacher_resnet101_student_mobilenet_v2.yaml",
    "content": "taskname: '+ Student: MobileNetv2-1.0; Teacher: ResNet-101'\ncommon:\n  run_label: \"train\"\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\n  channels_last: true\n  save_all_checkpoints: true\ndataset:\n  root_train: \"/mnt/imagenet/training\"\n  root_val: \"/mnt/imagenet/validation\"\n  name: \"imagenet\"\n  category: \"classification\"\n  train_batch_size0: 256 # effective batch size is 1024 (256 * 4 GPUs)\n  val_batch_size0: 100\n  eval_batch_size0: 100\n  workers: -1 # use all CPU cores\n  persistent_workers: true\n  pin_memory: true\nimage_augmentation:\n  # training transforms\n  random_resized_crop:\n    enable: true\n    interpolation: \"bilinear\"\n  random_horizontal_flip:\n    enable: true\n  # validation transforms\n  resize:\n    enable: true\n    size: 232 # shorter size is 232\n    interpolation: \"bilinear\"\n  center_crop:\n    enable: true\n    size: 224\nsampler:\n  name: \"variable_batch_sampler\"\n  vbs:\n    crop_size_width: 224\n    crop_size_height: 224\n    max_n_scales: 5\n    min_crop_size_width: 128\n    max_crop_size_width: 320\n    min_crop_size_height: 128\n    max_crop_size_height: 320\n    check_scale: 32\nloss:\n  category: \"composite_loss\"\n  composite_loss:\n    - loss_category: \"distillation\"\n      loss_weight: 1.0\n      distillation:\n        name: \"soft_kl_loss\"\n        soft_kl_loss:\n          temperature: 1.0\n    - loss_category: \"neural_augmentation\"\n      loss_weight: 1.0\n      neural_augmentation:\n        perceptual_metric: \"psnr\"\n        target_value: [ 40, 20 ]\n        curriculum_method: \"cosine\"\noptim:\n  name: \"sgd\"\n  weight_decay: 4.e-5\n  no_decay_bn_filter_bias: true\n  sgd:\n    momentum: 0.9\n    nesterov: true\nscheduler:\n  name: \"cosine\"\n  is_iteration_based: false\n  max_epochs: 300\n  warmup_iterations: 7500\n  warmup_init_lr: 0.05\n  cosine:\n    max_lr: 0.4\n    min_lr: 2.e-4\nteacher:\n  model:\n    classification:\n      name: \"resnet\"\n      pretrained: \"https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/resnet_101.pt\"\n      n_classes: 1000\n      activation:\n        name: \"relu\"\n      resnet:\n        depth: 101\n    learn_augmentation:\n      brightness: true\n      contrast: true\n      noise: true\n      mode: \"distribution\"\n    normalization:\n      name: \"batch_norm\"\n      momentum: 0.1\n    activation:\n      name: \"relu\"\n      inplace: true\n    layer:\n      global_pool: \"mean\"\n      conv_init: \"kaiming_normal\"\n      linear_init: \"normal\"\nmodel:\n  learn_augmentation:\n    brightness: true\n    contrast: true\n    mode: distribution\n    noise: true\n  classification:\n    name: \"mobilenetv2\"\n    n_classes: 1000\n    activation:\n      name: \"relu6\"\n    mobilenetv2:\n      width_multiplier: 1.0\n  normalization:\n    name: \"batch_norm\"\n    momentum: 0.1\n  activation:\n    name: \"relu\"\n    inplace: false\n  layer:\n    global_pool: \"mean\"\n    conv_init: \"kaiming_normal\"\n    linear_init: \"normal\"\nema:\n  enable: true\n  momentum: 0.0005\nstats:\n  val: [ \"loss\", \"top1\", \"top5\" ]\n  train: [\"loss\"]\n  checkpoint_metric: \"top1.logits\"\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "projects/range_augment/distillation/teacher_resnet101_student_mobilenet_v3.yaml",
    "content": "taskname: '+ Student: MobileNetv3-Large; Teacher: ResNet-101'\ncommon:\n  run_label: \"train\"\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\n  channels_last: true\n  save_all_checkpoints: true\ndataset:\n  root_train: \"/mnt/imagenet/training\"\n  root_val: \"/mnt/imagenet/validation\"\n  name: \"imagenet\"\n  category: \"classification\"\n  train_batch_size0: 512 # effective batch size is 2048 (512 * 4 GPUs)\n  val_batch_size0: 100\n  eval_batch_size0: 100\n  workers: 8\n  persistent_workers: true\n  pin_memory: true\nimage_augmentation:\n  random_resized_crop:\n    enable: true\n    interpolation: \"bilinear\"\n  random_horizontal_flip:\n    enable: true\n  resize:\n    enable: true\n    size: 232 # shorter size is 232\n    interpolation: \"bilinear\"\n  center_crop:\n    enable: true\n    size: 224\nsampler:\n  name: \"variable_batch_sampler\"\n  vbs:\n    crop_size_width: 224\n    crop_size_height: 224\n    max_n_scales: 5\n    min_crop_size_width: 128\n    max_crop_size_width: 320\n    min_crop_size_height: 128\n    max_crop_size_height: 320\n    check_scale: 32\nloss:\n  category: \"composite_loss\"\n  composite_loss:\n    - loss_category: \"distillation\"\n      loss_weight: 1.0\n      distillation:\n        name: \"soft_kl_loss\"\n        soft_kl_loss:\n          temperature: 1.0\n    - loss_category: \"neural_augmentation\"\n      loss_weight: 1.0\n      neural_augmentation:\n        perceptual_metric: \"psnr\"\n        target_value: [ 40, 20 ]\n        curriculum_method: \"cosine\"\noptim:\n  name: \"sgd\"\n  weight_decay: 4.e-5\n  no_decay_bn_filter_bias: true\n  sgd:\n    momentum: 0.9\n    nesterov: true\nscheduler:\n  name: \"cosine\"\n  is_iteration_based: false\n  max_epochs: 300\n  warmup_iterations: 3000\n  warmup_init_lr: 0.1\n  cosine:\n    max_lr: 0.8\n    min_lr: 4.e-4\nmodel:\n  learn_augmentation:\n    brightness: true\n    contrast: true\n    mode: distribution\n    noise: true\n  classification:\n    name: \"mobilenetv3\"\n    n_classes: 1000\n    mobilenetv3:\n      mode: \"large\"\n      width_multiplier: 1.0\n  normalization:\n    name: \"batch_norm\"\n    momentum: 0.1\n  layer:\n    global_pool: \"mean\"\n    conv_init: \"kaiming_normal\"\n    linear_init: \"normal\"\nteacher:\n  model:\n    classification:\n      n_classes: 1000\n      name: \"resnet\"\n      pretrained: \"https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/resnet_101.pt\"\n      activation:\n        name: \"relu\"\n      resnet:\n        depth: 101\n    learn_augmentation:\n      brightness: true\n      contrast: true\n      noise: true\n      mode: \"distribution\"\n    normalization:\n      name: \"batch_norm\"\n      momentum: 0.1\n    activation:\n      name: \"relu\"\n      inplace: true\n    layer:\n      global_pool: \"mean\"\n      conv_init: \"kaiming_normal\"\n      linear_init: \"normal\"\nema:\n  enable: true\n  momentum: 0.0005\nstats:\n  val: [ \"loss\", \"top1\", \"top5\" ]\n  train: [\"loss\"]\n  checkpoint_metric: \"top1.logits\"\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "projects/range_augment/distillation/teacher_resnet101_student_mobilevit.yaml",
    "content": "taskname: '+ Student: MobileViT-S; Teacher: ResNet-101'\ncommon:\n  run_label: \"train\"\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\n  save_all_checkpoints: true\ndataset:\n  root_train: \"/mnt/imagenet/training\" # Please update the location of training set\n  root_val: \"/mnt/imagenet/validation\" # Please update the location of validation set\n  name: \"imagenet\"\n  category: \"classification\"\n  train_batch_size0: 128 # In our experiments, we used an effective batch size of 1024 (128 images/GPU * 8 GPUs)\n  val_batch_size0: 100\n  eval_batch_size0: 100\n  workers: 8\n  persistent_workers: true\n  pin_memory: true\nimage_augmentation:\n  # training related parameters\n  random_resized_crop:\n    enable: true\n    interpolation: \"bilinear\"\n  random_horizontal_flip:\n    enable: true\n  # validation related parameters\n  resize:\n    enable: true\n    size: 256 # shorter size is 256\n    interpolation: \"bilinear\"\n  center_crop:\n    enable: true\n    size: 256\nsampler:\n  name: \"variable_batch_sampler\"\n  vbs:\n    crop_size_width: 256\n    crop_size_height: 256\n    max_n_scales: 5\n    min_crop_size_width: 160\n    max_crop_size_width: 320\n    min_crop_size_height: 160\n    max_crop_size_height: 320\n    check_scale: 32\nloss:\n  category: \"composite_loss\"\n  composite_loss:\n    - loss_category: \"distillation\"\n      loss_weight: 1.0\n      distillation:\n        name: \"soft_kl_loss\"\n        soft_kl_loss:\n          temperature: 1.0\n    - loss_category: \"neural_augmentation\"\n      loss_weight: 1.0\n      neural_augmentation:\n        perceptual_metric: \"psnr\"\n        target_value: [ 40, 20 ]\n        curriculum_method: \"cosine\"\noptim:\n  name: \"adamw\"\n  no_decay_bn_filter_bias: false\n  weight_decay: 0.01\n  adamw:\n    beta1: 0.9\n    beta2: 0.999\nscheduler:\n  name: \"cosine\"\n  is_iteration_based: false\n  max_epochs: 300\n  warmup_iterations: 20000 # longer warm-up\n  warmup_init_lr: 0.0002\n  cosine:\n    max_lr: 0.002\n    min_lr: 0.0002\nmodel:\n  learn_augmentation:\n    brightness: true\n    contrast: true\n    mode: distribution\n    noise: true\n  classification:\n    name: \"mobilevit\"\n    classifier_dropout: 0.1\n    n_classes: 1000\n    mit:\n      mode: \"small\"\n      ffn_dropout: 0.0\n      attn_dropout: 0.0\n      dropout: 0.1\n      number_heads: 4\n      no_fuse_local_global_features: false\n      conv_kernel_size: 3\n    activation:\n      name: \"swish\"\n  normalization:\n    name: \"batch_norm\"\n    momentum: 0.1\n  activation:\n    name: \"swish\"\n  layer:\n    global_pool: \"mean\"\n    conv_init: \"kaiming_normal\"\n    linear_init: \"trunc_normal\"\n    linear_init_std_dev: 0.02\nteacher:\n  model:\n    classification:\n      name: \"resnet\"\n      n_classes: 1000\n      pretrained: \"https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/resnet_101.pt\"\n      activation:\n        name: \"relu\"\n      resnet:\n        depth: 101\n    learn_augmentation:\n      brightness: true\n      contrast: true\n      noise: true\n      mode: \"distribution\"\n    normalization:\n      name: \"batch_norm\"\n      momentum: 0.1\n    activation:\n      name: \"relu\"\n      inplace: true\n    layer:\n      global_pool: \"mean\"\n      conv_init: \"kaiming_normal\"\n      linear_init: \"normal\"\nema:\n  enable: true\n  momentum: 0.0005\nstats:\n  val: [ \"loss\", \"top1\", \"top5\" ]\n  train: [\"loss\"]\n  checkpoint_metric: \"top1.logits\"\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "projects/range_augment/segmentation/ade20k/deeplabv3_efficientnet_b3.yaml",
    "content": "taskname: '+ DeepLabv3+EfficientNet-B3'\ncommon:\n  run_label: \"train\"\n  accum_freq: 1\n  log_freq: 200\n  auto_resume: false\n  mixed_precision: true\ndataset:\n  root_train: \"/mnt/vision_datasets/ADEChallengeData2016/\"\n  root_val: \"/mnt/vision_datasets/ADEChallengeData2016/\"\n  name: \"ade20k\"\n  category: \"segmentation\"\n  train_batch_size0: 16 # effective batch size is 16 ( 16 * 1 GPUs)\n  val_batch_size0: 4\n  eval_batch_size0: 1\n  workers: 8\n  persistent_workers: true\n  pin_memory: true\nimage_augmentation:\n  random_crop:\n    enable: true\n    seg_class_max_ratio: 0.75\n    pad_if_needed: true\n    mask_fill: 0 # background idx is 0\n  random_horizontal_flip:\n    enable: true\n  resize:\n    enable: true\n    size: [512, 512]\n    interpolation: \"bilinear\"\n  random_short_size_resize:\n    enable: true\n    interpolation: \"bilinear\"\n    short_side_min: 256\n    short_side_max: 768\n    max_img_dim: 1024\nsampler:\n  name: \"batch_sampler\"\n  bs:\n    crop_size_width: 512\n    crop_size_height: 512\nloss:\n  category: \"composite_loss\"\n  composite_loss:\n    - loss_category: \"segmentation\"\n      loss_weight: 1.0\n      segmentation:\n        name: \"cross_entropy\"\n        cross_entropy:\n          ignore_index: -1\n          aux_weight: 0.4\n    - loss_category: \"neural_augmentation\"\n      loss_weight: 1.0\n      neural_augmentation:\n        perceptual_metric: \"psnr\"\n        target_value: [ 40, 20 ]\n        curriculum_method: \"cosine\"\noptim:\n  name: \"sgd\"\n  weight_decay: 1.e-4\n  no_decay_bn_filter_bias: true\n  sgd:\n    momentum: 0.9\nscheduler:\n  name: \"cosine\"\n  is_iteration_based: false\n  max_epochs: 50\n  cosine:\n    max_lr: 0.02\n    min_lr: 0.0001\nmodel:\n  activation_checkpointing: true\n  segmentation:\n    name: \"encoder_decoder\"\n    n_classes: 150\n    lr_multiplier: 1\n    seg_head: \"deeplabv3\"\n    output_stride: 8\n    use_aux_head: true\n    activation:\n      name: \"relu\"\n    deeplabv3:\n      aspp_dropout: 0.1\n      aspp_sep_conv: false\n      aspp_out_channels: 512\n      aspp_rates: [ 12, 24, 36 ]\n  classification:\n    name: \"efficientnet\"\n    n_classes: 1000\n    activation:\n      name: \"swish\"\n    efficientnet:\n      mode: \"b3\"\n      stochastic_depth_prob: 0.0\n    classifier_dropout: 0.0\n    pretrained: \"https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/efficientnet_b3.pt\"\n  learn_augmentation:\n    brightness: true\n    contrast: true\n    noise: true\n    mode: \"distribution\"\n  normalization:\n    name: \"batch_norm\"\n    momentum: 0.1\n  activation:\n    name: \"swish\"\n    inplace: true\n  layer:\n    global_pool: \"mean\"\n    conv_init: \"kaiming_normal\"\n    linear_init: \"normal\"\nema:\n  enable: true\n  momentum: 0.0005\nstats:\n  val: [ \"loss\", \"iou\" ]\n  train: [ \"loss\" ]\n  checkpoint_metric: \"iou\"\n  checkpoint_metric_max: true\n\n# During evaluation (with corenet-eval-seg), we follow following steps:\n#  1. Determine and store the size of input image as metadata\n#  2. Resize image while maintaining the aspect ratio\n#  3. Make a prediction\n#  4. Resize the predicted mask to the same size as original input image\n#  5. compute results\nevaluation:\n  segmentation:\n    resize_input_images: true\n    mode: \"validation_set\"\n"
  },
  {
    "path": "projects/range_augment/segmentation/ade20k/deeplabv3_mobilenet_v1.yaml",
    "content": "taskname: '+ DeepLabv3+MobileNetv1-1.0'\ncommon:\n  run_label: \"train\"\n  accum_freq: 1\n  log_freq: 200\n  auto_resume: false\n  mixed_precision: true\ndataset:\n  root_train: \"/mnt/vision_datasets/ADEChallengeData2016/\"\n  root_val: \"/mnt/vision_datasets/ADEChallengeData2016/\"\n  name: \"ade20k\"\n  category: \"segmentation\"\n  train_batch_size0: 16 # effective batch size is 16 ( 16 * 1 GPUs)\n  val_batch_size0: 4\n  eval_batch_size0: 1\n  workers: 8\n  persistent_workers: true\n  pin_memory: true\nimage_augmentation:\n  random_crop:\n    enable: true\n    seg_class_max_ratio: 0.75\n    pad_if_needed: true\n    mask_fill: 0 # background idx is 0\n  random_horizontal_flip:\n    enable: true\n  resize:\n    enable: true\n    size: [512, 512]\n    interpolation: \"bilinear\"\n  random_short_size_resize:\n    enable: true\n    interpolation: \"bilinear\"\n    short_side_min: 256\n    short_side_max: 768\n    max_img_dim: 1024\nsampler:\n  name: \"batch_sampler\"\n  bs:\n    crop_size_width: 512\n    crop_size_height: 512\nloss:\n  category: \"composite_loss\"\n  composite_loss:\n    - loss_category: \"segmentation\"\n      loss_weight: 1.0\n      segmentation:\n        name: \"cross_entropy\"\n        cross_entropy:\n          ignore_index: -1\n          aux_weight: 0.4\n    - loss_category: \"neural_augmentation\"\n      loss_weight: 1.0\n      neural_augmentation:\n        perceptual_metric: \"psnr\"\n        target_value: [ 40, 30 ]\n        curriculum_method: \"cosine\"\noptim:\n  name: \"sgd\"\n  weight_decay: 1.e-4\n  no_decay_bn_filter_bias: true\n  sgd:\n    momentum: 0.9\nscheduler:\n  name: \"cosine\"\n  is_iteration_based: false\n  max_epochs: 50\n  cosine:\n    max_lr: 0.02\n    min_lr: 0.0001\nmodel:\n  segmentation:\n    name: \"encoder_decoder\"\n    n_classes: 150\n    lr_multiplier: 1\n    seg_head: \"deeplabv3\"\n    output_stride: 8\n    classifier_dropout: 0.1\n    use_aux_head: true\n    activation:\n      name: \"relu\"\n    deeplabv3:\n      aspp_dropout: 0.1\n      aspp_sep_conv: false\n      aspp_out_channels: 512\n      aspp_rates: [ 12, 24, 36 ]\n  classification:\n    name: \"mobilenetv1\"\n    n_classes: 1000\n    pretrained: \"https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/mobilenetv1_1.0.pt\"\n    activation:\n      name: \"relu\"\n    mobilenetv1:\n      width_multiplier: 1.0\n  learn_augmentation:\n    brightness: true\n    contrast: true\n    noise: true\n    mode: \"distribution\"\n  normalization:\n    name: \"batch_norm\"\n    momentum: 0.1\n  activation:\n    name: \"relu\"\n    inplace: false\n  layer:\n    global_pool: \"mean\"\n    conv_init: \"kaiming_normal\"\n    linear_init: \"normal\"\nema:\n  enable: true\n  momentum: 0.0001\nstats:\n  val: [ \"loss\", \"iou\" ]\n  train: [ \"loss\" ]\n  checkpoint_metric: \"iou\"\n  checkpoint_metric_max: true\n\n# During evaluation (with corenet-eval-seg), we follow following steps:\n#  1. Determine and store the size of input image as metadata\n#  2. Resize image while maintaining the aspect ratio\n#  3. Make a prediction\n#  4. Resize the predicted mask to the same size as original input image\n#  5. compute results\nevaluation:\n  segmentation:\n    resize_input_images: true\n    mode: \"validation_set\"\n"
  },
  {
    "path": "projects/range_augment/segmentation/ade20k/deeplabv3_mobilenet_v2.yaml",
    "content": "taskname: '+ DeepLabv3+MobileNetv2-1.0'\ncommon:\n  run_label: \"train\"\n  accum_freq: 1\n  log_freq: 200\n  auto_resume: false\n  mixed_precision: true\ndataset:\n  root_train: \"/mnt/vision_datasets/ADEChallengeData2016/\"\n  root_val: \"/mnt/vision_datasets/ADEChallengeData2016/\"\n  name: \"ade20k\"\n  category: \"segmentation\"\n  train_batch_size0: 16 # effective batch size is 16 ( 16 * 1 GPUs)\n  val_batch_size0: 4\n  eval_batch_size0: 1\n  workers: 8\n  persistent_workers: true\n  pin_memory: true\nimage_augmentation:\n  random_crop:\n    enable: true\n    seg_class_max_ratio: 0.75\n    pad_if_needed: true\n    mask_fill: 0 # background idx is 0\n  random_horizontal_flip:\n    enable: true\n  resize:\n    enable: true\n    size: [512, 512]\n    interpolation: \"bilinear\"\n  random_short_size_resize:\n    enable: true\n    interpolation: \"bilinear\"\n    short_side_min: 256\n    short_side_max: 768\n    max_img_dim: 1024\nsampler:\n  name: \"batch_sampler\"\n  bs:\n    crop_size_width: 512\n    crop_size_height: 512\nloss:\n  category: \"composite_loss\"\n  composite_loss:\n    - loss_category: \"segmentation\"\n      loss_weight: 1.0\n      segmentation:\n        name: \"cross_entropy\"\n        cross_entropy:\n          ignore_index: -1\n          aux_weight: 0.4\n    - loss_category: \"neural_augmentation\"\n      loss_weight: 1.0\n      neural_augmentation:\n        perceptual_metric: \"psnr\"\n        target_value: [ 40, 30 ]\n        curriculum_method: \"cosine\"\noptim:\n  name: \"sgd\"\n  weight_decay: 1.e-4\n  no_decay_bn_filter_bias: true\n  sgd:\n    momentum: 0.9\nscheduler:\n  name: \"cosine\"\n  is_iteration_based: false\n  max_epochs: 50\n  cosine:\n    max_lr: 0.02\n    min_lr: 0.0001\nmodel:\n  segmentation:\n    name: \"encoder_decoder\"\n    n_classes: 150\n    lr_multiplier: 1\n    seg_head: \"deeplabv3\"\n    output_stride: 8\n    classifier_dropout: 0.1\n    use_aux_head: true\n    activation:\n      name: \"relu\"\n    deeplabv3:\n      aspp_dropout: 0.1\n      aspp_sep_conv: false\n      aspp_out_channels: 512\n      aspp_rates: [ 12, 24, 36 ]\n  classification:\n    name: \"mobilenetv2\"\n    n_classes: 1000\n    pretrained: \"https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/mobilenetv2_1.0.pt\"\n    activation:\n      name: \"relu6\"\n    mobilenetv2:\n      width_multiplier: 1.0\n  learn_augmentation:\n    brightness: true\n    contrast: true\n    noise: true\n    mode: \"distribution\"\n  normalization:\n    name: \"batch_norm\"\n    momentum: 0.1\n  activation:\n    name: \"relu\"\n    inplace: false\n  layer:\n    global_pool: \"mean\"\n    conv_init: \"kaiming_normal\"\n    linear_init: \"normal\"\nema:\n  enable: true\n  momentum: 0.0001\nstats:\n  val: [ \"loss\", \"iou\" ]\n  train: [ \"loss\" ]\n  checkpoint_metric: \"iou\"\n  checkpoint_metric_max: true\n\n# During evaluation (with corenet-eval-seg), we follow following steps:\n#  1. Determine and store the size of input image as metadata\n#  2. Resize image while maintaining the aspect ratio\n#  3. Make a prediction\n#  4. Resize the predicted mask to the same size as original input image\n#  5. compute results\nevaluation:\n  segmentation:\n    resize_input_images: true\n    mode: \"validation_set\"\n"
  },
  {
    "path": "projects/range_augment/segmentation/ade20k/deeplabv3_mobilenet_v3.yaml",
    "content": "taskname: '+ DeepLabv3+MobileNetv3-Large'\ncommon:\n  run_label: \"train\"\n  accum_freq: 1\n  log_freq: 200\n  auto_resume: false\n  mixed_precision: true\n  save_all_checkpoints: true\ndataset:\n  root_train: \"/mnt/vision_datasets/ADEChallengeData2016/\"\n  root_val: \"/mnt/vision_datasets/ADEChallengeData2016/\"\n  name: \"ade20k\"\n  category: \"segmentation\"\n  train_batch_size0: 16 # effective batch size is 16 ( 16 * 1 GPU)\n  val_batch_size0: 4\n  eval_batch_size0: 1\n  workers: 8\n  persistent_workers: false\n  pin_memory: false\nimage_augmentation:\n  random_crop:\n    enable: true\n    seg_class_max_ratio: 0.75\n    pad_if_needed: true\n    mask_fill: 0 # background idx is 0\n  random_horizontal_flip:\n    enable: true\n  resize:\n    enable: true\n    size: [512, 512]\n    interpolation: \"bilinear\"\n  random_short_size_resize:\n    enable: true\n    interpolation: \"bilinear\"\n    short_side_min: 256\n    short_side_max: 768\n    max_img_dim: 1024\nsampler:\n  name: \"batch_sampler\"\n  bs:\n    crop_size_width: 512\n    crop_size_height: 512\nloss:\n  category: \"composite_loss\"\n  composite_loss:\n    - loss_category: \"segmentation\"\n      loss_weight: 1.0\n      segmentation:\n        name: \"cross_entropy\"\n        cross_entropy:\n          ignore_index: -1\n          aux_weight: 0.4\n    - loss_category: \"neural_augmentation\"\n      loss_weight: 1.0\n      neural_augmentation:\n        perceptual_metric: \"psnr\"\n        target_value: [ 40, 30 ]\n        curriculum_method: \"cosine\"\noptim:\n  name: \"sgd\"\n  weight_decay: 1.e-4\n  no_decay_bn_filter_bias: true\n  sgd:\n    momentum: 0.9\nscheduler:\n  name: \"cosine\"\n  is_iteration_based: false\n  max_epochs: 50\n  cosine:\n    max_lr: 0.02\n    min_lr: 0.0001\nmodel:\n  segmentation:\n    name: \"encoder_decoder\"\n    n_classes: 150\n    lr_multiplier: 1\n    seg_head: \"deeplabv3\"\n    output_stride: 8\n    classifier_dropout: 0.1\n    use_aux_head: true\n    activation:\n      name: \"relu\"\n    deeplabv3:\n      aspp_dropout: 0.1\n      aspp_sep_conv: false\n      aspp_out_channels: 512\n      aspp_rates: [ 12, 24, 36 ]\n  classification:\n    name: \"mobilenetv3\"\n    n_classes: 1000\n    pretrained: \"https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/mobilenetv3_large.pt\"\n    mobilenetv3:\n      mode: \"large\"\n      width_multiplier: 1.0\n  learn_augmentation:\n    brightness: true\n    contrast: true\n    noise: true\n    mode: \"distribution\"\n  normalization:\n    name: \"batch_norm\"\n    momentum: 0.1\n  activation:\n    name: \"relu\"\n    inplace: false\n  layer:\n    global_pool: \"mean\"\n    conv_init: \"kaiming_normal\"\n    linear_init: \"normal\"\nema:\n  enable: true\n  momentum: 0.0001\nstats:\n  val: [ \"loss\", \"iou\" ]\n  train: [ \"loss\" ]\n  checkpoint_metric: \"iou\"\n  checkpoint_metric_max: true\n\n# During evaluation (with corenet-eval-seg), we follow following steps:\n#  1. Determine and store the size of input image as metadata\n#  2. Resize image while maintaining the aspect ratio\n#  3. Make a prediction\n#  4. Resize the predicted mask to the same size as original input image\n#  5. compute results\nevaluation:\n  segmentation:\n    resize_input_images: true\n    mode: \"validation_set\"\n"
  },
  {
    "path": "projects/range_augment/segmentation/ade20k/deeplabv3_mobilevit.yaml",
    "content": "taskname: '+ DeepLabv3+MobileViTv1-Small'\ncommon:\n  run_label: \"train\"\n  accum_freq: 2\n  log_freq: 200\n  auto_resume: false\n  mixed_precision: true\ndataset:\n  root_train: \"/mnt/vision_datasets/ADEChallengeData2016/\"\n  root_val: \"/mnt/vision_datasets/ADEChallengeData2016/\"\n  name: \"ade20k\"\n  category: \"segmentation\"\n  train_batch_size0: 16 # effective batch size is 16 ( single A100 GPU)\n  val_batch_size0: 4\n  eval_batch_size0: 1\n  workers: 8\n  persistent_workers: true\n  pin_memory: true\nimage_augmentation:\n  random_crop:\n    enable: true\n    seg_class_max_ratio: 0.75\n    pad_if_needed: true\n    mask_fill: 0 # background idx is 0\n  random_horizontal_flip:\n    enable: true\n  resize:\n    enable: true\n    size: [512, 512]\n    interpolation: \"bicubic\"\n  random_short_size_resize:\n    enable: true\n    interpolation: \"bicubic\"\n    short_side_min: 256\n    short_side_max: 768\n    max_img_dim: 1024\nsampler:\n  name: \"batch_sampler\"\n  bs:\n    crop_size_width: 512\n    crop_size_height: 512\nloss:\n  category: \"composite_loss\"\n  composite_loss:\n    - loss_category: \"segmentation\"\n      loss_weight: 1.0\n      segmentation:\n        name: \"cross_entropy\"\n        cross_entropy:\n          ignore_index: -1\n          aux_weight: 0.4\n    - loss_category: \"neural_augmentation\"\n      loss_weight: 1.0\n      neural_augmentation:\n        perceptual_metric: \"psnr\"\n        target_value: [ 40, 30 ]\n        curriculum_method: \"cosine\"\noptim:\n  name: \"sgd\"\n  weight_decay: 1.e-4\n  no_decay_bn_filter_bias: true\n  sgd:\n    momentum: 0.9\nscheduler:\n  name: \"cosine\"\n  is_iteration_based: false\n  max_epochs: 50\n  cosine:\n    max_lr: 0.02\n    min_lr: 0.0001\nmodel:\n  activation_checkpointing: true\n  segmentation:\n    name: \"encoder_decoder\"\n    n_classes: 150\n    lr_multiplier: 1\n    seg_head: \"deeplabv3\"\n    output_stride: 8\n    use_aux_head: true\n    activation:\n      name: \"relu\"\n    deeplabv3:\n      aspp_dropout: 0.1\n      aspp_sep_conv: false\n      aspp_out_channels: 512\n      aspp_rates: [ 12, 24, 36 ]\n  classification:\n    name: \"mobilevit\"\n    n_classes: 1000\n    pretrained: \"https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/mobilevit_small.pt\"\n    classifier_dropout: 0.1\n    mit:\n      mode: \"small\"\n      ffn_dropout: 0.0\n      attn_dropout: 0.0\n      dropout: 0.1\n      number_heads: 4\n      no_fuse_local_global_features: false\n      conv_kernel_size: 3\n    activation:\n      name: \"swish\"\n  learn_augmentation:\n    brightness: true\n    contrast: true\n    noise: true\n    mode: \"distribution\"\n  normalization:\n    name: \"batch_norm\"\n    momentum: 0.1\n  activation:\n    name: \"swish\"\n    inplace: false\n  layer:\n    global_pool: \"mean\"\n    conv_init: \"kaiming_normal\"\n    linear_init: \"normal\"\nema:\n  enable: true\n  momentum: 0.0005\nstats:\n  val: [ \"loss\", \"iou\" ]\n  train: [ \"loss\" ]\n  checkpoint_metric: \"iou\"\n  checkpoint_metric_max: true\n\n# During evaluation (with corenet-eval-seg), we follow following steps:\n#  1. Determine and store the size of input image as metadata\n#  2. Resize image while maintaining the aspect ratio\n#  3. Make a prediction\n#  4. Resize the predicted mask to the same size as original input image\n#  5. compute results\nevaluation:\n  segmentation:\n    resize_input_images: true\n    mode: \"validation_set\"\n"
  },
  {
    "path": "projects/range_augment/segmentation/ade20k/deeplabv3_resnet_101.yaml",
    "content": "taskname: '+ DeepLabv3+ResNet-101'\ncommon:\n  run_label: \"train\"\n  accum_freq: 1\n  log_freq: 200\n  auto_resume: false\n  mixed_precision: true\ndataset:\n  root_train: \"/mnt/vision_datasets/ADEChallengeData2016/\"\n  root_val: \"/mnt/vision_datasets/ADEChallengeData2016/\"\n  name: \"ade20k\"\n  category: \"segmentation\"\n  train_batch_size0: 16 # effective batch size is 16 ( 16 * 1 GPUs)\n  val_batch_size0: 4\n  eval_batch_size0: 1\n  workers: 8\n  persistent_workers: true\n  pin_memory: true\nimage_augmentation:\n  random_crop:\n    enable: true\n    seg_class_max_ratio: 0.75\n    pad_if_needed: true\n    mask_fill: 0 # background idx is 0\n  random_horizontal_flip:\n    enable: true\n  resize:\n    enable: true\n    size: [512, 512]\n    interpolation: \"bicubic\"\n  random_short_size_resize:\n    enable: true\n    interpolation: \"bicubic\"\n    short_side_min: 256\n    short_side_max: 768\n    max_img_dim: 1024\nsampler:\n  name: \"batch_sampler\"\n  bs:\n    crop_size_width: 512\n    crop_size_height: 512\nloss:\n  category: \"composite_loss\"\n  composite_loss:\n    - loss_category: \"segmentation\"\n      loss_weight: 1.0\n      segmentation:\n        name: \"cross_entropy\"\n        cross_entropy:\n          ignore_index: -1\n          aux_weight: 0.4\n    - loss_category: \"neural_augmentation\"\n      loss_weight: 1.0\n      neural_augmentation:\n        perceptual_metric: \"psnr\"\n        target_value: [ 40, 20 ]\n        curriculum_method: \"cosine\"\noptim:\n  name: \"sgd\"\n  weight_decay: 1.e-4\n  no_decay_bn_filter_bias: true\n  sgd:\n    momentum: 0.9\nscheduler:\n  name: \"cosine\"\n  is_iteration_based: false\n  max_epochs: 50\n  cosine:\n    max_lr: 0.02\n    min_lr: 0.0001\nmodel:\n  segmentation:\n    name: \"encoder_decoder\"\n    n_classes: 150\n    lr_multiplier: 1\n    seg_head: \"deeplabv3\"\n    output_stride: 8\n    use_aux_head: true\n    activation:\n      name: \"relu\"\n    deeplabv3:\n      aspp_dropout: 0.1\n      aspp_sep_conv: false\n      aspp_out_channels: 512\n      aspp_rates: [ 12, 24, 36 ]\n  classification:\n    name: \"resnet\"\n    n_classes: 1000\n    pretrained: \"https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/resnet_101.pt\"\n    activation:\n      name: \"relu\"\n    resnet:\n      depth: 101\n  learn_augmentation:\n    brightness: true\n    contrast: true\n    noise: true\n    mode: \"distribution\"\n  normalization:\n    name: \"batch_norm\"\n    momentum: 0.1\n  activation:\n    name: \"relu\"\n    inplace: false\n  layer:\n    global_pool: \"mean\"\n    conv_init: \"kaiming_normal\"\n    linear_init: \"normal\"\nema:\n  enable: true\n  momentum: 0.0001\nstats:\n  val: [ \"loss\", \"iou\" ]\n  train: [ \"loss\" ]\n  checkpoint_metric: \"iou\"\n  checkpoint_metric_max: true\n\n# During evaluation (with corenet-eval-seg), we follow following steps:\n#  1. Determine and store the size of input image as metadata\n#  2. Resize image while maintaining the aspect ratio\n#  3. Make a prediction\n#  4. Resize the predicted mask to the same size as original input image\n#  5. compute results\nevaluation:\n  segmentation:\n    resize_input_images: true\n    mode: \"validation_set\"\n"
  },
  {
    "path": "projects/range_augment/segmentation/ade20k/deeplabv3_resnet_50.yaml",
    "content": "taskname: '+ DeepLabv3+ResNet-50'\ncommon:\n  run_label: \"train\"\n  accum_freq: 1\n  log_freq: 200\n  auto_resume: false\n  mixed_precision: true\ndataset:\n  root_train: \"/mnt/vision_datasets/ADEChallengeData2016/\"\n  root_val: \"/mnt/vision_datasets/ADEChallengeData2016/\"\n  name: \"ade20k\"\n  category: \"segmentation\"\n  train_batch_size0: 16 # effective batch size is 16 ( 16 * 1 GPUs)\n  val_batch_size0: 4\n  eval_batch_size0: 1\n  workers: 8\n  persistent_workers: true\n  pin_memory: true\nimage_augmentation:\n  random_crop:\n    enable: true\n    seg_class_max_ratio: 0.75\n    pad_if_needed: true\n    mask_fill: 0 # background idx is 0\n  random_horizontal_flip:\n    enable: true\n  resize:\n    enable: true\n    size: [512, 512]\n    interpolation: \"bicubic\"\n  random_short_size_resize:\n    enable: true\n    interpolation: \"bicubic\"\n    short_side_min: 256\n    short_side_max: 768\n    max_img_dim: 1024\nsampler:\n  name: \"batch_sampler\"\n  bs:\n    crop_size_width: 512\n    crop_size_height: 512\nloss:\n  category: \"composite_loss\"\n  composite_loss:\n    - loss_category: \"segmentation\"\n      loss_weight: 1.0\n      segmentation:\n        name: \"cross_entropy\"\n        cross_entropy:\n          ignore_index: -1\n          aux_weight: 0.4\n    - loss_category: \"neural_augmentation\"\n      loss_weight: 1.0\n      neural_augmentation:\n        perceptual_metric: \"psnr\"\n        target_value: [ 40, 20 ]\n        curriculum_method: \"cosine\"\noptim:\n  name: \"sgd\"\n  weight_decay: 1.e-4\n  no_decay_bn_filter_bias: true\n  sgd:\n    momentum: 0.9\nscheduler:\n  name: \"cosine\"\n  is_iteration_based: false\n  max_epochs: 50\n  cosine:\n    max_lr: 0.02\n    min_lr: 0.0001\nmodel:\n  segmentation:\n    name: \"encoder_decoder\"\n    n_classes: 150\n    lr_multiplier: 1\n    seg_head: \"deeplabv3\"\n    output_stride: 8\n    use_aux_head: true\n    activation:\n      name: \"relu\"\n    deeplabv3:\n      aspp_dropout: 0.1\n      aspp_sep_conv: false\n      aspp_out_channels: 512\n      aspp_rates: [ 12, 24, 36 ]\n  classification:\n    name: \"resnet\"\n    n_classes: 1000\n    pretrained: \"https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/resnet_50.pt\"\n    activation:\n      name: \"relu\"\n    resnet:\n      depth: 50\n  learn_augmentation:\n    brightness: true\n    contrast: true\n    noise: true\n    mode: \"distribution\"\n  normalization:\n    name: \"batch_norm\"\n    momentum: 0.1\n  activation:\n    name: \"relu\"\n    inplace: false\n  layer:\n    global_pool: \"mean\"\n    conv_init: \"kaiming_normal\"\n    linear_init: \"normal\"\nema:\n  enable: true\n  momentum: 0.0001\nstats:\n  val: [ \"loss\", \"iou\" ]\n  train: [ \"loss\" ]\n  checkpoint_metric: \"iou\"\n  checkpoint_metric_max: true\n\n# During evaluation (with corenet-eval-seg), we follow following steps:\n#  1. Determine and store the size of input image as metadata\n#  2. Resize image while maintaining the aspect ratio\n#  3. Make a prediction\n#  4. Resize the predicted mask to the same size as original input image\n#  5. compute results\nevaluation:\n  segmentation:\n    resize_input_images: true\n    mode: \"validation_set\"\n"
  },
  {
    "path": "projects/range_augment/segmentation/pascal_voc/deeplabv3_efficientnet_b3.yaml",
    "content": "taskname: '+ DeepLabv3+EfficientNet-B3'\ncommon:\n  run_label: \"train\"\n  accum_freq: 1\n  log_freq: 200\n  auto_resume: false\n  mixed_precision: true\ndataset:\n  root_train: \"/mnt/vision_datasets/pascal_voc/VOCdevkit/\"\n  root_val: \"/mnt/vision_datasets/pascal_voc/VOCdevkit/\"\n  name: \"pascal\"\n  category: \"segmentation\"\n  train_batch_size0: 32 # effective batch size is 128 (32 * 4 GPUs)\n  val_batch_size0: 16\n  eval_batch_size0: 1\n  workers: 8\n  persistent_workers: true\n  pin_memory: true\n  pascal:\n    use_coco_data: true\n    coco_root_dir: \"/mnt/vision_datasets/coco_preprocess\"\nimage_augmentation:\n  random_crop:\n    enable: true\n    seg_class_max_ratio: 0.75\n    pad_if_needed: true\n    mask_fill: 255 # background idx\n  random_horizontal_flip:\n    enable: true\n  resize:\n    enable: true\n    size: [512, 512]\n    interpolation: \"bilinear\"\n  random_short_size_resize:\n    enable: true\n    interpolation: \"bilinear\"\n    short_side_min: 256\n    short_side_max: 768\n    max_img_dim: 1024\nsampler:\n  name: \"batch_sampler\"\n  bs:\n    crop_size_width: 512\n    crop_size_height: 512\nloss:\n  category: \"composite_loss\"\n  composite_loss:\n    - loss_category: \"segmentation\"\n      loss_weight: 1.0\n      segmentation:\n        name: \"cross_entropy\"\n        cross_entropy:\n          ignore_index: 255\n          aux_weight: 0.4\n    - loss_category: \"neural_augmentation\"\n      loss_weight: 1.0\n      neural_augmentation:\n        perceptual_metric: \"psnr\"\n        target_value: [ 40, 20 ]\n        curriculum_method: \"cosine\"\noptim:\n  name: \"sgd\"\n  weight_decay: 1.e-4\n  no_decay_bn_filter_bias: true\n  sgd:\n    momentum: 0.9\nscheduler:\n  name: \"cosine\"\n  is_iteration_based: false\n  max_epochs: 50\n  cosine:\n    max_lr: 0.02\n    min_lr: 0.0001\nmodel:\n  activation_checkpointing: true\n  segmentation:\n    name: \"encoder_decoder\"\n    n_classes: 21\n    lr_multiplier: 1\n    seg_head: \"deeplabv3\"\n    output_stride: 8\n    use_aux_head: true\n    activation:\n      name: \"relu\"\n    deeplabv3:\n      aspp_dropout: 0.1\n      aspp_sep_conv: false\n      aspp_out_channels: 512\n      aspp_rates: [ 12, 24, 36 ]\n  classification:\n    name: \"efficientnet\"\n    n_classes: 1000\n    activation:\n      name: \"swish\"\n    efficientnet:\n      mode: \"b3\"\n      stochastic_depth_prob: 0.0\n    classifier_dropout: 0.0\n    pretrained: \"https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/efficientnet_b3.pt\"\n  learn_augmentation:\n    brightness: true\n    contrast: true\n    noise: true\n    mode: \"distribution\"\n  normalization:\n    name: \"batch_norm\"\n    momentum: 0.1\n  activation:\n    name: \"swish\"\n    inplace: true\n  layer:\n    global_pool: \"mean\"\n    conv_init: \"kaiming_normal\"\n    linear_init: \"normal\"\nema:\n  enable: true\n  momentum: 0.0005\nstats:\n  val: [ \"loss\", \"iou\" ]\n  train: [ \"loss\" ]\n  checkpoint_metric: \"iou\"\n  checkpoint_metric_max: true\n\n# During evaluation (with corenet-eval-seg), we follow following steps:\n#  1. Determine and store the size of input image as metadata\n#  2. Resize image while maintaining the aspect ratio\n#  3. Make a prediction\n#  4. Resize the predicted mask to the same size as original input image\n#  5. compute results\nevaluation:\n  segmentation:\n    resize_input_images: true\n    mode: \"validation_set\"\n"
  },
  {
    "path": "projects/range_augment/segmentation/pascal_voc/deeplabv3_mobilenet_v1.yaml",
    "content": "taskname: '+ DeepLabv3+MobileNetv1-1.0'\ncommon:\n  run_label: \"train\"\n  accum_freq: 1\n  log_freq: 200\n  auto_resume: false\n  mixed_precision: true\ndataset:\n  root_train: \"/mnt/vision_datasets/pascal_voc/VOCdevkit/\"\n  root_val: \"/mnt/vision_datasets/pascal_voc/VOCdevkit/\"\n  name: \"pascal\"\n  category: \"segmentation\"\n  train_batch_size0: 32 # effective batch size is 128 (32 * 4 GPUs)\n  val_batch_size0: 16\n  eval_batch_size0: 1\n  workers: 8\n  persistent_workers: true\n  pin_memory: true\n  pascal:\n    use_coco_data: true\n    coco_root_dir: \"/mnt/vision_datasets/coco_preprocess\"\nimage_augmentation:\n  random_crop:\n    enable: true\n    seg_class_max_ratio: 0.75\n    pad_if_needed: true\n    mask_fill: 255 # background idx\n  random_horizontal_flip:\n    enable: true\n  resize:\n    enable: true\n    size: [512, 512]\n    interpolation: \"bilinear\"\n  random_short_size_resize:\n    enable: true\n    interpolation: \"bilinear\"\n    short_side_min: 256\n    short_side_max: 768\n    max_img_dim: 1024\nsampler:\n  name: \"batch_sampler\"\n  bs:\n    crop_size_width: 512\n    crop_size_height: 512\nloss:\n  category: \"composite_loss\"\n  composite_loss:\n    - loss_category: \"segmentation\"\n      loss_weight: 1.0\n      segmentation:\n        name: \"cross_entropy\"\n        cross_entropy:\n          ignore_index: 255\n          aux_weight: 0.4\n    - loss_category: \"neural_augmentation\"\n      loss_weight: 1.0\n      neural_augmentation:\n        perceptual_metric: \"psnr\"\n        target_value: [ 40, 30 ]\n        curriculum_method: \"cosine\"\noptim:\n  name: \"sgd\"\n  weight_decay: 1.e-4\n  no_decay_bn_filter_bias: true\n  sgd:\n    momentum: 0.9\nscheduler:\n  name: \"cosine\"\n  is_iteration_based: false\n  max_epochs: 50\n  cosine:\n    max_lr: 0.02\n    min_lr: 0.0001\nmodel:\n  segmentation:\n    name: \"encoder_decoder\"\n    n_classes: 21\n    lr_multiplier: 1\n    seg_head: \"deeplabv3\"\n    output_stride: 8\n    classifier_dropout: 0.1\n    use_aux_head: true\n    activation:\n      name: \"relu\"\n    deeplabv3:\n      aspp_dropout: 0.1\n      aspp_sep_conv: false\n      aspp_out_channels: 512\n      aspp_rates: [ 12, 24, 36 ]\n  classification:\n    name: \"mobilenetv1\"\n    n_classes: 1000\n    pretrained: \"https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/mobilenetv1_1.0.pt\"\n    activation:\n      name: \"relu\"\n    mobilenetv1:\n      width_multiplier: 1.0\n  learn_augmentation:\n    brightness: true\n    contrast: true\n    noise: true\n    mode: \"distribution\"\n  normalization:\n    name: \"batch_norm\"\n    momentum: 0.1\n  activation:\n    name: \"relu\"\n    inplace: false\n  layer:\n    global_pool: \"mean\"\n    conv_init: \"kaiming_normal\"\n    linear_init: \"normal\"\nema:\n  enable: true\n  momentum: 0.0001\nstats:\n  val: [ \"loss\", \"iou\" ]\n  train: [ \"loss\" ]\n  checkpoint_metric: \"iou\"\n  checkpoint_metric_max: true\n\n# During evaluation (with corenet-eval-seg), we follow following steps:\n#  1. Determine and store the size of input image as metadata\n#  2. Resize image while maintaining the aspect ratio\n#  3. Make a prediction\n#  4. Resize the predicted mask to the same size as original input image\n#  5. compute results\nevaluation:\n  segmentation:\n    resize_input_images: true\n    mode: \"validation_set\"\n"
  },
  {
    "path": "projects/range_augment/segmentation/pascal_voc/deeplabv3_mobilenet_v2.yaml",
    "content": "taskname: '+ DeepLabv3+MobileNetv2-1.0'\ncommon:\n  run_label: \"train\"\n  accum_freq: 1\n  log_freq: 200\n  auto_resume: false\n  mixed_precision: true\ndataset:\n  root_train: \"/mnt/vision_datasets/pascal_voc/VOCdevkit/\"\n  root_val: \"/mnt/vision_datasets/pascal_voc/VOCdevkit/\"\n  name: \"pascal\"\n  category: \"segmentation\"\n  train_batch_size0: 32 # effective batch size is 128 (32 * 4 GPUs)\n  val_batch_size0: 16\n  eval_batch_size0: 1\n  workers: 8\n  persistent_workers: true\n  pin_memory: true\n  pascal:\n    use_coco_data: true\n    coco_root_dir: \"/mnt/vision_datasets/coco_preprocess\"\nimage_augmentation:\n  random_crop:\n    enable: true\n    seg_class_max_ratio: 0.75\n    pad_if_needed: true\n    mask_fill: 255 # background idx\n  random_horizontal_flip:\n    enable: true\n  resize:\n    enable: true\n    size: [512, 512]\n    interpolation: \"bilinear\"\n  random_short_size_resize:\n    enable: true\n    interpolation: \"bilinear\"\n    short_side_min: 256\n    short_side_max: 768\n    max_img_dim: 1024\nsampler:\n  name: \"batch_sampler\"\n  bs:\n    crop_size_width: 512\n    crop_size_height: 512\nloss:\n  category: \"composite_loss\"\n  composite_loss:\n    - loss_category: \"segmentation\"\n      loss_weight: 1.0\n      segmentation:\n        name: \"cross_entropy\"\n        cross_entropy:\n          ignore_index: 255\n          aux_weight: 0.4\n    - loss_category: \"neural_augmentation\"\n      loss_weight: 1.0\n      neural_augmentation:\n        perceptual_metric: \"psnr\"\n        target_value: [ 40, 30 ]\n        curriculum_method: \"cosine\"\noptim:\n  name: \"sgd\"\n  weight_decay: 1.e-4\n  no_decay_bn_filter_bias: true\n  sgd:\n    momentum: 0.9\nscheduler:\n  name: \"cosine\"\n  is_iteration_based: false\n  max_epochs: 50\n  cosine:\n    max_lr: 0.02\n    min_lr: 0.0001\nmodel:\n  segmentation:\n    name: \"encoder_decoder\"\n    n_classes: 21\n    lr_multiplier: 1\n    seg_head: \"deeplabv3\"\n    output_stride: 8\n    classifier_dropout: 0.1\n    use_aux_head: true\n    activation:\n      name: \"relu\"\n    deeplabv3:\n      aspp_dropout: 0.1\n      aspp_sep_conv: false\n      aspp_out_channels: 512\n      aspp_rates: [ 12, 24, 36 ]\n  classification:\n    name: \"mobilenetv2\"\n    n_classes: 1000\n    pretrained: \"https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/mobilenetv2_1.0.pt\"\n    activation:\n      name: \"relu6\"\n    mobilenetv2:\n      width_multiplier: 1.0\n  learn_augmentation:\n    brightness: true\n    contrast: true\n    noise: true\n    mode: \"distribution\"\n  normalization:\n    name: \"batch_norm\"\n    momentum: 0.1\n  activation:\n    name: \"relu\"\n    inplace: false\n  layer:\n    global_pool: \"mean\"\n    conv_init: \"kaiming_normal\"\n    linear_init: \"normal\"\nema:\n  enable: true\n  momentum: 0.0001\nstats:\n  val: [ \"loss\", \"iou\" ]\n  train: [ \"loss\" ]\n  checkpoint_metric: \"iou\"\n  checkpoint_metric_max: true\n\n# During evaluation (with corenet-eval-seg), we follow following steps:\n#  1. Determine and store the size of input image as metadata\n#  2. Resize image while maintaining the aspect ratio\n#  3. Make a prediction\n#  4. Resize the predicted mask to the same size as original input image\n#  5. compute results\nevaluation:\n  segmentation:\n    resize_input_images: true\n    mode: \"validation_set\"\n"
  },
  {
    "path": "projects/range_augment/segmentation/pascal_voc/deeplabv3_mobilenet_v3.yaml",
    "content": "taskname: '+ DeepLabv3+MobileNetv3-Large'\ncommon:\n  run_label: \"train\"\n  accum_freq: 1\n  log_freq: 200\n  auto_resume: false\n  mixed_precision: true\n  save_all_checkpoints: true\ndataset:\n  root_train: \"/mnt/vision_datasets/pascal_voc/VOCdevkit/\"\n  root_val: \"/mnt/vision_datasets/pascal_voc/VOCdevkit/\"\n  name: \"pascal\"\n  category: \"segmentation\"\n  train_batch_size0: 32 # effective batch size is 128 (32 * 4 GPUs)\n  val_batch_size0: 16\n  eval_batch_size0: 1\n  workers: 8\n  persistent_workers: true\n  pin_memory: true\n  pascal:\n    use_coco_data: true\n    coco_root_dir: \"/mnt/vision_datasets/coco_preprocess\"\nimage_augmentation:\n  random_crop:\n    enable: true\n    seg_class_max_ratio: 0.75\n    pad_if_needed: true\n    mask_fill: 255 # background idx\n  random_horizontal_flip:\n    enable: true\n  resize:\n    enable: true\n    size: [512, 512]\n    interpolation: \"bilinear\"\n  random_short_size_resize:\n    enable: true\n    interpolation: \"bilinear\"\n    short_side_min: 256\n    short_side_max: 768\n    max_img_dim: 1024\nsampler:\n  name: \"batch_sampler\"\n  bs:\n    crop_size_width: 512\n    crop_size_height: 512\nloss:\n  category: \"composite_loss\"\n  composite_loss:\n    - loss_category: \"segmentation\"\n      loss_weight: 1.0\n      segmentation:\n        name: \"cross_entropy\"\n        cross_entropy:\n          ignore_index: 255\n          aux_weight: 0.4\n    - loss_category: \"neural_augmentation\"\n      loss_weight: 1.0\n      neural_augmentation:\n        perceptual_metric: \"psnr\"\n        target_value: [ 40, 30 ]\n        curriculum_method: \"cosine\"\noptim:\n  name: \"sgd\"\n  weight_decay: 1.e-4\n  no_decay_bn_filter_bias: true\n  sgd:\n    momentum: 0.9\nscheduler:\n  name: \"cosine\"\n  is_iteration_based: false\n  max_epochs: 50\n  cosine:\n    max_lr: 0.02\n    min_lr: 0.0001\nmodel:\n  segmentation:\n    name: \"encoder_decoder\"\n    n_classes: 21\n    lr_multiplier: 1\n    seg_head: \"deeplabv3\"\n    output_stride: 8\n    classifier_dropout: 0.1\n    use_aux_head: true\n    activation:\n      name: \"relu\"\n    deeplabv3:\n      aspp_dropout: 0.1\n      aspp_sep_conv: false\n      aspp_out_channels: 512\n      aspp_rates: [ 12, 24, 36 ]\n  classification:\n    name: \"mobilenetv3\"\n    n_classes: 1000\n    pretrained: \"https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/mobilenetv3_large.pt\"\n    mobilenetv3:\n      mode: \"large\"\n      width_multiplier: 1.0\n  learn_augmentation:\n    brightness: true\n    contrast: true\n    noise: true\n    mode: \"distribution\"\n  normalization:\n    name: \"batch_norm\"\n    momentum: 0.1\n  activation:\n    name: \"relu\"\n    inplace: false\n  layer:\n    global_pool: \"mean\"\n    conv_init: \"kaiming_normal\"\n    linear_init: \"normal\"\nema:\n  enable: true\n  momentum: 0.0001\nstats:\n  val: [ \"loss\", \"iou\" ]\n  train: [ \"loss\" ]\n  checkpoint_metric: \"iou\"\n  checkpoint_metric_max: true\n\n# During evaluation (with corenet-eval-seg), we follow following steps:\n#  1. Determine and store the size of input image as metadata\n#  2. Resize image while maintaining the aspect ratio\n#  3. Make a prediction\n#  4. Resize the predicted mask to the same size as original input image\n#  5. compute results\nevaluation:\n  segmentation:\n    resize_input_images: true\n    mode: \"validation_set\"\n"
  },
  {
    "path": "projects/range_augment/segmentation/pascal_voc/deeplabv3_resnet_101.yaml",
    "content": "taskname: '+ DeepLabv3+ResNet-101'\ncommon:\n  run_label: \"train\"\n  accum_freq: 1\n  log_freq: 200\n  auto_resume: false\n  mixed_precision: true\ndataset:\n  root_train: \"/mnt/vision_datasets/pascal_voc/VOCdevkit/\"\n  root_val: \"/mnt/vision_datasets/pascal_voc/VOCdevkit/\"\n  name: \"pascal\"\n  category: \"segmentation\"\n  train_batch_size0: 32 # effective batch size is 128 (32 * 4 GPUs)\n  val_batch_size0: 16\n  eval_batch_size0: 1\n  workers: 8\n  persistent_workers: true\n  pin_memory: true\n  pascal:\n    use_coco_data: true\n    coco_root_dir: \"/mnt/vision_datasets/coco_preprocess\"\nimage_augmentation:\n  random_crop:\n    enable: true\n    seg_class_max_ratio: 0.75\n    pad_if_needed: true\n    mask_fill: 255 # background idx\n  random_horizontal_flip:\n    enable: true\n  resize:\n    enable: true\n    size: [512, 512]\n    interpolation: \"bicubic\"\n  random_short_size_resize:\n    enable: true\n    interpolation: \"bicubic\"\n    short_side_min: 256\n    short_side_max: 768\n    max_img_dim: 1024\nsampler:\n  name: \"batch_sampler\"\n  bs:\n    crop_size_width: 512\n    crop_size_height: 512\nloss:\n  category: \"composite_loss\"\n  composite_loss:\n    - loss_category: \"segmentation\"\n      loss_weight: 1.0\n      segmentation:\n        name: \"cross_entropy\"\n        cross_entropy:\n          ignore_index: 255\n          aux_weight: 0.4\n    - loss_category: \"neural_augmentation\"\n      loss_weight: 1.0\n      neural_augmentation:\n        perceptual_metric: \"psnr\"\n        target_value: [ 40, 20 ]\n        curriculum_method: \"cosine\"\noptim:\n  name: \"sgd\"\n  weight_decay: 1.e-4\n  no_decay_bn_filter_bias: true\n  sgd:\n    momentum: 0.9\nscheduler:\n  name: \"cosine\"\n  is_iteration_based: false\n  max_epochs: 50\n  cosine:\n    max_lr: 0.02\n    min_lr: 0.0001\nmodel:\n  segmentation:\n    name: \"encoder_decoder\"\n    n_classes: 21\n    lr_multiplier: 1\n    seg_head: \"deeplabv3\"\n    output_stride: 8\n    use_aux_head: true\n    activation:\n      name: \"relu\"\n    deeplabv3:\n      aspp_dropout: 0.1\n      aspp_sep_conv: false\n      aspp_out_channels: 512\n      aspp_rates: [ 12, 24, 36 ]\n  classification:\n    name: \"resnet\"\n    n_classes: 1000\n    pretrained: \"https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/resnet_101.pt\"\n    activation:\n      name: \"relu\"\n    resnet:\n      depth: 101\n  learn_augmentation:\n    brightness: true\n    contrast: true\n    noise: true\n    mode: \"distribution\"\n  normalization:\n    name: \"batch_norm\"\n    momentum: 0.1\n  activation:\n    name: \"relu\"\n    inplace: false\n  layer:\n    global_pool: \"mean\"\n    conv_init: \"kaiming_normal\"\n    linear_init: \"normal\"\nema:\n  enable: true\n  momentum: 0.0001\nstats:\n  val: [ \"loss\", \"iou\" ]\n  train: [ \"loss\" ]\n  checkpoint_metric: \"iou\"\n  checkpoint_metric_max: true\n\n# During evaluation (with corenet-eval-seg), we follow following steps:\n#  1. Determine and store the size of input image as metadata\n#  2. Resize image while maintaining the aspect ratio\n#  3. Make a prediction\n#  4. Resize the predicted mask to the same size as original input image\n#  5. compute results\nevaluation:\n  segmentation:\n    resize_input_images: true\n    mode: \"validation_set\"\n"
  },
  {
    "path": "projects/range_augment/segmentation/pascal_voc/deeplabv3_resnet_50.yaml",
    "content": "taskname: '+ DeepLabv3+ResNet-50'\ncommon:\n  run_label: \"train\"\n  accum_freq: 1\n  log_freq: 200\n  auto_resume: false\n  mixed_precision: true\ndataset:\n  root_train: \"/mnt/vision_datasets/pascal_voc/VOCdevkit/\"\n  root_val: \"/mnt/vision_datasets/pascal_voc/VOCdevkit/\"\n  name: \"pascal\"\n  category: \"segmentation\"\n  train_batch_size0: 32 # effective batch size is 128 (32 * 4 GPUs)\n  val_batch_size0: 16\n  eval_batch_size0: 1\n  workers: 8\n  persistent_workers: true\n  pin_memory: true\n  pascal:\n    use_coco_data: true\n    coco_root_dir: \"/mnt/vision_datasets/coco_preprocess\"\nimage_augmentation:\n  random_crop:\n    enable: true\n    seg_class_max_ratio: 0.75\n    pad_if_needed: true\n    mask_fill: 255 # background idx\n  random_horizontal_flip:\n    enable: true\n  resize:\n    enable: true\n    size: [512, 512]\n    interpolation: \"bicubic\"\n  random_short_size_resize:\n    enable: true\n    interpolation: \"bicubic\"\n    short_side_min: 256\n    short_side_max: 768\n    max_img_dim: 1024\nsampler:\n  name: \"batch_sampler\"\n  bs:\n    crop_size_width: 512\n    crop_size_height: 512\nloss:\n  category: \"composite_loss\"\n  composite_loss:\n    - loss_category: \"segmentation\"\n      loss_weight: 1.0\n      segmentation:\n        name: \"cross_entropy\"\n        cross_entropy:\n          ignore_index: 255\n          aux_weight: 0.4\n    - loss_category: \"neural_augmentation\"\n      loss_weight: 1.0\n      neural_augmentation:\n        perceptual_metric: \"psnr\"\n        target_value: [ 40, 20 ]\n        curriculum_method: \"cosine\"\noptim:\n  name: \"sgd\"\n  weight_decay: 1.e-4\n  no_decay_bn_filter_bias: true\n  sgd:\n    momentum: 0.9\nscheduler:\n  name: \"cosine\"\n  is_iteration_based: false\n  max_epochs: 50\n  cosine:\n    max_lr: 0.02\n    min_lr: 0.0001\nmodel:\n  segmentation:\n    name: \"encoder_decoder\"\n    n_classes: 21\n    lr_multiplier: 1\n    seg_head: \"deeplabv3\"\n    output_stride: 8\n    use_aux_head: true\n    activation:\n      name: \"relu\"\n    deeplabv3:\n      aspp_dropout: 0.1\n      aspp_sep_conv: false\n      aspp_out_channels: 512\n      aspp_rates: [ 12, 24, 36 ]\n  classification:\n    name: \"resnet\"\n    n_classes: 1000\n    pretrained: \"https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/resnet_50.pt\"\n    activation:\n      name: \"relu\"\n    resnet:\n      depth: 50\n  learn_augmentation:\n    brightness: true\n    contrast: true\n    noise: true\n    mode: \"distribution\"\n  normalization:\n    name: \"batch_norm\"\n    momentum: 0.1\n  activation:\n    name: \"relu\"\n    inplace: false\n  layer:\n    global_pool: \"mean\"\n    conv_init: \"kaiming_normal\"\n    linear_init: \"normal\"\nema:\n  enable: true\n  momentum: 0.0001\nstats:\n  val: [ \"loss\", \"iou\" ]\n  train: [ \"loss\" ]\n  checkpoint_metric: \"iou\"\n  checkpoint_metric_max: true\n\n# During evaluation (with corenet-eval-seg), we follow following steps:\n#  1. Determine and store the size of input image as metadata\n#  2. Resize image while maintaining the aspect ratio\n#  3. Make a prediction\n#  4. Resize the predicted mask to the same size as original input image\n#  5. compute results\nevaluation:\n  segmentation:\n    resize_input_images: true\n    mode: \"validation_set\"\n"
  },
  {
    "path": "projects/resnet/README.md",
    "content": "# ResNet\n\n[ResNet](https://arxiv.org/abs/1512.03385) introduces skip connections to develop a more accurate visual recognition backbone.\n\nWe provide training and evaluation code of ResNet, along with pretrained models and configuration files for the following tasks:\n\n## Image classification on the ImageNet dataset\n\n### Training\nTo train ResNet50 on [ImageNet 1k](https://image-net.org) with the advanced recipe, using a single node with 8 A100 GPUs, run the following command:\n\n```bash\nexport CFG_FILE=\"projects/resnet/classification/resnet50_in1k.yaml\"\ncorenet-train --common.config-file $CFG_FILE --common.results-loc classification_results\n```\n\nWe assume that the training and validation data is located in `/mnt/imagenet/training` and `/mnt/imagenet/validation` folders, respectively. \n\n### Evaluation\n\nTo evaluate the pre-trained ResNet50 model on the validation set of the ImageNet, run the following command:\n\n```bash\nexport CFG_FILE=\"projects/resnet/classification/resnet50_in1k.yaml\"\nexport MODEL_WEIGHTS=\"https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/advanced/resnet-50-adv.pt\"\nexport DATASET_PATH=\"/mnt/vision_datasets/imagenet/validation/\" # change to the ImageNet validation path\nCUDA_VISIBLE_DEVICES=0 corenet-eval --common.config-file $CFG_FILE --model.classification.pretrained $MODEL_WEIGHTS --common.override-kwargs dataset.root_val=$DATASET_PATH\n```\n\nThis should give\n```\ntop1=80.37 || top5=95.056\n```\n\n## Object detection on the MS-COCO dataset\n\n### Training\nTo train ResNet50 on MS-COCO using a single node with 8 A100 GPUs, run the following command:\n\n```bash\nexport CFG_FILE=\"projects/resnet/detection/ssd_resnet50_coco.yaml\"\ncorenet-train --common.config-file $CFG_FILE --common.results-loc detection_results\n```\n\n### Evaluation\nTo evaluate the pre-trained detection model on the validation set of the COCO, run the following command:\n\n```bash\nexport CFG_FILE=\"projects/resnet/detection/ssd_resnet50_coco.yaml\"\nexport MODEL_WEIGHTS=https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/detection/coco-ssd-resnet-50.pt\nCUDA_VISIBLE_DEVICES=0 corenet-eval-det --common.config-file $CFG_FILE --common.results-loc detection_results --model.detection.pretrained $MODEL_WEIGHTS --evaluation.detection.resize-input-images --evaluation.detection.mode validation_set \n```\n\nThis should give\n\n```\n Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.300\n Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 0.482\n Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 0.309\n Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.073\n Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.315\n Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.531\n Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.271\n Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.402\n Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.426\n Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.141\n Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.475\n Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.680\n```\n\n\n## Pretrained Models\n### Classification (ImageNet-1k)\n\n| Model | Parameters | Top-1 | Pretrained weights | Config file | Logs |\n| ---  | --- | --- | --- | --- | --- |\n| ResNet-34 | 21.8 M | 74.85 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/resnet-34.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/resnet-34.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/resnet-34.logs) |\n| ResNet-50 | 25.6 M | 78.44 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/resnet-50.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/resnet-50.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/resnet-50.logs) |\n| ResNet-101 | 44.5 M | 79.81 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/resnet-101.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/resnet-101.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/resnet-101.logs) |\n| ResNet-34 (advanced recipe) | 21.8 M | 76.91 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/advanced/resnet-34-adv.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/advanced/resnet-34-adv.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/advanced/resnet-34-adv.logs) |\n| ResNet-50 (advanced recipe) | 25.6 M | 80.36 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/advanced/resnet-50-adv.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/advanced/resnet-50-adv.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/advanced/resnet-50-adv.logs) |\n| ResNet-101 (advanced recipe) | 44.5 M | 81.68 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/advanced/resnet-101-adv.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/advanced/resnet-101-adv.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/advanced/resnet-101-adv.logs) |\n\n### Object Detection (MS-COCO)\n| Model | Parameters | MAP | Pretrained weights | Config file | Logs |\n| ---  | --- | --- | --- | --- |  --- |\n| SSD ResNet-50 | 28.5 M | 30.0 | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/detection/coco-ssd-resnet-50.pt) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/detection/coco-ssd-resnet-50.yaml) | [Link](https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/detection/coco-ssd-resnet-50.logs) |\n\n## Citation\nIf you find our work useful, please cite following papers:\n\n```BibTex\n@article{He2015DeepRL,\n  title={Deep Residual Learning for Image Recognition},\n  author={Kaiming He and X. Zhang and Shaoqing Ren and Jian Sun},\n  journal={2016 IEEE Conference on Computer Vision and Pattern Recognition (CVPR)},\n  year={2015},\n  pages={770-778},\n  url={https://api.semanticscholar.org/CorpusID:206594692}\n}\n\n@inproceedings{mehta2022cvnets, \n     author = {Mehta, Sachin and Abdolhosseini, Farzad and Rastegari, Mohammad}, \n     title = {CVNets: High Performance Library for Computer Vision}, \n     year = {2022}, \n     booktitle = {Proceedings of the 30th ACM International Conference on Multimedia}, \n     series = {MM '22} \n}\n```\n"
  },
  {
    "path": "projects/resnet/classification/resnet50_in1k.yaml",
    "content": "taskname: '+ ResNet-50 [adv]'\ncommon:\n  run_label: \"train\"\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\n  tensorboard_logging: false\n  channels_last: true\n  save_all_checkpoints: true\ndataset:\n  root_train: \"/mnt/imagenet/training\"\n  root_val: \"/mnt/imagenet/validation\"\n  name: \"imagenet\"\n  category: \"classification\"\n  train_batch_size0: 256 # effective batch size is 1024 (256 * 4 GPUs)\n  val_batch_size0: 100\n  eval_batch_size0: 100\n  workers: 8\n  persistent_workers: true\n  pin_memory: true\n  collate_fn_name_train: \"image_classification_data_collate_fn\"\n  collate_fn_name_val: \"image_classification_data_collate_fn\"\n  collate_fn_name_test: \"image_classification_data_collate_fn\"\n\nimage_augmentation:\n  random_resized_crop:\n    enable: true\n    interpolation: \"bicubic\"\n  random_horizontal_flip:\n    enable: true\n  rand_augment:\n    enable: true\n  mixup:\n    enable: true\n    alpha: 0.2\n  random_erase:\n    enable: true\n    p: 0.25\n  cutmix:\n    enable: true\n    alpha: 1.0\n  resize:\n    enable: true\n    size: 256 # shorter size is 256\n    interpolation: \"bicubic\"\n  center_crop:\n    enable: true\n    size: 224\nsampler:\n  name: \"variable_batch_sampler\"\n  vbs:\n    crop_size_width: 224\n    crop_size_height: 224\n    max_n_scales: 5\n    min_crop_size_width: 128\n    max_crop_size_width: 320\n    min_crop_size_height: 128\n    max_crop_size_height: 320\n    check_scale: 32\nloss:\n  category: \"classification\"\n  classification:\n    name: \"cross_entropy\"\n    cross_entropy:\n      label_smoothing: 0.1\noptim:\n  name: \"sgd\"\n  weight_decay: 4.e-5\n  no_decay_bn_filter_bias: true\n  sgd:\n    momentum: 0.9\nscheduler:\n  name: \"cosine\"\n  is_iteration_based: false\n  max_epochs: 600\n  warmup_iterations: 7500\n  warmup_init_lr: 0.05\n  cosine:\n    max_lr: 0.4\n    min_lr: 2.e-4\nmodel:\n  classification:\n    name: \"resnet\"\n    n_classes: 1000\n    activation:\n      name: \"relu\"\n    resnet:\n      depth: 50\n  normalization:\n    name: \"batch_norm\"\n    momentum: 0.1\n  activation:\n    name: \"relu\"\n    inplace: true\n  layer:\n    global_pool: \"mean\"\n    conv_init: \"kaiming_normal\"\n    linear_init: \"normal\"\nema:\n  enable: true\n  momentum: 0.0005\nstats:\n  val: [ \"loss\", \"top1\", \"top5\" ]\n  train: [\"loss\"]\n  checkpoint_metric: \"top1\"\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "projects/resnet/detection/ssd_resnet50_coco.yaml",
    "content": "taskname: '+ ResNet-50 SSD'\ncommon:\n  run_label: \"train\"\n  accum_freq: 1\n  accum_after_epoch: -1\n  log_freq: 100\n  auto_resume: true\n  mixed_precision: true\ndataset:\n  root_train: \"/mnt/vision_datasets/coco\"\n  root_val: \"/mnt/vision_datasets/coco\"\n  category: \"detection\"\n  train_batch_size0: 16 # effective batch size is 64 (16 * 4 GPUs)\n  val_batch_size0: 16\n  workers: 8\n  persistent_workers: false\n  pin_memory: true\n  name: \"coco_ssd\"\n  collate_fn_name_train: \"coco_ssd_collate_fn\"\n  collate_fn_name_val: \"coco_ssd_collate_fn\"\n\nimage_augmentation:\n  resize:\n    enable: true\n    size: [384, 384]\n    interpolation: \"bicubic\"\nsampler:\n  name: \"batch_sampler\"\n  bs:\n    crop_size_width: 384\n    crop_size_height: 384\nloss:\n  category: \"detection\"\n  detection:\n    name: \"ssd_multibox_loss\"\n    ssd_multibox_loss:\n      neg_pos_ratio: 3\noptim:\n  name: \"sgd\"\n  weight_decay: 5.e-4\n  no_decay_bn_filter_bias: true\n  sgd:\n    momentum: 0.9\n    nesterov: true\nscheduler:\n  name: \"cosine\"\n  is_iteration_based: false\n  max_epochs: 200\n  warmup_iterations: 1800 # 5 epochs\n  warmup_init_lr: 1.e-6\n  cosine:\n    max_lr: 0.0052\n    min_lr: 0.00005\nanchor_generator:\n  name: \"ssd\"\n  ssd:\n    output_strides: [16, 32, 64, 128]\n    aspect_ratios: [ [2, 3], [2, 3], [2, 3], [2, 3]]\n    min_scale_ratio: 0.1\n    max_scale_ratio: 1.05\nmatcher:\n  name: \"ssd\"\n  ssd:\n    center_variance: 0.1\n    size_variance: 0.2\n    iou_threshold: 0.5\nmodel:\n  detection:\n    name: \"ssd\"\n    n_classes: 81\n    ssd:\n      proj_channels: [512, 1024, 512, 256]\n      nms_iou_threshold: 0.5\n  classification:\n    name: \"resnet\"\n    n_classes: 1000\n    pretrained: \"https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/classification/advanced/resnet-50-adv.pt\"\n    activation:\n      name: \"relu\"\n    resnet:\n      depth: 50\n  normalization:\n    name: \"sync_batch_norm\"\n    momentum: 0.1\n  activation:\n    name: \"relu\"\n    inplace: false\n  layer:\n    global_pool: \"mean\"\n    conv_init: \"kaiming_normal\"\n    linear_init: \"normal\"\nema:\n  enable: true\n  momentum: 0.0001\nstats:\n  val: [ \"loss\", \"coco_map\"]\n  train: [\"loss\"]\n  checkpoint_metric: \"coco_map.bbox\"\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "projects/vit/README.md",
    "content": "# Vision Transformer (ViT)\n\n[ViT](https://arxiv.org/abs/2010.11929) is a transformer-based models for visual recognition tasks. Note that our vision \ntransformer model is different from the original ViT models in several aspects, including agnostic to input image scales. \nPlease see [our RangeAugment paper](https://arxiv.org/abs/2212.10553) where we trained CLIP model with \nViT-B/16 and ViT-H/16 with different input image resolutions.\n\nWe provide training and evaluation code along with pretrained models and configuration files for the task of object classification on the ImageNet dataset.\n\n## ImageNet classification\n\n### Training\nSingle node 4 A100 GPU training of [ViT-Base/16](./classification/vit_base.yaml) can be done using below command:\n\n```bash \nexport CFG_FILE=\"projects/vit/classification/vit_base_in1k.yaml\"\ncorenet-train --common.config-file $CFG_FILE --common.results-loc classification_results\n```\n\n***Note***: Do not forget to change the training and validation dataset locations in configuration files.\n\n### Evaluation\n\nTo evaluate the pre-trained ViT-Base model on the validation set of the ImageNet, run the following command:\n\n```bash\nexport MODEL_WEIGHTS=\"https://docs-assets.developer.apple.com/ml-research/models/corenet/v0.1.0/vit/imagenet-1k/vit_base.pt\"\nexport CFG_FILE=\"projects/vit/classification/vit_base_in1k.yaml\"\nexport DATASET_PATH=\"/mnt/vision_datasets/imagenet/validation/\" # change to the ImageNet validation path\nCUDA_VISIBLE_DEVICES=0 corenet-eval --common.config-file $CFG_FILE --model.classification.pretrained $MODEL_WEIGHTS --common.override-kwargs dataset.root_val=$DATASET_PATH\n```\n\nThis should give\n```\ntop1=80.736 || top5=95.182\n```\n\n## Citation\n\nIf you find our work useful, please cite following papers:\n\n```BibTex\n@inproceedings{dosovitskiy2021an,\n    title={An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale},\n    author={Alexey Dosovitskiy and Lucas Beyer and Alexander Kolesnikov and Dirk Weissenborn and Xiaohua Zhai and Thomas Unterthiner and Mostafa Dehghani and Matthias Minderer and Georg Heigold and Sylvain Gelly and Jakob Uszkoreit and Neil Houlsby},\n    booktitle={International Conference on Learning Representations},\n    year={2021},\n    url={https://openreview.net/forum?id=YicbFdNTTy}\n}\n\n@article{mehta2022rangeaugment,\n  title={RangeAugment: Efficient Online Augmentation with Range Learning},\n  author = {Mehta, Sachin and Naderiparizi, Saeid and Faghri, Fartash and Horton, Maxwell and Chen, Lailin and Farhadi, Ali and Tuzel, Oncel and Rastegari, Mohammad},\n  journal={arXiv preprint arXiv:2212.10553},\n  year={2022},\n  url={https://arxiv.org/abs/2212.10553},\n}\n\n@inproceedings{mehta2022cvnets, \n     author = {Mehta, Sachin and Abdolhosseini, Farzad and Rastegari, Mohammad}, \n     title = {CVNets: High Performance Library for Computer Vision}, \n     year = {2022}, \n     booktitle = {Proceedings of the 30th ACM International Conference on Multimedia}, \n     series = {MM '22} \n}\n```\n"
  },
  {
    "path": "projects/vit/classification/vit_base_in1k.yaml",
    "content": "taskname: '+ ViT-Base/16'\n\ncommon:\n  run_label: \"train\"\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\n  grad_clip: 1.0\n\ndataset:\n  root_train: \"/mnt/imagenet/training\"\n  root_val: \"/mnt/imagenet/validation\"\n  name: \"imagenet\"\n  category: \"classification\"\n  # Effective batch size used in our experiments is 2048 (512 images per GPU * 4 A100 40 GB GPUs)\n  train_batch_size0: 512\n  val_batch_size0: 100\n  eval_batch_size0: 100\n  workers: -1\n  persistent_workers: true\n  pin_memory: true\n\nimage_augmentation:\n  # training related parameters\n  random_resized_crop:\n    enable: true\n    interpolation: \"bilinear\"\n  random_horizontal_flip:\n    enable: true\n  auto_augment:\n    enable: true\n  cutmix:\n    alpha: 1.0\n    enable: true\n    p: 1.0\n  mixup:\n    alpha: 0.2\n    enable: true\n    p: 1.0\n  # validation related parameters\n  resize:\n    enable: true\n    size: 256\n    interpolation: \"bilinear\"\n  center_crop:\n    enable: true\n    size: 224\n\nsampler:\n  name: \"variable_batch_sampler\"\n  num_repeats: 4\n  truncated_repeat_aug_sampler: true\n  vbs:\n    crop_size_width: 224\n    crop_size_height: 224\n    max_n_scales: 25\n    min_crop_size_width: 128\n    max_crop_size_width: 320\n    min_crop_size_height: 128\n    max_crop_size_height: 320\n    check_scale: 32\n\nloss:\n  category: \"classification\"\n  classification:\n    name: \"cross_entropy\"\n    cross_entropy:\n      label_smoothing: 0.1\n\noptim:\n  no_decay_bn_filter_bias: true\n  weight_decay: 0.2\n  name: \"adamw\"\n  adamw:\n    beta1: 0.9\n    beta2: 0.999\n\nscheduler:\n  max_epochs: 300\n  warmup_init_lr: 1.0e-06\n  warmup_iterations: 7500\n  name: \"cosine\"\n  cosine:\n    max_lr: 0.002\n    min_lr: 2.0e-05\n\nmodel:\n  activation_checkpointing: true\n  classification:\n    name: \"vit\"\n    n_classes: 1000\n    vit:\n      mode: \"base\"\n      norm_layer: \"layer_norm_fp32\"\n      use_flash_attention: true\n  activation:\n    name: \"gelu\"\n  normalization:\n    momentum: 0.1\n    name: \"batch_norm\"\n  layer:\n    conv_init: \"kaiming_normal\"\n    linear_init: \"trunc_normal\"\n    linear_init_std_dev: 0.02\n\nema:\n  enable: true\n  momentum: 0.0005\n\nstats:\n  val: [ \"loss\", \"top1\", \"top5\" ]\n  train: [\"loss\"]\n  checkpoint_metric: \"top1\"\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "pyproject.toml",
    "content": "[tool.isort]\nprofile = \"black\"\nskip_gitignore = true\n\n[tool.black]\nextend-exclude = '.history'\n\n[tool.pytest.ini_options]\njunit_family = 'xunit2'\n\n# Add-opts documentation:\n# \"-p no:warnings\" instructs pytest to avoid modifying warnings.filters, as we have a\n#   custom implementation for filtering warnings in corenet/__init__.py. In the CI, the\n#   unexpected warnings are automatically converted to errors by corenet/__init__.py.\n# \"--junit-xml\" generates execution metadata that is used for visualizing test results.\naddopts = '-p no:warnings --junit-xml=./build/test-results/junit_reports/junit.xml'\n\nmarkers = 'skip_ci: Mark a test to be skipped in CI to avoid known issues like download failure.'\n"
  },
  {
    "path": "requirements-optional.txt",
    "content": "ffmpeg-python==0.2.0\n# Installing decord on Mac is tricky. Syntax: https://pip.pypa.io/en/stable/reference/requirement-specifiers/\ndecord==0.6.0 ; sys_platform == 'linux'\n"
  },
  {
    "path": "requirements.txt",
    "content": "psutil==5.9.8\nujson==5.9.0\nscikit-learn==1.4.1.post1\nscikit-image==0.22.0\npyyaml==6.0.1\n\n# requirement for Pytorch, Torchvision, TorchText.\n# This section must be synchronized with the Dockerfile for\n# the image used in CI\ntorch==2.3.0\ntorchvision==0.18.0\ntorchtext==0.18.0\ntorchaudio==2.3.0\ntorchdata==0.7.1\n\n# dependency for coremltools\ncoremltools==7.2\n\n# dependency for MSCOCO dataset\npycocotools==2.0.7\n\n# dependency for cityscape evaluation\ncityscapesscripts==2.2.2\n\n# added as a dependency to reproduce 3rd party models\npytorchvideo==0.1.5\n\n# PyAV for video decoding\nav==12.0.0\n\n# FVCore for FLOP calculation\nfvcore==0.1.5.post20221221\n\n# black for reformatting\nblack==24.4.0\nisort==5.13.2\n\n# testing\npytest==8.1.1\npytest-mock==3.14.0\npytest-xdist==3.5.0\npytest-timeout==2.3.1\n\nftfy==6.2.0\n\n# for hdf5 reading\nh5py==3.10.0\n\n# for reading byte data\npybase64==1.3.2\n\n# For OpenAI's clip tokenizer\nregex==2023.12.25\npyarrow==15.0.2\n\nnumpy==1.26.4\nscipy==1.13.0\npandas==2.2.1\ntqdm==4.66.2\nsetuptools==69.2.0\n\nboto3==1.28.30\n"
  },
  {
    "path": "setup.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport os\nimport platform\nimport re\nimport sys\nfrom pathlib import Path\nfrom typing import Dict, List\n\nfrom setuptools import find_packages, setup\n\n\ndef is_apple_silicon_macos() -> bool:\n    return platform.machine() == \"arm64\" and platform.system() == \"Darwin\"\n\n\ndef parse_requirements(path: str) -> List[str]:\n    \"\"\"Parse a requirements file.\"\"\"\n    requirements = []\n    with open(path, \"r\", encoding=\"utf-8\") as file:\n        for line in file:\n            line = line.split(\"#\", 1)[0].strip()\n            if not line or line.startswith(\"-\"):\n                continue\n            elif line:\n                requirements.append(line)\n    return requirements\n\n\ndef main() -> None:\n    if sys.version_info < (3, 6):\n        sys.exit(\"Sorry, Python >= 3.6 is required for CoreNet.\")\n\n    if sys.platform == \"darwin\":\n        extra_compile_args = [\"-stdlib=libc++\", \"-std=c++17\", \"-O3\"]\n    else:\n        extra_compile_args = [\"-std=c++17\", \"-O3\"]\n\n    (version,) = re.findall(\n        r\"\\d+\\.\\d+\\.\\d+\", Path(\"corenet/__version__.py\").read_text()\n    )\n\n    requirements = parse_requirements(\"requirements.txt\")\n    optional_requirements = parse_requirements(\"requirements-optional.txt\")\n\n    is_internal = os.path.exists(\"internal\")\n    if is_internal:\n        requirements += parse_requirements(\"internal/requirements.txt\")\n        optional_requirements += parse_requirements(\n            \"internal/requirements-optional.txt\"\n        )\n\n    # When installed as a library in other projects, we don't need dev requirements.\n    dev_requirement_regex = r\"^(black|isort|pytest)\"\n    dev_requirements = []\n    for req in requirements[:]:\n        if re.match(dev_requirement_regex, req):\n            dev_requirements.append(req)\n            requirements.remove(req)\n\n    # Dependencies w.r.t MLX\n    if is_apple_silicon_macos():\n        # MLX is only available on Apple Silicon macOS.\n        # https://ml-explore.github.io/mlx/build/html/install.html#troubleshooting\n        mlx_requirements = [\n            \"mlx>=0.9.0\",\n            \"huggingface_hub\",\n        ]\n    else:\n        mlx_requirements = []  # Do not install anything\n\n    sentence_piece_requirements = \"sentencepiece>=0.2.0\"\n\n    sys.path.insert(0, \"corenet/cli\")\n    from entrypoints import console_scripts\n\n    if is_internal:\n        sys.path.insert(0, \"corenet/internal/cli\")\n        del sys.modules[\"entrypoints\"]\n        import entrypoints as internal_entrypoints\n\n        console_scripts += internal_entrypoints.console_scripts\n\n    setup(\n        name=\"corenet\",\n        version=version,\n        description=\"CoreNet: A library for training computer vision networks\",\n        url=\"https://github.com/apple/corenet.git\",\n        python_requires=\">=3.9\",\n        setup_requires=[\n            \"setuptools>=18.0\",\n        ],\n        install_requires=requirements,\n        extras_require={\n            \"dev\": dev_requirements,\n            \"optional\": optional_requirements,\n            \"mlx\": mlx_requirements,\n            \"sentencepiece\": sentence_piece_requirements,\n            \"nltk\": \"nltk>=3.8.1\",\n        },\n        packages=find_packages(include=[\"corenet*\"]),\n        data_files=[\n            (\"corenet-requirements\", [\"requirements.txt\"]),\n            (\"corenet-requirements\", [\"requirements-optional.txt\"]),\n            (\"corenet-config\", get_files(\"config\")),\n            (\"corenet-projects\", get_files(\"projects\")),\n        ]\n        + ([(\"corenet-internal\", get_files(\"internal\"))] if is_internal else []),\n        test_suite=\"tests\",\n        entry_points={\n            \"console_scripts\": console_scripts,\n        },\n        include_package_data=True,\n    )\n\n\ndef get_files(path, relative_to=\".\") -> List[str]:\n    all_files = []\n    for root, _dirs, files in os.walk(path, followlinks=True):\n        root = os.path.relpath(root, relative_to)\n        for file in files:\n            if file.endswith(\".pyc\"):\n                continue\n            all_files.append(os.path.join(root, file))\n    return all_files\n\n\nif __name__ == \"__main__\":\n    main()\n"
  },
  {
    "path": "tests/__init__.py",
    "content": ""
  },
  {
    "path": "tests/configs.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nfrom pathlib import Path\nfrom typing import Any, Callable, Optional\n\nfrom corenet.options.opts import get_training_arguments\nfrom corenet.options.utils import load_config_file\n\n\ndef get_config(\n    config_file: Optional[str] = None,\n    disable_ddp_distributed: bool = True,\n    tmpdir: Optional[Path] = None,\n    add_arguments: Optional[\n        Callable[[argparse.ArgumentParser], argparse.ArgumentParser]\n    ] = None,\n) -> argparse.Namespace:\n    \"\"\"Produces a resolved config (i.e. opts) object to be used in tests.\n\n    Args:\n        config_file: If provided, the contents of the @config_file path will override\n            the default configs.\n        disable_ddp_distributed: ``ddp.distributed`` config entry is not defined in\n            the parser, but rather set by the entrypoints on the fly based on the\n            availability of multiple gpus. In the tests, we usually don't want to use\n            ``ddp.distributed``, even if multiple gpus are available.\n        tmpdir: If provided, overrides `opts.artifacts_root` and `opts.logs_root` to\n            \"{tmpdir}/artifacts\" and \"{tmpdir}/logs\". Defaults to None (no-op).\n        add_arguments: If provided, wraps the argument parser to modify the parser or\n            to add additional arguments dynamically. Defaults to None.\n    \"\"\"\n    if config_file is not None:\n        args = [\"--common.config-file\", config_file]\n    else:\n        args = []\n\n    opts = get_training_arguments(args=args, add_arguments=add_arguments)\n\n    if disable_ddp_distributed:\n        setattr(opts, \"ddp.use_distributed\", False)\n\n    if tmpdir is not None:\n        setattr(opts, \"common.results_loc\", str(tmpdir / \"results\"))\n        setattr(opts, \"common.logs_loc\", str(tmpdir / \"logs\"))\n        Path(getattr(opts, \"common.results_loc\")).mkdir(exist_ok=True, parents=True)\n        Path(getattr(opts, \"common.logs_loc\")).mkdir(exist_ok=True, parents=True)\n    return opts\n\n\n# If slow, this can be turned into a \"session\"-scoped fixture\n# @pytest.fixture(scope='session')\ndef default_training_opts() -> argparse.Namespace:\n    opts = get_training_arguments(args=[])\n    return opts\n\n\ndef modify_attr(opts: argparse.Namespace, key: str, value: Any) -> None:\n    \"\"\"Similar to the builtin setattr() function, but ensures the key already exists to\n    avoid typos or missed renames during refactoring.\n    \"\"\"\n    assert hasattr(opts, key), f\"Invalid attribute {key}.\"\n    setattr(opts, key, value)\n"
  },
  {
    "path": "tests/data/__init__.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n"
  },
  {
    "path": "tests/data/coco/annotations/instances_train2017.json",
    "content": "{\"info\": {\"description\": \"COCO 2017 Dataset\", \"url\": \"http://cocodataset.org\", \"version\": \"1.0\", \"year\": 2017, \"contributor\": \"COCO Consortium\", \"date_created\": \"2017/09/01\"}, \"licenses\": [{\"url\": \"http://creativecommons.org/licenses/by-nc-sa/2.0/\", \"id\": 1, \"name\": \"Attribution-NonCommercial-ShareAlike License\"}, {\"url\": \"http://creativecommons.org/licenses/by-nc/2.0/\", \"id\": 2, \"name\": \"Attribution-NonCommercial License\"}, {\"url\": \"http://creativecommons.org/licenses/by-nc-nd/2.0/\", \"id\": 3, \"name\": \"Attribution-NonCommercial-NoDerivs License\"}, {\"url\": \"http://creativecommons.org/licenses/by/2.0/\", \"id\": 4, \"name\": \"Attribution License\"}, {\"url\": \"http://creativecommons.org/licenses/by-sa/2.0/\", \"id\": 5, \"name\": \"Attribution-ShareAlike License\"}, {\"url\": \"http://creativecommons.org/licenses/by-nd/2.0/\", \"id\": 6, \"name\": \"Attribution-NoDerivs License\"}, {\"url\": \"http://flickr.com/commons/usage/\", \"id\": 7, \"name\": \"No known copyright restrictions\"}, {\"url\": \"http://www.usa.gov/copyright.shtml\", \"id\": 8, \"name\": \"United States Government Work\"}], \"images\": [{\"license\": 4, \"file_name\": \"000000397133.jpg\", \"coco_url\": \"http://images.cocodataset.org/val2017/000000397133.jpg\", \"height\": 427, \"width\": 640, \"date_captured\": \"2013-11-14 17:02:52\", \"flickr_url\": \"http://farm7.staticflickr.com/6116/6255196340_da26cf2c9e_z.jpg\", \"id\": 397133}, {\"license\": 1, \"file_name\": \"000000037777.jpg\", \"coco_url\": \"http://images.cocodataset.org/val2017/000000037777.jpg\", \"height\": 230, \"width\": 352, \"date_captured\": \"2013-11-14 20:55:31\", \"flickr_url\": \"http://farm9.staticflickr.com/8429/7839199426_f6d48aa585_z.jpg\", \"id\": 37777}], \"annotations\": [{\"segmentation\": [[110.39, 135.78, 110.39, 127.62, 110.01, 119.6, 106.87, 118.47, 104.37, 120.1, 102.49, 122.73, 103.74, 125.49, 105.24, 128.88, 106.87, 132.39, 107.38, 135.78, 110.39, 135.65]], \"area\": 88.52115000000006, \"iscrowd\": 0, \"image_id\": 37777, \"bbox\": [102.49, 118.47, 7.9, 17.31], \"category_id\": 64, \"id\": 22328}, {\"segmentation\": [[224.24, 297.18, 228.29, 297.18, 234.91, 298.29, 243.0, 297.55, 249.25, 296.45, 252.19, 294.98, 256.61, 292.4, 254.4, 264.08, 251.83, 262.61, 241.53, 260.04, 235.27, 259.67, 230.49, 259.67, 233.44, 255.25, 237.48, 250.47, 237.85, 243.85, 237.11, 240.54, 234.17, 242.01, 228.65, 249.37, 224.24, 255.62, 220.93, 262.61, 218.36, 267.39, 217.62, 268.5, 218.72, 295.71, 225.34, 297.55]], \"area\": 1481.3806499999994, \"iscrowd\": 0, \"image_id\": 397133, \"bbox\": [217.62, 240.54, 38.99, 57.75], \"category_id\": 44, \"id\": 82445}], \"categories\": [{\"supercategory\": \"person\", \"id\": 1, \"name\": \"person\"}, {\"supercategory\": \"vehicle\", \"id\": 2, \"name\": \"bicycle\"}, {\"supercategory\": \"vehicle\", \"id\": 3, \"name\": \"car\"}, {\"supercategory\": \"vehicle\", \"id\": 4, \"name\": \"motorcycle\"}, {\"supercategory\": \"vehicle\", \"id\": 5, \"name\": \"airplane\"}, {\"supercategory\": \"vehicle\", \"id\": 6, \"name\": \"bus\"}, {\"supercategory\": \"vehicle\", \"id\": 7, \"name\": \"train\"}, {\"supercategory\": \"vehicle\", \"id\": 8, \"name\": \"truck\"}, {\"supercategory\": \"vehicle\", \"id\": 9, \"name\": \"boat\"}, {\"supercategory\": \"outdoor\", \"id\": 10, \"name\": \"traffic light\"}, {\"supercategory\": \"outdoor\", \"id\": 11, \"name\": \"fire hydrant\"}, {\"supercategory\": \"outdoor\", \"id\": 13, \"name\": \"stop sign\"}, {\"supercategory\": \"outdoor\", \"id\": 14, \"name\": \"parking meter\"}, {\"supercategory\": \"outdoor\", \"id\": 15, \"name\": \"bench\"}, {\"supercategory\": \"animal\", \"id\": 16, \"name\": \"bird\"}, {\"supercategory\": \"animal\", \"id\": 17, \"name\": \"cat\"}, {\"supercategory\": \"animal\", \"id\": 18, \"name\": \"dog\"}, {\"supercategory\": \"animal\", \"id\": 19, \"name\": \"horse\"}, {\"supercategory\": \"animal\", \"id\": 20, \"name\": \"sheep\"}, {\"supercategory\": \"animal\", \"id\": 21, \"name\": \"cow\"}, {\"supercategory\": \"animal\", \"id\": 22, \"name\": \"elephant\"}, {\"supercategory\": \"animal\", \"id\": 23, \"name\": \"bear\"}, {\"supercategory\": \"animal\", \"id\": 24, \"name\": \"zebra\"}, {\"supercategory\": \"animal\", \"id\": 25, \"name\": \"giraffe\"}, {\"supercategory\": \"accessory\", \"id\": 27, \"name\": \"backpack\"}, {\"supercategory\": \"accessory\", \"id\": 28, \"name\": \"umbrella\"}, {\"supercategory\": \"accessory\", \"id\": 31, \"name\": \"handbag\"}, {\"supercategory\": \"accessory\", \"id\": 32, \"name\": \"tie\"}, {\"supercategory\": \"accessory\", \"id\": 33, \"name\": \"suitcase\"}, {\"supercategory\": \"sports\", \"id\": 34, \"name\": \"frisbee\"}, {\"supercategory\": \"sports\", \"id\": 35, \"name\": \"skis\"}, {\"supercategory\": \"sports\", \"id\": 36, \"name\": \"snowboard\"}, {\"supercategory\": \"sports\", \"id\": 37, \"name\": \"sports ball\"}, {\"supercategory\": \"sports\", \"id\": 38, \"name\": \"kite\"}, {\"supercategory\": \"sports\", \"id\": 39, \"name\": \"baseball bat\"}, {\"supercategory\": \"sports\", \"id\": 40, \"name\": \"baseball glove\"}, {\"supercategory\": \"sports\", \"id\": 41, \"name\": \"skateboard\"}, {\"supercategory\": \"sports\", \"id\": 42, \"name\": \"surfboard\"}, {\"supercategory\": \"sports\", \"id\": 43, \"name\": \"tennis racket\"}, {\"supercategory\": \"kitchen\", \"id\": 44, \"name\": \"bottle\"}, {\"supercategory\": \"kitchen\", \"id\": 46, \"name\": \"wine glass\"}, {\"supercategory\": \"kitchen\", \"id\": 47, \"name\": \"cup\"}, {\"supercategory\": \"kitchen\", \"id\": 48, \"name\": \"fork\"}, {\"supercategory\": \"kitchen\", \"id\": 49, \"name\": \"knife\"}, {\"supercategory\": \"kitchen\", \"id\": 50, \"name\": \"spoon\"}, {\"supercategory\": \"kitchen\", \"id\": 51, \"name\": \"bowl\"}, {\"supercategory\": \"food\", \"id\": 52, \"name\": \"banana\"}, {\"supercategory\": \"food\", \"id\": 53, \"name\": \"apple\"}, {\"supercategory\": \"food\", \"id\": 54, \"name\": \"sandwich\"}, {\"supercategory\": \"food\", \"id\": 55, \"name\": \"orange\"}, {\"supercategory\": \"food\", \"id\": 56, \"name\": \"broccoli\"}, {\"supercategory\": \"food\", \"id\": 57, \"name\": \"carrot\"}, {\"supercategory\": \"food\", \"id\": 58, \"name\": \"hot dog\"}, {\"supercategory\": \"food\", \"id\": 59, \"name\": \"pizza\"}, {\"supercategory\": \"food\", \"id\": 60, \"name\": \"donut\"}, {\"supercategory\": \"food\", \"id\": 61, \"name\": \"cake\"}, {\"supercategory\": \"furniture\", \"id\": 62, \"name\": \"chair\"}, {\"supercategory\": \"furniture\", \"id\": 63, \"name\": \"couch\"}, {\"supercategory\": \"furniture\", \"id\": 64, \"name\": \"potted plant\"}, {\"supercategory\": \"furniture\", \"id\": 65, \"name\": \"bed\"}, {\"supercategory\": \"furniture\", \"id\": 67, \"name\": \"dining table\"}, {\"supercategory\": \"furniture\", \"id\": 70, \"name\": \"toilet\"}, {\"supercategory\": \"electronic\", \"id\": 72, \"name\": \"tv\"}, {\"supercategory\": \"electronic\", \"id\": 73, \"name\": \"laptop\"}, {\"supercategory\": \"electronic\", \"id\": 74, \"name\": \"mouse\"}, {\"supercategory\": \"electronic\", \"id\": 75, \"name\": \"remote\"}, {\"supercategory\": \"electronic\", \"id\": 76, \"name\": \"keyboard\"}, {\"supercategory\": \"electronic\", \"id\": 77, \"name\": \"cell phone\"}, {\"supercategory\": \"appliance\", \"id\": 78, \"name\": \"microwave\"}, {\"supercategory\": \"appliance\", \"id\": 79, \"name\": \"oven\"}, {\"supercategory\": \"appliance\", \"id\": 80, \"name\": \"toaster\"}, {\"supercategory\": \"appliance\", \"id\": 81, \"name\": \"sink\"}, {\"supercategory\": \"appliance\", \"id\": 82, \"name\": \"refrigerator\"}, {\"supercategory\": \"indoor\", \"id\": 84, \"name\": \"book\"}, {\"supercategory\": \"indoor\", \"id\": 85, \"name\": \"clock\"}, {\"supercategory\": \"indoor\", \"id\": 86, \"name\": \"vase\"}, {\"supercategory\": \"indoor\", \"id\": 87, \"name\": \"scissors\"}, {\"supercategory\": \"indoor\", \"id\": 88, \"name\": \"teddy bear\"}, {\"supercategory\": \"indoor\", \"id\": 89, \"name\": \"hair drier\"}, {\"supercategory\": \"indoor\", \"id\": 90, \"name\": \"toothbrush\"}]}\n"
  },
  {
    "path": "tests/data/coco/annotations/instances_val2017.json",
    "content": "{\"info\": {\"description\": \"COCO 2017 Dataset\", \"url\": \"http://cocodataset.org\", \"version\": \"1.0\", \"year\": 2017, \"contributor\": \"COCO Consortium\", \"date_created\": \"2017/09/01\"}, \"licenses\": [{\"url\": \"http://creativecommons.org/licenses/by-nc-sa/2.0/\", \"id\": 1, \"name\": \"Attribution-NonCommercial-ShareAlike License\"}, {\"url\": \"http://creativecommons.org/licenses/by-nc/2.0/\", \"id\": 2, \"name\": \"Attribution-NonCommercial License\"}, {\"url\": \"http://creativecommons.org/licenses/by-nc-nd/2.0/\", \"id\": 3, \"name\": \"Attribution-NonCommercial-NoDerivs License\"}, {\"url\": \"http://creativecommons.org/licenses/by/2.0/\", \"id\": 4, \"name\": \"Attribution License\"}, {\"url\": \"http://creativecommons.org/licenses/by-sa/2.0/\", \"id\": 5, \"name\": \"Attribution-ShareAlike License\"}, {\"url\": \"http://creativecommons.org/licenses/by-nd/2.0/\", \"id\": 6, \"name\": \"Attribution-NoDerivs License\"}, {\"url\": \"http://flickr.com/commons/usage/\", \"id\": 7, \"name\": \"No known copyright restrictions\"}, {\"url\": \"http://www.usa.gov/copyright.shtml\", \"id\": 8, \"name\": \"United States Government Work\"}], \"images\": [{\"license\": 4, \"file_name\": \"000000397133.jpg\", \"coco_url\": \"http://images.cocodataset.org/val2017/000000397133.jpg\", \"height\": 427, \"width\": 640, \"date_captured\": \"2013-11-14 17:02:52\", \"flickr_url\": \"http://farm7.staticflickr.com/6116/6255196340_da26cf2c9e_z.jpg\", \"id\": 397133}, {\"license\": 1, \"file_name\": \"000000037777.jpg\", \"coco_url\": \"http://images.cocodataset.org/val2017/000000037777.jpg\", \"height\": 230, \"width\": 352, \"date_captured\": \"2013-11-14 20:55:31\", \"flickr_url\": \"http://farm9.staticflickr.com/8429/7839199426_f6d48aa585_z.jpg\", \"id\": 37777}], \"annotations\": [{\"segmentation\": [[110.39, 135.78, 110.39, 127.62, 110.01, 119.6, 106.87, 118.47, 104.37, 120.1, 102.49, 122.73, 103.74, 125.49, 105.24, 128.88, 106.87, 132.39, 107.38, 135.78, 110.39, 135.65]], \"area\": 88.52115000000006, \"iscrowd\": 0, \"image_id\": 37777, \"bbox\": [102.49, 118.47, 7.9, 17.31], \"category_id\": 64, \"id\": 22328}, {\"segmentation\": [[224.24, 297.18, 228.29, 297.18, 234.91, 298.29, 243.0, 297.55, 249.25, 296.45, 252.19, 294.98, 256.61, 292.4, 254.4, 264.08, 251.83, 262.61, 241.53, 260.04, 235.27, 259.67, 230.49, 259.67, 233.44, 255.25, 237.48, 250.47, 237.85, 243.85, 237.11, 240.54, 234.17, 242.01, 228.65, 249.37, 224.24, 255.62, 220.93, 262.61, 218.36, 267.39, 217.62, 268.5, 218.72, 295.71, 225.34, 297.55]], \"area\": 1481.3806499999994, \"iscrowd\": 0, \"image_id\": 397133, \"bbox\": [217.62, 240.54, 38.99, 57.75], \"category_id\": 44, \"id\": 82445}], \"categories\": [{\"supercategory\": \"person\", \"id\": 1, \"name\": \"person\"}, {\"supercategory\": \"vehicle\", \"id\": 2, \"name\": \"bicycle\"}, {\"supercategory\": \"vehicle\", \"id\": 3, \"name\": \"car\"}, {\"supercategory\": \"vehicle\", \"id\": 4, \"name\": \"motorcycle\"}, {\"supercategory\": \"vehicle\", \"id\": 5, \"name\": \"airplane\"}, {\"supercategory\": \"vehicle\", \"id\": 6, \"name\": \"bus\"}, {\"supercategory\": \"vehicle\", \"id\": 7, \"name\": \"train\"}, {\"supercategory\": \"vehicle\", \"id\": 8, \"name\": \"truck\"}, {\"supercategory\": \"vehicle\", \"id\": 9, \"name\": \"boat\"}, {\"supercategory\": \"outdoor\", \"id\": 10, \"name\": \"traffic light\"}, {\"supercategory\": \"outdoor\", \"id\": 11, \"name\": \"fire hydrant\"}, {\"supercategory\": \"outdoor\", \"id\": 13, \"name\": \"stop sign\"}, {\"supercategory\": \"outdoor\", \"id\": 14, \"name\": \"parking meter\"}, {\"supercategory\": \"outdoor\", \"id\": 15, \"name\": \"bench\"}, {\"supercategory\": \"animal\", \"id\": 16, \"name\": \"bird\"}, {\"supercategory\": \"animal\", \"id\": 17, \"name\": \"cat\"}, {\"supercategory\": \"animal\", \"id\": 18, \"name\": \"dog\"}, {\"supercategory\": \"animal\", \"id\": 19, \"name\": \"horse\"}, {\"supercategory\": \"animal\", \"id\": 20, \"name\": \"sheep\"}, {\"supercategory\": \"animal\", \"id\": 21, \"name\": \"cow\"}, {\"supercategory\": \"animal\", \"id\": 22, \"name\": \"elephant\"}, {\"supercategory\": \"animal\", \"id\": 23, \"name\": \"bear\"}, {\"supercategory\": \"animal\", \"id\": 24, \"name\": \"zebra\"}, {\"supercategory\": \"animal\", \"id\": 25, \"name\": \"giraffe\"}, {\"supercategory\": \"accessory\", \"id\": 27, \"name\": \"backpack\"}, {\"supercategory\": \"accessory\", \"id\": 28, \"name\": \"umbrella\"}, {\"supercategory\": \"accessory\", \"id\": 31, \"name\": \"handbag\"}, {\"supercategory\": \"accessory\", \"id\": 32, \"name\": \"tie\"}, {\"supercategory\": \"accessory\", \"id\": 33, \"name\": \"suitcase\"}, {\"supercategory\": \"sports\", \"id\": 34, \"name\": \"frisbee\"}, {\"supercategory\": \"sports\", \"id\": 35, \"name\": \"skis\"}, {\"supercategory\": \"sports\", \"id\": 36, \"name\": \"snowboard\"}, {\"supercategory\": \"sports\", \"id\": 37, \"name\": \"sports ball\"}, {\"supercategory\": \"sports\", \"id\": 38, \"name\": \"kite\"}, {\"supercategory\": \"sports\", \"id\": 39, \"name\": \"baseball bat\"}, {\"supercategory\": \"sports\", \"id\": 40, \"name\": \"baseball glove\"}, {\"supercategory\": \"sports\", \"id\": 41, \"name\": \"skateboard\"}, {\"supercategory\": \"sports\", \"id\": 42, \"name\": \"surfboard\"}, {\"supercategory\": \"sports\", \"id\": 43, \"name\": \"tennis racket\"}, {\"supercategory\": \"kitchen\", \"id\": 44, \"name\": \"bottle\"}, {\"supercategory\": \"kitchen\", \"id\": 46, \"name\": \"wine glass\"}, {\"supercategory\": \"kitchen\", \"id\": 47, \"name\": \"cup\"}, {\"supercategory\": \"kitchen\", \"id\": 48, \"name\": \"fork\"}, {\"supercategory\": \"kitchen\", \"id\": 49, \"name\": \"knife\"}, {\"supercategory\": \"kitchen\", \"id\": 50, \"name\": \"spoon\"}, {\"supercategory\": \"kitchen\", \"id\": 51, \"name\": \"bowl\"}, {\"supercategory\": \"food\", \"id\": 52, \"name\": \"banana\"}, {\"supercategory\": \"food\", \"id\": 53, \"name\": \"apple\"}, {\"supercategory\": \"food\", \"id\": 54, \"name\": \"sandwich\"}, {\"supercategory\": \"food\", \"id\": 55, \"name\": \"orange\"}, {\"supercategory\": \"food\", \"id\": 56, \"name\": \"broccoli\"}, {\"supercategory\": \"food\", \"id\": 57, \"name\": \"carrot\"}, {\"supercategory\": \"food\", \"id\": 58, \"name\": \"hot dog\"}, {\"supercategory\": \"food\", \"id\": 59, \"name\": \"pizza\"}, {\"supercategory\": \"food\", \"id\": 60, \"name\": \"donut\"}, {\"supercategory\": \"food\", \"id\": 61, \"name\": \"cake\"}, {\"supercategory\": \"furniture\", \"id\": 62, \"name\": \"chair\"}, {\"supercategory\": \"furniture\", \"id\": 63, \"name\": \"couch\"}, {\"supercategory\": \"furniture\", \"id\": 64, \"name\": \"potted plant\"}, {\"supercategory\": \"furniture\", \"id\": 65, \"name\": \"bed\"}, {\"supercategory\": \"furniture\", \"id\": 67, \"name\": \"dining table\"}, {\"supercategory\": \"furniture\", \"id\": 70, \"name\": \"toilet\"}, {\"supercategory\": \"electronic\", \"id\": 72, \"name\": \"tv\"}, {\"supercategory\": \"electronic\", \"id\": 73, \"name\": \"laptop\"}, {\"supercategory\": \"electronic\", \"id\": 74, \"name\": \"mouse\"}, {\"supercategory\": \"electronic\", \"id\": 75, \"name\": \"remote\"}, {\"supercategory\": \"electronic\", \"id\": 76, \"name\": \"keyboard\"}, {\"supercategory\": \"electronic\", \"id\": 77, \"name\": \"cell phone\"}, {\"supercategory\": \"appliance\", \"id\": 78, \"name\": \"microwave\"}, {\"supercategory\": \"appliance\", \"id\": 79, \"name\": \"oven\"}, {\"supercategory\": \"appliance\", \"id\": 80, \"name\": \"toaster\"}, {\"supercategory\": \"appliance\", \"id\": 81, \"name\": \"sink\"}, {\"supercategory\": \"appliance\", \"id\": 82, \"name\": \"refrigerator\"}, {\"supercategory\": \"indoor\", \"id\": 84, \"name\": \"book\"}, {\"supercategory\": \"indoor\", \"id\": 85, \"name\": \"clock\"}, {\"supercategory\": \"indoor\", \"id\": 86, \"name\": \"vase\"}, {\"supercategory\": \"indoor\", \"id\": 87, \"name\": \"scissors\"}, {\"supercategory\": \"indoor\", \"id\": 88, \"name\": \"teddy bear\"}, {\"supercategory\": \"indoor\", \"id\": 89, \"name\": \"hair drier\"}, {\"supercategory\": \"indoor\", \"id\": 90, \"name\": \"toothbrush\"}]}\n"
  },
  {
    "path": "tests/data/collate_fns/__init__.py",
    "content": ""
  },
  {
    "path": "tests/data/collate_fns/test_byteformer_collate_fn.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\n\nimport torch\n\nfrom corenet.data.collate_fns import byteformer_collate_functions\n\n\ndef test_byteformer_image_collate_fn() -> None:\n    torch.manual_seed(1)\n    C, H, W = 3, 8, 8\n    batch = [\n        {\n            \"samples\": torch.rand(C, H, W),\n        },\n        {\n            \"samples\": torch.rand(C, H, W),\n        },\n    ]\n\n    padding_index = -1\n    opts = argparse.Namespace()\n    setattr(opts, \"image_augmentation.pil_save.enable\", True)\n    setattr(opts, \"image_augmentation.pil_save.file_encoding\", \"JPEG\")\n    setattr(opts, \"image_augmentation.pil_save.quality\", 100)\n    setattr(opts, \"image_augmentation.shuffle_bytes.enable\", False)\n    setattr(opts, \"image_augmentation.mask_positions.enable\", False)\n    setattr(opts, \"image_augmentation.random_uniform.enable\", False)\n    setattr(opts, \"image_augmentation.byte_permutation.enable\", False)\n    setattr(opts, \"image_augmentation.torchaudio_save.enable\", False)\n    setattr(opts, \"model.classification.byteformer.padding_index\", padding_index)\n\n    collated_batch = byteformer_collate_functions.byteformer_image_collate_fn(\n        batch, opts\n    )\n\n    assert list(collated_batch.keys()) == [\"samples\"]\n    # Padding token should be used\n    assert padding_index in collated_batch[\"samples\"]\n\n\ndef test_wav_collate() -> None:\n    C, N = 1, 16000\n    batch = [\n        {\"samples\": {\"audio\": torch.rand([C, N])}, \"metadata\": {\"audio_fps\": 16000}},\n        {\"samples\": {\"audio\": torch.rand([C, N])}, \"metadata\": {\"audio_fps\": 16000}},\n    ]\n\n    padding_index = -1\n    opts = argparse.Namespace()\n    setattr(opts, \"audio_augmentation.torchaudio_save.enable\", True)\n    setattr(opts, \"audio_augmentation.torchaudio_save.encoding_dtype\", \"float32\")\n    setattr(opts, \"audio_augmentation.torchaudio_save.format\", \"mp3\")\n    setattr(opts, \"audio_augmentation.torchaudio_save.backend\", \"sox\")\n    setattr(opts, \"model.classification.byteformer.padding_index\", padding_index)\n\n    collated_batch = byteformer_collate_functions.byteformer_audio_collate_fn(\n        batch, opts\n    )\n\n    assert list(collated_batch.keys()) == [\"samples\"]\n"
  },
  {
    "path": "tests/data/collate_fns/test_collate_functions.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\nimport argparse\nfrom typing import Any, Callable, List, Mapping\n\nimport pytest\nimport torch\n\nfrom corenet.data.collate_fns.collate_functions import (\n    default_collate_fn,\n    image_classification_data_collate_fn,\n    unlabeled_image_data_collate_fn,\n)\n\n\n@pytest.mark.parametrize(\n    \"collate_fn, channels_last\",\n    [\n        (image_classification_data_collate_fn, True),\n        (image_classification_data_collate_fn, False),\n        (unlabeled_image_data_collate_fn, True),\n        (unlabeled_image_data_collate_fn, False),\n        (default_collate_fn, True),\n    ],\n)\ndef test_image_data_collate_functions(\n    collate_fn: Callable[\n        [List[Mapping[str, Any]], argparse.Namespace], Mapping[str, Any]\n    ],\n    channels_last: bool,\n) -> None:\n    num_samples = 3\n    samples = []\n    for ind in range(num_samples):\n        samples.append(\n            {\"samples\": torch.ones((3, 5, 5)), \"sample_id\": ind, \"targets\": ind}\n        )\n\n    parser = argparse.ArgumentParser()\n    parser.add_argument(\n        \"--common.channels-last\", dest=\"common.channels_last\", action=\"store_true\"\n    )\n    parser.add_argument(\n        \"--no-common.channels-last\", dest=\"common.channels_last\", action=\"store_false\"\n    )\n    if channels_last:\n        opts = parser.parse_args([\"--common.channels-last\"])\n    else:\n        opts = parser.parse_args([\"--no-common.channels-last\"])\n\n    output = collate_fn(samples, opts)\n\n    assert output[\"samples\"].shape == (num_samples, 3, 5, 5)\n    assert output[\"sample_id\"].shape == (num_samples,)\n    assert output[\"targets\"].shape == (num_samples,)\n    assert output[\"sample_id\"].tolist() == list(range(num_samples))\n\n    if (\n        collate_fn == image_classification_data_collate_fn\n        or collate_fn == default_collate_fn\n    ):\n        assert output[\"targets\"].tolist() == list(range(num_samples))\n    elif collate_fn == unlabeled_image_data_collate_fn:\n        assert output[\"targets\"].tolist() == [0] * num_samples\n    else:\n        raise ValueError(\"Trying to test unknown collate function.\")\n"
  },
  {
    "path": "tests/data/datasets/__init__.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n"
  },
  {
    "path": "tests/data/datasets/audio_classification/__init__.py",
    "content": ""
  },
  {
    "path": "tests/data/datasets/audio_classification/test_speech_commands_v2.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nfrom typing import Tuple\nfrom unittest import mock\n\nimport pytest\nimport torch\nfrom torch import Tensor\n\nfrom corenet.data.collate_fns import collate_functions\nfrom corenet.data.datasets.audio_classification.speech_commands_v2 import (\n    SpeechCommandsv2Dataset,\n)\n\n\ndef mock_load(filepath: str) -> Tuple[Tensor, int]:\n    audio_rate = 1024\n    outputs = torch.ones([1, audio_rate], dtype=torch.float) / 255\n    for i, elem in enumerate(filepath):\n        outputs[:, i] = int(elem) / 256\n    return outputs, audio_rate\n\n\ndef mock_process_dataset_config(self) -> None:\n    self.dataset_entries = [\n        {\"audio_filepath\": \"0\", \"command\": \"up\"},\n        {\"audio_filepath\": \"1\", \"command\": \"down\"},\n        {\"audio_filepath\": \"2\", \"command\": \"up\"},\n    ]\n\n    self.noise_files = [\n        \"0\",\n        \"1\",\n    ]\n\n    self.label_to_index = {\"up\": 0, \"down\": 1}\n\n\n@pytest.mark.parametrize(\n    \"is_training,is_evaluation,length,mixup\",\n    [(True, False, 16, False), (False, True, 8, True), (False, False, 4, True)],\n)\n@mock.patch(\"torchaudio.load\", mock_load)\n@mock.patch(\n    \"corenet.data.datasets.audio_classification.speech_commands_v2.SpeechCommandsv2Dataset._process_dataset_config\",\n    mock_process_dataset_config,\n)\ndef test_getitem(\n    is_training: bool, is_evaluation: bool, length: int, mixup: bool\n) -> None:\n    opts = argparse.Namespace()\n    setattr(opts, \"dataset.speech_commands_v2.mixup\", mixup)\n    setattr(opts, \"dataset.root_train\", \"/tmp/train\")\n    setattr(opts, \"dataset.root_val\", \"/tmp/val\")\n    setattr(opts, \"dataset.root_test\", \"/tmp/test\")\n    setattr(opts, \"audio_augmentation.set_fixed_length.enable\", True)\n    setattr(opts, \"audio_augmentation.set_fixed_length.length\", length)\n    setattr(opts, \"audio_augmentation.noise.enable\", False)\n    setattr(opts, \"audio_augmentation.roll.enable\", False)\n\n    dataset = SpeechCommandsv2Dataset(\n        opts, is_training=is_training, is_evaluation=is_evaluation\n    )\n\n    value1 = dataset[(None, None, 0)]\n    value2 = dataset[(None, None, 1)]\n\n    assert torch.any(value1[\"samples\"][\"audio\"] != value2[\"samples\"][\"audio\"])\n    assert value1[\"samples\"][\"audio\"].shape == (1, length)\n\n    # Make sure the elements can be collated.\n    collate_functions.pytorch_default_collate_fn([value1, value2], opts)\n"
  },
  {
    "path": "tests/data/datasets/classification/__init__.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n"
  },
  {
    "path": "tests/data/datasets/classification/dummy_configs/coco.yaml",
    "content": "# pytest: disable\n\ntaskname: '+ ResNet-50 SSD'\n\ncommon:\n  run_label: \"train\"\n  accum_freq: 1\n  accum_after_epoch: -1\n  log_freq: 100\n  auto_resume: true\n  mixed_precision: true\n\ndataset:\n  root_train: \"tests/data/coco\"\n  root_val: \"tests/data/coco\"\n  category: \"classification\"\n  train_batch_size0: 2\n  val_batch_size0: 2\n  eval_batch_size0: 1\n  workers: 0\n  persistent_workers: false\n  pin_memory: true\n  name: \"mock_coco\"\n\nimage_augmentation:\n  # training related parameters\n  random_resized_crop:\n    enable: true\n    interpolation: \"bilinear\"\n  random_horizontal_flip:\n    enable: true\n  # validation related parameters\n  resize:\n    enable: true\n    size: 64\n    interpolation: \"bilinear\"\n  center_crop:\n    enable: true\n    size: 64\n\nsampler:\n  name: \"batch_sampler\"\n  bs:\n    crop_size_width: 64\n    crop_size_height: 64\n\n"
  },
  {
    "path": "tests/data/datasets/classification/dummy_configs/image_classification_dataset.yaml",
    "content": "# pytest: disable\ndataset:\n  root_train: \"tests/data/datasets/classification/dummy_images/training\"\n  root_val: \"tests/data/datasets/classification/dummy_images/validation\"\n  collate_fn_name_train: \"image_classification_data_collate_fn\"\n  collate_fn_name_val: \"image_classification_data_collate_fn\"\n  collate_fn_name_test: \"image_classification_data_collate_fn\"\n  name: \"dummy\"\n  category: \"classification\"\n  train_batch_size0: 2\n  val_batch_size0: 4\n  eval_batch_size0: 4\n  workers: 8\n  persistent_workers: true\n  pin_memory: true\nimage_augmentation:\n  # training related parameters\n  random_resized_crop:\n    enable: true\n    interpolation: \"bilinear\"\n  random_horizontal_flip:\n    enable: true\n  auto_augment:\n    enable: true\n  cutmix:\n    alpha: 1.0\n    enable: true\n    p: 1.0\n  mixup:\n    alpha: 0.2\n    enable: true\n    p: 1.0\n  # validation related parameters\n  resize:\n    enable: true\n    size: 232\n    interpolation: \"bilinear\"\n  center_crop:\n    enable: true\n    size: 224\n\nsampler:\n  name: \"batch_sampler\"\n  bs:\n    crop_size_width: 256\n    crop_size_height: 256\n"
  },
  {
    "path": "tests/data/datasets/classification/dummy_configs/imagenet.yaml",
    "content": "# pytest: disable\ndataset:\n  root_train: \"/mnt/imagenet/training\"\n  root_val: \"/mnt/imagenet/validation\"\n  name: \"imagenet\"\n  category: \"classification\"\n  train_batch_size0: 2\n  val_batch_size0: 2\n  eval_batch_size0: 2\n  workers: 8\n  persistent_workers: true\n  pin_memory: true\n\nimage_augmentation:\n  # training related parameters\n  random_resized_crop:\n    enable: true\n    interpolation: \"bilinear\"\n  random_horizontal_flip:\n    enable: true\n  auto_augment:\n    enable: true\n  cutmix:\n    alpha: 1.0\n    enable: true\n    p: 1.0\n  mixup:\n    alpha: 0.2\n    enable: true\n    p: 1.0\n  # validation related parameters\n  resize:\n    enable: true\n    size: 232\n    interpolation: \"bilinear\"\n  center_crop:\n    enable: true\n    size: 224\n\nsampler:\n  name: \"variable_batch_sampler\"\n  vbs:\n    crop_size_width: 224\n    crop_size_height: 224\n    max_n_scales: 5\n    min_crop_size_width: 128\n    max_crop_size_width: 320\n    min_crop_size_height: 128\n    max_crop_size_height: 320\n    check_scale: 32\n"
  },
  {
    "path": "tests/data/datasets/classification/dummy_configs/imagenet_a.yaml",
    "content": "# pytest: disable\ndataset:\n  root_val: \"/mnt/vision_datasets/imagenet-a-1.0.0/data/raw/\"\n  name: \"imagenet_a\"\n  category: \"classification\"\n  train_batch_size0: 2\n  val_batch_size0: 2\n  eval_batch_size0: 2\n  workers: 8\n  persistent_workers: true\n  pin_memory: true\n\nmodel:\n  classification:\n    n_classes: 1000\n\nimage_augmentation:\n  # training related parameters\n  random_resized_crop:\n    enable: true\n    interpolation: \"bilinear\"\n  random_horizontal_flip:\n    enable: true\n  auto_augment:\n    enable: true\n  cutmix:\n    alpha: 1.0\n    enable: true\n    p: 1.0\n  mixup:\n    alpha: 0.2\n    enable: true\n    p: 1.0\n  # validation related parameters\n  resize:\n    enable: true\n    size: 232\n    interpolation: \"bilinear\"\n  center_crop:\n    enable: true\n    size: 224\n\nsampler:\n  name: \"variable_batch_sampler\"\n  vbs:\n    crop_size_width: 224\n    crop_size_height: 224\n    max_n_scales: 5\n    min_crop_size_width: 128\n    max_crop_size_width: 320\n    min_crop_size_height: 128\n    max_crop_size_height: 320\n    check_scale: 32\n"
  },
  {
    "path": "tests/data/datasets/classification/dummy_configs/imagenet_r.yaml",
    "content": "# pytest: disable\ndataset:\n  root_val: \"/mnt/vision_datasets/imagenet-r-1.0.0/data/raw/\"\n  name: \"imagenet_r\"\n  category: \"classification\"\n  train_batch_size0: 2\n  val_batch_size0: 2\n  eval_batch_size0: 2\n  workers: 8\n  persistent_workers: true\n  pin_memory: true\n\nmodel:\n  classification:\n    n_classes: 1000\n\nimage_augmentation:\n  # training related parameters\n  random_resized_crop:\n    enable: true\n    interpolation: \"bilinear\"\n  random_horizontal_flip:\n    enable: true\n  auto_augment:\n    enable: true\n  cutmix:\n    alpha: 1.0\n    enable: true\n    p: 1.0\n  mixup:\n    alpha: 0.2\n    enable: true\n    p: 1.0\n  # validation related parameters\n  resize:\n    enable: true\n    size: 232\n    interpolation: \"bilinear\"\n  center_crop:\n    enable: true\n    size: 224\n\nsampler:\n  name: \"variable_batch_sampler\"\n  vbs:\n    crop_size_width: 224\n    crop_size_height: 224\n    max_n_scales: 5\n    min_crop_size_width: 128\n    max_crop_size_width: 320\n    min_crop_size_height: 128\n    max_crop_size_height: 320\n    check_scale: 32\n"
  },
  {
    "path": "tests/data/datasets/classification/dummy_configs/imagenet_sketch.yaml",
    "content": "# pytest: disable\ndataset:\n  root_val: \"/mnt/vision_datasets/imagenet-sketch-1.0.0/data/raw/\"\n  name: \"imagenet_sketch\"\n  category: \"classification\"\n  train_batch_size0: 2\n  val_batch_size0: 2\n  eval_batch_size0: 2\n  workers: 8\n  persistent_workers: true\n  pin_memory: true\n\nmodel:\n  classification:\n    n_classes: 1000\n\nimage_augmentation:\n  # training related parameters\n  random_resized_crop:\n    enable: true\n    interpolation: \"bilinear\"\n  random_horizontal_flip:\n    enable: true\n  auto_augment:\n    enable: true\n  cutmix:\n    alpha: 1.0\n    enable: true\n    p: 1.0\n  mixup:\n    alpha: 0.2\n    enable: true\n    p: 1.0\n  # validation related parameters\n  resize:\n    enable: true\n    size: 232\n    interpolation: \"bilinear\"\n  center_crop:\n    enable: true\n    size: 224\n\nsampler:\n  name: \"variable_batch_sampler\"\n  vbs:\n    crop_size_width: 224\n    crop_size_height: 224\n    max_n_scales: 5\n    min_crop_size_width: 128\n    max_crop_size_width: 320\n    min_crop_size_height: 128\n    max_crop_size_height: 320\n    check_scale: 32\n"
  },
  {
    "path": "tests/data/datasets/classification/dummy_configs/wordnet_tagged_classification.yaml",
    "content": "# pytest: disable\n\ntaskname: '+ CatLIP ViT-B/16 [DataComp]'\n\n_anchor_vocab_size: &_anchor_vocab_size 10\n\ncommon:\n  run_label: \"train\"\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\n  mixed_precision_dtype: \"bfloat16\"\n  grad_clip: 1.0\n  save_all_checkpoints: true\n  save_interval_freq: 5000\n\ndataset:\n  # root_train does not matter for img_text_tar dataset because dataset is information is expected\n  # to be contained in metadata file.\n  root_train: \"\"\n  disable_val: true\n  train_batch_size0: 2\n  workers: 0\n  persistent_workers: true\n  pin_memory: true\n  name: \"wordnet_tagged_classification\"\n  category: \"classification\"\n  wordnet_tagged_classification:\n    metadata_file: \".corenet_data_cache/metadata.pkl\"\n    vocab_file: \".corenet_data_cache/vocab.pkl\"\n    vocab_size: *_anchor_vocab_size\n\nimage_augmentation:\n  # training related augmentations\n  random_resized_crop:\n    enable: true\n    interpolation: \"bilinear\"\n  random_horizontal_flip:\n    enable: true\n"
  },
  {
    "path": "tests/data/datasets/classification/mock_coco.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom typing import Optional\n\nimport numpy as np\nfrom PIL import Image\n\nfrom corenet.data.datasets import DATASET_REGISTRY\nfrom corenet.data.datasets.classification.coco import COCOClassification\n\n\n@DATASET_REGISTRY.register(name=\"mock_coco\", type=\"classification\")\nclass MockCOCOClassification(COCOClassification):\n    @staticmethod\n    def read_image_pil(path: str) -> Optional[Image.Image]:\n        \"\"\"Mock the init logic for read_image_pil function.\n\n        Instead of reading a PIL image at location specified by `path`, a random PIL\n        image is returned.\n        \"\"\"\n        im_arr = np.random.randint(low=0, high=255, size=(32, 32, 3), dtype=np.uint8)\n        return Image.fromarray(im_arr).convert(\"RGB\")\n"
  },
  {
    "path": "tests/data/datasets/classification/mock_imagenet.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\nimport argparse\nimport random\nfrom typing import Optional\n\nimport numpy as np\nfrom PIL import Image\n\nfrom corenet.data.datasets import DATASET_REGISTRY\nfrom corenet.data.datasets.classification.imagenet import ImageNetDataset\nfrom corenet.data.datasets.classification.imagenet_a import (\n    IMAGENET_A_CLASS_SUBLIST,\n    ImageNetADataset,\n)\nfrom corenet.data.datasets.classification.imagenet_r import (\n    IMAGENET_R_CLASS_SUBLIST,\n    ImageNetRDataset,\n)\nfrom corenet.data.datasets.classification.imagenet_sketch import ImageNetSketchDataset\n\nTOTAL_SAMPLES = 10\n\n\n@DATASET_REGISTRY.register(name=\"mock_imagenet\", type=\"classification\")\nclass MockImageNetDataset(ImageNetDataset):\n    def __init__(\n        self,\n        opts: argparse.Namespace,\n        is_training: bool = False,\n        is_evaluation: bool = False,\n        *args,\n        **kwargs\n    ) -> None:\n        \"\"\"Mock the init logic for ImageNet dataset.\n\n        Specifically, we replace the samples and targets with random data so that actual dataset is not\n        required for testing purposes.\n        \"\"\"\n        # super() is not called here intentionally.\n        self.opts = opts\n        self.root = None\n        self.targets = [random.randint(0, self.n_classes) for _ in range(TOTAL_SAMPLES)]\n        self.imgs = [\"img_path\" for _ in range(TOTAL_SAMPLES)]\n        self.samples = [\n            [img_path, target_label]\n            for img_path, target_label in zip(self.imgs, self.targets)\n        ]\n        self.is_training = is_training\n        self.is_evaluation = is_evaluation\n\n    @property\n    def n_classes(self):\n        return 1000\n\n    @staticmethod\n    def read_image_pil(path: str) -> Optional[Image.Image]:\n        \"\"\"Mock the init logic for read_image_pil function.\n\n        Instead of reading a PIL image at location specified by `path`, a random PIL\n        image is returned. The randomness in height and width dimensions may allow us to\n        catch errors in transform functions.\n        \"\"\"\n        width = random.randint(32, 64)\n        height = random.randint(32, 64)\n        im_arr = np.random.randint(\n            low=0, high=255, size=(width, height, 3), dtype=np.uint8\n        )\n        return Image.fromarray(im_arr).convert(\"RGB\")\n\n\n@DATASET_REGISTRY.register(name=\"mock_imagenet_a\", type=\"mock_classification\")\nclass MockImageNetADataset(MockImageNetDataset, ImageNetADataset):\n    def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None:\n        \"\"\"Mock the init logit for ImageNetA dataset.\"\"\"\n        MockImageNetDataset.__init__(self, opts, *args, **kwargs)\n        self.post_init_checks()\n\n    @property\n    def n_classes(self):\n        return len(IMAGENET_A_CLASS_SUBLIST)\n\n\n@DATASET_REGISTRY.register(name=\"mock_imagenet_r\", type=\"mock_classification\")\nclass MockImageNetRDataset(MockImageNetDataset, ImageNetRDataset):\n    def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None:\n        \"\"\"Mock the init logit for ImageNetR dataset.\"\"\"\n        MockImageNetDataset.__init__(self, opts, *args, **kwargs)\n        self.post_init_checks()\n\n    @property\n    def n_classes(self):\n        return len(IMAGENET_R_CLASS_SUBLIST)\n\n\n@DATASET_REGISTRY.register(name=\"mock_imagenet_sketch\", type=\"mock_classification\")\nclass MockImageNetSketchDataset(MockImageNetDataset, ImageNetSketchDataset):\n    def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None:\n        \"\"\"Mock the init logit for ImageNetSketch dataset.\"\"\"\n        MockImageNetDataset.__init__(self, opts, *args, **kwargs)\n        self.post_init_checks()\n"
  },
  {
    "path": "tests/data/datasets/classification/mock_wordnet_tagged_classification.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nimport base64\nimport io\nimport os\nimport pickle\nimport subprocess\n\nfrom PIL import Image\n\nfrom corenet.constants import DATA_CACHE_DIR\nfrom corenet.data.datasets import DATASET_REGISTRY\nfrom corenet.data.datasets.classification.wordnet_tagged_classification import (\n    WordnetTaggedClassificationDataset,\n)\n\n\ndef _generate_dummy_data() -> None:\n    \"\"\"Generate dummy data for CI/CD.\"\"\"\n\n    total_samples = 4\n    num_samples_per_tar = 2\n\n    for sample_idx in range(total_samples):\n        folder_idx = sample_idx // num_samples_per_tar\n        folder_path = f\"{DATA_CACHE_DIR}/{folder_idx}\"\n        os.makedirs(folder_path, exist_ok=True)\n        with open(f\"{folder_path}/{sample_idx}.pkl\", \"wb\") as f:\n            image = Image.new(\"RGB\", (32, 32), color=\"black\")\n            image_bytes = io.BytesIO()\n            image.save(image_bytes, format=\"JPEG\")\n            image_bytes.seek(0)\n            encoded_image = base64.b64encode(image_bytes.read())\n\n            data = {\"image\": encoded_image, \"text\": \"An image of black dog.\"}\n            pickle.dump(data, f)\n\n    metadata = {\n        \"total_tar_files\": 2,\n        \"max_files_per_tar\": num_samples_per_tar,\n        \"tar_file_names\": [\"0.tar.gz\", \"1.tar.gz\"],\n    }\n\n    with open(f\"{DATA_CACHE_DIR}/metadata.pkl\", \"wb\") as f:\n        pickle.dump(metadata, f)\n\n    vocab = {\n        \"n5928118\": 52418327,  # image\n        \"n13333833\": 46393897,  # stock\n        \"n4960277\": 38781582,  # black\n        \"n7947958\": 36532096,\n        \"n9638875\": 34564013,\n        \"n928077\": 30290822,\n        \"n7996689\": 28076676,\n        \"n10787470\": 24182531,\n        \"n5938976\": 23817664,\n        \"n8559508\": 23476398,\n    }\n    with open(f\"{DATA_CACHE_DIR}/vocab.pkl\", \"wb\") as f:\n        pickle.dump(vocab, f)\n\n\n@DATASET_REGISTRY.register(\n    name=\"mock_wordnet_tagged_classification\", type=\"classification\"\n)\nclass MockWordnetTaggedClassificationDataset(WordnetTaggedClassificationDataset):\n    \"\"\"A wrapper around WordnetTaggedClassificationDataset that generates dummy data for CI/CD.\n\n    Args:\n        opts: Command-line arguments.\n    \"\"\"\n\n    def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None:\n        import nltk\n\n        # download nltk datasets\n        nltk.download(\"all\")\n        _generate_dummy_data()\n        super().__init__(opts, *args, **kwargs)\n"
  },
  {
    "path": "tests/data/datasets/classification/test_base_image_classification_dataset.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport functools\n\nimport pytest\n\nfrom corenet.data.collate_fns import build_collate_fn\nfrom corenet.data.data_loaders import CoreNetDataLoader\nfrom corenet.data.datasets.classification.base_image_classification_dataset import (\n    BaseImageClassificationDataset,\n)\nfrom corenet.data.sampler import build_sampler\nfrom tests.configs import get_config\n\n\n@pytest.mark.parametrize(\n    \"num_samples_per_category, percentage_of_samples, is_training\",\n    [\n        (-1, None, True),\n        (0, None, True),\n        (1, None, True),\n        (1, None, False),\n        (2, None, True),\n        (2, None, False),\n        (None, 50, True),\n        (None, 50, False),\n        (None, -10, True),\n        (None, 0, True),\n        (None, 120, True),\n    ],\n)\ndef test_base_image_classification_dataset(\n    num_samples_per_category: int, percentage_of_samples: float, is_training: bool\n) -> None:\n    \"\"\"\n    Test for corenet.data.datasets.classification.base_image_classification_dataset.BaseImageClassificationDataset\n    \"\"\"\n\n    config_file_path = \"tests/data/datasets/classification/dummy_configs/image_classification_dataset.yaml\"\n    opts = get_config(config_file=config_file_path)\n    num_classes = 2\n    num_samples = 4\n    # we can't control this parameter from config as it is not defined in parser.\n    setattr(opts, \"ddp.use_distributed\", False)\n    if num_samples_per_category is not None:\n        setattr(opts, \"dataset.num_samples_per_category\", num_samples_per_category)\n    else:\n        setattr(opts, \"dataset.percentage_of_samples\", percentage_of_samples)\n    dataset = BaseImageClassificationDataset(\n        opts, is_training=is_training, is_evaluation=False\n    )\n    sampler = build_sampler(opts, n_data_samples=len(dataset), is_training=is_training)\n    collate_fn_train, collate_fn_val = build_collate_fn(opts=opts)\n\n    if is_training:\n        crop_size_width = getattr(opts, \"sampler.bs.crop_size_width\")\n        crop_size_height = getattr(opts, \"sampler.bs.crop_size_height\")\n        batch_size = getattr(opts, \"dataset.train_batch_size0\")\n        collate_fn = collate_fn_train\n        if num_samples_per_category and num_samples_per_category > 0:\n            expected_num_samples = num_classes * num_samples_per_category\n        elif percentage_of_samples and 0 < percentage_of_samples < 100:\n            expected_num_samples = num_samples * percentage_of_samples / 100\n        else:\n            expected_num_samples = num_samples\n    else:\n        crop_size_width = getattr(opts, \"image_augmentation.center_crop.size\")\n        crop_size_height = getattr(opts, \"image_augmentation.center_crop.size\")\n        batch_size = getattr(opts, \"dataset.val_batch_size0\")\n        collate_fn = collate_fn_val\n        expected_num_samples = num_samples\n\n    loader = CoreNetDataLoader(\n        dataset=dataset,\n        batch_sampler=sampler,\n        batch_size=1,\n        num_workers=0,\n        collate_fn=functools.partial(collate_fn, opts=opts),\n    )\n\n    assert len(dataset) == expected_num_samples\n\n    for batch in loader:\n        assert batch.keys() == {\"samples\", \"sample_id\", \"targets\"}\n        assert [*batch[\"samples\"].shape] == [\n            batch_size,\n            3,\n            crop_size_height,\n            crop_size_width,\n        ]\n        assert [*batch[\"sample_id\"].shape] == [batch_size]\n        assert [*batch[\"targets\"].shape] == [batch_size]\n"
  },
  {
    "path": "tests/data/datasets/classification/test_mock_coco.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom corenet.data.loader.dataloader import CoreNetDataLoader\nfrom corenet.data.sampler import build_sampler\nfrom tests.configs import get_config\nfrom tests.data.datasets.classification.mock_coco import MockCOCOClassification\n\n\ndef test_coco_dataset() -> None:\n    \"\"\"Test for COCO classification dataset.\"\"\"\n    config_file_path = \"tests/data/datasets/classification/dummy_configs/coco.yaml\"\n    opts = get_config(config_file=config_file_path)\n\n    dataset = MockCOCOClassification(opts)\n\n    train_sampler = build_sampler(opts, n_data_samples=len(dataset), is_training=True)\n\n    train_loader = CoreNetDataLoader(\n        dataset=dataset,\n        batch_sampler=train_sampler,\n        batch_size=1,\n        num_workers=0,\n    )\n\n    for batch in train_loader:\n        assert batch.keys() == {\"samples\", \"targets\", \"sample_id\"}\n        # bounds from the config file\n        assert list(batch[\"samples\"].shape) == [\n            2,\n            3,\n            64,\n            64,\n        ], \"The output shape should be [2, 3, 64, 64].\"\n        assert list(batch[\"targets\"].shape) == [\n            2,\n            80,\n        ], \"Batch size should be 2 and number of classes should be 80.\"\n        assert (\n            batch[\"sample_id\"].dim() == 1\n        ), \"Expecting sample_id's in [batch, ] format\"\n"
  },
  {
    "path": "tests/data/datasets/classification/test_mock_imagenet.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom typing import Type\n\nimport pytest\n\nfrom corenet.data.loader.dataloader import CoreNetDataLoader\nfrom corenet.data.sampler import build_sampler\nfrom tests.configs import get_config\nfrom tests.data.datasets.classification.mock_imagenet import (\n    MockImageNetADataset,\n    MockImageNetDataset,\n    MockImageNetRDataset,\n    MockImageNetSketchDataset,\n)\n\n\n@pytest.mark.parametrize(\n    \"config_file_path,mock_dataset_class,eval_only\",\n    [\n        (\n            \"tests/data/datasets/classification/dummy_configs/imagenet.yaml\",\n            MockImageNetDataset,\n            False,\n        ),\n        (\n            \"tests/data/datasets/classification/dummy_configs/imagenet_a.yaml\",\n            MockImageNetADataset,\n            True,\n        ),\n        (\n            \"tests/data/datasets/classification/dummy_configs/imagenet_r.yaml\",\n            MockImageNetRDataset,\n            True,\n        ),\n        (\n            \"tests/data/datasets/classification/dummy_configs/imagenet_sketch.yaml\",\n            MockImageNetSketchDataset,\n            True,\n        ),\n    ],\n)\ndef test_imagenet_dataset_train(\n    config_file_path: str,\n    mock_dataset_class: Type[MockImageNetDataset],\n    eval_only: bool,\n) -> None:\n    \"\"\"Test for ImageNet dataset and its variants.\n\n    This test mocks `__init__` and `read_image_pil` functions to test the `__getitem__`\n    function (that includes data transforms). Training and validation datasets are\n    wrapped inside the respective data loaders to test the collate function used by\n    dataset.\n\n    Args:\n      config_file_path: Path to a dummy config for initializing the dataset.\n      mock_dataset_class: The class type for ImageNet or one of its shifts.\n      eval_only: If set, the dataset is tested to be for evaluation-only.\n    \"\"\"\n    opts = get_config(config_file=config_file_path)\n\n    if eval_only:\n        with pytest.raises(Exception):\n            training_imagenet_dataset = mock_dataset_class(\n                opts, is_training=True, is_evaluation=False\n            )\n        return\n    else:\n        training_imagenet_dataset = mock_dataset_class(\n            opts, is_training=True, is_evaluation=False\n        )\n\n    train_sampler = build_sampler(\n        opts, n_data_samples=len(training_imagenet_dataset), is_training=True\n    )\n\n    train_loader = CoreNetDataLoader(\n        dataset=training_imagenet_dataset,\n        batch_sampler=train_sampler,\n        batch_size=1,\n        num_workers=0,\n    )\n\n    for batch in train_loader:\n        assert batch.keys() == {\"samples\", \"targets\", \"sample_id\"}\n        # bounds from the config file\n        assert 128 <= batch[\"samples\"].shape[-2] <= 320\n        assert 128 <= batch[\"samples\"].shape[-1] <= 320\n        assert batch[\"samples\"].dim() == 4, (\n            \"Expecting input images in \" \"[batch, image_channels, height, width] format\"\n        )\n        assert batch[\"targets\"].dim() == 1, \"Expecting labels in [batch, ] format\"\n        assert (\n            batch[\"sample_id\"].dim() == 1\n        ), \"Expecting sample_id's in [batch, ] format\"\n\n\n@pytest.mark.parametrize(\n    \"config_file_path,mock_dataset_class\",\n    [\n        (\n            \"tests/data/datasets/classification/dummy_configs/imagenet.yaml\",\n            MockImageNetDataset,\n        ),\n        (\n            \"tests/data/datasets/classification/dummy_configs/imagenet_a.yaml\",\n            MockImageNetADataset,\n        ),\n        (\n            \"tests/data/datasets/classification/dummy_configs/imagenet_r.yaml\",\n            MockImageNetRDataset,\n        ),\n        (\n            \"tests/data/datasets/classification/dummy_configs/imagenet_sketch.yaml\",\n            MockImageNetSketchDataset,\n        ),\n    ],\n)\ndef test_imagenet_dataset_val(\n    config_file_path: str,\n    mock_dataset_class: Type[MockImageNetDataset],\n) -> None:\n    \"\"\"Test for ImageNet dataset and its variants.\n\n    This test mocks `__init__` and `read_image_pil` functions to test the `__getitem__`\n    function (that includes data transforms). Training and validation datasets are\n    wrapped inside the respective data loaders to test the collate function used by\n    dataset.\n\n    Args:\n      config_file_path: Path to a dummy config for initializing the dataset.\n      mock_dataset_class: The class type for ImageNet or one of its shifts.\n    \"\"\"\n    opts = get_config(config_file=config_file_path)\n\n    valid_imagenet_dataset = mock_dataset_class(\n        opts, is_training=False, is_evaluation=False\n    )\n\n    val_sampler = build_sampler(\n        opts, n_data_samples=len(valid_imagenet_dataset), is_training=False\n    )\n\n    val_loader = CoreNetDataLoader(\n        dataset=valid_imagenet_dataset,\n        batch_sampler=val_sampler,\n        batch_size=1,\n        num_workers=0,\n    )\n\n    for batch in val_loader:\n        assert batch.keys() == {\"samples\", \"targets\", \"sample_id\"}\n        # values from config file\n        assert [*batch[\"samples\"].shape[2:]] == [224, 224]\n        assert batch[\"samples\"].dim() == 4, (\n            \"Expecting input images in \" \"[batch, image_channels, height, width] format\"\n        )\n        assert batch[\"targets\"].dim() == 1, \"Expecting labels in [batch, ] format\"\n        assert (\n            batch[\"sample_id\"].dim() == 1\n        ), \"Expecting sample_id's in [batch, ] format\"\n"
  },
  {
    "path": "tests/data/datasets/classification/test_wordnet_tagged_classification.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport sys\n\nimport pytest\nimport torch\n\nfrom tests.configs import get_config\nfrom tests.data.datasets.classification.mock_wordnet_tagged_classification import (\n    MockWordnetTaggedClassificationDataset,\n)\n\n\n@pytest.mark.parametrize(\"image_size\", [16, 32])\ndef test_wordnet_tagged_classification_dataset(image_size: int) -> None:\n    \"\"\"Test for WordnetTaggedClassificationDataset dataset.\"\"\"\n\n    if \"nltk\" in sys.modules:\n        config_file = \"tests/data/datasets/classification/dummy_configs/wordnet_tagged_classification.yaml\"\n        opts = get_config(config_file=config_file)\n\n        dataset = MockWordnetTaggedClassificationDataset(\n            opts, is_training=True, is_evaluation=False\n        )\n\n        sample_index = 0\n        data_item = dataset.__getitem__((image_size, image_size, sample_index))\n        assert \"samples\" in data_item\n        assert \"targets\" in data_item\n        assert list(data_item[\"samples\"].shape) == [3, image_size, image_size]\n        assert list(data_item[\"targets\"].shape) == [10]\n\n        exptected_target_label = torch.tensor([1, 0, 1, 0, 0, 0, 0, 0, 0, 0])\n        assert torch.all(\n            data_item[\"targets\"]\n            == exptected_target_label.to(\n                dtype=data_item[\"targets\"].dtype, device=data_item[\"targets\"].device\n            )\n        )\n"
  },
  {
    "path": "tests/data/datasets/detection/__init__.py",
    "content": ""
  },
  {
    "path": "tests/data/datasets/detection/mock_coco_mask_rcnn.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom typing import Optional\n\nimport numpy as np\nfrom PIL import Image\n\nfrom corenet.data.datasets import DATASET_REGISTRY\nfrom corenet.data.datasets.detection.coco_mask_rcnn import COCODetectionMaskRCNN\n\n\n@DATASET_REGISTRY.register(name=\"mock_coco_mask_rcnn\", type=\"detection\")\nclass MockCOCODetectionMaskRCNN(COCODetectionMaskRCNN):\n    @staticmethod\n    def read_image_pil(path: str) -> Optional[Image.Image]:\n        \"\"\"Mock the init logic for read_image_pil function.\n\n        Instead of reading a PIL image at location specified by `path`, a random PIL\n        image is returned.\n        \"\"\"\n        im_arr = np.random.randint(low=0, high=255, size=(64, 64, 3), dtype=np.uint8)\n        return Image.fromarray(im_arr).convert(\"RGB\")\n"
  },
  {
    "path": "tests/data/datasets/detection/mock_coco_ssd.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom typing import Optional\n\nimport numpy as np\nfrom PIL import Image\n\nfrom corenet.data.datasets import DATASET_REGISTRY\nfrom corenet.data.datasets.detection.coco_ssd import COCODetectionSSD\n\n\n@DATASET_REGISTRY.register(name=\"mock_coco_ssd\", type=\"detection\")\nclass MockCOCODetectionSSD(COCODetectionSSD):\n    @staticmethod\n    def read_image_pil(path: str) -> Optional[Image.Image]:\n        \"\"\"Mock the init logic for read_image_pil function.\n\n        Instead of reading a PIL image at location specified by `path`, a random PIL\n        image is returned.\n        \"\"\"\n        im_arr = np.random.randint(low=0, high=255, size=(64, 64, 3), dtype=np.uint8)\n        return Image.fromarray(im_arr).convert(\"RGB\")\n"
  },
  {
    "path": "tests/data/datasets/language_modeling/__init__.py",
    "content": ""
  },
  {
    "path": "tests/data/datasets/language_modeling/dummy_commonsense_170k.yaml",
    "content": "# pytest: disable\ndataset:\n    root_train: \"\"\n    category: language_modeling\n    name: commonsense_170k\n    language_modeling:\n        shuffle_data: false\n        sequence_length: 5\n        min_tokens_per_text: 0\n        min_characters_per_text: 0\n        commonsense_170k:\n          path: \"\"\n\ntext_tokenizer:\n  name: \"openai_clip\"\n  pad_token: \"pad\"\n"
  },
  {
    "path": "tests/data/datasets/language_modeling/dummy_lm_dataset.yaml",
    "content": "# pytest: disable\n\ndataset:\n  root_train: \"\"\n  disable_val: true\n  workers: 4\n  # dataset details\n  category: \"language_modeling\"\n  name: \"mock_general_lm\"\n  language_modeling:\n    sequence_length: 10\n    min_tokens_per_text: 0\n    min_characters_per_text: 0\n    shuffle_data: true\n    general_lm:\n      data_state_save_interval: 0\n      reader_chunk_size: 1\n      train_data_info: [\n        {\n          \"file_name\": \".corenet_data_cache/sample.jsonl\",\n          \"text_key\": \"text\",\n          \"file_id_range\": [0, 1], \n        },\n        {\n          \"file_name\": \".corenet_data_cache/sample.json.gz\",\n          \"text_key\": \"text\",\n          \"file_id_range\": [0, 1], \n        },\n      ]\n\ntext_tokenizer:\n  name: \"openai_clip\"\n  pad_token: \"pad\"\n"
  },
  {
    "path": "tests/data/datasets/language_modeling/mock_general_lm.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nimport gzip\nimport json\n\nfrom corenet.constants import DATA_CACHE_DIR\nfrom corenet.data.datasets import DATASET_REGISTRY\nfrom corenet.data.datasets.language_modeling.general_lm import GeneralLMDataset\n\n\ndef _generate_dummy_json_data() -> None:\n    data = [\n        {\n            \"text\": \"Hello world, CoreNet serves as a versatile research library catering to a wide array of purposes. It has been used for small- and large-scale training, with numerous research papers leveraging its functionalities and contributing to various domains of study.\",\n        }\n    ] * 12\n\n    with open(f\"{DATA_CACHE_DIR}/sample.jsonl\", \"w\") as outfile:\n        for entry in data:\n            print(json.dumps(entry), file=outfile)\n\n\ndef _generate_dummy_json_gz_data() -> None:\n    data = [{\"text\": \"   !\"}] * 2\n\n    with gzip.open(f\"{DATA_CACHE_DIR}/sample.json.gz\", \"w\") as outfile:\n        for text in data:\n            json_str = json.dumps(text) + \"\\n\"\n            json_bytes = json_str.encode(\"utf-8\")\n            outfile.write(json_bytes)\n\n\n@DATASET_REGISTRY.register(name=\"mock_general_lm\", type=\"language_modeling\")\nclass MockImgGeneralLMDataset(GeneralLMDataset):\n    \"\"\"A wrapper around GeneralLMDataset that generates dummy data for CI/CD.\n\n    Args:\n        opts: Command-line arguments.\n    \"\"\"\n\n    def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None:\n        _generate_dummy_json_data()\n        _generate_dummy_json_gz_data()\n        super().__init__(opts, *args, **kwargs)\n"
  },
  {
    "path": "tests/data/datasets/language_modeling/test_commonsense_170k.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport json\nimport tempfile\n\nimport yaml\n\nfrom corenet.data.datasets.language_modeling import commonsense_170k\nfrom corenet.options.utils import flatten_yaml_as_dict\nfrom tests.configs import get_config\nfrom tests.data.datasets.language_modeling import test_general_lm\n\n\ndef write_data(filename: str) -> None:\n    data = [\n        {\n            \"instruction\": \"Please answer the following question with true or false. Question: is the sky blue?\",\n            \"input\": \"\",\n            \"output\": \"the correct answer is true\",\n            \"answer\": \"true\",\n        }\n    ] * 5\n    # Make input non-empty for one data point.\n    data[0][\"input\"] = \"This is an example input.\"\n    with open(filename, \"w+\") as f:\n        json.dump(data, f)\n\n\ndef test_general_lm_dataset() -> None:\n    \"\"\"Test for GeneralLMDataset dataset.\"\"\"\n    sequence_length = 5\n    with tempfile.NamedTemporaryFile() as tmp:\n        write_data(tmp.name)\n        config_file = (\n            \"tests/data/datasets/language_modeling/dummy_commonsense_170k.yaml\"\n        )\n        opts = get_config(config_file=config_file)\n        setattr(opts, \"dataset.language_modeling.sequence_length\", 5)\n        setattr(opts, \"dataset.language_modeling.commonsense_170k.path\", tmp.name)\n\n        dataset = commonsense_170k.CommonSense170k(opts)\n        max_iterations = 12\n\n        test_general_lm._iterate_and_test_dataset(\n            dataset,\n            max_iterations=max_iterations,\n            expected_sequence_length=sequence_length,\n        )\n"
  },
  {
    "path": "tests/data/datasets/language_modeling/test_general_lm.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport pytest\nimport torch\n\nfrom tests.configs import get_config\nfrom tests.data.datasets.language_modeling.mock_general_lm import (\n    MockImgGeneralLMDataset,\n)\n\n\ndef _iterate_and_test_dataset(\n    dataset: MockImgGeneralLMDataset, max_iterations: int, expected_sequence_length: int\n):\n    for sample_id, sample in enumerate(dataset):\n        assert any(set(sample.keys()) & {\"samples\", \"targets\"})\n        assert sample[\"samples\"].numel() == expected_sequence_length\n        assert sample[\"targets\"].numel() == expected_sequence_length\n        # inputs are shifted by 1 to obtain targets\n        assert torch.all(sample[\"samples\"][1:] == sample[\"targets\"][:-1])\n        if sample_id == max_iterations:\n            break\n\n\n@pytest.mark.parametrize(\"max_iterations\", [10, 13, 16])\ndef test_general_lm_dataset(max_iterations: int) -> None:\n    \"\"\"Test for GeneralLMDataset dataset.\"\"\"\n\n    config_file = \"tests/data/datasets/language_modeling/dummy_lm_dataset.yaml\"\n    opts = get_config(config_file=config_file)\n    sequence_length = 12\n    setattr(opts, \"dataset.language_modeling.sequence_length\", sequence_length)\n\n    dataset = MockImgGeneralLMDataset(opts)\n    _iterate_and_test_dataset(\n        dataset, max_iterations=max_iterations, expected_sequence_length=sequence_length\n    )\n\n    # resume the state and iterate for 5 more iterations.\n    setattr(\n        opts,\n        \"dataset.language_modeling.general_lm.data_state\",\n        [\"results/run_1/data_states/data_state_0_0.pkl\"],\n    )\n    dataset = MockImgGeneralLMDataset(opts)\n    dataset._load_data_state()\n\n    # Our first file has 12 samples and second has 2 files, so total of 14 files (i.e., 1 epoch is 14 files)\n    if max_iterations == 10:\n        # In this case, only 10 samples from first file are finished, so we expect chunk state to resume from 10\n        assert dataset._target_state[\"chunk\"] == 10\n        assert dataset._target_state[\"file\"] == None\n        assert dataset._target_state[\"epoch\"] == 0\n    elif max_iterations == 13:\n        # in this case, first file has finished and we are iterating second file, so we expect the file has the name\n        # of first file and chunks state to be 1 because one sample of the second file was processed\n        print(\"Resuming from second file\")\n        assert dataset._target_state[\"chunk\"] == 1\n        assert dataset._target_state[\"file\"].endswith(\"sample.jsonl\")\n        assert dataset._target_state[\"epoch\"] == 0\n    elif max_iterations == 16:\n        # in this case, we have iterated over the data once and processed 2 samples from first file.\n        # So, we expect epoch to be 1, chunk to be 2, and file to be None\n        assert dataset._target_state[\"chunk\"] == 2\n        assert dataset._target_state[\"file\"] == None\n        assert dataset._target_state[\"epoch\"] == 1\n    else:\n        raise NotImplementedError(\"Max iteration is not supported\")\n\n    max_iterations = 5\n    _iterate_and_test_dataset(\n        dataset, max_iterations=max_iterations, expected_sequence_length=sequence_length\n    )\n"
  },
  {
    "path": "tests/data/datasets/multi_modal_img_text/__init__.py",
    "content": ""
  },
  {
    "path": "tests/data/datasets/multi_modal_img_text/dummy_img_text_tar_dataset.yaml",
    "content": "# pytest: disable\n\ndataset:\n  # The training path in 'img_text_tar' dataset is infered from metadata file path.\n  root_train: \"\"\n  disable_val: true\n\n  name: \"img_text_tar\"\n  category: \"multi_modal_image_text\"\n  multi_modal_img_text:\n    img_text_tar:\n      metadata_file: \".corenet_data_cache/metadata.pkl\"\n\ntext_tokenizer:\n  name: \"openai_clip\"\n"
  },
  {
    "path": "tests/data/datasets/multi_modal_img_text/mock_img_text_tar_dataset.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nimport base64\nimport io\nimport os\nimport pickle\n\nfrom PIL import Image\n\nfrom corenet.constants import DATA_CACHE_DIR\nfrom corenet.data.datasets import DATASET_REGISTRY\nfrom corenet.data.datasets.multi_modal_img_text.img_text_tar_dataset import (\n    ImgTextTarDataset,\n)\n\n\ndef _generate_dummy_data() -> None:\n    \"\"\"Generate dummy data for CI/CD.\"\"\"\n\n    total_samples = 4\n    num_samples_per_tar = 2\n\n    for sample_idx in range(total_samples):\n        folder_idx = sample_idx // num_samples_per_tar\n        folder_path = f\"{DATA_CACHE_DIR}/{folder_idx}\"\n        os.makedirs(folder_path, exist_ok=True)\n        with open(f\"{folder_path}/{sample_idx}.pkl\", \"wb\") as f:\n            image = Image.new(\"RGB\", (32, 32), color=\"black\")\n            image_bytes = io.BytesIO()\n            image.save(image_bytes, format=\"JPEG\")\n            image_bytes.seek(0)\n            encoded_image = base64.b64encode(image_bytes.read())\n\n            data = {\"image\": encoded_image, \"text\": \"Testing img-text dataset.\"}\n            pickle.dump(data, f)\n\n    metadata = {\n        \"total_tar_files\": 2,\n        \"max_files_per_tar\": num_samples_per_tar,\n        \"tar_file_names\": [\"0.tar.gz\", \"1.tar.gz\"],\n    }\n\n    with open(f\"{DATA_CACHE_DIR}/metadata.pkl\", \"wb\") as f:\n        pickle.dump(metadata, f)\n\n\n@DATASET_REGISTRY.register(name=\"mock_img_text_tar\", type=\"multi_modal_image_text\")\nclass MockImgTextTarDataset(ImgTextTarDataset):\n    \"\"\"A wrapper around ImgTextTarDataset that generates dummy data for CI/CD.\n\n    Args:\n        opts: Command-line arguments.\n    \"\"\"\n\n    def __init__(self, opts: argparse.Namespace, *args, **kwargs) -> None:\n        _generate_dummy_data()\n        super().__init__(opts, *args, **kwargs)\n"
  },
  {
    "path": "tests/data/datasets/multi_modal_img_text/test_img_text_tar_dataset.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\n\nimport pytest\n\nfrom tests.configs import get_config\nfrom tests.data.datasets.multi_modal_img_text.mock_img_text_tar_dataset import (\n    MockImgTextTarDataset,\n)\n\n\n@pytest.mark.parametrize(\"image_size\", [16, 32])\n@pytest.mark.parametrize(\"context_length\", [12, 77])\ndef test_img_text_dataset(image_size: int, context_length: int) -> None:\n    \"\"\"Test for ImgTextTarDataset dataset.\"\"\"\n\n    config_file = (\n        \"tests/data/datasets/multi_modal_img_text/dummy_img_text_tar_dataset.yaml\"\n    )\n    opts = get_config(config_file=config_file)\n    setattr(opts, \"dataset.multi_modal_img_text.context_length\", context_length)\n\n    dataset = MockImgTextTarDataset(opts, is_training=True, is_evaluation=False)\n\n    sample_index = 0\n    data_item = dataset.__getitem__((image_size, image_size, sample_index))\n    assert \"samples\" in data_item\n    assert \"targets\" in data_item\n    assert data_item[\"targets\"] == -1\n    assert \"image\" in data_item[\"samples\"]\n    assert list(data_item[\"samples\"][\"image\"].shape) == [3, image_size, image_size]\n    assert list(data_item[\"samples\"][\"text\"].shape) == [context_length]\n"
  },
  {
    "path": "tests/data/datasets/multi_modal_img_text/zero_shot_image_classification/__init__.py",
    "content": ""
  },
  {
    "path": "tests/data/datasets/multi_modal_img_text/zero_shot_image_classification/dummy_configs/imagenet.yaml",
    "content": "# pytest: disable\ndataset:\n  category: \"multi_modal_image_text\"\n  multi_modal_img_text:\n    zero_shot_img_cls_dataset_name: \"imagenet\"\n    context_length: 77\n    img_text_tar:\n      metadata_file: \"PATH_OF_METADATA_FILE\"\n\n\nimage_augmentation:\n  # training related parameters\n  random_resized_crop:\n    enable: true\n    interpolation: \"bilinear\"\n  random_horizontal_flip:\n    enable: true\n  auto_augment:\n    enable: true\n  cutmix:\n    alpha: 1.0\n    enable: true\n    p: 1.0\n  mixup:\n    alpha: 0.2\n    enable: true\n    p: 1.0\n  # validation related parameters\n  resize:\n    enable: true\n    size: 232\n    interpolation: \"bilinear\"\n  center_crop:\n    enable: true\n    size: 224\n\nsampler:\n  name: \"variable_batch_sampler\"\n  vbs:\n    crop_size_width: 224\n    crop_size_height: 224\n    max_n_scales: 5\n    min_crop_size_width: 128\n    max_crop_size_width: 320\n    min_crop_size_height: 128\n    max_crop_size_height: 320\n    check_scale: 32\n"
  },
  {
    "path": "tests/data/datasets/multi_modal_img_text/zero_shot_image_classification/dummy_configs/imagenet_a.yaml",
    "content": "# pytest: disable\ndataset:\n  category: \"multi_modal_image_text\"\n  multi_modal_img_text:\n    zero_shot_img_cls_dataset_name: \"imagenet_a\"\n    context_length: 77\n    img_text_tar:\n      metadata_file: \"PATH_OF_METADATA_FILE\"\n\n\nimage_augmentation:\n  # training related parameters\n  random_resized_crop:\n    enable: true\n    interpolation: \"bilinear\"\n  random_horizontal_flip:\n    enable: true\n  auto_augment:\n    enable: true\n  cutmix:\n    alpha: 1.0\n    enable: true\n    p: 1.0\n  mixup:\n    alpha: 0.2\n    enable: true\n    p: 1.0\n  # validation related parameters\n  resize:\n    enable: true\n    size: 232\n    interpolation: \"bilinear\"\n  center_crop:\n    enable: true\n    size: 224\n\nsampler:\n  name: \"variable_batch_sampler\"\n  vbs:\n    crop_size_width: 224\n    crop_size_height: 224\n    max_n_scales: 5\n    min_crop_size_width: 128\n    max_crop_size_width: 320\n    min_crop_size_height: 128\n    max_crop_size_height: 320\n    check_scale: 32\n"
  },
  {
    "path": "tests/data/datasets/multi_modal_img_text/zero_shot_image_classification/dummy_configs/imagenet_r.yaml",
    "content": "# pytest: disable\ndataset:\n  category: \"multi_modal_image_text\"\n  multi_modal_img_text:\n    zero_shot_img_cls_dataset_name: \"imagenet_r\"\n    context_length: 77\n    img_text_tar:\n      metadata_file: \"PATH_OF_METADATA_FILE\"\n\n\nimage_augmentation:\n  # training related parameters\n  random_resized_crop:\n    enable: true\n    interpolation: \"bilinear\"\n  random_horizontal_flip:\n    enable: true\n  auto_augment:\n    enable: true\n  cutmix:\n    alpha: 1.0\n    enable: true\n    p: 1.0\n  mixup:\n    alpha: 0.2\n    enable: true\n    p: 1.0\n  # validation related parameters\n  resize:\n    enable: true\n    size: 232\n    interpolation: \"bilinear\"\n  center_crop:\n    enable: true\n    size: 224\n\nsampler:\n  name: \"variable_batch_sampler\"\n  vbs:\n    crop_size_width: 224\n    crop_size_height: 224\n    max_n_scales: 5\n    min_crop_size_width: 128\n    max_crop_size_width: 320\n    min_crop_size_height: 128\n    max_crop_size_height: 320\n    check_scale: 32\n"
  },
  {
    "path": "tests/data/datasets/multi_modal_img_text/zero_shot_image_classification/dummy_configs/imagenet_sketch.yaml",
    "content": "# pytest: disable\ndataset:\n  category: \"multi_modal_image_text\"\n  multi_modal_img_text:\n    zero_shot_img_cls_dataset_name: \"imagenet_sketch\"\n    context_length: 77\n    img_text_tar:\n      metadata_file: \"PATH_OF_METADATA_FILE\"\n\n\nimage_augmentation:\n  # training related parameters\n  random_resized_crop:\n    enable: true\n    interpolation: \"bilinear\"\n  random_horizontal_flip:\n    enable: true\n  auto_augment:\n    enable: true\n  cutmix:\n    alpha: 1.0\n    enable: true\n    p: 1.0\n  mixup:\n    alpha: 0.2\n    enable: true\n    p: 1.0\n  # validation related parameters\n  resize:\n    enable: true\n    size: 232\n    interpolation: \"bilinear\"\n  center_crop:\n    enable: true\n    size: 224\n\nsampler:\n  name: \"variable_batch_sampler\"\n  vbs:\n    crop_size_width: 224\n    crop_size_height: 224\n    max_n_scales: 5\n    min_crop_size_width: 128\n    max_crop_size_width: 320\n    min_crop_size_height: 128\n    max_crop_size_height: 320\n    check_scale: 32\n"
  },
  {
    "path": "tests/data/datasets/multi_modal_img_text/zero_shot_image_classification/mock_imagenet.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\nimport argparse\nimport random\nfrom typing import List\n\nfrom corenet.data.datasets.multi_modal_img_text.zero_shot_image_classification.imagenet import (\n    ImageNetDatasetZeroShot,\n)\nfrom corenet.data.datasets.multi_modal_img_text.zero_shot_image_classification.imagenet_a import (\n    ImageNetADatasetZeroShot,\n)\nfrom corenet.data.datasets.multi_modal_img_text.zero_shot_image_classification.imagenet_r import (\n    ImageNetRDatasetZeroShot,\n)\nfrom corenet.data.datasets.multi_modal_img_text.zero_shot_image_classification.imagenet_sketch import (\n    ImageNetSketchDatasetZeroShot,\n)\n\nTOTAL_SAMPLES = 100\n\n\nclass MockImageNetDatasetZeroShot(ImageNetDatasetZeroShot):\n    \"\"\"Mock the ImageNetDatasetZeroShot without initializing from image folders.\"\"\"\n\n    def __init__(\n        self,\n        opts: argparse.Namespace,\n        is_training: bool = False,\n        is_evaluation: bool = False,\n        *args,\n        **kwargs\n    ) -> None:\n        \"\"\"Mock the init logic for ImageNet dataset.\n\n        Specifically, we replace the samples and targets with random data so that actual\n        dataset is not required for testing purposes.\n        \"\"\"\n        # super() is not called here intentionally.\n        self.opts = opts\n        self.root = None\n        self.samples = [\n            [\"img_path\", random.randint(1, 4)] for _ in range(TOTAL_SAMPLES)\n        ]\n        self.targets = [class_id for img_path, class_id in self.samples]\n        self.imgs = [img_path for img_path, class_id in self.samples]\n        self.is_training = is_training\n        self.is_evaluation = is_evaluation\n\n    @property\n    def class_names(self) -> List[str]:\n        return [\"cat\", \"dog\"]\n\n\nclass MockImageNetADatasetZeroShot(\n    MockImageNetDatasetZeroShot, ImageNetADatasetZeroShot\n):\n    def __init__(self, *args, **kwargs) -> None:\n        \"\"\"Mock the init logit for ImageNetA dataset.\"\"\"\n        MockImageNetDatasetZeroShot.__init__(self, *args, **kwargs)\n\n\nclass MockImageNetRDatasetZeroShot(\n    MockImageNetDatasetZeroShot, ImageNetRDatasetZeroShot\n):\n    def __init__(self, *args, **kwargs) -> None:\n        \"\"\"Mock the init logit for ImageNetR dataset.\"\"\"\n        MockImageNetDatasetZeroShot.__init__(self, *args, **kwargs)\n\n\nclass MockImageNetSketchDatasetZeroShot(\n    MockImageNetDatasetZeroShot, ImageNetSketchDatasetZeroShot\n):\n    def __init__(self, *args, **kwargs) -> None:\n        \"\"\"Mock the init logit for ImageNetSketch dataset.\"\"\"\n        MockImageNetDatasetZeroShot.__init__(self, *args, **kwargs)\n"
  },
  {
    "path": "tests/data/datasets/multi_modal_img_text/zero_shot_image_classification/test_mock_imagenet.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom typing import Type\n\nimport pytest\n\nfrom tests.configs import get_config\nfrom tests.data.datasets.multi_modal_img_text.zero_shot_image_classification.mock_imagenet import (\n    MockImageNetADatasetZeroShot,\n    MockImageNetDatasetZeroShot,\n    MockImageNetRDatasetZeroShot,\n    MockImageNetSketchDatasetZeroShot,\n)\n\n\ndef test_imagenet_dataset_zero_shot(\n    config_file_path: str = \"tests/data/datasets/multi_modal_img_text/zero_shot_image_classification/dummy_configs/imagenet.yaml\",\n    mock_dataset_class: Type[MockImageNetDatasetZeroShot] = MockImageNetDatasetZeroShot,\n) -> None:\n    \"\"\"Test for ImageNet zero-shot.\n\n    Similar test to ImageNet test but only for validation because zero-shot datasets are\n    not supposed to be used for training. We also test the text prompts.\n    \"\"\"\n    opts = get_config(config_file=config_file_path)\n\n    imagenet_zero_shot_dataset = mock_dataset_class(\n        opts, is_training=False, is_evaluation=False\n    )\n\n    for image_id in range(2):\n        data = imagenet_zero_shot_dataset[image_id]\n        # values from config file\n        assert len(data) == 3, \"ImageNet zero shot should return a tuple of 3.\"\n        img_path, text_prompts, target = data\n        assert isinstance(img_path, str), \"ImageNet zero shot should return (str, ...).\"\n        assert (\n            isinstance(text_prompts, list)\n            and isinstance(text_prompts[0], list)\n            and isinstance(text_prompts[0][0], str)\n        ), \"ImageNet zero shot should return (..., list[list[str]], ...).\"\n        assert isinstance(target, int), \"ImageNet zero shot should return (..., int).\"\n\n\n@pytest.mark.parametrize(\n    \"config_file_path,mock_dataset_class\",\n    [\n        (\n            \"tests/data/datasets/multi_modal_img_text/zero_shot_image_classification/dummy_configs/imagenet_a.yaml\",  # NOQA\n            MockImageNetADatasetZeroShot,\n        ),\n        (\n            \"tests/data/datasets/multi_modal_img_text/zero_shot_image_classification/dummy_configs/imagenet_r.yaml\",  # NOQA\n            MockImageNetRDatasetZeroShot,\n        ),\n        (\n            \"tests/data/datasets/multi_modal_img_text/zero_shot_image_classification/dummy_configs/imagenet_sketch.yaml\",  # NOQA\n            MockImageNetSketchDatasetZeroShot,\n        ),\n    ],\n)\ndef test_imagenet_shift_dataset_zero_shot(\n    config_file_path: str, mock_dataset_class: Type[MockImageNetDatasetZeroShot]\n) -> None:\n    test_imagenet_dataset_zero_shot(config_file_path, mock_dataset_class)\n"
  },
  {
    "path": "tests/data/datasets/segmentation/__init__.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n"
  },
  {
    "path": "tests/data/datasets/segmentation/dummy_ade20k_config.yaml",
    "content": "# pytest: disable\n\ndataset:\n  root_train: \"/mnt/vision_datasets/ADEChallengeData2016/\"\n  root_val: \"/mnt/vision_datasets/ADEChallengeData2016/\"\n  name: \"ade20k\"\n  category: \"segmentation\"\n  train_batch_size0: 4\n  val_batch_size0: 4\n  eval_batch_size0: 2\n  workers: 4\n  persistent_workers: false\n  pin_memory: false\nimage_augmentation:\n  random_crop:\n    enable: true\n    seg_class_max_ratio: 0.75\n    pad_if_needed: true\n    mask_fill: 0 # background idx is 0\n  random_horizontal_flip:\n    enable: true\n  resize:\n    enable: true\n    size: [64, 64]\n    interpolation: \"bilinear\"\n  random_short_size_resize:\n    enable: true\n    interpolation: \"bilinear\"\n    short_side_min: 32\n    short_side_max: 64\n    max_img_dim: 64\n  photo_metric_distort:\n    enable: true\n  random_rotate:\n    enable: true\n    angle: 10\n    mask_fill: 0 # background idx is 0\n  random_gaussian_noise:\n    enable: true\nsampler:\n  name: \"batch_sampler\"\n  bs:\n    crop_size_width: 64\n    crop_size_height: 64\nevaluation:\n  segmentation:\n    resize_input_images: false\n"
  },
  {
    "path": "tests/data/datasets/segmentation/dummy_cocostuff_config.yaml",
    "content": "# pytest: disable\n\ndataset:\n  root_train: \"/mnt/vision_datasets/cocostuff/\"\n  root_val: \"/mnt/vision_datasets/cocostuff/\"\n  name: \"coco_stuff\"\n  category: \"segmentation\"\n  train_batch_size0: 4\n  val_batch_size0: 4\n  eval_batch_size0: 2\n  workers: 4\n  persistent_workers: false\n  pin_memory: false\nimage_augmentation:\n  random_crop:\n    enable: true\n    seg_class_max_ratio: 0.75\n    pad_if_needed: true\n    mask_fill: 255 # Same as the ignore index value in the loss function\n  random_horizontal_flip:\n    enable: true\n  resize:\n    enable: true\n    size: [64, 64]\n    interpolation: \"bilinear\"\n  random_short_size_resize:\n    enable: true\n    interpolation: \"bilinear\"\n    short_side_min: 32\n    short_side_max: 64\n    max_img_dim: 64\n  photo_metric_distort:\n    enable: true\n  random_rotate:\n    enable: true\n    angle: 10\n    mask_fill: 255 # Same as the ignore index value in the loss function\n  random_gaussian_noise:\n    enable: true\nsampler:\n  name: \"batch_sampler\"\n  bs:\n    crop_size_width: 64\n    crop_size_height: 64\nevaluation:\n  segmentation:\n    resize_input_images: false\n"
  },
  {
    "path": "tests/data/datasets/segmentation/mock_ade20k.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\nimport argparse\nfrom typing import Optional\n\nimport numpy as np\nfrom PIL import Image\n\nfrom corenet.data.datasets.segmentation.ade20k import ADE20KDataset\n\nTOTAL_SAMPLES = 8\n\n\nfrom corenet.data.datasets import DATASET_REGISTRY\n\n\n@DATASET_REGISTRY.register(name=\"mock_ade20k\", type=\"segmentation\")\nclass MockADE20KDataset(ADE20KDataset):\n    def __init__(\n        self,\n        opts: argparse.Namespace,\n        is_training: bool = False,\n        is_evaluation: bool = False,\n        *args,\n        **kwargs\n    ) -> None:\n        \"\"\"Mock the init logic for ImageNet dataset\n\n        Specifically, we replace the samples and targets with random data so that actual dataset is not\n        required for testing purposes.\n        \"\"\"\n        # super() is not called here intentionally.\n        self.opts = opts\n        self.root = None\n        self.images = [\"dummy_img_path.jpg\" for _ in range(TOTAL_SAMPLES)]\n        self.masks = [\"dummy_mask_path.png\" for _ in range(TOTAL_SAMPLES)]\n        self.ignore_label = 255\n        self.background_idx = 0\n        self.is_training = is_training\n        self.is_evaluation = is_evaluation\n        self.check_dataset()\n        self.n_classes = 150\n\n    @staticmethod\n    def read_image_pil(path: str) -> Image.Image:\n        \"\"\"Mock the init logic for read_image_pil function\n\n        Instead of reading a PIL RGB image at location specified by `path`, a PIL\n        RGB image of size (20, 40) returned.\n        \"\"\"\n        im_arr = np.random.randint(low=0, high=255, size=(40, 20), dtype=np.uint8)\n        return Image.fromarray(im_arr).convert(\"RGB\")\n\n    def read_mask_pil(self, path: str) -> Image.Image:\n        \"\"\"Mock the init logic for read_mask_pil function\n\n        Instead of reading a mask at location specified by `path`, a random PIL mask is returned.\n        \"\"\"\n        im_arr = np.random.randint(\n            low=0, high=self.n_classes, size=(40, 20), dtype=np.uint8\n        )\n        return Image.fromarray(im_arr).convert(\"L\")\n"
  },
  {
    "path": "tests/data/datasets/segmentation/mock_coco_stuff.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\nimport argparse\nfrom typing import Optional\n\nimport numpy as np\nfrom PIL import Image\n\nfrom corenet.data.datasets.segmentation.coco_stuff import COCOStuffDataset\n\nTOTAL_SAMPLES = 8\n\n\nfrom corenet.data.datasets import DATASET_REGISTRY\n\n\n@DATASET_REGISTRY.register(name=\"mock_coco_stuff\", type=\"segmentation\")\nclass MockCOCOStuffDataset(COCOStuffDataset):\n    def __init__(\n        self,\n        opts: argparse.Namespace,\n        is_training: bool = False,\n        is_evaluation: bool = False,\n        *args,\n        **kwargs\n    ) -> None:\n        \"\"\"Mock the init logic for ImageNet dataset\n\n        Specifically, we replace the samples and targets with random data so that actual dataset is not\n        required for testing purposes.\n        \"\"\"\n        # super() is not called here intentionally.\n        self.opts = opts\n        self.root = None\n        self.images = [\"dummy_img_path.jpg\" for _ in range(TOTAL_SAMPLES)]\n        self.masks = [\"dummy_mask_path.png\" for _ in range(TOTAL_SAMPLES)]\n        self.ignore_label = 255\n        self.background_idx = 0\n        self.n_classes = 171\n        self.is_training = is_training\n        self.is_evaluation = is_evaluation\n        self.check_dataset()\n\n    @staticmethod\n    def read_image_pil(path: str) -> Optional[Image.Image]:\n        \"\"\"Mock the init logic for read_image_pil function\n\n        Instead of reading a PIL RGB image at location specified by `path`, a random PIL\n        is returned.\n        \"\"\"\n        im_arr = np.random.randint(low=0, high=255, size=(40, 20), dtype=np.uint8)\n        return Image.fromarray(im_arr).convert(\"RGB\")\n\n    def read_mask_pil(self, path: str) -> Optional[Image.Image]:\n        \"\"\"Mock the init logic for read_mask_pil function\n\n        Instead of reading a mask at location specified by `path`, a random PIL mask is returned.\n        \"\"\"\n        im_arr = np.random.randint(\n            low=0, high=self.n_classes, size=(40, 20), dtype=np.uint8\n        )\n        return Image.fromarray(im_arr).convert(\"L\")\n"
  },
  {
    "path": "tests/data/datasets/segmentation/test_mock_ade20k.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\nimport pytest\n\nfrom corenet.data.data_loaders import CoreNetDataLoader\nfrom corenet.data.sampler import build_sampler\nfrom tests.configs import get_config\nfrom tests.data.datasets.segmentation.mock_ade20k import MockADE20KDataset\n\n\n@pytest.mark.parametrize(\"mode\", [\"train\", \"val\", \"eval\"])\ndef test_ade20k_dataset(mode: str) -> None:\n    \"\"\"Test for ADE20k\n\n    This test mocks `__init__`, `read_image_pil`, and `read_mask_pil` functions to test the\n    `__getitem__` function (that includes data transforms). Training and validation datasets are wrapped\n    inside the respective data loaders to test the collate function used by dataset.\n    \"\"\"\n    config_file_path = \"tests/data/datasets/segmentation/dummy_ade20k_config.yaml\"\n    opts = get_config(config_file=config_file_path)\n\n    # TEST TRAINING DATASET, SAMPLER, COLLATE_FN\n    expected_input_shape = [4, 3, 64, 64]\n\n    is_training = mode == \"train\"\n    is_evaluation = mode == \"eval\"\n    if is_evaluation:\n        expected_input_shape = [2, 3, 128, 64]\n        # enable resizing based on aspect ratio for evaluation\n        setattr(opts, \"evaluation.segmentation.resize_input_images\", True)\n        # overwrite the validation argument\n        setattr(\n            opts, \"dataset.val_batch_size0\", getattr(opts, \"dataset.eval_batch_size0\")\n        )\n\n    dataset = MockADE20KDataset(\n        opts, is_training=is_training, is_evaluation=is_evaluation\n    )\n    sampler = build_sampler(opts, n_data_samples=len(dataset), is_training=is_training)\n    data_loader = CoreNetDataLoader(\n        dataset=dataset,\n        batch_sampler=sampler,\n        # our samplers take care of batch size, so we set to 1 here\n        batch_size=1,\n        num_workers=0,\n    )\n    for batch in data_loader:\n        assert batch.keys() == {\"samples\", \"targets\"}\n        assert [*batch[\"samples\"].shape] == expected_input_shape\n        assert (\n            batch[\"samples\"].dim() == 4\n        ), \"Expecting input images in [batch, image_channels, height, width] format\"\n        if mode in [\"train\", \"val\"]:\n            assert (\n                batch[\"targets\"].dim() == 3\n            ), \"Expecting labels in [batch, height, width ] format\"\n        else:\n            assert batch[\"targets\"].keys() == {\n                \"mask\",\n                \"file_name\",\n                \"im_width\",\n                \"im_height\",\n            }\n            assert (\n                batch[\"targets\"][\"mask\"].dim() == 3\n            ), \"Expecting labels in [batch, height, width] format\"\n\n            # file names are expected as [file_1, file_2, ...]\n            assert (\n                len(batch[\"targets\"][\"file_name\"]) == 2\n            ), \"Expecting file names as a list.\"\n\n            # check the widths of input images. 20 is specified as dummy dimension for labels in read_mask_pil function.\n            assert [*batch[\"targets\"][\"im_width\"]] == [20, 20]\n            # check the widths of input images. 40 is specified as dummy dimension for labels in read_mask_pil function.\n            assert [*batch[\"targets\"][\"im_height\"]] == [40, 40]\n"
  },
  {
    "path": "tests/data/datasets/segmentation/test_mock_coco_stuff.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\nimport pytest\n\nfrom corenet.data.data_loaders import CoreNetDataLoader\nfrom corenet.data.sampler import build_sampler\nfrom tests.configs import get_config\nfrom tests.data.datasets.segmentation.mock_coco_stuff import MockCOCOStuffDataset\n\n\n@pytest.mark.parametrize(\"mode\", [\"train\", \"val\", \"eval\"])\ndef test_cocostuff_dataset(mode: str) -> None:\n    \"\"\"Test for COCOStuff\n\n    This test mocks `__init__`, `read_image_pil`, and `read_mask_pil` functions to test the\n    `__getitem__` function (that includes data transforms). Training and validation datasets are wrapped\n    inside the respective data loaders to test the collate function used by dataset.\n    \"\"\"\n    config_file_path = \"tests/data/datasets/segmentation/dummy_cocostuff_config.yaml\"\n    opts = get_config(config_file=config_file_path)\n\n    # TEST TRAINING DATASET, SAMPLER, COLLATE_FN\n    expected_input_shape = [4, 3, 64, 64]\n\n    is_training = mode == \"train\"\n    is_evaluation = mode == \"eval\"\n    if is_evaluation:\n        expected_input_shape = [2, 3, 128, 64]\n        # enable resizing based on aspect ratio for evaluation\n        setattr(opts, \"evaluation.segmentation.resize_input_images\", True)\n        # overwrite the validation argument\n        setattr(\n            opts, \"dataset.val_batch_size0\", getattr(opts, \"dataset.eval_batch_size0\")\n        )\n\n    dataset = MockCOCOStuffDataset(\n        opts, is_training=is_training, is_evaluation=is_evaluation\n    )\n    sampler = build_sampler(opts, n_data_samples=len(dataset), is_training=is_training)\n    data_loader = CoreNetDataLoader(\n        dataset=dataset,\n        batch_sampler=sampler,\n        # our samplers take care of batch size, so we set to 1 here\n        batch_size=1,\n        num_workers=0,\n    )\n    for batch in data_loader:\n        assert batch.keys() == {\"samples\", \"targets\"}\n        assert [*batch[\"samples\"].shape] == expected_input_shape\n        assert (\n            batch[\"samples\"].dim() == 4\n        ), \"Expecting input images in [batch, image_channels, height, width] format\"\n        if mode in [\"train\", \"val\"]:\n            assert (\n                batch[\"targets\"].dim() == 3\n            ), \"Expecting labels in [batch, height, width ] format\"\n        else:\n            assert batch[\"targets\"].keys() == {\n                \"mask\",\n                \"file_name\",\n                \"im_width\",\n                \"im_height\",\n            }\n            assert (\n                batch[\"targets\"][\"mask\"].dim() == 3\n            ), \"Expecting labels in [batch, height, width] format\"\n\n            # file names are expected as [file_1, file_2, ...]\n            assert (\n                len(batch[\"targets\"][\"file_name\"]) == 2\n            ), \"Expecting file names as a list.\"\n\n            # check the widths of input images. 20 is specified as dummy dimension for labels in read_mask_pil function.\n            assert [*batch[\"targets\"][\"im_width\"]] == [20, 20]\n            # check the widths of input images. 40 is specified as dummy dimension for labels in read_mask_pil function.\n            assert [*batch[\"targets\"][\"im_height\"]] == [40, 40]\n"
  },
  {
    "path": "tests/data/datasets/test_dataset_base.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom typing import Any, Union\n\nimport pytest\n\nfrom corenet.data.datasets.dataset_base import BaseDataset\nfrom tests.configs import get_config\nfrom tests.data.datasets.classification.mock_imagenet import MockImageNetDataset\n\n\ndef test_repr_with_imagenet():\n    opts = get_config()\n    setattr(opts, \"image_augmentation.random_horizontal_flip.enable\", True)\n    setattr(opts, \"image_augmentation.random_resized_crop.enable\", True)\n\n    mock_imagenet_dataset = MockImageNetDataset(\n        opts, is_training=True, is_evaluation=False\n    )\n    actual_repr = repr(mock_imagenet_dataset)\n    # ignore some extra spaces\n    actual_repr = actual_repr.replace(\"\\t \", \"\\t\").replace(\" \\n\", \"\\n\")\n\n    expected_repr = \"\"\"\\\nMockImageNetDataset(\n    root=None\n    is_training=True\n    num_samples=10\n    transforms=Compose(\n            RandomResizedCrop(scale=(0.08, 1.0), ratio=(0.75, 1.3333333333333333), size=(256, 256), interpolation=bilinear),\n            RandomHorizontalFlip(p=0.5),\n            ToTensor(dtype=torch.float32, norm_factor=255)\n        )\n    num_classes=1000\n)\"\"\".replace(\n        \" \" * 4, \"\\t\"\n    )\n\n    assert actual_repr == expected_repr\n\n\n@pytest.mark.parametrize(\"mean\", [0.0, [0.0, 0.0, 0.0]])\n@pytest.mark.parametrize(\"std\", [1.0, [1.0, 1.0, 1.0]])\ndef test_repr_with_imagenet_with_mean_std_norm(\n    mean: Union[float, list], std: Union[float, list]\n) -> None:\n    opts = get_config()\n    setattr(opts, \"image_augmentation.random_horizontal_flip.enable\", True)\n    setattr(opts, \"image_augmentation.random_resized_crop.enable\", True)\n    setattr(opts, \"image_augmentation.to_tensor.mean_std_normalization.enable\", True)\n    setattr(opts, \"image_augmentation.to_tensor.mean_std_normalization.mean\", mean)\n    setattr(opts, \"image_augmentation.to_tensor.mean_std_normalization.std\", std)\n\n    mock_imagenet_dataset = MockImageNetDataset(\n        opts, is_training=True, is_evaluation=False\n    )\n    actual_repr = repr(mock_imagenet_dataset)\n    # ignore some extra spaces\n    actual_repr = actual_repr.replace(\"\\t \", \"\\t\").replace(\" \\n\", \"\\n\")\n\n    expected_repr = f\"\"\"\\\nMockImageNetDataset(\n    root=None\n    is_training=True\n    num_samples=10\n    transforms=Compose(\n            RandomResizedCrop(scale=(0.08, 1.0), ratio=(0.75, 1.3333333333333333), size=(256, 256), interpolation=bilinear),\n            RandomHorizontalFlip(p=0.5),\n            ToTensor(dtype=torch.float32, norm_factor=255, mean_std_normalization_enable=True, normalization_mean={mean}, normalization_std={std})\n        )\n    num_classes=1000\n)\"\"\".replace(\n        \" \" * 4, \"\\t\"\n    )\n\n    assert actual_repr == expected_repr\n\n\ndef test_item_metadata_exceptions():\n    class MyDataset(BaseDataset):\n        def __getitem__(self, sample_size_and_index: Any) -> Any:\n            return 2\n\n    opts = get_config()\n    dataset = MyDataset(opts)\n    # Make sure datasets that don't need item_metadata work without exception:\n    assert dataset[0] == 2\n\n    # The proper error to be raised is NotImplementedError, so that the users know they\n    # should implement which method\n    with pytest.raises(NotImplementedError):\n        dataset.get_item_metadata(0)\n"
  },
  {
    "path": "tests/data/datasets/test_image_pil.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\n\nimport pytest\nimport torch\n\nfrom corenet.data.transforms import image_pil\n\n\ndef test_to_tensor() -> None:\n    parser = argparse.ArgumentParser()\n    parser = image_pil.ToTensor.add_arguments(parser)\n    opts = parser.parse_args([])\n\n    to_tensor = image_pil.ToTensor(opts=opts)\n\n    H, W, C = 2, 2, 3\n    num_masks = 2\n    data = {\n        \"image\": torch.rand([H, W, C]),\n        \"mask\": torch.randint(0, 1, [num_masks, H, W]),\n    }\n\n    output = to_tensor(data)\n\n    assert output[\"image\"].shape == (H, W, C)\n    assert output[\"mask\"].shape == (num_masks, H, W)\n\n\ndef test_to_tensor_bad_mask() -> None:\n    parser = argparse.ArgumentParser()\n    parser = image_pil.ToTensor.add_arguments(parser)\n    opts = parser.parse_args([])\n\n    to_tensor = image_pil.ToTensor(opts=opts)\n\n    H, W, C = 2, 2, 3\n    num_categories = 2\n    data = {\n        \"image\": torch.rand([H, W, C]),\n        \"mask\": torch.randint(0, 1, [num_categories, 1, H, W]),\n    }\n\n    with pytest.raises(SystemExit):\n        to_tensor(data)\n"
  },
  {
    "path": "tests/data/datasets/utils/__init__.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n"
  },
  {
    "path": "tests/data/datasets/utils/test_common.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport numpy as np\nimport pytest\n\nfrom corenet.data.datasets.utils import common\n\n\ndef _test_data():\n    num_samples_per_class = {\"a\": 5, \"b\": 10, \"c\": 15, \"d\": 20}\n    num_classes = len(num_samples_per_class)\n    num_total_samples = int(np.sum(list(num_samples_per_class.values())))\n    min_num_samples_per_class = np.min(list(num_samples_per_class.values()))\n\n    labels = []\n    for class_label, num_samples in num_samples_per_class.items():\n        labels += [class_label] * num_samples\n\n    return (\n        labels,\n        num_samples_per_class,\n        min_num_samples_per_class,\n        num_classes,\n        num_total_samples,\n    )\n\n\ndef test_select_specified_number_of_samples_per_category():\n    (\n        labels,\n        num_samples_per_class,\n        min_num_samples_per_class,\n        num_classes,\n        _,\n    ) = _test_data()\n    random_seed = 0\n    for num_samples_to_select_per_class in range(min_num_samples_per_class + 1):\n        if num_samples_to_select_per_class > 0:\n            selected_sample_indices = common.select_samples_by_category(\n                sample_category_labels=labels,\n                random_seed=random_seed,\n                num_samples_per_category=num_samples_to_select_per_class,\n            )\n            assert (\n                len(selected_sample_indices)\n                == num_samples_to_select_per_class * num_classes\n            )\n\n            for c in num_samples_per_class:\n                num_selected_samples_in_class_c = len(\n                    [ind for ind in selected_sample_indices if labels[ind] == c]\n                )\n                assert (\n                    num_selected_samples_in_class_c == num_samples_to_select_per_class\n                )\n        else:\n            with pytest.raises(ValueError):\n                common.select_samples_by_category(\n                    sample_category_labels=labels,\n                    random_seed=random_seed,\n                    num_samples_per_category=num_samples_to_select_per_class,\n                )\n\n\ndef test_select_specified_percentage_of_samples_per_category():\n    labels, num_samples_per_class, _, _, _ = _test_data()\n    random_seed = 0\n    percentages = [0, 20, 40, 60, 80, 100, 120]\n    for percentage in percentages:\n        if 0 < percentage <= 100:\n            selected_sample_indices = common.select_samples_by_category(\n                sample_category_labels=labels,\n                random_seed=random_seed,\n                percentage_of_samples_per_category=percentage,\n            )\n            num_expected_samples = np.sum(\n                [int(val * percentage / 100) for val in num_samples_per_class.values()]\n            )\n            assert len(selected_sample_indices) == num_expected_samples\n\n            for label, num_samples in num_samples_per_class.items():\n                num_selected_samples_in_class = len(\n                    [ind for ind in selected_sample_indices if labels[ind] == label]\n                )\n                assert num_selected_samples_in_class == int(\n                    num_samples * percentage / 100\n                )\n        else:\n            with pytest.raises(ValueError):\n                common.select_samples_by_category(\n                    sample_category_labels=labels,\n                    random_seed=random_seed,\n                    percentage_of_samples_per_category=percentage,\n                )\n\n\ndef test_select_samples_by_category_with_default_arguments():\n    labels, num_samples_per_class, _, _, num_total_samples = _test_data()\n\n    random_seed = 0\n    selected_sample_indices = common.select_samples_by_category(\n        sample_category_labels=labels, random_seed=random_seed\n    )\n    assert len(selected_sample_indices) == num_total_samples\n\n    for label, num_samples in num_samples_per_class.items():\n        num_selected_samples_in_class = len(\n            [ind for ind in selected_sample_indices if labels[ind] == label]\n        )\n        assert num_selected_samples_in_class == num_samples\n\n\ndef test_reproducibility_of_sample_selection_by_category():\n    labels, _, min_num_samples_per_class, _, _ = _test_data()\n\n    n_seeds = 5\n    percentages = [20, 40, 60, 80, 100]\n\n    for random_seed in range(n_seeds):\n        for num_samples_to_select_per_class in range(1, min_num_samples_per_class + 1):\n            selected_sample_indices1 = common.select_samples_by_category(\n                sample_category_labels=labels,\n                random_seed=random_seed,\n                num_samples_per_category=num_samples_to_select_per_class,\n            )\n            selected_sample_indices2 = common.select_samples_by_category(\n                sample_category_labels=labels,\n                random_seed=random_seed,\n                num_samples_per_category=num_samples_to_select_per_class,\n            )\n            assert selected_sample_indices1 == selected_sample_indices2\n\n        for percentage in percentages:\n            selected_sample_indices1 = common.select_samples_by_category(\n                sample_category_labels=labels,\n                random_seed=random_seed,\n                percentage_of_samples_per_category=percentage,\n            )\n\n            selected_sample_indices2 = common.select_samples_by_category(\n                sample_category_labels=labels,\n                random_seed=random_seed,\n                percentage_of_samples_per_category=percentage,\n            )\n            assert selected_sample_indices1 == selected_sample_indices2\n\n\ndef test_file_has_valid_image_extension():\n    for ext in common.IMG_EXTENSIONS:\n        assert common.file_has_valid_image_extension(\"dummy\" + ext)\n\n\ndef test_select_random_subset():\n    num_total_samples = 10\n    for num_samples_to_select in range(num_total_samples):\n        if num_samples_to_select > 0:\n            indices1 = common.select_random_subset(\n                random_seed=0,\n                num_total_samples=num_total_samples,\n                num_samples_to_select=num_samples_to_select,\n            )\n            assert len(indices1) == num_samples_to_select\n\n            indices2 = common.select_random_subset(\n                random_seed=1,\n                num_total_samples=num_total_samples,\n                num_samples_to_select=num_samples_to_select,\n            )\n            assert len(indices2) == num_samples_to_select\n\n            assert indices1 != indices2\n        else:\n            with pytest.raises(ValueError):\n                common.select_random_subset(\n                    random_seed=0,\n                    num_total_samples=num_total_samples,\n                    num_samples_to_select=num_samples_to_select,\n                )\n\n    for percentage_of_samples in [0, 20, 40, 60, 80, 100, 120]:\n        if 0 < percentage_of_samples <= 100:\n            indices1 = common.select_random_subset(\n                random_seed=0,\n                num_total_samples=num_total_samples,\n                percentage_of_samples_to_select=percentage_of_samples,\n            )\n            assert len(indices1) == percentage_of_samples * num_total_samples / 100\n\n            indices2 = common.select_random_subset(\n                random_seed=1,\n                num_total_samples=num_total_samples,\n                percentage_of_samples_to_select=percentage_of_samples,\n            )\n            assert len(indices2) == percentage_of_samples * num_total_samples / 100\n\n            assert indices1 != indices2\n        else:\n            with pytest.raises(ValueError):\n                common.select_random_subset(\n                    random_seed=0,\n                    num_total_samples=num_total_samples,\n                    percentage_of_samples_to_select=percentage_of_samples,\n                )\n\n\ndef test_get_image_paths():\n    expected_img_paths = {\n        \"tests/data/datasets/classification/dummy_images/training/class1/dummy_image1.jpg\",\n        \"tests/data/datasets/classification/dummy_images/training/class1/dummy_image2.jpg\",\n        \"tests/data/datasets/classification/dummy_images/training/class2/dummy_image1.jpg\",\n        \"tests/data/datasets/classification/dummy_images/training/class2/dummy_image2.jpg\",\n        \"tests/data/datasets/classification/dummy_images/validation/class1/dummy_image1.jpg\",\n        \"tests/data/datasets/classification/dummy_images/validation/class1/dummy_image2.jpg\",\n        \"tests/data/datasets/classification/dummy_images/validation/class2/dummy_image1.jpg\",\n        \"tests/data/datasets/classification/dummy_images/validation/class2/dummy_image2.jpg\",\n    }\n    img_paths = common.get_image_paths(\n        \"tests/data/datasets/classification/dummy_images\"\n    )\n    assert set(img_paths) == expected_img_paths\n"
  },
  {
    "path": "tests/data/datasets/utils/test_video.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\nfrom typing import Dict\n\nimport pytest\nimport torch\n\nfrom corenet.data.datasets.utils import video\n\n\ndef _get_invalid_label(timestamp: float) -> Dict:\n    return {\n        \"x0\": None,\n        \"x1\": None,\n        \"y0\": None,\n        \"y1\": None,\n        \"speaking_label\": None,\n        \"looking_label\": None,\n        \"is_visible\": False,\n        \"timestamp\": timestamp,\n    }\n\n\ndef test_fetch_frame_label():\n    # x0 goes from 0 to 1 over different periods of time, and speaking_label\n    # toggles. Other labels are unchanged.\n    rectangles_dict = {\n        \"identity0\": [\n            {\n                \"timestamp\": 0.0,\n                \"x0\": 0,\n                \"y0\": 0,\n                \"x1\": 1,\n                \"y1\": 1,\n                \"speaking_label\": False,\n                \"is_visible\": True,\n                \"looking_label\": False,\n            },\n            {\n                \"timestamp\": 1.0,\n                \"x0\": 1,\n                \"y0\": 0,\n                \"x1\": 1,\n                \"y1\": 1,\n                \"speaking_label\": True,\n                \"is_visible\": True,\n                \"looking_label\": False,\n            },\n        ],\n        \"identity1\": [\n            {\n                \"timestamp\": 0.0,\n                \"x0\": 0,\n                \"y0\": 0,\n                \"x1\": 1,\n                \"y1\": 1,\n                \"speaking_label\": True,\n                \"is_visible\": True,\n                \"looking_label\": False,\n            },\n            {\n                \"timestamp\": 0.25,\n                \"x0\": 1,\n                \"y0\": 0,\n                \"x1\": 1,\n                \"y1\": 1,\n                \"speaking_label\": False,\n                \"is_visible\": True,\n                \"looking_label\": False,\n            },\n        ],\n    }\n\n    def _fetch_frame_label_fn(timestamp):\n        return video._fetch_frame_label(\n            \"speaking_label\",\n            timestamp,\n            rectangles_dict,\n            carry_over_keys=[\"speaking_label\", \"looking_label\", \"is_visible\"],\n            required_keys=[\"speaking_label\", \"looking_label\"],\n        )\n\n    # Test the first label.\n    ret = _fetch_frame_label_fn(0)\n    assert ret[\"identity0\"] == rectangles_dict[\"identity0\"][0]\n    assert ret[\"identity1\"] == rectangles_dict[\"identity1\"][0]\n\n    # Test an interpolated label.\n    ret = _fetch_frame_label_fn(0.25)\n    expected_id0 = rectangles_dict[\"identity0\"][0].copy()\n    expected_id0[\"x0\"] = 0.25\n    expected_id0[\"timestamp\"] = 0.25\n    assert ret[\"identity0\"] == expected_id0\n\n    assert ret[\"identity1\"] == rectangles_dict[\"identity1\"][1]\n\n    # We should get an interpolated label for identity0, and an \"empty\" label\n    # for identity1 since there are no more labels.\n    ret = _fetch_frame_label_fn(0.5)\n    expected_id0 = rectangles_dict[\"identity0\"][0].copy()\n    expected_id0[\"x0\"] = 0.50\n    expected_id0[\"timestamp\"] = 0.50\n    expected_id0[\"speaking_label\"] = False\n    assert ret[\"identity0\"] == expected_id0\n    assert ret[\"identity1\"] == _get_invalid_label(0.50)\n\n    # We should get empty labels.\n    ret = _fetch_frame_label_fn(-1)\n    expected_id0 = _get_invalid_label(-1)\n    assert ret[\"identity0\"] == expected_id0\n\n    expected_id1 = _get_invalid_label(-1)\n    assert ret[\"identity1\"] == expected_id1\n\n\nRECTANGLES_DICT = {\n    \"identity0\": [\n        {\n            \"timestamp\": 0.0,\n            \"x0\": 0,\n            \"y0\": 0,\n            \"x1\": 1,\n            \"y1\": 1,\n            \"action_label\": 0,\n            \"is_visible\": True,\n        },\n        {\n            \"timestamp\": 0.1,\n            \"x0\": 0,\n            \"y0\": 0,\n            \"x1\": 1,\n            \"y1\": 1,\n            \"action_label\": 1,\n            \"is_visible\": True,\n        },\n        {\n            \"timestamp\": 0.2,\n            \"x0\": 0,\n            \"y0\": 0,\n            \"x1\": 1,\n            \"y1\": 1,\n            \"action_label\": 1,\n            \"is_visible\": True,\n        },\n        {\n            \"timestamp\": 0.3,\n            \"x0\": 0,\n            \"y0\": 0,\n            \"x1\": 1,\n            \"y1\": 1,\n            \"action_label\": 0,\n            \"is_visible\": True,\n        },\n        {\n            \"timestamp\": 1.0,\n            \"x0\": 0,\n            \"y0\": 0,\n            \"x1\": 1,\n            \"y1\": 1,\n            \"action_label\": 1,\n            \"is_visible\": True,\n        },\n        {\n            \"timestamp\": 1.1,\n            \"x0\": 0,\n            \"y0\": 0,\n            \"x1\": 1,\n            \"y1\": 1,\n            \"action_label\": 1,\n            \"is_visible\": True,\n        },\n    ],\n}\n\n# Below is a schematic of @rectangles_dict, where the asterisks denote labels\n# (with the corresponding class int above). The letters below denote the\n# regions.\n#\n#    0       1       1       0              1       1\n#    *       *       *       *              *       *\n# +++++++++++++++++++++++++++++++++ // ++++++++++++++++++\n#        A   [       B       )   C      C   [   D   )   E\n\nRECTANGLES_TEST_CASES = [\n    (0.04, (0, None), \"A\"),\n    (0.06, (0, None), \"A\"),\n    (0.11, (1, 0.01 / 0.2), \"B\"),\n    (0.15, (1, 0.05 / 0.2), \"B\"),\n    (0.19, (1, 0.09 / 0.2), \"B\"),\n    (0.23, (1, 0.13 / 0.2), \"B\"),\n    (0.31, (None, None), \"C\"),\n    (0.90, (None, None), \"C\"),\n    (1.05, (1, 0.05 / 0.1), \"D\"),\n    (1.11, (None, None), \"E\"),\n]\n\n\n@pytest.mark.parametrize(\"test_case\", RECTANGLES_TEST_CASES)\ndef test_fetch_frame_with_progress(test_case):\n\n    timestamp, (expected_action_label, expected_progress), _ = test_case\n\n    ret0 = video._fetch_frame_label(\n        \"action_label\",\n        timestamp,\n        RECTANGLES_DICT,\n        0.2,\n        set([1]),\n        [\"action_label\"],\n    )[\"identity0\"]\n    assert ret0[\"action_label\"] == expected_action_label\n    assert ret0[\"progress\"] == (\n        expected_progress\n        if expected_progress is None\n        else pytest.approx(expected_progress)\n    )\n"
  },
  {
    "path": "tests/data/io/__init__.py",
    "content": ""
  },
  {
    "path": "tests/data/io/test_transfer_clients.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nimport os\n\nimport pytest\n\nfrom corenet.options.opts import get_training_arguments\nfrom corenet.utils.download_utils import get_local_path\n\n\n@pytest.mark.skip_ci\n@pytest.mark.parametrize(\n    \"file_path\",\n    [\n        # Downloading of below file has been tested on Oct 30, 2023.\n        # To avoid CI/CD breaking, we skip these tests during CI/CD.\n        \"https://github.com/apple/ml-cvnets/blob/main/examples/range_augment/classification/mobilenet_v1.yaml\",\n        \"http://farm4.staticflickr.com/3217/2975157083_4567dde5d5_z.jpg\",\n    ],\n)\ndef test_client(file_path: str):\n    opts = get_training_arguments(args=[])\n\n    local_path = get_local_path(\n        opts=opts,\n        path=file_path,\n        max_retries=1,\n    )\n    assert os.path.isfile(local_path)\n"
  },
  {
    "path": "tests/data/samplers/__init__.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n"
  },
  {
    "path": "tests/data/samplers/test_batch_sampler_config.yaml",
    "content": "# pytest: disable\nsampler:\n  name: \"batch_sampler\"\n  num_repeats: 1\n  truncated_repeat_aug_sampler: false\n  bs:\n    crop_size_width: 224\n    crop_size_height: 224\n"
  },
  {
    "path": "tests/data/samplers/test_chain_sampler.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport copy\nimport random\nfrom typing import List\n\nimport numpy as np\nimport pytest\n\nfrom corenet.data.sampler import build_sampler\nfrom tests.configs import get_config\n\n\n@pytest.mark.parametrize(\n    \"tasks, batch_size, num_repeats, trunc_ra_sampler\",\n    [\n        ([\"task_1\"], 1, 4, True),\n        ([\"task_1\", \"task_2\"], 2, 8, True),\n        ([\"task_1\"], 1, 4, False),\n        ([\"task_1\", \"task_2\"], 2, 8, False),\n    ],\n)\ndef test_chain_sampler(\n    tasks: List[str],\n    config_file: str,\n    batch_size: int,\n    num_repeats: int,\n    trunc_ra_sampler: bool,\n) -> None:\n    opts = get_config(config_file=config_file)\n\n    sampler_list = []\n    n_data_samples = {}\n    samples = 1000\n    total_expected_samples = 0\n    for task_name in tasks:\n        # we randomly decide number of repeats so that number of repeats for each task is different\n        # Expected result is deterministic, despite this randomness.\n        reps = random.choice([1, num_repeats])\n\n        sampler_dict = {\n            \"task_name\": task_name,\n            \"train_batch_size0\": batch_size,\n            \"sampler_config\": {\n                \"name\": \"variable_batch_sampler\",\n                \"truncated_repeat_aug_sampler\": trunc_ra_sampler,\n                \"num_repeats\": reps,\n                \"vbs\": {\n                    \"crop_size_width\": 512,\n                    \"crop_size_height\": 512,\n                    \"max_n_scales\": 10,\n                    \"min_crop_size_width\": 256,\n                    \"max_crop_size_width\": 768,\n                    \"min_crop_size_height\": 256,\n                    \"max_crop_size_height\": 768,\n                    \"check_scale\": 16,\n                },\n            },\n        }\n        total_expected_samples += samples * (1 if trunc_ra_sampler else reps)\n        n_data_samples[task_name] = samples\n        sampler_list.append(sampler_dict)\n\n    setattr(opts, \"sampler.chain_sampler\", sampler_list)\n\n    sampler = build_sampler(opts, n_data_samples=n_data_samples, is_training=True)\n\n    np.testing.assert_equal(len(sampler), total_expected_samples)\n\n\n@pytest.mark.parametrize(\n    \"tasks, batch_size, num_repeats, truncated_rep\",\n    [\n        ([\"task_1\"], 1, 4, True),\n        ([\"task_1\", \"task_2\"], 2, 2, True),\n        ([\"task_1\"], 1, 2, False),\n        ([\"task_1\", \"task_2\"], 2, 4, False),\n    ],\n)\ndef test_sampling_mode(\n    tasks: List[str],\n    config_file: str,\n    batch_size: int,\n    num_repeats: int,\n    truncated_rep: bool,\n) -> None:\n    n_samples = 8\n\n    sampler_list = []\n    n_data_samples = {}\n    total_expected_samples = 0\n    for task_name in tasks:\n        sampler_dict = {\n            \"task_name\": task_name,\n            \"train_batch_size0\": batch_size,\n            \"sampler_config\": {\n                \"name\": \"batch_sampler\",\n                \"bs\": {\"crop_size_width\": 512, \"crop_size_height\": 512},\n            },\n        }\n        total_expected_samples += n_samples\n        n_data_samples[task_name] = n_samples\n        sampler_list.append(sampler_dict)\n\n    n_repeats_ = num_repeats\n    if truncated_rep:\n        # when truncated repetition is enabled, then total samples in the dataset\n        # are the same as before repetition\n        n_repeats_ = 1\n\n    expected_seq_out = [\n        t for t in tasks for i in range(n_samples) for j in range(n_repeats_)\n    ]\n    expected_interleave_order = [\n        t\n        for _ in range(n_samples // batch_size)\n        for _ in range(n_repeats_)\n        for t in tasks\n        for _ in range(batch_size)\n    ]\n\n    for mode in [\"sequential\", \"interleave\"]:\n        opts = get_config(config_file=config_file)\n\n        setattr(opts, \"sampler.chain_sampler\", copy.deepcopy(sampler_list))\n\n        setattr(opts, \"sampler.chain_sampler_mode\", mode)\n        setattr(opts, \"sampler.truncated_repeat_aug_sampler\", truncated_rep)\n        setattr(opts, \"sampler.num_repeats\", num_repeats)\n\n        sampler = build_sampler(opts, n_data_samples=n_data_samples, is_training=True)\n\n        sampler_order = [b[len(b) - 1] for batch in sampler for b in batch]\n        if mode == \"sequential\":\n            np.testing.assert_equal(expected_seq_out, sampler_order)\n        else:\n            np.testing.assert_equal(expected_interleave_order, sampler_order)\n\n\ndef pytest_generate_tests(metafunc):\n    configs = [\"tests/data/samplers/test_chain_sampler_config.yaml\"]\n    metafunc.parametrize(\"config_file\", configs)\n"
  },
  {
    "path": "tests/data/samplers/test_chain_sampler_config.yaml",
    "content": "# pytest: disable\n# dummy configuration for testing chain sampler\n# We over-ride different options inside the test to study different cases of chain sampler\nsampler:\n    name: \"chain_sampler\"\n    chain_sampler_mode: \"sequential\"\n    chain_sampler:\n      - task_name: \"task_1\"\n        train_batch_size0: 128\n        val_batch_size0: 100\n        sampler_config:\n          name: \"variable_batch_sampler\"\n          vbs:\n            crop_size_width: 224\n            crop_size_height: 224\n            max_n_scales: 25\n            min_crop_size_width: 128\n            max_crop_size_width: 320\n            min_crop_size_height: 128\n            max_crop_size_height: 320\n            check_scale: 16\n"
  },
  {
    "path": "tests/data/samplers/test_data_samplers.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nfrom typing import Optional\n\nimport numpy as np\nimport pytest\n\nfrom corenet.data.sampler import build_sampler\nfrom tests.configs import get_config\n\nN_DATA_SAMPLES = 1000\nDEFAULT_BATCH_SIZE = 128\n\n\ndef set_common_defaults(\n    opts: argparse.Namespace, batch_size: Optional[int] = DEFAULT_BATCH_SIZE\n) -> None:\n    \"\"\"Set common default values for all samplers.\"\"\"\n    setattr(opts, \"dataset.train_batch_size0\", batch_size)\n\n\n@pytest.mark.parametrize(\n    \"num_repeats, trunc_ra_sampler, crop_size_h, crop_size_w\",\n    [\n        (1, True, 128, 320),\n        (1, False, 128, 320),\n        (4, True, 160, 384),\n        (4, False, 160, 384),\n    ],\n)\ndef test_ssc_fbs_sampler(\n    num_repeats: int, trunc_ra_sampler: bool, crop_size_h: int, crop_size_w: int\n) -> None:\n    \"\"\"Test for single-scale fixed batch size sampler with and without repeated augmentation.\"\"\"\n\n    opts = get_config(config_file=\"tests/data/samplers/test_batch_sampler_config.yaml\")\n\n    set_common_defaults(opts)\n\n    # set repeated augmentation related hyper-parameters\n    setattr(opts, \"sampler.num_repeats\", num_repeats)\n    setattr(opts, \"sampler.truncated_repeat_aug_sampler\", trunc_ra_sampler)\n\n    # we over-ride the spatial sizes for testing different cases\n    setattr(opts, \"sampler.bs.crop_size_height\", crop_size_h)\n    setattr(opts, \"sampler.bs.crop_size_width\", crop_size_w)\n\n    sampler = build_sampler(opts, n_data_samples=N_DATA_SAMPLES, is_training=True)\n    assert hasattr(sampler, \"crop_size_h\")\n    assert hasattr(sampler, \"crop_size_w\")\n    assert sampler.crop_size_h == crop_size_h\n    assert sampler.crop_size_w == crop_size_w\n\n    # repeated sample test\n    np.testing.assert_equal(\n        len(sampler), N_DATA_SAMPLES * (1 if trunc_ra_sampler else num_repeats)\n    )\n\n\n@pytest.mark.parametrize(\n    \"num_repeats, trunc_ra_sampler, min_res_h, max_res_h, min_res_w, max_res_w,max_scales\",\n    [\n        (1, True, 128, 320, 128, 320, 1),\n        (1, False, 128, 320, 128, 320, 5),\n        (4, True, 160, 384, 160, 384, 10),\n        (4, False, 160, 384, 160, 384, 50),\n    ],\n)\ndef test_msc_fbs_batch_sampler(\n    num_repeats: int,\n    trunc_ra_sampler: bool,\n    min_res_h: int,\n    max_res_h: int,\n    min_res_w: int,\n    max_res_w: int,\n    max_scales: int,\n) -> None:\n    \"\"\"Test for multi-scale fixed batch size sampler with and without repeated augmentation.\"\"\"\n    opts = get_config(\n        config_file=\"tests/data/samplers/test_multi_scale_sampler_config.yaml\"\n    )\n\n    set_common_defaults(opts)\n\n    setattr(opts, \"sampler.msc.max_n_scales\", max_scales)\n    setattr(opts, \"sampler.msc.min_crop_size_width\", min_res_w)\n    setattr(opts, \"sampler.msc.max_crop_size_width\", max_res_w)\n    setattr(opts, \"sampler.msc.min_crop_size_height\", min_res_h)\n    setattr(opts, \"sampler.msc.max_crop_size_height\", max_res_h)\n\n    # set repeated augmentation related hyper-parameters\n    setattr(opts, \"sampler.num_repeats\", num_repeats)\n    setattr(opts, \"sampler.truncated_repeat_aug_sampler\", trunc_ra_sampler)\n\n    sampler = build_sampler(opts, n_data_samples=1000, is_training=True)\n\n    assert hasattr(sampler, \"img_batch_tuples\")\n\n    scales_vbs = sampler.img_batch_tuples\n\n    # check if number of sampled scales are <= max_scales + 1\n    # + 1 here because if the base image size is not present in the sampled scales, then we add it\n    assert len(scales_vbs) <= (max_scales + 1)\n\n    for h, w, b_sz in scales_vbs:\n        # Resolution needs to be within the specified intervals\n        assert min_res_h <= h <= max_res_h\n        assert min_res_w <= w <= max_res_w\n        assert (\n            b_sz == DEFAULT_BATCH_SIZE\n        ), \"We expect batch size to be the same for all scales in multi-scale sampler\"\n\n    # repeated sample test\n    np.testing.assert_equal(\n        len(sampler), N_DATA_SAMPLES * (1 if trunc_ra_sampler else num_repeats)\n    )\n\n\n@pytest.mark.parametrize(\n    \"num_repeats, trunc_ra_sampler, min_res_h, max_res_h, min_res_w, max_res_w,max_scales, batch_size\",\n    [\n        (1, True, 128, 320, 128, 320, 1, 1),\n        (1, False, 128, 320, 128, 320, 5, 2),\n        (4, True, 160, 384, 160, 384, 10, DEFAULT_BATCH_SIZE),\n        (4, False, 160, 384, 160, 384, 50, DEFAULT_BATCH_SIZE),\n    ],\n)\ndef test_msc_vbs_sampler(\n    num_repeats: int,\n    trunc_ra_sampler: bool,\n    min_res_h: int,\n    max_res_h: int,\n    min_res_w: int,\n    max_res_w: int,\n    max_scales: int,\n    batch_size: int,\n) -> None:\n    \"\"\"Test for multi-scale variably-batch size sampler with and without repeated augmentation.\"\"\"\n    opts = get_config(\n        config_file=\"tests/data/samplers/test_variable_batch_sampler_config.yaml\"\n    )\n\n    set_common_defaults(opts, batch_size)\n\n    setattr(opts, \"sampler.vbs.max_n_scales\", max_scales)\n    setattr(opts, \"sampler.vbs.min_crop_size_width\", min_res_w)\n    setattr(opts, \"sampler.vbs.max_crop_size_width\", max_res_w)\n    setattr(opts, \"sampler.vbs.min_crop_size_height\", min_res_h)\n    setattr(opts, \"sampler.vbs.max_crop_size_height\", max_res_h)\n    setattr(opts, \"sampler.num_repeats\", num_repeats)\n    setattr(opts, \"sampler.truncated_repeat_aug_sampler\", trunc_ra_sampler)\n\n    sampler = build_sampler(opts, n_data_samples=N_DATA_SAMPLES, is_training=True)\n\n    assert hasattr(sampler, \"img_batch_tuples\")\n\n    scales_vbs = sampler.img_batch_tuples\n\n    # check if number of sampled scales are <= max_scales + 1\n    # + 1 here because if the base image size is not present in the sampled scales, then we add it\n    assert len(scales_vbs) <= (max_scales + 1)\n\n    for h, w, b_sz in scales_vbs:\n        # Resolution needs to be within the specified intervals\n        assert min_res_h <= h <= max_res_h\n        assert min_res_w <= w <= max_res_w\n\n        area_ratio = (h * w * 1.0) / (224 * 224)\n\n        # For variable sampler, we expect larger batch sizes for smaller resolution as\n        # compared to base batch size and vice-versa\n        if area_ratio < 1.0:\n            # When batch size=1 (or small), then MSc-VBS sampler behaves like MSc-FBS, i.e., any resolution slightly\n            # smaller than base resolution have the same batch size of 1.\n            assert b_sz >= batch_size, (\n                \"For spatial resolution smaller than the base resolution, \"\n                \"we expect batch size >= base batch size\"\n            )\n        elif area_ratio > 1.0:\n            # When batch size=1 (or small), then MSc-VBS sampler behaves like MSc-FBS, i.e., any resolution higher\n            # than base resolution have the same batch size of 1.\n            assert b_sz <= batch_size, (\n                \"For spatial resolution larger than base resolution, \"\n                \"we expect batch size to <= base batch size\"\n            )\n        else:\n            assert b_sz == batch_size, (\n                \"For spatial resolution equal to the base resolution, \"\n                \"we expect batch size == base batch size\"\n            )\n\n    # repeated sample test\n    np.testing.assert_equal(\n        len(sampler), N_DATA_SAMPLES * (1 if trunc_ra_sampler else num_repeats)\n    )\n\n\n@pytest.mark.parametrize(\n    \"num_repeats, trunc_ra_sampler, min_res_h, max_res_h, min_res_w, max_res_w,max_scales, fps_scales, batch_size, is_training\",\n    [\n        (1, True, 128, 320, 128, 320, 1, 1, 1, True),\n        (1, False, 128, 320, 128, 320, 5, 5, 2, False),\n        (4, True, 160, 384, 160, 384, 10, 1, DEFAULT_BATCH_SIZE, True),\n        (4, False, 160, 384, 160, 384, 50, 5, DEFAULT_BATCH_SIZE, False),\n    ],\n)\ndef test_video_clip_sampler(\n    num_repeats: int,\n    trunc_ra_sampler: bool,\n    min_res_h: int,\n    max_res_h: int,\n    min_res_w: int,\n    max_res_w: int,\n    max_scales: int,\n    fps_scales: int,\n    batch_size: int,\n    is_training: bool,\n) -> None:\n    \"\"\"Test for multi-scale variably-batch size sampler with and without repeated augmentation.\"\"\"\n    opts = get_config(\n        config_file=\"tests/data/samplers/test_video_clip_batch_sampler_config.yaml\"\n    )\n\n    set_common_defaults(opts, batch_size)\n\n    setattr(opts, \"sampler.vbs.max_n_scales\", max_scales)\n    setattr(opts, \"sampler.vbs.min_crop_size_width\", min_res_w)\n    setattr(opts, \"sampler.vbs.max_crop_size_width\", max_res_w)\n    setattr(opts, \"sampler.vbs.min_crop_size_height\", min_res_h)\n    setattr(opts, \"sampler.vbs.max_crop_size_height\", max_res_h)\n    setattr(opts, \"sampler.num_repeats\", num_repeats)\n    setattr(opts, \"sampler.vcbs.video_fps_num_scales\", fps_scales)\n    setattr(opts, \"sampler.truncated_repeat_aug_sampler\", trunc_ra_sampler)\n\n    metadata = {\n        0: {\n            \"video_path\": \"tests/data/dummy_video.mov\",\n            \"video_fps\": 29,\n            \"total_video_frames\": 114,\n            \"video_duration\": 3.9,\n        }\n    }\n    sampler = build_sampler(\n        opts,\n        n_data_samples=N_DATA_SAMPLES,\n        is_training=is_training,\n        get_item_metadata=metadata.__getitem__,\n    )\n\n    assert hasattr(sampler, \"img_batch_tuples\")\n    assert hasattr(sampler, \"frame_rate_scales\")\n\n    if is_training:\n        # Check if number of sampled scales are <= max_scales + 1,\n        # + 1 here because if the base image size is not present in the sampled scales,\n        # then we add it.\n        assert len(sampler.img_batch_tuples) <= max_scales + 1\n        assert len(sampler.frame_rate_scales) <= fps_scales + 1\n        expected_len = N_DATA_SAMPLES * (1 if trunc_ra_sampler else num_repeats)\n    else:\n        assert len(sampler.img_batch_tuples) == 1\n        assert len(sampler.frame_rate_scales) == 1\n        expected_len = N_DATA_SAMPLES\n    # Repeated sample test.\n    np.testing.assert_equal(len(sampler), expected_len)\n"
  },
  {
    "path": "tests/data/samplers/test_multi_scale_sampler_config.yaml",
    "content": "# pytest: disable\nsampler:\n  name: \"multi_scale_sampler\"\n  num_repeats: 1\n  truncated_repeat_aug_sampler: false\n  msc:\n    crop_size_width: 224\n    crop_size_height: 224\n    max_n_scales: 5\n    min_crop_size_width: 128\n    max_crop_size_width: 320\n    min_crop_size_height: 128\n    max_crop_size_height: 320\n    check_scale: 32\n"
  },
  {
    "path": "tests/data/samplers/test_variable_batch_sampler_config.yaml",
    "content": "# pytest: disable\nsampler:\n  name: \"variable_batch_sampler\"\n  vbs:\n    crop_size_width: 224\n    crop_size_height: 224\n    max_n_scales: 5\n    min_crop_size_width: 128\n    max_crop_size_width: 320\n    min_crop_size_height: 128\n    max_crop_size_height: 320\n    check_scale: 32\n"
  },
  {
    "path": "tests/data/samplers/test_video_clip_batch_sampler_config.yaml",
    "content": "# pytest: disable\nsampler:\n  name: \"video_clip_batch_sampler\"\n  vbs:\n    crop_size_width: 224\n    crop_size_height: 224\n    check_scale: 32\n  vcbs:\n    num_frames_per_clip: 8\n    video_fps: 8\n    audio_fps: 16000\n    max_num_clips_per_batch: 2\n    num_clips_per_second_train: 2\n    num_clips_per_second_val: 2\n    num_samples_per_clip: 2\n    video_fps_num_scales: 2\n"
  },
  {
    "path": "tests/data/text_tokenizer/__init__.py",
    "content": ""
  },
  {
    "path": "tests/data/text_tokenizer/test_clip_tokenizer.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom argparse import Namespace\n\nimport torch\n\nfrom corenet.data.text_tokenizer.clip_tokenizer import ClipTokenizer\n\n\ndef test_clip_tokenizer():\n    \"\"\"Test for 'ClipTokenizer'.\"\"\"\n    opts = Namespace()\n\n    setattr(\n        opts,\n        \"text_tokenizer.clip.merges_path\",\n        \"http://download.pytorch.org/models/text/clip_merges.bpe\",\n    )\n    setattr(\n        opts,\n        \"text_tokenizer.clip.encoder_json_path\",\n        \"http://download.pytorch.org/models/text/clip_encoder.json\",\n    )\n\n    tokenizer = ClipTokenizer(opts=opts)\n    out = tokenizer(\"the quick brown fox jumped over the lazy dog\")\n\n    expected_data = [\n        49406,  # Start token id\n        518,\n        3712,\n        2866,\n        3240,\n        16901,\n        962,\n        518,\n        10753,\n        1929,\n        49407,  # end token id\n    ]\n    expected_out = torch.tensor(expected_data, dtype=out.dtype)\n    torch.testing.assert_close(actual=out, expected=expected_out)\n    assert tokenizer.sot_token == \"<|startoftext|>\"\n    assert tokenizer.eot_token == \"<|endoftext|>\"\n    assert tokenizer.sot_token_id == 49406\n    assert tokenizer.eot_token_id == 49407\n"
  },
  {
    "path": "tests/data/text_tokenizer/test_openai_clip_tokenizer.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom argparse import Namespace\n\nimport torch\n\nfrom corenet.third_party.data.text_tokenizer.openai_clip_tokenizer import (\n    OpenAIClipTokenizer,\n)\n\n\ndef test_openai_clip_tokenizer():\n    \"\"\"Test for OpenAIClipTokenizer.\"\"\"\n    opts = Namespace()\n\n    setattr(\n        opts,\n        \"text_tokenizer.openai_clip.bpe_path\",\n        \"https://github.com/openai/CLIP/raw/a1d071733d7111c9c014f024669f959182114e33/clip/bpe_simple_vocab_16e6.txt.gz\",\n    )\n    tokenizer = OpenAIClipTokenizer(opts)\n    out = tokenizer(\"the quick brown fox jumped over the lazy dog\")\n\n    expected_data = [\n        49406,  # Start token id\n        518,\n        3712,\n        2866,\n        3240,\n        16901,\n        962,\n        518,\n        10753,\n        1929,\n        49407,  # end token id\n    ]\n    expected_out = torch.tensor(expected_data, dtype=out.dtype)\n    torch.testing.assert_close(actual=out, expected=expected_out)\n    assert tokenizer.sot_token == \"<|startoftext|>\"\n    assert tokenizer.eot_token == \"<|endoftext|>\"\n    assert tokenizer.sot_token_id == 49406\n    assert tokenizer.eot_token_id == 49407\n"
  },
  {
    "path": "tests/data/video_reader/__init__.py",
    "content": ""
  },
  {
    "path": "tests/data/video_reader/test_av_reader.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport sys\n\nimport pytest\nimport torch\n\nfrom corenet.data.transforms.common import Compose\nfrom corenet.data.video_reader.decord_reader import DecordAVReader\nfrom corenet.data.video_reader.ffmpeg_reader import FFMPEGReader\nfrom corenet.data.video_reader.ffmpeg_utils import IS_FFMPEG_INSTALLED\nfrom corenet.data.video_reader.pyav_reader import PyAVReader\nfrom tests.configs import get_config\n\n\n@pytest.mark.parametrize(\"reader_class\", [PyAVReader, DecordAVReader, FFMPEGReader])\n@pytest.mark.parametrize(\n    \"num_frames_per_clip,clips_per_video,is_training,output_video_fps,output_audio_fps,num_samples_per_clip,frame_stack_format\",\n    [\n        # Training cases.\n        # num_frames_per_clip > num_frames_in_video.\n        (15, 3, True, -1, -1, 2, \"sequence_first\"),\n        # Perfect training case.\n        (16, 3, True, 8, 16000, 2, \"sequence_first\"),\n        # clips_per_video = 1,\n        (60, 1, True, 16, -1, 1, \"sequence_first\"),\n        (120, 3, True, 8, 16000, 2, \"channel_first\"),\n        # Evaluation cases.\n        # Perfect validation case.\n        (16, 3, False, -1, -1, 2, \"sequence_first\"),\n        # clips_per_video = 1,\n        (30, 1, False, 8, 16000, 1, \"sequence_first\"),\n        (120, 3, False, 16, -1, 2, \"channel_first\"),\n    ],\n)\ndef test_video_reader_clips(\n    reader_class,\n    num_frames_per_clip,\n    clips_per_video,\n    is_training,\n    output_video_fps,\n    output_audio_fps,\n    num_samples_per_clip,\n    frame_stack_format,\n):\n    if reader_class is DecordAVReader and \"decord\" not in sys.modules:\n        pytest.skip(\"Decord (optional dependncy) is not installed.\")\n    if reader_class is FFMPEGReader and not IS_FFMPEG_INSTALLED:\n        pytest.skip(\"FFmpeg (optional dependncy) is not installed.\")\n    # This test makes sure that the dimension of the outputs match the expectations\n    if frame_stack_format == \"channel_first\":\n        channel_idx = 1\n        time_idx = 2\n    else:\n        channel_idx = 2\n        time_idx = 1\n    opts = get_config()\n    setattr(opts, \"dataset.collate_fn_name_train\", \"default_collate_fn\")\n    setattr(opts, \"dataset.collate_fn_name_val\", \"default_collate_fn\")\n    setattr(opts, \"video_reader.frame_stack_format\", frame_stack_format)\n    testfile = \"tests/data/dummy_video.mov\"\n    silent_testfile = \"tests/data/dummy_silent_video.mov\"\n    reader = reader_class(opts, is_training=is_training)\n    silent_reader = reader_class(opts, is_training=is_training)\n    video_channels = 3\n    video, audio, metadata = reader.read_video_file_into_clips(\n        testfile,\n        num_frames_per_clip=num_frames_per_clip,\n        clips_per_video=clips_per_video,\n        is_training=is_training,\n        output_video_fps=output_video_fps,\n        output_audio_fps=output_audio_fps,\n        num_samples_per_clip=num_samples_per_clip,\n    ).values()\n    (\n        silent_video,\n        silent_audio,\n        silent_metadata,\n    ) = reader.read_video_file_into_clips(\n        silent_testfile,\n        num_frames_per_clip=num_frames_per_clip,\n        clips_per_video=clips_per_video,\n        is_training=is_training,\n        output_video_fps=output_video_fps,\n        output_audio_fps=output_audio_fps,\n        num_samples_per_clip=num_samples_per_clip,\n        video_only=True,\n    ).values()\n    assert video.shape == silent_video.shape\n    assert (\n        metadata[\"video_frame_timestamps\"].shape\n        == silent_metadata[\"video_frame_timestamps\"].shape\n    )\n    assert metadata[\"video_fps\"] == silent_metadata[\"video_fps\"]\n    assert silent_audio is None\n    assert silent_metadata[\"audio_fps\"] is None\n    assert video.shape[0] == audio.shape[0]\n    assert metadata[\"video_frame_timestamps\"].shape == (\n        video.shape[0],\n        video.shape[time_idx],\n    )\n    assert video.ndim == 5 and audio.ndim == 3\n    if is_training:\n        assert video.shape[0] == clips_per_video * num_samples_per_clip\n    else:\n        assert video.shape[0] == clips_per_video\n    assert video.shape[time_idx] == num_frames_per_clip\n    assert video.shape[channel_idx] == video_channels\n    assert (\n        video.shape[time_idx]\n        - audio.shape[1] * metadata[\"video_fps\"] / metadata[\"audio_fps\"]\n        < 1\n    ), \"Audio and video are of different lengths in seconds.\"\n\n    if output_video_fps > 0:\n        assert metadata[\"video_fps\"] == output_video_fps\n    if output_audio_fps > 0:\n        assert metadata[\"audio_fps\"] == output_audio_fps\n\n\n@pytest.mark.parametrize(\"reader_class\", [PyAVReader, DecordAVReader, FFMPEGReader])\n@pytest.mark.parametrize(\n    \"num_frames_per_clip,clips_per_video,is_training,output_video_fps,output_audio_fps,num_samples_per_clip,frame_stack_format\",\n    [\n        # Training cases.\n        # Perfect training case.\n        (8, 3, True, -1, -1, 1, \"sequence_first\"),\n        (16, 3, True, 8, 16000, 2, \"channel_first\"),\n        (120, 3, True, 8, 16000, 2, \"channel_first\"),\n        # Evaluation cases.\n        # Perfect case.\n        (8, 3, False, -1, -1, 1, \"sequence_first\"),\n        (16, 3, False, 8, 16000, 2, \"channel_first\"),\n        (120, 3, False, 8, 16000, 2, \"channel_first\"),\n    ],\n)\ndef test_video_reader_values(\n    reader_class,\n    num_frames_per_clip,\n    clips_per_video,\n    is_training,\n    output_video_fps,\n    output_audio_fps,\n    num_samples_per_clip,\n    frame_stack_format,\n):\n    if reader_class is DecordAVReader and \"decord\" not in sys.modules:\n        pytest.skip(\"Decord (optional dependncy) is not installed.\")\n    if reader_class is FFMPEGReader and not IS_FFMPEG_INSTALLED:\n        pytest.skip(\"FFmpeg (optional dependncy) is not installed.\")\n    reader_name = \"pyav\" if reader_class is PyAVReader else \"decord\"\n    # This test makes sure that the values in the clips for perfect videos are different\n    opts = get_config()\n    setattr(opts, \"dataset.collate_fn_name_train\", \"default_collate_fn\")\n    setattr(opts, \"dataset.collate_fn_name_val\", \"default_collate_fn\")\n    setattr(opts, \"video_reader.name\", reader_name)\n    setattr(opts, \"video_reader.frame_stack_format\", frame_stack_format)\n    testfile = \"tests/data/dummy_video.mov\"\n    reader = reader_class(opts, is_training=is_training)\n    video, audio, metadata = reader.read_video_file_into_clips(\n        testfile,\n        num_frames_per_clip=num_frames_per_clip,\n        clips_per_video=clips_per_video,\n        is_training=is_training,\n        output_video_fps=output_video_fps,\n        output_audio_fps=output_audio_fps,\n        num_samples_per_clip=num_samples_per_clip,\n    ).values()\n\n    # Dummy video has 114 frames.\n    total_frames = 114\n    if num_frames_per_clip > total_frames:\n        assert torch.allclose(\n            video[:-1], video[1:]\n        ), \"Not all video clips are the same.\"\n        assert torch.allclose(\n            audio[:-1], audio[1:]\n        ), \"Not all audio clips are the same.\"\n    else:\n        assert not torch.allclose(\n            video[:-1], video[1:]\n        ), \"All video clips are the same.\"\n        assert not torch.allclose(\n            audio[:-1], audio[1:]\n        ), \"All audio clips are the same.\"\n\n\n@pytest.mark.parametrize(\"reader_class\", [PyAVReader, DecordAVReader, FFMPEGReader])\ndef test_build_video_metadata(reader_class):\n    if reader_class is DecordAVReader and \"decord\" not in sys.modules:\n        pytest.skip(\"Decord (optional dependncy) is not installed.\")\n    if reader_class is FFMPEGReader and not IS_FFMPEG_INSTALLED:\n        pytest.skip(\"FFmpeg (optional dependncy) is not installed.\")\n\n    # This test makes sure that the values in the clips for perfect videos are different\n    opts = get_config()\n\n    reader = reader_class(opts)\n\n    testfile = \"tests/data/dummy_video.mov\"\n    expected_metadata = {\n        \"filename\": testfile,\n        \"video_fps\": 30,\n        \"total_video_frames\": 114,\n        \"video_duration\": 3.8,\n    }\n    metadata = reader.build_video_metadata(testfile)\n    assert metadata[\"filename\"] == expected_metadata[\"filename\"]\n    assert round(metadata[\"video_fps\"], 0) == expected_metadata[\"video_fps\"]\n    assert metadata[\"total_video_frames\"] == expected_metadata[\"total_video_frames\"]\n    assert round(metadata[\"video_duration\"], 1) == expected_metadata[\"video_duration\"]\n"
  },
  {
    "path": "tests/data/video_reader/test_ffmpeg_utils.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport copy\nfrom pathlib import Path\nfrom typing import Dict\n\nimport numpy as np\nimport pytest\nimport torch\n\nfrom corenet.data.transforms.common import BaseTransformation, Identity\nfrom corenet.data.video_reader.ffmpeg_reader import FFMPEGReader\nfrom corenet.data.video_reader.ffmpeg_utils import (\n    IS_FFMPEG_INSTALLED,\n    FFMPEGError,\n    ffmpeg,\n    ffprobe,\n    get_flags_to_replicate_audio_codec,\n    get_video_metadata,\n    transform_video_file,\n    write_audio,\n    write_video,\n)\nfrom tests.configs import get_config\n\n\ndef assert_video_data_is_close(actual: Dict, expected: Dict) -> None:\n    if not IS_FFMPEG_INSTALLED:\n        pytest.skip(\"FFmpeg (optional dependncy) is not installed.\")\n    \"\"\"Given two ffmpeg reader outputs, asserts audio and video signals are close.\"\"\"\n\n    def matching_ratio(x: torch.Tensor, y: torch.Tensor, atol=0.05, rtol=0.0):\n        \"\"\"Returns the percentage of elements of x,y that are close with atol, rtol.\"\"\"\n        return torch.isclose(x, y, atol=atol, rtol=rtol).float().mean()\n\n    assert matching_ratio(actual[\"video\"], expected[\"video\"]) >= 0.99\n\n    assert np.isclose(\n        actual[\"audio\"].shape[0],\n        expected[\"audio\"].shape[0],\n        atol=0.05 * actual[\"metadata\"][\"audio_fps\"],  # 0.05 seconds\n    )\n    min_length = min(actual[\"audio\"].shape[0], expected[\"audio\"].shape[0])\n    assert (\n        matching_ratio(actual[\"audio\"][:min_length], expected[\"audio\"][:min_length])\n        >= 0.99\n    )\n\n\ndef test_transform_video_with_trimming(tmp_path: Path):\n    if not IS_FFMPEG_INSTALLED:\n        pytest.skip(\"FFmpeg (optional dependncy) is not installed.\")\n    opts = get_config()\n    input_path = \"./tests/data/dummy_video.mov\"\n    output_path = str(tmp_path / \"output.mov\")\n    from_timestamp = 1\n    to_timestamp = 2.5\n    transform_video_file(\n        input_filename=input_path,\n        output_filename=output_path,\n        transform=Identity(opts),\n        from_timestamp=from_timestamp,\n        to_timestamp=to_timestamp,\n        encoder_flags={\n            # Audio codec should be specified when trimming.\n            **get_flags_to_replicate_audio_codec(input_path),\n            # Use highest possible quality so that we can compare the results.\n            \"q:a\": 0,\n            \"q:v\": 0,\n        },\n    )\n\n    reader = FFMPEGReader(opts)\n    input_data = reader.read_video(\n        input_path,\n    )\n    output_data = reader.read_video(\n        output_path,\n    )\n\n    expected_data = copy.deepcopy(input_data)\n    for key in (\"video\", \"audio\"):\n        fps = expected_data[\"metadata\"][f\"{key}_fps\"]\n        from_frame = int(from_timestamp * fps)\n        to_frame = int(to_timestamp * fps)\n        expected_data[key] = expected_data[key][from_frame:to_frame]\n\n    assert_video_data_is_close(actual=output_data, expected=expected_data)\n\n\ndef test_transform_video_with_fps(tmp_path: Path):\n    if not IS_FFMPEG_INSTALLED:\n        pytest.skip(\"FFmpeg (optional dependncy) is not installed.\")\n    opts = get_config()\n    input_path = \"./tests/data/dummy_video.mov\"\n    output_path = str(tmp_path / \"output.mov\")\n    transform_video_file(\n        input_filename=input_path,\n        output_filename=output_path,\n        transform=Identity(opts),\n        video_fps=8,\n        encoder_flags={\n            # Audio codec should be specified when trimming.\n            **get_flags_to_replicate_audio_codec(input_path),\n            # Use highest possible quality so that we can compare the results.\n            \"q:a\": 0,\n            \"q:v\": 0,\n        },\n    )\n\n    import os\n\n    print(\"test \", output_path, os.path.exists(output_path))\n    metadata = get_video_metadata(output_path)\n    assert metadata[\"video_fps\"] == 8\n\n\nclass SmallCrop(BaseTransformation):\n    CROP_SIZE = 7, 9\n\n    def __call__(self, data: Dict) -> Dict:\n        frames = data[\"samples\"][\"video\"]\n        frames = frames[:, :, :, : self.CROP_SIZE[0], : self.CROP_SIZE[1]]\n        data[\"samples\"][\"video\"] = frames\n        return data\n\n\n@pytest.mark.parametrize(\n    \"transform_cls,transform_kwargs\",\n    [(Identity, {}), (SmallCrop, {\"output_dimensions\": SmallCrop.CROP_SIZE})],\n)\ndef test_transform_video_file(\n    tmp_path: Path,\n    transform_cls: BaseTransformation,\n    transform_kwargs: Dict,\n):\n    if not IS_FFMPEG_INSTALLED:\n        pytest.skip(\"FFmpeg (optional dependncy) is not installed.\")\n    opts = get_config()\n    input_path = \"./tests/data/dummy_video.mov\"\n    output_path = str(tmp_path / \"output.mov\")\n    transform_video_file(\n        input_filename=input_path,\n        output_filename=output_path,\n        transform=transform_cls(opts),\n        encoder_flags={\n            # Use highest possible quality so that we can compare the results.\n            \"q:a\": 0,\n            \"q:v\": 0,\n        },\n        **transform_kwargs,\n    )\n\n    reader = FFMPEGReader(opts)\n    input_data = reader.read_video(input_path)\n    output_data = reader.read_video(output_path)\n\n    for data in input_data, output_data:\n        # The BaseTransformation instances expect 5D tensors for multi-clip videos.\n        # FIXME: A better solution is to refactor FFMPEGReader.read_video() to follow\n        # the convention of returning a 5D tensor, rather than a 4D tensor.\n        data[\"video\"] = torch.unsqueeze(data[\"video\"], 0)\n\n    # Apply the transformation on all frames of the input data. `output_data` is\n    # transformed chunk-by-chunk using an ffmpeg decode->transform->concat->encode\n    # pipeline, while `input_data` is read into RAM as a whole and processed using the\n    # same transformation.\n    expected_data = transform_cls(opts)(\n        {\n            \"samples\": input_data,\n            \"targets\": {},\n        }\n    )[\"samples\"]\n\n    assert_video_data_is_close(actual=output_data, expected=expected_data)\n\n\ndef test_error_message() -> None:\n    with pytest.raises(FFMPEGError, match=\"Could not extract ffmpeg metadata for\"):\n        ffprobe(\"/invalid/path\")\n\n    with pytest.raises(FFMPEGError, match=\"use a standard extension for the filename\"):\n        transform_video_file(\n            \"./tests/data/dummy_video.mov\",\n            \"/invalid/path\",\n            transform=lambda x: x,\n        )\n\n\ndef test_ffprobe() -> None:\n    \"\"\"\n    Checks that our implementation of ffprobe is consistent with ffmpeg-python library.\n    \"\"\"\n    if not IS_FFMPEG_INSTALLED:\n        pytest.skip(\"FFmpeg (optional dependency) is not installed.\")\n\n    our_output = ffprobe(\"./tests/data/dummy_video.mov\")\n    library_output = ffmpeg.probe(\"./tests/data/dummy_video.mov\")\n    assert our_output == library_output\n\n\ndef test_write_video_and_audio(\n    tmp_path: Path,\n):\n    if not IS_FFMPEG_INSTALLED:\n        pytest.skip(\"FFmpeg (optional dependncy) is not installed.\")\n    opts = get_config()\n\n    video_data = {\n        \"audio\": torch.linspace(0.0, 2000.0, 32000).sin()[:, None],\n        \"video\": torch.rand(30, 3, 1, 1).repeat(1, 1, 128, 128),\n        \"metadata\": {\"audio_fps\": 16000, \"video_fps\": 15},\n    }\n\n    output_path = str(tmp_path / \"output.mkv\")\n    write_video(video_data, output_path)\n\n    saved_data = FFMPEGReader(opts).read_video(output_path)\n    assert_video_data_is_close(actual=saved_data, expected=video_data)\n\n    # Make sure we can write audio too\n    write_audio(video_data, str(tmp_path / \"output.wav\"))\n"
  },
  {
    "path": "tests/engine/__init__.py",
    "content": ""
  },
  {
    "path": "tests/engine/dummy_configs/ade20k_segmentation/deeplabv3_mobilenetv2.yaml",
    "content": "# pytest: disable\n# This is a dummy configuration for testing classification task end-to-end\ntaskname: '+ MobileNetv2-1.0 DeepLabv3'\ncommon:\n  run_label: \"train\"\n  accum_freq: 1\n  accum_after_epoch: -1\n  log_freq: 200\n  auto_resume: false\n  mixed_precision: true\ndataset:\n  root_train: \"/mnt/vision_datasets/ADEChallengeData2016/\"\n  root_val: \"/mnt/vision_datasets/ADEChallengeData2016/\"\n  name: \"mock_ade20k\"\n  category: \"segmentation\"\n  train_batch_size0: 2 # effective batch size is 16 ( 4 * 4 GPUs)\n  val_batch_size0: 2\n  eval_batch_size0: 1\n  workers: 4\n  persistent_workers: false\n  pin_memory: false\nimage_augmentation:\n  random_crop:\n    enable: true\n    seg_class_max_ratio: 0.75\n    pad_if_needed: true\n    mask_fill: 0 # background idx is 0\n  random_horizontal_flip:\n    enable: true\n  resize:\n    enable: true\n    size: [64, 64]\n    interpolation: \"bilinear\"\n  random_short_size_resize:\n    enable: true\n    interpolation: \"bilinear\"\n    short_side_min: 32\n    short_side_max: 96\n    max_img_dim: 96\n  photo_metric_distort:\n    enable: true\n  random_rotate:\n    enable: true\n    angle: 10\n    mask_fill: 0 # background idx is 0\n  random_gaussian_noise:\n    enable: true\nsampler:\n  name: \"batch_sampler\"\n  bs:\n    crop_size_width: 32\n    crop_size_height: 32\nloss:\n  category: \"segmentation\"\n  segmentation:\n    name: \"cross_entropy\"\n    cross_entropy:\n      aux_weight: 0.4\n      ignore_index: -1\noptim:\n  name: \"sgd\"\n  weight_decay: 1.e-4\n  no_decay_bn_filter_bias: true\n  sgd:\n    momentum: 0.9\nscheduler:\n  name: \"cosine\"\n  is_iteration_based: false\n  max_epochs: 2\n  cosine:\n    max_lr: 0.02\n    min_lr: 0.0001\nmodel:\n  segmentation:\n    name: \"encoder_decoder\"\n    n_classes: 150\n    lr_multiplier: 1\n    seg_head: \"deeplabv3\"\n    output_stride: 8\n    classifier_dropout: 0.1\n    use_aux_head: true\n    activation:\n      name: \"relu\"\n    deeplabv3:\n      aspp_dropout: 0.1\n      aspp_sep_conv: false\n      aspp_out_channels: 32\n      aspp_rates: [ 12, 24, 36 ]\n  classification:\n    name: \"mobilenetv2\"\n    n_classes: 1000\n    activation:\n      name: \"relu6\"\n    mobilenetv2:\n      width_multiplier: 0.25\n  normalization:\n    name: \"sync_batch_norm\"\n    momentum: 0.1\n  activation:\n    name: \"relu6\"\n    inplace: false\n  layer:\n    global_pool: \"mean\"\n    conv_init: \"kaiming_normal\"\n    linear_init: \"normal\"\nema:\n  enable: true\n  momentum: 0.0001\nstats:\n  val: [ \"loss\", \"iou\" ]\n  train: [ \"loss\" ]\n  checkpoint_metric: \"iou\"\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "tests/engine/dummy_configs/coco_detection/resnet_mask_rcnn.yaml",
    "content": "taskname: '+ ResNet-50 Mask RCNN'\ncommon:\n  run_label: \"train\"\n  accum_freq: 1\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\ndataset:\n  root_train: \"tests/data/coco\"\n  root_val: \"tests/data/coco\"\n  category: \"detection\"\n  train_batch_size0: 1 # effective base batch size is 64 (2 * 8 GPUs * 4 nodes)\n  val_batch_size0: 1\n  eval_batch_size0: 1\n  workers: 0\n  persistent_workers: false\n  pin_memory: true\n  name: \"mock_coco_mask_rcnn\"\n  collate_fn_name_train: \"coco_mask_rcnn_collate_fn\"\n  collate_fn_name_val: \"coco_mask_rcnn_collate_fn\"\n  collate_fn_name_test: \"coco_mask_rcnn_collate_fn\"\n\nimage_augmentation:\n  # for evaluation\n  resize:\n    enable: true\n    size: [256, 256]\n    interpolation: \"bilinear\"\nsampler:\n  name: variable_batch_sampler\n  vbs:\n    check_scale: 32\n    crop_size_height: 256\n    crop_size_width: 256\n    max_crop_size_height: 384\n    max_crop_size_width: 384\n    max_n_scales: 10\n    min_crop_size_height: 128\n    min_crop_size_width: 128\nloss:\n  category: \"detection\"\n  detection:\n    name: \"mask_rcnn_loss\"\n    mask_rcnn_loss:\n      classifier_weight: 1\n      box_reg_weight: 1\n      mask_weight: 1\n      objectness_weight: 1\n      rpn_box_reg: 1\noptim:\n  name: \"sgd\"\n  weight_decay: 4.e-5\n  no_decay_bn_filter_bias: true\n  sgd:\n    momentum: 0.9\nscheduler:\n  name: \"multi_step\"\n  max_epochs: 2\n  warmup_iterations: 500\n  warmup_init_lr: 0.001\n  multi_step:\n    gamma: 0.1\n    lr: 0.1\n    milestones: [60, 84]\nmodel:\n  detection:\n    name: \"mask_rcnn\"\n    n_classes: 81\n    mask_rcnn:\n      backbone_lr_multiplier: 0.1\n      norm_layer: \"batch_norm\"\n      disable_fpn: false\n  classification:\n    name: \"resnet\"\n    activation:\n      name: \"relu\"\n    resnet:\n      depth: 50\n  normalization:\n    name: \"batch_norm\"\n    momentum: 0.1\n  activation:\n    name: \"relu\"\n    inplace: false\n  layer:\n    global_pool: \"mean\"\n    conv_init: \"kaiming_normal\"\n    linear_init: \"normal\"\nema:\n  enable: true\n  momentum: 0.0005\nstats:\n  val: [ \"loss\", \"coco_map\"]\n  train: [\"loss\"]\n  checkpoint_metric: \"coco_map.bbox\"\n  checkpoint_metric_max: true\n  coco_map:\n    iou_types: [ \"bbox\", \"segm\" ]\n"
  },
  {
    "path": "tests/engine/dummy_configs/coco_detection/resnet_ssd.yaml",
    "content": "taskname: '+ ResNet-50 SSD'\ncommon:\n  run_label: \"train\"\n  accum_freq: 1\n  accum_after_epoch: -1\n  log_freq: 100\n  auto_resume: true\n  mixed_precision: true\ndataset:\n  root_train: \"tests/data/coco\"\n  root_val: \"tests/data/coco\"\n  category: \"detection\"\n  train_batch_size0: 2 # effective batch size is 64 (16 * 4 GPUs)\n  val_batch_size0: 2\n  eval_batch_size0: 1\n  workers: 0\n  persistent_workers: false\n  pin_memory: true\n  name: \"mock_coco_ssd\"\n  collate_fn_name_train: \"coco_ssd_collate_fn\"\n  collate_fn_name_val: \"coco_ssd_collate_fn\"\n  collate_fn_name_test: \"coco_ssd_collate_fn\"\n\nimage_augmentation:\n  resize:\n    enable: true\n    size: [64, 64]\n    interpolation: \"bicubic\"\nsampler:\n  name: \"batch_sampler\"\n  bs:\n    crop_size_width: 64\n    crop_size_height: 64\nloss:\n  category: \"detection\"\n  detection:\n    name: \"ssd_multibox_loss\"\n    ssd_multibox_loss:\n      neg_pos_ratio: 3\noptim:\n  name: \"sgd\"\n  weight_decay: 5.e-4\n  no_decay_bn_filter_bias: true\n  sgd:\n    momentum: 0.9\n    nesterov: true\nscheduler:\n  name: \"cosine\"\n  max_epochs: 2\n  warmup_iterations: 1800 # 5 epochs\n  warmup_init_lr: 1.e-6\n  cosine:\n    max_lr: 0.0052\n    min_lr: 0.00005\nanchor_generator:\n  name: \"ssd\"\n  ssd:\n    output_strides: [16, 32, 64]\n    aspect_ratios: [ [2, 3], [2, 3], [2]]\n    min_scale_ratio: 0.1\n    max_scale_ratio: 1.05\nmatcher:\n  name: \"ssd\"\n  ssd:\n    center_variance: 0.1\n    size_variance: 0.2\n    iou_threshold: 0.5\nmodel:\n  detection:\n    name: \"ssd\"\n    n_classes: 81\n    ssd:\n      proj_channels: [128, 128, 128]\n      nms_iou_threshold: 0.5\n  classification:\n    name: \"resnet\"\n    activation:\n      name: \"relu\"\n    resnet:\n      depth: 50\n  normalization:\n    name: \"sync_batch_norm\"\n    momentum: 0.1\n  activation:\n    name: \"relu\"\n    inplace: false\n  layer:\n    global_pool: \"mean\"\n    conv_init: \"kaiming_normal\"\n    linear_init: \"normal\"\nema:\n  enable: true\n  momentum: 0.0001\nstats:\n  val: [ \"loss\", \"coco_map\"]\n  train: [\"loss\"]\n  checkpoint_metric: \"coco_map.bbox\"\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "tests/engine/dummy_configs/image_text_clip/clip_vit.yaml",
    "content": "# pytest: disable\n\ntaskname: '+ CLIP-ViT-Tiny/16'\ncommon:\n  run_label: \"train\"\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\n  accum_freq: 1\n  save_all_checkpoints: true\n  save_interval_freq: 5000\ndataset:\n  # root_train does not matter for img_text_tar dataset because dataset is information is expected\n  # to be contained in metadata file.\n  root_train: \"\"\n  disable_val: true\n  train_batch_size0: 2\n  val_batch_size0: 2\n  eval_batch_size0: 2\n  padding_index: 0\n  persistent_workers: false\n  pin_memory: true\n  workers: 0\n  collate_fn_name_train: \"multi_modal_img_text_collate_fn\"\n  collate_fn_name_val: \"multi_modal_img_text_collate_fn\"\n  collate_fn_name_test: \"multi_modal_img_text_collate_fn\"\n\n  name: \"mock_img_text_tar\"\n  category: \"multi_modal_image_text\"\n  multi_modal_img_text:\n    context_length: 12\n    img_text_tar:\n      metadata_file: \".corenet_data_cache/metadata.pkl\"\n\ntext_tokenizer:\n  name: \"clip\"\n  clip:\n    merges_path: \"http://download.pytorch.org/models/text/clip_merges.bpe\"\n    encoder_json_path: \"http://download.pytorch.org/models/text/clip_encoder.json\"\nimage_augmentation:\n  random_resized_crop:\n    enable: true\n    interpolation: \"bilinear\"\n    scale: [0.9, 1.0]\n  resize:\n    enable: true\n    size: 64\n    interpolation: \"bilinear\"\n  center_crop:\n    enable: true\n    size: 64\nsampler:\n  name: \"variable_batch_sampler\"\n  use_shards: true\n  vbs:\n    crop_size_width: 64\n    crop_size_height: 64\n    max_n_scales: 5\n    min_crop_size_width: 32\n    max_crop_size_width: 64\n    min_crop_size_height: 32\n    max_crop_size_height: 64\n    check_scale: 32\nloss:\n  category: \"multi_modal_image_text\"\n  multi_modal_image_text:\n    name: \"contrastive_loss_clip\"\noptim:\n  name: \"adamw\"\n  weight_decay: 0.2\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.98\n    eps: 1.e-6\nscheduler:\n  is_iteration_based: true\n  max_iterations: 4\n  name: cosine\n  warmup_init_lr: 1.e-06\n  warmup_iterations: 1000\n  cosine:\n    max_lr: 0.0005\n    min_lr: 1.e-06\nmodel:\n  activation_checkpointing: true\n  multi_modal_image_text: # multi-modal image-text model\n    name: \"clip\"\n    lr_multiplier_img_encoder: 1.0\n    lr_multiplier_text_encoder: 1.0\n    clip:\n      projection_dim: 128\n  classification:\n    name: \"vit\"\n    vit:\n      mode: \"tiny\"\n      norm_layer: \"layer_norm_fp32\"\n    activation:\n      name: \"gelu\"\n  image_projection_head:\n    name: \"simple_projection_nc2nc\"\n  text: # text encoder\n    name: \"transformer\"\n    vocab_size: 49408\n    context_length: 12\n    transformer:\n      causal_masking: true\n      model_dim: 128\n      n_transformer_layers: 2\n      ffn_multiplier_per_layer: 4.0\n      n_heads_per_layer: 8\n      norm_layer: \"layer_norm_fp32\"\n  normalization:\n    name: \"batch_norm\"\n    momentum: 0.1\n  activation:\n    name: \"gelu\"\n    inplace: true\n  layer:\n    global_pool: \"mean\"\n    conv_init: \"kaiming_uniform\"\n    linear_init: \"trunc_normal\"\n    linear_init_std_dev: 0.02\nema:\n  enable: true\n  momentum: 0.0005\nstats:\n  val: [ \"top1\" ]\n  train: [\"loss\", \"grad_norm\" ]\n  checkpoint_metric: \"top1.zero_shot_image_logits\"\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "tests/engine/dummy_configs/imagenet_classification/efficientnet_b0.yaml",
    "content": "# pytest: disable\n\n# This is a dummy configuration for testing classification task end-to-end\n\ntaskname: '+ EfficientNet-B0'\ncommon:\n  run_label: \"train\"\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\n  channels_last: true\ndataset:\n  root_train: \"/mnt/imagenet/training\"\n  root_val: \"/mnt/imagenet/validation\"\n  name: \"mock_imagenet\"\n  category: \"classification\"\n  train_batch_size0: 2\n  val_batch_size0: 2\n  eval_batch_size0: 2\n  workers: 0\n  persistent_workers: true\n  pin_memory: true\n\nimage_augmentation:\n  # training related parameters\n  random_resized_crop:\n    enable: true\n    interpolation: \"bilinear\"\n  random_horizontal_flip:\n    enable: true\n  # validation related parameters\n  resize:\n    enable: true\n    size: 64\n    interpolation: \"bilinear\"\n  center_crop:\n    enable: true\n    size: 64\nsampler:\n  name: \"variable_batch_sampler\"\n  vbs:\n    crop_size_width: 64\n    crop_size_height: 64\n    max_n_scales: 5\n    min_crop_size_width: 32\n    max_crop_size_width: 96\n    min_crop_size_height: 32\n    max_crop_size_height: 96\n    check_scale: 32\nloss:\n  category: \"composite_loss\"\n  composite_loss:\n    - loss_category: \"classification\"\n      loss_weight: 1.0\n      classification:\n        name: \"cross_entropy\"\n        cross_entropy:\n          label_smoothing: 0.1\n    - loss_category: \"neural_augmentation\"\n      loss_weight: 1.0\n      neural_augmentation:\n        perceptual_metric: \"psnr\"\n        target_value: [ 40, 10 ]\n        curriculum_method: \"cosine\"\noptim:\n  name: \"sgd\"\n  weight_decay: 4.e-5\n  no_decay_bn_filter_bias: true\n  sgd:\n    momentum: 0.9\n    nesterov: true\nscheduler:\n  name: \"cosine\"\n  max_epochs: 2\n  warmup_iterations: 3000\n  warmup_init_lr: 0.1\n  cosine:\n    max_lr: 0.8\n    min_lr: 4.e-4\nmodel:\n  classification:\n    name: \"efficientnet\"\n    activation:\n      name: \"swish\"\n    efficientnet:\n      mode: \"b0\"\n      stochastic_depth_prob: 0.0\n    classifier_dropout: 0.0\n  learn_augmentation:\n    brightness: true\n    contrast: true\n    noise: true\n    mode: \"distribution\"\n  normalization:\n    name: \"batch_norm\"\n    momentum: 0.1\n  activation:\n    name: \"swish\"\n    inplace: true\n  layer:\n    global_pool: \"mean\"\n    conv_init: \"kaiming_normal\"\n    linear_init: \"normal\"\nema:\n  enable: true\n  momentum: 0.0005\nstats:\n  val: [ \"loss\", \"top1\", \"top5\" ]\n  train: [\"loss\"]\n  checkpoint_metric: \"top1.logits\"\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "tests/engine/dummy_configs/imagenet_classification/mobilevit.yaml",
    "content": "# pytest: disable\n\n# This is a dummy configuration for testing classification task end-to-end\n\ntaskname: '+ MobileViTv1-XXSmall'\ncommon:\n  run_label: \"train\"\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\ndataset:\n  root_train: \"/mnt/imagenet/training\" # Please update the location of training set\n  root_val: \"/mnt/imagenet/validation\" # Please update the location of validation set\n  name: \"mock_imagenet\"\n  category: \"classification\"\n  train_batch_size0: 2\n  val_batch_size0: 2\n  eval_batch_size0: 2\n  workers: 0\n  persistent_workers: true\n  pin_memory: true\n  collate_fn_name_train: image_classification_data_collate_fn\n  collate_fn_name_val: image_classification_data_collate_fn\n  collate_fn_name_test: image_classification_data_collate_fn\nimage_augmentation:\n  random_resized_crop:\n    enable: true\n    interpolation: \"bilinear\"\n  random_horizontal_flip:\n    enable: true\n  resize:\n    enable: true\n    size: 64\n    interpolation: \"bilinear\"\n  center_crop:\n    enable: true\n    size: 64\nsampler:\n  name: \"variable_batch_sampler\"\n  vbs:\n    crop_size_width: 64\n    crop_size_height: 64\n    max_n_scales: 5\n    min_crop_size_width: 32\n    max_crop_size_width: 96\n    min_crop_size_height: 32\n    max_crop_size_height: 96\n    check_scale: 32\nloss:\n  category: \"classification\"\n  classification:\n    name: \"cross_entropy\"\n    cross_entropy:\n      label_smoothing: 0.1\noptim:\n  name: \"adamw\"\n  weight_decay: 0.0001\n  no_decay_bn_filter_bias: false\n  adamw:\n    beta1: 0.9\n    beta2: 0.999\nscheduler:\n  name: \"cosine\"\n  is_iteration_based: false\n  max_epochs: 2\n  warmup_iterations: 2 # longer warm-up\n  warmup_init_lr: 0.000001\n  cosine:\n    max_lr: 0.0001\n    min_lr: 0.000001\nmodel:\n  classification:\n    name: \"mobilevit\"\n    classifier_dropout: 0.1\n    n_classes: 1000\n    mit:\n      mode: \"xx_small\"\n      dropout: 0.1\n      number_heads: 4\n      conv_kernel_size: 3\n    activation:\n      name: \"swish\"\n  normalization:\n    name: \"batch_norm\"\n    momentum: 0.1\n  activation:\n    name: \"swish\"\n  layer:\n    global_pool: \"mean\"\n    conv_init: \"kaiming_normal\"\n    linear_init: \"trunc_normal\"\n    linear_init_std_dev: 0.02\nema:\n  enable: true\n  momentum: 0.0005\nstats:\n  val: [ \"loss\", \"top1\", \"top5\" ]\n  train: [\"loss\"]\n  checkpoint_metric: \"top1\"\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "tests/engine/dummy_configs/imagenet_classification/mobilevit_v2.yaml",
    "content": "# pytest: disable\n# This is a dummy configuration for testing classification task end-to-end\ntaskname: '+ MobileViTv2'\ncommon:\n  run_label: \"train\"\n  log_freq: 500\n  auto_resume: true\n  mixed_precision: true\n  channels_last: true\n  tensorboard_logging: false\n  grad_clip: 10.0\ndataset:\n  root_train: \"/mnt/imagenet/training\" # Please update the location of training set\n  root_val: \"/mnt/imagenet/validation\" # Please update the location of validation set\n  name: \"mock_imagenet\"\n  category: \"classification\"\n  train_batch_size0: 2\n  val_batch_size0: 2\n  eval_batch_size0: 2\n  workers: 0\n  persistent_workers: true\n  pin_memory: true\n  collate_fn_name_train: image_classification_data_collate_fn\n  collate_fn_name_val: image_classification_data_collate_fn\n  collate_fn_name_test: image_classification_data_collate_fn\n\nimage_augmentation:\n  random_resized_crop:\n    enable: true\n    interpolation: \"bicubic\"\n  random_horizontal_flip:\n    enable: true\n  rand_augment:\n    enable: true\n  random_erase:\n    enable: true\n    p: 0.25\n  mixup:\n    enable: true\n    alpha: 0.2\n  cutmix:\n    enable: true\n    alpha: 1.0\n  resize:\n    enable: true\n    size: 64\n    interpolation: \"bicubic\"\n  center_crop:\n    enable: true\n    size: 64\nsampler:\n  name: \"batch_sampler\"\n  bs:\n    crop_size_width: 64\n    crop_size_height: 64\nloss:\n  category: \"classification\"\n  classification:\n    name: \"cross_entropy\"\n    cross_entropy:\n      label_smoothing: 0.1\noptim:\n  name: \"adamw\"\n  weight_decay: 0.05\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.999\nscheduler:\n  name: \"cosine\"\n  is_iteration_based: true\n  max_iterations: 5\n  warmup_iterations: 20000\n  warmup_init_lr: 1.e-6\n  cosine:\n    max_lr: 0.002\n    min_lr: 1.e-6\nmodel:\n  classification:\n    name: \"mobilevit_v2\"\n    mitv2:\n      width_multiplier: 0.5\n      attn_norm_layer: \"layer_norm_2d\"\n    activation:\n      name: \"swish\"\n  normalization:\n    name: \"batch_norm\"\n    momentum: 0.1\n  activation:\n    name: \"swish\"\n  layer:\n    global_pool: \"mean\"\n    conv_init:  \"kaiming_normal\"\n    conv_init_std_dev: 0.02\n    linear_init: \"trunc_normal\"\n    linear_init_std_dev: 0.02\nema:\n  enable: true\n  momentum: 0.0005\nstats:\n  val: [ \"loss\", \"top1\", \"top5\" ]\n  train: [\"loss\"]\n  checkpoint_metric: \"top1\"\n  checkpoint_metric_max: true\n"
  },
  {
    "path": "tests/engine/dummy_configs/language_modeling_gpt/gpt.yaml",
    "content": "# pytest: disable\n\ncommon:\n  run_label: \"train\"\n  log_freq: 500\n  auto_resume: true\n  grad_clip: 1.0\n  save_all_checkpoints: true\n  save_interval_freq: 5000\n  eval_every_k_iterations: 10000\n\ndataset:\n  root_train: \"\"\n  disable_val: true\n  train_batch_size0: 2\n  workers: 0\n  persistent_workers: true\n  pin_memory: true\n\n  # dataset details\n  category: \"language_modeling\"\n  name: \"mock_general_lm\"\n  language_modeling:\n    sequence_length: 10\n    min_tokens_per_text: 0\n    min_characters_per_text: 0\n    shuffle_data: true\n    general_lm:\n      data_state_save_interval: 0\n      reader_chunk_size: 1\n      # dummy dataset for CI/CD. These files are generated on-the-fly\n      # see tests/data/datasets/language_modeling/mock_general_lm.py\n      train_data_info: [\n        {\n          \"file_name\": \".corenet_data_cache/sample.jsonl\",\n          \"text_key\": \"text\",\n          \"file_id_range\": [0, 1], \n        },\n        {\n          \"file_name\": \".corenet_data_cache/sample.json.gz\",\n          \"text_key\": \"text\",\n          \"file_id_range\": [0, 1], \n        },\n      ]\n\ntext_tokenizer:\n  name: \"openai_clip\"\n  pad_token: \"pad\"\n\nloss:\n  category: \"language_modeling\"\n  language_modeling:\n    name: \"cross_entropy\"\n    cross_entropy:\n      use_z_loss: true\n\noptim:\n  name: \"adamw\"\n  weight_decay: 0.1\n  no_decay_bn_filter_bias: true\n  adamw:\n    beta1: 0.9\n    beta2: 0.95\n    eps: 1.e-8\n\nscheduler:\n  is_iteration_based: true\n  max_iterations: 5 \n  name: cosine\n  warmup_init_lr: 1.e-06\n  warmup_iterations: 5000\n  cosine:\n    max_lr: 0.0024\n    min_lr: 0.00024\n\nmodel:\n  language_modeling:\n    name: \"general_gpt\"\n    general_gpt:\n      model_name: \"gpt-test\"\n      vocab_size: 49408\n      max_context_length: 10\n\nstats:\n  val: [ \"loss\"]\n  train: [\"loss\"]\n  checkpoint_metric: \"loss.total_loss\"\n  checkpoint_metric_max: false\n"
  },
  {
    "path": "tests/engine/test_training_engine.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom pathlib import Path\n\nimport pytest\nimport torch\n\nfrom corenet.cli import main_train\nfrom corenet.train_eval_pipelines.default_train_eval import DefaultTrainEvalPipeline\nfrom tests.configs import get_config\nfrom tests.test_utils import unset_pretrained_models_from_opts\n\n\n@pytest.mark.parametrize(\n    \"config_file\",\n    [\n        \"tests/engine/dummy_configs/imagenet_classification/mobilevit.yaml\",\n        \"tests/engine/dummy_configs/imagenet_classification/mobilevit_v2.yaml\",\n        \"tests/engine/dummy_configs/ade20k_segmentation/deeplabv3_mobilenetv2.yaml\",\n        \"tests/engine/dummy_configs/coco_detection/resnet_ssd.yaml\",\n        \"tests/engine/dummy_configs/coco_detection/resnet_mask_rcnn.yaml\",\n        \"tests/engine/dummy_configs/image_text_clip/clip_vit.yaml\",\n        # add a configuration to test range augment\n        \"tests/engine/dummy_configs/imagenet_classification/efficientnet_b0.yaml\",\n        \"tests/engine/dummy_configs/language_modeling_gpt/gpt.yaml\",\n    ],\n)\ndef test_training_engine(config_file: str, tmp_path: Path) -> None:\n    opts = get_config(config_file=config_file)\n\n    # Parallel tests causes issues when save_dir is accessed by multiple workers.\n    # Therefore, we use a unique random path here and use that as a save location.\n    save_dir = str(tmp_path)\n    setattr(opts, \"common.results_loc\", save_dir)\n\n    # Set device-related args that are not exposed to users\n    n_gpus = torch.cuda.device_count()\n    device = \"cuda\" if n_gpus > 0 else \"cpu\"\n\n    setattr(opts, \"dev.num_gpus\", n_gpus)\n    setattr(opts, \"dev.device_id\", None)\n    setattr(opts, \"dev.device\", torch.device(device))\n\n    if n_gpus == 0:\n        # Need to disable mixed_precision for testing on CPU only.\n        setattr(opts, \"common.mixed_precision\", False)\n\n    norm_name = getattr(opts, \"model.normalization.name\")\n\n    if norm_name is not None and norm_name in [\"sync_batch_norm\", \"sbn\"]:\n        # on CPUs, Sync BN won't work.\n        setattr(opts, \"model.normalization.name\", \"batch_norm\")\n\n    assert (\n        getattr(opts, \"train_eval_pipeline.name\") == \"default\"\n    ), \"This unit-test has does not support configs with custom TrainEvalPipelines yet.\"\n\n    # removing pretrained models (if any) for now to reduce test time as well as access issues\n    unset_pretrained_models_from_opts(opts)\n\n    train_eval_pipeline = DefaultTrainEvalPipeline(opts)\n    train_eval_pipeline.launcher(main_train.callback)\n\n    assert Path(save_dir, \"train/checkpoint_last.pt\").exists()\n"
  },
  {
    "path": "tests/loss_fns/__init__.py",
    "content": "#  For licensing see accompanying LICENSE file.\n#  Copyright (C) 2024 Apple Inc. All Rights Reserved.\n"
  },
  {
    "path": "tests/loss_fns/language_modeling/__init__.py",
    "content": ""
  },
  {
    "path": "tests/loss_fns/language_modeling/test_cross_entropy.py",
    "content": "#  For licensing see accompanying LICENSE file.\n#  Copyright (C) 2024 Apple Inc. All Rights Reserved.\n\nimport argparse\n\nimport pytest\nimport torch\n\nfrom corenet.loss_fn.language_modeling.cross_entropy import CrossEntropyLM\n\n\n@pytest.mark.parametrize(\n    \"label_smoothing, ignore_index,vocab_size,z_loss\",\n    [\n        (0.0, -1, 5, False),\n        (0.0, 3, 5, False),\n        (0.0, -1, 5, True),\n        (0.0, 2, 5, True),\n        (0.1, 2, 5, True),\n    ],\n)\ndef test_cross_entropy_lm_in_out(\n    label_smoothing: float, ignore_index: int, vocab_size: int, z_loss: bool\n) -> None:\n    \"\"\"Test for CrossEntropyLM loss function.\n\n    ...note:\n        This test checks if the input and output formats are correct or not.\n    \"\"\"\n    batch_size = 2\n    seq_length = 5\n\n    # build configuration\n    parser = argparse.ArgumentParser()\n    parser = CrossEntropyLM.add_arguments(parser)\n\n    opts = parser.parse_args([])\n\n    setattr(opts, \"loss.language_modeling.cross_entropy.ignore_index\", ignore_index)\n    setattr(\n        opts, \"loss.language_modeling.cross_entropy.label_smoothing\", label_smoothing\n    )\n    setattr(opts, \"loss.language_modeling.cross_entropy.use_z_loss\", z_loss)\n\n    criteria = CrossEntropyLM(opts)\n\n    # Two prediction cases:\n    # Case 1: Prediction is a tensor\n    # Case 2: Prediction is a dictionary, with logits as a mandatory key\n    pred_case_1 = torch.randn(size=(batch_size, seq_length, vocab_size))\n    pred_case_2 = {\"logits\": pred_case_1}\n\n    target = torch.randint(\n        low=0,\n        high=vocab_size,\n        size=(\n            batch_size,\n            seq_length,\n        ),\n    )\n    # randomly set indices in target tensor to ignore_index\n    random_indices = (torch.rand_like(target.float()) > 0.5) * 1.0\n    random_indices = random_indices.to(dtype=torch.int)\n    target[random_indices == 0] = ignore_index\n\n    # CE loss function for LM does not care about input samples, so setting input_samples to None\n    input_samples = None\n    for pred in [pred_case_1, pred_case_2]:\n        loss = criteria(input_samples, pred, target)\n        if isinstance(loss, torch.Tensor):\n            assert loss.dim() == 0, \"Loss value should be a scalar\"\n        elif isinstance(loss, dict):\n            # when z-loss is enabled, we return output as a dict (pred can be dict or tensor).\n            assert z_loss\n            expected_loss_keys = {\"total_loss\", \"ce_loss\", \"z_loss\"}\n            assert any(set(loss.keys()) & expected_loss_keys)\n            for loss_key, loss_val in loss.items():\n                assert isinstance(\n                    loss_val, torch.Tensor\n                ), f\"Loss should be an instance of torch.Tensor. Got {type(loss_val)} for key {loss_key}.\"\n                assert loss_val.dim() == 0, \"Loss value should be a scalar.\"\n        else:\n            raise NotImplementedError(\"Loss should be either a dictionary or a tensor.\")\n"
  },
  {
    "path": "tests/loss_fns/language_modeling/test_cross_entropy_for_kv_prediction.py",
    "content": "#  For licensing see accompanying LICENSE file.\n#  Copyright (C) 2024 Apple Inc. All Rights Reserved.\n\nimport argparse\n\nimport pytest\nimport torch\n\nfrom corenet.loss_fn.language_modeling.cross_entropy_for_kv_prediction import (\n    CrossEntropyForKVPrediction,\n)\n\n\n@pytest.mark.parametrize(\n    \"label_smoothing,ignore_index,vocab_size,z_loss,auxiliary_loss,kv_loss\",\n    [\n        (0.0, 3, 5, False, 1, 2),\n        (0.1, 2, 5, True, 1, 1),\n    ],\n)\ndef test_cross_entropy_lm_in_out(\n    label_smoothing: float,\n    ignore_index: int,\n    vocab_size: int,\n    z_loss: bool,\n    auxiliary_loss: float,\n    kv_loss: float,\n) -> None:\n    \"\"\"Test for CrossEntropyLM loss function.\n\n    ...note:\n        This test checks if the input and output formats are correct or not.\n    \"\"\"\n    batch_size = 2\n    seq_length = 5\n    key_heads = 2\n    head_dim = 3\n    num_layers = 2\n\n    # build configuration\n    parser = argparse.ArgumentParser()\n    parser = CrossEntropyForKVPrediction.add_arguments(parser)\n\n    opts = parser.parse_args([])\n\n    setattr(\n        opts,\n        \"loss.language_modeling.cross_entropy_for_kv_prediction.ignore_index\",\n        ignore_index,\n    )\n    setattr(\n        opts,\n        \"loss.language_modeling.cross_entropy_for_kv_prediction.label_smoothing\",\n        label_smoothing,\n    )\n    setattr(\n        opts,\n        \"loss.language_modeling.cross_entropy_for_kv_prediction.use_z_loss\",\n        z_loss,\n    )\n    setattr(\n        opts, \"loss.language_modeling.cross_entropy_for_kv_prediction.z_loss_eps\", 0.01\n    )\n    setattr(\n        opts,\n        \"loss.language_modeling.cross_entropy_for_kv_prediction.auxiliary_loss\",\n        auxiliary_loss,\n    )\n    setattr(opts, \"loss.language_modeling.cross_entropy_for_kv_prediction.base_loss\", 1)\n    setattr(\n        opts, \"loss.language_modeling.cross_entropy_for_kv_prediction.kv_loss\", kv_loss\n    )\n\n    criteria = CrossEntropyForKVPrediction(opts)\n\n    # Two prediction cases:\n    # Case 1: Prediction is a tensor\n    # Case 2: Prediction is a dictionary, with logits as a mandatory key\n    x = torch.randn(size=(batch_size, seq_length, vocab_size))\n    model_outputs = {\n        \"logits\": x,\n        \"auxiliary_logits\": x,\n        \"past_keys\": torch.randn(\n            [num_layers, batch_size, key_heads, seq_length, head_dim]\n        ),\n        \"past_values\": torch.randn(\n            [num_layers, batch_size, key_heads, seq_length, head_dim]\n        ),\n        \"base_past_keys\": torch.randn(\n            [num_layers, batch_size, key_heads, seq_length, head_dim]\n        ),\n        \"base_past_values\": torch.randn(\n            [num_layers, batch_size, key_heads, seq_length, head_dim]\n        ),\n    }\n\n    target = torch.randint(\n        low=0,\n        high=vocab_size,\n        size=(\n            batch_size,\n            seq_length,\n        ),\n    )\n    # randomly set indices in target tensor to ignore_index\n    random_indices = (torch.rand_like(target.float()) > 0.5) * 1.0\n    random_indices = random_indices.to(dtype=torch.int)\n    target[random_indices == 0] = ignore_index\n\n    # CE loss function for LM does not care about input samples, so setting input_samples to None\n    input_samples = None\n    for pred in [model_outputs]:\n        loss = criteria(input_samples, pred, target)\n        # when z-loss is enabled, we return output as a dict (pred can be dict or tensor).\n        required_keys = {\n            \"auxiliary_loss\",\n            \"base_loss\",\n            \"k_loss/0\",\n            \"k_loss/1\",\n            \"k_loss/average\",\n            \"k_loss/total\",\n            \"total_loss\",\n            \"v_loss/0\",\n            \"v_loss/1\",\n            \"v_loss/average\",\n            \"v_loss/total\",\n        }\n        if z_loss:\n            required_keys.update({\"z_loss_auxiliary\", \"z_loss_base\"})\n        assert set(loss.keys()) == (required_keys)\n        for loss_key, loss_val in loss.items():\n            assert isinstance(\n                loss_val, torch.Tensor\n            ), f\"Loss should be an instance of torch.Tensor. Got {type(loss_val)} for key {loss_key}.\"\n            assert loss_val.dim() == 0, \"Loss value should be a scalar.\"\n"
  },
  {
    "path": "tests/loss_fns/test_class_weighting.py",
    "content": "#  For licensing see accompanying LICENSE file.\n#  Copyright (C) 2024 Apple Inc. All Rights Reserved.\n\nimport torch\n\nfrom corenet.loss_fn.utils.class_weighting import compute_class_weights\n\n\ndef test_class_weighting():\n    # test for checking the class weighting method\n    targets = torch.tensor([1, 1, 1, 2, 2, 3], dtype=torch.long)\n    n_classes = 4\n    norm_val = 1.0\n\n    weights = compute_class_weights(\n        target=targets, n_classes=n_classes, norm_val=norm_val\n    )\n    weights = torch.round(weights, decimals=2)\n\n    expected_weights = torch.tensor([0.0, 2.47, 3.48, 6.49])\n\n    torch.testing.assert_allclose(actual=weights, expected=expected_weights)\n"
  },
  {
    "path": "tests/loss_fns/test_classification_loss.py",
    "content": "#  For licensing see accompanying LICENSE file.\n#  Copyright (C) 2024 Apple Inc. All Rights Reserved.\n\nimport argparse\nfrom typing import Mapping\n\nimport pytest\nimport torch\n\nfrom corenet.loss_fn.classification.binary_cross_entropy import BinaryCrossEntropy\nfrom corenet.loss_fn.classification.cross_entropy import CrossEntropy\n\n\n@pytest.mark.parametrize(\n    \"batch_size, label_smoothing, ignore_index, class_weights, num_classes\",\n    [\n        (1, 0, -1, True, 2),\n        (2, 0.1, 255, False, 5),\n    ],\n)\ndef test_cross_entropy_in_out(\n    batch_size: int,\n    label_smoothing: float,\n    ignore_index: int,\n    class_weights: bool,\n    num_classes: int,\n) -> None:\n    # These tests check the input and output formats are correct or not.\n\n    # build configuration\n    parser = argparse.ArgumentParser()\n    parser = CrossEntropy.add_arguments(parser)\n\n    opts = parser.parse_args([])\n\n    setattr(opts, \"loss.classification.cross_entropy.label_smoothing\", label_smoothing)\n    setattr(opts, \"loss.classification.cross_entropy.ignore_index\", ignore_index)\n    setattr(opts, \"loss.classification.cross_entropy.class_weights\", class_weights)\n\n    criteria = CrossEntropy(opts)\n\n    # Two prediction cases:\n    # Case 1: Prediction is a tensor\n    # Case 2: Prediction is a dictionary, with logits as a mandatory key\n    pred_case_1 = torch.randn(size=(batch_size, num_classes))\n    pred_case_2 = {\"logits\": torch.randn(size=(batch_size, num_classes))}\n\n    target = torch.randint(low=0, high=num_classes, size=(batch_size,))\n    # this loss function does not care about it, so we can have any input\n    input_sample = torch.randint(low=0, high=1, size=(1,))\n    for pred in [pred_case_1, pred_case_2]:\n        loss = criteria(input_sample, pred, target)\n        assert isinstance(\n            loss, torch.Tensor\n        ), \"Loss should be an instance of torch.Tensor\"\n        assert loss.dim() == 0, \"Loss value should be a scalar\"\n\n\n@pytest.mark.parametrize(\n    \"batch_size, reduction\",\n    [\n        (1, \"sum\"),\n        (2, \"mean\"),\n        (1, \"none\"),\n        (2, \"batch_mean\"),\n    ],\n)\ndef test_binary_cross_entropy_in_out(batch_size: int, reduction: str) -> None:\n    # These tests check the input and output formats are correct or not.\n\n    # build configuration\n    parser = argparse.ArgumentParser()\n    parser = BinaryCrossEntropy.add_arguments(parser)\n\n    opts = parser.parse_args([])\n\n    setattr(opts, \"loss.classification.binary_cross_entropy.reduction\", reduction)\n\n    criteria = BinaryCrossEntropy(opts)\n    n_classes = 10\n\n    # Two prediction cases:\n    # Case 1: Prediction is a tensor\n    # Case 2: Prediction is a dictionary, with logits as a mandatory key\n    pred_case_1 = torch.randn(size=(batch_size, n_classes))\n    pred_case_2 = {\"logits\": torch.randn(size=(batch_size, n_classes))}\n\n    # two target cases:\n    # Case 1: Target is a tensor containing soft-labels or probabilities\n    # Case 2: Target is a tensor containing hard labels.\n    target_case_1 = torch.randn(size=(batch_size, n_classes))\n    target_case_2 = torch.randint(low=0, high=n_classes, size=(batch_size,))\n\n    # this loss function does not care about it, so we can have any input\n    input_sample = torch.randint(low=0, high=1, size=(1,))\n\n    for pred in [pred_case_1, pred_case_2]:\n        for target in [target_case_1, target_case_2]:\n            loss = criteria(input_sample, pred, target)\n            if isinstance(pred, Mapping):\n                pred = pred[\"logits\"]\n            assert isinstance(\n                loss, torch.Tensor\n            ), \"Loss should be an instance of torch.Tensor\"\n\n            if reduction in [\"mean\", \"batch_mean\", \"sum\"]:\n                assert loss.dim() == 0, \"Loss value should be a scalar\"\n            elif reduction == \"none\":\n                assert (\n                    loss.dim() == pred.dim()\n                ), \"Loss value should have the same shape as prediction\"\n"
  },
  {
    "path": "tests/loss_fns/test_composite_loss.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\nimport argparse\nimport copy\nimport sys\n\nsys.path.append(\"../..\")\n\nfrom corenet.loss_fn.composite_loss import CompositeLoss\n\n\ndef test_composite_loss() -> None:\n    # This function tests the composite loss function\n    # We create a list of three loss functions and then check the composition\n    # of one, two, and all loss functions\n    composite_losses = [\n        {\n            \"loss_category\": \"classification\",\n            \"loss_weight\": 1.0,\n            \"classification\": {\n                \"name\": \"cross_entropy\",\n                \"cross_entropy\": {\n                    \"label_smoothing\": 0.1,\n                    \"ignore_index\": -1,\n                    \"class_weights\": False,\n                },\n            },\n        },\n        {\n            \"loss_category\": \"neural_augmentation\",\n            \"loss_weight\": 1.0,\n            \"neural_augmentation\": {\n                \"perceptual_metric\": \"psnr\",\n                \"target_value\": [40, 20],\n                \"curriculum_method\": \"cosine\",\n                \"alpha\": 1.0,\n            },\n        },\n        {\n            \"loss_category\": \"segmentation\",\n            \"loss_weight\": 1.0,\n            \"segmentation\": {\n                \"name\": \"cross_entropy\",\n                \"cross_entropy\": {\n                    \"label_smoothing\": 0.1,\n                    \"ignore_index\": -1,\n                    \"class_weights\": False,\n                    \"aux_weight\": 0.0,\n                },\n            },\n        },\n    ]\n\n    for i in range(1, 4):\n        # test for 1, 2, and 3 loss functions\n        parser = argparse.ArgumentParser()\n        opts = parser.parse_args([])\n        setattr(opts, \"loss.category\", \"composite_loss\")\n        setattr(opts, \"scheduler.max_epochs\", 100)\n        setattr(opts, \"loss.composite_loss\", copy.deepcopy(composite_losses[:i]))\n\n        compsite_loss_fn = CompositeLoss(opts)\n        assert len(compsite_loss_fn.loss_fns) == i\n        assert len(compsite_loss_fn.loss_weights) == i\n"
  },
  {
    "path": "tests/loss_fns/test_contrastive_loss.py",
    "content": "#  For licensing see accompanying LICENSE file.\n#  Copyright (C) 2024 Apple Inc. All Rights Reserved.\n\nimport argparse\n\nimport pytest\nimport torch\n\nfrom corenet.loss_fn.multi_modal_img_text.contrastive_loss_clip import (\n    ContrastiveLossClip,\n)\n\n\n@pytest.mark.parametrize(\"batch_size\", [1, 2])\n@pytest.mark.parametrize(\"projection_dim\", [256, 512])\ndef test_contrastive_loss_in_out(batch_size: int, projection_dim: int) -> None:\n    # These tests check the input and output formats are correct or not.\n    parser = argparse.ArgumentParser()\n    parser = ContrastiveLossClip.add_arguments(parser)\n\n    opts = parser.parse_args([])\n    criteria = ContrastiveLossClip(opts)\n\n    image_features = torch.randn(size=(batch_size, projection_dim))\n    text_features = torch.randn(size=(batch_size, projection_dim))\n\n    input_sample = None\n    targets = None\n\n    prediction = {\"image\": image_features, \"text\": text_features}\n\n    loss_output = criteria(input_sample, prediction, targets)\n    expected_output_keys = {\"total_loss\", \"image_loss\", \"text_loss\", \"logit_scale\"}\n    assert expected_output_keys.issubset(loss_output.keys())\n\n    for loss_name, loss_val in loss_output.items():\n        if loss_name == \"logit_scale\" and isinstance(loss_val, (float, int)):\n            loss_val = torch.tensor(loss_val)\n        assert isinstance(\n            loss_val, torch.Tensor\n        ), \"Loss should be an instance of torch.Tensor\"\n        assert loss_val.dim() == 0, \"Loss value should be a scalar\"\n"
  },
  {
    "path": "tests/loss_fns/test_detection_loss.py",
    "content": "#  For licensing see accompanying LICENSE file.\n#  Copyright (C) 2024 Apple Inc. All Rights Reserved.\n\nimport argparse\nimport random\n\nimport pytest\nimport torch\n\nfrom corenet.loss_fn.detection.mask_rcnn_loss import MaskRCNNLoss\nfrom corenet.loss_fn.detection.ssd_multibox_loss import SSDLoss\n\n\n@pytest.mark.parametrize(\n    \"batch_size, neg_pos_ratio, label_smooth\",\n    [\n        (1, 1, 0),\n        (2, 3, 0.1),\n    ],\n)\ndef test_ssd_loss_in_out(\n    batch_size: int, neg_pos_ratio: int, label_smooth: int\n) -> None:\n    # These tests check the input and output formats are correct or not.\n\n    # build configuration\n    parser = argparse.ArgumentParser()\n    parser = SSDLoss.add_arguments(parser)\n\n    opts = parser.parse_args([])\n\n    setattr(opts, \"loss.detection.ssd_multibox_loss.neg_pos_ratio\", neg_pos_ratio)\n    setattr(opts, \"loss.detection.ssd_multibox_loss.label_smoothing\", label_smooth)\n\n    criteria = SSDLoss(opts)\n    num_anchors = 20\n    num_classes = 2\n\n    # prediction is a dictionary with scores and boxes as a key\n    predictions = {\n        \"scores\": torch.rand(size=(batch_size, num_anchors, num_classes)),\n        \"boxes\": torch.rand(size=(batch_size, num_anchors, 4)),\n    }\n\n    # target is a dictionary with box_labels and box_coordinates as a key\n    targets = {\n        \"box_labels\": torch.randint(\n            low=0, high=num_classes, size=(batch_size, num_anchors)\n        ),\n        \"box_coordinates\": torch.rand(size=(batch_size, num_anchors, 4)),\n    }\n    # this loss function does not care about it, so we can have any input\n    input_sample = torch.randint(low=0, high=1, size=(1,))\n\n    loss = criteria(input_sample, predictions, targets)\n    assert {\"total_loss\", \"reg_loss\", \"cls_loss\"}.issubset(loss.keys())\n    for loss_name, loss_val in loss.items():\n        assert isinstance(\n            loss_val, torch.Tensor\n        ), \"Loss should be an instance of torch.Tensor\"\n        assert loss_val.dim() == 0, \"Loss value should be a scalar\"\n\n\n@pytest.mark.parametrize(\n    \"batch_size, classifier_weight, box_reg_weight, mask_weight, objectness_weight, rpn_box_reg\",\n    [\n        (1, 0, 0, 0, 0, 0),\n        (2, 0, 0.5, 1, 0, 0.5),\n        (2, 1, 0.5, 0, 1, 0.5),\n    ],\n)\ndef test_maskrcnn_loss_in_out(\n    batch_size: int,\n    classifier_weight: float,\n    box_reg_weight: float,\n    mask_weight: float,\n    objectness_weight: float,\n    rpn_box_reg: float,\n) -> None:\n    # These tests check the input and output formats are correct or not.\n\n    # build configuration\n    parser = argparse.ArgumentParser()\n    parser = MaskRCNNLoss.add_arguments(parser)\n\n    opts = parser.parse_args([])\n\n    setattr(opts, \"loss.detection.mask_rcnn_loss.classifier_weight\", classifier_weight)\n    setattr(opts, \"loss.detection.mask_rcnn_loss.box_reg_weight\", box_reg_weight)\n    setattr(opts, \"loss.detection.mask_rcnn_loss.mask_weight\", mask_weight)\n    setattr(opts, \"loss.detection.mask_rcnn_loss.objectness_weight\", objectness_weight)\n    setattr(opts, \"loss.detection.mask_rcnn_loss.rpn_box_reg\", rpn_box_reg)\n\n    criteria = MaskRCNNLoss(opts)\n\n    prediction_losses = {}\n    for loss_key in [\n        \"loss_classifier\",\n        \"loss_box_reg\",\n        \"loss_mask\",\n        \"loss_objectness\",\n        \"loss_rpn_box_reg\",\n    ]:\n        prediction_losses.update({loss_key: torch.tensor(random.random())})\n\n    # this loss function does not care about it, so we can have any input\n    input_sample = torch.randint(low=0, high=1, size=(1,))\n\n    loss = criteria(input_sample, prediction_losses)\n    assert {\n        \"loss_classifier\",\n        \"loss_box_reg\",\n        \"loss_mask\",\n        \"loss_objectness\",\n        \"loss_rpn_box_reg\",\n        \"total_loss\",\n    }.issubset(loss.keys())\n    for loss_name, loss_val in loss.items():\n        assert isinstance(\n            loss_val, torch.Tensor\n        ), \"Loss should be an instance of torch.Tensor\"\n        assert loss_val.dim() == 0, \"Loss value should be a scalar\"\n"
  },
  {
    "path": "tests/loss_fns/test_focal_loss.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nfrom typing import List, Optional\n\nimport torch\nfrom torch.nn import functional as F\n\nfrom corenet.loss_fn.classification.focal_loss import FocalLoss\nfrom tests.configs import get_config\n\n\ndef get_opts(gamma: float, weights: Optional[List[float]] = None) -> argparse.Namespace:\n\n    opts = get_config()\n    setattr(\n        opts,\n        \"loss.classification.focal_loss.gamma\",\n        gamma,\n    )\n    setattr(\n        opts,\n        \"loss.classification.focal_loss.weights\",\n        weights,\n    )\n\n    return opts\n\n\ndef test_focal_loss_onehot_vs_probabilities() -> None:\n\n    opts = get_opts(gamma=2)\n    loss = FocalLoss(opts)\n\n    N, num_classes = 128, 4\n\n    logits = torch.randn([N, num_classes])\n    targets = torch.randint(num_classes, (N,))\n\n    observed_loss = loss(None, logits, targets)\n\n    # Now, pass one-hot labels, and make sure they're the same.\n    observed_loss_2 = loss(None, logits, F.one_hot(targets, num_classes))\n    assert abs(observed_loss - observed_loss_2) / observed_loss < 1e-3\n\n\ndef test_focal_loss_tiny_gamma() -> None:\n    for gamma in [0, 1e-3]:\n        opts = get_opts(gamma=gamma)\n        loss = FocalLoss(opts)\n\n        N, num_classes = 128, 4\n\n        logits = torch.randn([N, num_classes])\n        targets = torch.randint(num_classes, (N,))\n\n        observed_loss = loss(None, logits, targets)\n        ce_loss = F.cross_entropy(logits, targets)\n\n        assert abs(observed_loss - ce_loss) / ce_loss < 1e-3\n\n\ndef test_focal_loss_gamma() -> None:\n    opts = get_opts(gamma=5)\n    loss = FocalLoss(opts)\n\n    N, num_classes = 128, 4\n\n    logits = torch.randn([N, num_classes])\n    targets = torch.randint(num_classes, (N,))\n\n    observed_loss = loss(None, logits, targets)\n    ce_loss = F.cross_entropy(logits, targets)\n\n    assert abs(observed_loss - ce_loss) / ce_loss > 1e-3\n\n\ndef test_focal_loss_weights() -> None:\n\n    opts = get_opts(gamma=1, weights=[1, 0, 0, 0])\n    loss = FocalLoss(opts)\n\n    N, num_classes = 128, 4\n\n    logits = torch.randn([N, num_classes])\n    targets = torch.randint(num_classes, (N,))\n\n    observed_loss = loss(None, logits, targets)\n    ce_loss = F.cross_entropy(logits, targets)\n\n    assert observed_loss < ce_loss\n"
  },
  {
    "path": "tests/loss_fns/test_neural_aug.py",
    "content": "#  For licensing see accompanying LICENSE file.\n#  Copyright (C) 2024 Apple Inc. All Rights Reserved.\n\nimport argparse\n\nimport pytest\nimport torch\n\nfrom corenet.loss_fn.neural_augmentation import NeuralAugmentation\n\n\n@pytest.mark.parametrize(\"batch_size\", [1, 2])\ndef test_neural_aug_loss_in_out(batch_size: int) -> None:\n    # These tests check the input and output formats are correct or not.\n    # build configuration\n    parser = argparse.ArgumentParser()\n    parser = NeuralAugmentation.add_arguments(parser)\n\n    opts = parser.parse_args([])\n    setattr(opts, \"scheduler.max_epochs\", 20)\n\n    # build loss function\n    neural_aug_loss_fn = NeuralAugmentation(opts)\n    pred_tensor = {\n        \"augmented_tensor\": torch.zeros(\n            size=(batch_size, 3, 224, 224), dtype=torch.float\n        )\n    }\n\n    # Three input cases:\n    # Case 1: Input image is a tensor\n    # Case 2: Input is a dictionary, with image as a mandatory key and value as a batch of input image tensor\n    # Case 3: Input is a dictionary, with image as a mandatory key and value as a list of input image tensor\n    input_case_1 = torch.randint(low=0, high=1, size=(batch_size, 3, 224, 224))\n    input_case_2 = {\n        \"image\": torch.randint(low=0, high=1, size=(batch_size, 3, 224, 224))\n    }\n    input_case_3 = {\n        \"image\": [torch.randint(low=0, high=1, size=(1, 3, 224, 224))] * batch_size\n    }\n\n    for inp in [input_case_1, input_case_2, input_case_3]:\n        loss = neural_aug_loss_fn(inp, pred_tensor)\n        assert isinstance(\n            loss, torch.Tensor\n        ), \"Loss should be an instance of torch.Tensor\"\n        assert loss.dim() == 0, \"Loss value should be a scalar\"\n"
  },
  {
    "path": "tests/loss_fns/test_neural_aug_compatibility.py",
    "content": "#  For licensing see accompanying LICENSE file.\n#  Copyright (C) 2024 Apple Inc. All Rights Reserved.\n\nimport re\nimport sys\nfrom pathlib import Path\n\nsys.path.append(\"..\")\n\nfrom tests.configs import get_config\nfrom tests.modeling.test_model import exclude_yaml_from_test\n\n\ndef test_neural_aug_backward_compatibility(config_file: str):\n    opts = get_config(config_file=config_file)\n\n    opts_dict = vars(opts)\n    for k, v in opts_dict.items():\n        if isinstance(v, str) and re.search(\".*_with_na$\", v):\n            raise DeprecationWarning(\n                \"We deprecated the usage of _with_na loss functions. \"\n                \"Please see projects/range_augment for examples.\"\n            )\n\n\ndef pytest_generate_tests(metafunc):\n    configs = [\n        str(x)\n        for x in Path(\"config\").rglob(\"**/*.yaml\")\n        if not exclude_yaml_from_test(x)\n    ]\n    configs += [\n        str(x)\n        for x in Path(\"projects\").rglob(\"**/*.yaml\")\n        if not exclude_yaml_from_test(x)\n    ]\n    metafunc.parametrize(\"config_file\", configs)\n"
  },
  {
    "path": "tests/loss_fns/test_segmentation_loss.py",
    "content": "#  For licensing see accompanying LICENSE file.\n#  Copyright (C) 2024 Apple Inc. All Rights Reserved.\n\nimport argparse\n\nimport pytest\nimport torch\n\nfrom corenet.loss_fn.segmentation.cross_entropy import SegCrossEntropy\n\n\n@pytest.mark.parametrize(\n    \"batch_size, label_smoothing, ignore_index, class_weights, num_classes, aux_weight\",\n    [\n        (1, 0, -1, True, 2, 0),\n        (2, 0.1, 255, False, 5, 0.4),\n    ],\n)\ndef test_seg_cross_entropy_in_out(\n    batch_size: int,\n    label_smoothing: float,\n    ignore_index: int,\n    class_weights: bool,\n    num_classes: int,\n    aux_weight: float,\n) -> None:\n    # These tests check the input and output formats are correct or not.\n\n    # build configuration\n    parser = argparse.ArgumentParser()\n    parser = SegCrossEntropy.add_arguments(parser)\n\n    opts = parser.parse_args([])\n\n    setattr(opts, \"loss.segmentation.cross_entropy.label_smoothing\", label_smoothing)\n    setattr(opts, \"loss.segmentation.cross_entropy.ignore_index\", ignore_index)\n    setattr(opts, \"loss.segmentation.cross_entropy.class_weights\", class_weights)\n    setattr(opts, \"loss.segmentation.cross_entropy.aux_weight\", aux_weight)\n\n    criteria = SegCrossEntropy(opts)\n    height = 10\n    width = 10\n\n    # Four prediction cases:\n    # Case 1: Prediction is a tensor\n    # Case 2: Prediction is a dictionary, with segmentation_output as a mandatory key\n    # Case 3: Prediction is a Tuple[tensor, tensor]\n    # Case 4: Prediction is a dictionary, with segmentation_output as a mandatory key and is a Tuple[Tensor, Tensor]\n    pred_case_1 = torch.randn(size=(batch_size, num_classes, height, width))\n    pred_case_2 = {\"segmentation_output\": pred_case_1}\n    pred_case_3 = (\n        torch.randn(size=(batch_size, num_classes, height, width)),\n        torch.randn(size=(batch_size, num_classes, height, width)),\n    )\n    pred_case_4 = {\"segmentation_output\": pred_case_3}\n\n    target = torch.randint(low=0, high=num_classes, size=(batch_size, height, width))\n    # randomly set indices in target tensor to ignore_index\n    random_indices = (torch.rand_like(target.float()) > 0.5) * 1.0\n    random_indices = random_indices.to(dtype=torch.int)\n    target[random_indices == 0] = ignore_index\n\n    # this loss function does not care about it, so we can have any input\n    input_sample = torch.randint(low=0, high=1, size=(1,))\n    for pred in [pred_case_1, pred_case_2, pred_case_3, pred_case_4]:\n        loss = criteria(input_sample, pred, target)\n        assert isinstance(loss, dict), \"loss should be an instance of dict\"\n        assert \"total_loss\" in loss, \"total_loss is a mandatory key in loss\"\n        if len(loss) == 3:\n            # when we compute aux loss, in that case, seg_loss and aux_loss are also returned\n            assert {\"total_loss\", \"seg_loss\", \"aux_loss\"}.issubset(loss.keys())\n        for loss_key, loss_val in loss.items():\n            assert isinstance(\n                loss_val, torch.Tensor\n            ), \"Loss should be an instance of torch.Tensor\"\n            assert loss_val.dim() == 0, \"Loss value should be a scalar\"\n"
  },
  {
    "path": "tests/metrics/__init__.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n"
  },
  {
    "path": "tests/metrics/base.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom typing import Tuple\n\nimport pytest\nimport torch\n\n\ndef sample_classification_outputs() -> Tuple[torch.Tensor, torch.Tensor]:\n    predictions = torch.tensor(\n        [\n            [0.02, 0.01, 0.91, 0.04, 0.01, 0.01, 0],\n            [0.81, 0.03, 0.16, 0, 0, 0, 0],\n            [0.4, 0.51, 0.05, 0.04, 0, 0, 0],\n        ],\n        dtype=torch.float,\n    )\n\n    predictions = (predictions + 1e-6).log()\n\n    targets = torch.tensor([3, 2, 1], dtype=torch.long)\n    return predictions, targets\n\n\n@pytest.fixture(\n    params=[\n        {},\n        {\"pred\": \"pred_key\"},\n        {\"target\": \"target_key\"},\n        {\"pred\": \"pred_key\", \"target\": \"target_key\"},\n        {\"target\": \"target_key\", \"pred\": \"pred_key\"},\n    ]\n)\ndef transform_args(request):\n    \"\"\"\n    Allows for testing all metrics with <metric>(pred=key1,target=key2) registry format.\n\n    Tests the following combinations:\n        <metric>\n        <metric>(pred=pred_key)\n        <metric>(target=target_key)\n        <metric>(pred=pred_key, target=target_key)\n        <metric>(target=target_key, pred=pred_key)\n    \"\"\"\n    param_keys = request.param\n\n    def encapsulate_with_keys(metric_names, predictions, targets, extras=None):\n        if isinstance(metric_names, str):\n            metric_names = [metric_names]\n\n        pred_key = param_keys.get(\"pred\", None)\n        if pred_key:\n            predictions = {pred_key: predictions}\n\n        target_key = param_keys.get(\"target\", None)\n        if target_key:\n            targets = {target_key: targets}\n\n        # e.g. assuming param_keys = {\"pred\": \"pred_key\", \"target\": \"target_key\"} we will get:\n        # {\"pred\": \"pred_key\", \"target\": \"target_key\"} -> [\"pred=pred_key\", \"target=target_key\"]\n        # [\"pred=pred_key\", \"target=target_key\"] -> \"(pred=pred_key,target=target_key)\"\n        params_str = \", \".join([f\"{key}={value}\" for key, value in param_keys.items()])\n        if params_str:\n            params_str = f\"({params_str})\"\n            metric_names = [m + params_str for m in metric_names]\n\n        return metric_names, (predictions, targets, extras)\n\n    return encapsulate_with_keys\n"
  },
  {
    "path": "tests/metrics/test_coco_map.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nimport json\nimport os\nfrom typing import Dict, List, Tuple\n\nimport numpy as np\nimport torch\nfrom pycocotools import mask as maskUtils\n\nfrom corenet.metrics import coco_map\nfrom corenet.metrics.stats import Statistics\nfrom corenet.modeling.models.detection import DetectionPredTuple\n\n\ndef test_coco_map():\n    predictions = {\n        \"detections\": [\n            DetectionPredTuple(\n                labels=torch.empty(0, dtype=torch.long),\n                scores=torch.empty(0, dtype=torch.float32),\n                boxes=torch.empty(0, 4, dtype=torch.float32),\n            )\n        ]\n        * 3\n    }\n    targets = [\n        {\"image_id\": 0, \"image_width\": 128, \"image_height\": 128},\n        {\"image_id\": 1, \"image_width\": 256, \"image_height\": 256},\n        {\"image_id\": 2, \"image_width\": 160, \"image_height\": 192},\n    ]\n\n    coco_annotations_path = os.path.join(os.path.dirname(__file__), \"../data\", \"coco\")\n    opts = argparse.Namespace(**{\"dataset.root_val\": coco_annotations_path})\n    stats = Statistics(opts=opts, metric_names=[\"coco_map\"])\n    stats.update(predictions, targets)\n    bbox_map = stats.avg_statistics(\"coco_map\", \"bbox\")\n\n    np.testing.assert_equal(0.0, bbox_map)\n\n\ndef get_prediction_from_annotation(\n    annotations: Dict, annotation_idx: int, category_mapping: Dict[int, int]\n) -> Tuple[int, torch.Tensor, torch.Tensor]:\n    annotation = annotations[\"annotations\"][annotation_idx]\n    image_id = annotation[\"image_id\"]\n    image = [im for im in annotations[\"images\"] if im[\"id\"] == image_id]\n    assert len(image) == 1, f\"Too many images with a single id.\"\n    image = image[0]\n    h, w = image[\"height\"], image[\"width\"]\n    boxes = annotation[\"bbox\"]\n\n    # Boxes are in (x1, y1, w, h) format. Convert to (x1, y1, x2, y2) format.\n    boxes[0] /= w\n    boxes[1] /= h\n    boxes[2] /= w\n    boxes[3] /= h\n\n    boxes[2] += boxes[0]\n    boxes[3] += boxes[1]\n\n    masks = annotation[\"segmentation\"]\n    rles = maskUtils.frPyObjects(masks, h, w)\n    rle = maskUtils.merge(rles)\n    binary_mask = maskUtils.decode(rle)\n\n    label = category_mapping[annotation[\"category_id\"]]\n\n    return label, boxes, binary_mask\n\n\ndef get_detection_pred_tuple_from_annotations(\n    annotations: Dict, annotation_ids: List[int], category_mapping: Dict[int, int]\n) -> DetectionPredTuple:\n    labels = []\n    scores = []\n    boxes = []\n    masks = []\n\n    for annotation_id in annotation_ids:\n        label, box, binary_mask = get_prediction_from_annotation(\n            annotations, annotation_id, category_mapping\n        )\n        labels.append(label)\n        scores.append(1.0)\n        boxes.append(box)\n        masks.append(binary_mask)\n\n    labels = torch.tensor(labels, dtype=torch.int64)\n    scores = torch.tensor(scores)\n    boxes = torch.tensor(boxes)\n    masks = torch.tensor(masks).float()\n\n    return DetectionPredTuple(labels, scores, boxes, masks)\n\n\ndef test_map() -> None:\n    opts = argparse.Namespace()\n    setattr(opts, \"stats.coco_map.iou_types\", [\"bbox\", \"segm\"])\n    setattr(opts, \"dataset.root_val\", \"tests/data/coco\")\n    evaluator = coco_map.COCOEvaluator(opts)\n\n    # Read annotations from the annotations file.\n    annotations_file = \"tests/data/coco/annotations/instances_val2017.json\"\n    with open(annotations_file) as f:\n        annotations = json.load(f)\n\n    predictions = {\n        \"detections\": [\n            get_detection_pred_tuple_from_annotations(\n                annotations, [0], evaluator.coco_id_to_contiguous_id\n            ),\n            get_detection_pred_tuple_from_annotations(\n                annotations, [1], evaluator.coco_id_to_contiguous_id\n            ),\n        ]\n    }\n\n    # These targets correspond to the first two annotations in our .json file.\n    targets = [\n        {\n            \"image_id\": torch.tensor(37777),\n            \"image_width\": torch.tensor(352),\n            \"image_height\": torch.tensor(230),\n        },\n        {\n            \"image_id\": torch.tensor(397133),\n            \"image_width\": torch.tensor(640),\n            \"image_height\": torch.tensor(427),\n        },\n    ]\n\n    evaluator.update(predictions, targets)\n\n    results = evaluator.summarize_coco_results()\n    assert results == {\"bbox\": 99.99999999999997, \"segm\": 99.99999999999997}\n"
  },
  {
    "path": "tests/metrics/test_image_text_retrieval_metrics.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport pytest\nimport torch\n\nfrom corenet.metrics.stats import Statistics\nfrom tests.configs import default_training_opts\n\n\n@pytest.mark.parametrize(\n    \"batch_size, num_captions, hidden_dim, text_dim\",\n    [\n        (1, 1, 8, 2),\n        (2, 5, 4, 3),\n    ],\n)\ndef test_image_text_retrieval(\n    batch_size: int, num_captions: int, hidden_dim: int, text_dim: int\n) -> None:\n    stats = Statistics(\n        opts=default_training_opts(), metric_names=[\"image_text_retrieval\"]\n    )\n    for _ in range(3):\n        image_emb = torch.randn(batch_size, hidden_dim)\n        text_emb = torch.randn(batch_size, num_captions, hidden_dim)\n        if text_dim == 2:\n            text_emb = text_emb.reshape(-1, hidden_dim)\n        stats.update({\"image\": image_emb, \"text\": text_emb}, {}, {})\n\n    metrics = stats._compute_avg_statistics_all()\n    img_text_metrics = metrics[\"image_text_retrieval\"]\n\n    parent_keys = [\"text2image\", \"image2text\"]\n    child_keys = [\"recall@1\", \"recall@5\", \"recall@10\", \"mean_rank\", \"median_rank\"]\n    for parent_key in parent_keys:\n        assert parent_key in img_text_metrics\n        for child_key in child_keys:\n            assert child_key in img_text_metrics[parent_key]\n"
  },
  {
    "path": "tests/metrics/test_iou.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom typing import Callable\n\nimport numpy as np\nimport torch\n\nfrom corenet.metrics.stats import Statistics\nfrom tests.metrics.base import transform_args\n\n\ndef test_gather_iou_metrics(transform_args: Callable):\n    # [Batch, num_classes, height, width]\n    # in this example, [1, 2, 2, 3]\n    prediction = torch.tensor(\n        [\n            [\n                [[0.2, 0.8, 0.2], [0.9, 0.2, 0.1]],\n                [[0.8, 0.2, 0.8], [0.1, 0.8, 0.9]],  # spatial dms\n            ]  # classes\n        ]  # batch\n    )\n\n    target = torch.tensor([[[0, 0, 0], [0, 1, 1]]])\n\n    metric_names, stats_args = transform_args([\"iou\"], prediction, target)\n\n    expected_inter = np.array([2.0, 2.0])\n    expected_union = np.array([4.0, 4.0])\n\n    expected_iou = np.mean(expected_inter / expected_union) * 100\n\n    stats = Statistics(opts=None, metric_names=metric_names)\n    stats.update(*stats_args)\n\n    np.testing.assert_equal(\n        actual=stats.avg_statistics(metric_names[0]), desired=expected_iou\n    )\n"
  },
  {
    "path": "tests/metrics/test_misc.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport numpy as np\nimport torch\n\nfrom corenet.metrics.stats import Statistics\n\n\ndef test_gather_loss():\n    # loss could be a Tensor or Dictionary\n    loss = torch.tensor([3.2], dtype=torch.float)\n\n    stats = Statistics(opts=None, metric_names=[\"loss\"])\n    stats.update({}, {}, {\"loss\": loss})\n    np.testing.assert_almost_equal(stats.avg_statistics(\"loss\"), 3.2)\n\n    loss_dict = {\n        \"aux_loss\": torch.tensor([4.2]),\n        \"total_loss\": torch.tensor(\n            [5.2]\n        ),  # total loss key is mandatory for a loss in dict format\n    }\n    stats = Statistics(opts=None, metric_names=[\"loss\"])\n    stats.update({}, {}, {\"loss\": loss_dict})\n    np.testing.assert_almost_equal(\n        stats.avg_statistics(\"loss\", \"aux_loss\"), 4.2, decimal=2\n    )\n    np.testing.assert_almost_equal(\n        stats.avg_statistics(\"loss\", \"total_loss\"), 5.2, decimal=2\n    )\n\n    # Empty extras\n    stats = Statistics(opts=None, metric_names=[\"loss\"])\n    stats.update({}, {}, {})\n    stats.update({}, {}, {\"loss\": None})\n\n    metric = stats.avg_statistics(\"loss\")\n    np.testing.assert_almost_equal(metric, 0)\n\n\ndef test_gather_grad_norm():\n    # Grad norm could be a Tensor or Dictionary\n    grad_norm = torch.tensor([3.2], dtype=torch.float)\n\n    stats = Statistics(opts=None, metric_names=[\"grad_norm\"])\n    stats.update({}, {}, {\"grad_norm\": grad_norm})\n    np.testing.assert_almost_equal(stats.avg_statistics(\"grad_norm\"), 3.2)\n\n    grad_norm_dict = {\n        \"dummy_norm_a\": torch.tensor([4.2]),\n        \"dummy_norm_b\": torch.tensor([5.2]),\n    }\n    stats = Statistics(opts=None, metric_names=[\"grad_norm\"])\n    stats.update({}, {}, {\"grad_norm\": grad_norm_dict})\n\n    _ = stats.avg_statistics(\"grad_norm\")\n\n    np.testing.assert_almost_equal(\n        stats.avg_statistics(\"grad_norm\", \"dummy_norm_a\"), 4.2, decimal=2\n    )\n    np.testing.assert_almost_equal(\n        stats.avg_statistics(\"grad_norm\", \"dummy_norm_b\"), 5.2, decimal=2\n    )\n\n    # Empty extras\n    stats = Statistics(opts=None, metric_names=[\"grad_norm\"])\n    stats.update({}, {}, {})\n    stats.update({}, {}, {\"grad_norm\": None})\n\n    metric = stats.avg_statistics(\"grad_norm\")\n    np.testing.assert_almost_equal(metric, 0)\n"
  },
  {
    "path": "tests/metrics/test_multiclass_classification_pr.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\nimport argparse\nimport warnings\nfrom typing import Optional, Set\n\nimport pytest\nimport torch\nfrom torch import Tensor\n\nfrom corenet.metrics import multiclass_classification_pr\n\n\ndef get_expected_keys(include_curve: bool) -> Set[str]:\n    expected_keys = {\n        \"micro\",\n        \"macro\",\n        \"weighted\",\n        \"AP\",\n        \"ODS-F1\",\n        \"Recall@P=50\",\n    }\n    if include_curve:\n        expected_keys |= {\n            \"precisions\",\n            \"recalls\",\n            \"thresholds\",\n        }\n    return expected_keys\n\n\n@pytest.mark.parametrize(\n    \"pred,target,include_curve,suppress_warnings\",\n    [\n        (\"pred\", \"target\", False, False),\n        (\"pred\", \"target\", False, True),\n        (\"pred\", None, True, False),\n        (None, \"target\", False, False),\n        (None, None, True, False),\n    ],\n)\ndef test_metric(\n    pred: Optional[str],\n    target: Optional[str],\n    include_curve: bool,\n    suppress_warnings: bool,\n) -> None:\n    opts = argparse.Namespace()\n    setattr(\n        opts, \"stats.metrics.multiclass_classification_pr.include_curve\", include_curve\n    )\n    setattr(\n        opts, \"stats.metrics.multiclass_classification_pr.include_classwise_ap\", False\n    )\n    setattr(\n        opts,\n        \"stats.metrics.multiclass_classification_pr.suppress_warnings\",\n        suppress_warnings,\n    )\n    metric = multiclass_classification_pr.MulticlassClassificationPR(\n        opts, pred=pred, target=target\n    )\n\n    num_batches = 2\n    batch_size = 6\n    num_classes = 3\n\n    for i in range(num_batches):\n        predictions = torch.randn([batch_size, num_classes]).softmax(dim=-1)\n\n        # @targets can be [batch_size, ...] or [batch_size, num_classes, ...].\n        # Test both.\n        if i % 2 == 0:\n            # Class label targets.\n            targets = torch.randint(0, num_classes, [batch_size])\n        else:\n            # Binary targets.\n            targets = torch.randint(0, 1, [batch_size, num_classes])\n\n        if pred is not None:\n            predictions = {pred: predictions}\n        if target is not None:\n            targets = {target: targets}\n\n        metric.update(predictions, targets)\n\n    results = metric.compute()\n\n    expected_keys = get_expected_keys(include_curve)\n    assert set(results.keys()) == expected_keys\n\n    for key in [\"micro\", \"macro\", \"weighted\"]:\n        assert 0 <= results[key] <= 1\n\n    if include_curve:\n        for class_idx in range(num_classes):\n            # Recalls and thresholds should be sorted.\n            assert results[\"recalls\"][class_idx] == list(\n                reversed(sorted(results[\"recalls\"][class_idx]))\n            ), f\"Recalls aren't sorted for class {class_idx} of {num_classes}.\"\n            assert results[\"thresholds\"][class_idx] == sorted(\n                results[\"thresholds\"][class_idx]\n            ), f\"Thresholds aren't sorted for class {class_idx} of {num_classes}.\"\n\n            # All values should be in [0, 1].\n            for key in [\"precisions\", \"recalls\", \"thresholds\"]:\n                assert all(\n                    0 <= elem <= 1 for elem in results[key][class_idx]\n                ), f\"Not all precisions/recalls/thresholds are in [0, 1] for class {class_idx} of {num_classes}.\"\n\n\n@pytest.mark.parametrize(\n    \"include_curve,suppress_warnings\", [(False, False), (True, False), (True, True)]\n)\ndef test_flatten_metric(include_curve: bool, suppress_warnings: bool) -> None:\n    opts = argparse.Namespace()\n    setattr(\n        opts, \"stats.metrics.multiclass_classification_pr.include_curve\", include_curve\n    )\n    setattr(\n        opts, \"stats.metrics.multiclass_classification_pr.include_classwise_ap\", False\n    )\n    setattr(\n        opts,\n        \"stats.metrics.multiclass_classification_pr.suppress_warnings\",\n        suppress_warnings,\n    )\n    metric = multiclass_classification_pr.MulticlassClassificationPR(opts)\n\n    num_batches = 2\n    batch_size = 6\n    num_classes = 3\n\n    for i in range(num_batches):\n        predictions = torch.randn([batch_size, num_classes]).softmax(dim=-1)\n        targets = torch.randint(0, num_classes, [batch_size])\n        metric.update(predictions, targets)\n\n    results = metric.compute()\n    my_name = \"my_name\"\n    flattened_results = metric.flatten_metric(results, my_name)\n\n    expected_keys = get_expected_keys(include_curve)\n    assert set(flattened_results.keys()) == set(f\"{my_name}/{k}\" for k in expected_keys)\n"
  },
  {
    "path": "tests/metrics/test_probability_histogram.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom typing import Callable\n\nimport numpy as np\n\nfrom corenet.metrics.stats import Statistics\nfrom tests.configs import default_training_opts\nfrom tests.metrics.base import sample_classification_outputs, transform_args\n\n\ndef test_probability_histogram(transform_args: Callable):\n    metric_names, stats_args = transform_args(\n        [\"prob_hist\"], *sample_classification_outputs()\n    )\n\n    stats = Statistics(opts=default_training_opts(), metric_names=metric_names)\n    stats.update(*stats_args)\n\n    # max values -> 0.91, 0.81, 0.51\n    max_conf_hist = stats.avg_statistics(metric_names[0], \"max\")\n    np.testing.assert_almost_equal(\n        max_conf_hist,\n        [0, 0, 0, 0, 0, 0.33, 0, 0, 0.33, 0.33],\n        decimal=2,\n    )\n\n    # target values -> 0.05, 0.16, 0.51\n    target_conf_hist = stats.avg_statistics(metric_names[0], \"target\")\n    np.testing.assert_almost_equal(\n        target_conf_hist,\n        [0.33, 0.33, 0, 0, 0, 0.33, 0, 0, 0, 0],\n        decimal=2,\n    )\n"
  },
  {
    "path": "tests/metrics/test_psnr.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport math\nfrom typing import Callable\n\nimport numpy as np\nimport torch\n\nfrom corenet.metrics.stats import Statistics\nfrom tests.metrics.base import transform_args\n\n\ndef test_gather_psnr_metrics(transform_args: Callable):\n    # Test for case 1\n    inp_tensor = torch.randn((3, 2), dtype=torch.float)\n    target_tensor = inp_tensor\n\n    # Ideally, the PSNR should be infinite when input and target are the same, because error between\n    # signal and noise is 0. However, we add a small eps value (error of 1e-10) in the computation\n    # for numerical stability. Therefore, PSNR will not be infinite.\n    expected_psnr = 10.0 * math.log10(255.0**2 / 1e-10)\n\n    metric_names, stats_args = transform_args([\"psnr\"], inp_tensor, target_tensor)\n\n    stats = Statistics(opts=None, metric_names=metric_names)\n    stats.update(*stats_args)\n\n    np.testing.assert_almost_equal(\n        stats.avg_statistics(metric_names[0]), expected_psnr, decimal=2\n    )\n"
  },
  {
    "path": "tests/metrics/test_retrieval_cmc_metrics.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\n\nimport numpy as np\nimport pytest\nimport torch\n\nfrom corenet.metrics.retrieval_cmc import (\n    RetrievalCMC,\n    cmc_calculation,\n    cosine_distance_matrix,\n    l2_distance_matrix,\n    mean_ap,\n)\n\n\ndef test_cosine_distance_matrix() -> None:\n    # Sanity checks using random matrices\n    n = 10\n    m = 15\n    d = 8\n    x = torch.randn(n, d)\n    y = torch.randn(m, d)\n    dist_matrix = cosine_distance_matrix(x, y).numpy()\n    assert dist_matrix.shape[0] == n\n    assert dist_matrix.shape[1] == m\n    assert np.all(0 <= dist_matrix)\n    assert np.all(dist_matrix <= 2)\n\n    # Numerical value check\n    x = torch.tensor([[1.0, 2.0, 3.0], [-1.0, -2.0, -3.0]])\n    y = torch.tensor([[0.1, 0.2, 0.3], [0.0, 0.0, 0.0]])\n    dist_matrix = cosine_distance_matrix(x, y).numpy()\n    assert dist_matrix.shape[0] == 2\n    assert dist_matrix.shape[1] == 2\n    expected_similarity_dist = np.array([[0.0, 1.0], [2.0, 1.0]])\n    np.testing.assert_almost_equal(dist_matrix, expected_similarity_dist)\n\n\ndef test_l2_distance_matrix() -> None:\n    # Sanity checks using random matrices\n    n = 3\n    m = 7\n    d = 4\n    x = torch.randn(n, d)\n    y = torch.randn(m, d)\n    dist_matrix = l2_distance_matrix(x, y).numpy()\n    assert dist_matrix.shape[0] == n\n    assert dist_matrix.shape[1] == m\n    assert np.all(0 <= dist_matrix)\n\n    # Numerical value check\n    x = torch.tensor(\n        [\n            [\n                3.0,\n                4.0,\n                0.0,\n            ]\n        ]\n    )\n    y = torch.tensor([[3.0, 0.0, 0.0], [0.0, 0.0, 0.0]])\n    dist_matrix = l2_distance_matrix(x, y).numpy()\n    assert dist_matrix.shape[0] == 1\n    assert dist_matrix.shape[1] == 2\n    expected_similarity_dist = np.array([[4.0, 5.0]])\n    np.testing.assert_almost_equal(dist_matrix, expected_similarity_dist)\n\n\ndef test_cmc_calculation() -> None:\n    # Make sure input arrays are not modified\n    distance_matrix = torch.zeros(10, 10)\n    query_ids = torch.randint(0, 5, (10,))\n    _, _ = cmc_calculation(distance_matrix, query_ids, 5)\n    np.testing.assert_equal(distance_matrix.numpy(), 0)\n\n    # Perfect match case\n    distance_matrix = torch.tensor(\n        [\n            [0.0, 1.0, 0.5, 2.0],  # id = 100\n            [1.0, 0.0, 2.0, 0.3],  # id = 101\n            [0.5, 2.0, 0.0, 3.0],  # id = 100\n            [2.0, 0.3, 3.0, 0.0],  # id = 101\n        ]\n    )\n    query_ids = torch.tensor([100, 101, 100, 101])\n    top1, top3 = cmc_calculation(distance_matrix, query_ids, 3)\n    assert top1 == top3 == pytest.approx(1.0, 0.001)\n\n    # Another case\n    distance_matrix = torch.tensor(\n        [\n            [0.0, 1.0, 0.5, 1.75],  # id = 100\n            [1.0, 0.0, 1.5, 0.75],  # id = 100\n            [0.5, 1.5, 0.0, 2.75],  # id = 100\n            [1.75, 0.75, 2.75, 0.0],  # id = 101\n        ]\n    )\n    query_ids = torch.tensor([100, 100, 100, 101])\n    top1, top2 = cmc_calculation(distance_matrix, query_ids, 2)\n    assert top1 == pytest.approx(0.5, 0.001)\n    assert top2 == pytest.approx(0.75, 0.001)\n\n\ndef test_mean_ap() -> None:\n    # Numerical test\n    distance_matrix = torch.tensor(\n        [\n            [0.0, 1.0, 0.5, 1.75],  # id = 100, PRs = [(1/1,1/2), (2/2, 2/2)], ap = 1.0\n            [\n                1.0,\n                0.0,\n                1.5,\n                0.75,\n            ],  # id = 100, PRs = [(0/1,0/2), (1/2, 1/2), (2/3, 2/2)], ap = 1/3+1/4 = 7/12\n            [0.5, 1.5, 0.0, 2.75],  # id = 100, PRs = [(1/1,1/2), (2/2, 2/2)], ap = 1.0\n            [\n                1.75,\n                0.75,\n                2.75,\n                0.0,\n            ],  # id = 101, This query does not have any match -> excluded from mAP calculation.\n        ]\n    )\n    query_ids = torch.tensor([100, 100, 100, 101])\n    meanap = mean_ap(distance_matrix, query_ids)\n    np.testing.assert_almost_equal(meanap, (1.0 + 7.0 / 12.0 + 1.0) / 3.0)\n\n\ndef test_retrieval_cmc() -> None:\n    opts = argparse.Namespace()\n    setattr(opts, \"stats.metrics.retrieval_cmc.distance_metric\", \"l2\")\n    setattr(opts, \"stats.metrics.retrieval_cmc.subset_fraction\", 1.0)\n    setattr(opts, \"stats.metrics.retrieval_cmc.k\", 2)\n    cmc_eval = RetrievalCMC(\n        # device=torch.device(\"cpu\"),\n        opts=opts,\n        is_distributed=False,\n        compute_map=True,\n    )\n\n    embeddings = torch.tensor(\n        [\n            [[0.0, 0.0], [0.0, 1.0]],\n            [[0.0, -0.5], [0.0, 1.75]],\n        ]\n    )\n    labels = torch.tensor([[100, 100], [100, 101]])\n\n    cmc_eval.reset()\n    for embedding, label in zip(embeddings, labels):\n        cmc_eval.update(embedding, label)\n\n    # outputs are reported in percentages\n    cmc_metrics = cmc_eval.compute()\n\n    np.testing.assert_almost_equal(cmc_metrics[\"top1\"], 50)\n    np.testing.assert_almost_equal(cmc_metrics[\"top2\"], 75)\n    np.testing.assert_almost_equal(\n        cmc_metrics[\"mAP\"], 100 * (1.0 + 7.0 / 12.0 + 1.0) / 3.0\n    )\n"
  },
  {
    "path": "tests/metrics/test_topk_accuracy.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom typing import Callable\n\nimport numpy as np\n\nfrom corenet.metrics.stats import Statistics\nfrom tests.metrics.base import sample_classification_outputs, transform_args\n\n\ndef test_gather_top_k_metrics(transform_args: Callable):\n    metric_names, stats_args = transform_args(\n        [\"top1\", \"top5\"], *sample_classification_outputs()\n    )\n\n    stats = Statistics(opts=None, metric_names=metric_names)\n    stats.update(*stats_args)\n    top1_acc = round(stats.avg_statistics(metric_names[0]), 2)\n    top5_acc = round(stats.avg_statistics(metric_names[1]), 2)\n\n    np.testing.assert_almost_equal(top1_acc, 33.33, decimal=2)\n    np.testing.assert_almost_equal(top5_acc, 100.00, decimal=2)\n"
  },
  {
    "path": "tests/metrics/test_vqa_preset_score_metrics.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\"\"\"Test for metrics/vqa_score.py.\"\"\"\n\nimport numpy as np\nimport torch\n\nfrom corenet.metrics.stats import Statistics\n\n\ndef test_vqa_preset_score() -> None:\n    predictions = {\n        \"logits\": torch.tensor(\n            [\n                [0, 0, 1],\n                [0, 0, 1],\n                [0, 0, 1],\n            ],\n            dtype=torch.float,\n        )\n    }\n    targets = torch.tensor(\n        [\n            [0, 0, 1],\n            [0, 1, 0],\n            [0, 0.5, 0.5],\n        ],\n        dtype=torch.float,\n    )\n\n    stats = Statistics(opts=None, metric_names=[\"vqa_preset_score\"])\n    stats.update(predictions, targets)\n    score = round(stats.avg_statistics(\"vqa_preset_score\", \"bbox\"), 2)\n\n    np.testing.assert_almost_equal(score, 50.0)\n"
  },
  {
    "path": "tests/misc/__init__.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n"
  },
  {
    "path": "tests/misc/dummy_clip_config.yaml",
    "content": "# pytest: disable\n\ncommon:\n  debug_mode: true\n\ndataset:\n  name: \"img_text_tar\"\n  category: \"multi_modal_image_text\"\n\nmodel:\n  activation_checkpointing: true\n  freeze_modules: [\n    \"image_encoder.transformer\",\n    \"image_encoder.cls_token\",\n    \"image_encoder.patch_emb\",\n    \"image_encoder.post_transformer_norm\",\n    \"image_encoder.pos_embed\",\n  ]\n  multi_modal_image_text:\n    name: \"clip\"\n    clip:\n      projection_dim: 128\n  classification:\n    name: \"vit\"\n    vit:\n      mode: \"tiny\"\n      norm_layer: \"layer_norm_fp32\"\n  image_projection_head:\n    name: \"simple_projection_nc2nc\"\n  text:\n    name: \"transformer\"\n    vocab_size: 200\n    context_length: 77\n    transformer:\n      causal_masking: true\n      model_dim: 128\n      n_transformer_layers: 1\n      ffn_multiplier_per_layer: 4.0\n      n_heads_per_layer: 8\n      norm_layer: \"layer_norm_fp32\"\n  activation:\n    name: \"gelu\"\n"
  },
  {
    "path": "tests/misc/dummy_linear_probe_config.yaml",
    "content": "# pytest: disable\n\ncommon:\n  debug_mode: true\n\ndataset:\n  name: \"imagenet\"\n  category: \"classification\"\n\nmodel:\n  resume_exclude_scopes:\n    - \"image_encoder.neural_augmentor.\"\n    - \"neural_augmentor.\"\n    - \"text_encoder.\"\n    - \"logit_scale\"\n    - \"image_encoder.classifier.proj\"\n  ignore_missing_scopes: [\"classifier.\"]\n  learn_augmentation:\n    mode: None\n  rename_scopes_map: [[\"image_encoder.\", \"\"]]\n  freeze_modules: \"^((?!classifier).)*$\"\n  classification:\n    name: \"vit\"\n    vit:\n      mode: \"base\"\n      dropout: 0.2\n    activation:\n      name: \"gelu\"\n  activation:\n    name: \"gelu\"\n  normalization:\n    name: \"batch_norm\"\n    momentum: 0.1\n  layer:\n    conv_init: \"kaiming_normal\"\n    linear_init: \"trunc_normal\"\n    linear_init_std_dev: 0.02\n"
  },
  {
    "path": "tests/misc/test_common.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nfrom collections import OrderedDict\nfrom typing import List\n\nimport pytest\nimport torch\nimport torch.nn as nn\n\nfrom corenet.modeling import get_model\nfrom corenet.modeling.misc.common import freeze_modules_based_on_opts, get_tensor_sizes\nfrom tests.configs import get_config\nfrom tests.test_utils import unset_pretrained_models_from_opts\n\n\ndef test_freeze_modules_based_on_opts() -> None:\n    model = nn.Sequential(\n        OrderedDict(\n            [\n                (\"conv1\", nn.Conv2d(1, 20, 5)),\n                (\"relu1\", nn.ReLU()),\n                (\"conv2\", nn.Conv2d(20, 64, 5)),\n                (\"relu2\", nn.ReLU()),\n            ]\n        )\n    )\n    opts = argparse.Namespace(**{\"model.freeze_modules\": \"conv1\"})\n    freeze_modules_based_on_opts(opts, model)\n\n    model.train()\n    assert model.conv1.training == False\n    assert model.conv2.training == True\n    assert model.relu1.training == True\n\n\n@pytest.mark.parametrize(\n    (\"config_file\", \"expected_trainable_params\"),\n    [\n        (\n            \"tests/misc/dummy_clip_config.yaml\",\n            [\n                \"logit_scale\",\n                \"image_encoder.classifier.proj\",\n                \"text_encoder.projection_layer\",\n                \"text_encoder.embedding_layer.weight\",\n                \"text_encoder.positional_embedding.pos_embed.pos_embed\",\n                \"text_encoder.transformer.0.pre_norm_mha.0.weight\",\n                \"text_encoder.transformer.0.pre_norm_mha.0.bias\",\n                \"text_encoder.transformer.0.pre_norm_mha.1.qkv_proj.weight\",\n                \"text_encoder.transformer.0.pre_norm_mha.1.qkv_proj.bias\",\n                \"text_encoder.transformer.0.pre_norm_mha.1.out_proj.weight\",\n                \"text_encoder.transformer.0.pre_norm_mha.1.out_proj.bias\",\n                \"text_encoder.transformer.0.pre_norm_ffn.0.weight\",\n                \"text_encoder.transformer.0.pre_norm_ffn.0.bias\",\n                \"text_encoder.transformer.0.pre_norm_ffn.1.weight\",\n                \"text_encoder.transformer.0.pre_norm_ffn.1.bias\",\n                \"text_encoder.transformer.0.pre_norm_ffn.4.weight\",\n                \"text_encoder.transformer.0.pre_norm_ffn.4.bias\",\n                \"text_encoder.final_layer_norm.weight\",\n                \"text_encoder.final_layer_norm.bias\",\n            ],\n        ),\n        (\n            \"tests/misc/dummy_linear_probe_config.yaml\",\n            [\"classifier.weight\", \"classifier.bias\"],\n        ),\n    ],\n)\ndef test_freeze_modules_based_on_opts_with_match_named_params(\n    config_file: str, expected_trainable_params: List[str]\n) -> None:\n    \"\"\"\n    Test to check whether parameters are frozen correctly or not for models with complex structures (e.g., CLIP).\n    \"\"\"\n    print(config_file)\n    opts = get_config(config_file=config_file)\n\n    # removing pretrained models (if any) to reduce test time as well as access issues.\n    unset_pretrained_models_from_opts(opts)\n\n    model = get_model(opts)\n    model.train()\n\n    total_model_parmams = sum([p.numel() for p in model.parameters()])\n    model_trainable_params = sum(\n        p.numel() for p in model.parameters() if p.requires_grad\n    )\n    assert model_trainable_params < total_model_parmams\n\n    trainable_param_names = [\n        p_name for p_name, p in model.named_parameters() if p.requires_grad\n    ]\n    assert trainable_param_names == expected_trainable_params\n\n\ndef test_get_tensor_sizes() -> None:\n    in_width = 224\n    in_height = 224\n    in_channels = 3\n    in_batch_size = 1\n    img = torch.randn(size=(in_batch_size, in_channels, in_height, in_width))\n\n    # test for Tensor\n    size_info = get_tensor_sizes(img)\n    assert size_info == [in_batch_size, in_channels, in_height, in_width]\n\n    # test for empty dict\n    data_dict = {}\n    size_info = get_tensor_sizes(data_dict)\n    assert size_info == []\n\n    # test for dict with single key\n    data_dict = {\"image\": img}\n    size_info = get_tensor_sizes(data_dict)\n    assert size_info == [\n        str(f\"image: [{in_batch_size}, {in_channels}, {in_height}, {in_width}]\")\n    ]\n\n    # test for dict with two keys\n    data_dict = {\"image_1\": img, \"image_2\": img}\n    size_info = get_tensor_sizes(data_dict)\n    assert size_info == [\n        str(f\"image_1: [{in_batch_size}, {in_channels}, {in_height}, {in_width}]\"),\n        str(f\"image_2: [{in_batch_size}, {in_channels}, {in_height}, {in_width}]\"),\n    ]\n\n    # test for nested dict\n    data_dict = {\"image_1\": img, \"image_2\": {\"image\": img}}\n    size_info = get_tensor_sizes(data_dict)\n    assert size_info == [\n        str(f\"image_1: [{in_batch_size}, {in_channels}, {in_height}, {in_width}]\"),\n        str(\n            f\"image_2: ['image: [{in_batch_size}, {in_channels}, {in_height}, {in_width}]']\"\n        ),\n    ]\n\n    # test for nested dict with non-tensor\n    data_dict = {\"image\": img, \"random_key\": \"data\"}\n    size_info = get_tensor_sizes(data_dict)\n    assert size_info == [\n        str(f\"image: [{in_batch_size}, {in_channels}, {in_height}, {in_width}]\")\n    ]\n"
  },
  {
    "path": "tests/modeling/__init__.py",
    "content": ""
  },
  {
    "path": "tests/modeling/layers/__init__.py",
    "content": ""
  },
  {
    "path": "tests/modeling/layers/normalization_layers/__init__.py",
    "content": ""
  },
  {
    "path": "tests/modeling/layers/normalization_layers/test_rms_norm.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport torch\n\nfrom corenet.modeling.layers.normalization.rms_norm import RMSNorm\n\n\ndef test_rms_norm() -> None:\n    in_features = 16\n    norm_layer = RMSNorm(num_features=in_features)\n\n    inputs = [\n        # 3D inputs (e.g., Transformers)\n        torch.randn(size=(2, 4, in_features)),\n        # 4D inputs (e.g., CNNs)\n        torch.randn(size=(2, 4, 5, in_features)),\n        # 2D inputs (e.g., Linear)\n        torch.randn(size=(2, in_features)),\n    ]\n    for inp in inputs:\n        out = norm_layer(inp)\n        assert out.shape == inp.shape\n        # check if there are any NaNs in the output.\n        assert not torch.any(torch.isnan(out))\n"
  },
  {
    "path": "tests/modeling/layers/test_conv_layer.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom pprint import pformat\n\nimport pytest\nimport torch\n\nfrom corenet.modeling.layers.activation import build_activation_layer\nfrom corenet.modeling.layers.conv_layer import ConvLayer2d\nfrom corenet.modeling.layers.normalization import build_normalization_layer\nfrom tests.configs import get_config\n\n\n@pytest.mark.parametrize(\n    \"use_norm,customize_norm\", [(True, True), (True, False), (False, False)]\n)\n@pytest.mark.parametrize(\n    \"use_act,customize_act\", [(True, True), (True, False), (False, False)]\n)\ndef test_use_act_and_use_norm(\n    use_act: bool, customize_act: bool, use_norm: bool, customize_norm: bool\n) -> None:\n    opts = get_config()\n    default_act, custom_act = \"relu\", \"gelu\"  # Choose different values\n    setattr(opts, \"model.activation.name\", default_act)\n    default_norm, custom_norm = \"layer_norm\", \"batch_norm\"  # Choose different values\n    setattr(opts, \"model.normalization.name\", default_norm)\n\n    conv = ConvLayer2d(\n        opts=opts,\n        in_channels=3,\n        out_channels=5,\n        kernel_size=3,\n        stride=3,\n        use_act=use_act,\n        act_layer=(\n            build_activation_layer(opts, act_type=custom_act) if customize_act else None\n        ),\n        use_norm=use_norm,\n        norm_layer=(\n            build_normalization_layer(opts, norm_type=custom_norm, num_features=3)\n            if customize_norm\n            else None\n        ),\n    )\n\n    def has_submodule(name: str) -> bool:\n        name = name.lower().replace(\"_\", \"\")\n        for module in conv.block.children():\n            if name in type(module).__name__.lower().replace(\"_\", \"\"):\n                return True\n        return False\n\n    has_conv2d = has_submodule(\"conv2d\")\n    has_default_norm = has_submodule(default_norm)\n    has_custom_norm = has_submodule(custom_norm)\n    has_default_act = has_submodule(default_act)\n    has_custom_act = has_submodule(custom_act)\n\n    assert len(list(conv.block.children())) == sum(\n        map(\n            int,\n            [\n                has_conv2d,\n                has_default_act,\n                has_default_norm,\n                has_custom_norm,\n                has_custom_act,\n            ],\n        )\n    ), (\n        \"Got duplicate or unexpected submodules in\"\n        f\" {pformat(list(conv.block.children()))}.\"\n    )\n\n    assert has_conv2d\n    assert has_default_norm == (use_norm and not customize_norm)\n    assert has_custom_norm == (use_norm and customize_norm)\n    assert has_default_act == (use_act and not customize_act)\n    assert has_custom_act == (use_act and customize_act)\n"
  },
  {
    "path": "tests/modeling/layers/test_multi_head_attn.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport sys\n\nimport numpy as np\nimport pytest\nimport torch\n\nsys.path.append(\"..\")\n\nfrom corenet.modeling.layers.multi_head_attention import MultiHeadAttention\n\n\ndef build_attention_mask(context_length: int, batch_size: int, use_pytorch_mha):\n    # lazily create causal attention mask, with full attention between the vision tokens\n    # pytorch uses additive attention mask; fill with -inf\n    mask = torch.empty(context_length, context_length)\n    mask.fill_(float(\"-inf\"))\n    mask.triu_(1)  # zero out the lower diagonal\n    if not use_pytorch_mha:\n        mask = mask.unsqueeze(0)  # add dummy batch dimension\n        mask = mask.expand(batch_size, -1, -1)\n    return mask\n\n\n@pytest.mark.parametrize(\n    \"output_dim, batch_size, bias, use_attn_mask\",\n    [\n        (32, 1, True, True),\n        (16, 2, False, False),\n    ],\n)\ndef test_multihead_self_attn(\n    output_dim: int, batch_size: int, bias: bool, use_attn_mask: bool\n):\n    seq_len = 5\n    embed_dim = 8\n    mha = MultiHeadAttention(\n        embed_dim=embed_dim,\n        num_heads=2,\n        attn_dropout=0.0,\n        bias=bias,\n        output_dim=output_dim,\n        coreml_compatible=False,\n    )\n    mha.eval()\n\n    qkv = torch.randn(size=(seq_len, batch_size, embed_dim))\n\n    attn_mask = None\n    if use_attn_mask:\n        attn_mask = build_attention_mask(\n            context_length=seq_len, batch_size=batch_size, use_pytorch_mha=True\n        )\n\n    # Pytorch MHA accepts sequence first\n    out_pytorch = mha(x_q=qkv, use_pytorch_mha=True, attn_mask=attn_mask)\n\n    # default works with batch-first\n    qkv = qkv.transpose(0, 1)\n    attn_mask = None\n    if use_attn_mask:\n        attn_mask = build_attention_mask(\n            context_length=seq_len, batch_size=batch_size, use_pytorch_mha=False\n        )\n    out_default = mha(x_q=qkv, use_pytorch_mha=False, attn_mask=attn_mask)\n    out_default = out_default.transpose(0, 1)\n\n    torch.testing.assert_close(\n        actual=out_default, expected=out_pytorch, atol=1e-3, rtol=1e-3\n    )\n\n    if hasattr(mha, \"forward_tracing\") and attn_mask is None:\n        # check coreml compatible version\n        out_tracing = mha.forward_tracing(x_q=qkv).transpose(0, 1)\n        torch.testing.assert_close(\n            actual=out_default, expected=out_tracing, atol=1e-3, rtol=1e-3\n        )\n\n\n@pytest.mark.parametrize(\n    \"output_dim, key_len, batch_size, bias\",\n    [\n        (32, 15, 1, True),\n        (16, 20, 2, False),\n    ],\n)\ndef test_multihead_cross_attn(\n    output_dim: int, key_len: int, batch_size: int, bias: bool\n):\n    seq_len = 20\n    embed_dim = 32\n    mha = MultiHeadAttention(\n        embed_dim=embed_dim,\n        num_heads=8,\n        attn_dropout=0.0,\n        bias=bias,\n        output_dim=output_dim,\n        coreml_compatible=False,\n    )\n    mha.eval()\n\n    query = torch.randn(size=(seq_len, batch_size, embed_dim))\n    key = torch.randn(size=(key_len, batch_size, embed_dim))\n\n    # Pytorch MHA accepts sequence first\n    out_pytorch = mha(x_q=query, x_kv=key, use_pytorch_mha=True)\n\n    # default works with batch-first\n    query = query.transpose(0, 1)\n    key = key.transpose(0, 1)\n    out_default = mha(x_q=query, x_kv=key)\n    out_default = out_default.transpose(0, 1)\n\n    torch.testing.assert_close(\n        actual=out_default, expected=out_pytorch, atol=1e-3, rtol=1e-3\n    )\n\n    if hasattr(mha, \"forward_tracing\"):\n        # check coreml compatible version\n        out_tracing = mha.forward_tracing(x_q=query, x_kv=key).transpose(0, 1)\n        torch.testing.assert_close(\n            actual=out_default, expected=out_tracing, atol=1e-3, rtol=1e-3\n        )\n"
  },
  {
    "path": "tests/modeling/layers/test_pos_embeddings.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport sys\n\nimport numpy as np\nimport pytest\n\nsys.path.append(\"..\")\n\nfrom corenet.modeling.layers.positional_embedding import PositionalEmbedding\n\n\n@pytest.mark.parametrize(\n    \"is_learnable, input_seq_len, sequence_first, padding_idx\",\n    [\n        (True, 34, True, None),\n        (False, 128, False, 0),\n        (False, 192, True, 0),\n    ],\n)\ndef test_pos_embedding(\n    is_learnable: bool, input_seq_len: int, sequence_first: bool, padding_idx: int\n):\n    num_embeddings = 128\n    pos_embedding = PositionalEmbedding(\n        opts=None,\n        num_embeddings=num_embeddings,\n        embedding_dim=512,\n        padding_idx=padding_idx,\n        is_learnable=is_learnable,\n        sequence_first=sequence_first,\n    )\n    seq_dim = 0 if sequence_first else 1\n\n    out = pos_embedding(input_seq_len)\n    np.testing.assert_equal(out.shape[seq_dim], input_seq_len)\n"
  },
  {
    "path": "tests/modeling/layers/test_rotary_embeddings.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport pytest\nimport torch\n\nfrom corenet.modeling.layers import RotaryEmbedding\n\n\n@pytest.mark.parametrize(\n    \"model_dim,n_queries,n_keys,n_groups\",\n    [\n        (18, 5, 5, 1),\n        (18, 5, 6, 4),\n    ],\n)\ndef test_rotary_embedding(\n    model_dim: int, n_queries: int, n_keys: int, n_groups: int\n) -> None:\n    \"\"\"Test for RoPE embeddings.\"\"\"\n    rope_embedding = RotaryEmbedding(\n        model_dim=model_dim,\n        # setting max_seq_length to the same as number of queries.\n        # When n_keys > n_queries, then cos and sine embeddings are re-computed.\n        max_seq_length=n_queries,\n    )\n\n    batch_size = 2\n    n_query_heads = 16\n    # When n_groups != 1, RoPE with GQA is tested\n    n_key_heads = n_query_heads // n_groups\n\n    query_tensor = torch.randn(\n        size=(batch_size, n_query_heads, n_queries, model_dim),\n        dtype=torch.bfloat16,\n        device=torch.device(\"cpu\"),\n    )\n    key_tensor = torch.randn(\n        size=(batch_size, n_key_heads, n_keys, model_dim),\n        dtype=torch.bfloat16,\n        device=torch.device(\"cpu\"),\n    )\n\n    query_tensor_with_rope, key_tensor_with_rope = rope_embedding(\n        query_tensor, key_tensor\n    )\n    assert rope_embedding._cached_seq_length == n_keys\n    assert query_tensor.shape == query_tensor_with_rope.shape\n    assert key_tensor.shape == key_tensor_with_rope.shape\n\n    assert torch.isnan(query_tensor_with_rope).to(torch.bool).sum() == 0\n    assert torch.isnan(key_tensor_with_rope).to(torch.bool).sum() == 0\n"
  },
  {
    "path": "tests/modeling/layers/test_token_merging.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\nimport math\n\nimport pytest\nimport torch\n\nfrom corenet.modeling.layers import token_merging\n\n\ndef ensure_equal_in_range(t: torch.Tensor, start: int, end: int) -> None:\n    \"\"\"\n    Make sure that elements in the tensor @t are equal between @start and @end,\n    but not beyond.\n\n    Args:\n        t: The tensor to check.\n        start: The start of the equality check.\n        end: The end of the equality check.\n    \"\"\"\n    prototype = t[start]\n    assert torch.all(\n        (prototype - t[start:end]).abs() < 1e-3\n    ), f\"Expected equal values from index {start} to {end}, got tensor {t}.\"\n    assert torch.all(\n        prototype != t[end:]\n    ), f\"Expected values from index {end} onwards not to equal values at {start}, got tensor {t}.\"\n\n\ndef test_token_merging() -> None:\n    # Set the batch_size B, sequence length N, and number of channels C.\n    B, N, C = 2, 65, 8\n    x = torch.ones(B, N, C)\n    key_padding_mask = torch.zeros([B, N])\n    # Mask values at and beyond 33.\n    key_padding_mask[0, 33:] = float(\"-inf\")\n    x[0, 33:] = 10e6\n\n    t = token_merging.TokenMerging(C)\n    y, key_padding_mask = t(x, key_padding_mask)\n    # Because the large @x values were masked (and then zerod by the\n    # TokenMerging operation), the largest value should be far lower than 10e6.\n    assert y.max() < 5\n\n    assert y.shape[1] == 33\n    assert key_padding_mask.shape == (2, 33)\n\n    # Before downsampling, there were 33 unmasked tokens. Now, there are 17.\n    # The first 16 should be identical, but the 17th will be different since\n    # it wasn't merged with another token (since the sequence length wasn't\n    # divisible by the window size).\n    ensure_equal_in_range(y[0], 0, 16)\n    ensure_equal_in_range(y[0], 16, 17)\n    ensure_equal_in_range(y[0], 17, 33)\n\n    # For the second sample, all samples are identical except the last one.\n    ensure_equal_in_range(y[1], 0, 32)\n\n    # The first 17 mask positions should be unaltered.\n    assert torch.all(key_padding_mask[0, :17] == 0)\n    assert torch.all(key_padding_mask[0, 18:] == float(\"-inf\"))\n\n    # All the mask positions should still be 0.\n    assert torch.all(key_padding_mask[1] == 0)\n\n\n@pytest.mark.parametrize(\"dim,window\", [(8, 2), (8, 3), (16, 4)])\ndef test_token_merging_shapes(dim: int, window: int) -> None:\n    # Set the batch_size B and sequence length N.\n    B, N = 2, 65\n    x = torch.ones(B, N, dim)\n    key_padding_mask = torch.zeros([B, N])\n    # Mask values at and beyond 33.\n    key_padding_mask[0, 33:] = float(\"-inf\")\n    x[0, 33:] = 10e6\n\n    t = token_merging.TokenMerging(dim, window)\n    y, key_padding_mask = t(x, key_padding_mask)\n\n    assert y.shape == (B, math.ceil(N / window), dim)\n"
  },
  {
    "path": "tests/modeling/models/__init__.py",
    "content": "#  For licensing see accompanying LICENSE file.\n#  Copyright (C) 2024 Apple Inc. All Rights Reserved.\n"
  },
  {
    "path": "tests/modeling/models/audio_classification/__init__.py",
    "content": ""
  },
  {
    "path": "tests/modeling/models/audio_classification/test_base_audio_classification.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\n\nfrom corenet.modeling.models.audio_classification import base_audio_classification\n\n\ndef test_base_audio_classification_adds_arguments() -> None:\n    opts = argparse.Namespace()\n    model = base_audio_classification.BaseAudioClassification(opts)\n\n    parser = argparse.ArgumentParser()\n    model.add_arguments(parser)\n    assert hasattr(parser.parse_args([]), \"model.audio_classification.name\")\n"
  },
  {
    "path": "tests/modeling/models/audio_classification/test_byteformer.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport torch\n\nfrom corenet.modeling.models.audio_classification import audio_byteformer\nfrom corenet.modeling.models.classification import byteformer as image_byteformer\nfrom tests.modeling.models.classification import test_byteformer\n\n\ndef test_audio_byteformer() -> None:\n    # Make sure it matches the image classification network.\n    opts = test_byteformer.get_opts()\n\n    byteformer1 = image_byteformer.ByteFormer(opts)\n    byteformer2 = audio_byteformer.AudioByteFormer(opts)\n\n    # Make their state_dicts match.\n    byteformer2.load_state_dict(byteformer1.state_dict())\n\n    batch_size, sequence_length = 2, 32\n\n    x = torch.randint(0, 128, [batch_size, sequence_length])\n\n    assert torch.all(byteformer1(x) == byteformer2({\"audio\": x}))\n"
  },
  {
    "path": "tests/modeling/models/classification/__init__.py",
    "content": ""
  },
  {
    "path": "tests/modeling/models/classification/config/__init__.py",
    "content": ""
  },
  {
    "path": "tests/modeling/models/classification/config/test_byteformer.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\n\nimport pytest\n\nfrom corenet.modeling.models.classification.config import byteformer\n\n\n@pytest.mark.parametrize(\"mode\", [\"tiny\", \"small\", \"base\", \"huge\"])\ndef test_get_configuration(mode) -> None:\n    opts = argparse.Namespace()\n    setattr(opts, \"model.classification.byteformer.mode\", mode)\n    setattr(opts, \"model.classification.byteformer.dropout\", 0.0)\n    setattr(opts, \"model.classification.byteformer.norm_layer\", \"layer_norm\")\n    byteformer.get_configuration(opts)\n"
  },
  {
    "path": "tests/modeling/models/classification/config/vit_config.yaml",
    "content": "# pytest: disable\n\ndataset:\n  name: \"imagenet\"\n  category: \"classification\"\n\nmodel:\n  classification:\n    name: \"vit\"\n    vit:\n      mode: \"test\"\n      norm_layer: \"layer_norm_fp32\"\n  activation:\n    name: \"gelu\"\n"
  },
  {
    "path": "tests/modeling/models/classification/test_byteformer.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\n\nimport torch\n\nfrom corenet.modeling.models.classification import byteformer\n\n\ndef get_opts() -> argparse.Namespace:\n    opts = argparse.Namespace()\n    setattr(opts, \"model.classification.byteformer.conv_kernel_size\", 16)\n    setattr(opts, \"model.classification.byteformer.dropout\", 0.0)\n    setattr(opts, \"model.classification.byteformer.norm_layer\", \"layer_norm\")\n    setattr(opts, \"model.classification.byteformer.dummy_input_token_length\", 1)\n    setattr(opts, \"model.classification.byteformer.max_num_tokens\", 1000)\n    setattr(opts, \"model.classification.byteformer.sinusoidal_pos_emb\", False)\n    setattr(opts, \"model.classification.byteformer.vocab_size\", 257)\n    setattr(opts, \"model.classification.byteformer.mode\", \"tiny\")\n    setattr(opts, \"model.classification.byteformer.input_dims\", 2)\n    setattr(opts, \"model.classification.byteformer.pos_embed_type\", \"learnable\")\n    setattr(opts, \"model.classification.byteformer.window_sizes\", [128] * 12)\n    setattr(opts, \"model.classification.byteformer.window_shifts\", [0, 64] * 6)\n    setattr(\n        opts,\n        \"model.classification.byteformer.downsample\",\n        [True, True] + ([False, True] * 4) + [False, False],\n    )\n    setattr(opts, \"model.classification.byteformer.stochastic_dropout\", 0)\n    setattr(opts, \"model.classification.n_classes\", 1000)\n    setattr(opts, \"model.normalization.groups\", None)\n    setattr(opts, \"model.normalization.momentum\", 0.9)\n    setattr(opts, \"model.activation.name\", \"relu\")\n    setattr(opts, \"model.activation.inplace\", False)\n    setattr(opts, \"model.activation.neg_slope\", False)\n    return opts\n\n\ndef test_token_reduction_net() -> None:\n    opts = get_opts()\n    model = byteformer.ByteFormer(opts)\n\n    B, N, C = 1, 256, 192\n    x_values = torch.ones([B, N, C])\n    mask = torch.ones([B, N])\n    mask[0, 129:] = 0\n    x_values[:, 129:] = 0\n    y, y_mask = model.apply_token_reduction_net(x_values, mask)\n    assert y.shape == (1, 31, 192)\n    assert y_mask.shape == (1, 31)\n    assert (y_mask > 0).float().sum() == 17\n\n\ndef test_model_forward_pass() -> None:\n    opts = get_opts()\n    model = byteformer.ByteFormer(opts)\n\n    B, N = 1, 256\n    x_values = torch.empty([B, N], dtype=torch.int)\n    x_values[:, :129] = torch.randint(0, 256, size=(1, 129))\n    x_values[:, 129:] = -1\n\n    y = model(x_values)\n    assert y.shape == (1, 1000)\n"
  },
  {
    "path": "tests/modeling/models/classification/test_vit.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport pytest\nimport torch\n\nfrom corenet.modeling.models import get_model\nfrom tests.configs import get_config\n\n\n@pytest.mark.parametrize(\n    \"cls_token,return_image_embeddings,use_range_augment,use_flash_attn\",\n    [\n        (False, False, False, False),\n        (True, False, False, False),\n        (True, True, False, False),\n        (True, True, True, False),\n        (True, True, True, True),\n    ],\n)\ndef test_vit(cls_token, return_image_embeddings, use_range_augment, use_flash_attn):\n    batch_size = 2\n    image_channels = 3\n    image_height = 32\n    image_width = 32\n    model_dim = 128\n    n_classes = 3\n    # input image is 32x32, so the number of patches along width and height with a stride of 16 will be 2 and 2 respectively.\n    n_patches_h = n_patches_w = 2\n\n    opts = get_config(\n        config_file=\"tests/modeling/models/classification/config/vit_config.yaml\"\n    )\n\n    setattr(opts, \"model.classification.vit.no_cls_token\", cls_token)\n    setattr(opts, \"model.classification.n_classes\", n_classes)\n    setattr(opts, \"model.classification.vit.use_flash_attention\", use_flash_attn)\n\n    if use_range_augment:\n        setattr(opts, \"model.learn_augmentation.mode\", \"distribution\")\n        setattr(opts, \"model.learn_augmentation.brightness\", True)\n\n    model = get_model(opts)\n\n    input = torch.randn(\n        (batch_size, image_channels, image_height, image_width), dtype=torch.float\n    )\n    out = model(input, return_image_embeddings)\n\n    # Four cases\n    # 1. Return image embeddings along with range augment\n    # 2. Return image embeddings but do not use range augment\n    # 3. Use range augment but do not return image embeddings\n    # 4. Neither use range augment nor return image embeddings\n    if return_image_embeddings and use_range_augment:\n        expected_keys_and_size = {\n            \"logits\": [batch_size, n_classes],\n            \"augmented_tensor\": [batch_size, image_channels, image_height, image_width],\n            \"image_embeddings\": [batch_size, model_dim, n_patches_h, n_patches_w],\n        }\n    elif return_image_embeddings and not use_range_augment:\n        expected_keys_and_size = {\n            \"logits\": [batch_size, n_classes],\n            \"augmented_tensor\": None,\n            \"image_embeddings\": [batch_size, model_dim, n_patches_h, n_patches_w],\n        }\n    elif not return_image_embeddings and use_range_augment:\n        expected_keys_and_size = {\n            \"logits\": [batch_size, n_classes],\n            \"augmented_tensor\": [batch_size, image_channels, image_height, image_width],\n        }\n    else:\n        expected_keys_and_size = {}\n\n    if expected_keys_and_size:\n        # check all output keys are present\n        assert len(out.keys() & expected_keys_and_size.keys()) == len(\n            expected_keys_and_size\n        )\n\n        # check the size of output is as expected\n        for key_, size_ in expected_keys_and_size.items():\n            if size_ is None:\n                continue\n            assert list(out[key_].size()) == size_\n            assert torch.all(torch.isfinite(out[key_]))\n    else:\n        assert out.ndim == 2\n        assert list(out.size()) == [batch_size, n_classes]\n        assert torch.all(torch.isfinite(out))\n"
  },
  {
    "path": "tests/modeling/models/language_modeling/__init__.py",
    "content": ""
  },
  {
    "path": "tests/modeling/models/language_modeling/config/gpt_config.yaml",
    "content": "# pytest: disable\n\ndataset:\n  name: \"general_lm\"\n  category: \"language_modeling\"\n\nmodel:\n  language_modeling:\n    name: \"general_gpt\"\n    general_gpt:\n      model_name: \"gpt-test\"\n      vocab_size: 100\n      max_context_length: 100\n"
  },
  {
    "path": "tests/modeling/models/language_modeling/config/kv_prediction_config.yaml",
    "content": "# pytest: disable\n\ndataset:\n  name: \"general_lm\"\n  category: \"language_modeling\"\n\nmodel:\n  language_modeling:\n    name: \"kv_prediction\"\n    kv_prediction:\n      auxkv_num_layers_to_basekv_num_layers: [0, 0, 1]\n      base_model:\n       - model:\n          language_modeling:\n            name: \"layer_pruned_general_gpt\"\n            general_gpt:\n              model_name: \"gpt-test-base\"\n      auxiliary_model:\n       - model:\n          language_modeling:\n            name: \"layer_pruned_general_gpt\"\n            general_gpt:\n              model_name: \"gpt-test-aux\"\n    general_gpt:\n      vocab_size: 100\n      max_context_length: 100\n"
  },
  {
    "path": "tests/modeling/models/language_modeling/test_general_gpt.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport torch\n\nfrom corenet.modeling.models import get_model\nfrom tests.configs import get_config\n\n\n@torch.no_grad()\ndef test_general_gpt():\n    batch_size = 2\n    seq_length = 5\n    vocab_size = 16\n    max_context_length = seq_length\n\n    opts = get_config(\n        config_file=\"tests/modeling/models/language_modeling/config/gpt_config.yaml\"\n    )\n    setattr(opts, \"model.language_modeling.general_gpt.vocab_size\", vocab_size)\n    setattr(\n        opts,\n        \"model.language_modeling.general_gpt.max_context_length\",\n        max_context_length,\n    )\n\n    model = get_model(opts)\n    model.eval()\n\n    model_inputs_outputs = [\n        # pre-training\n        {\n            \"input\": torch.randint(0, vocab_size, size=(batch_size, seq_length)),\n            \"expected_output_size\": [batch_size, seq_length, vocab_size],\n            \"expected_output_type\": \"tensor\",\n        },\n        # prefix (same as pre-training, but use dictionary format for inputs)\n        {\n            \"input\": {\n                \"input_ids\": torch.randint(\n                    0, vocab_size, size=(batch_size, seq_length)\n                ),\n                \"past_keys\": None,\n                \"past_values\": None,\n                \"use_kv_cache\": False,\n                \"is_causal\": True,\n            },\n            \"expected_output_size\": [batch_size, seq_length, vocab_size],\n            \"expected_output_type\": \"tensor\",\n        },\n        # prefix with KV caching\n        {\n            \"input\": {\n                \"input_ids\": torch.randint(\n                    0, vocab_size, size=(batch_size, seq_length)\n                ),\n                \"past_keys\": None,\n                \"past_values\": None,\n                \"use_kv_cache\": True,\n                \"is_causal\": True,\n            },\n            \"expected_output_size\": {\n                \"logits\": [batch_size, seq_length, vocab_size],\n                \"past_keys\": [\n                    [\n                        batch_size,\n                        model.layers[0].attn.num_k_heads,\n                        seq_length,\n                        model.layers[0].attn.head_dim,\n                    ]\n                ],\n                \"past_values\": [\n                    [\n                        batch_size,\n                        model.layers[0].attn.num_k_heads,\n                        seq_length,\n                        model.layers[0].attn.head_dim,\n                    ]\n                ],\n            },\n            \"expected_output_type\": \"dictionary\",\n        },\n        # Generation with KV caching (input sequence length is 1)\n        {\n            \"input\": {\n                \"input_ids\": torch.randint(0, vocab_size, size=(batch_size, 1)),\n                \"past_keys\": [\n                    torch.randint(\n                        0,\n                        vocab_size,\n                        size=(\n                            batch_size,\n                            model.layers[0].attn.num_k_heads,\n                            seq_length,\n                            model.layers[0].attn.head_dim,\n                        ),\n                    )\n                ],\n                \"past_values\": [\n                    torch.randint(\n                        0,\n                        vocab_size,\n                        size=(\n                            batch_size,\n                            model.layers[0].attn.num_k_heads,\n                            seq_length,\n                            model.layers[0].attn.head_dim,\n                        ),\n                    )\n                ],\n                \"use_kv_cache\": True,\n                \"is_causal\": True,\n            },\n            \"expected_output_size\": {\n                \"logits\": [batch_size, 1, vocab_size],\n                # expected 1 more token in kv cache\n                \"past_keys\": [\n                    [\n                        batch_size,\n                        model.layers[0].attn.num_k_heads,\n                        seq_length + 1,\n                        model.layers[0].attn.head_dim,\n                    ]\n                ],\n                \"past_values\": [\n                    [\n                        batch_size,\n                        model.layers[0].attn.num_k_heads,\n                        seq_length + 1,\n                        model.layers[0].attn.head_dim,\n                    ]\n                ],\n            },\n            \"expected_output_type\": \"dictionary\",\n        },\n    ]\n\n    for model_io in model_inputs_outputs:\n        out = model(model_io[\"input\"])\n        if model_io[\"expected_output_type\"] == \"tensor\":\n            assert isinstance(out, torch.Tensor)\n            assert list(out.size()) == model_io[\"expected_output_size\"]\n            assert torch.all(torch.isfinite(out))\n        elif model_io[\"expected_output_type\"] == \"dictionary\":\n            assert isinstance(out, dict)\n            assert set(out.keys()) == set(model_io[\"expected_output_size\"].keys())\n            for k_name, expected_out_size in model_io[\"expected_output_size\"].items():\n                if k_name in [\"past_keys\", \"past_values\"]:\n                    assert (\n                        len(out[k_name]) == 1\n                    ), \"Only single transformer layer in test model\"\n                    actual_out_size = [list(out[k_name][0].size())]\n                    assert torch.all(torch.isfinite(out[k_name][0]))\n                else:\n                    actual_out_size = list(out[k_name].size())\n                    assert torch.all(torch.isfinite(out[k_name]))\n                assert actual_out_size == expected_out_size\n"
  },
  {
    "path": "tests/modeling/models/language_modeling/test_kv_prediction.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport copy\n\nimport pytest\nimport torch\n\nfrom corenet.modeling.models import get_model\nfrom tests.configs import get_config\n\n\ndef set_cache_transforms_to_identity(model) -> None:\n    model.predicter.auxkv_to_basekv.set_as_identity()\n\n\ndef get_openelm_kv_prediction_model(\n    arch,\n    config,\n):\n    opts = get_config(\n        config_file=\"tests/modeling/models/language_modeling/config/kv_prediction_config.yaml\"\n    )\n\n    for k, v in config.items():\n        setattr(opts, k, v)\n\n    for elem in [\"general_gpt\"]:\n        getattr(opts, \"model.language_modeling.kv_prediction.base_model\")[0][\"model\"][\n            \"language_modeling\"\n        ][elem][\"model_name\"] = arch[0]\n        getattr(opts, \"model.language_modeling.kv_prediction.auxiliary_model\")[0][\n            \"model\"\n        ][\"language_modeling\"][elem][\"model_name\"] = arch[1]\n\n    model = get_model(opts)\n    model.eval()\n    return model\n\n\n@torch.no_grad()\n@pytest.mark.parametrize(\n    \"arch,config\",\n    (\n        [\n            [\"gpt-test-base\", \"gpt-test-aux\"],\n            {\n                \"model.language_modeling.kv_prediction.auxkv_num_layers_to_basekv_num_layers\": [\n                    0,\n                    0,\n                    1,\n                ],\n            },\n        ],\n    ),\n)\ndef test_kv_prediction(arch, config) -> None:\n    batch_size = 3\n    seq_length = 5\n    vocab_size = 16\n    max_context_length = seq_length\n\n    config[\"model.language_modeling.general_gpt.vocab_size\"] = vocab_size\n    config[\"model.language_modeling.general_gpt.max_context_length\"] = (\n        max_context_length\n    )\n    model = get_openelm_kv_prediction_model(\n        arch,\n        config,\n    )\n\n    model_inputs_outputs = [\n        # pre-training\n        {\n            \"name\": \"pre-training\",\n            \"input\": torch.randint(2, vocab_size, size=(batch_size, seq_length)),\n            \"expected_output_size\": {\n                \"logits\": [batch_size, seq_length, vocab_size],\n                \"auxiliary_logits\": [batch_size, seq_length, vocab_size],\n                \"past_keys\": [\n                    [\n                        batch_size,\n                        model.base.k_num_heads_at_layer(i),\n                        seq_length,\n                        model.base.head_dim_at_layer(i),\n                    ]\n                    for i in range(len(model.base.layers))\n                ],\n                \"past_values\": [\n                    [\n                        batch_size,\n                        model.base.v_num_heads_at_layer(i),\n                        seq_length,\n                        model.base.head_dim_at_layer(i),\n                    ]\n                    for i in range(len(model.base.layers))\n                ],\n            },\n            \"expected_output_type\": \"dictionary\",\n        },\n        # prefix (same as pre-training, but use dictionary format for inputs)\n        {\n            \"name\": \"prefix (same as pre-training, but use dictionary format for inputs)\",\n            \"input\": {\n                \"input_ids\": torch.randint(\n                    2, vocab_size, size=(batch_size, seq_length)\n                ),\n                \"past_keys\": None,\n                \"past_values\": None,\n                \"use_kv_cache\": False,\n                \"is_causal\": True,\n            },\n            \"expected_output_size\": {\n                \"logits\": [batch_size, seq_length, vocab_size],\n                \"auxiliary_logits\": [batch_size, seq_length, vocab_size],\n                \"past_keys\": [\n                    [\n                        batch_size,\n                        model.base.k_num_heads_at_layer(i),\n                        seq_length,\n                        model.base.head_dim_at_layer(i),\n                    ]\n                    for i in range(len(model.base.layers))\n                ],\n                \"past_values\": [\n                    [\n                        batch_size,\n                        model.base.v_num_heads_at_layer(i),\n                        seq_length,\n                        model.base.head_dim_at_layer(i),\n                    ]\n                    for i in range(len(model.base.layers))\n                ],\n            },\n            \"expected_output_type\": \"dictionary\",\n        },\n        # prefix with KV caching\n        {\n            \"name\": \"prefix with KV caching\",\n            \"input\": {\n                \"input_ids\": torch.randint(\n                    2, vocab_size, size=(batch_size, seq_length)\n                ),\n                \"past_keys\": None,\n                \"past_values\": None,\n                \"use_kv_cache\": True,\n                \"is_causal\": True,\n            },\n            \"expected_output_size\": {\n                \"logits\": [batch_size, seq_length, vocab_size],\n                \"past_keys\": [\n                    [\n                        batch_size,\n                        model.base.k_num_heads_at_layer(i),\n                        seq_length,\n                        model.base.head_dim_at_layer(i),\n                    ]\n                    for i in range(len(model.base.layers))\n                ],\n                \"past_values\": [\n                    [\n                        batch_size,\n                        model.base.v_num_heads_at_layer(i),\n                        seq_length,\n                        model.base.head_dim_at_layer(i),\n                    ]\n                    for i in range(len(model.base.layers))\n                ],\n            },\n            \"expected_output_type\": \"dictionary\",\n        },\n        # Generation with KV caching (input sequence length is 1)\n        {\n            \"name\": \"Generation with KV caching (input sequence length is 1)\",\n            \"input\": {\n                \"input_ids\": torch.randint(2, vocab_size, size=(batch_size, 1)),\n                \"past_keys\": [\n                    torch.randint(\n                        2,\n                        vocab_size,\n                        size=(\n                            batch_size,\n                            model.base.k_num_heads_at_layer(i),\n                            seq_length,\n                            model.base.head_dim_at_layer(i),\n                        ),\n                    )\n                    for i in range(len(model.base.layers))\n                ],\n                \"past_values\": [\n                    torch.randint(\n                        2,\n                        vocab_size,\n                        size=(\n                            batch_size,\n                            model.base.k_num_heads_at_layer(i),\n                            seq_length,\n                            model.base.head_dim_at_layer(i),\n                        ),\n                    )\n                    for i in range(len(model.base.layers))\n                ],\n                \"use_kv_cache\": True,\n                \"is_causal\": True,\n            },\n            \"expected_output_size\": {\n                \"logits\": [batch_size, 1, vocab_size],\n                # expected 1 more token in kv cache\n                \"past_keys\": [\n                    [\n                        batch_size,\n                        model.base.k_num_heads_at_layer(i),\n                        seq_length + 1,\n                        model.base.head_dim_at_layer(i),\n                    ]\n                    for i in range(len(model.base.layers))\n                ],\n                \"past_values\": [\n                    [\n                        batch_size,\n                        model.base.v_num_heads_at_layer(i),\n                        seq_length + 1,\n                        model.base.head_dim_at_layer(i),\n                    ]\n                    for i in range(len(model.base.layers))\n                ],\n            },\n            \"expected_output_type\": \"dictionary\",\n        },\n    ]\n\n    for model_io in model_inputs_outputs:\n        out = model(model_io[\"input\"])\n        if model_io[\"expected_output_type\"] == \"tensor\":\n            assert isinstance(out, torch.Tensor)\n            assert list(out.size()) == model_io[\"expected_output_size\"]\n            assert torch.all(torch.isfinite(out))\n        elif model_io[\"expected_output_type\"] == \"dictionary\":\n            assert isinstance(out, dict)\n            assert set(out.keys()) in (\n                set(model_io[\"expected_output_size\"].keys()),\n                set(model_io[\"expected_output_size\"].keys())\n                | {\"base_past_keys\", \"base_past_values\"},\n            )\n            for k_name, expected_out_size in model_io[\"expected_output_size\"].items():\n                if k_name in [\"past_keys\", \"past_values\"]:\n                    actual_out_size = [\n                        list(out[k_name][i].size()) for i in range(len(out[k_name]))\n                    ]\n                    assert all(\n                        [\n                            torch.all(torch.isfinite(out[k_name][i]))\n                            for i in range(len(out[k_name]))\n                        ]\n                    )\n                else:\n                    actual_out_size = list(out[k_name].size())\n                    assert torch.all(torch.isfinite(out[k_name]))\n\n                assert actual_out_size == expected_out_size, f\"{k_name=},{model_io=}\"\n\n\n@torch.no_grad()\n@pytest.mark.parametrize(\n    \"arch,config,test_outputs_identical\",\n    (\n        [\n            [\"gpt-test-base\", \"gpt-test-aux\"],\n            {\n                \"model.language_modeling.kv_prediction.auxkv_num_layers_to_basekv_num_layers\": [\n                    0,\n                    0,\n                    1,\n                ],\n            },\n            False,\n        ],\n        [\n            [\"gpt-test-base\", \"gpt-test-base\"],\n            {\n                \"model.language_modeling.kv_prediction.auxkv_num_layers_to_basekv_num_layers\": [\n                    0,\n                    1,\n                    2,\n                ],\n            },\n            True,\n        ],\n    ),\n)\ndef test_cache_behavior(\n    arch,\n    config,\n    test_outputs_identical,\n) -> None:\n    batch_size = 3\n    seq_length = 5\n    vocab_size = 16\n    max_context_length = seq_length\n\n    batch_size = 3\n    seq_length = 5\n    vocab_size = 16\n    max_context_length = seq_length\n\n    config[\"model.language_modeling.general_gpt.vocab_size\"] = vocab_size\n    config[\"model.language_modeling.general_gpt.max_context_length\"] = (\n        max_context_length\n    )\n    model = get_openelm_kv_prediction_model(arch, config)\n\n    if test_outputs_identical:\n        model.base.load_state_dict(model.auxiliary.state_dict())\n        set_cache_transforms_to_identity(model)\n\n    storage = {}\n\n    def make_record_forward(model):\n        old_forward = model.forward\n\n        def forward(*args2, **kwargs2):\n            storage.clear()\n            storage[\"args\"] = copy.deepcopy(args2)\n            storage[\"kwargs\"] = copy.deepcopy(kwargs2)\n            return old_forward(*args2, **kwargs2)\n\n        return forward\n\n    model.base.forward = make_record_forward(model.base)\n\n    position_ids = torch.arange(\n        0,\n        seq_length,\n    ).unsqueeze(0)\n    # Case 1: use_kv_cache is False. In this case, we\n    # pass the KV cache to the Base model after computing\n    # it.\n    inputs = {\n        \"input_ids\": torch.randint(2, vocab_size, size=(batch_size, seq_length)),\n        \"position_ids\": position_ids,\n        \"past_keys\": None,\n        \"past_values\": None,\n        \"use_kv_cache\": False,\n        \"is_causal\": True,\n    }\n    base_only_outputs = model(inputs, base_only=True)\n\n    outputs1 = model(inputs)\n    assert storage[\"args\"][0][\"input_ids\"].shape == (batch_size, seq_length)\n    assert len(storage[\"args\"][0][\"past_keys\"]) == len(model.base.layers)\n    assert (storage[\"args\"][0][\"past_keys\"][0]).shape[0] == (batch_size)\n    assert (storage[\"args\"][0][\"past_keys\"][0]).shape[2] == (seq_length)\n    assert (storage[\"args\"][0][\"past_keys\"][0]).dim() == (4)\n    assert len(storage[\"args\"][0][\"past_values\"]) == len(model.base.layers)\n    assert (storage[\"args\"][0][\"past_values\"][0]).shape[0] == (batch_size)\n    assert (storage[\"args\"][0][\"past_values\"][0]).shape[2] == (seq_length)\n    assert (storage[\"args\"][0][\"past_values\"][0]).dim() == (4)\n    assert (storage[\"args\"][0][\"use_kv_cache\"]) is True\n    assert (storage[\"args\"][0][\"is_causal\"]) is True\n    assert storage[\"kwargs\"][\"concat_kvs\"] is False\n    assert storage[\"kwargs\"][\"apply_k_norm_to_past_keys_before_cache_write\"] is True\n    assert storage[\"kwargs\"][\"apply_k_norm_before_cache_write\"] is True\n\n    # Case 2: We are using the cache, and we are in prompt-processing mode.\n    # We will first generate the KV cache (which is not yet present in @inputs),\n    # then we will call the base model to generate 1 token.\n    # Since storage[\"args\"] stores only the inputs to the base model,\n    # the sequence length checked below is 1.\n    inputs.update({\"use_kv_cache\": True})\n    outputs2 = model(inputs)\n    assert storage[\"args\"][0][\"input_ids\"].shape == (batch_size, 1)  # Seq length is 1.\n    assert len(storage[\"args\"][0][\"past_keys\"]) == len(model.base.layers)\n    assert (storage[\"args\"][0][\"past_keys\"][0]).shape[0] == (batch_size)\n    assert (storage[\"args\"][0][\"past_keys\"][0]).shape[2] == (seq_length - 1)\n    assert (storage[\"args\"][0][\"past_keys\"][0]).dim() == (4)\n    assert len(storage[\"args\"][0][\"past_values\"]) == len(model.base.layers)\n    assert (storage[\"args\"][0][\"past_values\"][0]).shape[0] == (batch_size)\n    assert (storage[\"args\"][0][\"past_values\"][0]).shape[2] == (seq_length - 1)\n    assert (storage[\"args\"][0][\"past_values\"][0]).dim() == (4)\n    assert (storage[\"args\"][0][\"use_kv_cache\"]) is True\n    assert (storage[\"args\"][0][\"is_causal\"]) is False\n    assert storage[\"kwargs\"][\"concat_kvs\"] is True\n    assert storage[\"kwargs\"][\"apply_k_norm_to_past_keys_before_cache_write\"] is True\n    assert storage[\"kwargs\"][\"apply_k_norm_before_cache_write\"] is True\n\n    # Case 3: We are using the cache, and we are in generation mode.\n    # To get an appropriate KV cache, we must first call the model.\n    inputs3a = copy.deepcopy(inputs)\n    inputs3a.update(\n        {\n            \"input_ids\": inputs[\"input_ids\"][:, :-2],\n            \"position_ids\": inputs[\"position_ids\"][:, :-2],\n        }\n    )\n    outputs3a = model(inputs3a)\n\n    inputs3b = copy.deepcopy(inputs)\n    inputs3b.update(\n        {\n            \"input_ids\": inputs[\"input_ids\"][:, -2:-1],\n            \"position_ids\": inputs[\"position_ids\"][:, -2:-1],\n            \"past_keys\": outputs3a[\"past_keys\"],\n            \"past_values\": outputs3a[\"past_values\"],\n        }\n    )\n    outputs3b = model(inputs3b)\n\n    inputs3c = copy.deepcopy(inputs)\n    inputs3c.update(\n        {\n            \"input_ids\": inputs[\"input_ids\"][:, -1:],\n            \"position_ids\": inputs[\"position_ids\"][:, -1:],\n            \"past_keys\": outputs3b[\"past_keys\"],\n            \"past_values\": outputs3b[\"past_values\"],\n        }\n    )\n    outputs3c = model(inputs3c)\n\n    assert storage[\"args\"][0][\"input_ids\"].shape == (batch_size, 1)  # Seq length is 1.\n    assert len(storage[\"args\"][0][\"past_keys\"]) == len(model.base.layers)\n    assert (storage[\"args\"][0][\"past_keys\"][0]).shape[0] == (batch_size)\n    assert (storage[\"args\"][0][\"past_keys\"][0]).shape[2] == (seq_length - 1)\n    assert (storage[\"args\"][0][\"past_keys\"][0]).dim() == (4)\n    assert len(storage[\"args\"][0][\"past_values\"]) == len(model.base.layers)\n    assert (storage[\"args\"][0][\"past_values\"][0]).shape[0] == (batch_size)\n    assert (storage[\"args\"][0][\"past_values\"][0]).shape[2] == (seq_length - 1)\n    assert (storage[\"args\"][0][\"past_values\"][0]).dim() == (4)\n    assert (storage[\"args\"][0][\"use_kv_cache\"]) is True\n    assert (storage[\"args\"][0][\"is_causal\"]) is False\n    assert storage[\"kwargs\"][\"concat_kvs\"] is True\n    assert storage[\"kwargs\"][\"apply_k_norm_to_past_keys_before_cache_write\"] is False\n    assert storage[\"kwargs\"][\"apply_k_norm_before_cache_write\"] is True\n\n    if test_outputs_identical:\n        assert torch.allclose(base_only_outputs, outputs1[\"logits\"], atol=1e-5)\n        assert torch.allclose(outputs1[\"logits\"], outputs2[\"logits\"], atol=1e-5)\n        assert torch.allclose(\n            outputs2[\"logits\"][:, -2:-1], outputs3b[\"logits\"], atol=1e-5\n        )\n        assert torch.allclose(\n            outputs2[\"logits\"][:, -1:], outputs3c[\"logits\"], atol=1e-5\n        )\n"
  },
  {
    "path": "tests/modeling/models/test_activation_checkpointing_wrapper.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\n\nfrom typing import List, Tuple, Union\n\nimport pytest\nimport torch\nfrom torch import nn\n\nfrom corenet.utils.activation_checkpointing_wrapper import activation_checkpointing\n\n\n@pytest.mark.parametrize(\n    \"activation_checkpointing_module_and_count\",\n    [\n        # _checkpoint_wrapped_module is added for each trainable parameter (e.g., weight and bias) in a layer.\n        (nn.Linear, 3),\n        (nn.Conv1d, 2),\n        ([nn.Linear, nn.Conv1d], 5),\n    ],\n)\ndef test_activation_checkpointing(\n    activation_checkpointing_module_and_count: Tuple[\n        Union[torch.nn.Module, List[torch.nn.Module]], int\n    ]\n):\n\n    (\n        activation_checkpoint_module,\n        expected_activation_checkpoinitng_layers,\n    ) = activation_checkpointing_module_and_count\n    # dummy model\n    model = torch.nn.Sequential(\n        nn.Linear(10, 10, bias=False),\n        nn.Conv1d(10, 10, kernel_size=1),\n        nn.Linear(10, 10),\n        nn.AvgPool1d(kernel_size=1),\n    )\n\n    activation_checkpointing(model, submodule_class=activation_checkpoint_module)\n\n    num_ckpt_modules = 0\n    for p_name, _ in model.named_parameters():\n        if p_name.find(\"_checkpoint_wrapped_module\") > -1:\n            num_ckpt_modules += 1\n\n    assert num_ckpt_modules == expected_activation_checkpoinitng_layers\n"
  },
  {
    "path": "tests/modeling/models/test_lora.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom typing import Dict\n\nimport torch\n\nfrom corenet.modeling.models import get_model\nfrom corenet.third_party.modeling import lora\nfrom tests.configs import get_config\n\n\ndef get_opts(config_file_name: str) -> Dict:\n    opts = get_config(config_file_name)\n\n    # Override with LoRA settings.\n    setattr(opts, \"model.freeze_modules\", [\".*base_layer.*\", \".*norm.*\"])\n    setattr(opts, \"model.lora.use_lora\", True)\n\n    config = [\n        {\n            \"regex\": r\".*token_embedding.*\",\n            \"module_type\": \"embedding\",\n            \"params\": {\n                \"adapter_name\": \"lora\",\n                \"r\": 5,\n                \"lora_alpha\": 2,\n                \"lora_dropout\": 0.1,\n                \"init_lora_weights\": True,\n                \"use_rslora\": False,\n                \"use_dora\": False,\n            },\n        },\n        {\n            \"regex\": r\".*out_proj.*\",\n            \"module_type\": \"linear\",\n            \"params\": {\n                \"adapter_name\": \"lora\",\n                \"r\": 5,\n                \"lora_alpha\": 2,\n                \"lora_dropout\": 0.1,\n                \"init_lora_weights\": True,\n                \"use_rslora\": False,\n                \"use_dora\": True,\n            },\n        },\n        {\n            \"regex\": r\".*qkv_proj.*\",\n            \"module_type\": \"linear\",\n            \"params\": {\n                \"adapter_name\": \"lora\",\n                \"r\": 5,\n                \"lora_alpha\": 2,\n                \"lora_dropout\": 0.1,\n                \"init_lora_weights\": True,\n                \"use_rslora\": False,\n                \"use_dora\": True,\n            },\n        },\n        {\n            \"regex\": r\".*proj_\\d.*\",\n            \"module_type\": \"linear\",\n            \"params\": {\n                \"adapter_name\": \"lora\",\n                \"r\": 5,\n                \"lora_alpha\": 2,\n                \"lora_dropout\": 0.1,\n                \"init_lora_weights\": True,\n                \"use_rslora\": False,\n                \"use_dora\": True,\n            },\n        },\n    ]\n    setattr(opts, \"model.lora.config\", config)\n    return opts\n\n\ndef test_build_model() -> None:\n    config = \"tests/modeling/models/language_modeling/config/gpt_config.yaml\"\n    opts = get_opts(config)\n    model = get_model(opts)\n\n    # Number of parameters.\n    assert sum([param.numel() for name, param in model.named_parameters()]) == 154164\n    # Number of trainable parameters.\n    assert (\n        sum(\n            [\n                param.numel()\n                for name, param in model.named_parameters()\n                if param.requires_grad\n            ]\n        )\n        == 9780\n    )\n\n    vocab_size = getattr(opts, \"model.language_modeling.general_gpt.vocab_size\")\n\n    batch_size, seq_len = 1, 4\n\n    x = torch.randint(low=0, high=2, size=[batch_size, seq_len])\n    y = model(x)\n    assert y.shape == (batch_size, seq_len, vocab_size)\n"
  },
  {
    "path": "tests/modeling/models/test_neural_aug_utils.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport sys\n\nimport pytest\n\nfrom corenet.modeling.neural_augmentor.utils.neural_aug_utils import *\n\n\n@pytest.mark.parametrize(\"noise_var\", [0.0001, 0.01, 0.1])\ndef test_random_noise(noise_var):\n    in_channels = 3\n    in_height = 224\n    in_width = 224\n    x = torch.ones(size=(1, in_channels, in_width, in_height), dtype=torch.float)\n\n    aug_out = random_noise(x, variance=torch.tensor(noise_var, dtype=torch.float))\n\n    torch.testing.assert_allclose(actual=x.shape, expected=aug_out.shape)\n\n\n@pytest.mark.parametrize(\"magnitude\", [0.1, 1.0, 2.0])\ndef test_random_brightness(magnitude):\n    in_channels = 3\n    in_height = 224\n    in_width = 224\n    x = torch.ones(size=(1, in_channels, in_width, in_height), dtype=torch.float)\n\n    aug_out = random_brightness(x, magnitude=torch.tensor(magnitude, dtype=torch.float))\n\n    torch.testing.assert_allclose(actual=x.shape, expected=aug_out.shape)\n\n\n@pytest.mark.parametrize(\"magnitude\", [0.1, 1.0, 2.0])\ndef test_random_contrast(magnitude):\n    in_channels = 3\n    in_height = 224\n    in_width = 224\n    x = torch.ones(size=(1, in_channels, in_width, in_height), dtype=torch.float)\n\n    aug_out = random_contrast(x, magnitude=torch.tensor(magnitude, dtype=torch.float))\n\n    torch.testing.assert_allclose(actual=x.shape, expected=aug_out.shape)\n"
  },
  {
    "path": "tests/modeling/modules/__init__.py",
    "content": ""
  },
  {
    "path": "tests/modeling/modules/test_transformer.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\n\nimport torch\n\nfrom corenet.modeling.modules import TransformerEncoder\n\n\ndef get_opts() -> argparse.Namespace:\n    opts = argparse.Namespace()\n    setattr(opts, \"model.normalization.groups\", None)\n    setattr(opts, \"model.normalization.momentum\", 0.9)\n    setattr(opts, \"model.activation.name\", \"relu\")\n    setattr(opts, \"model.activation.inplace\", False)\n    setattr(opts, \"model.activation.neg_slope\", False)\n    return opts\n\n\ndef ensure_equal_in_range(t: torch.Tensor, start: int, end: int) -> None:\n    \"\"\"\n    Ensure values of @t are equal from @start to @end, but not after @end.\n\n    The tensor can have any number of dimensions greater than 0. The first\n    dimension is the dimension indexed by @start and @end.\n\n    Args:\n        t: The tensor to check.\n        start: The start index.\n        end: The end index.\n    \"\"\"\n    prototype = t[start]\n    assert torch.all((prototype - t[start:end]).abs() < 1e-3)\n    assert torch.all(prototype != t[end:])\n\n\ndef test_masked_attention() -> None:\n    opts = get_opts()\n\n    B, N, C = 2, 64 + 2, 8\n    t = TransformerEncoder(opts, embed_dim=C, ffn_latent_dim=4 * C)\n    prototype = torch.randn([C])\n    x = torch.ones([B, N, C])\n    x[:, :] = prototype\n\n    key_padding_mask = torch.zeros([B, N])\n    key_padding_mask[0, 63:] = float(\"-inf\")\n    # Mask the @x values at the masked positions.\n    x[0, 63:] = 0\n\n    y = t(x, key_padding_mask=key_padding_mask)\n\n    prototype = y[0, 0]\n    assert torch.all(prototype == y[0, :63])\n    assert torch.all(prototype != y[0, 63:])\n\n    prototype = y[1, 0]\n    assert torch.all(prototype == y[1, :])\n"
  },
  {
    "path": "tests/modeling/modules/test_windowed_transformer.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport pytest\nimport torch\n\nimport corenet.modeling.modules\nfrom corenet.modeling.modules import WindowedTransformerEncoder\nfrom tests.modeling.modules.test_transformer import ensure_equal_in_range, get_opts\n\n\n@pytest.mark.parametrize(\n    \"N,window_size,window_shift\", [(32, 16, 4), (32, 7, 2), (15, 9, 4)]\n)\ndef test_get_windowed_attention_mask(N, window_size, window_shift) -> None:\n    mask = corenet.modeling.modules.windowed_transformer.get_windows_shift_mask(\n        N, window_size, window_shift, device=torch.device(\"cpu\")\n    )\n\n    expected = torch.zeros(N // window_size, window_size, window_size)\n    expected[-1].fill_(float(\"-inf\"))\n    expected[-1, : window_size - window_shift, : window_size - window_shift] = 0\n    expected[-1, -window_shift:, -window_shift:] = 0\n\n    assert torch.all(mask == expected)\n\n\ndef test_windowed_attention() -> None:\n    opts = get_opts()\n\n    B, N, C = 2, 66, 8\n    window_size = 16\n    window_shift = 0\n    t = WindowedTransformerEncoder(\n        opts,\n        embed_dim=C,\n        ffn_latent_dim=4 * C,\n        window_size=window_size,\n        window_shift=window_shift,\n    )\n\n    # These are the boundaries at which the tensor values change.\n    chunk_bounds = [0, 16, 32, 48, 64, 66]\n    x = torch.empty([B, N, C])\n    for start, end in zip(chunk_bounds[0:-1], chunk_bounds[1:]):\n        prototype = torch.randn([C])\n        x[:, start:end] = prototype\n\n    key_padding_mask = torch.zeros([B, N])\n    key_padding_mask[0, 63:] = float(\"-inf\")\n    # Mask the @x values at the masked positions.\n    x[0, 63:] = 0\n\n    y = t(x, key_padding_mask=key_padding_mask)\n\n    # We expect @y[0] values to change at the boundaries defined by chunk_bounds.\n    ensure_equal_in_range(y[0], 0, 16)\n    ensure_equal_in_range(y[0], 16, 32)\n    ensure_equal_in_range(y[0], 32, 48)\n    ensure_equal_in_range(y[0], 48, 63)\n    # Masking will cause a change at index 63.\n    ensure_equal_in_range(y[0], 63, 64)\n    ensure_equal_in_range(y[0], 64, 66)\n\n    # We expect @y[1] values to change at the boundaries defined by chunk_bounds.\n    ensure_equal_in_range(y[1], 0, 16)\n    ensure_equal_in_range(y[1], 16, 32)\n    ensure_equal_in_range(y[1], 32, 48)\n    ensure_equal_in_range(y[1], 48, 64)\n    ensure_equal_in_range(y[1], 64, 66)\n\n\ndef test_windowed_attention_shift() -> None:\n    opts = get_opts()\n\n    B, N, C = 2, 66, 8\n    window_size = 16\n    window_shift = 8\n    t = WindowedTransformerEncoder(\n        opts,\n        embed_dim=C,\n        ffn_latent_dim=4 * C,\n        window_size=window_size,\n        window_shift=window_shift,\n    )\n\n    # These are the boundaries at which the tensor values change.\n    chunk_bounds = [0, 8, 24, 40, 56, 66]\n    x = torch.empty([B, N, C]).fill_(float(\"-inf\"))\n    for start, end in zip(chunk_bounds[0:-1], chunk_bounds[1:]):\n        prototype = torch.randn([C])\n        x[:, start:end] = prototype\n\n    key_padding_mask = torch.zeros([B, N])\n    key_padding_mask[0, 63:] = float(\"-inf\")\n    # Mask the @x values at the masked positions.\n    x[0, 63:] = 0\n\n    y = t(x, key_padding_mask=key_padding_mask)\n\n    # We expect @y[0] values to change at the boundaries defined by chunk_bounds.\n    # The values are offset by the shift of 8 as well, since windowing will\n    # occur at indices congruent to 8 mod 16.\n    ensure_equal_in_range(y[0], 0, 8)\n    ensure_equal_in_range(y[0], 8, 24)\n    ensure_equal_in_range(y[0], 24, 40)\n    ensure_equal_in_range(y[0], 40, 56)\n    ensure_equal_in_range(y[0], 56, 63)\n    # Masking at index 63 changes the values.\n    ensure_equal_in_range(y[0], 63, 66)\n\n    # We expect @y[0] values to change at the boundaries defined by chunk_bounds.\n    ensure_equal_in_range(y[1], 0, 8)\n    ensure_equal_in_range(y[1], 8, 24)\n    ensure_equal_in_range(y[1], 24, 40)\n    ensure_equal_in_range(y[1], 40, 56)\n    ensure_equal_in_range(y[1], 56, 66)\n"
  },
  {
    "path": "tests/modeling/test_model.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom pathlib import Path\nfrom typing import Dict\n\nimport pytest\nfrom torch import Tensor\n\nfrom corenet.loss_fn import build_loss_fn\nfrom corenet.modeling import get_model\nfrom tests.configs import get_config\nfrom tests.test_utils import unset_pretrained_models_from_opts\n\n\n# We use a batch size of 1 to catch error that may arise due to reshaping operations inside the model\n@pytest.mark.parametrize(\"batch_size\", [1, 2])\ndef test_model(config_file: str, batch_size: int):\n    opts = get_config(config_file=config_file)\n    setattr(opts, \"common.debug_mode\", True)\n\n    # removing pretrained models (if any) for now to reduce test time as well as access issues\n    unset_pretrained_models_from_opts(opts)\n\n    model = get_model(opts)\n\n    criteria = build_loss_fn(opts)\n\n    inputs = None\n    targets = None\n    if hasattr(model, \"dummy_input_and_label\"):\n        inputs_and_targets = model.dummy_input_and_label(batch_size)\n        inputs = inputs_and_targets[\"samples\"]\n        targets = inputs_and_targets[\"targets\"]\n\n    assert inputs is not None, (\n        \"Input tensor can't be None. This is likely because \"\n        \"{} does not implement dummy_input_and_label function\".format(\n            model.__class__.__name__\n        )\n    )\n    assert targets is not None, (\n        \"Label tensor can't be None. This is likely because \"\n        \"{} does not implement dummy_input_and_label function\".format(\n            model.__class__.__name__\n        )\n    )\n\n    try:\n        outputs = model(inputs)\n\n        loss = criteria(\n            input_sample=inputs,\n            prediction=outputs,\n            target=targets,\n            epoch=0,\n            iterations=0,\n        )\n\n        print(f\"Loss: {loss}\")\n\n        if isinstance(loss, Tensor):\n            loss.backward()\n        elif isinstance(loss, Dict):\n            loss[\"total_loss\"].backward()\n        else:\n            raise RuntimeError(\"The output of criteria should be either Dict or Tensor\")\n\n        # If there are unused parameters in gradient computation, print them\n        # This may be useful for debugging purposes\n        unused_params = []\n        for name, param in model.named_parameters():\n            if param.grad is None:\n                unused_params.append(name)\n        if len(unused_params) > 0:\n            print(\"Unused parameters: {}\".format(unused_params))\n\n    except Exception as e:\n        if (\n            isinstance(e, ValueError)\n            and str(e).find(\"Expected more than 1 value per channel when training\") > -1\n            and batch_size == 1\n        ):\n            # For segmentation models (e.g., PSPNet), we pool the tensor so that they have a spatial size of 1.\n            # In such a case, batch norm needs a batch size > 1. Otherwise, we can't compute the statistics, raising\n            # ValueError(\"Expected more than 1 value per channel when training\"). If we encounter this error\n            # for a batch size of 1, we skip it.\n            pytest.skip(str(e))\n        else:\n            raise e\n\n\ndef exclude_yaml_from_test(yaml_file_path: Path) -> bool:\n    \"\"\"Check if a yaml file should be excluded from test based on first line marker.\n\n    Args:\n        yaml_file_path: path to the yaml file to check\n\n    Returns:\n        True if yaml should be excluded, and False otherwise.\n\n    \"\"\"\n    part0 = yaml_file_path.parts[0]\n    if part0 == \".\":\n        part0 = yaml_file_path.parts[1]\n\n    if part0 in (\"pipeline.yaml\", \"results\", \"venv\", \".tox\"):\n        return True\n\n    with open(yaml_file_path, \"r\") as f:\n        first_line = f.readline().rstrip()\n        return first_line.startswith(\"#\") and first_line.lower().replace(\n            \" \", \"\"\n        ).startswith(\"#pytest:disable\")\n\n\ndef pytest_generate_tests(metafunc):\n    configs = [\n        str(x) for x in Path(\".\").rglob(\"**/*.yaml\") if not exclude_yaml_from_test(x)\n    ]\n\n    metafunc.parametrize(\"config_file\", configs)\n"
  },
  {
    "path": "tests/optims/__init__.py",
    "content": ""
  },
  {
    "path": "tests/optims/scheduler/__init__.py",
    "content": ""
  },
  {
    "path": "tests/optims/scheduler/test_scheduler.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport random\nimport sys\nfrom typing import List, Optional, Union\n\nimport numpy as np\nimport pytest\n\nsys.path.append(\"..\")\n\nfrom corenet.optims.scheduler import build_scheduler\nfrom tests.configs import get_config\n\nLR_TOLERANCE = 1e-3\n\nMAX_LRS = np.linspace(0.001, 0.1, 3)\nWARMUP_ITERATIONS = [None, 100, 1000, 10000]\n\nBATCH_SIZE = 100\nDATASET_SIZE = 20000\n\n\ndef run_test(\n    scheduler, num_epochs: int, num_batches: int, return_all_lrs: Optional[bool] = False\n) -> Union[List, float]:\n    end_lr = [] if return_all_lrs else 0.0\n    curr_iter = 0\n    for ep in range(num_epochs):\n        for _ in range(num_batches):\n            lr = scheduler.get_lr(ep, curr_iter=curr_iter)\n            curr_iter += 1\n\n        # keep only epoch-wise LRs\n        if return_all_lrs:\n            end_lr.append(lr)\n        else:\n            end_lr = lr\n\n    return end_lr\n\n\n@pytest.mark.parametrize(\"start_lr\", MAX_LRS)\n@pytest.mark.parametrize(\"warmup_iteration\", WARMUP_ITERATIONS)\ndef test_polynomial_scheduler(start_lr, warmup_iteration, *args, **kwargs):\n    opts = get_config()\n    setattr(opts, \"scheduler.max_iterations\", 100000)\n    setattr(opts, \"scheduler.name\", \"polynomial\")\n    num_iterations = getattr(opts, \"scheduler.max_iterations\", 100000)\n    num_batches = DATASET_SIZE // BATCH_SIZE\n    num_epochs = num_iterations // num_batches\n\n    # Test for iteration-based samplers\n    setattr(opts, \"scheduler.is_iteration_based\", True)\n    setattr(opts, \"scheduler.warmup_iterations\", warmup_iteration)\n    end_lr = round(start_lr / random.randint(2, 10), 5)\n    setattr(opts, \"scheduler.polynomial.start_lr\", start_lr)\n    setattr(opts, \"scheduler.polynomial.end_lr\", end_lr)\n    scheduler = build_scheduler(opts)\n    lr = run_test(scheduler=scheduler, num_epochs=num_epochs, num_batches=num_batches)\n    np.testing.assert_allclose(end_lr, lr, atol=LR_TOLERANCE)\n\n    # Test for epoch-based samplers\n    setattr(opts, \"scheduler.is_iteration_based\", False)\n    setattr(opts, \"scheduler.max_epochs\", num_epochs)\n    setattr(opts, \"scheduler.adjust_period_for_epochs\", True)\n    setattr(opts, \"scheduler.warmup_iterations\", warmup_iteration)\n    end_lr = round(start_lr / random.randint(2, 10), 5)\n    setattr(opts, \"scheduler.polynomial.start_lr\", start_lr)\n    setattr(opts, \"scheduler.polynomial.end_lr\", end_lr)\n    scheduler = build_scheduler(opts)\n    lr = run_test(scheduler=scheduler, num_epochs=num_epochs, num_batches=num_batches)\n\n    np.testing.assert_allclose(end_lr, lr, atol=LR_TOLERANCE)\n\n\n@pytest.mark.parametrize(\"start_lr\", MAX_LRS)\n@pytest.mark.parametrize(\"warmup_iteration\", WARMUP_ITERATIONS)\ndef test_cosine_scheduler(start_lr, warmup_iteration, *args, **kwargs):\n    opts = get_config()\n    setattr(opts, \"scheduler.max_iterations\", 100000)\n    setattr(opts, \"scheduler.name\", \"cosine\")\n\n    num_iterations = getattr(opts, \"scheduler.max_iterations\", 100000)\n    num_batches = DATASET_SIZE // BATCH_SIZE\n    num_epochs = num_iterations // num_batches\n\n    # first test for iteration-based samplers\n    setattr(opts, \"scheduler.is_iteration_based\", True)\n    setattr(opts, \"scheduler.warmup_iterations\", warmup_iteration)\n    end_lr = round(start_lr / random.randint(2, 10), 5)\n    setattr(opts, \"scheduler.cosine.max_lr\", start_lr)\n    setattr(opts, \"scheduler.cosine.min_lr\", end_lr)\n    scheduler = build_scheduler(opts)\n    lr = run_test(scheduler=scheduler, num_epochs=num_epochs, num_batches=num_batches)\n    np.testing.assert_allclose(end_lr, lr, atol=LR_TOLERANCE)\n\n    # Test for epoch-based samplers\n    setattr(opts, \"scheduler.is_iteration_based\", False)\n    setattr(opts, \"scheduler.max_epochs\", num_epochs)\n    setattr(opts, \"scheduler.adjust_period_for_epochs\", True)\n    setattr(opts, \"scheduler.warmup_iterations\", warmup_iteration)\n    end_lr = round(start_lr / random.randint(2, 10), 5)\n    setattr(opts, \"scheduler.cosine.max_lr\", start_lr)\n    setattr(opts, \"scheduler.cosine.min_lr\", end_lr)\n    scheduler = build_scheduler(opts)\n    lr = run_test(scheduler=scheduler, num_epochs=num_epochs, num_batches=num_batches)\n    np.testing.assert_allclose(end_lr, lr, atol=LR_TOLERANCE)\n\n\n@pytest.mark.parametrize(\"start_lr\", MAX_LRS)\n@pytest.mark.parametrize(\"warmup_iteration\", WARMUP_ITERATIONS)\ndef test_fixed_scheduler(start_lr, warmup_iteration, *args, **kwargs):\n    opts = get_config()\n    setattr(opts, \"scheduler.max_iterations\", 100000)\n    setattr(opts, \"scheduler.name\", \"fixed\")\n\n    num_iterations = getattr(opts, \"scheduler.max_iterations\", 100000)\n    num_batches = DATASET_SIZE // BATCH_SIZE\n    num_epochs = num_iterations // num_batches\n\n    # Test for iteration-based samplers\n    setattr(opts, \"scheduler.is_iteration_based\", True)\n    setattr(opts, \"scheduler.warmup_iterations\", warmup_iteration)\n    setattr(opts, \"scheduler.fixed.lr\", start_lr)\n    scheduler = build_scheduler(opts)\n    lr = run_test(scheduler=scheduler, num_epochs=num_epochs, num_batches=num_batches)\n    np.testing.assert_allclose(start_lr, lr, atol=LR_TOLERANCE)\n\n    # Test for epoch-based samplers\n    setattr(opts, \"scheduler.is_iteration_based\", False)\n    setattr(opts, \"scheduler.max_epochs\", num_epochs)\n    setattr(opts, \"scheduler.adjust_period_for_epochs\", True)\n    setattr(opts, \"scheduler.warmup_iterations\", warmup_iteration)\n    setattr(opts, \"scheduler.fixed.lr\", start_lr)\n    scheduler = build_scheduler(opts)\n    lr = run_test(scheduler=scheduler, num_epochs=num_epochs, num_batches=num_batches)\n    np.testing.assert_allclose(start_lr, lr, atol=LR_TOLERANCE)\n"
  },
  {
    "path": "tests/options/__init__.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n"
  },
  {
    "path": "tests/options/test_parse_args.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\nimport argparse\nfrom typing import Any, Dict, List, Tuple, Union\n\nimport pytest\n\nfrom corenet.options.parse_args import JsonValidator\n\n\n@pytest.mark.parametrize(\n    \"expected_type,valid,valid_parsed,invalid\",\n    [\n        (None, \"null\", None, \"1\"),\n        (int, \"1\", 1, \"1.0\"),\n        (float, \"1.0\", 1.0, '\"1\"'),\n        (float, \"1\", 1.0, \"s\"),\n        (bool, \"true\", True, \"null\"),\n        (List[int], \"[1, 2,3]\", [1, 2, 3], \"{1: 2}\"),\n        (List[int], \"[]\", [], '[\"s\"]'),\n        (Tuple[int, int], \"[1, 2]\", (1, 2), \"[1, 2, 3]\"),\n        (Dict[str, Tuple[int, float]], '{\"x\": [1, 2]}', {\"x\": (1, 2.0)}, '{\"x\": \"y\"}'),\n        (Union[Tuple[int, Any], int], \"[1,null]\", (1, None), \"[null,1]\"),\n        (Union[Tuple[int, int], int], \"1\", 1, '\"1\"'),\n    ],\n)\ndef test_json_validator(\n    expected_type: type, valid: str, valid_parsed: Any, invalid: str\n):\n    parser = argparse.ArgumentParser()\n    parser.add_argument(\"--x\", type=JsonValidator(expected_type))\n\n    class ArgparseFailure(Exception):\n        pass\n\n    def _exit(status, message):\n        raise ArgparseFailure(f\"Unexpected argparse failure: {message}\")\n\n    parser.exit = (\n        _exit  # override exit to raise exception, rather than invoking sys.exit()\n    )\n\n    opts = parser.parse_args([f\"--x={valid}\"])\n    assert opts.x == valid_parsed\n    assert repr(opts.x) == repr(valid_parsed)  # check types\n\n    with pytest.raises(ArgparseFailure):\n        parser.parse_args([f\"--x={invalid}\"])\n"
  },
  {
    "path": "tests/options/test_utils.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\nfrom pathlib import Path\n\nimport pytest\n\nfrom tests.configs import get_config\n\n\ndef test_load_config_file_produces_no_false_warnings() -> None:\n    get_config()\n\n\ndef test_load_config_file_produces_true_warning(\n    tmp_path: Path,\n) -> None:\n    config_path = tmp_path.joinpath(\"config.yaml\")\n    config_path.write_text(\"an_invalid_key: 2\")\n    with pytest.raises(ValueError, match=\"an_invalid_key\"):\n        get_config(str(config_path))\n"
  },
  {
    "path": "tests/test_conventions.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\nimport dataclasses\nimport os\nimport re\nimport shutil\nimport subprocess\nfrom ast import Attribute, Call, Constant, Import, ImportFrom, Name, NodeVisitor, parse\nfrom pathlib import Path\nfrom typing import Any, Callable, List\n\nimport pytest\n\n\nclass CodeConventionError(Exception):\n    pass\n\n\nclass CheckConventionsVisitor(NodeVisitor):\n    def __init__(self, filename: str, *args, **kwargs) -> None:\n        self.filename = filename\n        super().__init__(*args, **kwargs)\n\n    def visit_Import(self, node: Import) -> Any:\n        if not self.filename.startswith(\"experimental\"):\n            for alias in node.names:\n                if alias.name.startswith(\"experimental\"):\n                    raise CodeConventionError(\n                        f\"Non-experimental module {self.filename} should not import\"\n                        f\" experimental module {alias.name}.\"\n                    )\n\n        return self.generic_visit(node)  # visit children\n\n    def visit_ImportFrom(self, node: ImportFrom) -> Any:\n        if not self.filename.startswith(\"experimental\"):\n            if node.module.startswith(\"experimental\"):\n                raise CodeConventionError(\n                    f\"Non-experimental module {self.filename} should not import\"\n                    f\" experimental module {node.module}.\"\n                )\n\n        return self.generic_visit(node)  # visit children\n\n    def visit_Call(self, node: Call) -> Any:\n        if (\n            isinstance(node.func, Name)\n            and node.func.id in (\"getattr\", \"setattr\")\n            and len(node.args) >= 2\n            and isinstance(node.args[0], Name)\n            and \"opts\" in node.args[0].id\n            and isinstance(node.args[1], Constant)\n            and isinstance(node.args[1].value, str)\n            and \"-\" in node.args[1].value\n        ):\n            raise CodeConventionError(\n                f\"{self.filename}:{node.lineno} Please replace '-' with '_' in {node.func.id}() invocations.\"\n            )\n\n        if (\n            isinstance(node.func, Attribute)\n            and node.func.attr == \"add_argument\"\n            and len(node.args) >= 1\n            and isinstance(node.args[0], Constant)\n            and isinstance(node.args[0].value, str)\n            and node.args[0].value.startswith(\"--\")\n            and \"_\" in node.args[0].value\n        ):\n            raise CodeConventionError(\n                f\"{self.filename}:{node.lineno} Please replace '_' with '-' in add_argument() invocations.\"\n            )\n\n        return self.generic_visit(node)  # visit children\n\n\n@pytest.mark.parametrize(\n    \"line,error\",\n    [\n        (\"getattr(opts, 'x_y')\", None),\n        (\"setattr(opts, 'x_y', None)\", None),\n        (\"parser.add_argument('--x-y')\", None),\n        (\"group.add_argument('--x-y')\", None),\n        (\n            \"getattr(opts, 'x-y')\",\n            \"Please replace '-' with '_' in getattr() invocations.\",\n        ),\n        (\n            \"setattr(opts, 'x-y')\",\n            \"Please replace '-' with '_' in setattr() invocations.\",\n        ),\n        (\n            \"parser.add_argument('--x_y')\",\n            \"Please replace '_' with '-' in add_argument() invocations.\",\n        ),\n        (\n            \"group.add_argument('--x_y')\",\n            \"Please replace '_' with '-' in add_argument() invocations.\",\n        ),\n    ],\n)\ndef test_validator(line: str, error: str) -> None:\n    ast = parse(\n        f\"\"\"\nimport argparse\nparser = argparse.ArgumentParser()\ngroup = parser.add_argument_group()\nopts = parser.parse_args([])\n{line}\n\"\"\"\n    )\n    validator = CheckConventionsVisitor(filename=\"dummy-file\")\n\n    if error is None:\n        validator.visit(ast)\n        return\n\n    with pytest.raises(CodeConventionError) as excinfo:\n        validator.visit(ast)\n\n    assert error in str(\n        excinfo.value\n    ), f\"Expected {line} to raise CodeConventionError({error}) but it didn't.\"\n\n\ndef get_python_filenames() -> List[str]:\n    result = (\n        subprocess.check_output(\n            # `git ls-files` returns list of file names tracked by git\n            # `git ls-files --others --exclude-standard` returns list of files neither tracked nor ignored by git\n            \"(git ls-files; git ls-files --others --exclude-standard) | grep '.py$'\",\n            shell=True,\n            universal_newlines=True,\n        )\n        .strip()\n        .splitlines(keepends=False)\n    )\n    return [file for file in result if os.path.exists(file)]\n\n\ndef test_python_filenames():\n    filenames = get_python_filenames()\n    assert len(filenames) > 10\n    for filename in filenames:\n        assert filename.endswith(\".py\"), f\"filename={filename} should end with .py\"\n\n\n@dataclasses.dataclass\nclass ForbiddenRegex:\n    regex: str\n    handler: Callable[[str], str]\n    exclude_dirs: List[str] = dataclasses.field(default_factory=list)\n\n\n@pytest.mark.parametrize(\"filename\", get_python_filenames())\ndef test_validate_python_files(filename: str) -> None:\n    if __file__.endswith(filename):\n        return  # errors in the current file are intentional\n\n    source = Path(filename).read_text()\n\n    forbidden_regexes = [\n        ForbiddenRegex(\n            regex=r\"collate[-_\\w]+eval|eval[-_\\w]+collate|dataset[-_\\w]+eval|eval[-_\\w]+dataset\",\n            handler=lambda match: f\"To follow the standard train/val/test dataset splitting terminology, please rename \"\n            f\"'{match}' to either '{match.replace('eval', 'test')}' \"\n            f\"or '{match.replace('eval', 'val')}'.\",\n        ),\n        ForbiddenRegex(\n            regex=r\"from \\.|import \\.\",\n            handler=lambda match: f\"Please use absolute imports instead of relative ones.\"\n            f\" For example: 'import .models' --> 'import corenet.modeling.models'. Problematic code: '{match}'.\",\n        ),\n        ForbiddenRegex(\n            regex=r\"class (ConvLayer|SeparableConv|TransposeConvLayer|ASPPConv|ASPPSeparableConv)\\b\",\n            handler=lambda match: f\"{match} is deprecated. Please remove it and use {match}2d.\",\n        ),\n        ForbiddenRegex(\n            regex=r\"setattr\\(opts.*model\\.segmentation\\.n_classes\",\n            handler=lambda match: f\"'{match},...)' is deprecated. Please set it in config.\",\n            exclude_dirs=[\"tests/\"],\n        ),\n    ]\n    forbidden_regexes = {f\"regex_{i}\": item for i, item in enumerate(forbidden_regexes)}\n\n    unified_regex = re.compile(\n        \"|\".join(\n            f\"(?P<{name}>{item.regex})\" for name, item in forbidden_regexes.items()\n        )\n    )\n\n    if not filename.endswith(\"test_conventions.py\"):\n        match = unified_regex.search(source)\n        if match:\n            for name, match in match.groupdict().items():\n                if not match:\n                    continue\n                for exclude_dir in forbidden_regexes[name].exclude_dirs:\n                    if filename.startswith(exclude_dir):\n                        break\n                else:\n                    message = forbidden_regexes[name].handler(match)\n                    raise CodeConventionError(f\"{message} File: {filename}.\")\n\n        ast = parse(source)\n        CheckConventionsVisitor(filename=filename).visit(ast)\n\n\ndef get_regular_filenames() -> List[str]:\n    # All regular text files\n    result = (\n        subprocess.check_output(\n            # lists all non-empty regular (no symlinks) text files:\n            \"git grep --cached -Il '' -- '*.yaml' '*.yml' '*.py' '*.txt' '*.md' '*.json'\",\n            shell=True,\n            universal_newlines=True,\n        )\n        .strip()\n        .splitlines(keepends=False)\n    )\n    return [file for file in result if os.path.exists(file)]\n\n\ndef test_regular_filenames():\n    filenames = get_regular_filenames()\n    assert len(filenames) > 10\n\n\n@pytest.mark.parametrize(\"filename\", get_regular_filenames())\ndef test_no_newline_before_EOF(filename: str) -> None:\n    source = Path(filename).read_text()\n    if source and source[-1] != \"\\n\":\n        raise CodeConventionError(\n            f\"Please add a new line at the end of regular files. File: {filename}\"\n        )\n\n\ndef test_packages_have_init() -> None:\n    expected_init_files = {\n        str(Path(f).parent / \"__init__.py\") for f in get_python_filenames()\n    }\n    expected_init_files = {\n        f for f in expected_init_files if not f.startswith(\"experimental/\")\n    }\n    missing_init_files = {f for f in expected_init_files if not Path(f).exists()}\n    missing_init_files -= {\"__init__.py\"}\n\n    if missing_init_files:\n        raise CodeConventionError(\n            \"Missing __init__.py files for the following python packages: \"\n            + str(missing_init_files)\n        )\n\n\ndef test_formatter_versions() -> None:\n    import black\n    import isort\n\n    constraints = Path(\"requirements.txt\").read_text()\n    (black_expected_version,) = re.findall(r\"black==\\d+.\\d+.\\d+\", constraints)\n    (isort_expected_version,) = re.findall(r\"isort==\\d+.\\d+.\\d+\", constraints)\n\n    assert black.__version__ == black_expected_version.split(\"==\")[1], (\n        f\"Expected {black_expected_version}, but got version\"\n        f\" {black.__version__} installed.\"\n    )\n\n    assert isort.__version__ == isort_expected_version.split(\"==\")[1], (\n        f\"Expected {isort_expected_version}, but got version\"\n        f\" {isort.__version__} installed.\"\n    )\n\n    requirements = Path(\"requirements.txt\").read_text()\n    assert black_expected_version in requirements, (\n        \"Please make sure the version of black in requirements.txt \"\n        \"matches the one installed on your system\"\n    )\n    assert isort_expected_version in requirements, (\n        \"Please make sure the version of isort in requirements.txt matches \"\n        \"the one installed on your system\"\n    )\n"
  },
  {
    "path": "tests/test_utils.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\nimport argparse\nimport re\nfrom typing import Tuple\n\nimport pytest\n\n\ndef unset_pretrained_models_from_opts(opts: argparse.Namespace) -> None:\n    \"\"\"Unset the argument corresponding to pretrained model path in opts during tests\"\"\"\n    opts_as_dict = vars(opts)\n    for k, v in opts_as_dict.items():\n        if is_pretrained_model_key(k):\n            setattr(opts, k, None)\n\n\ndef is_pretrained_model_key(key_name: str) -> bool:\n    \"\"\"Check if arguments corresponding to model have a pretrained key or not.\"\"\"\n    return True if re.search(r\".*model\\..*\\.pretrained$\", key_name) else False\n\n\n@pytest.mark.parametrize(\n    \"key_name_expected_output\",\n    [\n        (\"model.classification.pretrained\", True),\n        (\"model.segmentation.pretrained\", True),\n        (\"model.video_classification.pretrained\", True),\n        (\"teacher.model.classification.pretrained\", True),\n        (\"loss.classification.pretrained\", False),\n        (\"model.classification.pretrained_dummy\", False),\n        (\"model.classification.mypretrained\", False),\n        (\"model.classification.my.pretrained\", True),\n    ],\n)\ndef test_is_pretrained_model_key(key_name_expected_output: Tuple[str, bool]):\n    key_name = key_name_expected_output[0]\n    expected_output = key_name_expected_output[1]\n    assert is_pretrained_model_key(key_name) == expected_output\n"
  },
  {
    "path": "tests/transforms/__init__.py",
    "content": ""
  },
  {
    "path": "tests/transforms/test_audio.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\nimport copy\nimport os\nimport shutil\nimport tempfile\n\nimport pytest\nimport scipy.io.wavfile as wav\nimport torch\n\nfrom corenet.data.transforms.audio import (\n    AudioResample,\n    Gain,\n    GaussianAudioNoise,\n    LambdaAudio,\n    MFCCs,\n    Noise,\n    Roll,\n    SetFixedLength,\n    StandardizeChannels,\n)\nfrom tests.configs import get_config\n\n\ndef test_mfccs():\n    opts = get_config()\n\n    transform = MFCCs(opts)\n    num_frames = transform.num_frames\n    assert num_frames == 8\n    num_mfccs = transform.num_mfccs\n    assert num_mfccs == 20\n    N, C, fps = 10, 2, 41000\n    audio_length = 1  # seconds\n\n    audio = torch.rand(N, audio_length * fps, C)\n    data = {\n        \"samples\": {\n            \"audio\": audio,\n            \"metadata\": {\n                \"audio_fps\": fps,\n            },\n        }\n    }\n    result = transform(data)\n    expected_frame_length = 11  # depends on num_frames, fps, audio_length\n    assert result[\"samples\"][\"audio\"].shape == (\n        N,\n        C,\n        num_mfccs,\n        num_frames,\n        expected_frame_length,\n    )\n\n\ndef test_lambda_audio() -> None:\n    opts = get_config()\n\n    input = {\n        \"samples\": {\n            \"audio\": torch.rand(\n                2, 5, 1, 7\n            ),  # arbitrary number of dimensions of arbitrary lengths\n            \"xyz\": torch.rand(3, 9),  # arbitrary key, value\n        },\n        \"targets\": {\n            \"xyz2\": torch.rand(4, 8),  # arbitrary key, value\n        },\n    }\n\n    func = lambda x: (x + 1) * 2\n    output = LambdaAudio(opts, func)(copy.deepcopy(input))\n\n    nested_key_names = lambda dict_: {key: value.keys() for key, value in dict_.items()}\n    assert nested_key_names(input) == nested_key_names(output)\n\n    assert torch.allclose(output[\"samples\"][\"audio\"], func(input[\"samples\"][\"audio\"]))\n    assert torch.allclose(output[\"samples\"][\"xyz\"], input[\"samples\"][\"xyz\"])\n    assert torch.allclose(output[\"targets\"][\"xyz2\"], input[\"targets\"][\"xyz2\"])\n\n\n@pytest.mark.parametrize(\"length\", [2, 3, 4])\ndef test_set_fixed_length(length: int) -> None:\n    opts = get_config()\n    setattr(opts, \"audio_augmentation.set_fixed_length.length\", length)\n    transform = SetFixedLength(opts)\n\n    C, N = 2, 8\n\n    x = {\"samples\": {\"audio\": torch.rand(C, N)}}\n\n    output = transform(x)\n    assert output[\"samples\"][\"audio\"].shape == (C, length)\n\n\n@pytest.mark.parametrize(\"window\", [0.5, 0.7])\ndef test_roll(window: float) -> None:\n    torch.manual_seed(0)\n    opts = get_config()\n    setattr(opts, \"audio_augmentation.roll.window\", window)\n    transform = Roll(opts)\n\n    C, N = 2, 20\n\n    audio = torch.arange(C * N).view(C, N)\n    x = {\"samples\": {\"audio\": audio.clone()}}\n\n    output = transform(x)[\"samples\"][\"audio\"]\n    # The first parameter won't change (unless we are unlucky and the \"roll\"\n    # parameter is 0). That's why we fix the seed above.\n    assert output[0, 0] != audio[0, 0]\n    # Make sure the first channel is just a shifted version of the original audio.\n    assert torch.all((output[0] - output[0, 0]) % output.shape[1] == audio[0])\n\n    # Make sure the second channel has the same shift as the first.\n    assert torch.all((output[0] - output[0, 0]) == (output[1] - (output[1, 0])))\n\n\ndef test_audio_resample() -> None:\n    opts = get_config()\n    num_clips = 2\n    num_samples = 32\n    original_fps = 32\n    new_fps = 8\n    num_channels = 2\n\n    setattr(opts, \"audio_augmentation.audio_resample.audio_fps\", new_fps)\n    resample = AudioResample(opts)\n    samples = {\n        \"audio\": torch.arange(num_clips * num_samples * num_channels)\n        .float()\n        .view(num_clips, num_samples, num_channels),\n        \"metadata\": {\"audio_fps\": original_fps},\n    }\n\n    new_data = resample({\"samples\": samples})\n    assert new_data[\"samples\"][\"audio\"].shape == (\n        num_clips,\n        new_fps,\n        num_channels,\n    )\n    assert new_data[\"samples\"][\"metadata\"][\"audio_fps\"] == new_fps\n\n\n@pytest.mark.parametrize(\n    \"in_channels, out_channels\",\n    [\n        (1, 1),\n        (1, 2),\n        (2, 1),\n        (2, 2),\n    ],\n)\ndef test_standardize_channels(in_channels: int, out_channels: int):\n    opts = get_config()\n    setattr(opts, \"audio_augmentation.standardize_channels.enable\", True)\n    setattr(\n        opts,\n        \"audio_augmentation.standardize_channels.num_channels\",\n        out_channels,\n    )\n\n    N, T = 2, 5\n    data = {\"samples\": {\"audio\": torch.rand(N, T, in_channels)}}\n    data = StandardizeChannels(opts)(data)\n    assert data[\"samples\"][\"audio\"].shape == (N, T, out_channels)\n\n\n@pytest.mark.parametrize(\"share_clip_params\", [True, False])\ndef test_gain(share_clip_params):\n    opts = get_config()\n    gain_db = -20\n    setattr(opts, \"audio_augmentation.gain.levels\", [gain_db])\n    setattr(opts, \"audio_augmentation.gain.share_clip_params\", share_clip_params)\n    augmenter = Gain(opts)\n    # Dummy audio are between [-1, 1].\n    dummy_audio = 2 * (torch.rand((1, 16000)) - 0.5)\n    dummy_audio = dummy_audio.float()\n    data = {\n        \"samples\": {\"audio\": dummy_audio},\n        \"metadata\": {\"audio_fps\": 16000},\n    }\n    augmented = augmenter(data)\n    assert data[\"samples\"][\"audio\"].shape == augmented[\"samples\"][\"audio\"].shape\n    assert (\n        augmented[\"samples\"][\"audio\"] != dummy_audio\n    ).float().sum() > 0.99 * dummy_audio.numel()\n    assert (\n        torch.abs(\n            (augmented[\"samples\"][\"audio\"] / dummy_audio).float().sum()\n            - 10 ** (gain_db / 20) * dummy_audio.numel()\n        )\n        < 0.001\n    )\n\n\n@pytest.mark.parametrize(\n    \"audio_channels, audio_length, noise_length\",\n    [\n        (1, 16000, 16000),  # perfect training case\n        (2, 16000, 16000),  # multichannel input audio\n        (2, 10000, 16000),  # input audio length < noise length\n        (2, 16000, 10000),  # input audio length > noise length\n    ],\n)\ndef test_noise_augmentation(audio_channels, audio_length, noise_length):\n    try:\n        opts = get_config()\n        setattr(opts, \"audio_augmentation.noise.levels\", [-32])\n        setattr(opts, \"audio_augmentation.noise.cache_size\", 1)\n        setattr(opts, \"audio_augmentation.noise.refresh_freq\", 1)\n        noise_file_dir = tempfile.mkdtemp()\n        setattr(\n            opts,\n            \"audio_augmentation.noise.files_dir\",\n            noise_file_dir,\n        )\n        dummy_noise = ((torch.rand((noise_length, 1)) - 0.5) * 2).numpy()\n        wav.write(\n            os.path.join(noise_file_dir, \"noise_sample1.wav\"),\n            data=dummy_noise,\n            rate=16000,\n        )\n        augmenter = Noise(opts)\n        dummy_audio = (torch.rand((audio_channels, audio_length)) - 0.5) * 2\n        data = {\n            \"samples\": {\"audio\": dummy_audio},\n            \"metadata\": {\"audio_fps\": 16000},\n        }\n        augmented = augmenter(data)\n        assert data[\"samples\"][\"audio\"].shape == augmented[\"samples\"][\"audio\"].shape\n        assert (\n            augmented[\"samples\"][\"audio\"] != dummy_audio\n        ).float().sum() > 0.99 * dummy_audio.numel()\n    finally:\n        shutil.rmtree(noise_file_dir)\n\n\ndef test_no_noise_augmentation():\n    # When noise.files_dir is None\n    with pytest.raises(ValueError):\n        opts = get_config()\n        setattr(opts, \"audio_augmentation.noise.levels\", [-32])\n        setattr(opts, \"audio_augmentation.noise.cache_size\", 1)\n        setattr(opts, \"audio_augmentation.noise.refresh_freq\", 1)\n        setattr(\n            opts,\n            \"audio_augmentation.noise.files_dir\",\n            None,\n        )\n        augmenter = Noise(opts)\n        dummy_audio = (torch.rand(-16000, 16000, (2, 32000)) - 0.5) * 2\n        data = {\n            \"samples\": {\"audio\": dummy_audio.clone()},\n            \"metadata\": {\"audio_fps\": 16000},\n        }\n        output = augmenter(data)\n        assert torch.all(output == dummy_audio)\n\n\ndef test_gaussian_noise_augmentation():\n    opts = get_config()\n    torch.random.manual_seed(1234)\n    scale_range = (0.001, 0.005)\n    setattr(\n        opts,\n        \"audio_augmentation.gaussian_noise.audio_noise_scale_range\",\n        scale_range,\n    )\n    augmenter = GaussianAudioNoise(opts)\n    dummy_audio = (\n        2 * torch.rand((1, 16000, 1), dtype=torch.float32) - 1\n    )  # Values between -1 and 1\n    original_audio = copy.deepcopy(dummy_audio)\n    data = {\"samples\": {\"audio\": dummy_audio}}\n    augmented = augmenter(data)[\"samples\"][\"audio\"]\n    delta = augmented - original_audio\n    assert scale_range[0] < delta.std() <= scale_range[1]\n"
  },
  {
    "path": "tests/transforms/test_audio_bytes.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\n\nimport pytest\nimport torch\n\nfrom corenet.data.transforms import audio_bytes\n\n\n@pytest.mark.parametrize(\n    \"format,encoding_dtype,num_samples,expected_length\",\n    [\n        (\"wav\", \"float32\", 4, 74),\n        (\"wav\", \"float32\", 8, 90),\n        (\"wav\", \"int32\", 8, 112),\n        (\"wav\", \"int16\", 8, 60),\n        (\"wav\", \"uint8\", 8, 52),\n        (\"mp3\", None, 8, 216),\n    ],\n)\ndef test_audio_save(format, encoding_dtype, num_samples, expected_length) -> None:\n    opts = argparse.Namespace()\n    setattr(opts, \"audio_augmentation.torchaudio_save.encoding_dtype\", encoding_dtype)\n    setattr(opts, \"audio_augmentation.torchaudio_save.format\", format)\n    setattr(opts, \"audio_augmentation.torchaudio_save.backend\", \"sox\")\n    t = audio_bytes.TorchaudioSave(opts)\n\n    x = {\n        \"samples\": {\"audio\": torch.randn([2, num_samples])},\n        \"metadata\": {\"audio_fps\": 16},\n    }\n\n    outputs = t(x)[\"samples\"][\"audio\"]\n    assert torch.all(0 <= outputs)\n    assert torch.all(outputs <= 255)\n    assert outputs.shape == (expected_length,)\n"
  },
  {
    "path": "tests/transforms/test_image.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nimport random\nfrom typing import Tuple, Union\n\nimport pytest\nimport torch\nfrom PIL import Image\n\nfrom corenet.data.transforms import image_pil as pil_transforms\nfrom corenet.data.transforms import image_torch as torch_transforms\n\n\n@pytest.mark.parametrize(\n    \"height, width, size\",\n    [\n        (24, 24, 20),\n        (24, 24, 40),\n        (32, 32, [20, 50]),\n    ],\n)\ndef test_rrc_params(height: int, width: int, size: Union[int, Tuple[int, int]]) -> None:\n    # this function tests the RandomResizedCrop Params\n    parser = argparse.ArgumentParser()\n    parser = pil_transforms.RandomResizedCrop.add_arguments(parser)\n\n    opts = parser.parse_args([])\n\n    setattr(opts, \"image_augmentation.random_resized_crop.interpolation\", \"bilinear\")\n\n    # create dummy image\n    image = Image.new(\"RGB\", (height, width))\n\n    # This is adapted from torchvision\n    # https://github.com/pytorch/vision/blob/78ffda7eb952571df728e2ae49c2aca788596138/test/test_transforms.py#L308\n    epsilon = 0.05\n    min_scale = 0.25\n    scale_min = max(round(random.random(), 2), min_scale)\n    scale = (scale_min, scale_min + round(random.random(), 2))\n    aspect_min = max(round(random.random(), 2), epsilon)\n    aspect_ratio = (aspect_min, aspect_min + round(random.random(), 2))\n\n    setattr(opts, \"image_augmentation.random_resized_crop.scale\", scale)\n    setattr(opts, \"image_augmentation.random_resized_crop.aspect_ratio\", aspect_ratio)\n    random_resized_crop = pil_transforms.RandomResizedCrop(opts=opts, size=size)\n\n    i, j, h, w = random_resized_crop.get_rrc_params(image)\n\n    assert isinstance(i, int)\n    assert isinstance(j, int)\n    assert isinstance(h, int)\n    assert isinstance(w, int)\n\n    obtained_aspect_ratio = w / h\n    # expected aspect ratio should satisfy either of following conditions (within certain margin):\n    # 1. min(aspect_ratio) - e <= obtained_aspect_ratio <= max(aspect_ratio) + e\n    # 2. obtained_aspect_ratio = 1.\n    assert (\n        min(aspect_ratio) - epsilon\n        <= obtained_aspect_ratio\n        <= max(aspect_ratio) + epsilon\n    ) or (obtained_aspect_ratio == 1.0)\n\n\n@pytest.mark.parametrize(\n    \"alpha, p, sample_key, target_key, batch_size\",\n    [\n        (-1, -0.2, None, None, 0),\n        (-1, 0, None, None, 1),\n        # test for inputs in tensor as well as dict format\n        (-1, 0, \"dummy_key\", \"dummy_key\", 2),\n        (0.0, -0.2, None, None, 0),\n        (0.0, 0, \"dummy_key\", \"dummy_key\", 1),\n        (0.5, 0, None, None, 2),\n    ],\n)\ndef test_mixup_transform(\n    alpha: float, p: float, sample_key: str, target_key: str, batch_size: int\n) -> None:\n    # this function tests the Mixup transforms\n    parser = argparse.ArgumentParser()\n    parser = torch_transforms.RandomMixup.add_arguments(parser)\n\n    opts = parser.parse_args([])\n\n    num_classes = 10\n\n    setattr(opts, \"image_augmentation.mixup.alpha\", alpha)\n    setattr(opts, \"image_augmentation.mixup.p\", p)\n    setattr(opts, \"image_augmentation.mixup.sample_key\", sample_key)\n    setattr(opts, \"image_augmentation.mixup.target_key\", target_key)\n\n    # torch.roll works with batch size of 0. So, we expect to see the same shape as\n    # input when applying mixup transforms\n    img_tensor = torch.randn(size=(batch_size, 3, 8, 8))\n    label_tensor = torch.randint(low=0, high=num_classes, size=(batch_size,))\n\n    data = {\n        \"samples\": img_tensor if sample_key is None else {sample_key: img_tensor},\n        \"targets\": label_tensor if target_key is None else {target_key: label_tensor},\n    }\n\n    try:\n        transform = torch_transforms.RandomMixup(opts, num_classes=num_classes)\n        out = transform(data)\n        assert {\"samples\", \"targets\"}.issubset(list(out.keys()))\n        if sample_key is None:\n            assert out[\"samples\"].shape == img_tensor.shape\n        else:\n            assert out[\"samples\"][sample_key].shape == img_tensor.shape\n        if target_key is None:\n            assert out[\"targets\"].shape == label_tensor.shape\n        else:\n            assert out[\"targets\"][target_key].shape == label_tensor.shape\n    except AssertionError as e:\n        if str(e) == \"Alpha param can't be zero\":\n            pytest.skip(str(e))\n        elif (\n            str(e)\n            == \"Mixup probability should be between 0 and 1, where 1 is inclusive\"\n        ):\n            pytest.skip(str(e))\n\n\n@pytest.mark.parametrize(\n    \"alpha, p, sample_key, target_key, batch_size\",\n    [\n        (-1, -0.2, None, None, 0),\n        (-1, 0, None, None, 1),\n        # test for inputs in tensor as well as dict format\n        (-1, 0, \"dummy_key\", \"dummy_key\", 2),\n        (0.0, -0.2, None, None, 0),\n        (0.0, 0, \"dummy_key\", \"dummy_key\", 1),\n        (0.5, 0, None, None, 2),\n    ],\n)\ndef test_cutmix_transform(\n    alpha: float, p: float, sample_key: str, target_key: str, batch_size: int\n) -> None:\n    # this function tests the Cutmix transforms\n    parser = argparse.ArgumentParser()\n    parser = torch_transforms.RandomCutmix.add_arguments(parser)\n\n    opts = parser.parse_args([])\n\n    num_classes = 10\n\n    setattr(opts, \"image_augmentation.cutmix.alpha\", alpha)\n    setattr(opts, \"image_augmentation.cutmix.p\", p)\n    setattr(opts, \"image_augmentation.cutmix.sample_key\", sample_key)\n    setattr(opts, \"image_augmentation.cutmix.target_key\", target_key)\n\n    # torch.roll works with batch size of 0. So, we expect to see the same shape as\n    # input when applying mixup transforms\n    img_tensor = torch.randn(size=(batch_size, 3, 8, 8))\n    label_tensor = torch.randint(low=0, high=num_classes, size=(batch_size,))\n\n    data = {\n        \"samples\": img_tensor if sample_key is None else {sample_key: img_tensor},\n        \"targets\": label_tensor if target_key is None else {target_key: label_tensor},\n    }\n\n    try:\n        transform = torch_transforms.RandomCutmix(opts, num_classes=num_classes)\n        out = transform(data)\n        assert {\"samples\", \"targets\"}.issubset(list(out.keys()))\n        if sample_key is None:\n            assert out[\"samples\"].shape == img_tensor.shape\n        else:\n            assert out[\"samples\"][sample_key].shape == img_tensor.shape\n        if target_key is None:\n            assert out[\"targets\"].shape == label_tensor.shape\n        else:\n            assert out[\"targets\"][target_key].shape == label_tensor.shape\n    except AssertionError as e:\n        if str(e) == \"Alpha param can't be zero\":\n            pytest.skip(str(e))\n        elif (\n            str(e)\n            == \"Cutmix probability should be between 0 and 1, where 1 is inclusive\"\n        ):\n            pytest.skip(str(e))\n\n\n@pytest.mark.parametrize(\"enable\", [True, False])\n@pytest.mark.parametrize(\"mean\", [1, [1, 1, 1]])\n@pytest.mark.parametrize(\"std\", [1, [1, 1, 1]])\ndef test_to_tensor_normalization(\n    enable: bool, mean: Union[int, list], std: Union[int, list]\n) -> None:\n    \"\"\"\n    This function tests the ToTensor transform with and without mean/std normalization when the mean and std\n    are either floats or lists.\n    \"\"\"\n    C, H, W = 3, 2, 2\n\n    parser = argparse.ArgumentParser()\n    parser = pil_transforms.ToTensor.add_arguments(parser)\n\n    opts = parser.parse_args([])\n    setattr(opts, \"image_augmentation.to_tensor.mean_std_normalization.enable\", enable)\n    setattr(opts, \"image_augmentation.to_tensor.mean_std_normalization.mean\", mean)\n    setattr(opts, \"image_augmentation.to_tensor.mean_std_normalization.std\", std)\n    setattr(opts, \"image_augmentation.to_tensor.dtype\", \"uint8\")\n\n    to_tensor = pil_transforms.ToTensor(opts=opts)\n\n    x = torch.ones(1, C, H, W)\n    x = x.float()\n    data = {\n        \"image\": x,\n    }\n\n    y = to_tensor(data)[\"image\"]\n    z = torch.zeros(1, C, H, W) if enable else x\n\n    assert torch.equal(z, y)\n\n\ndef test_to_tensor_normalization_no_mean_std() -> None:\n    \"\"\"\n    This function tests the ToTensor transform when men/std normalization is enabled, but the mean/std are not provided\n    \"\"\"\n    parser = argparse.ArgumentParser()\n    parser = pil_transforms.ToTensor.add_arguments(parser)\n\n    opts = parser.parse_args([])\n    setattr(opts, \"image_augmentation.to_tensor.mean_std_normalization.enable\", True)\n\n    with pytest.raises(AssertionError):\n        pil_transforms.ToTensor(opts=opts)\n"
  },
  {
    "path": "tests/transforms/test_image_bytes.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nfrom typing import Tuple\n\nimport pytest\nimport torch\n\nfrom corenet.data.transforms import image_bytes\n\n\n@pytest.mark.parametrize(\n    \"file_encoding,quality,expected_shape\",\n    [\n        (\"fCHW\", None, 432),\n        (\"fHWC\", None, 432),\n        (\"TIFF\", None, 572),\n        (\"PNG\", None, 512),\n        (\"JPEG\", 100, 693),\n        (\"JPEG\", 50, 644),\n    ],\n)\ndef test_pil_save(file_encoding, quality, expected_shape) -> None:\n    opts = argparse.Namespace()\n    setattr(opts, \"image_augmentation.pil_save.file_encoding\", file_encoding)\n    setattr(opts, \"image_augmentation.pil_save.quality\", quality)\n\n    t = image_bytes.PILSave(opts)\n\n    C, H, W = 3, 12, 12\n    x = {\"samples\": torch.arange(C * H * W).view(C, H, W) / (C * H * W)}\n    out = t(x)[\"samples\"]\n    assert out.shape == (expected_shape,)\n\n\n@pytest.mark.parametrize(\n    \"mode,stride,window_size\",\n    [\n        (\"reverse\", 8, 4),\n        (\"random_shuffle\", 8, 4),\n        (\"cyclic_half_length\", 8, 4),\n        (\"stride\", 16, 8),\n        (\"window_shuffle\", 16, 8),\n    ],\n)\ndef test_shuffle_bytes(mode, stride, window_size) -> None:\n    opts = argparse.Namespace()\n    setattr(opts, \"image_augmentation.shuffle_bytes.mode\", mode)\n    setattr(opts, \"image_augmentation.shuffle_bytes.stride\", stride)\n    setattr(opts, \"image_augmentation.shuffle_bytes.window_size\", window_size)\n\n    t = image_bytes.ShuffleBytes(opts)\n\n    size = 32\n    samples = torch.randint(255, [size])\n    x = {\"samples\": samples.clone()}\n    out = t(x)[\"samples\"]\n    assert torch.any(samples != out)\n    assert samples.sum() == out.sum()  # checksum\n\n\n@pytest.mark.parametrize(\"keep_frac\", [1.0, 0.75, 0.50, 0.25])\ndef test_mask_positions(keep_frac) -> None:\n    opts = argparse.Namespace()\n    setattr(opts, \"image_augmentation.mask_positions.keep_frac\", keep_frac)\n    setattr(opts, \"dev.device\", \"cpu\")\n\n    t = image_bytes.MaskPositions(opts)\n\n    size = 32\n    samples = torch.randint(255, [size])\n    x = {\"samples\": samples.clone()}\n    out = t(x)[\"samples\"]\n    assert out.shape == (keep_frac * size,)\n\n\ndef test_byte_permutation() -> None:\n    opts = argparse.Namespace()\n\n    t = image_bytes.BytePermutation(opts)\n\n    size = 32\n    samples = torch.randint(255, [size])\n    x = {\"samples\": samples.clone()}\n    out = t(x)[\"samples\"]\n    assert out.shape == samples.shape\n    assert samples.unique().shape == out.unique().shape\n\n\n@pytest.mark.parametrize(\n    \"width_range\",\n    [\n        (0, 0),\n        (-1, 1),\n        (-5, 5),\n    ],\n)\ndef test_byte_permutation(width_range: Tuple[int, int]) -> None:\n    opts = argparse.Namespace()\n    setattr(opts, \"image_augmentation.random_uniform.width_range\", width_range)\n\n    t = image_bytes.RandomUniformNoise(opts)\n\n    size = 32\n    samples = torch.randint(255, [size])\n    x = {\"samples\": samples.clone()}\n    out = t(x)[\"samples\"]\n    assert samples.shape == out.shape\n\n    if width_range == (0, 0):\n        assert torch.all(samples == out)\n    else:\n        assert torch.any(samples != out)\n"
  },
  {
    "path": "tests/transforms/test_video.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\nimport operator\nimport os\nimport random\nfrom pathlib import Path\nfrom typing import Dict, Optional, Tuple\n\nimport pytest\nimport torch\n\nfrom corenet.data.transforms.base_transforms import BaseTransformation\nfrom corenet.data.transforms.video import (\n    CropByBoundingBox,\n    SaveInputs,\n    ShuffleAudios,\n    _resize_fn,\n)\nfrom corenet.data.video_reader.pyav_reader import PyAVReader\nfrom tests.configs import get_config\n\n\ndef test_resize_fn() -> None:\n    bs = 2\n    sz = (10, 8)\n    c = 3\n    t = 4\n    new_sz = (6, 4)\n    data = {\n        \"samples\": {\n            \"video\": torch.randn(bs, t, c, *sz),\n            \"mask\": torch.rand(bs, t, *sz),\n        }\n    }\n    new_data = _resize_fn(data, size=new_sz)\n    video = data[\"samples\"][\"video\"]\n    mask = data[\"samples\"][\"mask\"]\n    assert video.shape == (bs, t, c, *new_sz)\n    assert mask.shape == (bs, t, *new_sz)\n\n\ndef _non_zero_values_bounds(x: torch.Tensor) -> Tuple[float, float]:\n    \"\"\"\n    Returns the min and max of the non-zero values in a tensor.\n    \"\"\"\n    x = x.ravel()\n    x = x[x != 0]\n    return x.min().item(), x.max().item()\n\n\n@pytest.mark.parametrize(\"is_training\", [True, False])\n@pytest.mark.parametrize(\"multiplier_range\", [(1.3, 1.5), None])\ndef test_crop_by_bounding_box(\n    is_training: bool, multiplier_range: Optional[Tuple[float, float]]\n) -> None:\n    opts = get_config()\n    image_size = (10, 10)\n    setattr(opts, \"video_augmentation.crop_by_bounding_box.image_size\", image_size)\n    setattr(opts, \"video_augmentation.crop_by_bounding_box.multiplier\", 1.4)\n    # Set interpolation to \"nearest\", so that we can compare some of the pixel values.\n    setattr(opts, \"video_augmentation.crop_by_bounding_box.interpolation\", \"nearest\")\n    setattr(\n        opts,\n        \"video_augmentation.crop_by_bounding_box.multiplier_range\",\n        multiplier_range,\n    )\n    transform = CropByBoundingBox(opts, is_training=is_training)\n\n    N, T, C, H, W = 2, 5, 3, 32, 32\n\n    video = torch.rand(N, T, C, H, W)\n    box_coordinates = torch.concat(\n        [\n            torch.rand(N, T, 2) * 0.5,\n            torch.rand(N, T, 2) * 0.5 + 0.5,\n        ],\n        dim=2,\n    )\n\n    MAX_VAL = 255\n    y, x = torch.meshgrid(\n        torch.linspace(1, MAX_VAL, H), torch.linspace(1, MAX_VAL, W), indexing=\"ij\"\n    )\n    video[0, 0, 0, :, :] = y\n    video[0, 0, 1, :, :] = x\n\n    # The bounding box is a small horizontal strip at the bottom of the image.\n    # Later, we have some assertions for the original x and y values of the cropped\n    # pixels. We assert that the expanded box exceeds horizontal boundaries of the\n    # image, but not the vertical ones. Hence, the bounding box shouldn't be too close\n    # to the bottom edge, so that the expanded box remains within the bottom boundary.\n    box_coordinates[0, 0, :] = torch.tensor([0, 0.7, 1, 0.8])\n\n    visible_frame_mask = torch.ones(N, T, dtype=torch.bool)\n    # There are two kinds of invisible/invalid bounding boxes:\n    # 1) When the bounding box has x0 == y0 == x1 == y1 == -1 coordinates.\n    # 2) When the bounding box has valid coordinates but the area is too small (< 5 pixels).\n    invisible_frame_1_index = (0, 3)  # An arbitrary [0<clip<N, 0<frame<T] index pair.\n    box_coordinates[invisible_frame_1_index][:] = -1\n    visible_frame_mask[invisible_frame_1_index] = 0\n    invisible_frame_2_index = (1, 2)  # An arbitrary [0<clip<N, 0<frame<T] index pair.\n    box_coordinates[invisible_frame_2_index][:] = torch.tensor([0, 0, 1e-5, 1e-5])\n    visible_frame_mask[invisible_frame_2_index] = 0\n\n    data = {\n        \"samples\": {\n            \"video\": video,\n        },\n        \"targets\": {\n            \"traces\": {\n                \"a_uuid\": {\n                    \"box_coordinates\": box_coordinates,\n                }\n            }\n        },\n    }\n\n    result = transform(data)\n    assert isinstance(result, dict), f\"{type(result)} != dict\"\n    result_video = result[\"samples\"][\"video\"]\n    assert result_video.shape == (N, T, C, *image_size)\n    assert torch.all(\n        result_video[~visible_frame_mask] == 0.0\n    ), \"Frames with invisible bounding boxes should be blacked out.\"\n\n    result_box_coordinates = result[\"targets\"][\"traces\"][\"a_uuid\"][\"box_coordinates\"]\n    assert result_box_coordinates.shape == (N, T, 4)\n    assert torch.all(result_box_coordinates[~visible_frame_mask] == -1)\n    assert torch.all(0 < result_box_coordinates[:, :, :2][visible_frame_mask])\n    assert torch.all(result_box_coordinates[:, :, 2:][visible_frame_mask] < 1)\n    max_coord_threshold = (\n        (1 - 1 / multiplier_range[1]) / 2\n        if is_training and multiplier_range is not None\n        else (transform.multiplier - 1) / 2\n    )\n    assert torch.all(\n        result_box_coordinates[:, :, :2][visible_frame_mask] <= max_coord_threshold\n    )\n    assert torch.all(\n        1 - max_coord_threshold < result_box_coordinates[:, :, 2:][visible_frame_mask]\n    )\n\n    # Since the bounding box was aligned with the right and left edges of the image,\n    # we should observe 0 values in the right and left edges of the cropped image,\n    # as a result of expansion.\n    assert torch.all(result_video[0, 0, 0, :, 0] == 0)\n    assert torch.all(result_video[0, 0, 0, :, -1] == 0)\n    # but not on the top and bottom edges\n    assert torch.all(result_video[0, 0, 0, 0, 2:-2] > 0)\n    assert torch.all(result_video[0, 0, 0, -1, 2:-2] > 0)\n\n    # Check the cropped pixels' original coordinates. In video[0,0,0] and video[0,0,1],\n    # the x and y values were stored with uniform distributions of [1, W] and [1, H].\n    min_y, max_y = _non_zero_values_bounds(result_video[0, 0, 0])\n    min_x, max_x = _non_zero_values_bounds(result_video[0, 0, 1])\n    # The values of 0.65, 0.75, and 0.85 are derived from y0=0.7 and y1=0.8 that are set\n    # in box_coordinates. Maximum multiplier_range is 1.5, hence the expanded pixel\n    # values will have y-coordinates between 0.65*MAX_VAL and 0.85*MAX_VAL.\n    assert (\n        0.65 * MAX_VAL <= min_y <= 0.75 * MAX_VAL <= max_y - 1 <= 0.85 * MAX_VAL\n    ), \"Y values are not within the expanded [0.7, 0.8] bbox.\"\n    assert (\n        0 * MAX_VAL <= min_x <= 0.1 * MAX_VAL <= 0.9 * MAX_VAL <= max_x <= MAX_VAL\n    ), \"X values are not within the expanded [0, 1] bbox.\"\n\n\n@pytest.mark.parametrize(\"numel\", [5, 6])\n@pytest.mark.parametrize(\"is_training\", [True, False])\ndef test_shuffle_audios_single_cycle_permutation(numel: int, is_training: bool) -> None:\n    device = torch.device(\"cpu\")\n    prev_perm = ShuffleAudios._single_cycle_permutation(\n        numel, device=device, is_training=is_training\n    )\n    identity = torch.arange(numel, device=device)\n    is_random = False\n    for _ in range(20):\n        perm = ShuffleAudios._single_cycle_permutation(\n            numel, device=device, is_training=is_training\n        )\n        if torch.any(perm != prev_perm):\n            is_random = True\n            prev_perm = perm\n\n        assert torch.all(\n            perm != identity\n        ), f\"Single cycle permutation should not have identity mapping: {perm}.\"\n\n        sorted_perm, _ = perm.sort()\n        assert torch.all(\n            sorted_perm == identity\n        ), f\"Result is not a permutation: {perm}.\"\n\n    assert is_random == is_training, \"Outcomes should be random iff is_training.\"\n\n\n@pytest.mark.parametrize(\n    \"N, mode, shuffle_ratio, generate_frame_level_targets, debug_mode\",\n    [\n        (1000, \"train\", 0.2, True, False),\n        (1000, \"val\", 0.3, False, False),\n        (1000, \"test\", 0.7, True, True),\n        (1, \"train\", 0.2, False, False),\n        (1, \"val\", 0.2, False, False),\n    ],\n)\ndef test_shuffle_audios(\n    N: int,\n    mode: str,\n    shuffle_ratio: float,\n    generate_frame_level_targets: bool,\n    debug_mode: bool,\n) -> None:\n    opts = get_config()\n    setattr(\n        opts,\n        f\"video_augmentation.shuffle_audios.shuffle_ratio_{mode}\",\n        shuffle_ratio,\n    )\n    setattr(\n        opts,\n        \"video_augmentation.shuffle_audios.generate_frame_level_targets\",\n        generate_frame_level_targets,\n    )\n    setattr(\n        opts,\n        \"video_augmentation.shuffle_audios.debug_mode\",\n        debug_mode,\n    )\n\n    C_v, C_a = 3, 2\n    H, W = 8, 8\n    num_video_frames = 3\n    num_audio_frames = 5\n\n    video = torch.rand(N, num_video_frames, C_v, H, W)\n    # Generating unique audio elements (using torch.arange) so that we can compare them to check if they are shuffled.\n    input_audio = torch.empty(N, num_audio_frames, C_a, dtype=torch.float)\n    torch.arange(input_audio.numel(), dtype=torch.float, out=input_audio)\n\n    data = {\n        \"samples\": {\n            \"video\": video,\n            \"audio\": input_audio.clone(),\n            \"metadata\": {},\n        },\n        \"targets\": {},\n    }\n\n    result = ShuffleAudios(\n        opts=opts,\n        is_training=mode == \"train\",\n        is_evaluation=mode == \"test\",\n        item_index=0,\n    )(data)\n\n    labels = data[\"targets\"][\"is_shuffled\"]\n    assert (\n        labels.shape == (N, num_video_frames) if generate_frame_level_targets else (N,)\n    )\n    if generate_frame_level_targets:\n        assert torch.all(\n            labels == labels[:, :1].repeat(1, num_video_frames)\n        ), \"Labels should be identical among frames of the same clip.\"\n\n    result_is_shuffled = (\n        (~torch.isclose(input_audio, result[\"samples\"][\"audio\"]))\n        .float()  # shape: N x num_audio_frames x C_a\n        .mean(axis=1)  # shape: N x C_a\n        .mean(axis=1)  # shape: N\n    )\n    actual_participation_ratio = result_is_shuffled.float().mean()\n    if N > 1:\n        assert actual_participation_ratio == pytest.approx(shuffle_ratio, abs=0.05)\n    else:\n        assert actual_participation_ratio == pytest.approx(0.0, abs=0.05)\n\n    assert torch.allclose(\n        result_is_shuffled,\n        (labels[:, 0] if generate_frame_level_targets else labels).float(),\n    ), \"Generated labels should match shuffled audios.\"\n\n    if debug_mode:\n        assert data[\"samples\"][\"metadata\"][\"shuffled_audio_permutation\"].shape == (N,)\n    else:\n        assert \"shuffled_audio_permutation\" not in data[\"samples\"][\"metadata\"]\n\n\n@pytest.mark.parametrize(\n    \"t,expected\",\n    [\n        (0, \"00:00:0,000\"),\n        (0.5, \"00:00:0,500\"),\n        (10.5, \"00:00:10,500\"),\n        (70.5, \"00:01:10,500\"),\n        (7270.5, \"02:01:10,500\"),\n    ],\n)\ndef test_save_inputs_srt_format_timestamp(t: float, expected: str) -> None:\n    assert SaveInputs._srt_format_timestamp(t) == expected\n\n\n@pytest.mark.parametrize(\n    \"params\",\n    [\n        {\n            \"opts\": {},\n            \"init_kwargs\": {},\n            \"expected_output_count\": 1,\n            \"video_only\": False,\n        },\n        {\n            \"opts\": {},\n            \"init_kwargs\": {\n                \"get_frame_captions\": (\n                    lambda data: [\"_\"]\n                    * operator.mul(*data[\"samples\"][\"video\"].shape[:2])\n                )\n            },\n            \"expected_output_count\": 1,\n            \"video_only\": False,\n        },\n        {\n            \"opts\": {\"video_augmentation.save_inputs.symlink_to_original\": True},\n            \"init_kwargs\": {},\n            \"expected_output_count\": 2,\n            \"video_only\": True,\n        },\n    ],\n)\ndef test_save_inputs(\n    params: Tuple[Dict, Dict],\n    tmp_path: Path,\n) -> None:\n    opts = get_config()\n    setattr(opts, \"video_augmentation.save_inputs.enable\", True)\n    setattr(opts, \"video_augmentation.save_inputs.save_dir\", str(tmp_path))\n    for key, value in params[\"opts\"].items():\n        setattr(opts, key, value)\n\n    data = {\n        \"samples\": PyAVReader(opts).dummy_audio_video_clips(\n            clips_per_video=2,\n            num_frames_to_sample=3,\n            height=24,\n            width=24,\n        )\n    }\n    if params[\"video_only\"]:\n        del data[\"samples\"][\"audio\"]\n    SaveInputs(opts, **params[\"init_kwargs\"])(data)\n    output_video_paths = list(tmp_path.glob(\"*/*.mp4\"))\n    assert len(output_video_paths) == params[\"expected_output_count\"], (\n        f\"Expected {params['expected_output_count']} videos, but got:\"\n        f\" {output_video_paths}.\"\n    )\n    for output_video_path in output_video_paths:\n        if output_video_path.is_symlink():\n            continue\n        assert os.stat(output_video_path).st_size > 1000, (\n            f\"The generated file ({output_video_path}) is too small\"\n            f\" ({os.stat(output_video_path).st_size}).\"\n        )\n"
  },
  {
    "path": "tests/utils/__init__.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n"
  },
  {
    "path": "tests/utils/test_check.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\nimport unittest\n\nfrom corenet.utils.check import check\n\n\nclass TestCheck(unittest.TestCase):\n\n    def test_ok(self):\n        check(True)\n        check(1)\n        check([1])\n\n    def test_fail(self):\n        with self.assertRaises(AssertionError):\n            check(False)\n        with self.assertRaises(AssertionError):\n            check(0)\n        with self.assertRaises(AssertionError):\n            check([])\n\n    def test_custom_raise(self):\n        with self.assertRaisesRegex(AssertionError, \"phooey\"):\n            check(False, \"phooey\")\n        with self.assertRaisesRegex(ValueError, \"phooey\"):\n            check(False, ValueError(\"phooey\"))\n        with self.assertRaisesRegex(AssertionError, \"phooey\"):\n            check(False, lambda: \"phooey\")\n        with self.assertRaisesRegex(ValueError, \"phooey\"):\n            check(False, lambda: ValueError(\"phooey\"))\n        with self.assertRaisesRegex(AssertionError, \"phooey: 0\"):\n            check(0, lambda x: f\"phooey: {x}\")\n        with self.assertRaisesRegex(ValueError, \"phooey: 0\"):\n            check(0, lambda x: ValueError(f\"phooey: {x}\"))\n"
  },
  {
    "path": "tests/utils/test_common_utils.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\nimport os\n\nimport torch\nimport torch.distributed as dist\n\nfrom corenet.utils.common_utils import unwrap_model_fn\n\n\ndef check_models(\n    original_unwrapped_model: torch.nn.Module, model_after_unwrapping: torch.nn.Module\n) -> None:\n    \"\"\"Helper function to test original and unwrapped models are the same.\"\"\"\n    for layer_id in range(len(original_unwrapped_model)):\n        # for unwrapped models, we should be able to index them\n        assert repr(model_after_unwrapping[layer_id]) == repr(\n            original_unwrapped_model[layer_id]\n        )\n\n\ndef test_unwrap_model_fn():\n    \"\"\"Test for unwrap_model_fn\"\"\"\n\n    dummy_model = torch.nn.Sequential(\n        torch.nn.Linear(10, 20),\n        torch.nn.Linear(20, 40),\n    )\n\n    # test DataParallel wrapping\n    wrapped_model_dp = torch.nn.DataParallel(dummy_model)\n    unwrapped_model_dp = unwrap_model_fn(wrapped_model_dp)\n    check_models(dummy_model, unwrapped_model_dp)\n\n    # Initialize the distributed environment\n    os.environ[\"MASTER_ADDR\"] = \"localhost\"\n    os.environ[\"MASTER_PORT\"] = \"1234\"\n    dist.init_process_group(backend=\"gloo\", rank=0, world_size=1)\n\n    # test DDP wrapping\n    wrapped_model_ddp = torch.nn.parallel.DistributedDataParallel(dummy_model)\n    unwrapped_model_ddp = unwrap_model_fn(wrapped_model_ddp)\n\n    check_models(dummy_model, unwrapped_model_ddp)\n    # clean up DDP environment\n    dist.destroy_process_group()\n"
  },
  {
    "path": "tests/utils/test_dict_utils.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\nfrom corenet.utils.dict_utils import filter_keys\n\n\ndef test_extract_keys():\n    d = {\"x\": 2, \"y\": 3, \"z\": 4}\n\n    assert filter_keys(d, [\"x\", \"y\"]) == {\"x\": 2, \"y\": 3}\n    assert filter_keys(d, [\"w\"]) == {}\n"
  },
  {
    "path": "tests/utils/test_download_utils.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nfrom typing import Any, List\n\nimport pytest\n\nfrom corenet.options.opts import get_training_arguments\nfrom corenet.utils.download_utils import download_assets_in_parallel\n\n\ndef dummy_download_fn(index: int, local_dst_dir: str, args, kwargs) -> None:\n    \"\"\"Dummy download function.\n\n    Tests if kwargs passed from 'download_assets_in_parallel' can be accessed inside 'dummy_download_fn'.\n    \"\"\"\n    dummy_kwarg_data = kwargs.get(\"dummy_kwarg\")\n    # Indexing should not raise an error.\n    dummy_kwarg_data[index]\n\n\n@pytest.mark.parametrize(\"asset_names\", [[\"a\", \"b\", \"c\", \"d\", \"e\"], [1, 2, 3], [1]])\ndef test_download_assets_in_parallel(asset_names: List[Any]) -> None:\n    \"\"\"Test for download_assets_in_parallel function.\n\n    Args:\n        asset_names: A list of assets that are handled by 'download_func' in 'download_assets_in_parallel'.\n    \"\"\"\n    function_kwargs = {\"dummy_kwarg\": asset_names}\n    opts = get_training_arguments(parse_args=True, args=[])\n\n    record_indices = download_assets_in_parallel(\n        opts=opts,\n        local_dst_dir=\"trash/dummy_test\",\n        num_assets=len(asset_names),\n        download_func=dummy_download_fn,\n        **function_kwargs,\n    )\n    assert len(record_indices) == len(asset_names)\n"
  },
  {
    "path": "tests/utils/test_file_logger.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport os\nimport tempfile\n\nimport pytest\nimport torch\n\nfrom corenet.utils.file_logger import FileLogger\n\n\n@pytest.mark.parametrize(\n    \"metric_name, epoch1, value1, epoch2, value2\",\n    [(\"metric\", 0, 1.0, 1, 2.0), (\"metric2\", 5, 1.0, 6, 2.0)],\n)\ndef test_file_logger(\n    metric_name: str, epoch1: int, value1: float, epoch2: int, value2: float\n) -> None:\n    with tempfile.TemporaryDirectory() as tempdir:\n        # Case 1: The file doesn't exist.\n        filename = os.path.join(tempdir, \"stats.pt\")\n        logger = FileLogger(filename)\n\n        logger.add_scalar(metric_name, value1, epoch1)\n        logger.close()\n        assert os.path.exists(filename)\n\n        a = torch.load(filename)\n        assert a == {\"epochs\": {epoch1: {\"metrics\": {metric_name: value1}}}}\n\n        # Case 2: The file does exist.\n        logger = FileLogger(filename)\n        logger.add_scalar(metric_name, value2, epoch2)\n        logger.close()\n\n        a = torch.load(filename)\n        assert a == {\n            \"epochs\": {\n                epoch1: {\"metrics\": {metric_name: value1}},\n                epoch2: {\"metrics\": {metric_name: value2}},\n            }\n        }\n"
  },
  {
    "path": "tests/utils/test_import_utils.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport os\nimport subprocess\nimport sys\nfrom pathlib import Path\n\nfrom pytest_mock import MockerFixture\n\nfrom corenet.utils import import_utils\nfrom corenet.utils.import_utils import import_modules_from_folder\n\n\ndef test_import_utils(tmp_path: Path, mocker: MockerFixture) -> None:\n    tmp_path_str = str(tmp_path)\n    sys.path.append(tmp_path_str)\n    mocker.patch.object(import_utils, \"LIBRARY_ROOT\", tmp_path)\n    try:\n        files = [\n            \"my_test_parent/child/module.py\",\n            \"my_test_parent/child/nested/module.py\",\n            \"my_test_parent/sibling.py\",\n            \"my_internal/my_test_parent/child/module.py\",\n            \"my_internal/my_test_parent/sibling.py\",\n            \"my_internal/projects/A/my_test_parent/child/module.py\",\n            \"my_internal/projects/B/my_test_parent/child/module.py\",\n        ]\n        for path in files:\n            path = tmp_path / path\n            for package in path.parents:\n                if package == tmp_path:\n                    break\n                package.mkdir(exist_ok=True, parents=True)\n                if not package.joinpath(\"__init__.py\").exists():\n                    package.joinpath(\"__init__.py\").write_bytes(b\"\")\n            path.write_bytes(b\"\")\n\n        import_modules_from_folder(\n            \"my_test_parent/child\",\n            extra_roots=[\"my_internal\", \"my_internal/projects/*\"],\n        )\n        assert \"my_test_parent.child.module\" in sys.modules\n        assert \"my_test_parent.child.nested.module\" in sys.modules\n        assert \"my_test_parent.sibling\" not in sys.modules\n        assert \"my_internal.my_test_parent.child.module\" in sys.modules\n        assert \"my_internal.my_test_parent.sibling\" not in sys.modules\n        assert \"my_internal.projects.A.my_test_parent.child.module\" in sys.modules\n        assert \"my_internal.projects.B.my_test_parent.child.module\" in sys.modules\n    finally:\n        sys.path.remove(tmp_path_str)\n\n\ndef test_ensure_pythonpath_is_not_required():\n    \"\"\"\n    In addition to the \"corenet\" folder, \"tests\" and \"experimental\" folders also contain\n    python modules that are occasionally imported by certain entrypoints. In contrast\n    with ``corenet.*``, that can be imported without ``PYTHONPATH=.`` environment\n    variable, ``tests.*`` and ``experimental.*`` require setting ``PYTHONPATH=.``\n    because ``pip install [-e] .`` only install ``corenet/**/*.py``.\n\n    For project-specific code, users can set `PYTHONPATH=.` and import stuff from\n    `tests.*` or `experimental.*`. However, we should ensure that the core functionality\n    of CoreNet does not import from `tests.*` and `experimental.*`. Otherwise, CoreNet\n    will fail in environments that `PYTHONPATH=.` is not set.\n\n    In this test, invoke `import_core_modules()` in an isolated python process\n    and assert that core functionality of CoreNet doesn't import anything from `tests.*`\n    or `experimental.*`.\n    \"\"\"\n\n    subprocess.check_call(\n        [\n            \"python\",\n            \"-c\",\n            \"\"\"\\\nimport sys                \nfrom corenet.utils.import_utils import import_core_modules\n\nimport_core_modules()\n\nfor module_name in sys.modules:\n    assert not module_name.startswith(\"tests\"), \"CoreNet modules shall not import from tests.\"\n    assert not module_name.startswith(\"experimental\"), \"CoreNet modules shall not import from experimental.\"\n\"\"\",\n        ],\n        # It is fine to import stuff from tests/ only in test environment.\n        # We simulate running corenet outside of the test environment, so that we can\n        # allow modules to import stuff from tests/ only during tests.\n        env={k: v for k, v in os.environ.items() if k != \"CORENET_ENTRYPOINT\"},\n    )\n"
  },
  {
    "path": "tools/__init__.py",
    "content": ""
  },
  {
    "path": "tools/converter_coco_stuff.py",
    "content": "#\n# For licensing see accompanying LICENSE file.\n# Copyright (C) 2024 Apple Inc. All Rights Reserved.\n#\n\nimport argparse\nimport copy\nimport glob\nimport os\nfrom glob import glob\nfrom pathlib import Path\n\nimport numpy as np\nfrom joblib import Parallel, delayed\nfrom PIL import Image\nfrom tqdm import tqdm\n\nfrom corenet.utils import logger\n\n# State-of-the-art models use 171 classes for COCO-Stuff. This is because some of the labels defined in\n# COCO-Stuff are not annotated. So, 182 cocostuff labels are remapped to 171 labels.\n_cocostuff_remap_info = {\n    0: 0,\n    1: 1,\n    2: 2,\n    3: 3,\n    4: 4,\n    5: 5,\n    6: 6,\n    7: 7,\n    8: 8,\n    9: 9,\n    10: 10,\n    12: 11,\n    13: 12,\n    14: 13,\n    15: 14,\n    16: 15,\n    17: 16,\n    18: 17,\n    19: 18,\n    20: 19,\n    21: 20,\n    22: 21,\n    23: 22,\n    24: 23,\n    26: 24,\n    27: 25,\n    30: 26,\n    31: 27,\n    32: 28,\n    33: 29,\n    34: 30,\n    35: 31,\n    36: 32,\n    37: 33,\n    38: 34,\n    39: 35,\n    40: 36,\n    41: 37,\n    42: 38,\n    43: 39,\n    45: 40,\n    46: 41,\n    47: 42,\n    48: 43,\n    49: 44,\n    50: 45,\n    51: 46,\n    52: 47,\n    53: 48,\n    54: 49,\n    55: 50,\n    56: 51,\n    57: 52,\n    58: 53,\n    59: 54,\n    60: 55,\n    61: 56,\n    62: 57,\n    63: 58,\n    64: 59,\n    66: 60,\n    69: 61,\n    71: 62,\n    72: 63,\n    73: 64,\n    74: 65,\n    75: 66,\n    76: 67,\n    77: 68,\n    78: 69,\n    79: 70,\n    80: 71,\n    81: 72,\n    83: 73,\n    84: 74,\n    85: 75,\n    86: 76,\n    87: 77,\n    88: 78,\n    89: 79,\n    91: 80,\n    92: 81,\n    93: 82,\n    94: 83,\n    95: 84,\n    96: 85,\n    97: 86,\n    98: 87,\n    99: 88,\n    100: 89,\n    101: 90,\n    102: 91,\n    103: 92,\n    104: 93,\n    105: 94,\n    106: 95,\n    107: 96,\n    108: 97,\n    109: 98,\n    110: 99,\n    111: 100,\n    112: 101,\n    113: 102,\n    114: 103,\n    115: 104,\n    116: 105,\n    117: 106,\n    118: 107,\n    119: 108,\n    120: 109,\n    121: 110,\n    122: 111,\n    123: 112,\n    124: 113,\n    125: 114,\n    126: 115,\n    127: 116,\n    128: 117,\n    129: 118,\n    130: 119,\n    131: 120,\n    132: 121,\n    133: 122,\n    134: 123,\n    135: 124,\n    136: 125,\n    137: 126,\n    138: 127,\n    139: 128,\n    140: 129,\n    141: 130,\n    142: 131,\n    143: 132,\n    144: 133,\n    145: 134,\n    146: 135,\n    147: 136,\n    148: 137,\n    149: 138,\n    150: 139,\n    151: 140,\n    152: 141,\n    153: 142,\n    154: 143,\n    155: 144,\n    156: 145,\n    157: 146,\n    158: 147,\n    159: 148,\n    160: 149,\n    161: 150,\n    162: 151,\n    163: 152,\n    164: 153,\n    165: 154,\n    166: 155,\n    167: 156,\n    168: 157,\n    169: 158,\n    170: 159,\n    171: 160,\n    172: 161,\n    173: 162,\n    174: 163,\n    175: 164,\n    176: 165,\n    177: 166,\n    178: 167,\n    179: 168,\n    180: 169,\n    181: 170,\n    # 255 is not a label and is ignored during training.\n    255: 255,\n}\n\n\ndef remove_unannotated_mask_labels(src_path: str, dst_path: str) -> None:\n    \"\"\"Remap cocostuff labels.\n\n    Args:\n        src_path: File path of the mask image.\n        dst_path: File path of the remapped mask image.\n    \"\"\"\n    mask_np = np.array(Image.open(src_path))\n    mask_copy = copy.deepcopy(mask_np)\n    for old_id, new_id in _cocostuff_remap_info.items():\n        mask_copy[mask_np == old_id] = new_id\n    mask_pil = Image.fromarray(mask_copy)\n    mask_pil.save(dst_path, \"png\")\n\n\ndef main(opts: argparse.Namespace) -> None:\n    \"\"\"\n    Main function to remap COCOStuff labels.\n\n    Args:\n        opts: Command-line arguments.\n    \"\"\"\n\n    src_dir = getattr(opts, \"src_dir\")\n\n    src_sub_directories = [x[0] for x in os.walk(src_dir)]\n\n    if not set(\n        [os.path.join(f\"{src_dir}\", \"train2017\"), os.path.join(f\"{src_dir}\", \"val2017\")]\n    ).issubset(src_sub_directories):\n        logger.error(\n            f\"Src directory must contain {src_dir}/train2017 and {src_dir}/val2017 subdirectories with annotations. Got: {src_sub_directories}\"\n        )\n\n    dst_dir = src_dir + \"_remap\"\n    Path(dst_dir).mkdir(parents=True, exist_ok=True)\n    n_jobs = getattr(opts, \"num_jobs\")\n\n    for sub_dir in [\"train2017\", \"val2017\"]:\n        Path(os.path.join(dst_dir, sub_dir)).mkdir(parents=True, exist_ok=True)\n        src_png_files = glob.glob(f\"{os.path.join(src_dir, sub_dir)}/*.png\")\n        dst_ping_files = [\n            os.path.join(dst_dir, sub_dir, os.path.basename(src_png_file))\n            for src_png_file in src_png_files\n        ]\n\n        Parallel(n_jobs=n_jobs)(\n            delayed(remove_unannotated_mask_labels)(src_mask_path, dst_mask_path)\n            for src_mask_path, dst_mask_path in tqdm(zip(src_png_files, dst_ping_files))\n        )\n        logger.info(f\"Done processing {sub_dir}.\")\n\n\nif __name__ == \"__main__\":\n    parser = argparse.ArgumentParser(\"Remap COCO-Stuff labels\")\n    parser.add_argument(\n        \"--src-dir\",\n        type=str,\n        required=True,\n        help=\"Source directory that contains the train2017 and val2017 annotation folders.\",\n    )\n    parser.add_argument(\n        \"--num-jobs\",\n        type=int,\n        default=-1,\n        help=\"Number of jobs for processing data in parallel with joblib. Defaults to -1 (i.e., use all CPUs).\",\n    )\n\n    opts = parser.parse_args()\n    main(opts)\n"
  },
  {
    "path": "tox.ini",
    "content": "[tox]\nenvlist = darwin, linux\n\n[testenv]\ndeps =\n    -r requirements.txt\n    -r requirements-optional.txt\n    -r mlx_examples/requirements.txt\ncommands =\n    make test-all extra_args=\"--ignore=corenet/internal --ignore=tests/internal --ignore=experimental\"\nallowlist_externals = make\n\n\n[testenv:darwin]\nplatform = darwin\n# Use Python 3.9 on macOS (Mac OS 14.4 system Python version)\nbasepython = python3.9\nsetenv =\n  DYLD_LIBRARY_PATH=/opt/homebrew/lib\ndeps =\n  {[testenv]deps}\ncommands = \n  {[testenv]commands}\n\n[testenv:linux]\nplatform = linux\n# Use Python 3.10 on Linux (Ubuntu 22.04 system Python version)\nbasepython = python3.10\ndeps =\n   {[testenv]deps}\ncommands = \n    {[testenv]commands}\n\n"
  },
  {
    "path": "tutorials/clip.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"attachments\": {},\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# CLIP: Contrastive Language Image Pre-training Inference Demo\\n\",\n    \"\\n\",\n    \"This example shows the usage of a pre-trained CLIP with ViT-B/16 as an image encoder for the task of zero-shot image classification. \"\n   ]\n  },\n  {\n   \"attachments\": {},\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Create the model\\n\",\n    \"Creating a model is simple. You need a configuration file and the path to the pre-trained weights. Below is an example code snippet\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"2024-04-15 11:41:15 - \\u001b[32m\\u001b[1mINFO   \\u001b[0m - Trainable parameters: ['cls_token', 'neural_augmentor.brightness._low', 'neural_augmentor.brightness._high', 'neural_augmentor.contrast._low', 'neural_augmentor.contrast._high', 'neural_augmentor.noise._low', 'neural_augmentor.noise._high', 'patch_emb.0.block.conv.weight', 'patch_emb.0.block.norm.weight', 'patch_emb.0.block.norm.bias', 'patch_emb.1.block.conv.weight', 'patch_emb.1.block.norm.weight', 'patch_emb.1.block.norm.bias', 'patch_emb.2.block.conv.weight', 'patch_emb.2.block.conv.bias', 'post_transformer_norm.weight', 'post_transformer_norm.bias', 'transformer.0.pre_norm_mha.0.weight', 'transformer.0.pre_norm_mha.0.bias', 'transformer.0.pre_norm_mha.1.qkv_proj.weight', 'transformer.0.pre_norm_mha.1.qkv_proj.bias', 'transformer.0.pre_norm_mha.1.out_proj.weight', 'transformer.0.pre_norm_mha.1.out_proj.bias', 'transformer.0.pre_norm_ffn.0.weight', 'transformer.0.pre_norm_ffn.0.bias', 'transformer.0.pre_norm_ffn.1.weight', 'transformer.0.pre_norm_ffn.1.bias', 'transformer.0.pre_norm_ffn.4.weight', 'transformer.0.pre_norm_ffn.4.bias', 'transformer.1.pre_norm_mha.0.weight', 'transformer.1.pre_norm_mha.0.bias', 'transformer.1.pre_norm_mha.1.qkv_proj.weight', 'transformer.1.pre_norm_mha.1.qkv_proj.bias', 'transformer.1.pre_norm_mha.1.out_proj.weight', 'transformer.1.pre_norm_mha.1.out_proj.bias', 'transformer.1.pre_norm_ffn.0.weight', 'transformer.1.pre_norm_ffn.0.bias', 'transformer.1.pre_norm_ffn.1.weight', 'transformer.1.pre_norm_ffn.1.bias', 'transformer.1.pre_norm_ffn.4.weight', 'transformer.1.pre_norm_ffn.4.bias', 'transformer.2.pre_norm_mha.0.weight', 'transformer.2.pre_norm_mha.0.bias', 'transformer.2.pre_norm_mha.1.qkv_proj.weight', 'transformer.2.pre_norm_mha.1.qkv_proj.bias', 'transformer.2.pre_norm_mha.1.out_proj.weight', 'transformer.2.pre_norm_mha.1.out_proj.bias', 'transformer.2.pre_norm_ffn.0.weight', 'transformer.2.pre_norm_ffn.0.bias', 'transformer.2.pre_norm_ffn.1.weight', 'transformer.2.pre_norm_ffn.1.bias', 'transformer.2.pre_norm_ffn.4.weight', 'transformer.2.pre_norm_ffn.4.bias', 'transformer.3.pre_norm_mha.0.weight', 'transformer.3.pre_norm_mha.0.bias', 'transformer.3.pre_norm_mha.1.qkv_proj.weight', 'transformer.3.pre_norm_mha.1.qkv_proj.bias', 'transformer.3.pre_norm_mha.1.out_proj.weight', 'transformer.3.pre_norm_mha.1.out_proj.bias', 'transformer.3.pre_norm_ffn.0.weight', 'transformer.3.pre_norm_ffn.0.bias', 'transformer.3.pre_norm_ffn.1.weight', 'transformer.3.pre_norm_ffn.1.bias', 'transformer.3.pre_norm_ffn.4.weight', 'transformer.3.pre_norm_ffn.4.bias', 'transformer.4.pre_norm_mha.0.weight', 'transformer.4.pre_norm_mha.0.bias', 'transformer.4.pre_norm_mha.1.qkv_proj.weight', 'transformer.4.pre_norm_mha.1.qkv_proj.bias', 'transformer.4.pre_norm_mha.1.out_proj.weight', 'transformer.4.pre_norm_mha.1.out_proj.bias', 'transformer.4.pre_norm_ffn.0.weight', 'transformer.4.pre_norm_ffn.0.bias', 'transformer.4.pre_norm_ffn.1.weight', 'transformer.4.pre_norm_ffn.1.bias', 'transformer.4.pre_norm_ffn.4.weight', 'transformer.4.pre_norm_ffn.4.bias', 'transformer.5.pre_norm_mha.0.weight', 'transformer.5.pre_norm_mha.0.bias', 'transformer.5.pre_norm_mha.1.qkv_proj.weight', 'transformer.5.pre_norm_mha.1.qkv_proj.bias', 'transformer.5.pre_norm_mha.1.out_proj.weight', 'transformer.5.pre_norm_mha.1.out_proj.bias', 'transformer.5.pre_norm_ffn.0.weight', 'transformer.5.pre_norm_ffn.0.bias', 'transformer.5.pre_norm_ffn.1.weight', 'transformer.5.pre_norm_ffn.1.bias', 'transformer.5.pre_norm_ffn.4.weight', 'transformer.5.pre_norm_ffn.4.bias', 'transformer.6.pre_norm_mha.0.weight', 'transformer.6.pre_norm_mha.0.bias', 'transformer.6.pre_norm_mha.1.qkv_proj.weight', 'transformer.6.pre_norm_mha.1.qkv_proj.bias', 'transformer.6.pre_norm_mha.1.out_proj.weight', 'transformer.6.pre_norm_mha.1.out_proj.bias', 'transformer.6.pre_norm_ffn.0.weight', 'transformer.6.pre_norm_ffn.0.bias', 'transformer.6.pre_norm_ffn.1.weight', 'transformer.6.pre_norm_ffn.1.bias', 'transformer.6.pre_norm_ffn.4.weight', 'transformer.6.pre_norm_ffn.4.bias', 'transformer.7.pre_norm_mha.0.weight', 'transformer.7.pre_norm_mha.0.bias', 'transformer.7.pre_norm_mha.1.qkv_proj.weight', 'transformer.7.pre_norm_mha.1.qkv_proj.bias', 'transformer.7.pre_norm_mha.1.out_proj.weight', 'transformer.7.pre_norm_mha.1.out_proj.bias', 'transformer.7.pre_norm_ffn.0.weight', 'transformer.7.pre_norm_ffn.0.bias', 'transformer.7.pre_norm_ffn.1.weight', 'transformer.7.pre_norm_ffn.1.bias', 'transformer.7.pre_norm_ffn.4.weight', 'transformer.7.pre_norm_ffn.4.bias', 'transformer.8.pre_norm_mha.0.weight', 'transformer.8.pre_norm_mha.0.bias', 'transformer.8.pre_norm_mha.1.qkv_proj.weight', 'transformer.8.pre_norm_mha.1.qkv_proj.bias', 'transformer.8.pre_norm_mha.1.out_proj.weight', 'transformer.8.pre_norm_mha.1.out_proj.bias', 'transformer.8.pre_norm_ffn.0.weight', 'transformer.8.pre_norm_ffn.0.bias', 'transformer.8.pre_norm_ffn.1.weight', 'transformer.8.pre_norm_ffn.1.bias', 'transformer.8.pre_norm_ffn.4.weight', 'transformer.8.pre_norm_ffn.4.bias', 'transformer.9.pre_norm_mha.0.weight', 'transformer.9.pre_norm_mha.0.bias', 'transformer.9.pre_norm_mha.1.qkv_proj.weight', 'transformer.9.pre_norm_mha.1.qkv_proj.bias', 'transformer.9.pre_norm_mha.1.out_proj.weight', 'transformer.9.pre_norm_mha.1.out_proj.bias', 'transformer.9.pre_norm_ffn.0.weight', 'transformer.9.pre_norm_ffn.0.bias', 'transformer.9.pre_norm_ffn.1.weight', 'transformer.9.pre_norm_ffn.1.bias', 'transformer.9.pre_norm_ffn.4.weight', 'transformer.9.pre_norm_ffn.4.bias', 'transformer.10.pre_norm_mha.0.weight', 'transformer.10.pre_norm_mha.0.bias', 'transformer.10.pre_norm_mha.1.qkv_proj.weight', 'transformer.10.pre_norm_mha.1.qkv_proj.bias', 'transformer.10.pre_norm_mha.1.out_proj.weight', 'transformer.10.pre_norm_mha.1.out_proj.bias', 'transformer.10.pre_norm_ffn.0.weight', 'transformer.10.pre_norm_ffn.0.bias', 'transformer.10.pre_norm_ffn.1.weight', 'transformer.10.pre_norm_ffn.1.bias', 'transformer.10.pre_norm_ffn.4.weight', 'transformer.10.pre_norm_ffn.4.bias', 'transformer.11.pre_norm_mha.0.weight', 'transformer.11.pre_norm_mha.0.bias', 'transformer.11.pre_norm_mha.1.qkv_proj.weight', 'transformer.11.pre_norm_mha.1.qkv_proj.bias', 'transformer.11.pre_norm_mha.1.out_proj.weight', 'transformer.11.pre_norm_mha.1.out_proj.bias', 'transformer.11.pre_norm_ffn.0.weight', 'transformer.11.pre_norm_ffn.0.bias', 'transformer.11.pre_norm_ffn.1.weight', 'transformer.11.pre_norm_ffn.1.bias', 'transformer.11.pre_norm_ffn.4.weight', 'transformer.11.pre_norm_ffn.4.bias', 'classifier.weight', 'classifier.bias', 'pos_embed.pos_embed.pos_embed']\\n\",\n      \"2024-04-15 11:42:11 - \\u001b[34m\\u001b[1mLOGS   \\u001b[0m - Pretrained weights are loaded from /tmp/corenet/docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/clip/clip_vit_base_16.pt\\n\",\n      \"2024-04-15 11:42:11 - \\u001b[32m\\u001b[1mINFO   \\u001b[0m - Trainable parameters: ['image_encoder.cls_token', 'image_encoder.neural_augmentor.brightness._low', 'image_encoder.neural_augmentor.brightness._high', 'image_encoder.neural_augmentor.contrast._low', 'image_encoder.neural_augmentor.contrast._high', 'image_encoder.neural_augmentor.noise._low', 'image_encoder.neural_augmentor.noise._high', 'image_encoder.patch_emb.0.block.conv.weight', 'image_encoder.patch_emb.0.block.norm.weight', 'image_encoder.patch_emb.0.block.norm.bias', 'image_encoder.patch_emb.1.block.conv.weight', 'image_encoder.patch_emb.1.block.norm.weight', 'image_encoder.patch_emb.1.block.norm.bias', 'image_encoder.patch_emb.2.block.conv.weight', 'image_encoder.patch_emb.2.block.conv.bias', 'image_encoder.post_transformer_norm.weight', 'image_encoder.post_transformer_norm.bias', 'image_encoder.transformer.0.pre_norm_mha.0.weight', 'image_encoder.transformer.0.pre_norm_mha.0.bias', 'image_encoder.transformer.0.pre_norm_mha.1.qkv_proj.weight', 'image_encoder.transformer.0.pre_norm_mha.1.qkv_proj.bias', 'image_encoder.transformer.0.pre_norm_mha.1.out_proj.weight', 'image_encoder.transformer.0.pre_norm_mha.1.out_proj.bias', 'image_encoder.transformer.0.pre_norm_ffn.0.weight', 'image_encoder.transformer.0.pre_norm_ffn.0.bias', 'image_encoder.transformer.0.pre_norm_ffn.1.weight', 'image_encoder.transformer.0.pre_norm_ffn.1.bias', 'image_encoder.transformer.0.pre_norm_ffn.4.weight', 'image_encoder.transformer.0.pre_norm_ffn.4.bias', 'image_encoder.transformer.1.pre_norm_mha.0.weight', 'image_encoder.transformer.1.pre_norm_mha.0.bias', 'image_encoder.transformer.1.pre_norm_mha.1.qkv_proj.weight', 'image_encoder.transformer.1.pre_norm_mha.1.qkv_proj.bias', 'image_encoder.transformer.1.pre_norm_mha.1.out_proj.weight', 'image_encoder.transformer.1.pre_norm_mha.1.out_proj.bias', 'image_encoder.transformer.1.pre_norm_ffn.0.weight', 'image_encoder.transformer.1.pre_norm_ffn.0.bias', 'image_encoder.transformer.1.pre_norm_ffn.1.weight', 'image_encoder.transformer.1.pre_norm_ffn.1.bias', 'image_encoder.transformer.1.pre_norm_ffn.4.weight', 'image_encoder.transformer.1.pre_norm_ffn.4.bias', 'image_encoder.transformer.2.pre_norm_mha.0.weight', 'image_encoder.transformer.2.pre_norm_mha.0.bias', 'image_encoder.transformer.2.pre_norm_mha.1.qkv_proj.weight', 'image_encoder.transformer.2.pre_norm_mha.1.qkv_proj.bias', 'image_encoder.transformer.2.pre_norm_mha.1.out_proj.weight', 'image_encoder.transformer.2.pre_norm_mha.1.out_proj.bias', 'image_encoder.transformer.2.pre_norm_ffn.0.weight', 'image_encoder.transformer.2.pre_norm_ffn.0.bias', 'image_encoder.transformer.2.pre_norm_ffn.1.weight', 'image_encoder.transformer.2.pre_norm_ffn.1.bias', 'image_encoder.transformer.2.pre_norm_ffn.4.weight', 'image_encoder.transformer.2.pre_norm_ffn.4.bias', 'image_encoder.transformer.3.pre_norm_mha.0.weight', 'image_encoder.transformer.3.pre_norm_mha.0.bias', 'image_encoder.transformer.3.pre_norm_mha.1.qkv_proj.weight', 'image_encoder.transformer.3.pre_norm_mha.1.qkv_proj.bias', 'image_encoder.transformer.3.pre_norm_mha.1.out_proj.weight', 'image_encoder.transformer.3.pre_norm_mha.1.out_proj.bias', 'image_encoder.transformer.3.pre_norm_ffn.0.weight', 'image_encoder.transformer.3.pre_norm_ffn.0.bias', 'image_encoder.transformer.3.pre_norm_ffn.1.weight', 'image_encoder.transformer.3.pre_norm_ffn.1.bias', 'image_encoder.transformer.3.pre_norm_ffn.4.weight', 'image_encoder.transformer.3.pre_norm_ffn.4.bias', 'image_encoder.transformer.4.pre_norm_mha.0.weight', 'image_encoder.transformer.4.pre_norm_mha.0.bias', 'image_encoder.transformer.4.pre_norm_mha.1.qkv_proj.weight', 'image_encoder.transformer.4.pre_norm_mha.1.qkv_proj.bias', 'image_encoder.transformer.4.pre_norm_mha.1.out_proj.weight', 'image_encoder.transformer.4.pre_norm_mha.1.out_proj.bias', 'image_encoder.transformer.4.pre_norm_ffn.0.weight', 'image_encoder.transformer.4.pre_norm_ffn.0.bias', 'image_encoder.transformer.4.pre_norm_ffn.1.weight', 'image_encoder.transformer.4.pre_norm_ffn.1.bias', 'image_encoder.transformer.4.pre_norm_ffn.4.weight', 'image_encoder.transformer.4.pre_norm_ffn.4.bias', 'image_encoder.transformer.5.pre_norm_mha.0.weight', 'image_encoder.transformer.5.pre_norm_mha.0.bias', 'image_encoder.transformer.5.pre_norm_mha.1.qkv_proj.weight', 'image_encoder.transformer.5.pre_norm_mha.1.qkv_proj.bias', 'image_encoder.transformer.5.pre_norm_mha.1.out_proj.weight', 'image_encoder.transformer.5.pre_norm_mha.1.out_proj.bias', 'image_encoder.transformer.5.pre_norm_ffn.0.weight', 'image_encoder.transformer.5.pre_norm_ffn.0.bias', 'image_encoder.transformer.5.pre_norm_ffn.1.weight', 'image_encoder.transformer.5.pre_norm_ffn.1.bias', 'image_encoder.transformer.5.pre_norm_ffn.4.weight', 'image_encoder.transformer.5.pre_norm_ffn.4.bias', 'image_encoder.transformer.6.pre_norm_mha.0.weight', 'image_encoder.transformer.6.pre_norm_mha.0.bias', 'image_encoder.transformer.6.pre_norm_mha.1.qkv_proj.weight', 'image_encoder.transformer.6.pre_norm_mha.1.qkv_proj.bias', 'image_encoder.transformer.6.pre_norm_mha.1.out_proj.weight', 'image_encoder.transformer.6.pre_norm_mha.1.out_proj.bias', 'image_encoder.transformer.6.pre_norm_ffn.0.weight', 'image_encoder.transformer.6.pre_norm_ffn.0.bias', 'image_encoder.transformer.6.pre_norm_ffn.1.weight', 'image_encoder.transformer.6.pre_norm_ffn.1.bias', 'image_encoder.transformer.6.pre_norm_ffn.4.weight', 'image_encoder.transformer.6.pre_norm_ffn.4.bias', 'image_encoder.transformer.7.pre_norm_mha.0.weight', 'image_encoder.transformer.7.pre_norm_mha.0.bias', 'image_encoder.transformer.7.pre_norm_mha.1.qkv_proj.weight', 'image_encoder.transformer.7.pre_norm_mha.1.qkv_proj.bias', 'image_encoder.transformer.7.pre_norm_mha.1.out_proj.weight', 'image_encoder.transformer.7.pre_norm_mha.1.out_proj.bias', 'image_encoder.transformer.7.pre_norm_ffn.0.weight', 'image_encoder.transformer.7.pre_norm_ffn.0.bias', 'image_encoder.transformer.7.pre_norm_ffn.1.weight', 'image_encoder.transformer.7.pre_norm_ffn.1.bias', 'image_encoder.transformer.7.pre_norm_ffn.4.weight', 'image_encoder.transformer.7.pre_norm_ffn.4.bias', 'image_encoder.transformer.8.pre_norm_mha.0.weight', 'image_encoder.transformer.8.pre_norm_mha.0.bias', 'image_encoder.transformer.8.pre_norm_mha.1.qkv_proj.weight', 'image_encoder.transformer.8.pre_norm_mha.1.qkv_proj.bias', 'image_encoder.transformer.8.pre_norm_mha.1.out_proj.weight', 'image_encoder.transformer.8.pre_norm_mha.1.out_proj.bias', 'image_encoder.transformer.8.pre_norm_ffn.0.weight', 'image_encoder.transformer.8.pre_norm_ffn.0.bias', 'image_encoder.transformer.8.pre_norm_ffn.1.weight', 'image_encoder.transformer.8.pre_norm_ffn.1.bias', 'image_encoder.transformer.8.pre_norm_ffn.4.weight', 'image_encoder.transformer.8.pre_norm_ffn.4.bias', 'image_encoder.transformer.9.pre_norm_mha.0.weight', 'image_encoder.transformer.9.pre_norm_mha.0.bias', 'image_encoder.transformer.9.pre_norm_mha.1.qkv_proj.weight', 'image_encoder.transformer.9.pre_norm_mha.1.qkv_proj.bias', 'image_encoder.transformer.9.pre_norm_mha.1.out_proj.weight', 'image_encoder.transformer.9.pre_norm_mha.1.out_proj.bias', 'image_encoder.transformer.9.pre_norm_ffn.0.weight', 'image_encoder.transformer.9.pre_norm_ffn.0.bias', 'image_encoder.transformer.9.pre_norm_ffn.1.weight', 'image_encoder.transformer.9.pre_norm_ffn.1.bias', 'image_encoder.transformer.9.pre_norm_ffn.4.weight', 'image_encoder.transformer.9.pre_norm_ffn.4.bias', 'image_encoder.transformer.10.pre_norm_mha.0.weight', 'image_encoder.transformer.10.pre_norm_mha.0.bias', 'image_encoder.transformer.10.pre_norm_mha.1.qkv_proj.weight', 'image_encoder.transformer.10.pre_norm_mha.1.qkv_proj.bias', 'image_encoder.transformer.10.pre_norm_mha.1.out_proj.weight', 'image_encoder.transformer.10.pre_norm_mha.1.out_proj.bias', 'image_encoder.transformer.10.pre_norm_ffn.0.weight', 'image_encoder.transformer.10.pre_norm_ffn.0.bias', 'image_encoder.transformer.10.pre_norm_ffn.1.weight', 'image_encoder.transformer.10.pre_norm_ffn.1.bias', 'image_encoder.transformer.10.pre_norm_ffn.4.weight', 'image_encoder.transformer.10.pre_norm_ffn.4.bias', 'image_encoder.transformer.11.pre_norm_mha.0.weight', 'image_encoder.transformer.11.pre_norm_mha.0.bias', 'image_encoder.transformer.11.pre_norm_mha.1.qkv_proj.weight', 'image_encoder.transformer.11.pre_norm_mha.1.qkv_proj.bias', 'image_encoder.transformer.11.pre_norm_mha.1.out_proj.weight', 'image_encoder.transformer.11.pre_norm_mha.1.out_proj.bias', 'image_encoder.transformer.11.pre_norm_ffn.0.weight', 'image_encoder.transformer.11.pre_norm_ffn.0.bias', 'image_encoder.transformer.11.pre_norm_ffn.1.weight', 'image_encoder.transformer.11.pre_norm_ffn.1.bias', 'image_encoder.transformer.11.pre_norm_ffn.4.weight', 'image_encoder.transformer.11.pre_norm_ffn.4.bias', 'image_encoder.classifier.proj', 'image_encoder.pos_embed.pos_embed.pos_embed', 'text_encoder.projection_layer', 'text_encoder.embedding_layer.weight', 'text_encoder.positional_embedding.pos_embed.pos_embed', 'text_encoder.transformer.0.pre_norm_mha.0.weight', 'text_encoder.transformer.0.pre_norm_mha.0.bias', 'text_encoder.transformer.0.pre_norm_mha.1.qkv_proj.weight', 'text_encoder.transformer.0.pre_norm_mha.1.qkv_proj.bias', 'text_encoder.transformer.0.pre_norm_mha.1.out_proj.weight', 'text_encoder.transformer.0.pre_norm_mha.1.out_proj.bias', 'text_encoder.transformer.0.pre_norm_ffn.0.weight', 'text_encoder.transformer.0.pre_norm_ffn.0.bias', 'text_encoder.transformer.0.pre_norm_ffn.1.weight', 'text_encoder.transformer.0.pre_norm_ffn.1.bias', 'text_encoder.transformer.0.pre_norm_ffn.4.weight', 'text_encoder.transformer.0.pre_norm_ffn.4.bias', 'text_encoder.transformer.1.pre_norm_mha.0.weight', 'text_encoder.transformer.1.pre_norm_mha.0.bias', 'text_encoder.transformer.1.pre_norm_mha.1.qkv_proj.weight', 'text_encoder.transformer.1.pre_norm_mha.1.qkv_proj.bias', 'text_encoder.transformer.1.pre_norm_mha.1.out_proj.weight', 'text_encoder.transformer.1.pre_norm_mha.1.out_proj.bias', 'text_encoder.transformer.1.pre_norm_ffn.0.weight', 'text_encoder.transformer.1.pre_norm_ffn.0.bias', 'text_encoder.transformer.1.pre_norm_ffn.1.weight', 'text_encoder.transformer.1.pre_norm_ffn.1.bias', 'text_encoder.transformer.1.pre_norm_ffn.4.weight', 'text_encoder.transformer.1.pre_norm_ffn.4.bias', 'text_encoder.transformer.2.pre_norm_mha.0.weight', 'text_encoder.transformer.2.pre_norm_mha.0.bias', 'text_encoder.transformer.2.pre_norm_mha.1.qkv_proj.weight', 'text_encoder.transformer.2.pre_norm_mha.1.qkv_proj.bias', 'text_encoder.transformer.2.pre_norm_mha.1.out_proj.weight', 'text_encoder.transformer.2.pre_norm_mha.1.out_proj.bias', 'text_encoder.transformer.2.pre_norm_ffn.0.weight', 'text_encoder.transformer.2.pre_norm_ffn.0.bias', 'text_encoder.transformer.2.pre_norm_ffn.1.weight', 'text_encoder.transformer.2.pre_norm_ffn.1.bias', 'text_encoder.transformer.2.pre_norm_ffn.4.weight', 'text_encoder.transformer.2.pre_norm_ffn.4.bias', 'text_encoder.transformer.3.pre_norm_mha.0.weight', 'text_encoder.transformer.3.pre_norm_mha.0.bias', 'text_encoder.transformer.3.pre_norm_mha.1.qkv_proj.weight', 'text_encoder.transformer.3.pre_norm_mha.1.qkv_proj.bias', 'text_encoder.transformer.3.pre_norm_mha.1.out_proj.weight', 'text_encoder.transformer.3.pre_norm_mha.1.out_proj.bias', 'text_encoder.transformer.3.pre_norm_ffn.0.weight', 'text_encoder.transformer.3.pre_norm_ffn.0.bias', 'text_encoder.transformer.3.pre_norm_ffn.1.weight', 'text_encoder.transformer.3.pre_norm_ffn.1.bias', 'text_encoder.transformer.3.pre_norm_ffn.4.weight', 'text_encoder.transformer.3.pre_norm_ffn.4.bias', 'text_encoder.transformer.4.pre_norm_mha.0.weight', 'text_encoder.transformer.4.pre_norm_mha.0.bias', 'text_encoder.transformer.4.pre_norm_mha.1.qkv_proj.weight', 'text_encoder.transformer.4.pre_norm_mha.1.qkv_proj.bias', 'text_encoder.transformer.4.pre_norm_mha.1.out_proj.weight', 'text_encoder.transformer.4.pre_norm_mha.1.out_proj.bias', 'text_encoder.transformer.4.pre_norm_ffn.0.weight', 'text_encoder.transformer.4.pre_norm_ffn.0.bias', 'text_encoder.transformer.4.pre_norm_ffn.1.weight', 'text_encoder.transformer.4.pre_norm_ffn.1.bias', 'text_encoder.transformer.4.pre_norm_ffn.4.weight', 'text_encoder.transformer.4.pre_norm_ffn.4.bias', 'text_encoder.transformer.5.pre_norm_mha.0.weight', 'text_encoder.transformer.5.pre_norm_mha.0.bias', 'text_encoder.transformer.5.pre_norm_mha.1.qkv_proj.weight', 'text_encoder.transformer.5.pre_norm_mha.1.qkv_proj.bias', 'text_encoder.transformer.5.pre_norm_mha.1.out_proj.weight', 'text_encoder.transformer.5.pre_norm_mha.1.out_proj.bias', 'text_encoder.transformer.5.pre_norm_ffn.0.weight', 'text_encoder.transformer.5.pre_norm_ffn.0.bias', 'text_encoder.transformer.5.pre_norm_ffn.1.weight', 'text_encoder.transformer.5.pre_norm_ffn.1.bias', 'text_encoder.transformer.5.pre_norm_ffn.4.weight', 'text_encoder.transformer.5.pre_norm_ffn.4.bias', 'text_encoder.transformer.6.pre_norm_mha.0.weight', 'text_encoder.transformer.6.pre_norm_mha.0.bias', 'text_encoder.transformer.6.pre_norm_mha.1.qkv_proj.weight', 'text_encoder.transformer.6.pre_norm_mha.1.qkv_proj.bias', 'text_encoder.transformer.6.pre_norm_mha.1.out_proj.weight', 'text_encoder.transformer.6.pre_norm_mha.1.out_proj.bias', 'text_encoder.transformer.6.pre_norm_ffn.0.weight', 'text_encoder.transformer.6.pre_norm_ffn.0.bias', 'text_encoder.transformer.6.pre_norm_ffn.1.weight', 'text_encoder.transformer.6.pre_norm_ffn.1.bias', 'text_encoder.transformer.6.pre_norm_ffn.4.weight', 'text_encoder.transformer.6.pre_norm_ffn.4.bias', 'text_encoder.transformer.7.pre_norm_mha.0.weight', 'text_encoder.transformer.7.pre_norm_mha.0.bias', 'text_encoder.transformer.7.pre_norm_mha.1.qkv_proj.weight', 'text_encoder.transformer.7.pre_norm_mha.1.qkv_proj.bias', 'text_encoder.transformer.7.pre_norm_mha.1.out_proj.weight', 'text_encoder.transformer.7.pre_norm_mha.1.out_proj.bias', 'text_encoder.transformer.7.pre_norm_ffn.0.weight', 'text_encoder.transformer.7.pre_norm_ffn.0.bias', 'text_encoder.transformer.7.pre_norm_ffn.1.weight', 'text_encoder.transformer.7.pre_norm_ffn.1.bias', 'text_encoder.transformer.7.pre_norm_ffn.4.weight', 'text_encoder.transformer.7.pre_norm_ffn.4.bias', 'text_encoder.transformer.8.pre_norm_mha.0.weight', 'text_encoder.transformer.8.pre_norm_mha.0.bias', 'text_encoder.transformer.8.pre_norm_mha.1.qkv_proj.weight', 'text_encoder.transformer.8.pre_norm_mha.1.qkv_proj.bias', 'text_encoder.transformer.8.pre_norm_mha.1.out_proj.weight', 'text_encoder.transformer.8.pre_norm_mha.1.out_proj.bias', 'text_encoder.transformer.8.pre_norm_ffn.0.weight', 'text_encoder.transformer.8.pre_norm_ffn.0.bias', 'text_encoder.transformer.8.pre_norm_ffn.1.weight', 'text_encoder.transformer.8.pre_norm_ffn.1.bias', 'text_encoder.transformer.8.pre_norm_ffn.4.weight', 'text_encoder.transformer.8.pre_norm_ffn.4.bias', 'text_encoder.transformer.9.pre_norm_mha.0.weight', 'text_encoder.transformer.9.pre_norm_mha.0.bias', 'text_encoder.transformer.9.pre_norm_mha.1.qkv_proj.weight', 'text_encoder.transformer.9.pre_norm_mha.1.qkv_proj.bias', 'text_encoder.transformer.9.pre_norm_mha.1.out_proj.weight', 'text_encoder.transformer.9.pre_norm_mha.1.out_proj.bias', 'text_encoder.transformer.9.pre_norm_ffn.0.weight', 'text_encoder.transformer.9.pre_norm_ffn.0.bias', 'text_encoder.transformer.9.pre_norm_ffn.1.weight', 'text_encoder.transformer.9.pre_norm_ffn.1.bias', 'text_encoder.transformer.9.pre_norm_ffn.4.weight', 'text_encoder.transformer.9.pre_norm_ffn.4.bias', 'text_encoder.transformer.10.pre_norm_mha.0.weight', 'text_encoder.transformer.10.pre_norm_mha.0.bias', 'text_encoder.transformer.10.pre_norm_mha.1.qkv_proj.weight', 'text_encoder.transformer.10.pre_norm_mha.1.qkv_proj.bias', 'text_encoder.transformer.10.pre_norm_mha.1.out_proj.weight', 'text_encoder.transformer.10.pre_norm_mha.1.out_proj.bias', 'text_encoder.transformer.10.pre_norm_ffn.0.weight', 'text_encoder.transformer.10.pre_norm_ffn.0.bias', 'text_encoder.transformer.10.pre_norm_ffn.1.weight', 'text_encoder.transformer.10.pre_norm_ffn.1.bias', 'text_encoder.transformer.10.pre_norm_ffn.4.weight', 'text_encoder.transformer.10.pre_norm_ffn.4.bias', 'text_encoder.transformer.11.pre_norm_mha.0.weight', 'text_encoder.transformer.11.pre_norm_mha.0.bias', 'text_encoder.transformer.11.pre_norm_mha.1.qkv_proj.weight', 'text_encoder.transformer.11.pre_norm_mha.1.qkv_proj.bias', 'text_encoder.transformer.11.pre_norm_mha.1.out_proj.weight', 'text_encoder.transformer.11.pre_norm_mha.1.out_proj.bias', 'text_encoder.transformer.11.pre_norm_ffn.0.weight', 'text_encoder.transformer.11.pre_norm_ffn.0.bias', 'text_encoder.transformer.11.pre_norm_ffn.1.weight', 'text_encoder.transformer.11.pre_norm_ffn.1.bias', 'text_encoder.transformer.11.pre_norm_ffn.4.weight', 'text_encoder.transformer.11.pre_norm_ffn.4.bias', 'text_encoder.final_layer_norm.weight', 'text_encoder.final_layer_norm.bias', 'logit_scale']\\n\"\n     ]\n    },\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"CLIP(\\n\",\n       \"  (image_encoder): VisionTransformer(\\n\",\n       \"    (neural_augmentor): DistributionNeuralAugmentor(\\n\",\n       \"    \\tBrightness=UniformSampler(min_fn=Clip(min=0.1, max=0.9, clipping=soft), max_fn=Clip(min=1.1, max=10.0, clipping=soft)), \\n\",\n       \"    \\tContrast=UniformSampler(min_fn=Clip(min=0.1, max=0.9, clipping=soft), max_fn=Clip(min=1.1, max=10.0, clipping=soft)), \\n\",\n       \"    \\tNoise=UniformSampler(min_fn=Clip(min=0.0, max=5e-05, clipping=soft), max_fn=Clip(min=0.0001, max=1.0, clipping=soft)), )\\n\",\n       \"    (patch_emb): Sequential(\\n\",\n       \"      (0): Conv2d(3, 192, kernel_size=(4, 4), stride=(4, 4), padding=(1, 1), bias=False, normalization=BatchNorm2d, activation=GELU)\\n\",\n       \"      (1): Conv2d(192, 192, kernel_size=(2, 2), stride=(2, 2), bias=False, normalization=BatchNorm2d, activation=GELU)\\n\",\n       \"      (2): Conv2d(192, 768, kernel_size=(2, 2), stride=(2, 2))\\n\",\n       \"    )\\n\",\n       \"    (post_transformer_norm): LayerNormFP32((768,), eps=1e-06, elementwise_affine=True)\\n\",\n       \"    (transformer): Sequential(\\n\",\n       \"      (0): TransformerEncoder(embed_dim=768, ffn_dim=3072, dropout=0.0, ffn_dropout=0.0, stochastic_dropout=0.0, attn_fn=MultiHeadAttention, act_fn=GELU, norm_fn=layer_norm_fp32)\\n\",\n       \"      (1): TransformerEncoder(embed_dim=768, ffn_dim=3072, dropout=0.0, ffn_dropout=0.0, stochastic_dropout=0.0, attn_fn=MultiHeadAttention, act_fn=GELU, norm_fn=layer_norm_fp32)\\n\",\n       \"      (2): TransformerEncoder(embed_dim=768, ffn_dim=3072, dropout=0.0, ffn_dropout=0.0, stochastic_dropout=0.0, attn_fn=MultiHeadAttention, act_fn=GELU, norm_fn=layer_norm_fp32)\\n\",\n       \"      (3): TransformerEncoder(embed_dim=768, ffn_dim=3072, dropout=0.0, ffn_dropout=0.0, stochastic_dropout=0.0, attn_fn=MultiHeadAttention, act_fn=GELU, norm_fn=layer_norm_fp32)\\n\",\n       \"      (4): TransformerEncoder(embed_dim=768, ffn_dim=3072, dropout=0.0, ffn_dropout=0.0, stochastic_dropout=0.0, attn_fn=MultiHeadAttention, act_fn=GELU, norm_fn=layer_norm_fp32)\\n\",\n       \"      (5): TransformerEncoder(embed_dim=768, ffn_dim=3072, dropout=0.0, ffn_dropout=0.0, stochastic_dropout=0.0, attn_fn=MultiHeadAttention, act_fn=GELU, norm_fn=layer_norm_fp32)\\n\",\n       \"      (6): TransformerEncoder(embed_dim=768, ffn_dim=3072, dropout=0.0, ffn_dropout=0.0, stochastic_dropout=0.0, attn_fn=MultiHeadAttention, act_fn=GELU, norm_fn=layer_norm_fp32)\\n\",\n       \"      (7): TransformerEncoder(embed_dim=768, ffn_dim=3072, dropout=0.0, ffn_dropout=0.0, stochastic_dropout=0.0, attn_fn=MultiHeadAttention, act_fn=GELU, norm_fn=layer_norm_fp32)\\n\",\n       \"      (8): TransformerEncoder(embed_dim=768, ffn_dim=3072, dropout=0.0, ffn_dropout=0.0, stochastic_dropout=0.0, attn_fn=MultiHeadAttention, act_fn=GELU, norm_fn=layer_norm_fp32)\\n\",\n       \"      (9): TransformerEncoder(embed_dim=768, ffn_dim=3072, dropout=0.0, ffn_dropout=0.0, stochastic_dropout=0.0, attn_fn=MultiHeadAttention, act_fn=GELU, norm_fn=layer_norm_fp32)\\n\",\n       \"      (10): TransformerEncoder(embed_dim=768, ffn_dim=3072, dropout=0.0, ffn_dropout=0.0, stochastic_dropout=0.0, attn_fn=MultiHeadAttention, act_fn=GELU, norm_fn=layer_norm_fp32)\\n\",\n       \"      (11): TransformerEncoder(embed_dim=768, ffn_dim=3072, dropout=0.0, ffn_dropout=0.0, stochastic_dropout=0.0, attn_fn=MultiHeadAttention, act_fn=GELU, norm_fn=layer_norm_fp32)\\n\",\n       \"    )\\n\",\n       \"    (classifier): SimpleImageProjectionHead()\\n\",\n       \"    (pos_embed): LearnablePositionalEmbedding(num_embeddings=196, embedding_dim=768, padding_idx=None, sequence_first=False)\\n\",\n       \"    (emb_dropout): Dropout(p=0.0, inplace=False)\\n\",\n       \"  )\\n\",\n       \"  (text_encoder): TextTransformer(\\n\",\n       \"    (embedding_layer): Embedding(49408, 512)\\n\",\n       \"    (positional_embedding): LearnablePositionalEmbedding(num_embeddings=77, embedding_dim=512, padding_idx=None, sequence_first=False)\\n\",\n       \"    (embedding_dropout): Dropout(p=0.0, inplace=False)\\n\",\n       \"    (transformer): ModuleList(\\n\",\n       \"      (0-11): 12 x TransformerEncoder(embed_dim=512, ffn_dim=2048, dropout=0.0, ffn_dropout=0.0, stochastic_dropout=0.0, attn_fn=MultiHeadAttention, act_fn=GELU, norm_fn=layer_norm_fp32)\\n\",\n       \"    )\\n\",\n       \"    (final_layer_norm): LayerNormFP32((512,), eps=1e-05, elementwise_affine=True)\\n\",\n       \"  )\\n\",\n       \")\"\n      ]\n     },\n     \"execution_count\": 13,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"from corenet.options.opts import get_training_arguments\\n\",\n    \"from corenet.modeling import get_model\\n\",\n    \"from PIL import Image\\n\",\n    \"import torch\\n\",\n    \"import os\\n\",\n    \"from torchvision.transforms import Compose, Resize, PILToTensor, CenterCrop\\n\",\n    \"from corenet.data.text_tokenizer import build_tokenizer\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"# configuration file path\\n\",\n    \"config_file = os.path.join(\\n\",\n    \"    os.getcwd(), \\\"..\\\", \\\"projects/range_augment/clip/clip_vit_base.yaml\\\"\\n\",\n    \")\\n\",\n    \"# pre-trained weights\\n\",\n    \"pretrained_weights = \\\"https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/clip/clip_vit_base_16.pt\\\"\\n\",\n    \"\\n\",\n    \"opts = get_training_arguments(\\n\",\n    \"    args=[\\n\",\n    \"        \\\"--common.config-file\\\",\\n\",\n    \"        config_file,\\n\",\n    \"        \\\"--model.multi-modal-image-text.pretrained\\\",\\n\",\n    \"        pretrained_weights,\\n\",\n    \"    ]\\n\",\n    \")\\n\",\n    \"\\n\",\n    \"# build the model\\n\",\n    \"model = get_model(opts)\\n\",\n    \"# set the model in evaluation mode.\\n\",\n    \"model.eval()\"\n   ]\n  },\n  {\n   \"attachments\": {},\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Zero-shot classification using CLIP\\n\",\n    \"\\n\",\n    \"Zero-shot classification involves following steps:\\n\",\n    \"\\n\",\n    \"1. ***Choose Textual Description:*** Select the textual description that represents the class we want to classify images into. This could be a simple phrase or a sentence describing the class. For example, if we want to classify images of dogs, the textual description could be \\\"a photo of a dog\\\".\\n\",\n    \"2. ***Encode Textual Description:*** Use CLIP's text encoder to convert the textual description into a vector representation. This is done by passing the textual description through the text encoder of the CLIP model.\\n\",\n    \"3. ***Encode Image:*** Similar to text encoder, encode the image we want to classify using CLIP's image encoder. This involves passing the image through the image encoder of the CLIP model.\\n\",\n    \"4. ***Compute Similarity Score:*** Calculate the similarity score between the encoded image and the encoded textual description. This is typically done by taking a dot-product between image embeddings and text embeddings.\\n\",\n    \"5. ***Classify Image:*** The similarity score obtained in the previous step represents how well the image matches the textual description. Higher similarity scores indicate a stronger association between the image and the textual description. We can take an argmax to identify the class corresponding to the input image.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"torch.Size([3, 7])\"\n      ]\n     },\n     \"execution_count\": 14,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# build the text tokenizer. It is useful to convert the text description into tokens.\\n\",\n    \"text_tokenizer = build_tokenizer(opts)\\n\",\n    \"\\n\",\n    \"## STEP 1: Choose Textual description\\n\",\n    \"\\n\",\n    \"example_class_names = [\\\"cat\\\", \\\"horse\\\", \\\"dog\\\"]\\n\",\n    \"input_text_templates = [\\n\",\n    \"    \\\"a photo of a {}\\\".format(class_name) for class_name in example_class_names\\n\",\n    \"]\\n\",\n    \"# Context length is 7 because we have 5 words in text template + beginning of text token + end of text token\\n\",\n    \"context_length = 7\\n\",\n    \"\\n\",\n    \"tokenized_input_templates = [\\n\",\n    \"    text_tokenizer(inp_template) for inp_template in input_text_templates\\n\",\n    \"]\\n\",\n    \"# The size of tokenized_input_templates after stacking would be [num_classes, context_length]. In this case,\\n\",\n    \"# num_classes=3 (cat, horse, dog) and context_length=7\\n\",\n    \"tokenized_input_templates = torch.stack(tokenized_input_templates, dim=0)\\n\",\n    \"tokenized_input_templates.shape\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"torch.Size([512, 3])\"\n      ]\n     },\n     \"execution_count\": 15,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"## STEP 2: Encode Textual description\\n\",\n    \"\\n\",\n    \"# The expected input to text encoder is [batch_size, num_classes, num_captions, context_length]\\n\",\n    \"# For this example, we have batch_size=1 and num_captions=1.\\n\",\n    \"# So, we add dummy dimensions to tokenized_input_templates to convert its shape from [num_classes, context_length] to [batch_size, num_classes, num_captions, context_length]\\n\",\n    \"\\n\",\n    \"tokenized_input_templates = tokenized_input_templates[None, :, None, :]\\n\",\n    \"\\n\",\n    \"# produce text_embeddings\\n\",\n    \"with torch.no_grad():\\n\",\n    \"    text_embeddings = model.text_encoder(tokenized_input_templates)\\n\",\n    \"# The shape of text embeddings is [hidden_dim, num_classes]\\n\",\n    \"text_embeddings.shape\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 16,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"image/png\": \"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\",\n      \"text/plain\": [\n       \"<PIL.Image.Image image mode=RGB size=1024x683>\"\n      ]\n     },\n     \"execution_count\": 16,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"## STEP 3: Encode image\\n\",\n    \"\\n\",\n    \"## STEP 3.1: Read an image\\n\",\n    \"img_path = os.path.join(os.getcwd(), \\\"..\\\", \\\"assets\\\", \\\"dog.jpeg\\\")\\n\",\n    \"image = Image.open(img_path).convert(\\\"RGB\\\")\\n\",\n    \"image\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 17,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"torch.Size([1, 3, 224, 224])\"\n      ]\n     },\n     \"execution_count\": 17,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"## STEP 3.2: Transform an image\\n\",\n    \"# The model is pre-trained using 224x224 resolution. Therefore, we resize the input PIL image while maintaining an aspect ratio,\\n\",\n    \"# such that shorter dimension is 224. We then crop 224x224 image from the center. After that, we convert the resized PIL image into a tensor.\\n\",\n    \"# The values in tensor range between 0 and 255. We covert it to float and normalize it between 0.0 and 1.0 by dividing the tensor by 255.\\n\",\n    \"\\n\",\n    \"img_transforms = Compose([Resize(size=224), CenterCrop(size=224), PILToTensor()])\\n\",\n    \"\\n\",\n    \"# Transform the image and normalize it between 0 and 1\\n\",\n    \"input_img_tensor = img_transforms(image)\\n\",\n    \"input_img_tensor = input_img_tensor.to(torch.float).div(255.0)\\n\",\n    \"\\n\",\n    \"# add dummy batch dimension\\n\",\n    \"input_img_tensor = input_img_tensor[None, ...]\\n\",\n    \"input_img_tensor.shape\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 18,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"torch.Size([1, 512])\"\n      ]\n     },\n     \"execution_count\": 18,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"## STEP 3.3 Encode an image\\n\",\n    \"with torch.no_grad():\\n\",\n    \"    image_embeddings = model.image_encoder(input_img_tensor)[\\\"logits\\\"]\\n\",\n    \"# the shape of image_embeddings is [batch_size, hidden_dim]\\n\",\n    \"image_embeddings.shape\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 19,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"torch.Size([1, 3])\"\n      ]\n     },\n     \"execution_count\": 19,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"## STEP 4: Compute similarity score\\n\",\n    \"\\n\",\n    \"# Compute a dot product between image and text  embeddings\\n\",\n    \"# [batch_size, hidden_dim] x [hidden_dim, num_classes] --> [batch_size, num_classes]\\n\",\n    \"similarity_score = image_embeddings @ text_embeddings\\n\",\n    \"similarity_score.shape\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 20,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Predicted class for sample 0 is dog (p=0.37)\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"## STEP 5: Clasify image\\n\",\n    \"\\n\",\n    \"predicted_class_prob, predicted_class_id = torch.max(similarity_score, dim=-1)\\n\",\n    \"n_samples = predicted_class_prob.shape[0]\\n\",\n    \"for batch_id in range(n_samples):\\n\",\n    \"    print(\\n\",\n    \"        f\\\"Predicted class for sample {batch_id} is {example_class_names[predicted_class_id[batch_id]]} (p={predicted_class_prob[batch_id]:.2f})\\\"\\n\",\n    \"    )\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"corenet\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.10.8\"\n  },\n  \"orig_nbformat\": 4\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 2\n}\n"
  },
  {
    "path": "tutorials/guide_slurm_and_multi_node_training.md",
    "content": "# Guide: Slurm and multi-node training\n\nThis guide assumes you have a prior understanding of how `corenet-train` works. If you\nare new to the CoreNet, please consider going through [this tutorial](./train_a_new_model_on_a_new_dataset_from_scratch.ipynb) first.\n\nCoreNet supports multi-node distributed training using DDP and FSDP. In the following \ncommand, we assume a multi-node-multi-gpu or multi-node-single-gpu cluster.\n\n```bash\n# Assuming 4-node x 8-GPU Cluster:\nexport CFG_FILE=\"path/to/config.yaml\"         # Please change this to your desired config file.\nexport GPU_PER_NODE=\"8\"                       # Please change this to the number of GPUs that are available on each node.\nexport NUM_NODES=\"4\"                          # Please change this to the number of nodes (i.e. hosts/machines) in your cluster.\nexport NODE_RANK=\"0\"                          # Please change this to a number in range [0, $NUM_NODES-1]. Each node must use a unique rank.\nexport MAIN_IP_PORT=\"tcp://IP_OF_RANK0:PORT\"  # Please change \"IP_OF_RANK0\" to the host name with rank 0 (should be accessible from other nodes) and change \"PORT\" to a free port number.\n\nexport WORLD_SIZE=$((NUM_NODES * GPU_PER_NODE))\nexport GPU_RANK=$((NODE_RANK * GPU_PER_NODE))\n\ncorenet-train --common.config-file $CFG_FILE --common.results-loc results --ddp.rank $GPU_RANK --ddp.world-size $WORLD_SIZE --ddp.dist-url $MAIN_IP_PORT --ddp.backend nccl\n```\n\n> **_NOTE:_** As reflected in the above `WORLD_SIZE` and `GPU_RANK` calculations, the\n> `--ddp.rank` and `--ddp.world-size` arguments expect gpu indices,\n> rather than node indices. However, you should run `corenet-train` once per node.\n\n### Running on a Slurm cluster\n\nPlease customize the following template for slurm clusters. Also, **please note that we\nhave not tested CoreNet on Slurm**. The \nfollowing script assumes a 4-node x 8-GPU cluster.\n\n```bash\n#!/bin/bash\n#SBATCH --job-name=your-job-name\n#SBATCH --nodes=4                # Please change this to the number of nodes (i.e. hosts/machines) in your cluster.\n#SBATCH --ntasks-per-node=1      # No need to change this line, even for multi-gpu nodes.\n#SBATCH --gpus-per-node=gpu:8    # Please change this to the number of GPUs that are available on each node.\n\nexport CFG_FILE=\"path/to/config.yaml\"         # Please change this to your desired config file.\n\nexport GPU_PER_NODE=\"$SLURM_GPUS_PER_NODE\"                       \nexport NUM_NODES=\"$SLURM_NNODES\"\nexport NODE_RANK=\"$SLURM_PROCID\"\n# Inspired by https://discuss.pytorch.org/t/distributed-training-on-slurm-cluster/150417/7\nexport MAIN_PORT=$(expr 10000 + $(echo -n $SLURM_JOBID | tail -c 4))\nexport MAIN_IP=\"$(scontrol show hostnames \"$SLURM_JOB_NODELIST\" | head -n 1)\"\nexport MAIN_IP_PORT=\"tcp://$MAIN_IP:$MAIN_PORT\"\nexport WORLD_SIZE=$((NUM_NODES * GPU_PER_NODE))\nexport GPU_RANK=$((NODE_RANK * GPU_PER_NODE))\n\ncorenet-train --common.config-file $CFG_FILE --common.results-loc results --ddp.rank $GPU_RANK --ddp.world-size $WORLD_SIZE --ddp.dist-url $MAIN_IP_PORT --ddp.backend nccl\n```\n"
  },
  {
    "path": "tutorials/object_detection.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"attachments\": {},\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Object Detection Demo\\n\",\n    \"\\n\",\n    \"This example shows the usage of Mask R-CNN with MobileViT as an image encoder. The model is pre-trained on the COCO dataset for the task of object detection. \\n\",\n    \"\\n\",\n    \"Typical process for object detection involves:\\n\",\n    \"\\n\",\n    \"1. ***Choose a Pre-trained Model:*** Select a pre-trained detection model. In this example, it is Mask R-CNN with MobileViT.\\n\",\n    \"2. ***Preprocess Input Image:*** Preprocess the input image to match the requirements of the pre-trained model. This typically involves resizing, normalization, and any other preprocessing steps required by the specific model.\\n\",\n    \"3. ***Generate detection output:*** Perform a forward pass of the input image through the pre-trained model to obtain the detection output. The model will output a detection results for each object present in the input image.\"\n   ]\n  },\n  {\n   \"attachments\": {},\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## STEP 1: Pre-trained model\\n\",\n    \"Creating a model is simple. You need a configuration file and the path to the pre-trained weights. Below is an example code snippet\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stderr\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"/Users/sachinmehta/miniconda3/envs/corenet/lib/python3.10/site-packages/turicreate/_deps/__init__.py:9: DeprecationWarning: The distutils package is deprecated and slated for removal in Python 3.12. Use setuptools or check PEP 632 for potential alternatives\\n\",\n      \"  from distutils.version import StrictVersion as _StrictVersion\\n\"\n     ]\n    },\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"2024-04-15 20:52:44 - \\u001b[34m\\u001b[1mLOGS   \\u001b[0m - Pretrained weights are loaded from /tmp/corenet/docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/mobilevit_small.pt\\n\",\n      \"2024-04-15 20:52:44 - \\u001b[32m\\u001b[1mINFO   \\u001b[0m - Trainable parameters: ['neural_augmentor.brightness._low', 'neural_augmentor.brightness._high', 'neural_augmentor.contrast._low', 'neural_augmentor.contrast._high', 'neural_augmentor.noise._low', 'neural_augmentor.noise._high', 'conv_1.block.conv.weight', 'conv_1.block.norm.weight', 'conv_1.block.norm.bias', 'layer_1.0.block.exp_1x1.block.conv.weight', 'layer_1.0.block.exp_1x1.block.norm.weight', 'layer_1.0.block.exp_1x1.block.norm.bias', 'layer_1.0.block.conv_3x3.block.conv.weight', 'layer_1.0.block.conv_3x3.block.norm.weight', 'layer_1.0.block.conv_3x3.block.norm.bias', 'layer_1.0.block.red_1x1.block.conv.weight', 'layer_1.0.block.red_1x1.block.norm.weight', 'layer_1.0.block.red_1x1.block.norm.bias', 'layer_2.0.block.exp_1x1.block.conv.weight', 'layer_2.0.block.exp_1x1.block.norm.weight', 'layer_2.0.block.exp_1x1.block.norm.bias', 'layer_2.0.block.conv_3x3.block.conv.weight', 'layer_2.0.block.conv_3x3.block.norm.weight', 'layer_2.0.block.conv_3x3.block.norm.bias', 'layer_2.0.block.red_1x1.block.conv.weight', 'layer_2.0.block.red_1x1.block.norm.weight', 'layer_2.0.block.red_1x1.block.norm.bias', 'layer_2.1.block.exp_1x1.block.conv.weight', 'layer_2.1.block.exp_1x1.block.norm.weight', 'layer_2.1.block.exp_1x1.block.norm.bias', 'layer_2.1.block.conv_3x3.block.conv.weight', 'layer_2.1.block.conv_3x3.block.norm.weight', 'layer_2.1.block.conv_3x3.block.norm.bias', 'layer_2.1.block.red_1x1.block.conv.weight', 'layer_2.1.block.red_1x1.block.norm.weight', 'layer_2.1.block.red_1x1.block.norm.bias', 'layer_2.2.block.exp_1x1.block.conv.weight', 'layer_2.2.block.exp_1x1.block.norm.weight', 'layer_2.2.block.exp_1x1.block.norm.bias', 'layer_2.2.block.conv_3x3.block.conv.weight', 'layer_2.2.block.conv_3x3.block.norm.weight', 'layer_2.2.block.conv_3x3.block.norm.bias', 'layer_2.2.block.red_1x1.block.conv.weight', 'layer_2.2.block.red_1x1.block.norm.weight', 'layer_2.2.block.red_1x1.block.norm.bias', 'layer_3.0.block.exp_1x1.block.conv.weight', 'layer_3.0.block.exp_1x1.block.norm.weight', 'layer_3.0.block.exp_1x1.block.norm.bias', 'layer_3.0.block.conv_3x3.block.conv.weight', 'layer_3.0.block.conv_3x3.block.norm.weight', 'layer_3.0.block.conv_3x3.block.norm.bias', 'layer_3.0.block.red_1x1.block.conv.weight', 'layer_3.0.block.red_1x1.block.norm.weight', 'layer_3.0.block.red_1x1.block.norm.bias', 'layer_3.1.local_rep.conv_3x3.block.conv.weight', 'layer_3.1.local_rep.conv_3x3.block.norm.weight', 'layer_3.1.local_rep.conv_3x3.block.norm.bias', 'layer_3.1.local_rep.conv_1x1.block.conv.weight', 'layer_3.1.global_rep.0.pre_norm_mha.0.weight', 'layer_3.1.global_rep.0.pre_norm_mha.0.bias', 'layer_3.1.global_rep.0.pre_norm_mha.1.qkv_proj.weight', 'layer_3.1.global_rep.0.pre_norm_mha.1.qkv_proj.bias', 'layer_3.1.global_rep.0.pre_norm_mha.1.out_proj.weight', 'layer_3.1.global_rep.0.pre_norm_mha.1.out_proj.bias', 'layer_3.1.global_rep.0.pre_norm_ffn.0.weight', 'layer_3.1.global_rep.0.pre_norm_ffn.0.bias', 'layer_3.1.global_rep.0.pre_norm_ffn.1.weight', 'layer_3.1.global_rep.0.pre_norm_ffn.1.bias', 'layer_3.1.global_rep.0.pre_norm_ffn.4.weight', 'layer_3.1.global_rep.0.pre_norm_ffn.4.bias', 'layer_3.1.global_rep.1.pre_norm_mha.0.weight', 'layer_3.1.global_rep.1.pre_norm_mha.0.bias', 'layer_3.1.global_rep.1.pre_norm_mha.1.qkv_proj.weight', 'layer_3.1.global_rep.1.pre_norm_mha.1.qkv_proj.bias', 'layer_3.1.global_rep.1.pre_norm_mha.1.out_proj.weight', 'layer_3.1.global_rep.1.pre_norm_mha.1.out_proj.bias', 'layer_3.1.global_rep.1.pre_norm_ffn.0.weight', 'layer_3.1.global_rep.1.pre_norm_ffn.0.bias', 'layer_3.1.global_rep.1.pre_norm_ffn.1.weight', 'layer_3.1.global_rep.1.pre_norm_ffn.1.bias', 'layer_3.1.global_rep.1.pre_norm_ffn.4.weight', 'layer_3.1.global_rep.1.pre_norm_ffn.4.bias', 'layer_3.1.global_rep.2.weight', 'layer_3.1.global_rep.2.bias', 'layer_3.1.conv_proj.block.conv.weight', 'layer_3.1.conv_proj.block.norm.weight', 'layer_3.1.conv_proj.block.norm.bias', 'layer_3.1.fusion.block.conv.weight', 'layer_3.1.fusion.block.norm.weight', 'layer_3.1.fusion.block.norm.bias', 'layer_4.0.block.exp_1x1.block.conv.weight', 'layer_4.0.block.exp_1x1.block.norm.weight', 'layer_4.0.block.exp_1x1.block.norm.bias', 'layer_4.0.block.conv_3x3.block.conv.weight', 'layer_4.0.block.conv_3x3.block.norm.weight', 'layer_4.0.block.conv_3x3.block.norm.bias', 'layer_4.0.block.red_1x1.block.conv.weight', 'layer_4.0.block.red_1x1.block.norm.weight', 'layer_4.0.block.red_1x1.block.norm.bias', 'layer_4.1.local_rep.conv_3x3.block.conv.weight', 'layer_4.1.local_rep.conv_3x3.block.norm.weight', 'layer_4.1.local_rep.conv_3x3.block.norm.bias', 'layer_4.1.local_rep.conv_1x1.block.conv.weight', 'layer_4.1.global_rep.0.pre_norm_mha.0.weight', 'layer_4.1.global_rep.0.pre_norm_mha.0.bias', 'layer_4.1.global_rep.0.pre_norm_mha.1.qkv_proj.weight', 'layer_4.1.global_rep.0.pre_norm_mha.1.qkv_proj.bias', 'layer_4.1.global_rep.0.pre_norm_mha.1.out_proj.weight', 'layer_4.1.global_rep.0.pre_norm_mha.1.out_proj.bias', 'layer_4.1.global_rep.0.pre_norm_ffn.0.weight', 'layer_4.1.global_rep.0.pre_norm_ffn.0.bias', 'layer_4.1.global_rep.0.pre_norm_ffn.1.weight', 'layer_4.1.global_rep.0.pre_norm_ffn.1.bias', 'layer_4.1.global_rep.0.pre_norm_ffn.4.weight', 'layer_4.1.global_rep.0.pre_norm_ffn.4.bias', 'layer_4.1.global_rep.1.pre_norm_mha.0.weight', 'layer_4.1.global_rep.1.pre_norm_mha.0.bias', 'layer_4.1.global_rep.1.pre_norm_mha.1.qkv_proj.weight', 'layer_4.1.global_rep.1.pre_norm_mha.1.qkv_proj.bias', 'layer_4.1.global_rep.1.pre_norm_mha.1.out_proj.weight', 'layer_4.1.global_rep.1.pre_norm_mha.1.out_proj.bias', 'layer_4.1.global_rep.1.pre_norm_ffn.0.weight', 'layer_4.1.global_rep.1.pre_norm_ffn.0.bias', 'layer_4.1.global_rep.1.pre_norm_ffn.1.weight', 'layer_4.1.global_rep.1.pre_norm_ffn.1.bias', 'layer_4.1.global_rep.1.pre_norm_ffn.4.weight', 'layer_4.1.global_rep.1.pre_norm_ffn.4.bias', 'layer_4.1.global_rep.2.pre_norm_mha.0.weight', 'layer_4.1.global_rep.2.pre_norm_mha.0.bias', 'layer_4.1.global_rep.2.pre_norm_mha.1.qkv_proj.weight', 'layer_4.1.global_rep.2.pre_norm_mha.1.qkv_proj.bias', 'layer_4.1.global_rep.2.pre_norm_mha.1.out_proj.weight', 'layer_4.1.global_rep.2.pre_norm_mha.1.out_proj.bias', 'layer_4.1.global_rep.2.pre_norm_ffn.0.weight', 'layer_4.1.global_rep.2.pre_norm_ffn.0.bias', 'layer_4.1.global_rep.2.pre_norm_ffn.1.weight', 'layer_4.1.global_rep.2.pre_norm_ffn.1.bias', 'layer_4.1.global_rep.2.pre_norm_ffn.4.weight', 'layer_4.1.global_rep.2.pre_norm_ffn.4.bias', 'layer_4.1.global_rep.3.pre_norm_mha.0.weight', 'layer_4.1.global_rep.3.pre_norm_mha.0.bias', 'layer_4.1.global_rep.3.pre_norm_mha.1.qkv_proj.weight', 'layer_4.1.global_rep.3.pre_norm_mha.1.qkv_proj.bias', 'layer_4.1.global_rep.3.pre_norm_mha.1.out_proj.weight', 'layer_4.1.global_rep.3.pre_norm_mha.1.out_proj.bias', 'layer_4.1.global_rep.3.pre_norm_ffn.0.weight', 'layer_4.1.global_rep.3.pre_norm_ffn.0.bias', 'layer_4.1.global_rep.3.pre_norm_ffn.1.weight', 'layer_4.1.global_rep.3.pre_norm_ffn.1.bias', 'layer_4.1.global_rep.3.pre_norm_ffn.4.weight', 'layer_4.1.global_rep.3.pre_norm_ffn.4.bias', 'layer_4.1.global_rep.4.weight', 'layer_4.1.global_rep.4.bias', 'layer_4.1.conv_proj.block.conv.weight', 'layer_4.1.conv_proj.block.norm.weight', 'layer_4.1.conv_proj.block.norm.bias', 'layer_4.1.fusion.block.conv.weight', 'layer_4.1.fusion.block.norm.weight', 'layer_4.1.fusion.block.norm.bias', 'layer_5.0.block.exp_1x1.block.conv.weight', 'layer_5.0.block.exp_1x1.block.norm.weight', 'layer_5.0.block.exp_1x1.block.norm.bias', 'layer_5.0.block.conv_3x3.block.conv.weight', 'layer_5.0.block.conv_3x3.block.norm.weight', 'layer_5.0.block.conv_3x3.block.norm.bias', 'layer_5.0.block.red_1x1.block.conv.weight', 'layer_5.0.block.red_1x1.block.norm.weight', 'layer_5.0.block.red_1x1.block.norm.bias', 'layer_5.1.local_rep.conv_3x3.block.conv.weight', 'layer_5.1.local_rep.conv_3x3.block.norm.weight', 'layer_5.1.local_rep.conv_3x3.block.norm.bias', 'layer_5.1.local_rep.conv_1x1.block.conv.weight', 'layer_5.1.global_rep.0.pre_norm_mha.0.weight', 'layer_5.1.global_rep.0.pre_norm_mha.0.bias', 'layer_5.1.global_rep.0.pre_norm_mha.1.qkv_proj.weight', 'layer_5.1.global_rep.0.pre_norm_mha.1.qkv_proj.bias', 'layer_5.1.global_rep.0.pre_norm_mha.1.out_proj.weight', 'layer_5.1.global_rep.0.pre_norm_mha.1.out_proj.bias', 'layer_5.1.global_rep.0.pre_norm_ffn.0.weight', 'layer_5.1.global_rep.0.pre_norm_ffn.0.bias', 'layer_5.1.global_rep.0.pre_norm_ffn.1.weight', 'layer_5.1.global_rep.0.pre_norm_ffn.1.bias', 'layer_5.1.global_rep.0.pre_norm_ffn.4.weight', 'layer_5.1.global_rep.0.pre_norm_ffn.4.bias', 'layer_5.1.global_rep.1.pre_norm_mha.0.weight', 'layer_5.1.global_rep.1.pre_norm_mha.0.bias', 'layer_5.1.global_rep.1.pre_norm_mha.1.qkv_proj.weight', 'layer_5.1.global_rep.1.pre_norm_mha.1.qkv_proj.bias', 'layer_5.1.global_rep.1.pre_norm_mha.1.out_proj.weight', 'layer_5.1.global_rep.1.pre_norm_mha.1.out_proj.bias', 'layer_5.1.global_rep.1.pre_norm_ffn.0.weight', 'layer_5.1.global_rep.1.pre_norm_ffn.0.bias', 'layer_5.1.global_rep.1.pre_norm_ffn.1.weight', 'layer_5.1.global_rep.1.pre_norm_ffn.1.bias', 'layer_5.1.global_rep.1.pre_norm_ffn.4.weight', 'layer_5.1.global_rep.1.pre_norm_ffn.4.bias', 'layer_5.1.global_rep.2.pre_norm_mha.0.weight', 'layer_5.1.global_rep.2.pre_norm_mha.0.bias', 'layer_5.1.global_rep.2.pre_norm_mha.1.qkv_proj.weight', 'layer_5.1.global_rep.2.pre_norm_mha.1.qkv_proj.bias', 'layer_5.1.global_rep.2.pre_norm_mha.1.out_proj.weight', 'layer_5.1.global_rep.2.pre_norm_mha.1.out_proj.bias', 'layer_5.1.global_rep.2.pre_norm_ffn.0.weight', 'layer_5.1.global_rep.2.pre_norm_ffn.0.bias', 'layer_5.1.global_rep.2.pre_norm_ffn.1.weight', 'layer_5.1.global_rep.2.pre_norm_ffn.1.bias', 'layer_5.1.global_rep.2.pre_norm_ffn.4.weight', 'layer_5.1.global_rep.2.pre_norm_ffn.4.bias', 'layer_5.1.global_rep.3.weight', 'layer_5.1.global_rep.3.bias', 'layer_5.1.conv_proj.block.conv.weight', 'layer_5.1.conv_proj.block.norm.weight', 'layer_5.1.conv_proj.block.norm.bias', 'layer_5.1.fusion.block.conv.weight', 'layer_5.1.fusion.block.norm.weight', 'layer_5.1.fusion.block.norm.bias', 'conv_1x1_exp.block.conv.weight', 'conv_1x1_exp.block.norm.weight', 'conv_1x1_exp.block.norm.bias', 'classifier.fc.weight', 'classifier.fc.bias']\\n\",\n      \"2024-04-15 20:53:01 - \\u001b[34m\\u001b[1mLOGS   \\u001b[0m - Pretrained weights are loaded from /tmp/corenet/docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/detection/maskrcnn_mobilevit.pt\\n\",\n      \"2024-04-15 20:53:01 - \\u001b[32m\\u001b[1mINFO   \\u001b[0m - Trainable parameters: ['model.backbone.encoder.neural_augmentor.brightness._low', 'model.backbone.encoder.neural_augmentor.brightness._high', 'model.backbone.encoder.neural_augmentor.contrast._low', 'model.backbone.encoder.neural_augmentor.contrast._high', 'model.backbone.encoder.neural_augmentor.noise._low', 'model.backbone.encoder.neural_augmentor.noise._high', 'model.backbone.encoder.conv_1.block.conv.weight', 'model.backbone.encoder.conv_1.block.norm.weight', 'model.backbone.encoder.conv_1.block.norm.bias', 'model.backbone.encoder.layer_1.0.block.exp_1x1.block.conv.weight', 'model.backbone.encoder.layer_1.0.block.exp_1x1.block.norm.weight', 'model.backbone.encoder.layer_1.0.block.exp_1x1.block.norm.bias', 'model.backbone.encoder.layer_1.0.block.conv_3x3.block.conv.weight', 'model.backbone.encoder.layer_1.0.block.conv_3x3.block.norm.weight', 'model.backbone.encoder.layer_1.0.block.conv_3x3.block.norm.bias', 'model.backbone.encoder.layer_1.0.block.red_1x1.block.conv.weight', 'model.backbone.encoder.layer_1.0.block.red_1x1.block.norm.weight', 'model.backbone.encoder.layer_1.0.block.red_1x1.block.norm.bias', 'model.backbone.encoder.layer_2.0.block.exp_1x1.block.conv.weight', 'model.backbone.encoder.layer_2.0.block.exp_1x1.block.norm.weight', 'model.backbone.encoder.layer_2.0.block.exp_1x1.block.norm.bias', 'model.backbone.encoder.layer_2.0.block.conv_3x3.block.conv.weight', 'model.backbone.encoder.layer_2.0.block.conv_3x3.block.norm.weight', 'model.backbone.encoder.layer_2.0.block.conv_3x3.block.norm.bias', 'model.backbone.encoder.layer_2.0.block.red_1x1.block.conv.weight', 'model.backbone.encoder.layer_2.0.block.red_1x1.block.norm.weight', 'model.backbone.encoder.layer_2.0.block.red_1x1.block.norm.bias', 'model.backbone.encoder.layer_2.1.block.exp_1x1.block.conv.weight', 'model.backbone.encoder.layer_2.1.block.exp_1x1.block.norm.weight', 'model.backbone.encoder.layer_2.1.block.exp_1x1.block.norm.bias', 'model.backbone.encoder.layer_2.1.block.conv_3x3.block.conv.weight', 'model.backbone.encoder.layer_2.1.block.conv_3x3.block.norm.weight', 'model.backbone.encoder.layer_2.1.block.conv_3x3.block.norm.bias', 'model.backbone.encoder.layer_2.1.block.red_1x1.block.conv.weight', 'model.backbone.encoder.layer_2.1.block.red_1x1.block.norm.weight', 'model.backbone.encoder.layer_2.1.block.red_1x1.block.norm.bias', 'model.backbone.encoder.layer_2.2.block.exp_1x1.block.conv.weight', 'model.backbone.encoder.layer_2.2.block.exp_1x1.block.norm.weight', 'model.backbone.encoder.layer_2.2.block.exp_1x1.block.norm.bias', 'model.backbone.encoder.layer_2.2.block.conv_3x3.block.conv.weight', 'model.backbone.encoder.layer_2.2.block.conv_3x3.block.norm.weight', 'model.backbone.encoder.layer_2.2.block.conv_3x3.block.norm.bias', 'model.backbone.encoder.layer_2.2.block.red_1x1.block.conv.weight', 'model.backbone.encoder.layer_2.2.block.red_1x1.block.norm.weight', 'model.backbone.encoder.layer_2.2.block.red_1x1.block.norm.bias', 'model.backbone.encoder.layer_3.0.block.exp_1x1.block.conv.weight', 'model.backbone.encoder.layer_3.0.block.exp_1x1.block.norm.weight', 'model.backbone.encoder.layer_3.0.block.exp_1x1.block.norm.bias', 'model.backbone.encoder.layer_3.0.block.conv_3x3.block.conv.weight', 'model.backbone.encoder.layer_3.0.block.conv_3x3.block.norm.weight', 'model.backbone.encoder.layer_3.0.block.conv_3x3.block.norm.bias', 'model.backbone.encoder.layer_3.0.block.red_1x1.block.conv.weight', 'model.backbone.encoder.layer_3.0.block.red_1x1.block.norm.weight', 'model.backbone.encoder.layer_3.0.block.red_1x1.block.norm.bias', 'model.backbone.encoder.layer_3.1.local_rep.conv_3x3.block.conv.weight', 'model.backbone.encoder.layer_3.1.local_rep.conv_3x3.block.norm.weight', 'model.backbone.encoder.layer_3.1.local_rep.conv_3x3.block.norm.bias', 'model.backbone.encoder.layer_3.1.local_rep.conv_1x1.block.conv.weight', 'model.backbone.encoder.layer_3.1.global_rep.0.pre_norm_mha.0.weight', 'model.backbone.encoder.layer_3.1.global_rep.0.pre_norm_mha.0.bias', 'model.backbone.encoder.layer_3.1.global_rep.0.pre_norm_mha.1.qkv_proj.weight', 'model.backbone.encoder.layer_3.1.global_rep.0.pre_norm_mha.1.qkv_proj.bias', 'model.backbone.encoder.layer_3.1.global_rep.0.pre_norm_mha.1.out_proj.weight', 'model.backbone.encoder.layer_3.1.global_rep.0.pre_norm_mha.1.out_proj.bias', 'model.backbone.encoder.layer_3.1.global_rep.0.pre_norm_ffn.0.weight', 'model.backbone.encoder.layer_3.1.global_rep.0.pre_norm_ffn.0.bias', 'model.backbone.encoder.layer_3.1.global_rep.0.pre_norm_ffn.1.weight', 'model.backbone.encoder.layer_3.1.global_rep.0.pre_norm_ffn.1.bias', 'model.backbone.encoder.layer_3.1.global_rep.0.pre_norm_ffn.4.weight', 'model.backbone.encoder.layer_3.1.global_rep.0.pre_norm_ffn.4.bias', 'model.backbone.encoder.layer_3.1.global_rep.1.pre_norm_mha.0.weight', 'model.backbone.encoder.layer_3.1.global_rep.1.pre_norm_mha.0.bias', 'model.backbone.encoder.layer_3.1.global_rep.1.pre_norm_mha.1.qkv_proj.weight', 'model.backbone.encoder.layer_3.1.global_rep.1.pre_norm_mha.1.qkv_proj.bias', 'model.backbone.encoder.layer_3.1.global_rep.1.pre_norm_mha.1.out_proj.weight', 'model.backbone.encoder.layer_3.1.global_rep.1.pre_norm_mha.1.out_proj.bias', 'model.backbone.encoder.layer_3.1.global_rep.1.pre_norm_ffn.0.weight', 'model.backbone.encoder.layer_3.1.global_rep.1.pre_norm_ffn.0.bias', 'model.backbone.encoder.layer_3.1.global_rep.1.pre_norm_ffn.1.weight', 'model.backbone.encoder.layer_3.1.global_rep.1.pre_norm_ffn.1.bias', 'model.backbone.encoder.layer_3.1.global_rep.1.pre_norm_ffn.4.weight', 'model.backbone.encoder.layer_3.1.global_rep.1.pre_norm_ffn.4.bias', 'model.backbone.encoder.layer_3.1.global_rep.2.weight', 'model.backbone.encoder.layer_3.1.global_rep.2.bias', 'model.backbone.encoder.layer_3.1.conv_proj.block.conv.weight', 'model.backbone.encoder.layer_3.1.conv_proj.block.norm.weight', 'model.backbone.encoder.layer_3.1.conv_proj.block.norm.bias', 'model.backbone.encoder.layer_3.1.fusion.block.conv.weight', 'model.backbone.encoder.layer_3.1.fusion.block.norm.weight', 'model.backbone.encoder.layer_3.1.fusion.block.norm.bias', 'model.backbone.encoder.layer_4.0.block.exp_1x1.block.conv.weight', 'model.backbone.encoder.layer_4.0.block.exp_1x1.block.norm.weight', 'model.backbone.encoder.layer_4.0.block.exp_1x1.block.norm.bias', 'model.backbone.encoder.layer_4.0.block.conv_3x3.block.conv.weight', 'model.backbone.encoder.layer_4.0.block.conv_3x3.block.norm.weight', 'model.backbone.encoder.layer_4.0.block.conv_3x3.block.norm.bias', 'model.backbone.encoder.layer_4.0.block.red_1x1.block.conv.weight', 'model.backbone.encoder.layer_4.0.block.red_1x1.block.norm.weight', 'model.backbone.encoder.layer_4.0.block.red_1x1.block.norm.bias', 'model.backbone.encoder.layer_4.1.local_rep.conv_3x3.block.conv.weight', 'model.backbone.encoder.layer_4.1.local_rep.conv_3x3.block.norm.weight', 'model.backbone.encoder.layer_4.1.local_rep.conv_3x3.block.norm.bias', 'model.backbone.encoder.layer_4.1.local_rep.conv_1x1.block.conv.weight', 'model.backbone.encoder.layer_4.1.global_rep.0.pre_norm_mha.0.weight', 'model.backbone.encoder.layer_4.1.global_rep.0.pre_norm_mha.0.bias', 'model.backbone.encoder.layer_4.1.global_rep.0.pre_norm_mha.1.qkv_proj.weight', 'model.backbone.encoder.layer_4.1.global_rep.0.pre_norm_mha.1.qkv_proj.bias', 'model.backbone.encoder.layer_4.1.global_rep.0.pre_norm_mha.1.out_proj.weight', 'model.backbone.encoder.layer_4.1.global_rep.0.pre_norm_mha.1.out_proj.bias', 'model.backbone.encoder.layer_4.1.global_rep.0.pre_norm_ffn.0.weight', 'model.backbone.encoder.layer_4.1.global_rep.0.pre_norm_ffn.0.bias', 'model.backbone.encoder.layer_4.1.global_rep.0.pre_norm_ffn.1.weight', 'model.backbone.encoder.layer_4.1.global_rep.0.pre_norm_ffn.1.bias', 'model.backbone.encoder.layer_4.1.global_rep.0.pre_norm_ffn.4.weight', 'model.backbone.encoder.layer_4.1.global_rep.0.pre_norm_ffn.4.bias', 'model.backbone.encoder.layer_4.1.global_rep.1.pre_norm_mha.0.weight', 'model.backbone.encoder.layer_4.1.global_rep.1.pre_norm_mha.0.bias', 'model.backbone.encoder.layer_4.1.global_rep.1.pre_norm_mha.1.qkv_proj.weight', 'model.backbone.encoder.layer_4.1.global_rep.1.pre_norm_mha.1.qkv_proj.bias', 'model.backbone.encoder.layer_4.1.global_rep.1.pre_norm_mha.1.out_proj.weight', 'model.backbone.encoder.layer_4.1.global_rep.1.pre_norm_mha.1.out_proj.bias', 'model.backbone.encoder.layer_4.1.global_rep.1.pre_norm_ffn.0.weight', 'model.backbone.encoder.layer_4.1.global_rep.1.pre_norm_ffn.0.bias', 'model.backbone.encoder.layer_4.1.global_rep.1.pre_norm_ffn.1.weight', 'model.backbone.encoder.layer_4.1.global_rep.1.pre_norm_ffn.1.bias', 'model.backbone.encoder.layer_4.1.global_rep.1.pre_norm_ffn.4.weight', 'model.backbone.encoder.layer_4.1.global_rep.1.pre_norm_ffn.4.bias', 'model.backbone.encoder.layer_4.1.global_rep.2.pre_norm_mha.0.weight', 'model.backbone.encoder.layer_4.1.global_rep.2.pre_norm_mha.0.bias', 'model.backbone.encoder.layer_4.1.global_rep.2.pre_norm_mha.1.qkv_proj.weight', 'model.backbone.encoder.layer_4.1.global_rep.2.pre_norm_mha.1.qkv_proj.bias', 'model.backbone.encoder.layer_4.1.global_rep.2.pre_norm_mha.1.out_proj.weight', 'model.backbone.encoder.layer_4.1.global_rep.2.pre_norm_mha.1.out_proj.bias', 'model.backbone.encoder.layer_4.1.global_rep.2.pre_norm_ffn.0.weight', 'model.backbone.encoder.layer_4.1.global_rep.2.pre_norm_ffn.0.bias', 'model.backbone.encoder.layer_4.1.global_rep.2.pre_norm_ffn.1.weight', 'model.backbone.encoder.layer_4.1.global_rep.2.pre_norm_ffn.1.bias', 'model.backbone.encoder.layer_4.1.global_rep.2.pre_norm_ffn.4.weight', 'model.backbone.encoder.layer_4.1.global_rep.2.pre_norm_ffn.4.bias', 'model.backbone.encoder.layer_4.1.global_rep.3.pre_norm_mha.0.weight', 'model.backbone.encoder.layer_4.1.global_rep.3.pre_norm_mha.0.bias', 'model.backbone.encoder.layer_4.1.global_rep.3.pre_norm_mha.1.qkv_proj.weight', 'model.backbone.encoder.layer_4.1.global_rep.3.pre_norm_mha.1.qkv_proj.bias', 'model.backbone.encoder.layer_4.1.global_rep.3.pre_norm_mha.1.out_proj.weight', 'model.backbone.encoder.layer_4.1.global_rep.3.pre_norm_mha.1.out_proj.bias', 'model.backbone.encoder.layer_4.1.global_rep.3.pre_norm_ffn.0.weight', 'model.backbone.encoder.layer_4.1.global_rep.3.pre_norm_ffn.0.bias', 'model.backbone.encoder.layer_4.1.global_rep.3.pre_norm_ffn.1.weight', 'model.backbone.encoder.layer_4.1.global_rep.3.pre_norm_ffn.1.bias', 'model.backbone.encoder.layer_4.1.global_rep.3.pre_norm_ffn.4.weight', 'model.backbone.encoder.layer_4.1.global_rep.3.pre_norm_ffn.4.bias', 'model.backbone.encoder.layer_4.1.global_rep.4.weight', 'model.backbone.encoder.layer_4.1.global_rep.4.bias', 'model.backbone.encoder.layer_4.1.conv_proj.block.conv.weight', 'model.backbone.encoder.layer_4.1.conv_proj.block.norm.weight', 'model.backbone.encoder.layer_4.1.conv_proj.block.norm.bias', 'model.backbone.encoder.layer_4.1.fusion.block.conv.weight', 'model.backbone.encoder.layer_4.1.fusion.block.norm.weight', 'model.backbone.encoder.layer_4.1.fusion.block.norm.bias', 'model.backbone.encoder.layer_5.0.block.exp_1x1.block.conv.weight', 'model.backbone.encoder.layer_5.0.block.exp_1x1.block.norm.weight', 'model.backbone.encoder.layer_5.0.block.exp_1x1.block.norm.bias', 'model.backbone.encoder.layer_5.0.block.conv_3x3.block.conv.weight', 'model.backbone.encoder.layer_5.0.block.conv_3x3.block.norm.weight', 'model.backbone.encoder.layer_5.0.block.conv_3x3.block.norm.bias', 'model.backbone.encoder.layer_5.0.block.red_1x1.block.conv.weight', 'model.backbone.encoder.layer_5.0.block.red_1x1.block.norm.weight', 'model.backbone.encoder.layer_5.0.block.red_1x1.block.norm.bias', 'model.backbone.encoder.layer_5.1.local_rep.conv_3x3.block.conv.weight', 'model.backbone.encoder.layer_5.1.local_rep.conv_3x3.block.norm.weight', 'model.backbone.encoder.layer_5.1.local_rep.conv_3x3.block.norm.bias', 'model.backbone.encoder.layer_5.1.local_rep.conv_1x1.block.conv.weight', 'model.backbone.encoder.layer_5.1.global_rep.0.pre_norm_mha.0.weight', 'model.backbone.encoder.layer_5.1.global_rep.0.pre_norm_mha.0.bias', 'model.backbone.encoder.layer_5.1.global_rep.0.pre_norm_mha.1.qkv_proj.weight', 'model.backbone.encoder.layer_5.1.global_rep.0.pre_norm_mha.1.qkv_proj.bias', 'model.backbone.encoder.layer_5.1.global_rep.0.pre_norm_mha.1.out_proj.weight', 'model.backbone.encoder.layer_5.1.global_rep.0.pre_norm_mha.1.out_proj.bias', 'model.backbone.encoder.layer_5.1.global_rep.0.pre_norm_ffn.0.weight', 'model.backbone.encoder.layer_5.1.global_rep.0.pre_norm_ffn.0.bias', 'model.backbone.encoder.layer_5.1.global_rep.0.pre_norm_ffn.1.weight', 'model.backbone.encoder.layer_5.1.global_rep.0.pre_norm_ffn.1.bias', 'model.backbone.encoder.layer_5.1.global_rep.0.pre_norm_ffn.4.weight', 'model.backbone.encoder.layer_5.1.global_rep.0.pre_norm_ffn.4.bias', 'model.backbone.encoder.layer_5.1.global_rep.1.pre_norm_mha.0.weight', 'model.backbone.encoder.layer_5.1.global_rep.1.pre_norm_mha.0.bias', 'model.backbone.encoder.layer_5.1.global_rep.1.pre_norm_mha.1.qkv_proj.weight', 'model.backbone.encoder.layer_5.1.global_rep.1.pre_norm_mha.1.qkv_proj.bias', 'model.backbone.encoder.layer_5.1.global_rep.1.pre_norm_mha.1.out_proj.weight', 'model.backbone.encoder.layer_5.1.global_rep.1.pre_norm_mha.1.out_proj.bias', 'model.backbone.encoder.layer_5.1.global_rep.1.pre_norm_ffn.0.weight', 'model.backbone.encoder.layer_5.1.global_rep.1.pre_norm_ffn.0.bias', 'model.backbone.encoder.layer_5.1.global_rep.1.pre_norm_ffn.1.weight', 'model.backbone.encoder.layer_5.1.global_rep.1.pre_norm_ffn.1.bias', 'model.backbone.encoder.layer_5.1.global_rep.1.pre_norm_ffn.4.weight', 'model.backbone.encoder.layer_5.1.global_rep.1.pre_norm_ffn.4.bias', 'model.backbone.encoder.layer_5.1.global_rep.2.pre_norm_mha.0.weight', 'model.backbone.encoder.layer_5.1.global_rep.2.pre_norm_mha.0.bias', 'model.backbone.encoder.layer_5.1.global_rep.2.pre_norm_mha.1.qkv_proj.weight', 'model.backbone.encoder.layer_5.1.global_rep.2.pre_norm_mha.1.qkv_proj.bias', 'model.backbone.encoder.layer_5.1.global_rep.2.pre_norm_mha.1.out_proj.weight', 'model.backbone.encoder.layer_5.1.global_rep.2.pre_norm_mha.1.out_proj.bias', 'model.backbone.encoder.layer_5.1.global_rep.2.pre_norm_ffn.0.weight', 'model.backbone.encoder.layer_5.1.global_rep.2.pre_norm_ffn.0.bias', 'model.backbone.encoder.layer_5.1.global_rep.2.pre_norm_ffn.1.weight', 'model.backbone.encoder.layer_5.1.global_rep.2.pre_norm_ffn.1.bias', 'model.backbone.encoder.layer_5.1.global_rep.2.pre_norm_ffn.4.weight', 'model.backbone.encoder.layer_5.1.global_rep.2.pre_norm_ffn.4.bias', 'model.backbone.encoder.layer_5.1.global_rep.3.weight', 'model.backbone.encoder.layer_5.1.global_rep.3.bias', 'model.backbone.encoder.layer_5.1.conv_proj.block.conv.weight', 'model.backbone.encoder.layer_5.1.conv_proj.block.norm.weight', 'model.backbone.encoder.layer_5.1.conv_proj.block.norm.bias', 'model.backbone.encoder.layer_5.1.fusion.block.conv.weight', 'model.backbone.encoder.layer_5.1.fusion.block.norm.weight', 'model.backbone.encoder.layer_5.1.fusion.block.norm.bias', 'model.backbone.backbone_proj_layers.4.block.conv.weight', 'model.backbone.backbone_proj_layers.4.block.norm.weight', 'model.backbone.backbone_proj_layers.4.block.norm.bias', 'model.backbone.backbone_proj_layers.8.block.conv.weight', 'model.backbone.backbone_proj_layers.8.block.norm.weight', 'model.backbone.backbone_proj_layers.8.block.norm.bias', 'model.backbone.backbone_proj_layers.16.block.conv.weight', 'model.backbone.backbone_proj_layers.16.block.norm.weight', 'model.backbone.backbone_proj_layers.16.block.norm.bias', 'model.backbone.backbone_proj_layers.32.block.conv.weight', 'model.backbone.backbone_proj_layers.32.block.norm.weight', 'model.backbone.backbone_proj_layers.32.block.norm.bias', 'model.backbone.fpn_proj_layers.4.block.conv.weight', 'model.backbone.fpn_proj_layers.4.block.norm.weight', 'model.backbone.fpn_proj_layers.4.block.norm.bias', 'model.backbone.fpn_proj_layers.8.block.conv.weight', 'model.backbone.fpn_proj_layers.8.block.norm.weight', 'model.backbone.fpn_proj_layers.8.block.norm.bias', 'model.backbone.fpn_proj_layers.16.block.conv.weight', 'model.backbone.fpn_proj_layers.16.block.norm.weight', 'model.backbone.fpn_proj_layers.16.block.norm.bias', 'model.backbone.fpn_proj_layers.32.block.conv.weight', 'model.backbone.fpn_proj_layers.32.block.norm.weight', 'model.backbone.fpn_proj_layers.32.block.norm.bias', 'model.backbone.extra_layers.64.block.conv.weight', 'model.backbone.extra_layers.64.block.norm.weight', 'model.backbone.extra_layers.64.block.norm.bias', 'model.rpn.head.conv.0.block.conv.weight', 'model.rpn.head.conv.1.weight', 'model.rpn.head.conv.1.bias', 'model.rpn.head.conv.3.block.conv.weight', 'model.rpn.head.conv.4.weight', 'model.rpn.head.conv.4.bias', 'model.rpn.head.cls_logits.block.conv.weight', 'model.rpn.head.cls_logits.block.conv.bias', 'model.rpn.head.bbox_pred.block.conv.weight', 'model.rpn.head.bbox_pred.block.conv.bias', 'model.roi_heads.box_head.0.block.conv.weight', 'model.roi_heads.box_head.1.weight', 'model.roi_heads.box_head.1.bias', 'model.roi_heads.box_head.3.block.conv.weight', 'model.roi_heads.box_head.4.weight', 'model.roi_heads.box_head.4.bias', 'model.roi_heads.box_head.6.block.conv.weight', 'model.roi_heads.box_head.7.weight', 'model.roi_heads.box_head.7.bias', 'model.roi_heads.box_head.9.block.conv.weight', 'model.roi_heads.box_head.10.weight', 'model.roi_heads.box_head.10.bias', 'model.roi_heads.box_head.13.weight', 'model.roi_heads.box_head.13.bias', 'model.roi_heads.box_predictor.cls_score.weight', 'model.roi_heads.box_predictor.cls_score.bias', 'model.roi_heads.box_predictor.bbox_pred.weight', 'model.roi_heads.box_predictor.bbox_pred.bias', 'model.roi_heads.mask_head.0.block.conv.weight', 'model.roi_heads.mask_head.1.weight', 'model.roi_heads.mask_head.1.bias', 'model.roi_heads.mask_head.3.block.conv.weight', 'model.roi_heads.mask_head.4.weight', 'model.roi_heads.mask_head.4.bias', 'model.roi_heads.mask_head.6.block.conv.weight', 'model.roi_heads.mask_head.7.weight', 'model.roi_heads.mask_head.7.bias', 'model.roi_heads.mask_head.9.block.conv.weight', 'model.roi_heads.mask_head.10.weight', 'model.roi_heads.mask_head.10.bias', 'model.roi_heads.mask_predictor.0.block.conv.weight', 'model.roi_heads.mask_predictor.1.weight', 'model.roi_heads.mask_predictor.1.bias', 'model.roi_heads.mask_predictor.3.block.conv.weight', 'model.roi_heads.mask_predictor.3.block.conv.bias']\\n\"\n     ]\n    },\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"MaskRCNNDetector(\\n\",\n       \"  (model): MaskRCNN(\\n\",\n       \"    (transform): GeneralizedRCNNTransform(\\n\",\n       \"        Normalize(mean=[0.0, 0.0, 0.0], std=[1.0, 1.0, 1.0])\\n\",\n       \"        Resize(min_size=(800,), max_size=1333, mode='bilinear')\\n\",\n       \"    )\\n\",\n       \"    (backbone): MaskRCNNEncoder(\\n\",\n       \"      (encoder): MobileViT(\\n\",\n       \"        (neural_augmentor): DistributionNeuralAugmentor(\\n\",\n       \"        \\tBrightness=UniformSampler(min_fn=Clip(min=0.1, max=0.9, clipping=soft), max_fn=Clip(min=1.1, max=10.0, clipping=soft)), \\n\",\n       \"        \\tContrast=UniformSampler(min_fn=Clip(min=0.1, max=0.9, clipping=soft), max_fn=Clip(min=1.1, max=10.0, clipping=soft)), \\n\",\n       \"        \\tNoise=UniformSampler(min_fn=Clip(min=0.0, max=5e-05, clipping=soft), max_fn=Clip(min=0.0001, max=1.0, clipping=soft)), )\\n\",\n       \"        (conv_1): Conv2d(3, 16, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False, normalization=BatchNorm2d, activation=Swish)\\n\",\n       \"        (layer_1): Sequential(\\n\",\n       \"          (0): InvertedResidual(in_channels=16, out_channels=32, stride=1, exp=4, dilation=1, skip_conn=False)\\n\",\n       \"        )\\n\",\n       \"        (layer_2): Sequential(\\n\",\n       \"          (0): InvertedResidual(in_channels=32, out_channels=64, stride=2, exp=4, dilation=1, skip_conn=False)\\n\",\n       \"          (1): InvertedResidual(in_channels=64, out_channels=64, stride=1, exp=4, dilation=1, skip_conn=True)\\n\",\n       \"          (2): InvertedResidual(in_channels=64, out_channels=64, stride=1, exp=4, dilation=1, skip_conn=True)\\n\",\n       \"        )\\n\",\n       \"        (layer_3): Sequential(\\n\",\n       \"          (0): InvertedResidual(in_channels=64, out_channels=96, stride=2, exp=4, dilation=1, skip_conn=False)\\n\",\n       \"          (1): MobileViTBlock(\\n\",\n       \"          \\t Local representations\\n\",\n       \"          \\t\\t Conv2d(96, 96, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False, normalization=BatchNorm2d, activation=Swish)\\n\",\n       \"          \\t\\t Conv2d(96, 144, kernel_size=(1, 1), stride=(1, 1), bias=False)\\n\",\n       \"          \\t Global representations with patch size of 2x2\\n\",\n       \"          \\t\\t TransformerEncoder(embed_dim=144, ffn_dim=288, dropout=0.1, ffn_dropout=0.0, stochastic_dropout=0.0, attn_fn=MultiHeadAttention, act_fn=Swish, norm_fn=layer_norm)\\n\",\n       \"          \\t\\t TransformerEncoder(embed_dim=144, ffn_dim=288, dropout=0.1, ffn_dropout=0.0, stochastic_dropout=0.0, attn_fn=MultiHeadAttention, act_fn=Swish, norm_fn=layer_norm)\\n\",\n       \"          \\t\\t LayerNorm((144,), eps=1e-06, elementwise_affine=True)\\n\",\n       \"          \\t\\t Conv2d(144, 96, kernel_size=(1, 1), stride=(1, 1), bias=False, normalization=BatchNorm2d, activation=Swish)\\n\",\n       \"          \\t Feature fusion\\n\",\n       \"          \\t\\t Conv2d(192, 96, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False, normalization=BatchNorm2d, activation=Swish)\\n\",\n       \"          )\\n\",\n       \"        )\\n\",\n       \"        (layer_4): Sequential(\\n\",\n       \"          (0): InvertedResidual(in_channels=96, out_channels=128, stride=2, exp=4, dilation=1, skip_conn=False)\\n\",\n       \"          (1): MobileViTBlock(\\n\",\n       \"          \\t Local representations\\n\",\n       \"          \\t\\t Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False, normalization=BatchNorm2d, activation=Swish)\\n\",\n       \"          \\t\\t Conv2d(128, 192, kernel_size=(1, 1), stride=(1, 1), bias=False)\\n\",\n       \"          \\t Global representations with patch size of 2x2\\n\",\n       \"          \\t\\t TransformerEncoder(embed_dim=192, ffn_dim=384, dropout=0.1, ffn_dropout=0.0, stochastic_dropout=0.0, attn_fn=MultiHeadAttention, act_fn=Swish, norm_fn=layer_norm)\\n\",\n       \"          \\t\\t TransformerEncoder(embed_dim=192, ffn_dim=384, dropout=0.1, ffn_dropout=0.0, stochastic_dropout=0.0, attn_fn=MultiHeadAttention, act_fn=Swish, norm_fn=layer_norm)\\n\",\n       \"          \\t\\t TransformerEncoder(embed_dim=192, ffn_dim=384, dropout=0.1, ffn_dropout=0.0, stochastic_dropout=0.0, attn_fn=MultiHeadAttention, act_fn=Swish, norm_fn=layer_norm)\\n\",\n       \"          \\t\\t TransformerEncoder(embed_dim=192, ffn_dim=384, dropout=0.1, ffn_dropout=0.0, stochastic_dropout=0.0, attn_fn=MultiHeadAttention, act_fn=Swish, norm_fn=layer_norm)\\n\",\n       \"          \\t\\t LayerNorm((192,), eps=1e-06, elementwise_affine=True)\\n\",\n       \"          \\t\\t Conv2d(192, 128, kernel_size=(1, 1), stride=(1, 1), bias=False, normalization=BatchNorm2d, activation=Swish)\\n\",\n       \"          \\t Feature fusion\\n\",\n       \"          \\t\\t Conv2d(256, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False, normalization=BatchNorm2d, activation=Swish)\\n\",\n       \"          )\\n\",\n       \"        )\\n\",\n       \"        (layer_5): Sequential(\\n\",\n       \"          (0): InvertedResidual(in_channels=128, out_channels=160, stride=2, exp=4, dilation=1, skip_conn=False)\\n\",\n       \"          (1): MobileViTBlock(\\n\",\n       \"          \\t Local representations\\n\",\n       \"          \\t\\t Conv2d(160, 160, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False, normalization=BatchNorm2d, activation=Swish)\\n\",\n       \"          \\t\\t Conv2d(160, 240, kernel_size=(1, 1), stride=(1, 1), bias=False)\\n\",\n       \"          \\t Global representations with patch size of 2x2\\n\",\n       \"          \\t\\t TransformerEncoder(embed_dim=240, ffn_dim=480, dropout=0.1, ffn_dropout=0.0, stochastic_dropout=0.0, attn_fn=MultiHeadAttention, act_fn=Swish, norm_fn=layer_norm)\\n\",\n       \"          \\t\\t TransformerEncoder(embed_dim=240, ffn_dim=480, dropout=0.1, ffn_dropout=0.0, stochastic_dropout=0.0, attn_fn=MultiHeadAttention, act_fn=Swish, norm_fn=layer_norm)\\n\",\n       \"          \\t\\t TransformerEncoder(embed_dim=240, ffn_dim=480, dropout=0.1, ffn_dropout=0.0, stochastic_dropout=0.0, attn_fn=MultiHeadAttention, act_fn=Swish, norm_fn=layer_norm)\\n\",\n       \"          \\t\\t LayerNorm((240,), eps=1e-06, elementwise_affine=True)\\n\",\n       \"          \\t\\t Conv2d(240, 160, kernel_size=(1, 1), stride=(1, 1), bias=False, normalization=BatchNorm2d, activation=Swish)\\n\",\n       \"          \\t Feature fusion\\n\",\n       \"          \\t\\t Conv2d(320, 160, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False, normalization=BatchNorm2d, activation=Swish)\\n\",\n       \"          )\\n\",\n       \"        )\\n\",\n       \"        (conv_1x1_exp): Identity\\n\",\n       \"        (classifier): Identity\\n\",\n       \"      )\\n\",\n       \"      (backbone_proj_layers): ModuleDict(\\n\",\n       \"        (4): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False, normalization=BatchNorm2d)\\n\",\n       \"        (8): Conv2d(96, 256, kernel_size=(1, 1), stride=(1, 1), bias=False, normalization=BatchNorm2d)\\n\",\n       \"        (16): Conv2d(128, 256, kernel_size=(1, 1), stride=(1, 1), bias=False, normalization=BatchNorm2d)\\n\",\n       \"        (32): Conv2d(160, 256, kernel_size=(1, 1), stride=(1, 1), bias=False, normalization=BatchNorm2d)\\n\",\n       \"      )\\n\",\n       \"      (fpn_proj_layers): ModuleDict(\\n\",\n       \"        (4): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False, normalization=BatchNorm2d)\\n\",\n       \"        (8): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False, normalization=BatchNorm2d)\\n\",\n       \"        (16): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False, normalization=BatchNorm2d)\\n\",\n       \"        (32): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False, normalization=BatchNorm2d)\\n\",\n       \"      )\\n\",\n       \"      (extra_layers): ModuleDict(\\n\",\n       \"        (64): Conv2d(256, 256, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False, normalization=BatchNorm2d)\\n\",\n       \"      )\\n\",\n       \"    )\\n\",\n       \"    (rpn): RegionProposalNetwork(\\n\",\n       \"      (anchor_generator): AnchorGenerator()\\n\",\n       \"      (head): RPNHead(\\n\",\n       \"        (conv): Sequential(\\n\",\n       \"          (0): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\\n\",\n       \"          (1): BatchNorm2dFP32(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\\n\",\n       \"          (2): ReLU()\\n\",\n       \"          (3): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\\n\",\n       \"          (4): BatchNorm2dFP32(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\\n\",\n       \"          (5): ReLU()\\n\",\n       \"        )\\n\",\n       \"        (cls_logits): Conv2d(256, 3, kernel_size=(1, 1), stride=(1, 1))\\n\",\n       \"        (bbox_pred): Conv2d(256, 12, kernel_size=(1, 1), stride=(1, 1))\\n\",\n       \"      )\\n\",\n       \"    )\\n\",\n       \"    (roi_heads): RoIHeads(\\n\",\n       \"      (box_roi_pool): MultiScaleRoIAlign(featmap_names=['4', '8', '16', '32', '64'], output_size=(7, 7), sampling_ratio=2)\\n\",\n       \"      (box_head): FastRCNNConvFCHead(\\n\",\n       \"        (0): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\\n\",\n       \"        (1): BatchNorm2dFP32(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\\n\",\n       \"        (2): ReLU()\\n\",\n       \"        (3): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\\n\",\n       \"        (4): BatchNorm2dFP32(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\\n\",\n       \"        (5): ReLU()\\n\",\n       \"        (6): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\\n\",\n       \"        (7): BatchNorm2dFP32(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\\n\",\n       \"        (8): ReLU()\\n\",\n       \"        (9): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\\n\",\n       \"        (10): BatchNorm2dFP32(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\\n\",\n       \"        (11): ReLU()\\n\",\n       \"        (12): Flatten(start_dim=1, end_dim=-1)\\n\",\n       \"        (13): LinearLayer(in_features=12544, out_features=1024, bias=True, channel_first=False)\\n\",\n       \"        (14): ReLU(inplace=True)\\n\",\n       \"      )\\n\",\n       \"      (box_predictor): FastRCNNPredictor(\\n\",\n       \"        (cls_score): LinearLayer(in_features=1024, out_features=81, bias=True, channel_first=False)\\n\",\n       \"        (bbox_pred): LinearLayer(in_features=1024, out_features=324, bias=True, channel_first=False)\\n\",\n       \"      )\\n\",\n       \"      (mask_roi_pool): MultiScaleRoIAlign(featmap_names=['4', '8', '16', '32', '64'], output_size=(14, 14), sampling_ratio=2)\\n\",\n       \"      (mask_head): MaskRCNNHeads(\\n\",\n       \"        (0): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\\n\",\n       \"        (1): BatchNorm2dFP32(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\\n\",\n       \"        (2): ReLU()\\n\",\n       \"        (3): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\\n\",\n       \"        (4): BatchNorm2dFP32(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\\n\",\n       \"        (5): ReLU()\\n\",\n       \"        (6): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\\n\",\n       \"        (7): BatchNorm2dFP32(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\\n\",\n       \"        (8): ReLU()\\n\",\n       \"        (9): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\\n\",\n       \"        (10): BatchNorm2dFP32(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\\n\",\n       \"        (11): ReLU()\\n\",\n       \"      )\\n\",\n       \"      (mask_predictor): MaskRCNNPredictor(\\n\",\n       \"        (0): ConvTranspose2d(256, 256, kernel_size=(2, 2), stride=(2, 2), bias=False)\\n\",\n       \"        (1): BatchNorm2dFP32(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\\n\",\n       \"        (2): ReLU()\\n\",\n       \"        (3): Conv2d(256, 81, kernel_size=(1, 1), stride=(1, 1))\\n\",\n       \"      )\\n\",\n       \"    )\\n\",\n       \"  )\\n\",\n       \")\"\n      ]\n     },\n     \"execution_count\": 1,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"from corenet.options.opts import get_training_arguments\\n\",\n    \"from corenet.modeling import get_model\\n\",\n    \"from PIL import Image\\n\",\n    \"import torch\\n\",\n    \"from torchvision.transforms import Compose, Resize, PILToTensor\\n\",\n    \"from torchvision.transforms import ToPILImage\\n\",\n    \"import os\\n\",\n    \"from corenet.modeling.models.detection import DetectionPredTuple\\n\",\n    \"from torch.nn import functional as F\\n\",\n    \"import numpy as np\\n\",\n    \"from corenet.utils.visualization_utils import draw_bounding_boxes\\n\",\n    \"import sys\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"# configuration file path\\n\",\n    \"config_file = os.path.join(\\n\",\n    \"    os.getcwd(),\\n\",\n    \"    \\\"..\\\",\\n\",\n    \"    \\\"projects/range_augment/detection/maskrcnn_mobilevit.yaml\\\",\\n\",\n    \")\\n\",\n    \"# pre-trained weights\\n\",\n    \"pretrained_weights = \\\"https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/detection/maskrcnn_mobilevit.pt\\\"\\n\",\n    \"\\n\",\n    \"opts = get_training_arguments(\\n\",\n    \"    args=[\\n\",\n    \"        \\\"--common.config-file\\\",\\n\",\n    \"        config_file,\\n\",\n    \"        \\\"--model.detection.pretrained\\\",\\n\",\n    \"        pretrained_weights,\\n\",\n    \"    ]\\n\",\n    \")\\n\",\n    \"\\n\",\n    \"# build the model\\n\",\n    \"model = get_model(opts)\\n\",\n    \"# set the model in evaluation mode.\\n\",\n    \"model.eval()\"\n   ]\n  },\n  {\n   \"attachments\": {},\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## STEP 2: Read and pre-process input image\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"image/jpeg\": \"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\",\n      \"image/png\": \"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\",\n      \"text/plain\": [\n       \"<PIL.Image.Image image mode=RGB size=1024x683>\"\n      ]\n     },\n     \"execution_count\": 2,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Step 2.1: Read a PIL image and convert to RGB format.\\n\",\n    \"img_path = os.path.join(os.getcwd(), \\\"..\\\", \\\"assets\\\", \\\"dog.jpeg\\\")\\n\",\n    \"image = Image.open(img_path).convert(\\\"RGB\\\")\\n\",\n    \"\\n\",\n    \"# convert an image to numpy (for visualization purposes).\\n\",\n    \"image_np = np.asarray(Image.open(img_path).convert(\\\"RGB\\\"))\\n\",\n    \"\\n\",\n    \"image_width = image.width\\n\",\n    \"image_height = image.height\\n\",\n    \"\\n\",\n    \"image\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"torch.Size([1, 3, 1024, 1024])\"\n      ]\n     },\n     \"execution_count\": 3,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"## STEP 2.2: Preprocess an input image\\n\",\n    \"# The model is fine-tuned on the detection task using 1024x1024 resolution. Therefore, we resize the input PIL image to 1024x1024 size.\\n\",\n    \"# After that, we convert the resized PIL image into a tensor. The values in tensor range between 0 and 255.\\n\",\n    \"# We covert it to float and normalize it between 0.0 and 1.0 by dividing the tensor by 255.\\n\",\n    \"\\n\",\n    \"img_transforms = Compose([Resize(size=(1024, 1024)), PILToTensor()])\\n\",\n    \"\\n\",\n    \"input_tensor = img_transforms(image)\\n\",\n    \"input_tensor = input_tensor.to(torch.float).div(255.0)\\n\",\n    \"\\n\",\n    \"# add dummy batch dimension\\n\",\n    \"input_tensor = input_tensor[None, ...]\\n\",\n    \"input_tensor.shape\"\n   ]\n  },\n  {\n   \"attachments\": {},\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## STEP 3: Generate detection output\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"with torch.no_grad():\\n\",\n    \"    # Feed the input tensor to the model. The shape of the input tensor is [batch_size, 3, height, width]\\n\",\n    \"    # The output of the model will be [batch_size, num_classes, height, width]\\n\",\n    \"    prediction: DetectionPredTuple = model.predict(input_tensor)\\n\",\n    \"\\n\",\n    \"# convert tensors to numpy\\n\",\n    \"boxes = prediction.boxes.cpu().numpy()\\n\",\n    \"labels = prediction.labels.cpu().numpy()\\n\",\n    \"scores = prediction.scores.cpu().numpy()\\n\",\n    \"\\n\",\n    \"masks = prediction.masks\\n\",\n    \"\\n\",\n    \"if masks is not None and masks.shape[0] > 0:\\n\",\n    \"    # Resize the masks and convert them to binary\\n\",\n    \"    masks = F.interpolate(\\n\",\n    \"        masks.unsqueeze(0),\\n\",\n    \"        size=(image_height, image_width),\\n\",\n    \"        mode=\\\"bilinear\\\",\\n\",\n    \"        align_corners=True,\\n\",\n    \"    ).squeeze(0)\\n\",\n    \"    # convert to binary masks\\n\",\n    \"    masks = masks > 0.5\\n\",\n    \"    masks = masks.cpu().numpy()\\n\",\n    \"\\n\",\n    \"# clip bounding boxes\\n\",\n    \"boxes[..., 0::2] = np.clip(a_min=0, a_max=image_width, a=boxes[..., 0::2] * image_width)\\n\",\n    \"boxes[..., 1::2] = np.clip(\\n\",\n    \"    a_min=0, a_max=image_height, a=boxes[..., 1::2] * image_height\\n\",\n    \")\"\n   ]\n  },\n  {\n   \"attachments\": {},\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Install OpenCV for visualization\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Looking in indexes: https://pypi.org/simple, https://pypi.ngc.nvidia.com\\n\",\n      \"Requirement already satisfied: opencv-contrib-python==4.5.5.64 in /Users/sachinmehta/miniconda3/envs/corenet/lib/python3.10/site-packages (4.5.5.64)\\n\",\n      \"Requirement already satisfied: numpy>=1.21.2 in /Users/sachinmehta/miniconda3/envs/corenet/lib/python3.10/site-packages (from opencv-contrib-python==4.5.5.64) (1.26.4)\\n\",\n      \"Note: you may need to restart the kernel to use updated packages.\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"%pip install opencv-contrib-python==4.5.5.64\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"image/jpeg\": \"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\",\n      \"image/png\": \"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\",\n      \"text/plain\": [\n       \"<PIL.Image.Image image mode=RGB size=1024x683>\"\n      ]\n     },\n     \"execution_count\": 6,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"coco_class_names = [\\n\",\n    \"    \\\"background\\\",\\n\",\n    \"    \\\"person\\\",\\n\",\n    \"    \\\"bicycle\\\",\\n\",\n    \"    \\\"car\\\",\\n\",\n    \"    \\\"motorcycle\\\",\\n\",\n    \"    \\\"airplane\\\",\\n\",\n    \"    \\\"bus\\\",\\n\",\n    \"    \\\"train\\\",\\n\",\n    \"    \\\"truck\\\",\\n\",\n    \"    \\\"boat\\\",\\n\",\n    \"    \\\"traffic light\\\",\\n\",\n    \"    \\\"fire hydrant\\\",\\n\",\n    \"    \\\"stop sign\\\",\\n\",\n    \"    \\\"parking meter\\\",\\n\",\n    \"    \\\"bench\\\",\\n\",\n    \"    \\\"bird\\\",\\n\",\n    \"    \\\"cat\\\",\\n\",\n    \"    \\\"dog\\\",\\n\",\n    \"    \\\"horse\\\",\\n\",\n    \"    \\\"sheep\\\",\\n\",\n    \"    \\\"cow\\\",\\n\",\n    \"    \\\"elephant\\\",\\n\",\n    \"    \\\"bear\\\",\\n\",\n    \"    \\\"zebra\\\",\\n\",\n    \"    \\\"giraffe\\\",\\n\",\n    \"    \\\"backpack\\\",\\n\",\n    \"    \\\"umbrella\\\",\\n\",\n    \"    \\\"handbag\\\",\\n\",\n    \"    \\\"tie\\\",\\n\",\n    \"    \\\"suitcase\\\",\\n\",\n    \"    \\\"frisbee\\\",\\n\",\n    \"    \\\"skis\\\",\\n\",\n    \"    \\\"snowboard\\\",\\n\",\n    \"    \\\"sports ball\\\",\\n\",\n    \"    \\\"kite\\\",\\n\",\n    \"    \\\"baseball bat\\\",\\n\",\n    \"    \\\"baseball glove\\\",\\n\",\n    \"    \\\"skateboard\\\",\\n\",\n    \"    \\\"surfboard\\\",\\n\",\n    \"    \\\"tennis racket\\\",\\n\",\n    \"    \\\"bottle\\\",\\n\",\n    \"    \\\"wine glass\\\",\\n\",\n    \"    \\\"cup\\\",\\n\",\n    \"    \\\"fork\\\",\\n\",\n    \"    \\\"knife\\\",\\n\",\n    \"    \\\"spoon\\\",\\n\",\n    \"    \\\"bowl\\\",\\n\",\n    \"    \\\"banana\\\",\\n\",\n    \"    \\\"apple\\\",\\n\",\n    \"    \\\"sandwich\\\",\\n\",\n    \"    \\\"orange\\\",\\n\",\n    \"    \\\"broccoli\\\",\\n\",\n    \"    \\\"carrot\\\",\\n\",\n    \"    \\\"hot dog\\\",\\n\",\n    \"    \\\"pizza\\\",\\n\",\n    \"    \\\"donut\\\",\\n\",\n    \"    \\\"cake\\\",\\n\",\n    \"    \\\"chair\\\",\\n\",\n    \"    \\\"couch\\\",\\n\",\n    \"    \\\"potted plant\\\",\\n\",\n    \"    \\\"bed\\\",\\n\",\n    \"    \\\"dining table\\\",\\n\",\n    \"    \\\"toilet\\\",\\n\",\n    \"    \\\"tv\\\",\\n\",\n    \"    \\\"laptop\\\",\\n\",\n    \"    \\\"mouse\\\",\\n\",\n    \"    \\\"remote\\\",\\n\",\n    \"    \\\"keyboard\\\",\\n\",\n    \"    \\\"cell phone\\\",\\n\",\n    \"    \\\"microwave\\\",\\n\",\n    \"    \\\"oven\\\",\\n\",\n    \"    \\\"toaster\\\",\\n\",\n    \"    \\\"sink\\\",\\n\",\n    \"    \\\"refrigerator\\\",\\n\",\n    \"    \\\"book\\\",\\n\",\n    \"    \\\"clock\\\",\\n\",\n    \"    \\\"vase\\\",\\n\",\n    \"    \\\"scissors\\\",\\n\",\n    \"    \\\"teddy bear\\\",\\n\",\n    \"    \\\"hair drier\\\",\\n\",\n    \"    \\\"toothbrush\\\",\\n\",\n    \"]\\n\",\n    \"\\n\",\n    \"# Filter predictions with low scores\\n\",\n    \"keep = np.argwhere(scores > 0.5)[0]\\n\",\n    \"valid_scores = scores[keep]\\n\",\n    \"valid_boxes = boxes[keep]\\n\",\n    \"valid_masks = masks[keep]\\n\",\n    \"valid_labels = labels[keep]\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"overlayed_image = draw_bounding_boxes(\\n\",\n    \"    image=image_np,\\n\",\n    \"    boxes=valid_boxes,\\n\",\n    \"    labels=valid_labels,\\n\",\n    \"    scores=valid_scores,\\n\",\n    \"    masks=valid_masks,\\n\",\n    \"    object_names=coco_class_names,\\n\",\n    \"    is_bgr_format=False,\\n\",\n    \")\\n\",\n    \"\\n\",\n    \"overlayed_image_pil = Image.fromarray(overlayed_image)\\n\",\n    \"overlayed_image_pil\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"corenet\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.10.8\"\n  },\n  \"orig_nbformat\": 4\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 2\n}\n"
  },
  {
    "path": "tutorials/semantic_segmentation.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"attachments\": {},\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Semantic Segmentation Demo\\n\",\n    \"\\n\",\n    \"This example shows the usage of Deeplabv3 with MobileNetv1 as an image encoder. The model is pre-trained on the PASCAL VOC dataset for the task of semantic segmentation. \\n\",\n    \"\\n\",\n    \"Typical process for semantic segmentation involves:\\n\",\n    \"\\n\",\n    \"1. ***Choose a Pre-trained Model:*** Select a pre-trained segmentation model. In this example, it is DeepLabv3 with MobileNetv1.\\n\",\n    \"2. ***Preprocess Input Image:*** Preprocess the input image to match the requirements of the pre-trained model. This typically involves resizing, normalization, and any other preprocessing steps required by the specific model.\\n\",\n    \"3. ***Generate segmentation mask:*** Perform a forward pass of the input image through the pre-trained model to obtain the segmentation output. The model will output a segmentation mask representing the predicted segmentation of objects in the input image.\"\n   ]\n  },\n  {\n   \"attachments\": {},\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## STEP 1: Pre-trained model\\n\",\n    \"Creating a model is simple. You need a configuration file and the path to the pre-trained weights. Below is an example code snippet\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"2024-04-15 11:43:54 - \\u001b[34m\\u001b[1mLOGS   \\u001b[0m - Pretrained weights are loaded from /tmp/corenet/docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/classification/mobilenetv1_1.0.pt\\n\",\n      \"2024-04-15 11:43:54 - \\u001b[32m\\u001b[1mINFO   \\u001b[0m - Trainable parameters: ['neural_augmentor.brightness._low', 'neural_augmentor.brightness._high', 'neural_augmentor.contrast._low', 'neural_augmentor.contrast._high', 'neural_augmentor.noise._low', 'neural_augmentor.noise._high', 'conv_1.block.conv.weight', 'conv_1.block.norm.weight', 'conv_1.block.norm.bias', 'layer_1.0.dw_conv.block.conv.weight', 'layer_1.0.dw_conv.block.norm.weight', 'layer_1.0.dw_conv.block.norm.bias', 'layer_1.0.pw_conv.block.conv.weight', 'layer_1.0.pw_conv.block.norm.weight', 'layer_1.0.pw_conv.block.norm.bias', 'layer_2.0.dw_conv.block.conv.weight', 'layer_2.0.dw_conv.block.norm.weight', 'layer_2.0.dw_conv.block.norm.bias', 'layer_2.0.pw_conv.block.conv.weight', 'layer_2.0.pw_conv.block.norm.weight', 'layer_2.0.pw_conv.block.norm.bias', 'layer_2.1.dw_conv.block.conv.weight', 'layer_2.1.dw_conv.block.norm.weight', 'layer_2.1.dw_conv.block.norm.bias', 'layer_2.1.pw_conv.block.conv.weight', 'layer_2.1.pw_conv.block.norm.weight', 'layer_2.1.pw_conv.block.norm.bias', 'layer_3.0.dw_conv.block.conv.weight', 'layer_3.0.dw_conv.block.norm.weight', 'layer_3.0.dw_conv.block.norm.bias', 'layer_3.0.pw_conv.block.conv.weight', 'layer_3.0.pw_conv.block.norm.weight', 'layer_3.0.pw_conv.block.norm.bias', 'layer_3.1.dw_conv.block.conv.weight', 'layer_3.1.dw_conv.block.norm.weight', 'layer_3.1.dw_conv.block.norm.bias', 'layer_3.1.pw_conv.block.conv.weight', 'layer_3.1.pw_conv.block.norm.weight', 'layer_3.1.pw_conv.block.norm.bias', 'layer_4.0.dw_conv.block.conv.weight', 'layer_4.0.dw_conv.block.norm.weight', 'layer_4.0.dw_conv.block.norm.bias', 'layer_4.0.pw_conv.block.conv.weight', 'layer_4.0.pw_conv.block.norm.weight', 'layer_4.0.pw_conv.block.norm.bias', 'layer_4.1.dw_conv.block.conv.weight', 'layer_4.1.dw_conv.block.norm.weight', 'layer_4.1.dw_conv.block.norm.bias', 'layer_4.1.pw_conv.block.conv.weight', 'layer_4.1.pw_conv.block.norm.weight', 'layer_4.1.pw_conv.block.norm.bias', 'layer_4.2.dw_conv.block.conv.weight', 'layer_4.2.dw_conv.block.norm.weight', 'layer_4.2.dw_conv.block.norm.bias', 'layer_4.2.pw_conv.block.conv.weight', 'layer_4.2.pw_conv.block.norm.weight', 'layer_4.2.pw_conv.block.norm.bias', 'layer_4.3.dw_conv.block.conv.weight', 'layer_4.3.dw_conv.block.norm.weight', 'layer_4.3.dw_conv.block.norm.bias', 'layer_4.3.pw_conv.block.conv.weight', 'layer_4.3.pw_conv.block.norm.weight', 'layer_4.3.pw_conv.block.norm.bias', 'layer_4.4.dw_conv.block.conv.weight', 'layer_4.4.dw_conv.block.norm.weight', 'layer_4.4.dw_conv.block.norm.bias', 'layer_4.4.pw_conv.block.conv.weight', 'layer_4.4.pw_conv.block.norm.weight', 'layer_4.4.pw_conv.block.norm.bias', 'layer_4.5.dw_conv.block.conv.weight', 'layer_4.5.dw_conv.block.norm.weight', 'layer_4.5.dw_conv.block.norm.bias', 'layer_4.5.pw_conv.block.conv.weight', 'layer_4.5.pw_conv.block.norm.weight', 'layer_4.5.pw_conv.block.norm.bias', 'layer_5.0.dw_conv.block.conv.weight', 'layer_5.0.dw_conv.block.norm.weight', 'layer_5.0.dw_conv.block.norm.bias', 'layer_5.0.pw_conv.block.conv.weight', 'layer_5.0.pw_conv.block.norm.weight', 'layer_5.0.pw_conv.block.norm.bias', 'layer_5.1.dw_conv.block.conv.weight', 'layer_5.1.dw_conv.block.norm.weight', 'layer_5.1.dw_conv.block.norm.bias', 'layer_5.1.pw_conv.block.conv.weight', 'layer_5.1.pw_conv.block.norm.weight', 'layer_5.1.pw_conv.block.norm.bias', 'classifier.classifier_fc.weight', 'classifier.classifier_fc.bias']\\n\",\n      \"2024-04-15 11:43:54 - \\u001b[32m\\u001b[1mINFO   \\u001b[0m - Trainable parameters: ['aux_head.0.block.conv.weight', 'aux_head.0.block.norm.weight', 'aux_head.0.block.norm.bias', 'aux_head.2.block.conv.weight', 'aux_head.2.block.conv.bias', 'aspp.aspp_layer.convs.0.block.conv.weight', 'aspp.aspp_layer.convs.0.block.norm.weight', 'aspp.aspp_layer.convs.0.block.norm.bias', 'aspp.aspp_layer.convs.1.block.conv.weight', 'aspp.aspp_layer.convs.1.block.norm.weight', 'aspp.aspp_layer.convs.1.block.norm.bias', 'aspp.aspp_layer.convs.2.block.conv.weight', 'aspp.aspp_layer.convs.2.block.norm.weight', 'aspp.aspp_layer.convs.2.block.norm.bias', 'aspp.aspp_layer.convs.3.block.conv.weight', 'aspp.aspp_layer.convs.3.block.norm.weight', 'aspp.aspp_layer.convs.3.block.norm.bias', 'aspp.aspp_layer.convs.4.aspp_pool.conv_1x1.block.conv.weight', 'aspp.aspp_layer.convs.4.aspp_pool.conv_1x1.block.norm.weight', 'aspp.aspp_layer.convs.4.aspp_pool.conv_1x1.block.norm.bias', 'aspp.aspp_layer.project.block.conv.weight', 'aspp.aspp_layer.project.block.norm.weight', 'aspp.aspp_layer.project.block.norm.bias', 'classifier.block.conv.weight', 'classifier.block.conv.bias']\\n\",\n      \"2024-04-15 11:44:02 - \\u001b[34m\\u001b[1mLOGS   \\u001b[0m - Pretrained weights are loaded from /tmp/corenet/docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/segmentation/pascal_voc/deeplabv3_mobilenet_v1.pt\\n\",\n      \"2024-04-15 11:44:02 - \\u001b[32m\\u001b[1mINFO   \\u001b[0m - Trainable parameters: ['encoder.neural_augmentor.brightness._low', 'encoder.neural_augmentor.brightness._high', 'encoder.neural_augmentor.contrast._low', 'encoder.neural_augmentor.contrast._high', 'encoder.neural_augmentor.noise._low', 'encoder.neural_augmentor.noise._high', 'encoder.conv_1.block.conv.weight', 'encoder.conv_1.block.norm.weight', 'encoder.conv_1.block.norm.bias', 'encoder.layer_1.0.dw_conv.block.conv.weight', 'encoder.layer_1.0.dw_conv.block.norm.weight', 'encoder.layer_1.0.dw_conv.block.norm.bias', 'encoder.layer_1.0.pw_conv.block.conv.weight', 'encoder.layer_1.0.pw_conv.block.norm.weight', 'encoder.layer_1.0.pw_conv.block.norm.bias', 'encoder.layer_2.0.dw_conv.block.conv.weight', 'encoder.layer_2.0.dw_conv.block.norm.weight', 'encoder.layer_2.0.dw_conv.block.norm.bias', 'encoder.layer_2.0.pw_conv.block.conv.weight', 'encoder.layer_2.0.pw_conv.block.norm.weight', 'encoder.layer_2.0.pw_conv.block.norm.bias', 'encoder.layer_2.1.dw_conv.block.conv.weight', 'encoder.layer_2.1.dw_conv.block.norm.weight', 'encoder.layer_2.1.dw_conv.block.norm.bias', 'encoder.layer_2.1.pw_conv.block.conv.weight', 'encoder.layer_2.1.pw_conv.block.norm.weight', 'encoder.layer_2.1.pw_conv.block.norm.bias', 'encoder.layer_3.0.dw_conv.block.conv.weight', 'encoder.layer_3.0.dw_conv.block.norm.weight', 'encoder.layer_3.0.dw_conv.block.norm.bias', 'encoder.layer_3.0.pw_conv.block.conv.weight', 'encoder.layer_3.0.pw_conv.block.norm.weight', 'encoder.layer_3.0.pw_conv.block.norm.bias', 'encoder.layer_3.1.dw_conv.block.conv.weight', 'encoder.layer_3.1.dw_conv.block.norm.weight', 'encoder.layer_3.1.dw_conv.block.norm.bias', 'encoder.layer_3.1.pw_conv.block.conv.weight', 'encoder.layer_3.1.pw_conv.block.norm.weight', 'encoder.layer_3.1.pw_conv.block.norm.bias', 'encoder.layer_4.0.dw_conv.block.conv.weight', 'encoder.layer_4.0.dw_conv.block.norm.weight', 'encoder.layer_4.0.dw_conv.block.norm.bias', 'encoder.layer_4.0.pw_conv.block.conv.weight', 'encoder.layer_4.0.pw_conv.block.norm.weight', 'encoder.layer_4.0.pw_conv.block.norm.bias', 'encoder.layer_4.1.dw_conv.block.conv.weight', 'encoder.layer_4.1.dw_conv.block.norm.weight', 'encoder.layer_4.1.dw_conv.block.norm.bias', 'encoder.layer_4.1.pw_conv.block.conv.weight', 'encoder.layer_4.1.pw_conv.block.norm.weight', 'encoder.layer_4.1.pw_conv.block.norm.bias', 'encoder.layer_4.2.dw_conv.block.conv.weight', 'encoder.layer_4.2.dw_conv.block.norm.weight', 'encoder.layer_4.2.dw_conv.block.norm.bias', 'encoder.layer_4.2.pw_conv.block.conv.weight', 'encoder.layer_4.2.pw_conv.block.norm.weight', 'encoder.layer_4.2.pw_conv.block.norm.bias', 'encoder.layer_4.3.dw_conv.block.conv.weight', 'encoder.layer_4.3.dw_conv.block.norm.weight', 'encoder.layer_4.3.dw_conv.block.norm.bias', 'encoder.layer_4.3.pw_conv.block.conv.weight', 'encoder.layer_4.3.pw_conv.block.norm.weight', 'encoder.layer_4.3.pw_conv.block.norm.bias', 'encoder.layer_4.4.dw_conv.block.conv.weight', 'encoder.layer_4.4.dw_conv.block.norm.weight', 'encoder.layer_4.4.dw_conv.block.norm.bias', 'encoder.layer_4.4.pw_conv.block.conv.weight', 'encoder.layer_4.4.pw_conv.block.norm.weight', 'encoder.layer_4.4.pw_conv.block.norm.bias', 'encoder.layer_4.5.dw_conv.block.conv.weight', 'encoder.layer_4.5.dw_conv.block.norm.weight', 'encoder.layer_4.5.dw_conv.block.norm.bias', 'encoder.layer_4.5.pw_conv.block.conv.weight', 'encoder.layer_4.5.pw_conv.block.norm.weight', 'encoder.layer_4.5.pw_conv.block.norm.bias', 'encoder.layer_5.0.dw_conv.block.conv.weight', 'encoder.layer_5.0.dw_conv.block.norm.weight', 'encoder.layer_5.0.dw_conv.block.norm.bias', 'encoder.layer_5.0.pw_conv.block.conv.weight', 'encoder.layer_5.0.pw_conv.block.norm.weight', 'encoder.layer_5.0.pw_conv.block.norm.bias', 'encoder.layer_5.1.dw_conv.block.conv.weight', 'encoder.layer_5.1.dw_conv.block.norm.weight', 'encoder.layer_5.1.dw_conv.block.norm.bias', 'encoder.layer_5.1.pw_conv.block.conv.weight', 'encoder.layer_5.1.pw_conv.block.norm.weight', 'encoder.layer_5.1.pw_conv.block.norm.bias', 'seg_head.aux_head.0.block.conv.weight', 'seg_head.aux_head.0.block.norm.weight', 'seg_head.aux_head.0.block.norm.bias', 'seg_head.aux_head.2.block.conv.weight', 'seg_head.aux_head.2.block.conv.bias', 'seg_head.aspp.aspp_layer.convs.0.block.conv.weight', 'seg_head.aspp.aspp_layer.convs.0.block.norm.weight', 'seg_head.aspp.aspp_layer.convs.0.block.norm.bias', 'seg_head.aspp.aspp_layer.convs.1.block.conv.weight', 'seg_head.aspp.aspp_layer.convs.1.block.norm.weight', 'seg_head.aspp.aspp_layer.convs.1.block.norm.bias', 'seg_head.aspp.aspp_layer.convs.2.block.conv.weight', 'seg_head.aspp.aspp_layer.convs.2.block.norm.weight', 'seg_head.aspp.aspp_layer.convs.2.block.norm.bias', 'seg_head.aspp.aspp_layer.convs.3.block.conv.weight', 'seg_head.aspp.aspp_layer.convs.3.block.norm.weight', 'seg_head.aspp.aspp_layer.convs.3.block.norm.bias', 'seg_head.aspp.aspp_layer.convs.4.aspp_pool.conv_1x1.block.conv.weight', 'seg_head.aspp.aspp_layer.convs.4.aspp_pool.conv_1x1.block.norm.weight', 'seg_head.aspp.aspp_layer.convs.4.aspp_pool.conv_1x1.block.norm.bias', 'seg_head.aspp.aspp_layer.project.block.conv.weight', 'seg_head.aspp.aspp_layer.project.block.norm.weight', 'seg_head.aspp.aspp_layer.project.block.norm.bias', 'seg_head.classifier.block.conv.weight', 'seg_head.classifier.block.conv.bias']\\n\"\n     ]\n    },\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"SegEncoderDecoder(\\n\",\n       \"  (encoder): MobileNetv1(\\n\",\n       \"    (neural_augmentor): DistributionNeuralAugmentor(\\n\",\n       \"    \\tBrightness=UniformSampler(min_fn=Clip(min=0.1, max=0.9, clipping=soft), max_fn=Clip(min=1.1, max=10.0, clipping=soft)), \\n\",\n       \"    \\tContrast=UniformSampler(min_fn=Clip(min=0.1, max=0.9, clipping=soft), max_fn=Clip(min=1.1, max=10.0, clipping=soft)), \\n\",\n       \"    \\tNoise=UniformSampler(min_fn=Clip(min=0.0, max=5e-05, clipping=soft), max_fn=Clip(min=0.0001, max=1.0, clipping=soft)), )\\n\",\n       \"    (conv_1): Conv2d(3, 32, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False, normalization=BatchNorm2d, activation=ReLU)\\n\",\n       \"    (layer_1): Sequential(\\n\",\n       \"      (0): SeparableConv2d(in_channels=32, out_channels=64, kernel_size=3, stride=1, dilation=1)\\n\",\n       \"    )\\n\",\n       \"    (layer_2): Sequential(\\n\",\n       \"      (0): SeparableConv2d(in_channels=64, out_channels=128, kernel_size=3, stride=2, dilation=1)\\n\",\n       \"      (1): SeparableConv2d(in_channels=128, out_channels=128, kernel_size=3, stride=1, dilation=1)\\n\",\n       \"    )\\n\",\n       \"    (layer_3): Sequential(\\n\",\n       \"      (0): SeparableConv2d(in_channels=128, out_channels=256, kernel_size=3, stride=2, dilation=1)\\n\",\n       \"      (1): SeparableConv2d(in_channels=256, out_channels=256, kernel_size=3, stride=1, dilation=1)\\n\",\n       \"    )\\n\",\n       \"    (layer_4): Sequential(\\n\",\n       \"      (0): SeparableConv2d(in_channels=256, out_channels=512, kernel_size=3, stride=1, dilation=1)\\n\",\n       \"      (1): SeparableConv2d(in_channels=512, out_channels=512, kernel_size=3, stride=1, dilation=2)\\n\",\n       \"      (2): SeparableConv2d(in_channels=512, out_channels=512, kernel_size=3, stride=1, dilation=2)\\n\",\n       \"      (3): SeparableConv2d(in_channels=512, out_channels=512, kernel_size=3, stride=1, dilation=2)\\n\",\n       \"      (4): SeparableConv2d(in_channels=512, out_channels=512, kernel_size=3, stride=1, dilation=2)\\n\",\n       \"      (5): SeparableConv2d(in_channels=512, out_channels=512, kernel_size=3, stride=1, dilation=2)\\n\",\n       \"    )\\n\",\n       \"    (layer_5): Sequential(\\n\",\n       \"      (0): SeparableConv2d(in_channels=512, out_channels=1024, kernel_size=3, stride=1, dilation=2)\\n\",\n       \"      (1): SeparableConv2d(in_channels=1024, out_channels=1024, kernel_size=3, stride=1, dilation=4)\\n\",\n       \"    )\\n\",\n       \"    (conv_1x1_exp): None\\n\",\n       \"    (classifier): None\\n\",\n       \"  )\\n\",\n       \"  (seg_head): DeeplabV3(\\n\",\n       \"    (aux_head): Sequential(\\n\",\n       \"      (0): Conv2d(512, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False, normalization=BatchNorm2d, activation=ReLU)\\n\",\n       \"      (1): Dropout2d(p=0.1, inplace=False)\\n\",\n       \"      (2): Conv2d(128, 21, kernel_size=(1, 1), stride=(1, 1))\\n\",\n       \"    )\\n\",\n       \"    (upsample_seg_out): UpSample(scale_factor=8.0, mode='bilinear')\\n\",\n       \"    (aspp): Sequential(\\n\",\n       \"      (aspp_layer): ASPP(in_channels=1024, out_channels=512, atrous_rates=[12, 24, 36], is_aspp_sep=False, dropout=0.1)\\n\",\n       \"    )\\n\",\n       \"    (classifier): Conv2d(512, 21, kernel_size=(1, 1), stride=(1, 1))\\n\",\n       \"  )\\n\",\n       \")\"\n      ]\n     },\n     \"execution_count\": 3,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"from corenet.options.opts import get_training_arguments\\n\",\n    \"from corenet.modeling import get_model\\n\",\n    \"from PIL import Image\\n\",\n    \"import torch\\n\",\n    \"from torchvision.transforms import Compose, Resize, PILToTensor\\n\",\n    \"from torchvision.transforms import ToPILImage\\n\",\n    \"import os\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"# configuration file path\\n\",\n    \"config_file = os.path.join(\\n\",\n    \"    os.getcwd(),\\n\",\n    \"    \\\"..\\\",\\n\",\n    \"    \\\"projects/range_augment/segmentation/pascal_voc/deeplabv3_mobilenet_v1.yaml\\\",\\n\",\n    \")\\n\",\n    \"# pre-trained weights\\n\",\n    \"pretrained_weights = \\\"https://docs-assets.developer.apple.com/ml-research/models/cvnets-v2/examples/range_augment/segmentation/pascal_voc/deeplabv3_mobilenet_v1.pt\\\"\\n\",\n    \"\\n\",\n    \"opts = get_training_arguments(\\n\",\n    \"    args=[\\n\",\n    \"        \\\"--common.config-file\\\",\\n\",\n    \"        config_file,\\n\",\n    \"        \\\"--model.segmentation.pretrained\\\",\\n\",\n    \"        pretrained_weights,\\n\",\n    \"    ]\\n\",\n    \")\\n\",\n    \"\\n\",\n    \"# build the model\\n\",\n    \"model = get_model(opts)\\n\",\n    \"# set the model in evaluation mode.\\n\",\n    \"model.eval()\"\n   ]\n  },\n  {\n   \"attachments\": {},\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## STEP 2: Read and pre-process input image\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"image/jpeg\": \"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\",\n      \"image/png\": \"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\",\n      \"text/plain\": [\n       \"<PIL.Image.Image image mode=RGB size=1024x683>\"\n      ]\n     },\n     \"execution_count\": 4,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Step 2.1: Read a PIL image and convert to RGB format.\\n\",\n    \"img_path = os.path.join(os.getcwd(), \\\"..\\\", \\\"assets\\\", \\\"dog.jpeg\\\")\\n\",\n    \"image = Image.open(img_path).convert(\\\"RGB\\\")\\n\",\n    \"image\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"## STEP 2.2: Preprocess an input image\\n\",\n    \"# The model is fine-tuned on the semantic segmentation using 512x512 resolution. Therefore, we resize the input PIL image while maintaining the\\n\",\n    \"# aspect ratio such that the shorter image dimension is 512. After that, we convert the resized PIL image into a tensor. The values in tensor\\n\",\n    \"# range between 0 and 255. We covert it to float and normalize it between 0.0 and 1.0 by dividing the tensor by 255.\\n\",\n    \"\\n\",\n    \"img_transforms = Compose([Resize(size=512), PILToTensor()])\\n\",\n    \"\\n\",\n    \"input_tensor = img_transforms(image)\\n\",\n    \"input_tensor = input_tensor.to(torch.float).div(255.0)\\n\",\n    \"\\n\",\n    \"# add dummy batch dimension\\n\",\n    \"input_tensor = input_tensor[None, ...]\"\n   ]\n  },\n  {\n   \"attachments\": {},\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## STEP 3: Generate segmentation mask\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"image/jpeg\": \"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oooooooooooor1T9n3UobH4mi3lWQvf2UtvEVAwGBWXLc9NsbDjPJH1H1XRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRXmfx51KGx+Fd5byrIXv7iG3iKgYDBxLluem2Nhxnkj6j5Moooooooooooooooooooooooooooooooooooooooooooooooooooooor1T9n3TYb74mi4laQPYWUtxEFIwWJWLDcdNsjHjHIH0P1XRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRXj/7R3/JPNP/AOwrH/6Klr5goooooooooooooooooooooooooooooooooooooooooooooooooooooor0T4HTzQ/FvSEilkRJknSVVYgOvku2G9RuVTg9wD2r67oooooooooooooooooooooooooooooooooooooorx/9o7/knmn/APYVj/8ARUtfMFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFdR8OL640/wCJXhya1k8uRtQhhJ2g5SRhG459VZh7Z45r7XooooooooooooooooooooooooooooooooooooooryP9oqCab4c2rxRSOkOpxPKyqSEXy5Fy3oNzKMnuQO9fLlFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFWLC+uNM1G2v7OTy7q1lSaF9oO11IKnB4OCB1r7vsL631PTra/s5PMtbqJJoX2kbkYAqcHkZBHWrFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFef/ABt/5JDrv/bv/wClEdfIFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFfW/wM1n+1/hfZRM88k2nyyWcjzHOcHeoU5PyhHRR0xtxjAFekUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVn65o1n4h0O90i/Tfa3cTRPgAlc9GXIIDA4IOOCAa+OPHXgXVPAeuGwvx5tvJlrW7RcJcIO49GGRle2e4IJ5eiiiiiiiiiiiiiiiiiiiiiiv/Z\",\n      \"image/png\": \"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\",\n      \"text/plain\": [\n       \"<PIL.Image.Image image mode=L size=768x512>\"\n      ]\n     },\n     \"execution_count\": 6,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"with torch.no_grad():\\n\",\n    \"    # Feed the input tensor to the model. The shape of the input tensor is [batch_size, 3, height, width]\\n\",\n    \"    # The output of the model will be [batch_size, num_classes, height, width]\\n\",\n    \"    logits = model(input_tensor)\\n\",\n    \"\\n\",\n    \"    # Take an argmax along the 'num_classes' dimension to produce a segmentation mask\\n\",\n    \"    output_mask = torch.argmax(logits, dim=1)\\n\",\n    \"    # remove the dummy batch dimension and convert to uint8.\\n\",\n    \"    output_mask = output_mask[0].to(torch.uint8)\\n\",\n    \"\\n\",\n    \"    # For display purposes, let's convert the image into binary\\n\",\n    \"    output_mask[output_mask > 0] = 255\\n\",\n    \"\\n\",\n    \"# convert the tensor to PIL image\\n\",\n    \"output_pil = ToPILImage()(output_mask)\\n\",\n    \"output_pil\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"corenet\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.10.8\"\n  },\n  \"orig_nbformat\": 4\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 2\n}\n"
  },
  {
    "path": "tutorials/train_a_new_model_on_a_new_dataset_from_scratch.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"3ecfe074-b6cb-4389-97d8-29e1b41f62e7\",\n   \"metadata\": {},\n   \"source\": [\n    \"# How to train a new model on a new dataset from scratch in CoreNet\\n\",\n    \"\\n\",\n    \"The purpose of this tutorial is to familiarize you with experimenting with new models and datasets from scratch in CoreNet. We implement a simple classification model on CIFAR10 dataset, then demonstrate how to launch the training and evaluation.\\n\",\n    \"\\n\",\n    \"Let's first make sure our current working directory is the root folder of the repository.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"id\": \"2c79508f-0138-417d-804c-7b0006439b25\",\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"import os\\n\",\n    \"\\n\",\n    \"if os.getcwd().endswith(\\\"tutorials\\\"):\\n\",\n    \"    os.chdir(\\\"..\\\")\\n\",\n    \"\\n\",\n    \"assert os.path.exists(\\n\",\n    \"    \\\"corenet\\\"\\n\",\n    \"), f\\\"We should be in the root repository folder, but we are in {os.getcwd()}\\\"\\n\",\n    \"\\n\",\n    \"! mkdir -p projects/playground_cifar10/classification\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"24e3ce2d-2916-4319-8c0c-73e808f0cddd\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Create new training configuration\\n\",\n    \"\\n\",\n    \"Let's start by creating a YAML training configuration in the `projects/playground_cifar10` folder. You can find more training recipes in `projects/` folder. \\n\",\n    \"\\n\",\n    \"Note: The following jupyter notebook cells in this tutorial start with `%%file <path>`. This header instructs jupyter to write the content of the cell to the specified `<path>`, when executed. We leverage this feature to generate the YAML and Python files.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"id\": \"68ef9fe9-d6a7-4c15-a4d5-1f1b29ed9292\",\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Overwriting projects/playground_cifar10/classification/cifar10.yaml\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"%%file projects/playground_cifar10/classification/cifar10.yaml\\n\",\n    \"\\n\",\n    \"common:\\n\",\n    \"    log_freq: 2000                 # Log the training metrics every 2000 iterations.\\n\",\n    \"\\n\",\n    \"dataset:\\n\",\n    \"    category: classification\\n\",\n    \"    name: \\\"cifar10\\\"                # We'll register the \\\"cifar10\\\" name at DATASET_REGISTRY later in this tutorial.\\n\",\n    \"\\n\",\n    \"    # The `corenet-train` entrypoint uses train_batch_size0 and val_batch_size0 values to construct \\n\",\n    \"    # training/validation batches during training. The `corenet-eval` entrypoint uses eval_batch_size0 to \\n\",\n    \"    # construct batches during evaluation (ie test).\\n\",\n    \"    #\\n\",\n    \"    # The effective batch size is: num_nodes x num_gpus x train_batch_size0\\n\",\n    \"    train_batch_size0: 4\\n\",\n    \"    val_batch_size0: 4\\n\",\n    \"    eval_batch_size0: 1\\n\",\n    \"\\n\",\n    \"    workers: 2\\n\",\n    \"    persistent_workers: true\\n\",\n    \"    pin_memory: true\\n\",\n    \"\\n\",\n    \"model:\\n\",\n    \"    classification:\\n\",\n    \"        name: \\\"two_layer\\\"          # We'll register the \\\"two_layer\\\" name at MODEL_REGISTRY later in this tutorial.\\n\",\n    \"        n_classes: 10\\n\",\n    \"\\n\",\n    \"    layer:\\n\",\n    \"        # Weight initialization parameters:\\n\",\n    \"        conv_init: \\\"kaiming_normal\\\"\\n\",\n    \"        linear_init: \\\"trunc_normal\\\"\\n\",\n    \"        linear_init_std_dev: 0.02\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"sampler:\\n\",\n    \"    name: batch_sampler\\n\",\n    \"\\n\",\n    \"    # The following dimensions will be passed to the dataset.__get__ method, and the dataset produces samples \\n\",\n    \"    # cropped and resized to the requested dimensions. \\n\",\n    \"    bs:\\n\",\n    \"        crop_size_width: 32\\n\",\n    \"        crop_size_height: 32\\n\",\n    \"\\n\",\n    \"loss:\\n\",\n    \"    category: classification\\n\",\n    \"    classification:\\n\",\n    \"        name: cross_entropy       # The implemention is available in \\\"corenet/loss_fn/\\\" folder.\\n\",\n    \"\\n\",\n    \"optim:\\n\",\n    \"    name: sgd\\n\",\n    \"    sgd:\\n\",\n    \"        momentum: 0.9\\n\",\n    \"\\n\",\n    \"scheduler:\\n\",\n    \"    name: fixed                    # The implementation is available in \\\"corenet/optims/scheduler/\\\" folder.\\n\",\n    \"    max_epochs: 2\\n\",\n    \"    fixed:\\n\",\n    \"        lr: 0.001                  # Fixed Learning Rate\\n\",\n    \"\\n\",\n    \"stats:\\n\",\n    \"  val: [\\\"loss\\\", \\\"top1\\\"]            # Metrics to log\\n\",\n    \"  train: [\\\"loss\\\", \\\"top1\\\"]\\n\",\n    \"  checkpoint_metric: top1          # Assigns a checkpoint to results/checkpoint_best.pt\\n\",\n    \"  checkpoint_metric_max: true\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"850c7db0-8231-4796-a715-0bf29a1528a4\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Register model and dataset classes\\n\",\n    \"\\n\",\n    \"Now, let's define the \\\"cifar10\\\" dataset and \\\"two_layer\\\" model that we have used in the \\n\",\n    \"above config. You can find more datasets in `corenet/data/datasets` and more models in\\n\",\n    \"`corenet/modeling/models`, where directories represent tasks (e.g. \\\"classification\\\").\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"id\": \"bcda60b7\",\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Overwriting corenet/data/datasets/classification/playground_dataset.py\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"%%file corenet/data/datasets/classification/playground_dataset.py\\n\",\n    \"\\n\",\n    \"from argparse import Namespace\\n\",\n    \"from typing import Any, Dict, Tuple\\n\",\n    \"\\n\",\n    \"import torchvision\\n\",\n    \"import torchvision.transforms as transforms\\n\",\n    \"\\n\",\n    \"from corenet.data.datasets import DATASET_REGISTRY\\n\",\n    \"from corenet.data.datasets.dataset_base import BaseDataset\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"@DATASET_REGISTRY.register(name=\\\"cifar10\\\", type=\\\"classification\\\")\\n\",\n    \"class Cifar10(BaseDataset):\\n\",\n    \"    CLASS_NAMES = ('plane', 'car', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck')\\n\",\n    \"    \\n\",\n    \"    def __init__(self, opts: Namespace, **kwargs) -> None:\\n\",\n    \"        super().__init__(opts, **kwargs)\\n\",\n    \"        self._torchvision_dataset = torchvision.datasets.CIFAR10(\\n\",\n    \"            \\\"/tmp/cifar10_cache\\\",\\n\",\n    \"            train=self.is_training,\\n\",\n    \"            download=True,\\n\",\n    \"        )\\n\",\n    \"\\n\",\n    \"    def __len__(self) -> int:\\n\",\n    \"        return len(self._torchvision_dataset)\\n\",\n    \"\\n\",\n    \"    def __getitem__(self, sample_size_and_index: Tuple[int]) -> Dict[str, Any]:\\n\",\n    \"        # In CoreNet, not only does the sampler determine the index of the samples, but\\n\",\n    \"        # also the sampler determines the crop size dynamically for each batch. This\\n\",\n    \"        # allows samplers to train multi-scale models more efficiently.\\n\",\n    \"        # See: corenet/data/sampler/variable_batch_sampler.py\\n\",\n    \"        (crop_size_h, crop_size_w, sample_index) = sample_size_and_index\\n\",\n    \"\\n\",\n    \"        img, target = self._torchvision_dataset[sample_index]\\n\",\n    \"\\n\",\n    \"        transform = transforms.Compose(\\n\",\n    \"            [\\n\",\n    \"                transforms.ToTensor(),\\n\",\n    \"                transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)),\\n\",\n    \"                transforms.Resize(size=(crop_size_h, crop_size_w)),\\n\",\n    \"            ]\\n\",\n    \"        )\\n\",\n    \"        img = transform(img)\\n\",\n    \"        return {\\n\",\n    \"            \\\"samples\\\": img,\\n\",\n    \"            \\\"targets\\\": target,\\n\",\n    \"        }\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"id\": \"3b53c116\",\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Overwriting corenet/modeling/models/classification/playground_model.py\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"%%file corenet/modeling/models/classification/playground_model.py\\n\",\n    \"\\n\",\n    \"import argparse\\n\",\n    \"\\n\",\n    \"import torch\\n\",\n    \"import torch.nn.functional as F\\n\",\n    \"from torch import nn\\n\",\n    \"\\n\",\n    \"from corenet.modeling.models import MODEL_REGISTRY\\n\",\n    \"from corenet.modeling.models.base_model import BaseAnyNNModel\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"@MODEL_REGISTRY.register(\\\"two_layer\\\", type=\\\"classification\\\")\\n\",\n    \"class Net(BaseAnyNNModel):\\n\",\n    \"    \\\"\\\"\\\"A simple 2-layer CNN, inspired by https://pytorch.org/tutorials/beginner/blitz/cifar10_tutorial.html\\\"\\\"\\\"\\n\",\n    \"\\n\",\n    \"    def __init__(self, opts: argparse.Namespace) -> None:\\n\",\n    \"        super().__init__(opts)\\n\",\n    \"        self.conv1 = nn.Conv2d(3, 6, 5)\\n\",\n    \"        self.pool = nn.MaxPool2d(2, 2)\\n\",\n    \"        self.conv2 = nn.Conv2d(6, 16, 5)\\n\",\n    \"        self.fc1 = nn.Linear(16 * 5 * 5, 120)\\n\",\n    \"        self.fc2 = nn.Linear(120, 84)\\n\",\n    \"        self.fc3 = nn.Linear(84, 10)\\n\",\n    \"        self.reset_parameters(opts)  # Initialize the weights\\n\",\n    \"\\n\",\n    \"    def forward(self, x: torch.Tensor):\\n\",\n    \"        x = self.pool(F.relu(self.conv1(x)))\\n\",\n    \"        x = self.pool(F.relu(self.conv2(x)))\\n\",\n    \"        x = torch.flatten(x, 1)\\n\",\n    \"        x = F.relu(self.fc1(x))\\n\",\n    \"        x = F.relu(self.fc2(x))\\n\",\n    \"        x = self.fc3(x)\\n\",\n    \"        return x\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"c51c2bda\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Launching the training\\n\",\n    \"\\n\",\n    \"You can train the model by specifying the yaml config file that we created earlier in \\n\",\n    \"this tutorial:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"id\": \"3c63e142\",\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"/home/m_sekhavat/miniconda3/envs/corenet/lib/python3.10/site-packages/turicreate/_deps/__init__.py:9: DeprecationWarning: The distutils package is deprecated and slated for removal in Python 3.12. Use setuptools or check PEP 632 for potential alternatives\\n\",\n      \"  from distutils.version import StrictVersion as _StrictVersion\\n\",\n      \"2024-04-18 00:19:55 - \\u001b[34m\\u001b[1mLOGS   \\u001b[0m - Random seeds are set to 0\\n\",\n      \"2024-04-18 00:19:55 - \\u001b[34m\\u001b[1mLOGS   \\u001b[0m - Using PyTorch version 2.2.1+cu121\\n\",\n      \"2024-04-18 00:19:55 - \\u001b[34m\\u001b[1mLOGS   \\u001b[0m - Available GPUs: 1\\n\",\n      \"2024-04-18 00:19:55 - \\u001b[34m\\u001b[1mLOGS   \\u001b[0m - CUDNN is enabled\\n\",\n      \"2024-04-18 00:19:56 - \\u001b[34m\\u001b[1mLOGS   \\u001b[0m - Setting --ddp.world-size the same as the number of available gpus.\\n\",\n      \"2024-04-18 00:19:56 - \\u001b[34m\\u001b[1mLOGS   \\u001b[0m - Directory exists at: results/run_1\\n\",\n      \"2024-04-18 00:19:59 - \\u001b[32m\\u001b[1mINFO   \\u001b[0m - distributed init (rank 0): tcp://m-sekhavat-dev2:30786\\n\",\n      \"Files already downloaded and verified\\n\",\n      \"2024-04-18 00:20:01 - \\u001b[34m\\u001b[1mLOGS   \\u001b[0m - Training dataset details are given below\\n\",\n      \"Cifar10(\\n\",\n      \"\\troot= \\n\",\n      \"\\tis_training=True \\n\",\n      \"\\tnum_samples=50000\\n\",\n      \")\\n\",\n      \"Files already downloaded and verified\\n\",\n      \"2024-04-18 00:20:01 - \\u001b[34m\\u001b[1mLOGS   \\u001b[0m - Validation dataset details are given below\\n\",\n      \"Cifar10(\\n\",\n      \"\\troot= \\n\",\n      \"\\tis_training=False \\n\",\n      \"\\tnum_samples=10000\\n\",\n      \")\\n\",\n      \"2024-04-18 00:20:01 - \\u001b[34m\\u001b[1mLOGS   \\u001b[0m - Training sampler details: BatchSamplerDDP(\\n\",\n      \"\\t num_repeat=1\\n\",\n      \"\\t trunc_rep_aug=False\\n\",\n      \"\\t sharding=False\\n\",\n      \"\\t disable_shuffle_sharding=False\\n\",\n      \"\\tbase_im_size=(h=32, w=32)\\n\",\n      \"\\tbase_batch_size=4\\n\",\n      \")\\n\",\n      \"2024-04-18 00:20:01 - \\u001b[34m\\u001b[1mLOGS   \\u001b[0m - Validation sampler details: BatchSamplerDDP(\\n\",\n      \"\\t num_repeat=1\\n\",\n      \"\\t trunc_rep_aug=False\\n\",\n      \"\\t sharding=False\\n\",\n      \"\\t disable_shuffle_sharding=False\\n\",\n      \"\\tbase_im_size=(h=32, w=32)\\n\",\n      \"\\tbase_batch_size=4\\n\",\n      \")\\n\",\n      \"2024-04-18 00:20:01 - \\u001b[34m\\u001b[1mLOGS   \\u001b[0m - Number of data workers: 2\\n\",\n      \"2024-04-18 00:20:01 - \\u001b[32m\\u001b[1mINFO   \\u001b[0m - Trainable parameters: ['conv1.weight', 'conv1.bias', 'conv2.weight', 'conv2.bias', 'fc1.weight', 'fc1.bias', 'fc2.weight', 'fc2.bias', 'fc3.weight', 'fc3.bias']\\n\",\n      \"2024-04-18 00:20:01 - \\u001b[34m\\u001b[1mLOGS   \\u001b[0m - \\u001b[36mModel\\u001b[0m\\n\",\n      \"Net(\\n\",\n      \"  (conv1): Conv2d(3, 6, kernel_size=(5, 5), stride=(1, 1))\\n\",\n      \"  (pool): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)\\n\",\n      \"  (conv2): Conv2d(6, 16, kernel_size=(5, 5), stride=(1, 1))\\n\",\n      \"  (fc1): Linear(in_features=400, out_features=120, bias=True)\\n\",\n      \"  (fc2): Linear(in_features=120, out_features=84, bias=True)\\n\",\n      \"  (fc3): Linear(in_features=84, out_features=10, bias=True)\\n\",\n      \")\\n\",\n      \"\\u001b[31m=================================================================\\u001b[0m\\n\",\n      \"                                Net Summary\\n\",\n      \"\\u001b[31m=================================================================\\u001b[0m\\n\",\n      \"Total parameters     =    0.062 M\\n\",\n      \"Total trainable parameters =    0.062 M\\n\",\n      \"\\n\",\n      \"2024-04-18 00:20:01 - \\u001b[33m\\u001b[1mWARNING\\u001b[0m - Profiling not available, dummy_input_and_label not implemented for this model.\\n\",\n      \"2024-04-18 00:20:01 - \\u001b[34m\\u001b[1mLOGS   \\u001b[0m - Using DistributedDataParallel.\\n\",\n      \"2024-04-18 00:20:02 - \\u001b[34m\\u001b[1mLOGS   \\u001b[0m - \\u001b[36mLoss function\\u001b[0m\\n\",\n      \"CrossEntropy(\\n\",\n      \"\\t ignore_idx=-1\\n\",\n      \"\\t class_weighting=False\\n\",\n      \"\\t label_smoothing=0.0\\n\",\n      \")\\n\",\n      \"2024-04-18 00:20:02 - \\u001b[34m\\u001b[1mLOGS   \\u001b[0m - \\u001b[36mOptimizer\\u001b[0m\\n\",\n      \"SGDOptimizer (\\n\",\n      \"\\t dampening: [0]\\n\",\n      \"\\t differentiable: [False]\\n\",\n      \"\\t foreach: [None]\\n\",\n      \"\\t lr: [0.1]\\n\",\n      \"\\t maximize: [False]\\n\",\n      \"\\t momentum: [0.9]\\n\",\n      \"\\t nesterov: [False]\\n\",\n      \"\\t weight_decay: [4e-05]\\n\",\n      \")\\n\",\n      \"2024-04-18 00:20:02 - \\u001b[34m\\u001b[1mLOGS   \\u001b[0m - Max. epochs for training: 2\\n\",\n      \"2024-04-18 00:20:02 - \\u001b[34m\\u001b[1mLOGS   \\u001b[0m - \\u001b[36mLearning rate scheduler\\u001b[0m\\n\",\n      \"FixedLRScheduler(\\n\",\n      \"\\tlr=0.001\\n\",\n      \" )\\n\",\n      \"2024-04-18 00:20:02 - \\u001b[32m\\u001b[1mINFO   \\u001b[0m - Configuration file is stored here: \\u001b[36mresults/run_1/config.yaml\\u001b[0m\\n\",\n      \"\\u001b[31m===========================================================================\\u001b[0m\\n\",\n      \"2024-04-18 00:20:04 - \\u001b[32m\\u001b[1mINFO   \\u001b[0m - Training epoch 0\\n\",\n      \"2024-04-18 00:20:13 - \\u001b[34m\\u001b[1mLOGS   \\u001b[0m - Epoch:   0 [       1/10000000], loss: 2.353, top1: 0.0, LR: [0.001], Avg. batch load time: 8.939, Elapsed time:  9.60\\n\",\n      \"2024-04-18 00:20:23 - \\u001b[34m\\u001b[1mLOGS   \\u001b[0m - Epoch:   0 [    2001/10000000], loss: 2.1819, top1: 16.954, LR: [0.001], Avg. batch load time: 0.005, Elapsed time: 18.86\\n\",\n      \"2024-04-18 00:20:32 - \\u001b[34m\\u001b[1mLOGS   \\u001b[0m - Epoch:   0 [    4001/10000000], loss: 2.0067, top1: 24.2439, LR: [0.001], Avg. batch load time: 0.003, Elapsed time: 27.71\\n\",\n      \"2024-04-18 00:20:40 - \\u001b[34m\\u001b[1mLOGS   \\u001b[0m - Epoch:   0 [    6001/10000000], loss: 1.8889, top1: 29.3868, LR: [0.001], Avg. batch load time: 0.002, Elapsed time: 36.57\\n\",\n      \"2024-04-18 00:20:50 - \\u001b[34m\\u001b[1mLOGS   \\u001b[0m - Epoch:   0 [    8001/10000000], loss: 1.8088, top1: 32.6272, LR: [0.001], Avg. batch load time: 0.002, Elapsed time: 45.68\\n\",\n      \"2024-04-18 00:20:58 - \\u001b[34m\\u001b[1mLOGS   \\u001b[0m - Epoch:   0 [   10001/10000000], loss: 1.7547, top1: 34.9515, LR: [0.001], Avg. batch load time: 0.001, Elapsed time: 54.54\\n\",\n      \"2024-04-18 00:21:07 - \\u001b[34m\\u001b[1mLOGS   \\u001b[0m - Epoch:   0 [   12001/10000000], loss: 1.7098, top1: 36.7949, LR: [0.001], Avg. batch load time: 0.001, Elapsed time: 63.47\\n\",\n      \"2024-04-18 00:21:10 - \\u001b[34m\\u001b[1mLOGS   \\u001b[0m - *** Training summary for epoch 0\\n\",\n      \"\\t loss=1.6997 || top1=37.214\\n\",\n      \"2024-04-18 00:21:19 - \\u001b[34m\\u001b[1mLOGS   \\u001b[0m - Epoch:   0 [       4/   10000], loss: 0.9705, top1: 50.0, LR: [0.001], Avg. batch load time: 0.000, Elapsed time:  7.04\\n\",\n      \"2024-04-18 00:21:24 - \\u001b[34m\\u001b[1mLOGS   \\u001b[0m - Epoch:   0 [    8004/   10000], loss: 1.4266, top1: 48.2634, LR: [0.001], Avg. batch load time: 0.000, Elapsed time: 12.46\\n\",\n      \"2024-04-18 00:21:26 - \\u001b[34m\\u001b[1mLOGS   \\u001b[0m - *** Validation summary for epoch 0\\n\",\n      \"\\t loss=1.4324 || top1=48.25\\n\",\n      \"2024-04-18 00:21:26 - \\u001b[34m\\u001b[1mLOGS   \\u001b[0m - Best checkpoint with score 48.25 saved at results/run_1/checkpoint_best.pt\\n\",\n      \"2024-04-18 00:21:26 - \\u001b[34m\\u001b[1mLOGS   \\u001b[0m - Deleting checkpoint: results/run_1/checkpoint_score_1.2353.pt\\n\",\n      \"2024-04-18 00:21:26 - \\u001b[34m\\u001b[1mLOGS   \\u001b[0m - Averaging checkpoints: ['checkpoint_score_1.4228.pt', 'checkpoint_score_48.2500.pt', 'checkpoint_score_49.2900.pt', 'checkpoint_score_49.8700.pt', 'checkpoint_score_54.7400.pt']\\n\",\n      \"2024-04-18 00:21:26 - \\u001b[34m\\u001b[1mLOGS   \\u001b[0m - Averaged checkpoint saved at: results/run_1/checkpoint_avg.pt\\n\",\n      \"2024-04-18 00:21:26 - \\u001b[34m\\u001b[1mLOGS   \\u001b[0m - Last training checkpoint is saved at: results/run_1/training_checkpoint_last.pt\\n\",\n      \"2024-04-18 00:21:26 - \\u001b[34m\\u001b[1mLOGS   \\u001b[0m - Last checkpoint's model state is saved at: results/run_1/checkpoint_last.pt\\n\",\n      \"\\u001b[31m===========================================================================\\u001b[0m\\n\",\n      \"2024-04-18 00:21:28 - \\u001b[32m\\u001b[1mINFO   \\u001b[0m - Training epoch 1\\n\",\n      \"2024-04-18 00:21:28 - \\u001b[34m\\u001b[1mLOGS   \\u001b[0m - Epoch:   1 [   12501/10000000], loss: 1.2167, top1: 50.0, LR: [0.001], Avg. batch load time: 0.042, Elapsed time:  0.05\\n\",\n      \"2024-04-18 00:21:37 - \\u001b[34m\\u001b[1mLOGS   \\u001b[0m - Epoch:   1 [   14501/10000000], loss: 1.424, top1: 49.1004, LR: [0.001], Avg. batch load time: 0.000, Elapsed time:  8.88\\n\",\n      \"2024-04-18 00:21:46 - \\u001b[34m\\u001b[1mLOGS   \\u001b[0m - Epoch:   1 [   16501/10000000], loss: 1.4023, top1: 49.7438, LR: [0.001], Avg. batch load time: 0.000, Elapsed time: 17.92\\n\",\n      \"2024-04-18 00:21:55 - \\u001b[34m\\u001b[1mLOGS   \\u001b[0m - Epoch:   1 [   18501/10000000], loss: 1.3817, top1: 50.4916, LR: [0.001], Avg. batch load time: 0.000, Elapsed time: 26.66\\n\",\n      \"2024-04-18 00:22:03 - \\u001b[34m\\u001b[1mLOGS   \\u001b[0m - Epoch:   1 [   20501/10000000], loss: 1.3659, top1: 51.1499, LR: [0.001], Avg. batch load time: 0.000, Elapsed time: 35.22\\n\",\n      \"2024-04-18 00:22:12 - \\u001b[34m\\u001b[1mLOGS   \\u001b[0m - Epoch:   1 [   22501/10000000], loss: 1.3521, top1: 51.6673, LR: [0.001], Avg. batch load time: 0.000, Elapsed time: 43.97\\n\",\n      \"2024-04-18 00:22:21 - \\u001b[34m\\u001b[1mLOGS   \\u001b[0m - Epoch:   1 [   24501/10000000], loss: 1.3378, top1: 52.1477, LR: [0.001], Avg. batch load time: 0.000, Elapsed time: 52.74\\n\",\n      \"2024-04-18 00:22:23 - \\u001b[34m\\u001b[1mLOGS   \\u001b[0m - *** Training summary for epoch 1\\n\",\n      \"\\t loss=1.3375 || top1=52.196\\n\",\n      \"2024-04-18 00:22:25 - \\u001b[34m\\u001b[1mLOGS   \\u001b[0m - Epoch:   1 [       4/   10000], loss: 1.1664, top1: 25.0, LR: [0.001], Avg. batch load time: 0.000, Elapsed time:  0.01\\n\",\n      \"2024-04-18 00:22:30 - \\u001b[34m\\u001b[1mLOGS   \\u001b[0m - Epoch:   1 [    8004/   10000], loss: 1.2198, top1: 56.6217, LR: [0.001], Avg. batch load time: 0.000, Elapsed time:  5.44\\n\",\n      \"2024-04-18 00:22:32 - \\u001b[34m\\u001b[1mLOGS   \\u001b[0m - *** Validation summary for epoch 1\\n\",\n      \"\\t loss=1.2256 || top1=56.54\\n\",\n      \"2024-04-18 00:22:32 - \\u001b[34m\\u001b[1mLOGS   \\u001b[0m - Best checkpoint with score 56.54 saved at results/run_1/checkpoint_best.pt\\n\",\n      \"2024-04-18 00:22:32 - \\u001b[34m\\u001b[1mLOGS   \\u001b[0m - Deleting checkpoint: results/run_1/checkpoint_score_1.4228.pt\\n\",\n      \"2024-04-18 00:22:32 - \\u001b[34m\\u001b[1mLOGS   \\u001b[0m - Averaging checkpoints: ['checkpoint_score_48.2500.pt', 'checkpoint_score_49.2900.pt', 'checkpoint_score_49.8700.pt', 'checkpoint_score_54.7400.pt', 'checkpoint_score_56.5400.pt']\\n\",\n      \"2024-04-18 00:22:32 - \\u001b[34m\\u001b[1mLOGS   \\u001b[0m - Averaged checkpoint saved at: results/run_1/checkpoint_avg.pt\\n\",\n      \"2024-04-18 00:22:32 - \\u001b[34m\\u001b[1mLOGS   \\u001b[0m - Last training checkpoint is saved at: results/run_1/training_checkpoint_last.pt\\n\",\n      \"2024-04-18 00:22:32 - \\u001b[34m\\u001b[1mLOGS   \\u001b[0m - Last checkpoint's model state is saved at: results/run_1/checkpoint_last.pt\\n\",\n      \"2024-04-18 00:22:32 - \\u001b[34m\\u001b[1mLOGS   \\u001b[0m - Training took 00:02:30.57\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"! corenet-train --common.config-file projects/playground_cifar10/classification/cifar10.yaml\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"ee65265e-98ec-43c5-8dd7-1e07501b6522\",\n   \"metadata\": {},\n   \"source\": [\n    \"By running the above command, you should observe that the model's validation accuracy has increased from ~10% to 54.74%.\\n\",\n    \"\\n\",\n    \"We can find the saved checkpoints in the results folder:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"id\": \"b1b7511a-adc1-4d89-80e3-f1ea71a94c14\",\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"\\u001b[01;34mresults/\\u001b[00m\\n\",\n      \"├── \\u001b[01;34mclassification_results\\u001b[00m\\n\",\n      \"│   └── \\u001b[01;34mrun_1\\u001b[00m\\n\",\n      \"├── logs.txt\\n\",\n      \"└── \\u001b[01;34mrun_1\\u001b[00m\\n\",\n      \"    ├── checkpoint_avg.pt\\n\",\n      \"    ├── checkpoint_best.pt\\n\",\n      \"    ├── checkpoint_last.pt\\n\",\n      \"    ├── checkpoint_score_48.2500.pt\\n\",\n      \"    ├── checkpoint_score_49.2900.pt\\n\",\n      \"    ├── checkpoint_score_49.8700.pt\\n\",\n      \"    ├── checkpoint_score_54.7400.pt\\n\",\n      \"    ├── checkpoint_score_56.5400.pt\\n\",\n      \"    ├── config.yaml\\n\",\n      \"    └── training_checkpoint_last.pt\\n\",\n      \"\\n\",\n      \"3 directories, 11 files\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"! tree results/\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"39e768f8-ad90-409c-8eaf-f3caf02a06ba\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Launching the evaluation\\n\",\n    \"CoreNet follows the standard practice of splitting datasets into `train`, `val`, and `test` splits. The `corenet-train` entrypoint that was used in the previous section consumes `train` and `val` splits for training the model and finding the best checkpoint. In this section, we will use `corenet-eval` entrypoint, that evaluates a model checkpoint on the `test` split of a dataset.\\n\",\n    \"\\n\",\n    \"In the below command, we set `CUDA_VISIBLE_DEVICES=0` environment variable, as a good reproducibility practice for evaluation to use only 1 gpu for inference. Otherwise, CoreNet uses all available GPUs by default.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"id\": \"72b847fb-0b2c-4d6a-a045-6cdb52ced476\",\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"/home/m_sekhavat/miniconda3/envs/corenet/lib/python3.10/site-packages/turicreate/_deps/__init__.py:9: DeprecationWarning: The distutils package is deprecated and slated for removal in Python 3.12. Use setuptools or check PEP 632 for potential alternatives\\n\",\n      \"  from distutils.version import StrictVersion as _StrictVersion\\n\",\n      \"2024-04-18 00:22:40 - \\u001b[34m\\u001b[1mLOGS   \\u001b[0m - Random seeds are set to 0\\n\",\n      \"2024-04-18 00:22:40 - \\u001b[34m\\u001b[1mLOGS   \\u001b[0m - Using PyTorch version 2.2.1+cu121\\n\",\n      \"2024-04-18 00:22:40 - \\u001b[34m\\u001b[1mLOGS   \\u001b[0m - Available GPUs: 1\\n\",\n      \"2024-04-18 00:22:40 - \\u001b[34m\\u001b[1mLOGS   \\u001b[0m - CUDNN is enabled\\n\",\n      \"2024-04-18 00:22:41 - \\u001b[34m\\u001b[1mLOGS   \\u001b[0m - Setting --ddp.world-size the same as the number of available gpus.\\n\",\n      \"2024-04-18 00:22:41 - \\u001b[34m\\u001b[1mLOGS   \\u001b[0m - Directory exists at: results/run_1\\n\",\n      \"2024-04-18 00:22:45 - \\u001b[32m\\u001b[1mINFO   \\u001b[0m - distributed init (rank 0): tcp://m-sekhavat-dev2:30786\\n\",\n      \"Files already downloaded and verified\\n\",\n      \"2024-04-18 00:22:46 - \\u001b[34m\\u001b[1mLOGS   \\u001b[0m - Evaluation dataset details: \\n\",\n      \"Cifar10(\\n\",\n      \"\\troot= \\n\",\n      \"\\tis_training=False \\n\",\n      \"\\tnum_samples=10000\\n\",\n      \")\\n\",\n      \"2024-04-18 00:22:46 - \\u001b[34m\\u001b[1mLOGS   \\u001b[0m - Evaluation sampler details: BatchSamplerDDP(\\n\",\n      \"\\t num_repeat=1\\n\",\n      \"\\t trunc_rep_aug=False\\n\",\n      \"\\t sharding=False\\n\",\n      \"\\t disable_shuffle_sharding=False\\n\",\n      \"\\tbase_im_size=(h=32, w=32)\\n\",\n      \"\\tbase_batch_size=1\\n\",\n      \")\\n\",\n      \"2024-04-18 00:22:46 - \\u001b[34m\\u001b[1mLOGS   \\u001b[0m - Pretrained weights are loaded from results/run_1/checkpoint_best.pt\\n\",\n      \"2024-04-18 00:22:46 - \\u001b[32m\\u001b[1mINFO   \\u001b[0m - Trainable parameters: ['conv1.weight', 'conv1.bias', 'conv2.weight', 'conv2.bias', 'fc1.weight', 'fc1.bias', 'fc2.weight', 'fc2.bias', 'fc3.weight', 'fc3.bias']\\n\",\n      \"2024-04-18 00:22:46 - \\u001b[34m\\u001b[1mLOGS   \\u001b[0m - \\u001b[36mModel\\u001b[0m\\n\",\n      \"Net(\\n\",\n      \"  (conv1): Conv2d(3, 6, kernel_size=(5, 5), stride=(1, 1))\\n\",\n      \"  (pool): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)\\n\",\n      \"  (conv2): Conv2d(6, 16, kernel_size=(5, 5), stride=(1, 1))\\n\",\n      \"  (fc1): Linear(in_features=400, out_features=120, bias=True)\\n\",\n      \"  (fc2): Linear(in_features=120, out_features=84, bias=True)\\n\",\n      \"  (fc3): Linear(in_features=84, out_features=10, bias=True)\\n\",\n      \")\\n\",\n      \"\\u001b[31m=================================================================\\u001b[0m\\n\",\n      \"                                Net Summary\\n\",\n      \"\\u001b[31m=================================================================\\u001b[0m\\n\",\n      \"Total parameters     =    0.062 M\\n\",\n      \"Total trainable parameters =    0.062 M\\n\",\n      \"\\n\",\n      \"2024-04-18 00:22:46 - \\u001b[33m\\u001b[1mWARNING\\u001b[0m - Profiling not available, dummy_input_and_label not implemented for this model.\\n\",\n      \"2024-04-18 00:22:46 - \\u001b[34m\\u001b[1mLOGS   \\u001b[0m - Using DistributedDataParallel.\\n\",\n      \"2024-04-18 00:22:46 - \\u001b[34m\\u001b[1mLOGS   \\u001b[0m - \\u001b[36mLoss function\\u001b[0m\\n\",\n      \"CrossEntropy(\\n\",\n      \"\\t ignore_idx=-1\\n\",\n      \"\\t class_weighting=False\\n\",\n      \"\\t label_smoothing=0.0\\n\",\n      \")\\n\",\n      \"2024-04-18 00:22:53 - \\u001b[34m\\u001b[1mLOGS   \\u001b[0m - Epoch:   0 [       1/   10000], loss: 1.137, top1: 0.0, LR: 0.000000, Avg. batch load time: 0.000, Elapsed time:  7.27\\n\",\n      \"2024-04-18 00:22:59 - \\u001b[34m\\u001b[1mLOGS   \\u001b[0m - Epoch:   0 [    2001/   10000], loss: 1.2002, top1: 56.022, LR: 0.000000, Avg. batch load time: 0.000, Elapsed time: 12.85\\n\",\n      \"2024-04-18 00:23:04 - \\u001b[34m\\u001b[1mLOGS   \\u001b[0m - Epoch:   0 [    4001/   10000], loss: 1.2143, top1: 55.886, LR: 0.000000, Avg. batch load time: 0.000, Elapsed time: 18.20\\n\",\n      \"2024-04-18 00:23:10 - \\u001b[34m\\u001b[1mLOGS   \\u001b[0m - Epoch:   0 [    6001/   10000], loss: 1.2187, top1: 56.3406, LR: 0.000000, Avg. batch load time: 0.000, Elapsed time: 23.91\\n\",\n      \"2024-04-18 00:23:16 - \\u001b[34m\\u001b[1mLOGS   \\u001b[0m - Epoch:   0 [    8001/   10000], loss: 1.22, top1: 56.6179, LR: 0.000000, Avg. batch load time: 0.000, Elapsed time: 29.44\\n\",\n      \"2024-04-18 00:23:21 - \\u001b[34m\\u001b[1mLOGS   \\u001b[0m - *** Evaluation summary for epoch 0\\n\",\n      \"\\t loss=1.2256 || top1=56.54\\n\",\n      \"2024-04-18 00:23:21 - \\u001b[34m\\u001b[1mLOGS   \\u001b[0m - Evaluation took 35.33877229690552 seconds\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"! CUDA_VISIBLE_DEVICES=0 corenet-eval \\\\\\n\",\n    \"    --common.config-file projects/playground_cifar10/classification/cifar10.yaml \\\\\\n\",\n    \"    --model.classification.pretrained results/run_1/checkpoint_best.pt\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"f75994b9-ff15-4195-9e2c-147be276a0fe\",\n   \"metadata\": {},\n   \"source\": [\n    \"We observed the same `top1=54.74` result as we observed in the validation accuracy during training, because the current CIFAR10 implementation uses the same test set for validation and test. In order to differentiate between validation and test, you can access `self.mode` in the dataset, which is a member of `{\\\"train\\\", \\\"val\\\", \\\"test\\\"}`.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"ad735fc4-db86-400a-a546-362c3a54ac18\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Visualizing the classification results\\n\",\n    \"It's easy to load a model checkpoint and interact with it in notebook:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 18,\n   \"id\": \"8e395824-a625-49ba-ba16-e63fe68a4172\",\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"2024-04-18 15:52:19 - \\u001b[34m\\u001b[1mLOGS   \\u001b[0m - Pretrained weights are loaded from results/run_1/checkpoint_best.pt\\n\",\n      \"2024-04-18 15:52:19 - \\u001b[32m\\u001b[1mINFO   \\u001b[0m - Trainable parameters: ['conv1.weight', 'conv1.bias', 'conv2.weight', 'conv2.bias', 'fc1.weight', 'fc1.bias', 'fc2.weight', 'fc2.bias', 'fc3.weight', 'fc3.bias']\\n\"\n     ]\n    },\n    {\n     \"data\": {\n      \"image/png\": \"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\",\n      \"text/plain\": [\n       \"<PIL.Image.Image image mode=RGB size=32x32>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    },\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Top 3 Predictions: ['bird: 33.3%', 'dog: 18.5%', 'cat: 13.7%']\\n\"\n     ]\n    },\n    {\n     \"data\": {\n      \"image/png\": \"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\",\n      \"text/plain\": [\n       \"<PIL.Image.Image image mode=RGB size=32x32>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    },\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Top 3 Predictions: ['dog: 28.1%', 'cat: 22.6%', 'bird: 15.9%']\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"from corenet.options.opts import get_training_arguments\\n\",\n    \"from corenet.modeling import get_model\\n\",\n    \"from PIL import Image\\n\",\n    \"import torch\\n\",\n    \"from torchvision.transforms import Compose, Resize, PILToTensor, CenterCrop\\n\",\n    \"from torchvision.transforms import ToPILImage\\n\",\n    \"from corenet.data.datasets.classification.playground_dataset import Cifar10\\n\",\n    \"\\n\",\n    \"config_file = \\\"projects/playground_cifar10/classification/cifar10.yaml\\\"\\n\",\n    \"pretrained_weights = \\\"results/run_1/checkpoint_best.pt\\\"\\n\",\n    \"\\n\",\n    \"opts = get_training_arguments(\\n\",\n    \"    args=[\\n\",\n    \"        \\\"--common.config-file\\\",\\n\",\n    \"        config_file,\\n\",\n    \"        \\\"--model.classification.pretrained\\\",\\n\",\n    \"        pretrained_weights,\\n\",\n    \"    ]\\n\",\n    \")\\n\",\n    \"\\n\",\n    \"# Load the model\\n\",\n    \"model = get_model(opts)\\n\",\n    \"model.eval()\\n\",\n    \"\\n\",\n    \"for image_path in [\\\"assets/cat.jpeg\\\", \\\"assets/dog.jpeg\\\"]:\\n\",\n    \"    image = Image.open(image_path).convert(\\\"RGB\\\")\\n\",\n    \"    img_transforms = Compose([CenterCrop(600), Resize(size=(32, 32)), PILToTensor()])\\n\",\n    \"\\n\",\n    \"    # Transform the image, normalize between 0 and 1\\n\",\n    \"    input_tensor = img_transforms(image)\\n\",\n    \"\\n\",\n    \"    # Show the transformed image\\n\",\n    \"    ToPILImage()(input_tensor).show()\\n\",\n    \"\\n\",\n    \"    input_tensor = input_tensor.to(torch.float).div(255.0)\\n\",\n    \"\\n\",\n    \"    # add dummy batch dimension\\n\",\n    \"    input_tensor = input_tensor[None, ...]\\n\",\n    \"\\n\",\n    \"    with torch.no_grad():\\n\",\n    \"        logits = model(input_tensor)[0]\\n\",\n    \"        probs = torch.softmax(logits, dim=-1)\\n\",\n    \"        predictions = sorted(zip(probs.tolist(), Cifar10.CLASS_NAMES), reverse=True)\\n\",\n    \"        print(\\n\",\n    \"            \\\"Top 3 Predictions:\\\",\\n\",\n    \"            [f\\\"{cls}: {prob:.1%}\\\" for prob, cls in predictions[:3]],\\n\",\n    \"        )\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3 (ipykernel)\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.10.13\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 5\n}\n"
  }
]