diff --git a/datura/datura/requests/miner_requests.py b/datura/datura/requests/miner_requests.py index 2e0f118..80a837e 100644 --- a/datura/datura/requests/miner_requests.py +++ b/datura/datura/requests/miner_requests.py @@ -46,7 +46,8 @@ class ExecutorSSHInfo(pydantic.BaseModel): ssh_port: int python_path: str root_dir: str - port_range: str + port_range: str | None = None + port_mappings: str | None = None class AcceptSSHKeyRequest(BaseMinerRequest): diff --git a/neurons/executor/.env.template b/neurons/executor/.env.template index 002ec0b..aba43a8 100644 --- a/neurons/executor/.env.template +++ b/neurons/executor/.env.template @@ -3,13 +3,22 @@ EXTERNAL_PORT=8001 SSH_PORT=2200 +# NOTE: please use either RENTING_PORT_RANGE or RENTING_PORT_MAPPINGS, both are not allowed +# Note: If you are not using proxy and all ports are available publicly, +# then you don't have to set RENTING_PORT_RANGE and RENTING_PORT_MAPPINGS + +# (optional) If your internal port and external port are THE SAME # configure available ports for renting. # define the ports comma separated or range with dash "-" +# Please define at least 2 ports # example # RENTING_PORT_RANGE="40000-65535" # RENTING_PORT_RANGE="9001,9002,9003" -# Please define at least 2 ports -# Note: if all ports are available publicly, then you don't have to put this port range -RENTING_PORT_RANGE="40000-65535" + +# (optional) If your internal port and external port are NOT THE SAME +# add an array of [internal_port, external_port] mappings +# example: if internal port 46681 is mapped to 56681 external port +# and internal port 46682 is mapped to 56682 external port, then +# RENTING_PORT_MAPPINGS="[[46681, 56681], [46682, 56682]]" MINER_HOTKEY_SS58_ADDRESS= \ No newline at end of file diff --git a/neurons/executor/Dockerfile b/neurons/executor/Dockerfile index b1d69df..db5b5ee 100644 --- a/neurons/executor/Dockerfile +++ b/neurons/executor/Dockerfile @@ -53,6 +53,6 @@ RUN mkdir -p /etc/docker RUN mkdir -p /etc/nvidia-container-runtime RUN mkdir -p /root/.ssh -LABEL version="3.2.0" +LABEL version="3.2.1" CMD ["bash", "run.sh"] \ No newline at end of file diff --git a/neurons/executor/Dockerfile.runner b/neurons/executor/Dockerfile.runner index 2305630..87776dd 100644 --- a/neurons/executor/Dockerfile.runner +++ b/neurons/executor/Dockerfile.runner @@ -6,6 +6,6 @@ COPY entrypoint.sh /entrypoint.sh RUN chmod u+x /entrypoint.sh -LABEL version="3.2.0" +LABEL version="3.2.1" ENTRYPOINT ["/entrypoint.sh"] diff --git a/neurons/executor/README.md b/neurons/executor/README.md index d307d7b..3b184b7 100644 --- a/neurons/executor/README.md +++ b/neurons/executor/README.md @@ -53,6 +53,10 @@ You can change the ports for `INTERNAL_PORT`, `EXTERNAL_PORT`, `SSH_PORT` based - Range Specification(`from-to`): Miners can specify a range of ports, such as 2000-2005. This means ports from 2000 to 2005 will be open for the validator to select. - Specific Ports(`port1,port2,port3`): Miners can specify individual ports, such as 2000,2001,2002. This means only ports 2000, 2001, and 2002 will be available for the validator. - Default Behavior: If no ports are specified, the validator will assume that all ports on the executor are available. +- **RENTING_PORT_MAPPINGS**: Internal, external port mappings. Use this env when you are using proxy in front of your executors and the internal port and external port can't be the same. You can ignore this env, if all ports are open or the internal and external ports are the same. example: + - if internal port 46681 is mapped to 56681 external port and internal port 46682 is mapped to 56682 external port, then RENTING_PORT_MAPPINGS="[[46681, 56681], [46682, 56682]]" + +Note: Please use either **RENTING_PORT_RANGE** or **RENTING_PORT_MAPPINGS** and DO NOT use both of them if you have specific ports are available. * Run project diff --git a/neurons/executor/pdm.lock b/neurons/executor/pdm.lock index 482941e..a9e66b4 100644 --- a/neurons/executor/pdm.lock +++ b/neurons/executor/pdm.lock @@ -5,7 +5,7 @@ groups = ["default"] strategy = ["inherit_metadata"] lock_version = "4.5.0" -content_hash = "sha256:373b4715dc1c65bb2994327cd1bf87f57e8df68969355cd9520b7b4468396475" +content_hash = "sha256:9d9f2d70f4d4588e2fbf8a7c9a7af4546e2b315b6eba9c5982df9262292337f7" [[metadata.targets]] requires_python = "==3.11.10" @@ -401,34 +401,6 @@ files = [ {file = "cytoolz-0.12.3.tar.gz", hash = "sha256:4503dc59f4ced53a54643272c61dc305d1dbbfbd7d6bdf296948de9f34c3a282"}, ] -[[package]] -name = "datasets" -version = "2.21.0" -requires_python = ">=3.8.0" -summary = "HuggingFace community-driven open-source library of datasets" -groups = ["default"] -marker = "python_full_version == \"3.11.10\"" -dependencies = [ - "aiohttp", - "dill<0.3.9,>=0.3.0", - "filelock", - "fsspec[http]<=2024.6.1,>=2023.1.0", - "huggingface-hub>=0.21.2", - "multiprocess", - "numpy>=1.17", - "packaging", - "pandas", - "pyarrow>=15.0.0", - "pyyaml>=5.1", - "requests>=2.32.2", - "tqdm>=4.66.3", - "xxhash", -] -files = [ - {file = "datasets-2.21.0-py3-none-any.whl", hash = "sha256:25e4e097110ce28824b746a107727ada94024cba11db8bc588d468414692b65a"}, - {file = "datasets-2.21.0.tar.gz", hash = "sha256:998f85a8460f1bd982e5bd058f8a0808eef424249e3df1e8cdd594ccd0dc8ba2"}, -] - [[package]] name = "datura" version = "0.1.2" @@ -464,35 +436,6 @@ files = [ {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, ] -[[package]] -name = "dill" -version = "0.3.8" -requires_python = ">=3.8" -summary = "serialize all of Python" -groups = ["default"] -marker = "python_full_version == \"3.11.10\"" -files = [ - {file = "dill-0.3.8-py3-none-any.whl", hash = "sha256:c36ca9ffb54365bdd2f8eb3eff7d2a21237f8452b57ace88b1ac615b7e815bd7"}, - {file = "dill-0.3.8.tar.gz", hash = "sha256:3ebe3c479ad625c4553aca177444d89b486b1d84982eeacded644afc0cf797ca"}, -] - -[[package]] -name = "docker" -version = "7.1.0" -requires_python = ">=3.8" -summary = "A Python library for the Docker Engine API." -groups = ["default"] -marker = "python_full_version == \"3.11.10\"" -dependencies = [ - "pywin32>=304; sys_platform == \"win32\"", - "requests>=2.26.0", - "urllib3>=1.26.0", -] -files = [ - {file = "docker-7.1.0-py3-none-any.whl", hash = "sha256:c96b93b7f0a746f9e77d325bcfb87422a3d8bd4f03136ae8a85b37f1898d5fc0"}, - {file = "docker-7.1.0.tar.gz", hash = "sha256:ad8c70e6e3f8926cb8a92619b832b4ea5299e2831c14284663184e200546fa6c"}, -] - [[package]] name = "ecdsa" version = "0.19.0" @@ -587,18 +530,6 @@ files = [ {file = "fastapi-0.110.3.tar.gz", hash = "sha256:555700b0159379e94fdbfc6bb66a0f1c43f4cf7060f25239af3d84b63a656626"}, ] -[[package]] -name = "filelock" -version = "3.15.4" -requires_python = ">=3.8" -summary = "A platform independent file lock." -groups = ["default"] -marker = "python_full_version == \"3.11.10\"" -files = [ - {file = "filelock-3.15.4-py3-none-any.whl", hash = "sha256:6ca1fffae96225dab4c6eaf1c4f4f28cd2568d3ec2a44e15a08520504de468e7"}, - {file = "filelock-3.15.4.tar.gz", hash = "sha256:2207938cbc1844345cb01a5a95524dae30f0ce089eba5b00378295a17e3e90cb"}, -] - [[package]] name = "frozenlist" version = "1.4.1" @@ -626,35 +557,6 @@ files = [ {file = "frozenlist-1.4.1.tar.gz", hash = "sha256:c037a86e8513059a2613aaba4d817bb90b9d9b6b69aace3ce9c877e8c8ed402b"}, ] -[[package]] -name = "fsspec" -version = "2024.6.1" -requires_python = ">=3.8" -summary = "File-system specification" -groups = ["default"] -marker = "python_full_version == \"3.11.10\"" -files = [ - {file = "fsspec-2024.6.1-py3-none-any.whl", hash = "sha256:3cb443f8bcd2efb31295a5b9fdb02aee81d8452c80d28f97a6d0959e6cee101e"}, - {file = "fsspec-2024.6.1.tar.gz", hash = "sha256:fad7d7e209dd4c1208e3bbfda706620e0da5142bebbd9c384afb95b07e798e49"}, -] - -[[package]] -name = "fsspec" -version = "2024.6.1" -extras = ["http"] -requires_python = ">=3.8" -summary = "File-system specification" -groups = ["default"] -marker = "python_full_version == \"3.11.10\"" -dependencies = [ - "aiohttp!=4.0.0a0,!=4.0.0a1", - "fsspec==2024.6.1", -] -files = [ - {file = "fsspec-2024.6.1-py3-none-any.whl", hash = "sha256:3cb443f8bcd2efb31295a5b9fdb02aee81d8452c80d28f97a6d0959e6cee101e"}, - {file = "fsspec-2024.6.1.tar.gz", hash = "sha256:fad7d7e209dd4c1208e3bbfda706620e0da5142bebbd9c384afb95b07e798e49"}, -] - [[package]] name = "fuzzywuzzy" version = "0.18.0" @@ -681,27 +583,6 @@ files = [ {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, ] -[[package]] -name = "huggingface-hub" -version = "0.24.6" -requires_python = ">=3.8.0" -summary = "Client library to download and publish models, datasets and other repos on the huggingface.co hub" -groups = ["default"] -marker = "python_full_version == \"3.11.10\"" -dependencies = [ - "filelock", - "fsspec>=2023.5.0", - "packaging>=20.9", - "pyyaml>=5.1", - "requests", - "tqdm>=4.42.1", - "typing-extensions>=3.7.4.3", -] -files = [ - {file = "huggingface_hub-0.24.6-py3-none-any.whl", hash = "sha256:a990f3232aa985fe749bc9474060cbad75e8b2f115f6665a9fda5b9c97818970"}, - {file = "huggingface_hub-0.24.6.tar.gz", hash = "sha256:cc2579e761d070713eaa9c323e3debe39d5b464ae3a7261c39a9195b27bb8000"}, -] - [[package]] name = "idna" version = "3.8" @@ -819,17 +700,6 @@ files = [ {file = "more_itertools-10.5.0-py3-none-any.whl", hash = "sha256:037b0d3203ce90cca8ab1defbbdac29d5f993fc20131f3664dc8d6acfa872aef"}, ] -[[package]] -name = "mpmath" -version = "1.3.0" -summary = "Python library for arbitrary-precision floating-point arithmetic" -groups = ["default"] -marker = "python_full_version == \"3.11.10\"" -files = [ - {file = "mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c"}, - {file = "mpmath-1.3.0.tar.gz", hash = "sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f"}, -] - [[package]] name = "msgpack" version = "1.0.8" @@ -894,21 +764,6 @@ files = [ {file = "multidict-6.0.5.tar.gz", hash = "sha256:f7e301075edaf50500f0b341543c41194d8df3ae5caf4702f2095f3ca73dd8da"}, ] -[[package]] -name = "multiprocess" -version = "0.70.16" -requires_python = ">=3.8" -summary = "better multiprocessing and multithreading in Python" -groups = ["default"] -marker = "python_full_version == \"3.11.10\"" -dependencies = [ - "dill>=0.3.8", -] -files = [ - {file = "multiprocess-0.70.16-py311-none-any.whl", hash = "sha256:af4cabb0dac72abfb1e794fa7855c325fd2b55a10a44628a3c1ad3311c04127a"}, - {file = "multiprocess-0.70.16.tar.gz", hash = "sha256:161af703d4652a0e1410be6abccecde4a7ddffd19341be0a7011b94aeb171ac1"}, -] - [[package]] name = "munch" version = "2.5.0" @@ -947,18 +802,6 @@ files = [ {file = "netaddr-1.3.0.tar.gz", hash = "sha256:5c3c3d9895b551b763779ba7db7a03487dc1f8e3b385af819af341ae9ef6e48a"}, ] -[[package]] -name = "networkx" -version = "3.3" -requires_python = ">=3.10" -summary = "Python package for creating and manipulating graphs and networks" -groups = ["default"] -marker = "python_full_version == \"3.11.10\"" -files = [ - {file = "networkx-3.3-py3-none-any.whl", hash = "sha256:28575580c6ebdaf4505b22c6256a2b9de86b316dc63ba9e93abde3d78dfdbcf2"}, - {file = "networkx-3.3.tar.gz", hash = "sha256:0c127d8b2f4865f59ae9cb8aafcd60b5c70f3241ebd66f7defad7c4ab90126c9"}, -] - [[package]] name = "numpy" version = "1.26.4" @@ -978,162 +821,6 @@ files = [ {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"}, ] -[[package]] -name = "nvidia-cublas-cu12" -version = "12.1.3.1" -requires_python = ">=3" -summary = "CUBLAS native runtime libraries" -groups = ["default"] -marker = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and python_full_version == \"3.11.10\"" -files = [ - {file = "nvidia_cublas_cu12-12.1.3.1-py3-none-manylinux1_x86_64.whl", hash = "sha256:ee53ccca76a6fc08fb9701aa95b6ceb242cdaab118c3bb152af4e579af792728"}, - {file = "nvidia_cublas_cu12-12.1.3.1-py3-none-win_amd64.whl", hash = "sha256:2b964d60e8cf11b5e1073d179d85fa340c120e99b3067558f3cf98dd69d02906"}, -] - -[[package]] -name = "nvidia-cuda-cupti-cu12" -version = "12.1.105" -requires_python = ">=3" -summary = "CUDA profiling tools runtime libs." -groups = ["default"] -marker = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and python_full_version == \"3.11.10\"" -files = [ - {file = "nvidia_cuda_cupti_cu12-12.1.105-py3-none-manylinux1_x86_64.whl", hash = "sha256:e54fde3983165c624cb79254ae9818a456eb6e87a7fd4d56a2352c24ee542d7e"}, - {file = "nvidia_cuda_cupti_cu12-12.1.105-py3-none-win_amd64.whl", hash = "sha256:bea8236d13a0ac7190bd2919c3e8e6ce1e402104276e6f9694479e48bb0eb2a4"}, -] - -[[package]] -name = "nvidia-cuda-nvrtc-cu12" -version = "12.1.105" -requires_python = ">=3" -summary = "NVRTC native runtime libraries" -groups = ["default"] -marker = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and python_full_version == \"3.11.10\"" -files = [ - {file = "nvidia_cuda_nvrtc_cu12-12.1.105-py3-none-manylinux1_x86_64.whl", hash = "sha256:339b385f50c309763ca65456ec75e17bbefcbbf2893f462cb8b90584cd27a1c2"}, - {file = "nvidia_cuda_nvrtc_cu12-12.1.105-py3-none-win_amd64.whl", hash = "sha256:0a98a522d9ff138b96c010a65e145dc1b4850e9ecb75a0172371793752fd46ed"}, -] - -[[package]] -name = "nvidia-cuda-runtime-cu12" -version = "12.1.105" -requires_python = ">=3" -summary = "CUDA Runtime native Libraries" -groups = ["default"] -marker = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and python_full_version == \"3.11.10\"" -files = [ - {file = "nvidia_cuda_runtime_cu12-12.1.105-py3-none-manylinux1_x86_64.whl", hash = "sha256:6e258468ddf5796e25f1dc591a31029fa317d97a0a94ed93468fc86301d61e40"}, - {file = "nvidia_cuda_runtime_cu12-12.1.105-py3-none-win_amd64.whl", hash = "sha256:dfb46ef84d73fababab44cf03e3b83f80700d27ca300e537f85f636fac474344"}, -] - -[[package]] -name = "nvidia-cudnn-cu12" -version = "9.1.0.70" -requires_python = ">=3" -summary = "cuDNN runtime libraries" -groups = ["default"] -marker = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and python_full_version == \"3.11.10\"" -dependencies = [ - "nvidia-cublas-cu12", -] -files = [ - {file = "nvidia_cudnn_cu12-9.1.0.70-py3-none-manylinux2014_x86_64.whl", hash = "sha256:165764f44ef8c61fcdfdfdbe769d687e06374059fbb388b6c89ecb0e28793a6f"}, - {file = "nvidia_cudnn_cu12-9.1.0.70-py3-none-win_amd64.whl", hash = "sha256:6278562929433d68365a07a4a1546c237ba2849852c0d4b2262a486e805b977a"}, -] - -[[package]] -name = "nvidia-cufft-cu12" -version = "11.0.2.54" -requires_python = ">=3" -summary = "CUFFT native runtime libraries" -groups = ["default"] -marker = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and python_full_version == \"3.11.10\"" -files = [ - {file = "nvidia_cufft_cu12-11.0.2.54-py3-none-manylinux1_x86_64.whl", hash = "sha256:794e3948a1aa71fd817c3775866943936774d1c14e7628c74f6f7417224cdf56"}, - {file = "nvidia_cufft_cu12-11.0.2.54-py3-none-win_amd64.whl", hash = "sha256:d9ac353f78ff89951da4af698f80870b1534ed69993f10a4cf1d96f21357e253"}, -] - -[[package]] -name = "nvidia-curand-cu12" -version = "10.3.2.106" -requires_python = ">=3" -summary = "CURAND native runtime libraries" -groups = ["default"] -marker = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and python_full_version == \"3.11.10\"" -files = [ - {file = "nvidia_curand_cu12-10.3.2.106-py3-none-manylinux1_x86_64.whl", hash = "sha256:9d264c5036dde4e64f1de8c50ae753237c12e0b1348738169cd0f8a536c0e1e0"}, - {file = "nvidia_curand_cu12-10.3.2.106-py3-none-win_amd64.whl", hash = "sha256:75b6b0c574c0037839121317e17fd01f8a69fd2ef8e25853d826fec30bdba74a"}, -] - -[[package]] -name = "nvidia-cusolver-cu12" -version = "11.4.5.107" -requires_python = ">=3" -summary = "CUDA solver native runtime libraries" -groups = ["default"] -marker = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and python_full_version == \"3.11.10\"" -dependencies = [ - "nvidia-cublas-cu12", - "nvidia-cusparse-cu12", - "nvidia-nvjitlink-cu12", -] -files = [ - {file = "nvidia_cusolver_cu12-11.4.5.107-py3-none-manylinux1_x86_64.whl", hash = "sha256:8a7ec542f0412294b15072fa7dab71d31334014a69f953004ea7a118206fe0dd"}, - {file = "nvidia_cusolver_cu12-11.4.5.107-py3-none-win_amd64.whl", hash = "sha256:74e0c3a24c78612192a74fcd90dd117f1cf21dea4822e66d89e8ea80e3cd2da5"}, -] - -[[package]] -name = "nvidia-cusparse-cu12" -version = "12.1.0.106" -requires_python = ">=3" -summary = "CUSPARSE native runtime libraries" -groups = ["default"] -marker = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and python_full_version == \"3.11.10\"" -dependencies = [ - "nvidia-nvjitlink-cu12", -] -files = [ - {file = "nvidia_cusparse_cu12-12.1.0.106-py3-none-manylinux1_x86_64.whl", hash = "sha256:f3b50f42cf363f86ab21f720998517a659a48131e8d538dc02f8768237bd884c"}, - {file = "nvidia_cusparse_cu12-12.1.0.106-py3-none-win_amd64.whl", hash = "sha256:b798237e81b9719373e8fae8d4f091b70a0cf09d9d85c95a557e11df2d8e9a5a"}, -] - -[[package]] -name = "nvidia-nccl-cu12" -version = "2.20.5" -requires_python = ">=3" -summary = "NVIDIA Collective Communication Library (NCCL) Runtime" -groups = ["default"] -marker = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and python_full_version == \"3.11.10\"" -files = [ - {file = "nvidia_nccl_cu12-2.20.5-py3-none-manylinux2014_aarch64.whl", hash = "sha256:1fc150d5c3250b170b29410ba682384b14581db722b2531b0d8d33c595f33d01"}, - {file = "nvidia_nccl_cu12-2.20.5-py3-none-manylinux2014_x86_64.whl", hash = "sha256:057f6bf9685f75215d0c53bf3ac4a10b3e6578351de307abad9e18a99182af56"}, -] - -[[package]] -name = "nvidia-nvjitlink-cu12" -version = "12.6.68" -requires_python = ">=3" -summary = "Nvidia JIT LTO Library" -groups = ["default"] -marker = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and python_full_version == \"3.11.10\"" -files = [ - {file = "nvidia_nvjitlink_cu12-12.6.68-py3-none-manylinux2014_aarch64.whl", hash = "sha256:b3fd0779845f68b92063ab1393abab1ed0a23412fc520df79a8190d098b5cd6b"}, - {file = "nvidia_nvjitlink_cu12-12.6.68-py3-none-manylinux2014_x86_64.whl", hash = "sha256:125a6c2a44e96386dda634e13d944e60b07a0402d391a070e8fb4104b34ea1ab"}, - {file = "nvidia_nvjitlink_cu12-12.6.68-py3-none-win_amd64.whl", hash = "sha256:a55744c98d70317c5e23db14866a8cc2b733f7324509e941fc96276f9f37801d"}, -] - -[[package]] -name = "nvidia-nvtx-cu12" -version = "12.1.105" -requires_python = ">=3" -summary = "NVIDIA Tools Extension" -groups = ["default"] -marker = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and python_full_version == \"3.11.10\"" -files = [ - {file = "nvidia_nvtx_cu12-12.1.105-py3-none-manylinux1_x86_64.whl", hash = "sha256:dc21cf308ca5691e7c04d962e213f8a4aa9bbfa23d95412f452254c2caeb09e5"}, - {file = "nvidia_nvtx_cu12-12.1.105-py3-none-win_amd64.whl", hash = "sha256:65f4d98982b31b60026e0e6de73fbdfc09d08a96f4656dd3665ca616a11e1e82"}, -] - [[package]] name = "packaging" version = "24.1" @@ -1146,32 +833,6 @@ files = [ {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, ] -[[package]] -name = "pandas" -version = "2.2.2" -requires_python = ">=3.9" -summary = "Powerful data structures for data analysis, time series, and statistics" -groups = ["default"] -marker = "python_full_version == \"3.11.10\"" -dependencies = [ - "numpy>=1.22.4; python_version < \"3.11\"", - "numpy>=1.23.2; python_version == \"3.11\"", - "numpy>=1.26.0; python_version >= \"3.12\"", - "python-dateutil>=2.8.2", - "pytz>=2020.1", - "tzdata>=2022.7", -] -files = [ - {file = "pandas-2.2.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:696039430f7a562b74fa45f540aca068ea85fa34c244d0deee539cb6d70aa288"}, - {file = "pandas-2.2.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8e90497254aacacbc4ea6ae5e7a8cd75629d6ad2b30025a4a8b09aa4faf55151"}, - {file = "pandas-2.2.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58b84b91b0b9f4bafac2a0ac55002280c094dfc6402402332c0913a59654ab2b"}, - {file = "pandas-2.2.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d2123dc9ad6a814bcdea0f099885276b31b24f7edf40f6cdbc0912672e22eee"}, - {file = "pandas-2.2.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:2925720037f06e89af896c70bca73459d7e6a4be96f9de79e2d440bd499fe0db"}, - {file = "pandas-2.2.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0cace394b6ea70c01ca1595f839cf193df35d1575986e484ad35c4aeae7266c1"}, - {file = "pandas-2.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:873d13d177501a28b2756375d59816c365e42ed8417b41665f346289adc68d24"}, - {file = "pandas-2.2.2.tar.gz", hash = "sha256:9e79019aba43cb4fda9e4d983f8e88ca0373adbb697ae9c6c43093218de28b54"}, -] - [[package]] name = "password-strength" version = "0.0.3.post2" @@ -1186,18 +847,6 @@ files = [ {file = "password_strength-0.0.3.post2.tar.gz", hash = "sha256:bf4df10a58fcd3abfa182367307b4fd7b1cec518121dd83bf80c1c42ba796762"}, ] -[[package]] -name = "psutil" -version = "6.1.0" -requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" -summary = "Cross-platform lib for process and system monitoring in Python." -groups = ["default"] -marker = "python_full_version == \"3.11.10\"" -files = [ - {file = "psutil-6.1.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:498c6979f9c6637ebc3a73b3f87f9eb1ec24e1ce53a7c5173b8508981614a90b"}, - {file = "psutil-6.1.0.tar.gz", hash = "sha256:353815f59a7f64cdaca1c0307ee13558a0512f6db064e92fe833784f08539c7a"}, -] - [[package]] name = "py" version = "1.11.0" @@ -1267,27 +916,6 @@ files = [ {file = "py_sr25519_bindings-0.2.0.tar.gz", hash = "sha256:0c2fe92b7cdcebf6c5611a90054f8ba6ea90b68b8832896d2dc565537bc40b0c"}, ] -[[package]] -name = "pyarrow" -version = "17.0.0" -requires_python = ">=3.8" -summary = "Python library for Apache Arrow" -groups = ["default"] -marker = "python_full_version == \"3.11.10\"" -dependencies = [ - "numpy>=1.16.6", -] -files = [ - {file = "pyarrow-17.0.0-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:1c8856e2ef09eb87ecf937104aacfa0708f22dfeb039c363ec99735190ffb977"}, - {file = "pyarrow-17.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2e19f569567efcbbd42084e87f948778eb371d308e137a0f97afe19bb860ccb3"}, - {file = "pyarrow-17.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b244dc8e08a23b3e352899a006a26ae7b4d0da7bb636872fa8f5884e70acf15"}, - {file = "pyarrow-17.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b72e87fe3e1db343995562f7fff8aee354b55ee83d13afba65400c178ab2597"}, - {file = "pyarrow-17.0.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:dc5c31c37409dfbc5d014047817cb4ccd8c1ea25d19576acf1a001fe07f5b420"}, - {file = "pyarrow-17.0.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:e3343cb1e88bc2ea605986d4b94948716edc7a8d14afd4e2c097232f729758b4"}, - {file = "pyarrow-17.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:a27532c38f3de9eb3e90ecab63dfda948a8ca859a66e3a47f5f42d1e403c4d03"}, - {file = "pyarrow-17.0.0.tar.gz", hash = "sha256:4beca9521ed2c0921c1023e68d097d0299b62c362639ea315572a58f3f50fd28"}, -] - [[package]] name = "pycparser" version = "2.22" @@ -1417,21 +1045,6 @@ files = [ {file = "PyNaCl-1.5.0.tar.gz", hash = "sha256:8ac7448f09ab85811607bdd21ec2464495ac8b7c66d146bf545b0f08fb9220ba"}, ] -[[package]] -name = "python-dateutil" -version = "2.9.0.post0" -requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" -summary = "Extensions to the standard Python datetime module" -groups = ["default"] -marker = "python_full_version == \"3.11.10\"" -dependencies = [ - "six>=1.5", -] -files = [ - {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, - {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, -] - [[package]] name = "python-dotenv" version = "1.0.1" @@ -1471,17 +1084,6 @@ files = [ {file = "python_statemachine-2.1.2.tar.gz", hash = "sha256:0b0dd8b28738b53f14391b06d5072cd5e72259da5ae23574d3d4f5e6dd366663"}, ] -[[package]] -name = "pytz" -version = "2024.1" -summary = "World timezone definitions, modern and historical" -groups = ["default"] -marker = "python_full_version == \"3.11.10\"" -files = [ - {file = "pytz-2024.1-py2.py3-none-any.whl", hash = "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319"}, - {file = "pytz-2024.1.tar.gz", hash = "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812"}, -] - [[package]] name = "pyyaml" version = "6.0.2" @@ -1528,32 +1130,6 @@ files = [ {file = "rapidfuzz-3.9.7.tar.gz", hash = "sha256:f1c7296534c1afb6f495aa95871f14ccdc197c6db42965854e483100df313030"}, ] -[[package]] -name = "regex" -version = "2024.7.24" -requires_python = ">=3.8" -summary = "Alternative regular expression module, to replace re." -groups = ["default"] -marker = "python_full_version == \"3.11.10\"" -files = [ - {file = "regex-2024.7.24-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:382281306e3adaaa7b8b9ebbb3ffb43358a7bbf585fa93821300a418bb975281"}, - {file = "regex-2024.7.24-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4fdd1384619f406ad9037fe6b6eaa3de2749e2e12084abc80169e8e075377d3b"}, - {file = "regex-2024.7.24-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3d974d24edb231446f708c455fd08f94c41c1ff4f04bcf06e5f36df5ef50b95a"}, - {file = "regex-2024.7.24-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a2ec4419a3fe6cf8a4795752596dfe0adb4aea40d3683a132bae9c30b81e8d73"}, - {file = "regex-2024.7.24-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb563dd3aea54c797adf513eeec819c4213d7dbfc311874eb4fd28d10f2ff0f2"}, - {file = "regex-2024.7.24-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:45104baae8b9f67569f0f1dca5e1f1ed77a54ae1cd8b0b07aba89272710db61e"}, - {file = "regex-2024.7.24-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:994448ee01864501912abf2bad9203bffc34158e80fe8bfb5b031f4f8e16da51"}, - {file = "regex-2024.7.24-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3fac296f99283ac232d8125be932c5cd7644084a30748fda013028c815ba3364"}, - {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7e37e809b9303ec3a179085415cb5f418ecf65ec98cdfe34f6a078b46ef823ee"}, - {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:01b689e887f612610c869421241e075c02f2e3d1ae93a037cb14f88ab6a8934c"}, - {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f6442f0f0ff81775eaa5b05af8a0ffa1dda36e9cf6ec1e0d3d245e8564b684ce"}, - {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:871e3ab2838fbcb4e0865a6e01233975df3a15e6fce93b6f99d75cacbd9862d1"}, - {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c918b7a1e26b4ab40409820ddccc5d49871a82329640f5005f73572d5eaa9b5e"}, - {file = "regex-2024.7.24-cp311-cp311-win32.whl", hash = "sha256:2dfbb8baf8ba2c2b9aa2807f44ed272f0913eeeba002478c4577b8d29cde215c"}, - {file = "regex-2024.7.24-cp311-cp311-win_amd64.whl", hash = "sha256:538d30cd96ed7d1416d3956f94d54e426a8daf7c14527f6e0d6d425fcb4cca52"}, - {file = "regex-2024.7.24.tar.gz", hash = "sha256:9cfd009eed1a46b27c14039ad5bbc5e71b6367c5b2e6d5f5da0ea91600817506"}, -] - [[package]] name = "requests" version = "2.32.3" @@ -1643,29 +1219,6 @@ files = [ {file = "ruff-0.6.4.tar.gz", hash = "sha256:ac3b5bfbee99973f80aa1b7cbd1c9cbce200883bdd067300c22a6cc1c7fba212"}, ] -[[package]] -name = "safetensors" -version = "0.4.5" -requires_python = ">=3.7" -summary = "" -groups = ["default"] -marker = "python_full_version == \"3.11.10\"" -files = [ - {file = "safetensors-0.4.5-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:21f848d7aebd5954f92538552d6d75f7c1b4500f51664078b5b49720d180e47c"}, - {file = "safetensors-0.4.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bb07000b19d41e35eecef9a454f31a8b4718a185293f0d0b1c4b61d6e4487971"}, - {file = "safetensors-0.4.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09dedf7c2fda934ee68143202acff6e9e8eb0ddeeb4cfc24182bef999efa9f42"}, - {file = "safetensors-0.4.5-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:59b77e4b7a708988d84f26de3ebead61ef1659c73dcbc9946c18f3b1786d2688"}, - {file = "safetensors-0.4.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5d3bc83e14d67adc2e9387e511097f254bd1b43c3020440e708858c684cbac68"}, - {file = "safetensors-0.4.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:39371fc551c1072976073ab258c3119395294cf49cdc1f8476794627de3130df"}, - {file = "safetensors-0.4.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a6c19feda32b931cae0acd42748a670bdf56bee6476a046af20181ad3fee4090"}, - {file = "safetensors-0.4.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a659467495de201e2f282063808a41170448c78bada1e62707b07a27b05e6943"}, - {file = "safetensors-0.4.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bad5e4b2476949bcd638a89f71b6916fa9a5cae5c1ae7eede337aca2100435c0"}, - {file = "safetensors-0.4.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a3a315a6d0054bc6889a17f5668a73f94f7fe55121ff59e0a199e3519c08565f"}, - {file = "safetensors-0.4.5-cp311-none-win32.whl", hash = "sha256:a01e232e6d3d5cf8b1667bc3b657a77bdab73f0743c26c1d3c5dd7ce86bd3a92"}, - {file = "safetensors-0.4.5-cp311-none-win_amd64.whl", hash = "sha256:cbd39cae1ad3e3ef6f63a6f07296b080c951f24cec60188378e43d3713000c04"}, - {file = "safetensors-0.4.5.tar.gz", hash = "sha256:d73de19682deabb02524b3d5d1f8b3aaba94c72f1bbfc7911b9b9d5d391c0310"}, -] - [[package]] name = "scalecodec" version = "1.2.11" @@ -1776,21 +1329,6 @@ files = [ {file = "substrate_interface-1.7.10-py3-none-any.whl", hash = "sha256:4873e9f1b75375ed9fcdd12d7bca66c47ab0e9fbd532ec4f9538ceac0f0ab2f5"}, ] -[[package]] -name = "sympy" -version = "1.13.2" -requires_python = ">=3.8" -summary = "Computer algebra system (CAS) in Python" -groups = ["default"] -marker = "python_full_version == \"3.11.10\"" -dependencies = [ - "mpmath<1.4,>=1.1.0", -] -files = [ - {file = "sympy-1.13.2-py3-none-any.whl", hash = "sha256:c51d75517712f1aed280d4ce58506a4a88d635d6b5dd48b39102a7ae1f3fcfe9"}, - {file = "sympy-1.13.2.tar.gz", hash = "sha256:401449d84d07be9d0c7a46a64bd54fe097667d5e7181bfe67ec777be9e01cb13"}, -] - [[package]] name = "termcolor" version = "2.4.0" @@ -1803,32 +1341,6 @@ files = [ {file = "termcolor-2.4.0.tar.gz", hash = "sha256:aab9e56047c8ac41ed798fa36d892a37aca6b3e9159f3e0c24bc64a9b3ac7b7a"}, ] -[[package]] -name = "tokenizers" -version = "0.19.1" -requires_python = ">=3.7" -summary = "" -groups = ["default"] -marker = "python_full_version == \"3.11.10\"" -dependencies = [ - "huggingface-hub<1.0,>=0.16.4", -] -files = [ - {file = "tokenizers-0.19.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:5c88d1481f1882c2e53e6bb06491e474e420d9ac7bdff172610c4f9ad3898059"}, - {file = "tokenizers-0.19.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ddf672ed719b4ed82b51499100f5417d7d9f6fb05a65e232249268f35de5ed14"}, - {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:dadc509cc8a9fe460bd274c0e16ac4184d0958117cf026e0ea8b32b438171594"}, - {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfedf31824ca4915b511b03441784ff640378191918264268e6923da48104acc"}, - {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac11016d0a04aa6487b1513a3a36e7bee7eec0e5d30057c9c0408067345c48d2"}, - {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:76951121890fea8330d3a0df9a954b3f2a37e3ec20e5b0530e9a0044ca2e11fe"}, - {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b342d2ce8fc8d00f376af068e3274e2e8649562e3bc6ae4a67784ded6b99428d"}, - {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d16ff18907f4909dca9b076b9c2d899114dd6abceeb074eca0c93e2353f943aa"}, - {file = "tokenizers-0.19.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:706a37cc5332f85f26efbe2bdc9ef8a9b372b77e4645331a405073e4b3a8c1c6"}, - {file = "tokenizers-0.19.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:16baac68651701364b0289979ecec728546133e8e8fe38f66fe48ad07996b88b"}, - {file = "tokenizers-0.19.1-cp311-none-win32.whl", hash = "sha256:9ed240c56b4403e22b9584ee37d87b8bfa14865134e3e1c3fb4b2c42fafd3256"}, - {file = "tokenizers-0.19.1-cp311-none-win_amd64.whl", hash = "sha256:ad57d59341710b94a7d9dbea13f5c1e7d76fd8d9bcd944a7a6ab0b0da6e0cc66"}, - {file = "tokenizers-0.19.1.tar.gz", hash = "sha256:ee59e6680ed0fdbe6b724cf38bd70400a0c1dd623b07ac729087270caeac88e3"}, -] - [[package]] name = "toolz" version = "0.12.1" @@ -1841,40 +1353,6 @@ files = [ {file = "toolz-0.12.1.tar.gz", hash = "sha256:ecca342664893f177a13dac0e6b41cbd8ac25a358e5f215316d43e2100224f4d"}, ] -[[package]] -name = "torch" -version = "2.4.1" -requires_python = ">=3.8.0" -summary = "Tensors and Dynamic neural networks in Python with strong GPU acceleration" -groups = ["default"] -marker = "python_full_version == \"3.11.10\"" -dependencies = [ - "filelock", - "fsspec", - "jinja2", - "networkx", - "nvidia-cublas-cu12==12.1.3.1; platform_system == \"Linux\" and platform_machine == \"x86_64\"", - "nvidia-cuda-cupti-cu12==12.1.105; platform_system == \"Linux\" and platform_machine == \"x86_64\"", - "nvidia-cuda-nvrtc-cu12==12.1.105; platform_system == \"Linux\" and platform_machine == \"x86_64\"", - "nvidia-cuda-runtime-cu12==12.1.105; platform_system == \"Linux\" and platform_machine == \"x86_64\"", - "nvidia-cudnn-cu12==9.1.0.70; platform_system == \"Linux\" and platform_machine == \"x86_64\"", - "nvidia-cufft-cu12==11.0.2.54; platform_system == \"Linux\" and platform_machine == \"x86_64\"", - "nvidia-curand-cu12==10.3.2.106; platform_system == \"Linux\" and platform_machine == \"x86_64\"", - "nvidia-cusolver-cu12==11.4.5.107; platform_system == \"Linux\" and platform_machine == \"x86_64\"", - "nvidia-cusparse-cu12==12.1.0.106; platform_system == \"Linux\" and platform_machine == \"x86_64\"", - "nvidia-nccl-cu12==2.20.5; platform_system == \"Linux\" and platform_machine == \"x86_64\"", - "nvidia-nvtx-cu12==12.1.105; platform_system == \"Linux\" and platform_machine == \"x86_64\"", - "sympy", - "triton==3.0.0; platform_system == \"Linux\" and platform_machine == \"x86_64\" and python_version < \"3.13\"", - "typing-extensions>=4.8.0", -] -files = [ - {file = "torch-2.4.1-cp311-cp311-manylinux1_x86_64.whl", hash = "sha256:0b5f88afdfa05a335d80351e3cea57d38e578c8689f751d35e0ff36bce872113"}, - {file = "torch-2.4.1-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:ef503165f2341942bfdf2bd520152f19540d0c0e34961232f134dc59ad435be8"}, - {file = "torch-2.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:092e7c2280c860eff762ac08c4bdcd53d701677851670695e0c22d6d345b269c"}, - {file = "torch-2.4.1-cp311-none-macosx_11_0_arm64.whl", hash = "sha256:ddddbd8b066e743934a4200b3d54267a46db02106876d21cf31f7da7a96f98ea"}, -] - [[package]] name = "tqdm" version = "4.66.5" @@ -1890,43 +1368,6 @@ files = [ {file = "tqdm-4.66.5.tar.gz", hash = "sha256:e1020aef2e5096702d8a025ac7d16b1577279c9d63f8375b63083e9a5f0fcbad"}, ] -[[package]] -name = "transformers" -version = "4.44.2" -requires_python = ">=3.8.0" -summary = "State-of-the-art Machine Learning for JAX, PyTorch and TensorFlow" -groups = ["default"] -marker = "python_full_version == \"3.11.10\"" -dependencies = [ - "filelock", - "huggingface-hub<1.0,>=0.23.2", - "numpy>=1.17", - "packaging>=20.0", - "pyyaml>=5.1", - "regex!=2019.12.17", - "requests", - "safetensors>=0.4.1", - "tokenizers<0.20,>=0.19", - "tqdm>=4.27", -] -files = [ - {file = "transformers-4.44.2-py3-none-any.whl", hash = "sha256:1c02c65e7bfa5e52a634aff3da52138b583fc6f263c1f28d547dc144ba3d412d"}, - {file = "transformers-4.44.2.tar.gz", hash = "sha256:36aa17cc92ee154058e426d951684a2dab48751b35b49437896f898931270826"}, -] - -[[package]] -name = "triton" -version = "3.0.0" -summary = "A language and compiler for custom Deep Learning operations" -groups = ["default"] -marker = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and python_full_version == \"3.11.10\"" -dependencies = [ - "filelock", -] -files = [ - {file = "triton-3.0.0-1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5ce8520437c602fb633f1324cc3871c47bee3b67acf9756c1a66309b60e3216c"}, -] - [[package]] name = "typing-extensions" version = "4.12.2" diff --git a/neurons/executor/pyproject.toml b/neurons/executor/pyproject.toml index 46d077d..54fb35e 100644 --- a/neurons/executor/pyproject.toml +++ b/neurons/executor/pyproject.toml @@ -7,7 +7,6 @@ authors = [ ] dependencies = [ "bittensor>=6.9.3", - "torch>=2.3.1", "fastapi>=0.99.1", "datura @ file:///${PROJECT_ROOT}/../../datura", "pydantic>=1.10.17", @@ -15,10 +14,6 @@ dependencies = [ "ruff>=0.5.1", "websockets>=12.0", "numpy<2.0.0", - "datasets>=2.20.0", - "transformers>=4.43.4", - "psutil>=6.1.0", - "docker>=7.1.0", ] requires-python = "==3.11.*" readme = "README.md" diff --git a/neurons/executor/src/core/config.py b/neurons/executor/src/core/config.py index 4109311..d045345 100644 --- a/neurons/executor/src/core/config.py +++ b/neurons/executor/src/core/config.py @@ -1,3 +1,4 @@ +from typing import Optional from pydantic import Field from pydantic_settings import BaseSettings, SettingsConfigDict @@ -11,7 +12,8 @@ class Settings(BaseSettings): MINER_HOTKEY_SS58_ADDRESS: str = Field(env="MINER_HOTKEY_SS58_ADDRESS") - RENTING_PORT_RANGE: str = Field(env="RENTING_PORT_RANGE", default='40000-65535') + RENTING_PORT_RANGE: Optional[str] = Field(env="RENTING_PORT_RANGE", default=None) + RENTING_PORT_MAPPINGS: Optional[str] = Field(env="RENTING_PORT_MAPPINGS", default=None) ENV: str = Field(env="ENV", default="dev") diff --git a/neurons/executor/src/services/miner_service.py b/neurons/executor/src/services/miner_service.py index 6b6433f..9fa2d5e 100644 --- a/neurons/executor/src/services/miner_service.py +++ b/neurons/executor/src/services/miner_service.py @@ -30,6 +30,7 @@ async def upload_ssh_key(self, paylod: MinerAuthPayload): "python_path": sys.executable, "root_dir": str(Path(__file__).resolve().parents[2]), "port_range": settings.RENTING_PORT_RANGE, + "port_mappings": settings.RENTING_PORT_MAPPINGS } async def remove_ssh_key(self, paylod: MinerAuthPayload): diff --git a/neurons/miners/Dockerfile b/neurons/miners/Dockerfile index 0e6e561..3754481 100644 --- a/neurons/miners/Dockerfile +++ b/neurons/miners/Dockerfile @@ -17,8 +17,6 @@ COPY --from=datura . /datura RUN --mount=type=cache,target=/tmp/pdm_cache \ pdm config cache_dir /tmp/pdm_cache && \ pdm config python.use_venv False && \ - # compute-horde from path computes version from git tag which is unavailable here, - # hence we pass PDM_BUILD_SCM_VERSION=0 manually PDM_BUILD_SCM_VERSION=0 pdm sync --prod --group :all RUN mkdir -p /opt/ && mv __pypackages__/3.11/ /opt/pypackages/ @@ -48,6 +46,6 @@ RUN echo "export PYTHONPATH=$PYTHONPATH" >> ~/.bash_profile COPY --from=base-image /root/app/ /root/app/ COPY --from=base-image /opt/pypackages/ /opt/pypackages/ -LABEL version="3.1.0" +LABEL version="3.2.0" CMD ["bash", "run.sh"] \ No newline at end of file diff --git a/neurons/miners/Dockerfile.runner b/neurons/miners/Dockerfile.runner index 9243b86..fb0d26e 100644 --- a/neurons/miners/Dockerfile.runner +++ b/neurons/miners/Dockerfile.runner @@ -3,7 +3,7 @@ WORKDIR /root/miner COPY docker-compose.app.yml docker-compose.yml COPY entrypoint.sh /entrypoint.sh -LABEL version="3.1.0" +LABEL version="3.2.0" RUN chmod u+x /entrypoint.sh ENTRYPOINT ["/entrypoint.sh"] diff --git a/neurons/miners/pdm.lock b/neurons/miners/pdm.lock index 41ac28a..78207c4 100644 --- a/neurons/miners/pdm.lock +++ b/neurons/miners/pdm.lock @@ -5,13 +5,10 @@ groups = ["default"] strategy = ["inherit_metadata"] lock_version = "4.5.0" -content_hash = "sha256:a7d96819185fe463bc666a87961a07d02626fd3a5d2635bcb73731b8dc141c55" +content_hash = "sha256:da5a4548a6980268cde7bc6c89308af00039a04b05e920e224a9e37014fcadf2" [[metadata.targets]] -requires_python = "==3.11.10" -platform = "manylinux_2_35_x86_64" -implementation = "cpython" -gil_disabled = false +requires_python = "==3.11.*" [[package]] name = "aiohappyeyeballs" @@ -19,7 +16,6 @@ version = "2.3.6" requires_python = ">=3.8" summary = "Happy Eyeballs for asyncio" groups = ["default"] -marker = "python_full_version == \"3.11.10\"" files = [ {file = "aiohappyeyeballs-2.3.6-py3-none-any.whl", hash = "sha256:15dca2611fa78442f1cb54cf07ffb998573f2b4fbeab45ca8554c045665c896b"}, {file = "aiohappyeyeballs-2.3.6.tar.gz", hash = "sha256:88211068d2a40e0436033956d7de3926ff36d54776f8b1022d6b21320cadae79"}, @@ -27,11 +23,10 @@ files = [ [[package]] name = "aiohttp" -version = "3.10.5" +version = "3.10.3" requires_python = ">=3.8" summary = "Async http client/server framework (asyncio)" groups = ["default"] -marker = "python_full_version == \"3.11.10\"" dependencies = [ "aiohappyeyeballs>=2.3.0", "aiosignal>=1.1.2", @@ -42,8 +37,22 @@ dependencies = [ "yarl<2.0,>=1.0", ] files = [ - {file = "aiohttp-3.10.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:424ae21498790e12eb759040bbb504e5e280cab64693d14775c54269fd1d2bb7"}, - {file = "aiohttp-3.10.5.tar.gz", hash = "sha256:f071854b47d39591ce9a17981c46790acb30518e2f83dfca8db2dfa091178691"}, + {file = "aiohttp-3.10.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e021c4c778644e8cdc09487d65564265e6b149896a17d7c0f52e9a088cc44e1b"}, + {file = "aiohttp-3.10.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:24fade6dae446b183e2410a8628b80df9b7a42205c6bfc2eff783cbeedc224a2"}, + {file = "aiohttp-3.10.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bc8e9f15939dacb0e1f2d15f9c41b786051c10472c7a926f5771e99b49a5957f"}, + {file = "aiohttp-3.10.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5a9ec959b5381271c8ec9310aae1713b2aec29efa32e232e5ef7dcca0df0279"}, + {file = "aiohttp-3.10.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2a5d0ea8a6467b15d53b00c4e8ea8811e47c3cc1bdbc62b1aceb3076403d551f"}, + {file = "aiohttp-3.10.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c9ed607dbbdd0d4d39b597e5bf6b0d40d844dfb0ac6a123ed79042ef08c1f87e"}, + {file = "aiohttp-3.10.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3e66d5b506832e56add66af88c288c1d5ba0c38b535a1a59e436b300b57b23e"}, + {file = "aiohttp-3.10.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fda91ad797e4914cca0afa8b6cccd5d2b3569ccc88731be202f6adce39503189"}, + {file = "aiohttp-3.10.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:61ccb867b2f2f53df6598eb2a93329b5eee0b00646ee79ea67d68844747a418e"}, + {file = "aiohttp-3.10.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:6d881353264e6156f215b3cb778c9ac3184f5465c2ece5e6fce82e68946868ef"}, + {file = "aiohttp-3.10.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:b031ce229114825f49cec4434fa844ccb5225e266c3e146cb4bdd025a6da52f1"}, + {file = "aiohttp-3.10.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:5337cc742a03f9e3213b097abff8781f79de7190bbfaa987bd2b7ceb5bb0bdec"}, + {file = "aiohttp-3.10.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ab3361159fd3dcd0e48bbe804006d5cfb074b382666e6c064112056eb234f1a9"}, + {file = "aiohttp-3.10.3-cp311-cp311-win32.whl", hash = "sha256:05d66203a530209cbe40f102ebaac0b2214aba2a33c075d0bf825987c36f1f0b"}, + {file = "aiohttp-3.10.3-cp311-cp311-win_amd64.whl", hash = "sha256:70b4a4984a70a2322b70e088d654528129783ac1ebbf7dd76627b3bd22db2f17"}, + {file = "aiohttp-3.10.3.tar.gz", hash = "sha256:21650e7032cc2d31fc23d353d7123e771354f2a3d5b05a5647fc30fea214e696"}, ] [[package]] @@ -52,7 +61,6 @@ version = "1.3.1" requires_python = ">=3.7" summary = "aiosignal: a list of registered asynchronous callbacks" groups = ["default"] -marker = "python_full_version == \"3.11.10\"" dependencies = [ "frozenlist>=1.1.0", ] @@ -67,7 +75,6 @@ version = "1.13.2" requires_python = ">=3.8" summary = "A database migration tool for SQLAlchemy." groups = ["default"] -marker = "python_full_version == \"3.11.10\"" dependencies = [ "Mako", "SQLAlchemy>=1.3.0", @@ -86,7 +93,6 @@ version = "0.7.0" requires_python = ">=3.8" summary = "Reusable constraint types to use with typing.Annotated" groups = ["default"] -marker = "python_full_version == \"3.11.10\"" dependencies = [ "typing-extensions>=4.0.0; python_version < \"3.9\"", ] @@ -101,7 +107,6 @@ version = "6.7.0" requires_python = ">=3.8" summary = "Radically simple IT automation" groups = ["default"] -marker = "python_full_version == \"3.11.10\"" dependencies = [ "ansible-core~=2.13.7", ] @@ -116,7 +121,6 @@ version = "2.13.13" requires_python = ">=3.8" summary = "Radically simple IT automation" groups = ["default"] -marker = "python_full_version == \"3.11.10\"" dependencies = [ "PyYAML>=5.1", "cryptography", @@ -134,7 +138,6 @@ name = "ansible-vault" version = "2.1.0" summary = "R/W an ansible-vault yaml file" groups = ["default"] -marker = "python_full_version == \"3.11.10\"" dependencies = [ "ansible", "setuptools", @@ -149,7 +152,6 @@ version = "4.4.0" requires_python = ">=3.8" summary = "High level compatibility layer for multiple asynchronous event loop implementations" groups = ["default"] -marker = "python_full_version == \"3.11.10\"" dependencies = [ "exceptiongroup>=1.0.2; python_version < \"3.11\"", "idna>=2.8", @@ -161,13 +163,26 @@ files = [ {file = "anyio-4.4.0.tar.gz", hash = "sha256:5aadc6a1bbb7cdb0bede386cac5e2940f5e2ff3aa20277e991cf028e0585ce94"}, ] +[[package]] +name = "asgiref" +version = "3.8.1" +requires_python = ">=3.8" +summary = "ASGI specs, helper code, and adapters" +groups = ["default"] +dependencies = [ + "typing-extensions>=4; python_version < \"3.11\"", +] +files = [ + {file = "asgiref-3.8.1-py3-none-any.whl", hash = "sha256:3e1e3ecc849832fe52ccf2cb6686b7a55f82bb1d6aee72a58826471390335e47"}, + {file = "asgiref-3.8.1.tar.gz", hash = "sha256:c343bd80a0bec947a9860adb4c432ffa7db769836c64238fc34bdc3fec84d590"}, +] + [[package]] name = "async-timeout" version = "4.0.3" requires_python = ">=3.7" summary = "Timeout context manager for asyncio programs" groups = ["default"] -marker = "python_full_version == \"3.11.10\"" dependencies = [ "typing-extensions>=3.6.5; python_version < \"3.8\"", ] @@ -182,7 +197,6 @@ version = "0.29.0" requires_python = ">=3.8.0" summary = "An asyncio PostgreSQL driver" groups = ["default"] -marker = "python_full_version == \"3.11.10\"" dependencies = [ "async-timeout>=4.0.3; python_version < \"3.12.0\"", ] @@ -204,7 +218,6 @@ version = "24.2.0" requires_python = ">=3.7" summary = "Classes Without Boilerplate" groups = ["default"] -marker = "python_full_version == \"3.11.10\"" dependencies = [ "importlib-metadata; python_version < \"3.8\"", ] @@ -219,7 +232,6 @@ version = "2.2.1" requires_python = ">=3.7,<4.0" summary = "Function decoration for backoff and retry" groups = ["default"] -marker = "python_full_version == \"3.11.10\"" files = [ {file = "backoff-2.2.1-py3-none-any.whl", hash = "sha256:63579f9a0628e06278f7e47b7d7d5b6ce20dc65c5e96a6f3ca99a6adca0396e8"}, {file = "backoff-2.2.1.tar.gz", hash = "sha256:03f829f5bb1923180821643f8753b0502c3b682293992485b0eef2807afa5cba"}, @@ -231,19 +243,49 @@ version = "2.1.1" requires_python = ">=3.5" summary = "Base58 and Base58Check implementation." groups = ["default"] -marker = "python_full_version == \"3.11.10\"" files = [ {file = "base58-2.1.1-py3-none-any.whl", hash = "sha256:11a36f4d3ce51dfc1043f3218591ac4eb1ceb172919cebe05b52a5bcc8d245c2"}, {file = "base58-2.1.1.tar.gz", hash = "sha256:c5d0cb3f5b6e81e8e35da5754388ddcc6d0d14b6c6a132cb93d69ed580a7278c"}, ] +[[package]] +name = "bcrypt" +version = "4.2.0" +requires_python = ">=3.7" +summary = "Modern password hashing for your software and your servers" +groups = ["default"] +files = [ + {file = "bcrypt-4.2.0-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:096a15d26ed6ce37a14c1ac1e48119660f21b24cba457f160a4b830f3fe6b5cb"}, + {file = "bcrypt-4.2.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c02d944ca89d9b1922ceb8a46460dd17df1ba37ab66feac4870f6862a1533c00"}, + {file = "bcrypt-4.2.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d84cf6d877918620b687b8fd1bf7781d11e8a0998f576c7aa939776b512b98d"}, + {file = "bcrypt-4.2.0-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:1bb429fedbe0249465cdd85a58e8376f31bb315e484f16e68ca4c786dcc04291"}, + {file = "bcrypt-4.2.0-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:655ea221910bcac76ea08aaa76df427ef8625f92e55a8ee44fbf7753dbabb328"}, + {file = "bcrypt-4.2.0-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:1ee38e858bf5d0287c39b7a1fc59eec64bbf880c7d504d3a06a96c16e14058e7"}, + {file = "bcrypt-4.2.0-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:0da52759f7f30e83f1e30a888d9163a81353ef224d82dc58eb5bb52efcabc399"}, + {file = "bcrypt-4.2.0-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:3698393a1b1f1fd5714524193849d0c6d524d33523acca37cd28f02899285060"}, + {file = "bcrypt-4.2.0-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:762a2c5fb35f89606a9fde5e51392dad0cd1ab7ae64149a8b935fe8d79dd5ed7"}, + {file = "bcrypt-4.2.0-cp37-abi3-win32.whl", hash = "sha256:5a1e8aa9b28ae28020a3ac4b053117fb51c57a010b9f969603ed885f23841458"}, + {file = "bcrypt-4.2.0-cp37-abi3-win_amd64.whl", hash = "sha256:8f6ede91359e5df88d1f5c1ef47428a4420136f3ce97763e31b86dd8280fbdf5"}, + {file = "bcrypt-4.2.0-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:c52aac18ea1f4a4f65963ea4f9530c306b56ccd0c6f8c8da0c06976e34a6e841"}, + {file = "bcrypt-4.2.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3bbbfb2734f0e4f37c5136130405332640a1e46e6b23e000eeff2ba8d005da68"}, + {file = "bcrypt-4.2.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3413bd60460f76097ee2e0a493ccebe4a7601918219c02f503984f0a7ee0aebe"}, + {file = "bcrypt-4.2.0-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:8d7bb9c42801035e61c109c345a28ed7e84426ae4865511eb82e913df18f58c2"}, + {file = "bcrypt-4.2.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:3d3a6d28cb2305b43feac298774b997e372e56c7c7afd90a12b3dc49b189151c"}, + {file = "bcrypt-4.2.0-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:9c1c4ad86351339c5f320ca372dfba6cb6beb25e8efc659bedd918d921956bae"}, + {file = "bcrypt-4.2.0-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:27fe0f57bb5573104b5a6de5e4153c60814c711b29364c10a75a54bb6d7ff48d"}, + {file = "bcrypt-4.2.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:8ac68872c82f1add6a20bd489870c71b00ebacd2e9134a8aa3f98a0052ab4b0e"}, + {file = "bcrypt-4.2.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:cb2a8ec2bc07d3553ccebf0746bbf3d19426d1c6d1adbd4fa48925f66af7b9e8"}, + {file = "bcrypt-4.2.0-cp39-abi3-win32.whl", hash = "sha256:77800b7147c9dc905db1cba26abe31e504d8247ac73580b4aa179f98e6608f34"}, + {file = "bcrypt-4.2.0-cp39-abi3-win_amd64.whl", hash = "sha256:61ed14326ee023917ecd093ee6ef422a72f3aec6f07e21ea5f10622b735538a9"}, + {file = "bcrypt-4.2.0.tar.gz", hash = "sha256:cf69eaf5185fd58f268f805b505ce31f9b9fc2d64b376642164e9244540c1221"}, +] + [[package]] name = "bittensor" version = "7.3.1" requires_python = ">=3.9" summary = "bittensor" groups = ["default"] -marker = "python_full_version == \"3.11.10\"" dependencies = [ "PyNaCl<=1.5.0,>=1.3.0", "aiohttp~=3.9", @@ -291,7 +333,6 @@ version = "2024.2.2" requires_python = ">=3.6" summary = "Python package for providing Mozilla's CA Bundle." groups = ["default"] -marker = "python_full_version == \"3.11.10\"" files = [ {file = "certifi-2024.2.2-py3-none-any.whl", hash = "sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1"}, {file = "certifi-2024.2.2.tar.gz", hash = "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f"}, @@ -303,7 +344,6 @@ version = "1.17.0" requires_python = ">=3.8" summary = "Foreign Function Interface for Python calling C code." groups = ["default"] -marker = "python_full_version == \"3.11.10\"" dependencies = [ "pycparser", ] @@ -329,7 +369,6 @@ version = "3.3.2" requires_python = ">=3.7.0" summary = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." groups = ["default"] -marker = "python_full_version == \"3.11.10\"" files = [ {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, @@ -356,7 +395,6 @@ version = "8.1.7" requires_python = ">=3.7" summary = "Composable command line interface toolkit" groups = ["default"] -marker = "python_full_version == \"3.11.10\"" dependencies = [ "colorama; platform_system == \"Windows\"", "importlib-metadata; python_version < \"3.8\"", @@ -372,7 +410,6 @@ version = "0.4.6" requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" summary = "Cross-platform colored terminal text." groups = ["default"] -marker = "python_full_version == \"3.11.10\"" files = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, @@ -384,7 +421,6 @@ version = "42.0.8" requires_python = ">=3.7" summary = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." groups = ["default"] -marker = "python_full_version == \"3.11.10\"" dependencies = [ "cffi>=1.12; platform_python_implementation != \"PyPy\"", ] @@ -421,7 +457,6 @@ version = "0.12.3" requires_python = ">=3.7" summary = "Cython implementation of Toolz: High performance functional utilities" groups = ["default"] -marker = "implementation_name == \"cpython\" and python_full_version == \"3.11.10\"" dependencies = [ "toolz>=0.8.0", ] @@ -449,7 +484,6 @@ version = "0.9.0" requires_python = ">=3.8" summary = "Async database support for Python." groups = ["default"] -marker = "python_full_version == \"3.11.10\"" dependencies = [ "sqlalchemy>=2.0.7", ] @@ -465,7 +499,6 @@ extras = ["postgresql"] requires_python = ">=3.8" summary = "Async database support for Python." groups = ["default"] -marker = "python_full_version == \"3.11.10\"" dependencies = [ "asyncpg", "databases==0.9.0", @@ -475,34 +508,6 @@ files = [ {file = "databases-0.9.0.tar.gz", hash = "sha256:d2f259677609bf187737644c95fa41701072e995dfeb8d2882f335795c5b61b0"}, ] -[[package]] -name = "datasets" -version = "2.21.0" -requires_python = ">=3.8.0" -summary = "HuggingFace community-driven open-source library of datasets" -groups = ["default"] -marker = "python_full_version == \"3.11.10\"" -dependencies = [ - "aiohttp", - "dill<0.3.9,>=0.3.0", - "filelock", - "fsspec[http]<=2024.6.1,>=2023.1.0", - "huggingface-hub>=0.21.2", - "multiprocess", - "numpy>=1.17", - "packaging", - "pandas", - "pyarrow>=15.0.0", - "pyyaml>=5.1", - "requests>=2.32.2", - "tqdm>=4.66.3", - "xxhash", -] -files = [ - {file = "datasets-2.21.0-py3-none-any.whl", hash = "sha256:25e4e097110ce28824b746a107727ada94024cba11db8bc588d468414692b65a"}, - {file = "datasets-2.21.0.tar.gz", hash = "sha256:998f85a8460f1bd982e5bd058f8a0808eef424249e3df1e8cdd594ccd0dc8ba2"}, -] - [[package]] name = "datura" version = "0.1.2" @@ -510,14 +515,12 @@ requires_python = "==3.11.*" path = "../../datura" summary = "Compute subnet shared library" groups = ["default"] -marker = "python_full_version == \"3.11.10\"" [[package]] name = "ddt" version = "1.6.0" summary = "Data-Driven/Decorated Tests" groups = ["default"] -marker = "python_full_version == \"3.11.10\"" dependencies = [ "enum34; python_version < \"3\"", ] @@ -532,31 +535,17 @@ version = "5.1.1" requires_python = ">=3.5" summary = "Decorators for Humans" groups = ["default"] -marker = "python_full_version == \"3.11.10\"" 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 = "dill" -version = "0.3.8" -requires_python = ">=3.8" -summary = "serialize all of Python" -groups = ["default"] -marker = "python_full_version == \"3.11.10\"" -files = [ - {file = "dill-0.3.8-py3-none-any.whl", hash = "sha256:c36ca9ffb54365bdd2f8eb3eff7d2a21237f8452b57ace88b1ac615b7e815bd7"}, - {file = "dill-0.3.8.tar.gz", hash = "sha256:3ebe3c479ad625c4553aca177444d89b486b1d84982eeacded644afc0cf797ca"}, -] - [[package]] name = "ecdsa" version = "0.19.0" requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.6" summary = "ECDSA cryptographic signature library (pure python)" groups = ["default"] -marker = "python_full_version == \"3.11.10\"" dependencies = [ "six>=1.9.0", ] @@ -571,7 +560,6 @@ version = "0.7.0" requires_python = ">=3.8, <4" summary = "eth-hash: The Ethereum hashing function, keccak256, sometimes (erroneously) called sha3" groups = ["default"] -marker = "python_full_version == \"3.11.10\"" files = [ {file = "eth-hash-0.7.0.tar.gz", hash = "sha256:bacdc705bfd85dadd055ecd35fd1b4f846b671add101427e089a4ca2e8db310a"}, {file = "eth_hash-0.7.0-py3-none-any.whl", hash = "sha256:b8d5a230a2b251f4a291e3164a23a14057c4a6de4b0aa4a16fa4dc9161b57e2f"}, @@ -583,7 +571,6 @@ version = "0.5.1" requires_python = "<4,>=3.8" summary = "eth-keys: Common API for Ethereum key operations" groups = ["default"] -marker = "python_full_version == \"3.11.10\"" dependencies = [ "eth-typing>=3", "eth-utils>=2", @@ -599,7 +586,6 @@ version = "5.0.0" requires_python = "<4,>=3.8" summary = "eth-typing: Common type annotations for ethereum python packages" groups = ["default"] -marker = "python_full_version == \"3.11.10\"" dependencies = [ "typing-extensions>=4.5.0", ] @@ -614,7 +600,6 @@ version = "2.2.2" requires_python = ">=3.7,<4" summary = "eth-utils: Common utility functions for python code that interacts with Ethereum" groups = ["default"] -marker = "python_full_version == \"3.11.10\"" dependencies = [ "cached-property<2,>=1.5.2; python_version < \"3.8\"", "cytoolz>=0.10.1; implementation_name == \"cpython\"", @@ -633,7 +618,6 @@ version = "0.110.3" requires_python = ">=3.8" summary = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" groups = ["default"] -marker = "python_full_version == \"3.11.10\"" dependencies = [ "pydantic!=1.8,!=1.8.1,!=2.0.0,!=2.0.1,!=2.1.0,<3.0.0,>=1.7.4", "starlette<0.38.0,>=0.37.2", @@ -650,7 +634,6 @@ version = "3.15.4" requires_python = ">=3.8" summary = "A platform independent file lock." groups = ["default"] -marker = "python_full_version == \"3.11.10\"" files = [ {file = "filelock-3.15.4-py3-none-any.whl", hash = "sha256:6ca1fffae96225dab4c6eaf1c4f4f28cd2568d3ec2a44e15a08520504de468e7"}, {file = "filelock-3.15.4.tar.gz", hash = "sha256:2207938cbc1844345cb01a5a95524dae30f0ce089eba5b00378295a17e3e90cb"}, @@ -662,7 +645,6 @@ version = "1.4.1" requires_python = ">=3.8" summary = "A list-like structure which implements collections.abc.MutableSequence" groups = ["default"] -marker = "python_full_version == \"3.11.10\"" files = [ {file = "frozenlist-1.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a0cb6f11204443f27a1628b0e460f37fb30f624be6051d490fa7d7e26d4af3d0"}, {file = "frozenlist-1.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b46c8ae3a8f1f41a0d2ef350c0b6e65822d80772fe46b653ab6b6274f61d4a49"}, @@ -689,24 +671,6 @@ version = "2024.6.1" requires_python = ">=3.8" summary = "File-system specification" groups = ["default"] -marker = "python_full_version == \"3.11.10\"" -files = [ - {file = "fsspec-2024.6.1-py3-none-any.whl", hash = "sha256:3cb443f8bcd2efb31295a5b9fdb02aee81d8452c80d28f97a6d0959e6cee101e"}, - {file = "fsspec-2024.6.1.tar.gz", hash = "sha256:fad7d7e209dd4c1208e3bbfda706620e0da5142bebbd9c384afb95b07e798e49"}, -] - -[[package]] -name = "fsspec" -version = "2024.6.1" -extras = ["http"] -requires_python = ">=3.8" -summary = "File-system specification" -groups = ["default"] -marker = "python_full_version == \"3.11.10\"" -dependencies = [ - "aiohttp!=4.0.0a0,!=4.0.0a1", - "fsspec==2024.6.1", -] files = [ {file = "fsspec-2024.6.1-py3-none-any.whl", hash = "sha256:3cb443f8bcd2efb31295a5b9fdb02aee81d8452c80d28f97a6d0959e6cee101e"}, {file = "fsspec-2024.6.1.tar.gz", hash = "sha256:fad7d7e209dd4c1208e3bbfda706620e0da5142bebbd9c384afb95b07e798e49"}, @@ -717,7 +681,6 @@ name = "fuzzywuzzy" version = "0.18.0" summary = "Fuzzy string matching in python" groups = ["default"] -marker = "python_full_version == \"3.11.10\"" files = [ {file = "fuzzywuzzy-0.18.0-py2.py3-none-any.whl", hash = "sha256:928244b28db720d1e0ee7587acf660ea49d7e4c632569cad4f1cd7e68a5f0993"}, {file = "fuzzywuzzy-0.18.0.tar.gz", hash = "sha256:45016e92264780e58972dca1b3d939ac864b78437422beecebb3095f8efd00e8"}, @@ -729,7 +692,6 @@ version = "3.0.3" requires_python = ">=3.7" summary = "Lightweight in-process concurrent programming" groups = ["default"] -marker = "(platform_machine == \"win32\" or platform_machine == \"WIN32\" or platform_machine == \"AMD64\" or platform_machine == \"amd64\" or platform_machine == \"x86_64\" or platform_machine == \"ppc64le\" or platform_machine == \"aarch64\") and python_full_version == \"3.11.10\"" files = [ {file = "greenlet-3.0.3-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:b1b5667cced97081bf57b8fa1d6bfca67814b0afd38208d52538316e9422fc61"}, {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:52f59dd9c96ad2fc0d5724107444f76eb20aaccb675bf825df6435acb7703559"}, @@ -749,7 +711,6 @@ version = "0.14.0" requires_python = ">=3.7" summary = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" groups = ["default"] -marker = "python_full_version == \"3.11.10\"" dependencies = [ "typing-extensions; python_version < \"3.8\"", ] @@ -759,24 +720,36 @@ files = [ ] [[package]] -name = "huggingface-hub" -version = "0.24.5" -requires_python = ">=3.8.0" -summary = "Client library to download and publish models, datasets and other repos on the huggingface.co hub" +name = "httpcore" +version = "1.0.5" +requires_python = ">=3.8" +summary = "A minimal low-level HTTP client." groups = ["default"] -marker = "python_full_version == \"3.11.10\"" dependencies = [ - "filelock", - "fsspec>=2023.5.0", - "packaging>=20.9", - "pyyaml>=5.1", - "requests", - "tqdm>=4.42.1", - "typing-extensions>=3.7.4.3", + "certifi", + "h11<0.15,>=0.13", ] files = [ - {file = "huggingface_hub-0.24.5-py3-none-any.whl", hash = "sha256:d93fb63b1f1a919a22ce91a14518974e81fc4610bf344dfe7572343ce8d3aced"}, - {file = "huggingface_hub-0.24.5.tar.gz", hash = "sha256:7b45d6744dd53ce9cbf9880957de00e9d10a9ae837f1c9b7255fc8fa4e8264f3"}, + {file = "httpcore-1.0.5-py3-none-any.whl", hash = "sha256:421f18bac248b25d310f3cacd198d55b8e6125c107797b609ff9b7a6ba7991b5"}, + {file = "httpcore-1.0.5.tar.gz", hash = "sha256:34a38e2f9291467ee3b44e89dd52615370e152954ba21721378a87b2960f7a61"}, +] + +[[package]] +name = "httpx" +version = "0.27.0" +requires_python = ">=3.8" +summary = "The next generation HTTP client." +groups = ["default"] +dependencies = [ + "anyio", + "certifi", + "httpcore==1.*", + "idna", + "sniffio", +] +files = [ + {file = "httpx-0.27.0-py3-none-any.whl", hash = "sha256:71d5465162c13681bff01ad59b2cc68dd838ea1f10e51574bac27103f00c91a5"}, + {file = "httpx-0.27.0.tar.gz", hash = "sha256:a0cb88a46f32dc874e04ee956e4c2764aba2aa228f650b06788ba6bda2962ab5"}, ] [[package]] @@ -785,19 +758,28 @@ version = "3.7" requires_python = ">=3.5" summary = "Internationalized Domain Names in Applications (IDNA)" groups = ["default"] -marker = "python_full_version == \"3.11.10\"" files = [ {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, ] +[[package]] +name = "iniconfig" +version = "2.0.0" +requires_python = ">=3.7" +summary = "brain-dead simple config-ini parsing" +groups = ["default"] +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] + [[package]] name = "jinja2" version = "3.1.4" requires_python = ">=3.7" summary = "A very fast and expressive template engine." groups = ["default"] -marker = "python_full_version == \"3.11.10\"" dependencies = [ "MarkupSafe>=2.0", ] @@ -812,7 +794,6 @@ version = "0.25.1" requires_python = ">=3.8" summary = "Python extension for computing string edit distances and similarities." groups = ["default"] -marker = "python_full_version == \"3.11.10\"" dependencies = [ "rapidfuzz<4.0.0,>=3.8.0", ] @@ -842,7 +823,6 @@ version = "1.3.5" requires_python = ">=3.8" summary = "A super-fast templating language that borrows the best ideas from the existing templating languages." groups = ["default"] -marker = "python_full_version == \"3.11.10\"" dependencies = [ "MarkupSafe>=0.9.2", ] @@ -857,7 +837,6 @@ version = "3.0.0" requires_python = ">=3.8" summary = "Python port of markdown-it. Markdown parsing, done right!" groups = ["default"] -marker = "python_full_version == \"3.11.10\"" dependencies = [ "mdurl~=0.1", ] @@ -872,7 +851,6 @@ version = "2.1.5" requires_python = ">=3.7" summary = "Safely add untrusted strings to HTML/XML markup." groups = ["default"] -marker = "python_full_version == \"3.11.10\"" files = [ {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"}, {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"}, @@ -893,7 +871,6 @@ version = "0.1.2" requires_python = ">=3.7" summary = "Markdown URL utilities" groups = ["default"] -marker = "python_full_version == \"3.11.10\"" files = [ {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, @@ -905,7 +882,6 @@ version = "10.4.0" requires_python = ">=3.8" summary = "More routines for operating on iterables, beyond itertools" groups = ["default"] -marker = "python_full_version == \"3.11.10\"" files = [ {file = "more-itertools-10.4.0.tar.gz", hash = "sha256:fe0e63c4ab068eac62410ab05cccca2dc71ec44ba8ef29916a0090df061cf923"}, {file = "more_itertools-10.4.0-py3-none-any.whl", hash = "sha256:0f7d9f83a0a8dcfa8a2694a770590d98a67ea943e3d9f5298309a484758c4e27"}, @@ -916,7 +892,6 @@ name = "mpmath" version = "1.3.0" summary = "Python library for arbitrary-precision floating-point arithmetic" groups = ["default"] -marker = "python_full_version == \"3.11.10\"" files = [ {file = "mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c"}, {file = "mpmath-1.3.0.tar.gz", hash = "sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f"}, @@ -928,7 +903,6 @@ version = "1.0.8" requires_python = ">=3.8" summary = "MessagePack serializer" groups = ["default"] -marker = "python_full_version == \"3.11.10\"" files = [ {file = "msgpack-1.0.8-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9517004e21664f2b5a5fd6333b0731b9cf0817403a941b393d89a2f1dc2bd836"}, {file = "msgpack-1.0.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d16a786905034e7e34098634b184a7d81f91d4c3d246edc6bd7aefb2fd8ea6ad"}, @@ -949,7 +923,6 @@ name = "msgpack-numpy-opentensor" version = "0.5.0" summary = "Numpy data serialization using msgpack" groups = ["default"] -marker = "python_full_version == \"3.11.10\"" dependencies = [ "msgpack>=0.5.2", "numpy>=1.9.0", @@ -965,7 +938,6 @@ version = "6.0.5" requires_python = ">=3.7" summary = "multidict implementation" groups = ["default"] -marker = "python_full_version == \"3.11.10\"" files = [ {file = "multidict-6.0.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f285e862d2f153a70586579c15c44656f888806ed0e5b56b64489afe4a2dbfba"}, {file = "multidict-6.0.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:53689bb4e102200a4fafa9de9c7c3c212ab40a7ab2c8e474491914d2305f187e"}, @@ -986,27 +958,11 @@ files = [ {file = "multidict-6.0.5.tar.gz", hash = "sha256:f7e301075edaf50500f0b341543c41194d8df3ae5caf4702f2095f3ca73dd8da"}, ] -[[package]] -name = "multiprocess" -version = "0.70.16" -requires_python = ">=3.8" -summary = "better multiprocessing and multithreading in Python" -groups = ["default"] -marker = "python_full_version == \"3.11.10\"" -dependencies = [ - "dill>=0.3.8", -] -files = [ - {file = "multiprocess-0.70.16-py311-none-any.whl", hash = "sha256:af4cabb0dac72abfb1e794fa7855c325fd2b55a10a44628a3c1ad3311c04127a"}, - {file = "multiprocess-0.70.16.tar.gz", hash = "sha256:161af703d4652a0e1410be6abccecde4a7ddffd19341be0a7011b94aeb171ac1"}, -] - [[package]] name = "munch" version = "2.5.0" summary = "A dot-accessible dictionary (a la JavaScript objects)" groups = ["default"] -marker = "python_full_version == \"3.11.10\"" dependencies = [ "six", ] @@ -1021,7 +977,6 @@ version = "1.6.0" requires_python = ">=3.5" summary = "Patch asyncio to allow nested event loops" groups = ["default"] -marker = "python_full_version == \"3.11.10\"" files = [ {file = "nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c"}, {file = "nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe"}, @@ -1033,7 +988,6 @@ version = "1.3.0" requires_python = ">=3.7" summary = "A network address manipulation library for Python" groups = ["default"] -marker = "python_full_version == \"3.11.10\"" files = [ {file = "netaddr-1.3.0-py3-none-any.whl", hash = "sha256:c2c6a8ebe5554ce33b7d5b3a306b71bbb373e000bbbf2350dd5213cc56e3dbbe"}, {file = "netaddr-1.3.0.tar.gz", hash = "sha256:5c3c3d9895b551b763779ba7db7a03487dc1f8e3b385af819af341ae9ef6e48a"}, @@ -1045,7 +999,6 @@ version = "3.3" requires_python = ">=3.10" summary = "Python package for creating and manipulating graphs and networks" groups = ["default"] -marker = "python_full_version == \"3.11.10\"" files = [ {file = "networkx-3.3-py3-none-any.whl", hash = "sha256:28575580c6ebdaf4505b22c6256a2b9de86b316dc63ba9e93abde3d78dfdbcf2"}, {file = "networkx-3.3.tar.gz", hash = "sha256:0c127d8b2f4865f59ae9cb8aafcd60b5c70f3241ebd66f7defad7c4ab90126c9"}, @@ -1053,177 +1006,21 @@ files = [ [[package]] name = "numpy" -version = "1.26.4" -requires_python = ">=3.9" +version = "2.1.0" +requires_python = ">=3.10" summary = "Fundamental package for array computing in Python" groups = ["default"] -marker = "python_full_version == \"3.11.10\"" -files = [ - {file = "numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71"}, - {file = "numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef"}, - {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e"}, - {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5"}, - {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a"}, - {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a"}, - {file = "numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20"}, - {file = "numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2"}, - {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"}, -] - -[[package]] -name = "nvidia-cublas-cu12" -version = "12.1.3.1" -requires_python = ">=3" -summary = "CUBLAS native runtime libraries" -groups = ["default"] -marker = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and python_full_version == \"3.11.10\"" files = [ - {file = "nvidia_cublas_cu12-12.1.3.1-py3-none-manylinux1_x86_64.whl", hash = "sha256:ee53ccca76a6fc08fb9701aa95b6ceb242cdaab118c3bb152af4e579af792728"}, - {file = "nvidia_cublas_cu12-12.1.3.1-py3-none-win_amd64.whl", hash = "sha256:2b964d60e8cf11b5e1073d179d85fa340c120e99b3067558f3cf98dd69d02906"}, -] - -[[package]] -name = "nvidia-cuda-cupti-cu12" -version = "12.1.105" -requires_python = ">=3" -summary = "CUDA profiling tools runtime libs." -groups = ["default"] -marker = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and python_full_version == \"3.11.10\"" -files = [ - {file = "nvidia_cuda_cupti_cu12-12.1.105-py3-none-manylinux1_x86_64.whl", hash = "sha256:e54fde3983165c624cb79254ae9818a456eb6e87a7fd4d56a2352c24ee542d7e"}, - {file = "nvidia_cuda_cupti_cu12-12.1.105-py3-none-win_amd64.whl", hash = "sha256:bea8236d13a0ac7190bd2919c3e8e6ce1e402104276e6f9694479e48bb0eb2a4"}, -] - -[[package]] -name = "nvidia-cuda-nvrtc-cu12" -version = "12.1.105" -requires_python = ">=3" -summary = "NVRTC native runtime libraries" -groups = ["default"] -marker = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and python_full_version == \"3.11.10\"" -files = [ - {file = "nvidia_cuda_nvrtc_cu12-12.1.105-py3-none-manylinux1_x86_64.whl", hash = "sha256:339b385f50c309763ca65456ec75e17bbefcbbf2893f462cb8b90584cd27a1c2"}, - {file = "nvidia_cuda_nvrtc_cu12-12.1.105-py3-none-win_amd64.whl", hash = "sha256:0a98a522d9ff138b96c010a65e145dc1b4850e9ecb75a0172371793752fd46ed"}, -] - -[[package]] -name = "nvidia-cuda-runtime-cu12" -version = "12.1.105" -requires_python = ">=3" -summary = "CUDA Runtime native Libraries" -groups = ["default"] -marker = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and python_full_version == \"3.11.10\"" -files = [ - {file = "nvidia_cuda_runtime_cu12-12.1.105-py3-none-manylinux1_x86_64.whl", hash = "sha256:6e258468ddf5796e25f1dc591a31029fa317d97a0a94ed93468fc86301d61e40"}, - {file = "nvidia_cuda_runtime_cu12-12.1.105-py3-none-win_amd64.whl", hash = "sha256:dfb46ef84d73fababab44cf03e3b83f80700d27ca300e537f85f636fac474344"}, -] - -[[package]] -name = "nvidia-cudnn-cu12" -version = "9.1.0.70" -requires_python = ">=3" -summary = "cuDNN runtime libraries" -groups = ["default"] -marker = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and python_full_version == \"3.11.10\"" -dependencies = [ - "nvidia-cublas-cu12", -] -files = [ - {file = "nvidia_cudnn_cu12-9.1.0.70-py3-none-manylinux2014_x86_64.whl", hash = "sha256:165764f44ef8c61fcdfdfdbe769d687e06374059fbb388b6c89ecb0e28793a6f"}, - {file = "nvidia_cudnn_cu12-9.1.0.70-py3-none-win_amd64.whl", hash = "sha256:6278562929433d68365a07a4a1546c237ba2849852c0d4b2262a486e805b977a"}, -] - -[[package]] -name = "nvidia-cufft-cu12" -version = "11.0.2.54" -requires_python = ">=3" -summary = "CUFFT native runtime libraries" -groups = ["default"] -marker = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and python_full_version == \"3.11.10\"" -files = [ - {file = "nvidia_cufft_cu12-11.0.2.54-py3-none-manylinux1_x86_64.whl", hash = "sha256:794e3948a1aa71fd817c3775866943936774d1c14e7628c74f6f7417224cdf56"}, - {file = "nvidia_cufft_cu12-11.0.2.54-py3-none-win_amd64.whl", hash = "sha256:d9ac353f78ff89951da4af698f80870b1534ed69993f10a4cf1d96f21357e253"}, -] - -[[package]] -name = "nvidia-curand-cu12" -version = "10.3.2.106" -requires_python = ">=3" -summary = "CURAND native runtime libraries" -groups = ["default"] -marker = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and python_full_version == \"3.11.10\"" -files = [ - {file = "nvidia_curand_cu12-10.3.2.106-py3-none-manylinux1_x86_64.whl", hash = "sha256:9d264c5036dde4e64f1de8c50ae753237c12e0b1348738169cd0f8a536c0e1e0"}, - {file = "nvidia_curand_cu12-10.3.2.106-py3-none-win_amd64.whl", hash = "sha256:75b6b0c574c0037839121317e17fd01f8a69fd2ef8e25853d826fec30bdba74a"}, -] - -[[package]] -name = "nvidia-cusolver-cu12" -version = "11.4.5.107" -requires_python = ">=3" -summary = "CUDA solver native runtime libraries" -groups = ["default"] -marker = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and python_full_version == \"3.11.10\"" -dependencies = [ - "nvidia-cublas-cu12", - "nvidia-cusparse-cu12", - "nvidia-nvjitlink-cu12", -] -files = [ - {file = "nvidia_cusolver_cu12-11.4.5.107-py3-none-manylinux1_x86_64.whl", hash = "sha256:8a7ec542f0412294b15072fa7dab71d31334014a69f953004ea7a118206fe0dd"}, - {file = "nvidia_cusolver_cu12-11.4.5.107-py3-none-win_amd64.whl", hash = "sha256:74e0c3a24c78612192a74fcd90dd117f1cf21dea4822e66d89e8ea80e3cd2da5"}, -] - -[[package]] -name = "nvidia-cusparse-cu12" -version = "12.1.0.106" -requires_python = ">=3" -summary = "CUSPARSE native runtime libraries" -groups = ["default"] -marker = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and python_full_version == \"3.11.10\"" -dependencies = [ - "nvidia-nvjitlink-cu12", -] -files = [ - {file = "nvidia_cusparse_cu12-12.1.0.106-py3-none-manylinux1_x86_64.whl", hash = "sha256:f3b50f42cf363f86ab21f720998517a659a48131e8d538dc02f8768237bd884c"}, - {file = "nvidia_cusparse_cu12-12.1.0.106-py3-none-win_amd64.whl", hash = "sha256:b798237e81b9719373e8fae8d4f091b70a0cf09d9d85c95a557e11df2d8e9a5a"}, -] - -[[package]] -name = "nvidia-nccl-cu12" -version = "2.20.5" -requires_python = ">=3" -summary = "NVIDIA Collective Communication Library (NCCL) Runtime" -groups = ["default"] -marker = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and python_full_version == \"3.11.10\"" -files = [ - {file = "nvidia_nccl_cu12-2.20.5-py3-none-manylinux2014_aarch64.whl", hash = "sha256:1fc150d5c3250b170b29410ba682384b14581db722b2531b0d8d33c595f33d01"}, - {file = "nvidia_nccl_cu12-2.20.5-py3-none-manylinux2014_x86_64.whl", hash = "sha256:057f6bf9685f75215d0c53bf3ac4a10b3e6578351de307abad9e18a99182af56"}, -] - -[[package]] -name = "nvidia-nvjitlink-cu12" -version = "12.6.20" -requires_python = ">=3" -summary = "Nvidia JIT LTO Library" -groups = ["default"] -marker = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and python_full_version == \"3.11.10\"" -files = [ - {file = "nvidia_nvjitlink_cu12-12.6.20-py3-none-manylinux2014_aarch64.whl", hash = "sha256:84fb38465a5bc7c70cbc320cfd0963eb302ee25a5e939e9f512bbba55b6072fb"}, - {file = "nvidia_nvjitlink_cu12-12.6.20-py3-none-manylinux2014_x86_64.whl", hash = "sha256:562ab97ea2c23164823b2a89cb328d01d45cb99634b8c65fe7cd60d14562bd79"}, - {file = "nvidia_nvjitlink_cu12-12.6.20-py3-none-win_amd64.whl", hash = "sha256:ed3c43a17f37b0c922a919203d2d36cbef24d41cc3e6b625182f8b58203644f6"}, -] - -[[package]] -name = "nvidia-nvtx-cu12" -version = "12.1.105" -requires_python = ">=3" -summary = "NVIDIA Tools Extension" -groups = ["default"] -marker = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and python_full_version == \"3.11.10\"" -files = [ - {file = "nvidia_nvtx_cu12-12.1.105-py3-none-manylinux1_x86_64.whl", hash = "sha256:dc21cf308ca5691e7c04d962e213f8a4aa9bbfa23d95412f452254c2caeb09e5"}, - {file = "nvidia_nvtx_cu12-12.1.105-py3-none-win_amd64.whl", hash = "sha256:65f4d98982b31b60026e0e6de73fbdfc09d08a96f4656dd3665ca616a11e1e82"}, + {file = "numpy-2.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:76368c788ccb4f4782cf9c842b316140142b4cbf22ff8db82724e82fe1205dce"}, + {file = "numpy-2.1.0-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:f8e93a01a35be08d31ae33021e5268f157a2d60ebd643cfc15de6ab8e4722eb1"}, + {file = "numpy-2.1.0-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:9523f8b46485db6939bd069b28b642fec86c30909cea90ef550373787f79530e"}, + {file = "numpy-2.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54139e0eb219f52f60656d163cbe67c31ede51d13236c950145473504fa208cb"}, + {file = "numpy-2.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5ebbf9fbdabed208d4ecd2e1dfd2c0741af2f876e7ae522c2537d404ca895c3"}, + {file = "numpy-2.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:378cb4f24c7d93066ee4103204f73ed046eb88f9ad5bb2275bb9fa0f6a02bd36"}, + {file = "numpy-2.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8f699a709120b220dfe173f79c73cb2a2cab2c0b88dd59d7b49407d032b8ebd"}, + {file = "numpy-2.1.0-cp311-cp311-win32.whl", hash = "sha256:ffbd6faeb190aaf2b5e9024bac9622d2ee549b7ec89ef3a9373fa35313d44e0e"}, + {file = "numpy-2.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:0af3a5987f59d9c529c022c8c2a64805b339b7ef506509fba7d0556649b9714b"}, + {file = "numpy-2.1.0.tar.gz", hash = "sha256:7dc90da0081f7e1da49ec4e398ede6a8e9cc4f5ebe5f9e06b443ed889ee9aaa2"}, ] [[package]] @@ -1232,44 +1029,16 @@ version = "24.1" requires_python = ">=3.8" summary = "Core utilities for Python packages" groups = ["default"] -marker = "python_full_version == \"3.11.10\"" files = [ {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, ] -[[package]] -name = "pandas" -version = "2.2.2" -requires_python = ">=3.9" -summary = "Powerful data structures for data analysis, time series, and statistics" -groups = ["default"] -marker = "python_full_version == \"3.11.10\"" -dependencies = [ - "numpy>=1.22.4; python_version < \"3.11\"", - "numpy>=1.23.2; python_version == \"3.11\"", - "numpy>=1.26.0; python_version >= \"3.12\"", - "python-dateutil>=2.8.2", - "pytz>=2020.1", - "tzdata>=2022.7", -] -files = [ - {file = "pandas-2.2.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:696039430f7a562b74fa45f540aca068ea85fa34c244d0deee539cb6d70aa288"}, - {file = "pandas-2.2.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8e90497254aacacbc4ea6ae5e7a8cd75629d6ad2b30025a4a8b09aa4faf55151"}, - {file = "pandas-2.2.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58b84b91b0b9f4bafac2a0ac55002280c094dfc6402402332c0913a59654ab2b"}, - {file = "pandas-2.2.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d2123dc9ad6a814bcdea0f099885276b31b24f7edf40f6cdbc0912672e22eee"}, - {file = "pandas-2.2.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:2925720037f06e89af896c70bca73459d7e6a4be96f9de79e2d440bd499fe0db"}, - {file = "pandas-2.2.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0cace394b6ea70c01ca1595f839cf193df35d1575986e484ad35c4aeae7266c1"}, - {file = "pandas-2.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:873d13d177501a28b2756375d59816c365e42ed8417b41665f346289adc68d24"}, - {file = "pandas-2.2.2.tar.gz", hash = "sha256:9e79019aba43cb4fda9e4d983f8e88ca0373adbb697ae9c6c43093218de28b54"}, -] - [[package]] name = "password-strength" version = "0.0.3.post2" summary = "Password strength and validation " groups = ["default"] -marker = "python_full_version == \"3.11.10\"" dependencies = [ "six", ] @@ -1278,13 +1047,23 @@ files = [ {file = "password_strength-0.0.3.post2.tar.gz", hash = "sha256:bf4df10a58fcd3abfa182367307b4fd7b1cec518121dd83bf80c1c42ba796762"}, ] +[[package]] +name = "pluggy" +version = "1.5.0" +requires_python = ">=3.8" +summary = "plugin and hook calling mechanisms for python" +groups = ["default"] +files = [ + {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, + {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, +] + [[package]] name = "psycopg2-binary" version = "2.9.9" requires_python = ">=3.7" summary = "psycopg2 - Python-PostgreSQL Database Adapter" groups = ["default"] -marker = "python_full_version == \"3.11.10\"" files = [ {file = "psycopg2-binary-2.9.9.tar.gz", hash = "sha256:7f01846810177d829c7692f1f5ada8096762d9172af1b1a28d4ab5b77c923c1c"}, {file = "psycopg2_binary-2.9.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ee825e70b1a209475622f7f7b776785bd68f34af6e7a46e2e42f27b659b5bc26"}, @@ -1307,7 +1086,6 @@ version = "1.11.0" requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" summary = "library with cross-python path, ini-parsing, io, code, log facilities" groups = ["default"] -marker = "python_full_version == \"3.11.10\"" files = [ {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, @@ -1318,7 +1096,6 @@ name = "py-bip39-bindings" version = "0.1.11" summary = "Python bindings for tiny-bip39 RUST crate" groups = ["default"] -marker = "python_full_version == \"3.11.10\"" files = [ {file = "py_bip39_bindings-0.1.11-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:27cce22727e28705a660464689ade6d2cdad4e622bead5bde2ffa53c4f605ee5"}, {file = "py_bip39_bindings-0.1.11-cp311-cp311-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:cdf35d031587296dcbdb22dbc67f2eaf5b5df9d5036b77fbeb93affbb9eec8d3"}, @@ -1338,7 +1115,6 @@ name = "py-ed25519-zebra-bindings" version = "1.0.1" summary = "Python bindings for the ed25519-zebra RUST crate" groups = ["default"] -marker = "python_full_version == \"3.11.10\"" files = [ {file = "py_ed25519_zebra_bindings-1.0.1-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:e249b0d57187077859652a1119b315dec49e4d458c9795a7aeb2381799ce34e6"}, {file = "py_ed25519_zebra_bindings-1.0.1-cp311-cp311-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:50d383684b650d92f93e1482891ce0c1c2011d2ca3b0821b5b049d6bb35dca3e"}, @@ -1357,7 +1133,6 @@ name = "py-sr25519-bindings" version = "0.2.0" summary = "Python bindings for sr25519 library" groups = ["default"] -marker = "python_full_version == \"3.11.10\"" files = [ {file = "py_sr25519_bindings-0.2.0-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:54e8c41081a4c23eca4b19f52de2514c48ddec6f49844dff7ad4cfac0bc11712"}, {file = "py_sr25519_bindings-0.2.0-cp311-cp311-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:6c73bd1a87849db9cd0e664b2d2e14208183dd8d11ac083d70e688fc28283a71"}, @@ -1370,34 +1145,12 @@ files = [ {file = "py_sr25519_bindings-0.2.0.tar.gz", hash = "sha256:0c2fe92b7cdcebf6c5611a90054f8ba6ea90b68b8832896d2dc565537bc40b0c"}, ] -[[package]] -name = "pyarrow" -version = "17.0.0" -requires_python = ">=3.8" -summary = "Python library for Apache Arrow" -groups = ["default"] -marker = "python_full_version == \"3.11.10\"" -dependencies = [ - "numpy>=1.16.6", -] -files = [ - {file = "pyarrow-17.0.0-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:1c8856e2ef09eb87ecf937104aacfa0708f22dfeb039c363ec99735190ffb977"}, - {file = "pyarrow-17.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2e19f569567efcbbd42084e87f948778eb371d308e137a0f97afe19bb860ccb3"}, - {file = "pyarrow-17.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b244dc8e08a23b3e352899a006a26ae7b4d0da7bb636872fa8f5884e70acf15"}, - {file = "pyarrow-17.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b72e87fe3e1db343995562f7fff8aee354b55ee83d13afba65400c178ab2597"}, - {file = "pyarrow-17.0.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:dc5c31c37409dfbc5d014047817cb4ccd8c1ea25d19576acf1a001fe07f5b420"}, - {file = "pyarrow-17.0.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:e3343cb1e88bc2ea605986d4b94948716edc7a8d14afd4e2c097232f729758b4"}, - {file = "pyarrow-17.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:a27532c38f3de9eb3e90ecab63dfda948a8ca859a66e3a47f5f42d1e403c4d03"}, - {file = "pyarrow-17.0.0.tar.gz", hash = "sha256:4beca9521ed2c0921c1023e68d097d0299b62c362639ea315572a58f3f50fd28"}, -] - [[package]] name = "pycparser" version = "2.22" requires_python = ">=3.8" summary = "C parser in Python" groups = ["default"] -marker = "python_full_version == \"3.11.10\"" files = [ {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, @@ -1409,7 +1162,6 @@ version = "3.20.0" requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" summary = "Cryptographic library for Python" groups = ["default"] -marker = "python_full_version == \"3.11.10\"" files = [ {file = "pycryptodome-3.20.0-cp35-abi3-macosx_10_9_universal2.whl", hash = "sha256:ac1c7c0624a862f2e53438a15c9259d1655325fc2ec4392e66dc46cdae24d044"}, {file = "pycryptodome-3.20.0-cp35-abi3-macosx_10_9_x86_64.whl", hash = "sha256:76658f0d942051d12a9bd08ca1b6b34fd762a8ee4240984f7c06ddfb55eaf15a"}, @@ -1430,7 +1182,6 @@ version = "2.8.2" requires_python = ">=3.8" summary = "Data validation using Python type hints" groups = ["default"] -marker = "python_full_version == \"3.11.10\"" dependencies = [ "annotated-types>=0.4.0", "pydantic-core==2.20.1", @@ -1448,7 +1199,6 @@ version = "2.20.1" requires_python = ">=3.8" summary = "Core functionality for Pydantic validation and serialization" groups = ["default"] -marker = "python_full_version == \"3.11.10\"" dependencies = [ "typing-extensions!=4.7.0,>=4.6.0", ] @@ -1474,7 +1224,6 @@ version = "2.4.0" requires_python = ">=3.8" summary = "Settings management using Pydantic" groups = ["default"] -marker = "python_full_version == \"3.11.10\"" dependencies = [ "pydantic>=2.7.0", "python-dotenv>=0.21.0", @@ -1490,7 +1239,6 @@ version = "2.18.0" requires_python = ">=3.8" summary = "Pygments is a syntax highlighting package written in Python." groups = ["default"] -marker = "python_full_version == \"3.11.10\"" files = [ {file = "pygments-2.18.0-py3-none-any.whl", hash = "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a"}, {file = "pygments-2.18.0.tar.gz", hash = "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199"}, @@ -1502,7 +1250,6 @@ version = "1.5.0" requires_python = ">=3.6" summary = "Python binding to the Networking and Cryptography (NaCl) library" groups = ["default"] -marker = "python_full_version == \"3.11.10\"" dependencies = [ "cffi>=1.4.1", ] @@ -1520,18 +1267,22 @@ files = [ ] [[package]] -name = "python-dateutil" -version = "2.9.0.post0" -requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" -summary = "Extensions to the standard Python datetime module" +name = "pytest" +version = "8.3.2" +requires_python = ">=3.8" +summary = "pytest: simple powerful testing with Python" groups = ["default"] -marker = "python_full_version == \"3.11.10\"" dependencies = [ - "six>=1.5", + "colorama; sys_platform == \"win32\"", + "exceptiongroup>=1.0.0rc8; python_version < \"3.11\"", + "iniconfig", + "packaging", + "pluggy<2,>=1.5", + "tomli>=1; python_version < \"3.11\"", ] files = [ - {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, - {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, + {file = "pytest-8.3.2-py3-none-any.whl", hash = "sha256:4ba08f9ae7dcf84ded419494d229b48d0903ea6407b030eaec46df5e6a73bba5"}, + {file = "pytest-8.3.2.tar.gz", hash = "sha256:c132345d12ce551242c87269de812483f5bcc87cdbb4722e48487ba194f9fdce"}, ] [[package]] @@ -1540,7 +1291,6 @@ version = "1.0.1" requires_python = ">=3.8" summary = "Read key-value pairs from a .env file and set them as environment variables" groups = ["default"] -marker = "python_full_version == \"3.11.10\"" files = [ {file = "python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca"}, {file = "python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"}, @@ -1552,7 +1302,6 @@ version = "0.25.1" requires_python = ">=3.8" summary = "Python extension for computing string edit distances and similarities." groups = ["default"] -marker = "python_full_version == \"3.11.10\"" dependencies = [ "Levenshtein==0.25.1", ] @@ -1567,30 +1316,17 @@ version = "2.1.2" requires_python = ">=3.7,<3.13" summary = "Python Finite State Machines made easy." groups = ["default"] -marker = "python_full_version == \"3.11.10\"" files = [ {file = "python_statemachine-2.1.2-py3-none-any.whl", hash = "sha256:d7e369d5da5b9007cc7cf5eb7a1b169081e2f4b7d30b6415fc122858fb7696ec"}, {file = "python_statemachine-2.1.2.tar.gz", hash = "sha256:0b0dd8b28738b53f14391b06d5072cd5e72259da5ae23574d3d4f5e6dd366663"}, ] -[[package]] -name = "pytz" -version = "2024.1" -summary = "World timezone definitions, modern and historical" -groups = ["default"] -marker = "python_full_version == \"3.11.10\"" -files = [ - {file = "pytz-2024.1-py2.py3-none-any.whl", hash = "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319"}, - {file = "pytz-2024.1.tar.gz", hash = "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812"}, -] - [[package]] name = "pyyaml" version = "6.0.2" requires_python = ">=3.8" summary = "YAML parser and emitter for Python" groups = ["default"] -marker = "python_full_version == \"3.11.10\"" files = [ {file = "PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774"}, {file = "PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee"}, @@ -1610,7 +1346,6 @@ version = "3.9.6" requires_python = ">=3.8" summary = "rapid fuzzy string matching" groups = ["default"] -marker = "python_full_version == \"3.11.10\"" files = [ {file = "rapidfuzz-3.9.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:52e4675f642fbc85632f691b67115a243cd4d2a47bdcc4a3d9a79e784518ff97"}, {file = "rapidfuzz-3.9.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1f93a2f13038700bd245b927c46a2017db3dcd4d4ff94687d74b5123689b873b"}, @@ -1631,29 +1366,19 @@ files = [ ] [[package]] -name = "regex" -version = "2024.7.24" -requires_python = ">=3.8" -summary = "Alternative regular expression module, to replace re." +name = "redis" +version = "5.0.8" +requires_python = ">=3.7" +summary = "Python client for Redis database and key-value store" groups = ["default"] -marker = "python_full_version == \"3.11.10\"" +dependencies = [ + "async-timeout>=4.0.3; python_full_version < \"3.11.3\"", + "importlib-metadata>=1.0; python_version < \"3.8\"", + "typing-extensions; python_version < \"3.8\"", +] files = [ - {file = "regex-2024.7.24-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:382281306e3adaaa7b8b9ebbb3ffb43358a7bbf585fa93821300a418bb975281"}, - {file = "regex-2024.7.24-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4fdd1384619f406ad9037fe6b6eaa3de2749e2e12084abc80169e8e075377d3b"}, - {file = "regex-2024.7.24-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3d974d24edb231446f708c455fd08f94c41c1ff4f04bcf06e5f36df5ef50b95a"}, - {file = "regex-2024.7.24-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a2ec4419a3fe6cf8a4795752596dfe0adb4aea40d3683a132bae9c30b81e8d73"}, - {file = "regex-2024.7.24-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb563dd3aea54c797adf513eeec819c4213d7dbfc311874eb4fd28d10f2ff0f2"}, - {file = "regex-2024.7.24-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:45104baae8b9f67569f0f1dca5e1f1ed77a54ae1cd8b0b07aba89272710db61e"}, - {file = "regex-2024.7.24-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:994448ee01864501912abf2bad9203bffc34158e80fe8bfb5b031f4f8e16da51"}, - {file = "regex-2024.7.24-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3fac296f99283ac232d8125be932c5cd7644084a30748fda013028c815ba3364"}, - {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7e37e809b9303ec3a179085415cb5f418ecf65ec98cdfe34f6a078b46ef823ee"}, - {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:01b689e887f612610c869421241e075c02f2e3d1ae93a037cb14f88ab6a8934c"}, - {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f6442f0f0ff81775eaa5b05af8a0ffa1dda36e9cf6ec1e0d3d245e8564b684ce"}, - {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:871e3ab2838fbcb4e0865a6e01233975df3a15e6fce93b6f99d75cacbd9862d1"}, - {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c918b7a1e26b4ab40409820ddccc5d49871a82329640f5005f73572d5eaa9b5e"}, - {file = "regex-2024.7.24-cp311-cp311-win32.whl", hash = "sha256:2dfbb8baf8ba2c2b9aa2807f44ed272f0913eeeba002478c4577b8d29cde215c"}, - {file = "regex-2024.7.24-cp311-cp311-win_amd64.whl", hash = "sha256:538d30cd96ed7d1416d3956f94d54e426a8daf7c14527f6e0d6d425fcb4cca52"}, - {file = "regex-2024.7.24.tar.gz", hash = "sha256:9cfd009eed1a46b27c14039ad5bbc5e71b6367c5b2e6d5f5da0ea91600817506"}, + {file = "redis-5.0.8-py3-none-any.whl", hash = "sha256:56134ee08ea909106090934adc36f65c9bcbbaecea5b21ba704ba6fb561f8eb4"}, + {file = "redis-5.0.8.tar.gz", hash = "sha256:0c5b10d387568dfe0698c6fad6615750c24170e548ca2deac10c649d463e9870"}, ] [[package]] @@ -1662,7 +1387,6 @@ version = "2.32.3" requires_python = ">=3.8" summary = "Python HTTP for Humans." groups = ["default"] -marker = "python_full_version == \"3.11.10\"" dependencies = [ "certifi>=2017.4.17", "charset-normalizer<4,>=2", @@ -1679,7 +1403,6 @@ name = "resolvelib" version = "0.8.1" summary = "Resolve abstract dependencies into concrete ones" groups = ["default"] -marker = "python_full_version == \"3.11.10\"" files = [ {file = "resolvelib-0.8.1-py2.py3-none-any.whl", hash = "sha256:d9b7907f055c3b3a2cfc56c914ffd940122915826ff5fb5b1de0c99778f4de98"}, {file = "resolvelib-0.8.1.tar.gz", hash = "sha256:c6ea56732e9fb6fca1b2acc2ccc68a0b6b8c566d8f3e78e0443310ede61dbd37"}, @@ -1690,7 +1413,6 @@ name = "retry" version = "0.9.2" summary = "Easy to use retry decorator." groups = ["default"] -marker = "python_full_version == \"3.11.10\"" dependencies = [ "decorator>=3.4.2", "py<2.0.0,>=1.4.26", @@ -1706,7 +1428,6 @@ version = "13.7.1" requires_python = ">=3.7.0" summary = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" groups = ["default"] -marker = "python_full_version == \"3.11.10\"" dependencies = [ "markdown-it-py>=2.2.0", "pygments<3.0.0,>=2.13.0", @@ -1723,7 +1444,6 @@ version = "0.6.1" requires_python = ">=3.7" summary = "An extremely fast Python linter and code formatter, written in Rust." groups = ["default"] -marker = "python_full_version == \"3.11.10\"" files = [ {file = "ruff-0.6.1-py3-none-linux_armv6l.whl", hash = "sha256:b4bb7de6a24169dc023f992718a9417380301b0c2da0fe85919f47264fb8add9"}, {file = "ruff-0.6.1-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:45efaae53b360c81043e311cdec8a7696420b3d3e8935202c2846e7a97d4edae"}, @@ -1745,36 +1465,12 @@ files = [ {file = "ruff-0.6.1.tar.gz", hash = "sha256:af3ffd8c6563acb8848d33cd19a69b9bfe943667f0419ca083f8ebe4224a3436"}, ] -[[package]] -name = "safetensors" -version = "0.4.4" -requires_python = ">=3.7" -summary = "" -groups = ["default"] -marker = "python_full_version == \"3.11.10\"" -files = [ - {file = "safetensors-0.4.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:bbaa31f2cb49013818bde319232ccd72da62ee40f7d2aa532083eda5664e85ff"}, - {file = "safetensors-0.4.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9fdcb80f4e9fbb33b58e9bf95e7dbbedff505d1bcd1c05f7c7ce883632710006"}, - {file = "safetensors-0.4.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55c14c20be247b8a1aeaf3ab4476265e3ca83096bb8e09bb1a7aa806088def4f"}, - {file = "safetensors-0.4.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:949aaa1118660f992dbf0968487b3e3cfdad67f948658ab08c6b5762e90cc8b6"}, - {file = "safetensors-0.4.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c11a4ab7debc456326a2bac67f35ee0ac792bcf812c7562a4a28559a5c795e27"}, - {file = "safetensors-0.4.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c0cea44bba5c5601b297bc8307e4075535b95163402e4906b2e9b82788a2a6df"}, - {file = "safetensors-0.4.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9d752c97f6bbe327352f76e5b86442d776abc789249fc5e72eacb49e6916482"}, - {file = "safetensors-0.4.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:03f2bb92e61b055ef6cc22883ad1ae898010a95730fa988c60a23800eb742c2c"}, - {file = "safetensors-0.4.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:87bf3f91a9328a941acc44eceffd4e1f5f89b030985b2966637e582157173b98"}, - {file = "safetensors-0.4.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:20d218ec2b6899d29d6895419a58b6e44cc5ff8f0cc29fac8d236a8978ab702e"}, - {file = "safetensors-0.4.4-cp311-none-win32.whl", hash = "sha256:8079486118919f600c603536e2490ca37b3dbd3280e3ad6eaacfe6264605ac8a"}, - {file = "safetensors-0.4.4-cp311-none-win_amd64.whl", hash = "sha256:2f8c2eb0615e2e64ee27d478c7c13f51e5329d7972d9e15528d3e4cfc4a08f0d"}, - {file = "safetensors-0.4.4.tar.gz", hash = "sha256:5fe3e9b705250d0172ed4e100a811543108653fb2b66b9e702a088ad03772a07"}, -] - [[package]] name = "scalecodec" version = "1.2.11" requires_python = "<4,>=3.6" summary = "Python SCALE Codec Library" groups = ["default"] -marker = "python_full_version == \"3.11.10\"" dependencies = [ "base58>=2.0.1", "more-itertools", @@ -1791,7 +1487,6 @@ version = "72.2.0" requires_python = ">=3.8" summary = "Easily download, build, install, upgrade, and uninstall Python packages" groups = ["default"] -marker = "python_full_version == \"3.11.10\"" files = [ {file = "setuptools-72.2.0-py3-none-any.whl", hash = "sha256:f11dd94b7bae3a156a95ec151f24e4637fb4fa19c878e4d191bfb8b2d82728c4"}, {file = "setuptools-72.2.0.tar.gz", hash = "sha256:80aacbf633704e9c8bfa1d99fa5dd4dc59573efcf9e4042c13d3bcef91ac2ef9"}, @@ -1803,7 +1498,6 @@ version = "1.6.5" requires_python = ">=3.7" summary = "Automagic shell tab completion for Python CLI applications" groups = ["default"] -marker = "python_full_version == \"3.11.10\"" files = [ {file = "shtab-1.6.5-py3-none-any.whl", hash = "sha256:3c7be25ab65a324ed41e9c2964f2146236a5da6e6a247355cfea56f65050f220"}, {file = "shtab-1.6.5.tar.gz", hash = "sha256:cf4ab120183e84cce041abeb6f620f9560739741dfc31dd466315550c08be9ec"}, @@ -1815,7 +1509,6 @@ version = "1.16.0" requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" summary = "Python 2 and 3 compatibility utilities" groups = ["default"] -marker = "python_full_version == \"3.11.10\"" files = [ {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, @@ -1827,7 +1520,6 @@ version = "1.3.1" requires_python = ">=3.7" summary = "Sniff out which async library your code is running under" groups = ["default"] -marker = "python_full_version == \"3.11.10\"" files = [ {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, @@ -1839,7 +1531,6 @@ version = "2.0.32" requires_python = ">=3.7" summary = "Database Abstraction Library" groups = ["default"] -marker = "python_full_version == \"3.11.10\"" dependencies = [ "greenlet!=0.4.17; (platform_machine == \"win32\" or platform_machine == \"WIN32\" or platform_machine == \"AMD64\" or platform_machine == \"amd64\" or platform_machine == \"x86_64\" or platform_machine == \"ppc64le\" or platform_machine == \"aarch64\") and python_version < \"3.13\"", "importlib-metadata; python_version < \"3.8\"", @@ -1864,7 +1555,6 @@ version = "0.0.21" requires_python = ">=3.7" summary = "SQLModel, SQL databases in Python, designed for simplicity, compatibility, and robustness." groups = ["default"] -marker = "python_full_version == \"3.11.10\"" dependencies = [ "SQLAlchemy<2.1.0,>=2.0.14", "pydantic<3.0.0,>=1.10.13", @@ -1880,7 +1570,6 @@ version = "0.37.2" requires_python = ">=3.8" summary = "The little ASGI library that shines." groups = ["default"] -marker = "python_full_version == \"3.11.10\"" dependencies = [ "anyio<5,>=3.4.0", "typing-extensions>=3.10.0; python_version < \"3.10\"", @@ -1896,7 +1585,6 @@ version = "1.7.10" requires_python = "<4,>=3.7" summary = "Library for interfacing with a Substrate node" groups = ["default"] -marker = "python_full_version == \"3.11.10\"" dependencies = [ "PyNaCl<2,>=1.0.1", "base58<3,>=1.0.3", @@ -1925,7 +1613,6 @@ version = "1.13.2" requires_python = ">=3.8" summary = "Computer algebra system (CAS) in Python" groups = ["default"] -marker = "python_full_version == \"3.11.10\"" dependencies = [ "mpmath<1.4,>=1.1.0", ] @@ -1935,41 +1622,25 @@ files = [ ] [[package]] -name = "termcolor" -version = "2.4.0" +name = "tenacity" +version = "9.0.0" requires_python = ">=3.8" -summary = "ANSI color formatting for output in terminal" +summary = "Retry code until it succeeds" groups = ["default"] -marker = "python_full_version == \"3.11.10\"" files = [ - {file = "termcolor-2.4.0-py3-none-any.whl", hash = "sha256:9297c0df9c99445c2412e832e882a7884038a25617c60cea2ad69488d4040d63"}, - {file = "termcolor-2.4.0.tar.gz", hash = "sha256:aab9e56047c8ac41ed798fa36d892a37aca6b3e9159f3e0c24bc64a9b3ac7b7a"}, + {file = "tenacity-9.0.0-py3-none-any.whl", hash = "sha256:93de0c98785b27fcf659856aa9f54bfbd399e29969b0621bc7f762bd441b4539"}, + {file = "tenacity-9.0.0.tar.gz", hash = "sha256:807f37ca97d62aa361264d497b0e31e92b8027044942bfa756160d908320d73b"}, ] [[package]] -name = "tokenizers" -version = "0.19.1" -requires_python = ">=3.7" -summary = "" +name = "termcolor" +version = "2.4.0" +requires_python = ">=3.8" +summary = "ANSI color formatting for output in terminal" groups = ["default"] -marker = "python_full_version == \"3.11.10\"" -dependencies = [ - "huggingface-hub<1.0,>=0.16.4", -] files = [ - {file = "tokenizers-0.19.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:5c88d1481f1882c2e53e6bb06491e474e420d9ac7bdff172610c4f9ad3898059"}, - {file = "tokenizers-0.19.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ddf672ed719b4ed82b51499100f5417d7d9f6fb05a65e232249268f35de5ed14"}, - {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:dadc509cc8a9fe460bd274c0e16ac4184d0958117cf026e0ea8b32b438171594"}, - {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfedf31824ca4915b511b03441784ff640378191918264268e6923da48104acc"}, - {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac11016d0a04aa6487b1513a3a36e7bee7eec0e5d30057c9c0408067345c48d2"}, - {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:76951121890fea8330d3a0df9a954b3f2a37e3ec20e5b0530e9a0044ca2e11fe"}, - {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b342d2ce8fc8d00f376af068e3274e2e8649562e3bc6ae4a67784ded6b99428d"}, - {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d16ff18907f4909dca9b076b9c2d899114dd6abceeb074eca0c93e2353f943aa"}, - {file = "tokenizers-0.19.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:706a37cc5332f85f26efbe2bdc9ef8a9b372b77e4645331a405073e4b3a8c1c6"}, - {file = "tokenizers-0.19.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:16baac68651701364b0289979ecec728546133e8e8fe38f66fe48ad07996b88b"}, - {file = "tokenizers-0.19.1-cp311-none-win32.whl", hash = "sha256:9ed240c56b4403e22b9584ee37d87b8bfa14865134e3e1c3fb4b2c42fafd3256"}, - {file = "tokenizers-0.19.1-cp311-none-win_amd64.whl", hash = "sha256:ad57d59341710b94a7d9dbea13f5c1e7d76fd8d9bcd944a7a6ab0b0da6e0cc66"}, - {file = "tokenizers-0.19.1.tar.gz", hash = "sha256:ee59e6680ed0fdbe6b724cf38bd70400a0c1dd623b07ac729087270caeac88e3"}, + {file = "termcolor-2.4.0-py3-none-any.whl", hash = "sha256:9297c0df9c99445c2412e832e882a7884038a25617c60cea2ad69488d4040d63"}, + {file = "termcolor-2.4.0.tar.gz", hash = "sha256:aab9e56047c8ac41ed798fa36d892a37aca6b3e9159f3e0c24bc64a9b3ac7b7a"}, ] [[package]] @@ -1978,53 +1649,17 @@ version = "0.12.1" requires_python = ">=3.7" summary = "List processing tools and functional utilities" groups = ["default"] -marker = "implementation_name == \"cpython\" and python_full_version == \"3.11.10\"" files = [ {file = "toolz-0.12.1-py3-none-any.whl", hash = "sha256:d22731364c07d72eea0a0ad45bafb2c2937ab6fd38a3507bf55eae8744aa7d85"}, {file = "toolz-0.12.1.tar.gz", hash = "sha256:ecca342664893f177a13dac0e6b41cbd8ac25a358e5f215316d43e2100224f4d"}, ] -[[package]] -name = "torch" -version = "2.4.0" -requires_python = ">=3.8.0" -summary = "Tensors and Dynamic neural networks in Python with strong GPU acceleration" -groups = ["default"] -marker = "python_full_version == \"3.11.10\"" -dependencies = [ - "filelock", - "fsspec", - "jinja2", - "networkx", - "nvidia-cublas-cu12==12.1.3.1; platform_system == \"Linux\" and platform_machine == \"x86_64\"", - "nvidia-cuda-cupti-cu12==12.1.105; platform_system == \"Linux\" and platform_machine == \"x86_64\"", - "nvidia-cuda-nvrtc-cu12==12.1.105; platform_system == \"Linux\" and platform_machine == \"x86_64\"", - "nvidia-cuda-runtime-cu12==12.1.105; platform_system == \"Linux\" and platform_machine == \"x86_64\"", - "nvidia-cudnn-cu12==9.1.0.70; platform_system == \"Linux\" and platform_machine == \"x86_64\"", - "nvidia-cufft-cu12==11.0.2.54; platform_system == \"Linux\" and platform_machine == \"x86_64\"", - "nvidia-curand-cu12==10.3.2.106; platform_system == \"Linux\" and platform_machine == \"x86_64\"", - "nvidia-cusolver-cu12==11.4.5.107; platform_system == \"Linux\" and platform_machine == \"x86_64\"", - "nvidia-cusparse-cu12==12.1.0.106; platform_system == \"Linux\" and platform_machine == \"x86_64\"", - "nvidia-nccl-cu12==2.20.5; platform_system == \"Linux\" and platform_machine == \"x86_64\"", - "nvidia-nvtx-cu12==12.1.105; platform_system == \"Linux\" and platform_machine == \"x86_64\"", - "sympy", - "triton==3.0.0; platform_system == \"Linux\" and platform_machine == \"x86_64\" and python_version < \"3.13\"", - "typing-extensions>=4.8.0", -] -files = [ - {file = "torch-2.4.0-cp311-cp311-manylinux1_x86_64.whl", hash = "sha256:e743adadd8c8152bb8373543964551a7cb7cc20ba898dc8f9c0cdbe47c283de0"}, - {file = "torch-2.4.0-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:7334325c0292cbd5c2eac085f449bf57d3690932eac37027e193ba775703c9e6"}, - {file = "torch-2.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:97730014da4c57ffacb3c09298c6ce05400606e890bd7a05008d13dd086e46b1"}, - {file = "torch-2.4.0-cp311-none-macosx_11_0_arm64.whl", hash = "sha256:f169b4ea6dc93b3a33319611fcc47dc1406e4dd539844dcbd2dec4c1b96e166d"}, -] - [[package]] name = "tqdm" version = "4.66.5" requires_python = ">=3.7" summary = "Fast, Extensible Progress Meter" groups = ["default"] -marker = "python_full_version == \"3.11.10\"" dependencies = [ "colorama; platform_system == \"Windows\"", ] @@ -2033,42 +1668,16 @@ files = [ {file = "tqdm-4.66.5.tar.gz", hash = "sha256:e1020aef2e5096702d8a025ac7d16b1577279c9d63f8375b63083e9a5f0fcbad"}, ] -[[package]] -name = "transformers" -version = "4.44.0" -requires_python = ">=3.8.0" -summary = "State-of-the-art Machine Learning for JAX, PyTorch and TensorFlow" -groups = ["default"] -marker = "python_full_version == \"3.11.10\"" -dependencies = [ - "filelock", - "huggingface-hub<1.0,>=0.23.2", - "numpy>=1.17", - "packaging>=20.0", - "pyyaml>=5.1", - "regex!=2019.12.17", - "requests", - "safetensors>=0.4.1", - "tokenizers<0.20,>=0.19", - "tqdm>=4.27", -] -files = [ - {file = "transformers-4.44.0-py3-none-any.whl", hash = "sha256:ea0ff72def71e9f4812d9414d4803b22681b1617aa6f511bd51cfff2b44a6fca"}, - {file = "transformers-4.44.0.tar.gz", hash = "sha256:75699495e30b7635ca444d8d372e138c687ab51a875b387e33f1fb759c37f196"}, -] - [[package]] name = "triton" version = "3.0.0" summary = "A language and compiler for custom Deep Learning operations" groups = ["default"] -marker = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and python_full_version == \"3.11.10\"" dependencies = [ "filelock", ] files = [ {file = "triton-3.0.0-1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5ce8520437c602fb633f1324cc3871c47bee3b67acf9756c1a66309b60e3216c"}, - {file = "triton-3.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd34f19a8582af96e6291d4afce25dac08cb2a5d218c599163761e8e0827208e"}, ] [[package]] @@ -2077,31 +1686,17 @@ version = "4.12.2" requires_python = ">=3.8" summary = "Backported and Experimental Type Hints for Python 3.8+" groups = ["default"] -marker = "python_full_version == \"3.11.10\"" files = [ {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, ] -[[package]] -name = "tzdata" -version = "2024.1" -requires_python = ">=2" -summary = "Provider of IANA time zone data" -groups = ["default"] -marker = "python_full_version == \"3.11.10\"" -files = [ - {file = "tzdata-2024.1-py2.py3-none-any.whl", hash = "sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252"}, - {file = "tzdata-2024.1.tar.gz", hash = "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd"}, -] - [[package]] name = "urllib3" version = "2.2.2" requires_python = ">=3.8" summary = "HTTP library with thread-safe connection pooling, file post, and more." groups = ["default"] -marker = "python_full_version == \"3.11.10\"" files = [ {file = "urllib3-2.2.2-py3-none-any.whl", hash = "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472"}, {file = "urllib3-2.2.2.tar.gz", hash = "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168"}, @@ -2113,7 +1708,6 @@ version = "0.30.0" requires_python = ">=3.8" summary = "The lightning-fast ASGI server." groups = ["default"] -marker = "python_full_version == \"3.11.10\"" dependencies = [ "click>=7.0", "h11>=0.8", @@ -2130,7 +1724,6 @@ version = "1.8.0" requires_python = ">=3.8" summary = "WebSocket client for Python with low level API options" groups = ["default"] -marker = "python_full_version == \"3.11.10\"" files = [ {file = "websocket_client-1.8.0-py3-none-any.whl", hash = "sha256:17b44cc997f5c498e809b22cdf2d9c7a9e71c02c8cc2b6c56e7c2d1239bfa526"}, {file = "websocket_client-1.8.0.tar.gz", hash = "sha256:3239df9f44da632f96012472805d40a23281a991027ce11d2f45a6f24ac4c3da"}, @@ -2142,7 +1735,6 @@ version = "12.0" requires_python = ">=3.8" summary = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" groups = ["default"] -marker = "python_full_version == \"3.11.10\"" files = [ {file = "websockets-12.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5d873c7de42dea355d73f170be0f23788cf3fa9f7bed718fd2830eefedce01b4"}, {file = "websockets-12.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3f61726cae9f65b872502ff3c1496abc93ffbe31b278455c418492016e2afc8f"}, @@ -2165,7 +1757,6 @@ version = "0.44.0" requires_python = ">=3.8" summary = "A built-package format for Python" groups = ["default"] -marker = "python_full_version == \"3.11.10\"" files = [ {file = "wheel-0.44.0-py3-none-any.whl", hash = "sha256:2376a90c98cc337d18623527a97c31797bd02bad0033d41547043a1cbfbe448f"}, {file = "wheel-0.44.0.tar.gz", hash = "sha256:a29c3f2817e95ab89aa4660681ad547c0e9547f20e75b0562fe7723c9a2a9d49"}, @@ -2177,7 +1768,6 @@ version = "3.4.1" requires_python = ">=3.7" summary = "Python binding for xxHash" groups = ["default"] -marker = "python_full_version == \"3.11.10\"" files = [ {file = "xxhash-3.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:58c49083801885273e262c0f5bbeac23e520564b8357fbb18fb94ff09d3d3ea5"}, {file = "xxhash-3.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b526015a973bfbe81e804a586b703f163861da36d186627e27524f5427b0d520"}, @@ -2203,7 +1793,6 @@ version = "1.9.4" requires_python = ">=3.7" summary = "Yet another URL library" groups = ["default"] -marker = "python_full_version == \"3.11.10\"" dependencies = [ "idna>=2.0", "multidict>=4.0", diff --git a/neurons/miners/pyproject.toml b/neurons/miners/pyproject.toml index d456d32..0c50d83 100644 --- a/neurons/miners/pyproject.toml +++ b/neurons/miners/pyproject.toml @@ -6,23 +6,116 @@ authors = [ {name = "waris", email = "waris0609@outlook.com"}, ] dependencies = [ - "bittensor>=6.9.3", - "torch>=2.3.1", - "fastapi>=0.99.1", - "datura @ file:///${PROJECT_ROOT}/../../datura", - "pydantic>=1.10.17", - "pydantic-settings>=2.3.4", - "ruff>=0.5.1", - "websockets>=12.0", - "psycopg2-binary>=2.9.9", - "sqlmodel>=0.0.19", + "aiohappyeyeballs==2.3.6", + "aiohttp==3.10.3", + "aiosignal==1.3.1", + "alembic==1.13.2", + "annotated-types==0.7.0", + "ansible-core==2.13.13", + "ansible-vault==2.1.0", + "ansible==6.7.0", + "anyio==4.4.0", + "asgiref==3.8.1", + "async-timeout==4.0.3", + "asyncpg==0.29.0", + "attrs==24.2.0", + "backoff==2.2.1", + "base58==2.1.1", + "bcrypt==4.2.0", + "bittensor==7.3.1", + "certifi==2024.2.2", + "cffi==1.17.0", + "charset-normalizer==3.3.2", + "click==8.1.7", + "colorama==0.4.6", + "cryptography==42.0.8", + "cytoolz==0.12.3", "databases[postgresql]>=0.9.0", - "alembic>=1.13.2", - "numpy<2.0.0", - "datasets>=2.20.0", - "transformers>=4.43.4", - "click>=8.1.7", - "aiohttp>=3.10.5", + "datura @ file:///${PROJECT_ROOT}/../../datura", + "ddt==1.6.0", + "decorator==5.1.1", + "ecdsa==0.19.0", + "eth-hash==0.7.0", + "eth-keys==0.5.1", + "eth-typing==5.0.0", + "eth-utils==2.2.2", + "fastapi==0.110.3", + "filelock==3.15.4", + "frozenlist==1.4.1", + "fsspec==2024.6.1", + "fuzzywuzzy==0.18.0", + "greenlet==3.0.3", + "h11==0.14.0", + "httpcore==1.0.5", + "httpx==0.27.0", + "idna==3.7", + "iniconfig==2.0.0", + "Jinja2==3.1.4", + "Levenshtein==0.25.1", + "Mako==1.3.5", + "markdown-it-py==3.0.0", + "MarkupSafe==2.1.5", + "mdurl==0.1.2", + "more-itertools==10.4.0", + "mpmath==1.3.0", + "msgpack-numpy-opentensor==0.5.0", + "msgpack==1.0.8", + "multidict==6.0.5", + "munch==2.5.0", + "nest-asyncio==1.6.0", + "netaddr==1.3.0", + "networkx==3.3", + "numpy==2.1.0", + "packaging==24.1", + "password-strength==0.0.3.post2", + "pluggy==1.5.0", + "psycopg2-binary==2.9.9", + "py-bip39-bindings==0.1.11", + "py-ed25519-zebra-bindings==1.0.1", + "py-sr25519-bindings==0.2.0", + "py==1.11.0", + "pycparser==2.22", + "pycryptodome==3.20.0", + "pydantic-core==2.20.1", + "pydantic-settings==2.4.0", + "pydantic==2.8.2", + "Pygments==2.18.0", + "PyNaCl==1.5.0", + "pytest==8.3.2", + "python-dotenv==1.0.1", + "python-Levenshtein==0.25.1", + "python-statemachine==2.1.2", + "PyYAML==6.0.2", + "rapidfuzz==3.9.6", + "redis==5.0.8", + "requests==2.32.3", + "resolvelib==0.8.1", + "retry==0.9.2", + "rich==13.7.1", + "ruff==0.6.1", + "scalecodec==1.2.11", + "setuptools==72.2.0", + "shtab==1.6.5", + "six==1.16.0", + "sniffio==1.3.1", + "SQLAlchemy==2.0.32", + "sqlmodel==0.0.21", + "starlette==0.37.2", + "substrate-interface==1.7.10", + "sympy==1.13.2", + "tenacity==9.0.0", + "termcolor==2.4.0", + "toolz==0.12.1", + "tqdm==4.66.5", + "triton==3.0.0", + "typing-extensions==4.12.2", + "urllib3==2.2.2", + "uvicorn==0.30.0", + "websocket-client==1.8.0", + "websockets==12.0", + "wheel==0.44.0", + "xxhash==3.4.1", + "yarl==1.9.4", ] requires-python = "==3.11.*" readme = "README.md" diff --git a/neurons/miners/src/services/executor_service.py b/neurons/miners/src/services/executor_service.py index ab46cae..48590de 100644 --- a/neurons/miners/src/services/executor_service.py +++ b/neurons/miners/src/services/executor_service.py @@ -45,7 +45,7 @@ async def send_pubkey_to_executor( if response.status != 200: logger.error("API request failed to register SSH key. url=%s", url) return None - response_obj: str = await response.json() + response_obj: dict = await response.json() logger.info( "Get response from Executor(%s:%s): %s", executor.address, diff --git a/neurons/validators/Dockerfile b/neurons/validators/Dockerfile index d89b40b..d90f7ef 100644 --- a/neurons/validators/Dockerfile +++ b/neurons/validators/Dockerfile @@ -17,8 +17,6 @@ COPY --from=datura . /datura RUN --mount=type=cache,target=/tmp/pdm_cache \ pdm config cache_dir /tmp/pdm_cache && \ pdm config python.use_venv False && \ - # compute-horde from path computes version from git tag which is unavailable here, - # hence we pass PDM_BUILD_SCM_VERSION=0 manually PDM_BUILD_SCM_VERSION=0 pdm sync --prod --group :all RUN mkdir -p /opt/ && mv __pypackages__/3.11/ /opt/pypackages/ @@ -37,6 +35,7 @@ RUN apt-get update \ WORKDIR /root/app/ ENV ENV=prod +ENV USE_TORCH=0 ENV PYTHONUNBUFFERED=1 ENV PATH=/opt/pypackages/bin:$PATH ENV PYTHONPATH=/opt/pypackages/lib:/root/app @@ -48,6 +47,6 @@ RUN echo "export PYTHONPATH=$PYTHONPATH" >> ~/.bash_profile COPY --from=base-image /root/app/ /root/app/ COPY --from=base-image /opt/pypackages/ /opt/pypackages/ -LABEL version="3.2.0" +LABEL version="3.3.0" CMD ["bash", "run.sh"] \ No newline at end of file diff --git a/neurons/validators/Dockerfile.runner b/neurons/validators/Dockerfile.runner index 9bde87f..b08992c 100644 --- a/neurons/validators/Dockerfile.runner +++ b/neurons/validators/Dockerfile.runner @@ -3,7 +3,7 @@ WORKDIR /root/validator COPY docker-compose.app.yml docker-compose.yml COPY entrypoint.sh /entrypoint.sh -LABEL version="3.2.0" +LABEL version="3.3.0" RUN chmod u+x /entrypoint.sh ENTRYPOINT ["/entrypoint.sh"] diff --git a/neurons/validators/pdm.lock b/neurons/validators/pdm.lock index 3811c10..12ff07e 100644 --- a/neurons/validators/pdm.lock +++ b/neurons/validators/pdm.lock @@ -5,7 +5,7 @@ groups = ["default"] strategy = ["inherit_metadata"] lock_version = "4.5.0" -content_hash = "sha256:c6c063d9c0a61ae262726fd8f325156b2ec6850752a474bcb09145daaa7d9144" +content_hash = "sha256:aaa91406b537a9584bd56f809f00c071ab9afeba64fff8b933edf089331149ea" [[metadata.targets]] requires_python = "==3.11.*" @@ -224,7 +224,7 @@ files = [ [[package]] name = "asyncssh" -version = "2.17.0" +version = "2.18.0" requires_python = ">=3.6" summary = "AsyncSSH: Asynchronous SSHv2 client and server library" groups = ["default"] @@ -233,8 +233,8 @@ dependencies = [ "typing-extensions>=4.0.0", ] files = [ - {file = "asyncssh-2.17.0-py3-none-any.whl", hash = "sha256:70bfe4081793255b0115f7a72efd92d5bad8562639302531223bb00188db9747"}, - {file = "asyncssh-2.17.0.tar.gz", hash = "sha256:3b159c105aa388c1e2245c4faf483f540ada8cad99402281119100166e5edb3c"}, + {file = "asyncssh-2.18.0-py3-none-any.whl", hash = "sha256:ee09081200753eca137c893995ce3b95f8e157945aa8bda455ea810b30762d96"}, + {file = "asyncssh-2.18.0.tar.gz", hash = "sha256:1a322161c01f60b9719dc8f39f80db71e61f3f5e04abbc3420ce503126d87123"}, ] [[package]] @@ -1062,150 +1062,6 @@ files = [ {file = "numpy-2.1.0.tar.gz", hash = "sha256:7dc90da0081f7e1da49ec4e398ede6a8e9cc4f5ebe5f9e06b443ed889ee9aaa2"}, ] -[[package]] -name = "nvidia-cublas-cu12" -version = "12.1.3.1" -requires_python = ">=3" -summary = "CUBLAS native runtime libraries" -groups = ["default"] -files = [ - {file = "nvidia_cublas_cu12-12.1.3.1-py3-none-manylinux1_x86_64.whl", hash = "sha256:ee53ccca76a6fc08fb9701aa95b6ceb242cdaab118c3bb152af4e579af792728"}, - {file = "nvidia_cublas_cu12-12.1.3.1-py3-none-win_amd64.whl", hash = "sha256:2b964d60e8cf11b5e1073d179d85fa340c120e99b3067558f3cf98dd69d02906"}, -] - -[[package]] -name = "nvidia-cuda-cupti-cu12" -version = "12.1.105" -requires_python = ">=3" -summary = "CUDA profiling tools runtime libs." -groups = ["default"] -files = [ - {file = "nvidia_cuda_cupti_cu12-12.1.105-py3-none-manylinux1_x86_64.whl", hash = "sha256:e54fde3983165c624cb79254ae9818a456eb6e87a7fd4d56a2352c24ee542d7e"}, - {file = "nvidia_cuda_cupti_cu12-12.1.105-py3-none-win_amd64.whl", hash = "sha256:bea8236d13a0ac7190bd2919c3e8e6ce1e402104276e6f9694479e48bb0eb2a4"}, -] - -[[package]] -name = "nvidia-cuda-nvrtc-cu12" -version = "12.1.105" -requires_python = ">=3" -summary = "NVRTC native runtime libraries" -groups = ["default"] -files = [ - {file = "nvidia_cuda_nvrtc_cu12-12.1.105-py3-none-manylinux1_x86_64.whl", hash = "sha256:339b385f50c309763ca65456ec75e17bbefcbbf2893f462cb8b90584cd27a1c2"}, - {file = "nvidia_cuda_nvrtc_cu12-12.1.105-py3-none-win_amd64.whl", hash = "sha256:0a98a522d9ff138b96c010a65e145dc1b4850e9ecb75a0172371793752fd46ed"}, -] - -[[package]] -name = "nvidia-cuda-runtime-cu12" -version = "12.1.105" -requires_python = ">=3" -summary = "CUDA Runtime native Libraries" -groups = ["default"] -files = [ - {file = "nvidia_cuda_runtime_cu12-12.1.105-py3-none-manylinux1_x86_64.whl", hash = "sha256:6e258468ddf5796e25f1dc591a31029fa317d97a0a94ed93468fc86301d61e40"}, - {file = "nvidia_cuda_runtime_cu12-12.1.105-py3-none-win_amd64.whl", hash = "sha256:dfb46ef84d73fababab44cf03e3b83f80700d27ca300e537f85f636fac474344"}, -] - -[[package]] -name = "nvidia-cudnn-cu12" -version = "9.1.0.70" -requires_python = ">=3" -summary = "cuDNN runtime libraries" -groups = ["default"] -dependencies = [ - "nvidia-cublas-cu12", -] -files = [ - {file = "nvidia_cudnn_cu12-9.1.0.70-py3-none-manylinux2014_x86_64.whl", hash = "sha256:165764f44ef8c61fcdfdfdbe769d687e06374059fbb388b6c89ecb0e28793a6f"}, - {file = "nvidia_cudnn_cu12-9.1.0.70-py3-none-win_amd64.whl", hash = "sha256:6278562929433d68365a07a4a1546c237ba2849852c0d4b2262a486e805b977a"}, -] - -[[package]] -name = "nvidia-cufft-cu12" -version = "11.0.2.54" -requires_python = ">=3" -summary = "CUFFT native runtime libraries" -groups = ["default"] -files = [ - {file = "nvidia_cufft_cu12-11.0.2.54-py3-none-manylinux1_x86_64.whl", hash = "sha256:794e3948a1aa71fd817c3775866943936774d1c14e7628c74f6f7417224cdf56"}, - {file = "nvidia_cufft_cu12-11.0.2.54-py3-none-win_amd64.whl", hash = "sha256:d9ac353f78ff89951da4af698f80870b1534ed69993f10a4cf1d96f21357e253"}, -] - -[[package]] -name = "nvidia-curand-cu12" -version = "10.3.2.106" -requires_python = ">=3" -summary = "CURAND native runtime libraries" -groups = ["default"] -files = [ - {file = "nvidia_curand_cu12-10.3.2.106-py3-none-manylinux1_x86_64.whl", hash = "sha256:9d264c5036dde4e64f1de8c50ae753237c12e0b1348738169cd0f8a536c0e1e0"}, - {file = "nvidia_curand_cu12-10.3.2.106-py3-none-win_amd64.whl", hash = "sha256:75b6b0c574c0037839121317e17fd01f8a69fd2ef8e25853d826fec30bdba74a"}, -] - -[[package]] -name = "nvidia-cusolver-cu12" -version = "11.4.5.107" -requires_python = ">=3" -summary = "CUDA solver native runtime libraries" -groups = ["default"] -dependencies = [ - "nvidia-cublas-cu12", - "nvidia-cusparse-cu12", - "nvidia-nvjitlink-cu12", -] -files = [ - {file = "nvidia_cusolver_cu12-11.4.5.107-py3-none-manylinux1_x86_64.whl", hash = "sha256:8a7ec542f0412294b15072fa7dab71d31334014a69f953004ea7a118206fe0dd"}, - {file = "nvidia_cusolver_cu12-11.4.5.107-py3-none-win_amd64.whl", hash = "sha256:74e0c3a24c78612192a74fcd90dd117f1cf21dea4822e66d89e8ea80e3cd2da5"}, -] - -[[package]] -name = "nvidia-cusparse-cu12" -version = "12.1.0.106" -requires_python = ">=3" -summary = "CUSPARSE native runtime libraries" -groups = ["default"] -dependencies = [ - "nvidia-nvjitlink-cu12", -] -files = [ - {file = "nvidia_cusparse_cu12-12.1.0.106-py3-none-manylinux1_x86_64.whl", hash = "sha256:f3b50f42cf363f86ab21f720998517a659a48131e8d538dc02f8768237bd884c"}, - {file = "nvidia_cusparse_cu12-12.1.0.106-py3-none-win_amd64.whl", hash = "sha256:b798237e81b9719373e8fae8d4f091b70a0cf09d9d85c95a557e11df2d8e9a5a"}, -] - -[[package]] -name = "nvidia-nccl-cu12" -version = "2.20.5" -requires_python = ">=3" -summary = "NVIDIA Collective Communication Library (NCCL) Runtime" -groups = ["default"] -files = [ - {file = "nvidia_nccl_cu12-2.20.5-py3-none-manylinux2014_aarch64.whl", hash = "sha256:1fc150d5c3250b170b29410ba682384b14581db722b2531b0d8d33c595f33d01"}, - {file = "nvidia_nccl_cu12-2.20.5-py3-none-manylinux2014_x86_64.whl", hash = "sha256:057f6bf9685f75215d0c53bf3ac4a10b3e6578351de307abad9e18a99182af56"}, -] - -[[package]] -name = "nvidia-nvjitlink-cu12" -version = "12.6.20" -requires_python = ">=3" -summary = "Nvidia JIT LTO Library" -groups = ["default"] -files = [ - {file = "nvidia_nvjitlink_cu12-12.6.20-py3-none-manylinux2014_aarch64.whl", hash = "sha256:84fb38465a5bc7c70cbc320cfd0963eb302ee25a5e939e9f512bbba55b6072fb"}, - {file = "nvidia_nvjitlink_cu12-12.6.20-py3-none-manylinux2014_x86_64.whl", hash = "sha256:562ab97ea2c23164823b2a89cb328d01d45cb99634b8c65fe7cd60d14562bd79"}, - {file = "nvidia_nvjitlink_cu12-12.6.20-py3-none-win_amd64.whl", hash = "sha256:ed3c43a17f37b0c922a919203d2d36cbef24d41cc3e6b625182f8b58203644f6"}, -] - -[[package]] -name = "nvidia-nvtx-cu12" -version = "12.1.105" -requires_python = ">=3" -summary = "NVIDIA Tools Extension" -groups = ["default"] -files = [ - {file = "nvidia_nvtx_cu12-12.1.105-py3-none-manylinux1_x86_64.whl", hash = "sha256:dc21cf308ca5691e7c04d962e213f8a4aa9bbfa23d95412f452254c2caeb09e5"}, - {file = "nvidia_nvtx_cu12-12.1.105-py3-none-win_amd64.whl", hash = "sha256:65f4d98982b31b60026e0e6de73fbdfc09d08a96f4656dd3665ca616a11e1e82"}, -] - [[package]] name = "packaging" version = "24.1" @@ -1359,15 +1215,15 @@ files = [ [[package]] name = "pyarmor" -version = "9.0.5" +version = "9.0.6" summary = "A tool used to obfuscate python scripts, bind obfuscated scripts to fixed machine or expire obfuscated scripts." groups = ["default"] dependencies = [ "pyarmor-cli-core~=7.6.2", ] files = [ - {file = "pyarmor-9.0.5-py3-none-any.whl", hash = "sha256:71a0519e19efbcffca93ebb0a221497ffb11725d941a250c1a7b0cb69c5fabd7"}, - {file = "pyarmor-9.0.5.zip", hash = "sha256:48d69e5bdda2715f60081afb0e3c7f15cceb4bf956dde05c555f3327dcdf4ad8"}, + {file = "pyarmor-9.0.6-py3-none-any.whl", hash = "sha256:bda6fb51a4df24d8d2ad26cd4ef529dde6bbc977ccb206163fb20caae4b54693"}, + {file = "pyarmor-9.0.6.zip", hash = "sha256:e740eabd1aa98844e3da003249bd48861e0d7d53d93d5e7d421fd365dbc3cab7"}, ] [[package]] @@ -1981,39 +1837,6 @@ files = [ {file = "toolz-0.12.1.tar.gz", hash = "sha256:ecca342664893f177a13dac0e6b41cbd8ac25a358e5f215316d43e2100224f4d"}, ] -[[package]] -name = "torch" -version = "2.4.0" -requires_python = ">=3.8.0" -summary = "Tensors and Dynamic neural networks in Python with strong GPU acceleration" -groups = ["default"] -dependencies = [ - "filelock", - "fsspec", - "jinja2", - "networkx", - "nvidia-cublas-cu12==12.1.3.1; platform_system == \"Linux\" and platform_machine == \"x86_64\"", - "nvidia-cuda-cupti-cu12==12.1.105; platform_system == \"Linux\" and platform_machine == \"x86_64\"", - "nvidia-cuda-nvrtc-cu12==12.1.105; platform_system == \"Linux\" and platform_machine == \"x86_64\"", - "nvidia-cuda-runtime-cu12==12.1.105; platform_system == \"Linux\" and platform_machine == \"x86_64\"", - "nvidia-cudnn-cu12==9.1.0.70; platform_system == \"Linux\" and platform_machine == \"x86_64\"", - "nvidia-cufft-cu12==11.0.2.54; platform_system == \"Linux\" and platform_machine == \"x86_64\"", - "nvidia-curand-cu12==10.3.2.106; platform_system == \"Linux\" and platform_machine == \"x86_64\"", - "nvidia-cusolver-cu12==11.4.5.107; platform_system == \"Linux\" and platform_machine == \"x86_64\"", - "nvidia-cusparse-cu12==12.1.0.106; platform_system == \"Linux\" and platform_machine == \"x86_64\"", - "nvidia-nccl-cu12==2.20.5; platform_system == \"Linux\" and platform_machine == \"x86_64\"", - "nvidia-nvtx-cu12==12.1.105; platform_system == \"Linux\" and platform_machine == \"x86_64\"", - "sympy", - "triton==3.0.0; platform_system == \"Linux\" and platform_machine == \"x86_64\" and python_version < \"3.13\"", - "typing-extensions>=4.8.0", -] -files = [ - {file = "torch-2.4.0-cp311-cp311-manylinux1_x86_64.whl", hash = "sha256:e743adadd8c8152bb8373543964551a7cb7cc20ba898dc8f9c0cdbe47c283de0"}, - {file = "torch-2.4.0-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:7334325c0292cbd5c2eac085f449bf57d3690932eac37027e193ba775703c9e6"}, - {file = "torch-2.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:97730014da4c57ffacb3c09298c6ce05400606e890bd7a05008d13dd086e46b1"}, - {file = "torch-2.4.0-cp311-none-macosx_11_0_arm64.whl", hash = "sha256:f169b4ea6dc93b3a33319611fcc47dc1406e4dd539844dcbd2dec4c1b96e166d"}, -] - [[package]] name = "tqdm" version = "4.66.5" diff --git a/neurons/validators/pyproject.toml b/neurons/validators/pyproject.toml index 40a1cf3..cfac4f2 100644 --- a/neurons/validators/pyproject.toml +++ b/neurons/validators/pyproject.toml @@ -66,18 +66,6 @@ dependencies = [ "netaddr==1.3.0", "networkx==3.3", "numpy==2.1.0", - "nvidia-cublas-cu12==12.1.3.1", - "nvidia-cuda-cupti-cu12==12.1.105", - "nvidia-cuda-nvrtc-cu12==12.1.105", - "nvidia-cuda-runtime-cu12==12.1.105", - "nvidia-cudnn-cu12==9.1.0.70", - "nvidia-cufft-cu12==11.0.2.54", - "nvidia-curand-cu12==10.3.2.106", - "nvidia-cusolver-cu12==11.4.5.107", - "nvidia-cusparse-cu12==12.1.0.106", - "nvidia-nccl-cu12==2.20.5", - "nvidia-nvjitlink-cu12==12.6.20", - "nvidia-nvtx-cu12==12.1.105", "packaging==24.1", "password-strength==0.0.3.post2", "pluggy==1.5.0", @@ -118,7 +106,6 @@ dependencies = [ "tenacity==9.0.0", "termcolor==2.4.0", "toolz==0.12.1", - "torch==2.4.0", "tqdm==4.66.5", "triton==3.0.0", "typing-extensions==4.12.2", diff --git a/neurons/validators/src/cli.py b/neurons/validators/src/cli.py index 2e9b0e8..33bec96 100644 --- a/neurons/validators/src/cli.py +++ b/neurons/validators/src/cli.py @@ -15,6 +15,7 @@ from services.file_encrypt_service import FileEncryptService from payload_models.payloads import ( MinerJobRequestPayload, + ContainerCreateRequest, ) configure_logs_of_other_modules() @@ -159,5 +160,29 @@ async def _request_job_to_miner(miner_hotkey: str, miner_address: str, miner_por docker_hub_digests=docker_hub_digests, ) +@cli.command() +@click.option("--miner_hotkey", prompt="Miner Hotkey", help="Hotkey of Miner") +@click.option("--miner_address", prompt="Miner Address", help="Miner IP Address") +@click.option("--miner_port", type=int, prompt="Miner Port", help="Miner Port") +@click.option("--executor_id", prompt="Executor Id", help="Executor Id") +@click.option("--docker_image", prompt="Docker Image", help="Docker Image") +def create_container_to_miner(miner_hotkey: str, miner_address: str, miner_port: int, executor_id: str, docker_image: str): + asyncio.run(_create_container_to_miner(miner_hotkey, miner_address, miner_port, executor_id, docker_image)) + + +async def _create_container_to_miner(miner_hotkey: str, miner_address: str, miner_port: int, executor_id: str, docker_image: str): + miner_service: MinerService = ioc["MinerService"] + + payload = ContainerCreateRequest( + docker_image=docker_image, + user_public_key="user_public_key", + executor_id=executor_id, + miner_hotkey=miner_hotkey, + miner_address=miner_address, + miner_port=miner_port, + ) + await miner_service.handle_container(payload) + + if __name__ == "__main__": cli() diff --git a/neurons/validators/src/clients/compute_client.py b/neurons/validators/src/clients/compute_client.py index 31b0b50..121f3f0 100644 --- a/neurons/validators/src/clients/compute_client.py +++ b/neurons/validators/src/clients/compute_client.py @@ -210,6 +210,7 @@ async def wait_for_specs(self, channel: aioredis.client.PubSub): specs = ExecutorSpecRequest( specs=msg["specs"], score=msg["score"], + synthetic_job_score=msg["synthetic_job_score"], log_status=msg["log_status"], job_batch_id=msg["job_batch_id"], log_text=msg["log_text"], diff --git a/neurons/validators/src/core/validator.py b/neurons/validators/src/core/validator.py index 615d4cd..f065fbb 100644 --- a/neurons/validators/src/core/validator.py +++ b/neurons/validators/src/core/validator.py @@ -93,6 +93,8 @@ async def initiate_services(self, subtensor: bittensor.subtensor): self.miner_scores = {} else: self.miner_scores = json.loads(miner_scores_json) + + await self.redis_service.clear_all_ssh_ports() except Exception as e: bittensor.logging.error(f"Failed to initialize miner_scores: {str(e)}") self.miner_scores = {} @@ -308,10 +310,7 @@ async def sync(self): current_block = self.get_current_block(subtensor) bittensor.logging.info(f"Current block: {current_block}", "sync", "sync") - if ( - current_block % settings.BLOCKS_FOR_JOB == 0 - or current_block - self.last_job_run_blocks > int(settings.BLOCKS_FOR_JOB * 1.5) - ): + if current_block - self.last_job_run_blocks >= settings.BLOCKS_FOR_JOB: job_block = (current_block // settings.BLOCKS_FOR_JOB) * settings.BLOCKS_FOR_JOB job_batch_id = await self.get_time_from_block(subtensor, job_block) @@ -340,7 +339,7 @@ async def sync(self): ) encypted_files = self.file_encrypt_service.ecrypt_miner_job_files() - + task_info = {} # request jobs @@ -359,7 +358,7 @@ async def sync(self): ) for miner in miners ] - + for miner, job in zip(miners, jobs): task_info[job] = { "miner_hotkey": miner.hotkey, @@ -367,7 +366,7 @@ async def sync(self): "miner_port": miner.axon_info.port, "job_batch_id": job_batch_id } - + try: # Run all jobs with asyncio.wait and set a timeout done, pending = await asyncio.wait(jobs, timeout=60 * 10) diff --git a/neurons/validators/src/miner_jobs/machine_scrape.py b/neurons/validators/src/miner_jobs/machine_scrape.py index 6f96d6c..307428e 100644 --- a/neurons/validators/src/miner_jobs/machine_scrape.py +++ b/neurons/validators/src/miner_jobs/machine_scrape.py @@ -12,6 +12,8 @@ import docker from base64 import b64encode from cryptography.fernet import Fernet +import random +import string nvmlLib = None @@ -250,6 +252,14 @@ def wrapper(*args, **kwargs): return func +@convertStrBytes +def nvmlErrorString(result): + fn = _nvmlGetFunctionPointer("nvmlErrorString") + fn.restype = c_char_p # otherwise return is an int + ret = fn(result) + return ret + + def _nvmlCheckReturn(ret): if (ret != NVML_SUCCESS): raise NVMLError(ret) @@ -280,8 +290,8 @@ def _nvmlGetFunctionPointer(name): libLoadLock.release() -def nvmlInitWithFlags(flags): - _LoadNvmlLibrary() +def nvmlInitWithFlags(flags, libpath: str): + _LoadNvmlLibrary(libpath) # # Initialize the library @@ -298,12 +308,12 @@ def nvmlInitWithFlags(flags): return None -def nvmlInit(): - nvmlInitWithFlags(0) +def nvmlInit(libpath: str): + nvmlInitWithFlags(0, libpath) return None -def _LoadNvmlLibrary(): +def _LoadNvmlLibrary(libpath: str): ''' Load the library if it isn't loaded already ''' @@ -328,7 +338,7 @@ def _LoadNvmlLibrary(): nvmlLib = CDLL(os.path.join(os.getenv("ProgramFiles", "C:/Program Files"), "NVIDIA Corporation/NVSMI/nvml.dll")) else: # assume linux - nvmlLib = CDLL("libnvidia-ml.so.1") + nvmlLib = CDLL(libpath) except OSError as ose: _nvmlCheckReturn(NVML_ERROR_LIBRARY_NOT_FOUND) if (nvmlLib == None): @@ -517,7 +527,7 @@ def get_network_speed(): data["network_speed_error"] = repr(exc) return data - + def get_all_container_digests(): """Verify and return the digests of all running containers.""" client = docker.from_env() @@ -535,10 +545,41 @@ def get_all_container_digests(): digest = repo_digest.split('@')[1] break if digest: - digests.append({'id': container.id, 'digest': digest}) # Add the digest to the list + digests.append({'id': container.id, 'digest': digest}) # Add the digest to the list return digests # Return the list of digests + +def get_md5_checksum(file_path): + # Create an MD5 hash object + md5_hash = hashlib.md5() + + # Open the file in binary mode + with open(file_path, "rb") as f: + # Read the file in chunks to avoid memory issues with large files + for chunk in iter(lambda: f.read(4096), b""): + md5_hash.update(chunk) + + # Return the hexadecimal MD5 checksum + return md5_hash.hexdigest() + + +def random_string(length: int = 30) -> str: + characters = string.ascii_letters + string.digits + random_string = ''.join(random.choices(characters, k=length)) + return random_string + + +def get_libnvidia_ml_path(): + try: + original_path = run_cmd("find /usr -name 'libnvidia-ml.so.1'").strip() + # lib_path = f"/usr/bin/{random_string(random.randint(10, 20))}" + # run_cmd(f"cp {original_path} {lib_path}") + return original_path + except: + return '' + + def get_machine_specs(): """Get Specs of miner machine.""" data = {} @@ -546,9 +587,13 @@ def get_machine_specs(): if os.environ.get('LD_PRELOAD'): return data + libnvidia_path = get_libnvidia_ml_path() + if not libnvidia_path: + return data + data["gpu"] = {"count": 0, "details": []} try: - nvmlInit() + nvmlInit(libnvidia_path) device_count = nvmlDeviceGetCount() @@ -667,6 +712,11 @@ def get_machine_specs(): data["network"] = get_network_speed() data["all_container_digests"] = get_all_container_digests() + data["md5_checksums"] = { + "nvidia_smi": get_md5_checksum(run_cmd("which nvidia-smi").strip()), + "libnvidia_ml": get_md5_checksum(libnvidia_path), + } + return data diff --git a/neurons/validators/src/protocol/vc_protocol/validator_requests.py b/neurons/validators/src/protocol/vc_protocol/validator_requests.py index 55518b4..5d89306 100644 --- a/neurons/validators/src/protocol/vc_protocol/validator_requests.py +++ b/neurons/validators/src/protocol/vc_protocol/validator_requests.py @@ -53,6 +53,7 @@ class ExecutorSpecRequest(BaseValidatorRequest): executor_port: int specs: dict | None score: float | None + synthetic_job_score: float | None log_text: str | None log_status: str | None job_batch_id: str diff --git a/neurons/validators/src/services/const.py b/neurons/validators/src/services/const.py index e7e8309..9a07135 100644 --- a/neurons/validators/src/services/const.py +++ b/neurons/validators/src/services/const.py @@ -31,6 +31,10 @@ UPLOAD_SPEED_WEIGHT = 0.05 DOWNLOAD_SPEED_WEIGHT = 0.05 +MAX_GPU_COUNT = 14 + +UNRENTED_MULTIPLIER = 0.25 + HASHCAT_CONFIGS = { "NVIDIA RTX A5000": { "digits": 11, @@ -139,14 +143,14 @@ "NVIDIA L4": { "digits": 11, "average_time": [ - 10.906689882278442, - 9.32911479473114, - 12.892356348037719, - 13.338897478580474, - 14.28122389793396, - 15.280945293108621, - 15.630833080836705, - 17.76026642918587 + 27.768908500671387, + 27.90283513069153, + 27.773880004882812, + 27.653605222702026, + 27.88539433479309, + 27.88539433479309, + 27.88539433479309, + 27.88539433479309 ] }, "NVIDIA RTX 4000 Ada Generation": { @@ -280,4 +284,24 @@ ] } } -MAX_GPU_COUNT = 8 \ No newline at end of file + +LIB_NVIDIA_ML_DIGESTS = { + "535.183.01": "58fc46eefa8ebb265293556951a75a39", + "535.183.06": "03ed7fa2134095b32f9d0d24a774c6ba", + "535.216.01": "96479a06139fc5261d06f432970d6a7b", + "535.216.03": "189634bf960b9a2efe1af8011d27ccf7", + "545.23.06": "5ad33588e91af67139efb54fe9fefc68", + "545.29.06": "85ad949d7553ab96cce5c811e229c7c7", + "550.120": "48be49d0e792b5ee76f73857c0bef35a", + "550.127.05": "bfa2733eee442016792bcbf130156e3d", + "550.54.15": "9625642dcf8765f52e332c8e38fbef73", + "550.78": "1f335d1f068931fe7f2ce13117d1602b", + "550.90.07": "c95828f8a8ab7f17743b40561b812c96", + "550.90.12": "d7702d394ab213a725abeb345185a072", + "555.42.02": "0262f396e80847dccefc8ccf52cff1ae", + "555.42.06": "69774adffa76471490e6d8fac9067725", + "560.28.03": "6d6e0122cff1ac777a9e37ba09b886cb", + "560.35.03": "93a3f8ef77af86b79314c00b0788aeed", + "560.35.05": "1eec299b50e33a6cfa5155ded53495ab", + "565.57.01": "c801dd3fc4660f3a8ddf977cfdffe113", +} diff --git a/neurons/validators/src/services/docker_service.py b/neurons/validators/src/services/docker_service.py index fb1ffc3..11979d0 100644 --- a/neurons/validators/src/services/docker_service.py +++ b/neurons/validators/src/services/docker_service.py @@ -15,11 +15,12 @@ ContainerDeleteRequest, ContainerStartRequest, ContainerStopRequest, + FailedContainerRequest, ) from protocol.vc_protocol.compute_requests import RentedMachine -from core.utils import _m, context, get_extra_info -from services.redis_service import RedisService +from core.utils import _m, get_extra_info +from services.redis_service import RedisService, AVAILABLE_PORT_MAPS_PREFIX from services.ssh_service import SSHService logger = logging.getLogger(__name__) @@ -42,27 +43,23 @@ def __init__( self.ssh_service = ssh_service self.redis_service = redis_service - def generate_portMappings(self, range_external_ports): - internal_ports = [22, 20000, 20001, 20002, 20003] - if range_external_ports: - if '-' in range_external_ports: - start, end = map(int, range_external_ports.split('-')) - available_ports = list(range(start, end + 1)) - else: - available_ports = list(map(int, range_external_ports.split(','))) - else: - available_ports = list(range(40000, 65535)) + async def generate_portMappings(self, miner_hotkey, executor_id): + try: + docker_internal_ports = [22, 20000, 20001, 20002, 20003] - if 0 in available_ports: - available_ports.remove(0) + key = f"{AVAILABLE_PORT_MAPS_PREFIX}:{miner_hotkey}:{executor_id}" + available_port_maps = await self.redis_service.lrange(key) - mappings = [] - for i, internal_port in enumerate(internal_ports): - if i < len(available_ports): - mappings.append((internal_port, available_ports[i])) - else: - break - return mappings + mappings = [] + for i, docker_port in enumerate(docker_internal_ports): + if i < len(available_port_maps): + internal_port, external_port = map(int, available_port_maps[i].decode().split(',')) + mappings.append((docker_port, internal_port, external_port)) + else: + break + return mappings + except: + return [] async def create_container( self, @@ -89,9 +86,15 @@ async def create_container( ) # generate port maps - port_maps = self.generate_portMappings(executor_info.port_range) + port_maps = await self.generate_portMappings(payload.miner_hotkey, payload.executor_id) if not port_maps: - return None + log_text = "No port mappings found" + logger.error(log_text) + return FailedContainerRequest( + miner_hotkey=payload.miner_hotkey, + executor_id=payload.executor_id, + msg=log_text + ) private_key = self.ssh_service.decrypt_payload(keypair.ss58_address, private_key) pkey = asyncssh.import_private_key(private_key) @@ -156,7 +159,7 @@ async def create_container( ), ) - port_flags = " ".join([f"-p {external}:{internal}" for internal, external in port_maps]) + port_flags = " ".join([f"-p {internal_port}:{docker_port}" for docker_port, internal_port, _ in port_maps]) # creat docker volume uuid = uuid4() @@ -200,7 +203,7 @@ async def create_container( return ContainerCreatedResult( container_name=container_name, volume_name=volume_name, - port_maps=port_maps, + port_maps=[(docker_port, external_port) for docker_port, _, external_port in port_maps], ) async def stop_container( @@ -322,9 +325,9 @@ async def delete_container( client_keys=[pkey], known_hosts=None, ) as ssh_client: - await ssh_client.run(f"docker stop {payload.container_name}") + # await ssh_client.run(f"docker stop {payload.container_name}") await ssh_client.run(f"docker rm {payload.container_name} -f") - await ssh_client.run(f"docker volume rm {payload.volume_name}") + await ssh_client.run(f"docker volume rm {payload.volume_name} -f") logger.info( _m( @@ -403,3 +406,76 @@ async def get_docker_hub_digests(self, repositories) -> dict[str, str]: print(f"Error retrieving data for {repo}: {e}") return all_digests + + async def setup_ssh_access( + self, + ssh_client: asyncssh.SSHClientConnection, + container_name: str, + ip_address: str, + username: str = "root", + port_maps: list[tuple[int, int]] = None + ) -> tuple[bool, str, str]: + """Generate an SSH key pair, add the public key to the Docker container, and check SSH connection.""" + + my_key = "my_key" + private_key, public_key = self.ssh_service.generate_ssh_key(my_key) + + public_key = public_key.decode("utf-8") + private_key = private_key.decode("utf-8") + + private_key = self.ssh_service.decrypt_payload(my_key, private_key) + pkey = asyncssh.import_private_key(private_key) + + await asyncio.sleep(5) + + command = f"docker exec {container_name} sh -c 'echo \"{public_key}\" >> /root/.ssh/authorized_keys'" + + result = await ssh_client.run(command) + if result.exit_status != 0: + log_text = "Error creating docker connection" + log_status = "error" + logger.error(log_text) + + return False, log_text, log_status + + port = 0 + for internal, external in port_maps: + if internal == 22: + port = external + # Check SSH connection + try: + async with asyncssh.connect( + host=ip_address, + port=port, + username=username, + client_keys=[pkey], + known_hosts=None, + ) as ssh_client_1: + log_status = "info" + log_text = "SSH connection successful!" + logger.info( + _m( + log_text, + extra={ + "container_name": container_name, + "ip_address": ip_address, + "port_maps": port_maps, + }, + ) + ) + return True, log_text, log_status + except Exception as e: + log_text = "SSH connection failed" + log_status = "error" + logger.error( + _m( + log_text, + extra={ + "container_name": container_name, + "ip_address": ip_address, + "port_maps": port_maps, + "error": str(e), + }, + ) + ) + return False, log_text, log_status diff --git a/neurons/validators/src/services/miner_service.py b/neurons/validators/src/services/miner_service.py index 44124e7..f2a7045 100644 --- a/neurons/validators/src/services/miner_service.py +++ b/neurons/validators/src/services/miner_service.py @@ -155,7 +155,7 @@ async def request_job_to_miner( await self.store_executor_counts(payload.miner_hotkey, payload.job_batch_id, len(msg.executors), results) total_score = 0 - for _, _, score, _, _, _ in results: + for _, _, score, _, _, _, _ in results: total_score += score logger.info( @@ -222,7 +222,7 @@ async def publish_machine_specs( extra=get_extra_info({**default_extra, "results": len(results)}), ), ) - for specs, ssh_info, score, job_batch_id, log_status, log_text in results: + for specs, ssh_info, score, synthetic_job_score, job_batch_id, log_status, log_text in results: try: await self.redis_service.publish( MACHINE_SPEC_CHANNEL_NAME, @@ -233,6 +233,7 @@ async def publish_machine_specs( "executor_ip": ssh_info.address, "executor_port": ssh_info.port, "score": score, + "synthetic_job_score": synthetic_job_score, "job_batch_id": job_batch_id, "log_status": log_status, "log_text": str(log_text), @@ -256,7 +257,7 @@ async def store_executor_counts(self, miner_hotkey: str, job_batch_id: str, tota success = 0 failed = 0 - for _, _, score, _, _, _ in results: + for _, _, score, _, _, _, _ in results: if score > 0: success += 1 else: @@ -299,195 +300,224 @@ async def handle_container(self, payload: ContainerBaseRequest): "container_request_type": str(payload.message_type), } - miner_client = MinerClient( - loop=loop, - miner_address=payload.miner_address, - miner_port=payload.miner_port, - miner_hotkey=payload.miner_hotkey, - my_hotkey=my_key.ss58_address, - keypair=my_key, - miner_url=f"ws://{payload.miner_address}:{payload.miner_port}/resources/{my_key.ss58_address}", - ) - - async with miner_client: - # generate ssh key and send it to miner - private_key, public_key = self.ssh_service.generate_ssh_key(my_key.ss58_address) - await miner_client.send_model( - SSHPubKeySubmitRequest(public_key=public_key, executor_id=payload.executor_id) - ) - - logger.info( - _m("Sent SSH key to miner.", extra=get_extra_info(default_extra)), + try: + miner_client = MinerClient( + loop=loop, + miner_address=payload.miner_address, + miner_port=payload.miner_port, + miner_hotkey=payload.miner_hotkey, + my_hotkey=my_key.ss58_address, + keypair=my_key, + miner_url=f"ws://{payload.miner_address}:{payload.miner_port}/resources/{my_key.ss58_address}", ) - try: - msg = await asyncio.wait_for( - miner_client.job_state.miner_accepted_ssh_key_or_failed_future, timeout=1 - ) - except TimeoutError: - logger.error( - _m( - "Waiting accepted ssh key or failed request from miner resulted in an timeout error", - extra=get_extra_info(default_extra), - ), - ) - msg = None - except Exception: - logger.error( - _m( - "Waiting accepted ssh key or failed request from miner resulted in an exception", - extra=get_extra_info(default_extra), - ), + async with miner_client: + # generate ssh key and send it to miner + private_key, public_key = self.ssh_service.generate_ssh_key(my_key.ss58_address) + await miner_client.send_model( + SSHPubKeySubmitRequest(public_key=public_key, executor_id=payload.executor_id) ) - msg = None - if isinstance(msg, AcceptSSHKeyRequest): logger.info( - _m( - "Received AcceptSSHKeyRequest", - extra=get_extra_info({**default_extra, "msg": str(msg)}), - ), + _m("Sent SSH key to miner.", extra=get_extra_info(default_extra)), ) try: - executor = msg.executors[0] - except Exception as e: + msg = await asyncio.wait_for( + miner_client.job_state.miner_accepted_ssh_key_or_failed_future, timeout=JOB_LENGTH + ) + except TimeoutError: logger.error( _m( - "Error: Miner didn't return executor info", - extra=get_extra_info({**default_extra, "error": str(e)}), + "Waiting accepted ssh key or failed request from miner resulted in an timeout error", + extra=get_extra_info(default_extra), ), ) - executor = None - - if executor is None or executor.uuid != payload.executor_id: + msg = None + except Exception as e: logger.error( - _m("Error: Invalid executor id", extra=get_extra_info(default_extra)), - ) - await miner_client.send_model( - SSHPubKeyRemoveRequest( - public_key=public_key, executor_id=payload.executor_id - ) - ) - - await self.redis_service.remove_rented_machine( - RentedMachine( - miner_hotkey=payload.miner_hotkey, - executor_id=payload.executor_id, - executor_ip_address=executor.address if executor else "", - executor_ip_port=str(executor.port if executor else ""), - ) + _m( + "Waiting accepted ssh key or failed request from miner resulted in an exception", + extra=get_extra_info({**default_extra, "error": str(e)}), + ), ) + msg = None - return FailedContainerRequest( - miner_hotkey=payload.miner_hotkey, - executor_id=payload.executor_id, - msg=f"Invalid executor id {payload.executor_id}", + if isinstance(msg, AcceptSSHKeyRequest): + logger.info( + _m( + "Received AcceptSSHKeyRequest", + extra=get_extra_info({**default_extra, "msg": str(msg)}), + ), ) - try: - if isinstance(payload, ContainerCreateRequest): - logger.info( + try: + executor = msg.executors[0] + except Exception as e: + logger.error( _m( - "Creating container", - extra=get_extra_info({**default_extra, "payload": str(payload)}), + "Error: Miner didn't return executor info", + extra=get_extra_info({**default_extra, "error": str(e)}), ), ) - result = await self.docker_service.create_container( - payload, - executor, - my_key, - private_key.decode("utf-8"), - ) + executor = None + if executor is None or executor.uuid != payload.executor_id: + logger.error( + _m("Error: Invalid executor id", extra=get_extra_info(default_extra)), + ) await miner_client.send_model( SSHPubKeyRemoveRequest( public_key=public_key, executor_id=payload.executor_id ) ) - - if result is None: - return FailedContainerRequest( + + await self.redis_service.remove_rented_machine( + RentedMachine( miner_hotkey=payload.miner_hotkey, executor_id=payload.executor_id, - msg=f"create container error: No ports available", + executor_ip_address=executor.address if executor else "", + executor_ip_port=str(executor.port if executor else ""), ) + ) - return ContainerCreated( + return FailedContainerRequest( miner_hotkey=payload.miner_hotkey, executor_id=payload.executor_id, - container_name=result.container_name, - volume_name=result.volume_name, - port_maps=result.port_maps, + msg=f"Invalid executor id {payload.executor_id}", ) - elif isinstance(payload, ContainerStartRequest): - logger.info( - _m( - "Starting container", - extra=get_extra_info({**default_extra, "payload": str(payload)}), - ), - ) - await self.docker_service.start_container( - payload, - executor, - my_key, - private_key.decode("utf-8"), - ) + try: + if isinstance(payload, ContainerCreateRequest): + logger.info( + _m( + "Creating container", + extra=get_extra_info({**default_extra, "payload": str(payload)}), + ), + ) + result = await self.docker_service.create_container( + payload, + executor, + my_key, + private_key.decode("utf-8"), + ) - logger.info( - _m( - "Started Container", - extra=get_extra_info({**default_extra, "payload": str(payload)}), - ), - ) - await miner_client.send_model( - SSHPubKeyRemoveRequest( - public_key=public_key, executor_id=payload.executor_id + await miner_client.send_model( + SSHPubKeyRemoveRequest( + public_key=public_key, executor_id=payload.executor_id + ) ) - ) - return ContainerStarted( - miner_hotkey=payload.miner_hotkey, - executor_id=payload.executor_id, - container_name=payload.container_name, - ) - elif isinstance(payload, ContainerStopRequest): - await self.docker_service.stop_container( - payload, - executor, - my_key, - private_key.decode("utf-8"), - ) - await miner_client.send_model( - SSHPubKeyRemoveRequest( - public_key=public_key, executor_id=payload.executor_id + if isinstance(result, FailedContainerRequest): + return result + + return ContainerCreated( + miner_hotkey=payload.miner_hotkey, + executor_id=payload.executor_id, + container_name=result.container_name, + volume_name=result.volume_name, + port_maps=result.port_maps, ) - ) - return ContainerStopped( - miner_hotkey=payload.miner_hotkey, - executor_id=payload.executor_id, - container_name=payload.container_name, - ) - elif isinstance(payload, ContainerDeleteRequest): - logger.info( - _m( - "Deleting container", - extra=get_extra_info({**default_extra, "payload": str(payload)}), - ), - ) - await self.docker_service.delete_container( - payload, - executor, - my_key, - private_key.decode("utf-8"), - ) + elif isinstance(payload, ContainerStartRequest): + logger.info( + _m( + "Starting container", + extra=get_extra_info({**default_extra, "payload": str(payload)}), + ), + ) + await self.docker_service.start_container( + payload, + executor, + my_key, + private_key.decode("utf-8"), + ) + + logger.info( + _m( + "Started Container", + extra=get_extra_info({**default_extra, "payload": str(payload)}), + ), + ) + await miner_client.send_model( + SSHPubKeyRemoveRequest( + public_key=public_key, executor_id=payload.executor_id + ) + ) + + return ContainerStarted( + miner_hotkey=payload.miner_hotkey, + executor_id=payload.executor_id, + container_name=payload.container_name, + ) + elif isinstance(payload, ContainerStopRequest): + await self.docker_service.stop_container( + payload, + executor, + my_key, + private_key.decode("utf-8"), + ) + await miner_client.send_model( + SSHPubKeyRemoveRequest( + public_key=public_key, executor_id=payload.executor_id + ) + ) + + return ContainerStopped( + miner_hotkey=payload.miner_hotkey, + executor_id=payload.executor_id, + container_name=payload.container_name, + ) + elif isinstance(payload, ContainerDeleteRequest): + logger.info( + _m( + "Deleting container", + extra=get_extra_info({**default_extra, "payload": str(payload)}), + ), + ) + await self.docker_service.delete_container( + payload, + executor, + my_key, + private_key.decode("utf-8"), + ) + + logger.info( + _m( + "Deleted Container", + extra=get_extra_info({**default_extra, "payload": str(payload)}), + ), + ) + await miner_client.send_model( + SSHPubKeyRemoveRequest( + public_key=public_key, executor_id=payload.executor_id + ) + ) + + return ContainerDeleted( + miner_hotkey=payload.miner_hotkey, + executor_id=payload.executor_id, + container_name=payload.container_name, + volume_name=payload.volume_name, + ) + else: + logger.error( + _m( + "Unexpected request", + extra=get_extra_info({**default_extra, "payload": str(payload)}), + ), + ) + return FailedContainerRequest( + miner_hotkey=payload.miner_hotkey, + executor_id=payload.executor_id, + msg=f"Unexpected request: {payload}", + ) - logger.info( + except Exception as e: + logger.error( _m( - "Deleted Container", - extra=get_extra_info({**default_extra, "payload": str(payload)}), + "Error: create container error", + extra=get_extra_info({**default_extra, "error": str(e)}), ), ) await miner_client.send_model( @@ -496,68 +526,49 @@ async def handle_container(self, payload: ContainerBaseRequest): ) ) - return ContainerDeleted( - miner_hotkey=payload.miner_hotkey, - executor_id=payload.executor_id, - container_name=payload.container_name, - volume_name=payload.volume_name, - ) - else: - logger.error( - _m( - "Unexpected request", - extra=get_extra_info({**default_extra, "payload": str(payload)}), - ), - ) return FailedContainerRequest( miner_hotkey=payload.miner_hotkey, executor_id=payload.executor_id, - msg=f"Unexpected request: {payload}", + msg=f"create container error: {str(e)}", ) - except Exception as e: - logger.error( + elif isinstance(msg, FailedRequest): + logger.info( _m( - "Error: create container error", - extra=get_extra_info({**default_extra, "error": str(e)}), + "Error: Miner failed job", + extra=get_extra_info({**default_extra, "msg": str(msg)}), ), ) - await miner_client.send_model( - SSHPubKeyRemoveRequest( - public_key=public_key, executor_id=payload.executor_id - ) + return FailedContainerRequest( + miner_hotkey=payload.miner_hotkey, + executor_id=payload.executor_id, + msg=f"create container error: {str(msg)}", + ) + else: + logger.error( + _m( + "Error: Unexpected msg", + extra=get_extra_info({**default_extra, "msg": str(msg)}), + ), ) - return FailedContainerRequest( miner_hotkey=payload.miner_hotkey, executor_id=payload.executor_id, - msg=f"create container error: {str(e)}", + msg=f"Unexpected msg: {str(msg)}", ) + except Exception as e: + log_text = _m( + "[handle_container] resulted in an exception", + extra=get_extra_info({**default_extra, "error": str(e)}), + ) - elif isinstance(msg, FailedRequest): - logger.info( - _m( - "Error: Miner failed job", - extra=get_extra_info({**default_extra, "msg": str(msg)}), - ), - ) - return FailedContainerRequest( - miner_hotkey=payload.miner_hotkey, - executor_id=payload.executor_id, - msg=f"create container error: {str(msg)}", - ) - else: - logger.error( - _m( - "Error: Unexpected msg", - extra=get_extra_info({**default_extra, "msg": str(msg)}), - ), - ) - return FailedContainerRequest( - miner_hotkey=payload.miner_hotkey, - executor_id=payload.executor_id, - msg=f"Unexpected msg: {msg}", - ) + logger.error(log_text, exc_info=True) + + return FailedContainerRequest( + miner_hotkey=payload.miner_hotkey, + executor_id=payload.executor_id, + msg=f"Unexpected msg: {str(e)}", + ) MinerServiceDep = Annotated[MinerService, Depends(MinerService)] diff --git a/neurons/validators/src/services/redis_service.py b/neurons/validators/src/services/redis_service.py index 2d58f97..eeef0ef 100644 --- a/neurons/validators/src/services/redis_service.py +++ b/neurons/validators/src/services/redis_service.py @@ -7,6 +7,7 @@ MACHINE_SPEC_CHANNEL_NAME = "channel:1" RENTED_MACHINE_SET = "rented_machines" EXECUTOR_COUNT_PREFIX = "executor_counts" +AVAILABLE_PORT_MAPS_PREFIX = "available_port_maps" class RedisService: @@ -34,37 +35,71 @@ async def get(self, key: str): async with self.lock: return await self.redis.get(key) + async def delete(self, key: str): + """Remove a key from Redis.""" + async with self.lock: + await self.redis.delete(key) + async def sadd(self, key: str, elem: str): - """Add a machine ID to the set of rented machines.""" + """Add an element to a set in Redis.""" async with self.lock: await self.redis.sadd(key, elem) async def srem(self, key: str, elem: str): - """Remove a machine ID from the set of rented machines.""" + """Remove an element from a set in Redis.""" async with self.lock: await self.redis.srem(key, elem) async def is_elem_exists_in_set(self, key: str, elem: str) -> bool: - """Check if a machine ID is in the set of rented machines.""" + """Check an element exists or not in a set in Redis.""" async with self.lock: return await self.redis.sismember(key, elem) - async def get_all_elements(self, key: str): - """Get all elements from a set in Redis.""" + async def smembers(self, key: str): async with self.lock: return await self.redis.smembers(key) - async def clear_set(self, key: str): - """Clear all elements from a set in Redis.""" - async with self.lock: - await self.redis.delete(key) - async def add_rented_machine(self, machine: RentedMachine): await self.sadd(RENTED_MACHINE_SET, f"{machine.miner_hotkey}:{machine.executor_id}") async def remove_rented_machine(self, machine: RentedMachine): await self.srem(RENTED_MACHINE_SET, f"{machine.miner_hotkey}:{machine.executor_id}") + async def lpush(self, key: str, element: bytes): + """Add an element to a list in Redis.""" + async with self.lock: + await self.redis.lpush(key, element) + + async def lrange(self, key: str) -> list[bytes]: + """Get all elements from a list in Redis in order.""" + async with self.lock: + return await self.redis.lrange(key, 0, -1) + + async def lrem(self, key: str, element: bytes, count: int = 0): + """Remove elements from a list in Redis.""" + async with self.lock: + await self.redis.lrem(key, count, element) + + async def ltrim(self, key: str, max_length: int): + """Trim the list to maintain a maximum length.""" + async with self.lock: + await self.redis.ltrim(key, 0, max_length - 1) + + async def lpop(self, key: str) -> bytes: + """Remove and return the first element (last inserted) from a list in Redis.""" + async with self.lock: + return await self.redis.lpop(key) + + async def rpop(self, key: str) -> bytes: + """Remove and return the last element (first inserted) from a list in Redis.""" + async with self.lock: + return await self.redis.rpop(key) + + async def clear_set(self, key: str): + """Clear all elements from a set in Redis.""" + async with self.lock: + await self.redis.delete(key) + async def hset(self, key: str, field: str, value: str): async with self.lock: await self.redis.hset(key, field, value) @@ -81,10 +116,10 @@ async def hdel(self, key: str, *fields: str): async with self.lock: await self.redis.hdel(key, *fields) - async def delete_executor_count_hash(self, miner_hotkey: str): - redis_key = f"{EXECUTOR_COUNT_PREFIX}:{miner_hotkey}" + async def clear_by_pattern(self, pattern: str): async with self.lock: - await self.redis.delete(redis_key) + async for key in self.redis.scan_iter(match=pattern): + await self.redis.delete(key.decode()) async def clear_all_executor_counts(self): pattern = f"{EXECUTOR_COUNT_PREFIX}:*" @@ -97,3 +132,7 @@ async def clear_all_executor_counts(self): await self.redis.delete(*keys) if cursor == 0: break + + async def clear_all_ssh_ports(self): + pattern = f"{AVAILABLE_PORT_MAPS_PREFIX}:*" + await self.clear_by_pattern(pattern) diff --git a/neurons/validators/src/services/task_service.py b/neurons/validators/src/services/task_service.py index dcaff0a..1db869c 100644 --- a/neurons/validators/src/services/task_service.py +++ b/neurons/validators/src/services/task_service.py @@ -4,7 +4,7 @@ import logging import time import random -from typing import Annotated +from typing import Annotated, Optional, Tuple import asyncssh import bittensor @@ -21,9 +21,11 @@ MAX_UPLOAD_SPEED, UPLOAD_SPEED_WEIGHT, MAX_GPU_COUNT, + UNRENTED_MULTIPLIER, HASHCAT_CONFIGS, + LIB_NVIDIA_ML_DIGESTS, ) -from services.redis_service import RENTED_MACHINE_SET, RedisService +from services.redis_service import RedisService, RENTED_MACHINE_SET, AVAILABLE_PORT_MAPS_PREFIX from services.ssh_service import SSHService from services.hash_service import HashService @@ -121,21 +123,41 @@ async def clear_remote_directory( except: pass - def get_available_port( + def get_available_port_map( self, - port_range: str, - ) -> int: - if port_range: - if '-' in port_range: - min_port, max_port = map(int, (part.strip() for part in port_range.split('-'))) - ports = range(min_port, max_port + 1) + executor_info: ExecutorSSHInfo, + ) -> Optional[Tuple[int, int]]: + if executor_info.port_mappings: + port_mappings: list[Tuple[int, int]] = json.loads(executor_info.port_mappings) + port_mappings = [ + (internal_port, external_port) + for internal_port, external_port in port_mappings + if internal_port != executor_info.ssh_port and external_port != executor_info.ssh_port + ] + + if not port_mappings: + return None + + return random.choice(port_mappings) + + if executor_info.port_range: + if '-' in executor_info.port_range: + min_port, max_port = map(int, (part.strip() for part in executor_info.port_range.split('-'))) + ports = list(range(min_port, max_port + 1)) else: - ports = list(map(int, (part.strip() for part in port_range.split(',')))) + ports = list(map(int, (part.strip() for part in executor_info.port_range.split(',')))) else: # Default range if port_range is empty - ports = range(40000, 65536) + ports = list(range(40000, 65536)) + + ports = [port for port in ports if port != executor_info.ssh_port] + + if not ports: + return None + + internal_port = random.choice(ports) - return random.choice(ports) + return internal_port, internal_port async def docker_connection_check( self, @@ -146,7 +168,26 @@ async def docker_connection_check( private_key: str, public_key: str, ): - ssh_port = self.get_available_port(executor_info.port_range) + port_map = self.get_available_port_map(executor_info) + if port_map is None: + log_text = _m( + "No port available for docker container", + extra=get_extra_info({ + "job_batch_id": job_batch_id, + "miner_hotkey": miner_hotkey, + "executor_uuid": executor_info.uuid, + "executor_ip_address": executor_info.address, + "executor_port": executor_info.port, + "ssh_username": executor_info.ssh_username, + "ssh_port": executor_info.ssh_port, + }), + ) + log_status = "error" + logger.error(log_text, exc_info=True) + + return False, log_text, log_status + + internal_port, external_port = port_map executor_name = f"{executor_info.uuid}_{executor_info.address}_{executor_info.port}" default_extra = { "job_batch_id": job_batch_id, @@ -155,7 +196,9 @@ async def docker_connection_check( "executor_ip_address": executor_info.address, "executor_port": executor_info.port, "ssh_username": executor_info.ssh_username, - "ssh_port": ssh_port, + "ssh_port": executor_info.ssh_port, + "internal_port": internal_port, + "external_port": external_port, } context.set(f"[_docker_connection_check][{executor_name}]") @@ -169,13 +212,13 @@ async def docker_connection_check( container_name = f"container_{miner_hotkey}" docker_cmd = f"sh -c 'mkdir -p ~/.ssh && echo \"{public_key}\" >> ~/.ssh/authorized_keys && ssh-keygen -A && service ssh start && tail -f /dev/null'" - command = f"docker run -d --name {container_name} -p {ssh_port}:22 daturaai/compute-subnet-executor:latest {docker_cmd}" + command = f"docker run -d --name {container_name} -p {internal_port}:22 daturaai/compute-subnet-executor:latest {docker_cmd}" result = await ssh_client.run(command, timeout=20) if result.exit_status != 0: log_text = _m( "Error creating docker connection", - extra=get_extra_info({**default_extra, "error": str(e)}), + extra=get_extra_info(default_extra), ) log_status = "error" logger.error(log_text, exc_info=True) @@ -187,7 +230,7 @@ async def docker_connection_check( pkey = asyncssh.import_private_key(private_key) async with asyncssh.connect( host=executor_info.address, - port=ssh_port, + port=external_port, username=executor_info.ssh_username, client_keys=[pkey], known_hosts=None, @@ -198,6 +241,21 @@ async def docker_connection_check( ) logger.info(log_text) + # set port on redis + key = f"{AVAILABLE_PORT_MAPS_PREFIX}:{miner_hotkey}:{executor_info.uuid}" + port_map = f"{internal_port},{external_port}" + + # delete all the same port_maps in the list + await self.redis_service.lrem(key=key, element=port_map) + + # insert port_map in the list + await self.redis_service.lpush(key, port_map) + + # keep the latest 10 port maps + port_maps = await self.redis_service.lrange(key) + if len(port_maps) > 10: + await self.redis_service.rpop(key) + command = f"docker rm {container_name} -f" await ssh_client.run(command, timeout=20) @@ -280,7 +338,15 @@ async def create_task( await self.clear_remote_directory(ssh_client, remote_dir) - return None, executor_info, 0, miner_info.job_batch_id, log_status, log_text + return ( + None, + executor_info, + 0, + 0, + miner_info.job_batch_id, + log_status, + log_text, + ) machine_spec = json.loads(self.ssh_service.decrypt_payload(encypted_files.encrypt_key, machine_specs[0].strip())) @@ -295,32 +361,66 @@ async def create_task( max_score = GPU_MAX_SCORES.get(gpu_model, 0) gpu_count = machine_spec.get("gpu", {}).get("count", 0) + + nvidia_driver = machine_spec.get("gpu", {}).get("driver", '') + libnvidia_ml = machine_spec.get('md5_checksums', {}).get('libnvidia_ml', '') + + logger.info( + _m( + "Machine spec scraped", + extra=get_extra_info({ + **default_extra, + "gpu_model": gpu_model, + "gpu_count": gpu_count, + "nvidia_driver": nvidia_driver, + "libnvidia_ml": libnvidia_ml, + }), + ), + ) + + if not nvidia_driver or LIB_NVIDIA_ML_DIGESTS[nvidia_driver] != libnvidia_ml: + log_status = "warning" + log_text = _m( + f"Nvidia driver is altered", + extra=get_extra_info({ + **default_extra, + "libnvidia_ml": libnvidia_ml + }), + ) + logger.warning(log_text) + + await self.clear_remote_directory(ssh_client, remote_dir) + + return ( + machine_spec, + executor_info, + 0, + 0, + miner_info.job_batch_id, + log_status, + log_text, + ) + if gpu_count > MAX_GPU_COUNT: - score = 0 log_status = "warning" log_text = _m( f"GPU count({gpu_count}) is greater than the maximum allowed ({MAX_GPU_COUNT}).", extra=get_extra_info(default_extra), ) + logger.warning(log_text) + await self.clear_remote_directory(ssh_client, remote_dir) + return ( machine_spec, executor_info, 0, + 0, miner_info.job_batch_id, log_status, log_text, ) - logger.info( - _m( - "Machine spec scraped", - extra=get_extra_info( - {**default_extra, "gpu_model": gpu_model, "gpu_count": gpu_count} - ), - ), - ) - if max_score == 0 or gpu_count == 0: extra_info = { **default_extra, @@ -358,6 +458,7 @@ async def create_task( machine_spec, executor_info, 0, + 0, miner_info.job_batch_id, log_status, log_text, @@ -389,6 +490,7 @@ async def create_task( machine_spec, executor_info, score, + 0, miner_info.job_batch_id, log_status, log_text, @@ -414,7 +516,15 @@ async def create_task( await self.clear_remote_directory(ssh_client, remote_dir) - return None, executor_info, 0, miner_info.job_batch_id, log_status, log_text + return ( + None, + executor_info, + 0, + 0, + miner_info.job_batch_id, + log_status, + log_text, + ) # if not rented, check renting ports success, log_text, log_status = await self.docker_connection_check( @@ -428,7 +538,15 @@ async def create_task( if not success: await self.clear_remote_directory(ssh_client, remote_dir) - return None, executor_info, 0, miner_info.job_batch_id, log_status, log_text + return ( + None, + executor_info, + 0, + 0, + miner_info.job_batch_id, + log_status, + log_text, + ) # scoring hashcat_config = HASHCAT_CONFIGS[gpu_model] @@ -443,7 +561,15 @@ async def create_task( await self.clear_remote_directory(ssh_client, remote_dir) - return None, executor_info, 0, miner_info.job_batch_id, log_status, log_text + return ( + None, + executor_info, + 0, + 0, + miner_info.job_batch_id, + log_status, + log_text, + ) num_digits = hashcat_config.get('digits', 11) avg_job_time = hashcat_config.get("average_time")[gpu_count - 1] if hashcat_config.get("average_time") else 60 @@ -474,6 +600,7 @@ async def create_task( machine_spec, executor_info, 0, + 0, miner_info.job_batch_id, log_status, log_text, @@ -511,7 +638,7 @@ async def create_task( extra=get_extra_info(default_extra), ) logger.error(log_text) - + # elif job_taken_time > avg_job_time * 2: # log_status = "error" # log_text = _m( @@ -543,7 +670,7 @@ async def create_task( upload_speed_score = min(upload_speed / MAX_UPLOAD_SPEED, 1) download_speed_score = min(download_speed / MAX_DOWNLOAD_SPEED, 1) - score = max_score * gpu_count * ( + score = max_score * gpu_count * UNRENTED_MULTIPLIER * ( job_taken_score * JOB_TAKEN_TIME_WEIGHT + upload_speed_score * UPLOAD_SPEED_WEIGHT + download_speed_score * DOWNLOAD_SPEED_WEIGHT @@ -559,6 +686,8 @@ async def create_task( "job_taken_time": job_taken_time, "upload_speed": upload_speed, "download_speed": download_speed, + "gpu_model": gpu_model, + "gpu_count": gpu_count, } ), ) @@ -577,24 +706,45 @@ async def create_task( machine_spec, executor_info, score, + score, miner_info.job_batch_id, log_status, log_text, ) except Exception as e: - logger.error( - _m( - "Error creating task for executor", - extra=get_extra_info({**default_extra, "error": str(e)}), - ), - exc_info=True, - ) log_status = "error" log_text = _m( "Error creating task for executor", extra=get_extra_info({**default_extra, "error": str(e)}), ) - return None, executor_info, 0, miner_info.job_batch_id, log_status, log_text + + try: + key = f"{AVAILABLE_PORT_MAPS_PREFIX}:{miner_info.miner_hotkey}:{executor_info.uuid}" + await self.redis_service.delete(key) + except Exception as redis_error: + log_text = _m( + "Error creating task redis_reset_error", + extra=get_extra_info({ + **default_extra, + "error": str(e), + "redis_reset_error": str(redis_error), + }), + ) + + logger.error( + log_text, + exc_info=True, + ) + + return ( + None, + executor_info, + 0, + 0, + miner_info.job_batch_id, + log_status, + log_text, + ) async def _run_task( self, diff --git a/neurons/validators/src/test_validator.py b/neurons/validators/src/test_validator.py index 6d64846..1060949 100644 --- a/neurons/validators/src/test_validator.py +++ b/neurons/validators/src/test_validator.py @@ -1,3 +1,4 @@ +import asyncio from fastapi.testclient import TestClient from concurrent.futures import ThreadPoolExecutor, as_completed from services.docker_service import DockerService @@ -30,9 +31,13 @@ def test_socket_connections(): assert response.status_code == 200 -if __name__ == "__main__": - # test_socket_connections() +async def check_docker_port_mappings(): docker_service: DockerService = ioc["DockerService"] - range_external_ports = '3000 - 5000 ' - port_mappings = docker_service.generate_portMappings(range_external_ports) + miner_hotkey = '5Df8qGLMd19BXByefGCZFN57fWv6jDm5hUbnQeUTu2iqNBhT' + executor_id = 'c272060f-8eae-4265-8e26-1d83ac96b498' + port_mappings = await docker_service.generate_portMappings(miner_hotkey, executor_id) print('port_mappings ==>', port_mappings) + +if __name__ == "__main__": + # test_socket_connections() + asyncio.run(check_docker_port_mappings())