├── results └── tensorboard.png ├── data └── download_cifar10.sh ├── configs ├── experiments │ ├── train_exp01.yaml │ ├── test_exp01.yaml │ └── train_resume_exp01.yaml └── default.yaml ├── docker ├── entrypoint.sh └── Dockerfile ├── run.sh ├── docker-compose.yml ├── Pipfile ├── LICENSE ├── datasets.py ├── train.py ├── datamodule.py ├── model.py ├── schduler.py ├── README.md ├── models └── resnet.py └── Pipfile.lock /results/tensorboard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Keiku/PyTorch-Lightning-CIFAR10/HEAD/results/tensorboard.png -------------------------------------------------------------------------------- /data/download_cifar10.sh: -------------------------------------------------------------------------------- 1 | # CIFAR-10 Dataset Mirror https://pjreddie.com/projects/cifar-10-dataset-mirror/ 2 | wget http://pjreddie.com/media/files/cifar.tgz 3 | tar xzf cifar.tgz 4 | -------------------------------------------------------------------------------- /configs/experiments/train_exp01.yaml: -------------------------------------------------------------------------------- 1 | # @package _group_ 2 | 3 | model: 4 | classifier: 'resnet18' 5 | implementation: 'scratch' 6 | 7 | transform: 8 | normalization: 'cifar10' 9 | 10 | dataset: 11 | root_dir: '/home/anasys/datasets' 12 | loading: 'custom' 13 | 14 | train: 15 | batch_size: 512 16 | num_epochs: 200 17 | -------------------------------------------------------------------------------- /docker/entrypoint.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash -e 2 | 3 | USER_ID=$(id -u) 4 | GROUP_ID=$(id -g) 5 | 6 | # create group 7 | if [ x"$GROUP_ID" != x"0" ]; then 8 | groupadd -g $GROUP_ID $USER_NAME 9 | fi 10 | 11 | # create user 12 | if [ x"$USER_ID" != x"0" ]; then 13 | useradd -d /home/$USER_NAME -m -s /bin/bash -u $USER_ID -g $GROUP_ID $USER_NAME 14 | fi 15 | 16 | # revert permission 17 | sudo chmod u-s /usr/sbin/useradd 18 | sudo chmod u-s /usr/sbin/groupadd 19 | 20 | exec $@ 21 | -------------------------------------------------------------------------------- /configs/experiments/test_exp01.yaml: -------------------------------------------------------------------------------- 1 | # @package _group_ 2 | 3 | runs: 4 | evaluate: True 5 | 6 | dataset: 7 | root_dir : '/home/anasys/datasets' 8 | loading: 'custom' 9 | 10 | model: 11 | classifier: 'resnet18' 12 | implementation: 'scratch' 13 | 14 | transform: 15 | normalization: 'cifar10' 16 | 17 | test: 18 | hparams: './outputs/train_exp01/logs/resnet18/version_0/hparams.yaml' 19 | checkpoint: "./outputs/train_exp01/logs/resnet18/version_0/checkpoints/'epoch=198-step=19302.ckpt'" 20 | -------------------------------------------------------------------------------- /configs/experiments/train_resume_exp01.yaml: -------------------------------------------------------------------------------- 1 | # @package _group_ 2 | 3 | model: 4 | version: 'exp01' 5 | classifier: 'resnet18' 6 | implementation: 'scratch' 7 | 8 | transform: 9 | normalization: 'cifar10' 10 | 11 | dataset: 12 | root_dir: '/work/PyTorch-Lightning-CIFAR10/data' 13 | loading: 'torchvision' 14 | 15 | train: 16 | batch_size: 512 17 | num_epochs: 200 18 | resume: True 19 | checkpoint: "/mnt/nfs/kuroyanagi/clones/PyTorch-Lightning-CIFAR10/outputs/train_resume_exp01/logs/resnet18/exp01/checkpoints/last.ckpt" 20 | -------------------------------------------------------------------------------- /run.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | docker rm -f $(docker ps -q -a) 3 | docker run --rm --runtime=nvidia \ 4 | -v /mnt/:/mnt \ 5 | -v /mnt/nfs/kuroyanagi/clones/PyTorch-Lightning-CIFAR10/:/work/PyTorch-Lightning-CIFAR10 \ 6 | -v /home/anasys/datasets/:/work/PyTorch-Lightning-CIFAR10/data \ 7 | -u $(id -u):$(id -g) \ 8 | -e HOSTNAME=$(hostname) \ 9 | -e HOME=/home/docker \ 10 | --workdir /work/PyTorch-Lightning-CIFAR10 \ 11 | --ipc host \ 12 | keiku/pytorch-lightning-cifar10 'python train.py +experiments=train_resume_exp01 hydra.run.dir=outputs/train_resume_exp01' 13 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: "2.3" 2 | services: 3 | dev: 4 | image: keiku/pytorch-lightning-cifar10 5 | build: 6 | context: . 7 | dockerfile: ./docker/Dockerfile 8 | args: 9 | UID: ${UID} 10 | TIMEZONE: Asia/Tokyo 11 | PYTHON_VERSION: 3.8.5 12 | GITHUB_TOKEN: ${GITHUB_TOKEN} 13 | tty: true 14 | working_dir: /work 15 | volumes: 16 | - $PWD:/work 17 | - /mnt:/mnt 18 | ports: 19 | - 8888:8888 # jupyter notebook 20 | hostname: ${HOSTNAME}_docker 21 | ipc: host 22 | runtime: nvidia 23 | environment: 24 | - NVIDIA_VISIBLE_DEVICES=all 25 | - NVIDIA_DRIVER_CAPABILITIES=all 26 | -------------------------------------------------------------------------------- /Pipfile: -------------------------------------------------------------------------------- 1 | [[source]] 2 | url = "https://pypi.org/simple" 3 | verify_ssl = true 4 | name = "pypi" 5 | 6 | [[source]] 7 | name = "pytorch" 8 | url = "https://download.pytorch.org/whl/torch_stable.html" 9 | verify_ssl = false 10 | 11 | [packages] 12 | torch = "==1.10.0" 13 | torchvision = "==0.11.1" 14 | pytorch-lightning = "==1.5.2" 15 | hydra-core = "==1.0.0" 16 | hydra-colorlog = "*" 17 | omegaconf = "==2.0.1" 18 | wandb = "*" 19 | timm = "==0.4.12" 20 | pandas = "*" 21 | torchmetrics = "*" 22 | aiohttp = "*" 23 | pillow = ">=8.3.2" 24 | 25 | [dev-packages] 26 | ipdb = "*" 27 | vulture = "*" 28 | isort = "*" 29 | black = "*" 30 | 31 | [requires] 32 | python_version = "3.8" 33 | 34 | [pipenv] 35 | allow_prereleases = true 36 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Keiichi Kuroyanagi 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /docker/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM nvidia/cuda:11.1-devel-ubuntu20.04 2 | # If the host OS is Ubuntu 18.04 3 | RUN apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/3bf863cc.pub 4 | 5 | ENV DEBIAN_FRONTEND=noninteractive 6 | 7 | # install some basic utilities 8 | RUN apt-get update && apt-get install -y \ 9 | curl \ 10 | ca-certificates \ 11 | sudo \ 12 | git \ 13 | tzdata \ 14 | ffmpeg 15 | 16 | ARG TIMEZONE 17 | RUN ln -sf /usr/share/zoneinfo/${TIMEZONE} /etc/localtime 18 | 19 | # install python 20 | RUN apt-get update && apt-get install -y \ 21 | python3 \ 22 | python3-pip \ 23 | pipenv \ 24 | && rm -rf /var/lib/apt/lists/* 25 | 26 | RUN ln -s /bin/python3.8 /bin/python 27 | RUN pip3 install -U pip 28 | 29 | # set the user created by entrypoint to sudouser 30 | ENV USER_NAME=docker 31 | RUN echo "${USER_NAME} ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers.d/${USER_NAME} 32 | RUN chmod u+s /usr/sbin/useradd \ 33 | && chmod u+s /usr/sbin/groupadd 34 | 35 | # install python virtualenv from Pipfile 36 | COPY Pipfile ./ 37 | COPY Pipfile.lock ./ 38 | RUN pipenv install --system 39 | 40 | # create a user with the same id as docker host 41 | COPY docker/entrypoint.sh /tmp/entrypoint.sh 42 | ENTRYPOINT ["/tmp/entrypoint.sh"] 43 | 44 | # set the default command 45 | CMD ["bash"] 46 | -------------------------------------------------------------------------------- /configs/default.yaml: -------------------------------------------------------------------------------- 1 | defaults: 2 | - hydra/job_logging: colorlog 3 | - hydra/hydra_logging: colorlog 4 | 5 | hydra: 6 | run: 7 | dir: ./outputs 8 | output_subdir: ./configs/${now:%Y-%m-%d}/${now:%H-%M-%S} 9 | 10 | runs: 11 | dev: False 12 | evaluate: False 13 | # Specify 'tensorboard' or 'wandb'. 14 | logger: 'tensorboard' 15 | gpu_id: '0' 16 | precision: 32 17 | 18 | dataset: 19 | # Do not specify AWS EFS. Please specify AWS EBS. 20 | root_dir: '/home/anasys/datasets' 21 | # Specify 'custom' when loading as a custom dataset. By default, load by torchvision is performed. 22 | loading: 'torchvision' 23 | 24 | model: 25 | version: null 26 | project: 'cifar10' 27 | classifier: 'resnet18' 28 | # Specify 'scratch' or 'timm'. 29 | implementation: 'scratch' 30 | # Specifies whether to use the pretrained model with timm. 31 | pretrained: True 32 | 33 | transform: 34 | # Specify 'cidar10' in the scratch implementation of resnet, and specify 'imagenet' when using the pretrained model of timm. 35 | normalization: 'cifar10' 36 | 37 | train: 38 | num_classes: 10 39 | num_epochs: 200 40 | batch_size: 512 41 | num_workers: 4 42 | learning_rate: 1e-2 43 | weight_decay: 1e-2 44 | tensorboard_dir: 'logs' 45 | resume: False 46 | checkpoint: null 47 | 48 | test: 49 | batch_size: 512 50 | hparams: './outputs/train_exp01/logs/resnet18/version_0/hparams.yaml' 51 | checkpoint: "./outputs/train_exp01/logs/resnet18/version_0/checkpoints/'epoch=198-step=19302.ckpt'" 52 | -------------------------------------------------------------------------------- /datasets.py: -------------------------------------------------------------------------------- 1 | import re 2 | from pathlib import Path 3 | 4 | import numpy as np 5 | import pandas as pd 6 | import torch 7 | from PIL import Image 8 | 9 | 10 | class CIFAR10Dataset(torch.utils.data.Dataset): 11 | def __init__(self, cfg, train, transform=None): 12 | super(CIFAR10Dataset, self).__init__() 13 | self.transform = transform 14 | self.cfg = cfg 15 | self.split_dir = "train" if train else "test" 16 | self.root_dir = Path(cfg.dataset.root_dir) 17 | self.image_dir = self.root_dir / "cifar" / self.split_dir 18 | self.file_list = [p.name for p in self.image_dir.rglob("*") if p.is_file()] 19 | self.labels = [re.split("_|\.", l)[1] for l in self.file_list] 20 | self.targets = self.label_mapping(cfg) 21 | 22 | def label_mapping(self, cfg): 23 | labels = self.labels 24 | label_mapping_path = Path(cfg.dataset.root_dir) / "cifar/labels.txt" 25 | df_label_mapping = pd.read_table(label_mapping_path.as_posix(), names=["label"]) 26 | df_label_mapping["target"] = range(cfg.train.num_classes) 27 | 28 | label_mapping_dict = dict( 29 | zip( 30 | df_label_mapping["label"].values.tolist(), 31 | df_label_mapping["target"].values.tolist(), 32 | ) 33 | ) 34 | 35 | targets = [label_mapping_dict[i] for i in labels] 36 | return targets 37 | 38 | def __getitem__(self, index): 39 | filename = self.file_list[index] 40 | targets = self.targets[index] 41 | image_path = self.image_dir / filename 42 | image = Image.open(image_path.as_posix()) 43 | 44 | if self.transform is not None: 45 | transform = self.transform 46 | image = transform(image) 47 | 48 | return image, targets 49 | 50 | def __len__(self): 51 | return self.len 52 | -------------------------------------------------------------------------------- /train.py: -------------------------------------------------------------------------------- 1 | import os 2 | from pathlib import Path 3 | 4 | import hydra 5 | import torch 6 | from hydra.core.hydra_config import HydraConfig 7 | from omegaconf import DictConfig, OmegaConf 8 | from pytorch_lightning import Trainer, seed_everything 9 | from pytorch_lightning.callbacks import LearningRateMonitor, ModelCheckpoint 10 | from pytorch_lightning.loggers import TensorBoardLogger, WandbLogger 11 | 12 | from datamodule import LitCIFAR10DataModule 13 | from model import LitCIFAR10Model 14 | 15 | 16 | @hydra.main(config_path="./configs", config_name="default.yaml") 17 | def main(cfg: DictConfig) -> None: 18 | 19 | if "experiments" in cfg.keys(): 20 | cfg = OmegaConf.merge(cfg, cfg.experiments) 21 | 22 | seed_everything(0) 23 | os.environ["CUDA_VISIBLE_DEVICES"] = cfg.runs.gpu_id 24 | 25 | if cfg.runs.logger == "wandb": 26 | logger = WandbLogger(name=cfg.model.classifier, project=cfg.model.project) 27 | elif cfg.runs.logger == "tensorboard": 28 | logger = TensorBoardLogger( 29 | cfg.train.tensorboard_dir, 30 | name=cfg.model.classifier, 31 | version=cfg.model.version, 32 | ) 33 | 34 | checkpoint = ModelCheckpoint(monitor="acc/val", mode="max", save_last=True) 35 | lr_monitor = LearningRateMonitor(logging_interval="step") 36 | 37 | if cfg.train.resume and Path(cfg.train.checkpoint).exists(): 38 | resume_checkpoint = cfg.train.checkpoint 39 | else: 40 | resume_checkpoint = None 41 | 42 | trainer = Trainer( 43 | fast_dev_run=cfg.runs.dev, 44 | logger=logger if not (cfg.runs.dev or cfg.runs.evaluate) else None, 45 | gpus=-1, 46 | deterministic=True, 47 | enable_model_summary=False, 48 | log_every_n_steps=1, 49 | max_epochs=cfg.train.num_epochs, 50 | precision=cfg.runs.precision, 51 | resume_from_checkpoint=resume_checkpoint, 52 | callbacks=[checkpoint, lr_monitor], 53 | ) 54 | 55 | datamodule = LitCIFAR10DataModule(cfg) 56 | model = LitCIFAR10Model(cfg, trainer) 57 | 58 | if cfg.runs.evaluate: 59 | hparams = OmegaConf.load(cfg.test.hparams) 60 | model = LitCIFAR10Model.load_from_checkpoint( 61 | checkpoint_path=cfg.test.checkpoint, **hparams 62 | ) 63 | trainer.test(model, datamodule.test_dataloader()) 64 | else: 65 | trainer.fit(model, datamodule) 66 | # NOTE After changing to pytorch-lightning 1.5.2, omitting the argument of trainer.test() does not work. · Discussion #10747 · PyTorchLightning/pytorch-lightning https://github.com/PyTorchLightning/pytorch-lightning/discussions/10747 67 | trainer.test(model, datamodule.test_dataloader()) 68 | 69 | 70 | if __name__ == "__main__": 71 | main() 72 | -------------------------------------------------------------------------------- /datamodule.py: -------------------------------------------------------------------------------- 1 | import pytorch_lightning as pl 2 | from torch.utils.data import DataLoader 3 | from torchvision import transforms as T 4 | from torchvision.datasets import CIFAR10 5 | 6 | from datasets import CIFAR10Dataset 7 | 8 | 9 | class LitCIFAR10DataModule(pl.LightningDataModule): 10 | def __init__(self, cfg): 11 | super().__init__() 12 | self.cfg = cfg 13 | self.mean = self.set_normalization(cfg)["mean"] 14 | self.std = self.set_normalization(cfg)["std"] 15 | 16 | def set_normalization(self, cfg): 17 | # Image classification on the CIFAR10 dataset - Albumentations Documentation https://albumentations.ai/docs/autoalbument/examples/cifar10/ 18 | if cfg.transform.normalization == "cifar10": 19 | mean = (0.4914, 0.4822, 0.4465) 20 | std = (0.2471, 0.2435, 0.2616) 21 | elif cfg.transform.normalization == "imagenet": 22 | # ImageNet - torchbench Docs https://paperswithcode.github.io/torchbench/imagenet/ 23 | mean = (0.485, 0.456, 0.406) 24 | std = (0.229, 0.224, 0.225) 25 | return {"mean": mean, "std": std} 26 | 27 | def get_dataset(self, cfg, train, transform): 28 | if cfg.dataset.loading == "torchvision": 29 | dataset = CIFAR10( 30 | root=cfg.dataset.root_dir, 31 | train=train, 32 | transform=transform, 33 | download=train, 34 | ) 35 | elif cfg.dataset.loading == "custom": 36 | dataset = CIFAR10Dataset( 37 | cfg=cfg, 38 | train=train, 39 | transform=transform, 40 | ) 41 | else: 42 | raise NotImplementedError 43 | return dataset 44 | 45 | def train_dataloader(self): 46 | cfg = self.cfg 47 | transform = T.Compose( 48 | [ 49 | T.RandomCrop(32, padding=4), 50 | T.RandomHorizontalFlip(), 51 | T.ToTensor(), 52 | T.Normalize(self.mean, self.std), 53 | ] 54 | ) 55 | dataset = self.get_dataset( 56 | cfg=cfg, 57 | train=True, 58 | transform=transform, 59 | ) 60 | dataloader = DataLoader( 61 | dataset, 62 | batch_size=cfg.train.batch_size, 63 | num_workers=cfg.train.num_workers, 64 | shuffle=True, 65 | drop_last=True, 66 | pin_memory=True, 67 | ) 68 | return dataloader 69 | 70 | def val_dataloader(self): 71 | cfg = self.cfg 72 | transform = T.Compose( 73 | [ 74 | T.ToTensor(), 75 | T.Normalize(self.mean, self.std), 76 | ] 77 | ) 78 | dataset = self.get_dataset(cfg=cfg, train=False, transform=transform) 79 | dataloader = DataLoader( 80 | dataset, 81 | batch_size=cfg.train.batch_size, 82 | num_workers=cfg.train.num_workers, 83 | drop_last=True, 84 | pin_memory=True, 85 | ) 86 | return dataloader 87 | 88 | def test_dataloader(self): 89 | return self.val_dataloader() 90 | -------------------------------------------------------------------------------- /model.py: -------------------------------------------------------------------------------- 1 | import pytorch_lightning as pl 2 | import timm 3 | import torch 4 | import torchmetrics 5 | 6 | from models.resnet import resnet18, resnet34, resnet50 7 | from schduler import WarmupCosineLR 8 | 9 | from pytorch_lightning import LightningModule, Trainer, LightningDataModule 10 | 11 | 12 | classifiers = { 13 | "resnet18": resnet18(), 14 | "resnet34": resnet34(), 15 | "resnet50": resnet50(), 16 | } 17 | 18 | 19 | class LitCIFAR10Model(pl.LightningModule): 20 | def __init__(self, cfg, trainer, *args, **kwargs): 21 | super().__init__(*args, **kwargs) 22 | self.save_hyperparameters() 23 | self.cfg = cfg 24 | 25 | self.criterion = torch.nn.CrossEntropyLoss() 26 | self.accuracy = torchmetrics.Accuracy() 27 | 28 | self.model = self.get_model(cfg) 29 | self.trainer = trainer 30 | 31 | def get_model(self, cfg): 32 | if cfg.model.implementation == "scratch": 33 | model = classifiers[self.cfg.model.classifier] 34 | elif cfg.model.implementation == "timm": 35 | model = timm.create_model( 36 | cfg.model.classifier, 37 | pretrained=cfg.model.pretrained, 38 | num_classes=cfg.train.num_classes, 39 | ) 40 | else: 41 | raise NotImplementedError() 42 | 43 | return model 44 | 45 | def forward(self, batch): 46 | images, labels = batch 47 | predictions = self.model(images) 48 | loss = self.criterion(predictions, labels) 49 | accuracy = self.accuracy(predictions, labels) 50 | return loss, accuracy * 100 51 | 52 | def training_step(self, batch, batch_nb): 53 | loss, accuracy = self.forward(batch) 54 | self.log("loss/train", loss) 55 | self.log("acc/train", accuracy) 56 | return loss 57 | 58 | def validation_step(self, batch, batch_nb): 59 | loss, accuracy = self.forward(batch) 60 | self.log("loss/val", loss) 61 | self.log("acc/val", accuracy) 62 | return loss 63 | 64 | def test_step(self, batch, batch_nb): 65 | loss, accuracy = self.forward(batch) 66 | self.log("acc/test", accuracy) 67 | 68 | def setup_steps(self, stage=None): 69 | # NOTE There is a problem that len(train_loader) does not work. 70 | # After updating to 1.5.2, NotImplementedError: `train_dataloader` · Discussion #10652 · PyTorchLightning/pytorch-lightning https://github.com/PyTorchLightning/pytorch-lightning/discussions/10652 71 | train_loader = self.trainer._data_connector._train_dataloader_source.dataloader() 72 | return len(train_loader) 73 | 74 | def configure_optimizers(self): 75 | cfg = self.cfg 76 | optimizer = torch.optim.SGD( 77 | self.model.parameters(), 78 | lr=cfg.train.learning_rate, 79 | weight_decay=cfg.train.weight_decay, 80 | momentum=0.9, 81 | nesterov=True, 82 | ) 83 | total_steps = cfg.train.num_epochs * self.setup_steps(self) 84 | scheduler = { 85 | "scheduler": WarmupCosineLR( 86 | optimizer, warmup_epochs=total_steps * 0.3, max_epochs=total_steps 87 | ), 88 | "interval": "step", 89 | "name": "learning_rate", 90 | } 91 | return [optimizer], [scheduler] 92 | -------------------------------------------------------------------------------- /schduler.py: -------------------------------------------------------------------------------- 1 | import math 2 | import warnings 3 | from typing import List 4 | 5 | from torch.optim import Optimizer 6 | from torch.optim.lr_scheduler import _LRScheduler 7 | 8 | 9 | class WarmupCosineLR(_LRScheduler): 10 | """ 11 | Sets the learning rate of each parameter group to follow a linear warmup schedule 12 | between warmup_start_lr and base_lr followed by a cosine annealing schedule between 13 | base_lr and eta_min. 14 | .. warning:: 15 | It is recommended to call :func:`.step()` for :class:`LinearWarmupCosineAnnealingLR` 16 | after each iteration as calling it after each epoch will keep the starting lr at 17 | warmup_start_lr for the first epoch which is 0 in most cases. 18 | .. warning:: 19 | passing epoch to :func:`.step()` is being deprecated and comes with an EPOCH_DEPRECATION_WARNING. 20 | It calls the :func:`_get_closed_form_lr()` method for this scheduler instead of 21 | :func:`get_lr()`. Though this does not change the behavior of the scheduler, when passing 22 | epoch param to :func:`.step()`, the user should call the :func:`.step()` function before calling 23 | train and validation methods. 24 | Args: 25 | optimizer (Optimizer): Wrapped optimizer. 26 | warmup_epochs (int): Maximum number of iterations for linear warmup 27 | max_epochs (int): Maximum number of iterations 28 | warmup_start_lr (float): Learning rate to start the linear warmup. Default: 0. 29 | eta_min (float): Minimum learning rate. Default: 0. 30 | last_epoch (int): The index of last epoch. Default: -1. 31 | Example: 32 | >>> layer = nn.Linear(10, 1) 33 | >>> optimizer = Adam(layer.parameters(), lr=0.02) 34 | >>> scheduler = LinearWarmupCosineAnnealingLR(optimizer, warmup_epochs=10, max_epochs=40) 35 | >>> # 36 | >>> # the default case 37 | >>> for epoch in range(40): 38 | ... # train(...) 39 | ... # validate(...) 40 | ... scheduler.step() 41 | >>> # 42 | >>> # passing epoch param case 43 | >>> for epoch in range(40): 44 | ... scheduler.step(epoch) 45 | ... # train(...) 46 | ... # validate(...) 47 | """ 48 | 49 | def __init__( 50 | self, 51 | optimizer: Optimizer, 52 | warmup_epochs: int, 53 | max_epochs: int, 54 | warmup_start_lr: float = 1e-8, 55 | eta_min: float = 1e-8, 56 | last_epoch: int = -1, 57 | ) -> None: 58 | 59 | self.warmup_epochs = warmup_epochs 60 | self.max_epochs = max_epochs 61 | self.warmup_start_lr = warmup_start_lr 62 | self.eta_min = eta_min 63 | 64 | super(WarmupCosineLR, self).__init__(optimizer, last_epoch) 65 | 66 | def get_lr(self) -> List[float]: 67 | """ 68 | Compute learning rate using chainable form of the scheduler 69 | """ 70 | if not self._get_lr_called_within_step: 71 | warnings.warn( 72 | "To get the last learning rate computed by the scheduler, " 73 | "please use `get_last_lr()`.", 74 | UserWarning, 75 | ) 76 | 77 | if self.last_epoch == 0: 78 | return [self.warmup_start_lr] * len(self.base_lrs) 79 | elif self.last_epoch < self.warmup_epochs: 80 | return [ 81 | group["lr"] 82 | + (base_lr - self.warmup_start_lr) / (self.warmup_epochs - 1) 83 | for base_lr, group in zip(self.base_lrs, self.optimizer.param_groups) 84 | ] 85 | elif self.last_epoch == self.warmup_epochs: 86 | return self.base_lrs 87 | elif (self.last_epoch - 1 - self.max_epochs) % ( 88 | 2 * (self.max_epochs - self.warmup_epochs) 89 | ) == 0: 90 | return [ 91 | group["lr"] 92 | + (base_lr - self.eta_min) 93 | * (1 - math.cos(math.pi / (self.max_epochs - self.warmup_epochs))) 94 | / 2 95 | for base_lr, group in zip(self.base_lrs, self.optimizer.param_groups) 96 | ] 97 | 98 | return [ 99 | ( 100 | 1 101 | + math.cos( 102 | math.pi 103 | * (self.last_epoch - self.warmup_epochs) 104 | / (self.max_epochs - self.warmup_epochs) 105 | ) 106 | ) 107 | / ( 108 | 1 109 | + math.cos( 110 | math.pi 111 | * (self.last_epoch - self.warmup_epochs - 1) 112 | / (self.max_epochs - self.warmup_epochs) 113 | ) 114 | ) 115 | * (group["lr"] - self.eta_min) 116 | + self.eta_min 117 | for group in self.optimizer.param_groups 118 | ] 119 | 120 | def _get_closed_form_lr(self) -> List[float]: 121 | """ 122 | Called when epoch is passed as a param to the `step` function of the scheduler. 123 | """ 124 | if self.last_epoch < self.warmup_epochs: 125 | return [ 126 | self.warmup_start_lr 127 | + self.last_epoch 128 | * (base_lr - self.warmup_start_lr) 129 | / (self.warmup_epochs - 1) 130 | for base_lr in self.base_lrs 131 | ] 132 | 133 | return [ 134 | self.eta_min 135 | + 0.5 136 | * (base_lr - self.eta_min) 137 | * ( 138 | 1 139 | + math.cos( 140 | math.pi 141 | * (self.last_epoch - self.warmup_epochs) 142 | / (self.max_epochs - self.warmup_epochs) 143 | ) 144 | ) 145 | for base_lr in self.base_lrs 146 | ] 147 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # PyTorch-Lightning-CIFAR10 2 | "Not too complicated" training code for CIFAR-10 by PyTorch Lightning 3 | 4 | ## :gift: Dataset 5 | 6 | Details of CIFAR-10 can be found at the following link. [CIFAR-10 and CIFAR-100 datasets](https://www.cs.toronto.edu/~kriz/cifar.html) 7 | 8 | ## :package: PyTorch Environment 9 | 10 | I am using the following PyTorch environment. See `Pipfile` for more information. 11 | 12 | * torch==1.10.0 13 | * torchvision==0.11.1 14 | * pytorch-lightning==1.5.2 15 | 16 | ## :whale: Instalation 17 | 18 | I run in the following environment. If you have a similar environment, you can prepare the environment immediately with pipenv. 19 | 20 | * Ubuntu 20.04.1 LTS 21 | * CUDA Version 11.1 22 | * Python 3.8.5 23 | 24 | ``` 25 | pip install pipenv 26 | pipenv sync 27 | ``` 28 | 29 | If you do not have a cuda environment, please use Docker. Build docker with the following command. 30 | 31 | ``` 32 | docker-compose up -d dev 33 | ``` 34 | 35 | Run docker with the following command. The following command is for fish shell. For bash, replace `()` with `$()`. 36 | 37 | ``` 38 | docker run --rm -it --runtime=nvidia \ 39 | -v /mnt/:/mnt \ 40 | -v /mnt/nfs/kuroyanagi/clones/PyTorch-Lightning-CIFAR10/:/work/PyTorch-Lightning-CIFAR10 \ 41 | -u (id -u):(id -g) \ 42 | -e HOSTNAME=(hostname) \ 43 | -e HOME=/home/docker \ 44 | --workdir /work/PyTorch-Lightning-CIFAR10 \ 45 | --ipc host \ 46 | keiku/pytorch-lightning-cifar10 bash 47 | ``` 48 | 49 | ## :gift: Prepare dataset 50 | 51 | This repository is implemented in two ways, one is to load CIFAR-10 from **torchvision** and the other is to load CIFAR-10 as a **custom dataset**. I want you to use it as learning how to use custom dataset. 52 | 53 | If you want to load CIFAR-10 from **torchvision**, specify config as follows. 54 | 55 | ``` 56 | dataset: 57 | loading: 'torchvision' 58 | ``` 59 | 60 | If you want to load CIFAR-10 as a **custom dataset**, download the raw image as shown below. 61 | 62 | ``` 63 | cd data/ 64 | bash download_cifar10.sh # Downloads the CIFAR-10 dataset (~161 MB) 65 | ``` 66 | Also, specify config as custom for loading. 67 | 68 | ``` 69 | dataset: 70 | loading: 'custom' 71 | ``` 72 | 73 | ## :writing_hand: Modeling 74 | 75 | The following three methods are available for modeling. 76 | 77 | * **Scratch implementation** resnet18, resnet32, resnet50 78 | * **timm** 79 | 80 | When using the scratch implementation of resnet, specify config as follows. 81 | 82 | ``` 83 | model: 84 | classifier: 'resnet18' 85 | implementation: 'scratch' 86 | 87 | transform: 88 | normalization: 'cifar10' 89 | ``` 90 | 91 | When using timm's imagenet pretrained model, specify config as follows. 92 | 93 | ``` 94 | model: 95 | classifier: 'resnet18' 96 | implementation: 'timm' 97 | pretrained: True 98 | 99 | transform: 100 | normalization: 'imagenet' 101 | ``` 102 | 103 | ## :runner: Train 104 | 105 | `train.py` performs training/validation according to the specified config. The checkpoint is saved in the best epoch that monitors the accuracy of validation. 106 | 107 | To execute the experiment of `configs/experiments/train_exp01.yaml`, execute as follows. Specify the output destination as `hydra.run.dir=outputs/train_exp01`. 108 | 109 | ``` 110 | pipenv run python train.py +experiments=train_exp01 hydra.run.dir=outputs/train_exp01 111 | ``` 112 | 113 | If you use Docker, execute the following command. 114 | 115 | ``` 116 | export TORCH_HOME=/home/docker 117 | python train.py +experiments=train_exp01 hydra.run.dir=outputs/train_exp01 118 | ``` 119 | 120 | ## :running_man: Resume Training 121 | 122 | If you want to resume training, specify the following config. 123 | 124 | ``` 125 | train: 126 | resume: True 127 | checkpoint: "/mnt/nfs/kuroyanagi/clones/PyTorch-Lightning-CIFAR10/outputs/train_resume_exp01/logs/resnet18/exp01/checkpoints/last.ckpt" 128 | ``` 129 | 130 | Even if you interrupt while using AWS spot instance, you can read `last.ckpt` and restart from the next epoch learning. You can use `run.sh` as a command when restarting. 131 | 132 | ## :standing_person: Test 133 | 134 | Specify `evaluate: True` in config as shown below. 135 | 136 | ``` 137 | runs: 138 | evaluate: True 139 | ``` 140 | You can run test with the same code as train. 141 | 142 | ``` 143 | pipenv run python train.py +experiments=test_exp01 hydra.run.dir=outputs/test_exp01 144 | ``` 145 | 146 | The following results are obtained. 147 | 148 | ``` 149 | Global seed set to 0 150 | GPU available: True, used: True 151 | TPU available: None, using: 0 TPU cores 152 | LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0] 153 | Testing: 100%|████████████████████████████████████████| 19/19 [00:03<00:00, 5.88it/s] 154 | -------------------------------------------------------------------------------- 155 | DATALOADER:0 TEST RESULTS 156 | {'acc/test': 93.1743392944336} 157 | -------------------------------------------------------------------------------- 158 | ``` 159 | 160 | ## :chart_with_upwards_trend: Results 161 | 162 | The results of TensorBoard are as follows. 163 | 164 | ![tensorboard](results/tensorboard.png) 165 | 166 | ## :zap: PyTorch Lightning API 167 | 168 | #### LightningDataModule API in `datamodule.py` 169 | 170 | - [x] `LightningDataModule` 171 | - [ ] `prepare_data()` 172 | - [ ] `setup()` 173 | - [x] `train_dataloader()` 174 | - [x] `val_dataloader()` 175 | - [x] `test_dataloader()` 176 | 177 | #### LightningModule API in `model.py` 178 | 179 | - [x] `LightningModule` 180 | - [x] `forward()` 181 | - [x] `training_step()` 182 | - [x] `validation_step()` 183 | - [x] `test_step()` 184 | - [x] `configure_optimizers()` 185 | 186 | #### Metrics in `model.py` 187 | 188 | - [x] `torchmetrics.Accuracy()` 189 | 190 | #### API in `train.py` 191 | 192 | #### Lightning CLI API 193 | 194 | - [ ] `LightningCLI()` 195 | 196 | #### Trainer API 197 | 198 | - [x] `Trainer` 199 | - [x] `.fit()` 200 | - [x] `ModelCheckpoint()` 201 | - [x] `LearningRateMonitor()` 202 | - [x] `.load_from_checkpoint()` 203 | - [x] `.test()` 204 | 205 | #### Loggers API 206 | 207 | - [x] `TensorBoardLogger()` 208 | - [x] `WandbLogger()` 209 | 210 | 211 | ## :closed_book: References 212 | 213 | * [huyvnphan/PyTorch_CIFAR10](https://github.com/huyvnphan/PyTorch_CIFAR10) 214 | 215 | ## :rocket: TODOs 216 | 217 | - [x] Check code format with black, isort, vulture 218 | - [x] Docker and pipenv 219 | - [x] TensorBoard and Wandb logging 220 | - [x] Loading by custom dataset 221 | - [x] Transfer learning by timm 222 | - [x] Simple evaluation using `.load_from_checkpoint()` 223 | - [x] Resume training 224 | - [x] Use torchmetrics 225 | - [ ] Transform by albumentations 226 | - [ ] Remove Hydra and use Lightning CLI and config files 227 | -------------------------------------------------------------------------------- /models/resnet.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | import torch 4 | import torch.nn as nn 5 | 6 | __all__ = [ 7 | "ResNet", 8 | "resnet18", 9 | "resnet34", 10 | "resnet50", 11 | ] 12 | 13 | 14 | def conv3x3(in_planes, out_planes, stride=1, groups=1, dilation=1): 15 | """3x3 convolution with padding""" 16 | return nn.Conv2d( 17 | in_planes, 18 | out_planes, 19 | kernel_size=3, 20 | stride=stride, 21 | padding=dilation, 22 | groups=groups, 23 | bias=False, 24 | dilation=dilation, 25 | ) 26 | 27 | 28 | def conv1x1(in_planes, out_planes, stride=1): 29 | """1x1 convolution""" 30 | return nn.Conv2d(in_planes, out_planes, kernel_size=1, stride=stride, bias=False) 31 | 32 | 33 | class BasicBlock(nn.Module): 34 | expansion = 1 35 | 36 | def __init__( 37 | self, 38 | inplanes, 39 | planes, 40 | stride=1, 41 | downsample=None, 42 | groups=1, 43 | base_width=64, 44 | dilation=1, 45 | norm_layer=None, 46 | ): 47 | super(BasicBlock, self).__init__() 48 | if norm_layer is None: 49 | norm_layer = nn.BatchNorm2d 50 | if groups != 1 or base_width != 64: 51 | raise ValueError("BasicBlock only supports groups=1 and base_width=64") 52 | if dilation > 1: 53 | raise NotImplementedError("Dilation > 1 not supported in BasicBlock") 54 | # Both self.conv1 and self.downsample layers downsample the input when stride != 1 55 | self.conv1 = conv3x3(inplanes, planes, stride) 56 | self.bn1 = norm_layer(planes) 57 | self.relu = nn.ReLU(inplace=True) 58 | self.conv2 = conv3x3(planes, planes) 59 | self.bn2 = norm_layer(planes) 60 | self.downsample = downsample 61 | self.stride = stride 62 | 63 | def forward(self, x): 64 | identity = x 65 | 66 | out = self.conv1(x) 67 | out = self.bn1(out) 68 | out = self.relu(out) 69 | 70 | out = self.conv2(out) 71 | out = self.bn2(out) 72 | 73 | if self.downsample is not None: 74 | identity = self.downsample(x) 75 | 76 | out += identity 77 | out = self.relu(out) 78 | 79 | return out 80 | 81 | 82 | class Bottleneck(nn.Module): 83 | expansion = 4 84 | 85 | def __init__( 86 | self, 87 | inplanes, 88 | planes, 89 | stride=1, 90 | downsample=None, 91 | groups=1, 92 | base_width=64, 93 | dilation=1, 94 | norm_layer=None, 95 | ): 96 | super(Bottleneck, self).__init__() 97 | if norm_layer is None: 98 | norm_layer = nn.BatchNorm2d 99 | width = int(planes * (base_width / 64.0)) * groups 100 | # Both self.conv2 and self.downsample layers downsample the input when stride != 1 101 | self.conv1 = conv1x1(inplanes, width) 102 | self.bn1 = norm_layer(width) 103 | self.conv2 = conv3x3(width, width, stride, groups, dilation) 104 | self.bn2 = norm_layer(width) 105 | self.conv3 = conv1x1(width, planes * self.expansion) 106 | self.bn3 = norm_layer(planes * self.expansion) 107 | self.relu = nn.ReLU(inplace=True) 108 | self.downsample = downsample 109 | self.stride = stride 110 | 111 | def forward(self, x): 112 | identity = x 113 | 114 | out = self.conv1(x) 115 | out = self.bn1(out) 116 | out = self.relu(out) 117 | 118 | out = self.conv2(out) 119 | out = self.bn2(out) 120 | out = self.relu(out) 121 | 122 | out = self.conv3(out) 123 | out = self.bn3(out) 124 | 125 | if self.downsample is not None: 126 | identity = self.downsample(x) 127 | 128 | out += identity 129 | out = self.relu(out) 130 | 131 | return out 132 | 133 | 134 | class ResNet(nn.Module): 135 | def __init__( 136 | self, 137 | block, 138 | layers, 139 | num_classes=10, 140 | zero_init_residual=False, 141 | groups=1, 142 | width_per_group=64, 143 | replace_stride_with_dilation=None, 144 | norm_layer=None, 145 | ): 146 | super(ResNet, self).__init__() 147 | if norm_layer is None: 148 | norm_layer = nn.BatchNorm2d 149 | self._norm_layer = norm_layer 150 | 151 | self.inplanes = 64 152 | self.dilation = 1 153 | if replace_stride_with_dilation is None: 154 | # each element in the tuple indicates if we should replace 155 | # the 2x2 stride with a dilated convolution instead 156 | replace_stride_with_dilation = [False, False, False] 157 | if len(replace_stride_with_dilation) != 3: 158 | raise ValueError( 159 | "replace_stride_with_dilation should be None " 160 | "or a 3-element tuple, got {}".format(replace_stride_with_dilation) 161 | ) 162 | self.groups = groups 163 | self.base_width = width_per_group 164 | 165 | # CIFAR10: kernel_size 7 -> 3, stride 2 -> 1, padding 3->1 166 | self.conv1 = nn.Conv2d( 167 | 3, self.inplanes, kernel_size=3, stride=1, padding=1, bias=False 168 | ) 169 | # END 170 | 171 | self.bn1 = norm_layer(self.inplanes) 172 | self.relu = nn.ReLU(inplace=True) 173 | self.maxpool = nn.MaxPool2d(kernel_size=3, stride=2, padding=1) 174 | self.layer1 = self._make_layer(block, 64, layers[0]) 175 | self.layer2 = self._make_layer( 176 | block, 128, layers[1], stride=2, dilate=replace_stride_with_dilation[0] 177 | ) 178 | self.layer3 = self._make_layer( 179 | block, 256, layers[2], stride=2, dilate=replace_stride_with_dilation[1] 180 | ) 181 | self.layer4 = self._make_layer( 182 | block, 512, layers[3], stride=2, dilate=replace_stride_with_dilation[2] 183 | ) 184 | self.avgpool = nn.AdaptiveAvgPool2d((1, 1)) 185 | self.fc = nn.Linear(512 * block.expansion, num_classes) 186 | 187 | for m in self.modules(): 188 | if isinstance(m, nn.Conv2d): 189 | nn.init.kaiming_normal_(m.weight, mode="fan_out", nonlinearity="relu") 190 | elif isinstance(m, (nn.BatchNorm2d, nn.GroupNorm)): 191 | nn.init.constant_(m.weight, 1) 192 | nn.init.constant_(m.bias, 0) 193 | 194 | # Zero-initialize the last BN in each residual branch, 195 | # so that the residual branch starts with zeros, and each residual block behaves like an identity. 196 | # This improves the model by 0.2~0.3% according to https://arxiv.org/abs/1706.02677 197 | if zero_init_residual: 198 | for m in self.modules(): 199 | if isinstance(m, Bottleneck): 200 | nn.init.constant_(m.bn3.weight, 0) 201 | elif isinstance(m, BasicBlock): 202 | nn.init.constant_(m.bn2.weight, 0) 203 | 204 | def _make_layer(self, block, planes, blocks, stride=1, dilate=False): 205 | norm_layer = self._norm_layer 206 | downsample = None 207 | previous_dilation = self.dilation 208 | if dilate: 209 | self.dilation *= stride 210 | stride = 1 211 | if stride != 1 or self.inplanes != planes * block.expansion: 212 | downsample = nn.Sequential( 213 | conv1x1(self.inplanes, planes * block.expansion, stride), 214 | norm_layer(planes * block.expansion), 215 | ) 216 | 217 | layers = [] 218 | layers.append( 219 | block( 220 | self.inplanes, 221 | planes, 222 | stride, 223 | downsample, 224 | self.groups, 225 | self.base_width, 226 | previous_dilation, 227 | norm_layer, 228 | ) 229 | ) 230 | self.inplanes = planes * block.expansion 231 | for _ in range(1, blocks): 232 | layers.append( 233 | block( 234 | self.inplanes, 235 | planes, 236 | groups=self.groups, 237 | base_width=self.base_width, 238 | dilation=self.dilation, 239 | norm_layer=norm_layer, 240 | ) 241 | ) 242 | 243 | return nn.Sequential(*layers) 244 | 245 | def forward(self, x): 246 | x = self.conv1(x) 247 | x = self.bn1(x) 248 | x = self.relu(x) 249 | x = self.maxpool(x) 250 | 251 | x = self.layer1(x) 252 | x = self.layer2(x) 253 | x = self.layer3(x) 254 | x = self.layer4(x) 255 | 256 | x = self.avgpool(x) 257 | x = x.reshape(x.size(0), -1) 258 | x = self.fc(x) 259 | 260 | return x 261 | 262 | 263 | def _resnet(arch, block, layers, pretrained, progress, device, **kwargs): 264 | model = ResNet(block, layers, **kwargs) 265 | if pretrained: 266 | script_dir = os.path.dirname(__file__) 267 | state_dict = torch.load( 268 | script_dir + "/state_dicts/" + arch + ".pt", map_location=device 269 | ) 270 | model.load_state_dict(state_dict) 271 | return model 272 | 273 | 274 | def resnet18(pretrained=False, progress=True, device="cpu", **kwargs): 275 | """Constructs a ResNet-18 model. 276 | Args: 277 | pretrained (bool): If True, returns a model pre-trained on ImageNet 278 | progress (bool): If True, displays a progress bar of the download to stderr 279 | """ 280 | return _resnet( 281 | "resnet18", BasicBlock, [2, 2, 2, 2], pretrained, progress, device, **kwargs 282 | ) 283 | 284 | 285 | def resnet34(pretrained=False, progress=True, device="cpu", **kwargs): 286 | """Constructs a ResNet-34 model. 287 | Args: 288 | pretrained (bool): If True, returns a model pre-trained on ImageNet 289 | progress (bool): If True, displays a progress bar of the download to stderr 290 | """ 291 | return _resnet( 292 | "resnet34", BasicBlock, [3, 4, 6, 3], pretrained, progress, device, **kwargs 293 | ) 294 | 295 | 296 | def resnet50(pretrained=False, progress=True, device="cpu", **kwargs): 297 | """Constructs a ResNet-50 model. 298 | Args: 299 | pretrained (bool): If True, returns a model pre-trained on ImageNet 300 | progress (bool): If True, displays a progress bar of the download to stderr 301 | """ 302 | return _resnet( 303 | "resnet50", Bottleneck, [3, 4, 6, 3], pretrained, progress, device, **kwargs 304 | ) 305 | -------------------------------------------------------------------------------- /Pipfile.lock: -------------------------------------------------------------------------------- 1 | { 2 | "_meta": { 3 | "hash": { 4 | "sha256": "1d7867802f5353db549a401da03f2063be9df2cd4be3162c0ce3520eb86a3256" 5 | }, 6 | "pipfile-spec": 6, 7 | "requires": { 8 | "python_version": "3.8" 9 | }, 10 | "sources": [ 11 | { 12 | "name": "pypi", 13 | "url": "https://pypi.org/simple", 14 | "verify_ssl": true 15 | }, 16 | { 17 | "name": "pytorch", 18 | "url": "https://download.pytorch.org/whl/torch_stable.html", 19 | "verify_ssl": false 20 | } 21 | ] 22 | }, 23 | "default": { 24 | "absl-py": { 25 | "hashes": [ 26 | "sha256:84e6dcdc69c947d0c13e5457d056bd43cade4c2393dce00d684aedea77ddc2a3", 27 | "sha256:ac511215c01ee9ae47b19716599e8ccfa746f2e18de72bdf641b79b22afa27ea" 28 | ], 29 | "markers": "python_version >= '3.6'", 30 | "version": "==1.0.0" 31 | }, 32 | "aiohttp": { 33 | "hashes": [ 34 | "sha256:173267050501e1537293df06723bc5e719990889e2820ba3932969983892e960", 35 | "sha256:438f1f1555c02c50894604d94944cff188fe138b46467b7fa99fdceb51ab5842", 36 | "sha256:90bed250d1435aef33a1f8c439c5056d5d25a44fe6caf33fcafafed805bad4dc", 37 | "sha256:93c3b14747413f38f094a60e98f55e73831f0c9a23ae7faa3dc97d8963e13021", 38 | "sha256:a6e70a38d883185b1921d8122759661c39ade54949770394412a9e713fec6fa7", 39 | "sha256:b5036133c1ba77ed5a70208d2a021a90b76fdf8bf523ae33dae46d4f4380d86f", 40 | "sha256:c138451a82cdbf65cddf952941d5c7a1a2cac8ce3bc618dee8d889e5251ec7a5", 41 | "sha256:c94770383e49f9cc5912b926364ad022a6c8a5dbf5498933ca3a5713c6daf738", 42 | "sha256:ea26536ae06df6dac021303a0df72c79e55512070e6a304ba93ad468a3a754dc" 43 | ], 44 | "index": "pypi", 45 | "version": "==4.0.0a1" 46 | }, 47 | "antlr4-python3-runtime": { 48 | "hashes": [ 49 | "sha256:15793f5d0512a372b4e7d2284058ad32ce7dd27126b105fb0b2245130445db33" 50 | ], 51 | "version": "==4.8" 52 | }, 53 | "async-timeout": { 54 | "hashes": [ 55 | "sha256:0c3c816a028d47f659d6ff5c745cb2acf1f966da1fe5c19c77a70282b25f4c5f", 56 | "sha256:4291ca197d287d274d0b6cb5d6f8f8f82d434ed288f962539ff18cc9012f9ea3" 57 | ], 58 | "markers": "python_full_version >= '3.5.3'", 59 | "version": "==3.0.1" 60 | }, 61 | "attrs": { 62 | "hashes": [ 63 | "sha256:149e90d6d8ac20db7a955ad60cf0e6881a3f20d37096140088356da6c716b0b1", 64 | "sha256:ef6aaac3ca6cd92904cdd0d83f629a15f18053ec84e6432106f7a4d04ae4f5fb" 65 | ], 66 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", 67 | "version": "==21.2.0" 68 | }, 69 | "cachetools": { 70 | "hashes": [ 71 | "sha256:89ea6f1b638d5a73a4f9226be57ac5e4f399d22770b92355f92dcb0f7f001693", 72 | "sha256:92971d3cb7d2a97efff7c7bb1657f21a8f5fb309a37530537c71b1774189f2d1" 73 | ], 74 | "markers": "python_version ~= '3.5'", 75 | "version": "==4.2.4" 76 | }, 77 | "certifi": { 78 | "hashes": [ 79 | "sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872", 80 | "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569" 81 | ], 82 | "version": "==2021.10.8" 83 | }, 84 | "chardet": { 85 | "hashes": [ 86 | "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae", 87 | "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691" 88 | ], 89 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", 90 | "version": "==3.0.4" 91 | }, 92 | "charset-normalizer": { 93 | "hashes": [ 94 | "sha256:e019de665e2bcf9c2b64e2e5aa025fa991da8720daa3c1138cadd2fd1856aed0", 95 | "sha256:f7af805c321bfa1ce6714c51f254e0d5bb5e5834039bc17db7ebe3a4cec9492b" 96 | ], 97 | "markers": "python_version >= '3'", 98 | "version": "==2.0.7" 99 | }, 100 | "click": { 101 | "hashes": [ 102 | "sha256:353f466495adaeb40b6b5f592f9f91cb22372351c84caeb068132442a4518ef3", 103 | "sha256:410e932b050f5eed773c4cda94de75971c89cdb3155a72a0831139a79e5ecb5b" 104 | ], 105 | "markers": "python_version >= '3.6'", 106 | "version": "==8.0.3" 107 | }, 108 | "colorlog": { 109 | "hashes": [ 110 | "sha256:344f73204009e4c83c5b6beb00b3c45dc70fcdae3c80db919e0a4171d006fde8", 111 | "sha256:351c51e866c86c3217f08e4b067a7974a678be78f07f85fc2d55b8babde6d94e" 112 | ], 113 | "markers": "python_version >= '3.6'", 114 | "version": "==6.6.0" 115 | }, 116 | "configparser": { 117 | "hashes": [ 118 | "sha256:202b9679a809b703720afa2eacaad4c6c2d63196070e5d9edc953c0489dfd536", 119 | "sha256:f99c2256b24c551de13cf9e42c7b5db96fb133f0ca4de5dcb1df1aaf89f48298" 120 | ], 121 | "markers": "python_version >= '3.6'", 122 | "version": "==5.1.0" 123 | }, 124 | "docker-pycreds": { 125 | "hashes": [ 126 | "sha256:6ce3270bcaf404cc4c3e27e4b6c70d3521deae82fb508767870fdbf772d584d4", 127 | "sha256:7266112468627868005106ec19cd0d722702d2b7d5912a28e19b826c3d37af49" 128 | ], 129 | "version": "==0.4.0" 130 | }, 131 | "fsspec": { 132 | "extras": [ 133 | "http" 134 | ], 135 | "hashes": [ 136 | "sha256:8843f31c7a7bb1afc4add371948f10701814594d407ee1b0bb4facec8b517efa", 137 | "sha256:cbb7bafd59aa33684a92e843877f4adc0109fb0722b1a26e7d08f5a6e2500904" 138 | ], 139 | "markers": "python_version >= '3.6'", 140 | "version": "==2021.11.0" 141 | }, 142 | "future": { 143 | "hashes": [ 144 | "sha256:b1bead90b70cf6ec3f0710ae53a525360fa360d306a86583adc6bf83a4db537d" 145 | ], 146 | "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", 147 | "version": "==0.18.2" 148 | }, 149 | "gitdb": { 150 | "hashes": [ 151 | "sha256:8033ad4e853066ba6ca92050b9df2f89301b8fc8bf7e9324d412a63f8bf1a8fd", 152 | "sha256:bac2fd45c0a1c9cf619e63a90d62bdc63892ef92387424b855792a6cabe789aa" 153 | ], 154 | "markers": "python_version >= '3.6'", 155 | "version": "==4.0.9" 156 | }, 157 | "gitpython": { 158 | "hashes": [ 159 | "sha256:dc0a7f2f697657acc8d7f89033e8b1ea94dd90356b2983bca89dc8d2ab3cc647", 160 | "sha256:df83fdf5e684fef7c6ee2c02fc68a5ceb7e7e759d08b694088d0cacb4eba59e5" 161 | ], 162 | "markers": "python_version >= '3.7'", 163 | "version": "==3.1.24" 164 | }, 165 | "google-auth": { 166 | "hashes": [ 167 | "sha256:a348a50b027679cb7dae98043ac8dbcc1d7951f06d8387496071a1e05a2465c0", 168 | "sha256:d83570a664c10b97a1dc6f8df87e5fdfff012f48f62be131e449c20dfc32630e" 169 | ], 170 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", 171 | "version": "==2.3.3" 172 | }, 173 | "google-auth-oauthlib": { 174 | "hashes": [ 175 | "sha256:3f2a6e802eebbb6fb736a370fbf3b055edcb6b52878bf2f26330b5e041316c73", 176 | "sha256:a90a072f6993f2c327067bf65270046384cda5a8ecb20b94ea9a687f1f233a7a" 177 | ], 178 | "markers": "python_version >= '3.6'", 179 | "version": "==0.4.6" 180 | }, 181 | "grpcio": { 182 | "hashes": [ 183 | "sha256:0209f30741de1875413f40e89bec9c647e7afad4a3549a6a1682c1ee23da68ca", 184 | "sha256:06d5364e85e0fa50ee68bffd9c93a6aff869a91c68f1fd7ba1b944e063a0ff9f", 185 | "sha256:17433f7eb01737240581b33fbc2eae7b7fa6d3429571782580bceaf05ec56cb8", 186 | "sha256:21aa4a111b3381d3dd982a3df62348713b29f651aa9f6dfbc9415adbfe28d2ba", 187 | "sha256:2956da789d74fc35d2c869b3aa45dbf41c5d862c056ca8b5e35a688347ede809", 188 | "sha256:29fc36c99161ff307c8ca438346b2e36f81dac5ecdbabc983d0b255d7913fb19", 189 | "sha256:2aba7f93671ec971c5c70db81633b49a2f974aa09a2d811aede344a32bad1896", 190 | "sha256:2b264cf303a22c46f8d455f42425c546ad6ce22f183debb8d64226ddf1e039f4", 191 | "sha256:3a13953e12dc40ee247b5fe6ef22b5fac8f040a76b814a11bf9f423e82402f28", 192 | "sha256:47ab65be9ba7a0beee94bbe2fb1dd03cb7832db9df4d1f8fae215a16b3edeb5e", 193 | "sha256:4a8f2c7490fe3696e0cdd566e2f099fb91b51bc75446125175c55581c2f7bc11", 194 | "sha256:53e10d07e541073eb9a84d49ecffb831c3cbb970bcd8cd8de8431e935bf66c2e", 195 | "sha256:5441d343602ce10ba48fcb36bb5de197a15a01dc9ee0f71c2a73cd5cd3d7f5ac", 196 | "sha256:59163b8d2e0d85f0ecbee52b348f867eec7e0f909177564fb3956363f7e616e5", 197 | "sha256:5b9f0c4822e3a52a1663a315752c6bbdbed0ec15a660d3e64137335acbb5b7ce", 198 | "sha256:603d71de14ab1f1fd1254b69ceda73545943461b1f51f82fda9477503330b6ea", 199 | "sha256:64f2b3e6474e2ad865478b64f0850d15842acbb2623de5f78a60ceabe00c63e0", 200 | "sha256:65720d2bf05e2b78c4bffe372f13c41845bae5658fd3f5dd300c374dd240e5cb", 201 | "sha256:6655df5f31664bac4cd6c9b52f389fd92cd10025504ad83685038f47e11e29d8", 202 | "sha256:66f910b6324ae69625e63db2eb29d833c307cfa36736fe13d2f841656c5f658f", 203 | "sha256:6b69726d7bbb633133c1b0d780b1357aa9b7a7f714fead6470bab1feb8012806", 204 | "sha256:6e5eec67909795f7b1ff2bd941bd6c2661ca5217ea9c35003d73314100786f60", 205 | "sha256:6ef72f0abdb89fb7c366a99e04823ecae5cda9f762f2234f42fc280447277cd6", 206 | "sha256:76b5fa4c6d88f804456e763461cf7a1db38b200669f1ba00c579014ab5aa7965", 207 | "sha256:7742606ac2bc03ed10360f4f630e0cc01dce864fe63557254e9adea21bb51416", 208 | "sha256:7a3c9b8e13365529f9426d4754085e8a9c2ad718a41a46a97e4e30e87bb45eae", 209 | "sha256:8e8cd9909fdd232ecffb954936fd90c935ebe0b5fce36c88813f8247ce54019c", 210 | "sha256:a6f9ed5320b93c029615b75f6c8caf2c76aa6545d8845f3813908892cfc5f84e", 211 | "sha256:b4d7115ee08a36f3f50a6233bd78280e40847e078d2a5bb39c0ab0db4490d58f", 212 | "sha256:b74bbac7e039cf23ed0c8edd820c31e90a52a22e28a03d45274a0956addde8d2", 213 | "sha256:b781f412546830be55644f7c48251d30860f4725981862d4a1ea322f80d9cd34", 214 | "sha256:bf916ee93ea2fd52b5286ed4e19cbbde5e82754914379ea91dc5748550df3b4e", 215 | "sha256:d08ce780bbd8d1a442d855bd681ed0f7483c65d2c8ed83701a9ea4f13678411f", 216 | "sha256:d1451a8c0c01c5b5fdfeb8f777820cb277fb5d797d972f57a41bb82483c44a79", 217 | "sha256:d58b3774ee2084c31aad140586a42e18328d9823959ca006a0b85ad7937fe405", 218 | "sha256:d6c0b159b38fcc3bbc3331105197c1f58ac0d294eb83910d136a325a85def88f", 219 | "sha256:d7f66eb220898787d7821a7931e35ae2512ed74f79f75adcd7ea2fb3119ca87d", 220 | "sha256:d92c1721c7981812d0f42dfc8248b15d3b6a2ea79eb8870776364423de2aa245", 221 | "sha256:e2d9c6690d4c88cd51ee395d7ba5bd1d26d7c37e94cb59e7fd62ff21ecaf891d", 222 | "sha256:e62140c46d8125927c673c72c960cb387c02b2a1a3c6985a8b0a3914d27c0018", 223 | "sha256:ea3560ffbfe08327024380508190103937fef25e355d2259f8b5c003a0732f55", 224 | "sha256:f2e3f250e5398bf474c6e140df1b67494bf1e31c5277b5bf93841a564cbc22d0", 225 | "sha256:f385e40846ff81d1c6dce98dcc192c7988a46540758804c4a2e6da5a0e3e3e05", 226 | "sha256:f721b42a20d886c03d9b1f461b228cdaf02ccf6c4550e263f7fd3ce3ff19a8f1" 227 | ], 228 | "markers": "python_version >= '3.6'", 229 | "version": "==1.42.0" 230 | }, 231 | "hydra-colorlog": { 232 | "hashes": [ 233 | "sha256:177e8ee7046898e70bf4acfbed88c149c590c8bf7f9e57160ac4016b2addc8d1", 234 | "sha256:f575f90f2400d46b779b773b53a270df5371a9fff377b04f5665afc42e0c3f9d" 235 | ], 236 | "index": "pypi", 237 | "version": "==1.1.0" 238 | }, 239 | "hydra-core": { 240 | "hashes": [ 241 | "sha256:a1c513768fc3271aca0759023d680b19df31bb44442b508d64c77d07438def29", 242 | "sha256:ea8dad523fced49b88f3472493a4ffee50bf4ffc51459a2372dc85184802bf71" 243 | ], 244 | "index": "pypi", 245 | "version": "==1.0.0" 246 | }, 247 | "idna": { 248 | "hashes": [ 249 | "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff", 250 | "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d" 251 | ], 252 | "markers": "python_version >= '3'", 253 | "version": "==3.3" 254 | }, 255 | "importlib-metadata": { 256 | "hashes": [ 257 | "sha256:53ccfd5c134223e497627b9815d5030edf77d2ed573922f7a0b8f8bb81a1c100", 258 | "sha256:75bdec14c397f528724c1bfd9709d660b33a4d2e77387a3358f20b848bb5e5fb" 259 | ], 260 | "markers": "python_version < '3.10'", 261 | "version": "==4.8.2" 262 | }, 263 | "importlib-resources": { 264 | "hashes": [ 265 | "sha256:33a95faed5fc19b4bc16b29a6eeae248a3fe69dd55d4d229d2b480e23eeaad45", 266 | "sha256:d756e2f85dd4de2ba89be0b21dba2a3bbec2e871a42a3a16719258a11f87506b" 267 | ], 268 | "markers": "python_version < '3.9'", 269 | "version": "==5.4.0" 270 | }, 271 | "markdown": { 272 | "hashes": [ 273 | "sha256:76df8ae32294ec39dcf89340382882dfa12975f87f45c3ed1ecdb1e8cefc7006", 274 | "sha256:9923332318f843411e9932237530df53162e29dc7a4e2b91e35764583c46c9a3" 275 | ], 276 | "markers": "python_version >= '3.6'", 277 | "version": "==3.3.6" 278 | }, 279 | "multidict": { 280 | "hashes": [ 281 | "sha256:1ece5a3369835c20ed57adadc663400b5525904e53bae59ec854a5d36b39b21a", 282 | "sha256:275ca32383bc5d1894b6975bb4ca6a7ff16ab76fa622967625baeebcf8079000", 283 | "sha256:3750f2205b800aac4bb03b5ae48025a64e474d2c6cc79547988ba1d4122a09e2", 284 | "sha256:4538273208e7294b2659b1602490f4ed3ab1c8cf9dbdd817e0e9db8e64be2507", 285 | "sha256:5141c13374e6b25fe6bf092052ab55c0c03d21bd66c94a0e3ae371d3e4d865a5", 286 | "sha256:51a4d210404ac61d32dada00a50ea7ba412e6ea945bbe992e4d7a595276d2ec7", 287 | "sha256:5cf311a0f5ef80fe73e4f4c0f0998ec08f954a6ec72b746f3c179e37de1d210d", 288 | "sha256:6513728873f4326999429a8b00fc7ceddb2509b01d5fd3f3be7881a257b8d463", 289 | "sha256:7388d2ef3c55a8ba80da62ecfafa06a1c097c18032a501ffd4cabbc52d7f2b19", 290 | "sha256:9456e90649005ad40558f4cf51dbb842e32807df75146c6d940b6f5abb4a78f3", 291 | "sha256:c026fe9a05130e44157b98fea3ab12969e5b60691a276150db9eda71710cd10b", 292 | "sha256:d14842362ed4cf63751648e7672f7174c9818459d169231d03c56e84daf90b7c", 293 | "sha256:e0d072ae0f2a179c375f67e3da300b47e1a83293c554450b29c900e50afaae87", 294 | "sha256:f07acae137b71af3bb548bd8da720956a3bc9f9a0b87733e0899226a2317aeb7", 295 | "sha256:fbb77a75e529021e7c4a8d4e823d88ef4d23674a202be4f5addffc72cbb91430", 296 | "sha256:fcfbb44c59af3f8ea984de67ec7c306f618a3ec771c2843804069917a8f2e255", 297 | "sha256:feed85993dbdb1dbc29102f50bca65bdc68f2c0c8d352468c25b54874f23c39d" 298 | ], 299 | "markers": "python_version >= '3.5'", 300 | "version": "==4.7.6" 301 | }, 302 | "numpy": { 303 | "hashes": [ 304 | "sha256:0b78ecfa070460104934e2caf51694ccd00f37d5e5dbe76f021b1b0b0d221823", 305 | "sha256:1247ef28387b7bb7f21caf2dbe4767f4f4175df44d30604d42ad9bd701ebb31f", 306 | "sha256:1403b4e2181fc72664737d848b60e65150f272fe5a1c1cbc16145ed43884065a", 307 | "sha256:170b2a0805c6891ca78c1d96ee72e4c3ed1ae0a992c75444b6ab20ff038ba2cd", 308 | "sha256:2e4ed57f45f0aa38beca2a03b6532e70e548faf2debbeb3291cfc9b315d9be8f", 309 | "sha256:32fe5b12061f6446adcbb32cf4060a14741f9c21e15aaee59a207b6ce6423469", 310 | "sha256:34f3456f530ae8b44231c63082c8899fe9c983fd9b108c997c4b1c8c2d435333", 311 | "sha256:4c9c23158b87ed0e70d9a50c67e5c0b3f75bcf2581a8e34668d4e9d7474d76c6", 312 | "sha256:5d95668e727c75b3f5088ec7700e260f90ec83f488e4c0aaccb941148b2cd377", 313 | "sha256:615d4e328af7204c13ae3d4df7615a13ff60a49cb0d9106fde07f541207883ca", 314 | "sha256:69077388c5a4b997442b843dbdc3a85b420fb693ec8e33020bb24d647c164fa5", 315 | "sha256:74b85a17528ca60cf98381a5e779fc0264b4a88b46025e6bcbe9621f46bb3e63", 316 | "sha256:81225e58ef5fce7f1d80399575576fc5febec79a8a2742e8ef86d7b03beef49f", 317 | "sha256:8890b3360f345e8360133bc078d2dacc2843b6ee6059b568781b15b97acbe39f", 318 | "sha256:92aafa03da8658609f59f18722b88f0a73a249101169e28415b4fa148caf7e41", 319 | "sha256:9864424631775b0c052f3bd98bc2712d131b3e2cd95d1c0c68b91709170890b0", 320 | "sha256:9e6f5f50d1eff2f2f752b3089a118aee1ea0da63d56c44f3865681009b0af162", 321 | "sha256:a3deb31bc84f2b42584b8c4001c85d1934dbfb4030827110bc36bfd11509b7bf", 322 | "sha256:ad010846cdffe7ec27e3f933397f8a8d6c801a48634f419e3d075db27acf5880", 323 | "sha256:b1e2312f5b8843a3e4e8224b2b48fe16119617b8fc0a54df8f50098721b5bed2", 324 | "sha256:bc988afcea53e6156546e5b2885b7efab089570783d9d82caf1cfd323b0bb3dd", 325 | "sha256:c449eb870616a7b62e097982c622d2577b3dbc800aaf8689254ec6e0197cbf1e", 326 | "sha256:c74c699b122918a6c4611285cc2cad4a3aafdb135c22a16ec483340ef97d573c", 327 | "sha256:c885bfc07f77e8fee3dc879152ba993732601f1f11de248d4f357f0ffea6a6d4", 328 | "sha256:e3c3e990274444031482a31280bf48674441e0a5b55ddb168f3a6db3e0c38ec8", 329 | "sha256:e4799be6a2d7d3c33699a6f77201836ac975b2e1b98c2a07f66a38f499cb50ce", 330 | "sha256:e6c76a87633aa3fa16614b61ccedfae45b91df2767cf097aa9c933932a7ed1e0", 331 | "sha256:e89717274b41ebd568cd7943fc9418eeb49b1785b66031bc8a7f6300463c5898", 332 | "sha256:f5162ec777ba7138906c9c274353ece5603646c6965570d82905546579573f73", 333 | "sha256:fde96af889262e85aa033f8ee1d3241e32bf36228318a61f1ace579df4e8170d" 334 | ], 335 | "markers": "python_version < '3.10' and platform_machine != 'aarch64' and platform_machine != 'arm64'", 336 | "version": "==1.21.4" 337 | }, 338 | "oauthlib": { 339 | "hashes": [ 340 | "sha256:42bf6354c2ed8c6acb54d971fce6f88193d97297e18602a3a886603f9d7730cc", 341 | "sha256:8f0215fcc533dd8dd1bee6f4c412d4f0cd7297307d43ac61666389e3bc3198a3" 342 | ], 343 | "markers": "python_version >= '3.6'", 344 | "version": "==3.1.1" 345 | }, 346 | "omegaconf": { 347 | "hashes": [ 348 | "sha256:b945422a8cece6da2b193ff5b64b30f7ebc6510819ac15b31d5d28173883d999", 349 | "sha256:c6a91e4aaf112301c36522af829156b25dc4e57fd1573b62746ae82c7e8bf4e5" 350 | ], 351 | "index": "pypi", 352 | "version": "==2.0.1" 353 | }, 354 | "packaging": { 355 | "hashes": [ 356 | "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb", 357 | "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522" 358 | ], 359 | "markers": "python_version >= '3.6'", 360 | "version": "==21.3" 361 | }, 362 | "pandas": { 363 | "hashes": [ 364 | "sha256:003ba92db58b71a5f8add604a17a059f3068ef4e8c0c365b088468d0d64935fd", 365 | "sha256:10e10a2527db79af6e830c3d5842a4d60383b162885270f8cffc15abca4ba4a9", 366 | "sha256:22808afb8f96e2269dcc5b846decacb2f526dd0b47baebc63d913bf847317c8f", 367 | "sha256:2d1dc09c0013d8faa7474574d61b575f9af6257ab95c93dcf33a14fd8d2c1bab", 368 | "sha256:35c77609acd2e4d517da41bae0c11c70d31c87aae8dd1aabd2670906c6d2c143", 369 | "sha256:372d72a3d8a5f2dbaf566a5fa5fa7f230842ac80f29a931fb4b071502cf86b9a", 370 | "sha256:42493f8ae67918bf129869abea8204df899902287a7f5eaf596c8e54e0ac7ff4", 371 | "sha256:4acc28364863127bca1029fb72228e6f473bb50c32e77155e80b410e2068eeac", 372 | "sha256:5298a733e5bfbb761181fd4672c36d0c627320eb999c59c65156c6a90c7e1b4f", 373 | "sha256:5ba0aac1397e1d7b654fccf263a4798a9e84ef749866060d19e577e927d66e1b", 374 | "sha256:9707bdc1ea9639c886b4d3be6e2a45812c1ac0c2080f94c31b71c9fa35556f9b", 375 | "sha256:a2aa18d3f0b7d538e21932f637fbfe8518d085238b429e4790a35e1e44a96ffc", 376 | "sha256:a388960f979665b447f0847626e40f99af8cf191bce9dc571d716433130cb3a7", 377 | "sha256:a51528192755f7429c5bcc9e80832c517340317c861318fea9cea081b57c9afd", 378 | "sha256:b528e126c13816a4374e56b7b18bfe91f7a7f6576d1aadba5dee6a87a7f479ae", 379 | "sha256:c1aa4de4919358c5ef119f6377bc5964b3a7023c23e845d9db7d9016fa0c5b1c", 380 | "sha256:c2646458e1dce44df9f71a01dc65f7e8fa4307f29e5c0f2f92c97f47a5bf22f5", 381 | "sha256:c2f44425594ae85e119459bb5abb0748d76ef01d9c08583a667e3339e134218e", 382 | "sha256:d47750cf07dee6b55d8423471be70d627314277976ff2edd1381f02d52dbadf9", 383 | "sha256:d99d2350adb7b6c3f7f8f0e5dfb7d34ff8dd4bc0a53e62c445b7e43e163fce63", 384 | "sha256:dd324f8ee05925ee85de0ea3f0d66e1362e8c80799eb4eb04927d32335a3e44a", 385 | "sha256:eaca36a80acaacb8183930e2e5ad7f71539a66805d6204ea88736570b2876a7b", 386 | "sha256:f567e972dce3bbc3a8076e0b675273b4a9e8576ac629149cf8286ee13c259ae5", 387 | "sha256:fe48e4925455c964db914b958f6e7032d285848b7538a5e1b19aeb26ffaea3ec" 388 | ], 389 | "index": "pypi", 390 | "version": "==1.3.4" 391 | }, 392 | "pathtools": { 393 | "hashes": [ 394 | "sha256:7c35c5421a39bb82e58018febd90e3b6e5db34c5443aaaf742b3f33d4655f1c0" 395 | ], 396 | "version": "==0.1.2" 397 | }, 398 | "pillow": { 399 | "hashes": [ 400 | "sha256:066f3999cb3b070a95c3652712cffa1a748cd02d60ad7b4e485c3748a04d9d76", 401 | "sha256:0a0956fdc5defc34462bb1c765ee88d933239f9a94bc37d132004775241a7585", 402 | "sha256:0b052a619a8bfcf26bd8b3f48f45283f9e977890263e4571f2393ed8898d331b", 403 | "sha256:1394a6ad5abc838c5cd8a92c5a07535648cdf6d09e8e2d6df916dfa9ea86ead8", 404 | "sha256:1bc723b434fbc4ab50bb68e11e93ce5fb69866ad621e3c2c9bdb0cd70e345f55", 405 | "sha256:244cf3b97802c34c41905d22810846802a3329ddcb93ccc432870243211c79fc", 406 | "sha256:25a49dc2e2f74e65efaa32b153527fc5ac98508d502fa46e74fa4fd678ed6645", 407 | "sha256:2e4440b8f00f504ee4b53fe30f4e381aae30b0568193be305256b1462216feff", 408 | "sha256:3862b7256046fcd950618ed22d1d60b842e3a40a48236a5498746f21189afbbc", 409 | "sha256:3eb1ce5f65908556c2d8685a8f0a6e989d887ec4057326f6c22b24e8a172c66b", 410 | "sha256:3f97cfb1e5a392d75dd8b9fd274d205404729923840ca94ca45a0af57e13dbe6", 411 | "sha256:493cb4e415f44cd601fcec11c99836f707bb714ab03f5ed46ac25713baf0ff20", 412 | "sha256:4acc0985ddf39d1bc969a9220b51d94ed51695d455c228d8ac29fcdb25810e6e", 413 | "sha256:5503c86916d27c2e101b7f71c2ae2cddba01a2cf55b8395b0255fd33fa4d1f1a", 414 | "sha256:5b7bb9de00197fb4261825c15551adf7605cf14a80badf1761d61e59da347779", 415 | "sha256:5e9ac5f66616b87d4da618a20ab0a38324dbe88d8a39b55be8964eb520021e02", 416 | "sha256:620582db2a85b2df5f8a82ddeb52116560d7e5e6b055095f04ad828d1b0baa39", 417 | "sha256:62cc1afda735a8d109007164714e73771b499768b9bb5afcbbee9d0ff374b43f", 418 | "sha256:70ad9e5c6cb9b8487280a02c0ad8a51581dcbbe8484ce058477692a27c151c0a", 419 | "sha256:72b9e656e340447f827885b8d7a15fc8c4e68d410dc2297ef6787eec0f0ea409", 420 | "sha256:72cbcfd54df6caf85cc35264c77ede902452d6df41166010262374155947460c", 421 | "sha256:792e5c12376594bfcb986ebf3855aa4b7c225754e9a9521298e460e92fb4a488", 422 | "sha256:7b7017b61bbcdd7f6363aeceb881e23c46583739cb69a3ab39cb384f6ec82e5b", 423 | "sha256:81f8d5c81e483a9442d72d182e1fb6dcb9723f289a57e8030811bac9ea3fef8d", 424 | "sha256:82aafa8d5eb68c8463b6e9baeb4f19043bb31fefc03eb7b216b51e6a9981ae09", 425 | "sha256:84c471a734240653a0ec91dec0996696eea227eafe72a33bd06c92697728046b", 426 | "sha256:8c803ac3c28bbc53763e6825746f05cc407b20e4a69d0122e526a582e3b5e153", 427 | "sha256:93ce9e955cc95959df98505e4608ad98281fff037350d8c2671c9aa86bcf10a9", 428 | "sha256:9a3e5ddc44c14042f0844b8cf7d2cd455f6cc80fd7f5eefbe657292cf601d9ad", 429 | "sha256:a4901622493f88b1a29bd30ec1a2f683782e57c3c16a2dbc7f2595ba01f639df", 430 | "sha256:a5a4532a12314149d8b4e4ad8ff09dde7427731fcfa5917ff16d0291f13609df", 431 | "sha256:b8831cb7332eda5dc89b21a7bce7ef6ad305548820595033a4b03cf3091235ed", 432 | "sha256:b8e2f83c56e141920c39464b852de3719dfbfb6e3c99a2d8da0edf4fb33176ed", 433 | "sha256:c70e94281588ef053ae8998039610dbd71bc509e4acbc77ab59d7d2937b10698", 434 | "sha256:c8a17b5d948f4ceeceb66384727dde11b240736fddeda54ca740b9b8b1556b29", 435 | "sha256:d82cdb63100ef5eedb8391732375e6d05993b765f72cb34311fab92103314649", 436 | "sha256:d89363f02658e253dbd171f7c3716a5d340a24ee82d38aab9183f7fdf0cdca49", 437 | "sha256:d99ec152570e4196772e7a8e4ba5320d2d27bf22fdf11743dd882936ed64305b", 438 | "sha256:ddc4d832a0f0b4c52fff973a0d44b6c99839a9d016fe4e6a1cb8f3eea96479c2", 439 | "sha256:e3dacecfbeec9a33e932f00c6cd7996e62f53ad46fbe677577394aaa90ee419a", 440 | "sha256:eb9fc393f3c61f9054e1ed26e6fe912c7321af2f41ff49d3f83d05bacf22cc78" 441 | ], 442 | "index": "pypi", 443 | "version": "==8.4.0" 444 | }, 445 | "promise": { 446 | "hashes": [ 447 | "sha256:dfd18337c523ba4b6a58801c164c1904a9d4d1b1747c7d5dbf45b693a49d93d0" 448 | ], 449 | "version": "==2.3" 450 | }, 451 | "protobuf": { 452 | "hashes": [ 453 | "sha256:038daf4fa38a7e818dd61f51f22588d61755160a98db087a046f80d66b855942", 454 | "sha256:28ccea56d4dc38d35cd70c43c2da2f40ac0be0a355ef882242e8586c6d66666f", 455 | "sha256:36d90676d6f426718463fe382ec6274909337ca6319d375eebd2044e6c6ac560", 456 | "sha256:3cd0458870ea7d1c58e948ac8078f6ba8a7ecc44a57e03032ed066c5bb318089", 457 | "sha256:5935c8ce02e3d89c7900140a8a42b35bc037ec07a6aeb61cc108be8d3c9438a6", 458 | "sha256:615b426a177780ce381ecd212edc1e0f70db8557ed72560b82096bd36b01bc04", 459 | "sha256:62a8e4baa9cb9e064eb62d1002eca820857ab2138440cb4b3ea4243830f94ca7", 460 | "sha256:655264ed0d0efe47a523e2255fc1106a22f6faab7cc46cfe99b5bae085c2a13e", 461 | "sha256:6e8ea9173403219239cdfd8d946ed101f2ab6ecc025b0fda0c6c713c35c9981d", 462 | "sha256:71b0250b0cfb738442d60cab68abc166de43411f2a4f791d31378590bfb71bd7", 463 | "sha256:74f33edeb4f3b7ed13d567881da8e5a92a72b36495d57d696c2ea1ae0cfee80c", 464 | "sha256:77d2fadcf369b3f22859ab25bd12bb8e98fb11e05d9ff9b7cd45b711c719c002", 465 | "sha256:8b30a7de128c46b5ecb343917d9fa737612a6e8280f440874e5cc2ba0d79b8f6", 466 | "sha256:8e51561d72efd5bd5c91490af1f13e32bcba8dab4643761eb7de3ce18e64a853", 467 | "sha256:a529e7df52204565bcd33738a7a5f288f3d2d37d86caa5d78c458fa5fabbd54d", 468 | "sha256:b691d996c6d0984947c4cf8b7ae2fe372d99b32821d0584f0b90277aa36982d3", 469 | "sha256:d80f80eb175bf5f1169139c2e0c5ada98b1c098e2b3c3736667f28cbbea39fc8", 470 | "sha256:d83e1ef8cb74009bebee3e61cc84b1c9cd04935b72bca0cbc83217d140424995", 471 | "sha256:d8919368410110633717c406ab5c97e8df5ce93020cfcf3012834f28b1fab1ea", 472 | "sha256:db3532d9f7a6ebbe2392041350437953b6d7a792de10e629c1e4f5a6b1fe1ac6", 473 | "sha256:e7b24c11df36ee8e0c085e5b0dc560289e4b58804746fb487287dda51410f1e2", 474 | "sha256:e7e8d2c20921f8da0dea277dfefc6abac05903ceac8e72839b2da519db69206b", 475 | "sha256:e813b1c9006b6399308e917ac5d298f345d95bb31f46f02b60cd92970a9afa17", 476 | "sha256:fd390367fc211cc0ffcf3a9e149dfeca78fecc62adb911371db0cec5c8b7472d" 477 | ], 478 | "markers": "python_version >= '3.5'", 479 | "version": "==3.19.1" 480 | }, 481 | "psutil": { 482 | "hashes": [ 483 | "sha256:0066a82f7b1b37d334e68697faba68e5ad5e858279fd6351c8ca6024e8d6ba64", 484 | "sha256:02b8292609b1f7fcb34173b25e48d0da8667bc85f81d7476584d889c6e0f2131", 485 | "sha256:0ae6f386d8d297177fd288be6e8d1afc05966878704dad9847719650e44fc49c", 486 | "sha256:0c9ccb99ab76025f2f0bbecf341d4656e9c1351db8cc8a03ccd62e318ab4b5c6", 487 | "sha256:0dd4465a039d343925cdc29023bb6960ccf4e74a65ad53e768403746a9207023", 488 | "sha256:12d844996d6c2b1d3881cfa6fa201fd635971869a9da945cf6756105af73d2df", 489 | "sha256:1bff0d07e76114ec24ee32e7f7f8d0c4b0514b3fae93e3d2aaafd65d22502394", 490 | "sha256:245b5509968ac0bd179287d91210cd3f37add77dad385ef238b275bad35fa1c4", 491 | "sha256:28ff7c95293ae74bf1ca1a79e8805fcde005c18a122ca983abf676ea3466362b", 492 | "sha256:36b3b6c9e2a34b7d7fbae330a85bf72c30b1c827a4366a07443fc4b6270449e2", 493 | "sha256:52de075468cd394ac98c66f9ca33b2f54ae1d9bff1ef6b67a212ee8f639ec06d", 494 | "sha256:5da29e394bdedd9144c7331192e20c1f79283fb03b06e6abd3a8ae45ffecee65", 495 | "sha256:61f05864b42fedc0771d6d8e49c35f07efd209ade09a5afe6a5059e7bb7bf83d", 496 | "sha256:6223d07a1ae93f86451d0198a0c361032c4c93ebd4bf6d25e2fb3edfad9571ef", 497 | "sha256:6323d5d845c2785efb20aded4726636546b26d3b577aded22492908f7c1bdda7", 498 | "sha256:6ffe81843131ee0ffa02c317186ed1e759a145267d54fdef1bc4ea5f5931ab60", 499 | "sha256:74f2d0be88db96ada78756cb3a3e1b107ce8ab79f65aa885f76d7664e56928f6", 500 | "sha256:74fb2557d1430fff18ff0d72613c5ca30c45cdbfcddd6a5773e9fc1fe9364be8", 501 | "sha256:90d4091c2d30ddd0a03e0b97e6a33a48628469b99585e2ad6bf21f17423b112b", 502 | "sha256:90f31c34d25b1b3ed6c40cdd34ff122b1887a825297c017e4cbd6796dd8b672d", 503 | "sha256:99de3e8739258b3c3e8669cb9757c9a861b2a25ad0955f8e53ac662d66de61ac", 504 | "sha256:c6a5fd10ce6b6344e616cf01cc5b849fa8103fbb5ba507b6b2dee4c11e84c935", 505 | "sha256:ce8b867423291cb65cfc6d9c4955ee9bfc1e21fe03bb50e177f2b957f1c2469d", 506 | "sha256:d225cd8319aa1d3c85bf195c4e07d17d3cd68636b8fc97e6cf198f782f99af28", 507 | "sha256:ea313bb02e5e25224e518e4352af4bf5e062755160f77e4b1767dd5ccb65f876", 508 | "sha256:ea372bcc129394485824ae3e3ddabe67dc0b118d262c568b4d2602a7070afdb0", 509 | "sha256:f4634b033faf0d968bb9220dd1c793b897ab7f1189956e1aa9eae752527127d3", 510 | "sha256:fcc01e900c1d7bee2a37e5d6e4f9194760a93597c97fee89c4ae51701de03563" 511 | ], 512 | "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", 513 | "version": "==5.8.0" 514 | }, 515 | "pyasn1": { 516 | "hashes": [ 517 | "sha256:014c0e9976956a08139dc0712ae195324a75e142284d5f87f1a87ee1b068a359", 518 | "sha256:03840c999ba71680a131cfaee6fab142e1ed9bbd9c693e285cc6aca0d555e576", 519 | "sha256:0458773cfe65b153891ac249bcf1b5f8f320b7c2ce462151f8fa74de8934becf", 520 | "sha256:08c3c53b75eaa48d71cf8c710312316392ed40899cb34710d092e96745a358b7", 521 | "sha256:39c7e2ec30515947ff4e87fb6f456dfc6e84857d34be479c9d4a4ba4bf46aa5d", 522 | "sha256:5c9414dcfede6e441f7e8f81b43b34e834731003427e5b09e4e00e3172a10f00", 523 | "sha256:6e7545f1a61025a4e58bb336952c5061697da694db1cae97b116e9c46abcf7c8", 524 | "sha256:78fa6da68ed2727915c4767bb386ab32cdba863caa7dbe473eaae45f9959da86", 525 | "sha256:7ab8a544af125fb704feadb008c99a88805126fb525280b2270bb25cc1d78a12", 526 | "sha256:99fcc3c8d804d1bc6d9a099921e39d827026409a58f2a720dcdb89374ea0c776", 527 | "sha256:aef77c9fb94a3ac588e87841208bdec464471d9871bd5050a287cc9a475cd0ba", 528 | "sha256:e89bf84b5437b532b0803ba5c9a5e054d21fec423a89952a74f87fa2c9b7bce2", 529 | "sha256:fec3e9d8e36808a28efb59b489e4528c10ad0f480e57dcc32b4de5c9d8c9fdf3" 530 | ], 531 | "version": "==0.4.8" 532 | }, 533 | "pyasn1-modules": { 534 | "hashes": [ 535 | "sha256:0845a5582f6a02bb3e1bde9ecfc4bfcae6ec3210dd270522fee602365430c3f8", 536 | "sha256:0fe1b68d1e486a1ed5473f1302bd991c1611d319bba158e98b106ff86e1d7199", 537 | "sha256:15b7c67fabc7fc240d87fb9aabf999cf82311a6d6fb2c70d00d3d0604878c811", 538 | "sha256:426edb7a5e8879f1ec54a1864f16b882c2837bfd06eee62f2c982315ee2473ed", 539 | "sha256:65cebbaffc913f4fe9e4808735c95ea22d7a7775646ab690518c056784bc21b4", 540 | "sha256:905f84c712230b2c592c19470d3ca8d552de726050d1d1716282a1f6146be65e", 541 | "sha256:a50b808ffeb97cb3601dd25981f6b016cbb3d31fbf57a8b8a87428e6158d0c74", 542 | "sha256:a99324196732f53093a84c4369c996713eb8c89d360a496b599fb1a9c47fc3eb", 543 | "sha256:b80486a6c77252ea3a3e9b1e360bc9cf28eaac41263d173c032581ad2f20fe45", 544 | "sha256:c29a5e5cc7a3f05926aff34e097e84f8589cd790ce0ed41b67aed6857b26aafd", 545 | "sha256:cbac4bc38d117f2a49aeedec4407d23e8866ea4ac27ff2cf7fb3e5b570df19e0", 546 | "sha256:f39edd8c4ecaa4556e989147ebf219227e2cd2e8a43c7e7fcb1f1c18c5fd6a3d", 547 | "sha256:fe0644d9ab041506b62782e92b06b8c68cca799e1a9636ec398675459e031405" 548 | ], 549 | "version": "==0.2.8" 550 | }, 551 | "pydeprecate": { 552 | "hashes": [ 553 | "sha256:b5dd8c4c0535854b6a52936d1256883a940e3b02006fc7118b53027c0acde181", 554 | "sha256:fa26870924d3475621c344045c2c01a16ba034113a902600c78e75b3fac5f72c" 555 | ], 556 | "markers": "python_version >= '3.6'", 557 | "version": "==0.3.1" 558 | }, 559 | "pyparsing": { 560 | "hashes": [ 561 | "sha256:04ff808a5b90911829c55c4e26f75fa5ca8a2f5f36aa3a51f68e27033341d3e4", 562 | "sha256:d9bdec0013ef1eb5a84ab39a3b3868911598afa494f5faa038647101504e2b81" 563 | ], 564 | "markers": "python_version >= '3.6'", 565 | "version": "==3.0.6" 566 | }, 567 | "python-dateutil": { 568 | "hashes": [ 569 | "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86", 570 | "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9" 571 | ], 572 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", 573 | "version": "==2.8.2" 574 | }, 575 | "pytorch-lightning": { 576 | "hashes": [ 577 | "sha256:341464da8e0be7091c21b5e62db2dfc4cfac21ef88020006f9ce82264911f526", 578 | "sha256:7bbfa003c61b912615549036f558b0a226bc3ece3a37a7ddc8d28592b8687176" 579 | ], 580 | "index": "pypi", 581 | "version": "==1.5.2" 582 | }, 583 | "pytz": { 584 | "hashes": [ 585 | "sha256:3672058bc3453457b622aab7a1c3bfd5ab0bdae451512f6cf25f64ed37f5b87c", 586 | "sha256:acad2d8b20a1af07d4e4c9d2e9285c5ed9104354062f275f3fcd88dcef4f1326" 587 | ], 588 | "version": "==2021.3" 589 | }, 590 | "pyyaml": { 591 | "hashes": [ 592 | "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293", 593 | "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b", 594 | "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57", 595 | "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b", 596 | "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4", 597 | "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07", 598 | "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba", 599 | "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9", 600 | "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287", 601 | "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513", 602 | "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0", 603 | "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0", 604 | "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92", 605 | "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f", 606 | "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2", 607 | "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc", 608 | "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c", 609 | "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86", 610 | "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4", 611 | "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c", 612 | "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34", 613 | "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b", 614 | "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c", 615 | "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb", 616 | "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737", 617 | "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3", 618 | "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d", 619 | "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53", 620 | "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78", 621 | "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803", 622 | "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a", 623 | "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174", 624 | "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5" 625 | ], 626 | "markers": "python_version >= '3.6'", 627 | "version": "==6.0" 628 | }, 629 | "requests": { 630 | "hashes": [ 631 | "sha256:6c1246513ecd5ecd4528a0906f910e8f0f9c6b8ec72030dc9fd154dc1a6efd24", 632 | "sha256:b8aa58f8cf793ffd8782d3d8cb19e66ef36f7aba4353eec859e74678b01b07a7" 633 | ], 634 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", 635 | "version": "==2.26.0" 636 | }, 637 | "requests-oauthlib": { 638 | "hashes": [ 639 | "sha256:7f71572defaecd16372f9006f33c2ec8c077c3cfa6f5911a9a90202beb513f3d", 640 | "sha256:b4261601a71fd721a8bd6d7aa1cc1d6a8a93b4a9f5e96626f8e4d91e8beeaa6a", 641 | "sha256:fa6c47b933f01060936d87ae9327fead68768b69c6c9ea2109c48be30f2d4dbc" 642 | ], 643 | "version": "==1.3.0" 644 | }, 645 | "rsa": { 646 | "hashes": [ 647 | "sha256:78f9a9bf4e7be0c5ded4583326e7461e3a3c5aae24073648b4bdfa797d78c9d2", 648 | "sha256:9d689e6ca1b3038bc82bf8d23e944b6b6037bc02301a574935b2dd946e0353b9" 649 | ], 650 | "markers": "python_version >= '3.6'", 651 | "version": "==4.7.2" 652 | }, 653 | "sentry-sdk": { 654 | "hashes": [ 655 | "sha256:0db297ab32e095705c20f742c3a5dac62fe15c4318681884053d0898e5abb2f6", 656 | "sha256:789a11a87ca02491896e121efdd64e8fd93327b69e8f2f7d42f03e2569648e88" 657 | ], 658 | "version": "==1.5.0" 659 | }, 660 | "shortuuid": { 661 | "hashes": [ 662 | "sha256:44a7a86bcf24dbaba2e626cf80c779926b7c3a0d31a3a013e0d3cd1077707d23", 663 | "sha256:9435e87e5a64f3b92f7110c81f989a3b7bdb9358e22d2359829167da476cfc23" 664 | ], 665 | "markers": "python_version >= '3.5'", 666 | "version": "==1.0.8" 667 | }, 668 | "six": { 669 | "hashes": [ 670 | "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", 671 | "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" 672 | ], 673 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", 674 | "version": "==1.16.0" 675 | }, 676 | "smmap": { 677 | "hashes": [ 678 | "sha256:2aba19d6a040e78d8b09de5c57e96207b09ed71d8e55ce0959eeee6c8e190d94", 679 | "sha256:c840e62059cd3be204b0c9c9f74be2c09d5648eddd4580d9314c3ecde0b30936" 680 | ], 681 | "markers": "python_version >= '3.6'", 682 | "version": "==5.0.0" 683 | }, 684 | "subprocess32": { 685 | "hashes": [ 686 | "sha256:88e37c1aac5388df41cc8a8456bb49ebffd321a3ad4d70358e3518176de3a56b", 687 | "sha256:e45d985aef903c5b7444d34350b05da91a9e0ea015415ab45a21212786c649d0", 688 | "sha256:eb2937c80497978d181efa1b839ec2d9622cf9600a039a79d0e108d1f9aec79d" 689 | ], 690 | "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3' and python_version < '4'", 691 | "version": "==3.5.4" 692 | }, 693 | "tensorboard": { 694 | "hashes": [ 695 | "sha256:239f78a4a8dff200ce585a030c787773a8c1184d5c159252f5f85bac4e3c3b38" 696 | ], 697 | "markers": "python_version >= '3.6'", 698 | "version": "==2.7.0" 699 | }, 700 | "tensorboard-data-server": { 701 | "hashes": [ 702 | "sha256:809fe9887682d35c1f7d1f54f0f40f98bb1f771b14265b453ca051e2ce58fca7", 703 | "sha256:d8237580755e58eff68d1f3abefb5b1e39ae5c8b127cc40920f9c4fb33f4b98a", 704 | "sha256:fa8cef9be4fcae2f2363c88176638baf2da19c5ec90addb49b1cde05c95c88ee" 705 | ], 706 | "markers": "python_version >= '3.6'", 707 | "version": "==0.6.1" 708 | }, 709 | "tensorboard-plugin-wit": { 710 | "hashes": [ 711 | "sha256:2a80d1c551d741e99b2f197bb915d8a133e24adb8da1732b840041860f91183a" 712 | ], 713 | "version": "==1.8.0" 714 | }, 715 | "termcolor": { 716 | "hashes": [ 717 | "sha256:1d6d69ce66211143803fbc56652b41d73b4a400a2891d7bf7a1cdf4c02de613b" 718 | ], 719 | "version": "==1.1.0" 720 | }, 721 | "timm": { 722 | "hashes": [ 723 | "sha256:b14be70dbd4528b5ca8657cf5bc2672c7918c3d9ebfbffe80f4785b54e884b1e", 724 | "sha256:dba6b1702b7d24bf9f0f1c2fc394b4ee28f93cde5404f1dc732d63ccd00533b6" 725 | ], 726 | "index": "pypi", 727 | "version": "==0.4.12" 728 | }, 729 | "torch": { 730 | "hashes": [ 731 | "sha256:034df0b20603bfc81325094586647302891b9b20be7e36f152c7dd6af00deac1", 732 | "sha256:13e1ffab502aa32d6841a018771b47028d02dbbc685c5b79cfd61db5464dae4e", 733 | "sha256:3c0a942e0df104c80b0eedc30d2a19cdc3d28601bc6e280bf24b2e6255016d3b", 734 | "sha256:4499055547087d7ef7e8a754f09c2c4f1470297ae3e5490363dba66c75501b21", 735 | "sha256:56022b0ce94c54e95a2f63fc5a1494feb1fc3d5c7a9b35a62944651d03edef05", 736 | "sha256:67fc509e207b8e7330f2e76e77800950317d31d035a4d19593db991962afead4", 737 | "sha256:9013002adcb42bac05dcdbf0a03dd9f6bb5d7ab8b9817041c1176a014870786b", 738 | "sha256:ab0cf330714c8f79a837c04784a7a5658b014cf5a4ca527e7b710155ae519cdf", 739 | "sha256:aef7afb62e9b174b4e0e5e1e4a42e3bab3b8490a668d666f62f7d4517559fbf2", 740 | "sha256:b812e8d40d7037748da40bb695bd849e7b2e7faad4cd06df53d2cc4531926fda", 741 | "sha256:ca2c88fa4376e2648785029ab108e6e7abd784eb6535fc6036004b9254f9f7c1", 742 | "sha256:d6185827b285780653cdd81d77a09fdca76a5b190d5986d552be2a5c442cfaa4", 743 | "sha256:d6ef87470b44df9970e84542547d5ba7720bb89616602441df555a39b124e2bc", 744 | "sha256:d82e68302c9b5c76ed585e04d61be0ca2184f70cb8ffeba8610570609ad5d7c9", 745 | "sha256:e01ba5946267014abfdb30248bcdbd457aaa20cff749febe7fc191e5ae096af4", 746 | "sha256:e5822200bf80a1495ad98a2bb41803eeba4a85ce373e35fc65765f7f888f5374", 747 | "sha256:eea16c01af1980ba709c00e8d5e6c09bedb5b30f9fa2085f6a52a78d7dc4e125", 748 | "sha256:eea675ec01ec4b4a0655fd2984f166a5ca3b933dae6ad4eb4e52eba7026dc176" 749 | ], 750 | "index": "pypi", 751 | "version": "==1.10.0" 752 | }, 753 | "torchmetrics": { 754 | "hashes": [ 755 | "sha256:80cc981b5f41be6daf034f30c273227135ecf1029a9bda6c2bc266371044fea7", 756 | "sha256:e96f16e07a3b8ec7326721166ee126f892d0fa848753f9c07677615ba5ea2121" 757 | ], 758 | "index": "pypi", 759 | "version": "==0.6.0" 760 | }, 761 | "torchvision": { 762 | "hashes": [ 763 | "sha256:0c3bb474e298f3655f419e0f13a0c1ca0ef89f43e0f3f7b7ef603f3f1728543a", 764 | "sha256:11e0b162f7a8ee7fa959b9e0f2a15fb858af0b2e6f79f5a0527db55327241d26", 765 | "sha256:18f9e1d571be810ee9a4b8604f88748e5eb4e545171f0167ad734bf080eacf2d", 766 | "sha256:1fde05a1cc41f1fa3771723aad2435eb745513534209e51b349b009769895586", 767 | "sha256:3c1ba63eaf36d8dff7e0326dc61a73dbb100530ad4231c56427002689cada00b", 768 | "sha256:4e41b0a35587d2284468eddff31642704d4b218ea0e5505bb60881a94d2688e6", 769 | "sha256:597d82e9b186f59695ea19ff96d4b46b74f0be52227b0a77d7cf9a9d20e6801c", 770 | "sha256:5dec0014240f93c17837b37a194c6a35ba99da9c3b7c5b8341f7fb2bcc676e04", 771 | "sha256:6ac7aa49f81cdab4176131c3004bc86a5e5525d0be430172c78e6e2bb604e675", 772 | "sha256:73fae784c31a5ec7ddddefe0ba36ff3fac5131dc9c8babae3fab4ea9885b682a", 773 | "sha256:75ea4c021e348315a655b3f94734d9ddaf5650a7ace53759dff38a13469c7cfa", 774 | "sha256:7d28c1cd3f8f470c5faf46b426969d9db1113aa9414fc5a3056e20c7cf91a746", 775 | "sha256:8bb26e3856f163d9fe9287ad19105e93368e1c1d70d58101a9370d0acdb12865", 776 | "sha256:99c92a02832e84e51c47e303a76e57e09776abf5009b046e9269ea7387d5aadb", 777 | "sha256:b56285c3da0abd11cdf86cad82c4aebbb57ab6975673a4f87d686c612dda66b7", 778 | "sha256:f0be815759290ad81cafdab17973b040f8317fc59c740ad67948ebb9271e763c" 779 | ], 780 | "index": "pypi", 781 | "version": "==0.11.1" 782 | }, 783 | "tqdm": { 784 | "hashes": [ 785 | "sha256:8dd278a422499cd6b727e6ae4061c40b48fce8b76d1ccbf5d34fca9b7f925b0c", 786 | "sha256:d359de7217506c9851b7869f3708d8ee53ed70a1b8edbba4dbcb47442592920d" 787 | ], 788 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", 789 | "version": "==4.62.3" 790 | }, 791 | "typing-extensions": { 792 | "hashes": [ 793 | "sha256:2cdf80e4e04866a9b3689a51869016d36db0814d84b8d8a568d22781d45d27ed", 794 | "sha256:829704698b22e13ec9eaf959122315eabb370b0884400e9818334d8b677023d9" 795 | ], 796 | "markers": "python_version < '3.10'", 797 | "version": "==4.0.0" 798 | }, 799 | "urllib3": { 800 | "hashes": [ 801 | "sha256:4987c65554f7a2dbf30c18fd48778ef124af6fab771a377103da0585e2336ece", 802 | "sha256:c4fdf4019605b6e5423637e01bc9fe4daef873709a7973e195ceba0a62bbc844" 803 | ], 804 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4'", 805 | "version": "==1.26.7" 806 | }, 807 | "wandb": { 808 | "hashes": [ 809 | "sha256:92e5a89e681cfffe70b31c0645f6ca20668d3211951a1db01a39687ca39e05f4", 810 | "sha256:d1c2a6cd3fc57b5a75ff18d4bb69f088d0bd1d0ad22c98005a37e037c85442c7" 811 | ], 812 | "index": "pypi", 813 | "version": "==0.12.7" 814 | }, 815 | "werkzeug": { 816 | "hashes": [ 817 | "sha256:63d3dc1cf60e7b7e35e97fa9861f7397283b75d765afcaefd993d6046899de8f", 818 | "sha256:aa2bb6fc8dee8d6c504c0ac1e7f5f7dc5810a9903e793b6f715a9f015bdadb9a" 819 | ], 820 | "markers": "python_version >= '3.6'", 821 | "version": "==2.0.2" 822 | }, 823 | "wheel": { 824 | "hashes": [ 825 | "sha256:21014b2bd93c6d0034b6ba5d35e4eb284340e09d63c59aef6fc14b0f346146fd", 826 | "sha256:e2ef7239991699e3355d54f8e968a21bb940a1dbf34a4d226741e64462516fad" 827 | ], 828 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", 829 | "version": "==0.37.0" 830 | }, 831 | "yarl": { 832 | "hashes": [ 833 | "sha256:044daf3012e43d4b3538562da94a88fb12a6490652dbc29fb19adfa02cf72eac", 834 | "sha256:0cba38120db72123db7c58322fa69e3c0efa933040ffb586c3a87c063ec7cae8", 835 | "sha256:167ab7f64e409e9bdd99333fe8c67b5574a1f0495dcfd905bc7454e766729b9e", 836 | "sha256:1be4bbb3d27a4e9aa5f3df2ab61e3701ce8fcbd3e9846dbce7c033a7e8136746", 837 | "sha256:1ca56f002eaf7998b5fcf73b2421790da9d2586331805f38acd9997743114e98", 838 | "sha256:1d3d5ad8ea96bd6d643d80c7b8d5977b4e2fb1bab6c9da7322616fd26203d125", 839 | "sha256:1eb6480ef366d75b54c68164094a6a560c247370a68c02dddb11f20c4c6d3c9d", 840 | "sha256:1edc172dcca3f11b38a9d5c7505c83c1913c0addc99cd28e993efeaafdfaa18d", 841 | "sha256:211fcd65c58bf250fb994b53bc45a442ddc9f441f6fec53e65de8cba48ded986", 842 | "sha256:29e0656d5497733dcddc21797da5a2ab990c0cb9719f1f969e58a4abac66234d", 843 | "sha256:368bcf400247318382cc150aaa632582d0780b28ee6053cd80268c7e72796dec", 844 | "sha256:39d5493c5ecd75c8093fa7700a2fb5c94fe28c839c8e40144b7ab7ccba6938c8", 845 | "sha256:3abddf0b8e41445426d29f955b24aeecc83fa1072be1be4e0d194134a7d9baee", 846 | "sha256:3bf8cfe8856708ede6a73907bf0501f2dc4e104085e070a41f5d88e7faf237f3", 847 | "sha256:3ec1d9a0d7780416e657f1e405ba35ec1ba453a4f1511eb8b9fbab81cb8b3ce1", 848 | "sha256:45399b46d60c253327a460e99856752009fcee5f5d3c80b2f7c0cae1c38d56dd", 849 | "sha256:52690eb521d690ab041c3919666bea13ab9fbff80d615ec16fa81a297131276b", 850 | "sha256:534b047277a9a19d858cde163aba93f3e1677d5acd92f7d10ace419d478540de", 851 | "sha256:580c1f15500e137a8c37053e4cbf6058944d4c114701fa59944607505c2fe3a0", 852 | "sha256:59218fef177296451b23214c91ea3aba7858b4ae3306dde120224cfe0f7a6ee8", 853 | "sha256:5ba63585a89c9885f18331a55d25fe81dc2d82b71311ff8bd378fc8004202ff6", 854 | "sha256:5bb7d54b8f61ba6eee541fba4b83d22b8a046b4ef4d8eb7f15a7e35db2e1e245", 855 | "sha256:6152224d0a1eb254f97df3997d79dadd8bb2c1a02ef283dbb34b97d4f8492d23", 856 | "sha256:67e94028817defe5e705079b10a8438b8cb56e7115fa01640e9c0bb3edf67332", 857 | "sha256:695ba021a9e04418507fa930d5f0704edbce47076bdcfeeaba1c83683e5649d1", 858 | "sha256:6a1a9fe17621af43e9b9fcea8bd088ba682c8192d744b386ee3c47b56eaabb2c", 859 | "sha256:6ab0c3274d0a846840bf6c27d2c60ba771a12e4d7586bf550eefc2df0b56b3b4", 860 | "sha256:6feca8b6bfb9eef6ee057628e71e1734caf520a907b6ec0d62839e8293e945c0", 861 | "sha256:737e401cd0c493f7e3dd4db72aca11cfe069531c9761b8ea474926936b3c57c8", 862 | "sha256:788713c2896f426a4e166b11f4ec538b5736294ebf7d5f654ae445fd44270832", 863 | "sha256:797c2c412b04403d2da075fb93c123df35239cd7b4cc4e0cd9e5839b73f52c58", 864 | "sha256:8300401dc88cad23f5b4e4c1226f44a5aa696436a4026e456fe0e5d2f7f486e6", 865 | "sha256:87f6e082bce21464857ba58b569370e7b547d239ca22248be68ea5d6b51464a1", 866 | "sha256:89ccbf58e6a0ab89d487c92a490cb5660d06c3a47ca08872859672f9c511fc52", 867 | "sha256:8b0915ee85150963a9504c10de4e4729ae700af11df0dc5550e6587ed7891e92", 868 | "sha256:8cce6f9fa3df25f55521fbb5c7e4a736683148bcc0c75b21863789e5185f9185", 869 | "sha256:95a1873b6c0dd1c437fb3bb4a4aaa699a48c218ac7ca1e74b0bee0ab16c7d60d", 870 | "sha256:9b4c77d92d56a4c5027572752aa35082e40c561eec776048330d2907aead891d", 871 | "sha256:9bfcd43c65fbb339dc7086b5315750efa42a34eefad0256ba114cd8ad3896f4b", 872 | "sha256:9c1f083e7e71b2dd01f7cd7434a5f88c15213194df38bc29b388ccdf1492b739", 873 | "sha256:a1d0894f238763717bdcfea74558c94e3bc34aeacd3351d769460c1a586a8b05", 874 | "sha256:a467a431a0817a292121c13cbe637348b546e6ef47ca14a790aa2fa8cc93df63", 875 | "sha256:aa32aaa97d8b2ed4e54dc65d241a0da1c627454950f7d7b1f95b13985afd6c5d", 876 | "sha256:ac10bbac36cd89eac19f4e51c032ba6b412b3892b685076f4acd2de18ca990aa", 877 | "sha256:ac35ccde589ab6a1870a484ed136d49a26bcd06b6a1c6397b1967ca13ceb3913", 878 | "sha256:bab827163113177aee910adb1f48ff7af31ee0289f434f7e22d10baf624a6dfe", 879 | "sha256:baf81561f2972fb895e7844882898bda1eef4b07b5b385bcd308d2098f1a767b", 880 | "sha256:bf19725fec28452474d9887a128e98dd67eee7b7d52e932e6949c532d820dc3b", 881 | "sha256:c01a89a44bb672c38f42b49cdb0ad667b116d731b3f4c896f72302ff77d71656", 882 | "sha256:c0910c6b6c31359d2f6184828888c983d54d09d581a4a23547a35f1d0b9484b1", 883 | "sha256:c10ea1e80a697cf7d80d1ed414b5cb8f1eec07d618f54637067ae3c0334133c4", 884 | "sha256:c1164a2eac148d85bbdd23e07dfcc930f2e633220f3eb3c3e2a25f6148c2819e", 885 | "sha256:c145ab54702334c42237a6c6c4cc08703b6aa9b94e2f227ceb3d477d20c36c63", 886 | "sha256:c17965ff3706beedafd458c452bf15bac693ecd146a60a06a214614dc097a271", 887 | "sha256:c19324a1c5399b602f3b6e7db9478e5b1adf5cf58901996fc973fe4fccd73eed", 888 | "sha256:c2a1ac41a6aa980db03d098a5531f13985edcb451bcd9d00670b03129922cd0d", 889 | "sha256:c6ddcd80d79c96eb19c354d9dca95291589c5954099836b7c8d29278a7ec0bda", 890 | "sha256:c9c6d927e098c2d360695f2e9d38870b2e92e0919be07dbe339aefa32a090265", 891 | "sha256:cc8b7a7254c0fc3187d43d6cb54b5032d2365efd1df0cd1749c0c4df5f0ad45f", 892 | "sha256:cff3ba513db55cc6a35076f32c4cdc27032bd075c9faef31fec749e64b45d26c", 893 | "sha256:d260d4dc495c05d6600264a197d9d6f7fc9347f21d2594926202fd08cf89a8ba", 894 | "sha256:d6f3d62e16c10e88d2168ba2d065aa374e3c538998ed04996cd373ff2036d64c", 895 | "sha256:da6df107b9ccfe52d3a48165e48d72db0eca3e3029b5b8cb4fe6ee3cb870ba8b", 896 | "sha256:dfe4b95b7e00c6635a72e2d00b478e8a28bfb122dc76349a06e20792eb53a523", 897 | "sha256:e39378894ee6ae9f555ae2de332d513a5763276a9265f8e7cbaeb1b1ee74623a", 898 | "sha256:ede3b46cdb719c794427dcce9d8beb4abe8b9aa1e97526cc20de9bd6583ad1ef", 899 | "sha256:f2a8508f7350512434e41065684076f640ecce176d262a7d54f0da41d99c5a95", 900 | "sha256:f44477ae29025d8ea87ec308539f95963ffdc31a82f42ca9deecf2d505242e72", 901 | "sha256:f64394bd7ceef1237cc604b5a89bf748c95982a84bcd3c4bbeb40f685c810794", 902 | "sha256:fc4dd8b01a8112809e6b636b00f487846956402834a7fd59d46d4f4267181c41", 903 | "sha256:fce78593346c014d0d986b7ebc80d782b7f5e19843ca798ed62f8e3ba8728576", 904 | "sha256:fd547ec596d90c8676e369dd8a581a21227fe9b4ad37d0dc7feb4ccf544c2d59" 905 | ], 906 | "markers": "python_version >= '3.6'", 907 | "version": "==1.7.2" 908 | }, 909 | "yaspin": { 910 | "hashes": [ 911 | "sha256:c8d34eca9fda3f4dfbe59f57f3cf0f3641af3eefbf1544fbeb9b3bacf82c580a", 912 | "sha256:d574cbfaf0a349df466c91f7f81b22460ae5ebb15ecb8bf9411d6049923aee8d" 913 | ], 914 | "markers": "python_version < '4' and python_full_version >= '3.6.2'", 915 | "version": "==2.1.0" 916 | }, 917 | "zipp": { 918 | "hashes": [ 919 | "sha256:71c644c5369f4a6e07636f0aa966270449561fcea2e3d6747b8d23efaa9d7832", 920 | "sha256:9fe5ea21568a0a70e50f273397638d39b03353731e6cbbb3fd8502a33fec40bc" 921 | ], 922 | "markers": "python_version < '3.10'", 923 | "version": "==3.6.0" 924 | } 925 | }, 926 | "develop": { 927 | "backcall": { 928 | "hashes": [ 929 | "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e", 930 | "sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255" 931 | ], 932 | "version": "==0.2.0" 933 | }, 934 | "black": { 935 | "hashes": [ 936 | "sha256:802c6c30b637b28645b7fde282ed2569c0cd777dbe493a41b6a03c1d903f99ac", 937 | "sha256:a042adbb18b3262faad5aff4e834ff186bb893f95ba3a8013f09de1e5569def2" 938 | ], 939 | "index": "pypi", 940 | "version": "==21.11b1" 941 | }, 942 | "click": { 943 | "hashes": [ 944 | "sha256:353f466495adaeb40b6b5f592f9f91cb22372351c84caeb068132442a4518ef3", 945 | "sha256:410e932b050f5eed773c4cda94de75971c89cdb3155a72a0831139a79e5ecb5b" 946 | ], 947 | "markers": "python_version >= '3.6'", 948 | "version": "==8.0.3" 949 | }, 950 | "decorator": { 951 | "hashes": [ 952 | "sha256:7b12e7c3c6ab203a29e157335e9122cb03de9ab7264b137594103fd4a683b374", 953 | "sha256:e59913af105b9860aa2c8d3272d9de5a56a4e608db9a2f167a8480b323d529a7" 954 | ], 955 | "markers": "python_version >= '3.5'", 956 | "version": "==5.1.0" 957 | }, 958 | "ipdb": { 959 | "hashes": [ 960 | "sha256:951bd9a64731c444fd907a5ce268543020086a697f6be08f7cc2c9a752a278c5" 961 | ], 962 | "index": "pypi", 963 | "version": "==0.13.9" 964 | }, 965 | "ipython": { 966 | "hashes": [ 967 | "sha256:4f69d7423a5a1972f6347ff233e38bbf4df6a150ef20fbb00c635442ac3060aa", 968 | "sha256:a658beaf856ce46bc453366d5dc6b2ddc6c481efd3540cb28aa3943819caac9f" 969 | ], 970 | "markers": "python_version >= '3.7'", 971 | "version": "==7.29.0" 972 | }, 973 | "isort": { 974 | "hashes": [ 975 | "sha256:6f62d78e2f89b4500b080fe3a81690850cd254227f27f75c3a0c491a1f351ba7", 976 | "sha256:e8443a5e7a020e9d7f97f1d7d9cd17c88bcb3bc7e218bf9cf5095fe550be2951" 977 | ], 978 | "index": "pypi", 979 | "version": "==5.10.1" 980 | }, 981 | "jedi": { 982 | "hashes": [ 983 | "sha256:637c9635fcf47945ceb91cd7f320234a7be540ded6f3e99a50cb6febdfd1ba8d", 984 | "sha256:74137626a64a99c8eb6ae5832d99b3bdd7d29a3850fe2aa80a4126b2a7d949ab" 985 | ], 986 | "markers": "python_version >= '3.6'", 987 | "version": "==0.18.1" 988 | }, 989 | "matplotlib-inline": { 990 | "hashes": [ 991 | "sha256:a04bfba22e0d1395479f866853ec1ee28eea1485c1d69a6faf00dc3e24ff34ee", 992 | "sha256:aed605ba3b72462d64d475a21a9296f400a19c4f74a31b59103d2a99ffd5aa5c" 993 | ], 994 | "markers": "python_version >= '3.5'", 995 | "version": "==0.1.3" 996 | }, 997 | "mypy-extensions": { 998 | "hashes": [ 999 | "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d", 1000 | "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8" 1001 | ], 1002 | "version": "==0.4.3" 1003 | }, 1004 | "parso": { 1005 | "hashes": [ 1006 | "sha256:12b83492c6239ce32ff5eed6d3639d6a536170723c6f3f1506869f1ace413398", 1007 | "sha256:a8c4922db71e4fdb90e0d0bc6e50f9b273d3397925e5e60a717e719201778d22" 1008 | ], 1009 | "markers": "python_version >= '3.6'", 1010 | "version": "==0.8.2" 1011 | }, 1012 | "pathspec": { 1013 | "hashes": [ 1014 | "sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a", 1015 | "sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1" 1016 | ], 1017 | "version": "==0.9.0" 1018 | }, 1019 | "pexpect": { 1020 | "hashes": [ 1021 | "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937", 1022 | "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c" 1023 | ], 1024 | "markers": "sys_platform != 'win32'", 1025 | "version": "==4.8.0" 1026 | }, 1027 | "pickleshare": { 1028 | "hashes": [ 1029 | "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca", 1030 | "sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56" 1031 | ], 1032 | "version": "==0.7.5" 1033 | }, 1034 | "platformdirs": { 1035 | "hashes": [ 1036 | "sha256:367a5e80b3d04d2428ffa76d33f124cf11e8fff2acdaa9b43d545f5c7d661ef2", 1037 | "sha256:8868bbe3c3c80d42f20156f22e7131d2fb321f5bc86a2a345375c6481a67021d" 1038 | ], 1039 | "markers": "python_version >= '3.6'", 1040 | "version": "==2.4.0" 1041 | }, 1042 | "prompt-toolkit": { 1043 | "hashes": [ 1044 | "sha256:449f333dd120bd01f5d296a8ce1452114ba3a71fae7288d2f0ae2c918764fa72", 1045 | "sha256:48d85cdca8b6c4f16480c7ce03fd193666b62b0a21667ca56b4bb5ad679d1170" 1046 | ], 1047 | "markers": "python_full_version >= '3.6.2'", 1048 | "version": "==3.0.22" 1049 | }, 1050 | "ptyprocess": { 1051 | "hashes": [ 1052 | "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35", 1053 | "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220" 1054 | ], 1055 | "version": "==0.7.0" 1056 | }, 1057 | "pygments": { 1058 | "hashes": [ 1059 | "sha256:b8e67fe6af78f492b3c4b3e2970c0624cbf08beb1e493b2c99b9fa1b67a20380", 1060 | "sha256:f398865f7eb6874156579fdf36bc840a03cab64d1cde9e93d68f46a425ec52c6" 1061 | ], 1062 | "markers": "python_version >= '3.5'", 1063 | "version": "==2.10.0" 1064 | }, 1065 | "regex": { 1066 | "hashes": [ 1067 | "sha256:05b7d6d7e64efe309972adab77fc2af8907bb93217ec60aa9fe12a0dad35874f", 1068 | "sha256:0617383e2fe465732af4509e61648b77cbe3aee68b6ac8c0b6fe934db90be5cc", 1069 | "sha256:07856afef5ffcc052e7eccf3213317fbb94e4a5cd8177a2caa69c980657b3cb4", 1070 | "sha256:162abfd74e88001d20cb73ceaffbfe601469923e875caf9118333b1a4aaafdc4", 1071 | "sha256:2207ae4f64ad3af399e2d30dde66f0b36ae5c3129b52885f1bffc2f05ec505c8", 1072 | "sha256:30ab804ea73972049b7a2a5c62d97687d69b5a60a67adca07eb73a0ddbc9e29f", 1073 | "sha256:3b5df18db1fccd66de15aa59c41e4f853b5df7550723d26aa6cb7f40e5d9da5a", 1074 | "sha256:3c5fb32cc6077abad3bbf0323067636d93307c9fa93e072771cf9a64d1c0f3ef", 1075 | "sha256:416c5f1a188c91e3eb41e9c8787288e707f7d2ebe66e0a6563af280d9b68478f", 1076 | "sha256:432bd15d40ed835a51617521d60d0125867f7b88acf653e4ed994a1f8e4995dc", 1077 | "sha256:4aaa4e0705ef2b73dd8e36eeb4c868f80f8393f5f4d855e94025ce7ad8525f50", 1078 | "sha256:537ca6a3586931b16a85ac38c08cc48f10fc870a5b25e51794c74df843e9966d", 1079 | "sha256:53db2c6be8a2710b359bfd3d3aa17ba38f8aa72a82309a12ae99d3c0c3dcd74d", 1080 | "sha256:5537f71b6d646f7f5f340562ec4c77b6e1c915f8baae822ea0b7e46c1f09b733", 1081 | "sha256:6650f16365f1924d6014d2ea770bde8555b4a39dc9576abb95e3cd1ff0263b36", 1082 | "sha256:666abff54e474d28ff42756d94544cdfd42e2ee97065857413b72e8a2d6a6345", 1083 | "sha256:68a067c11463de2a37157930d8b153005085e42bcb7ad9ca562d77ba7d1404e0", 1084 | "sha256:780b48456a0f0ba4d390e8b5f7c661fdd218934388cde1a974010a965e200e12", 1085 | "sha256:788aef3549f1924d5c38263104dae7395bf020a42776d5ec5ea2b0d3d85d6646", 1086 | "sha256:7ee1227cf08b6716c85504aebc49ac827eb88fcc6e51564f010f11a406c0a667", 1087 | "sha256:7f301b11b9d214f83ddaf689181051e7f48905568b0c7017c04c06dfd065e244", 1088 | "sha256:83ee89483672b11f8952b158640d0c0ff02dc43d9cb1b70c1564b49abe92ce29", 1089 | "sha256:85bfa6a5413be0ee6c5c4a663668a2cad2cbecdee367630d097d7823041bdeec", 1090 | "sha256:9345b6f7ee578bad8e475129ed40123d265464c4cfead6c261fd60fc9de00bcf", 1091 | "sha256:93a5051fcf5fad72de73b96f07d30bc29665697fb8ecdfbc474f3452c78adcf4", 1092 | "sha256:962b9a917dd7ceacbe5cd424556914cb0d636001e393b43dc886ba31d2a1e449", 1093 | "sha256:98ba568e8ae26beb726aeea2273053c717641933836568c2a0278a84987b2a1a", 1094 | "sha256:a3feefd5e95871872673b08636f96b61ebef62971eab044f5124fb4dea39919d", 1095 | "sha256:b43c2b8a330a490daaef5a47ab114935002b13b3f9dc5da56d5322ff218eeadb", 1096 | "sha256:b483c9d00a565633c87abd0aaf27eb5016de23fed952e054ecc19ce32f6a9e7e", 1097 | "sha256:ba05430e819e58544e840a68b03b28b6d328aff2e41579037e8bab7653b37d83", 1098 | "sha256:ca5f18a75e1256ce07494e245cdb146f5a9267d3c702ebf9b65c7f8bd843431e", 1099 | "sha256:d5ca078bb666c4a9d1287a379fe617a6dccd18c3e8a7e6c7e1eb8974330c626a", 1100 | "sha256:da1a90c1ddb7531b1d5ff1e171b4ee61f6345119be7351104b67ff413843fe94", 1101 | "sha256:dba70f30fd81f8ce6d32ddeef37d91c8948e5d5a4c63242d16a2b2df8143aafc", 1102 | "sha256:dd33eb9bdcfbabab3459c9ee651d94c842bc8a05fabc95edf4ee0c15a072495e", 1103 | "sha256:e0538c43565ee6e703d3a7c3bdfe4037a5209250e8502c98f20fea6f5fdf2965", 1104 | "sha256:e1f54b9b4b6c53369f40028d2dd07a8c374583417ee6ec0ea304e710a20f80a0", 1105 | "sha256:e32d2a2b02ccbef10145df9135751abea1f9f076e67a4e261b05f24b94219e36", 1106 | "sha256:e71255ba42567d34a13c03968736c5d39bb4a97ce98188fafb27ce981115beec", 1107 | "sha256:ed2e07c6a26ed4bea91b897ee2b0835c21716d9a469a96c3e878dc5f8c55bb23", 1108 | "sha256:eef2afb0fd1747f33f1ee3e209bce1ed582d1896b240ccc5e2697e3275f037c7", 1109 | "sha256:f23222527b307970e383433daec128d769ff778d9b29343fb3496472dc20dabe", 1110 | "sha256:f341ee2df0999bfdf7a95e448075effe0db212a59387de1a70690e4acb03d4c6", 1111 | "sha256:f7f325be2804246a75a4f45c72d4ce80d2443ab815063cdf70ee8fb2ca59ee1b", 1112 | "sha256:f8af619e3be812a2059b212064ea7a640aff0568d972cd1b9e920837469eb3cb", 1113 | "sha256:fa8c626d6441e2d04b6ee703ef2d1e17608ad44c7cb75258c09dd42bacdfc64b", 1114 | "sha256:fbb9dc00e39f3e6c0ef48edee202f9520dafb233e8b51b06b8428cfcb92abd30", 1115 | "sha256:fff55f3ce50a3ff63ec8e2a8d3dd924f1941b250b0aac3d3d42b687eeff07a8e" 1116 | ], 1117 | "version": "==2021.11.10" 1118 | }, 1119 | "toml": { 1120 | "hashes": [ 1121 | "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b", 1122 | "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f" 1123 | ], 1124 | "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", 1125 | "version": "==0.10.2" 1126 | }, 1127 | "tomli": { 1128 | "hashes": [ 1129 | "sha256:c6ce0015eb38820eaf32b5db832dbc26deb3dd427bd5f6556cf0acac2c214fee", 1130 | "sha256:f04066f68f5554911363063a30b108d2b5a5b1a010aa8b6132af78489fe3aade" 1131 | ], 1132 | "markers": "python_version >= '3.6'", 1133 | "version": "==1.2.2" 1134 | }, 1135 | "traitlets": { 1136 | "hashes": [ 1137 | "sha256:059f456c5a7c1c82b98c2e8c799f39c9b8128f6d0d46941ee118daace9eb70c7", 1138 | "sha256:2d313cc50a42cd6c277e7d7dc8d4d7fedd06a2c215f78766ae7b1a66277e0033" 1139 | ], 1140 | "markers": "python_version >= '3.7'", 1141 | "version": "==5.1.1" 1142 | }, 1143 | "typing-extensions": { 1144 | "hashes": [ 1145 | "sha256:2cdf80e4e04866a9b3689a51869016d36db0814d84b8d8a568d22781d45d27ed", 1146 | "sha256:829704698b22e13ec9eaf959122315eabb370b0884400e9818334d8b677023d9" 1147 | ], 1148 | "markers": "python_version < '3.10'", 1149 | "version": "==4.0.0" 1150 | }, 1151 | "vulture": { 1152 | "hashes": [ 1153 | "sha256:03d5a62bcbe9ceb9a9b0575f42d71a2d414070229f2e6f95fa6e7c71aaaed967", 1154 | "sha256:f39de5e6f1df1f70c3b50da54f1c8d494159e9ca3d01a9b89eac929600591703" 1155 | ], 1156 | "index": "pypi", 1157 | "version": "==2.3" 1158 | }, 1159 | "wcwidth": { 1160 | "hashes": [ 1161 | "sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784", 1162 | "sha256:c4d647b99872929fdb7bdcaa4fbe7f01413ed3d98077df798530e5b04f116c83" 1163 | ], 1164 | "version": "==0.2.5" 1165 | } 1166 | } 1167 | } 1168 | --------------------------------------------------------------------------------