quadra 2.4.0a0__tar.gz → 2.5.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {quadra-2.4.0a0 → quadra-2.5.0}/PKG-INFO +3 -2
- {quadra-2.4.0a0 → quadra-2.5.0}/pyproject.toml +1 -1
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/__init__.py +1 -1
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/core/default.yaml +1 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/tasks/classification.py +12 -1
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/utils/export.py +86 -11
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/utils/utils.py +70 -35
- {quadra-2.4.0a0 → quadra-2.5.0}/LICENSE +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/README.md +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/callbacks/__init__.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/callbacks/anomalib.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/callbacks/lightning.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/callbacks/mlflow.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/callbacks/scheduler.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/__init__.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/backbone/caformer_m36.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/backbone/caformer_s36.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/backbone/convnextv2_base.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/backbone/convnextv2_femto.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/backbone/convnextv2_tiny.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/backbone/dino_vitb8.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/backbone/dino_vits8.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/backbone/dinov2_vitb14.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/backbone/dinov2_vits14.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/backbone/efficientnet_b0.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/backbone/efficientnet_b1.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/backbone/efficientnet_b2.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/backbone/efficientnet_b3.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/backbone/efficientnetv2_s.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/backbone/levit_128s.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/backbone/mnasnet0_5.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/backbone/resnet101.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/backbone/resnet18.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/backbone/resnet18_ssl.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/backbone/resnet50.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/backbone/smp.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/backbone/tiny_vit_21m_224.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/backbone/unetr.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/backbone/vit16_base.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/backbone/vit16_small.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/backbone/vit16_tiny.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/backbone/xcit_tiny_24_p8_224.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/callbacks/all.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/callbacks/default.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/callbacks/default_anomalib.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/config.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/datamodule/base/anomaly.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/datamodule/base/classification.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/datamodule/base/multilabel_classification.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/datamodule/base/segmentation.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/datamodule/base/segmentation_multiclass.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/datamodule/base/sklearn_classification.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/datamodule/base/sklearn_classification_patch.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/datamodule/base/ssl.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/datamodule/generic/imagenette/classification/base.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/datamodule/generic/imagenette/ssl/base.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/datamodule/generic/mnist/anomaly/base.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/datamodule/generic/mvtec/anomaly/base.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/datamodule/generic/oxford_pet/segmentation/base.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/experiment/base/anomaly/cfa.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/experiment/base/anomaly/cflow.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/experiment/base/anomaly/csflow.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/experiment/base/anomaly/draem.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/experiment/base/anomaly/efficient_ad.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/experiment/base/anomaly/fastflow.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/experiment/base/anomaly/inference.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/experiment/base/anomaly/padim.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/experiment/base/anomaly/patchcore.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/experiment/base/classification/classification.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/experiment/base/classification/classification_evaluation.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/experiment/base/classification/multilabel_classification.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/experiment/base/classification/sklearn_classification.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/experiment/base/classification/sklearn_classification_patch.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/experiment/base/classification/sklearn_classification_patch_test.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/experiment/base/classification/sklearn_classification_test.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/experiment/base/segmentation/smp.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/experiment/base/segmentation/smp_evaluation.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/experiment/base/segmentation/smp_multiclass.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/experiment/base/segmentation/smp_multiclass_evaluation.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/experiment/base/ssl/barlow.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/experiment/base/ssl/byol.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/experiment/base/ssl/dino.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/experiment/base/ssl/linear_eval.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/experiment/base/ssl/simclr.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/experiment/base/ssl/simsiam.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/experiment/custom/cls.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/experiment/default.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/experiment/generic/imagenette/classification/default.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/experiment/generic/imagenette/ssl/barlow.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/experiment/generic/imagenette/ssl/byol.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/experiment/generic/imagenette/ssl/dino.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/experiment/generic/imagenette/ssl/simclr.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/experiment/generic/imagenette/ssl/simsiam.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/experiment/generic/mnist/anomaly/cfa.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/experiment/generic/mnist/anomaly/cflow.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/experiment/generic/mnist/anomaly/csflow.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/experiment/generic/mnist/anomaly/draem.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/experiment/generic/mnist/anomaly/fastflow.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/experiment/generic/mnist/anomaly/inference.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/experiment/generic/mnist/anomaly/padim.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/experiment/generic/mnist/anomaly/patchcore.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/experiment/generic/mvtec/anomaly/cfa.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/experiment/generic/mvtec/anomaly/cflow.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/experiment/generic/mvtec/anomaly/csflow.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/experiment/generic/mvtec/anomaly/draem.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/experiment/generic/mvtec/anomaly/efficient_ad.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/experiment/generic/mvtec/anomaly/fastflow.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/experiment/generic/mvtec/anomaly/inference.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/experiment/generic/mvtec/anomaly/padim.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/experiment/generic/mvtec/anomaly/patchcore.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/experiment/generic/oxford_pet/segmentation/smp.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/export/default.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/hydra/anomaly_custom.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/hydra/default.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/inference/default.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/logger/comet.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/logger/csv.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/logger/mlflow.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/logger/tensorboard.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/loss/asl.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/loss/barlow.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/loss/bce.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/loss/byol.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/loss/cross_entropy.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/loss/dino.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/loss/simclr.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/loss/simsiam.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/loss/smp_ce.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/loss/smp_dice.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/loss/smp_dice_multiclass.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/loss/smp_mcc.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/loss/vicreg.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/model/anomalib/cfa.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/model/anomalib/cflow.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/model/anomalib/csflow.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/model/anomalib/dfm.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/model/anomalib/draem.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/model/anomalib/efficient_ad.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/model/anomalib/fastflow.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/model/anomalib/padim.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/model/anomalib/patchcore.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/model/barlow.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/model/byol.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/model/classification.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/model/dino.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/model/logistic_regression.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/model/multilabel_classification.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/model/simclr.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/model/simsiam.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/model/smp.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/model/smp_multiclass.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/model/vicreg.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/optimizer/adam.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/optimizer/adamw.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/optimizer/default.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/optimizer/lars.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/optimizer/sgd.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/scheduler/default.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/scheduler/rop.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/scheduler/step.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/scheduler/warmrestart.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/scheduler/warmup.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/task/anomalib/cfa.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/task/anomalib/cflow.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/task/anomalib/csflow.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/task/anomalib/draem.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/task/anomalib/efficient_ad.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/task/anomalib/fastflow.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/task/anomalib/inference.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/task/anomalib/padim.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/task/anomalib/patchcore.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/task/classification.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/task/classification_evaluation.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/task/default.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/task/segmentation.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/task/segmentation_evaluation.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/task/sklearn_classification.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/task/sklearn_classification_patch.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/task/sklearn_classification_patch_test.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/task/sklearn_classification_test.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/task/ssl.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/trainer/lightning_cpu.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/trainer/lightning_gpu.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/trainer/lightning_gpu_bf16.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/trainer/lightning_gpu_fp16.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/trainer/lightning_multigpu.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/trainer/sklearn_classification.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/transforms/byol.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/transforms/byol_no_random_resize.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/transforms/default.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/transforms/default_numpy.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/transforms/default_resize.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/transforms/dino.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/transforms/linear_eval.yaml +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/datamodules/__init__.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/datamodules/anomaly.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/datamodules/base.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/datamodules/classification.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/datamodules/generic/__init__.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/datamodules/generic/imagenette.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/datamodules/generic/mnist.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/datamodules/generic/mvtec.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/datamodules/generic/oxford_pet.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/datamodules/patch.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/datamodules/segmentation.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/datamodules/ssl.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/datasets/__init__.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/datasets/anomaly.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/datasets/classification.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/datasets/patch.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/datasets/segmentation.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/datasets/ssl.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/losses/__init__.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/losses/classification/__init__.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/losses/classification/asl.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/losses/classification/focal.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/losses/classification/prototypical.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/losses/ssl/__init__.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/losses/ssl/barlowtwins.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/losses/ssl/byol.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/losses/ssl/dino.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/losses/ssl/hyperspherical.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/losses/ssl/idmm.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/losses/ssl/simclr.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/losses/ssl/simsiam.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/losses/ssl/vicreg.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/main.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/metrics/__init__.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/metrics/segmentation.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/models/__init__.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/models/base.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/models/classification/__init__.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/models/classification/backbones.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/models/classification/base.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/models/evaluation.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/modules/__init__.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/modules/backbone.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/modules/base.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/modules/classification/__init__.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/modules/classification/base.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/modules/ssl/__init__.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/modules/ssl/barlowtwins.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/modules/ssl/byol.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/modules/ssl/common.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/modules/ssl/dino.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/modules/ssl/hyperspherical.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/modules/ssl/idmm.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/modules/ssl/simclr.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/modules/ssl/simsiam.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/modules/ssl/vicreg.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/optimizers/__init__.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/optimizers/lars.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/optimizers/sam.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/schedulers/__init__.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/schedulers/base.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/schedulers/warmup.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/tasks/__init__.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/tasks/anomaly.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/tasks/base.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/tasks/patch.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/tasks/segmentation.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/tasks/ssl.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/trainers/README.md +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/trainers/__init__.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/trainers/classification.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/utils/__init__.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/utils/anomaly.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/utils/classification.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/utils/deprecation.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/utils/evaluation.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/utils/imaging.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/utils/logger.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/utils/mlflow.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/utils/model_manager.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/utils/models.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/utils/patch/__init__.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/utils/patch/dataset.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/utils/patch/metrics.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/utils/patch/model.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/utils/patch/visualization.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/utils/resolver.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/utils/segmentation.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/utils/tests/__init__.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/utils/tests/fixtures/__init__.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/utils/tests/fixtures/dataset/__init__.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/utils/tests/fixtures/dataset/anomaly.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/utils/tests/fixtures/dataset/classification.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/utils/tests/fixtures/dataset/imagenette.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/utils/tests/fixtures/dataset/segmentation.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/utils/tests/fixtures/models/__init__.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/utils/tests/fixtures/models/anomaly.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/utils/tests/fixtures/models/classification.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/utils/tests/fixtures/models/segmentation.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/utils/tests/helpers.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/utils/tests/models.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/utils/validator.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/utils/visualization.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra/utils/vit_explainability.py +0 -0
- {quadra-2.4.0a0 → quadra-2.5.0}/quadra_hydra_plugin/hydra_plugins/quadra_searchpath_plugin.py +0 -0
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: quadra
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.5.0
|
|
4
4
|
Summary: Deep Learning experiment orchestration library
|
|
5
5
|
License: Apache-2.0
|
|
6
|
+
License-File: LICENSE
|
|
6
7
|
Keywords: deep learning,experiment,lightning,hydra-core
|
|
7
8
|
Author: Federico Belotti
|
|
8
9
|
Author-email: federico.belotti@orobix.com
|
|
@@ -307,6 +307,14 @@ class Classification(Generic[ClassificationDataModuleT], LightningTask[Classific
|
|
|
307
307
|
# TODO: What happens if we have 64 precision?
|
|
308
308
|
half_precision = "16" in self.trainer.precision
|
|
309
309
|
|
|
310
|
+
example_input: torch.Tensor | None = None
|
|
311
|
+
|
|
312
|
+
if hasattr(self.trainer, "datamodule") and hasattr(self.trainer.datamodule, "val_dataset"):
|
|
313
|
+
# Retrieve a better input to evaluate fp16 performance or efficientnetb0 does not sometimes export properly
|
|
314
|
+
example_input = self.trainer.datamodule.val_dataset[0][0]
|
|
315
|
+
|
|
316
|
+
# Selected rtol and atol are quite high, this is mostly done for efficientnetb0 that seems to be
|
|
317
|
+
# quite unstable in fp16
|
|
310
318
|
self.model_json, export_paths = export_model(
|
|
311
319
|
config=self.config,
|
|
312
320
|
model=module.model,
|
|
@@ -314,6 +322,9 @@ class Classification(Generic[ClassificationDataModuleT], LightningTask[Classific
|
|
|
314
322
|
half_precision=half_precision,
|
|
315
323
|
input_shapes=input_shapes,
|
|
316
324
|
idx_to_class=idx_to_class,
|
|
325
|
+
example_inputs=example_input,
|
|
326
|
+
rtol=0.05,
|
|
327
|
+
atol=0.01,
|
|
317
328
|
)
|
|
318
329
|
|
|
319
330
|
if len(export_paths) == 0:
|
|
@@ -1136,7 +1147,7 @@ class ClassificationEvaluation(Evaluation[ClassificationDataModuleT]):
|
|
|
1136
1147
|
return
|
|
1137
1148
|
|
|
1138
1149
|
if isinstance(self.deployment_model.model.features_extractor, timm.models.resnet.ResNet):
|
|
1139
|
-
target_layers = [cast(BaseNetworkBuilder, self.deployment_model.model).features_extractor.layer4[-1]]
|
|
1150
|
+
target_layers = [cast(BaseNetworkBuilder, self.deployment_model.model).features_extractor.layer4[-1]] # type: ignore[index]
|
|
1140
1151
|
self.cam = GradCAM(
|
|
1141
1152
|
model=self.deployment_model.model,
|
|
1142
1153
|
target_layers=target_layers,
|
|
@@ -119,6 +119,7 @@ def export_torchscript_model(
|
|
|
119
119
|
input_shapes: list[Any] | None = None,
|
|
120
120
|
half_precision: bool = False,
|
|
121
121
|
model_name: str = "model.pt",
|
|
122
|
+
example_inputs: list[torch.Tensor] | tuple[torch.Tensor, ...] | torch.Tensor | None = None,
|
|
122
123
|
) -> tuple[str, Any] | None:
|
|
123
124
|
"""Export a PyTorch model with TorchScript.
|
|
124
125
|
|
|
@@ -128,6 +129,8 @@ def export_torchscript_model(
|
|
|
128
129
|
output_path: Path to save the model
|
|
129
130
|
half_precision: If True, the model will be exported with half precision
|
|
130
131
|
model_name: Name of the exported model
|
|
132
|
+
example_inputs: If provided use this to evaluate the model instead of generating random inputs, it's expected to
|
|
133
|
+
be a list of tensors or a single tensor without batch dimension
|
|
131
134
|
|
|
132
135
|
Returns:
|
|
133
136
|
If the model is exported successfully, the path to the model and the input shape are returned.
|
|
@@ -144,7 +147,32 @@ def export_torchscript_model(
|
|
|
144
147
|
else:
|
|
145
148
|
model.cpu()
|
|
146
149
|
|
|
147
|
-
|
|
150
|
+
batch_size = 1
|
|
151
|
+
model_inputs: tuple[list[Any] | tuple[Any, ...] | torch.Tensor, list[Any]] | None
|
|
152
|
+
if example_inputs is not None:
|
|
153
|
+
if isinstance(example_inputs, Sequence):
|
|
154
|
+
model_input_tensors = []
|
|
155
|
+
model_input_shapes = []
|
|
156
|
+
|
|
157
|
+
for example_input in example_inputs:
|
|
158
|
+
new_inp = example_input.to(
|
|
159
|
+
device="cuda:0" if half_precision else "cpu",
|
|
160
|
+
dtype=torch.float16 if half_precision else torch.float32,
|
|
161
|
+
)
|
|
162
|
+
new_inp = new_inp.unsqueeze(0).repeat(batch_size, *(1 for x in new_inp.shape))
|
|
163
|
+
model_input_tensors.append(new_inp)
|
|
164
|
+
model_input_shapes.append(new_inp[0].shape)
|
|
165
|
+
|
|
166
|
+
model_inputs = (model_input_tensors, [model_input_shapes])
|
|
167
|
+
else:
|
|
168
|
+
new_inp = example_inputs.to(
|
|
169
|
+
device="cuda:0" if half_precision else "cpu",
|
|
170
|
+
dtype=torch.float16 if half_precision else torch.float32,
|
|
171
|
+
)
|
|
172
|
+
new_inp = new_inp.unsqueeze(0).repeat(batch_size, *(1 for x in new_inp.shape))
|
|
173
|
+
model_inputs = (new_inp, [new_inp[0].shape])
|
|
174
|
+
else:
|
|
175
|
+
model_inputs = extract_torch_model_inputs(model, input_shapes, half_precision)
|
|
148
176
|
|
|
149
177
|
if model_inputs is None:
|
|
150
178
|
return None
|
|
@@ -182,6 +210,9 @@ def export_onnx_model(
|
|
|
182
210
|
input_shapes: list[Any] | None = None,
|
|
183
211
|
half_precision: bool = False,
|
|
184
212
|
model_name: str = "model.onnx",
|
|
213
|
+
example_inputs: list[torch.Tensor] | tuple[torch.Tensor, ...] | torch.Tensor | None = None,
|
|
214
|
+
rtol: float = 0.01,
|
|
215
|
+
atol: float = 5e-3,
|
|
185
216
|
) -> tuple[str, Any] | None:
|
|
186
217
|
"""Export a PyTorch model with ONNX.
|
|
187
218
|
|
|
@@ -192,6 +223,10 @@ def export_onnx_model(
|
|
|
192
223
|
onnx_config: ONNX export configuration
|
|
193
224
|
half_precision: If True, the model will be exported with half precision
|
|
194
225
|
model_name: Name of the exported model
|
|
226
|
+
example_inputs: If provided use this to evaluate the model instead of generating random inputs, it's expected to
|
|
227
|
+
be a list of tensors or a single tensor without batch dimension
|
|
228
|
+
rtol: Relative tolerance for the ONNX safe export in fp16
|
|
229
|
+
atol: Absolute tolerance for the ONNX safe export in fp16
|
|
195
230
|
"""
|
|
196
231
|
if not ONNX_AVAILABLE:
|
|
197
232
|
log.warning("ONNX is not installed, can not export model in this format.")
|
|
@@ -210,9 +245,32 @@ def export_onnx_model(
|
|
|
210
245
|
else:
|
|
211
246
|
batch_size = 1
|
|
212
247
|
|
|
213
|
-
model_inputs
|
|
214
|
-
|
|
215
|
-
|
|
248
|
+
model_inputs: tuple[list[Any] | tuple[Any, ...] | torch.Tensor, list[Any]] | None
|
|
249
|
+
if example_inputs is not None:
|
|
250
|
+
if isinstance(example_inputs, Sequence):
|
|
251
|
+
model_input_tensors = []
|
|
252
|
+
model_input_shapes = []
|
|
253
|
+
|
|
254
|
+
for example_input in example_inputs:
|
|
255
|
+
new_inp = example_input.to(
|
|
256
|
+
device="cuda:0" if half_precision else "cpu",
|
|
257
|
+
dtype=torch.float16 if half_precision else torch.float32,
|
|
258
|
+
)
|
|
259
|
+
new_inp = new_inp.unsqueeze(0).repeat(batch_size, *(1 for x in new_inp.shape))
|
|
260
|
+
model_input_tensors.append(new_inp)
|
|
261
|
+
model_input_shapes.append(new_inp[0].shape)
|
|
262
|
+
|
|
263
|
+
model_inputs = (model_input_tensors, [model_input_shapes])
|
|
264
|
+
else:
|
|
265
|
+
new_inp = example_inputs.to(
|
|
266
|
+
device="cuda:0" if half_precision else "cpu",
|
|
267
|
+
dtype=torch.float16 if half_precision else torch.float32,
|
|
268
|
+
)
|
|
269
|
+
new_inp = new_inp.unsqueeze(0).repeat(batch_size, *(1 for x in new_inp.shape))
|
|
270
|
+
model_inputs = ([new_inp], [new_inp[0].shape])
|
|
271
|
+
else:
|
|
272
|
+
model_inputs = extract_torch_model_inputs(model, input_shapes, half_precision)
|
|
273
|
+
|
|
216
274
|
if model_inputs is None:
|
|
217
275
|
return None
|
|
218
276
|
|
|
@@ -266,6 +324,8 @@ def export_onnx_model(
|
|
|
266
324
|
|
|
267
325
|
if isinstance(inp, list):
|
|
268
326
|
inp = tuple(inp) # onnx doesn't like lists representing tuples of inputs
|
|
327
|
+
elif isinstance(inp, torch.Tensor):
|
|
328
|
+
inp = (inp,)
|
|
269
329
|
|
|
270
330
|
if isinstance(inp, dict):
|
|
271
331
|
raise ValueError("ONNX export does not support model with dict inputs")
|
|
@@ -290,6 +350,8 @@ def export_onnx_model(
|
|
|
290
350
|
onnx_config=onnx_config,
|
|
291
351
|
input_shapes=input_shapes,
|
|
292
352
|
input_names=input_names,
|
|
353
|
+
rtol=rtol,
|
|
354
|
+
atol=atol,
|
|
293
355
|
)
|
|
294
356
|
|
|
295
357
|
if not is_export_ok:
|
|
@@ -324,6 +386,8 @@ def _safe_export_half_precision_onnx(
|
|
|
324
386
|
onnx_config: DictConfig,
|
|
325
387
|
input_shapes: list[Any],
|
|
326
388
|
input_names: list[str],
|
|
389
|
+
rtol: float = 0.01,
|
|
390
|
+
atol: float = 5e-3,
|
|
327
391
|
) -> bool:
|
|
328
392
|
"""Check that the exported half precision ONNX model does not contain NaN values. If it does, attempt to export
|
|
329
393
|
the model with a more stable export and overwrite the original model.
|
|
@@ -335,6 +399,8 @@ def _safe_export_half_precision_onnx(
|
|
|
335
399
|
onnx_config: ONNX export configuration
|
|
336
400
|
input_shapes: Input shapes for the model
|
|
337
401
|
input_names: Input names for the model
|
|
402
|
+
rtol: Relative tolerance to evaluate the model
|
|
403
|
+
atol: Absolute tolerance to evaluate the model
|
|
338
404
|
|
|
339
405
|
Returns:
|
|
340
406
|
True if the model is stable or it was possible to export a more stable model, False otherwise.
|
|
@@ -364,16 +430,15 @@ def _safe_export_half_precision_onnx(
|
|
|
364
430
|
export_output = export_onnx_model(
|
|
365
431
|
model=model,
|
|
366
432
|
output_path=os.path.dirname(export_model_path),
|
|
367
|
-
|
|
433
|
+
# Force to not simplify fp32 model
|
|
434
|
+
onnx_config=DictConfig({**onnx_config, "simplify": False}),
|
|
368
435
|
input_shapes=input_shapes,
|
|
369
436
|
half_precision=False,
|
|
370
437
|
model_name=os.path.basename(export_model_path),
|
|
371
438
|
)
|
|
372
|
-
if export_output is
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
log.warning("Failed to export model")
|
|
376
|
-
return False
|
|
439
|
+
if export_output is None:
|
|
440
|
+
# This should not happen
|
|
441
|
+
raise RuntimeError("Failed to export model")
|
|
377
442
|
|
|
378
443
|
model_fp32 = onnx.load(export_model_path)
|
|
379
444
|
test_data = {input_names[i]: inp[i].float().cpu().numpy() for i in range(len(inp))}
|
|
@@ -381,7 +446,7 @@ def _safe_export_half_precision_onnx(
|
|
|
381
446
|
with open(os.devnull, "w") as f, contextlib.redirect_stdout(f):
|
|
382
447
|
# This function prints a lot of information that is not useful for the user
|
|
383
448
|
model_fp16 = auto_convert_mixed_precision(
|
|
384
|
-
model_fp32, test_data, rtol=
|
|
449
|
+
model_fp32, test_data, rtol=rtol, atol=atol, keep_io_types=False
|
|
385
450
|
)
|
|
386
451
|
onnx.save(model_fp16, export_model_path)
|
|
387
452
|
|
|
@@ -431,6 +496,9 @@ def export_model(
|
|
|
431
496
|
input_shapes: list[Any] | None = None,
|
|
432
497
|
idx_to_class: dict[int, str] | None = None,
|
|
433
498
|
pytorch_model_type: Literal["backbone", "model"] = "model",
|
|
499
|
+
example_inputs: list[Any] | tuple[Any, ...] | torch.Tensor | None = None,
|
|
500
|
+
rtol: float = 0.01,
|
|
501
|
+
atol: float = 5e-3,
|
|
434
502
|
) -> tuple[dict[str, Any], dict[str, str]]:
|
|
435
503
|
"""Generate deployment models for the task.
|
|
436
504
|
|
|
@@ -443,6 +511,9 @@ def export_model(
|
|
|
443
511
|
idx_to_class: Mapping from class index to class name
|
|
444
512
|
pytorch_model_type: Type of the pytorch model config to be exported, if it's backbone on disk we will save the
|
|
445
513
|
config.backbone config, otherwise we will save the config.model
|
|
514
|
+
example_inputs: If provided use this to evaluate the model instead of generating random inputs
|
|
515
|
+
rtol: Relative tolerance for the ONNX safe export in fp16
|
|
516
|
+
atol: Absolute tolerance for the ONNX safe export in fp16
|
|
446
517
|
|
|
447
518
|
Returns:
|
|
448
519
|
If the model is exported successfully, return a dictionary containing information about the exported model and
|
|
@@ -468,6 +539,7 @@ def export_model(
|
|
|
468
539
|
input_shapes=input_shapes,
|
|
469
540
|
output_path=export_folder,
|
|
470
541
|
half_precision=half_precision,
|
|
542
|
+
example_inputs=example_inputs,
|
|
471
543
|
)
|
|
472
544
|
|
|
473
545
|
if out is None:
|
|
@@ -495,6 +567,9 @@ def export_model(
|
|
|
495
567
|
onnx_config=config.export.onnx,
|
|
496
568
|
input_shapes=input_shapes,
|
|
497
569
|
half_precision=half_precision,
|
|
570
|
+
example_inputs=example_inputs,
|
|
571
|
+
rtol=rtol,
|
|
572
|
+
atol=atol,
|
|
498
573
|
)
|
|
499
574
|
|
|
500
575
|
if out is None:
|
|
@@ -8,10 +8,12 @@ import glob
|
|
|
8
8
|
import json
|
|
9
9
|
import logging
|
|
10
10
|
import os
|
|
11
|
+
import shutil
|
|
11
12
|
import subprocess
|
|
12
13
|
import sys
|
|
13
14
|
import warnings
|
|
14
15
|
from collections.abc import Iterable, Iterator, Sequence
|
|
16
|
+
from tempfile import TemporaryDirectory
|
|
15
17
|
from typing import Any, cast
|
|
16
18
|
|
|
17
19
|
import cv2
|
|
@@ -299,45 +301,78 @@ def finish(
|
|
|
299
301
|
quadra_export.generate_torch_inputs(input_size, device=device, half_precision=half_precision),
|
|
300
302
|
)
|
|
301
303
|
types_to_upload = config.core.get("upload_models")
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
304
|
+
mlflow_zip_models = config.core.get("mlflow_zip_models", False)
|
|
305
|
+
model_uploaded = False
|
|
306
|
+
with mlflow.start_run(run_id=mlflow_logger.run_id) as _:
|
|
307
|
+
for model_path in deployed_models:
|
|
308
|
+
model_type = model_type_from_path(model_path)
|
|
309
|
+
model_name = os.path.basename(model_path)
|
|
310
|
+
|
|
311
|
+
if model_type is None:
|
|
312
|
+
logging.warning("%s model type not supported", model_path)
|
|
310
313
|
continue
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
314
|
+
if model_type is not None and model_type in types_to_upload:
|
|
315
|
+
if model_type == "pytorch" and not mlflow_zip_models:
|
|
316
|
+
logging.warning("Pytorch format still not supported for mlflow upload")
|
|
317
|
+
continue
|
|
318
|
+
|
|
319
|
+
if mlflow_zip_models:
|
|
320
|
+
with TemporaryDirectory() as temp_dir:
|
|
321
|
+
if model_type == "pytorch" and os.path.isfile(
|
|
322
|
+
os.path.join(export_folder, "model_config.yaml")
|
|
323
|
+
):
|
|
324
|
+
shutil.copy(model_path, temp_dir)
|
|
325
|
+
shutil.copy(os.path.join(export_folder, "model_config.yaml"), temp_dir)
|
|
326
|
+
shutil.make_archive("assets", "zip", root_dir=temp_dir)
|
|
327
|
+
else:
|
|
328
|
+
shutil.make_archive(
|
|
329
|
+
"assets",
|
|
330
|
+
"zip",
|
|
331
|
+
root_dir=os.path.dirname(model_path),
|
|
332
|
+
base_dir=model_name,
|
|
333
|
+
)
|
|
334
|
+
shutil.move("assets.zip", temp_dir)
|
|
335
|
+
mlflow.pyfunc.log_model(
|
|
336
|
+
artifact_path=model_path,
|
|
337
|
+
loader_module="not.used",
|
|
338
|
+
data_path=os.path.join(temp_dir, "assets.zip"),
|
|
339
|
+
pip_requirements=[""],
|
|
333
340
|
)
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
341
|
+
model_uploaded = True
|
|
342
|
+
else:
|
|
343
|
+
model = quadra_export.import_deployment_model(
|
|
344
|
+
model_path,
|
|
345
|
+
device=device,
|
|
346
|
+
inference_config=config.inference,
|
|
347
|
+
)
|
|
348
|
+
|
|
349
|
+
if model_type in ["torchscript", "pytorch"]:
|
|
350
|
+
signature = infer_signature_model(model.model, inputs)
|
|
351
|
+
mlflow.pytorch.log_model(
|
|
352
|
+
model.model,
|
|
338
353
|
artifact_path=model_path,
|
|
339
354
|
signature=signature,
|
|
340
355
|
)
|
|
356
|
+
model_uploaded = True
|
|
357
|
+
|
|
358
|
+
elif model_type in ["onnx", "simplified_onnx"] and ONNX_AVAILABLE:
|
|
359
|
+
if model.model_path is None:
|
|
360
|
+
logging.warning(
|
|
361
|
+
"Cannot log onnx model on mlflow, \
|
|
362
|
+
BaseEvaluationModel 'model_path' attribute is None"
|
|
363
|
+
)
|
|
364
|
+
else:
|
|
365
|
+
signature = infer_signature_model(model, inputs)
|
|
366
|
+
model_proto = onnx.load(model.model_path)
|
|
367
|
+
mlflow.onnx.log_model(
|
|
368
|
+
model_proto,
|
|
369
|
+
artifact_path=model_path,
|
|
370
|
+
signature=signature,
|
|
371
|
+
)
|
|
372
|
+
model_uploaded = True
|
|
373
|
+
|
|
374
|
+
if model_uploaded:
|
|
375
|
+
mlflow.log_artifact(os.path.join(export_folder, "model.json"), export_folder)
|
|
341
376
|
|
|
342
377
|
if tensorboard_logger is not None:
|
|
343
378
|
config_paths = []
|
|
@@ -376,7 +411,7 @@ def model_type_from_path(model_path: str) -> str | None:
|
|
|
376
411
|
- "pytorch" if the model has a '.pth' extension (PyTorch).
|
|
377
412
|
- "simplified_onnx" if the model file ends with 'simplified.onnx' (Simplified ONNX).
|
|
378
413
|
- "onnx" if the model has a '.onnx' extension (ONNX).
|
|
379
|
-
- "json"
|
|
414
|
+
- "json" if the model has a '.json' extension (JSON).
|
|
380
415
|
- None if model extension is not supported.
|
|
381
416
|
|
|
382
417
|
Example:
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/datamodule/base/multilabel_classification.yaml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/datamodule/base/sklearn_classification_patch.yaml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/datamodule/generic/oxford_pet/segmentation/base.yaml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/experiment/base/classification/classification.yaml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/experiment/base/segmentation/smp_evaluation.yaml
RENAMED
|
File without changes
|
{quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/experiment/base/segmentation/smp_multiclass.yaml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{quadra-2.4.0a0 → quadra-2.5.0}/quadra/configs/experiment/generic/imagenette/ssl/barlow.yaml
RENAMED
|
File without changes
|
|
File without changes
|