From 1800cdf1d01fc3fddbd483d5e174eba88bbd9daf Mon Sep 17 00:00:00 2001 From: wassname Date: Sun, 12 Nov 2023 13:35:39 +0800 Subject: [PATCH 01/30] add poetry env --- poetry.lock | 2906 +++++++++++++++++++++++++++++++++++++++++++ pyproject.toml | 41 + research_journal.md | 65 + 3 files changed, 3012 insertions(+) create mode 100644 poetry.lock create mode 100644 pyproject.toml create mode 100644 research_journal.md diff --git a/poetry.lock b/poetry.lock new file mode 100644 index 0000000..9ad1a2b --- /dev/null +++ b/poetry.lock @@ -0,0 +1,2906 @@ +# This file is automatically @generated by Poetry 1.6.1 and should not be changed by hand. + +[[package]] +name = "accelerate" +version = "0.24.1" +description = "Accelerate" +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "accelerate-0.24.1-py3-none-any.whl", hash = "sha256:866dec394da60e8da964be212379d8cf6cc0d0e5e28a7c0d7e09507715d21c61"}, + {file = "accelerate-0.24.1.tar.gz", hash = "sha256:85ab2aeb4d06194b75113339f81b7d650523414a82c9e91b2912a655f53dfa8e"}, +] + +[package.dependencies] +huggingface-hub = "*" +numpy = ">=1.17" +packaging = ">=20.0" +psutil = "*" +pyyaml = "*" +torch = ">=1.10.0" + +[package.extras] +dev = ["bitsandbytes", "black (>=23.1,<24.0)", "datasets", "deepspeed", "evaluate", "hf-doc-builder (>=0.3.0)", "parameterized", "pytest", "pytest-subtests", "pytest-xdist", "rich", "ruff (>=0.0.241)", "scikit-learn", "scipy", "timm", "tqdm", "transformers", "urllib3 (<2.0.0)"] +quality = ["black (>=23.1,<24.0)", "hf-doc-builder (>=0.3.0)", "ruff (>=0.0.241)", "urllib3 (<2.0.0)"] +rich = ["rich"] +sagemaker = ["sagemaker"] +test-dev = ["bitsandbytes", "datasets", "deepspeed", "evaluate", "scikit-learn", "scipy", "timm", "tqdm", "transformers"] +test-prod = ["parameterized", "pytest", "pytest-subtests", "pytest-xdist"] +test-trackers = ["comet-ml", "tensorboard", "wandb"] +testing = ["bitsandbytes", "datasets", "deepspeed", "evaluate", "parameterized", "pytest", "pytest-subtests", "pytest-xdist", "scikit-learn", "scipy", "timm", "tqdm", "transformers"] + +[[package]] +name = "ale-py" +version = "0.8.1" +description = "The Arcade Learning Environment (ALE) - a platform for AI research." +optional = false +python-versions = ">=3.7" +files = [ + {file = "ale_py-0.8.1-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:b2aa2f69a4169742800615970efe6914fa856e33eaf7fa9133c0e06a617a80e2"}, + {file = "ale_py-0.8.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6f2f6b92c8fd6189654979bbf0b305dbe0ecf82176c47f244d8c1cbc36286b89"}, + {file = "ale_py-0.8.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9b168eb88c87d0f3e2a778e6c5cdde4ad951d1ca8a6dc3d3679fd45398df7d1"}, + {file = "ale_py-0.8.1-cp310-cp310-win_amd64.whl", hash = "sha256:5fcc31f495de79ee1d6bfc0f4b7c4619948851e679bbf010035e25f23146a687"}, + {file = "ale_py-0.8.1-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:0856ca777473ec4ae8a59f3af9580259adb0fd4a47d586a125a440c62e82fc10"}, + {file = "ale_py-0.8.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f10b1df8774bbe3b00365748b5e0e07cf35f6a703bbaff991bc7b3b2247dccc9"}, + {file = "ale_py-0.8.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0006d80dfe7745eb5a93444492337203c8bc7eb594a2c24c6a651c5c5b0eaf09"}, + {file = "ale_py-0.8.1-cp311-cp311-win_amd64.whl", hash = "sha256:9773eea7505484e024beb2fff0f3bfd363db151bdb9799d70995448e196b1ded"}, + {file = "ale_py-0.8.1-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:87557db05be0e04130e2ec1bf909d3bb0b0bc034645d4f664e6baa573fe32191"}, + {file = "ale_py-0.8.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ae2ba24557e0ce541ea3be13b148db2a9cfa730d83537b4cbed5e10449826e51"}, + {file = "ale_py-0.8.1-cp37-cp37m-win_amd64.whl", hash = "sha256:ade5c32af567629164a6b49378978c728a15dc4db07ad6b679e8832d4fd3ea1f"}, + {file = "ale_py-0.8.1-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:0ffecb5c956749596030e464827642945162170a132d093c3d4fa2d7e5725c18"}, + {file = "ale_py-0.8.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7cd74b7ee0248ef11a086c9764e142e71defd40ec8989a99232bfd2d9e8023be"}, + {file = "ale_py-0.8.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eadf9f3990b4ff2f9e5ca35889f5e2e95cddd6a353d9d857d9b4601a6e1c4e7c"}, + {file = "ale_py-0.8.1-cp38-cp38-win_amd64.whl", hash = "sha256:817adf9a3a82c4923c731e634520a5ecf296aca0367f5c69959a96b32119d831"}, + {file = "ale_py-0.8.1-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:2d9fcfa06c74a613c5419e942ef4d3e0959533f52e94d2d4bda61d07fbfffeee"}, + {file = "ale_py-0.8.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f278036f9b6066062abcdf0987a0ec5a8e0f22a2c7cfac925e39378d4343d490"}, + {file = "ale_py-0.8.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b00f74e27815131c1a2791f3d48114363fa2708e19f09ce6b7b614cb14c9d469"}, + {file = "ale_py-0.8.1-cp39-cp39-win_amd64.whl", hash = "sha256:d49b550a2d9c25b63c343aa680fd81f253a3714cdc0e1835640933ebff1798ff"}, +] + +[package.dependencies] +importlib-metadata = {version = ">=4.10.0", markers = "python_version < \"3.10\""} +importlib-resources = "*" +numpy = "*" +typing-extensions = {version = "*", markers = "python_version < \"3.11\""} + +[package.extras] +test = ["gym (>=0.23,<1.0)", "pytest (>=7.0)"] + +[[package]] +name = "antlr4-python3-runtime" +version = "4.9.3" +description = "ANTLR 4.9.3 runtime for Python 3.7" +optional = false +python-versions = "*" +files = [ + {file = "antlr4-python3-runtime-4.9.3.tar.gz", hash = "sha256:f224469b4168294902bb1efa80a8bf7855f24c99aef99cbefc1bcd3cce77881b"}, +] + +[[package]] +name = "appnope" +version = "0.1.3" +description = "Disable App Nap on macOS >= 10.9" +optional = false +python-versions = "*" +files = [ + {file = "appnope-0.1.3-py2.py3-none-any.whl", hash = "sha256:265a455292d0bd8a72453494fa24df5a11eb18373a60c7c0430889f22548605e"}, + {file = "appnope-0.1.3.tar.gz", hash = "sha256:02bd91c4de869fbb1e1c50aafc4098827a7a54ab2f39d9dcba6c9547ed920e24"}, +] + +[[package]] +name = "asttokens" +version = "2.4.1" +description = "Annotate AST trees with source code positions" +optional = false +python-versions = "*" +files = [ + {file = "asttokens-2.4.1-py2.py3-none-any.whl", hash = "sha256:051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24"}, + {file = "asttokens-2.4.1.tar.gz", hash = "sha256:b03869718ba9a6eb027e134bfdf69f38a236d681c83c160d510768af11254ba0"}, +] + +[package.dependencies] +six = ">=1.12.0" + +[package.extras] +astroid = ["astroid (>=1,<2)", "astroid (>=2,<4)"] +test = ["astroid (>=1,<2)", "astroid (>=2,<4)", "pytest"] + +[[package]] +name = "autorom" +version = "0.4.2" +description = "Automated installation of Atari ROMs for Gym/ALE-Py" +optional = false +python-versions = ">=3.6" +files = [ + {file = "AutoROM-0.4.2-py3-none-any.whl", hash = "sha256:719c9d363ef08391fdb7003d70df235b68f36de628d289a946c4a59a3adefa13"}, + {file = "AutoROM-0.4.2.tar.gz", hash = "sha256:b426a39bc0ee3781c7791f28963a9b2e4385b6421eeaf2f368edc00c761d428a"}, +] + +[package.dependencies] +"AutoROM.accept-rom-license" = {version = "*", optional = true, markers = "extra == \"accept-rom-license\""} +click = "*" +requests = "*" +tqdm = "*" + +[package.extras] +accept-rom-license = ["AutoROM.accept-rom-license"] + +[[package]] +name = "autorom-accept-rom-license" +version = "0.6.1" +description = "Automated installation of Atari ROMs for Gym/ALE-Py" +optional = false +python-versions = ">=3.7" +files = [ + {file = "AutoROM.accept-rom-license-0.6.1.tar.gz", hash = "sha256:0c905a708d634a076f686802f672817d3585259ce3be0bde8713a4fb59e3159e"}, +] + +[package.dependencies] +click = "*" +requests = "*" + +[package.extras] +tests = ["ale_py", "multi_agent_ale_py"] + +[[package]] +name = "bitsandbytes" +version = "0.41.0" +description = "k-bit optimizers and matrix multiplication routines." +optional = false +python-versions = "*" +files = [ + {file = "bitsandbytes-0.41.0-py3-none-any.whl", hash = "sha256:dfaebbdcf48bff6628ca04880877a10b4da61e4fff62cdd3433764b1571ab3d1"}, +] + +[package.source] +type = "url" +url = "https://github.com/TimDettmers/bitsandbytes/releases/download/0.41.0/bitsandbytes-0.41.0-py3-none-any.whl" + +[[package]] +name = "certifi" +version = "2023.7.22" +description = "Python package for providing Mozilla's CA Bundle." +optional = false +python-versions = ">=3.6" +files = [ + {file = "certifi-2023.7.22-py3-none-any.whl", hash = "sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9"}, + {file = "certifi-2023.7.22.tar.gz", hash = "sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082"}, +] + +[[package]] +name = "cffi" +version = "1.16.0" +description = "Foreign Function Interface for Python calling C code." +optional = false +python-versions = ">=3.8" +files = [ + {file = "cffi-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088"}, + {file = "cffi-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614"}, + {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743"}, + {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d"}, + {file = "cffi-1.16.0-cp310-cp310-win32.whl", hash = "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a"}, + {file = "cffi-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1"}, + {file = "cffi-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404"}, + {file = "cffi-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e"}, + {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc"}, + {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb"}, + {file = "cffi-1.16.0-cp311-cp311-win32.whl", hash = "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab"}, + {file = "cffi-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba"}, + {file = "cffi-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956"}, + {file = "cffi-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969"}, + {file = "cffi-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520"}, + {file = "cffi-1.16.0-cp312-cp312-win32.whl", hash = "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b"}, + {file = "cffi-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235"}, + {file = "cffi-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324"}, + {file = "cffi-1.16.0-cp38-cp38-win32.whl", hash = "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a"}, + {file = "cffi-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36"}, + {file = "cffi-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed"}, + {file = "cffi-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098"}, + {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000"}, + {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe"}, + {file = "cffi-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4"}, + {file = "cffi-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8"}, + {file = "cffi-1.16.0.tar.gz", hash = "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0"}, +] + +[package.dependencies] +pycparser = "*" + +[[package]] +name = "charset-normalizer" +version = "3.3.2" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, + {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, +] + +[[package]] +name = "click" +version = "8.1.7" +description = "Composable command line interface toolkit" +optional = false +python-versions = ">=3.7" +files = [ + {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, + {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[[package]] +name = "cloudpickle" +version = "3.0.0" +description = "Pickler class to extend the standard pickle.Pickler functionality" +optional = false +python-versions = ">=3.8" +files = [ + {file = "cloudpickle-3.0.0-py3-none-any.whl", hash = "sha256:246ee7d0c295602a036e86369c77fecda4ab17b506496730f2f576d9016fd9c7"}, + {file = "cloudpickle-3.0.0.tar.gz", hash = "sha256:996d9a482c6fb4f33c1a35335cf8afd065d2a56e973270364840712d9131a882"}, +] + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "comm" +version = "0.2.0" +description = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc." +optional = false +python-versions = ">=3.8" +files = [ + {file = "comm-0.2.0-py3-none-any.whl", hash = "sha256:2da8d9ebb8dd7bfc247adaff99f24dce705638a8042b85cb995066793e391001"}, + {file = "comm-0.2.0.tar.gz", hash = "sha256:a517ea2ca28931c7007a7a99c562a0fa5883cfb48963140cf642c41c948498be"}, +] + +[package.dependencies] +traitlets = ">=4" + +[package.extras] +test = ["pytest"] + +[[package]] +name = "contourpy" +version = "1.2.0" +description = "Python library for calculating contours of 2D quadrilateral grids" +optional = false +python-versions = ">=3.9" +files = [ + {file = "contourpy-1.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0274c1cb63625972c0c007ab14dd9ba9e199c36ae1a231ce45d725cbcbfd10a8"}, + {file = "contourpy-1.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ab459a1cbbf18e8698399c595a01f6dcc5c138220ca3ea9e7e6126232d102bb4"}, + {file = "contourpy-1.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fdd887f17c2f4572ce548461e4f96396681212d858cae7bd52ba3310bc6f00f"}, + {file = "contourpy-1.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5d16edfc3fc09968e09ddffada434b3bf989bf4911535e04eada58469873e28e"}, + {file = "contourpy-1.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c203f617abc0dde5792beb586f827021069fb6d403d7f4d5c2b543d87edceb9"}, + {file = "contourpy-1.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b69303ceb2e4d4f146bf82fda78891ef7bcd80c41bf16bfca3d0d7eb545448aa"}, + {file = "contourpy-1.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:884c3f9d42d7218304bc74a8a7693d172685c84bd7ab2bab1ee567b769696df9"}, + {file = "contourpy-1.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4a1b1208102be6e851f20066bf0e7a96b7d48a07c9b0cfe6d0d4545c2f6cadab"}, + {file = "contourpy-1.2.0-cp310-cp310-win32.whl", hash = "sha256:34b9071c040d6fe45d9826cbbe3727d20d83f1b6110d219b83eb0e2a01d79488"}, + {file = "contourpy-1.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:bd2f1ae63998da104f16a8b788f685e55d65760cd1929518fd94cd682bf03e41"}, + {file = "contourpy-1.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:dd10c26b4eadae44783c45ad6655220426f971c61d9b239e6f7b16d5cdaaa727"}, + {file = "contourpy-1.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5c6b28956b7b232ae801406e529ad7b350d3f09a4fde958dfdf3c0520cdde0dd"}, + {file = "contourpy-1.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ebeac59e9e1eb4b84940d076d9f9a6cec0064e241818bcb6e32124cc5c3e377a"}, + {file = "contourpy-1.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:139d8d2e1c1dd52d78682f505e980f592ba53c9f73bd6be102233e358b401063"}, + {file = "contourpy-1.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1e9dc350fb4c58adc64df3e0703ab076f60aac06e67d48b3848c23647ae4310e"}, + {file = "contourpy-1.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18fc2b4ed8e4a8fe849d18dce4bd3c7ea637758c6343a1f2bae1e9bd4c9f4686"}, + {file = "contourpy-1.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:16a7380e943a6d52472096cb7ad5264ecee36ed60888e2a3d3814991a0107286"}, + {file = "contourpy-1.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8d8faf05be5ec8e02a4d86f616fc2a0322ff4a4ce26c0f09d9f7fb5330a35c95"}, + {file = "contourpy-1.2.0-cp311-cp311-win32.whl", hash = "sha256:67b7f17679fa62ec82b7e3e611c43a016b887bd64fb933b3ae8638583006c6d6"}, + {file = "contourpy-1.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:99ad97258985328b4f207a5e777c1b44a83bfe7cf1f87b99f9c11d4ee477c4de"}, + {file = "contourpy-1.2.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:575bcaf957a25d1194903a10bc9f316c136c19f24e0985a2b9b5608bdf5dbfe0"}, + {file = "contourpy-1.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9e6c93b5b2dbcedad20a2f18ec22cae47da0d705d454308063421a3b290d9ea4"}, + {file = "contourpy-1.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:464b423bc2a009088f19bdf1f232299e8b6917963e2b7e1d277da5041f33a779"}, + {file = "contourpy-1.2.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:68ce4788b7d93e47f84edd3f1f95acdcd142ae60bc0e5493bfd120683d2d4316"}, + {file = "contourpy-1.2.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d7d1f8871998cdff5d2ff6a087e5e1780139abe2838e85b0b46b7ae6cc25399"}, + {file = "contourpy-1.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e739530c662a8d6d42c37c2ed52a6f0932c2d4a3e8c1f90692ad0ce1274abe0"}, + {file = "contourpy-1.2.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:247b9d16535acaa766d03037d8e8fb20866d054d3c7fbf6fd1f993f11fc60ca0"}, + {file = "contourpy-1.2.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:461e3ae84cd90b30f8d533f07d87c00379644205b1d33a5ea03381edc4b69431"}, + {file = "contourpy-1.2.0-cp312-cp312-win32.whl", hash = "sha256:1c2559d6cffc94890b0529ea7eeecc20d6fadc1539273aa27faf503eb4656d8f"}, + {file = "contourpy-1.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:491b1917afdd8638a05b611a56d46587d5a632cabead889a5440f7c638bc6ed9"}, + {file = "contourpy-1.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5fd1810973a375ca0e097dee059c407913ba35723b111df75671a1976efa04bc"}, + {file = "contourpy-1.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:999c71939aad2780f003979b25ac5b8f2df651dac7b38fb8ce6c46ba5abe6ae9"}, + {file = "contourpy-1.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7caf9b241464c404613512d5594a6e2ff0cc9cb5615c9475cc1d9b514218ae8"}, + {file = "contourpy-1.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:266270c6f6608340f6c9836a0fb9b367be61dde0c9a9a18d5ece97774105ff3e"}, + {file = "contourpy-1.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbd50d0a0539ae2e96e537553aff6d02c10ed165ef40c65b0e27e744a0f10af8"}, + {file = "contourpy-1.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11f8d2554e52f459918f7b8e6aa20ec2a3bce35ce95c1f0ef4ba36fbda306df5"}, + {file = "contourpy-1.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ce96dd400486e80ac7d195b2d800b03e3e6a787e2a522bfb83755938465a819e"}, + {file = "contourpy-1.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6d3364b999c62f539cd403f8123ae426da946e142312a514162adb2addd8d808"}, + {file = "contourpy-1.2.0-cp39-cp39-win32.whl", hash = "sha256:1c88dfb9e0c77612febebb6ac69d44a8d81e3dc60f993215425b62c1161353f4"}, + {file = "contourpy-1.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:78e6ad33cf2e2e80c5dfaaa0beec3d61face0fb650557100ee36db808bfa6843"}, + {file = "contourpy-1.2.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:be16975d94c320432657ad2402f6760990cb640c161ae6da1363051805fa8108"}, + {file = "contourpy-1.2.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b95a225d4948b26a28c08307a60ac00fb8671b14f2047fc5476613252a129776"}, + {file = "contourpy-1.2.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:0d7e03c0f9a4f90dc18d4e77e9ef4ec7b7bbb437f7f675be8e530d65ae6ef956"}, + {file = "contourpy-1.2.0.tar.gz", hash = "sha256:171f311cb758de7da13fc53af221ae47a5877be5a0843a9fe150818c51ed276a"}, +] + +[package.dependencies] +numpy = ">=1.20,<2.0" + +[package.extras] +bokeh = ["bokeh", "selenium"] +docs = ["furo", "sphinx (>=7.2)", "sphinx-copybutton"] +mypy = ["contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.6.1)", "types-Pillow"] +test = ["Pillow", "contourpy[test-no-images]", "matplotlib"] +test-no-images = ["pytest", "pytest-cov", "pytest-xdist", "wurlitzer"] + +[[package]] +name = "cycler" +version = "0.12.1" +description = "Composable style cycles" +optional = false +python-versions = ">=3.8" +files = [ + {file = "cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30"}, + {file = "cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c"}, +] + +[package.extras] +docs = ["ipython", "matplotlib", "numpydoc", "sphinx"] +tests = ["pytest", "pytest-cov", "pytest-xdist"] + +[[package]] +name = "debugpy" +version = "1.8.0" +description = "An implementation of the Debug Adapter Protocol for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "debugpy-1.8.0-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:7fb95ca78f7ac43393cd0e0f2b6deda438ec7c5e47fa5d38553340897d2fbdfb"}, + {file = "debugpy-1.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef9ab7df0b9a42ed9c878afd3eaaff471fce3fa73df96022e1f5c9f8f8c87ada"}, + {file = "debugpy-1.8.0-cp310-cp310-win32.whl", hash = "sha256:a8b7a2fd27cd9f3553ac112f356ad4ca93338feadd8910277aff71ab24d8775f"}, + {file = "debugpy-1.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:5d9de202f5d42e62f932507ee8b21e30d49aae7e46d5b1dd5c908db1d7068637"}, + {file = "debugpy-1.8.0-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:ef54404365fae8d45cf450d0544ee40cefbcb9cb85ea7afe89a963c27028261e"}, + {file = "debugpy-1.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:60009b132c91951354f54363f8ebdf7457aeb150e84abba5ae251b8e9f29a8a6"}, + {file = "debugpy-1.8.0-cp311-cp311-win32.whl", hash = "sha256:8cd0197141eb9e8a4566794550cfdcdb8b3db0818bdf8c49a8e8f8053e56e38b"}, + {file = "debugpy-1.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:a64093656c4c64dc6a438e11d59369875d200bd5abb8f9b26c1f5f723622e153"}, + {file = "debugpy-1.8.0-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:b05a6b503ed520ad58c8dc682749113d2fd9f41ffd45daec16e558ca884008cd"}, + {file = "debugpy-1.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c6fb41c98ec51dd010d7ed650accfd07a87fe5e93eca9d5f584d0578f28f35f"}, + {file = "debugpy-1.8.0-cp38-cp38-win32.whl", hash = "sha256:46ab6780159eeabb43c1495d9c84cf85d62975e48b6ec21ee10c95767c0590aa"}, + {file = "debugpy-1.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:bdc5ef99d14b9c0fcb35351b4fbfc06ac0ee576aeab6b2511702e5a648a2e595"}, + {file = "debugpy-1.8.0-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:61eab4a4c8b6125d41a34bad4e5fe3d2cc145caecd63c3fe953be4cc53e65bf8"}, + {file = "debugpy-1.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:125b9a637e013f9faac0a3d6a82bd17c8b5d2c875fb6b7e2772c5aba6d082332"}, + {file = "debugpy-1.8.0-cp39-cp39-win32.whl", hash = "sha256:57161629133113c97b387382045649a2b985a348f0c9366e22217c87b68b73c6"}, + {file = "debugpy-1.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:e3412f9faa9ade82aa64a50b602544efcba848c91384e9f93497a458767e6926"}, + {file = "debugpy-1.8.0-py2.py3-none-any.whl", hash = "sha256:9c9b0ac1ce2a42888199df1a1906e45e6f3c9555497643a85e0bf2406e3ffbc4"}, + {file = "debugpy-1.8.0.zip", hash = "sha256:12af2c55b419521e33d5fb21bd022df0b5eb267c3e178f1d374a63a2a6bdccd0"}, +] + +[[package]] +name = "decorator" +version = "5.1.1" +description = "Decorators for Humans" +optional = false +python-versions = ">=3.5" +files = [ + {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"}, + {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, +] + +[[package]] +name = "docker-pycreds" +version = "0.4.0" +description = "Python bindings for the docker credentials store API" +optional = false +python-versions = "*" +files = [ + {file = "docker-pycreds-0.4.0.tar.gz", hash = "sha256:6ce3270bcaf404cc4c3e27e4b6c70d3521deae82fb508767870fdbf772d584d4"}, + {file = "docker_pycreds-0.4.0-py2.py3-none-any.whl", hash = "sha256:7266112468627868005106ec19cd0d722702d2b7d5912a28e19b826c3d37af49"}, +] + +[package.dependencies] +six = ">=1.4.0" + +[[package]] +name = "einops" +version = "0.3.2" +description = "A new flavour of deep learning operations" +optional = false +python-versions = "*" +files = [ + {file = "einops-0.3.2-py3-none-any.whl", hash = "sha256:285f3c75620897acb8b5580170c88121f010c77ce130bc7b9f220179009dafe0"}, + {file = "einops-0.3.2.tar.gz", hash = "sha256:5200e413539f0377f4177ef00dc019968f4177c49b1db3e836c7883df2a5fe2e"}, +] + +[[package]] +name = "exceptiongroup" +version = "1.1.3" +description = "Backport of PEP 654 (exception groups)" +optional = false +python-versions = ">=3.7" +files = [ + {file = "exceptiongroup-1.1.3-py3-none-any.whl", hash = "sha256:343280667a4585d195ca1cf9cef84a4e178c4b6cf2274caef9859782b567d5e3"}, + {file = "exceptiongroup-1.1.3.tar.gz", hash = "sha256:097acd85d473d75af5bb98e41b61ff7fe35efe6675e4f9370ec6ec5126d160e9"}, +] + +[package.extras] +test = ["pytest (>=6)"] + +[[package]] +name = "executing" +version = "2.0.1" +description = "Get the currently executing AST node of a frame, and other information" +optional = false +python-versions = ">=3.5" +files = [ + {file = "executing-2.0.1-py2.py3-none-any.whl", hash = "sha256:eac49ca94516ccc753f9fb5ce82603156e590b27525a8bc32cce8ae302eb61bc"}, + {file = "executing-2.0.1.tar.gz", hash = "sha256:35afe2ce3affba8ee97f2d69927fa823b08b472b7b994e36a52a964b93d16147"}, +] + +[package.extras] +tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich"] + +[[package]] +name = "filelock" +version = "3.13.1" +description = "A platform independent file lock." +optional = false +python-versions = ">=3.8" +files = [ + {file = "filelock-3.13.1-py3-none-any.whl", hash = "sha256:57dbda9b35157b05fb3e58ee91448612eb674172fab98ee235ccb0b5bee19a1c"}, + {file = "filelock-3.13.1.tar.gz", hash = "sha256:521f5f56c50f8426f5e03ad3b281b490a87ef15bc6c526f168290f0c7148d44e"}, +] + +[package.extras] +docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.24)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)"] +typing = ["typing-extensions (>=4.8)"] + +[[package]] +name = "fonttools" +version = "4.44.0" +description = "Tools to manipulate font files" +optional = false +python-versions = ">=3.8" +files = [ + {file = "fonttools-4.44.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e1cd1c6bb097e774d68402499ff66185190baaa2629ae2f18515a2c50b93db0c"}, + {file = "fonttools-4.44.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b9eab7f9837fdaa2a10a524fbcc2ec24bf60637c044b6e4a59c3f835b90f0fae"}, + {file = "fonttools-4.44.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f412954275e594f7a51c16f3b3edd850acb0d842fefc33856b63a17e18499a5"}, + {file = "fonttools-4.44.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50d25893885e80a5955186791eed5579f1e75921751539cc1dc3ffd1160b48cf"}, + {file = "fonttools-4.44.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:22ea8aa7b3712450b42b044702bd3a64fd118006bad09a6f94bd1b227088492e"}, + {file = "fonttools-4.44.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:df40daa6c03b98652ffe8110ae014fe695437f6e1cb5a07e16ea37f40e73ac86"}, + {file = "fonttools-4.44.0-cp310-cp310-win32.whl", hash = "sha256:bca49da868e8bde569ef36f0cc1b6de21d56bf9c3be185c503b629c19a185287"}, + {file = "fonttools-4.44.0-cp310-cp310-win_amd64.whl", hash = "sha256:dbac86d83d96099890e731cc2af97976ff2c98f4ba432fccde657c5653a32f1c"}, + {file = "fonttools-4.44.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e8ff7d19a6804bfd561cfcec9b4200dd1788e28f7de4be70189801530c47c1b3"}, + {file = "fonttools-4.44.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a8a1fa9a718de0bc026979c93e1e9b55c5efde60d76f91561fd713387573817d"}, + {file = "fonttools-4.44.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c05064f95aacdfc06f21e55096c964b2228d942b8675fa26995a2551f6329d2d"}, + {file = "fonttools-4.44.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31b38528f25bc662401e6ffae14b3eb7f1e820892fd80369a37155e3b636a2f4"}, + {file = "fonttools-4.44.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:05d7c4d2c95b9490e669f3cb83918799bf1c838619ac6d3bad9ea017cfc63f2e"}, + {file = "fonttools-4.44.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6999e80a125b0cd8e068d0210b63323f17338038c2ecd2e11b9209ec430fe7f2"}, + {file = "fonttools-4.44.0-cp311-cp311-win32.whl", hash = "sha256:a7aec7f5d14dfcd71fb3ebc299b3f000c21fdc4043079101777ed2042ba5b7c5"}, + {file = "fonttools-4.44.0-cp311-cp311-win_amd64.whl", hash = "sha256:518a945dbfe337744bfff31423c1430303b8813c5275dffb0f2577f0734a1189"}, + {file = "fonttools-4.44.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:59b6ad83cce067d10f4790c037a5904424f45bebb5e7be2eb2db90402f288267"}, + {file = "fonttools-4.44.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c2de1fb18198acd400c45ffe2aef5420c8d55fde903e91cba705596099550f3b"}, + {file = "fonttools-4.44.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:84f308b7a8d28208d54315d11d35f9888d6d607673dd4d42d60b463682ee0400"}, + {file = "fonttools-4.44.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66bc6efd829382f7a7e6cf33c2fb32b13edc8a239eb15f32acbf197dce7a0165"}, + {file = "fonttools-4.44.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a8b99713d3a0d0e876b6aecfaada5e7dc9fe979fcd90ef9fa0ba1d9b9aed03f2"}, + {file = "fonttools-4.44.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b63da598d9cbc52e2381f922da0e94d60c0429f92207bd3fb04d112fc82ea7cb"}, + {file = "fonttools-4.44.0-cp312-cp312-win32.whl", hash = "sha256:f611c97678604e302b725f71626edea113a5745a7fb557c958b39edb6add87d5"}, + {file = "fonttools-4.44.0-cp312-cp312-win_amd64.whl", hash = "sha256:58af428746fa73a2edcbf26aff33ac4ef3c11c8d75bb200eaea2f7e888d2de4e"}, + {file = "fonttools-4.44.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:9ee8692e23028564c13d924004495f284df8ac016a19f17a87251210e1f1f928"}, + {file = "fonttools-4.44.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:dab3d00d27b1a79ae4d4a240e8ceea8af0ff049fd45f05adb4f860d93744110d"}, + {file = "fonttools-4.44.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f53526668beccdb3409c6055a4ffe50987a7f05af6436fa55d61f5e7bd450219"}, + {file = "fonttools-4.44.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3da036b016c975c2d8c69005bdc4d5d16266f948a7fab950244e0f58301996a"}, + {file = "fonttools-4.44.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b99fe8ef4093f672d00841569d2d05691e50334d79f4d9c15c1265d76d5580d2"}, + {file = "fonttools-4.44.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6d16d9634ff1e5cea2cf4a8cbda9026f766e4b5f30b48f8180f0e99133d3abfc"}, + {file = "fonttools-4.44.0-cp38-cp38-win32.whl", hash = "sha256:3d29509f6e05e8d725db59c2d8c076223d793e4e35773040be6632a0349f2f97"}, + {file = "fonttools-4.44.0-cp38-cp38-win_amd64.whl", hash = "sha256:d4fa4f4bc8fd86579b8cdbe5e948f35d82c0eda0091c399d009b2a5a6b61c040"}, + {file = "fonttools-4.44.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c794de4086f06ae609b71ac944ec7deb09f34ecf73316fddc041087dd24bba39"}, + {file = "fonttools-4.44.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2db63941fee3122e31a21dd0f5b2138ce9906b661a85b63622421d3654a74ae2"}, + {file = "fonttools-4.44.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eb01c49c8aa035d5346f46630209923d4927ed15c2493db38d31da9f811eb70d"}, + {file = "fonttools-4.44.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46c79af80a835410874683b5779b6c1ec1d5a285e11c45b5193e79dd691eb111"}, + {file = "fonttools-4.44.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b6e6aa2d066f8dafd06d8d0799b4944b5d5a1f015dd52ac01bdf2895ebe169a0"}, + {file = "fonttools-4.44.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:63a3112f753baef8c6ac2f5f574bb9ac8001b86c8c0c0380039db47a7f512d20"}, + {file = "fonttools-4.44.0-cp39-cp39-win32.whl", hash = "sha256:54efed22b2799a85475e6840e907c402ba49892c614565dc770aa97a53621b2b"}, + {file = "fonttools-4.44.0-cp39-cp39-win_amd64.whl", hash = "sha256:2e91e19b583961979e2e5a701269d3cfc07418963bee717f8160b0a24332826b"}, + {file = "fonttools-4.44.0-py3-none-any.whl", hash = "sha256:b9beb0fa6ff3ea808ad4a6962d68ac0f140ddab080957b20d9e268e4d67fb335"}, + {file = "fonttools-4.44.0.tar.gz", hash = "sha256:4e90dd81b6e0d97ebfe52c0d12a17a9ef7f305d6bfbb93081265057d6092f252"}, +] + +[package.extras] +all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0,<5)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.1.0)", "xattr", "zopfli (>=0.1.4)"] +graphite = ["lz4 (>=1.7.4.2)"] +interpolatable = ["munkres", "scipy"] +lxml = ["lxml (>=4.0,<5)"] +pathops = ["skia-pathops (>=0.5.0)"] +plot = ["matplotlib"] +repacker = ["uharfbuzz (>=0.23.0)"] +symfont = ["sympy"] +type1 = ["xattr"] +ufo = ["fs (>=2.2.0,<3)"] +unicode = ["unicodedata2 (>=15.1.0)"] +woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"] + +[[package]] +name = "fsspec" +version = "2023.10.0" +description = "File-system specification" +optional = false +python-versions = ">=3.8" +files = [ + {file = "fsspec-2023.10.0-py3-none-any.whl", hash = "sha256:346a8f024efeb749d2a5fca7ba8854474b1ff9af7c3faaf636a4548781136529"}, + {file = "fsspec-2023.10.0.tar.gz", hash = "sha256:330c66757591df346ad3091a53bd907e15348c2ba17d63fd54f5c39c4457d2a5"}, +] + +[package.extras] +abfs = ["adlfs"] +adl = ["adlfs"] +arrow = ["pyarrow (>=1)"] +dask = ["dask", "distributed"] +devel = ["pytest", "pytest-cov"] +dropbox = ["dropbox", "dropboxdrivefs", "requests"] +full = ["adlfs", "aiohttp (!=4.0.0a0,!=4.0.0a1)", "dask", "distributed", "dropbox", "dropboxdrivefs", "fusepy", "gcsfs", "libarchive-c", "ocifs", "panel", "paramiko", "pyarrow (>=1)", "pygit2", "requests", "s3fs", "smbprotocol", "tqdm"] +fuse = ["fusepy"] +gcs = ["gcsfs"] +git = ["pygit2"] +github = ["requests"] +gs = ["gcsfs"] +gui = ["panel"] +hdfs = ["pyarrow (>=1)"] +http = ["aiohttp (!=4.0.0a0,!=4.0.0a1)", "requests"] +libarchive = ["libarchive-c"] +oci = ["ocifs"] +s3 = ["s3fs"] +sftp = ["paramiko"] +smb = ["smbprotocol"] +ssh = ["paramiko"] +tqdm = ["tqdm"] + +[[package]] +name = "gitdb" +version = "4.0.11" +description = "Git Object Database" +optional = false +python-versions = ">=3.7" +files = [ + {file = "gitdb-4.0.11-py3-none-any.whl", hash = "sha256:81a3407ddd2ee8df444cbacea00e2d038e40150acfa3001696fe0dcf1d3adfa4"}, + {file = "gitdb-4.0.11.tar.gz", hash = "sha256:bf5421126136d6d0af55bc1e7c1af1c397a34f5b7bd79e776cd3e89785c2b04b"}, +] + +[package.dependencies] +smmap = ">=3.0.1,<6" + +[[package]] +name = "gitpython" +version = "3.1.40" +description = "GitPython is a Python library used to interact with Git repositories" +optional = false +python-versions = ">=3.7" +files = [ + {file = "GitPython-3.1.40-py3-none-any.whl", hash = "sha256:cf14627d5a8049ffbf49915732e5eddbe8134c3bdb9d476e6182b676fc573f8a"}, + {file = "GitPython-3.1.40.tar.gz", hash = "sha256:22b126e9ffb671fdd0c129796343a02bf67bf2994b35449ffc9321aa755e18a4"}, +] + +[package.dependencies] +gitdb = ">=4.0.1,<5" + +[package.extras] +test = ["black", "coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mock", "mypy", "pre-commit", "pytest", "pytest-cov", "pytest-instafail", "pytest-subtests", "pytest-sugar"] + +[[package]] +name = "gym" +version = "0.26.2" +description = "Gym: A universal API for reinforcement learning environments" +optional = false +python-versions = ">=3.6" +files = [ + {file = "gym-0.26.2.tar.gz", hash = "sha256:e0d882f4b54f0c65f203104c24ab8a38b039f1289986803c7d02cdbe214fbcc4"}, +] + +[package.dependencies] +autorom = {version = ">=0.4.2,<0.5.0", extras = ["accept-rom-license"], optional = true, markers = "extra == \"accept-rom-license\""} +cloudpickle = ">=1.2.0" +gym_notices = ">=0.0.4" +importlib_metadata = {version = ">=4.8.0", markers = "python_version < \"3.10\""} +numpy = ">=1.18.0" + +[package.extras] +accept-rom-license = ["autorom[accept-rom-license] (>=0.4.2,<0.5.0)"] +all = ["ale-py (>=0.8.0,<0.9.0)", "box2d-py (==2.3.5)", "imageio (>=2.14.1)", "lz4 (>=3.1.0)", "matplotlib (>=3.0)", "moviepy (>=1.0.0)", "mujoco (==2.2)", "mujoco_py (>=2.1,<2.2)", "opencv-python (>=3.0)", "pygame (==2.1.0)", "pytest (==7.0.1)", "swig (==4.*)"] +atari = ["ale-py (>=0.8.0,<0.9.0)"] +box2d = ["box2d-py (==2.3.5)", "pygame (==2.1.0)", "swig (==4.*)"] +classic-control = ["pygame (==2.1.0)"] +mujoco = ["imageio (>=2.14.1)", "mujoco (==2.2)"] +mujoco-py = ["mujoco_py (>=2.1,<2.2)"] +other = ["lz4 (>=3.1.0)", "matplotlib (>=3.0)", "moviepy (>=1.0.0)", "opencv-python (>=3.0)"] +testing = ["box2d-py (==2.3.5)", "imageio (>=2.14.1)", "lz4 (>=3.1.0)", "matplotlib (>=3.0)", "moviepy (>=1.0.0)", "mujoco (==2.2)", "mujoco_py (>=2.1,<2.2)", "opencv-python (>=3.0)", "pygame (==2.1.0)", "pytest (==7.0.1)", "swig (==4.*)"] +toy-text = ["pygame (==2.1.0)"] + +[[package]] +name = "gym-notices" +version = "0.0.8" +description = "Notices for gym" +optional = false +python-versions = "*" +files = [ + {file = "gym-notices-0.0.8.tar.gz", hash = "sha256:ad25e200487cafa369728625fe064e88ada1346618526102659b4640f2b4b911"}, + {file = "gym_notices-0.0.8-py3-none-any.whl", hash = "sha256:e5f82e00823a166747b4c2a07de63b6560b1acb880638547e0cabf825a01e463"}, +] + +[[package]] +name = "huggingface-hub" +version = "0.17.3" +description = "Client library to download and publish models, datasets and other repos on the huggingface.co hub" +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "huggingface_hub-0.17.3-py3-none-any.whl", hash = "sha256:545eb3665f6ac587add946e73984148f2ea5c7877eac2e845549730570c1933a"}, + {file = "huggingface_hub-0.17.3.tar.gz", hash = "sha256:40439632b211311f788964602bf8b0d9d6b7a2314fba4e8d67b2ce3ecea0e3fd"}, +] + +[package.dependencies] +filelock = "*" +fsspec = "*" +packaging = ">=20.9" +pyyaml = ">=5.1" +requests = "*" +tqdm = ">=4.42.1" +typing-extensions = ">=3.7.4.3" + +[package.extras] +all = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "black (==23.7)", "gradio", "jedi", "mypy (==1.5.1)", "numpy", "pydantic (<2.0)", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-vcr", "pytest-xdist", "ruff (>=0.0.241)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "urllib3 (<2.0)"] +cli = ["InquirerPy (==0.3.4)"] +dev = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "black (==23.7)", "gradio", "jedi", "mypy (==1.5.1)", "numpy", "pydantic (<2.0)", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-vcr", "pytest-xdist", "ruff (>=0.0.241)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "urllib3 (<2.0)"] +docs = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "black (==23.7)", "gradio", "hf-doc-builder", "jedi", "mypy (==1.5.1)", "numpy", "pydantic (<2.0)", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-vcr", "pytest-xdist", "ruff (>=0.0.241)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "urllib3 (<2.0)", "watchdog"] +fastai = ["fastai (>=2.4)", "fastcore (>=1.3.27)", "toml"] +inference = ["aiohttp", "pydantic (<2.0)"] +quality = ["black (==23.7)", "mypy (==1.5.1)", "ruff (>=0.0.241)"] +tensorflow = ["graphviz", "pydot", "tensorflow"] +testing = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "gradio", "jedi", "numpy", "pydantic (<2.0)", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-vcr", "pytest-xdist", "soundfile", "urllib3 (<2.0)"] +torch = ["torch"] +typing = ["pydantic (<2.0)", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3"] + +[[package]] +name = "hydra-core" +version = "1.3.2" +description = "A framework for elegantly configuring complex applications" +optional = false +python-versions = "*" +files = [ + {file = "hydra-core-1.3.2.tar.gz", hash = "sha256:8a878ed67216997c3e9d88a8e72e7b4767e81af37afb4ea3334b269a4390a824"}, + {file = "hydra_core-1.3.2-py3-none-any.whl", hash = "sha256:fa0238a9e31df3373b35b0bfb672c34cc92718d21f81311d8996a16de1141d8b"}, +] + +[package.dependencies] +antlr4-python3-runtime = "==4.9.*" +omegaconf = ">=2.2,<2.4" +packaging = "*" + +[[package]] +name = "idna" +version = "3.4" +description = "Internationalized Domain Names in Applications (IDNA)" +optional = false +python-versions = ">=3.5" +files = [ + {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, + {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, +] + +[[package]] +name = "importlib-metadata" +version = "6.8.0" +description = "Read metadata from Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "importlib_metadata-6.8.0-py3-none-any.whl", hash = "sha256:3ebb78df84a805d7698245025b975d9d67053cd94c79245ba4b3eb694abe68bb"}, + {file = "importlib_metadata-6.8.0.tar.gz", hash = "sha256:dbace7892d8c0c4ac1ad096662232f831d4e64f4c4545bd53016a3e9d4654743"}, +] + +[package.dependencies] +zipp = ">=0.5" + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +perf = ["ipython"] +testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)", "pytest-ruff"] + +[[package]] +name = "importlib-resources" +version = "6.1.1" +description = "Read resources from Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "importlib_resources-6.1.1-py3-none-any.whl", hash = "sha256:e8bf90d8213b486f428c9c39714b920041cb02c184686a3dee24905aaa8105d6"}, + {file = "importlib_resources-6.1.1.tar.gz", hash = "sha256:3893a00122eafde6894c59914446a512f728a0c1a45f9bb9b63721b6bacf0b4a"}, +] + +[package.dependencies] +zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""} + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-ruff", "zipp (>=3.17)"] + +[[package]] +name = "ipykernel" +version = "6.26.0" +description = "IPython Kernel for Jupyter" +optional = false +python-versions = ">=3.8" +files = [ + {file = "ipykernel-6.26.0-py3-none-any.whl", hash = "sha256:3ba3dc97424b87b31bb46586b5167b3161b32d7820b9201a9e698c71e271602c"}, + {file = "ipykernel-6.26.0.tar.gz", hash = "sha256:553856658eb8430bbe9653ea041a41bff63e9606fc4628873fc92a6cf3abd404"}, +] + +[package.dependencies] +appnope = {version = "*", markers = "platform_system == \"Darwin\""} +comm = ">=0.1.1" +debugpy = ">=1.6.5" +ipython = ">=7.23.1" +jupyter-client = ">=6.1.12" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" +matplotlib-inline = ">=0.1" +nest-asyncio = "*" +packaging = "*" +psutil = "*" +pyzmq = ">=20" +tornado = ">=6.1" +traitlets = ">=5.4.0" + +[package.extras] +cov = ["coverage[toml]", "curio", "matplotlib", "pytest-cov", "trio"] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "trio"] +pyqt5 = ["pyqt5"] +pyside6 = ["pyside6"] +test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0)", "pytest-asyncio", "pytest-cov", "pytest-timeout"] + +[[package]] +name = "ipython" +version = "8.17.2" +description = "IPython: Productive Interactive Computing" +optional = false +python-versions = ">=3.9" +files = [ + {file = "ipython-8.17.2-py3-none-any.whl", hash = "sha256:1e4d1d666a023e3c93585ba0d8e962867f7a111af322efff6b9c58062b3e5444"}, + {file = "ipython-8.17.2.tar.gz", hash = "sha256:126bb57e1895594bb0d91ea3090bbd39384f6fe87c3d57fd558d0670f50339bb"}, +] + +[package.dependencies] +appnope = {version = "*", markers = "sys_platform == \"darwin\""} +colorama = {version = "*", markers = "sys_platform == \"win32\""} +decorator = "*" +exceptiongroup = {version = "*", markers = "python_version < \"3.11\""} +jedi = ">=0.16" +matplotlib-inline = "*" +pexpect = {version = ">4.3", markers = "sys_platform != \"win32\""} +prompt-toolkit = ">=3.0.30,<3.0.37 || >3.0.37,<3.1.0" +pygments = ">=2.4.0" +stack-data = "*" +traitlets = ">=5" +typing-extensions = {version = "*", markers = "python_version < \"3.10\""} + +[package.extras] +all = ["black", "curio", "docrepr", "exceptiongroup", "ipykernel", "ipyparallel", "ipywidgets", "matplotlib", "matplotlib (!=3.2.0)", "nbconvert", "nbformat", "notebook", "numpy (>=1.22)", "pandas", "pickleshare", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio (<0.22)", "qtconsole", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "trio", "typing-extensions"] +black = ["black"] +doc = ["docrepr", "exceptiongroup", "ipykernel", "matplotlib", "pickleshare", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio (<0.22)", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "typing-extensions"] +kernel = ["ipykernel"] +nbconvert = ["nbconvert"] +nbformat = ["nbformat"] +notebook = ["ipywidgets", "notebook"] +parallel = ["ipyparallel"] +qtconsole = ["qtconsole"] +test = ["pickleshare", "pytest (<7.1)", "pytest-asyncio (<0.22)", "testpath"] +test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.22)", "pandas", "pickleshare", "pytest (<7.1)", "pytest-asyncio (<0.22)", "testpath", "trio"] + +[[package]] +name = "jedi" +version = "0.19.1" +description = "An autocompletion tool for Python that can be used for text editors." +optional = false +python-versions = ">=3.6" +files = [ + {file = "jedi-0.19.1-py2.py3-none-any.whl", hash = "sha256:e983c654fe5c02867aef4cdfce5a2fbb4a50adc0af145f70504238f18ef5e7e0"}, + {file = "jedi-0.19.1.tar.gz", hash = "sha256:cf0496f3651bc65d7174ac1b7d043eff454892c708a87d1b683e57b569927ffd"}, +] + +[package.dependencies] +parso = ">=0.8.3,<0.9.0" + +[package.extras] +docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx (==1.8.5)", "sphinx-rtd-theme (==0.4.3)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"] +qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] +testing = ["Django", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] + +[[package]] +name = "jinja2" +version = "3.1.2" +description = "A very fast and expressive template engine." +optional = false +python-versions = ">=3.7" +files = [ + {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, + {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, +] + +[package.dependencies] +MarkupSafe = ">=2.0" + +[package.extras] +i18n = ["Babel (>=2.7)"] + +[[package]] +name = "jupyter-client" +version = "8.6.0" +description = "Jupyter protocol implementation and client libraries" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyter_client-8.6.0-py3-none-any.whl", hash = "sha256:909c474dbe62582ae62b758bca86d6518c85234bdee2d908c778db6d72f39d99"}, + {file = "jupyter_client-8.6.0.tar.gz", hash = "sha256:0642244bb83b4764ae60d07e010e15f0e2d275ec4e918a8f7b80fbbef3ca60c7"}, +] + +[package.dependencies] +importlib-metadata = {version = ">=4.8.3", markers = "python_version < \"3.10\""} +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" +python-dateutil = ">=2.8.2" +pyzmq = ">=23.0" +tornado = ">=6.2" +traitlets = ">=5.3" + +[package.extras] +docs = ["ipykernel", "myst-parser", "pydata-sphinx-theme", "sphinx (>=4)", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] +test = ["coverage", "ipykernel (>=6.14)", "mypy", "paramiko", "pre-commit", "pytest", "pytest-cov", "pytest-jupyter[client] (>=0.4.1)", "pytest-timeout"] + +[[package]] +name = "jupyter-core" +version = "5.5.0" +description = "Jupyter core package. A base package on which Jupyter projects rely." +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyter_core-5.5.0-py3-none-any.whl", hash = "sha256:e11e02cd8ae0a9de5c6c44abf5727df9f2581055afe00b22183f621ba3585805"}, + {file = "jupyter_core-5.5.0.tar.gz", hash = "sha256:880b86053bf298a8724994f95e99b99130659022a4f7f45f563084b6223861d3"}, +] + +[package.dependencies] +platformdirs = ">=2.5" +pywin32 = {version = ">=300", markers = "sys_platform == \"win32\" and platform_python_implementation != \"PyPy\""} +traitlets = ">=5.3" + +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "traitlets"] +test = ["ipykernel", "pre-commit", "pytest", "pytest-cov", "pytest-timeout"] + +[[package]] +name = "kiwisolver" +version = "1.4.5" +description = "A fast implementation of the Cassowary constraint solver" +optional = false +python-versions = ">=3.7" +files = [ + {file = "kiwisolver-1.4.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:05703cf211d585109fcd72207a31bb170a0f22144d68298dc5e61b3c946518af"}, + {file = "kiwisolver-1.4.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:146d14bebb7f1dc4d5fbf74f8a6cb15ac42baadee8912eb84ac0b3b2a3dc6ac3"}, + {file = "kiwisolver-1.4.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6ef7afcd2d281494c0a9101d5c571970708ad911d028137cd558f02b851c08b4"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9eaa8b117dc8337728e834b9c6e2611f10c79e38f65157c4c38e9400286f5cb1"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ec20916e7b4cbfb1f12380e46486ec4bcbaa91a9c448b97023fde0d5bbf9e4ff"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39b42c68602539407884cf70d6a480a469b93b81b7701378ba5e2328660c847a"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa12042de0171fad672b6c59df69106d20d5596e4f87b5e8f76df757a7c399aa"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a40773c71d7ccdd3798f6489aaac9eee213d566850a9533f8d26332d626b82c"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:19df6e621f6d8b4b9c4d45f40a66839294ff2bb235e64d2178f7522d9170ac5b"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:83d78376d0d4fd884e2c114d0621624b73d2aba4e2788182d286309ebdeed770"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e391b1f0a8a5a10ab3b9bb6afcfd74f2175f24f8975fb87ecae700d1503cdee0"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:852542f9481f4a62dbb5dd99e8ab7aedfeb8fb6342349a181d4036877410f525"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59edc41b24031bc25108e210c0def6f6c2191210492a972d585a06ff246bb79b"}, + {file = "kiwisolver-1.4.5-cp310-cp310-win32.whl", hash = "sha256:a6aa6315319a052b4ee378aa171959c898a6183f15c1e541821c5c59beaa0238"}, + {file = "kiwisolver-1.4.5-cp310-cp310-win_amd64.whl", hash = "sha256:d0ef46024e6a3d79c01ff13801cb19d0cad7fd859b15037aec74315540acc276"}, + {file = "kiwisolver-1.4.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:11863aa14a51fd6ec28688d76f1735f8f69ab1fabf388851a595d0721af042f5"}, + {file = "kiwisolver-1.4.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8ab3919a9997ab7ef2fbbed0cc99bb28d3c13e6d4b1ad36e97e482558a91be90"}, + {file = "kiwisolver-1.4.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fcc700eadbbccbf6bc1bcb9dbe0786b4b1cb91ca0dcda336eef5c2beed37b797"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dfdd7c0b105af050eb3d64997809dc21da247cf44e63dc73ff0fd20b96be55a9"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76c6a5964640638cdeaa0c359382e5703e9293030fe730018ca06bc2010c4437"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bbea0db94288e29afcc4c28afbf3a7ccaf2d7e027489c449cf7e8f83c6346eb9"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ceec1a6bc6cab1d6ff5d06592a91a692f90ec7505d6463a88a52cc0eb58545da"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:040c1aebeda72197ef477a906782b5ab0d387642e93bda547336b8957c61022e"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f91de7223d4c7b793867797bacd1ee53bfe7359bd70d27b7b58a04efbb9436c8"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:faae4860798c31530dd184046a900e652c95513796ef51a12bc086710c2eec4d"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:b0157420efcb803e71d1b28e2c287518b8808b7cf1ab8af36718fd0a2c453eb0"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:06f54715b7737c2fecdbf140d1afb11a33d59508a47bf11bb38ecf21dc9ab79f"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fdb7adb641a0d13bdcd4ef48e062363d8a9ad4a182ac7647ec88f695e719ae9f"}, + {file = "kiwisolver-1.4.5-cp311-cp311-win32.whl", hash = "sha256:bb86433b1cfe686da83ce32a9d3a8dd308e85c76b60896d58f082136f10bffac"}, + {file = "kiwisolver-1.4.5-cp311-cp311-win_amd64.whl", hash = "sha256:6c08e1312a9cf1074d17b17728d3dfce2a5125b2d791527f33ffbe805200a355"}, + {file = "kiwisolver-1.4.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:32d5cf40c4f7c7b3ca500f8985eb3fb3a7dfc023215e876f207956b5ea26632a"}, + {file = "kiwisolver-1.4.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f846c260f483d1fd217fe5ed7c173fb109efa6b1fc8381c8b7552c5781756192"}, + {file = "kiwisolver-1.4.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5ff5cf3571589b6d13bfbfd6bcd7a3f659e42f96b5fd1c4830c4cf21d4f5ef45"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7269d9e5f1084a653d575c7ec012ff57f0c042258bf5db0954bf551c158466e7"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da802a19d6e15dffe4b0c24b38b3af68e6c1a68e6e1d8f30148c83864f3881db"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3aba7311af82e335dd1e36ffff68aaca609ca6290c2cb6d821a39aa075d8e3ff"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:763773d53f07244148ccac5b084da5adb90bfaee39c197554f01b286cf869228"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2270953c0d8cdab5d422bee7d2007f043473f9d2999631c86a223c9db56cbd16"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d099e745a512f7e3bbe7249ca835f4d357c586d78d79ae8f1dcd4d8adeb9bda9"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:74db36e14a7d1ce0986fa104f7d5637aea5c82ca6326ed0ec5694280942d1162"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:7e5bab140c309cb3a6ce373a9e71eb7e4873c70c2dda01df6820474f9889d6d4"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:0f114aa76dc1b8f636d077979c0ac22e7cd8f3493abbab152f20eb8d3cda71f3"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:88a2df29d4724b9237fc0c6eaf2a1adae0cdc0b3e9f4d8e7dc54b16812d2d81a"}, + {file = "kiwisolver-1.4.5-cp312-cp312-win32.whl", hash = "sha256:72d40b33e834371fd330fb1472ca19d9b8327acb79a5821d4008391db8e29f20"}, + {file = "kiwisolver-1.4.5-cp312-cp312-win_amd64.whl", hash = "sha256:2c5674c4e74d939b9d91dda0fae10597ac7521768fec9e399c70a1f27e2ea2d9"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3a2b053a0ab7a3960c98725cfb0bf5b48ba82f64ec95fe06f1d06c99b552e130"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cd32d6c13807e5c66a7cbb79f90b553642f296ae4518a60d8d76243b0ad2898"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:59ec7b7c7e1a61061850d53aaf8e93db63dce0c936db1fda2658b70e4a1be709"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:da4cfb373035def307905d05041c1d06d8936452fe89d464743ae7fb8371078b"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2400873bccc260b6ae184b2b8a4fec0e4082d30648eadb7c3d9a13405d861e89"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1b04139c4236a0f3aff534479b58f6f849a8b351e1314826c2d230849ed48985"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:4e66e81a5779b65ac21764c295087de82235597a2293d18d943f8e9e32746265"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:7931d8f1f67c4be9ba1dd9c451fb0eeca1a25b89e4d3f89e828fe12a519b782a"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:b3f7e75f3015df442238cca659f8baa5f42ce2a8582727981cbfa15fee0ee205"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:bbf1d63eef84b2e8c89011b7f2235b1e0bf7dacc11cac9431fc6468e99ac77fb"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:4c380469bd3f970ef677bf2bcba2b6b0b4d5c75e7a020fb863ef75084efad66f"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-win32.whl", hash = "sha256:9408acf3270c4b6baad483865191e3e582b638b1654a007c62e3efe96f09a9a3"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-win_amd64.whl", hash = "sha256:5b94529f9b2591b7af5f3e0e730a4e0a41ea174af35a4fd067775f9bdfeee01a"}, + {file = "kiwisolver-1.4.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:11c7de8f692fc99816e8ac50d1d1aef4f75126eefc33ac79aac02c099fd3db71"}, + {file = "kiwisolver-1.4.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:53abb58632235cd154176ced1ae8f0d29a6657aa1aa9decf50b899b755bc2b93"}, + {file = "kiwisolver-1.4.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:88b9f257ca61b838b6f8094a62418421f87ac2a1069f7e896c36a7d86b5d4c29"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3195782b26fc03aa9c6913d5bad5aeb864bdc372924c093b0f1cebad603dd712"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fc579bf0f502e54926519451b920e875f433aceb4624a3646b3252b5caa9e0b6"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a580c91d686376f0f7c295357595c5a026e6cbc3d77b7c36e290201e7c11ecb"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cfe6ab8da05c01ba6fbea630377b5da2cd9bcbc6338510116b01c1bc939a2c18"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:d2e5a98f0ec99beb3c10e13b387f8db39106d53993f498b295f0c914328b1333"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a51a263952b1429e429ff236d2f5a21c5125437861baeed77f5e1cc2d2c7c6da"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3edd2fa14e68c9be82c5b16689e8d63d89fe927e56debd6e1dbce7a26a17f81b"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:74d1b44c6cfc897df648cc9fdaa09bc3e7679926e6f96df05775d4fb3946571c"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:76d9289ed3f7501012e05abb8358bbb129149dbd173f1f57a1bf1c22d19ab7cc"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:92dea1ffe3714fa8eb6a314d2b3c773208d865a0e0d35e713ec54eea08a66250"}, + {file = "kiwisolver-1.4.5-cp38-cp38-win32.whl", hash = "sha256:5c90ae8c8d32e472be041e76f9d2f2dbff4d0b0be8bd4041770eddb18cf49a4e"}, + {file = "kiwisolver-1.4.5-cp38-cp38-win_amd64.whl", hash = "sha256:c7940c1dc63eb37a67721b10d703247552416f719c4188c54e04334321351ced"}, + {file = "kiwisolver-1.4.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:9407b6a5f0d675e8a827ad8742e1d6b49d9c1a1da5d952a67d50ef5f4170b18d"}, + {file = "kiwisolver-1.4.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:15568384086b6df3c65353820a4473575dbad192e35010f622c6ce3eebd57af9"}, + {file = "kiwisolver-1.4.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0dc9db8e79f0036e8173c466d21ef18e1befc02de8bf8aa8dc0813a6dc8a7046"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:cdc8a402aaee9a798b50d8b827d7ecf75edc5fb35ea0f91f213ff927c15f4ff0"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6c3bd3cde54cafb87d74d8db50b909705c62b17c2099b8f2e25b461882e544ff"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:955e8513d07a283056b1396e9a57ceddbd272d9252c14f154d450d227606eb54"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:346f5343b9e3f00b8db8ba359350eb124b98c99efd0b408728ac6ebf38173958"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b9098e0049e88c6a24ff64545cdfc50807818ba6c1b739cae221bbbcbc58aad3"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:00bd361b903dc4bbf4eb165f24d1acbee754fce22ded24c3d56eec268658a5cf"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7b8b454bac16428b22560d0a1cf0a09875339cab69df61d7805bf48919415901"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:f1d072c2eb0ad60d4c183f3fb44ac6f73fb7a8f16a2694a91f988275cbf352f9"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:31a82d498054cac9f6d0b53d02bb85811185bcb477d4b60144f915f3b3126342"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6512cb89e334e4700febbffaaa52761b65b4f5a3cf33f960213d5656cea36a77"}, + {file = "kiwisolver-1.4.5-cp39-cp39-win32.whl", hash = "sha256:9db8ea4c388fdb0f780fe91346fd438657ea602d58348753d9fb265ce1bca67f"}, + {file = "kiwisolver-1.4.5-cp39-cp39-win_amd64.whl", hash = "sha256:59415f46a37f7f2efeec758353dd2eae1b07640d8ca0f0c42548ec4125492635"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5c7b3b3a728dc6faf3fc372ef24f21d1e3cee2ac3e9596691d746e5a536de920"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:620ced262a86244e2be10a676b646f29c34537d0d9cc8eb26c08f53d98013390"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:378a214a1e3bbf5ac4a8708304318b4f890da88c9e6a07699c4ae7174c09a68d"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaf7be1207676ac608a50cd08f102f6742dbfc70e8d60c4db1c6897f62f71523"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ba55dce0a9b8ff59495ddd050a0225d58bd0983d09f87cfe2b6aec4f2c1234e4"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:fd32ea360bcbb92d28933fc05ed09bffcb1704ba3fc7942e81db0fd4f81a7892"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5e7139af55d1688f8b960ee9ad5adafc4ac17c1c473fe07133ac092310d76544"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:dced8146011d2bc2e883f9bd68618b8247387f4bbec46d7392b3c3b032640126"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9bf3325c47b11b2e51bca0824ea217c7cd84491d8ac4eefd1e409705ef092bd"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:5794cf59533bc3f1b1c821f7206a3617999db9fbefc345360aafe2e067514929"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e368f200bbc2e4f905b8e71eb38b3c04333bddaa6a2464a6355487b02bb7fb09"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5d706eba36b4c4d5bc6c6377bb6568098765e990cfc21ee16d13963fab7b3e7"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85267bd1aa8880a9c88a8cb71e18d3d64d2751a790e6ca6c27b8ccc724bcd5ad"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:210ef2c3a1f03272649aff1ef992df2e724748918c4bc2d5a90352849eb40bea"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:11d011a7574eb3b82bcc9c1a1d35c1d7075677fdd15de527d91b46bd35e935ee"}, + {file = "kiwisolver-1.4.5.tar.gz", hash = "sha256:e57e563a57fb22a142da34f38acc2fc1a5c864bc29ca1517a88abc963e60d6ec"}, +] + +[[package]] +name = "loguru" +version = "0.7.2" +description = "Python logging made (stupidly) simple" +optional = false +python-versions = ">=3.5" +files = [ + {file = "loguru-0.7.2-py3-none-any.whl", hash = "sha256:003d71e3d3ed35f0f8984898359d65b79e5b21943f78af86aa5491210429b8eb"}, + {file = "loguru-0.7.2.tar.gz", hash = "sha256:e671a53522515f34fd406340ee968cb9ecafbc4b36c679da03c18fd8d0bd51ac"}, +] + +[package.dependencies] +colorama = {version = ">=0.3.4", markers = "sys_platform == \"win32\""} +win32-setctime = {version = ">=1.0.0", markers = "sys_platform == \"win32\""} + +[package.extras] +dev = ["Sphinx (==7.2.5)", "colorama (==0.4.5)", "colorama (==0.4.6)", "exceptiongroup (==1.1.3)", "freezegun (==1.1.0)", "freezegun (==1.2.2)", "mypy (==v0.910)", "mypy (==v0.971)", "mypy (==v1.4.1)", "mypy (==v1.5.1)", "pre-commit (==3.4.0)", "pytest (==6.1.2)", "pytest (==7.4.0)", "pytest-cov (==2.12.1)", "pytest-cov (==4.1.0)", "pytest-mypy-plugins (==1.9.3)", "pytest-mypy-plugins (==3.0.0)", "sphinx-autobuild (==2021.3.14)", "sphinx-rtd-theme (==1.3.0)", "tox (==3.27.1)", "tox (==4.11.0)"] + +[[package]] +name = "markupsafe" +version = "2.1.3" +description = "Safely add untrusted strings to HTML/XML markup." +optional = false +python-versions = ">=3.7" +files = [ + {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-win32.whl", hash = "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f698de3fd0c4e6972b92290a45bd9b1536bffe8c6759c62471efaa8acb4c37bc"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aa57bd9cf8ae831a362185ee444e15a93ecb2e344c8e52e4d721ea3ab6ef1823"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffcc3f7c66b5f5b7931a5aa68fc9cecc51e685ef90282f4a82f0f5e9b704ad11"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47d4f1c5f80fc62fdd7777d0d40a2e9dda0a05883ab11374334f6c4de38adffd"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f67c7038d560d92149c060157d623c542173016c4babc0c1913cca0564b9939"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9aad3c1755095ce347e26488214ef77e0485a3c34a50c5a5e2471dff60b9dd9c"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:14ff806850827afd6b07a5f32bd917fb7f45b046ba40c57abdb636674a8b559c"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8f9293864fe09b8149f0cc42ce56e3f0e54de883a9de90cd427f191c346eb2e1"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-win32.whl", hash = "sha256:715d3562f79d540f251b99ebd6d8baa547118974341db04f5ad06d5ea3eb8007"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-win_amd64.whl", hash = "sha256:1b8dd8c3fd14349433c79fa8abeb573a55fc0fdd769133baac1f5e07abf54aeb"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-win32.whl", hash = "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-win_amd64.whl", hash = "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-win32.whl", hash = "sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-win_amd64.whl", hash = "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-win32.whl", hash = "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba"}, + {file = "MarkupSafe-2.1.3.tar.gz", hash = "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad"}, +] + +[[package]] +name = "matplotlib" +version = "3.8.1" +description = "Python plotting package" +optional = false +python-versions = ">=3.9" +files = [ + {file = "matplotlib-3.8.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:e11ab864323fa73ac1b7849688d9671c47a2665242e899785b4db1a375b547e1"}, + {file = "matplotlib-3.8.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:43a9d40feb63c9e31a0b8b069dcbd74a912f59bdc0095d187126694cd26977e4"}, + {file = "matplotlib-3.8.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:608ea2951838d391e45dec2e644888db6899c752d3c29e157af9dcefb3d7d8d5"}, + {file = "matplotlib-3.8.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82ec95b02e894561c21e066bd0c716e4b410df141ce9441aa5af6cd937e4ade2"}, + {file = "matplotlib-3.8.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e3ad1759ad4a5245172c6d32b8ada603a6020d03211524c39d78d25c9a7dc0d2"}, + {file = "matplotlib-3.8.1-cp310-cp310-win_amd64.whl", hash = "sha256:20a0fdfd3ee836179047f3782be060057b878ad37f5abe29edf006a1ff3ecd73"}, + {file = "matplotlib-3.8.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:7658b7073c1d6a2922ecc0ed41602410fae88586cb8a54f7a2063d537b6beaf7"}, + {file = "matplotlib-3.8.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bf6889643d4560fcc56f9f0941f078e4df0d72a6c3e4ca548841fc13c5642664"}, + {file = "matplotlib-3.8.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ff842e27bc6a80de08c40e0bfdce460bd08080e8a94af131162b6a1b8948f2cc"}, + {file = "matplotlib-3.8.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f99d07c0e753717775be7be39ab383453b4d8b629c9fa174596b970c6555890"}, + {file = "matplotlib-3.8.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f34b46dbb1db1f09bfa937cd5853e5f2af232caeeff509c3ab6e43fd33780eae"}, + {file = "matplotlib-3.8.1-cp311-cp311-win_amd64.whl", hash = "sha256:1fcb49b6baf0375281979cbf26695ec10bd1cada1e311893e89533b3b70143e7"}, + {file = "matplotlib-3.8.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:e17674ee127f78f26fea237e7f4d5cf910a8be82beb6260fedf358b88075b823"}, + {file = "matplotlib-3.8.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d921c0270647ab11c3ef283efaaa3d46fd005ba233bfb3aea75231cdf3656de8"}, + {file = "matplotlib-3.8.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2afe7d2f8c9e35e94fbcfcfd9b28f29cb32f0a9068cba469cf907428379c8db9"}, + {file = "matplotlib-3.8.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e5a504ff40f81d6233603475a45497a6dca37a873393fa20ae6f7dd6596ef72b"}, + {file = "matplotlib-3.8.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:cd54bbf089953140905768ed4626d7223e1ad1d7e2a138410a9c4d3b865ccd80"}, + {file = "matplotlib-3.8.1-cp312-cp312-win_amd64.whl", hash = "sha256:27502d2452208ae784c19504644f09f83742809143bbeae147617640930aa344"}, + {file = "matplotlib-3.8.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:f55fb5ff02d999a100be28bf6ffe826e1867a54c7b465409685332c9dd48ffa5"}, + {file = "matplotlib-3.8.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:afb72822ae410d62aa1a2920c6563cb5680de9078358f0e9474396c6c3e06be2"}, + {file = "matplotlib-3.8.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:43cf368a4a1d8cbc426944806e5e183cead746647a64d2cdb786441546235967"}, + {file = "matplotlib-3.8.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c54c55457c7f5ea4dfdba0020004fc7667f5c10c8d9b8010d735345acc06c9b8"}, + {file = "matplotlib-3.8.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e3bb809b743653b5aab5d72ee45c8c937c28e147b0846b0826a54bece898608c"}, + {file = "matplotlib-3.8.1-cp39-cp39-win_amd64.whl", hash = "sha256:c1b0ecaa0d1f4fe1e30f625a2347f0034a89a7d17c39efbb502e554d92ee2f61"}, + {file = "matplotlib-3.8.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:ca84deaa38cb64b7dd160ca2046b45f7b5dbff2b0179642e1339fadc337446c9"}, + {file = "matplotlib-3.8.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed3b29f54f6bbf3eaca4cbd23bc260155153ace63b7f597c474fa6fc6f386530"}, + {file = "matplotlib-3.8.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:0d24c47a1bb47e392fbcd26fe322e4ff3431653ac1e8718e4e147d450ae97a44"}, + {file = "matplotlib-3.8.1.tar.gz", hash = "sha256:044df81c1f6f3a8e52d70c4cfcb44e77ea9632a10929932870dfaa90de94365d"}, +] + +[package.dependencies] +contourpy = ">=1.0.1" +cycler = ">=0.10" +fonttools = ">=4.22.0" +importlib-resources = {version = ">=3.2.0", markers = "python_version < \"3.10\""} +kiwisolver = ">=1.3.1" +numpy = ">=1.21,<2" +packaging = ">=20.0" +pillow = ">=8" +pyparsing = ">=2.3.1" +python-dateutil = ">=2.7" + +[[package]] +name = "matplotlib-inline" +version = "0.1.6" +description = "Inline Matplotlib backend for Jupyter" +optional = false +python-versions = ">=3.5" +files = [ + {file = "matplotlib-inline-0.1.6.tar.gz", hash = "sha256:f887e5f10ba98e8d2b150ddcf4702c1e5f8b3a20005eb0f74bfdbd360ee6f304"}, + {file = "matplotlib_inline-0.1.6-py3-none-any.whl", hash = "sha256:f1f41aab5328aa5aaea9b16d083b128102f8712542f819fe7e6a420ff581b311"}, +] + +[package.dependencies] +traitlets = "*" + +[[package]] +name = "mpmath" +version = "1.3.0" +description = "Python library for arbitrary-precision floating-point arithmetic" +optional = false +python-versions = "*" +files = [ + {file = "mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c"}, + {file = "mpmath-1.3.0.tar.gz", hash = "sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f"}, +] + +[package.extras] +develop = ["codecov", "pycodestyle", "pytest (>=4.6)", "pytest-cov", "wheel"] +docs = ["sphinx"] +gmpy = ["gmpy2 (>=2.1.0a4)"] +tests = ["pytest (>=4.6)"] + +[[package]] +name = "nest-asyncio" +version = "1.5.8" +description = "Patch asyncio to allow nested event loops" +optional = false +python-versions = ">=3.5" +files = [ + {file = "nest_asyncio-1.5.8-py3-none-any.whl", hash = "sha256:accda7a339a70599cb08f9dd09a67e0c2ef8d8d6f4c07f96ab203f2ae254e48d"}, + {file = "nest_asyncio-1.5.8.tar.gz", hash = "sha256:25aa2ca0d2a5b5531956b9e273b45cf664cae2b145101d73b86b199978d48fdb"}, +] + +[[package]] +name = "networkx" +version = "3.2.1" +description = "Python package for creating and manipulating graphs and networks" +optional = false +python-versions = ">=3.9" +files = [ + {file = "networkx-3.2.1-py3-none-any.whl", hash = "sha256:f18c69adc97877c42332c170849c96cefa91881c99a7cb3e95b7c659ebdc1ec2"}, + {file = "networkx-3.2.1.tar.gz", hash = "sha256:9f1bb5cf3409bf324e0a722c20bdb4c20ee39bf1c30ce8ae499c8502b0b5e0c6"}, +] + +[package.extras] +default = ["matplotlib (>=3.5)", "numpy (>=1.22)", "pandas (>=1.4)", "scipy (>=1.9,!=1.11.0,!=1.11.1)"] +developer = ["changelist (==0.4)", "mypy (>=1.1)", "pre-commit (>=3.2)", "rtoml"] +doc = ["nb2plots (>=0.7)", "nbconvert (<7.9)", "numpydoc (>=1.6)", "pillow (>=9.4)", "pydata-sphinx-theme (>=0.14)", "sphinx (>=7)", "sphinx-gallery (>=0.14)", "texext (>=0.6.7)"] +extra = ["lxml (>=4.6)", "pydot (>=1.4.2)", "pygraphviz (>=1.11)", "sympy (>=1.10)"] +test = ["pytest (>=7.2)", "pytest-cov (>=4.0)"] + +[[package]] +name = "numpy" +version = "1.26.1" +description = "Fundamental package for array computing in Python" +optional = false +python-versions = "<3.13,>=3.9" +files = [ + {file = "numpy-1.26.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:82e871307a6331b5f09efda3c22e03c095d957f04bf6bc1804f30048d0e5e7af"}, + {file = "numpy-1.26.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cdd9ec98f0063d93baeb01aad472a1a0840dee302842a2746a7a8e92968f9575"}, + {file = "numpy-1.26.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d78f269e0c4fd365fc2992c00353e4530d274ba68f15e968d8bc3c69ce5f5244"}, + {file = "numpy-1.26.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ab9163ca8aeb7fd32fe93866490654d2f7dda4e61bc6297bf72ce07fdc02f67"}, + {file = "numpy-1.26.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:78ca54b2f9daffa5f323f34cdf21e1d9779a54073f0018a3094ab907938331a2"}, + {file = "numpy-1.26.1-cp310-cp310-win32.whl", hash = "sha256:d1cfc92db6af1fd37a7bb58e55c8383b4aa1ba23d012bdbba26b4bcca45ac297"}, + {file = "numpy-1.26.1-cp310-cp310-win_amd64.whl", hash = "sha256:d2984cb6caaf05294b8466966627e80bf6c7afd273279077679cb010acb0e5ab"}, + {file = "numpy-1.26.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cd7837b2b734ca72959a1caf3309457a318c934abef7a43a14bb984e574bbb9a"}, + {file = "numpy-1.26.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1c59c046c31a43310ad0199d6299e59f57a289e22f0f36951ced1c9eac3665b9"}, + {file = "numpy-1.26.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d58e8c51a7cf43090d124d5073bc29ab2755822181fcad978b12e144e5e5a4b3"}, + {file = "numpy-1.26.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6081aed64714a18c72b168a9276095ef9155dd7888b9e74b5987808f0dd0a974"}, + {file = "numpy-1.26.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:97e5d6a9f0702c2863aaabf19f0d1b6c2628fbe476438ce0b5ce06e83085064c"}, + {file = "numpy-1.26.1-cp311-cp311-win32.whl", hash = "sha256:b9d45d1dbb9de84894cc50efece5b09939752a2d75aab3a8b0cef6f3a35ecd6b"}, + {file = "numpy-1.26.1-cp311-cp311-win_amd64.whl", hash = "sha256:3649d566e2fc067597125428db15d60eb42a4e0897fc48d28cb75dc2e0454e53"}, + {file = "numpy-1.26.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:1d1bd82d539607951cac963388534da3b7ea0e18b149a53cf883d8f699178c0f"}, + {file = "numpy-1.26.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:afd5ced4e5a96dac6725daeb5242a35494243f2239244fad10a90ce58b071d24"}, + {file = "numpy-1.26.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a03fb25610ef560a6201ff06df4f8105292ba56e7cdd196ea350d123fc32e24e"}, + {file = "numpy-1.26.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dcfaf015b79d1f9f9c9fd0731a907407dc3e45769262d657d754c3a028586124"}, + {file = "numpy-1.26.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e509cbc488c735b43b5ffea175235cec24bbc57b227ef1acc691725beb230d1c"}, + {file = "numpy-1.26.1-cp312-cp312-win32.whl", hash = "sha256:af22f3d8e228d84d1c0c44c1fbdeb80f97a15a0abe4f080960393a00db733b66"}, + {file = "numpy-1.26.1-cp312-cp312-win_amd64.whl", hash = "sha256:9f42284ebf91bdf32fafac29d29d4c07e5e9d1af862ea73686581773ef9e73a7"}, + {file = "numpy-1.26.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bb894accfd16b867d8643fc2ba6c8617c78ba2828051e9a69511644ce86ce83e"}, + {file = "numpy-1.26.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e44ccb93f30c75dfc0c3aa3ce38f33486a75ec9abadabd4e59f114994a9c4617"}, + {file = "numpy-1.26.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9696aa2e35cc41e398a6d42d147cf326f8f9d81befcb399bc1ed7ffea339b64e"}, + {file = "numpy-1.26.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a5b411040beead47a228bde3b2241100454a6abde9df139ed087bd73fc0a4908"}, + {file = "numpy-1.26.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1e11668d6f756ca5ef534b5be8653d16c5352cbb210a5c2a79ff288e937010d5"}, + {file = "numpy-1.26.1-cp39-cp39-win32.whl", hash = "sha256:d1d2c6b7dd618c41e202c59c1413ef9b2c8e8a15f5039e344af64195459e3104"}, + {file = "numpy-1.26.1-cp39-cp39-win_amd64.whl", hash = "sha256:59227c981d43425ca5e5c01094d59eb14e8772ce6975d4b2fc1e106a833d5ae2"}, + {file = "numpy-1.26.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:06934e1a22c54636a059215d6da99e23286424f316fddd979f5071093b648668"}, + {file = "numpy-1.26.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76ff661a867d9272cd2a99eed002470f46dbe0943a5ffd140f49be84f68ffc42"}, + {file = "numpy-1.26.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:6965888d65d2848e8768824ca8288db0a81263c1efccec881cb35a0d805fcd2f"}, + {file = "numpy-1.26.1.tar.gz", hash = "sha256:c8c6c72d4a9f831f328efb1312642a1cafafaa88981d9ab76368d50d07d93cbe"}, +] + +[[package]] +name = "omegaconf" +version = "2.3.0" +description = "A flexible configuration library" +optional = false +python-versions = ">=3.6" +files = [ + {file = "omegaconf-2.3.0-py3-none-any.whl", hash = "sha256:7b4df175cdb08ba400f45cae3bdcae7ba8365db4d165fc65fd04b050ab63b46b"}, + {file = "omegaconf-2.3.0.tar.gz", hash = "sha256:d5d4b6d29955cc50ad50c46dc269bcd92c6e00f5f90d23ab5fee7bfca4ba4cc7"}, +] + +[package.dependencies] +antlr4-python3-runtime = "==4.9.*" +PyYAML = ">=5.1.0" + +[[package]] +name = "opencv-python" +version = "4.8.1.78" +description = "Wrapper package for OpenCV python bindings." +optional = false +python-versions = ">=3.6" +files = [ + {file = "opencv-python-4.8.1.78.tar.gz", hash = "sha256:cc7adbbcd1112877a39274106cb2752e04984bc01a031162952e97450d6117f6"}, + {file = "opencv_python-4.8.1.78-cp37-abi3-macosx_10_16_x86_64.whl", hash = "sha256:91d5f6f5209dc2635d496f6b8ca6573ecdad051a09e6b5de4c399b8e673c60da"}, + {file = "opencv_python-4.8.1.78-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:bc31f47e05447da8b3089faa0a07ffe80e114c91ce0b171e6424f9badbd1c5cd"}, + {file = "opencv_python-4.8.1.78-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9814beca408d3a0eca1bae7e3e5be68b07c17ecceb392b94170881216e09b319"}, + {file = "opencv_python-4.8.1.78-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c4c406bdb41eb21ea51b4e90dfbc989c002786c3f601c236a99c59a54670a394"}, + {file = "opencv_python-4.8.1.78-cp37-abi3-win32.whl", hash = "sha256:a7aac3900fbacf55b551e7b53626c3dad4c71ce85643645c43e91fcb19045e47"}, + {file = "opencv_python-4.8.1.78-cp37-abi3-win_amd64.whl", hash = "sha256:b983197f97cfa6fcb74e1da1802c7497a6f94ed561aba6980f1f33123f904956"}, +] + +[package.dependencies] +numpy = [ + {version = ">=1.21.0", markers = "python_version == \"3.9\" and platform_system == \"Darwin\" and platform_machine == \"arm64\""}, + {version = ">=1.23.5", markers = "python_version >= \"3.11\""}, + {version = ">=1.21.4", markers = "python_version >= \"3.10\" and platform_system == \"Darwin\" and python_version < \"3.11\""}, + {version = ">=1.21.2", markers = "platform_system != \"Darwin\" and python_version >= \"3.10\" and python_version < \"3.11\""}, + {version = ">=1.19.3", markers = "platform_system == \"Linux\" and platform_machine == \"aarch64\" and python_version >= \"3.8\" and python_version < \"3.10\" or python_version > \"3.9\" and python_version < \"3.10\" or python_version >= \"3.9\" and platform_system != \"Darwin\" and python_version < \"3.10\" or python_version >= \"3.9\" and platform_machine != \"arm64\" and python_version < \"3.10\""}, +] + +[[package]] +name = "packaging" +version = "23.2" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.7" +files = [ + {file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"}, + {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, +] + +[[package]] +name = "parso" +version = "0.8.3" +description = "A Python Parser" +optional = false +python-versions = ">=3.6" +files = [ + {file = "parso-0.8.3-py2.py3-none-any.whl", hash = "sha256:c001d4636cd3aecdaf33cbb40aebb59b094be2a74c556778ef5576c175e19e75"}, + {file = "parso-0.8.3.tar.gz", hash = "sha256:8c07be290bb59f03588915921e29e8a50002acaf2cdc5fa0e0114f91709fafa0"}, +] + +[package.extras] +qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] +testing = ["docopt", "pytest (<6.0.0)"] + +[[package]] +name = "pathtools" +version = "0.1.2" +description = "File system general utilities" +optional = false +python-versions = "*" +files = [ + {file = "pathtools-0.1.2.tar.gz", hash = "sha256:7c35c5421a39bb82e58018febd90e3b6e5db34c5443aaaf742b3f33d4655f1c0"}, +] + +[[package]] +name = "peft" +version = "0.5.0" +description = "Parameter-Efficient Fine-Tuning (PEFT)" +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "peft-0.5.0-py3-none-any.whl", hash = "sha256:82b307830f946bcc1e8e19419a55aac50fcf670a55d6be04eb6adbcbc5c21042"}, + {file = "peft-0.5.0.tar.gz", hash = "sha256:3cc03049ac6130426d82c22ca54cc6de849e7c6727181393e7751f7f512a9ced"}, +] + +[package.dependencies] +accelerate = "*" +numpy = ">=1.17" +packaging = ">=20.0" +psutil = "*" +pyyaml = "*" +safetensors = "*" +torch = ">=1.13.0" +tqdm = "*" +transformers = "*" + +[package.extras] +dev = ["black (>=22.0,<23.0)", "hf-doc-builder", "ruff (>=0.0.241)", "urllib3 (<=2.0.0)"] +docs-specific = ["hf-doc-builder"] +quality = ["black (>=22.0,<23.0)", "ruff (>=0.0.241)", "urllib3 (<=2.0.0)"] +test = ["black (>=22.0,<23.0)", "datasets", "diffusers", "hf-doc-builder", "parameterized", "pytest", "pytest-cov", "pytest-xdist", "ruff (>=0.0.241)", "urllib3 (<=2.0.0)"] + +[[package]] +name = "pexpect" +version = "4.8.0" +description = "Pexpect allows easy control of interactive console applications." +optional = false +python-versions = "*" +files = [ + {file = "pexpect-4.8.0-py2.py3-none-any.whl", hash = "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937"}, + {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"}, +] + +[package.dependencies] +ptyprocess = ">=0.5" + +[[package]] +name = "pillow" +version = "10.1.0" +description = "Python Imaging Library (Fork)" +optional = false +python-versions = ">=3.8" +files = [ + {file = "Pillow-10.1.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:1ab05f3db77e98f93964697c8efc49c7954b08dd61cff526b7f2531a22410106"}, + {file = "Pillow-10.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6932a7652464746fcb484f7fc3618e6503d2066d853f68a4bd97193a3996e273"}, + {file = "Pillow-10.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5f63b5a68daedc54c7c3464508d8c12075e56dcfbd42f8c1bf40169061ae666"}, + {file = "Pillow-10.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0949b55eb607898e28eaccb525ab104b2d86542a85c74baf3a6dc24002edec2"}, + {file = "Pillow-10.1.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:ae88931f93214777c7a3aa0a8f92a683f83ecde27f65a45f95f22d289a69e593"}, + {file = "Pillow-10.1.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:b0eb01ca85b2361b09480784a7931fc648ed8b7836f01fb9241141b968feb1db"}, + {file = "Pillow-10.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d27b5997bdd2eb9fb199982bb7eb6164db0426904020dc38c10203187ae2ff2f"}, + {file = "Pillow-10.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7df5608bc38bd37ef585ae9c38c9cd46d7c81498f086915b0f97255ea60c2818"}, + {file = "Pillow-10.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:41f67248d92a5e0a2076d3517d8d4b1e41a97e2df10eb8f93106c89107f38b57"}, + {file = "Pillow-10.1.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:1fb29c07478e6c06a46b867e43b0bcdb241b44cc52be9bc25ce5944eed4648e7"}, + {file = "Pillow-10.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2cdc65a46e74514ce742c2013cd4a2d12e8553e3a2563c64879f7c7e4d28bce7"}, + {file = "Pillow-10.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50d08cd0a2ecd2a8657bd3d82c71efd5a58edb04d9308185d66c3a5a5bed9610"}, + {file = "Pillow-10.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:062a1610e3bc258bff2328ec43f34244fcec972ee0717200cb1425214fe5b839"}, + {file = "Pillow-10.1.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:61f1a9d247317fa08a308daaa8ee7b3f760ab1809ca2da14ecc88ae4257d6172"}, + {file = "Pillow-10.1.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:a646e48de237d860c36e0db37ecaecaa3619e6f3e9d5319e527ccbc8151df061"}, + {file = "Pillow-10.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:47e5bf85b80abc03be7455c95b6d6e4896a62f6541c1f2ce77a7d2bb832af262"}, + {file = "Pillow-10.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a92386125e9ee90381c3369f57a2a50fa9e6aa8b1cf1d9c4b200d41a7dd8e992"}, + {file = "Pillow-10.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:0f7c276c05a9767e877a0b4c5050c8bee6a6d960d7f0c11ebda6b99746068c2a"}, + {file = "Pillow-10.1.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:a89b8312d51715b510a4fe9fc13686283f376cfd5abca8cd1c65e4c76e21081b"}, + {file = "Pillow-10.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:00f438bb841382b15d7deb9a05cc946ee0f2c352653c7aa659e75e592f6fa17d"}, + {file = "Pillow-10.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d929a19f5469b3f4df33a3df2983db070ebb2088a1e145e18facbc28cae5b27"}, + {file = "Pillow-10.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a92109192b360634a4489c0c756364c0c3a2992906752165ecb50544c251312"}, + {file = "Pillow-10.1.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:0248f86b3ea061e67817c47ecbe82c23f9dd5d5226200eb9090b3873d3ca32de"}, + {file = "Pillow-10.1.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:9882a7451c680c12f232a422730f986a1fcd808da0fd428f08b671237237d651"}, + {file = "Pillow-10.1.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1c3ac5423c8c1da5928aa12c6e258921956757d976405e9467c5f39d1d577a4b"}, + {file = "Pillow-10.1.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:806abdd8249ba3953c33742506fe414880bad78ac25cc9a9b1c6ae97bedd573f"}, + {file = "Pillow-10.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:eaed6977fa73408b7b8a24e8b14e59e1668cfc0f4c40193ea7ced8e210adf996"}, + {file = "Pillow-10.1.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:fe1e26e1ffc38be097f0ba1d0d07fcade2bcfd1d023cda5b29935ae8052bd793"}, + {file = "Pillow-10.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7a7e3daa202beb61821c06d2517428e8e7c1aab08943e92ec9e5755c2fc9ba5e"}, + {file = "Pillow-10.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:24fadc71218ad2b8ffe437b54876c9382b4a29e030a05a9879f615091f42ffc2"}, + {file = "Pillow-10.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa1d323703cfdac2036af05191b969b910d8f115cf53093125e4058f62012c9a"}, + {file = "Pillow-10.1.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:912e3812a1dbbc834da2b32299b124b5ddcb664ed354916fd1ed6f193f0e2d01"}, + {file = "Pillow-10.1.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:7dbaa3c7de82ef37e7708521be41db5565004258ca76945ad74a8e998c30af8d"}, + {file = "Pillow-10.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9d7bc666bd8c5a4225e7ac71f2f9d12466ec555e89092728ea0f5c0c2422ea80"}, + {file = "Pillow-10.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:baada14941c83079bf84c037e2d8b7506ce201e92e3d2fa0d1303507a8538212"}, + {file = "Pillow-10.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:2ef6721c97894a7aa77723740a09547197533146fba8355e86d6d9a4a1056b14"}, + {file = "Pillow-10.1.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:0a026c188be3b443916179f5d04548092e253beb0c3e2ee0a4e2cdad72f66099"}, + {file = "Pillow-10.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:04f6f6149f266a100374ca3cc368b67fb27c4af9f1cc8cb6306d849dcdf12616"}, + {file = "Pillow-10.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb40c011447712d2e19cc261c82655f75f32cb724788df315ed992a4d65696bb"}, + {file = "Pillow-10.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a8413794b4ad9719346cd9306118450b7b00d9a15846451549314a58ac42219"}, + {file = "Pillow-10.1.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:c9aeea7b63edb7884b031a35305629a7593272b54f429a9869a4f63a1bf04c34"}, + {file = "Pillow-10.1.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:b4005fee46ed9be0b8fb42be0c20e79411533d1fd58edabebc0dd24626882cfd"}, + {file = "Pillow-10.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4d0152565c6aa6ebbfb1e5d8624140a440f2b99bf7afaafbdbf6430426497f28"}, + {file = "Pillow-10.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d921bc90b1defa55c9917ca6b6b71430e4286fc9e44c55ead78ca1a9f9eba5f2"}, + {file = "Pillow-10.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:cfe96560c6ce2f4c07d6647af2d0f3c54cc33289894ebd88cfbb3bcd5391e256"}, + {file = "Pillow-10.1.0-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:937bdc5a7f5343d1c97dc98149a0be7eb9704e937fe3dc7140e229ae4fc572a7"}, + {file = "Pillow-10.1.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1c25762197144e211efb5f4e8ad656f36c8d214d390585d1d21281f46d556ba"}, + {file = "Pillow-10.1.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:afc8eef765d948543a4775f00b7b8c079b3321d6b675dde0d02afa2ee23000b4"}, + {file = "Pillow-10.1.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:883f216eac8712b83a63f41b76ddfb7b2afab1b74abbb413c5df6680f071a6b9"}, + {file = "Pillow-10.1.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:b920e4d028f6442bea9a75b7491c063f0b9a3972520731ed26c83e254302eb1e"}, + {file = "Pillow-10.1.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c41d960babf951e01a49c9746f92c5a7e0d939d1652d7ba30f6b3090f27e412"}, + {file = "Pillow-10.1.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1fafabe50a6977ac70dfe829b2d5735fd54e190ab55259ec8aea4aaea412fa0b"}, + {file = "Pillow-10.1.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:3b834f4b16173e5b92ab6566f0473bfb09f939ba14b23b8da1f54fa63e4b623f"}, + {file = "Pillow-10.1.0.tar.gz", hash = "sha256:e6bf8de6c36ed96c86ea3b6e1d5273c53f46ef518a062464cd7ef5dd2cf92e38"}, +] + +[package.extras] +docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"] +tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] + +[[package]] +name = "platformdirs" +version = "4.0.0" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +optional = false +python-versions = ">=3.7" +files = [ + {file = "platformdirs-4.0.0-py3-none-any.whl", hash = "sha256:118c954d7e949b35437270383a3f2531e99dd93cf7ce4dc8340d3356d30f173b"}, + {file = "platformdirs-4.0.0.tar.gz", hash = "sha256:cb633b2bcf10c51af60beb0ab06d2f1d69064b43abf4c185ca6b28865f3f9731"}, +] + +[package.extras] +docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.1)", "sphinx-autodoc-typehints (>=1.24)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)"] + +[[package]] +name = "promise" +version = "2.3" +description = "Promises/A+ implementation for Python" +optional = false +python-versions = "*" +files = [ + {file = "promise-2.3.tar.gz", hash = "sha256:dfd18337c523ba4b6a58801c164c1904a9d4d1b1747c7d5dbf45b693a49d93d0"}, +] + +[package.dependencies] +six = "*" + +[package.extras] +test = ["coveralls", "futures", "mock", "pytest (>=2.7.3)", "pytest-benchmark", "pytest-cov"] + +[[package]] +name = "prompt-toolkit" +version = "3.0.40" +description = "Library for building powerful interactive command lines in Python" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "prompt_toolkit-3.0.40-py3-none-any.whl", hash = "sha256:99ba3dfb23d5b5af89712f89e60a5f3d9b8b67a9482ca377c5771d0e9047a34b"}, + {file = "prompt_toolkit-3.0.40.tar.gz", hash = "sha256:a371c06bb1d66cd499fecd708e50c0b6ae00acba9822ba33c586e2f16d1b739e"}, +] + +[package.dependencies] +wcwidth = "*" + +[[package]] +name = "protobuf" +version = "3.20.3" +description = "Protocol Buffers" +optional = false +python-versions = ">=3.7" +files = [ + {file = "protobuf-3.20.3-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:f4bd856d702e5b0d96a00ec6b307b0f51c1982c2bf9c0052cf9019e9a544ba99"}, + {file = "protobuf-3.20.3-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9aae4406ea63d825636cc11ffb34ad3379335803216ee3a856787bcf5ccc751e"}, + {file = "protobuf-3.20.3-cp310-cp310-win32.whl", hash = "sha256:28545383d61f55b57cf4df63eebd9827754fd2dc25f80c5253f9184235db242c"}, + {file = "protobuf-3.20.3-cp310-cp310-win_amd64.whl", hash = "sha256:67a3598f0a2dcbc58d02dd1928544e7d88f764b47d4a286202913f0b2801c2e7"}, + {file = "protobuf-3.20.3-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:899dc660cd599d7352d6f10d83c95df430a38b410c1b66b407a6b29265d66469"}, + {file = "protobuf-3.20.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e64857f395505ebf3d2569935506ae0dfc4a15cb80dc25261176c784662cdcc4"}, + {file = "protobuf-3.20.3-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:d9e4432ff660d67d775c66ac42a67cf2453c27cb4d738fc22cb53b5d84c135d4"}, + {file = "protobuf-3.20.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:74480f79a023f90dc6e18febbf7b8bac7508420f2006fabd512013c0c238f454"}, + {file = "protobuf-3.20.3-cp37-cp37m-win32.whl", hash = "sha256:b6cc7ba72a8850621bfec987cb72623e703b7fe2b9127a161ce61e61558ad905"}, + {file = "protobuf-3.20.3-cp37-cp37m-win_amd64.whl", hash = "sha256:8c0c984a1b8fef4086329ff8dd19ac77576b384079247c770f29cc8ce3afa06c"}, + {file = "protobuf-3.20.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:de78575669dddf6099a8a0f46a27e82a1783c557ccc38ee620ed8cc96d3be7d7"}, + {file = "protobuf-3.20.3-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:f4c42102bc82a51108e449cbb32b19b180022941c727bac0cfd50170341f16ee"}, + {file = "protobuf-3.20.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:44246bab5dd4b7fbd3c0c80b6f16686808fab0e4aca819ade6e8d294a29c7050"}, + {file = "protobuf-3.20.3-cp38-cp38-win32.whl", hash = "sha256:c02ce36ec760252242a33967d51c289fd0e1c0e6e5cc9397e2279177716add86"}, + {file = "protobuf-3.20.3-cp38-cp38-win_amd64.whl", hash = "sha256:447d43819997825d4e71bf5769d869b968ce96848b6479397e29fc24c4a5dfe9"}, + {file = "protobuf-3.20.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:398a9e0c3eaceb34ec1aee71894ca3299605fa8e761544934378bbc6c97de23b"}, + {file = "protobuf-3.20.3-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:bf01b5720be110540be4286e791db73f84a2b721072a3711efff6c324cdf074b"}, + {file = "protobuf-3.20.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:daa564862dd0d39c00f8086f88700fdbe8bc717e993a21e90711acfed02f2402"}, + {file = "protobuf-3.20.3-cp39-cp39-win32.whl", hash = "sha256:819559cafa1a373b7096a482b504ae8a857c89593cf3a25af743ac9ecbd23480"}, + {file = "protobuf-3.20.3-cp39-cp39-win_amd64.whl", hash = "sha256:03038ac1cfbc41aa21f6afcbcd357281d7521b4157926f30ebecc8d4ea59dcb7"}, + {file = "protobuf-3.20.3-py2.py3-none-any.whl", hash = "sha256:a7ca6d488aa8ff7f329d4c545b2dbad8ac31464f1d8b1c87ad1346717731e4db"}, + {file = "protobuf-3.20.3.tar.gz", hash = "sha256:2e3427429c9cffebf259491be0af70189607f365c2f41c7c3764af6f337105f2"}, +] + +[[package]] +name = "psutil" +version = "5.9.6" +description = "Cross-platform lib for process and system monitoring in Python." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +files = [ + {file = "psutil-5.9.6-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:fb8a697f11b0f5994550555fcfe3e69799e5b060c8ecf9e2f75c69302cc35c0d"}, + {file = "psutil-5.9.6-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:91ecd2d9c00db9817a4b4192107cf6954addb5d9d67a969a4f436dbc9200f88c"}, + {file = "psutil-5.9.6-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:10e8c17b4f898d64b121149afb136c53ea8b68c7531155147867b7b1ac9e7e28"}, + {file = "psutil-5.9.6-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:18cd22c5db486f33998f37e2bb054cc62fd06646995285e02a51b1e08da97017"}, + {file = "psutil-5.9.6-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:ca2780f5e038379e520281e4c032dddd086906ddff9ef0d1b9dcf00710e5071c"}, + {file = "psutil-5.9.6-cp27-none-win32.whl", hash = "sha256:70cb3beb98bc3fd5ac9ac617a327af7e7f826373ee64c80efd4eb2856e5051e9"}, + {file = "psutil-5.9.6-cp27-none-win_amd64.whl", hash = "sha256:51dc3d54607c73148f63732c727856f5febec1c7c336f8f41fcbd6315cce76ac"}, + {file = "psutil-5.9.6-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:c69596f9fc2f8acd574a12d5f8b7b1ba3765a641ea5d60fb4736bf3c08a8214a"}, + {file = "psutil-5.9.6-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:92e0cc43c524834af53e9d3369245e6cc3b130e78e26100d1f63cdb0abeb3d3c"}, + {file = "psutil-5.9.6-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:748c9dd2583ed86347ed65d0035f45fa8c851e8d90354c122ab72319b5f366f4"}, + {file = "psutil-5.9.6-cp36-cp36m-win32.whl", hash = "sha256:3ebf2158c16cc69db777e3c7decb3c0f43a7af94a60d72e87b2823aebac3d602"}, + {file = "psutil-5.9.6-cp36-cp36m-win_amd64.whl", hash = "sha256:ff18b8d1a784b810df0b0fff3bcb50ab941c3b8e2c8de5726f9c71c601c611aa"}, + {file = "psutil-5.9.6-cp37-abi3-win32.whl", hash = "sha256:a6f01f03bf1843280f4ad16f4bde26b817847b4c1a0db59bf6419807bc5ce05c"}, + {file = "psutil-5.9.6-cp37-abi3-win_amd64.whl", hash = "sha256:6e5fb8dc711a514da83098bc5234264e551ad980cec5f85dabf4d38ed6f15e9a"}, + {file = "psutil-5.9.6-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:daecbcbd29b289aac14ece28eca6a3e60aa361754cf6da3dfb20d4d32b6c7f57"}, + {file = "psutil-5.9.6.tar.gz", hash = "sha256:e4b92ddcd7dd4cdd3f900180ea1e104932c7bce234fb88976e2a3b296441225a"}, +] + +[package.extras] +test = ["enum34", "ipaddress", "mock", "pywin32", "wmi"] + +[[package]] +name = "ptyprocess" +version = "0.7.0" +description = "Run a subprocess in a pseudo terminal" +optional = false +python-versions = "*" +files = [ + {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, + {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, +] + +[[package]] +name = "pure-eval" +version = "0.2.2" +description = "Safely evaluate AST nodes without side effects" +optional = false +python-versions = "*" +files = [ + {file = "pure_eval-0.2.2-py3-none-any.whl", hash = "sha256:01eaab343580944bc56080ebe0a674b39ec44a945e6d09ba7db3cb8cec289350"}, + {file = "pure_eval-0.2.2.tar.gz", hash = "sha256:2b45320af6dfaa1750f543d714b6d1c520a1688dec6fd24d339063ce0aaa9ac3"}, +] + +[package.extras] +tests = ["pytest"] + +[[package]] +name = "pycparser" +version = "2.21" +description = "C parser in Python" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, + {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, +] + +[[package]] +name = "pygame" +version = "2.5.2" +description = "Python Game Development" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pygame-2.5.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a0769eb628c818761755eb0a0ca8216b95270ea8cbcbc82227e39ac9644643da"}, + {file = "pygame-2.5.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ed9a3d98adafa0805ccbaaff5d2996a2b5795381285d8437a4a5d248dbd12b4a"}, + {file = "pygame-2.5.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f30d1618672a55e8c6669281ba264464b3ab563158e40d89e8c8b3faa0febebd"}, + {file = "pygame-2.5.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:39690e9be9baf58b7359d1f3b2336e1fd6f92fedbbce42987be5df27f8d30718"}, + {file = "pygame-2.5.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:03879ec299c9f4ba23901b2649a96b2143f0a5d787f0b6c39469989e2320caf1"}, + {file = "pygame-2.5.2-cp310-cp310-win32.whl", hash = "sha256:74e1d6284100e294f445832e6f6343be4fe4748decc4f8a51131ae197dae8584"}, + {file = "pygame-2.5.2-cp310-cp310-win_amd64.whl", hash = "sha256:485239c7d32265fd35b76ae8f64f34b0637ae11e69d76de15710c4b9edcc7c8d"}, + {file = "pygame-2.5.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:34646ca20e163dc6f6cf8170f1e12a2e41726780112594ac061fa448cf7ccd75"}, + {file = "pygame-2.5.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3b8a6e351665ed26ea791f0e1fd649d3f483e8681892caef9d471f488f9ea5ee"}, + {file = "pygame-2.5.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dc346965847aef00013fa2364f41a64f068cd096dcc7778fc306ca3735f0eedf"}, + {file = "pygame-2.5.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:35632035fd81261f2d797fa810ea8c46111bd78ceb6089d52b61ed7dc3c5d05f"}, + {file = "pygame-2.5.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e24d05184e4195fe5ebcdce8b18ecb086f00182b9ae460a86682d312ce8d31f"}, + {file = "pygame-2.5.2-cp311-cp311-win32.whl", hash = "sha256:f02c1c7505af18d426d355ac9872bd5c916b27f7b0fe224749930662bea47a50"}, + {file = "pygame-2.5.2-cp311-cp311-win_amd64.whl", hash = "sha256:6d58c8cf937815d3b7cdc0fa9590c5129cb2c9658b72d00e8a4568dea2ff1d42"}, + {file = "pygame-2.5.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:1a2a43802bb5e89ce2b3b775744e78db4f9a201bf8d059b946c61722840ceea8"}, + {file = "pygame-2.5.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1c289f2613c44fe70a1e40769de4a49c5ab5a29b9376f1692bb1a15c9c1c9bfa"}, + {file = "pygame-2.5.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:074aa6c6e110c925f7f27f00c7733c6303407edc61d738882985091d1eb2ef17"}, + {file = "pygame-2.5.2-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fe0228501ec616779a0b9c4299e837877783e18df294dd690b9ab0eed3d8aaab"}, + {file = "pygame-2.5.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31648d38ecdc2335ffc0e38fb18a84b3339730521505dac68514f83a1092e3f4"}, + {file = "pygame-2.5.2-cp312-cp312-win32.whl", hash = "sha256:224c308856334bc792f696e9278e50d099a87c116f7fc314cd6aa3ff99d21592"}, + {file = "pygame-2.5.2-cp312-cp312-win_amd64.whl", hash = "sha256:dd2d2650faf54f9a0f5bd0db8409f79609319725f8f08af6507a0609deadcad4"}, + {file = "pygame-2.5.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:9b30bc1220c457169571aac998e54b013aaeb732d2fd8744966cb1cfab1f61d1"}, + {file = "pygame-2.5.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78fcd7643358b886a44127ff7dec9041c056c212b3a98977674f83f99e9b12d3"}, + {file = "pygame-2.5.2-cp36-cp36m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:35cf093a51cb294ede56c29d4acf41538c00f297fcf78a9b186fb7d23c0577b6"}, + {file = "pygame-2.5.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fe323acbf53a0195c8c98b1b941eba7ac24e3e2b28ae48e8cda566f15fc4945"}, + {file = "pygame-2.5.2-cp36-cp36m-win32.whl", hash = "sha256:5697528266b4716d9cdd44a5a1d210f4d86ef801d0f64ca5da5d0816704009d9"}, + {file = "pygame-2.5.2-cp36-cp36m-win_amd64.whl", hash = "sha256:edda1f7cff4806a4fa39e0e8ccd75f38d1d340fa5fc52d8582ade87aca247d92"}, + {file = "pygame-2.5.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:9bd738fd4ecc224769d0b4a719f96900a86578e26e0105193658a32966df2aae"}, + {file = "pygame-2.5.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:30a8d7cf12363b4140bf2f93b5eec4028376ca1d0fe4b550588f836279485308"}, + {file = "pygame-2.5.2-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bc12e4dea3e88ea8a553de6d56a37b704dbe2aed95105889f6afeb4b96e62097"}, + {file = "pygame-2.5.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2b34c73cb328024f8db3cb6487a37e54000148988275d8d6e5adf99d9323c937"}, + {file = "pygame-2.5.2-cp37-cp37m-win32.whl", hash = "sha256:7d0a2794649defa57ef50b096a99f7113d3d0c2e32d1426cafa7d618eadce4c7"}, + {file = "pygame-2.5.2-cp37-cp37m-win_amd64.whl", hash = "sha256:41f8779f52e0f6e6e6ccb8f0b5536e432bf386ee29c721a1c22cada7767b0cef"}, + {file = "pygame-2.5.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:677e37bc0ea7afd89dde5a88ced4458aa8656159c70a576eea68b5622ee1997b"}, + {file = "pygame-2.5.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:47a8415d2bd60e6909823b5643a1d4ef5cc29417d817f2a214b255f6fa3a1e4c"}, + {file = "pygame-2.5.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ff21201df6278b8ca2e948fb148ffe88f5481fd03760f381dd61e45954c7dff"}, + {file = "pygame-2.5.2-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d29a84b2e02814b9ba925357fd2e1df78efe5e1aa64dc3051eaed95d2b96eafd"}, + {file = "pygame-2.5.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d78485c4d21133d6b2fbb504cd544ca655e50b6eb551d2995b3aa6035928adda"}, + {file = "pygame-2.5.2-cp38-cp38-win32.whl", hash = "sha256:d851247239548aa357c4a6840fb67adc2d570ce7cb56988d036a723d26b48bff"}, + {file = "pygame-2.5.2-cp38-cp38-win_amd64.whl", hash = "sha256:88d1cdacc2d3471eceab98bf0c93c14d3a8461f93e58e3d926f20d4de3a75554"}, + {file = "pygame-2.5.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4f1559e7efe4efb9dc19d2d811d702f325d9605f9f6f9ececa39ee6890c798f5"}, + {file = "pygame-2.5.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cf2191b756ceb0e8458a761d0c665b0c70b538570449e0d39b75a5ba94ac5cf0"}, + {file = "pygame-2.5.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6cf2257447ce7f2d6de37e5fb019d2bbe32ed05a5721ace8bc78c2d9beaf3aee"}, + {file = "pygame-2.5.2-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d75cbbfaba2b81434d62631d0b08b85fab16cf4a36e40b80298d3868927e1299"}, + {file = "pygame-2.5.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:daca456d5b9f52e088e06a127dec182b3638a775684fb2260f25d664351cf1ae"}, + {file = "pygame-2.5.2-cp39-cp39-win32.whl", hash = "sha256:3b3e619e33d11c297d7a57a82db40681f9c2c3ae1d5bf06003520b4fe30c435d"}, + {file = "pygame-2.5.2-cp39-cp39-win_amd64.whl", hash = "sha256:1822d534bb7fe756804647b6da2c9ea5d7a62d8796b2e15d172d3be085de28c6"}, + {file = "pygame-2.5.2-pp36-pypy36_pp73-win32.whl", hash = "sha256:e708fc8f709a0fe1d1876489345f2e443d47f3976d33455e2e1e937f972f8677"}, + {file = "pygame-2.5.2-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c13edebc43c240fb0532969e914f0ccefff5ae7e50b0b788d08ad2c15ef793e4"}, + {file = "pygame-2.5.2-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:263b4a7cbfc9fe2055abc21b0251cc17dea6dff750f0e1c598919ff350cdbffe"}, + {file = "pygame-2.5.2-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e58e2b0c791041e4bccafa5bd7650623ba1592b8fe62ae0a276b7d0ecb314b6c"}, + {file = "pygame-2.5.2-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a0bd67426c02ffe6c9827fc4bcbda9442fbc451d29b17c83a3c088c56fef2c90"}, + {file = "pygame-2.5.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9dcff6cbba1584cf7732ce1dbdd044406cd4f6e296d13bcb7fba963fb4aeefc9"}, + {file = "pygame-2.5.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ce4b6c0bfe44d00bb0998a6517bd0cf9455f642f30f91bc671ad41c05bf6f6ae"}, + {file = "pygame-2.5.2-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:68c4e8e60b725ffc7a6c6ecd9bb5fcc5ed2d6e0e2a2c4a29a8454856ef16ad63"}, + {file = "pygame-2.5.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f3849f97372a3381c66955f99a0d58485ccd513c3d00c030b869094ce6997a6"}, + {file = "pygame-2.5.2.tar.gz", hash = "sha256:c1b89eb5d539e7ac5cf75513125fb5f2f0a2d918b1fd6e981f23bf0ac1b1c24a"}, +] + +[[package]] +name = "pygments" +version = "2.16.1" +description = "Pygments is a syntax highlighting package written in Python." +optional = false +python-versions = ">=3.7" +files = [ + {file = "Pygments-2.16.1-py3-none-any.whl", hash = "sha256:13fc09fa63bc8d8671a6d247e1eb303c4b343eaee81d861f3404db2935653692"}, + {file = "Pygments-2.16.1.tar.gz", hash = "sha256:1daff0494820c69bc8941e407aa20f577374ee88364ee10a98fdbe0aece96e29"}, +] + +[package.extras] +plugins = ["importlib-metadata"] + +[[package]] +name = "pyparsing" +version = "3.1.1" +description = "pyparsing module - Classes and methods to define and execute parsing grammars" +optional = false +python-versions = ">=3.6.8" +files = [ + {file = "pyparsing-3.1.1-py3-none-any.whl", hash = "sha256:32c7c0b711493c72ff18a981d24f28aaf9c1fb7ed5e9667c9e84e3db623bdbfb"}, + {file = "pyparsing-3.1.1.tar.gz", hash = "sha256:ede28a1a32462f5a9705e07aea48001a08f7cf81a021585011deba701581a0db"}, +] + +[package.extras] +diagrams = ["jinja2", "railroad-diagrams"] + +[[package]] +name = "python-dateutil" +version = "2.8.2" +description = "Extensions to the standard Python datetime module" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, + {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, +] + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "pywin32" +version = "306" +description = "Python for Window Extensions" +optional = false +python-versions = "*" +files = [ + {file = "pywin32-306-cp310-cp310-win32.whl", hash = "sha256:06d3420a5155ba65f0b72f2699b5bacf3109f36acbe8923765c22938a69dfc8d"}, + {file = "pywin32-306-cp310-cp310-win_amd64.whl", hash = "sha256:84f4471dbca1887ea3803d8848a1616429ac94a4a8d05f4bc9c5dcfd42ca99c8"}, + {file = "pywin32-306-cp311-cp311-win32.whl", hash = "sha256:e65028133d15b64d2ed8f06dd9fbc268352478d4f9289e69c190ecd6818b6407"}, + {file = "pywin32-306-cp311-cp311-win_amd64.whl", hash = "sha256:a7639f51c184c0272e93f244eb24dafca9b1855707d94c192d4a0b4c01e1100e"}, + {file = "pywin32-306-cp311-cp311-win_arm64.whl", hash = "sha256:70dba0c913d19f942a2db25217d9a1b726c278f483a919f1abfed79c9cf64d3a"}, + {file = "pywin32-306-cp312-cp312-win32.whl", hash = "sha256:383229d515657f4e3ed1343da8be101000562bf514591ff383ae940cad65458b"}, + {file = "pywin32-306-cp312-cp312-win_amd64.whl", hash = "sha256:37257794c1ad39ee9be652da0462dc2e394c8159dfd913a8a4e8eb6fd346da0e"}, + {file = "pywin32-306-cp312-cp312-win_arm64.whl", hash = "sha256:5821ec52f6d321aa59e2db7e0a35b997de60c201943557d108af9d4ae1ec7040"}, + {file = "pywin32-306-cp37-cp37m-win32.whl", hash = "sha256:1c73ea9a0d2283d889001998059f5eaaba3b6238f767c9cf2833b13e6a685f65"}, + {file = "pywin32-306-cp37-cp37m-win_amd64.whl", hash = "sha256:72c5f621542d7bdd4fdb716227be0dd3f8565c11b280be6315b06ace35487d36"}, + {file = "pywin32-306-cp38-cp38-win32.whl", hash = "sha256:e4c092e2589b5cf0d365849e73e02c391c1349958c5ac3e9d5ccb9a28e017b3a"}, + {file = "pywin32-306-cp38-cp38-win_amd64.whl", hash = "sha256:e8ac1ae3601bee6ca9f7cb4b5363bf1c0badb935ef243c4733ff9a393b1690c0"}, + {file = "pywin32-306-cp39-cp39-win32.whl", hash = "sha256:e25fd5b485b55ac9c057f67d94bc203f3f6595078d1fb3b458c9c28b7153a802"}, + {file = "pywin32-306-cp39-cp39-win_amd64.whl", hash = "sha256:39b61c15272833b5c329a2989999dcae836b1eed650252ab1b7bfbe1d59f30f4"}, +] + +[[package]] +name = "pyyaml" +version = "6.0.1" +description = "YAML parser and emitter for Python" +optional = false +python-versions = ">=3.6" +files = [ + {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, + {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, + {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, + {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, + {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, + {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, + {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, + {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, + {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, + {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, + {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, + {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"}, + {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"}, + {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, + {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, + {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, + {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, + {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, + {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, + {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, + {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, +] + +[[package]] +name = "pyzmq" +version = "25.1.1" +description = "Python bindings for 0MQ" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pyzmq-25.1.1-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:381469297409c5adf9a0e884c5eb5186ed33137badcbbb0560b86e910a2f1e76"}, + {file = "pyzmq-25.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:955215ed0604dac5b01907424dfa28b40f2b2292d6493445dd34d0dfa72586a8"}, + {file = "pyzmq-25.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:985bbb1316192b98f32e25e7b9958088431d853ac63aca1d2c236f40afb17c83"}, + {file = "pyzmq-25.1.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:afea96f64efa98df4da6958bae37f1cbea7932c35878b185e5982821bc883369"}, + {file = "pyzmq-25.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76705c9325d72a81155bb6ab48d4312e0032bf045fb0754889133200f7a0d849"}, + {file = "pyzmq-25.1.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:77a41c26205d2353a4c94d02be51d6cbdf63c06fbc1295ea57dad7e2d3381b71"}, + {file = "pyzmq-25.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:12720a53e61c3b99d87262294e2b375c915fea93c31fc2336898c26d7aed34cd"}, + {file = "pyzmq-25.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:57459b68e5cd85b0be8184382cefd91959cafe79ae019e6b1ae6e2ba8a12cda7"}, + {file = "pyzmq-25.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:292fe3fc5ad4a75bc8df0dfaee7d0babe8b1f4ceb596437213821f761b4589f9"}, + {file = "pyzmq-25.1.1-cp310-cp310-win32.whl", hash = "sha256:35b5ab8c28978fbbb86ea54958cd89f5176ce747c1fb3d87356cf698048a7790"}, + {file = "pyzmq-25.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:11baebdd5fc5b475d484195e49bae2dc64b94a5208f7c89954e9e354fc609d8f"}, + {file = "pyzmq-25.1.1-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:d20a0ddb3e989e8807d83225a27e5c2eb2260eaa851532086e9e0fa0d5287d83"}, + {file = "pyzmq-25.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e1c1be77bc5fb77d923850f82e55a928f8638f64a61f00ff18a67c7404faf008"}, + {file = "pyzmq-25.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d89528b4943d27029a2818f847c10c2cecc79fa9590f3cb1860459a5be7933eb"}, + {file = "pyzmq-25.1.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:90f26dc6d5f241ba358bef79be9ce06de58d477ca8485e3291675436d3827cf8"}, + {file = "pyzmq-25.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c2b92812bd214018e50b6380ea3ac0c8bb01ac07fcc14c5f86a5bb25e74026e9"}, + {file = "pyzmq-25.1.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:2f957ce63d13c28730f7fd6b72333814221c84ca2421298f66e5143f81c9f91f"}, + {file = "pyzmq-25.1.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:047a640f5c9c6ade7b1cc6680a0e28c9dd5a0825135acbd3569cc96ea00b2505"}, + {file = "pyzmq-25.1.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7f7e58effd14b641c5e4dec8c7dab02fb67a13df90329e61c869b9cc607ef752"}, + {file = "pyzmq-25.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c2910967e6ab16bf6fbeb1f771c89a7050947221ae12a5b0b60f3bca2ee19bca"}, + {file = "pyzmq-25.1.1-cp311-cp311-win32.whl", hash = "sha256:76c1c8efb3ca3a1818b837aea423ff8a07bbf7aafe9f2f6582b61a0458b1a329"}, + {file = "pyzmq-25.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:44e58a0554b21fc662f2712814a746635ed668d0fbc98b7cb9d74cb798d202e6"}, + {file = "pyzmq-25.1.1-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:e1ffa1c924e8c72778b9ccd386a7067cddf626884fd8277f503c48bb5f51c762"}, + {file = "pyzmq-25.1.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:1af379b33ef33757224da93e9da62e6471cf4a66d10078cf32bae8127d3d0d4a"}, + {file = "pyzmq-25.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cff084c6933680d1f8b2f3b4ff5bbb88538a4aac00d199ac13f49d0698727ecb"}, + {file = "pyzmq-25.1.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e2400a94f7dd9cb20cd012951a0cbf8249e3d554c63a9c0cdfd5cbb6c01d2dec"}, + {file = "pyzmq-25.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d81f1ddae3858b8299d1da72dd7d19dd36aab654c19671aa8a7e7fb02f6638a"}, + {file = "pyzmq-25.1.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:255ca2b219f9e5a3a9ef3081512e1358bd4760ce77828e1028b818ff5610b87b"}, + {file = "pyzmq-25.1.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a882ac0a351288dd18ecae3326b8a49d10c61a68b01419f3a0b9a306190baf69"}, + {file = "pyzmq-25.1.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:724c292bb26365659fc434e9567b3f1adbdb5e8d640c936ed901f49e03e5d32e"}, + {file = "pyzmq-25.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ca1ed0bb2d850aa8471387882247c68f1e62a4af0ce9c8a1dbe0d2bf69e41fb"}, + {file = "pyzmq-25.1.1-cp312-cp312-win32.whl", hash = "sha256:b3451108ab861040754fa5208bca4a5496c65875710f76789a9ad27c801a0075"}, + {file = "pyzmq-25.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:eadbefd5e92ef8a345f0525b5cfd01cf4e4cc651a2cffb8f23c0dd184975d787"}, + {file = "pyzmq-25.1.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:db0b2af416ba735c6304c47f75d348f498b92952f5e3e8bff449336d2728795d"}, + {file = "pyzmq-25.1.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7c133e93b405eb0d36fa430c94185bdd13c36204a8635470cccc200723c13bb"}, + {file = "pyzmq-25.1.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:273bc3959bcbff3f48606b28229b4721716598d76b5aaea2b4a9d0ab454ec062"}, + {file = "pyzmq-25.1.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:cbc8df5c6a88ba5ae385d8930da02201165408dde8d8322072e3e5ddd4f68e22"}, + {file = "pyzmq-25.1.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:18d43df3f2302d836f2a56f17e5663e398416e9dd74b205b179065e61f1a6edf"}, + {file = "pyzmq-25.1.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:73461eed88a88c866656e08f89299720a38cb4e9d34ae6bf5df6f71102570f2e"}, + {file = "pyzmq-25.1.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:34c850ce7976d19ebe7b9d4b9bb8c9dfc7aac336c0958e2651b88cbd46682123"}, + {file = "pyzmq-25.1.1-cp36-cp36m-win32.whl", hash = "sha256:d2045d6d9439a0078f2a34b57c7b18c4a6aef0bee37f22e4ec9f32456c852c71"}, + {file = "pyzmq-25.1.1-cp36-cp36m-win_amd64.whl", hash = "sha256:458dea649f2f02a0b244ae6aef8dc29325a2810aa26b07af8374dc2a9faf57e3"}, + {file = "pyzmq-25.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7cff25c5b315e63b07a36f0c2bab32c58eafbe57d0dce61b614ef4c76058c115"}, + {file = "pyzmq-25.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1579413ae492b05de5a6174574f8c44c2b9b122a42015c5292afa4be2507f28"}, + {file = "pyzmq-25.1.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3d0a409d3b28607cc427aa5c30a6f1e4452cc44e311f843e05edb28ab5e36da0"}, + {file = "pyzmq-25.1.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:21eb4e609a154a57c520e3d5bfa0d97e49b6872ea057b7c85257b11e78068222"}, + {file = "pyzmq-25.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:034239843541ef7a1aee0c7b2cb7f6aafffb005ede965ae9cbd49d5ff4ff73cf"}, + {file = "pyzmq-25.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f8115e303280ba09f3898194791a153862cbf9eef722ad8f7f741987ee2a97c7"}, + {file = "pyzmq-25.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:1a5d26fe8f32f137e784f768143728438877d69a586ddeaad898558dc971a5ae"}, + {file = "pyzmq-25.1.1-cp37-cp37m-win32.whl", hash = "sha256:f32260e556a983bc5c7ed588d04c942c9a8f9c2e99213fec11a031e316874c7e"}, + {file = "pyzmq-25.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:abf34e43c531bbb510ae7e8f5b2b1f2a8ab93219510e2b287a944432fad135f3"}, + {file = "pyzmq-25.1.1-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:87e34f31ca8f168c56d6fbf99692cc8d3b445abb5bfd08c229ae992d7547a92a"}, + {file = "pyzmq-25.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c9c6c9b2c2f80747a98f34ef491c4d7b1a8d4853937bb1492774992a120f475d"}, + {file = "pyzmq-25.1.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5619f3f5a4db5dbb572b095ea3cb5cc035335159d9da950830c9c4db2fbb6995"}, + {file = "pyzmq-25.1.1-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5a34d2395073ef862b4032343cf0c32a712f3ab49d7ec4f42c9661e0294d106f"}, + {file = "pyzmq-25.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25f0e6b78220aba09815cd1f3a32b9c7cb3e02cb846d1cfc526b6595f6046618"}, + {file = "pyzmq-25.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:3669cf8ee3520c2f13b2e0351c41fea919852b220988d2049249db10046a7afb"}, + {file = "pyzmq-25.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:2d163a18819277e49911f7461567bda923461c50b19d169a062536fffe7cd9d2"}, + {file = "pyzmq-25.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:df27ffddff4190667d40de7beba4a950b5ce78fe28a7dcc41d6f8a700a80a3c0"}, + {file = "pyzmq-25.1.1-cp38-cp38-win32.whl", hash = "sha256:a382372898a07479bd34bda781008e4a954ed8750f17891e794521c3e21c2e1c"}, + {file = "pyzmq-25.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:52533489f28d62eb1258a965f2aba28a82aa747202c8fa5a1c7a43b5db0e85c1"}, + {file = "pyzmq-25.1.1-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:03b3f49b57264909aacd0741892f2aecf2f51fb053e7d8ac6767f6c700832f45"}, + {file = "pyzmq-25.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:330f9e188d0d89080cde66dc7470f57d1926ff2fb5576227f14d5be7ab30b9fa"}, + {file = "pyzmq-25.1.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2ca57a5be0389f2a65e6d3bb2962a971688cbdd30b4c0bd188c99e39c234f414"}, + {file = "pyzmq-25.1.1-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d457aed310f2670f59cc5b57dcfced452aeeed77f9da2b9763616bd57e4dbaae"}, + {file = "pyzmq-25.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c56d748ea50215abef7030c72b60dd723ed5b5c7e65e7bc2504e77843631c1a6"}, + {file = "pyzmq-25.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:8f03d3f0d01cb5a018debeb412441996a517b11c5c17ab2001aa0597c6d6882c"}, + {file = "pyzmq-25.1.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:820c4a08195a681252f46926de10e29b6bbf3e17b30037bd4250d72dd3ddaab8"}, + {file = "pyzmq-25.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:17ef5f01d25b67ca8f98120d5fa1d21efe9611604e8eb03a5147360f517dd1e2"}, + {file = "pyzmq-25.1.1-cp39-cp39-win32.whl", hash = "sha256:04ccbed567171579ec2cebb9c8a3e30801723c575601f9a990ab25bcac6b51e2"}, + {file = "pyzmq-25.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:e61f091c3ba0c3578411ef505992d356a812fb200643eab27f4f70eed34a29ef"}, + {file = "pyzmq-25.1.1-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ade6d25bb29c4555d718ac6d1443a7386595528c33d6b133b258f65f963bb0f6"}, + {file = "pyzmq-25.1.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e0c95ddd4f6e9fca4e9e3afaa4f9df8552f0ba5d1004e89ef0a68e1f1f9807c7"}, + {file = "pyzmq-25.1.1-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:48e466162a24daf86f6b5ca72444d2bf39a5e58da5f96370078be67c67adc978"}, + {file = "pyzmq-25.1.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:abc719161780932c4e11aaebb203be3d6acc6b38d2f26c0f523b5b59d2fc1996"}, + {file = "pyzmq-25.1.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:1ccf825981640b8c34ae54231b7ed00271822ea1c6d8ba1090ebd4943759abf5"}, + {file = "pyzmq-25.1.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:c2f20ce161ebdb0091a10c9ca0372e023ce24980d0e1f810f519da6f79c60800"}, + {file = "pyzmq-25.1.1-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:deee9ca4727f53464daf089536e68b13e6104e84a37820a88b0a057b97bba2d2"}, + {file = "pyzmq-25.1.1-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:aa8d6cdc8b8aa19ceb319aaa2b660cdaccc533ec477eeb1309e2a291eaacc43a"}, + {file = "pyzmq-25.1.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:019e59ef5c5256a2c7378f2fb8560fc2a9ff1d315755204295b2eab96b254d0a"}, + {file = "pyzmq-25.1.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:b9af3757495c1ee3b5c4e945c1df7be95562277c6e5bccc20a39aec50f826cd0"}, + {file = "pyzmq-25.1.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:548d6482dc8aadbe7e79d1b5806585c8120bafa1ef841167bc9090522b610fa6"}, + {file = "pyzmq-25.1.1-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:057e824b2aae50accc0f9a0570998adc021b372478a921506fddd6c02e60308e"}, + {file = "pyzmq-25.1.1-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2243700cc5548cff20963f0ca92d3e5e436394375ab8a354bbea2b12911b20b0"}, + {file = "pyzmq-25.1.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79986f3b4af059777111409ee517da24a529bdbd46da578b33f25580adcff728"}, + {file = "pyzmq-25.1.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:11d58723d44d6ed4dd677c5615b2ffb19d5c426636345567d6af82be4dff8a55"}, + {file = "pyzmq-25.1.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:49d238cf4b69652257db66d0c623cd3e09b5d2e9576b56bc067a396133a00d4a"}, + {file = "pyzmq-25.1.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fedbdc753827cf014c01dbbee9c3be17e5a208dcd1bf8641ce2cd29580d1f0d4"}, + {file = "pyzmq-25.1.1-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bc16ac425cc927d0a57d242589f87ee093884ea4804c05a13834d07c20db203c"}, + {file = "pyzmq-25.1.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11c1d2aed9079c6b0c9550a7257a836b4a637feb334904610f06d70eb44c56d2"}, + {file = "pyzmq-25.1.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e8a701123029cc240cea61dd2d16ad57cab4691804143ce80ecd9286b464d180"}, + {file = "pyzmq-25.1.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:61706a6b6c24bdece85ff177fec393545a3191eeda35b07aaa1458a027ad1304"}, + {file = "pyzmq-25.1.1.tar.gz", hash = "sha256:259c22485b71abacdfa8bf79720cd7bcf4b9d128b30ea554f01ae71fdbfdaa23"}, +] + +[package.dependencies] +cffi = {version = "*", markers = "implementation_name == \"pypy\""} + +[[package]] +name = "regex" +version = "2023.10.3" +description = "Alternative regular expression module, to replace re." +optional = false +python-versions = ">=3.7" +files = [ + {file = "regex-2023.10.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4c34d4f73ea738223a094d8e0ffd6d2c1a1b4c175da34d6b0de3d8d69bee6bcc"}, + {file = "regex-2023.10.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a8f4e49fc3ce020f65411432183e6775f24e02dff617281094ba6ab079ef0915"}, + {file = "regex-2023.10.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4cd1bccf99d3ef1ab6ba835308ad85be040e6a11b0977ef7ea8c8005f01a3c29"}, + {file = "regex-2023.10.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:81dce2ddc9f6e8f543d94b05d56e70d03a0774d32f6cca53e978dc01e4fc75b8"}, + {file = "regex-2023.10.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c6b4d23c04831e3ab61717a707a5d763b300213db49ca680edf8bf13ab5d91b"}, + {file = "regex-2023.10.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c15ad0aee158a15e17e0495e1e18741573d04eb6da06d8b84af726cfc1ed02ee"}, + {file = "regex-2023.10.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6239d4e2e0b52c8bd38c51b760cd870069f0bdf99700a62cd509d7a031749a55"}, + {file = "regex-2023.10.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4a8bf76e3182797c6b1afa5b822d1d5802ff30284abe4599e1247be4fd6b03be"}, + {file = "regex-2023.10.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d9c727bbcf0065cbb20f39d2b4f932f8fa1631c3e01fcedc979bd4f51fe051c5"}, + {file = "regex-2023.10.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:3ccf2716add72f80714b9a63899b67fa711b654be3fcdd34fa391d2d274ce767"}, + {file = "regex-2023.10.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:107ac60d1bfdc3edb53be75e2a52aff7481b92817cfdddd9b4519ccf0e54a6ff"}, + {file = "regex-2023.10.3-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:00ba3c9818e33f1fa974693fb55d24cdc8ebafcb2e4207680669d8f8d7cca79a"}, + {file = "regex-2023.10.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f0a47efb1dbef13af9c9a54a94a0b814902e547b7f21acb29434504d18f36e3a"}, + {file = "regex-2023.10.3-cp310-cp310-win32.whl", hash = "sha256:36362386b813fa6c9146da6149a001b7bd063dabc4d49522a1f7aa65b725c7ec"}, + {file = "regex-2023.10.3-cp310-cp310-win_amd64.whl", hash = "sha256:c65a3b5330b54103e7d21cac3f6bf3900d46f6d50138d73343d9e5b2900b2353"}, + {file = "regex-2023.10.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:90a79bce019c442604662d17bf69df99090e24cdc6ad95b18b6725c2988a490e"}, + {file = "regex-2023.10.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c7964c2183c3e6cce3f497e3a9f49d182e969f2dc3aeeadfa18945ff7bdd7051"}, + {file = "regex-2023.10.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ef80829117a8061f974b2fda8ec799717242353bff55f8a29411794d635d964"}, + {file = "regex-2023.10.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5addc9d0209a9afca5fc070f93b726bf7003bd63a427f65ef797a931782e7edc"}, + {file = "regex-2023.10.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c148bec483cc4b421562b4bcedb8e28a3b84fcc8f0aa4418e10898f3c2c0eb9b"}, + {file = "regex-2023.10.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d1f21af4c1539051049796a0f50aa342f9a27cde57318f2fc41ed50b0dbc4ac"}, + {file = "regex-2023.10.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0b9ac09853b2a3e0d0082104036579809679e7715671cfbf89d83c1cb2a30f58"}, + {file = "regex-2023.10.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ebedc192abbc7fd13c5ee800e83a6df252bec691eb2c4bedc9f8b2e2903f5e2a"}, + {file = "regex-2023.10.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:d8a993c0a0ffd5f2d3bda23d0cd75e7086736f8f8268de8a82fbc4bd0ac6791e"}, + {file = "regex-2023.10.3-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:be6b7b8d42d3090b6c80793524fa66c57ad7ee3fe9722b258aec6d0672543fd0"}, + {file = "regex-2023.10.3-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4023e2efc35a30e66e938de5aef42b520c20e7eda7bb5fb12c35e5d09a4c43f6"}, + {file = "regex-2023.10.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0d47840dc05e0ba04fe2e26f15126de7c755496d5a8aae4a08bda4dd8d646c54"}, + {file = "regex-2023.10.3-cp311-cp311-win32.whl", hash = "sha256:9145f092b5d1977ec8c0ab46e7b3381b2fd069957b9862a43bd383e5c01d18c2"}, + {file = "regex-2023.10.3-cp311-cp311-win_amd64.whl", hash = "sha256:b6104f9a46bd8743e4f738afef69b153c4b8b592d35ae46db07fc28ae3d5fb7c"}, + {file = "regex-2023.10.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:bff507ae210371d4b1fe316d03433ac099f184d570a1a611e541923f78f05037"}, + {file = "regex-2023.10.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:be5e22bbb67924dea15039c3282fa4cc6cdfbe0cbbd1c0515f9223186fc2ec5f"}, + {file = "regex-2023.10.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a992f702c9be9c72fa46f01ca6e18d131906a7180950958f766c2aa294d4b41"}, + {file = "regex-2023.10.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7434a61b158be563c1362d9071358f8ab91b8d928728cd2882af060481244c9e"}, + {file = "regex-2023.10.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c2169b2dcabf4e608416f7f9468737583ce5f0a6e8677c4efbf795ce81109d7c"}, + {file = "regex-2023.10.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9e908ef5889cda4de038892b9accc36d33d72fb3e12c747e2799a0e806ec841"}, + {file = "regex-2023.10.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:12bd4bc2c632742c7ce20db48e0d99afdc05e03f0b4c1af90542e05b809a03d9"}, + {file = "regex-2023.10.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:bc72c231f5449d86d6c7d9cc7cd819b6eb30134bb770b8cfdc0765e48ef9c420"}, + {file = "regex-2023.10.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bce8814b076f0ce5766dc87d5a056b0e9437b8e0cd351b9a6c4e1134a7dfbda9"}, + {file = "regex-2023.10.3-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:ba7cd6dc4d585ea544c1412019921570ebd8a597fabf475acc4528210d7c4a6f"}, + {file = "regex-2023.10.3-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b0c7d2f698e83f15228ba41c135501cfe7d5740181d5903e250e47f617eb4292"}, + {file = "regex-2023.10.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5a8f91c64f390ecee09ff793319f30a0f32492e99f5dc1c72bc361f23ccd0a9a"}, + {file = "regex-2023.10.3-cp312-cp312-win32.whl", hash = "sha256:ad08a69728ff3c79866d729b095872afe1e0557251da4abb2c5faff15a91d19a"}, + {file = "regex-2023.10.3-cp312-cp312-win_amd64.whl", hash = "sha256:39cdf8d141d6d44e8d5a12a8569d5a227f645c87df4f92179bd06e2e2705e76b"}, + {file = "regex-2023.10.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4a3ee019a9befe84fa3e917a2dd378807e423d013377a884c1970a3c2792d293"}, + {file = "regex-2023.10.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76066d7ff61ba6bf3cb5efe2428fc82aac91802844c022d849a1f0f53820502d"}, + {file = "regex-2023.10.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bfe50b61bab1b1ec260fa7cd91106fa9fece57e6beba05630afe27c71259c59b"}, + {file = "regex-2023.10.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fd88f373cb71e6b59b7fa597e47e518282455c2734fd4306a05ca219a1991b0"}, + {file = "regex-2023.10.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b3ab05a182c7937fb374f7e946f04fb23a0c0699c0450e9fb02ef567412d2fa3"}, + {file = "regex-2023.10.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dac37cf08fcf2094159922edc7a2784cfcc5c70f8354469f79ed085f0328ebdf"}, + {file = "regex-2023.10.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e54ddd0bb8fb626aa1f9ba7b36629564544954fff9669b15da3610c22b9a0991"}, + {file = "regex-2023.10.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:3367007ad1951fde612bf65b0dffc8fd681a4ab98ac86957d16491400d661302"}, + {file = "regex-2023.10.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:16f8740eb6dbacc7113e3097b0a36065a02e37b47c936b551805d40340fb9971"}, + {file = "regex-2023.10.3-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:f4f2ca6df64cbdd27f27b34f35adb640b5d2d77264228554e68deda54456eb11"}, + {file = "regex-2023.10.3-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:39807cbcbe406efca2a233884e169d056c35aa7e9f343d4e78665246a332f597"}, + {file = "regex-2023.10.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:7eece6fbd3eae4a92d7c748ae825cbc1ee41a89bb1c3db05b5578ed3cfcfd7cb"}, + {file = "regex-2023.10.3-cp37-cp37m-win32.whl", hash = "sha256:ce615c92d90df8373d9e13acddd154152645c0dc060871abf6bd43809673d20a"}, + {file = "regex-2023.10.3-cp37-cp37m-win_amd64.whl", hash = "sha256:0f649fa32fe734c4abdfd4edbb8381c74abf5f34bc0b3271ce687b23729299ed"}, + {file = "regex-2023.10.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9b98b7681a9437262947f41c7fac567c7e1f6eddd94b0483596d320092004533"}, + {file = "regex-2023.10.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:91dc1d531f80c862441d7b66c4505cd6ea9d312f01fb2f4654f40c6fdf5cc37a"}, + {file = "regex-2023.10.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82fcc1f1cc3ff1ab8a57ba619b149b907072e750815c5ba63e7aa2e1163384a4"}, + {file = "regex-2023.10.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7979b834ec7a33aafae34a90aad9f914c41fd6eaa8474e66953f3f6f7cbd4368"}, + {file = "regex-2023.10.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ef71561f82a89af6cfcbee47f0fabfdb6e63788a9258e913955d89fdd96902ab"}, + {file = "regex-2023.10.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd829712de97753367153ed84f2de752b86cd1f7a88b55a3a775eb52eafe8a94"}, + {file = "regex-2023.10.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:00e871d83a45eee2f8688d7e6849609c2ca2a04a6d48fba3dff4deef35d14f07"}, + {file = "regex-2023.10.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:706e7b739fdd17cb89e1fbf712d9dc21311fc2333f6d435eac2d4ee81985098c"}, + {file = "regex-2023.10.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:cc3f1c053b73f20c7ad88b0d1d23be7e7b3901229ce89f5000a8399746a6e039"}, + {file = "regex-2023.10.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:6f85739e80d13644b981a88f529d79c5bdf646b460ba190bffcaf6d57b2a9863"}, + {file = "regex-2023.10.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:741ba2f511cc9626b7561a440f87d658aabb3d6b744a86a3c025f866b4d19e7f"}, + {file = "regex-2023.10.3-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:e77c90ab5997e85901da85131fd36acd0ed2221368199b65f0d11bca44549711"}, + {file = "regex-2023.10.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:979c24cbefaf2420c4e377ecd1f165ea08cc3d1fbb44bdc51bccbbf7c66a2cb4"}, + {file = "regex-2023.10.3-cp38-cp38-win32.whl", hash = "sha256:58837f9d221744d4c92d2cf7201c6acd19623b50c643b56992cbd2b745485d3d"}, + {file = "regex-2023.10.3-cp38-cp38-win_amd64.whl", hash = "sha256:c55853684fe08d4897c37dfc5faeff70607a5f1806c8be148f1695be4a63414b"}, + {file = "regex-2023.10.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2c54e23836650bdf2c18222c87f6f840d4943944146ca479858404fedeb9f9af"}, + {file = "regex-2023.10.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:69c0771ca5653c7d4b65203cbfc5e66db9375f1078689459fe196fe08b7b4930"}, + {file = "regex-2023.10.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ac965a998e1388e6ff2e9781f499ad1eaa41e962a40d11c7823c9952c77123e"}, + {file = "regex-2023.10.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1c0e8fae5b27caa34177bdfa5a960c46ff2f78ee2d45c6db15ae3f64ecadde14"}, + {file = "regex-2023.10.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6c56c3d47da04f921b73ff9415fbaa939f684d47293f071aa9cbb13c94afc17d"}, + {file = "regex-2023.10.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ef1e014eed78ab650bef9a6a9cbe50b052c0aebe553fb2881e0453717573f52"}, + {file = "regex-2023.10.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d29338556a59423d9ff7b6eb0cb89ead2b0875e08fe522f3e068b955c3e7b59b"}, + {file = "regex-2023.10.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9c6d0ced3c06d0f183b73d3c5920727268d2201aa0fe6d55c60d68c792ff3588"}, + {file = "regex-2023.10.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:994645a46c6a740ee8ce8df7911d4aee458d9b1bc5639bc968226763d07f00fa"}, + {file = "regex-2023.10.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:66e2fe786ef28da2b28e222c89502b2af984858091675044d93cb50e6f46d7af"}, + {file = "regex-2023.10.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:11175910f62b2b8c055f2b089e0fedd694fe2be3941b3e2633653bc51064c528"}, + {file = "regex-2023.10.3-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:06e9abc0e4c9ab4779c74ad99c3fc10d3967d03114449acc2c2762ad4472b8ca"}, + {file = "regex-2023.10.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:fb02e4257376ae25c6dd95a5aec377f9b18c09be6ebdefa7ad209b9137b73d48"}, + {file = "regex-2023.10.3-cp39-cp39-win32.whl", hash = "sha256:3b2c3502603fab52d7619b882c25a6850b766ebd1b18de3df23b2f939360e1bd"}, + {file = "regex-2023.10.3-cp39-cp39-win_amd64.whl", hash = "sha256:adbccd17dcaff65704c856bd29951c58a1bd4b2b0f8ad6b826dbd543fe740988"}, + {file = "regex-2023.10.3.tar.gz", hash = "sha256:3fef4f844d2290ee0ba57addcec17eec9e3df73f10a2748485dfd6a3a188cc0f"}, +] + +[[package]] +name = "requests" +version = "2.31.0" +description = "Python HTTP for Humans." +optional = false +python-versions = ">=3.7" +files = [ + {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, + {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, +] + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<3" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "ruff" +version = "0.1.5" +description = "An extremely fast Python linter and code formatter, written in Rust." +optional = false +python-versions = ">=3.7" +files = [ + {file = "ruff-0.1.5-py3-none-macosx_10_7_x86_64.whl", hash = "sha256:32d47fc69261c21a4c48916f16ca272bf2f273eb635d91c65d5cd548bf1f3d96"}, + {file = "ruff-0.1.5-py3-none-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:171276c1df6c07fa0597fb946139ced1c2978f4f0b8254f201281729981f3c17"}, + {file = "ruff-0.1.5-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:17ef33cd0bb7316ca65649fc748acc1406dfa4da96a3d0cde6d52f2e866c7b39"}, + {file = "ruff-0.1.5-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b2c205827b3f8c13b4a432e9585750b93fd907986fe1aec62b2a02cf4401eee6"}, + {file = "ruff-0.1.5-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bb408e3a2ad8f6881d0f2e7ad70cddb3ed9f200eb3517a91a245bbe27101d379"}, + {file = "ruff-0.1.5-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:f20dc5e5905ddb407060ca27267c7174f532375c08076d1a953cf7bb016f5a24"}, + {file = "ruff-0.1.5-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aafb9d2b671ed934998e881e2c0f5845a4295e84e719359c71c39a5363cccc91"}, + {file = "ruff-0.1.5-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a4894dddb476597a0ba4473d72a23151b8b3b0b5f958f2cf4d3f1c572cdb7af7"}, + {file = "ruff-0.1.5-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a00a7ec893f665ed60008c70fe9eeb58d210e6b4d83ec6654a9904871f982a2a"}, + {file = "ruff-0.1.5-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:a8c11206b47f283cbda399a654fd0178d7a389e631f19f51da15cbe631480c5b"}, + {file = "ruff-0.1.5-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:fa29e67b3284b9a79b1a85ee66e293a94ac6b7bb068b307a8a373c3d343aa8ec"}, + {file = "ruff-0.1.5-py3-none-musllinux_1_2_i686.whl", hash = "sha256:9b97fd6da44d6cceb188147b68db69a5741fbc736465b5cea3928fdac0bc1aeb"}, + {file = "ruff-0.1.5-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:721f4b9d3b4161df8dc9f09aa8562e39d14e55a4dbaa451a8e55bdc9590e20f4"}, + {file = "ruff-0.1.5-py3-none-win32.whl", hash = "sha256:f80c73bba6bc69e4fdc73b3991db0b546ce641bdcd5b07210b8ad6f64c79f1ab"}, + {file = "ruff-0.1.5-py3-none-win_amd64.whl", hash = "sha256:c21fe20ee7d76206d290a76271c1af7a5096bc4c73ab9383ed2ad35f852a0087"}, + {file = "ruff-0.1.5-py3-none-win_arm64.whl", hash = "sha256:82bfcb9927e88c1ed50f49ac6c9728dab3ea451212693fe40d08d314663e412f"}, + {file = "ruff-0.1.5.tar.gz", hash = "sha256:5cbec0ef2ae1748fb194f420fb03fb2c25c3258c86129af7172ff8f198f125ab"}, +] + +[[package]] +name = "safetensors" +version = "0.4.0" +description = "" +optional = false +python-versions = ">=3.7" +files = [ + {file = "safetensors-0.4.0-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:2289ae6dbe6d027ecee016b28ced13a2e21a0b3a3a757a23033a2d1c0b1bad55"}, + {file = "safetensors-0.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:bf6458959f310f551cbbeef2255527ade5f783f952738e73e4d0136198cc3bfe"}, + {file = "safetensors-0.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b6b60a58a8f7cc7aed3b5b73dce1f5259a53c83d9ba43a76a874e6ad868c1b4d"}, + {file = "safetensors-0.4.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:491b3477e4d0d4599bb75d79da4b75af2e6ed9b1f6ec2b715991f0bc927bf09a"}, + {file = "safetensors-0.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:59d2e10b7e0cd18bb73ed7c17c624a5957b003b81345e18159591771c26ee428"}, + {file = "safetensors-0.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3f667a4c12fb593f5f66ce966cb1b14a7148898b2b1a7f79e0761040ae1e3c51"}, + {file = "safetensors-0.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f9909512bcb6f712bdd04c296cdfb0d8ff73d258ffc5af884bb62ea02d221e0"}, + {file = "safetensors-0.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d33d29e846821f0e4f92614022949b09ccf063cb36fe2f9fe099cde1efbfbb87"}, + {file = "safetensors-0.4.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4d512525a8e05a045ce6698066ba0c5378c174a83e0b3720a8c7799dc1bb06f3"}, + {file = "safetensors-0.4.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0219cea445177f6ad1f9acd3a8d025440c8ff436d70a4a7c7ba9c36066aa9474"}, + {file = "safetensors-0.4.0-cp310-none-win32.whl", hash = "sha256:67ab171eeaad6972d3971c53d29d53353c67f6743284c6d637b59fa3e54c8a94"}, + {file = "safetensors-0.4.0-cp310-none-win_amd64.whl", hash = "sha256:7ffc736039f08a9ca1f09816a7481b8e4469c06e8f8a5ffa8cb67ddd79e6d77f"}, + {file = "safetensors-0.4.0-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:4fe9e3737b30de458225a23926219ca30b902ee779b6a3df96eaab2b6d625ec2"}, + {file = "safetensors-0.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e7916e814a90008de767b1c164a1d83803693c661ffe9af5a697b22e2752edb0"}, + {file = "safetensors-0.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cbc4a4da01143472323c145f3c289e5f6fabde0ac0a3414dabf912a21692fff4"}, + {file = "safetensors-0.4.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a54c21654a47669b38e359e8f852af754b786c9da884bb61ad5e9af12bd71ccb"}, + {file = "safetensors-0.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:25cd407955bad5340ba17f9f8ac789a0d751601a311e2f7b2733f9384478c95e"}, + {file = "safetensors-0.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:82e8fc4e3503cd738fd40718a430fe0e5ce6e7ff91a73d6ce628bbb89c41e8ce"}, + {file = "safetensors-0.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48b92059b1a4ad163024d4f526e0e73ebe2bb3ae70537e15e347820b4de5dc27"}, + {file = "safetensors-0.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5daa05058f7dce85b5f9f60c4eab483ed7859d63978f08a76e52e78859ff20ca"}, + {file = "safetensors-0.4.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a86565a5c112dd855909e20144947b4f53abb78c4de207f36ca71ee63ba5b90d"}, + {file = "safetensors-0.4.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:38032078ed9fea52d06584e441bccc73fb475c4581600c6d6166de2fe2deb3d1"}, + {file = "safetensors-0.4.0-cp311-none-win32.whl", hash = "sha256:2f99d90c91b7c76b40a862acd9085bc77f7974a27dee7cfcebe46149af5a99a1"}, + {file = "safetensors-0.4.0-cp311-none-win_amd64.whl", hash = "sha256:74e2a448ffe19be188b457b130168190ee73b5a75e45ba96796320c1f5ae35d2"}, + {file = "safetensors-0.4.0-cp312-cp312-macosx_10_7_x86_64.whl", hash = "sha256:1e2f9c69b41d03b4826ffb96b29e07444bb6b34a78a7bafd0b88d59e8ec75b8a"}, + {file = "safetensors-0.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3910fb5bf747413b59f1a34e6d2a993b589fa7d919709518823c70efaaa350bd"}, + {file = "safetensors-0.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf8fdca709b2470a35a59b1e6dffea75cbe1214b22612b5dd4c93947697aea8b"}, + {file = "safetensors-0.4.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2f27b8ef814c5fb43456caeb7f3cbb889b76115180aad1f42402839c14a47c5b"}, + {file = "safetensors-0.4.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7b2d6101eccc43c7be0cb052f13ceda64288b3d8b344b988ed08d7133cbce2f3"}, + {file = "safetensors-0.4.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fdc34027b545a69be3d4220c140b276129523e4e46db06ad1a0b60d6a4cf9214"}, + {file = "safetensors-0.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db7bb48ca9e90bb9526c71b388d38d8de160c0354f4c5126df23e8701a870dcb"}, + {file = "safetensors-0.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a78ffc0795d3595cd9e4d453502e35f764276c49e434b25556a15a337db4dafc"}, + {file = "safetensors-0.4.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:8e735b0f79090f6855b55e205e820b7b595502ffca0009a5c13eef3661ce465b"}, + {file = "safetensors-0.4.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:f8d2416734e850d5392afffbcb2b8985ea29fb171f1cb197e2ae51b8e35d6438"}, + {file = "safetensors-0.4.0-cp37-cp37m-macosx_10_7_x86_64.whl", hash = "sha256:e853e189ba7d47eaf561094586692ba2bbdd258c096f1755805cac098de0e6ab"}, + {file = "safetensors-0.4.0-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:4b2aa57b5a4d576f3d1dd6e56980026340f156f8a13c13016bfac4e25295b53f"}, + {file = "safetensors-0.4.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3b6c1316ffde6cb4bf22c7445bc9fd224b4d1b9dd7320695f5611c89e802e4b6"}, + {file = "safetensors-0.4.0-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:003077ec85261d00061058fa12e3c1d2055366b02ce8f2938929359ffbaff2b8"}, + {file = "safetensors-0.4.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bd63d83a92f1437a8b0431779320376030ae43ace980bea5686d515de0784100"}, + {file = "safetensors-0.4.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2077801800b4b13301d8d6290c7fb5bd60737320001717153ebc4371776643b5"}, + {file = "safetensors-0.4.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7abe0e157a49a75aeeccfbc4f3dac38d8f98512d3cdb35c200f8e628dc5773cf"}, + {file = "safetensors-0.4.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3bfed574f6b1e7e7fe1f17213278875ef6c6e8b1582ab6eda93947db1178cae6"}, + {file = "safetensors-0.4.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:964ef166a286ce3b023d0d0bd0e21d440a1c8028981c8abdb136bc7872ba9b3d"}, + {file = "safetensors-0.4.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:44f84373e42183bd56a13a1f2d8acb1db7fedaeffbd83e79cec861477eee1af4"}, + {file = "safetensors-0.4.0-cp37-none-win32.whl", hash = "sha256:c68132727dd86fb641102e494d445f705efe402f4d5e24b278183a15499ab400"}, + {file = "safetensors-0.4.0-cp37-none-win_amd64.whl", hash = "sha256:1db87155454c168aef118d5657a403aee48a4cb08d8851a981157f07351ea317"}, + {file = "safetensors-0.4.0-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:9e583fa68e5a07cc859c4e13c1ebff12029904aa2e27185cf04a1f57fe9a81c4"}, + {file = "safetensors-0.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:73e7696dcf3f72f99545eb1abe6106ad65ff1f62381d6ce4b34be3272552897a"}, + {file = "safetensors-0.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4936096a57c62e84e200f92620a536be067fc5effe46ecc7f230ebb496ecd579"}, + {file = "safetensors-0.4.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:87b328ee1591adac332543e1f5fc2c2d7f149b745ebb0d58d7850818ff9cee27"}, + {file = "safetensors-0.4.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b69554c143336256260eceff1d3c0969172a641b54d4668489a711b05f92a2c0"}, + {file = "safetensors-0.4.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3ebf6bcece5d5d1bd6416472f94604d2c834ca752ac60ed42dba7157e595a990"}, + {file = "safetensors-0.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6686ce01b8602d55a7d9903c90d4a6e6f90aeb6ddced7cf4605892d0ba94bcb8"}, + {file = "safetensors-0.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9b8fd6cc2f3bda444a048b541c843c7b7fefc89c4120d7898ea7d5b026e93891"}, + {file = "safetensors-0.4.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8a6abfe67692f81b8bdb99c837f28351c17e624ebf136970c850ee989c720446"}, + {file = "safetensors-0.4.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:27a24ca8822c469ee452db4c13418ba983315a0d863c018a9af15f2305eac38c"}, + {file = "safetensors-0.4.0-cp38-none-win32.whl", hash = "sha256:c4a0a47c8640167792d8261ee21b26430bbc39130a7edaad7f4c0bc05669d00e"}, + {file = "safetensors-0.4.0-cp38-none-win_amd64.whl", hash = "sha256:a738970a367f39249e2abb900d9441a8a86d7ff50083e5eaa6e7760a9f216014"}, + {file = "safetensors-0.4.0-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:806379f37e1abd5d302288c4b2f4186dd7ea7143d4c7811f90a8077f0ae8967b"}, + {file = "safetensors-0.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2b9b94133ed2ae9dda0e95dcace7b7556eba023ffa4c4ae6df8f99377f571d6a"}, + {file = "safetensors-0.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b563a14c43614815a6b524d2e4edeaace50b717f7e7487bb227dd5b68350f5a"}, + {file = "safetensors-0.4.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:00a9b157be660fb7ba88fa2eedd05ec93793a5b61e43e783e10cb0b995372802"}, + {file = "safetensors-0.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c8f194f45ab6aa767993c24f0aeb950af169dbc5d611b94c9021a1d13b8a1a34"}, + {file = "safetensors-0.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:469360b9451db10bfed3881378d5a71b347ecb1ab4f42367d77b8164a13af70b"}, + {file = "safetensors-0.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5f75fa97ccf32a3c7af476c6a0e851023197d3c078f6de3612008fff94735f9"}, + {file = "safetensors-0.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:acf0180283c2efae72f1d8c0a4a7974662091df01be3aa43b5237b1e52ed0a01"}, + {file = "safetensors-0.4.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:cd02b495ba0814619f40bda46771bb06dbbf1d42524b66fa03b2a736c77e4515"}, + {file = "safetensors-0.4.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c42bdea183dbaa99e2f0e6120dc524df79cf4289a6f90f30a534444ef20f49fa"}, + {file = "safetensors-0.4.0-cp39-none-win32.whl", hash = "sha256:cef7bb5d9feae7146c3c3c7b3aef7d2c8b39ba7f5ff4252d368eb69462a47076"}, + {file = "safetensors-0.4.0-cp39-none-win_amd64.whl", hash = "sha256:79dd46fb1f19282fd12f544471efb97823ede927cedbf9cf35550d92b349fdd2"}, + {file = "safetensors-0.4.0-pp310-pypy310_pp73-macosx_10_7_x86_64.whl", hash = "sha256:002301c1afa32909f83745b0c124d002e7ae07e15671f3b43cbebd0ffc5e6037"}, + {file = "safetensors-0.4.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:67762d36ae088c73d4a3c96bfc4ea8d31233554f35b6cace3a18533238d462ea"}, + {file = "safetensors-0.4.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f45230f20a206e5e4c7f7bbf9342178410c6f8b0af889843aa99045a76f7691"}, + {file = "safetensors-0.4.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f2ca939bbd8fb2f4dfa28e39a146dad03bc9325e9fc831b68f7b98f69a5a2f1"}, + {file = "safetensors-0.4.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:61a00f281391fae5ce91df70918bb61c12d2d514a493fd8056e12114be729911"}, + {file = "safetensors-0.4.0-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:435fd136a42492b280cb55126f9ce9535b35dd49df2c5d572a5945455a439448"}, + {file = "safetensors-0.4.0-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f0daa788273d683258fb1e4a5e16bef4486b2fca536451a2591bc0f4a6488895"}, + {file = "safetensors-0.4.0-pp37-pypy37_pp73-macosx_10_7_x86_64.whl", hash = "sha256:0620ab0d41e390ccb1c4ea8f63dc00cb5f0b96a5cdd3cd0d64c21765720c074a"}, + {file = "safetensors-0.4.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bc1fa8d067733cb67f22926689ee808f08afacf7700d2ffb44efae90a0693eb1"}, + {file = "safetensors-0.4.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dcaa40bc363edda145db75cd030f3b1822e5478d550c3500a42502ecef32c959"}, + {file = "safetensors-0.4.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b561fbc044db7beff2ece0ec219a291809d45a38d30c6b38e7cc46482582f4ba"}, + {file = "safetensors-0.4.0-pp37-pypy37_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:79a983b09782dacf9a1adb19bb98f4a8f6c3144108939f572c047b5797e43cf5"}, + {file = "safetensors-0.4.0-pp37-pypy37_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:10b65cd3ad79f5d0daf281523b4146bc271a34bb7430d4e03212e0de8622dab8"}, + {file = "safetensors-0.4.0-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:114decacc475a6a9e2f9102a00c171d113ddb5d35cb0bda0db2c0c82b2eaa9ce"}, + {file = "safetensors-0.4.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:72ddb741dd5fe42521db76a70e012f76995516a12e7e0ef26be03ea9be77802a"}, + {file = "safetensors-0.4.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c5556c2ec75f5a6134866eddd7341cb36062e6edaea343478a279591b63ddba"}, + {file = "safetensors-0.4.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed50f239b0ce7ae85b078395593b4a351ede7e6f73af25f4873e3392336f64c9"}, + {file = "safetensors-0.4.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:495dcaea8fbab70b927d2274e2547824462737acbf98ccd851a71124f779a5c6"}, + {file = "safetensors-0.4.0-pp38-pypy38_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:3f4d90c79a65ba2fe2ff0876f6140748f0a3ce6a21e27a35190f4f96321803f8"}, + {file = "safetensors-0.4.0-pp38-pypy38_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:7a524382b5c55b5fbb168e0e9d3f502450c8cf3fb81b93e880018437c206a482"}, + {file = "safetensors-0.4.0-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:9849ea60c7e840bfdd6030ad454d4a6ba837b3398c902f15a30460dd6961c28c"}, + {file = "safetensors-0.4.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:6c42623ae7045615d9eaa6877b9df1db4e9cc71ecc14bcc721ea1e475dddd595"}, + {file = "safetensors-0.4.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:80cb8342f00f3c41b3b93b1a599b84723280d3ac90829bc62262efc03ab28793"}, + {file = "safetensors-0.4.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8c4f5ed4ede384dea8c99bae76b0718a828dbf7b2c8ced1f44e3b9b1a124475"}, + {file = "safetensors-0.4.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:40d7cf03493bfe75ef62e2c716314474b28d9ba5bf4909763e4b8dd14330c01a"}, + {file = "safetensors-0.4.0-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:232029f0a9fa6fa1f737324eda98a700409811186888536a2333cbbf64e41741"}, + {file = "safetensors-0.4.0-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:9ed55f4a20c78ff3e8477efb63c8303c2152cdfb3bfea4d025a80f54d38fd628"}, + {file = "safetensors-0.4.0.tar.gz", hash = "sha256:b985953c3cf11e942eac4317ef3db3da713e274109cf7cfb6076d877054f013e"}, +] + +[package.extras] +all = ["safetensors[jax]", "safetensors[numpy]", "safetensors[paddlepaddle]", "safetensors[pinned-tf]", "safetensors[quality]", "safetensors[testing]", "safetensors[torch]"] +dev = ["safetensors[all]"] +jax = ["flax (>=0.6.3)", "jax (>=0.3.25)", "jaxlib (>=0.3.25)", "safetensors[numpy]"] +numpy = ["numpy (>=1.21.6)"] +paddlepaddle = ["paddlepaddle (>=2.4.1)", "safetensors[numpy]"] +pinned-tf = ["safetensors[numpy]", "tensorflow (==2.11.0)"] +quality = ["black (==22.3)", "click (==8.0.4)", "flake8 (>=3.8.3)", "isort (>=5.5.4)"] +tensorflow = ["safetensors[numpy]", "tensorflow (>=2.11.0)"] +testing = ["h5py (>=3.7.0)", "huggingface_hub (>=0.12.1)", "hypothesis (>=6.70.2)", "pytest (>=7.2.0)", "pytest-benchmark (>=4.0.0)", "safetensors[numpy]", "setuptools_rust (>=1.5.2)"] +torch = ["safetensors[numpy]", "torch (>=1.10)"] + +[[package]] +name = "sentry-sdk" +version = "1.34.0" +description = "Python client for Sentry (https://sentry.io)" +optional = false +python-versions = "*" +files = [ + {file = "sentry-sdk-1.34.0.tar.gz", hash = "sha256:e5d0d2b25931d88fa10986da59d941ac6037f742ab6ff2fce4143a27981d60c3"}, + {file = "sentry_sdk-1.34.0-py2.py3-none-any.whl", hash = "sha256:76dd087f38062ac6c1e30ed6feb533ee0037ff9e709974802db7b5dbf2e5db21"}, +] + +[package.dependencies] +certifi = "*" +urllib3 = {version = ">=1.26.11", markers = "python_version >= \"3.6\""} + +[package.extras] +aiohttp = ["aiohttp (>=3.5)"] +arq = ["arq (>=0.23)"] +asyncpg = ["asyncpg (>=0.23)"] +beam = ["apache-beam (>=2.12)"] +bottle = ["bottle (>=0.12.13)"] +celery = ["celery (>=3)"] +chalice = ["chalice (>=1.16.0)"] +clickhouse-driver = ["clickhouse-driver (>=0.2.0)"] +django = ["django (>=1.8)"] +falcon = ["falcon (>=1.4)"] +fastapi = ["fastapi (>=0.79.0)"] +flask = ["blinker (>=1.1)", "flask (>=0.11)", "markupsafe"] +grpcio = ["grpcio (>=1.21.1)"] +httpx = ["httpx (>=0.16.0)"] +huey = ["huey (>=2)"] +loguru = ["loguru (>=0.5)"] +opentelemetry = ["opentelemetry-distro (>=0.35b0)"] +opentelemetry-experimental = ["opentelemetry-distro (>=0.40b0,<1.0)", "opentelemetry-instrumentation-aiohttp-client (>=0.40b0,<1.0)", "opentelemetry-instrumentation-django (>=0.40b0,<1.0)", "opentelemetry-instrumentation-fastapi (>=0.40b0,<1.0)", "opentelemetry-instrumentation-flask (>=0.40b0,<1.0)", "opentelemetry-instrumentation-requests (>=0.40b0,<1.0)", "opentelemetry-instrumentation-sqlite3 (>=0.40b0,<1.0)", "opentelemetry-instrumentation-urllib (>=0.40b0,<1.0)"] +pure-eval = ["asttokens", "executing", "pure-eval"] +pymongo = ["pymongo (>=3.1)"] +pyspark = ["pyspark (>=2.4.4)"] +quart = ["blinker (>=1.1)", "quart (>=0.16.1)"] +rq = ["rq (>=0.6)"] +sanic = ["sanic (>=0.8)"] +sqlalchemy = ["sqlalchemy (>=1.2)"] +starlette = ["starlette (>=0.19.1)"] +starlite = ["starlite (>=1.48)"] +tornado = ["tornado (>=5)"] + +[[package]] +name = "setproctitle" +version = "1.3.3" +description = "A Python module to customize the process title" +optional = false +python-versions = ">=3.7" +files = [ + {file = "setproctitle-1.3.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:897a73208da48db41e687225f355ce993167079eda1260ba5e13c4e53be7f754"}, + {file = "setproctitle-1.3.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8c331e91a14ba4076f88c29c777ad6b58639530ed5b24b5564b5ed2fd7a95452"}, + {file = "setproctitle-1.3.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bbbd6c7de0771c84b4aa30e70b409565eb1fc13627a723ca6be774ed6b9d9fa3"}, + {file = "setproctitle-1.3.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c05ac48ef16ee013b8a326c63e4610e2430dbec037ec5c5b58fcced550382b74"}, + {file = "setproctitle-1.3.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1342f4fdb37f89d3e3c1c0a59d6ddbedbde838fff5c51178a7982993d238fe4f"}, + {file = "setproctitle-1.3.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc74e84fdfa96821580fb5e9c0b0777c1c4779434ce16d3d62a9c4d8c710df39"}, + {file = "setproctitle-1.3.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9617b676b95adb412bb69645d5b077d664b6882bb0d37bfdafbbb1b999568d85"}, + {file = "setproctitle-1.3.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6a249415f5bb88b5e9e8c4db47f609e0bf0e20a75e8d744ea787f3092ba1f2d0"}, + {file = "setproctitle-1.3.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:38da436a0aaace9add67b999eb6abe4b84397edf4a78ec28f264e5b4c9d53cd5"}, + {file = "setproctitle-1.3.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:da0d57edd4c95bf221b2ebbaa061e65b1788f1544977288bdf95831b6e44e44d"}, + {file = "setproctitle-1.3.3-cp310-cp310-win32.whl", hash = "sha256:a1fcac43918b836ace25f69b1dca8c9395253ad8152b625064415b1d2f9be4fb"}, + {file = "setproctitle-1.3.3-cp310-cp310-win_amd64.whl", hash = "sha256:200620c3b15388d7f3f97e0ae26599c0c378fdf07ae9ac5a13616e933cbd2086"}, + {file = "setproctitle-1.3.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:334f7ed39895d692f753a443102dd5fed180c571eb6a48b2a5b7f5b3564908c8"}, + {file = "setproctitle-1.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:950f6476d56ff7817a8fed4ab207727fc5260af83481b2a4b125f32844df513a"}, + {file = "setproctitle-1.3.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:195c961f54a09eb2acabbfc90c413955cf16c6e2f8caa2adbf2237d1019c7dd8"}, + {file = "setproctitle-1.3.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f05e66746bf9fe6a3397ec246fe481096664a9c97eb3fea6004735a4daf867fd"}, + {file = "setproctitle-1.3.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b5901a31012a40ec913265b64e48c2a4059278d9f4e6be628441482dd13fb8b5"}, + {file = "setproctitle-1.3.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64286f8a995f2cd934082b398fc63fca7d5ffe31f0e27e75b3ca6b4efda4e353"}, + {file = "setproctitle-1.3.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:184239903bbc6b813b1a8fc86394dc6ca7d20e2ebe6f69f716bec301e4b0199d"}, + {file = "setproctitle-1.3.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:664698ae0013f986118064b6676d7dcd28fefd0d7d5a5ae9497cbc10cba48fa5"}, + {file = "setproctitle-1.3.3-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e5119a211c2e98ff18b9908ba62a3bd0e3fabb02a29277a7232a6fb4b2560aa0"}, + {file = "setproctitle-1.3.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:417de6b2e214e837827067048f61841f5d7fc27926f2e43954567094051aff18"}, + {file = "setproctitle-1.3.3-cp311-cp311-win32.whl", hash = "sha256:6a143b31d758296dc2f440175f6c8e0b5301ced3b0f477b84ca43cdcf7f2f476"}, + {file = "setproctitle-1.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:a680d62c399fa4b44899094027ec9a1bdaf6f31c650e44183b50d4c4d0ccc085"}, + {file = "setproctitle-1.3.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:d4460795a8a7a391e3567b902ec5bdf6c60a47d791c3b1d27080fc203d11c9dc"}, + {file = "setproctitle-1.3.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:bdfd7254745bb737ca1384dee57e6523651892f0ea2a7344490e9caefcc35e64"}, + {file = "setproctitle-1.3.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:477d3da48e216d7fc04bddab67b0dcde633e19f484a146fd2a34bb0e9dbb4a1e"}, + {file = "setproctitle-1.3.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ab2900d111e93aff5df9fddc64cf51ca4ef2c9f98702ce26524f1acc5a786ae7"}, + {file = "setproctitle-1.3.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:088b9efc62d5aa5d6edf6cba1cf0c81f4488b5ce1c0342a8b67ae39d64001120"}, + {file = "setproctitle-1.3.3-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a6d50252377db62d6a0bb82cc898089916457f2db2041e1d03ce7fadd4a07381"}, + {file = "setproctitle-1.3.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:87e668f9561fd3a457ba189edfc9e37709261287b52293c115ae3487a24b92f6"}, + {file = "setproctitle-1.3.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:287490eb90e7a0ddd22e74c89a92cc922389daa95babc833c08cf80c84c4df0a"}, + {file = "setproctitle-1.3.3-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:4fe1c49486109f72d502f8be569972e27f385fe632bd8895f4730df3c87d5ac8"}, + {file = "setproctitle-1.3.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4a6ba2494a6449b1f477bd3e67935c2b7b0274f2f6dcd0f7c6aceae10c6c6ba3"}, + {file = "setproctitle-1.3.3-cp312-cp312-win32.whl", hash = "sha256:2df2b67e4b1d7498632e18c56722851ba4db5d6a0c91aaf0fd395111e51cdcf4"}, + {file = "setproctitle-1.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:f38d48abc121263f3b62943f84cbaede05749047e428409c2c199664feb6abc7"}, + {file = "setproctitle-1.3.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:816330675e3504ae4d9a2185c46b573105d2310c20b19ea2b4596a9460a4f674"}, + {file = "setproctitle-1.3.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68f960bc22d8d8e4ac886d1e2e21ccbd283adcf3c43136161c1ba0fa509088e0"}, + {file = "setproctitle-1.3.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:00e6e7adff74796ef12753ff399491b8827f84f6c77659d71bd0b35870a17d8f"}, + {file = "setproctitle-1.3.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:53bc0d2358507596c22b02db079618451f3bd720755d88e3cccd840bafb4c41c"}, + {file = "setproctitle-1.3.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad6d20f9541f5f6ac63df553b6d7a04f313947f550eab6a61aa758b45f0d5657"}, + {file = "setproctitle-1.3.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c1c84beab776b0becaa368254801e57692ed749d935469ac10e2b9b825dbdd8e"}, + {file = "setproctitle-1.3.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:507e8dc2891021350eaea40a44ddd887c9f006e6b599af8d64a505c0f718f170"}, + {file = "setproctitle-1.3.3-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:b1067647ac7aba0b44b591936118a22847bda3c507b0a42d74272256a7a798e9"}, + {file = "setproctitle-1.3.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2e71f6365744bf53714e8bd2522b3c9c1d83f52ffa6324bd7cbb4da707312cd8"}, + {file = "setproctitle-1.3.3-cp37-cp37m-win32.whl", hash = "sha256:7f1d36a1e15a46e8ede4e953abb104fdbc0845a266ec0e99cc0492a4364f8c44"}, + {file = "setproctitle-1.3.3-cp37-cp37m-win_amd64.whl", hash = "sha256:c9a402881ec269d0cc9c354b149fc29f9ec1a1939a777f1c858cdb09c7a261df"}, + {file = "setproctitle-1.3.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ff814dea1e5c492a4980e3e7d094286077054e7ea116cbeda138819db194b2cd"}, + {file = "setproctitle-1.3.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:accb66d7b3ccb00d5cd11d8c6e07055a4568a24c95cf86109894dcc0c134cc89"}, + {file = "setproctitle-1.3.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:554eae5a5b28f02705b83a230e9d163d645c9a08914c0ad921df363a07cf39b1"}, + {file = "setproctitle-1.3.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a911b26264dbe9e8066c7531c0591cfab27b464459c74385b276fe487ca91c12"}, + {file = "setproctitle-1.3.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2982efe7640c4835f7355fdb4da313ad37fb3b40f5c69069912f8048f77b28c8"}, + {file = "setproctitle-1.3.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:df3f4274b80709d8bcab2f9a862973d453b308b97a0b423a501bcd93582852e3"}, + {file = "setproctitle-1.3.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:af2c67ae4c795d1674a8d3ac1988676fa306bcfa1e23fddb5e0bd5f5635309ca"}, + {file = "setproctitle-1.3.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:af4061f67fd7ec01624c5e3c21f6b7af2ef0e6bab7fbb43f209e6506c9ce0092"}, + {file = "setproctitle-1.3.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:37a62cbe16d4c6294e84670b59cf7adcc73faafe6af07f8cb9adaf1f0e775b19"}, + {file = "setproctitle-1.3.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:a83ca086fbb017f0d87f240a8f9bbcf0809f3b754ee01cec928fff926542c450"}, + {file = "setproctitle-1.3.3-cp38-cp38-win32.whl", hash = "sha256:059f4ce86f8cc92e5860abfc43a1dceb21137b26a02373618d88f6b4b86ba9b2"}, + {file = "setproctitle-1.3.3-cp38-cp38-win_amd64.whl", hash = "sha256:ab92e51cd4a218208efee4c6d37db7368fdf182f6e7ff148fb295ecddf264287"}, + {file = "setproctitle-1.3.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c7951820b77abe03d88b114b998867c0f99da03859e5ab2623d94690848d3e45"}, + {file = "setproctitle-1.3.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5bc94cf128676e8fac6503b37763adb378e2b6be1249d207630f83fc325d9b11"}, + {file = "setproctitle-1.3.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f5d9027eeda64d353cf21a3ceb74bb1760bd534526c9214e19f052424b37e42"}, + {file = "setproctitle-1.3.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2e4a8104db15d3462e29d9946f26bed817a5b1d7a47eabca2d9dc2b995991503"}, + {file = "setproctitle-1.3.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c32c41ace41f344d317399efff4cffb133e709cec2ef09c99e7a13e9f3b9483c"}, + {file = "setproctitle-1.3.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cbf16381c7bf7f963b58fb4daaa65684e10966ee14d26f5cc90f07049bfd8c1e"}, + {file = "setproctitle-1.3.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:e18b7bd0898398cc97ce2dfc83bb192a13a087ef6b2d5a8a36460311cb09e775"}, + {file = "setproctitle-1.3.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:69d565d20efe527bd8a9b92e7f299ae5e73b6c0470f3719bd66f3cd821e0d5bd"}, + {file = "setproctitle-1.3.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:ddedd300cd690a3b06e7eac90ed4452348b1348635777ce23d460d913b5b63c3"}, + {file = "setproctitle-1.3.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:415bfcfd01d1fbf5cbd75004599ef167a533395955305f42220a585f64036081"}, + {file = "setproctitle-1.3.3-cp39-cp39-win32.whl", hash = "sha256:21112fcd2195d48f25760f0eafa7a76510871bbb3b750219310cf88b04456ae3"}, + {file = "setproctitle-1.3.3-cp39-cp39-win_amd64.whl", hash = "sha256:5a740f05d0968a5a17da3d676ce6afefebeeeb5ce137510901bf6306ba8ee002"}, + {file = "setproctitle-1.3.3-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6b9e62ddb3db4b5205c0321dd69a406d8af9ee1693529d144e86bd43bcb4b6c0"}, + {file = "setproctitle-1.3.3-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e3b99b338598de0bd6b2643bf8c343cf5ff70db3627af3ca427a5e1a1a90dd9"}, + {file = "setproctitle-1.3.3-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38ae9a02766dad331deb06855fb7a6ca15daea333b3967e214de12cfae8f0ef5"}, + {file = "setproctitle-1.3.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:200ede6fd11233085ba9b764eb055a2a191fb4ffb950c68675ac53c874c22e20"}, + {file = "setproctitle-1.3.3-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0d3a953c50776751e80fe755a380a64cb14d61e8762bd43041ab3f8cc436092f"}, + {file = "setproctitle-1.3.3-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5e08e232b78ba3ac6bc0d23ce9e2bee8fad2be391b7e2da834fc9a45129eb87"}, + {file = "setproctitle-1.3.3-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1da82c3e11284da4fcbf54957dafbf0655d2389cd3d54e4eaba636faf6d117a"}, + {file = "setproctitle-1.3.3-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:aeaa71fb9568ebe9b911ddb490c644fbd2006e8c940f21cb9a1e9425bd709574"}, + {file = "setproctitle-1.3.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:59335d000c6250c35989394661eb6287187854e94ac79ea22315469ee4f4c244"}, + {file = "setproctitle-1.3.3-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c3ba57029c9c50ecaf0c92bb127224cc2ea9fda057b5d99d3f348c9ec2855ad3"}, + {file = "setproctitle-1.3.3-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d876d355c53d975c2ef9c4f2487c8f83dad6aeaaee1b6571453cb0ee992f55f6"}, + {file = "setproctitle-1.3.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:224602f0939e6fb9d5dd881be1229d485f3257b540f8a900d4271a2c2aa4e5f4"}, + {file = "setproctitle-1.3.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d7f27e0268af2d7503386e0e6be87fb9b6657afd96f5726b733837121146750d"}, + {file = "setproctitle-1.3.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f5e7266498cd31a4572378c61920af9f6b4676a73c299fce8ba93afd694f8ae7"}, + {file = "setproctitle-1.3.3-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33c5609ad51cd99d388e55651b19148ea99727516132fb44680e1f28dd0d1de9"}, + {file = "setproctitle-1.3.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:eae8988e78192fd1a3245a6f4f382390b61bce6cfcc93f3809726e4c885fa68d"}, + {file = "setproctitle-1.3.3.tar.gz", hash = "sha256:c913e151e7ea01567837ff037a23ca8740192880198b7fbb90b16d181607caae"}, +] + +[package.extras] +test = ["pytest"] + +[[package]] +name = "setuptools" +version = "68.2.2" +description = "Easily download, build, install, upgrade, and uninstall Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "setuptools-68.2.2-py3-none-any.whl", hash = "sha256:b454a35605876da60632df1a60f736524eb73cc47bbc9f3f1ef1b644de74fd2a"}, + {file = "setuptools-68.2.2.tar.gz", hash = "sha256:4ac1475276d2f1c48684874089fefcd83bd7162ddaafb81fac866ba0db282a87"}, +] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.1)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] + +[[package]] +name = "shortuuid" +version = "1.0.11" +description = "A generator library for concise, unambiguous and URL-safe UUIDs." +optional = false +python-versions = ">=3.5" +files = [ + {file = "shortuuid-1.0.11-py3-none-any.whl", hash = "sha256:27ea8f28b1bd0bf8f15057a3ece57275d2059d2b0bb02854f02189962c13b6aa"}, + {file = "shortuuid-1.0.11.tar.gz", hash = "sha256:fc75f2615914815a8e4cb1501b3a513745cb66ef0fd5fc6fb9f8c3fa3481f789"}, +] + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] + +[[package]] +name = "smmap" +version = "5.0.1" +description = "A pure Python implementation of a sliding window memory map manager" +optional = false +python-versions = ">=3.7" +files = [ + {file = "smmap-5.0.1-py3-none-any.whl", hash = "sha256:e6d8668fa5f93e706934a62d7b4db19c8d9eb8cf2adbb75ef1b675aa332b69da"}, + {file = "smmap-5.0.1.tar.gz", hash = "sha256:dceeb6c0028fdb6734471eb07c0cd2aae706ccaecab45965ee83f11c8d3b1f62"}, +] + +[[package]] +name = "stack-data" +version = "0.6.3" +description = "Extract data from python stack frames and tracebacks for informative displays" +optional = false +python-versions = "*" +files = [ + {file = "stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695"}, + {file = "stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9"}, +] + +[package.dependencies] +asttokens = ">=2.1.0" +executing = ">=1.2.0" +pure-eval = "*" + +[package.extras] +tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] + +[[package]] +name = "sympy" +version = "1.12" +description = "Computer algebra system (CAS) in Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "sympy-1.12-py3-none-any.whl", hash = "sha256:c3588cd4295d0c0f603d0f2ae780587e64e2efeedb3521e46b9bb1d08d184fa5"}, + {file = "sympy-1.12.tar.gz", hash = "sha256:ebf595c8dac3e0fdc4152c51878b498396ec7f30e7a914d6071e674d49420fb8"}, +] + +[package.dependencies] +mpmath = ">=0.19" + +[[package]] +name = "tokenizers" +version = "0.14.1" +description = "" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tokenizers-0.14.1-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:04ec1134a18ede355a05641cdc7700f17280e01f69f2f315769f02f7e295cf1e"}, + {file = "tokenizers-0.14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:638abedb39375f0ddce2de536fc9c976639b2d1b7202d715c2e7a25f0ebfd091"}, + {file = "tokenizers-0.14.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:901635098565773a44f74068639d265f19deaaca47ea77b428fd9bee13a61d87"}, + {file = "tokenizers-0.14.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:72e95184bf5b9a4c08153ed07c16c130ff174835c9a1e6ee2b311be758c8b3ef"}, + {file = "tokenizers-0.14.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ebefbc26ccff5e96ae7d40772172e7310174f9aa3683d2870a1882313ec3a4d5"}, + {file = "tokenizers-0.14.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d3a6330c9f1deda22873e8b4ac849cc06d3ff33d60b3217ac0bb397b541e1509"}, + {file = "tokenizers-0.14.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6cba7483ba45600346a35c466bde32327b108575022f73c35a0f7170b5a71ae2"}, + {file = "tokenizers-0.14.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:60fec380778d75cbb492f14ca974f11f37b41d53c057b9c8ba213315b86e1f84"}, + {file = "tokenizers-0.14.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:930c19b699dd7e1077eac98967adc2fe5f0b104bd96cc1f26778ab82b31ceb24"}, + {file = "tokenizers-0.14.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a1e30a13376db5329570e09b14c8eb36c017909ed7e88591ca3aa81f3c7d6f32"}, + {file = "tokenizers-0.14.1-cp310-none-win32.whl", hash = "sha256:370b5b86da9bddbe65fa08711f0e8ffdf8b0036558178d1a31dfcb44efcde72a"}, + {file = "tokenizers-0.14.1-cp310-none-win_amd64.whl", hash = "sha256:c2c659f2106b6d154f118ad1b700e68148c46c59b720f04867b1fc5f26a85060"}, + {file = "tokenizers-0.14.1-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:00df4c5bf25c153b432b98689609b426ae701a44f3d8074dcb619f410bc2a870"}, + {file = "tokenizers-0.14.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fee553657dcdb7e73df8823c49e8611457ba46e9d7026b7e9c44820c08c327c3"}, + {file = "tokenizers-0.14.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:a480bd902e327dfcaa52b7dd14fdc71e7aa45d73a3d6e41e028a75891d2823cf"}, + {file = "tokenizers-0.14.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e448b2be0430ab839cf7954715c39d6f34ff6cf2b49393f336283b7a59f485af"}, + {file = "tokenizers-0.14.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c11444984aecd342f0cf160c3320288edeb1763871fbb560ed466654b2a7016c"}, + {file = "tokenizers-0.14.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bfe164a1c72c6be3c5c26753c6c412f81412f4dae0d7d06371e0b396a9cc0fc9"}, + {file = "tokenizers-0.14.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:72d9967fb1f927542cfb5347207fde01b29f25c9bb8cbc7ced280decfa015983"}, + {file = "tokenizers-0.14.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37cc955c84ec67c2d11183d372044399342b20a1fa447b7a33040f4889bba318"}, + {file = "tokenizers-0.14.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:db96cf092d86d4cb543daa9148e299011e0a40770380bb78333b9fd700586fcb"}, + {file = "tokenizers-0.14.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c84d3cb1349936c2b96ca6175b50f5a9518170bffd76464219ee0ea6022a64a7"}, + {file = "tokenizers-0.14.1-cp311-none-win32.whl", hash = "sha256:8db3a6f3d430ac3dc3793c53fa8e5e665c23ba359484d365a191027ad8b65a30"}, + {file = "tokenizers-0.14.1-cp311-none-win_amd64.whl", hash = "sha256:c65d76052561c60e17cb4fa289885ed00a9995d59e97019fac2138bd45142057"}, + {file = "tokenizers-0.14.1-cp312-cp312-macosx_10_7_x86_64.whl", hash = "sha256:c375161b588982be381c43eb7158c250f430793d0f708ce379a0f196164c6778"}, + {file = "tokenizers-0.14.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:50f03d2330a153a9114c2429061137bd323736059f384de8348d7cb1ca1baa15"}, + {file = "tokenizers-0.14.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0c8ee283b249c3c3c201c41bc23adc3be2514ae4121eacdb5c5250a461eaa8c6"}, + {file = "tokenizers-0.14.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9f27399b8d50c5d3f08f0aae961bcc66a1dead1cd0ae9401e4c2a43a623322a"}, + {file = "tokenizers-0.14.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:89cbeec7e9d5d8773ec4779c64e3cbcbff53d234ca6ad7b1a3736588003bba48"}, + {file = "tokenizers-0.14.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:08e55920b453c30b46d58accc68a38e8e7488d0c03babfdb29c55d3f39dd2052"}, + {file = "tokenizers-0.14.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:91d32bd1056c0e83a0f90e4ffa213c25096b2d8b9f0e2d172a45f138c7d8c081"}, + {file = "tokenizers-0.14.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:44f1748035c36c939848c935715bde41734d9249ab7b844ff9bfbe984be8952c"}, + {file = "tokenizers-0.14.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1ff516d129f01bb7a4aa95bc6aae88e4d86dd63bfc2d57db9302c2624d1be7cb"}, + {file = "tokenizers-0.14.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:acfc8db61c6e919d932448cc7985b85e330c8d745528e12fce6e62d40d268bce"}, + {file = "tokenizers-0.14.1-cp37-cp37m-macosx_10_7_x86_64.whl", hash = "sha256:ba336bc9107acbc1da2ad30967df7b2db93448ca66538ad86aa1fbb91116f631"}, + {file = "tokenizers-0.14.1-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:f77371b5030e53f8bf92197640af437539e3bba1bc8342b97888c8e26567bfdc"}, + {file = "tokenizers-0.14.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:d72d25c57a9c814240802d188ff0a808b701e2dd2bf1c64721c7088ceeeb1ed7"}, + {file = "tokenizers-0.14.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:caf0df8657277e32671aa8a4d3cc05f2050ab19d9b49447f2265304168e9032c"}, + {file = "tokenizers-0.14.1-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:cb3c6bc6e599e46a26ad559ad5dec260ffdf705663cc9b894033d64a69314e86"}, + {file = "tokenizers-0.14.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f8cf2fcdc2368df4317e05571e33810eeed24cd594acc9dfc9788b21dac6b3a8"}, + {file = "tokenizers-0.14.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f475d5eda41d2ed51ca775a07c80529a923dd759fcff7abf03ccdd83d9f7564e"}, + {file = "tokenizers-0.14.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cce4d1a97a7eb2253b5d3f29f4a478d8c37ba0303ea34024eb9e65506d4209f8"}, + {file = "tokenizers-0.14.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ff66577ae55114f7d0f6aa0d4d335f27cae96bf245962a745b718ec887bbe7eb"}, + {file = "tokenizers-0.14.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:a687099e085f5162e5b88b3402adb6c2b41046180c015c5075c9504440b6e971"}, + {file = "tokenizers-0.14.1-cp37-none-win32.whl", hash = "sha256:49f5336b82e315a33bef1025d247ca08d95719715b29e33f0e9e8cf15ff1dfb6"}, + {file = "tokenizers-0.14.1-cp37-none-win_amd64.whl", hash = "sha256:117c8da60d1bd95a6df2692926f36de7971baa1d89ff702fae47b6689a4465ad"}, + {file = "tokenizers-0.14.1-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:01d2bd5935642de22a6c6778bb2307f9949cd6eaeeb5c77f9b98f0060b69f0db"}, + {file = "tokenizers-0.14.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b05ec04132394c20bd6bcb692d557a8eb8ab1bac1646d28e49c67c00907d17c8"}, + {file = "tokenizers-0.14.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:7d9025b185465d9d18679406f6f394850347d5ed2681efc203539d800f36f459"}, + {file = "tokenizers-0.14.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2539831838ab5393f78a893d7bbf27d5c36e43baf77e91dc9992922b2b97e09d"}, + {file = "tokenizers-0.14.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ec8f46d533092d8e20bc742c47918cbe24b8641dbfbbcb83177c5de3c9d4decb"}, + {file = "tokenizers-0.14.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8b019c4810903fdea3b230f358b9d27377c0f38454778b607676c9e1b57d14b7"}, + {file = "tokenizers-0.14.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e8984114fd83ed3913d89526c992395920930c9620a2feee61faf035f41d7b9a"}, + {file = "tokenizers-0.14.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11284b32f0036fe7ef4b8b00201dda79c00f3fcea173bc0e5c599e09c937ab0f"}, + {file = "tokenizers-0.14.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:53614f44f36917282a583180e402105bc63d61d1aca067d51cb7f051eb489901"}, + {file = "tokenizers-0.14.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e3b6082e9532309727273443c8943bb9558d52e36788b246aa278bda7c642116"}, + {file = "tokenizers-0.14.1-cp38-none-win32.whl", hash = "sha256:7560fca3e17a6bc876d20cd825d7721c101fa2b1cd0bfa0abf9a2e781e49b37b"}, + {file = "tokenizers-0.14.1-cp38-none-win_amd64.whl", hash = "sha256:c318a5acb429ca38f632577754235140bbb8c5a27faca1c51b43fbf575596e34"}, + {file = "tokenizers-0.14.1-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:b886e0f5c72aa4249c609c24b9610a9ca83fd963cbb5066b19302723ea505279"}, + {file = "tokenizers-0.14.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f522f28c88a0d5b2f9e895cf405dd594cd518e99d61905406aec74d30eb6383b"}, + {file = "tokenizers-0.14.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5bef76c4d9329913cef2fe79ce1f4dab98f77fa4887e5f0420ffc9386941de32"}, + {file = "tokenizers-0.14.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59c7df2103052b30b7c76d4fa8251326c9f82689578a912698a127dc1737f43e"}, + {file = "tokenizers-0.14.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:232445e7b85255ccfe68dfd42185db8a3f3349b34ad7068404856c4a5f67c355"}, + {file = "tokenizers-0.14.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8e63781da85aa8948864970e529af10abc4084a990d30850c41bbdb5f83eee45"}, + {file = "tokenizers-0.14.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5760a831c0f3c6d3229b50ef3fafa4c164ec99d7e8c2237fe144e67a9d33b120"}, + {file = "tokenizers-0.14.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c84b456ff8525ec3ff09762e32ccc27888d036dcd0ba2883e1db491e164dd725"}, + {file = "tokenizers-0.14.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:463ee5f3afbfec29cbf5652752c9d1032bdad63daf48bb8cb9970064cc81d5f9"}, + {file = "tokenizers-0.14.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ee6b63aecf929a7bcf885bdc8a8aec96c43bc4442f63fe8c6d48f24fc992b05b"}, + {file = "tokenizers-0.14.1-cp39-none-win32.whl", hash = "sha256:aae42798ba1da3bc1572b2048fe42e61dd6bacced2b424cb0f5572c5432f79c2"}, + {file = "tokenizers-0.14.1-cp39-none-win_amd64.whl", hash = "sha256:68c4699147dded6926a3d2c2f948d435d54d027f69909e0ef3c6587933723ed2"}, + {file = "tokenizers-0.14.1-pp310-pypy310_pp73-macosx_10_7_x86_64.whl", hash = "sha256:5f9afdcf701a1aa3c41e0e748c152d2162434d61639a1e5d8523ecf60ae35aea"}, + {file = "tokenizers-0.14.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:6859d81243cd09854be9054aca3ecab14a2dee5b3c9f6d7ef12061d478ca0c57"}, + {file = "tokenizers-0.14.1-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:7975178f9478ccedcf613332d5d6f37b67c74ef4e2e47e0c965597506b921f04"}, + {file = "tokenizers-0.14.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ce2f0ff2e5f12ac5bebaa690606395725239265d7ffa35f35c243a379316297"}, + {file = "tokenizers-0.14.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c7cfc3d42e81cda802f93aa9e92caf79feaa1711426e28ce620560b8aaf5e4d"}, + {file = "tokenizers-0.14.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:67d3adff654dc7f7c7091dd259b3b847fe119c08d0bda61db91e2ea2b61c38c0"}, + {file = "tokenizers-0.14.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:956729b7dd599020e57133fb95b777e4f81ee069ff0a70e80f6eeac82658972f"}, + {file = "tokenizers-0.14.1-pp37-pypy37_pp73-macosx_10_7_x86_64.whl", hash = "sha256:fe2ea1177146a7ab345ab61e90a490eeea25d5f063e1cb9d4eb1425b169b64d7"}, + {file = "tokenizers-0.14.1-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9930f31f603ecc6ea54d5c6dfa299f926ab3e921f72f94babcb02598c32b57c6"}, + {file = "tokenizers-0.14.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d49567a2754e9991c05c2b5a7e6650b56e24365b7cab504558e58033dcf0edc4"}, + {file = "tokenizers-0.14.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3678be5db330726f19c1949d8ae1b845a02eeb2a2e1d5a8bb8eaa82087ae25c1"}, + {file = "tokenizers-0.14.1-pp37-pypy37_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:42b180ed1bec58ab9bdc65d406577e0c0fb7241b74b8c032846073c7743c9f86"}, + {file = "tokenizers-0.14.1-pp37-pypy37_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:319e4367596fb0d52be645b3de1616faf0fadaf28507ce1c7595bebd9b4c402c"}, + {file = "tokenizers-0.14.1-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:2cda65b689aec63b7c76a77f43a08044fa90bbc6ad9849267cedfee9795913f3"}, + {file = "tokenizers-0.14.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:ca0bfc79b27d84fcb7fa09339b2ee39077896738d9a30ff99c0332376e985072"}, + {file = "tokenizers-0.14.1-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:a7093767e070269e22e2c5f845e46510304f124c32d2cd249633c0f27eb29d86"}, + {file = "tokenizers-0.14.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad759ba39cd32c2c2247864d02c84ea5883b5f6cc6a4ee0c95602a3dde52268f"}, + {file = "tokenizers-0.14.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26fee36a6d8f2bd9464f3566b95e3e3fb7fd7dad723f775c500aac8204ec98c6"}, + {file = "tokenizers-0.14.1-pp38-pypy38_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:d091c62cb7abbd32e527a85c41f7c8eb4526a926251891fc4ecbe5f974142ffb"}, + {file = "tokenizers-0.14.1-pp38-pypy38_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:ca304402ea66d58f99c05aa3d7a6052faea61e5a8313b94f6bc36fbf27960e2d"}, + {file = "tokenizers-0.14.1-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:102f118fa9b720b93c3217c1e239ed7bc1ae1e8dbfe9b4983a4f2d7b4ce6f2ec"}, + {file = "tokenizers-0.14.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:df4f058e96e8b467b7742e5dba7564255cd482d3c1e6cf81f8cb683bb0433340"}, + {file = "tokenizers-0.14.1-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:040ee44efc1806900de72b13c1c3036154077d9cde189c9a7e7a50bbbdcbf39f"}, + {file = "tokenizers-0.14.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7618b84118ae704f7fa23c4a190bd80fc605671841a4427d5ca14b9b8d9ec1a3"}, + {file = "tokenizers-0.14.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ecdfe9736c4a73343f629586016a137a10faed1a29c6dc699d8ab20c2d3cf64"}, + {file = "tokenizers-0.14.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:92c34de04fec7f4ff95f7667d4eb085c4e4db46c31ef44c3d35c38df128430da"}, + {file = "tokenizers-0.14.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:628b654ba555b2ba9111c0936d558b14bfc9d5f57b8c323b02fc846036b38b2f"}, + {file = "tokenizers-0.14.1.tar.gz", hash = "sha256:ea3b3f8908a9a5b9d6fc632b5f012ece7240031c44c6d4764809f33736534166"}, +] + +[package.dependencies] +huggingface_hub = ">=0.16.4,<0.18" + +[package.extras] +dev = ["tokenizers[testing]"] +docs = ["setuptools_rust", "sphinx", "sphinx_rtd_theme"] +testing = ["black (==22.3)", "datasets", "numpy", "pytest", "requests"] + +[[package]] +name = "torch" +version = "2.1.0+cu118" +description = "Tensors and Dynamic neural networks in Python with strong GPU acceleration" +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "torch-2.1.0+cu118-cp310-cp310-linux_x86_64.whl", hash = "sha256:a81b554184492005543ddc32e96469f9369d778dedd195d73bda9bed407d6589"}, + {file = "torch-2.1.0+cu118-cp310-cp310-win_amd64.whl", hash = "sha256:eb512249df3083bce7bd3d89d9d1289fa82fe807e714a02b754e66971d358da3"}, + {file = "torch-2.1.0+cu118-cp311-cp311-linux_x86_64.whl", hash = "sha256:bcb17e2de6ca634d326203694d0bfb552587335e536c1917be3f28c5664b5506"}, + {file = "torch-2.1.0+cu118-cp311-cp311-win_amd64.whl", hash = "sha256:e200aba94307b7a2926f36274b92d76391f36694a1c0ca0e2c341db1fa4eca99"}, + {file = "torch-2.1.0+cu118-cp38-cp38-linux_x86_64.whl", hash = "sha256:02cd2c312501ebd9faf65bedb48ffbff77312ffef04cf7125ed4caa1738fd8df"}, + {file = "torch-2.1.0+cu118-cp38-cp38-win_amd64.whl", hash = "sha256:92bbfcd15b6a34d3b404d4156629ba9ce9e1299924bac18ed6cfbab41c80eee1"}, + {file = "torch-2.1.0+cu118-cp39-cp39-linux_x86_64.whl", hash = "sha256:8ecf52ba49cfd3b7303d4e57e7b5c2106b77dbc9bdeaf880870162138bc70e18"}, + {file = "torch-2.1.0+cu118-cp39-cp39-win_amd64.whl", hash = "sha256:9ac895a48dfb3fd0fc0693fa9170d01631f5379706ef44843bd72b84dbfc3d33"}, +] + +[package.dependencies] +filelock = "*" +fsspec = "*" +jinja2 = "*" +networkx = "*" +sympy = "*" +triton = "2.1.0" +typing-extensions = "*" + +[package.extras] +dynamo = ["jinja2"] +opt-einsum = ["opt-einsum (>=3.3)"] + +[package.source] +type = "legacy" +url = "https://download.pytorch.org/whl/cu118" +reference = "pytorch" + +[[package]] +name = "torchinfo" +version = "1.8.0" +description = "Model summary in PyTorch, based off of the original torchsummary." +optional = false +python-versions = ">=3.7" +files = [ + {file = "torchinfo-1.8.0-py3-none-any.whl", hash = "sha256:2e911c2918603f945c26ff21a3a838d12709223dc4ccf243407bce8b6e897b46"}, + {file = "torchinfo-1.8.0.tar.gz", hash = "sha256:72e94b0e9a3e64dc583a8e5b7940b8938a1ac0f033f795457f27e6f4e7afa2e9"}, +] + +[[package]] +name = "torchvision" +version = "0.16.0" +description = "image and video datasets and models for torch deep learning" +optional = false +python-versions = ">=3.8" +files = [ + {file = "torchvision-0.16.0-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:16c300fdbbe91469f5e9feef8d24c6acabd8849db502a06160dd76ba68e897a0"}, + {file = "torchvision-0.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ef5dec6c48b715353781b83749efcdea03835720a71b377684453ee117aab3c7"}, + {file = "torchvision-0.16.0-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:9e3a2012e463f498de21f6598cc7a266b9a8c6fe15788472fdc419233ea6f3f2"}, + {file = "torchvision-0.16.0-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:e4327e082b703921ae52caeee4f7839f7e6c73cfc5eedea468ecb5c1487ecdbf"}, + {file = "torchvision-0.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:62f01513687cce3480df8928fcc6c09b4aa0433d05ac75e82877acc773f6a568"}, + {file = "torchvision-0.16.0-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:31fdf289bdfb2976f65a14f79f6ddd1ee60113db34622674918e61521c2dc41f"}, + {file = "torchvision-0.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2294a6514a31a6fda562288b28cf6db57877237f4b56ff693262f237a7ed4035"}, + {file = "torchvision-0.16.0-cp311-cp311-manylinux1_x86_64.whl", hash = "sha256:6a24a1e83e4bc7a31b39ef05d2ca4cd2182e95ff10f525edffe1473f7ce16ca1"}, + {file = "torchvision-0.16.0-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:9ed5f21e5a56e466667c6f9f6f93dba2a75e29921108bd70043eaf8e9ba0a7cc"}, + {file = "torchvision-0.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:9ee3d4df7d4a84f883f8ad11fb6510549f40f68dd5469eae601d7e02fb4809b2"}, + {file = "torchvision-0.16.0-cp38-cp38-macosx_10_13_x86_64.whl", hash = "sha256:0c6f36d00b9ce412e367ad6f42e9054cbc890cd9ddd0d200ed9b3b52dd9c225b"}, + {file = "torchvision-0.16.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:597f60cb03e6f758a00b36b38506f6f38b6c3f1fdfd3921bb9abd60b72d522fd"}, + {file = "torchvision-0.16.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:eddd91da4603f1dbb340d9aca82344df64605a0897b17014ac8e0b54dd6e5716"}, + {file = "torchvision-0.16.0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:79875f5247337723ec363762c2716bcfc13b78b3045e4e58847c696f03d9ed4d"}, + {file = "torchvision-0.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:550c9793637c5369fbcb4e4b6b0e6d53a4f6cc22389f0563ad60ab90e4f1c8ba"}, + {file = "torchvision-0.16.0-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:de7c7302fa2f67a2a151e595a8e7dc3865a445d952e99d5c682ba78f312fedc3"}, + {file = "torchvision-0.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f044cffd252fd293b6df46f38d7eeb2fd4fe931e0114c5263735e3b8c9c60a4f"}, + {file = "torchvision-0.16.0-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:8cb501061f6654da494dd975acc1fa301c4b8aacf96bdbcf1553f51a53ebfd1f"}, + {file = "torchvision-0.16.0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:5a47108ae6a8effdf09fe35fd0c4d5414e69ca8d2334e87339de497b7b64b0c9"}, + {file = "torchvision-0.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:9b8f06e6a2f80576007b88846f74b680a1ad3b59d2e22b075587b430180e9cfa"}, +] + +[package.dependencies] +numpy = "*" +pillow = ">=5.3.0,<8.3.dev0 || >=8.4.dev0" +requests = "*" +torch = "2.1.0" + +[package.extras] +scipy = ["scipy"] + +[[package]] +name = "tornado" +version = "6.3.3" +description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." +optional = false +python-versions = ">= 3.8" +files = [ + {file = "tornado-6.3.3-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:502fba735c84450974fec147340016ad928d29f1e91f49be168c0a4c18181e1d"}, + {file = "tornado-6.3.3-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:805d507b1f588320c26f7f097108eb4023bbaa984d63176d1652e184ba24270a"}, + {file = "tornado-6.3.3-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bd19ca6c16882e4d37368e0152f99c099bad93e0950ce55e71daed74045908f"}, + {file = "tornado-6.3.3-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7ac51f42808cca9b3613f51ffe2a965c8525cb1b00b7b2d56828b8045354f76a"}, + {file = "tornado-6.3.3-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:71a8db65160a3c55d61839b7302a9a400074c9c753040455494e2af74e2501f2"}, + {file = "tornado-6.3.3-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:ceb917a50cd35882b57600709dd5421a418c29ddc852da8bcdab1f0db33406b0"}, + {file = "tornado-6.3.3-cp38-abi3-musllinux_1_1_i686.whl", hash = "sha256:7d01abc57ea0dbb51ddfed477dfe22719d376119844e33c661d873bf9c0e4a16"}, + {file = "tornado-6.3.3-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:9dc4444c0defcd3929d5c1eb5706cbe1b116e762ff3e0deca8b715d14bf6ec17"}, + {file = "tornado-6.3.3-cp38-abi3-win32.whl", hash = "sha256:65ceca9500383fbdf33a98c0087cb975b2ef3bfb874cb35b8de8740cf7f41bd3"}, + {file = "tornado-6.3.3-cp38-abi3-win_amd64.whl", hash = "sha256:22d3c2fa10b5793da13c807e6fc38ff49a4f6e1e3868b0a6f4164768bb8e20f5"}, + {file = "tornado-6.3.3.tar.gz", hash = "sha256:e7d8db41c0181c80d76c982aacc442c0783a2c54d6400fe028954201a2e032fe"}, +] + +[[package]] +name = "tqdm" +version = "4.66.1" +description = "Fast, Extensible Progress Meter" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tqdm-4.66.1-py3-none-any.whl", hash = "sha256:d302b3c5b53d47bce91fea46679d9c3c6508cf6332229aa1e7d8653723793386"}, + {file = "tqdm-4.66.1.tar.gz", hash = "sha256:d88e651f9db8d8551a62556d3cff9e3034274ca5d66e93197cf2490e2dcb69c7"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[package.extras] +dev = ["pytest (>=6)", "pytest-cov", "pytest-timeout", "pytest-xdist"] +notebook = ["ipywidgets (>=6)"] +slack = ["slack-sdk"] +telegram = ["requests"] + +[[package]] +name = "traitlets" +version = "5.13.0" +description = "Traitlets Python configuration system" +optional = false +python-versions = ">=3.8" +files = [ + {file = "traitlets-5.13.0-py3-none-any.whl", hash = "sha256:baf991e61542da48fe8aef8b779a9ea0aa38d8a54166ee250d5af5ecf4486619"}, + {file = "traitlets-5.13.0.tar.gz", hash = "sha256:9b232b9430c8f57288c1024b34a8f0251ddcc47268927367a0dd3eeaca40deb5"}, +] + +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] +test = ["argcomplete (>=3.0.3)", "mypy (>=1.6.0)", "pre-commit", "pytest (>=7.0,<7.5)", "pytest-mock", "pytest-mypy-testing"] + +[[package]] +name = "transformers" +version = "4.34.0" +description = "State-of-the-art Machine Learning for JAX, PyTorch and TensorFlow" +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "transformers-4.34.0-py3-none-any.whl", hash = "sha256:3f0187183a7f22c51ecbbc9eac5145df666c5b86bec6feed10e11f0363f3a1f9"}, + {file = "transformers-4.34.0.tar.gz", hash = "sha256:cc2ae61bfbfaa45337fd9017326669fc60e4f55125f589d50da47819e3d6f504"}, +] + +[package.dependencies] +filelock = "*" +huggingface-hub = ">=0.16.4,<1.0" +numpy = ">=1.17" +packaging = ">=20.0" +pyyaml = ">=5.1" +regex = "!=2019.12.17" +requests = "*" +safetensors = ">=0.3.1" +tokenizers = ">=0.14,<0.15" +tqdm = ">=4.27" + +[package.extras] +accelerate = ["accelerate (>=0.20.3)"] +agents = ["Pillow (<10.0.0)", "accelerate (>=0.20.3)", "datasets (!=2.5.0)", "diffusers", "opencv-python", "sentencepiece (>=0.1.91,!=0.1.92)", "torch (>=1.10,!=1.12.0)"] +all = ["Pillow (<10.0.0)", "accelerate (>=0.20.3)", "av (==9.2.0)", "codecarbon (==1.2.0)", "decord (==0.6.0)", "flax (>=0.4.1,<=0.7.0)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "phonemizer", "protobuf", "pyctcdecode (>=0.4.0)", "ray[tune]", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "tensorflow (>=2.6,<2.15)", "tensorflow-text (<2.15)", "tf2onnx", "timm", "tokenizers (>=0.14,<0.15)", "torch (>=1.10,!=1.12.0)", "torchaudio", "torchvision"] +audio = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"] +codecarbon = ["codecarbon (==1.2.0)"] +deepspeed = ["accelerate (>=0.20.3)", "deepspeed (>=0.9.3)"] +deepspeed-testing = ["GitPython (<3.1.19)", "accelerate (>=0.20.3)", "beautifulsoup4", "black (>=23.1,<24.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "deepspeed (>=0.9.3)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "hf-doc-builder (>=0.3.0)", "nltk", "optuna", "parameterized", "protobuf", "psutil", "pytest (>=7.2.0)", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "sentencepiece (>=0.1.91,!=0.1.92)", "timeout-decorator"] +dev = ["GitPython (<3.1.19)", "Pillow (<10.0.0)", "accelerate (>=0.20.3)", "av (==9.2.0)", "beautifulsoup4", "black (>=23.1,<24.0)", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "decord (==0.6.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "flax (>=0.4.1,<=0.7.0)", "fugashi (>=1.0)", "hf-doc-builder", "hf-doc-builder (>=0.3.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "nltk", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pytest (>=7.2.0)", "pytest-timeout", "pytest-xdist", "ray[tune]", "rhoknp (>=1.1.0,<1.3.1)", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (>=0.0.241,<=0.0.259)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorflow (>=2.6,<2.15)", "tensorflow-text (<2.15)", "tf2onnx", "timeout-decorator", "timm", "tokenizers (>=0.14,<0.15)", "torch (>=1.10,!=1.12.0)", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] +dev-tensorflow = ["GitPython (<3.1.19)", "Pillow (<10.0.0)", "beautifulsoup4", "black (>=23.1,<24.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "hf-doc-builder", "hf-doc-builder (>=0.3.0)", "isort (>=5.5.4)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "nltk", "onnxconverter-common", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pytest (>=7.2.0)", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (>=0.0.241,<=0.0.259)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorflow (>=2.6,<2.15)", "tensorflow-text (<2.15)", "tf2onnx", "timeout-decorator", "tokenizers (>=0.14,<0.15)", "urllib3 (<2.0.0)"] +dev-torch = ["GitPython (<3.1.19)", "Pillow (<10.0.0)", "accelerate (>=0.20.3)", "beautifulsoup4", "black (>=23.1,<24.0)", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "fugashi (>=1.0)", "hf-doc-builder", "hf-doc-builder (>=0.3.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "kenlm", "librosa", "nltk", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "optuna", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pytest (>=7.2.0)", "pytest-timeout", "pytest-xdist", "ray[tune]", "rhoknp (>=1.1.0,<1.3.1)", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (>=0.0.241,<=0.0.259)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "timeout-decorator", "timm", "tokenizers (>=0.14,<0.15)", "torch (>=1.10,!=1.12.0)", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"] +docs = ["Pillow (<10.0.0)", "accelerate (>=0.20.3)", "av (==9.2.0)", "codecarbon (==1.2.0)", "decord (==0.6.0)", "flax (>=0.4.1,<=0.7.0)", "hf-doc-builder", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1)", "librosa", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "phonemizer", "protobuf", "pyctcdecode (>=0.4.0)", "ray[tune]", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "tensorflow (>=2.6,<2.15)", "tensorflow-text (<2.15)", "tf2onnx", "timm", "tokenizers (>=0.14,<0.15)", "torch (>=1.10,!=1.12.0)", "torchaudio", "torchvision"] +docs-specific = ["hf-doc-builder"] +fairscale = ["fairscale (>0.3)"] +flax = ["flax (>=0.4.1,<=0.7.0)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "optax (>=0.0.8,<=0.1.4)"] +flax-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"] +ftfy = ["ftfy"] +integrations = ["optuna", "ray[tune]", "sigopt"] +ja = ["fugashi (>=1.0)", "ipadic (>=1.0.0,<2.0)", "rhoknp (>=1.1.0,<1.3.1)", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)"] +modelcreation = ["cookiecutter (==1.7.3)"] +natten = ["natten (>=0.14.6)"] +onnx = ["onnxconverter-common", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "tf2onnx"] +onnxruntime = ["onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)"] +optuna = ["optuna"] +quality = ["GitPython (<3.1.19)", "black (>=23.1,<24.0)", "datasets (!=2.5.0)", "hf-doc-builder (>=0.3.0)", "isort (>=5.5.4)", "ruff (>=0.0.241,<=0.0.259)", "urllib3 (<2.0.0)"] +ray = ["ray[tune]"] +retrieval = ["datasets (!=2.5.0)", "faiss-cpu"] +sagemaker = ["sagemaker (>=2.31.0)"] +sentencepiece = ["protobuf", "sentencepiece (>=0.1.91,!=0.1.92)"] +serving = ["fastapi", "pydantic (<2)", "starlette", "uvicorn"] +sigopt = ["sigopt"] +sklearn = ["scikit-learn"] +speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)", "torchaudio"] +testing = ["GitPython (<3.1.19)", "beautifulsoup4", "black (>=23.1,<24.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "hf-doc-builder (>=0.3.0)", "nltk", "parameterized", "protobuf", "psutil", "pytest (>=7.2.0)", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "timeout-decorator"] +tf = ["keras-nlp (>=0.3.1)", "onnxconverter-common", "tensorflow (>=2.6,<2.15)", "tensorflow-text (<2.15)", "tf2onnx"] +tf-cpu = ["keras-nlp (>=0.3.1)", "onnxconverter-common", "tensorflow-cpu (>=2.6,<2.15)", "tensorflow-text (<2.15)", "tf2onnx"] +tf-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"] +timm = ["timm"] +tokenizers = ["tokenizers (>=0.14,<0.15)"] +torch = ["accelerate (>=0.20.3)", "torch (>=1.10,!=1.12.0)"] +torch-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)", "torchaudio"] +torch-vision = ["Pillow (<10.0.0)", "torchvision"] +torchhub = ["filelock", "huggingface-hub (>=0.16.4,<1.0)", "importlib-metadata", "numpy (>=1.17)", "packaging (>=20.0)", "protobuf", "regex (!=2019.12.17)", "requests", "sentencepiece (>=0.1.91,!=0.1.92)", "tokenizers (>=0.14,<0.15)", "torch (>=1.10,!=1.12.0)", "tqdm (>=4.27)"] +video = ["av (==9.2.0)", "decord (==0.6.0)"] +vision = ["Pillow (<10.0.0)"] + +[[package]] +name = "triton" +version = "2.1.0" +description = "A language and compiler for custom Deep Learning operations" +optional = false +python-versions = "*" +files = [ + {file = "triton-2.1.0-0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:66439923a30d5d48399b08a9eae10370f6c261a5ec864a64983bae63152d39d7"}, + {file = "triton-2.1.0-0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:919b06453f0033ea52c13eaf7833de0e57db3178d23d4e04f9fc71c4f2c32bf8"}, + {file = "triton-2.1.0-0-cp37-cp37m-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ae4bb8a91de790e1866405211c4d618379781188f40d5c4c399766914e84cd94"}, + {file = "triton-2.1.0-0-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:39f6fb6bdccb3e98f3152e3fbea724f1aeae7d749412bbb1fa9c441d474eba26"}, + {file = "triton-2.1.0-0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:21544e522c02005a626c8ad63d39bdff2f31d41069592919ef281e964ed26446"}, + {file = "triton-2.1.0-0-pp37-pypy37_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:143582ca31dd89cd982bd3bf53666bab1c7527d41e185f9e3d8a3051ce1b663b"}, + {file = "triton-2.1.0-0-pp38-pypy38_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:82fc5aeeedf6e36be4e4530cbdcba81a09d65c18e02f52dc298696d45721f3bd"}, + {file = "triton-2.1.0-0-pp39-pypy39_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:81a96d110a738ff63339fc892ded095b31bd0d205e3aace262af8400d40b6fa8"}, +] + +[package.dependencies] +filelock = "*" + +[package.extras] +build = ["cmake (>=3.18)", "lit"] +tests = ["autopep8", "flake8", "isort", "numpy", "pytest", "scipy (>=1.7.1)"] +tutorials = ["matplotlib", "pandas", "tabulate"] + +[[package]] +name = "typing-extensions" +version = "4.8.0" +description = "Backported and Experimental Type Hints for Python 3.8+" +optional = false +python-versions = ">=3.8" +files = [ + {file = "typing_extensions-4.8.0-py3-none-any.whl", hash = "sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0"}, + {file = "typing_extensions-4.8.0.tar.gz", hash = "sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef"}, +] + +[[package]] +name = "urllib3" +version = "2.0.7" +description = "HTTP library with thread-safe connection pooling, file post, and more." +optional = false +python-versions = ">=3.7" +files = [ + {file = "urllib3-2.0.7-py3-none-any.whl", hash = "sha256:fdb6d215c776278489906c2f8916e6e7d4f5a9b602ccbcfdf7f016fc8da0596e"}, + {file = "urllib3-2.0.7.tar.gz", hash = "sha256:c97dfde1f7bd43a71c8d2a58e369e9b2bf692d1334ea9f9cae55add7d0dd0f84"}, +] + +[package.extras] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +secure = ["certifi", "cryptography (>=1.9)", "idna (>=2.0.0)", "pyopenssl (>=17.1.0)", "urllib3-secure-extra"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] + +[[package]] +name = "wandb" +version = "0.12.21" +description = "A CLI and library for interacting with the Weights and Biases API." +optional = false +python-versions = ">=3.6" +files = [ + {file = "wandb-0.12.21-py2.py3-none-any.whl", hash = "sha256:150842447d355d90dc7f368b824951a625e5b2d1be355a00e99b11b73728bc1f"}, + {file = "wandb-0.12.21.tar.gz", hash = "sha256:1975ff88c5024923c3321c93cfefb8d9b871543c0b009f34001bf0f31e444b04"}, +] + +[package.dependencies] +Click = ">=7.0,<8.0.0 || >8.0.0" +docker-pycreds = ">=0.4.0" +GitPython = ">=1.0.0" +pathtools = "*" +promise = ">=2.0,<3" +protobuf = ">=3.12.0,<4.0dev" +psutil = ">=5.0.0" +PyYAML = "*" +requests = ">=2.0.0,<3" +sentry-sdk = ">=1.0.0" +setproctitle = "*" +setuptools = "*" +shortuuid = ">=0.5.0" +six = ">=1.13.0" + +[package.extras] +aws = ["boto3"] +azure = ["azure-storage-blob"] +gcp = ["google-cloud-storage"] +grpc = ["grpcio (>=1.27.2)"] +kubeflow = ["google-cloud-storage", "kubernetes", "minio", "sh"] +launch = ["boto3", "chardet", "google-cloud-storage", "iso8601", "kubernetes", "nbconvert", "nbformat", "typing-extensions"] +media = ["bokeh", "moviepy", "numpy", "pillow", "plotly", "rdkit-pypi", "soundfile"] +models = ["cloudpickle"] +sweeps = ["sweeps (>=0.1.0)"] + +[[package]] +name = "wcwidth" +version = "0.2.9" +description = "Measures the displayed width of unicode strings in a terminal" +optional = false +python-versions = "*" +files = [ + {file = "wcwidth-0.2.9-py2.py3-none-any.whl", hash = "sha256:9a929bd8380f6cd9571a968a9c8f4353ca58d7cd812a4822bba831f8d685b223"}, + {file = "wcwidth-0.2.9.tar.gz", hash = "sha256:a675d1a4a2d24ef67096a04b85b02deeecd8e226f57b5e3a72dbb9ed99d27da8"}, +] + +[[package]] +name = "win32-setctime" +version = "1.1.0" +description = "A small Python utility to set file creation time on Windows" +optional = false +python-versions = ">=3.5" +files = [ + {file = "win32_setctime-1.1.0-py3-none-any.whl", hash = "sha256:231db239e959c2fe7eb1d7dc129f11172354f98361c4fa2d6d2d7e278baa8aad"}, + {file = "win32_setctime-1.1.0.tar.gz", hash = "sha256:15cf5750465118d6929ae4de4eb46e8edae9a5634350c01ba582df868e932cb2"}, +] + +[package.extras] +dev = ["black (>=19.3b0)", "pytest (>=4.6.2)"] + +[[package]] +name = "zipp" +version = "3.17.0" +description = "Backport of pathlib-compatible object wrapper for zip files" +optional = false +python-versions = ">=3.8" +files = [ + {file = "zipp-3.17.0-py3-none-any.whl", hash = "sha256:0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31"}, + {file = "zipp-3.17.0.tar.gz", hash = "sha256:84e64a1c28cf7e91ed2078bb8cc8c259cb19b76942096c8d7b84947690cabaf0"}, +] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy (>=0.9.1)", "pytest-ruff"] + +[metadata] +lock-version = "2.0" +python-versions = ">=3.9,<3.13" +content-hash = "914e609489e134bb4b844f424ea35ef15e1a6288e634ad4046889785123a1e1f" diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..8208ce7 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,41 @@ +[tool.poetry] +name = "src" +version = "0.1.0" +description = "" +authors = ["wassname "] +readme = "README.md" + +[tool.poetry.dependencies] +python = ">=3.9,<3.13" +torch = {version = "^2.1.0+cu118", source = "pytorch"} +matplotlib = "^3.8.0" +loguru = "^0.7.2" +einops = "^0.3.1" +torchinfo = "^1.8.0" +accelerate = "^0.24.1" +peft = "^0.5.0" +bitsandbytes = {url = "https://github.com/TimDettmers/bitsandbytes/releases/download/0.41.0/bitsandbytes-0.41.0-py3-none-any.whl"} +transformers = "4.34.0" +tqdm = "^4.66.1" +wandb = "^0.12.6" +ale-py = "^0.8.1" +pygame = "^2.5.2" +psutil = "^5.9.6" +protobuf = "^3.10.0" +opencv-python = "^4.8.1.78" +hydra-core = "^1.3.2" +gym = {extras = ["accept-rom-license"], version = "^0.26.2"} +torchvision = "^0.16.0" + +[[tool.poetry.source]] +name = "pytorch" +url = "https://download.pytorch.org/whl/cu118" +priority = "explicit" + +[tool.poetry.group.dev.dependencies] +ipykernel = "^6.25.2" +ruff = "^0.1.3" + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" diff --git a/research_journal.md b/research_journal.md new file mode 100644 index 0000000..5fe1ea2 --- /dev/null +++ b/research_journal.md @@ -0,0 +1,65 @@ +# 2023-11-12 13:17:35 + +Try IRIs but with pretrained transformer with LoRA adapter + +- [ ] first can I run it +- [ ] then can I add 3B with adapter... + +```sh +poetry install +. ./.venv/bin/activate +python src/main.py env.train.id=BreakoutNoFrameskip-v4 common.device=cuda:0 wandb.mode=online +``` + + +```sh +# TODO use this code to load a transformer, and other code from my bigvae repo https://github.com/wassname/bigvae_wm +def load_model(config, device='cuda'): + tokenizer = AutoTokenizer.from_pretrained(config.model_name, trust_remote_code=True) + tokenizer.padding_side = "left" + if tokenizer.pad_token is None: + tokenizer.pad_token = tokenizer.eos_token + bnb_config = BitsAndBytesConfig( + load_in_4bit=True, + bnb_4bit_compute_dtype=torch.bfloat16, + bnb_4bit_quant_type="nf4", + bnb_4bit_use_double_quant=True, + ) + base_model = AutoModelForCausalLM.from_pretrained( + config.model_name, + device_map={"": device}, + quantization_config=bnb_config, + torch_dtype=torch.bfloat16, + trust_remote_code=True + ) + peft_config = peft.LoraConfig( + peft.TaskType.CAUSAL_LM, + inference_mode=False, + r=config.rank, + lora_alpha=8, + lora_dropout=config.dropout, + target_modules=[ + "self_attn.q_proj", + "self_attn.k_proj", + "self_attn.v_proj", + "self_attn.o_proj", + "mlp.gate_proj", + "mlp.up_proj", + "mlp.down_proj", + ], + ) + base_model_peft = peft.get_peft_model(base_model, peft_config) + vae_model = BigVAE( + base_model_peft, device, peft_config, z_dim=config.z_dim, + ) + if config.start_from: + vae_model.load_pretrained(config.start_from) + base_model_peft.requires_grad_(False) + vae_model.vae_head.requires_grad_(False) + vae_model.vae_head.w_d.requires_grad_() + router = BigVAERouter(base_model_peft, vae_model, device, peft_config) + if config.start_from: + router.load_pretrained(config.start_from, is_trainable=True) + print(router.model.print_trainable_parameters()) + router.model.set_adapter("router") +``` From 28910cfd63e25853c1ffffff3fa045075ed9b738 Mon Sep 17 00:00:00 2001 From: wassname Date: Sun, 12 Nov 2023 13:57:33 +0800 Subject: [PATCH 02/30] poetry --- config/tokenizer/default.yaml | 2 +- config/trainer.yaml | 6 ++-- poetry.lock | 65 ++++++++++++++++------------------- pyproject.toml | 5 +-- research_journal.md | 5 ++- src/envs/wrappers.py | 2 +- 6 files changed, 42 insertions(+), 43 deletions(-) diff --git a/config/tokenizer/default.yaml b/config/tokenizer/default.yaml index 54a4dd7..39fe6ae 100644 --- a/config/tokenizer/default.yaml +++ b/config/tokenizer/default.yaml @@ -17,4 +17,4 @@ encoder: dropout: 0.0 decoder: _target_: models.tokenizer.Decoder - config: ${..encoder.config} \ No newline at end of file + config: ${..encoder.config} diff --git a/config/trainer.yaml b/config/trainer.yaml index 9e14d17..fe220a7 100644 --- a/config/trainer.yaml +++ b/config/trainer.yaml @@ -54,20 +54,20 @@ training: should: True learning_rate: 0.0001 tokenizer: - batch_num_samples: 256 + batch_num_samples: 64 grad_acc_steps: 1 max_grad_norm: 10.0 start_after_epochs: 5 steps_per_epoch: 200 world_model: - batch_num_samples: 64 + batch_num_samples: 16 grad_acc_steps: 1 max_grad_norm: 10.0 weight_decay: 0.01 start_after_epochs: 25 steps_per_epoch: 200 actor_critic: - batch_num_samples: 64 + batch_num_samples: 16 grad_acc_steps: 1 max_grad_norm: 10.0 start_after_epochs: 50 diff --git a/poetry.lock b/poetry.lock index 9ad1a2b..cf1ee10 100644 --- a/poetry.lock +++ b/poetry.lock @@ -31,37 +31,32 @@ testing = ["bitsandbytes", "datasets", "deepspeed", "evaluate", "parameterized", [[package]] name = "ale-py" -version = "0.8.1" +version = "0.7.5" description = "The Arcade Learning Environment (ALE) - a platform for AI research." optional = false python-versions = ">=3.7" files = [ - {file = "ale_py-0.8.1-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:b2aa2f69a4169742800615970efe6914fa856e33eaf7fa9133c0e06a617a80e2"}, - {file = "ale_py-0.8.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6f2f6b92c8fd6189654979bbf0b305dbe0ecf82176c47f244d8c1cbc36286b89"}, - {file = "ale_py-0.8.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9b168eb88c87d0f3e2a778e6c5cdde4ad951d1ca8a6dc3d3679fd45398df7d1"}, - {file = "ale_py-0.8.1-cp310-cp310-win_amd64.whl", hash = "sha256:5fcc31f495de79ee1d6bfc0f4b7c4619948851e679bbf010035e25f23146a687"}, - {file = "ale_py-0.8.1-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:0856ca777473ec4ae8a59f3af9580259adb0fd4a47d586a125a440c62e82fc10"}, - {file = "ale_py-0.8.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f10b1df8774bbe3b00365748b5e0e07cf35f6a703bbaff991bc7b3b2247dccc9"}, - {file = "ale_py-0.8.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0006d80dfe7745eb5a93444492337203c8bc7eb594a2c24c6a651c5c5b0eaf09"}, - {file = "ale_py-0.8.1-cp311-cp311-win_amd64.whl", hash = "sha256:9773eea7505484e024beb2fff0f3bfd363db151bdb9799d70995448e196b1ded"}, - {file = "ale_py-0.8.1-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:87557db05be0e04130e2ec1bf909d3bb0b0bc034645d4f664e6baa573fe32191"}, - {file = "ale_py-0.8.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ae2ba24557e0ce541ea3be13b148db2a9cfa730d83537b4cbed5e10449826e51"}, - {file = "ale_py-0.8.1-cp37-cp37m-win_amd64.whl", hash = "sha256:ade5c32af567629164a6b49378978c728a15dc4db07ad6b679e8832d4fd3ea1f"}, - {file = "ale_py-0.8.1-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:0ffecb5c956749596030e464827642945162170a132d093c3d4fa2d7e5725c18"}, - {file = "ale_py-0.8.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7cd74b7ee0248ef11a086c9764e142e71defd40ec8989a99232bfd2d9e8023be"}, - {file = "ale_py-0.8.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eadf9f3990b4ff2f9e5ca35889f5e2e95cddd6a353d9d857d9b4601a6e1c4e7c"}, - {file = "ale_py-0.8.1-cp38-cp38-win_amd64.whl", hash = "sha256:817adf9a3a82c4923c731e634520a5ecf296aca0367f5c69959a96b32119d831"}, - {file = "ale_py-0.8.1-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:2d9fcfa06c74a613c5419e942ef4d3e0959533f52e94d2d4bda61d07fbfffeee"}, - {file = "ale_py-0.8.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f278036f9b6066062abcdf0987a0ec5a8e0f22a2c7cfac925e39378d4343d490"}, - {file = "ale_py-0.8.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b00f74e27815131c1a2791f3d48114363fa2708e19f09ce6b7b614cb14c9d469"}, - {file = "ale_py-0.8.1-cp39-cp39-win_amd64.whl", hash = "sha256:d49b550a2d9c25b63c343aa680fd81f253a3714cdc0e1835640933ebff1798ff"}, + {file = "ale_py-0.7.5-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:c68d3960f0e14738362069798ff5baa85ecb337038168cb61bd4855125deb894"}, + {file = "ale_py-0.7.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:003725a8b6f02353066564ab417f4228adc886434aa4c8d314489a7f79fe9dfd"}, + {file = "ale_py-0.7.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a30270d4aec820527be7a643aad381d0d1c932dc476740f63cc649dd200e065"}, + {file = "ale_py-0.7.5-cp310-cp310-win_amd64.whl", hash = "sha256:1a72f8a311887fe3800964976c7ce3567dd701e7d9b77209d3a05c5cdf9c6af0"}, + {file = "ale_py-0.7.5-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:910c5443a836bf0bc6b03c45fefeeb9096254f807d24e247753e214062c12cae"}, + {file = "ale_py-0.7.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f97301b89a8b49b9d2cc034f8a7df55eb6b1930126fb6cb6c6d6239bab8a89d"}, + {file = "ale_py-0.7.5-cp37-cp37m-win_amd64.whl", hash = "sha256:38e9f6c2b1cca246253f41028b8ad92d725beec8d4672c0fe247a217a4c7dc4f"}, + {file = "ale_py-0.7.5-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:48c5abf2c59bed0b46f17ac60ec6c940e6e7d4abc6ff7e5296246286f80e4a23"}, + {file = "ale_py-0.7.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b2680b9a3c577865572dd9b8f24303189bb22c67b1b9668dcad3c20f59285e78"}, + {file = "ale_py-0.7.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dec87873c6fe65c71129e20c52ce35dd4507ca409fa1233f4ae9c511144a9c99"}, + {file = "ale_py-0.7.5-cp38-cp38-win_amd64.whl", hash = "sha256:1f8694a091e13be45c8704a089462b1519f7112a85e1c1b61c842c69a2608a98"}, + {file = "ale_py-0.7.5-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:4c7e7fed3ce2b305d2db9ca2f87106e3df6da2c4fc2363103782ffd5975b4549"}, + {file = "ale_py-0.7.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:da5be311285a00e587b886805ea56762d44bf4f1da672229c1fbaff209bfcdc2"}, + {file = "ale_py-0.7.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e513799fbb5128fa045cfb9a31cffa7f7c188dbe885665188b6c4cb50e9d983c"}, + {file = "ale_py-0.7.5-cp39-cp39-win_amd64.whl", hash = "sha256:9976ceea0251ccad7e562e2021c337d5e9a9b24b5f9eecfe82573c2279337016"}, ] [package.dependencies] importlib-metadata = {version = ">=4.10.0", markers = "python_version < \"3.10\""} importlib-resources = "*" numpy = "*" -typing-extensions = {version = "*", markers = "python_version < \"3.11\""} [package.extras] test = ["gym (>=0.23,<1.0)", "pytest (>=7.0)"] @@ -701,32 +696,32 @@ test = ["black", "coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mock", "mypy", "pre [[package]] name = "gym" -version = "0.26.2" -description = "Gym: A universal API for reinforcement learning environments" +version = "0.22.0" +description = "Gym: A universal API for reinforcement learning environments." optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "gym-0.26.2.tar.gz", hash = "sha256:e0d882f4b54f0c65f203104c24ab8a38b039f1289986803c7d02cdbe214fbcc4"}, + {file = "gym-0.22.0.tar.gz", hash = "sha256:339144c89951758187c378111919bc0e2f1695f9e9d9699e3f19279a6398148d"}, ] [package.dependencies] +ale-py = {version = ">=0.7.4,<0.8.0", optional = true, markers = "extra == \"atari\""} autorom = {version = ">=0.4.2,<0.5.0", extras = ["accept-rom-license"], optional = true, markers = "extra == \"accept-rom-license\""} cloudpickle = ">=1.2.0" gym_notices = ">=0.0.4" -importlib_metadata = {version = ">=4.8.0", markers = "python_version < \"3.10\""} +importlib_metadata = {version = ">=4.10.0", markers = "python_version < \"3.10\""} numpy = ">=1.18.0" [package.extras] accept-rom-license = ["autorom[accept-rom-license] (>=0.4.2,<0.5.0)"] -all = ["ale-py (>=0.8.0,<0.9.0)", "box2d-py (==2.3.5)", "imageio (>=2.14.1)", "lz4 (>=3.1.0)", "matplotlib (>=3.0)", "moviepy (>=1.0.0)", "mujoco (==2.2)", "mujoco_py (>=2.1,<2.2)", "opencv-python (>=3.0)", "pygame (==2.1.0)", "pytest (==7.0.1)", "swig (==4.*)"] -atari = ["ale-py (>=0.8.0,<0.9.0)"] -box2d = ["box2d-py (==2.3.5)", "pygame (==2.1.0)", "swig (==4.*)"] +all = ["ale-py (>=0.7.4,<0.8.0)", "box2d-py (==2.3.5)", "box2d-py (==2.3.5)", "lz4 (>=3.1.0)", "lz4 (>=3.1.0)", "mujoco_py (>=1.50,<2.0)", "opencv-python (>=3.0)", "opencv-python (>=3.0)", "pygame (==2.1.0)", "pygame (==2.1.0)", "pygame (==2.1.0)", "pygame (==2.1.0)", "pygame (==2.1.0)", "pygame (==2.1.0)", "scipy (>=1.4.1)", "scipy (>=1.4.1)"] +atari = ["ale-py (>=0.7.4,<0.8.0)"] +box2d = ["box2d-py (==2.3.5)", "pygame (==2.1.0)"] classic-control = ["pygame (==2.1.0)"] -mujoco = ["imageio (>=2.14.1)", "mujoco (==2.2)"] -mujoco-py = ["mujoco_py (>=2.1,<2.2)"] -other = ["lz4 (>=3.1.0)", "matplotlib (>=3.0)", "moviepy (>=1.0.0)", "opencv-python (>=3.0)"] -testing = ["box2d-py (==2.3.5)", "imageio (>=2.14.1)", "lz4 (>=3.1.0)", "matplotlib (>=3.0)", "moviepy (>=1.0.0)", "mujoco (==2.2)", "mujoco_py (>=2.1,<2.2)", "opencv-python (>=3.0)", "pygame (==2.1.0)", "pytest (==7.0.1)", "swig (==4.*)"] -toy-text = ["pygame (==2.1.0)"] +mujoco = ["mujoco_py (>=1.50,<2.0)"] +nomujoco = ["box2d-py (==2.3.5)", "lz4 (>=3.1.0)", "opencv-python (>=3.0)", "pygame (==2.1.0)", "pygame (==2.1.0)", "pygame (==2.1.0)", "scipy (>=1.4.1)"] +other = ["lz4 (>=3.1.0)", "opencv-python (>=3.0)"] +toy-text = ["pygame (==2.1.0)", "scipy (>=1.4.1)"] [[package]] name = "gym-notices" @@ -2903,4 +2898,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = ">=3.9,<3.13" -content-hash = "914e609489e134bb4b844f424ea35ef15e1a6288e634ad4046889785123a1e1f" +content-hash = "3fb1a61c2bf4b6fa530dff25509331cb4a0dfe863f77355d01e886feb06c9b34" diff --git a/pyproject.toml b/pyproject.toml index 8208ce7..fd1121a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -18,14 +18,15 @@ bitsandbytes = {url = "https://github.com/TimDettmers/bitsandbytes/releases/down transformers = "4.34.0" tqdm = "^4.66.1" wandb = "^0.12.6" -ale-py = "^0.8.1" +ale-py = "^0.7.4" pygame = "^2.5.2" psutil = "^5.9.6" protobuf = "^3.10.0" opencv-python = "^4.8.1.78" hydra-core = "^1.3.2" -gym = {extras = ["accept-rom-license"], version = "^0.26.2"} torchvision = "^0.16.0" +numpy = ">=1.18.0" +gym = {version = "0.22.0", extras = ["accept-rom-license", "atari"]} [[tool.poetry.source]] name = "pytorch" diff --git a/research_journal.md b/research_journal.md index 5fe1ea2..57c3c0b 100644 --- a/research_journal.md +++ b/research_journal.md @@ -8,7 +8,10 @@ Try IRIs but with pretrained transformer with LoRA adapter ```sh poetry install . ./.venv/bin/activate -python src/main.py env.train.id=BreakoutNoFrameskip-v4 common.device=cuda:0 wandb.mode=online +python src/main.py env.train.id=BreakoutNoFrameskip-v4 common.device=cuda:0 wandb.mode=offline + +# or for quick debug +WANDB_MODE=disabled python -m pdb src/main.py env.train.id=BreakoutNoFrameskip-v4 ``` diff --git a/src/envs/wrappers.py b/src/envs/wrappers.py index b1054a1..eca6f88 100644 --- a/src/envs/wrappers.py +++ b/src/envs/wrappers.py @@ -64,7 +64,7 @@ class NoopResetEnv(gym.Wrapper): if self.override_num_noops is not None: noops = self.override_num_noops else: - noops = self.unwrapped.np_random.randint(1, self.noop_max + 1) + noops = self.unwrapped.np_random.integers(1, self.noop_max + 1) assert noops > 0 obs = None for _ in range(noops): From 7dfded5bde61430d1ac3b3712497865d7649471a Mon Sep 17 00:00:00 2001 From: wassname Date: Sun, 12 Nov 2023 14:41:59 +0800 Subject: [PATCH 03/30] debuggign --- .vscode/launch.json | 25 +++++++++++++++++++++++++ research_journal.md | 32 +++++++++++++++++++++++++++++++- 2 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 .vscode/launch.json diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..fda7a32 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,25 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "main", + "type": "python", + "request": "launch", + "program": "${workspaceFolder}/src/main.py", + "console": "integratedTerminal", + "justMyCode": false, + "autoReload": {"enable": true,}, + "env": {"WANDB_MODE":"disabled"}, + "args": [ + "env.train.id=BreakoutNoFrameskip-v4", + // # make it start early + "trainer.training.tokenizer.start_after_epochs=1", + "trainer.training.world_model.start_after_epochs=2", + "trainer.training.actor_critic.start_after_epochs=3", + ] + } + ] +} diff --git a/research_journal.md b/research_journal.md index 57c3c0b..6be63bb 100644 --- a/research_journal.md +++ b/research_journal.md @@ -2,7 +2,7 @@ Try IRIs but with pretrained transformer with LoRA adapter -- [ ] first can I run it +- [x] first can I run it yes with a 1/2 batch size - [ ] then can I add 3B with adapter... ```sh @@ -66,3 +66,33 @@ def load_model(config, device='cuda'): print(router.model.print_trainable_parameters()) router.model.set_adapter("router") ``` + +Debugging: + batch['observations'].shape + torch.Size([16, 20, 3, 64, 64]) + + obs_tokens.shape + torch.Size([16, 20, 16]) + + https://vscode.dev/github/wassname/iris_bigvae/blob/just_llms2/src/models/world_model.py#L105 + tokens + tensor([[222, 222, 222, ..., 409, 55, 2], + [222, 222, 222, ..., 409, 139, 1], + [222, 222, 222, ..., 168, 190, 3], + ..., + [222, 222, 222, ..., 168, 55, 0], + [222, 222, 222, ..., 237, 190, 3], + [222, 222, 222, ..., 168, 55, 0]], device='cuda:0') + tokens.shape + torch.Size([16, 340]) + where 16 is the batch size. 340 is the step size?. actions was 16,20 int + + tokens.shape int + torch.Size([16, 340]) + + sequences.shape float32 + torch.Size([16, 340, 256]) + + transfrmer + x.shape + torch.Size([16, 340, 256]) From a6b850bd9655a334c7f901fc0efc0635968d35c4 Mon Sep 17 00:00:00 2001 From: wassname Date: Sun, 12 Nov 2023 14:44:10 +0800 Subject: [PATCH 04/30] fix debug launch --- .vscode/launch.json | 6 +++--- config/trainer.yaml | 2 +- src/models/transformer.py | 44 +++++++++++++++++++-------------------- 3 files changed, 25 insertions(+), 27 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index fda7a32..ac43a5c 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -16,9 +16,9 @@ "args": [ "env.train.id=BreakoutNoFrameskip-v4", // # make it start early - "trainer.training.tokenizer.start_after_epochs=1", - "trainer.training.world_model.start_after_epochs=2", - "trainer.training.actor_critic.start_after_epochs=3", + "training.tokenizer.start_after_epochs=1", + "training.world_model.start_after_epochs=2", + "training.actor_critic.start_after_epochs=3", ] } ] diff --git a/config/trainer.yaml b/config/trainer.yaml index fe220a7..bd02bf0 100644 --- a/config/trainer.yaml +++ b/config/trainer.yaml @@ -7,7 +7,7 @@ defaults: - datasets: default wandb: - mode: online + mode: offline project: iris entity: null name: null diff --git a/src/models/transformer.py b/src/models/transformer.py index 2aaac69..dea058d 100644 --- a/src/models/transformer.py +++ b/src/models/transformer.py @@ -32,29 +32,6 @@ class TransformerConfig: def max_tokens(self): return self.tokens_per_block * self.max_blocks - -class Transformer(nn.Module): - def __init__(self, config: TransformerConfig) -> None: - super().__init__() - self.config = config - self.drop = nn.Dropout(config.embed_pdrop) - self.blocks = nn.ModuleList([Block(config) for _ in range(config.num_layers)]) - self.ln_f = nn.LayerNorm(config.embed_dim) - - def generate_empty_keys_values(self, n: int, max_tokens: int) -> KeysValues: - device = self.ln_f.weight.device # Assumption that all submodules are on the same device - return KeysValues(n, self.config.num_heads, max_tokens, self.config.embed_dim, self.config.num_layers, device) - - def forward(self, sequences: torch.Tensor, past_keys_values: Optional[KeysValues] = None) -> torch.Tensor: - assert past_keys_values is None or len(past_keys_values) == len(self.blocks) - x = self.drop(sequences) - for i, block in enumerate(self.blocks): - x = block(x, None if past_keys_values is None else past_keys_values[i]) - - x = self.ln_f(x) - return x - - class Block(nn.Module): def __init__(self, config: TransformerConfig) -> None: super().__init__() @@ -118,3 +95,24 @@ class SelfAttention(nn.Module): y = self.resid_drop(self.proj(y)) return y + +class Transformer(nn.Module): + def __init__(self, config: TransformerConfig) -> None: + super().__init__() + self.config = config + self.drop = nn.Dropout(config.embed_pdrop) + self.blocks = nn.ModuleList([Block(config) for _ in range(config.num_layers)]) + self.ln_f = nn.LayerNorm(config.embed_dim) + + def generate_empty_keys_values(self, n: int, max_tokens: int) -> KeysValues: + device = self.ln_f.weight.device # Assumption that all submodules are on the same device + return KeysValues(n, self.config.num_heads, max_tokens, self.config.embed_dim, self.config.num_layers, device) + + def forward(self, sequences: torch.Tensor, past_keys_values: Optional[KeysValues] = None) -> torch.Tensor: + assert past_keys_values is None or len(past_keys_values) == len(self.blocks) + x = self.drop(sequences) + for i, block in enumerate(self.blocks): + x = block(x, None if past_keys_values is None else past_keys_values[i]) + + x = self.ln_f(x) + return x From 1454e5c053c1c9ab84370703b20e8671a85840f5 Mon Sep 17 00:00:00 2001 From: wassname Date: Sun, 12 Nov 2023 16:13:23 +0800 Subject: [PATCH 05/30] training --- .vscode/launch.json | 5 ++- config/trainer.yaml | 6 +-- config/world_model/default.yaml | 2 +- poetry.lock | 44 ++++++++++++++++++- pyproject.toml | 1 + src/models/transformer.py | 76 +++++++++++++++++++++++++++++++-- src/models/world_model.py | 5 ++- 7 files changed, 126 insertions(+), 13 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index ac43a5c..2648c79 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -17,8 +17,9 @@ "env.train.id=BreakoutNoFrameskip-v4", // # make it start early "training.tokenizer.start_after_epochs=1", - "training.world_model.start_after_epochs=2", - "training.actor_critic.start_after_epochs=3", + "training.world_model.start_after_epochs=1", + "training.actor_critic.start_after_epochs=1", + "training.tokenizer.steps_per_epoch=20", ] } ] diff --git a/config/trainer.yaml b/config/trainer.yaml index bd02bf0..01af86e 100644 --- a/config/trainer.yaml +++ b/config/trainer.yaml @@ -54,20 +54,20 @@ training: should: True learning_rate: 0.0001 tokenizer: - batch_num_samples: 64 + batch_num_samples: 32 grad_acc_steps: 1 max_grad_norm: 10.0 start_after_epochs: 5 steps_per_epoch: 200 world_model: - batch_num_samples: 16 + batch_num_samples: 4 grad_acc_steps: 1 max_grad_norm: 10.0 weight_decay: 0.01 start_after_epochs: 25 steps_per_epoch: 200 actor_critic: - batch_num_samples: 16 + batch_num_samples: 8 grad_acc_steps: 1 max_grad_norm: 10.0 start_after_epochs: 50 diff --git a/config/world_model/default.yaml b/config/world_model/default.yaml index bfcbb31..d03a227 100644 --- a/config/world_model/default.yaml +++ b/config/world_model/default.yaml @@ -4,7 +4,7 @@ max_blocks: 20 attention: 'causal' num_layers: 10 num_heads: 4 -embed_dim: 256 +embed_dim: 2560 # change this to whatever the embedding dimension is in your pretrained llm embed_pdrop: 0.1 resid_pdrop: 0.1 attn_pdrop: 0.1 diff --git a/poetry.lock b/poetry.lock index cf1ee10..aafa8da 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2214,6 +2214,48 @@ tensorflow = ["safetensors[numpy]", "tensorflow (>=2.11.0)"] testing = ["h5py (>=3.7.0)", "huggingface_hub (>=0.12.1)", "hypothesis (>=6.70.2)", "pytest (>=7.2.0)", "pytest-benchmark (>=4.0.0)", "safetensors[numpy]", "setuptools_rust (>=1.5.2)"] torch = ["safetensors[numpy]", "torch (>=1.10)"] +[[package]] +name = "scipy" +version = "1.11.3" +description = "Fundamental algorithms for scientific computing in Python" +optional = false +python-versions = "<3.13,>=3.9" +files = [ + {file = "scipy-1.11.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:370f569c57e1d888304052c18e58f4a927338eafdaef78613c685ca2ea0d1fa0"}, + {file = "scipy-1.11.3-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:9885e3e4f13b2bd44aaf2a1a6390a11add9f48d5295f7a592393ceb8991577a3"}, + {file = "scipy-1.11.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e04aa19acc324a1a076abb4035dabe9b64badb19f76ad9c798bde39d41025cdc"}, + {file = "scipy-1.11.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e1a8a4657673bfae1e05e1e1d6e94b0cabe5ed0c7c144c8aa7b7dbb774ce5c1"}, + {file = "scipy-1.11.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7abda0e62ef00cde826d441485e2e32fe737bdddee3324e35c0e01dee65e2a88"}, + {file = "scipy-1.11.3-cp310-cp310-win_amd64.whl", hash = "sha256:033c3fd95d55012dd1148b201b72ae854d5086d25e7c316ec9850de4fe776929"}, + {file = "scipy-1.11.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:925c6f09d0053b1c0f90b2d92d03b261e889b20d1c9b08a3a51f61afc5f58165"}, + {file = "scipy-1.11.3-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:5664e364f90be8219283eeb844323ff8cd79d7acbd64e15eb9c46b9bc7f6a42a"}, + {file = "scipy-1.11.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00f325434b6424952fbb636506f0567898dca7b0f7654d48f1c382ea338ce9a3"}, + {file = "scipy-1.11.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f290cf561a4b4edfe8d1001ee4be6da60c1c4ea712985b58bf6bc62badee221"}, + {file = "scipy-1.11.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:91770cb3b1e81ae19463b3c235bf1e0e330767dca9eb4cd73ba3ded6c4151e4d"}, + {file = "scipy-1.11.3-cp311-cp311-win_amd64.whl", hash = "sha256:e1f97cd89c0fe1a0685f8f89d85fa305deb3067d0668151571ba50913e445820"}, + {file = "scipy-1.11.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:dfcc1552add7cb7c13fb70efcb2389d0624d571aaf2c80b04117e2755a0c5d15"}, + {file = "scipy-1.11.3-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:0d3a136ae1ff0883fffbb1b05b0b2fea251cb1046a5077d0b435a1839b3e52b7"}, + {file = "scipy-1.11.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bae66a2d7d5768eaa33008fa5a974389f167183c87bf39160d3fefe6664f8ddc"}, + {file = "scipy-1.11.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2f6dee6cbb0e263b8142ed587bc93e3ed5e777f1f75448d24fb923d9fd4dce6"}, + {file = "scipy-1.11.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:74e89dc5e00201e71dd94f5f382ab1c6a9f3ff806c7d24e4e90928bb1aafb280"}, + {file = "scipy-1.11.3-cp312-cp312-win_amd64.whl", hash = "sha256:90271dbde4be191522b3903fc97334e3956d7cfb9cce3f0718d0ab4fd7d8bfd6"}, + {file = "scipy-1.11.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a63d1ec9cadecce838467ce0631c17c15c7197ae61e49429434ba01d618caa83"}, + {file = "scipy-1.11.3-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:5305792c7110e32ff155aed0df46aa60a60fc6e52cd4ee02cdeb67eaccd5356e"}, + {file = "scipy-1.11.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9ea7f579182d83d00fed0e5c11a4aa5ffe01460444219dedc448a36adf0c3917"}, + {file = "scipy-1.11.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c77da50c9a91e23beb63c2a711ef9e9ca9a2060442757dffee34ea41847d8156"}, + {file = "scipy-1.11.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:15f237e890c24aef6891c7d008f9ff7e758c6ef39a2b5df264650eb7900403c0"}, + {file = "scipy-1.11.3-cp39-cp39-win_amd64.whl", hash = "sha256:4b4bb134c7aa457e26cc6ea482b016fef45db71417d55cc6d8f43d799cdf9ef2"}, + {file = "scipy-1.11.3.tar.gz", hash = "sha256:bba4d955f54edd61899776bad459bf7326e14b9fa1c552181f0479cc60a568cd"}, +] + +[package.dependencies] +numpy = ">=1.21.6,<1.28.0" + +[package.extras] +dev = ["click", "cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy", "pycodestyle", "pydevtool", "rich-click", "ruff", "types-psutil", "typing_extensions"] +doc = ["jupytext", "matplotlib (>2)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (==0.9.0)", "sphinx (!=4.1.0)", "sphinx-design (>=0.2.0)"] +test = ["asv", "gmpy2", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] + [[package]] name = "sentry-sdk" version = "1.34.0" @@ -2898,4 +2940,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = ">=3.9,<3.13" -content-hash = "3fb1a61c2bf4b6fa530dff25509331cb4a0dfe863f77355d01e886feb06c9b34" +content-hash = "e2ad5cf8670b043bb7174a4c7f6e4c89644461eb1680e282b436541672e4e67c" diff --git a/pyproject.toml b/pyproject.toml index fd1121a..3cad2fb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -27,6 +27,7 @@ hydra-core = "^1.3.2" torchvision = "^0.16.0" numpy = ">=1.18.0" gym = {version = "0.22.0", extras = ["accept-rom-license", "atari"]} +scipy = "^1.11.3" [[tool.poetry.source]] name = "pytorch" diff --git a/src/models/transformer.py b/src/models/transformer.py index dea058d..431fe73 100644 --- a/src/models/transformer.py +++ b/src/models/transformer.py @@ -16,6 +16,8 @@ from .kv_caching import KeysValues, KVCache @dataclass class TransformerConfig: + + tokens_per_block: int max_blocks: int attention: str @@ -27,6 +29,12 @@ class TransformerConfig: embed_pdrop: float resid_pdrop: float attn_pdrop: float + + model_name: str = "stabilityai/stablelm-3b-4e1t" + dropout: float = 0 + rank: int = 32 + z_dim: int = 768 + start_from: str = None @property def max_tokens(self): @@ -100,19 +108,79 @@ class Transformer(nn.Module): def __init__(self, config: TransformerConfig) -> None: super().__init__() self.config = config - self.drop = nn.Dropout(config.embed_pdrop) - self.blocks = nn.ModuleList([Block(config) for _ in range(config.num_layers)]) - self.ln_f = nn.LayerNorm(config.embed_dim) + self.model = load_pretrained_model(config) + # self.ln_f = nn.LayerNorm(self.model.config.vocab_size, config.embed_dim) + self.ln_f = nn.Linear(self.model.config.vocab_size, config.embed_dim) + # self.drop = nn.Dropout(config.embed_pdrop) + # self.blocks = nn.ModuleList([Block(config) for _ in range(config.num_layers)]) + # self.ln_f = nn.LayerNorm(config.embed_dim) def generate_empty_keys_values(self, n: int, max_tokens: int) -> KeysValues: device = self.ln_f.weight.device # Assumption that all submodules are on the same device return KeysValues(n, self.config.num_heads, max_tokens, self.config.embed_dim, self.config.num_layers, device) + # @torch.cuda.amp.autocast(dtype=torch.bfloat16) def forward(self, sequences: torch.Tensor, past_keys_values: Optional[KeysValues] = None) -> torch.Tensor: - assert past_keys_values is None or len(past_keys_values) == len(self.blocks) + # assert past_keys_values is None or len(past_keys_values) == len(self.blocks) + sequences = sequences.to(torch.bfloat16) + outputs = self.model( + inputs_embeds=sequences, + return_dict=True, + output_hidden_states=True, + ) + x = outputs.logits.to(torch.float32) + # TODO: we output with last dim 50304 but want 2560 (embed dim) + x = self.ln_f(x) + return x + + inputs_embeds x = self.drop(sequences) for i, block in enumerate(self.blocks): x = block(x, None if past_keys_values is None else past_keys_values[i]) x = self.ln_f(x) return x + + +from transformers import AutoTokenizer, AutoModelForCausalLM, BitsAndBytesConfig +from peft import PeftModel, LoraConfig +import peft + +def load_pretrained_model(config, device="cuda:0"): + tokenizer = AutoTokenizer.from_pretrained(config.model_name, trust_remote_code=True) + tokenizer.padding_side = "left" + if tokenizer.pad_token is None: + tokenizer.pad_token = tokenizer.eos_token + bnb_config = BitsAndBytesConfig( + load_in_4bit=True, + bnb_4bit_compute_dtype=torch.bfloat16, + bnb_4bit_quant_type="nf4", + bnb_4bit_use_double_quant=True, + ) + base_model = AutoModelForCausalLM.from_pretrained( + config.model_name, + device_map={"": device}, + quantization_config=bnb_config, + torch_dtype=torch.bfloat16, + trust_remote_code=True + ) + peft_config = peft.LoraConfig( + peft.TaskType.CAUSAL_LM, + inference_mode=False, + r=config.rank, + lora_alpha=8, + lora_dropout=config.dropout, + target_modules=[ + "self_attn.q_proj", + "self_attn.k_proj", + "self_attn.v_proj", + "self_attn.o_proj", + "mlp.gate_proj", + "mlp.up_proj", + "mlp.down_proj", + ], + ) + base_model_peft = peft.get_peft_model(base_model, peft_config) + base_model_peft.add_adapter("dynamics", peft_config) + print(base_model_peft.print_trainable_parameters()) + return base_model_peft diff --git a/src/models/world_model.py b/src/models/world_model.py index 0691034..194119e 100644 --- a/src/models/world_model.py +++ b/src/models/world_model.py @@ -26,8 +26,7 @@ class WorldModel(nn.Module): def __init__(self, obs_vocab_size: int, act_vocab_size: int, config: TransformerConfig) -> None: super().__init__() self.obs_vocab_size, self.act_vocab_size = obs_vocab_size, act_vocab_size - self.config = config - self.transformer = Transformer(config) + self.config = config all_but_last_obs_tokens_pattern = torch.ones(config.tokens_per_block) all_but_last_obs_tokens_pattern[-2] = 0 @@ -74,6 +73,8 @@ class WorldModel(nn.Module): ) self.apply(init_weights) + + self.transformer = Transformer(config) def __repr__(self) -> str: return "world_model" From a3ded691e1746c8969f9814e3c2ae92981f30bac Mon Sep 17 00:00:00 2001 From: wassname Date: Sun, 12 Nov 2023 17:27:17 +0800 Subject: [PATCH 06/30] misc --- .vscode/launch.json | 2 ++ research_journal.md | 6 ++++++ src/models/transformer.py | 13 ------------- 3 files changed, 8 insertions(+), 13 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index 2648c79..0705eb8 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -20,6 +20,8 @@ "training.world_model.start_after_epochs=1", "training.actor_critic.start_after_epochs=1", "training.tokenizer.steps_per_epoch=20", + "training.world_model.steps_per_epoch=10", + "training.actor_critic.steps_per_epoch=20", ] } ] diff --git a/research_journal.md b/research_journal.md index 6be63bb..243c94c 100644 --- a/research_journal.md +++ b/research_journal.md @@ -96,3 +96,9 @@ Debugging: transfrmer x.shape torch.Size([16, 340, 256]) + +# 2023-11-12 16:58:37 + +So I got it training, but during imagination it passes in a single token with no past steps. But the slicer seems to need at least on block? And so I get none? + +hmm it's because num_kept_tokens is 16 not 1. So there should be a whole block passed in ? diff --git a/src/models/transformer.py b/src/models/transformer.py index 431fe73..7c0c44c 100644 --- a/src/models/transformer.py +++ b/src/models/transformer.py @@ -109,11 +109,7 @@ class Transformer(nn.Module): super().__init__() self.config = config self.model = load_pretrained_model(config) - # self.ln_f = nn.LayerNorm(self.model.config.vocab_size, config.embed_dim) self.ln_f = nn.Linear(self.model.config.vocab_size, config.embed_dim) - # self.drop = nn.Dropout(config.embed_pdrop) - # self.blocks = nn.ModuleList([Block(config) for _ in range(config.num_layers)]) - # self.ln_f = nn.LayerNorm(config.embed_dim) def generate_empty_keys_values(self, n: int, max_tokens: int) -> KeysValues: device = self.ln_f.weight.device # Assumption that all submodules are on the same device @@ -129,15 +125,6 @@ class Transformer(nn.Module): output_hidden_states=True, ) x = outputs.logits.to(torch.float32) - # TODO: we output with last dim 50304 but want 2560 (embed dim) - x = self.ln_f(x) - return x - - inputs_embeds - x = self.drop(sequences) - for i, block in enumerate(self.blocks): - x = block(x, None if past_keys_values is None else past_keys_values[i]) - x = self.ln_f(x) return x From c8f59b0504376b3f131f0871eb1b1e36a5538bfc Mon Sep 17 00:00:00 2001 From: wassname Date: Sun, 12 Nov 2023 18:41:22 +0800 Subject: [PATCH 07/30] misc --- .vscode/launch.json | 10 +++++----- research_journal.md | 9 +++++++++ 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index 0705eb8..e0c9bdf 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -17,11 +17,11 @@ "env.train.id=BreakoutNoFrameskip-v4", // # make it start early "training.tokenizer.start_after_epochs=1", - "training.world_model.start_after_epochs=1", - "training.actor_critic.start_after_epochs=1", - "training.tokenizer.steps_per_epoch=20", - "training.world_model.steps_per_epoch=10", - "training.actor_critic.steps_per_epoch=20", + "training.world_model.start_after_epochs=2", + "training.actor_critic.start_after_epochs=3", + "training.tokenizer.steps_per_epoch=40", + "training.world_model.steps_per_epoch=40", + "training.actor_critic.steps_per_epoch=40", ] } ] diff --git a/research_journal.md b/research_journal.md index 243c94c..689861b 100644 --- a/research_journal.md +++ b/research_journal.md @@ -102,3 +102,12 @@ Debugging: So I got it training, but during imagination it passes in a single token with no past steps. But the slicer seems to need at least on block? And so I get none? hmm it's because num_kept_tokens is 16 not 1. So there should be a whole block passed in ? + +wait apparently it's also a problem in the normal repo.... I confuse! maybe it's my config! maybe I need >larger than block size. nope + +hmm it still happens in the original repo with my debug params. maybe it's my debug params + + +... trying a full run without my debug params... + +note trains.world_model.batch_num_samples:4 fill 20GB gpu ram for the 3b stability ai llm From b97a499a195467ac050091a28b7afe11bfdb2086 Mon Sep 17 00:00:00 2001 From: wassname Date: Mon, 13 Nov 2023 07:00:17 +0800 Subject: [PATCH 08/30] Fix bugs and improve performance in training process --- .vscode/launch.json | 10 +++++----- research_journal.md | 36 ++++++++++++++++++++++++++++++++++++ src/envs/world_model_env.py | 5 +++-- src/models/slicer.py | 3 ++- src/models/transformer.py | 10 +++++++++- 5 files changed, 55 insertions(+), 9 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index e0c9bdf..06bb888 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -17,11 +17,11 @@ "env.train.id=BreakoutNoFrameskip-v4", // # make it start early "training.tokenizer.start_after_epochs=1", - "training.world_model.start_after_epochs=2", - "training.actor_critic.start_after_epochs=3", - "training.tokenizer.steps_per_epoch=40", - "training.world_model.steps_per_epoch=40", - "training.actor_critic.steps_per_epoch=40", + "training.world_model.start_after_epochs=1", + "training.actor_critic.start_after_epochs=1", + "training.tokenizer.steps_per_epoch=10", + "training.world_model.steps_per_epoch=10", + "training.actor_critic.steps_per_epoch=10", ] } ] diff --git a/research_journal.md b/research_journal.md index 689861b..94d442f 100644 --- a/research_journal.md +++ b/research_journal.md @@ -111,3 +111,39 @@ hmm it still happens in the original repo with my debug params. maybe it's my de ... trying a full run without my debug params... note trains.world_model.batch_num_samples:4 fill 20GB gpu ram for the 3b stability ai llm + +ok even with a full run I get the error. I think it's a bug in the original repo. I'll try to debug it there. + + Epoch 51 / 600 + + Experience collection (train_dataset): 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 200/200 [00:03<00:00, 59.91it/s] + Training tokenizer: 100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 200/200 [00:17<00:00, 11.53it/s] + Training world_model: 100%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 200/200 [02:11<00:00, 1.53it/s] + Training actor_critic: 0%| | 0/200 [00:00 None: assert self.keys_values_wm is not None and self.num_observations_tokens is not None - num_passes = 1 + self.num_observations_tokens if should_predict_next_obs else 1 + num_passes = 2 + self.num_observations_tokens if should_predict_next_obs else 1 output_sequence, obs_tokens = [], [] @@ -71,7 +71,8 @@ class WorldModelEnv: outputs_wm = self.world_model(token, past_keys_values=self.keys_values_wm) output_sequence.append(outputs_wm.output_sequence) - if k == 0: + # if k == 0: + if self.world_model(token, past_keys_values=self.keys_values_wm).logits_rewards.shape[1] > 0: reward = Categorical(logits=outputs_wm.logits_rewards).sample().float().cpu().numpy().reshape(-1) - 1 # (B,) done = Categorical(logits=outputs_wm.logits_ends).sample().cpu().numpy().astype(bool).reshape(-1) # (B,) diff --git a/src/models/slicer.py b/src/models/slicer.py index 6566271..49563e9 100644 --- a/src/models/slicer.py +++ b/src/models/slicer.py @@ -31,7 +31,8 @@ class Head(Slicer): self.head_module = head_module def forward(self, x: torch.Tensor, num_steps: int, prev_steps: int) -> torch.Tensor: - x_sliced = x[:, self.compute_slice(num_steps, prev_steps)] # x is (B, T, E) + s = self.compute_slice(num_steps, prev_steps) + x_sliced = x[:, s] # x is (B, T, E) return self.head_module(x_sliced) diff --git a/src/models/transformer.py b/src/models/transformer.py index 7c0c44c..ecf68ae 100644 --- a/src/models/transformer.py +++ b/src/models/transformer.py @@ -117,7 +117,7 @@ class Transformer(nn.Module): # @torch.cuda.amp.autocast(dtype=torch.bfloat16) def forward(self, sequences: torch.Tensor, past_keys_values: Optional[KeysValues] = None) -> torch.Tensor: - # assert past_keys_values is None or len(past_keys_values) == len(self.blocks) + assert past_keys_values is None or len(past_keys_values) == self.config.num_layers sequences = sequences.to(torch.bfloat16) outputs = self.model( inputs_embeds=sequences, @@ -126,6 +126,14 @@ class Transformer(nn.Module): ) x = outputs.logits.to(torch.float32) x = self.ln_f(x) + + # fake it, since it's used to keep track of steps + if past_keys_values is not None: + k_size = past_keys_values[0]._k_cache._cache.size() + k_size = (*k_size[:2], 1, *k_size[3:]) + v_size = past_keys_values[0]._v_cache._cache.size() + v_size = (*v_size[:2], 1, *v_size[3:]) + past_keys_values[0].update(torch.rand(k_size), torch.rand(v_size)) return x From e417790413bd143dd52ed3847c339f964eb96d40 Mon Sep 17 00:00:00 2001 From: wassname Date: Mon, 13 Nov 2023 08:11:13 +0800 Subject: [PATCH 09/30] fix kv_cache faking? --- src/models/transformer.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/models/transformer.py b/src/models/transformer.py index ecf68ae..9b28849 100644 --- a/src/models/transformer.py +++ b/src/models/transformer.py @@ -130,10 +130,10 @@ class Transformer(nn.Module): # fake it, since it's used to keep track of steps if past_keys_values is not None: k_size = past_keys_values[0]._k_cache._cache.size() - k_size = (*k_size[:2], 1, *k_size[3:]) - v_size = past_keys_values[0]._v_cache._cache.size() - v_size = (*v_size[:2], 1, *v_size[3:]) - past_keys_values[0].update(torch.rand(k_size), torch.rand(v_size)) + # k_size = (x.shape[0], x.shape[1], x.shape[1], 1) + # v_size = past_keys_values[0]._v_cache._cache.size() + v_size = (k_size[0], k_size[1], x.shape[1], k_size[3]) + past_keys_values[0].update(torch.rand(v_size), torch.rand(v_size)) return x From e495db47e4fe1b6d604ee5f7f63878d6e11922a1 Mon Sep 17 00:00:00 2001 From: wassname Date: Mon, 13 Nov 2023 17:17:03 +0800 Subject: [PATCH 10/30] Fix num_passes calculation in WorldModelEnv.step() --- src/envs/world_model_env.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/envs/world_model_env.py b/src/envs/world_model_env.py index 13af000..6188d2c 100644 --- a/src/envs/world_model_env.py +++ b/src/envs/world_model_env.py @@ -56,7 +56,7 @@ class WorldModelEnv: def step(self, action: Union[int, np.ndarray, torch.LongTensor], should_predict_next_obs: bool = True) -> None: assert self.keys_values_wm is not None and self.num_observations_tokens is not None - num_passes = 2 + self.num_observations_tokens if should_predict_next_obs else 1 + num_passes = 1 + self.num_observations_tokens if should_predict_next_obs else 1 output_sequence, obs_tokens = [], [] @@ -71,8 +71,8 @@ class WorldModelEnv: outputs_wm = self.world_model(token, past_keys_values=self.keys_values_wm) output_sequence.append(outputs_wm.output_sequence) - # if k == 0: - if self.world_model(token, past_keys_values=self.keys_values_wm).logits_rewards.shape[1] > 0: + # if outputs_wm.logits_rewards.shape[1] > 0: + if k == 0: reward = Categorical(logits=outputs_wm.logits_rewards).sample().float().cpu().numpy().reshape(-1) - 1 # (B,) done = Categorical(logits=outputs_wm.logits_ends).sample().cpu().numpy().astype(bool).reshape(-1) # (B,) From 106027a7f98a38ec7c70682f8542c8329edb3cea Mon Sep 17 00:00:00 2001 From: wassname Date: Tue, 14 Nov 2023 10:42:17 +0800 Subject: [PATCH 11/30] add 1b model, use contextlib, --- config/trainer.yaml | 4 +-- config/world_model/default.yaml | 2 +- research_journal.md | 16 +++++++++++ src/models/actor_critic.py | 4 +++ src/models/transformer.py | 51 +++++++++++++++++++++++++++------ src/utils.py | 4 ++- 6 files changed, 68 insertions(+), 13 deletions(-) diff --git a/config/trainer.yaml b/config/trainer.yaml index 01af86e..81f5e88 100644 --- a/config/trainer.yaml +++ b/config/trainer.yaml @@ -60,14 +60,14 @@ training: start_after_epochs: 5 steps_per_epoch: 200 world_model: - batch_num_samples: 4 + batch_num_samples: 8 grad_acc_steps: 1 max_grad_norm: 10.0 weight_decay: 0.01 start_after_epochs: 25 steps_per_epoch: 200 actor_critic: - batch_num_samples: 8 + batch_num_samples: 32 grad_acc_steps: 1 max_grad_norm: 10.0 start_after_epochs: 50 diff --git a/config/world_model/default.yaml b/config/world_model/default.yaml index d03a227..cb9fcd3 100644 --- a/config/world_model/default.yaml +++ b/config/world_model/default.yaml @@ -4,7 +4,7 @@ max_blocks: 20 attention: 'causal' num_layers: 10 num_heads: 4 -embed_dim: 2560 # change this to whatever the embedding dimension is in your pretrained llm +embed_dim: 2048 # change this to whatever the embedding dimension is in your pretrained llm 2048 for llama. 2560 for stablelm embed_pdrop: 0.1 resid_pdrop: 0.1 attn_pdrop: 0.1 diff --git a/research_journal.md b/research_journal.md index 94d442f..bfd295d 100644 --- a/research_journal.md +++ b/research_journal.md @@ -147,3 +147,19 @@ ok even with a full run I get the error. I think it's a bug in the original repo RuntimeError: cannot reshape tensor of 0 elements into shape [8, 0, -1] because the unspecified dimension size -1 can be any value and is ambiguous Oh maybe it's because we don't keep track of KV cache, but it's actually used to track number of steps!! + +# 2023-11-13 20:11:51 + +I go it working byt ut takes 30 seconds for one one actor critic batch, werird + +Experience collection (train_dataset): 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 200/200 [00:03<00:00, 60.45it/s] +Training tokenizer: 100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 200/200 [00:17<00:00, 11.26it/s] +Training world_model: 100%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 200/200 [02:12<00:00, 1.51it/s] +Training actor_critic: 82%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▍ | 165/200 [1:01:43<13:24, 22.99s/it] + + +hm maybe it's just the face it has to backprop throguh the whole LLM :( damn... is there another way to train it? Daym. How many params did the original have? + +well running eval on the transformer brought it down from 100sec to 60, but it's still huge. + +But then why is the model training fast? It makes not sense diff --git a/src/models/actor_critic.py b/src/models/actor_critic.py index c22e641..69dc3de 100644 --- a/src/models/actor_critic.py +++ b/src/models/actor_critic.py @@ -146,6 +146,10 @@ class ActorCritic(nn.Module): outputs_ac = self(obs) action_token = Categorical(logits=outputs_ac.logits_actions).sample() + + # TODO this is really slow, I guess we need grad? does it help to put it in eval? no + # wm_env.world_model.eval() + obs, reward, done, _ = wm_env.step(action_token, should_predict_next_obs=(k < horizon - 1)) all_actions.append(action_token) diff --git a/src/models/transformer.py b/src/models/transformer.py index 9b28849..40b4430 100644 --- a/src/models/transformer.py +++ b/src/models/transformer.py @@ -5,7 +5,7 @@ Credits to https://github.com/karpathy/minGPT from dataclasses import dataclass import math from typing import Optional - +from contextlib import contextmanager from einops import rearrange import torch import torch.nn as nn @@ -30,7 +30,9 @@ class TransformerConfig: resid_pdrop: float attn_pdrop: float - model_name: str = "stabilityai/stablelm-3b-4e1t" + # model_name: str = "stabilityai/stablelm-3b-4e1t" + # https://huggingface.co/PY007/TinyLlama-1.1B-intermediate-step-715k-1.5T + model_name: str = "PY007/TinyLlama-1.1B-intermediate-step-715k-1.5T" dropout: float = 0 rank: int = 32 z_dim: int = 768 @@ -118,13 +120,14 @@ class Transformer(nn.Module): # @torch.cuda.amp.autocast(dtype=torch.bfloat16) def forward(self, sequences: torch.Tensor, past_keys_values: Optional[KeysValues] = None) -> torch.Tensor: assert past_keys_values is None or len(past_keys_values) == self.config.num_layers - sequences = sequences.to(torch.bfloat16) - outputs = self.model( - inputs_embeds=sequences, - return_dict=True, - output_hidden_states=True, - ) - x = outputs.logits.to(torch.float32) + with set_adapter(self.model, "dynamics"), disable_causal_mask(), torch.cuda.amp.autocast(dtype=torch.bfloat16): + # sequences = sequences.to(torch.bfloat16) + outputs = self.model( + inputs_embeds=sequences, + return_dict=True, + output_hidden_states=True, + ) + x = outputs.logits#.to(torch.float32) x = self.ln_f(x) # fake it, since it's used to keep track of steps @@ -136,6 +139,8 @@ class Transformer(nn.Module): past_keys_values[0].update(torch.rand(v_size), torch.rand(v_size)) return x + + from transformers import AutoTokenizer, AutoModelForCausalLM, BitsAndBytesConfig from peft import PeftModel, LoraConfig @@ -179,3 +184,31 @@ def load_pretrained_model(config, device="cuda:0"): base_model_peft.add_adapter("dynamics", peft_config) print(base_model_peft.print_trainable_parameters()) return base_model_peft + +@contextmanager +def set_adapter(model, adapter_name): + old_adapter_name = model.active_adapter + try: + if adapter_name is not None: + model.set_adapter(adapter_name) + yield model + else: + with model.disable_adapter(): + yield model + finally: + model.set_adapter(old_adapter_name) + +@contextmanager +def disable_causal_mask(): + import transformers.models.llama.modeling_llama as modeling + + decoder_fn = modeling._make_causal_mask + + def encoder_fn(*args, **kwargs): + return torch.zeros_like(decoder_fn(*args, **kwargs)) + + try: + modeling._make_causal_mask = encoder_fn + yield + finally: + modeling._make_causal_mask = decoder_fn diff --git a/src/utils.py b/src/utils.py index 1f134d4..ed8e31a 100644 --- a/src/utils.py +++ b/src/utils.py @@ -10,6 +10,8 @@ import torch.nn as nn from episode import Episode +from transformers.pytorch_utils import ALL_LAYERNORM_LAYERS + def configure_optimizer(model, learning_rate, weight_decay, *blacklist_module_names): """Credits to https://github.com/karpathy/minGPT""" @@ -17,7 +19,7 @@ def configure_optimizer(model, learning_rate, weight_decay, *blacklist_module_na decay = set() no_decay = set() whitelist_weight_modules = (torch.nn.Linear, torch.nn.Conv1d) - blacklist_weight_modules = (torch.nn.LayerNorm, torch.nn.Embedding) + blacklist_weight_modules = tuple(ALL_LAYERNORM_LAYERS+[torch.nn.Embedding]) for mn, m in model.named_modules(): for pn, p in m.named_parameters(): fpn = '%s.%s' % (mn, pn) if mn else pn # full param name From 1b6462991bd1316469c3ef01bc6f6f7e55cb10ea Mon Sep 17 00:00:00 2001 From: wassname Date: Thu, 16 Nov 2023 17:17:57 +0800 Subject: [PATCH 12/30] smaller horizon, smaller lstm. 100x faster actor_critic. does it learn though? --- config/trainer.yaml | 4 ++-- config/world_model/default.yaml | 2 +- img/2023-11-16-13-01-11.png | Bin 0 -> 85598 bytes research_journal.md | 36 ++++++++++++++++++++++++++++++++ src/envs/world_model_env.py | 3 +-- src/models/actor_critic.py | 13 ++++++------ src/trainer.py | 1 + 7 files changed, 48 insertions(+), 11 deletions(-) create mode 100644 img/2023-11-16-13-01-11.png diff --git a/config/trainer.yaml b/config/trainer.yaml index 81f5e88..f8022a0 100644 --- a/config/trainer.yaml +++ b/config/trainer.yaml @@ -54,7 +54,7 @@ training: should: True learning_rate: 0.0001 tokenizer: - batch_num_samples: 32 + batch_num_samples: 128 grad_acc_steps: 1 max_grad_norm: 10.0 start_after_epochs: 5 @@ -71,7 +71,7 @@ training: grad_acc_steps: 1 max_grad_norm: 10.0 start_after_epochs: 50 - steps_per_epoch: 200 + steps_per_epoch: 20 imagine_horizon: ${common.sequence_length} burn_in: 20 gamma: 0.995 diff --git a/config/world_model/default.yaml b/config/world_model/default.yaml index cb9fcd3..16769b7 100644 --- a/config/world_model/default.yaml +++ b/config/world_model/default.yaml @@ -1,6 +1,6 @@ _target_: models.TransformerConfig tokens_per_block: 17 -max_blocks: 20 +max_blocks: 10 attention: 'causal' num_layers: 10 num_heads: 4 diff --git a/img/2023-11-16-13-01-11.png b/img/2023-11-16-13-01-11.png new file mode 100644 index 0000000000000000000000000000000000000000..00f3a5769a0b290f0373ff42aadc12f001e72cc4 GIT binary patch literal 85598 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�BfYi4u6exu#Surfi1!3fERmzOg}zBcag|w<0T1(W7{#MH15Tbq+@qAX@j4>$ zeBt-xCT}66`)NEN5CGy&ZQg7C#0{sx`sdC8soi9k3Ese(laXqm#9{MJ@;$m(VAI!2 z!8PA5u+=G0lX0m8eGl*am5@U)Bss;lh5P-Gb#$mMxfjn^zu)D>or`rbWe%HT%@80Z9jAvgcRnd1gCCbQ0RF^22fZWLalW!|@ry#Yt(@!Zc7 zroqTju_X2xCg4$?9fgrcutng0ZjN<0{6om@US<9CKhXZI$rc6hUu?s=3EErN$N9fZ zsjkMPE}(7z(ACZoglO9r0!}svK;P%C2e=ogqa_f5*Q?$6m7ai9ld#{lm*eii_Bi=| z&O(@|s;4aZZigRs&4FE@)@a7Sw*3k%L8H*j;?i)3i#|MKyGDY|JkS?wTCj;Qv}Xx< z(tkYwZ}YuZLe`<)?y*{7Y?ehL`+6`^W58LnZsXuYHKh4C4`(E#iBSby-=KX69 zuF!kkJE;)UPCuc*o=e>^lbs#Hu%1)yCM4CPur}@{lQHDU`e4>bOB@m+-r9CxH$Ty& zx?ctM<~uEUj|-2>X@81Yfmc?lm)~}759}*MwdVx(<-OUFhU6f#j)j0l=f>bH=1>@( zs-@Ji5ODFu@47rERGsq<$Y%b2%B6vuBW(DMaC%xk_D_o#@?7j`W-yV|U~aaeuOv(A zxG?@qC#j!D$-rT(VfjVp{$+Mrjh{9*S0K41QbhkHGLyCWL(p$vTPaB_I&@1Ea(Yoe zT}RvONKATt&|6HZL~OlBuq_=#UjVApReAmWVX1YZrk;JQp@5HK2BC!(V}4!z7v}IH zPYp`<38ONS;(RWM(_k!NRc{;zk|ILM$V@5(U3sh zq>g)_@>a1yk!Q@dtChyPuXZhpmJwd~gb~5z%=s zO?)v5}fk zN#Tfgj{OkwdjqF`xT0|Uyi=R^HbnZGALN-WeO^ezvud!E#cLS&Mbpni+dS{(nSr-0X(to{M*U2 zIKA>OtLiseNV32D9DZPpGg^}4iTF;g98X@UoX#eaYo0PCj&B6|t++Lt%OXYnZbXZ; zVPY{P@!tD(6#soAwRi2DpH6?662DXCt4O^O{sPsY!hf3mo8O+pn3(D|_eJ{%=-;wP zo%}QRV`##mGpD@NLxXS#LCiGBOgJ?xY&y0lZj%R_Ly7S5$PM=TMoOopNwyqz5jUMV zab=(}i!D3;N9~Fs-@jH2gfpj^2R!Md$~_34Z>`pmACrxZpH$`+*?;|fPo=)Oa{NJE zE0Ds7{3C9wq|ju!-+xn5WDq{9oSD6ECxGUkaecs)-z;yPbPtezrUNNROKN$#TL=9H z?0E_Wa{BxmmfA>N*0(x^AN5ma7qOZPo*+zmG|@vg zOAjD4ZO+eJo}++P|Uhc z;_9vcw6w^wqTGJ7m`FR%zLHj*&Lk5jN!mNUkPpjLH@{UjbS142!Xz}ZVLrm|nACGrrw>#OQlTZG4JHJPlOoS(=1ENHp3tbBc@Yl-^5XjYFHxd~lxJm5*sp{@8 zzYe-aKq2!Ba5&g8b+H?{w|A4^vm@4lIYV#4@woR&AV?j0ERv1RuR^uB;%z=~ zXNKR4STV9wC(hlQ719{UEmm$IvaT!gFQQ3^(@`7j1Ph?1`>4?OK_KIb)YP>CM{5?! z(rp!yt>)p^(PUxzx9)xk)r?0uA2zgIG%iMYt>?c_nRUnb%WPgTv z7S)O^1G0go2>a#ge&x35Kj#hy|-6pR~qRaJ~%?vwgM)w+(fJ!)-RtG%85R-fGN zlkYo$NK42#jI`NvA2~W2yWOhGy(QFjJ~Euj-318Cmy?H#4$i%$(ht}?HvKAeI|m2u zqL{`<+O)LXHuW9`-R9+J0k9EpKAs0V;q;qtXquCnCiIaSW9`@hWBJ-SOX7mRM39!J zrn0Im1jaG0Xs*i;{2MoD#e9RrOm8Y7uXLLksy&jLEgP$Iw~Z2TAQ1O!?BFj1AhnF5=qel_rYFpDR!LK?zAOI848q}N1!=9rrQUxP-CAz8y|ON;Bz09 zRn~32xo&E;JCcO0o+tYRsm(MYzMb1(o($T3UlGg1?{UjPDI2bj;6CiDD1p{hLYEbD ziQL6>1%h;z{tlm46v0(xuEc`uoRxgG`B&0TE7Xt>9xdYhVgdtBTulVBF@`x_&Rq+n+pDp)0vsy;^;(h-^9#t%`z0H(C` ze%z>%ZYA?j`^n5hQ1r$y$NALi_JzOR7}j?`55e`8ii;Gqpz| zZ>V~3zz01a2I*hS7Q8xz)lmkw-w$#)mm;2GHqT@>|H5zNwuZjZZMC7?+>rd5S8Gy{>&4H7)Zv1dzLE!!V9&)aK|$UPo#iNYG?A zZpiz{%ir;;r~71`Qp~SKh|AvBm3mr^X$J!NKDU0-?JPVGM>b=;d_5tzuTylQXiZ~n zN0(j~LI@7I^+^AkosJx_a3g7q>atLW9@}eeOWoTe=r&bPg3z9hnX#PqKl&P_BpnMr zZUEJ-c?obAJB}<+nWPe4ryq{G|K*^bt**gatoI;Ye&VJv9lMpg9ZQ$wgwwPg^VHz$ z^J`I64>Cn0U~p)smKV)5G61j$oPPB=w%zyo;<}`I0Rr|tJiK;4LEmgw>bCU&H#bcq z7U;=y>!bSn9A9J&bi+}Edw@3^aA^WI>B3wgUP1hijt|Nc1Il#+7uFX(p;;hR=)#Vg z>#W`JxBfLvN6UjpLge1v+~ci5GjaQ30j@1&^uZE}%@Y5(xE!N%Vk0+8x?p?(=M?YP zE3&;H12?7P!^fF}YNSj9VJakwW{!s>&y%PW--9+*hYl?HReBms@wlF68$`VG9;n2> z>|_Cf%+J{hhRIHw)tB!A9?y)6Ktsj6oh7wr0H~Mp?MA|^;CKqBh2?VgH2HMIdva+` zoB2@e?-9dRWseFYwlf7ke1rSZ<#Ro)B%P6>1ZQNw5N*L8j{01jwPWk!&xzL)@4@oVm*ScM#Bqj&F;7Qc#w%pl?_qyJsg)Pr&GX4<$d9nj=R81(j>WwP zf!KXV%+;L89mEh86f1|o@uZ>EM@#Zf}N=U$- zoxF5C;oim`UJzoKOTl`M(=IIT&i#E^^s$8;cjY_f>ie~!p|(4f76fQwo3FtjQ2Hq^ z>+s5Towes>X{Bf`w$uX(K5up+shm5RsYaxg%x_J@QzxS#;s%%#PnlUmP)*rzVg=MZ zK^8eTmHmb)?8lX_Op#)Jvp5J9XY> zJsGm+w!GBfI(mZydugp8C#O%p&)XKQ#478$v^EXt^_cS$L*UFNs-o;&H%MBV{1^+yx@3Q&2{O}_&PN=)vhTK_D5QV| zVvlV8D4D2=+vxO|X&}zi$Zl7P@tZzkmNg2{Wc#4uGVaP^R96tFz{fQ?MfX%_Sjq%x z4;J=EEW4an`&h~W^Zd{HF%>u!_&}ChN`JAm(v$tmogbi7kS3>ux_u{VtDzT zZqRm1Qf!!>wkF>eZk4$b2gWiBK5?r2P-erTF^iZpS-kcg-u~;y7x|vA-#$pB#BvW$ zu)9)HXBvDbqKzO|XspqcYSd5QUj5Bip#%$=L=Ru!1I$rsXQ^%j5W`m9)G;6j`e7Tm z6)rh@Lc(~d4JZI8mjU!Jx5R#ZeF5cUIhPf&efZ=Z=RCKSQQ82q<^U~uupg*Byl&5a zc1r1!l_N{Nc7^Rds>q_PCq?+kZ{`WB}<512})Y zhEjl-yJ+WBW^H5kWd?JaTV4xiEWi9a!c4a>)`R17bevDO%hPg+h*Oz%x3kg8Q<4cj zI<+aH@m=k~>_AYPT@FvFZTw}}Wv=}i5XsF99v`piRX=5QpMTC6o;mm$2scU^Q(TN$ z)Z~&Lv)EnJyMFR=p;RMYlSv8X0#Ue6&S+3$oPA8W_w61V`M5sk7B;8!Su76X5KS*K znV4EEuymSBudS;3n!y}PWL!S~vqMog=WpkT%A(4(U#{o(QDrRJYX?$mf6Y_ZPhZKR zUkc7t>bN#Cng**o3=Rxmj2yP+26-$-{VELhYEg&^&u)UNIw2;AWmTV0rTh|S2$rxE z>QFZmkO;j_z`b1Yce`xcU)bNH{pH`%By_WC2HBVLExQGB%vPpux^IBcie`V^kOO7o zyYRP}7YN?YZu){s5dm$Y@b}e?G!QYQkHEQ$_37D*YC!<|Y5N=O35T~qb9VN*OAorY z2Tobqqyg=32)ENXd;yWAb!1_+zu3Lk*2FEeUjcFG z$lB}a(9OuGj`dU;Jw_jMTc9?t2c2etRMT}verG^!%faf}YViytE>gr(mwSI3FzPhz zUSQ1TM3uy!g{<}l7-T!m*nc8mkObKTU{wO9T%r}9@uD)zG% za%@+-Gj>DpYuRhnI#!rzeqFJQ{`3|_J{YmZAc2GwD7U2+XNEBvWFx z`eVqfTu!&xICS=#BP=c&TI8F!1AA0ia~6`iy zOc%4owKnV3X1O5XUW^dVHnmm#A!%2}cfxen#i&fr(AB4Z$Qz_5ql@KE#SSlOK#tcn zKijnfQKq(3vNJP5*wT^)*N}I(%l!mxLZ0|fy$b3cm$=Jruw*3Hx)7zcKZNM4z=r9H z(e%!Ee8UFt{r}(?kmM;WQyrUB?FU0rUwdlfs|tw4=laO8@xTeW3zlE8`Z zo7tDfC}S98z*+dbN+>IO_g$82 ze3)^CkM7<{i>Q|FiArO-_zYl~9`u_ZNmL2%SlJeq_=@K)poZq&W_1$iyjaP8zkJT% z<`_?y{$Z9J@A+|UkGFywuQk_wz7IZ{iw!l39HaOFQe2l!34VE!6u&sI-^}2MKFu8? zt%7wCr1PzW33*Hooj)Cip4Wt_%@AJo%?b^dYsdz*xGU@ME>*0`Zydm=Z#hq@IrBg% zS0HmBOw;(Gb?m5!^Jx8{zB>5HvJcmBpK5~QKXsr{8ti3%2oD3EbK5E(xd}Gb=Zy|E zj*=Z&ndBpWh}Ha&9C0VY}|HzsW$+ z7SY^P>2)7&8BymAS_v+@!FVi%YGE{r60cmoHXLq%c3$WlxES7vmO#(vM;$VxW_jG@ zzlDijeHV6culNt9XxFq2K&~W&F7Du|e)Hy5c+AOoZ%X4%TEP<%rREzy3abl_@Cp8h z%aIRsrhZj@Fc&{~Blnkd)cqf9^f}NiSwV4yiQn#GIgzqnwySp!V1GIqSqyG@P(QiA zOf~@9YuzS|sIQN<``LhrtU{YJSt1d$xdt2OvmD)y)U3<1{G;61{AzIpoLe{v$^+>u z(<5dgx(8B|n)`PD!Iu(;B7!8Sf&M_2DQ~0LSYxt3Kye*X5$Tk5_f8j@Q-yW1U259P zUNc6`7n(lkuWV|LRzA(r^VN%aBX7^~{3!J|&x1R%Say>7H00(Dyl&4ouO7_ysyZ>} zVn^44zINUP5GfSiN{#j_#a>%4?(2{v+&dPemi5-N^F=*YHO?Mi-r+ZeHq2MoCDNd9 z6o?OTu6Q1f3Uh`0PUH<%><5y|iOM5c^{T~S)5f#mp{jKi5!dNRr-a_g_OI0W&}*|r zoi&GgcOSlgF-w1=2!Lxr+euW^Vx?%Au+jbxLErQV)%~k7H=Vw={`Pd<8scU7NlBKZ zz?9Dn$Pjt-q%n3Ixmj2y>wNK?8c*w;%uV6$HP@++IfRa{t1$#0_>+G>G`T!KXI4~o zED|8w7?gW;J32X7MzoFe|C1a#XJm7s^7tXB3{uvfpam^5we-+kCNEqdxELn2^&Uf! zh1u%#DbRXWWL_jS(@fb}trRD_i!26zZUD(n%9OvbnVy{esQ$&BrK(j`%YK*h(c~?H zm_rW0Xhh}7xt%s_)X56))6CCFj5LK)AMz*nhv;5FzeaPVtTgwtSr$C`&_4U66?t#q zWBb3TQBqB%on^k$?hC|m$%RE`(T)8!f0q-`H}mg!zz^Nn>F`+`*WBOW?tY)Hedh8u zNODHz37yg#lk;x6XCoanO~lc>a}Qr30~M$s=4ta(?84X~zVU+p^oa_Xm%SrC@ixj- zVIW3X`)}QoUlUg6BXAOP8lJp!bNDi)X#b*D80+gBv4M_1L0R>sT$#K-Vh(wShPN_P z!)%3ZUInjQQS^?K)>E0evabJCd(JoDf#{aChYG9Z?9S12ItAi=6Mcd z)8AS0nIY*iIQ!YS9}j9~@fNZick zJuNO@sfdb+Jk8#;NES}oB<7LNv*5$B5nSa&6rxm4U&MvzL?&OQrMHIu1=AhD`yC~n zL)~8ucv^-`Kkg0Z*|k-b9=2Nu`C72Ji|ft|#w93f%(zm6=weY)IT%(hALot(3>ly^ z?}qmXj90Y{z-uN~ok2}wv{luJzzZwL7WA}QaKFmYVZXY+Fsft9*d0k!f#(HCxyR%qC0T;U& zR5qX6VZ+vx?qSwb9z#hFx9?Yy1!J%2n++m*ey6C@Njv$XW^ zSqw0iB+lgnJsiV{UDq9n0#nBp&kiPvA|qPT4tRPFn-|G_8dsXPzZIn4{E7_qp4}Nt zPSNhj2z7nW$^R?r&ppsG)7q8%teB9pgZspnuS7~eHUhT7Zb+@%WyWkNnt^_V?hX$H z*9zT?$6;yf_{oHrMw$aupu9BGkd5=E)1KcQr6RY><3ZCa0zTs@KP*DBqD_zuKWnT6 ze_nZc8AoK9rQ9~Wa@ldp`MtI&xxNnn4}eXZ&O3JK!+T)auu&HJY$OBtuk6`K!_!#- zZS4j>H&sJj?I~w0Gq0xuU`)`?kllw$?Fz0V4(_d+-ad2{>a&K=mi_p#ib!C9Fr?+# z`H_%eA5fpQq%hjWeap^|61#Dm9EE-aDU)O%th5;_EAtg_0zFIe*qQW)V^Hz4%*NR}X)f(6@^F_@E2YZ3jkm-AneT_$#c94U#!CEt2g$x9 z-~#BkZr*8`YMyLg9Zhuq2;hV&Evt*y!!fuS|4`$cJueRsXxuT6ldztSrt0i@+~&6P zoxb5+A&7~1C*Jn6F_ZQ`a{)(Im$Np zElTQG(14m1&dcY{jA@8Iz7}$y#*@!yRSoKfxQmtW;es?~T1`_dbDCa0=X<*qr!x@; zW=SHxONaCH6iyZ0$RBx~b6rs(t-~2@bH~LPH&_is04gc^RNzKlrJ*tI)mr<%QPW{8 z*wi!Xider)r8i2pf{E{f=*lZTYsnG-Qh()9{p@uj>)z>dYut8}gk@g2+oiNDCNq{M z1_gt4b{m~+ZJKpXkHJ|vMh*Q2U#Slm!%jkrvhINRtxc)$=6#;0)WHAZOyIm(89M`kw49jYCJdxm!YInnApM4xR zopLd{`+9}n=(1svc)3r{?!o_h`0`WR6=B2nt8dA5j~^qZ1&xVAJ~ga2voWY-#(sD! z&t>!V67)rD#0{7A-rhXl3#RqsmbV~~n*S-TGa|p!b*1-myKC?3pr+KF@RiIbuHo4* z9@7b+9s&zn*~YK1F?tZsGxynsP2n>vz6x^t0At2M7eZ$fDx|9OE#V3w(j-iP1wLNX z?IKtDv0U~71ghz$`J6`iDmV7cYhxeQ5MhFQ?tAyYvtEPYZKjL;@qUDhT~vBPP_mYB zgCKgVTAOa2t1tcybni~+x7FNO-%YCRU!=7Lw6VV3is_&F0`u z&lZM(J`_8cwzP;T@Ui5g|Fe-Oz}l_$P|%&cNK;B zfm|EkldH@D{?W<#25=g4h^=bp9qrY^1D6JFRbC`Ao0=1E2V(-ykX^yG%Cmkhz7tU7RpM;Lyr>7{SJ#N}gWK`^qR=pv@ zl!y%mKpKl59k8ShPFSp8Cn#j{9=%*`aC=wIB?5B9}A|h$kqs#q> zyBe$*LZ2YB>X_OpaZ1^m3k&l~(jSGzusqTvxAewfWd1-zc*4$z$d~j zh{@x~E1Sh5$sSn0p&+ttgeTKB1rx{rbge@S#<9K|^Z4;@9h8h4%cp34n5QHcOR@?* z;-YWb?_1je%AxrOo;;G4woJJ(XeuHz(@wDxvU=7B9G4p|*^0RfS<$>~jvZJTh9SBQ z@{u;~I2nN9cIBaP*v&yY8nubhco^6RWd-#FEqxQpd>Y@9~XD;)~<0zJBOWYBO_Bmu5J5wU$qiH&c zJ|7=-E{7Ua3ryqmAXcIdy!^b|yP#9{0(K2kF-xOMv*j13cR}B0AeLe@x|!GuKL8h3 zMMdS9MJLMS^lt@J9}A(s(B_0Mm4(QzURY5E zb~4&6&7!CSQg@1)Uh+DMu=3no^`$vUnEthBrg3F3U)Tk8bXCd;=~*N$*U&4J_!>%9 z)$#0J9Bk+Hl^<=hU?Wo(t$dLZ+VLcTy9B>d)mkh9SF?bLJopFI-QwRUxm})JMm|fL~{SLM7zH zuqDuiyO#1p?cpAV7~aO7QjS0DaFYcu4-v&OT*pQWGVDB2Z_>4<_ZKt^f7=ybo>*Qj zf9KwiX?iT2^^4lEgwD;{cyde*yLh5UA|abpk{tC1knZdUo^F zyR`0c`pe68#rVE7i|Ftqdc;<`-#S(yKg{Gx(HZ!J=UW$#*>>JTs(=t0Nuv!wM^M)Z5*-R4mlCO{v)L)B%N0s{U@RK*&DQXk;%95EJxb-RIAv@Pjl3FPQE_8R7Q! zTKy{E`X4`qN*-O_;7+g%luSY|-c?7pR#2p+R31)FDbLh4Vszb&2bL%qh- z#o1E=iL7xuX}H1k2Nx#v@(P2(#c*9oUi&0$L}_2EpGAXawUUu?uw%Y)QQuEi*zbLe zwbk*E2b>pw2~%loXK7)dnA}3N5apj3(fjoJV)Y#j%sneXYJQz34cih9ttGpiRDvm2 zEvv3xaCf--1PAw@BXO|&it>$p4K-duJj!C%amGwqX&+odsHwr*vm71%s7Fmdot?g) zU$*ya(M#C^;sy4~s;XeMR>V{w2F1!&Tx}GbKOY;F7w!-KbtHChO$VH~9J7+5h)?+J z1~ZfH#Sco>=L+969uSm2xUpG1xkUbS^p{Wk9Imw`8o%eu%s`KH-(80_RX@v=NLsTP zR4O!gdPSxIoTvP5*zNP@hyu}Z5!!Hx=nw3(&DBd{?P>8hIj!kcg7(Za6MJW_E4aM5 za#7Z!VbQR)P2i!Yhk=F7_(*jlJ)8Wih)5L%sb$%?do{&h>iKeyMOei5>T8rdW12$r zLRk7K7z!DQEY&%pciVKIc??#$+!7glu| z`d@O#z)~rBR*lNaFgqb{LGD9~fVLb@xhk}Uoq47`?F4HF;hQpf=&O+dElS4pLXvpa zs96Q%ixUS?UO!BP0Vd7f-XJS-Cj_6rId{fsh#sF|B&*UC3%C;42Dl~tDp-L7_fJ}@ zJi0H9m0$|@(*o5(^SoD`m9{|o>Bg{`TIp^KtD=mCJmB5jz+;|#4!1}l6%tBZ69k^x zbEf!&3Adf~eay;9kP-2V_!;~8!)E{V;rTAhsMGs1YXXhhELdk}1kcvB;X!CjD$pvgeXzQU2lIJP?02fwV^L-16!x__k{29(2+m6k?NA#Y~U znQ6v5)k3%|iK?TX2I!c4@BIFi;e1J`Y=f-5e~oWF)Fj`>{_g@tVphMJq>_L@g}a(7 zwrScSHZJ$OFnewLH&-u!?HXH@w!~ z``4GJ;Ok>p4w&h-*}l$r^gr!a6Kwt4<^e7~5GdiV{`0mS9dJGz;0R;A0*bGKzES=J zd_@pw>NNo{qd_G&AAsEg^je^^F5rTlon2e?_PZu`s8`6(hCcim98{Rn1l|C7J@cx* tooBBF)M)?j8~-m`{QuCe|Nnn_7I@Hq?u?a;>wEj46l7GStE9|6{}0e$Q#Swr literal 0 HcmV?d00001 diff --git a/research_journal.md b/research_journal.md index bfd295d..de33a90 100644 --- a/research_journal.md +++ b/research_journal.md @@ -163,3 +163,39 @@ hm maybe it's just the face it has to backprop throguh the whole LLM :( damn... well running eval on the transformer brought it down from 100sec to 60, but it's still huge. But then why is the model training fast? It makes not sense + +# 2023-11-16 12:54:48 + +Why is agent so slow? Lets find out +- look at diagram +- look at train_agent + - to tokenizer.compute_loss is just tokenizer + - world_model.compute_loss user tokenizer with no grad + - actor_critic? takes an hour!! + - imagine (with grad?) + - x20 = horizon + - self(obs) + - WorldModelEnv.step this has no grad! + - transformer + - tokenizer with no grad + - compute_lambda_returns with no grad + + +So changes: +- the world model step always had no grad! +- I just made the lstm smaller and the horizon smaller +- from 1h to 3m. Reasonable. + + +Experiment: +- try no grad on the model? ok it now takes 20 minutes to train... still slow +with a smaller lstm and only 10 steos ut tajes 8 mins, + +![](img/2023-11-16-13-01-11.png) + +Experience collection (train_dataset): 100%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 200/200 [00:05<00:00, 36.11it/s] +Training tokenizer: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 200/200 [00:55<00:00, 3.61it/s] +Training world_model: 100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 200/200 [01:12<00:00, 2.76it/s] +Training tokenizer: 55sec +Training world_model 72 sec +train actor_critic 3min. It looks like it scales with lstm size! diff --git a/src/envs/world_model_env.py b/src/envs/world_model_env.py index 6188d2c..73e3852 100644 --- a/src/envs/world_model_env.py +++ b/src/envs/world_model_env.py @@ -65,13 +65,12 @@ class WorldModelEnv: token = action.clone().detach() if isinstance(action, torch.Tensor) else torch.tensor(action, dtype=torch.long) token = token.reshape(-1, 1).to(self.device) # (B, 1) + for k in range(num_passes): # assumption that there is only one action token. outputs_wm = self.world_model(token, past_keys_values=self.keys_values_wm) output_sequence.append(outputs_wm.output_sequence) - - # if outputs_wm.logits_rewards.shape[1] > 0: if k == 0: reward = Categorical(logits=outputs_wm.logits_rewards).sample().float().cpu().numpy().reshape(-1) - 1 # (B,) done = Categorical(logits=outputs_wm.logits_ends).sample().cpu().numpy().astype(bool).reshape(-1) # (B,) diff --git a/src/models/actor_critic.py b/src/models/actor_critic.py index 69dc3de..0fff2b6 100644 --- a/src/models/actor_critic.py +++ b/src/models/actor_critic.py @@ -36,6 +36,7 @@ class ImagineOutput: class ActorCritic(nn.Module): def __init__(self, act_vocab_size, use_original_obs: bool = False) -> None: super().__init__() + shrink = 4 self.use_original_obs = use_original_obs self.conv1 = nn.Conv2d(3, 32, 3, stride=1, padding=1) self.maxp1 = nn.MaxPool2d(2, 2) @@ -43,15 +44,15 @@ class ActorCritic(nn.Module): self.maxp2 = nn.MaxPool2d(2, 2) self.conv3 = nn.Conv2d(32, 64, 3, stride=1, padding=1) self.maxp3 = nn.MaxPool2d(2, 2) - self.conv4 = nn.Conv2d(64, 64, 3, stride=1, padding=1) + self.conv4 = nn.Conv2d(64, 64//shrink, 3, stride=1, padding=1) self.maxp4 = nn.MaxPool2d(2, 2) - self.lstm_dim = 512 - self.lstm = nn.LSTMCell(1024, self.lstm_dim) + self.lstm_dim = 64 + self.lstm = nn.LSTMCell(1024//shrink, self.lstm_dim) self.hx, self.cx = None, None - self.critic_linear = nn.Linear(512, 1) - self.actor_linear = nn.Linear(512, act_vocab_size) + self.critic_linear = nn.Linear(self.lstm_dim, 1) + self.actor_linear = nn.Linear(self.lstm_dim, act_vocab_size) def __repr__(self) -> str: return "actor_critic" @@ -85,7 +86,7 @@ class ActorCritic(nn.Module): x = F.relu(self.maxp2(self.conv2(x))) x = F.relu(self.maxp3(self.conv3(x))) x = F.relu(self.maxp4(self.conv4(x))) - x = torch.flatten(x, start_dim=1) + x = torch.flatten(x, start_dim=1) # [b=32, 64//shrink, 4, 4] if mask_padding is None: self.hx, self.cx = self.lstm(x, (self.hx, self.cx)) diff --git a/src/trainer.py b/src/trainer.py index ec94572..8b53aa5 100644 --- a/src/trainer.py +++ b/src/trainer.py @@ -169,6 +169,7 @@ class Trainer: if max_grad_norm is not None: torch.nn.utils.clip_grad_norm_(component.parameters(), max_grad_norm) + optimizer.step() metrics = {f'{str(component)}/train/total_loss': loss_total_epoch, **intermediate_losses} From 1af7aa74fa356f9bb438d9ca71d34d2a9f8cadf2 Mon Sep 17 00:00:00 2001 From: wassname Date: Fri, 17 Nov 2023 06:25:09 +0800 Subject: [PATCH 13/30] 3min epoch breakout https://wandb.ai/wassname/iris/runs/1zjsneyu?workspace=user-wassname --- README.md | 13 ++++++ config/tokenizer/default.yaml | 6 +-- config/trainer.yaml | 4 +- config/world_model/default.yaml | 15 ++++--- research_journal.md | 24 +++++++++++ src/models/actor_critic.py | 13 +++--- src/models/transformer.py | 73 +-------------------------------- 7 files changed, 57 insertions(+), 91 deletions(-) diff --git a/README.md b/README.md index 2530571..617104b 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,16 @@ + +A fork of IRIS where I use a pretrained LLM as the tranformer (with LoRa). + +My hypothesis: Pretrained LLM's make good world models by including a lot of world information! + +details: +- for speed and cost I use a small 1.5B model. But it would be interesting to try a 7B one +- for speed I use a smaller actor critic than in IRIS +- max_blocks 20->10 +- batch smaller because of my small machine +- actor_critic.steps_per_epoch 200->20 +- world_model.batch_num_sampler; 64->8 because the forzen transformer uses lots of gpu ram + # Transformers are Sample-Efficient World Models (IRIS) [Transformers are Sample-Efficient World Models](https://openreview.net/forum?id=vhFu1Acb0xb)
diff --git a/config/tokenizer/default.yaml b/config/tokenizer/default.yaml index 39fe6ae..e789557 100644 --- a/config/tokenizer/default.yaml +++ b/config/tokenizer/default.yaml @@ -1,14 +1,14 @@ _target_: models.tokenizer.Tokenizer -vocab_size: 512 -embed_dim: 512 +vocab_size: 2048 +embed_dim: 2048 encoder: _target_: models.tokenizer.Encoder config: _target_: models.tokenizer.EncoderDecoderConfig resolution: 64 in_channels: 3 - z_channels: 512 + z_channels: 2048 ch: 64 ch_mult: [1, 1, 1, 1, 1] num_res_blocks: 2 diff --git a/config/trainer.yaml b/config/trainer.yaml index f8022a0..4adf8b1 100644 --- a/config/trainer.yaml +++ b/config/trainer.yaml @@ -60,7 +60,7 @@ training: start_after_epochs: 5 steps_per_epoch: 200 world_model: - batch_num_samples: 8 + batch_num_samples: 8 # pretrained models use lots of grad_acc_steps: 1 max_grad_norm: 10.0 weight_decay: 0.01 @@ -71,7 +71,7 @@ training: grad_acc_steps: 1 max_grad_norm: 10.0 start_after_epochs: 50 - steps_per_epoch: 20 + steps_per_epoch: 40 imagine_horizon: ${common.sequence_length} burn_in: 20 gamma: 0.995 diff --git a/config/world_model/default.yaml b/config/world_model/default.yaml index 16769b7..22e8175 100644 --- a/config/world_model/default.yaml +++ b/config/world_model/default.yaml @@ -1,10 +1,9 @@ _target_: models.TransformerConfig +max_blocks: 10 # this is the rollout length when training policy +num_layers: 1 +num_heads: 1 +embed_dim: 2048 # change this to whatever the embedding dimension is in your pretrained llm 2048 for llama. 2560 for stablelm +dropout: 0.1 +model_name: "PY007/TinyLlama-1.1B-intermediate-step-715k-1.5T" +rank: 32 tokens_per_block: 17 -max_blocks: 10 -attention: 'causal' -num_layers: 10 -num_heads: 4 -embed_dim: 2048 # change this to whatever the embedding dimension is in your pretrained llm 2048 for llama. 2560 for stablelm -embed_pdrop: 0.1 -resid_pdrop: 0.1 -attn_pdrop: 0.1 diff --git a/research_journal.md b/research_journal.md index de33a90..5e2b17e 100644 --- a/research_journal.md +++ b/research_journal.md @@ -199,3 +199,27 @@ Training world_model: 100%|█████████████████ Training tokenizer: 55sec Training world_model 72 sec train actor_critic 3min. It looks like it scales with lstm size! + + +new changes 10mins +lets try no lstm? +Right now it will take 41 hours for on epoch lol + + + +ram during stages: +- actor critic 20G/24 + + +how big does my actor critic need to be? +- IRIS: large 512 lstm on 64,64,3 obs + - We ran our experiments with 8 Nvidia A100 40GB GPUs. With two Atari environments running on the same GPU, training takes around 7 days, resulting in an average of 3.5 days per environment. +- twm: mlp 512 + + +How long to train? +`600*10//6/24` = 41 days +- 600 epochs * 10 minutes / 6 to get hours, 24 to get days + + + diff --git a/src/models/actor_critic.py b/src/models/actor_critic.py index 0fff2b6..75b4261 100644 --- a/src/models/actor_critic.py +++ b/src/models/actor_critic.py @@ -36,18 +36,19 @@ class ImagineOutput: class ActorCritic(nn.Module): def __init__(self, act_vocab_size, use_original_obs: bool = False) -> None: super().__init__() - shrink = 4 + shrink = 8 + s = 2 self.use_original_obs = use_original_obs - self.conv1 = nn.Conv2d(3, 32, 3, stride=1, padding=1) + self.conv1 = nn.Conv2d(3, 32//s, 3, stride=1, padding=1) self.maxp1 = nn.MaxPool2d(2, 2) - self.conv2 = nn.Conv2d(32, 32, 3, stride=1, padding=1) + self.conv2 = nn.Conv2d(32//s, 32//s, 3, stride=1, padding=1) self.maxp2 = nn.MaxPool2d(2, 2) - self.conv3 = nn.Conv2d(32, 64, 3, stride=1, padding=1) + self.conv3 = nn.Conv2d(32//s, 64//s, 3, stride=1, padding=1) self.maxp3 = nn.MaxPool2d(2, 2) - self.conv4 = nn.Conv2d(64, 64//shrink, 3, stride=1, padding=1) + self.conv4 = nn.Conv2d(64//s, 64//shrink, 3, stride=1, padding=1) self.maxp4 = nn.MaxPool2d(2, 2) - self.lstm_dim = 64 + self.lstm_dim = 16 self.lstm = nn.LSTMCell(1024//shrink, self.lstm_dim) self.hx, self.cx = None, None diff --git a/src/models/transformer.py b/src/models/transformer.py index 40b4430..86139c4 100644 --- a/src/models/transformer.py +++ b/src/models/transformer.py @@ -17,94 +17,23 @@ from .kv_caching import KeysValues, KVCache @dataclass class TransformerConfig: - - tokens_per_block: int max_blocks: int - attention: str num_layers: int num_heads: int embed_dim: int - - embed_pdrop: float - resid_pdrop: float - attn_pdrop: float + tokens_per_block: int # model_name: str = "stabilityai/stablelm-3b-4e1t" # https://huggingface.co/PY007/TinyLlama-1.1B-intermediate-step-715k-1.5T model_name: str = "PY007/TinyLlama-1.1B-intermediate-step-715k-1.5T" dropout: float = 0 rank: int = 32 - z_dim: int = 768 - start_from: str = None @property def max_tokens(self): return self.tokens_per_block * self.max_blocks -class Block(nn.Module): - def __init__(self, config: TransformerConfig) -> None: - super().__init__() - self.ln1 = nn.LayerNorm(config.embed_dim) - self.ln2 = nn.LayerNorm(config.embed_dim) - self.attn = SelfAttention(config) - self.mlp = nn.Sequential( - nn.Linear(config.embed_dim, 4 * config.embed_dim), - nn.GELU(), - nn.Linear(4 * config.embed_dim, config.embed_dim), - nn.Dropout(config.resid_pdrop), - ) - - def forward(self, x: torch.Tensor, past_keys_values: Optional[KeysValues] = None) -> torch.Tensor: - x_attn = self.attn(self.ln1(x), past_keys_values) - x = x + x_attn - x = x + self.mlp(self.ln2(x)) - return x - - -class SelfAttention(nn.Module): - def __init__(self, config: TransformerConfig) -> None: - super().__init__() - assert config.embed_dim % config.num_heads == 0 - assert config.attention in ('causal', 'block_causal') - self.num_heads = config.num_heads - self.key = nn.Linear(config.embed_dim, config.embed_dim) - self.query = nn.Linear(config.embed_dim, config.embed_dim) - self.value = nn.Linear(config.embed_dim, config.embed_dim) - self.attn_drop = nn.Dropout(config.attn_pdrop) - self.resid_drop = nn.Dropout(config.resid_pdrop) - self.proj = nn.Linear(config.embed_dim, config.embed_dim) - - causal_mask = torch.tril(torch.ones(config.max_tokens, config.max_tokens)) - block_causal_mask = torch.max(causal_mask, torch.block_diag(*[torch.ones(config.tokens_per_block, config.tokens_per_block) for _ in range(config.max_blocks)])) - self.register_buffer('mask', causal_mask if config.attention == 'causal' else block_causal_mask) - - def forward(self, x: torch.Tensor, kv_cache: Optional[KVCache] = None) -> torch.Tensor: - B, T, C = x.size() - if kv_cache is not None: - b, nh, L, c = kv_cache.shape - assert nh == self.num_heads and b == B and c * nh == C - else: - L = 0 - - q = self.query(x).view(B, T, self.num_heads, C // self.num_heads).transpose(1, 2) # (B, nh, T, hs) - k = self.key(x).view(B, T, self.num_heads, C // self.num_heads).transpose(1, 2) # (B, nh, T, hs) - v = self.value(x).view(B, T, self.num_heads, C // self.num_heads).transpose(1, 2) # (B, nh, T, hs) - - if kv_cache is not None: - kv_cache.update(k, v) - k, v = kv_cache.get() - - att = (q @ k.transpose(-2, -1)) * (1.0 / math.sqrt(k.size(-1))) - att = att.masked_fill(self.mask[L:L + T, :L + T] == 0, float('-inf')) - att = F.softmax(att, dim=-1) - att = self.attn_drop(att) - y = att @ v - y = rearrange(y, 'b h t e -> b t (h e)') - - y = self.resid_drop(self.proj(y)) - - return y class Transformer(nn.Module): def __init__(self, config: TransformerConfig) -> None: From a778296e40b7b22f25f777574945570ea5d61f79 Mon Sep 17 00:00:00 2001 From: wassname Date: Fri, 17 Nov 2023 12:30:16 +0800 Subject: [PATCH 14/30] relative imports --- research_journal.md | 9 +++++++++ src/agent.py | 8 ++++---- src/collector.py | 10 +++++----- src/dataset.py | 2 +- src/envs/__init__.py | 2 +- src/envs/wrappers.py | 32 ++++++++++++++++++++++++++++++- src/main.py | 4 +++- src/models/actor_critic.py | 14 +++++++------- src/models/tokenizer/tokenizer.py | 4 ++-- src/models/world_model.py | 4 ++-- src/trainer.py | 16 ++++++++-------- src/utils.py | 2 +- 12 files changed, 74 insertions(+), 33 deletions(-) diff --git a/research_journal.md b/research_journal.md index 5e2b17e..8bdf3fe 100644 --- a/research_journal.md +++ b/research_journal.md @@ -221,5 +221,14 @@ How long to train? `600*10//6/24` = 41 days - 600 epochs * 10 minutes / 6 to get hours, 24 to get days +# 2023-11-17 07:59:44 +so I've got it working with these times. But maybe it's too small + +Epoch 148 / 600 + +Experience collection (train_dataset): 100%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 200/200 [00:10<00:00, 19.25it/s] +Training tokenizer: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 200/200 [00:59<00:00, 3.34it/s] +Training world_model: 100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 200/200 [01:15<00:00, 2.64it/s] +Training actor_critic: 100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 20/20 [03:20<00:00, 10.05s/it] diff --git a/src/agent.py b/src/agent.py index f5dd1d3..a8d943c 100644 --- a/src/agent.py +++ b/src/agent.py @@ -4,10 +4,10 @@ import torch from torch.distributions.categorical import Categorical import torch.nn as nn -from models.actor_critic import ActorCritic -from models.tokenizer import Tokenizer -from models.world_model import WorldModel -from utils import extract_state_dict +from .models.actor_critic import ActorCritic +from .models.tokenizer import Tokenizer +from .models.world_model import WorldModel +from .utils import extract_state_dict class Agent(nn.Module): diff --git a/src/collector.py b/src/collector.py index 85e0150..8c5947e 100644 --- a/src/collector.py +++ b/src/collector.py @@ -8,11 +8,11 @@ import torch from tqdm import tqdm import wandb -from agent import Agent -from dataset import EpisodesDataset -from envs import SingleProcessEnv, MultiProcessEnv -from episode import Episode -from utils import EpisodeDirManager, RandomHeuristic +from src.agent import Agent +from src.dataset import EpisodesDataset +from src.envs import SingleProcessEnv, MultiProcessEnv +from src.episode import Episode +from src.utils import EpisodeDirManager, RandomHeuristic class Collector: diff --git a/src/dataset.py b/src/dataset.py index 59d9f30..5cc2d6e 100644 --- a/src/dataset.py +++ b/src/dataset.py @@ -7,7 +7,7 @@ from typing import Dict, List, Optional, Tuple import psutil import torch -from episode import Episode +from src.episode import Episode Batch = Dict[str, torch.Tensor] diff --git a/src/envs/__init__.py b/src/envs/__init__.py index 5afe68b..4d85674 100644 --- a/src/envs/__init__.py +++ b/src/envs/__init__.py @@ -1,4 +1,4 @@ from .multi_process_env import MultiProcessEnv -from .wrappers import make_atari, ResizeObsWrapper +from .wrappers import make_atari, make_crafter, make_env, ResizeObsWrapper from .single_process_env import SingleProcessEnv from .world_model_env import WorldModelEnv diff --git a/src/envs/wrappers.py b/src/envs/wrappers.py index eca6f88..4183483 100644 --- a/src/envs/wrappers.py +++ b/src/envs/wrappers.py @@ -7,11 +7,22 @@ from typing import Tuple import gym import numpy as np from PIL import Image +import crafter + + +def make_env(id, size=64, max_episode_steps=None, noop_max=30, frame_skip=4, done_on_life_loss=False, clip_reward=False): + if id.startswith('Crafter'): + return make_crafter(id, size=size, max_episode_steps=max_episode_steps, done_on_life_loss=done_on_life_loss) + if id.startswith('MiniHack'): + return make_minihack(size=size, max_episode_steps=max_episode_steps, done_on_life_loss=done_on_life_loss) + else: + return make_atari(id, size, max_episode_steps, noop_max, frame_skip, done_on_life_loss, clip_reward) def make_atari(id, size=64, max_episode_steps=None, noop_max=30, frame_skip=4, done_on_life_loss=False, clip_reward=False): env = gym.make(id) - assert 'NoFrameskip' in env.spec.id or 'Frameskip' not in env.spec + print(env.spec) + assert 'NoFrameskip' in env.spec.id or 'Frameskip' not in str(env.spec) env = ResizeObsWrapper(env, (size, size)) if clip_reward: env = RewardClippingWrapper(env) @@ -24,6 +35,25 @@ def make_atari(id, size=64, max_episode_steps=None, noop_max=30, frame_skip=4, d env = EpisodicLifeEnv(env) return env +def make_crafter(id, size=64, max_episode_steps=None, done_on_life_loss=False): + # https://github.com/danijar/dreamerv2/blob/07d906e9c4322c6fc2cd6ed23e247ccd6b7c8c41/dreamerv2/common/envs.py#L242 + # https://github.com/footoredo/torchbeast/blob/12939569cc46b6a8616e4c25b138d97248cc8581/torchbeast/atari_wrappers.py#L301 + env = gym.make(id) + return env + + +def make_minihack(id, size=64, max_episode_steps=None, noop_max=30, frame_skip=4, done_on_life_loss=False, clip_reward=False): + # https://github.com/facebookresearch/minihack/blob/47065748f04714c49ba5b52fb74d166228c7acc1/minihack/agent/common/envs/wrapper.py#L117 + # https://github.com/roger-creus/SOFE/blob/5551a115a9c7e1d632cf6996bf5dcabde59cdcc5/e3b/minihack/torchbeast/src/utils.py#L110 + env = gym.make(id, + # https://minihack.readthedocs.io/en/latest/getting-started/observation_spaces.html + observation_keys=("pixel_crop"), + # obs_crop_h=9, + # obs_crop_w=9, + ) + env = ResizeObsWrapper(env, (size, size)) + return env + class ResizeObsWrapper(gym.ObservationWrapper): def __init__(self, env: gym.Env, size: Tuple[int, int]) -> None: diff --git a/src/main.py b/src/main.py index be4177b..6a84b94 100644 --- a/src/main.py +++ b/src/main.py @@ -2,7 +2,9 @@ import hydra from omegaconf import DictConfig from trainer import Trainer - +from loguru import logger +import sys +logger.add(sys.stderr, format="{time} {level} {message}", filter="my_module", level="INFO") @hydra.main(config_path="../config", config_name="trainer") def main(cfg: DictConfig): diff --git a/src/models/actor_critic.py b/src/models/actor_critic.py index 75b4261..13eb51d 100644 --- a/src/models/actor_critic.py +++ b/src/models/actor_critic.py @@ -10,11 +10,11 @@ import torch.nn as nn import torch.nn.functional as F from tqdm import tqdm -from dataset import Batch -from envs.world_model_env import WorldModelEnv -from models.tokenizer import Tokenizer -from models.world_model import WorldModel -from utils import compute_lambda_returns, LossWithIntermediateLosses +from ..dataset import Batch +from ..envs.world_model_env import WorldModelEnv +from ..models.tokenizer import Tokenizer +from ..models.world_model import WorldModel +from ..utils import compute_lambda_returns, LossWithIntermediateLosses @dataclass @@ -34,7 +34,7 @@ class ImagineOutput: class ActorCritic(nn.Module): - def __init__(self, act_vocab_size, use_original_obs: bool = False) -> None: + def __init__(self, act_vocab_size, use_original_obs: bool = False, lstm_dim = 16) -> None: super().__init__() shrink = 8 s = 2 @@ -48,7 +48,7 @@ class ActorCritic(nn.Module): self.conv4 = nn.Conv2d(64//s, 64//shrink, 3, stride=1, padding=1) self.maxp4 = nn.MaxPool2d(2, 2) - self.lstm_dim = 16 + self.lstm_dim = lstm_dim self.lstm = nn.LSTMCell(1024//shrink, self.lstm_dim) self.hx, self.cx = None, None diff --git a/src/models/tokenizer/tokenizer.py b/src/models/tokenizer/tokenizer.py index 6528fa4..1b8723d 100644 --- a/src/models/tokenizer/tokenizer.py +++ b/src/models/tokenizer/tokenizer.py @@ -9,10 +9,10 @@ from einops import rearrange import torch import torch.nn as nn -from dataset import Batch +from src.dataset import Batch from .lpips import LPIPS from .nets import Encoder, Decoder -from utils import LossWithIntermediateLosses +from src.utils import LossWithIntermediateLosses @dataclass diff --git a/src/models/world_model.py b/src/models/world_model.py index 194119e..349423c 100644 --- a/src/models/world_model.py +++ b/src/models/world_model.py @@ -6,12 +6,12 @@ import torch import torch.nn as nn import torch.nn.functional as F -from dataset import Batch +from ..dataset import Batch from .kv_caching import KeysValues from .slicer import Embedder, Head from .tokenizer import Tokenizer from .transformer import Transformer, TransformerConfig -from utils import init_weights, LossWithIntermediateLosses +from ..utils import init_weights, LossWithIntermediateLosses @dataclass diff --git a/src/trainer.py b/src/trainer.py index 8b53aa5..5091fc3 100644 --- a/src/trainer.py +++ b/src/trainer.py @@ -14,14 +14,14 @@ import torch.nn as nn from tqdm import tqdm import wandb -from agent import Agent -from collector import Collector -from envs import SingleProcessEnv, MultiProcessEnv -from episode import Episode -from make_reconstructions import make_reconstructions_from_batch -from models.actor_critic import ActorCritic -from models.world_model import WorldModel -from utils import configure_optimizer, EpisodeDirManager, set_seed +from src.agent import Agent +from src.collector import Collector +from src.envs import SingleProcessEnv, MultiProcessEnv +from src.episode import Episode +from src.make_reconstructions import make_reconstructions_from_batch +from src.models.actor_critic import ActorCritic +from src.models.world_model import WorldModel +from src.utils import configure_optimizer, EpisodeDirManager, set_seed class Trainer: diff --git a/src/utils.py b/src/utils.py index ed8e31a..1aaf3b2 100644 --- a/src/utils.py +++ b/src/utils.py @@ -8,7 +8,7 @@ import numpy as np import torch import torch.nn as nn -from episode import Episode +from .episode import Episode from transformers.pytorch_utils import ALL_LAYERNORM_LAYERS From 1dabd792516bfa0e033ae341294e8a46504ed8f6 Mon Sep 17 00:00:00 2001 From: wassname Date: Fri, 17 Nov 2023 18:17:17 +0800 Subject: [PATCH 15/30] debugging model size and speed --- .vscode/launch.json | 27 +- config/actor_critic/default.yaml | 1 + config/datasets/default.yaml | 4 +- config/env/default.yaml | 4 +- config/tokenizer/default.yaml | 8 +- config/trainer.yaml | 6 +- config/world_model/default.yaml | 2 +- justfile | 10 + notebooks/01_debug_models.ipynb | 747 +++++++++++++++++++++++++++++++ poetry.lock | 200 ++++++++- pyproject.toml | 2 + research_journal.md | 82 ++++ src/models/actor_critic.py | 4 +- src/models/transformer.py | 5 +- src/trainer.py | 1 + 15 files changed, 1088 insertions(+), 15 deletions(-) create mode 100644 justfile create mode 100644 notebooks/01_debug_models.ipynb diff --git a/.vscode/launch.json b/.vscode/launch.json index 06bb888..9044a8c 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -4,6 +4,28 @@ // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ + { + "name": "test", + "type": "python", + "request": "launch", + "program": "${workspaceFolder}/src/main.py", + "console": "integratedTerminal", + "justMyCode": false, + "autoReload": {"enable": true,}, + "env": {"WANDB_MODE":"disabled"}, + "args": [ + "'wandb.mode=disabled", + // "env.train.id=BreakoutNoFrameskip-v4", + "env.train.id=CrafterReward-v1", + // # make it start early + "training.tokenizer.start_after_epochs=1", + "training.world_model.start_after_epochs=1", + "training.actor_critic.start_after_epochs=1", + "training.tokenizer.steps_per_epoch=10", + "training.world_model.steps_per_epoch=10", + "training.actor_critic.steps_per_epoch=10", + ] + }, { "name": "main", "type": "python", @@ -14,11 +36,14 @@ "autoReload": {"enable": true,}, "env": {"WANDB_MODE":"disabled"}, "args": [ - "env.train.id=BreakoutNoFrameskip-v4", + "'wandb.mode=disabled", + // "env.train.id=BreakoutNoFrameskip-v4", + "env.train.id=CrafterReward-v1", // # make it start early "training.tokenizer.start_after_epochs=1", "training.world_model.start_after_epochs=1", "training.actor_critic.start_after_epochs=1", + "training.tokenizer.steps_per_epoch=10", "training.world_model.steps_per_epoch=10", "training.actor_critic.steps_per_epoch=10", diff --git a/config/actor_critic/default.yaml b/config/actor_critic/default.yaml index e4e2eee..69b1ea8 100644 --- a/config/actor_critic/default.yaml +++ b/config/actor_critic/default.yaml @@ -1 +1,2 @@ use_original_obs: False +lstm_dim: 512 diff --git a/config/datasets/default.yaml b/config/datasets/default.yaml index c959c98..de8d15a 100644 --- a/config/datasets/default.yaml +++ b/config/datasets/default.yaml @@ -1,8 +1,8 @@ train: - _target_: dataset.EpisodesDatasetRamMonitoring + _target_: src.dataset.EpisodesDatasetRamMonitoring max_ram_usage: 30G name: train_dataset test: - _target_: dataset.EpisodesDataset + _target_: src.dataset.EpisodesDataset max_num_episodes: null name: test_dataset diff --git a/config/env/default.yaml b/config/env/default.yaml index f6b3b89..dc885ba 100644 --- a/config/env/default.yaml +++ b/config/env/default.yaml @@ -1,5 +1,5 @@ train: - _target_: envs.make_atari + _target_: src.envs.make_env id: null size: 64 max_episode_steps: 20000 @@ -18,4 +18,4 @@ test: done_on_life_loss: False clip_reward: False -keymap: atari/${.train.id} \ No newline at end of file +keymap: atari/${.train.id} diff --git a/config/tokenizer/default.yaml b/config/tokenizer/default.yaml index e789557..64e2bac 100644 --- a/config/tokenizer/default.yaml +++ b/config/tokenizer/default.yaml @@ -1,11 +1,11 @@ -_target_: models.tokenizer.Tokenizer +_target_: src.models.tokenizer.Tokenizer vocab_size: 2048 embed_dim: 2048 encoder: - _target_: models.tokenizer.Encoder + _target_: src.models.tokenizer.Encoder config: - _target_: models.tokenizer.EncoderDecoderConfig + _target_: src.models.tokenizer.EncoderDecoderConfig resolution: 64 in_channels: 3 z_channels: 2048 @@ -16,5 +16,5 @@ encoder: out_ch: 3 dropout: 0.0 decoder: - _target_: models.tokenizer.Decoder + _target_: src.models.tokenizer.Decoder config: ${..encoder.config} diff --git a/config/trainer.yaml b/config/trainer.yaml index 4adf8b1..d1f92a6 100644 --- a/config/trainer.yaml +++ b/config/trainer.yaml @@ -67,7 +67,7 @@ training: start_after_epochs: 25 steps_per_epoch: 200 actor_critic: - batch_num_samples: 32 + batch_num_samples: 16 grad_acc_steps: 1 max_grad_norm: 10.0 start_after_epochs: 50 @@ -92,3 +92,7 @@ evaluation: num_episodes_to_save: ${training.actor_critic.batch_num_samples} horizon: ${training.actor_critic.imagine_horizon} start_after_epochs: ${training.actor_critic.start_after_epochs} + +hydra: + job: + chdir: True diff --git a/config/world_model/default.yaml b/config/world_model/default.yaml index 22e8175..08ede7e 100644 --- a/config/world_model/default.yaml +++ b/config/world_model/default.yaml @@ -1,4 +1,4 @@ -_target_: models.TransformerConfig +_target_: src.models.TransformerConfig max_blocks: 10 # this is the rollout length when training policy num_layers: 1 num_heads: 1 diff --git a/justfile b/justfile new file mode 100644 index 0000000..1f26170 --- /dev/null +++ b/justfile @@ -0,0 +1,10 @@ + +breakout: + python src/main.py env.train.id=BreakoutNoFrameskip-v4 + +crafter: + python src/main.py env.train.id=CrafterReward-v1 + +minihack: + python src/main.py env.train.id=MiniHack-River-v0 + diff --git a/notebooks/01_debug_models.ipynb b/notebooks/01_debug_models.ipynb new file mode 100644 index 0000000..8c14e02 --- /dev/null +++ b/notebooks/01_debug_models.ipynb @@ -0,0 +1,747 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], + "source": [ + "# autoreload import your package\n", + "%load_ext autoreload\n", + "%autoreload 2\n", + "\n", + "import gym\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "%matplotlib inline\n", + "plt.style.use('ggplot')\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Debug model components\n", + "\n", + "### Using trainer? :poop:\n", + "\n", + "Hyrda is really annoying\n", + "\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/media/wassname/SGIronWolf/projects5/worldmodels/iris_bigvae/.venv/lib/python3.9/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", + " from .autonotebook import tqdm as notebook_tqdm\n", + "Failed to detect the name of this notebook, you can set it manually with the WANDB_NOTEBOOK_NAME environment variable to enable code saving.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'wandb': {'mode': 'disabled', 'project': 'iris', 'entity': None, 'name': None, 'group': None, 'tags': None, 'notes': None}, 'initialization': {'path_to_checkpoint': None, 'load_tokenizer': False, 'load_world_model': False, 'load_actor_critic': False}, 'common': {'epochs': 600, 'device': 'cuda:0', 'do_checkpoint': False, 'seed': 0, 'sequence_length': '${world_model.max_blocks}', 'resume': True}, 'collection': {'train': {'num_envs': 1, 'stop_after_epochs': 500, 'num_episodes_to_save': 10, 'config': {'epsilon': 0.01, 'should_sample': True, 'temperature': 1.0, 'num_steps': 200, 'burn_in': '${training.actor_critic.burn_in}'}}, 'test': {'num_envs': 8, 'num_episodes_to_save': '${collection.train.num_episodes_to_save}', 'config': {'epsilon': 0.0, 'should_sample': True, 'temperature': 0.5, 'num_episodes': 16, 'burn_in': '${training.actor_critic.burn_in}'}}}, 'training': {'should': True, 'learning_rate': 0.0001, 'tokenizer': {'batch_num_samples': 128, 'grad_acc_steps': 1, 'max_grad_norm': 10.0, 'start_after_epochs': 1, 'steps_per_epoch': 10}, 'world_model': {'batch_num_samples': 4, 'grad_acc_steps': 1, 'max_grad_norm': 10.0, 'weight_decay': 0.01, 'start_after_epochs': 1, 'steps_per_epoch': 10}, 'actor_critic': {'batch_num_samples': 4, 'grad_acc_steps': 1, 'max_grad_norm': 10.0, 'start_after_epochs': 1, 'steps_per_epoch': 10, 'imagine_horizon': '${common.sequence_length}', 'burn_in': 20, 'gamma': 0.995, 'lambda_': 0.95, 'entropy_weight': 0.001}}, 'evaluation': {'should': True, 'every': 5, 'tokenizer': {'batch_num_samples': '${training.tokenizer.batch_num_samples}', 'start_after_epochs': '${training.tokenizer.start_after_epochs}', 'save_reconstructions': True}, 'world_model': {'batch_num_samples': '${training.world_model.batch_num_samples}', 'start_after_epochs': '${training.world_model.start_after_epochs}'}, 'actor_critic': {'num_episodes_to_save': '${training.actor_critic.batch_num_samples}', 'horizon': '${training.actor_critic.imagine_horizon}', 'start_after_epochs': '${training.actor_critic.start_after_epochs}'}}, 'tokenizer': {'_target_': 'src.models.tokenizer.Tokenizer', 'vocab_size': 2048, 'embed_dim': 2048, 'encoder': {'_target_': 'src.models.tokenizer.Encoder', 'config': {'_target_': 'src.models.tokenizer.EncoderDecoderConfig', 'resolution': 64, 'in_channels': 3, 'z_channels': 2048, 'ch': 64, 'ch_mult': [1, 1, 1, 1, 1], 'num_res_blocks': 2, 'attn_resolutions': [8, 16], 'out_ch': 3, 'dropout': 0.0}}, 'decoder': {'_target_': 'src.models.tokenizer.Decoder', 'config': '${..encoder.config}'}}, 'world_model': {'_target_': 'src.models.TransformerConfig', 'max_blocks': 10, 'num_layers': 1, 'num_heads': 1, 'embed_dim': 2048, 'dropout': 0.1, 'model_name': 'PY007/TinyLlama-1.1B-intermediate-step-715k-1.5T', 'rank': 32, 'tokens_per_block': 17}, 'actor_critic': {'use_original_obs': False, 'lstm_dim': 512}, 'env': {'train': {'_target_': 'src.envs.make_env', 'id': 'CrafterReward-v1', 'size': 64, 'max_episode_steps': 20000, 'noop_max': 30, 'frame_skip': 4, 'done_on_life_loss': True, 'clip_reward': False}, 'test': {'_target_': '${..train._target_}', 'id': '${..train.id}', 'size': '${..train.size}', 'max_episode_steps': 108000, 'noop_max': 1, 'frame_skip': '${..train.frame_skip}', 'done_on_life_loss': False, 'clip_reward': False}, 'keymap': 'atari/${.train.id}'}, 'datasets': {'train': {'_target_': 'src.dataset.EpisodesDatasetRamMonitoring', 'max_ram_usage': '30G', 'name': 'train_dataset'}, 'test': {'_target_': 'src.dataset.EpisodesDataset', 'max_num_episodes': None, 'name': 'test_dataset'}}}\n", + "Tokenizer : shape of latent is (2048, 4, 4).\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/media/wassname/SGIronWolf/projects5/worldmodels/iris_bigvae/.venv/lib/python3.9/site-packages/torchvision/models/_utils.py:208: UserWarning: The parameter 'pretrained' is deprecated since 0.13 and may be removed in the future, please use 'weights' instead.\n", + " warnings.warn(\n", + "/media/wassname/SGIronWolf/projects5/worldmodels/iris_bigvae/.venv/lib/python3.9/site-packages/torchvision/models/_utils.py:223: UserWarning: Arguments other than a weight enum or `None` for 'weights' are deprecated since 0.13 and may be removed in the future. The current behavior is equivalent to passing `weights=VGG16_Weights.IMAGENET1K_V1`. You can also use `weights=VGG16_Weights.DEFAULT` to get the most up-to-date weights.\n", + " warnings.warn(msg)\n", + "Using pad_token, but it is not set yet.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "trainable params: 50,462,720 || all params: 1,150,511,104 || trainable%: 4.386113252149889\n", + "None\n", + "32314243 parameters in agent.tokenizer\n", + "752979973 parameters in agent.world_model\n", + "3224626 parameters in agent.actor_critic\n" + ] + } + ], + "source": [ + "\n", + "import os\n", + "os.environ['WANDB_MODE'] = 'disabled'\n", + "\n", + "import hydra\n", + "from hydra import initialize, initialize_config_module, initialize_config_dir, compose\n", + "from omegaconf import OmegaConf\n", + "\n", + "from pathlib import Path\n", + "from datetime import datetime\n", + "\n", + "from src.trainer import Trainer\n", + "\n", + "\n", + "class Trainer2(Trainer):\n", + " \n", + " def load_checkpoint(self, *args, **kwargs):\n", + " pass\n", + "\n", + "\n", + "\n", + "ts = datetime.now().strftime(\"%Y-%m-%d/%H-%M-%S\")\n", + "run_dir = Path(f\"..outputs/{ts}\").absolute()\n", + "run_dir.mkdir(parents=True, exist_ok=True)\n", + "abs_config_dir=os.path.abspath(\"../config\")\n", + "os.chdir(run_dir)\n", + "# with initialize_config_dir(version_base=None, config_dir=abs_config_dir):\n", + "with initialize(version_base=None, config_path=\"../config\"):\n", + " cfg = compose(config_name='trainer', overrides=[\n", + " f'hydra.run.dir={run_dir}',\n", + " # f\"initialization.path_to_checkpoint={str(path_to_checkpoint.absolute())}\",\n", + " 'wandb.mode=disabled',\n", + " \"env.train.id=CrafterReward-v1\",\n", + " \"training.tokenizer.start_after_epochs=1\",\n", + " \"training.world_model.start_after_epochs=1\",\n", + " \"training.actor_critic.start_after_epochs=1\",\n", + " \"training.tokenizer.steps_per_epoch=10\",\n", + " \"training.world_model.steps_per_epoch=10\",\n", + " \"training.actor_critic.steps_per_epoch=10\",\n", + " \"common.do_checkpoint=False\",\n", + " \"common.resume=True\",\n", + " \"training.world_model.batch_num_samples=4\",\n", + " \"training.actor_critic.batch_num_samples=4\",\n", + " ])\n", + " print(cfg)\n", + "\n", + " with run_dir:\n", + " Path('media/episodes/train').mkdir(parents=True, exist_ok=True)\n", + " trainer = Trainer2(cfg)\n", + " trainer\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## Trainer train_agent\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Experience collection (train_dataset): 100%|██████████| 200/200 [00:03<00:00, 58.00it/s]\n" + ] + }, + { + "data": { + "text/plain": [ + "[{'train_dataset/episode_length': 183,\n", + " 'train_dataset/episode_return': tensor(0.1000),\n", + " 'train_dataset/episode_num': 0,\n", + " 'train_dataset/action_histogram': },\n", + " {'train_dataset/#episodes': 2,\n", + " 'train_dataset/#steps': 200,\n", + " 'train_dataset/return': 0.100000024}]" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "self=trainer\n", + "epoch = 52\n", + "\n", + "# get out first exp\n", + "self.train_collector.collect(self.agent, epoch, **self.cfg.collection.train.config)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "self.agent.train()\n", + "self.agent.zero_grad()\n", + "\n", + "metrics_tokenizer, metrics_world_model, metrics_actor_critic = {}, {}, {}\n", + "\n", + "cfg_tokenizer = self.cfg.training.tokenizer\n", + "cfg_world_model = self.cfg.training.world_model\n", + "cfg_actor_critic = self.cfg.training.actor_critic\n", + "\n", + "# if epoch > cfg_tokenizer.start_after_epochs:\n", + "# metrics_tokenizer = self.train_component(self.agent.tokenizer, self.optimizer_tokenizer, sequence_length=1, sample_from_start=True, **cfg_tokenizer)\n", + "# self.agent.tokenizer.eval()\n", + "\n", + "# if epoch > cfg_world_model.start_after_epochs:\n", + "# metrics_world_model = self.train_component(self.agent.world_model, self.optimizer_world_model, sequence_length=self.cfg.common.sequence_length, sample_from_start=True, tokenizer=self.agent.tokenizer, **cfg_world_model)\n", + "# self.agent.world_model.eval()\n", + "\n", + "# if epoch > cfg_actor_critic.start_after_epochs:\n", + "# metrics_actor_critic = self.train_component(self.agent.actor_critic, self.optimizer_actor_critic, sequence_length=1 + self.cfg.training.actor_critic.burn_in, sample_from_start=False, tokenizer=self.agent.tokenizer, world_model=self.agent.world_model, **cfg_actor_critic)\n", + "# self.agent.actor_critic.eval()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "import torch\n", + "from torchinfo import summary\n", + "import torch\n", + "from einops import rearrange\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Directly benchmark models" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "tokenizer = self.agent.tokenizer\n", + "world_model = self.agent.world_model\n", + "actor_critic = self.agent.actor_critic\n" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "4" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "batch_num_samples = cfg.training.world_model.batch_num_samples\n", + "sequence_length = cfg.common.sequence_length\n", + "sample_from_start = False\n", + "# train_dataset = instantiate(cfg.datasets.train)\n", + "batch_num_samples\n" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "batch = self.train_dataset.sample_batch(batch_num_samples, sequence_length, sample_from_start)\n", + "batch = {k: v.to(self.device) for k, v in batch.items()}\n" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 190 ms, sys: 4.87 ms, total: 194 ms\n", + "Wall time: 195 ms\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "%%time\n", + "self.agent.world_model.compute_loss(batch, tokenizer=self.agent.tokenizer)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 9.35 s, sys: 17.3 ms, total: 9.37 s\n", + "Wall time: 9.37 s\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "%%time\n", + "# TODO: why is this so slow?\n", + "cfg_actor_critic = self.cfg.training.actor_critic\n", + "self.agent.actor_critic.compute_loss(batch, tokenizer=self.agent.tokenizer, world_model=self.agent.world_model, **cfg_actor_critic)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 9.11 s, sys: 15.5 ms, total: 9.13 s\n", + "Wall time: 9.13 s\n" + ] + } + ], + "source": [ + "%%time\n", + "# is this the slow part... yes. damn\n", + "actor_critic.imagine(batch, tokenizer, world_model, horizon=10);\n" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "# # takes 0.1 s, fast\n", + "# wm_env = WorldModelEnv(tokenizer, world_model, device)\n", + "# wm_env\n" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "torch.Size([4, 3, 64, 64])\n", + "CPU times: user 105 ms, sys: 207 µs, total: 105 ms\n", + "Wall time: 105 ms\n" + ] + } + ], + "source": [ + "%%time\n", + "# this takes 0.1 seconds and is run 10+ time. So 1 second. Hmm\n", + "from src.envs.world_model_env import WorldModelEnv, Categorical\n", + "initial_observations = batch['observations']\n", + "\n", + "# get the right obs\n", + "wm_env = WorldModelEnv(self.agent.tokenizer, self.agent.world_model, self.device)\n", + "obs = wm_env.reset_from_initial_observations(initial_observations[:, -1])\n", + "print(obs.shape)\n", + "\n", + "\n", + "# make sure hidden states are right\n", + "self.agent.actor_critic.reset(obs.shape[0])\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "import gc\n", + "gc.collect()\n", + "torch.cuda.empty_cache()\n", + "# obs\n" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 1.6 ms, sys: 309 µs, total: 1.9 ms\n", + "Wall time: 1.72 ms\n" + ] + } + ], + "source": [ + "%%time\n", + "# 700us\n", + "# fast, executed 10+ times\n", + "outputs_ac = actor_critic(obs)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "torch.Size([4, 1, 17])" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "outputs_ac.logits_actions.shape\n", + "# action_token.shape\n" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "# %%timeit\n", + "# slow! takes 1s, executed 10+ times this is the culprit, not the lstm. hmm\n", + "k=3\n", + "horizon = 6\n", + "action_token = Categorical(logits=outputs_ac.logits_actions).sample()\n", + "obs, reward, done, _ = wm_env.step(action_token, should_predict_next_obs=(k < horizon - 1))\n" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "66.5 ms ± 1.53 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)\n" + ] + } + ], + "source": [ + "%%timeit\n", + "# 62ms\n", + "# this is the slow part again. no grad and eval don't hepl\n", + "outputs_wm = world_model(action_token, past_keys_values=wm_env.keys_values_wm)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "num_steps=1\n", + "prev_steps=0\n", + "sequences = world_model.embedder(action_token, num_steps, prev_steps) + world_model.pos_emb(prev_steps + torch.arange(num_steps, device=action_token.device))\n" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "ename": "AssertionError", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mAssertionError\u001b[0m Traceback (most recent call last)", + "\u001b[1;32m/media/wassname/SGIronWolf/projects5/worldmodels/iris_bigvae/notebooks/01_debug_models.ipynb Cell 24\u001b[0m line \u001b[0;36m1\n\u001b[0;32m----> 1\u001b[0m get_ipython()\u001b[39m.\u001b[39;49mrun_cell_magic(\u001b[39m'\u001b[39;49m\u001b[39mtimeit\u001b[39;49m\u001b[39m'\u001b[39;49m, \u001b[39m'\u001b[39;49m\u001b[39m'\u001b[39;49m, \u001b[39m\"\u001b[39;49m\u001b[39m# ofc it\u001b[39;49m\u001b[39m'\u001b[39;49m\u001b[39ms the transformer that\u001b[39;49m\u001b[39m'\u001b[39;49m\u001b[39ms slow. I guess we just call it was more than during training\u001b[39;49m\u001b[39m\\n\u001b[39;49;00m\u001b[39mpast_keys_values = wm_env.keys_values_wm\u001b[39;49m\u001b[39m\\n\u001b[39;49;00m\u001b[39mx = world_model.transformer(sequences, past_keys_values)\u001b[39;49m\u001b[39m\\n\u001b[39;49;00m\u001b[39m\"\u001b[39;49m)\n", + "File \u001b[0;32m/media/wassname/SGIronWolf/projects5/worldmodels/iris_bigvae/.venv/lib/python3.9/site-packages/IPython/core/interactiveshell.py:2515\u001b[0m, in \u001b[0;36mInteractiveShell.run_cell_magic\u001b[0;34m(self, magic_name, line, cell)\u001b[0m\n\u001b[1;32m 2513\u001b[0m \u001b[39mwith\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mbuiltin_trap:\n\u001b[1;32m 2514\u001b[0m args \u001b[39m=\u001b[39m (magic_arg_s, cell)\n\u001b[0;32m-> 2515\u001b[0m result \u001b[39m=\u001b[39m fn(\u001b[39m*\u001b[39;49margs, \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mkwargs)\n\u001b[1;32m 2517\u001b[0m \u001b[39m# The code below prevents the output from being displayed\u001b[39;00m\n\u001b[1;32m 2518\u001b[0m \u001b[39m# when using magics with decorator @output_can_be_silenced\u001b[39;00m\n\u001b[1;32m 2519\u001b[0m \u001b[39m# when the last Python token in the expression is a ';'.\u001b[39;00m\n\u001b[1;32m 2520\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mgetattr\u001b[39m(fn, magic\u001b[39m.\u001b[39mMAGIC_OUTPUT_CAN_BE_SILENCED, \u001b[39mFalse\u001b[39;00m):\n", + "File \u001b[0;32m/media/wassname/SGIronWolf/projects5/worldmodels/iris_bigvae/.venv/lib/python3.9/site-packages/IPython/core/magics/execution.py:1189\u001b[0m, in \u001b[0;36mExecutionMagics.timeit\u001b[0;34m(self, line, cell, local_ns)\u001b[0m\n\u001b[1;32m 1186\u001b[0m \u001b[39mif\u001b[39;00m time_number \u001b[39m>\u001b[39m\u001b[39m=\u001b[39m \u001b[39m0.2\u001b[39m:\n\u001b[1;32m 1187\u001b[0m \u001b[39mbreak\u001b[39;00m\n\u001b[0;32m-> 1189\u001b[0m all_runs \u001b[39m=\u001b[39m timer\u001b[39m.\u001b[39;49mrepeat(repeat, number)\n\u001b[1;32m 1190\u001b[0m best \u001b[39m=\u001b[39m \u001b[39mmin\u001b[39m(all_runs) \u001b[39m/\u001b[39m number\n\u001b[1;32m 1191\u001b[0m worst \u001b[39m=\u001b[39m \u001b[39mmax\u001b[39m(all_runs) \u001b[39m/\u001b[39m number\n", + "File \u001b[0;32m~/miniforge3/lib/python3.9/timeit.py:205\u001b[0m, in \u001b[0;36mTimer.repeat\u001b[0;34m(self, repeat, number)\u001b[0m\n\u001b[1;32m 203\u001b[0m r \u001b[39m=\u001b[39m []\n\u001b[1;32m 204\u001b[0m \u001b[39mfor\u001b[39;00m i \u001b[39min\u001b[39;00m \u001b[39mrange\u001b[39m(repeat):\n\u001b[0;32m--> 205\u001b[0m t \u001b[39m=\u001b[39m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mtimeit(number)\n\u001b[1;32m 206\u001b[0m r\u001b[39m.\u001b[39mappend(t)\n\u001b[1;32m 207\u001b[0m \u001b[39mreturn\u001b[39;00m r\n", + "File \u001b[0;32m/media/wassname/SGIronWolf/projects5/worldmodels/iris_bigvae/.venv/lib/python3.9/site-packages/IPython/core/magics/execution.py:173\u001b[0m, in \u001b[0;36mTimer.timeit\u001b[0;34m(self, number)\u001b[0m\n\u001b[1;32m 171\u001b[0m gc\u001b[39m.\u001b[39mdisable()\n\u001b[1;32m 172\u001b[0m \u001b[39mtry\u001b[39;00m:\n\u001b[0;32m--> 173\u001b[0m timing \u001b[39m=\u001b[39m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49minner(it, \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mtimer)\n\u001b[1;32m 174\u001b[0m \u001b[39mfinally\u001b[39;00m:\n\u001b[1;32m 175\u001b[0m \u001b[39mif\u001b[39;00m gcold:\n", + "File \u001b[0;32m:3\u001b[0m, in \u001b[0;36minner\u001b[0;34m(_it, _timer)\u001b[0m\n", + "File \u001b[0;32m/media/wassname/SGIronWolf/projects5/worldmodels/iris_bigvae/.venv/lib/python3.9/site-packages/torch/nn/modules/module.py:1518\u001b[0m, in \u001b[0;36mModule._wrapped_call_impl\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 1516\u001b[0m \u001b[39mreturn\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_compiled_call_impl(\u001b[39m*\u001b[39margs, \u001b[39m*\u001b[39m\u001b[39m*\u001b[39mkwargs) \u001b[39m# type: ignore[misc]\u001b[39;00m\n\u001b[1;32m 1517\u001b[0m \u001b[39melse\u001b[39;00m:\n\u001b[0;32m-> 1518\u001b[0m \u001b[39mreturn\u001b[39;00m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49m_call_impl(\u001b[39m*\u001b[39;49margs, \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mkwargs)\n", + "File \u001b[0;32m/media/wassname/SGIronWolf/projects5/worldmodels/iris_bigvae/.venv/lib/python3.9/site-packages/torch/nn/modules/module.py:1527\u001b[0m, in \u001b[0;36mModule._call_impl\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 1522\u001b[0m \u001b[39m# If we don't have any hooks, we want to skip the rest of the logic in\u001b[39;00m\n\u001b[1;32m 1523\u001b[0m \u001b[39m# this function, and just call forward.\u001b[39;00m\n\u001b[1;32m 1524\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mnot\u001b[39;00m (\u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_backward_hooks \u001b[39mor\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_backward_pre_hooks \u001b[39mor\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_forward_hooks \u001b[39mor\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_forward_pre_hooks\n\u001b[1;32m 1525\u001b[0m \u001b[39mor\u001b[39;00m _global_backward_pre_hooks \u001b[39mor\u001b[39;00m _global_backward_hooks\n\u001b[1;32m 1526\u001b[0m \u001b[39mor\u001b[39;00m _global_forward_hooks \u001b[39mor\u001b[39;00m _global_forward_pre_hooks):\n\u001b[0;32m-> 1527\u001b[0m \u001b[39mreturn\u001b[39;00m forward_call(\u001b[39m*\u001b[39;49margs, \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mkwargs)\n\u001b[1;32m 1529\u001b[0m \u001b[39mtry\u001b[39;00m:\n\u001b[1;32m 1530\u001b[0m result \u001b[39m=\u001b[39m \u001b[39mNone\u001b[39;00m\n", + "File \u001b[0;32m/media/wassname/SGIronWolf/projects5/worldmodels/iris_bigvae/src/models/transformer.py:69\u001b[0m, in \u001b[0;36mTransformer.forward\u001b[0;34m(self, sequences, past_keys_values)\u001b[0m\n\u001b[1;32m 66\u001b[0m \u001b[39m# k_size = (x.shape[0], x.shape[1], x.shape[1], 1)\u001b[39;00m\n\u001b[1;32m 67\u001b[0m \u001b[39m# v_size = past_keys_values[0]._v_cache._cache.size()\u001b[39;00m\n\u001b[1;32m 68\u001b[0m v_size \u001b[39m=\u001b[39m (k_size[\u001b[39m0\u001b[39m], k_size[\u001b[39m1\u001b[39m], x\u001b[39m.\u001b[39mshape[\u001b[39m1\u001b[39m], k_size[\u001b[39m3\u001b[39m])\n\u001b[0;32m---> 69\u001b[0m past_keys_values[\u001b[39m0\u001b[39;49m]\u001b[39m.\u001b[39;49mupdate(torch\u001b[39m.\u001b[39;49mrand(v_size), torch\u001b[39m.\u001b[39;49mrand(v_size))\n\u001b[1;32m 70\u001b[0m \u001b[39mreturn\u001b[39;00m x\n", + "File \u001b[0;32m/media/wassname/SGIronWolf/projects5/worldmodels/iris_bigvae/src/models/kv_caching.py:59\u001b[0m, in \u001b[0;36mKVCache.update\u001b[0;34m(self, k, v)\u001b[0m\n\u001b[1;32m 58\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39mupdate\u001b[39m(\u001b[39mself\u001b[39m, k: torch\u001b[39m.\u001b[39mTensor, v: torch\u001b[39m.\u001b[39mTensor):\n\u001b[0;32m---> 59\u001b[0m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49m_k_cache\u001b[39m.\u001b[39;49mupdate(k)\n\u001b[1;32m 60\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_v_cache\u001b[39m.\u001b[39mupdate(v)\n", + "File \u001b[0;32m/media/wassname/SGIronWolf/projects5/worldmodels/iris_bigvae/src/models/kv_caching.py:33\u001b[0m, in \u001b[0;36mCache.update\u001b[0;34m(self, x)\u001b[0m\n\u001b[1;32m 31\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39mupdate\u001b[39m(\u001b[39mself\u001b[39m, x: torch\u001b[39m.\u001b[39mTensor) \u001b[39m-\u001b[39m\u001b[39m>\u001b[39m \u001b[39mNone\u001b[39;00m:\n\u001b[1;32m 32\u001b[0m \u001b[39massert\u001b[39;00m (x\u001b[39m.\u001b[39mndim \u001b[39m==\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_cache\u001b[39m.\u001b[39mndim) \u001b[39mand\u001b[39;00m \u001b[39mall\u001b[39m([x\u001b[39m.\u001b[39msize(i) \u001b[39m==\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_cache\u001b[39m.\u001b[39msize(i) \u001b[39mfor\u001b[39;00m i \u001b[39min\u001b[39;00m (\u001b[39m0\u001b[39m, \u001b[39m1\u001b[39m, \u001b[39m3\u001b[39m)])\n\u001b[0;32m---> 33\u001b[0m \u001b[39massert\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_size \u001b[39m+\u001b[39m x\u001b[39m.\u001b[39msize(\u001b[39m2\u001b[39m) \u001b[39m<\u001b[39m\u001b[39m=\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_cache\u001b[39m.\u001b[39mshape[\u001b[39m2\u001b[39m]\n\u001b[1;32m 34\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_cache \u001b[39m=\u001b[39m AssignWithoutInplaceCheck\u001b[39m.\u001b[39mapply(\u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_cache, x, \u001b[39m2\u001b[39m, \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_size, \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_size \u001b[39m+\u001b[39m x\u001b[39m.\u001b[39msize(\u001b[39m2\u001b[39m))\n\u001b[1;32m 35\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_size \u001b[39m+\u001b[39m\u001b[39m=\u001b[39m x\u001b[39m.\u001b[39msize(\u001b[39m2\u001b[39m)\n", + "\u001b[0;31mAssertionError\u001b[0m: " + ] + } + ], + "source": [ + "%%timeit\n", + "# ofc it's the transformer that's slow. I guess we just call it was more than during training\n", + "past_keys_values = wm_env.keys_values_wm\n", + "x = world_model.transformer(sequences, past_keys_values)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# past_keys_values = wm_env.keys_values_wm\n", + "# x = world_model.transformer(sequences, past_keys_values)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%%timeit\n", + "# ofc it's the transformer that's slow. I guess we just call it was more than during training\n", + "past_keys_values = wm_env.keys_values_wm\n", + "x = world_model.transformer(sequences, past_keys_values)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "logits_observations = world_model.head_observations(x, num_steps=num_steps, prev_steps=prev_steps)\n", + "logits_rewards = world_model.head_rewards(x, num_steps=num_steps, prev_steps=prev_steps)\n", + "logits_ends = world_model.head_ends(x, num_steps=num_steps, prev_steps=prev_steps)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Torchinfo model sizes\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "observations = self.agent.tokenizer.preprocess_input(rearrange(batch['observations'], 'b t c h w -> (b t) c h w'))\n", + "# z, z_quantized, reconstructions = self.agent.tokenizer(observations, should_preprocess=False, should_postprocess=False)\n", + "summary(self.agent.tokenizer, input_data=observations)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "\n", + "with torch.no_grad():\n", + " obs_tokens = self.agent.tokenizer.encode(batch['observations'], should_preprocess=True).tokens # (BL, K)\n", + "\n", + "act_tokens = rearrange(batch['actions'], 'b l -> b l 1')\n", + "tokens = rearrange(torch.cat((obs_tokens, act_tokens), dim=2), 'b l k1 -> b (l k1)') # \n", + "\n", + "summary(self.agent.world_model, input_data=tokens)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from src.envs.world_model_env import WorldModelEnv\n", + "initial_observations = batch['observations']\n", + "\n", + "# get the right obs\n", + "wm_env = WorldModelEnv(self.agent.tokenizer, self.agent.world_model, self.device)\n", + "obs = wm_env.reset_from_initial_observations(initial_observations[:, -1])\n", + "obs.shape\n", + "\n", + "\n", + "# make sure hidden states are right\n", + "self.agent.actor_critic.reset(obs.shape[0])\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "\n", + "from torchinfo import summary\n", + "summary(self.agent.actor_critic, input_data=obs)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Debug env\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import minihack\n", + "env = gym.make(\"MiniHack-River-v0\", observation_keys=(\"pixel_crop\", \"pixel\", 'blstats', 'message'))\n", + "env.reset() # each reset generates a new environment instance\n", + "obs, reward, end, info = env.step(1) # move agent '@' north\n", + "print(obs['pixel_crop'].shape)\n", + "plt.imshow(obs['pixel_crop'])\n", + "plt.show()\n", + "\n", + "print(obs['pixel'].shape)\n", + "plt.imshow(obs['pixel'])\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# # plt.imshow(obs['glyphs_crop'])\n", + "# obs['glyphs_crop'].shape\n", + "# obs['blstats']\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import minihack\n", + "env = gym.make(\"MiniHack-Room-5x5-v0\", observation_keys=(\"pixel_crop\", \"pixel\", 'blstats', 'message'))\n", + "env.reset() # each reset generates a new environment instance\n", + "obs, reward, end, info = env.step(1) # move agent '@' north\n", + "print(obs['pixel_crop'].shape)\n", + "plt.imshow(obs['pixel_crop'])\n", + "plt.show()\n", + "\n", + "print(obs['pixel'].shape)\n", + "plt.imshow(obs['pixel'])\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import minihack\n", + "import crafter\n", + "env = gym.make(\"CrafterReward-v1\")\n", + "env.reset() # each reset generates a new environment instance\n", + "obs, reward, end, info = env.step(1) # move agent '@' north\n", + "print(obs.shape)\n", + "plt.imshow(obs)\n", + "plt.show()\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.16" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/poetry.lock b/poetry.lock index aafa8da..c67ea9c 100644 --- a/poetry.lock +++ b/poetry.lock @@ -441,6 +441,26 @@ mypy = ["contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.6.1)", "types-Pill test = ["Pillow", "contourpy[test-no-images]", "matplotlib"] test-no-images = ["pytest", "pytest-cov", "pytest-xdist", "wurlitzer"] +[[package]] +name = "crafter" +version = "1.8.2" +description = "Open world survival game for reinforcement learning." +optional = false +python-versions = "*" +files = [ + {file = "crafter-1.8.2.tar.gz", hash = "sha256:4a142c291aa0b137c0808890381b38803876a5811b362801b8cc669faa350def"}, +] + +[package.dependencies] +imageio = "*" +numpy = "*" +opensimplex = "*" +pillow = "*" +"ruamel.yaml" = "*" + +[package.extras] +gui = ["pygame"] + [[package]] name = "cycler" version = "0.12.1" @@ -794,6 +814,37 @@ files = [ {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, ] +[[package]] +name = "imageio" +version = "2.31.5" +description = "Library for reading and writing a wide range of image, video, scientific, and volumetric data formats." +optional = false +python-versions = ">=3.8" +files = [ + {file = "imageio-2.31.5-py3-none-any.whl", hash = "sha256:97f68e12ba676f2f4b541684ed81f7f3370dc347e8321bc68ee34d37b2dbac9f"}, + {file = "imageio-2.31.5.tar.gz", hash = "sha256:d8e53f9cd4054880276a3dac0a28c85ba7874084856a55a0294a8ae6ed7f3a8e"}, +] + +[package.dependencies] +numpy = "*" +pillow = ">=8.3.2" + +[package.extras] +all-plugins = ["astropy", "av", "imageio-ffmpeg", "psutil", "tifffile"] +all-plugins-pypy = ["av", "imageio-ffmpeg", "psutil", "tifffile"] +build = ["wheel"] +dev = ["black", "flake8", "fsspec[github]", "pytest", "pytest-cov"] +docs = ["numpydoc", "pydata-sphinx-theme", "sphinx (<6)"] +ffmpeg = ["imageio-ffmpeg", "psutil"] +fits = ["astropy"] +full = ["astropy", "av", "black", "flake8", "fsspec[github]", "gdal", "imageio-ffmpeg", "itk", "numpydoc", "psutil", "pydata-sphinx-theme", "pytest", "pytest-cov", "sphinx (<6)", "tifffile", "wheel"] +gdal = ["gdal"] +itk = ["itk"] +linting = ["black", "flake8"] +pyav = ["av"] +test = ["fsspec[github]", "pytest", "pytest-cov"] +tifffile = ["tifffile"] + [[package]] name = "importlib-metadata" version = "6.8.0" @@ -1244,6 +1295,28 @@ files = [ [package.dependencies] traitlets = "*" +[[package]] +name = "minihack" +version = "0.1.5" +description = "MiniHack The Planet: A Sandbox for Open-Ended Reinforcement Learning Research" +optional = false +python-versions = ">=3.7" +files = [ + {file = "minihack-0.1.5.tar.gz", hash = "sha256:b732a05eed9b70cc48735d63fd0c34498611be1342f4bd45a3ad128367d8c97a"}, +] + +[package.dependencies] +gym = ">=0.15,<=0.23" +nle = "0.9.0" +numpy = ">=1.16" + +[package.extras] +all = ["black (>=19.10b0)", "flake8 (>=3.7)", "flake8-bugbear (>=20.1)", "hydra-colorlog (>=1.0.0)", "hydra-colorlog (>=1.0.0)", "hydra-core (>=1.0.0)", "hydra-core (>=1.0.0)", "hydra-submitit-launcher (>=1.1.1)", "hydra-submitit-launcher (>=1.1.1)", "inflect", "myst-parser (==0.15.1)", "nbsphinx (==0.8.6)", "pre-commit (>=2.0.1)", "pytest (>=5.3)", "pytest-benchmark (>=3.1.0)", "pyyaml", "ray[default] (==1.3.0)", "ray[rllib] (==1.3.0)", "sphinx (==4.0.2)", "sphinx-rtd-theme (==1.0.0)", "stanza", "torch (>=1.3.1)", "torch (>=1.3.1)", "wandb (>=0.10.31)", "wandb (>=0.10.31)"] +dev = ["black (>=19.10b0)", "flake8 (>=3.7)", "flake8-bugbear (>=20.1)", "myst-parser (==0.15.1)", "nbsphinx (==0.8.6)", "pre-commit (>=2.0.1)", "pytest (>=5.3)", "pytest-benchmark (>=3.1.0)", "sphinx (==4.0.2)", "sphinx-rtd-theme (==1.0.0)"] +polybeast = ["hydra-colorlog (>=1.0.0)", "hydra-core (>=1.0.0)", "hydra-submitit-launcher (>=1.1.1)", "pyyaml", "torch (>=1.3.1)", "wandb (>=0.10.31)"] +rllib = ["hydra-colorlog (>=1.0.0)", "hydra-core (>=1.0.0)", "hydra-submitit-launcher (>=1.1.1)", "ray[default] (==1.3.0)", "ray[rllib] (==1.3.0)", "torch (>=1.3.1)", "wandb (>=0.10.31)"] +wiki = ["inflect", "stanza"] + [[package]] name = "mpmath" version = "1.3.0" @@ -1290,6 +1363,26 @@ doc = ["nb2plots (>=0.7)", "nbconvert (<7.9)", "numpydoc (>=1.6)", "pillow (>=9. extra = ["lxml (>=4.6)", "pydot (>=1.4.2)", "pygraphviz (>=1.11)", "sympy (>=1.10)"] test = ["pytest (>=7.2)", "pytest-cov (>=4.0)"] +[[package]] +name = "nle" +version = "0.9.0" +description = "The NetHack Learning Environment (NLE): a reinforcement learning environment based on NetHack" +optional = false +python-versions = ">=3.5" +files = [ + {file = "nle-0.9.0.tar.gz", hash = "sha256:a98644bdd547017cdde9fdf589b245da98ff8753327285e949d506d9006f10d4"}, +] + +[package.dependencies] +gym = ">=0.15,<=0.23" +numpy = ">=1.16" +pybind11 = ">=2.2" + +[package.extras] +agent = ["torch (>=1.3.1)"] +all = ["black (>=19.10b0)", "cmake_format (>=0.6.10)", "flake8 (>=3.7)", "flake8-bugbear (>=20.1)", "memory-profiler (>=0.60.0)", "pre-commit (>=2.0.1)", "pytest (>=6.2.5)", "pytest-benchmark (>=3.4.1)", "sphinx (>=2.4.4)", "sphinx-rtd-theme (==0.4.3)", "torch (>=1.3.1)"] +dev = ["black (>=19.10b0)", "cmake_format (>=0.6.10)", "flake8 (>=3.7)", "flake8-bugbear (>=20.1)", "memory-profiler (>=0.60.0)", "pre-commit (>=2.0.1)", "pytest (>=6.2.5)", "pytest-benchmark (>=3.4.1)", "sphinx (>=2.4.4)", "sphinx-rtd-theme (==0.4.3)"] + [[package]] name = "numpy" version = "1.26.1" @@ -1371,6 +1464,20 @@ numpy = [ {version = ">=1.19.3", markers = "platform_system == \"Linux\" and platform_machine == \"aarch64\" and python_version >= \"3.8\" and python_version < \"3.10\" or python_version > \"3.9\" and python_version < \"3.10\" or python_version >= \"3.9\" and platform_system != \"Darwin\" and python_version < \"3.10\" or python_version >= \"3.9\" and platform_machine != \"arm64\" and python_version < \"3.10\""}, ] +[[package]] +name = "opensimplex" +version = "0.4.5" +description = "OpenSimplex is a noise generation function like Perlin or Simplex noise, but better." +optional = false +python-versions = ">=3.8" +files = [ + {file = "opensimplex-0.4.5-py3-none-any.whl", hash = "sha256:5e34f2b6f7e2d3e798d7f060b45cb1f92c02b68b6fc2626ac2a36bd53ec6c773"}, + {file = "opensimplex-0.4.5.tar.gz", hash = "sha256:c390cf70dea97b32bd1a49ba6781e84f48dc93b1cc6c06f36d9d44c548299f90"}, +] + +[package.dependencies] +numpy = ">=1.22" + [[package]] name = "packaging" version = "23.2" @@ -1645,6 +1752,20 @@ files = [ [package.extras] tests = ["pytest"] +[[package]] +name = "pybind11" +version = "2.11.1" +description = "Seamless operability between C++11 and Python" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pybind11-2.11.1-py3-none-any.whl", hash = "sha256:33cdd02a6453380dd71cc70357ce388ad1ee8d32bd0e38fc22b273d050aa29b3"}, + {file = "pybind11-2.11.1.tar.gz", hash = "sha256:00cd59116a6e8155aecd9174f37ba299d1d397ed4a6b86ac1dfe01b3e40f2cc4"}, +] + +[package.extras] +global = ["pybind11-global (==2.11.1)"] + [[package]] name = "pycparser" version = "2.21" @@ -2069,6 +2190,83 @@ urllib3 = ">=1.21.1,<3" socks = ["PySocks (>=1.5.6,!=1.5.7)"] use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] +[[package]] +name = "ruamel-yaml" +version = "0.18.5" +description = "ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order" +optional = false +python-versions = ">=3.7" +files = [ + {file = "ruamel.yaml-0.18.5-py3-none-any.whl", hash = "sha256:a013ac02f99a69cdd6277d9664689eb1acba07069f912823177c5eced21a6ada"}, + {file = "ruamel.yaml-0.18.5.tar.gz", hash = "sha256:61917e3a35a569c1133a8f772e1226961bf5a1198bea7e23f06a0841dea1ab0e"}, +] + +[package.dependencies] +"ruamel.yaml.clib" = {version = ">=0.2.7", markers = "platform_python_implementation == \"CPython\" and python_version < \"3.13\""} + +[package.extras] +docs = ["mercurial (>5.7)", "ryd"] +jinja2 = ["ruamel.yaml.jinja2 (>=0.2)"] + +[[package]] +name = "ruamel-yaml-clib" +version = "0.2.8" +description = "C version of reader, parser and emitter for ruamel.yaml derived from libyaml" +optional = false +python-versions = ">=3.6" +files = [ + {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b42169467c42b692c19cf539c38d4602069d8c1505e97b86387fcf7afb766e1d"}, + {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-macosx_13_0_arm64.whl", hash = "sha256:07238db9cbdf8fc1e9de2489a4f68474e70dffcb32232db7c08fa61ca0c7c462"}, + {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:fff3573c2db359f091e1589c3d7c5fc2f86f5bdb6f24252c2d8e539d4e45f412"}, + {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-manylinux_2_24_aarch64.whl", hash = "sha256:aa2267c6a303eb483de8d02db2871afb5c5fc15618d894300b88958f729ad74f"}, + {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:840f0c7f194986a63d2c2465ca63af8ccbbc90ab1c6001b1978f05119b5e7334"}, + {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:024cfe1fc7c7f4e1aff4a81e718109e13409767e4f871443cbff3dba3578203d"}, + {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-win32.whl", hash = "sha256:c69212f63169ec1cfc9bb44723bf2917cbbd8f6191a00ef3410f5a7fe300722d"}, + {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-win_amd64.whl", hash = "sha256:cabddb8d8ead485e255fe80429f833172b4cadf99274db39abc080e068cbcc31"}, + {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:bef08cd86169d9eafb3ccb0a39edb11d8e25f3dae2b28f5c52fd997521133069"}, + {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-macosx_13_0_arm64.whl", hash = "sha256:b16420e621d26fdfa949a8b4b47ade8810c56002f5389970db4ddda51dbff248"}, + {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:25c515e350e5b739842fc3228d662413ef28f295791af5e5110b543cf0b57d9b"}, + {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-manylinux_2_24_aarch64.whl", hash = "sha256:1707814f0d9791df063f8c19bb51b0d1278b8e9a2353abbb676c2f685dee6afe"}, + {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:46d378daaac94f454b3a0e3d8d78cafd78a026b1d71443f4966c696b48a6d899"}, + {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:09b055c05697b38ecacb7ac50bdab2240bfca1a0c4872b0fd309bb07dc9aa3a9"}, + {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-win32.whl", hash = "sha256:53a300ed9cea38cf5a2a9b069058137c2ca1ce658a874b79baceb8f892f915a7"}, + {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-win_amd64.whl", hash = "sha256:c2a72e9109ea74e511e29032f3b670835f8a59bbdc9ce692c5b4ed91ccf1eedb"}, + {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:ebc06178e8821efc9692ea7544aa5644217358490145629914d8020042c24aa1"}, + {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-macosx_13_0_arm64.whl", hash = "sha256:edaef1c1200c4b4cb914583150dcaa3bc30e592e907c01117c08b13a07255ec2"}, + {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d176b57452ab5b7028ac47e7b3cf644bcfdc8cacfecf7e71759f7f51a59e5c92"}, + {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-manylinux_2_24_aarch64.whl", hash = "sha256:1dc67314e7e1086c9fdf2680b7b6c2be1c0d8e3a8279f2e993ca2a7545fecf62"}, + {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:3213ece08ea033eb159ac52ae052a4899b56ecc124bb80020d9bbceeb50258e9"}, + {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:aab7fd643f71d7946f2ee58cc88c9b7bfc97debd71dcc93e03e2d174628e7e2d"}, + {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-win32.whl", hash = "sha256:5c365d91c88390c8d0a8545df0b5857172824b1c604e867161e6b3d59a827eaa"}, + {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-win_amd64.whl", hash = "sha256:1758ce7d8e1a29d23de54a16ae867abd370f01b5a69e1a3ba75223eaa3ca1a1b"}, + {file = "ruamel.yaml.clib-0.2.8-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a5aa27bad2bb83670b71683aae140a1f52b0857a2deff56ad3f6c13a017a26ed"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c58ecd827313af6864893e7af0a3bb85fd529f862b6adbefe14643947cfe2942"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-macosx_12_0_arm64.whl", hash = "sha256:f481f16baec5290e45aebdc2a5168ebc6d35189ae6fea7a58787613a25f6e875"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-manylinux_2_24_aarch64.whl", hash = "sha256:77159f5d5b5c14f7c34073862a6b7d34944075d9f93e681638f6d753606c6ce6"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:7f67a1ee819dc4562d444bbafb135832b0b909f81cc90f7aa00260968c9ca1b3"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:4ecbf9c3e19f9562c7fdd462e8d18dd902a47ca046a2e64dba80699f0b6c09b7"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:87ea5ff66d8064301a154b3933ae406b0863402a799b16e4a1d24d9fbbcbe0d3"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-win32.whl", hash = "sha256:75e1ed13e1f9de23c5607fe6bd1aeaae21e523b32d83bb33918245361e9cc51b"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-win_amd64.whl", hash = "sha256:3f215c5daf6a9d7bbed4a0a4f760f3113b10e82ff4c5c44bec20a68c8014f675"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1b617618914cb00bf5c34d4357c37aa15183fa229b24767259657746c9077615"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:a6a9ffd280b71ad062eae53ac1659ad86a17f59a0fdc7699fd9be40525153337"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-manylinux_2_24_aarch64.whl", hash = "sha256:305889baa4043a09e5b76f8e2a51d4ffba44259f6b4c72dec8ca56207d9c6fe1"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:700e4ebb569e59e16a976857c8798aee258dceac7c7d6b50cab63e080058df91"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:e2b4c44b60eadec492926a7270abb100ef9f72798e18743939bdbf037aab8c28"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e79e5db08739731b0ce4850bed599235d601701d5694c36570a99a0c5ca41a9d"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-win32.whl", hash = "sha256:955eae71ac26c1ab35924203fda6220f84dce57d6d7884f189743e2abe3a9fbe"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-win_amd64.whl", hash = "sha256:56f4252222c067b4ce51ae12cbac231bce32aee1d33fbfc9d17e5b8d6966c312"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:03d1162b6d1df1caa3a4bd27aa51ce17c9afc2046c31b0ad60a0a96ec22f8001"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:bba64af9fa9cebe325a62fa398760f5c7206b215201b0ec825005f1b18b9bccf"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-manylinux_2_24_aarch64.whl", hash = "sha256:a1a45e0bb052edf6a1d3a93baef85319733a888363938e1fc9924cb00c8df24c"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:da09ad1c359a728e112d60116f626cc9f29730ff3e0e7db72b9a2dbc2e4beed5"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:184565012b60405d93838167f425713180b949e9d8dd0bbc7b49f074407c5a8b"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a75879bacf2c987c003368cf14bed0ffe99e8e85acfa6c0bfffc21a090f16880"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-win32.whl", hash = "sha256:84b554931e932c46f94ab306913ad7e11bba988104c5cff26d90d03f68258cd5"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-win_amd64.whl", hash = "sha256:25ac8c08322002b06fa1d49d1646181f0b2c72f5cbc15a85e80b4c30a544bb15"}, + {file = "ruamel.yaml.clib-0.2.8.tar.gz", hash = "sha256:beb2e0404003de9a4cab9753a8805a8fe9320ee6673136ed7f04255fe60bb512"}, +] + [[package]] name = "ruff" version = "0.1.5" @@ -2940,4 +3138,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = ">=3.9,<3.13" -content-hash = "e2ad5cf8670b043bb7174a4c7f6e4c89644461eb1680e282b436541672e4e67c" +content-hash = "d265b7789c918f4c2dc7d3db9ea80871958320fedc47576d0e0f78f327f42f6e" diff --git a/pyproject.toml b/pyproject.toml index 3cad2fb..f43a0b0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -28,6 +28,8 @@ torchvision = "^0.16.0" numpy = ">=1.18.0" gym = {version = "0.22.0", extras = ["accept-rom-license", "atari"]} scipy = "^1.11.3" +crafter = "^1.8.2" +minihack = "^0.1.5" [[tool.poetry.source]] name = "pytorch" diff --git a/research_journal.md b/research_journal.md index 8bdf3fe..2e6e327 100644 --- a/research_journal.md +++ b/research_journal.md @@ -232,3 +232,85 @@ Training tokenizer: 100%|██████████████████ Training world_model: 100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 200/200 [01:15<00:00, 2.64it/s] Training actor_critic: 100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 20/20 [03:20<00:00, 10.05s/it] + + +- what about resume? oh we seem to have that although the code doesn't make sense https://hydra.cc/docs/tutorials/basic/running_your_app/working_directory/ https://hydra.cc/docs/1.2/upgrades/1.1_to_1.2/changes_to_job_working_dir/ see eval.py +- [ ] but it's still too damn slow. what about bfloat16? using auto case? +- why does it take so long? it would be nice to have a reproduction notebook +- also the model might be to small now.... + +how to play +```sh +cd outputs/2023-11-17/07-59-44 +python scripts/play.sh +``` + + +## Envs + +tl:dr just use pong or breakout or crafter (1m steps) + +for steps see [crafter paper](https://arxiv.org/pdf/2109.06780.pdf) + +Nethack learning env. What's the obs size? 21x79 of glyphs (5991 possibilities) and 21 dim of stats +- they use an lstm of 128. 5 layer conv +- requires 1B steps +- +atari: +- reqs 200M stpes + +progcen: +- 200M steps + +minihack: +- 2M steps for room 5xt +- but needs editing to be atari compatible. e.g. 336 × 1264 × 3 pixels +- pixel_crop 64,64,3 or 9x9 crop works! +- lstm 256 +- The training on MiniHack’s Room-5x5 task for two million timesteps using our IMPALA baseline takes approximately 4:30 minutes (r + +crafter +- reqs 1M steps +- "All agents trained for 1M environment steps in under 24 hours on a single GPU and we repeated the training for 10 random seeds per method. The training reward curves are included in Appendix " + + + + +from https://arxiv.org/pdf/2111.09794.pdf +There are several PCG state-varying gridworld environments ( +- [MiniGrid](https://minigrid.farama.org/environments/minigrid/), ~~- BabyAI~~ +- Crafter, +- 2019 [Rogue-gym,](https://github.com/kngwyu/rogue-gym) +- 2020 MarsExplorer, maxe exploration. 1M steps +- NLE, +- MiniHack; +- [gym\_nethack](http://campbelljc.com/research/gym_nethack/) +- 2018 [rogueinabox](https://github.com/rogueinabox/rogueinabox) +- [rogue-gym](https://github.com/kngwyu/rogue-gym) +- [MiniGrid](https://github.com/maximecb/gym-minigrid) +- 2019 [CoinRun](https://github.com/openai/coinrun) no traction or maintanance +- [MineRL](http://minerl.io/docs) +- [Project Malmo](https://www.microsoft.com/en-us/research/project/project-malmo/) miencraft +- [OpenAI Procgen Benchmark](https://openai.com/blog/procgen-benchmark/) 200M steps +- 2020 [Obstacle Tower](https://github.com/Unity-Technologies/obstacle-tower-env) - 3d slow + +non-PCG observation-varying continuous control environments +- (RoboSuite, DMC-Remastered, DMC-GB, DCS, KitchenShift, NaturalEnvs MuJoCo; Fan +et al., 2021; Grigsby & Qi, 2020; Hansen & Wang, 2021; Stone et al., 2021; Xing et al., 2021a; +Zhang et al., 2018a), and multi-task continuous control benchmarks which could be adapted +to ZSG (CausalWorld, RLBench, Meta-world; Ahmed et al., 2020; James et al., 2019a; Yu +et al., 2019). + +## investigating model slowness + +So it's all just that using the transformer to imagine takes almost 0.1s. but it's run so many more times than during training. All my ideas to speed it up don't work. + +- [x] eval. no grad +- [x] remove the call for adapter, causal mask each time? +- [ ] lower rank? + + +Ok so it's all just the +- rollout, controller by max block size. 10x +- the fact that actor_critic can use a larger batch, therefore 4-8x more samples +- for each one it imagines 2 diff --git a/src/models/actor_critic.py b/src/models/actor_critic.py index 13eb51d..976439a 100644 --- a/src/models/actor_critic.py +++ b/src/models/actor_critic.py @@ -36,8 +36,8 @@ class ImagineOutput: class ActorCritic(nn.Module): def __init__(self, act_vocab_size, use_original_obs: bool = False, lstm_dim = 16) -> None: super().__init__() - shrink = 8 - s = 2 + shrink = 1 + s = 1 self.use_original_obs = use_original_obs self.conv1 = nn.Conv2d(3, 32//s, 3, stride=1, padding=1) self.maxp1 = nn.MaxPool2d(2, 2) diff --git a/src/models/transformer.py b/src/models/transformer.py index 86139c4..5ccdc70 100644 --- a/src/models/transformer.py +++ b/src/models/transformer.py @@ -49,7 +49,8 @@ class Transformer(nn.Module): # @torch.cuda.amp.autocast(dtype=torch.bfloat16) def forward(self, sequences: torch.Tensor, past_keys_values: Optional[KeysValues] = None) -> torch.Tensor: assert past_keys_values is None or len(past_keys_values) == self.config.num_layers - with set_adapter(self.model, "dynamics"), disable_causal_mask(), torch.cuda.amp.autocast(dtype=torch.bfloat16): + # with set_adapter(self.model, "dynamics"), disable_causal_mask(), torch.cuda.amp.autocast(dtype=torch.bfloat16): + with torch.cuda.amp.autocast(dtype=torch.bfloat16): # sequences = sequences.to(torch.bfloat16) outputs = self.model( inputs_embeds=sequences, @@ -111,7 +112,9 @@ def load_pretrained_model(config, device="cuda:0"): ) base_model_peft = peft.get_peft_model(base_model, peft_config) base_model_peft.add_adapter("dynamics", peft_config) + base_model_peft.set_adapter("dynamics") print(base_model_peft.print_trainable_parameters()) + disable_causal_mask() return base_model_peft @contextmanager diff --git a/src/trainer.py b/src/trainer.py index 5091fc3..9402c60 100644 --- a/src/trainer.py +++ b/src/trainer.py @@ -46,6 +46,7 @@ class Trainer: self.reconstructions_dir = self.media_dir / 'reconstructions' if not cfg.common.resume: + print('cwd', Path.cwd()) config_dir = Path('config') config_path = config_dir / 'trainer.yaml' config_dir.mkdir(exist_ok=False, parents=False) From a341e7aaad35c4468c8911130250f8e3b9b1462c Mon Sep 17 00:00:00 2001 From: wassname Date: Sat, 18 Nov 2023 07:44:05 +0800 Subject: [PATCH 16/30] abs imports, fix play for crafter --- config/trainer.yaml | 2 +- research_journal.md | 4 ++++ src/agent.py | 8 ++++---- src/game/keymap.py | 27 ++++++++++++++++++++++++++- src/models/actor_critic.py | 10 +++++----- src/models/world_model.py | 12 ++++++------ src/play.py | 10 +++++----- src/utils.py | 2 +- 8 files changed, 52 insertions(+), 23 deletions(-) diff --git a/config/trainer.yaml b/config/trainer.yaml index d1f92a6..390a3ac 100644 --- a/config/trainer.yaml +++ b/config/trainer.yaml @@ -7,7 +7,7 @@ defaults: - datasets: default wandb: - mode: offline + mode: online project: iris entity: null name: null diff --git a/research_journal.md b/research_journal.md index 2e6e327..0d40317 100644 --- a/research_journal.md +++ b/research_journal.md @@ -314,3 +314,7 @@ Ok so it's all just the - rollout, controller by max block size. 10x - the fact that actor_critic can use a larger batch, therefore 4-8x more samples - for each one it imagines 2 + +# 2023-11-18 06:17:55 + +It trained overnight, now I would like to view a replay diff --git a/src/agent.py b/src/agent.py index a8d943c..5534232 100644 --- a/src/agent.py +++ b/src/agent.py @@ -4,10 +4,10 @@ import torch from torch.distributions.categorical import Categorical import torch.nn as nn -from .models.actor_critic import ActorCritic -from .models.tokenizer import Tokenizer -from .models.world_model import WorldModel -from .utils import extract_state_dict +from src.models.actor_critic import ActorCritic +from src.models.tokenizer import Tokenizer +from src.models.world_model import WorldModel +from src.utils import extract_state_dict class Agent(nn.Module): diff --git a/src/game/keymap.py b/src/game/keymap.py index 62aadc7..735eb8c 100644 --- a/src/game/keymap.py +++ b/src/game/keymap.py @@ -12,6 +12,10 @@ def get_keymap_and_action_names(name): if name == 'atari': return ATARI_KEYMAP, ATARI_ACTION_NAMES + + if name == 'atari/CrafterReward-v1': + env_id = name.split('atari/')[1] + return CRAFTER_KEYMAP, gym.make(env_id).action_names assert name.startswith('atari/') env_id = name.split('atari/')[1] @@ -100,4 +104,25 @@ EMPTY_ACTION_NAMES = [ ] EMPTY_KEYMAP = { -} \ No newline at end of file +} + +CRAFTER_KEYMAP = { + pygame.K_a: 'move_left', + pygame.K_d: 'move_right', + pygame.K_w: 'move_up', + pygame.K_s: 'move_down', + pygame.K_SPACE: 'do', + pygame.K_TAB: 'sleep', + + pygame.K_r: 'place_stone', + pygame.K_t: 'place_table', + pygame.K_f: 'place_furnace', + pygame.K_p: 'place_plant', + + pygame.K_1: 'make_wood_pickaxe', + pygame.K_2: 'make_stone_pickaxe', + pygame.K_3: 'make_iron_pickaxe', + pygame.K_4: 'make_wood_sword', + pygame.K_5: 'make_stone_sword', + pygame.K_6: 'make_iron_sword', +} diff --git a/src/models/actor_critic.py b/src/models/actor_critic.py index 976439a..ec1256d 100644 --- a/src/models/actor_critic.py +++ b/src/models/actor_critic.py @@ -10,11 +10,11 @@ import torch.nn as nn import torch.nn.functional as F from tqdm import tqdm -from ..dataset import Batch -from ..envs.world_model_env import WorldModelEnv -from ..models.tokenizer import Tokenizer -from ..models.world_model import WorldModel -from ..utils import compute_lambda_returns, LossWithIntermediateLosses +from src.dataset import Batch +from src.envs.world_model_env import WorldModelEnv +from src.models.tokenizer import Tokenizer +from src.models.world_model import WorldModel +from src.utils import compute_lambda_returns, LossWithIntermediateLosses @dataclass diff --git a/src/models/world_model.py b/src/models/world_model.py index 349423c..eecfe60 100644 --- a/src/models/world_model.py +++ b/src/models/world_model.py @@ -6,12 +6,12 @@ import torch import torch.nn as nn import torch.nn.functional as F -from ..dataset import Batch -from .kv_caching import KeysValues -from .slicer import Embedder, Head -from .tokenizer import Tokenizer -from .transformer import Transformer, TransformerConfig -from ..utils import init_weights, LossWithIntermediateLosses +from src.dataset import Batch +from src.models.kv_caching import KeysValues +from src.models.slicer import Embedder, Head +from src.models.tokenizer import Tokenizer +from src.models.transformer import Transformer, TransformerConfig +from src.utils import init_weights, LossWithIntermediateLosses @dataclass diff --git a/src/play.py b/src/play.py index 7b18dee..7e3ab85 100644 --- a/src/play.py +++ b/src/play.py @@ -6,11 +6,11 @@ from hydra.utils import instantiate from omegaconf import DictConfig import torch -from agent import Agent -from envs import SingleProcessEnv, WorldModelEnv -from game import AgentEnv, EpisodeReplayEnv, Game -from models.actor_critic import ActorCritic -from models.world_model import WorldModel +from src.agent import Agent +from src.envs import SingleProcessEnv, WorldModelEnv +from src.game import AgentEnv, EpisodeReplayEnv, Game +from src.models.actor_critic import ActorCritic +from src.models.world_model import WorldModel @hydra.main(config_path="../config", config_name="trainer") diff --git a/src/utils.py b/src/utils.py index 1aaf3b2..d64273d 100644 --- a/src/utils.py +++ b/src/utils.py @@ -8,7 +8,7 @@ import numpy as np import torch import torch.nn as nn -from .episode import Episode +from src.episode import Episode from transformers.pytorch_utils import ALL_LAYERNORM_LAYERS From 9b399031ca3af855c5d0ddcfef8acdf5e297094b Mon Sep 17 00:00:00 2001 From: wassname Date: Sat, 18 Nov 2023 16:32:59 +0800 Subject: [PATCH 17/30] document play.sh options --- scripts/play.sh | 14 +++++++------- src/envs/wrappers.py | 1 + src/game/agent_env.py | 8 ++++---- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/scripts/play.sh b/scripts/play.sh index eff9abe..967db60 100755 --- a/scripts/play.sh +++ b/scripts/play.sh @@ -14,22 +14,22 @@ while [ "$1" != "" ]; do ;; -h | --header ) header=1 - ;; + ;; # adds banner with env metadata like action -r | --reconstruction ) reconstruction=1 - ;; + ;; # 3 panes [original_obs, resized_obs, reconstructed], doesn't do anything if any of -w -a or -e are set. shows quality of encoder decoder -s | --save-mode ) save_mode=1 - ;; + ;; # lets you save the episode to mp4 -a | --agent-world-model ) mode="agent_in_world_model" - ;; + ;; # the agent plays in the world model env, shows the quality of the dynamics model -e | --episode ) mode="episode_replay" - ;; + ;; # replay train, test, or imagined episodes. shows quality of dynamics model -w | --world-model ) mode="play_in_world_model" - ;; + ;; # human plays in world model * ) echo Invalid usage : $1 exit 1 @@ -37,4 +37,4 @@ while [ "$1" != "" ]; do shift done -python src/play.py hydra.run.dir=. hydra.output_subdir=null +mode="${mode}" +fps="${fps}" +header="${header}" +reconstruction="${reconstruction}" +save_mode="${save_mode}" +python -m pdb src/play.py hydra.run.dir=. hydra.output_subdir=null +mode="${mode}" +fps="${fps}" +header="${header}" +reconstruction="${reconstruction}" +save_mode="${save_mode}" diff --git a/src/envs/wrappers.py b/src/envs/wrappers.py index 4183483..fa586ac 100644 --- a/src/envs/wrappers.py +++ b/src/envs/wrappers.py @@ -39,6 +39,7 @@ def make_crafter(id, size=64, max_episode_steps=None, done_on_life_loss=False): # https://github.com/danijar/dreamerv2/blob/07d906e9c4322c6fc2cd6ed23e247ccd6b7c8c41/dreamerv2/common/envs.py#L242 # https://github.com/footoredo/torchbeast/blob/12939569cc46b6a8616e4c25b138d97248cc8581/torchbeast/atari_wrappers.py#L301 env = gym.make(id) + env = ResizeObsWrapper(env, (size, size)) return env diff --git a/src/game/agent_env.py b/src/game/agent_env.py index 77831ad..19ea16b 100644 --- a/src/game/agent_env.py +++ b/src/game/agent_env.py @@ -4,14 +4,14 @@ from PIL import Image import torch from torchvision.transforms.functional import InterpolationMode, resize -from agent import Agent -from envs import SingleProcessEnv, WorldModelEnv -from game.keymap import get_keymap_and_action_names +from src.agent import Agent +from src.envs import SingleProcessEnv, WorldModelEnv +from src.game.keymap import get_keymap_and_action_names class AgentEnv: def __init__(self, agent: Agent, env: SingleProcessEnv, keymap_name: str, do_reconstruction: bool) -> None: - assert isinstance(env, SingleProcessEnv) or isinstance(env, WorldModelEnv) + assert isinstance(env, SingleProcessEnv) or isinstance(env, WorldModelEnv), f"{env}" self.agent = agent self.env = env _, self.action_names = get_keymap_and_action_names(keymap_name) From 36ea66d0ae04ec8f7f25198300f300cdba8081a5 Mon Sep 17 00:00:00 2001 From: wassname Date: Sun, 19 Nov 2023 08:17:38 +0800 Subject: [PATCH 18/30] misc --- .vscode/launch.json | 13 +---------- config/trainer.yaml | 4 ++-- research_journal.md | 36 +++++++++++++++++++++++++++++++ src/game/keymap.py | 32 +++++++++++++-------------- src/models/tokenizer/tokenizer.py | 2 +- src/models/transformer.py | 17 ++++++++++----- src/models/world_model.py | 11 +++++++++- src/trainer.py | 2 +- 8 files changed, 79 insertions(+), 38 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index 9044a8c..dbe115f 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -14,7 +14,7 @@ "autoReload": {"enable": true,}, "env": {"WANDB_MODE":"disabled"}, "args": [ - "'wandb.mode=disabled", + // "'wandb.mode=disabled", // "env.train.id=BreakoutNoFrameskip-v4", "env.train.id=CrafterReward-v1", // # make it start early @@ -34,19 +34,8 @@ "console": "integratedTerminal", "justMyCode": false, "autoReload": {"enable": true,}, - "env": {"WANDB_MODE":"disabled"}, "args": [ - "'wandb.mode=disabled", - // "env.train.id=BreakoutNoFrameskip-v4", "env.train.id=CrafterReward-v1", - // # make it start early - "training.tokenizer.start_after_epochs=1", - "training.world_model.start_after_epochs=1", - "training.actor_critic.start_after_epochs=1", - - "training.tokenizer.steps_per_epoch=10", - "training.world_model.steps_per_epoch=10", - "training.actor_critic.steps_per_epoch=10", ] } ] diff --git a/config/trainer.yaml b/config/trainer.yaml index 390a3ac..b4fe7c5 100644 --- a/config/trainer.yaml +++ b/config/trainer.yaml @@ -60,7 +60,7 @@ training: start_after_epochs: 5 steps_per_epoch: 200 world_model: - batch_num_samples: 8 # pretrained models use lots of + batch_num_samples: 8 # pretrained models use lots of ram grad_acc_steps: 1 max_grad_norm: 10.0 weight_decay: 0.01 @@ -70,7 +70,7 @@ training: batch_num_samples: 16 grad_acc_steps: 1 max_grad_norm: 10.0 - start_after_epochs: 50 + start_after_epochs: 1500 steps_per_epoch: 40 imagine_horizon: ${common.sequence_length} burn_in: 20 diff --git a/research_journal.md b/research_journal.md index 0d40317..b7e2a98 100644 --- a/research_journal.md +++ b/research_journal.md @@ -318,3 +318,39 @@ Ok so it's all just the # 2023-11-18 06:17:55 It trained overnight, now I would like to view a replay + +Hmm "delta-IRIS" ∆-IRIS +https://openreview.net/forum?id=o8IDoZggqO +∆-IRIS encodes +new frames by attending to the ongoing trajectory, effec- +tively describing deltas between timesteps. +This new ap- +proach drastically reduces the number of tokens to encode +frames, since they are not encoded independently as in IRIS. +In the Crafter benchmark (Hafner, 2022), ∆-IRIS unlocks +16 out of 22 objectives at the 10M frames mark + + +# 2023-11-18 16:16:16 + +Why is it not learning? It's because the dynamics model is total BS!!! + +- [ ] Well lets try training it for longer then. It's cheap to train so.. +- [ ] also maybe train tokenizer and model together? I have a lot of frozen layers, including the embeddings... so might be better + - [ ] oh no we do have an unforzen embedder before the transformer or more layers + - maybe I need a higher rank lora? after all I'm changing a lot from text tokens + - maybe no tokens, bypass to embedder? + + +# 2023-11-19 06:45:34 + +So I tried just trainign the world model for 200 epochs. And with a post_embedding layer. It helped the flickering. But not enougth to actually go for the obvious local minima of the next state equals the last + + + + +idea +- bypass embedding?, but wait dreamerv3 needed quant z... + - yes I am bypassing it by passing in the input_embeds... but maybe I shouldn't +- use same embedding everywhere. e.g. model embedding in encoder decoder? + - Our embedings is (embed_tokens): Embedding(32000, 2048). So we would need to encode to 32000! diff --git a/src/game/keymap.py b/src/game/keymap.py index 735eb8c..e912868 100644 --- a/src/game/keymap.py +++ b/src/game/keymap.py @@ -107,22 +107,22 @@ EMPTY_KEYMAP = { } CRAFTER_KEYMAP = { - pygame.K_a: 'move_left', - pygame.K_d: 'move_right', - pygame.K_w: 'move_up', - pygame.K_s: 'move_down', - pygame.K_SPACE: 'do', - pygame.K_TAB: 'sleep', + pygame.K_a: 1, + pygame.K_d: 2, + pygame.K_w: 3, + pygame.K_s: 4, + pygame.K_SPACE: 5, + pygame.K_TAB: 6, - pygame.K_r: 'place_stone', - pygame.K_t: 'place_table', - pygame.K_f: 'place_furnace', - pygame.K_p: 'place_plant', + pygame.K_r: 7, + pygame.K_t: 8, + pygame.K_f: 9, + pygame.K_p: 10, - pygame.K_1: 'make_wood_pickaxe', - pygame.K_2: 'make_stone_pickaxe', - pygame.K_3: 'make_iron_pickaxe', - pygame.K_4: 'make_wood_sword', - pygame.K_5: 'make_stone_sword', - pygame.K_6: 'make_iron_sword', + pygame.K_1: 11, + pygame.K_2: 12, + pygame.K_3: 13, + pygame.K_4: 14, + pygame.K_5: 15, + pygame.K_6: 16, } diff --git a/src/models/tokenizer/tokenizer.py b/src/models/tokenizer/tokenizer.py index 1b8723d..e69c18e 100644 --- a/src/models/tokenizer/tokenizer.py +++ b/src/models/tokenizer/tokenizer.py @@ -28,7 +28,7 @@ class Tokenizer(nn.Module): self.vocab_size = vocab_size self.encoder = encoder self.pre_quant_conv = torch.nn.Conv2d(encoder.config.z_channels, embed_dim, 1) - self.embedding = nn.Embedding(vocab_size, embed_dim) + self.embedding = nn.Embedding(vocab_size, embed_dim) # TODO: use model embed? self.post_quant_conv = torch.nn.Conv2d(embed_dim, decoder.config.z_channels, 1) self.decoder = decoder self.embedding.weight.data.uniform_(-1.0 / vocab_size, 1.0 / vocab_size) diff --git a/src/models/transformer.py b/src/models/transformer.py index 5ccdc70..89a2b25 100644 --- a/src/models/transformer.py +++ b/src/models/transformer.py @@ -46,18 +46,15 @@ class Transformer(nn.Module): device = self.ln_f.weight.device # Assumption that all submodules are on the same device return KeysValues(n, self.config.num_heads, max_tokens, self.config.embed_dim, self.config.num_layers, device) - # @torch.cuda.amp.autocast(dtype=torch.bfloat16) def forward(self, sequences: torch.Tensor, past_keys_values: Optional[KeysValues] = None) -> torch.Tensor: assert past_keys_values is None or len(past_keys_values) == self.config.num_layers - # with set_adapter(self.model, "dynamics"), disable_causal_mask(), torch.cuda.amp.autocast(dtype=torch.bfloat16): with torch.cuda.amp.autocast(dtype=torch.bfloat16): - # sequences = sequences.to(torch.bfloat16) outputs = self.model( inputs_embeds=sequences, return_dict=True, output_hidden_states=True, ) - x = outputs.logits#.to(torch.float32) + x = outputs.logits x = self.ln_f(x) # fake it, since it's used to keep track of steps @@ -114,7 +111,7 @@ def load_pretrained_model(config, device="cuda:0"): base_model_peft.add_adapter("dynamics", peft_config) base_model_peft.set_adapter("dynamics") print(base_model_peft.print_trainable_parameters()) - disable_causal_mask() + disable_causal_mask_always() return base_model_peft @contextmanager @@ -130,6 +127,16 @@ def set_adapter(model, adapter_name): finally: model.set_adapter(old_adapter_name) +def disable_causal_mask_always(): + import transformers.models.llama.modeling_llama as modeling + + decoder_fn = modeling._make_causal_mask + + def encoder_fn(*args, **kwargs): + return torch.zeros_like(decoder_fn(*args, **kwargs)) + + modeling._make_causal_mask = encoder_fn + @contextmanager def disable_causal_mask(): import transformers.models.llama.modeling_llama as modeling diff --git a/src/models/world_model.py b/src/models/world_model.py index eecfe60..723b733 100644 --- a/src/models/world_model.py +++ b/src/models/world_model.py @@ -41,6 +41,13 @@ class WorldModel(nn.Module): block_masks=[act_tokens_pattern, obs_tokens_pattern], embedding_tables=nn.ModuleList([nn.Embedding(act_vocab_size, config.embed_dim), nn.Embedding(obs_vocab_size, config.embed_dim)]) ) + self.post_embed = nn.Sequential( + nn.Linear(config.embed_dim, config.embed_dim), + nn.ReLU(), + nn.Linear(config.embed_dim, config.embed_dim), + nn.ReLU(), + nn.Linear(config.embed_dim, config.embed_dim) + ) self.head_observations = Head( max_blocks=config.max_blocks, @@ -86,7 +93,8 @@ class WorldModel(nn.Module): prev_steps = 0 if past_keys_values is None else past_keys_values.size sequences = self.embedder(tokens, num_steps, prev_steps) + self.pos_emb(prev_steps + torch.arange(num_steps, device=tokens.device)) - + # [batch=8, num_steps=170, embed_size=2048] + sequences = self.post_embed(sequences) x = self.transformer(sequences, past_keys_values) logits_observations = self.head_observations(x, num_steps=num_steps, prev_steps=prev_steps) @@ -98,6 +106,7 @@ class WorldModel(nn.Module): def compute_loss(self, batch: Batch, tokenizer: Tokenizer, **kwargs: Any) -> LossWithIntermediateLosses: with torch.no_grad(): + # [B=8, S=10, Colors=3, H=64, W=64] -> [B=8, S=10, 16] obs_tokens = tokenizer.encode(batch['observations'], should_preprocess=True).tokens # (BL, K) act_tokens = rearrange(batch['actions'], 'b l -> b l 1') diff --git a/src/trainer.py b/src/trainer.py index 9402c60..af0460c 100644 --- a/src/trainer.py +++ b/src/trainer.py @@ -137,11 +137,11 @@ class Trainer: if epoch > cfg_tokenizer.start_after_epochs: metrics_tokenizer = self.train_component(self.agent.tokenizer, self.optimizer_tokenizer, sequence_length=1, sample_from_start=True, **cfg_tokenizer) - self.agent.tokenizer.eval() if epoch > cfg_world_model.start_after_epochs: metrics_world_model = self.train_component(self.agent.world_model, self.optimizer_world_model, sequence_length=self.cfg.common.sequence_length, sample_from_start=True, tokenizer=self.agent.tokenizer, **cfg_world_model) self.agent.world_model.eval() + self.agent.tokenizer.eval() if epoch > cfg_actor_critic.start_after_epochs: metrics_actor_critic = self.train_component(self.agent.actor_critic, self.optimizer_actor_critic, sequence_length=1 + self.cfg.training.actor_critic.burn_in, sample_from_start=False, tokenizer=self.agent.tokenizer, world_model=self.agent.world_model, **cfg_actor_critic) From 7098b679559a7e696540d8b698fbd5921f67d28f Mon Sep 17 00:00:00 2001 From: wassname Date: Sun, 19 Nov 2023 08:48:36 +0800 Subject: [PATCH 19/30] 1 --- config/tokenizer/default.yaml | 6 +++--- config/world_model/default.yaml | 4 ++-- research_journal.md | 2 +- src/models/tokenizer/tokenizer.py | 4 ++-- src/models/world_model.py | 1 + src/play.py | 5 +++-- src/trainer.py | 7 +++++-- 7 files changed, 17 insertions(+), 12 deletions(-) diff --git a/config/tokenizer/default.yaml b/config/tokenizer/default.yaml index 64e2bac..2df2b4d 100644 --- a/config/tokenizer/default.yaml +++ b/config/tokenizer/default.yaml @@ -1,14 +1,14 @@ _target_: src.models.tokenizer.Tokenizer -vocab_size: 2048 -embed_dim: 2048 +vocab_size: 32000 # change to llm vocab dim +embed_dim: 2048 # change this to whatever the embedding dimension is in your pretrained llm 2048 for llama. 2560 for stablelm encoder: _target_: src.models.tokenizer.Encoder config: _target_: src.models.tokenizer.EncoderDecoderConfig resolution: 64 in_channels: 3 - z_channels: 2048 + z_channels: 32000 ch: 64 ch_mult: [1, 1, 1, 1, 1] num_res_blocks: 2 diff --git a/config/world_model/default.yaml b/config/world_model/default.yaml index 08ede7e..76894ac 100644 --- a/config/world_model/default.yaml +++ b/config/world_model/default.yaml @@ -2,8 +2,8 @@ _target_: src.models.TransformerConfig max_blocks: 10 # this is the rollout length when training policy num_layers: 1 num_heads: 1 -embed_dim: 2048 # change this to whatever the embedding dimension is in your pretrained llm 2048 for llama. 2560 for stablelm +embed_dim: ${..tokenizer.embed_dim} dropout: 0.1 model_name: "PY007/TinyLlama-1.1B-intermediate-step-715k-1.5T" rank: 32 -tokens_per_block: 17 +tokens_per_block: 17 # how much info we can encode diff --git a/research_journal.md b/research_journal.md index b7e2a98..d7bbb80 100644 --- a/research_journal.md +++ b/research_journal.md @@ -352,5 +352,5 @@ So I tried just trainign the world model for 200 epochs. And with a post_embeddi idea - bypass embedding?, but wait dreamerv3 needed quant z... - yes I am bypassing it by passing in the input_embeds... but maybe I shouldn't -- use same embedding everywhere. e.g. model embedding in encoder decoder? +- [x] use same embedding everywhere. e.g. model embedding in encoder decoder? - Our embedings is (embed_tokens): Embedding(32000, 2048). So we would need to encode to 32000! diff --git a/src/models/tokenizer/tokenizer.py b/src/models/tokenizer/tokenizer.py index e69c18e..332c1fe 100644 --- a/src/models/tokenizer/tokenizer.py +++ b/src/models/tokenizer/tokenizer.py @@ -23,12 +23,12 @@ class TokenizerEncoderOutput: class Tokenizer(nn.Module): - def __init__(self, vocab_size: int, embed_dim: int, encoder: Encoder, decoder: Decoder, with_lpips: bool = True) -> None: + def __init__(self, embedding, vocab_size: int, embed_dim: int, encoder: Encoder, decoder: Decoder, with_lpips: bool = True) -> None: super().__init__() self.vocab_size = vocab_size self.encoder = encoder self.pre_quant_conv = torch.nn.Conv2d(encoder.config.z_channels, embed_dim, 1) - self.embedding = nn.Embedding(vocab_size, embed_dim) # TODO: use model embed? + self.embedding = embedding # nn.Embedding(vocab_size, embed_dim) # TODO: use model embed? self.post_quant_conv = torch.nn.Conv2d(embed_dim, decoder.config.z_channels, 1) self.decoder = decoder self.embedding.weight.data.uniform_(-1.0 / vocab_size, 1.0 / vocab_size) diff --git a/src/models/world_model.py b/src/models/world_model.py index 723b733..cb3e798 100644 --- a/src/models/world_model.py +++ b/src/models/world_model.py @@ -92,6 +92,7 @@ class WorldModel(nn.Module): assert num_steps <= self.config.max_tokens prev_steps = 0 if past_keys_values is None else past_keys_values.size + # TODO: replace wth model embedder? sequences = self.embedder(tokens, num_steps, prev_steps) + self.pos_emb(prev_steps + torch.arange(num_steps, device=tokens.device)) # [batch=8, num_steps=170, embed_size=2048] sequences = self.post_embed(sequences) diff --git a/src/play.py b/src/play.py index 7e3ab85..28c3f07 100644 --- a/src/play.py +++ b/src/play.py @@ -33,8 +33,9 @@ def main(cfg: DictConfig): keymap = 'episode_replay' else: - tokenizer = instantiate(cfg.tokenizer) - world_model = WorldModel(obs_vocab_size=tokenizer.vocab_size, act_vocab_size=test_env.num_actions, config=instantiate(cfg.world_model)) + # tokenizer = instantiate(cfg.tokenizer) + world_model = WorldModel(obs_vocab_size=cfg.tokenizer.vocab_size, act_vocab_size=test_env.num_actions, config=instantiate(cfg.world_model)) + tokenizer = Tokenizer(embedding=embedding, **cfg.tokenizer.embedding) actor_critic = ActorCritic(**cfg.actor_critic, act_vocab_size=test_env.num_actions) agent = Agent(tokenizer, world_model, actor_critic).to(device) agent.load(Path('checkpoints/last.pt'), device) diff --git a/src/trainer.py b/src/trainer.py index af0460c..c337d1f 100644 --- a/src/trainer.py +++ b/src/trainer.py @@ -22,6 +22,7 @@ from src.make_reconstructions import make_reconstructions_from_batch from src.models.actor_critic import ActorCritic from src.models.world_model import WorldModel from src.utils import configure_optimizer, EpisodeDirManager, set_seed +from src.models.tokenizer import Tokenizer class Trainer: @@ -80,8 +81,10 @@ class Trainer: assert self.cfg.training.should or self.cfg.evaluation.should env = train_env if self.cfg.training.should else test_env - tokenizer = instantiate(cfg.tokenizer) - world_model = WorldModel(obs_vocab_size=tokenizer.vocab_size, act_vocab_size=env.num_actions, config=instantiate(cfg.world_model)) + # tokenizer = instantiate(cfg.tokenizer) + world_model = WorldModel(obs_vocab_size=cfg.tokenizer.vocab_size, act_vocab_size=env.num_actions, config=instantiate(cfg.world_model)) + embedding = world_model.transformer.embedding + tokenizer = Tokenizer(embedding=embedding, **cfg.tokenizer.embedding) actor_critic = ActorCritic(**cfg.actor_critic, act_vocab_size=env.num_actions) self.agent = Agent(tokenizer, world_model, actor_critic).to(self.device) print(f'{sum(p.numel() for p in self.agent.tokenizer.parameters())} parameters in agent.tokenizer') From 328d28165134d48c195c0ef1c24678caea90ec57 Mon Sep 17 00:00:00 2001 From: wassname Date: Sun, 19 Nov 2023 10:50:48 +0800 Subject: [PATCH 20/30] using frozen transformer embedding: runs - use frozen transformer encoder where possible (obs, worldmodel, tokenizer, etc) - it's frozen - a huge vocab --- config/tokenizer/default.yaml | 6 +-- config/world_model/default.yaml | 11 ++--- research_journal.md | 3 ++ src/models/tokenizer/tokenizer.py | 6 +-- src/models/transformer.py | 29 ++++++----- src/models/world_model.py | 23 ++++++--- src/play.py | 82 +++++++++++++++++++++++-------- src/trainer.py | 11 +++-- 8 files changed, 116 insertions(+), 55 deletions(-) diff --git a/config/tokenizer/default.yaml b/config/tokenizer/default.yaml index 2df2b4d..9029ef4 100644 --- a/config/tokenizer/default.yaml +++ b/config/tokenizer/default.yaml @@ -1,14 +1,14 @@ _target_: src.models.tokenizer.Tokenizer -vocab_size: 32000 # change to llm vocab dim -embed_dim: 2048 # change this to whatever the embedding dimension is in your pretrained llm 2048 for llama. 2560 for stablelm +vocab_size: ${..world_model.vocab_size} +embed_dim: ${..world_model.embed_dim} encoder: _target_: src.models.tokenizer.Encoder config: _target_: src.models.tokenizer.EncoderDecoderConfig resolution: 64 in_channels: 3 - z_channels: 32000 + z_channels: ${...vocab_size} ch: 64 ch_mult: [1, 1, 1, 1, 1] num_res_blocks: 2 diff --git a/config/world_model/default.yaml b/config/world_model/default.yaml index 76894ac..2b631a9 100644 --- a/config/world_model/default.yaml +++ b/config/world_model/default.yaml @@ -1,9 +1,8 @@ _target_: src.models.TransformerConfig max_blocks: 10 # this is the rollout length when training policy -num_layers: 1 -num_heads: 1 -embed_dim: ${..tokenizer.embed_dim} -dropout: 0.1 -model_name: "PY007/TinyLlama-1.1B-intermediate-step-715k-1.5T" -rank: 32 tokens_per_block: 17 # how much info we can encode +dropout: 0.1 +rank: 32 # lora rank +model_name: "PY007/TinyLlama-1.1B-intermediate-step-715k-1.5T" +vocab_size: 32000 # change to llm vocab dim +embed_dim: 2048 # change this to whatever the embedding dimension is in your pretrained llm 2048 for llama. 2560 for stablelm diff --git a/research_journal.md b/research_journal.md index d7bbb80..fd40272 100644 --- a/research_journal.md +++ b/research_journal.md @@ -354,3 +354,6 @@ idea - yes I am bypassing it by passing in the input_embeds... but maybe I shouldn't - [x] use same embedding everywhere. e.g. model embedding in encoder decoder? - Our embedings is (embed_tokens): Embedding(32000, 2048). So we would need to encode to 32000! + + +ok we need to freeze it, and change dtype diff --git a/src/models/tokenizer/tokenizer.py b/src/models/tokenizer/tokenizer.py index 332c1fe..2504b42 100644 --- a/src/models/tokenizer/tokenizer.py +++ b/src/models/tokenizer/tokenizer.py @@ -23,15 +23,15 @@ class TokenizerEncoderOutput: class Tokenizer(nn.Module): - def __init__(self, embedding, vocab_size: int, embed_dim: int, encoder: Encoder, decoder: Decoder, with_lpips: bool = True) -> None: + def __init__(self, transformer_embedding: nn.Embedding, vocab_size: int, embed_dim: int, encoder: Encoder, decoder: Decoder, with_lpips: bool = True) -> None: super().__init__() self.vocab_size = vocab_size self.encoder = encoder self.pre_quant_conv = torch.nn.Conv2d(encoder.config.z_channels, embed_dim, 1) - self.embedding = embedding # nn.Embedding(vocab_size, embed_dim) # TODO: use model embed? + self.embedding = transformer_embedding # pretrained transformer embedding self.post_quant_conv = torch.nn.Conv2d(embed_dim, decoder.config.z_channels, 1) self.decoder = decoder - self.embedding.weight.data.uniform_(-1.0 / vocab_size, 1.0 / vocab_size) + # self.embedding.weight.data.uniform_(-1.0 / vocab_size, 1.0 / vocab_size) self.lpips = LPIPS().eval() if with_lpips else None def __repr__(self) -> str: diff --git a/src/models/transformer.py b/src/models/transformer.py index 89a2b25..22a949a 100644 --- a/src/models/transformer.py +++ b/src/models/transformer.py @@ -16,23 +16,27 @@ from .kv_caching import KeysValues, KVCache @dataclass class TransformerConfig: - - max_blocks: int - - num_layers: int - num_heads: int - embed_dim: int - tokens_per_block: int - # model_name: str = "stabilityai/stablelm-3b-4e1t" # https://huggingface.co/PY007/TinyLlama-1.1B-intermediate-step-715k-1.5T + vocab_size: int = 32000 + embed_dim: int = 2048 + + max_blocks: int = 20 + tokens_per_block: int = 17 + model_name: str = "PY007/TinyLlama-1.1B-intermediate-step-715k-1.5T" - dropout: float = 0 + dropout: float = 0.1 rank: int = 32 @property def max_tokens(self): return self.tokens_per_block * self.max_blocks + + +def freeze(n: nn.Module): + for p in n.parameters(): + p.requires_grad = False + return n class Transformer(nn.Module): @@ -41,13 +45,14 @@ class Transformer(nn.Module): self.config = config self.model = load_pretrained_model(config) self.ln_f = nn.Linear(self.model.config.vocab_size, config.embed_dim) + self.embedding = freeze(self.model.base_model.model.model.embed_tokens.to(torch.float)) # HACK: custom path to embeddings layer for model def generate_empty_keys_values(self, n: int, max_tokens: int) -> KeysValues: device = self.ln_f.weight.device # Assumption that all submodules are on the same device - return KeysValues(n, self.config.num_heads, max_tokens, self.config.embed_dim, self.config.num_layers, device) + return KeysValues(n, 1, max_tokens, self.config.embed_dim, 1, device) def forward(self, sequences: torch.Tensor, past_keys_values: Optional[KeysValues] = None) -> torch.Tensor: - assert past_keys_values is None or len(past_keys_values) == self.config.num_layers + assert past_keys_values is None or len(past_keys_values) == 1 with torch.cuda.amp.autocast(dtype=torch.bfloat16): outputs = self.model( inputs_embeds=sequences, @@ -60,8 +65,6 @@ class Transformer(nn.Module): # fake it, since it's used to keep track of steps if past_keys_values is not None: k_size = past_keys_values[0]._k_cache._cache.size() - # k_size = (x.shape[0], x.shape[1], x.shape[1], 1) - # v_size = past_keys_values[0]._v_cache._cache.size() v_size = (k_size[0], k_size[1], x.shape[1], k_size[3]) past_keys_values[0].update(torch.rand(v_size), torch.rand(v_size)) return x diff --git a/src/models/world_model.py b/src/models/world_model.py index cb3e798..9999ff4 100644 --- a/src/models/world_model.py +++ b/src/models/world_model.py @@ -33,20 +33,26 @@ class WorldModel(nn.Module): act_tokens_pattern = torch.zeros(self.config.tokens_per_block) act_tokens_pattern[-1] = 1 obs_tokens_pattern = 1 - act_tokens_pattern + + self.transformer = Transformer(config) + transformer_embedding = self.transformer.embedding self.pos_emb = nn.Embedding(config.max_tokens, config.embed_dim) + self.act_emb = nn.Embedding(act_vocab_size, config.embed_dim) self.embedder = Embedder( max_blocks=config.max_blocks, block_masks=[act_tokens_pattern, obs_tokens_pattern], - embedding_tables=nn.ModuleList([nn.Embedding(act_vocab_size, config.embed_dim), nn.Embedding(obs_vocab_size, config.embed_dim)]) + embedding_tables=nn.ModuleList([self.act_emb, transformer_embedding]) ) + + # why have this? Well I worry that the transformer can't adapt, since so much is frozen self.post_embed = nn.Sequential( nn.Linear(config.embed_dim, config.embed_dim), nn.ReLU(), nn.Linear(config.embed_dim, config.embed_dim), - nn.ReLU(), - nn.Linear(config.embed_dim, config.embed_dim) + # nn.ReLU(), + # nn.Linear(config.embed_dim, config.embed_dim) ) self.head_observations = Head( @@ -79,9 +85,15 @@ class WorldModel(nn.Module): ) ) - self.apply(init_weights) + # don't apply to transformer or transformer/obs embeddings + self.act_emb.apply(init_weights) + self.pos_emb.apply(init_weights) + self.post_embed.apply(init_weights) + self.head_observations.apply(init_weights) + self.head_rewards.apply(init_weights) + self.head_ends.apply(init_weights) + - self.transformer = Transformer(config) def __repr__(self) -> str: return "world_model" @@ -92,7 +104,6 @@ class WorldModel(nn.Module): assert num_steps <= self.config.max_tokens prev_steps = 0 if past_keys_values is None else past_keys_values.size - # TODO: replace wth model embedder? sequences = self.embedder(tokens, num_steps, prev_steps) + self.pos_emb(prev_steps + torch.arange(num_steps, device=tokens.device)) # [batch=8, num_steps=170, embed_size=2048] sequences = self.post_embed(sequences) diff --git a/src/play.py b/src/play.py index 28c3f07..e3486a5 100644 --- a/src/play.py +++ b/src/play.py @@ -1,4 +1,4 @@ -from functools import partial +from functools import partial from pathlib import Path import hydra @@ -11,51 +11,91 @@ from src.envs import SingleProcessEnv, WorldModelEnv from src.game import AgentEnv, EpisodeReplayEnv, Game from src.models.actor_critic import ActorCritic from src.models.world_model import WorldModel +from src.models.tokenizer import Tokenizer @hydra.main(config_path="../config", config_name="trainer") def main(cfg: DictConfig): device = torch.device(cfg.common.device) - assert cfg.mode in ('episode_replay', 'agent_in_env', 'agent_in_world_model', 'play_in_world_model') + assert cfg.mode in ( + "episode_replay", + "agent_in_env", + "agent_in_world_model", + "play_in_world_model", + ) env_fn = partial(instantiate, config=cfg.env.test) test_env = SingleProcessEnv(env_fn) - if cfg.mode.startswith('agent_in_'): + if cfg.mode.startswith("agent_in_"): h, w, _ = test_env.env.unwrapped.observation_space.shape else: h, w = 64, 64 multiplier = 800 // h size = [h * multiplier, w * multiplier] - - if cfg.mode == 'episode_replay': - env = EpisodeReplayEnv(replay_keymap_name=cfg.env.keymap, episode_dir=Path('media/episodes')) - keymap = 'episode_replay' + + if cfg.mode == "episode_replay": + env = EpisodeReplayEnv( + replay_keymap_name=cfg.env.keymap, episode_dir=Path("media/episodes") + ) + keymap = "episode_replay" else: # tokenizer = instantiate(cfg.tokenizer) - world_model = WorldModel(obs_vocab_size=cfg.tokenizer.vocab_size, act_vocab_size=test_env.num_actions, config=instantiate(cfg.world_model)) - tokenizer = Tokenizer(embedding=embedding, **cfg.tokenizer.embedding) - actor_critic = ActorCritic(**cfg.actor_critic, act_vocab_size=test_env.num_actions) + world_model = WorldModel( + obs_vocab_size=cfg.tokenizer.vocab_size, + act_vocab_size=test_env.num_actions, + config=instantiate(cfg.world_model), + ) + transformer_embedding = world_model.transformer.embedding + tokenizer = Tokenizer( + transformer_embedding=transformer_embedding, + vocab_size=cfg.tokenizer.vocab_size, + embed_dim=cfg.tokenizer.embed_dim, + encoder=instantiate(cfg.tokenizer.encoder), + decoder=instantiate(cfg.tokenizer.decoder), + ) + actor_critic = ActorCritic( + **cfg.actor_critic, act_vocab_size=test_env.num_actions + ) agent = Agent(tokenizer, world_model, actor_critic).to(device) - agent.load(Path('checkpoints/last.pt'), device) + agent.load(Path("checkpoints/last.pt"), device) - if cfg.mode == 'play_in_world_model': - env = WorldModelEnv(tokenizer=agent.tokenizer, world_model=agent.world_model, device=device, env=env_fn()) + if cfg.mode == "play_in_world_model": + env = WorldModelEnv( + tokenizer=agent.tokenizer, + world_model=agent.world_model, + device=device, + env=env_fn(), + ) keymap = cfg.env.keymap - - elif cfg.mode == 'agent_in_env': - env = AgentEnv(agent, test_env, cfg.env.keymap, do_reconstruction=cfg.reconstruction) - keymap = 'empty' + + elif cfg.mode == "agent_in_env": + env = AgentEnv( + agent, test_env, cfg.env.keymap, do_reconstruction=cfg.reconstruction + ) + keymap = "empty" if cfg.reconstruction: size[1] *= 3 - elif cfg.mode == 'agent_in_world_model': - wm_env = WorldModelEnv(tokenizer=agent.tokenizer, world_model=agent.world_model, device=device, env=env_fn()) + elif cfg.mode == "agent_in_world_model": + wm_env = WorldModelEnv( + tokenizer=agent.tokenizer, + world_model=agent.world_model, + device=device, + env=env_fn(), + ) env = AgentEnv(agent, wm_env, cfg.env.keymap, do_reconstruction=False) - keymap = 'empty' + keymap = "empty" - game = Game(env, keymap_name=keymap, size=size, fps=cfg.fps, verbose=bool(cfg.header), record_mode=bool(cfg.save_mode)) + game = Game( + env, + keymap_name=keymap, + size=size, + fps=cfg.fps, + verbose=bool(cfg.header), + record_mode=bool(cfg.save_mode), + ) game.run() diff --git a/src/trainer.py b/src/trainer.py index c337d1f..2b4e1b5 100644 --- a/src/trainer.py +++ b/src/trainer.py @@ -81,10 +81,15 @@ class Trainer: assert self.cfg.training.should or self.cfg.evaluation.should env = train_env if self.cfg.training.should else test_env - # tokenizer = instantiate(cfg.tokenizer) world_model = WorldModel(obs_vocab_size=cfg.tokenizer.vocab_size, act_vocab_size=env.num_actions, config=instantiate(cfg.world_model)) - embedding = world_model.transformer.embedding - tokenizer = Tokenizer(embedding=embedding, **cfg.tokenizer.embedding) + transformer_embedding = world_model.transformer.embedding + tokenizer = Tokenizer( + transformer_embedding=transformer_embedding, + vocab_size=cfg.tokenizer.vocab_size, + embed_dim=cfg.tokenizer.embed_dim, + encoder=instantiate(cfg.tokenizer.encoder), + decoder=instantiate(cfg.tokenizer.decoder), + ) actor_critic = ActorCritic(**cfg.actor_critic, act_vocab_size=env.num_actions) self.agent = Agent(tokenizer, world_model, actor_critic).to(self.device) print(f'{sum(p.numel() for p in self.agent.tokenizer.parameters())} parameters in agent.tokenizer') From ecee11fc33834c8785d911eaf5b7a572bf57dd1a Mon Sep 17 00:00:00 2001 From: wassname Date: Sun, 19 Nov 2023 10:58:45 +0800 Subject: [PATCH 21/30] notes --- src/models/tokenizer/tokenizer.py | 2 ++ src/models/world_model.py | 1 + 2 files changed, 3 insertions(+) diff --git a/src/models/tokenizer/tokenizer.py b/src/models/tokenizer/tokenizer.py index 2504b42..a96ec82 100644 --- a/src/models/tokenizer/tokenizer.py +++ b/src/models/tokenizer/tokenizer.py @@ -46,6 +46,8 @@ class Tokenizer(nn.Module): def compute_loss(self, batch: Batch, **kwargs: Any) -> LossWithIntermediateLosses: assert self.lpips is not None observations = self.preprocess_input(rearrange(batch['observations'], 'b t c h w -> (b t) c h w')) + # TODO: in the delta-IRIS paper (https://openreview.net/forum?id=o8IDoZggqO) they encode(x0, a0, x1) -> z1 and decode(x0, a0, z1). In esense the tokens only need to encode the change + # note they also do dynamics(x0, a0, z1) -> z2. decode(x1, a1, z2) -> x2 z, z_quantized, reconstructions = self(observations, should_preprocess=False, should_postprocess=False) # Codebook loss. Notes: diff --git a/src/models/world_model.py b/src/models/world_model.py index 9999ff4..b346094 100644 --- a/src/models/world_model.py +++ b/src/models/world_model.py @@ -47,6 +47,7 @@ class WorldModel(nn.Module): ) # why have this? Well I worry that the transformer can't adapt, since so much is frozen + # TODO: If I get the dynamics model working, maybe try without it self.post_embed = nn.Sequential( nn.Linear(config.embed_dim, config.embed_dim), nn.ReLU(), From 6eb25883f6a4f3d84893aa0d395ee8d8690bd996 Mon Sep 17 00:00:00 2001 From: wassname Date: Sun, 19 Nov 2023 14:50:54 +0800 Subject: [PATCH 22/30] misc --- .vscode/launch.json | 4 ++-- research_journal.md | 7 ++++--- scripts/play.sh | 3 ++- src/trainer.py | 2 +- 4 files changed, 9 insertions(+), 7 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index dbe115f..4554801 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -19,8 +19,8 @@ "env.train.id=CrafterReward-v1", // # make it start early "training.tokenizer.start_after_epochs=1", - "training.world_model.start_after_epochs=1", - "training.actor_critic.start_after_epochs=1", + "training.world_model.start_after_epochs=2", + "training.actor_critic.start_after_epochs=3", "training.tokenizer.steps_per_epoch=10", "training.world_model.steps_per_epoch=10", "training.actor_critic.steps_per_epoch=10", diff --git a/research_journal.md b/research_journal.md index fd40272..eac579f 100644 --- a/research_journal.md +++ b/research_journal.md @@ -345,9 +345,6 @@ Why is it not learning? It's because the dynamics model is total BS!!! # 2023-11-19 06:45:34 So I tried just trainign the world model for 200 epochs. And with a post_embedding layer. It helped the flickering. But not enougth to actually go for the obvious local minima of the next state equals the last - - - idea - bypass embedding?, but wait dreamerv3 needed quant z... @@ -357,3 +354,7 @@ idea ok we need to freeze it, and change dtype +OK it seems slightly better yay! Lets train it overnight and see + +next idea is to the delta-IRIS thing where the tokens only have to encode the diff(obs) + diff --git a/scripts/play.sh b/scripts/play.sh index 967db60..45fed21 100755 --- a/scripts/play.sh +++ b/scripts/play.sh @@ -27,6 +27,7 @@ while [ "$1" != "" ]; do -e | --episode ) mode="episode_replay" ;; # replay train, test, or imagined episodes. shows quality of dynamics model + # this is quick low resource way to check the dynamics model and agent while training -w | --world-model ) mode="play_in_world_model" ;; # human plays in world model @@ -37,4 +38,4 @@ while [ "$1" != "" ]; do shift done -python -m pdb src/play.py hydra.run.dir=. hydra.output_subdir=null +mode="${mode}" +fps="${fps}" +header="${header}" +reconstruction="${reconstruction}" +save_mode="${save_mode}" +python src/play.py hydra.run.dir=. hydra.output_subdir=null +mode="${mode}" +fps="${fps}" +header="${header}" +reconstruction="${reconstruction}" +save_mode="${save_mode}" diff --git a/src/trainer.py b/src/trainer.py index 2b4e1b5..6c3b8f0 100644 --- a/src/trainer.py +++ b/src/trainer.py @@ -200,7 +200,7 @@ class Trainer: if epoch > cfg_world_model.start_after_epochs: metrics_world_model = self.eval_component(self.agent.world_model, cfg_world_model.batch_num_samples, sequence_length=self.cfg.common.sequence_length, tokenizer=self.agent.tokenizer) - if epoch > cfg_actor_critic.start_after_epochs: + if epoch > cfg_world_model.start_after_epochs: self.inspect_imagination(epoch) if cfg_tokenizer.save_reconstructions: From 6308397bb773cc1daa11a0418c0a41e49d4329b5 Mon Sep 17 00:00:00 2001 From: wassname Date: Mon, 20 Nov 2023 07:14:50 +0800 Subject: [PATCH 23/30] it works better but still flickers when imagining. hmm I do think I need the delta-iris stuff --- research_journal.md | 30 ++++++++++++++++++++++++++++++ src/agent.py | 1 + src/envs/world_model_env.py | 1 + src/models/actor_critic.py | 4 +--- 4 files changed, 33 insertions(+), 3 deletions(-) diff --git a/research_journal.md b/research_journal.md index eac579f..492e009 100644 --- a/research_journal.md +++ b/research_journal.md @@ -358,3 +358,33 @@ OK it seems slightly better yay! Lets train it overnight and see next idea is to the delta-IRIS thing where the tokens only have to encode the diff(obs) +# 2023-11-19 16:50:45 + +Seems to be working! Now let's plan delta-IRIS + + +So IRIS has +- Encoder $E(x_0, a_0) = t_0$ + ```py + obs_tokens = self.tokenizer.encode(observations, should_preprocess=True).tokens # (B, C, H, W) -> (B, K) + ``` +- Embed $Emb(t_0) = z_0$ + ```py + embedded_tokens = self.tokenizer.embedding(self.obs_tokens) # (B, K, E) + z = rearrange(embedded_tokens, 'b (h w) e -> b e h w', h=int(np.sqrt(self.num_observations_tokens))) + ``` +- Dynamics $D(z_0, a_0) = z_1$ + ```py + outputs_wm = self.world_model(token, past_keys_values=self.keys_values_wm) + ``` +- Decoder $D(z_0, a_0) = x_1$ + ```py + rec = self.tokenizer.decode(z, should_postprocess=True) # (B, C, H, W) + ``` + + +but we have tokens vs z + +Questions: +- wait why are we just passing in "action_token" to the transformer and not obs? that must have obs in it right... right??? confirm +- in iris-delta how did they pass everything in? I guess obs_prev was tokenized too? I think the slices are annoying so maybe I should just pass things seperatly diff --git a/src/agent.py b/src/agent.py index 5534232..ee884fd 100644 --- a/src/agent.py +++ b/src/agent.py @@ -34,4 +34,5 @@ class Agent(nn.Module): input_ac = obs if self.actor_critic.use_original_obs else torch.clamp(self.tokenizer.encode_decode(obs, should_preprocess=True, should_postprocess=True), 0, 1) logits_actions = self.actor_critic(input_ac).logits_actions[:, -1] / temperature act_token = Categorical(logits=logits_actions).sample() if should_sample else logits_actions.argmax(dim=-1) + # FIXME, is this really just an action and doesn't have an obs in? return act_token diff --git a/src/envs/world_model_env.py b/src/envs/world_model_env.py index 73e3852..4e447d4 100644 --- a/src/envs/world_model_env.py +++ b/src/envs/world_model_env.py @@ -69,6 +69,7 @@ class WorldModelEnv: for k in range(num_passes): # assumption that there is only one action token. + # FIXME: hold on we are ONLY passing in the action token! should it not be obs too outputs_wm = self.world_model(token, past_keys_values=self.keys_values_wm) output_sequence.append(outputs_wm.output_sequence) if k == 0: diff --git a/src/models/actor_critic.py b/src/models/actor_critic.py index ec1256d..4d68c78 100644 --- a/src/models/actor_critic.py +++ b/src/models/actor_critic.py @@ -149,9 +149,7 @@ class ActorCritic(nn.Module): outputs_ac = self(obs) action_token = Categorical(logits=outputs_ac.logits_actions).sample() - # TODO this is really slow, I guess we need grad? does it help to put it in eval? no - # wm_env.world_model.eval() - + # FIXME shouldn't we pass in obs too? obs, reward, done, _ = wm_env.step(action_token, should_predict_next_obs=(k < horizon - 1)) all_actions.append(action_token) From 56daac9761e6d3e7b16ec4bac2747d0018823ea6 Mon Sep 17 00:00:00 2001 From: wassname Date: Mon, 20 Nov 2023 07:31:31 +0800 Subject: [PATCH 24/30] rank, and unfreeze head --- src/models/transformer.py | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/models/transformer.py b/src/models/transformer.py index 22a949a..6237c57 100644 --- a/src/models/transformer.py +++ b/src/models/transformer.py @@ -10,6 +10,7 @@ from einops import rearrange import torch import torch.nn as nn from torch.nn import functional as F +from loguru import logger from .kv_caching import KeysValues, KVCache @@ -98,8 +99,9 @@ def load_pretrained_model(config, device="cuda:0"): peft.TaskType.CAUSAL_LM, inference_mode=False, r=config.rank, - lora_alpha=8, + lora_alpha=config.rank*2, # Adjusting the LoRA rank is essential, and so is selecting an apt alpha value. A good heuristic is setting alpha at twice the rank's value. https://magazine.sebastianraschka.com/p/practical-tips-for-finetuning-llms lora_dropout=config.dropout, + # TODO: If you're incorporating LoRA, ensure it's applied across all layers, not just to the Key and Value matrices, to maximize model performance. target_modules=[ "self_attn.q_proj", "self_attn.k_proj", @@ -108,13 +110,19 @@ def load_pretrained_model(config, device="cuda:0"): "mlp.gate_proj", "mlp.up_proj", "mlp.down_proj", + # "wte", "embed_tokens", + "lm_head", ], + bias=True, + # tune the embedding layer and prediction head + modules_to_save = ["lm_head", "embed_tokens"], ) base_model_peft = peft.get_peft_model(base_model, peft_config) - base_model_peft.add_adapter("dynamics", peft_config) - base_model_peft.set_adapter("dynamics") - print(base_model_peft.print_trainable_parameters()) + base_model_peft.add_adapter(adapter_name="dynamics", peft_config=peft_config) # make an adapter + base_model_peft.set_adapter("dynamics") # use an adapter disable_causal_mask_always() + print(base_model_peft.print_trainable_parameters()) + logger.info(f"loaded model {base_model_peft}") return base_model_peft @contextmanager From 2763449f6400d95c30a228ed578e8f639efd386f Mon Sep 17 00:00:00 2001 From: wassname Date: Mon, 20 Nov 2023 10:01:56 +0800 Subject: [PATCH 25/30] bug fix --- config/trainer.yaml | 2 +- src/models/transformer.py | 11 +++++------ src/utils.py | 4 +++- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/config/trainer.yaml b/config/trainer.yaml index b4fe7c5..c52d41c 100644 --- a/config/trainer.yaml +++ b/config/trainer.yaml @@ -61,7 +61,7 @@ training: steps_per_epoch: 200 world_model: batch_num_samples: 8 # pretrained models use lots of ram - grad_acc_steps: 1 + grad_acc_steps: 2 max_grad_norm: 10.0 weight_decay: 0.01 start_after_epochs: 25 diff --git a/src/models/transformer.py b/src/models/transformer.py index 6237c57..cc91255 100644 --- a/src/models/transformer.py +++ b/src/models/transformer.py @@ -111,18 +111,17 @@ def load_pretrained_model(config, device="cuda:0"): "mlp.up_proj", "mlp.down_proj", # "wte", "embed_tokens", - "lm_head", + # "lm_head", ], - bias=True, + # bias="lora_only", # tune the embedding layer and prediction head - modules_to_save = ["lm_head", "embed_tokens"], + modules_to_save = ["lm_head",], # we want the classifier parameters to be trained too when fine-tuning the base model on our custom dataset. To ensure that the classifier parameters are also trained, we specify modules_to_save. ) base_model_peft = peft.get_peft_model(base_model, peft_config) - base_model_peft.add_adapter(adapter_name="dynamics", peft_config=peft_config) # make an adapter - base_model_peft.set_adapter("dynamics") # use an adapter + base_model_peft.add_adapter(adapter_name="dynamics", peft_config=peft_config) # make and set an adapter disable_causal_mask_always() print(base_model_peft.print_trainable_parameters()) - logger.info(f"loaded model {base_model_peft}") + logger.debug(f"loaded model {base_model_peft}") return base_model_peft @contextmanager diff --git a/src/utils.py b/src/utils.py index d64273d..07ba101 100644 --- a/src/utils.py +++ b/src/utils.py @@ -3,7 +3,7 @@ import cv2 from pathlib import Path import random import shutil - +from loguru import logger import numpy as np import torch import torch.nn as nn @@ -15,6 +15,7 @@ from transformers.pytorch_utils import ALL_LAYERNORM_LAYERS def configure_optimizer(model, learning_rate, weight_decay, *blacklist_module_names): """Credits to https://github.com/karpathy/minGPT""" + # FIXME: check this is still good for LoRA # separate out all parameters to those that will and won't experience regularizing weight decay decay = set() no_decay = set() @@ -39,6 +40,7 @@ def configure_optimizer(model, learning_rate, weight_decay, *blacklist_module_na param_dict = {pn: p for pn, p in model.named_parameters()} inter_params = decay & no_decay union_params = decay | no_decay + logger.debug(f"decay {decay} no_decay {no_decay}") assert len(inter_params) == 0, f"parameters {str(inter_params)} made it into both decay/no_decay sets!" assert len(param_dict.keys() - union_params) == 0, f"parameters {str(param_dict.keys() - union_params)} were not separated into either decay/no_decay set!" From 72ee8066011849cdb0aa3adda35afa7d6e76fc7a Mon Sep 17 00:00:00 2001 From: wassname Date: Thu, 23 Nov 2023 09:08:10 +0800 Subject: [PATCH 26/30] try training tokenizer and world model together: result :poop: --- justfile | 8 ++++++ src/models/world_model.py | 10 +++++--- src/trainer.py | 6 ++++- src/utils.py | 53 ++++++++++++++++++++++++--------------- 4 files changed, 52 insertions(+), 25 deletions(-) diff --git a/justfile b/justfile index 1f26170..5f3c137 100644 --- a/justfile +++ b/justfile @@ -1,3 +1,4 @@ +set shell := ["zsh", "-cu"] breakout: python src/main.py env.train.id=BreakoutNoFrameskip-v4 @@ -8,3 +9,10 @@ crafter: minihack: python src/main.py env.train.id=MiniHack-River-v0 +# watch the latest runs +watch_latest: + . ./.venv/bin/activate + cd ./outputs && \ + cd *([-1]) && \ + cd *([-1]) && \ + scripts/play.sh -e -r -h diff --git a/src/models/world_model.py b/src/models/world_model.py index b346094..42bbf81 100644 --- a/src/models/world_model.py +++ b/src/models/world_model.py @@ -40,6 +40,7 @@ class WorldModel(nn.Module): self.pos_emb = nn.Embedding(config.max_tokens, config.embed_dim) self.act_emb = nn.Embedding(act_vocab_size, config.embed_dim) + # FIXME: having slices is unclear. maybe it's better just to have obs and action embeddings? self.embedder = Embedder( max_blocks=config.max_blocks, block_masks=[act_tokens_pattern, obs_tokens_pattern], @@ -101,7 +102,7 @@ class WorldModel(nn.Module): def forward(self, tokens: torch.LongTensor, past_keys_values: Optional[KeysValues] = None) -> WorldModelOutput: - num_steps = tokens.size(1) # (B, T) + num_steps = tokens.size(1) # (B=8, T=170) where often the last 10 are actons assert num_steps <= self.config.max_tokens prev_steps = 0 if past_keys_values is None else past_keys_values.size @@ -118,12 +119,13 @@ class WorldModel(nn.Module): def compute_loss(self, batch: Batch, tokenizer: Tokenizer, **kwargs: Any) -> LossWithIntermediateLosses: - with torch.no_grad(): - # [B=8, S=10, Colors=3, H=64, W=64] -> [B=8, S=10, 16] - obs_tokens = tokenizer.encode(batch['observations'], should_preprocess=True).tokens # (BL, K) + # with torch.no_grad(): + # [B=8, S=10, Colors=3, H=64, W=64] -> [B=8, S=10, 16] + obs_tokens = tokenizer.encode(batch['observations'], should_preprocess=True).tokens # (BL, K) act_tokens = rearrange(batch['actions'], 'b l -> b l 1') tokens = rearrange(torch.cat((obs_tokens, act_tokens), dim=2), 'b l k1 -> b (l k1)') # (B, L(K+1)) + # So first 10 are observation, the last 10 tokens are actions outputs = self(tokens) diff --git a/src/trainer.py b/src/trainer.py index 6c3b8f0..30d0c83 100644 --- a/src/trainer.py +++ b/src/trainer.py @@ -97,7 +97,11 @@ class Trainer: print(f'{sum(p.numel() for p in self.agent.actor_critic.parameters())} parameters in agent.actor_critic') self.optimizer_tokenizer = torch.optim.Adam(self.agent.tokenizer.parameters(), lr=cfg.training.learning_rate) - self.optimizer_world_model = configure_optimizer(self.agent.world_model, cfg.training.learning_rate, cfg.training.world_model.weight_decay) + # self.optimizer_world_model = configure_optimizer([self.agent.tokenizer, self.agent.world_model], cfg.training.learning_rate, cfg.training.world_model.weight_decay) + self.optimizer_world_model = torch.optim.Adam( + list(self.agent.tokenizer.parameters())+list(self.agent.world_model.parameters()), + lr=cfg.training.learning_rate + ) self.optimizer_actor_critic = torch.optim.Adam(self.agent.actor_critic.parameters(), lr=cfg.training.learning_rate) if cfg.initialization.path_to_checkpoint is not None: diff --git a/src/utils.py b/src/utils.py index 07ba101..0f09590 100644 --- a/src/utils.py +++ b/src/utils.py @@ -13,41 +13,54 @@ from src.episode import Episode from transformers.pytorch_utils import ALL_LAYERNORM_LAYERS -def configure_optimizer(model, learning_rate, weight_decay, *blacklist_module_names): +def configure_optimizer(models, learning_rate, weight_decay, *blacklist_module_names): """Credits to https://github.com/karpathy/minGPT""" # FIXME: check this is still good for LoRA # separate out all parameters to those that will and won't experience regularizing weight decay decay = set() no_decay = set() + decay_params = [] + no_decay_params = [] + param_dict = {} whitelist_weight_modules = (torch.nn.Linear, torch.nn.Conv1d) blacklist_weight_modules = tuple(ALL_LAYERNORM_LAYERS+[torch.nn.Embedding]) - for mn, m in model.named_modules(): - for pn, p in m.named_parameters(): - fpn = '%s.%s' % (mn, pn) if mn else pn # full param name - if any([fpn.startswith(module_name) for module_name in blacklist_module_names]): - no_decay.add(fpn) - elif 'bias' in pn: - # all biases will not be decayed - no_decay.add(fpn) - elif pn.endswith('weight') and isinstance(m, whitelist_weight_modules): - # weights of whitelist modules will be weight decayed - decay.add(fpn) - elif pn.endswith('weight') and isinstance(m, blacklist_weight_modules): - # weights of blacklist modules will NOT be weight decayed - no_decay.add(fpn) + for model in models: + for mn, m in model.named_modules(): + for pn, p in m.named_parameters(): + fpn = '%s.%s' % (mn, pn) if mn else pn # full param name + if any([fpn.startswith(module_name) for module_name in blacklist_module_names]): + no_decay.add(fpn) + no_decay_params.append(p) + elif 'bias' in pn: + # all biases will not be decayed + no_decay.add(fpn) + no_decay_params.append(p) + elif pn.endswith('weight') and isinstance(m, whitelist_weight_modules): + # weights of whitelist modules will be weight decayed + decay.add(fpn) + decay_params.append(p) + elif pn.endswith('weight') and isinstance(m, blacklist_weight_modules): + # weights of blacklist modules will NOT be weight decayed + no_decay.add(fpn) + no_decay_params.append(p) + else: + logger.warning(f"Parameter {fpn} of module {mn} not handled!") + # raise NotImplementedError(f"Parameter {fpn} of module {m} not handled!") + decay.add(fpn) + decay_params.append(p) - # validate that we considered every parameter - param_dict = {pn: p for pn, p in model.named_parameters()} + # validate that we considered every parameter + param_dict.update({pn: p for pn, p in model.named_parameters()}) inter_params = decay & no_decay union_params = decay | no_decay - logger.debug(f"decay {decay} no_decay {no_decay}") + # logger.debug(f"decay {decay} no_decay {no_decay}") assert len(inter_params) == 0, f"parameters {str(inter_params)} made it into both decay/no_decay sets!" assert len(param_dict.keys() - union_params) == 0, f"parameters {str(param_dict.keys() - union_params)} were not separated into either decay/no_decay set!" # create the pytorch optimizer object optim_groups = [ - {"params": [param_dict[pn] for pn in sorted(list(decay))], "weight_decay": weight_decay}, - {"params": [param_dict[pn] for pn in sorted(list(no_decay))], "weight_decay": 0.0}, + {"params": no_decay_params, "weight_decay": weight_decay}, + {"params": decay_params, "weight_decay": 0.0}, ] optimizer = torch.optim.AdamW(optim_groups, lr=learning_rate) return optimizer From c3878e4a4c02bc3b59edd92bb5e819366005f3a6 Mon Sep 17 00:00:00 2001 From: wassname Date: Thu, 23 Nov 2023 09:08:30 +0800 Subject: [PATCH 27/30] full finetune? --- src/models/transformer.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/models/transformer.py b/src/models/transformer.py index cc91255..71dc34c 100644 --- a/src/models/transformer.py +++ b/src/models/transformer.py @@ -117,10 +117,11 @@ def load_pretrained_model(config, device="cuda:0"): # tune the embedding layer and prediction head modules_to_save = ["lm_head",], # we want the classifier parameters to be trained too when fine-tuning the base model on our custom dataset. To ensure that the classifier parameters are also trained, we specify modules_to_save. ) - base_model_peft = peft.get_peft_model(base_model, peft_config) - base_model_peft.add_adapter(adapter_name="dynamics", peft_config=peft_config) # make and set an adapter + base_model_peft = base_model + # base_model_peft = peft.get_peft_model(base_model, peft_config) + # base_model_peft.add_adapter(adapter_name="dynamics", peft_config=peft_config) # make and set an adapter disable_causal_mask_always() - print(base_model_peft.print_trainable_parameters()) + # print(base_model_peft.print_trainable_parameters()) logger.debug(f"loaded model {base_model_peft}") return base_model_peft From 9155ecca95d7483e158844ca1fb26bb08ac8ce54 Mon Sep 17 00:00:00 2001 From: wassname Date: Fri, 24 Nov 2023 09:24:12 +0800 Subject: [PATCH 28/30] Fix embedding path in Transformer model --- src/models/transformer.py | 2 +- src/trainer.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/models/transformer.py b/src/models/transformer.py index 71dc34c..4f67824 100644 --- a/src/models/transformer.py +++ b/src/models/transformer.py @@ -46,7 +46,7 @@ class Transformer(nn.Module): self.config = config self.model = load_pretrained_model(config) self.ln_f = nn.Linear(self.model.config.vocab_size, config.embed_dim) - self.embedding = freeze(self.model.base_model.model.model.embed_tokens.to(torch.float)) # HACK: custom path to embeddings layer for model + self.embedding = freeze(self.model.base_model.embed_tokens.to(torch.float)) # HACK: custom path to embeddings layer for model def generate_empty_keys_values(self, n: int, max_tokens: int) -> KeysValues: device = self.ln_f.weight.device # Assumption that all submodules are on the same device diff --git a/src/trainer.py b/src/trainer.py index 30d0c83..e73699a 100644 --- a/src/trainer.py +++ b/src/trainer.py @@ -149,11 +149,11 @@ class Trainer: if epoch > cfg_tokenizer.start_after_epochs: metrics_tokenizer = self.train_component(self.agent.tokenizer, self.optimizer_tokenizer, sequence_length=1, sample_from_start=True, **cfg_tokenizer) + self.agent.tokenizer.eval() if epoch > cfg_world_model.start_after_epochs: metrics_world_model = self.train_component(self.agent.world_model, self.optimizer_world_model, sequence_length=self.cfg.common.sequence_length, sample_from_start=True, tokenizer=self.agent.tokenizer, **cfg_world_model) self.agent.world_model.eval() - self.agent.tokenizer.eval() if epoch > cfg_actor_critic.start_after_epochs: metrics_actor_critic = self.train_component(self.agent.actor_critic, self.optimizer_actor_critic, sequence_length=1 + self.cfg.training.actor_critic.burn_in, sample_from_start=False, tokenizer=self.agent.tokenizer, world_model=self.agent.world_model, **cfg_actor_critic) From 8ecdf35bd36b55c5a7b48b05fea6ae50085682b0 Mon Sep 17 00:00:00 2001 From: wassname Date: Sat, 25 Nov 2023 05:48:17 +0800 Subject: [PATCH 29/30] learns the best yet --- justfile | 3 +++ research_journal.md | 12 ++++++++++++ src/trainer.py | 2 +- 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/justfile b/justfile index 5f3c137..4c75710 100644 --- a/justfile +++ b/justfile @@ -16,3 +16,6 @@ watch_latest: cd *([-1]) && \ cd *([-1]) && \ scripts/play.sh -e -r -h + +default: + just --list diff --git a/research_journal.md b/research_journal.md index 492e009..ed75ea4 100644 --- a/research_journal.md +++ b/research_journal.md @@ -388,3 +388,15 @@ but we have tokens vs z Questions: - wait why are we just passing in "action_token" to the transformer and not obs? that must have obs in it right... right??? confirm - in iris-delta how did they pass everything in? I guess obs_prev was tokenized too? I think the slices are annoying so maybe I should just pass things seperatly + +# 2023-11-24 10:56:40 + +If I unfreeze the whole transformer, it seem to learn the most obvious dynamics (the next latent space is the same as the last). + +To summarize +- with Qlora it didn't learn that +- with unfrozen head it didn't +- when training transformer and obs embedding together it did not (frozen llm embeddings) + + +no it didn't work with tokenizer sep hmm diff --git a/src/trainer.py b/src/trainer.py index e73699a..c3d6399 100644 --- a/src/trainer.py +++ b/src/trainer.py @@ -149,10 +149,10 @@ class Trainer: if epoch > cfg_tokenizer.start_after_epochs: metrics_tokenizer = self.train_component(self.agent.tokenizer, self.optimizer_tokenizer, sequence_length=1, sample_from_start=True, **cfg_tokenizer) - self.agent.tokenizer.eval() if epoch > cfg_world_model.start_after_epochs: metrics_world_model = self.train_component(self.agent.world_model, self.optimizer_world_model, sequence_length=self.cfg.common.sequence_length, sample_from_start=True, tokenizer=self.agent.tokenizer, **cfg_world_model) + self.agent.tokenizer.eval() self.agent.world_model.eval() if epoch > cfg_actor_critic.start_after_epochs: From a82fe96158cc9122f9f63439271d1aa0d4780bc6 Mon Sep 17 00:00:00 2001 From: wassname Date: Sat, 27 Apr 2024 07:01:09 +0800 Subject: [PATCH 30/30] left overs --- config/trainer.yaml | 2 +- justfile | 12 ++++++++++-- research_journal.md | 7 ++++++- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/config/trainer.yaml b/config/trainer.yaml index c52d41c..3539b2e 100644 --- a/config/trainer.yaml +++ b/config/trainer.yaml @@ -70,7 +70,7 @@ training: batch_num_samples: 16 grad_acc_steps: 1 max_grad_norm: 10.0 - start_after_epochs: 1500 + start_after_epochs: 300 steps_per_epoch: 40 imagine_horizon: ${common.sequence_length} burn_in: 20 diff --git a/justfile b/justfile index 4c75710..5f2f184 100644 --- a/justfile +++ b/justfile @@ -6,8 +6,8 @@ breakout: crafter: python src/main.py env.train.id=CrafterReward-v1 -minihack: - python src/main.py env.train.id=MiniHack-River-v0 +# minihack: +# python src/main.py env.train.id=MiniHack-River-v0 # watch the latest runs watch_latest: @@ -17,5 +17,13 @@ watch_latest: cd *([-1]) && \ scripts/play.sh -e -r -h + +resume_latest: + . ./.venv/bin/activate + cd ./outputs && \ + cd *([-1]) && \ + cd *([-1]) && \ + scripts/resume.sh + default: just --list diff --git a/research_journal.md b/research_journal.md index ed75ea4..b3478be 100644 --- a/research_journal.md +++ b/research_journal.md @@ -375,7 +375,7 @@ So IRIS has ``` - Dynamics $D(z_0, a_0) = z_1$ ```py - outputs_wm = self.world_model(token, past_keys_values=self.keys_values_wm) + outputs_wm = self.world_model(tokenRedmond AI, past_keys_values=self.keys_values_wm) ``` - Decoder $D(z_0, a_0) = x_1$ ```py @@ -400,3 +400,8 @@ To summarize no it didn't work with tokenizer sep hmm + +Oh it did with whole transfrmer and tokenizer at same time https://wandb.ai/wassname/iris/runs/w7lvs4gi?workspace=user-wassname +wandb: world_model/eval/loss_obs ▇█▃▄▄▄▄▃▃▂▂▂▂▂▁▁▁▁▁▁▁▁▁▁▁▁▁ +wandb: world_model/eval/loss_rewards ▁█▃█▇▅▇▁▅▆▂▄▃▇▆▃▄▇▃▄▂▄▃▂▃▄▃ +wandb: world_model/eval/total_loss ▂█▃██▅▇▁▅▆▁▃▂█▇▃▃▆▃▄▂▃▃▂▂▄▂