diff --git a/CHANGELOG.md b/CHANGELOG.md index a6c30a28f..09bdc9eb4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,11 +14,28 @@ Starting from version 2.6.1, releases are automatically created when changes are **Note**: If a tag for the current version already exists, the workflow will skip tag and release creation to avoid duplicates. +### [2.8.0] + +#### Added + +- 28 new backbone configurations: csatv2, dinov3_vitb16, dinov3_vits16, edgenext_s, efficientnet_em, efficientnetv2_b1, fasternet_t0, fasternet_t1, fasternet_t2, ghostnet_v3, hgnet_v2, mobilenet_edgetpu_v2, mobilenetv4_m, mobilenetv4_s, regnety_016, repvit, rexnet, shvit_s1, shvit_s2, shvit_s3, shvit_s4, starnet_s2, starnet_s3, starnet_s4, swiftformer_l1, swiftformer_l3, swiftformer_s, swiftformer_xs + +#### Updated + +- MLflow-skinny from ^2.3.1 to 3.8.1 +- Timm from 0.9.12 to 1.0.24 +- Onnxconverter-common from ^1.14.0 to 1.16.0 + +#### Fixed + +- Avoid unbound variable errors on mlflow client properties if mlflow is not enabled. +- Fix wrong field checked in automatic batch size corner case that could cause an infinite loop. + ### [2.7.3] #### Fixed -Add checks to ensure mlflow client properties can't be called if mlflow is not enabled to avoid unbound variable errors. +- Add checks to ensure mlflow client properties can't be called if mlflow is not enabled to avoid unbound variable errors. ### [2.7.2] diff --git a/poetry.lock b/poetry.lock index 04f13e84e..80370acfb 100644 --- a/poetry.lock +++ b/poetry.lock @@ -183,6 +183,30 @@ typing-extensions = ">=4" [package.extras] tz = ["backports.zoneinfo ; python_version < \"3.9\"", "tzdata"] +[[package]] +name = "annotated-doc" +version = "0.0.4" +description = "Document parameters, class attributes, return types, and variables inline, with Annotated." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "annotated_doc-0.0.4-py3-none-any.whl", hash = "sha256:571ac1dc6991c450b25a9c2d84a3705e2ae7a53467b5d111c24fa8baabbed320"}, + {file = "annotated_doc-0.0.4.tar.gz", hash = "sha256:fbcda96e87e9c92ad167c2e53839e57503ecfda18804ea28102353485033faa4"}, +] + +[[package]] +name = "annotated-types" +version = "0.7.0" +description = "Reusable constraint types to use with typing.Annotated" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"}, + {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, +] + [[package]] name = "anomalib-orobix" version = "0.7.0.dev150" @@ -219,6 +243,26 @@ files = [ {file = "antlr4-python3-runtime-4.9.3.tar.gz", hash = "sha256:f224469b4168294902bb1efa80a8bf7855f24c99aef99cbefc1bcd3cce77881b"}, ] +[[package]] +name = "anyio" +version = "4.12.1" +description = "High-level concurrency and networking framework on top of asyncio or Trio" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "anyio-4.12.1-py3-none-any.whl", hash = "sha256:d405828884fc140aa80a3c667b8beed277f1dfedec42ba031bd6ac3db606ab6c"}, + {file = "anyio-4.12.1.tar.gz", hash = "sha256:41cfcc3a4c85d3f05c932da7c26d0201ac36f72abd4435ba90d0464a3ffed703"}, +] + +[package.dependencies] +exceptiongroup = {version = ">=1.0.2", markers = "python_version < \"3.11\""} +idna = ">=2.8" +typing_extensions = {version = ">=4.5", markers = "python_version < \"3.13\""} + +[package.extras] +trio = ["trio (>=0.31.0) ; python_version < \"3.10\"", "trio (>=0.32.0) ; python_version >= \"3.10\""] + [[package]] name = "appdirs" version = "1.4.4" @@ -1210,7 +1254,7 @@ version = "1.2.2" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" -groups = ["dev", "test"] +groups = ["main", "dev", "test"] files = [ {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, @@ -1234,6 +1278,29 @@ files = [ [package.extras] tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich ; python_version >= \"3.11\""] +[[package]] +name = "fastapi" +version = "0.128.1" +description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "fastapi-0.128.1-py3-none-any.whl", hash = "sha256:ee82146bbf91ea5bbf2bb8629e4c6e056c4fbd997ea6068501b11b15260b50fb"}, + {file = "fastapi-0.128.1.tar.gz", hash = "sha256:ce5be4fa26d4ce6f54debcc873d1fb8e0e248f5c48d7502ba6c61457ab2dc766"}, +] + +[package.dependencies] +annotated-doc = ">=0.0.2" +pydantic = ">=2.7.0" +starlette = ">=0.40.0,<0.51.0" +typing-extensions = ">=4.8.0" + +[package.extras] +all = ["email-validator (>=2.0.0)", "fastapi-cli[standard] (>=0.0.8)", "httpx (>=0.23.0,<1.0.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=3.1.5)", "orjson (>=3.2.1)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.18)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"] +standard = ["email-validator (>=2.0.0)", "fastapi-cli[standard] (>=0.0.8)", "httpx (>=0.23.0,<1.0.0)", "jinja2 (>=3.1.5)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.18)", "uvicorn[standard] (>=0.12.0)"] +standard-no-fastapi-cloud-cli = ["email-validator (>=2.0.0)", "fastapi-cli[standard-no-fastapi-cloud-cli] (>=0.0.8)", "httpx (>=0.23.0,<1.0.0)", "jinja2 (>=3.1.5)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.18)", "uvicorn[standard] (>=0.12.0)"] + [[package]] name = "filelock" version = "3.17.0" @@ -1811,6 +1878,18 @@ files = [ [package.extras] protobuf = ["grpcio-tools (>=1.70.0)"] +[[package]] +name = "h11" +version = "0.16.0" +description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86"}, + {file = "h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1"}, +] + [[package]] name = "h5py" version = "3.8.0" @@ -3407,44 +3486,49 @@ typing-extensions = {version = ">=4.0", markers = "python_version < \"3.11\""} [[package]] name = "mlflow-skinny" -version = "2.20.0" +version = "3.8.1" description = "MLflow is an open source platform for the complete machine learning lifecycle" optional = false -python-versions = ">=3.9" +python-versions = ">=3.10" groups = ["main"] files = [ - {file = "mlflow_skinny-2.20.0-py3-none-any.whl", hash = "sha256:983559c1fde2ad5debbcaf36f86575d11f28d042673882205195238d12e872f7"}, - {file = "mlflow_skinny-2.20.0.tar.gz", hash = "sha256:7c3cb1bcb2d258605d2a54d6701d16b72b573bb545b071542ae8b3739ae02904"}, + {file = "mlflow_skinny-3.8.1-py3-none-any.whl", hash = "sha256:3a6ee27f5ac1e67c1d565fa0e12c070b27129b03e669dcaf88ff841176429142"}, + {file = "mlflow_skinny-3.8.1.tar.gz", hash = "sha256:0c0aade08187030a4653e267bcd63de2f12cbfebf4c6737832cba45d6fb3594d"}, ] [package.dependencies] -cachetools = ">=5.0.0,<6" +cachetools = ">=5.0.0,<7" click = ">=7.0,<9" cloudpickle = "<4" databricks-sdk = ">=0.20.0,<1" +fastapi = "<1" gitpython = ">=3.1.9,<4" importlib_metadata = ">=3.7.0,<4.7.0 || >4.7.0,<9" opentelemetry-api = ">=1.9.0,<3" +opentelemetry-proto = ">=1.9.0,<3" opentelemetry-sdk = ">=1.9.0,<3" -packaging = "<25" -protobuf = ">=3.12.0,<6" -pydantic = ">=1.0,<3" +packaging = "<26" +protobuf = ">=3.12.0,<7" +pydantic = ">=2.0.0,<3" +python-dotenv = ">=0.19.0,<2" pyyaml = ">=5.1,<7" requests = ">=2.17.3,<3" sqlparse = ">=0.4.0,<1" typing-extensions = ">=4.0.0,<5" +uvicorn = "<1" [package.extras] aliyun-oss = ["aliyunstoreplugin"] -databricks = ["azure-storage-file-datalake (>12)", "boto3 (>1)", "botocore", "google-cloud-storage (>=1.30.0)"] +auth = ["Flask-WTF (<2)"] +databricks = ["azure-storage-file-datalake (>12)", "boto3 (>1)", "botocore", "databricks-agents (>=1.2.0,<2.0)", "google-cloud-storage (>=1.30.0)"] extras = ["azureml-core (>=1.2.0)", "boto3", "botocore", "google-cloud-storage (>=1.30.0)", "kubernetes", "prometheus-flask-exporter", "pyarrow", "pysftp", "requests-auth-aws-sigv4", "virtualenv"] gateway = ["aiohttp (<4)", "boto3 (>=1.28.56,<2)", "fastapi (<1)", "slowapi (>=0.1.9,<1)", "tiktoken (<1)", "uvicorn[standard] (<1)", "watchfiles (<2)"] -genai = ["aiohttp (<4)", "boto3 (>=1.28.56,<2)", "fastapi (<1)", "slowapi (>=0.1.9,<1)", "tiktoken (<1)", "uvicorn[standard] (<1)", "watchfiles (<2)"] +genai = ["aiohttp (<4)", "boto3 (>=1.28.56,<2)", "fastapi (<1)", "litellm (>=1.0.0,<2)", "slowapi (>=0.1.9,<1)", "tiktoken (<1)", "uvicorn[standard] (<1)", "watchfiles (<2)"] jfrog = ["mlflow-jfrog-plugin"] -langchain = ["langchain (>=0.1.0,<=0.3.14)"] -mlserver = ["mlserver (>=1.2.0,!=1.3.1)", "mlserver-mlflow (>=1.2.0,!=1.3.1)"] +langchain = ["langchain (>=0.3.12,<=1.1.3)"] +mcp = ["click (!=8.3.0)", "fastmcp (>=2.0.0,<3)"] +mlserver = ["mlserver (>=1.2.0,!=1.3.1,<2.0.0)", "mlserver-mlflow (>=1.2.0,!=1.3.1,<2.0.0)"] sqlserver = ["mlflow-dbstore"] -xethub = ["mlflow-xethub"] [[package]] name = "more-itertools" @@ -4110,22 +4194,26 @@ reference = ["Pillow", "google-re2"] [[package]] name = "onnxconverter-common" -version = "1.14.0" +version = "1.16.0" description = "ONNX Converter and Optimization Tools" optional = true python-versions = ">=3.8" groups = ["main"] markers = "extra == \"onnx\"" files = [ - {file = "onnxconverter-common-1.14.0.tar.gz", hash = "sha256:6e431429bd15325c5b2c3eab61bed0d5634c23ed58f8823961be448d629d014a"}, - {file = "onnxconverter_common-1.14.0-py2.py3-none-any.whl", hash = "sha256:9723e4a9b47f283e298605dce9f357d5ebd5e5e70172fca26e282a1b490916c4"}, + {file = "onnxconverter_common-1.16.0-py2.py3-none-any.whl", hash = "sha256:df39ee96f17fff119dff10dd245467651b60b9e8a96020eb93402239794852f7"}, ] [package.dependencies] numpy = "*" onnx = "*" packaging = "*" -protobuf = "3.20.2" +protobuf = ">=3.20.2" + +[package.extras] +dev = ["onnxconverter-common[lint,test]"] +lint = ["pyright", "ruff"] +test = ["pytest", "pytest-cov"] [[package]] name = "onnxruntime-gpu" @@ -4228,6 +4316,21 @@ files = [ deprecated = ">=1.2.6" setuptools = ">=16.0" +[[package]] +name = "opentelemetry-proto" +version = "1.39.1" +description = "OpenTelemetry Python Proto" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "opentelemetry_proto-1.39.1-py3-none-any.whl", hash = "sha256:22cdc78efd3b3765d09e68bfbd010d4fc254c9818afd0b6b423387d9dee46007"}, + {file = "opentelemetry_proto-1.39.1.tar.gz", hash = "sha256:6c8e05144fc0d3ed4d22c2289c6b126e03bcd0e6a7da0f16cedd2e1c2772e2c8"}, +] + +[package.dependencies] +protobuf = ">=5.0,<7.0" + [[package]] name = "opentelemetry-sdk" version = "1.16.0" @@ -4730,34 +4833,22 @@ files = [ [[package]] name = "protobuf" -version = "3.20.2" -description = "Protocol Buffers" +version = "6.33.5" +description = "" optional = false -python-versions = ">=3.7" +python-versions = ">=3.9" groups = ["main"] files = [ - {file = "protobuf-3.20.2-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:09e25909c4297d71d97612f04f41cea8fa8510096864f2835ad2f3b3df5a5559"}, - {file = "protobuf-3.20.2-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e8fbc522303e09036c752a0afcc5c0603e917222d8bedc02813fd73b4b4ed804"}, - {file = "protobuf-3.20.2-cp310-cp310-win32.whl", hash = "sha256:84a1544252a933ef07bb0b5ef13afe7c36232a774affa673fc3636f7cee1db6c"}, - {file = "protobuf-3.20.2-cp310-cp310-win_amd64.whl", hash = "sha256:2c0b040d0b5d5d207936ca2d02f00f765906622c07d3fa19c23a16a8ca71873f"}, - {file = "protobuf-3.20.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:3cb608e5a0eb61b8e00fe641d9f0282cd0eedb603be372f91f163cbfbca0ded0"}, - {file = "protobuf-3.20.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:84fe5953b18a383fd4495d375fe16e1e55e0a3afe7b4f7b4d01a3a0649fcda9d"}, - {file = "protobuf-3.20.2-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:384164994727f274cc34b8abd41a9e7e0562801361ee77437099ff6dfedd024b"}, - {file = "protobuf-3.20.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:e39cf61bb8582bda88cdfebc0db163b774e7e03364bbf9ce1ead13863e81e359"}, - {file = "protobuf-3.20.2-cp37-cp37m-win32.whl", hash = "sha256:18e34a10ae10d458b027d7638a599c964b030c1739ebd035a1dfc0e22baa3bfe"}, - {file = "protobuf-3.20.2-cp37-cp37m-win_amd64.whl", hash = "sha256:8228e56a865c27163d5d1d1771d94b98194aa6917bcfb6ce139cbfa8e3c27334"}, - {file = "protobuf-3.20.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:03d76b7bd42ac4a6e109742a4edf81ffe26ffd87c5993126d894fe48a120396a"}, - {file = "protobuf-3.20.2-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:f52dabc96ca99ebd2169dadbe018824ebda08a795c7684a0b7d203a290f3adb0"}, - {file = "protobuf-3.20.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:f34464ab1207114e73bba0794d1257c150a2b89b7a9faf504e00af7c9fd58978"}, - {file = "protobuf-3.20.2-cp38-cp38-win32.whl", hash = "sha256:5d9402bf27d11e37801d1743eada54372f986a372ec9679673bfcc5c60441151"}, - {file = "protobuf-3.20.2-cp38-cp38-win_amd64.whl", hash = "sha256:9c673c8bfdf52f903081816b9e0e612186684f4eb4c17eeb729133022d6032e3"}, - {file = "protobuf-3.20.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:291fb4307094bf5ccc29f424b42268640e00d5240bf0d9b86bf3079f7576474d"}, - {file = "protobuf-3.20.2-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:b4fdb29c5a7406e3f7ef176b2a7079baa68b5b854f364c21abe327bbeec01cdb"}, - {file = "protobuf-3.20.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:7a5037af4e76c975b88c3becdf53922b5ffa3f2cddf657574a4920a3b33b80f3"}, - {file = "protobuf-3.20.2-cp39-cp39-win32.whl", hash = "sha256:a9e5ae5a8e8985c67e8944c23035a0dff2c26b0f5070b2f55b217a1c33bbe8b1"}, - {file = "protobuf-3.20.2-cp39-cp39-win_amd64.whl", hash = "sha256:c184485e0dfba4dfd451c3bd348c2e685d6523543a0f91b9fd4ae90eb09e8422"}, - {file = "protobuf-3.20.2-py2.py3-none-any.whl", hash = "sha256:c9cdf251c582c16fd6a9f5e95836c90828d51b0069ad22f463761d27c6c19019"}, - {file = "protobuf-3.20.2.tar.gz", hash = "sha256:712dca319eee507a1e7df3591e639a2b112a2f4a62d40fe7832a16fd19151750"}, + {file = "protobuf-6.33.5-cp310-abi3-win32.whl", hash = "sha256:d71b040839446bac0f4d162e758bea99c8251161dae9d0983a3b88dee345153b"}, + {file = "protobuf-6.33.5-cp310-abi3-win_amd64.whl", hash = "sha256:3093804752167bcab3998bec9f1048baae6e29505adaf1afd14a37bddede533c"}, + {file = "protobuf-6.33.5-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:a5cb85982d95d906df1e2210e58f8e4f1e3cdc088e52c921a041f9c9a0386de5"}, + {file = "protobuf-6.33.5-cp39-abi3-manylinux2014_aarch64.whl", hash = "sha256:9b71e0281f36f179d00cbcb119cb19dec4d14a81393e5ea220f64b286173e190"}, + {file = "protobuf-6.33.5-cp39-abi3-manylinux2014_s390x.whl", hash = "sha256:8afa18e1d6d20af15b417e728e9f60f3aa108ee76f23c3b2c07a2c3b546d3afd"}, + {file = "protobuf-6.33.5-cp39-abi3-manylinux2014_x86_64.whl", hash = "sha256:cbf16ba3350fb7b889fca858fb215967792dc125b35c7976ca4818bee3521cf0"}, + {file = "protobuf-6.33.5-cp39-cp39-win32.whl", hash = "sha256:a3157e62729aafb8df6da2c03aa5c0937c7266c626ce11a278b6eb7963c4e37c"}, + {file = "protobuf-6.33.5-cp39-cp39-win_amd64.whl", hash = "sha256:8f04fa32763dcdb4973d537d6b54e615cc61108c7cb38fe59310c3192d29510a"}, + {file = "protobuf-6.33.5-py3-none-any.whl", hash = "sha256:69915a973dd0f60f31a08b8318b73eab2bd6a392c79184b3612226b0a3f8ec02"}, + {file = "protobuf-6.33.5.tar.gz", hash = "sha256:6ddcac2a081f8b7b9642c09406bc6a4290128fce5f471cddd165960bb9119e5c"}, ] [[package]] @@ -4873,56 +4964,137 @@ markers = {dev = "sys_platform == \"linux\" and platform_python_implementation ! [[package]] name = "pydantic" -version = "1.10.10" -description = "Data validation and settings management using python type hints" +version = "2.11.10" +description = "Data validation using Python type hints" optional = false -python-versions = ">=3.7" +python-versions = ">=3.9" groups = ["main"] files = [ - {file = "pydantic-1.10.10-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:adad1ee4ab9888f12dac2529276704e719efcf472e38df7813f5284db699b4ec"}, - {file = "pydantic-1.10.10-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7a7db03339893feef2092ff7b1afc9497beed15ebd4af84c3042a74abce02d48"}, - {file = "pydantic-1.10.10-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67b3714b97ff84b2689654851c2426389bcabfac9080617bcf4306c69db606f6"}, - {file = "pydantic-1.10.10-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edfdf0a5abc5c9bf2052ebaec20e67abd52e92d257e4f2d30e02c354ed3e6030"}, - {file = "pydantic-1.10.10-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:20a3b30fd255eeeb63caa9483502ba96b7795ce5bf895c6a179b3d909d9f53a6"}, - {file = "pydantic-1.10.10-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:db4c7f7e60ca6f7d6c1785070f3e5771fcb9b2d88546e334d2f2c3934d949028"}, - {file = "pydantic-1.10.10-cp310-cp310-win_amd64.whl", hash = "sha256:a2d5be50ac4a0976817144c7d653e34df2f9436d15555189f5b6f61161d64183"}, - {file = "pydantic-1.10.10-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:566a04ba755e8f701b074ffb134ddb4d429f75d5dced3fbd829a527aafe74c71"}, - {file = "pydantic-1.10.10-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f79db3652ed743309f116ba863dae0c974a41b688242482638b892246b7db21d"}, - {file = "pydantic-1.10.10-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c62376890b819bebe3c717a9ac841a532988372b7e600e76f75c9f7c128219d5"}, - {file = "pydantic-1.10.10-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4870f13a4fafd5bc3e93cff3169222534fad867918b188e83ee0496452978437"}, - {file = "pydantic-1.10.10-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:990027e77cda6072a566e433b6962ca3b96b4f3ae8bd54748e9d62a58284d9d7"}, - {file = "pydantic-1.10.10-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8c40964596809eb616d94f9c7944511f620a1103d63d5510440ed2908fc410af"}, - {file = "pydantic-1.10.10-cp311-cp311-win_amd64.whl", hash = "sha256:ea9eebc2ebcba3717e77cdeee3f6203ffc0e78db5f7482c68b1293e8cc156e5e"}, - {file = "pydantic-1.10.10-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:762aa598f79b4cac2f275d13336b2dd8662febee2a9c450a49a2ab3bec4b385f"}, - {file = "pydantic-1.10.10-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6dab5219659f95e357d98d70577b361383057fb4414cfdb587014a5f5c595f7b"}, - {file = "pydantic-1.10.10-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3d4ee957a727ccb5a36f1b0a6dbd9fad5dedd2a41eada99a8df55c12896e18d"}, - {file = "pydantic-1.10.10-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b69f9138dec566962ec65623c9d57bee44412d2fc71065a5f3ebb3820bdeee96"}, - {file = "pydantic-1.10.10-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:7aa75d1bd9cc275cf9782f50f60cddaf74cbaae19b6ada2a28e737edac420312"}, - {file = "pydantic-1.10.10-cp37-cp37m-win_amd64.whl", hash = "sha256:9f62a727f5c590c78c2d12fda302d1895141b767c6488fe623098f8792255fe5"}, - {file = "pydantic-1.10.10-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:aac218feb4af73db8417ca7518fb3bade4534fcca6e3fb00f84966811dd94450"}, - {file = "pydantic-1.10.10-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:88546dc10a40b5b52cae87d64666787aeb2878f9a9b37825aedc2f362e7ae1da"}, - {file = "pydantic-1.10.10-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c41bbaae89e32fc582448e71974de738c055aef5ab474fb25692981a08df808a"}, - {file = "pydantic-1.10.10-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2b71bd504d1573b0b722ae536e8ffb796bedeef978979d076bf206e77dcc55a5"}, - {file = "pydantic-1.10.10-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:e088e3865a2270ecbc369924cd7d9fbc565667d9158e7f304e4097ebb9cf98dd"}, - {file = "pydantic-1.10.10-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:3403a090db45d4027d2344859d86eb797484dfda0706cf87af79ace6a35274ef"}, - {file = "pydantic-1.10.10-cp38-cp38-win_amd64.whl", hash = "sha256:e0014e29637125f4997c174dd6167407162d7af0da73414a9340461ea8573252"}, - {file = "pydantic-1.10.10-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9965e49c6905840e526e5429b09e4c154355b6ecc0a2f05492eda2928190311d"}, - {file = "pydantic-1.10.10-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:748d10ab6089c5d196e1c8be9de48274f71457b01e59736f7a09c9dc34f51887"}, - {file = "pydantic-1.10.10-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86936c383f7c38fd26d35107eb669c85d8f46dfceae873264d9bab46fe1c7dde"}, - {file = "pydantic-1.10.10-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7a26841be620309a9697f5b1ffc47dce74909e350c5315ccdac7a853484d468a"}, - {file = "pydantic-1.10.10-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:409b810f387610cc7405ab2fa6f62bdf7ea485311845a242ebc0bd0496e7e5ac"}, - {file = "pydantic-1.10.10-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ce937a2a2c020bcad1c9fde02892392a1123de6dda906ddba62bfe8f3e5989a2"}, - {file = "pydantic-1.10.10-cp39-cp39-win_amd64.whl", hash = "sha256:37ebddef68370e6f26243acc94de56d291e01227a67b2ace26ea3543cf53dd5f"}, - {file = "pydantic-1.10.10-py3-none-any.whl", hash = "sha256:a5939ec826f7faec434e2d406ff5e4eaf1716eb1f247d68cd3d0b3612f7b4c8a"}, - {file = "pydantic-1.10.10.tar.gz", hash = "sha256:3b8d5bd97886f9eb59260594207c9f57dce14a6f869c6ceea90188715d29921a"}, -] - -[package.dependencies] -typing-extensions = ">=4.2.0" - -[package.extras] -dotenv = ["python-dotenv (>=0.10.4)"] -email = ["email-validator (>=1.0.3)"] + {file = "pydantic-2.11.10-py3-none-any.whl", hash = "sha256:802a655709d49bd004c31e865ef37da30b540786a46bfce02333e0e24b5fe29a"}, + {file = "pydantic-2.11.10.tar.gz", hash = "sha256:dc280f0982fbda6c38fada4e476dc0a4f3aeaf9c6ad4c28df68a666ec3c61423"}, +] + +[package.dependencies] +annotated-types = ">=0.6.0" +pydantic-core = "2.33.2" +typing-extensions = ">=4.12.2" +typing-inspection = ">=0.4.0" + +[package.extras] +email = ["email-validator (>=2.0.0)"] +timezone = ["tzdata ; python_version >= \"3.9\" and platform_system == \"Windows\""] + +[[package]] +name = "pydantic-core" +version = "2.33.2" +description = "Core functionality for Pydantic validation and serialization" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "pydantic_core-2.33.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2b3d326aaef0c0399d9afffeb6367d5e26ddc24d351dbc9c636840ac355dc5d8"}, + {file = "pydantic_core-2.33.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e5b2671f05ba48b94cb90ce55d8bdcaaedb8ba00cc5359f6810fc918713983d"}, + {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0069c9acc3f3981b9ff4cdfaf088e98d83440a4c7ea1bc07460af3d4dc22e72d"}, + {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d53b22f2032c42eaaf025f7c40c2e3b94568ae077a606f006d206a463bc69572"}, + {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0405262705a123b7ce9f0b92f123334d67b70fd1f20a9372b907ce1080c7ba02"}, + {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4b25d91e288e2c4e0662b8038a28c6a07eaac3e196cfc4ff69de4ea3db992a1b"}, + {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6bdfe4b3789761f3bcb4b1ddf33355a71079858958e3a552f16d5af19768fef2"}, + {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:efec8db3266b76ef9607c2c4c419bdb06bf335ae433b80816089ea7585816f6a"}, + {file = "pydantic_core-2.33.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:031c57d67ca86902726e0fae2214ce6770bbe2f710dc33063187a68744a5ecac"}, + {file = "pydantic_core-2.33.2-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:f8de619080e944347f5f20de29a975c2d815d9ddd8be9b9b7268e2e3ef68605a"}, + {file = "pydantic_core-2.33.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:73662edf539e72a9440129f231ed3757faab89630d291b784ca99237fb94db2b"}, + {file = "pydantic_core-2.33.2-cp310-cp310-win32.whl", hash = "sha256:0a39979dcbb70998b0e505fb1556a1d550a0781463ce84ebf915ba293ccb7e22"}, + {file = "pydantic_core-2.33.2-cp310-cp310-win_amd64.whl", hash = "sha256:b0379a2b24882fef529ec3b4987cb5d003b9cda32256024e6fe1586ac45fc640"}, + {file = "pydantic_core-2.33.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:4c5b0a576fb381edd6d27f0a85915c6daf2f8138dc5c267a57c08a62900758c7"}, + {file = "pydantic_core-2.33.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e799c050df38a639db758c617ec771fd8fb7a5f8eaaa4b27b101f266b216a246"}, + {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dc46a01bf8d62f227d5ecee74178ffc448ff4e5197c756331f71efcc66dc980f"}, + {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a144d4f717285c6d9234a66778059f33a89096dfb9b39117663fd8413d582dcc"}, + {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:73cf6373c21bc80b2e0dc88444f41ae60b2f070ed02095754eb5a01df12256de"}, + {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3dc625f4aa79713512d1976fe9f0bc99f706a9dee21dfd1810b4bbbf228d0e8a"}, + {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:881b21b5549499972441da4758d662aeea93f1923f953e9cbaff14b8b9565aef"}, + {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bdc25f3681f7b78572699569514036afe3c243bc3059d3942624e936ec93450e"}, + {file = "pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:fe5b32187cbc0c862ee201ad66c30cf218e5ed468ec8dc1cf49dec66e160cc4d"}, + {file = "pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:bc7aee6f634a6f4a95676fcb5d6559a2c2a390330098dba5e5a5f28a2e4ada30"}, + {file = "pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:235f45e5dbcccf6bd99f9f472858849f73d11120d76ea8707115415f8e5ebebf"}, + {file = "pydantic_core-2.33.2-cp311-cp311-win32.whl", hash = "sha256:6368900c2d3ef09b69cb0b913f9f8263b03786e5b2a387706c5afb66800efd51"}, + {file = "pydantic_core-2.33.2-cp311-cp311-win_amd64.whl", hash = "sha256:1e063337ef9e9820c77acc768546325ebe04ee38b08703244c1309cccc4f1bab"}, + {file = "pydantic_core-2.33.2-cp311-cp311-win_arm64.whl", hash = "sha256:6b99022f1d19bc32a4c2a0d544fc9a76e3be90f0b3f4af413f87d38749300e65"}, + {file = "pydantic_core-2.33.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a7ec89dc587667f22b6a0b6579c249fca9026ce7c333fc142ba42411fa243cdc"}, + {file = "pydantic_core-2.33.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3c6db6e52c6d70aa0d00d45cdb9b40f0433b96380071ea80b09277dba021ddf7"}, + {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e61206137cbc65e6d5256e1166f88331d3b6238e082d9f74613b9b765fb9025"}, + {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eb8c529b2819c37140eb51b914153063d27ed88e3bdc31b71198a198e921e011"}, + {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c52b02ad8b4e2cf14ca7b3d918f3eb0ee91e63b3167c32591e57c4317e134f8f"}, + {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:96081f1605125ba0855dfda83f6f3df5ec90c61195421ba72223de35ccfb2f88"}, + {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f57a69461af2a5fa6e6bbd7a5f60d3b7e6cebb687f55106933188e79ad155c1"}, + {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:572c7e6c8bb4774d2ac88929e3d1f12bc45714ae5ee6d9a788a9fb35e60bb04b"}, + {file = "pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:db4b41f9bd95fbe5acd76d89920336ba96f03e149097365afe1cb092fceb89a1"}, + {file = "pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:fa854f5cf7e33842a892e5c73f45327760bc7bc516339fda888c75ae60edaeb6"}, + {file = "pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5f483cfb75ff703095c59e365360cb73e00185e01aaea067cd19acffd2ab20ea"}, + {file = "pydantic_core-2.33.2-cp312-cp312-win32.whl", hash = "sha256:9cb1da0f5a471435a7bc7e439b8a728e8b61e59784b2af70d7c169f8dd8ae290"}, + {file = "pydantic_core-2.33.2-cp312-cp312-win_amd64.whl", hash = "sha256:f941635f2a3d96b2973e867144fde513665c87f13fe0e193c158ac51bfaaa7b2"}, + {file = "pydantic_core-2.33.2-cp312-cp312-win_arm64.whl", hash = "sha256:cca3868ddfaccfbc4bfb1d608e2ccaaebe0ae628e1416aeb9c4d88c001bb45ab"}, + {file = "pydantic_core-2.33.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:1082dd3e2d7109ad8b7da48e1d4710c8d06c253cbc4a27c1cff4fbcaa97a9e3f"}, + {file = "pydantic_core-2.33.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f517ca031dfc037a9c07e748cefd8d96235088b83b4f4ba8939105d20fa1dcd6"}, + {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a9f2c9dd19656823cb8250b0724ee9c60a82f3cdf68a080979d13092a3b0fef"}, + {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2b0a451c263b01acebe51895bfb0e1cc842a5c666efe06cdf13846c7418caa9a"}, + {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ea40a64d23faa25e62a70ad163571c0b342b8bf66d5fa612ac0dec4f069d916"}, + {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fb2d542b4d66f9470e8065c5469ec676978d625a8b7a363f07d9a501a9cb36a"}, + {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fdac5d6ffa1b5a83bca06ffe7583f5576555e6c8b3a91fbd25ea7780f825f7d"}, + {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:04a1a413977ab517154eebb2d326da71638271477d6ad87a769102f7c2488c56"}, + {file = "pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c8e7af2f4e0194c22b5b37205bfb293d166a7344a5b0d0eaccebc376546d77d5"}, + {file = "pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:5c92edd15cd58b3c2d34873597a1e20f13094f59cf88068adb18947df5455b4e"}, + {file = "pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:65132b7b4a1c0beded5e057324b7e16e10910c106d43675d9bd87d4f38dde162"}, + {file = "pydantic_core-2.33.2-cp313-cp313-win32.whl", hash = "sha256:52fb90784e0a242bb96ec53f42196a17278855b0f31ac7c3cc6f5c1ec4811849"}, + {file = "pydantic_core-2.33.2-cp313-cp313-win_amd64.whl", hash = "sha256:c083a3bdd5a93dfe480f1125926afcdbf2917ae714bdb80b36d34318b2bec5d9"}, + {file = "pydantic_core-2.33.2-cp313-cp313-win_arm64.whl", hash = "sha256:e80b087132752f6b3d714f041ccf74403799d3b23a72722ea2e6ba2e892555b9"}, + {file = "pydantic_core-2.33.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:61c18fba8e5e9db3ab908620af374db0ac1baa69f0f32df4f61ae23f15e586ac"}, + {file = "pydantic_core-2.33.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95237e53bb015f67b63c91af7518a62a8660376a6a0db19b89acc77a4d6199f5"}, + {file = "pydantic_core-2.33.2-cp313-cp313t-win_amd64.whl", hash = "sha256:c2fc0a768ef76c15ab9238afa6da7f69895bb5d1ee83aeea2e3509af4472d0b9"}, + {file = "pydantic_core-2.33.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:a2b911a5b90e0374d03813674bf0a5fbbb7741570dcd4b4e85a2e48d17def29d"}, + {file = "pydantic_core-2.33.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6fa6dfc3e4d1f734a34710f391ae822e0a8eb8559a85c6979e14e65ee6ba2954"}, + {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c54c939ee22dc8e2d545da79fc5381f1c020d6d3141d3bd747eab59164dc89fb"}, + {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:53a57d2ed685940a504248187d5685e49eb5eef0f696853647bf37c418c538f7"}, + {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:09fb9dd6571aacd023fe6aaca316bd01cf60ab27240d7eb39ebd66a3a15293b4"}, + {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0e6116757f7959a712db11f3e9c0a99ade00a5bbedae83cb801985aa154f071b"}, + {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d55ab81c57b8ff8548c3e4947f119551253f4e3787a7bbc0b6b3ca47498a9d3"}, + {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c20c462aa4434b33a2661701b861604913f912254e441ab8d78d30485736115a"}, + {file = "pydantic_core-2.33.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:44857c3227d3fb5e753d5fe4a3420d6376fa594b07b621e220cd93703fe21782"}, + {file = "pydantic_core-2.33.2-cp39-cp39-musllinux_1_1_armv7l.whl", hash = "sha256:eb9b459ca4df0e5c87deb59d37377461a538852765293f9e6ee834f0435a93b9"}, + {file = "pydantic_core-2.33.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9fcd347d2cc5c23b06de6d3b7b8275be558a0c90549495c699e379a80bf8379e"}, + {file = "pydantic_core-2.33.2-cp39-cp39-win32.whl", hash = "sha256:83aa99b1285bc8f038941ddf598501a86f1536789740991d7d8756e34f1e74d9"}, + {file = "pydantic_core-2.33.2-cp39-cp39-win_amd64.whl", hash = "sha256:f481959862f57f29601ccced557cc2e817bce7533ab8e01a797a48b49c9692b3"}, + {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5c4aa4e82353f65e548c476b37e64189783aa5384903bfea4f41580f255fddfa"}, + {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d946c8bf0d5c24bf4fe333af284c59a19358aa3ec18cb3dc4370080da1e8ad29"}, + {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:87b31b6846e361ef83fedb187bb5b4372d0da3f7e28d85415efa92d6125d6e6d"}, + {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa9d91b338f2df0508606f7009fde642391425189bba6d8c653afd80fd6bb64e"}, + {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2058a32994f1fde4ca0480ab9d1e75a0e8c87c22b53a3ae66554f9af78f2fe8c"}, + {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:0e03262ab796d986f978f79c943fc5f620381be7287148b8010b4097f79a39ec"}, + {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:1a8695a8d00c73e50bff9dfda4d540b7dee29ff9b8053e38380426a85ef10052"}, + {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:fa754d1850735a0b0e03bcffd9d4b4343eb417e47196e4485d9cca326073a42c"}, + {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:a11c8d26a50bfab49002947d3d237abe4d9e4b5bdc8846a63537b6488e197808"}, + {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:dd14041875d09cc0f9308e37a6f8b65f5585cf2598a53aa0123df8b129d481f8"}, + {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:d87c561733f66531dced0da6e864f44ebf89a8fba55f31407b00c2f7f9449593"}, + {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f82865531efd18d6e07a04a17331af02cb7a651583c418df8266f17a63c6612"}, + {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bfb5112df54209d820d7bf9317c7a6c9025ea52e49f46b6a2060104bba37de7"}, + {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:64632ff9d614e5eecfb495796ad51b0ed98c453e447a76bcbeeb69615079fc7e"}, + {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:f889f7a40498cc077332c7ab6b4608d296d852182211787d4f3ee377aaae66e8"}, + {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:de4b83bb311557e439b9e186f733f6c645b9417c84e2eb8203f3f820a4b988bf"}, + {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:82f68293f055f51b51ea42fafc74b6aad03e70e191799430b90c13d643059ebb"}, + {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:329467cecfb529c925cf2bbd4d60d2c509bc2fb52a20c1045bf09bb70971a9c1"}, + {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:87acbfcf8e90ca885206e98359d7dca4bcbb35abdc0ff66672a293e1d7a19101"}, + {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:7f92c15cd1e97d4b12acd1cc9004fa092578acfa57b67ad5e43a197175d01a64"}, + {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3f26877a748dc4251cfcfda9dfb5f13fcb034f5308388066bcfe9031b63ae7d"}, + {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dac89aea9af8cd672fa7b510e7b8c33b0bba9a43186680550ccf23020f32d535"}, + {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:970919794d126ba8645f3837ab6046fb4e72bbc057b3709144066204c19a455d"}, + {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:3eb3fe62804e8f859c49ed20a8451342de53ed764150cb14ca71357c765dc2a6"}, + {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:3abcd9392a36025e3bd55f9bd38d908bd17962cc49bc6da8e7e96285336e2bca"}, + {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:3a1c81334778f9e3af2f8aeb7a960736e5cab1dfebfb26aabca09afd2906c039"}, + {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2807668ba86cb38c6817ad9bc66215ab8584d1d304030ce4f0887336f28a5e27"}, + {file = "pydantic_core-2.33.2.tar.gz", hash = "sha256:7cb8bc3605c29176e1b105350d2e6474142d7c1bd1d9327c4a9bdb46bf827acc"}, +] + +[package.dependencies] +typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" [[package]] name = "pygments" @@ -6135,6 +6307,25 @@ pure-eval = "*" [package.extras] tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] +[[package]] +name = "starlette" +version = "0.50.0" +description = "The little ASGI library that shines." +optional = false +python-versions = ">=3.10" +groups = ["main"] +files = [ + {file = "starlette-0.50.0-py3-none-any.whl", hash = "sha256:9e5391843ec9b6e472eed1365a78c8098cfceb7a74bfd4d6b1c0c0095efb3bca"}, + {file = "starlette-0.50.0.tar.gz", hash = "sha256:a2a17b22203254bcbc2e1f926d2d55f3f9497f769416b3190768befe598fa3ca"}, +] + +[package.dependencies] +anyio = ">=3.6.2,<5" +typing-extensions = {version = ">=4.10.0", markers = "python_version < \"3.13\""} + +[package.extras] +full = ["httpx (>=0.27.0,<0.29.0)", "itsdangerous", "jinja2", "python-multipart (>=0.0.18)", "pyyaml"] + [[package]] name = "stevedore" version = "5.4.0" @@ -6271,21 +6462,21 @@ zarr = ["fsspec", "zarr (<3)"] [[package]] name = "timm" -version = "0.9.12" +version = "1.0.24" description = "PyTorch Image Models" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" groups = ["main"] files = [ - {file = "timm-0.9.12-py3-none-any.whl", hash = "sha256:2a828afac5b710a80ec66d0f85807e171e342faf5c0703b33102d8aa206f19dc"}, - {file = "timm-0.9.12.tar.gz", hash = "sha256:9121d1cf320f7f32490d893340fd33117bda0a0270eb8282dfd52ae5fd3e1af6"}, + {file = "timm-1.0.24-py3-none-any.whl", hash = "sha256:8301ac783410c6ad72c73c49326af6d71a9e4d1558238552796e825c2464913f"}, + {file = "timm-1.0.24.tar.gz", hash = "sha256:c7b909f43fe2ef8fe62c505e270cd4f1af230dfbc37f2ee93e3608492b9d9a40"}, ] [package.dependencies] -huggingface-hub = "*" +huggingface_hub = "*" pyyaml = "*" safetensors = "*" -torch = ">=1.7" +torch = "*" torchvision = "*" [[package]] @@ -6685,6 +6876,21 @@ files = [ {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, ] +[[package]] +name = "typing-inspection" +version = "0.4.2" +description = "Runtime typing introspection tools" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "typing_inspection-0.4.2-py3-none-any.whl", hash = "sha256:4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7"}, + {file = "typing_inspection-0.4.2.tar.gz", hash = "sha256:ba561c48a67c5958007083d386c3295464928b01faa735ab8547c5692e87f464"}, +] + +[package.dependencies] +typing-extensions = ">=4.12.0" + [[package]] name = "ujson" version = "5.10.0" @@ -6790,6 +6996,26 @@ brotli = ["brotli (==1.0.9) ; os_name != \"nt\" and python_version < \"3\" and p secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress ; python_version == \"2.7\"", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] +[[package]] +name = "uvicorn" +version = "0.40.0" +description = "The lightning-fast ASGI server." +optional = false +python-versions = ">=3.10" +groups = ["main"] +files = [ + {file = "uvicorn-0.40.0-py3-none-any.whl", hash = "sha256:c6c8f55bc8bf13eb6fa9ff87ad62308bbbc33d0b67f84293151efe87e0d5f2ee"}, + {file = "uvicorn-0.40.0.tar.gz", hash = "sha256:839676675e87e73694518b5574fd0f24c9d97b46bea16df7b8c05ea1a51071ea"}, +] + +[package.dependencies] +click = ">=7.0" +h11 = ">=0.8" +typing-extensions = {version = ">=4.0", markers = "python_version < \"3.11\""} + +[package.extras] +standard = ["colorama (>=0.4) ; sys_platform == \"win32\"", "httptools (>=0.6.3)", "python-dotenv (>=0.13)", "pyyaml (>=5.1)", "uvloop (>=0.15.1) ; sys_platform != \"win32\" and sys_platform != \"cygwin\" and platform_python_implementation != \"PyPy\"", "watchfiles (>=0.13)", "websockets (>=10.4)"] + [[package]] name = "verspec" version = "0.1.0" @@ -7258,4 +7484,4 @@ onnx = ["onnx", "onnxconverter-common", "onnxruntime_gpu", "onnxsim"] [metadata] lock-version = "2.1" python-versions = ">=3.10,<3.11" -content-hash = "81c32fc98ec1614ef30771f6351d0b1112af7dfea4347524ac2c251530b38e85" +content-hash = "c03f5c770d5bbb907356601d1d14154c9260acfbe24a0996acf4c018c79c8467" diff --git a/pyproject.toml b/pyproject.toml index 38cd22d96..76453dc95 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "quadra" -version = "2.7.3" +version = "2.8.0" description = "Deep Learning experiment orchestration library" authors = [ "Federico Belotti ", @@ -50,7 +50,7 @@ torchmetrics = "~0.10" hydra_core = "~1.3" hydra_colorlog = "~1.2" hydra_optuna_sweeper = "~1.2" -mlflow-skinny = "^2.3.1" +mlflow-skinny = "3.8.1" boto3 = "~1.26" minio = "~7.1" tensorboard = "~2.20" @@ -70,7 +70,7 @@ label_studio_converter = "~0.0" scikit_multilearn = "~0.2" tripy = "~1.0" h5py = "~3.8" -timm = "0.9.12" +timm = "1.0.24" segmentation_models_pytorch = "0.5.0" anomalib-orobix = "0.7.0.dev150" @@ -82,7 +82,7 @@ typing_extensions = { version = "4.11.0", python = "<3.10" } onnx = { version = "1.15.0", optional = true } onnxsim = { version = "0.4.28", optional = true } onnxruntime_gpu = { version = "1.23.2", optional = true } -onnxconverter-common = { version = "^1.14.0", optional = true } +onnxconverter-common = { version = "1.16.0", optional = true } [[tool.poetry.source]] name = "torch_cu128" diff --git a/quadra/__init__.py b/quadra/__init__.py index 2aa72be5b..0c308dfa4 100644 --- a/quadra/__init__.py +++ b/quadra/__init__.py @@ -1,4 +1,4 @@ -__version__ = "2.7.3" +__version__ = "2.8.0" def get_version(): diff --git a/quadra/configs/backbone/csatv2.yaml b/quadra/configs/backbone/csatv2.yaml new file mode 100644 index 000000000..5a74bcec8 --- /dev/null +++ b/quadra/configs/backbone/csatv2.yaml @@ -0,0 +1,9 @@ +model: + _target_: quadra.models.classification.TimmNetworkBuilder + model_name: csatv2.r512_in1k + pretrained: true + freeze: false +metadata: + input_size: 512 + output_dim: 386 + nb_heads: 8 diff --git a/quadra/configs/backbone/dinov3_vitb16.yaml b/quadra/configs/backbone/dinov3_vitb16.yaml new file mode 100644 index 000000000..ff8914676 --- /dev/null +++ b/quadra/configs/backbone/dinov3_vitb16.yaml @@ -0,0 +1,10 @@ +model: + _target_: quadra.models.classification.TimmNetworkBuilder + model_name: vit_base_patch16_dinov3 + pretrained: true + freeze: false +metadata: + input_size: 224 + output_dim: 768 + patch_size: 16 + nb_heads: 12 diff --git a/quadra/configs/backbone/dinov3_vits16.yaml b/quadra/configs/backbone/dinov3_vits16.yaml new file mode 100644 index 000000000..69f5e6178 --- /dev/null +++ b/quadra/configs/backbone/dinov3_vits16.yaml @@ -0,0 +1,10 @@ +model: + _target_: quadra.models.classification.TimmNetworkBuilder + model_name: vit_small_patch16_dinov3 + pretrained: true + freeze: false +metadata: + input_size: 224 + output_dim: 384 + patch_size: 16 + nb_heads: 6 diff --git a/quadra/configs/backbone/edgenext_s.yaml b/quadra/configs/backbone/edgenext_s.yaml new file mode 100644 index 000000000..475918a53 --- /dev/null +++ b/quadra/configs/backbone/edgenext_s.yaml @@ -0,0 +1,9 @@ +model: + _target_: quadra.models.classification.TimmNetworkBuilder + model_name: edgenext_small.usi_in1k + pretrained: true + freeze: false +metadata: + input_size: 256 + output_dim: 304 + nb_heads: 8 diff --git a/quadra/configs/backbone/efficientnet_em.yaml b/quadra/configs/backbone/efficientnet_em.yaml new file mode 100644 index 000000000..7313ce7e5 --- /dev/null +++ b/quadra/configs/backbone/efficientnet_em.yaml @@ -0,0 +1,8 @@ +model: + _target_: quadra.models.classification.TimmNetworkBuilder + model_name: efficientnet_em.ra2_in1k + pretrained: true + freeze: false +metadata: + input_size: 240 + output_dim: 1280 diff --git a/quadra/configs/backbone/efficientnetv2_b1.yaml b/quadra/configs/backbone/efficientnetv2_b1.yaml new file mode 100644 index 000000000..c6af00110 --- /dev/null +++ b/quadra/configs/backbone/efficientnetv2_b1.yaml @@ -0,0 +1,8 @@ +model: + _target_: quadra.models.classification.TimmNetworkBuilder + model_name: tf_efficientnetv2_b1.in1k + pretrained: true + freeze: false +metadata: + input_size: 191 + output_dim: 1280 diff --git a/quadra/configs/backbone/efficientnetv2_s.yaml b/quadra/configs/backbone/efficientnetv2_s.yaml index a75311d68..30fb896e3 100644 --- a/quadra/configs/backbone/efficientnetv2_s.yaml +++ b/quadra/configs/backbone/efficientnetv2_s.yaml @@ -1,6 +1,6 @@ model: _target_: quadra.models.classification.TimmNetworkBuilder - model_name: tf_efficientnetv2_s_in21ft1k + model_name: tf_efficientnetv2_s.in21k_ft_in1k pretrained: true freeze: false metadata: diff --git a/quadra/configs/backbone/fasternet_t0.yaml b/quadra/configs/backbone/fasternet_t0.yaml new file mode 100644 index 000000000..e79970862 --- /dev/null +++ b/quadra/configs/backbone/fasternet_t0.yaml @@ -0,0 +1,8 @@ +model: + _target_: quadra.models.classification.TimmNetworkBuilder + model_name: fasternet_t0.in1k + pretrained: true + freeze: false +metadata: + input_size: 224 + output_dim: 1280 diff --git a/quadra/configs/backbone/fasternet_t1.yaml b/quadra/configs/backbone/fasternet_t1.yaml new file mode 100644 index 000000000..0d79d4228 --- /dev/null +++ b/quadra/configs/backbone/fasternet_t1.yaml @@ -0,0 +1,8 @@ +model: + _target_: quadra.models.classification.TimmNetworkBuilder + model_name: fasternet_t1.in1k + pretrained: true + freeze: false +metadata: + input_size: 224 + output_dim: 1280 diff --git a/quadra/configs/backbone/fasternet_t2.yaml b/quadra/configs/backbone/fasternet_t2.yaml new file mode 100644 index 000000000..dd06c4d98 --- /dev/null +++ b/quadra/configs/backbone/fasternet_t2.yaml @@ -0,0 +1,8 @@ +model: + _target_: quadra.models.classification.TimmNetworkBuilder + model_name: fasternet_t2.in1k + pretrained: true + freeze: false +metadata: + input_size: 224 + output_dim: 1280 diff --git a/quadra/configs/backbone/ghostnet_v3.yaml b/quadra/configs/backbone/ghostnet_v3.yaml new file mode 100644 index 000000000..f847e3e66 --- /dev/null +++ b/quadra/configs/backbone/ghostnet_v3.yaml @@ -0,0 +1,8 @@ +model: + _target_: quadra.models.classification.TimmNetworkBuilder + model_name: ghostnetv3_100.in1k + pretrained: true + freeze: false +metadata: + input_size: 224 + output_dim: 1280 diff --git a/quadra/configs/backbone/hgnet_v2.yaml b/quadra/configs/backbone/hgnet_v2.yaml new file mode 100644 index 000000000..3555166e0 --- /dev/null +++ b/quadra/configs/backbone/hgnet_v2.yaml @@ -0,0 +1,8 @@ +model: + _target_: quadra.models.classification.TimmNetworkBuilder + model_name: hgnetv2_b2.ssld_stage2_ft_in1k + pretrained: true + freeze: false +metadata: + input_size: 224 + output_dim: 2048 diff --git a/quadra/configs/backbone/mobilenet_edgetpu_v2.yaml b/quadra/configs/backbone/mobilenet_edgetpu_v2.yaml new file mode 100644 index 000000000..d1f2fb284 --- /dev/null +++ b/quadra/configs/backbone/mobilenet_edgetpu_v2.yaml @@ -0,0 +1,8 @@ +model: + _target_: quadra.models.classification.TimmNetworkBuilder + model_name: mobilenet_edgetpu_v2_m.ra4_e3600_r224_in1k + pretrained: true + freeze: false +metadata: + input_size: 224 + output_dim: 1344 diff --git a/quadra/configs/backbone/mobilenetv4_m.yaml b/quadra/configs/backbone/mobilenetv4_m.yaml new file mode 100644 index 000000000..6d9eca761 --- /dev/null +++ b/quadra/configs/backbone/mobilenetv4_m.yaml @@ -0,0 +1,9 @@ +model: + _target_: quadra.models.classification.TimmNetworkBuilder + model_name: mobilenetv4_hybrid_medium.ix_e550_r384_in1k + pretrained: true + freeze: false +metadata: + input_size: 384 + output_dim: 1280 + nb_heads: 4 diff --git a/quadra/configs/backbone/mobilenetv4_s.yaml b/quadra/configs/backbone/mobilenetv4_s.yaml new file mode 100644 index 000000000..9a9ba79c2 --- /dev/null +++ b/quadra/configs/backbone/mobilenetv4_s.yaml @@ -0,0 +1,10 @@ +model: + _target_: quadra.models.classification.TimmNetworkBuilder + model_name: mobilenetv4_conv_small.e2400_r224_in1k + # model_name: mobilenetv4_conv_small.e1200_r224_in1k + # model_name: mobilenetv4_conv_small_050.e3000_r224_in1k + pretrained: true + freeze: false +metadata: + input_size: 224 + output_dim: 1280 diff --git a/quadra/configs/backbone/regnety_016.yaml b/quadra/configs/backbone/regnety_016.yaml new file mode 100644 index 000000000..abeb727bf --- /dev/null +++ b/quadra/configs/backbone/regnety_016.yaml @@ -0,0 +1,8 @@ +model: + _target_: quadra.models.classification.TimmNetworkBuilder + model_name: regnety_016.tv2_in1k + pretrained: true + freeze: false +metadata: + input_size: 224 + output_dim: 888 diff --git a/quadra/configs/backbone/repvit.yaml b/quadra/configs/backbone/repvit.yaml new file mode 100644 index 000000000..2fbd13515 --- /dev/null +++ b/quadra/configs/backbone/repvit.yaml @@ -0,0 +1,10 @@ +model: + _target_: quadra.models.classification.TimmNetworkBuilder + model_name: repvit_m1_1.dist_450e_in1k + pretrained: true + freeze: false +metadata: + input_size: 224 + output_dim: 512 + patch_size: 4 + nb_heads: 8 diff --git a/quadra/configs/backbone/resnet18_ssl.yaml b/quadra/configs/backbone/resnet18_ssl.yaml index caf0b2fc7..841b13984 100644 --- a/quadra/configs/backbone/resnet18_ssl.yaml +++ b/quadra/configs/backbone/resnet18_ssl.yaml @@ -1,6 +1,6 @@ model: _target_: quadra.models.classification.TimmNetworkBuilder - model_name: ssl_resnet18 + model_name: resnet18.fb_ssl_yfcc100m_ft_in1k pretrained: true freeze: false metadata: diff --git a/quadra/configs/backbone/rexnet.yaml b/quadra/configs/backbone/rexnet.yaml new file mode 100644 index 000000000..a13abf467 --- /dev/null +++ b/quadra/configs/backbone/rexnet.yaml @@ -0,0 +1,8 @@ +model: + _target_: quadra.models.classification.TimmNetworkBuilder + model_name: rexnet_150.nav_in1k + pretrained: true + freeze: false +metadata: + input_size: 224 + output_dim: 1920 diff --git a/quadra/configs/backbone/shvit_s1.yaml b/quadra/configs/backbone/shvit_s1.yaml new file mode 100644 index 000000000..2b4612222 --- /dev/null +++ b/quadra/configs/backbone/shvit_s1.yaml @@ -0,0 +1,8 @@ +model: + _target_: quadra.models.classification.TimmNetworkBuilder + model_name: shvit_s1.in1k + pretrained: true + freeze: false +metadata: + input_size: 224 + output_dim: 320 diff --git a/quadra/configs/backbone/shvit_s2.yaml b/quadra/configs/backbone/shvit_s2.yaml new file mode 100644 index 000000000..9db351e5c --- /dev/null +++ b/quadra/configs/backbone/shvit_s2.yaml @@ -0,0 +1,8 @@ +model: + _target_: quadra.models.classification.TimmNetworkBuilder + model_name: shvit_s2.in1k + pretrained: true + freeze: false +metadata: + input_size: 224 + output_dim: 448 diff --git a/quadra/configs/backbone/shvit_s3.yaml b/quadra/configs/backbone/shvit_s3.yaml new file mode 100644 index 000000000..361fe3359 --- /dev/null +++ b/quadra/configs/backbone/shvit_s3.yaml @@ -0,0 +1,8 @@ +model: + _target_: quadra.models.classification.TimmNetworkBuilder + model_name: shvit_s3.in1k + pretrained: true + freeze: false +metadata: + input_size: 224 + output_dim: 448 diff --git a/quadra/configs/backbone/shvit_s4.yaml b/quadra/configs/backbone/shvit_s4.yaml new file mode 100644 index 000000000..cee84264c --- /dev/null +++ b/quadra/configs/backbone/shvit_s4.yaml @@ -0,0 +1,8 @@ +model: + _target_: quadra.models.classification.TimmNetworkBuilder + model_name: shvit_s4.in1k + pretrained: true + freeze: false +metadata: + input_size: 256 + output_dim: 448 diff --git a/quadra/configs/backbone/starnet_s2.yaml b/quadra/configs/backbone/starnet_s2.yaml new file mode 100644 index 000000000..99b911412 --- /dev/null +++ b/quadra/configs/backbone/starnet_s2.yaml @@ -0,0 +1,8 @@ +model: + _target_: quadra.models.classification.TimmNetworkBuilder + model_name: starnet_s2.in1k + pretrained: true + freeze: false +metadata: + input_size: 224 + output_dim: 256 diff --git a/quadra/configs/backbone/starnet_s3.yaml b/quadra/configs/backbone/starnet_s3.yaml new file mode 100644 index 000000000..84375df21 --- /dev/null +++ b/quadra/configs/backbone/starnet_s3.yaml @@ -0,0 +1,8 @@ +model: + _target_: quadra.models.classification.TimmNetworkBuilder + model_name: starnet_s3.in1k + pretrained: true + freeze: false +metadata: + input_size: 224 + output_dim: 256 diff --git a/quadra/configs/backbone/starnet_s4.yaml b/quadra/configs/backbone/starnet_s4.yaml new file mode 100644 index 000000000..c4ad09f58 --- /dev/null +++ b/quadra/configs/backbone/starnet_s4.yaml @@ -0,0 +1,8 @@ +model: + _target_: quadra.models.classification.TimmNetworkBuilder + model_name: starnet_s4.in1k + pretrained: true + freeze: false +metadata: + input_size: 224 + output_dim: 256 diff --git a/quadra/configs/backbone/swiftformer_l1.yaml b/quadra/configs/backbone/swiftformer_l1.yaml new file mode 100644 index 000000000..c6ebb1490 --- /dev/null +++ b/quadra/configs/backbone/swiftformer_l1.yaml @@ -0,0 +1,8 @@ +model: + _target_: quadra.models.classification.TimmNetworkBuilder + model_name: swiftformer_l1.dist_in1k + pretrained: true + freeze: false +metadata: + input_size: 224 + output_dim: 384 diff --git a/quadra/configs/backbone/swiftformer_l3.yaml b/quadra/configs/backbone/swiftformer_l3.yaml new file mode 100644 index 000000000..6b0f9bd49 --- /dev/null +++ b/quadra/configs/backbone/swiftformer_l3.yaml @@ -0,0 +1,8 @@ +model: + _target_: quadra.models.classification.TimmNetworkBuilder + model_name: swiftformer_l3.dist_in1k + pretrained: true + freeze: false +metadata: + input_size: 224 + output_dim: 512 diff --git a/quadra/configs/backbone/swiftformer_s.yaml b/quadra/configs/backbone/swiftformer_s.yaml new file mode 100644 index 000000000..33ea5ff19 --- /dev/null +++ b/quadra/configs/backbone/swiftformer_s.yaml @@ -0,0 +1,8 @@ +model: + _target_: quadra.models.classification.TimmNetworkBuilder + model_name: swiftformer_s.dist_in1k + pretrained: true + freeze: false +metadata: + input_size: 224 + output_dim: 224 diff --git a/quadra/configs/backbone/swiftformer_xs.yaml b/quadra/configs/backbone/swiftformer_xs.yaml new file mode 100644 index 000000000..799e8e8cb --- /dev/null +++ b/quadra/configs/backbone/swiftformer_xs.yaml @@ -0,0 +1,8 @@ +model: + _target_: quadra.models.classification.TimmNetworkBuilder + model_name: swiftformer_xs.dist_in1k + pretrained: true + freeze: false +metadata: + input_size: 224 + output_dim: 220 diff --git a/quadra/models/classification/backbones.py b/quadra/models/classification/backbones.py index 3bf48d954..27ed00d7a 100644 --- a/quadra/models/classification/backbones.py +++ b/quadra/models/classification/backbones.py @@ -4,7 +4,7 @@ import timm import torch -from timm.models.helpers import load_checkpoint +from timm.models import load_checkpoint from torch import nn from torchvision import models diff --git a/quadra/utils/evaluation.py b/quadra/utils/evaluation.py index 9857d43e2..156ffc634 100644 --- a/quadra/utils/evaluation.py +++ b/quadra/utils/evaluation.py @@ -467,10 +467,10 @@ def wrapper(self, *args, **kwargs): log.warning( "The function %s went out of memory, trying to reduce the batch size to %d", func.__name__, - self.datamodule.batch_size, + getattr(self.datamodule, batch_size_attribute_name), ) - if self.datamodule.batch_size == 0: + if getattr(self.datamodule, batch_size_attribute_name) == 0: raise RuntimeError( f"Unable to run {func.__name__} with batch size 1, the program will exit" ) from e diff --git a/quadra/utils/mlflow.py b/quadra/utils/mlflow.py index 9ebbc4815..2cce4ecee 100644 --- a/quadra/utils/mlflow.py +++ b/quadra/utils/mlflow.py @@ -121,6 +121,7 @@ def _log_single_model( Returns: True if model was uploaded successfully, False otherwise. """ + model_name = os.path.basename(model_path).replace(".", "_") if model_type == "pytorch" and not mlflow_zip_models: log.warning("Pytorch format still not supported for mlflow upload") return False @@ -128,11 +129,13 @@ def _log_single_model( if mlflow_zip_models: with TemporaryDirectory() as temp_dir: _create_model_zip_archive(model_path, model_type, export_folder, temp_dir) + # Set step=-1 to avoid psycopg2.errors.UniqueViolation raised as a result of Query-invoked autoflush mlflow.pyfunc.log_model( - artifact_path=model_path, + name=model_name, loader_module="not.used", data_path=os.path.join(temp_dir, "assets.zip"), pip_requirements=[""], + step=-1, ) return True @@ -145,11 +148,8 @@ def _log_single_model( if model_type in ["torchscript", "pytorch"]: signature = infer_signature_model(loaded_model.model, inputs) - mlflow.pytorch.log_model( - loaded_model.model, - artifact_path=model_path, - signature=signature, - ) + # Set step=-1 to avoid psycopg2.errors.UniqueViolation raised as a result of Query-invoked autoflush + mlflow.pytorch.log_model(loaded_model.model, name=model_name, signature=signature, step=-1) return True if model_type in ["onnx", "simplified_onnx"] and ONNX_AVAILABLE: @@ -159,11 +159,8 @@ def _log_single_model( signature = infer_signature_model(loaded_model, inputs) model_proto = onnx.load(loaded_model.model_path) - mlflow.onnx.log_model( - model_proto, - artifact_path=model_path, - signature=signature, - ) + # Set step=-1 to avoid psycopg2.errors.UniqueViolation raised as a result of Query-invoked autoflush + mlflow.onnx.log_model(model_proto, name=model_name, signature=signature, step=-1) return True return False @@ -396,6 +393,7 @@ def __init__(self, config: DictConfig): self._experiment_id: str | None self._experiment_name: str = "default" self._tracking_uri: str + self._run_name: str | None self._enabled: bool = False self._setup() @@ -426,6 +424,12 @@ def tracking_uri(self) -> str: def _setup(self) -> None: """Determine whether MLflow integration should be active.""" + # Initialize all properties first + self._run_id = None + self._experiment_id = None + self._tracking_uri = "" + self._run_name = None + logger_config = self._config.get("logger") if logger_config is None: log.info("No logger config found, sklearn MLflow integration disabled") @@ -444,8 +448,6 @@ def _setup(self) -> None: self._experiment_name = mlflow_config.get("experiment_name", self._config.core.get("name", "default")) self._run_name = mlflow_config.get("run_name", None) self._tracking_uri = tracking_uri - self._experiment_id = None - self._run_id = None self._enabled = True def start_run(self) -> None: @@ -551,8 +553,10 @@ def log_sklearn_model(self, model: Any, artifact_path: str) -> None: return try: - mlflow.sklearn.log_model(model, artifact_path=artifact_path) - log.info("Sklearn model logged to MLflow at artifact_path=%s", artifact_path) + model_name = os.path.basename(artifact_path).replace(".", "_") + # Set step=-1 to avoid psycopg2.errors.UniqueViolation raised as a result of Query-invoked autoflush + mlflow.sklearn.log_model(model, name=model_name, step=-1) + log.info("Sklearn model logged to MLflow with name=%s", model_name) except Exception as e: log.warning("Failed to log sklearn model to MLflow: %s", e) diff --git a/quadra/utils/models.py b/quadra/utils/models.py index acfc07f3b..fdd3e7fb0 100644 --- a/quadra/utils/models.py +++ b/quadra/utils/models.py @@ -13,7 +13,7 @@ from pytorch_grad_cam import GradCAM from scipy import ndimage from sklearn.linear_model._base import ClassifierMixin -from timm.models.layers import DropPath +from timm.layers import DropPath from timm.models.vision_transformer import Mlp from torch import nn @@ -127,16 +127,16 @@ def get_feature( if not hasattr(feature_extractor, "features_extractor"): gradcam = False elif isinstance(feature_extractor.features_extractor, timm.models.resnet.ResNet): - target_layers = [feature_extractor.features_extractor.layer4[-1]] + target_layers = [feature_extractor.features_extractor.layer4[-1]] # type: ignore[index] cam = GradCAM( model=feature_extractor, target_layers=target_layers, ) - for p in feature_extractor.features_extractor.layer4[-1].parameters(): + for p in feature_extractor.features_extractor.layer4[-1].parameters(): # type: ignore[index,union-attr] p.requires_grad = True - elif is_vision_transformer(feature_extractor.features_extractor): + elif is_vision_transformer(cast(torch.nn.Module, feature_extractor.features_extractor)): grad_rollout = VitAttentionGradRollout( - feature_extractor.features_extractor, + cast(torch.nn.Module, feature_extractor.features_extractor), classifier=classifier, example_input=None if input_shape is None else torch.randn(1, *input_shape), ) @@ -162,7 +162,7 @@ def get_feature( if gradcam: y_hat = cast(list[torch.Tensor] | tuple[torch.Tensor] | torch.Tensor, feature_extractor(x1).detach()) # mypy can't detect that gradcam is true only if we have a features_extractor - if is_vision_transformer(feature_extractor.features_extractor): # type: ignore[union-attr] + if is_vision_transformer(cast(torch.nn.Module, feature_extractor.features_extractor)): # type: ignore[union-attr] grayscale_cam_low_res = grad_rollout( input_tensor=x1, targets_list=y1 ) # TODO: We are using labels (y1) but it would be better to use preds