diff --git a/README.md b/README.md index d0d02b63..a295501f 100644 --- a/README.md +++ b/README.md @@ -55,19 +55,6 @@ curl -LsSf https://astral.sh/uv/install.sh | sh uv self update ``` -### Install STAMP in a Virtual Environment: - -```bash -uv venv --python=3.12 -source .venv/bin/activate - -# For a GPU (CUDA) installation: -uv pip install "git+https://github.com/KatherLab/STAMP.git[gpu]" - -# For a CPU-only installation: -uv pip install "git+https://github.com/KatherLab/STAMP.git[cpu]" --torch-backend=cpu -``` - ### Install STAMP from the Repository: ```bash @@ -210,11 +197,13 @@ uv cache clean causal_conv1d # Now it should re-build the packages with the correct torch version -# With uv pip install -uv pip install "git+https://github.com/KatherLab/STAMP.git[build]" -uv pip install "git+https://github.com/KatherLab/STAMP.git[build,gpu] --no-build-isolation" - # With uv sync in the cloned repository uv sync --extra build uv sync --extra build --extra gpu ``` + +## Reproducibility + +We use a central `Seed` utility to set seeds for PyTorch, NumPy, and Python’s `random`. This makes data loading and model initialization reproducible. Always call `Seed.set(seed)` once at startup. + +We do not enable [`torch.use_deterministic_algorithms()`](https://pytorch.org/docs/stable/notes/randomness.html#reproducibility) because it can cause large performance drops. Expect runs with the same seed to follow the same training trajectory, but not bit-for-bit identical low-level kernels. \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index 4c06a0c5..05fe7c39 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -56,7 +56,7 @@ build = [ "ninja" ] flash-attention = [ - "flash-attn>=2.8.2", + "flash-attn>=2.8.3", ] conch = [ "huggingface-hub>=0.26.2", @@ -99,12 +99,13 @@ virchow2 = [ ] cobra = [ "stamp[flash-attention]", - "causal-conv1d @ git+https://github.com/KatherLab/causal-conv1d.git@b73d1ca0e0726ba6520c38d342bd411bb5850064", - "mamba-ssm @ git+https://github.com/KatherLab/mamba.git@d0d4192621889b26f9669ea4a8e6fe79cc84e8d9", - "cobra @ git+http://github.com/KatherLab/COBRA.git@c8aa71ce691e1279f2bb797f536355d6be47b6ac", + "causal-conv1d", + "mamba-ssm", + # "causal-conv1d @ git+https://github.com/KatherLab/causal-conv1d.git@dededae18d0258ccec833ab950d45279f1616fd1", + # "mamba-ssm @ git+https://github.com/KatherLab/mamba.git@3dad301098b721ee5c93d9ad16aafbbc1dc42cfd", + "cobra @ git+http://github.com/KatherLab/COBRA.git@73712e9ffa4d1bdecf9be9826d66094bd2b17534", "jinja2>=3.1.4", "triton" - # "triton==3.2.0", # Fix triton to 3.2.0 (also makes torch==2.6.0) until this is solved: https://github.com/pytorch/pytorch/issues/153737 ] prism_cpu = [ "sacremoses==0.1.1", @@ -179,6 +180,16 @@ conflicts = [ ] ] +[tool.uv.sources] +torch = { index = "pytorch-cu128" } +torchvision = { index = "pytorch-cu128" } + +[[tool.uv.index]] +name = "pytorch-cu128" +url = "https://download.pytorch.org/whl/cu128" +explicit = true + + [[tool.uv.dependency-metadata]] name = "uni" version = "v0.1.0" @@ -197,7 +208,6 @@ requires-dist = [ [[tool.uv.dependency-metadata]] name = "flash-attn" -version = "2.8.2" requires-dist = [ "torch", "einops", @@ -206,14 +216,12 @@ requires-dist = [ [[tool.uv.dependency-metadata]] name = "mamba-ssm" -version = "v2.2.4" requires-dist = [ "setuptools", ] [[tool.uv.dependency-metadata]] name = "causal-conv1d" -version = "v1.5.0.post8" requires-dist = [ "setuptools", ] diff --git a/src/stamp/__main__.py b/src/stamp/__main__.py old mode 100755 new mode 100644 index b11089d8..362ea5cf --- a/src/stamp/__main__.py +++ b/src/stamp/__main__.py @@ -13,6 +13,7 @@ ModelParams, VitModelParams, ) +from stamp.seed import Seed STAMP_FACTORY_SETTINGS = Path(__file__).with_name("config.yaml") @@ -49,6 +50,16 @@ def _run_cli(args: argparse.Namespace) -> None: with open(args.config_file_path, "r") as config_yaml: config = StampConfig.model_validate(yaml.safe_load(config_yaml)) + # use default advanced config in case none is provided + if config.advanced_config is None: + config.advanced_config = AdvancedConfig( + model_params=ModelParams(vit=VitModelParams(), mlp=MlpModelParams()) + ) + + # Set global random seed + if config.advanced_config.seed is not None: + Seed.set(config.advanced_config.seed) + match args.command: case "init": raise RuntimeError("this case should be handled above") @@ -67,7 +78,8 @@ def _run_cli(args: argparse.Namespace) -> None: "using the following configuration:\n" f"{yaml.dump(config.preprocessing.model_dump(mode='json'))}" ) - extract_( + _logger.info("Starting preprocessing...") + summary = extract_( output_dir=config.preprocessing.output_dir, wsi_dir=config.preprocessing.wsi_dir, wsi_list=config.preprocessing.wsi_list, @@ -83,6 +95,11 @@ def _run_cli(args: argparse.Namespace) -> None: cache_tiles_ext=config.preprocessing.cache_tiles_ext, generate_hash=config.preprocessing.generate_hash, ) + _logger.info("preprocessing finished.") + _logger.info( + f"Slides processed: {summary['processed']}, " + f"failed: {summary['failed']}, skipped: {summary['skipped']}" + ) case "encode_slides": from stamp.encoding import init_slide_encoder_ @@ -95,7 +112,8 @@ def _run_cli(args: argparse.Namespace) -> None: "using the following configuration:\n" f"{yaml.dump(config.slide_encoding.model_dump(mode='json'))}" ) - init_slide_encoder_( + _logger.info("Starting slide encoding...") + summary = init_slide_encoder_( encoder=config.slide_encoding.encoder, output_dir=config.slide_encoding.output_dir, feat_dir=config.slide_encoding.feat_dir, @@ -103,6 +121,11 @@ def _run_cli(args: argparse.Namespace) -> None: agg_feat_dir=config.slide_encoding.agg_feat_dir, generate_hash=config.slide_encoding.generate_hash, ) + _logger.info("slide encoding finished.") + _logger.info( + f"Slides processed: {summary['processed']}, " + f"failed: {summary['failed']}, skipped: {summary['skipped']}" + ) case "encode_patients": from stamp.encoding import init_patient_encoder_ @@ -115,7 +138,8 @@ def _run_cli(args: argparse.Namespace) -> None: "using the following configuration:\n" f"{yaml.dump(config.patient_encoding.model_dump(mode='json'))}" ) - init_patient_encoder_( + _logger.info("Starting patient encoding...") + summary = init_patient_encoder_( encoder=config.patient_encoding.encoder, output_dir=config.patient_encoding.output_dir, feat_dir=config.patient_encoding.feat_dir, @@ -126,6 +150,11 @@ def _run_cli(args: argparse.Namespace) -> None: agg_feat_dir=config.patient_encoding.agg_feat_dir, generate_hash=config.patient_encoding.generate_hash, ) + _logger.info("patient encoding finished.") + _logger.info( + f"Patients processed: {summary['processed']}, " + f"failed: {summary['failed']}, skipped: {summary['skipped']}" + ) case "train": from stamp.modeling.train import train_categorical_model_ @@ -133,21 +162,17 @@ def _run_cli(args: argparse.Namespace) -> None: if config.training is None: raise ValueError("no training configuration supplied") - # use default advanced config in case none is provided - if config.advanced_config is None: - config.advanced_config = AdvancedConfig( - model_params=ModelParams(vit=VitModelParams(), mlp=MlpModelParams()) - ) - _add_file_handle_(_logger, output_dir=config.training.output_dir) _logger.info( "using the following configuration:\n" f"{yaml.dump(config.training.model_dump(mode='json'))}" ) + _logger.info("Starting training...") train_categorical_model_( config=config.training, advanced=config.advanced_config ) + _logger.info("Training finished.") case "deploy": from stamp.modeling.deploy import deploy_categorical_model_ @@ -160,6 +185,7 @@ def _run_cli(args: argparse.Namespace) -> None: "using the following configuration:\n" f"{yaml.dump(config.deployment.model_dump(mode='json'))}" ) + _logger.info("Starting deployment...") deploy_categorical_model_( output_dir=config.deployment.output_dir, checkpoint_paths=config.deployment.checkpoint_paths, @@ -172,6 +198,7 @@ def _run_cli(args: argparse.Namespace) -> None: num_workers=config.deployment.num_workers, accelerator=config.deployment.accelerator, ) + _logger.info("Deployment finished...") case "crossval": from stamp.modeling.crossval import categorical_crossval_ @@ -184,17 +211,13 @@ def _run_cli(args: argparse.Namespace) -> None: "using the following configuration:\n" f"{yaml.dump(config.crossval.model_dump(mode='json'))}" ) - - # use default advanced config in case none is provided - if config.advanced_config is None: - config.advanced_config = AdvancedConfig( - model_params=ModelParams(vit=VitModelParams(), mlp=MlpModelParams()) - ) - + + _logger.info("Starting crossval...") categorical_crossval_( config=config.crossval, advanced=config.advanced_config, ) + _logger.info("Crossval finished...") case "statistics": from stamp.statistics import compute_stats_ @@ -225,6 +248,7 @@ def _run_cli(args: argparse.Namespace) -> None: "using the following configuration:\n" f"{yaml.dump(config.heatmaps.model_dump(mode='json'))}" ) + _logger.info("Starting heatmap generation...") heatmaps_( feature_dir=config.heatmaps.feature_dir, wsi_dir=config.heatmaps.wsi_dir, @@ -237,6 +261,7 @@ def _run_cli(args: argparse.Namespace) -> None: default_slide_mpp=config.heatmaps.default_slide_mpp, opacity=config.heatmaps.opacity, ) + _logger.info("Heatmaps finished...") case _: raise RuntimeError( diff --git a/src/stamp/config.yaml b/src/stamp/config.yaml index 23fcec79..0fa34a4d 100644 --- a/src/stamp/config.yaml +++ b/src/stamp/config.yaml @@ -277,6 +277,8 @@ patient_encoding: advanced_config: + # Optional random seed + # seed: 42 max_epochs: 32 patience: 16 batch_size: 64 diff --git a/src/stamp/encoding/encoder/__init__.py b/src/stamp/encoding/encoder/__init__.py index d9035f7a..f196c160 100644 --- a/src/stamp/encoding/encoder/__init__.py +++ b/src/stamp/encoding/encoder/__init__.py @@ -44,9 +44,12 @@ def encode_slides_( device: DeviceLikeType, generate_hash: bool, **kwargs, - ) -> None: + ) -> dict: """General method for encoding slide-level features. Called by init_slide_encoder_. Override this function if coords are required. See init_slide_encoder_ for full description""" + processed = 0 + failed = 0 + skipped = 0 # generate the name for the folder containing the feats if generate_hash: encode_dir = f"{self.identifier}-slide-{get_processing_code_hash(Path(__file__))[:8]}" @@ -71,12 +74,14 @@ def encode_slides_( _logger.info( f"skipping {str(slide_name)} because {output_path} already exists" ) + skipped += 1 continue try: feats, coords = self._validate_and_read_features(h5_path) except ValueError as e: tqdm.write(s=str(e)) + failed += 1 continue slide_embedding = self._generate_slide_embedding( @@ -85,6 +90,8 @@ def encode_slides_( self._save_features_( output_path=output_path, feats=slide_embedding, feat_type="slide" ) + processed += 1 + return {"processed": processed, "failed": failed, "skipped": skipped} def encode_patients_( self, @@ -96,9 +103,12 @@ def encode_patients_( device: DeviceLikeType, generate_hash: bool, **kwargs, - ) -> None: + ) -> dict: """General method for encoding patient-level features. Called by init_patient_encoder_. Override this function if coords are required. See init_patient_encoder_ for full description""" + processed = 0 + failed = 0 + skipped = 0 # generate the name for the folder containing the feats if generate_hash: encode_dir = ( @@ -126,27 +136,34 @@ def encode_patients_( _logger.info( f"skipping {str(patient_id)} because {output_path} already exists" ) + skipped += 1 continue feats_list = [] - - for _, row in group.iterrows(): - slide_filename = row[filename_label] - h5_path = os.path.join(feat_dir, slide_filename) - feats, _ = self._validate_and_read_features(h5_path) - feats_list.append(feats) - - if not feats_list: - tqdm.write(f"No features found for patient {patient_id}, skipping.") + try: + for _, row in group.iterrows(): + slide_filename = row[filename_label] + h5_path = os.path.join(feat_dir, slide_filename) + feats, _ = self._validate_and_read_features(h5_path) + feats_list.append(feats) + + if not feats_list: + tqdm.write(f"No features found for patient {patient_id}, skipping.") + skipped += 1 + continue + + patient_embedding = self._generate_patient_embedding( + feats_list, device, **kwargs + ) + self._save_features_( + output_path=output_path, feats=patient_embedding, feat_type="patient" + ) + processed += 1 + except Exception as e: + tqdm.write(f"Failed to process patient {patient_id}: {e}") + failed += 1 continue - patient_embedding = self._generate_patient_embedding( - feats_list, device, **kwargs - ) - self._save_features_( - output_path=output_path, feats=patient_embedding, feat_type="patient" - ) - @abstractmethod def _generate_slide_embedding( self, feats: torch.Tensor, device, **kwargs diff --git a/src/stamp/heatmaps/__init__.py b/src/stamp/heatmaps/__init__.py index c1c52900..48337150 100644 --- a/src/stamp/heatmaps/__init__.py +++ b/src/stamp/heatmaps/__init__.py @@ -12,6 +12,7 @@ from matplotlib.axes import Axes from matplotlib.figure import Figure from matplotlib.patches import Patch +from packaging.version import Version from PIL import Image from torch import Tensor from torch.func import jacrev # pyright: ignore[reportPrivateImportUsage] @@ -22,8 +23,6 @@ from stamp.preprocessing import supported_extensions from stamp.preprocessing.tiling import get_slide_mpp_ from stamp.types import DeviceLikeType, Microns, SlideMPP, TilePixels -from packaging.version import Version - _logger = logging.getLogger("stamp") @@ -33,25 +32,26 @@ def _gradcam_per_category( feats: Float[Tensor, "tile feat"], coords: Float[Tensor, "tile 2"], ) -> Float[Tensor, "tile category"]: - feat = -1 # feats dimension + feat_dim = -1 - return ( + cam = ( ( feats * jacrev( - lambda bags: torch.softmax( - model.forward( - bags=bags.unsqueeze(0), - coords=coords.unsqueeze(0), - mask=None, - ), - dim=1, + lambda bags: model.forward( + bags=bags.unsqueeze(0), + coords=coords.unsqueeze(0), + mask=None, ).squeeze(0) )(feats) ) - .mean(feat) # type: ignore + .mean(feat_dim) # type: ignore .abs() - ).permute(-1, -2) + ) + + cam = torch.softmax(cam, dim=-1) + + return cam.permute(-1, -2) def _vals_to_im( diff --git a/src/stamp/modeling/config.py b/src/stamp/modeling/config.py index d8239be0..ac9f116f 100644 --- a/src/stamp/modeling/config.py +++ b/src/stamp/modeling/config.py @@ -97,4 +97,5 @@ class AdvancedConfig(BaseModel): default=None, description='Optional: "vit" or "mlp". Defaults based on feature type.', ) - model_params: ModelParams + model_params: ModelParams | None + seed: int | None = None diff --git a/src/stamp/modeling/data.py b/src/stamp/modeling/data.py index 33a8c4c7..a8837cc3 100755 --- a/src/stamp/modeling/data.py +++ b/src/stamp/modeling/data.py @@ -5,7 +5,7 @@ from dataclasses import KW_ONLY, dataclass from itertools import groupby from pathlib import Path -from typing import IO, BinaryIO, Generic, TextIO, TypeAlias, cast, Union +from typing import IO, BinaryIO, Generic, TextIO, TypeAlias, Union, cast import h5py import numpy as np @@ -17,6 +17,7 @@ from torch.utils.data import DataLoader, Dataset import stamp +from stamp.seed import Seed from stamp.types import ( Bags, BagSize, @@ -100,6 +101,8 @@ def tile_bag_dataloader( shuffle=shuffle, num_workers=num_workers, collate_fn=_collate_to_tuple, + worker_init_fn=Seed.get_loader_worker_init(), + generator=Seed.get_torch_generator(), ), ), list(categories), diff --git a/src/stamp/preprocessing/__init__.py b/src/stamp/preprocessing/__init__.py old mode 100755 new mode 100644 index 23a8e0c3..2c8be0a3 --- a/src/stamp/preprocessing/__init__.py +++ b/src/stamp/preprocessing/__init__.py @@ -131,7 +131,7 @@ def extract_( brightness_cutoff: int | None, canny_cutoff: float | None, generate_hash: bool, -) -> None: +) -> dict[str, int]: """ Extracts features from slides. Build in a fail-safe way, i.e. slides for which feature extraction triggers an exception @@ -142,6 +142,9 @@ def extract_( If not `None`, ignore the slide metadata MPP, instead replacing it with this value. Useful for slides without metadata. """ + processed = 0 + skipped = 0 + failed = 0 match extractor: case ExtractorName.CTRANSPATH: from stamp.preprocessing.extractor.ctranspath import ctranspath @@ -274,6 +277,7 @@ def extract_( _logger.debug( f"skipping {slide_path} because {feature_output_path} already exists" ) + skipped += 1 continue feature_output_path.parent.mkdir(parents=True, exist_ok=True) @@ -306,13 +310,16 @@ def extract_( "failed to extract MPP from slide. " "You can try manually setting it by adding `preprocessing.default_slide_mpp = ` " ) + failed += 1 continue except Exception: _logger.exception(f"error while extracting features from {slide_path}") + failed += 1 continue if len(feats) == 0: _logger.info(f"no tiles found in {slide_path}, skipping") + skipped += 1 continue coords = torch.stack([torch.concat(xs_um), torch.concat(ys_um)], dim=1).numpy() @@ -341,6 +348,7 @@ def extract_( Path(tmp_h5_file.name).rename(feature_output_path) _logger.debug(f"saved features to {feature_output_path}") + processed += 1 # Save rejection thumbnail thumbnail_path = feat_output_dir / slide_path.relative_to(wsi_dir).with_suffix( @@ -355,6 +363,8 @@ def extract_( default_slide_mpp=default_slide_mpp, ).convert("RGB").save(thumbnail_path) + return {"processed": processed, "failed": failed, "skipped": skipped} + def _get_rejection_thumb( slide: openslide.AbstractSlide, diff --git a/src/stamp/seed.py b/src/stamp/seed.py new file mode 100644 index 00000000..41374bd9 --- /dev/null +++ b/src/stamp/seed.py @@ -0,0 +1,60 @@ +import random +from typing import Callable, ClassVar + +import numpy as np +import torch +from torch import Generator + + +def _seed_worker(worker_id: int) -> None: + worker_seed = torch.initial_seed() % 2**32 + np.random.seed(worker_seed) + random.seed(worker_seed) + + +class Seed: + seed: ClassVar[int | None] = None + + @classmethod + def torch(cls, seed: int) -> None: + torch.manual_seed(seed) + torch.cuda.manual_seed_all(seed) + + @classmethod + def python(cls, seed: int) -> None: + random.seed(seed) + + @classmethod + def numpy(cls, seed: int) -> None: + np.random.seed(seed) + + @classmethod + def set(cls, seed: int) -> None: + cls.torch(seed) + cls.python(seed) + cls.numpy(seed) + cls.seed = seed + + @classmethod + def _is_set(cls) -> bool: + return cls.seed is not None + + @classmethod + def get_loader_worker_init(cls) -> Callable[[int], None]: + if cls._is_set(): + return _seed_worker + else: + raise RuntimeError( + "Seed has not been set. Call Seed.set(seed) before using a DataLoader." + ) + + @classmethod + def get_torch_generator(cls, device="cpu") -> Generator: + seed = cls.seed + if seed is None: + raise RuntimeError( + "Seed has not been set. Call Seed.set(seed) before requesting a generator." + ) + g = torch.Generator(device) + g.manual_seed(seed) + return g diff --git a/tests/random_data.py b/tests/random_data.py index c2c3e046..63180999 100644 --- a/tests/random_data.py +++ b/tests/random_data.py @@ -23,13 +23,6 @@ FeatureDir: TypeAlias = Path -def seed_rng(seed: int) -> None: - """Seeds all the random number generators""" - random.seed(seed) - torch.manual_seed(seed) - np.random.seed(seed) - - def create_random_dataset( *, dir: Path, diff --git a/tests/test_crossval.py b/tests/test_crossval.py index 342e39fc..ebafd281 100644 --- a/tests/test_crossval.py +++ b/tests/test_crossval.py @@ -1,8 +1,6 @@ import os -import random from pathlib import Path -import numpy as np import pytest import torch from random_data import create_random_dataset, create_random_patient_level_dataset @@ -15,6 +13,7 @@ VitModelParams, ) from stamp.modeling.crossval import categorical_crossval_ +from stamp.seed import Seed @pytest.mark.slow @@ -32,9 +31,7 @@ def test_crossval_integration( use_alibi: bool = False, use_vary_precision_transform: bool = False, ) -> None: - random.seed(0) - torch.manual_seed(0) - np.random.seed(0) + Seed.set(42) if feature_type == "tile": clini_path, slide_path, feature_dir, categories = create_random_dataset( diff --git a/tests/test_data.py b/tests/test_data.py index 5ded4f01..74d1b16e 100644 --- a/tests/test_data.py +++ b/tests/test_data.py @@ -6,11 +6,11 @@ import pytest import torch from random_data import ( + create_good_and_bad_slide_tables, create_random_patient_level_feature_file, + create_random_slide_tables, make_feature_file, make_old_feature_file, - create_good_and_bad_slide_tables, - create_random_slide_tables, ) from torch.utils.data import DataLoader @@ -23,6 +23,7 @@ get_coords, slide_to_patient_from_slide_table_, ) +from stamp.seed import Seed from stamp.types import ( BagSize, FeaturePath, @@ -94,6 +95,7 @@ def test_bag_dataset( dim_feats: int = 34, batch_size: int = 2, ) -> None: + Seed.set(1234) ds = BagDataset( bags=[ [ @@ -126,7 +128,14 @@ def test_bag_dataset( assert item_bag_size <= bag_size # Test batching - dl = DataLoader(ds, batch_size=batch_size, shuffle=False) + dl = DataLoader( + ds, + batch_size=batch_size, + shuffle=False, + num_workers=1, + worker_init_fn=Seed.get_loader_worker_init() if Seed._is_set() else None, + generator=Seed.get_torch_generator() if Seed._is_set() else None, + ) bag, coords, bag_sizes, _ = next(iter(dl)) assert bag.shape == (batch_size, bag_size, dim_feats) assert coords.shape == (batch_size, bag_size, 2) @@ -136,6 +145,7 @@ def test_bag_dataset( def test_patient_feature_dataset( tmp_path: Path, dim_feats: int = 16, batch_size: int = 2 ) -> None: + Seed.set(1234) # Create 3 random patient-level feature files on disk files = [ create_random_patient_level_feature_file(tmp_path=tmp_path, feat_dim=dim_feats) @@ -153,7 +163,15 @@ def test_patient_feature_dataset( assert torch.allclose(label, labels[0]) # Test batching - dl = DataLoader(ds, batch_size=batch_size, shuffle=False) + dl = DataLoader( + ds, + batch_size=batch_size, + shuffle=False, + num_workers=1, + worker_init_fn=Seed.get_loader_worker_init() if Seed._is_set() else None, + generator=Seed.get_torch_generator() if Seed._is_set() else None, + ) + feats_batch, labels_batch = next(iter(dl)) assert feats_batch.shape == (batch_size, dim_feats) assert labels_batch.shape == (batch_size, 4) @@ -309,3 +327,42 @@ def test_slide_table_h5_validation_random( patient_label="PATIENT", filename_label="FILENAME", ) + + +def test_two_dataloaders_diverge(): + # Global seed so dataset construction is deterministic + Seed.set(1234) + + ds = BagDataset( + bags=[ + [make_feature_file(feats=torch.rand((12, 8)), coords=torch.rand(12, 2))], + [make_feature_file(feats=torch.rand((12, 8)), coords=torch.rand(12, 2))], + ], + bag_size=BagSize(5), # triggers per-sample random subsampling + ground_truths=torch.rand(2, 3) > 0.5, + transform=None, + ) + + base = 98765 + g2 = torch.Generator().manual_seed(base) # loader 1 generator + + # Loader A: no workers ⇒ __getitem__ randomness runs in main process + dl1 = DataLoader(ds, batch_size=1, shuffle=True, num_workers=0) + + # Loader B: 1 worker ⇒ worker RNG is derived from DataLoader's base_seed + dl2 = DataLoader( + ds, + batch_size=1, + shuffle=True, + num_workers=1, + worker_init_fn=Seed.get_loader_worker_init(), + generator=g2, + ) + + # With same seed, shuffle order tends to match, but per-sample RNG differs + diffs = 0 + for (f1, *_), (f2, *_) in zip(dl1, dl2): + if not torch.equal(f1, f2): + diffs += 1 + + assert diffs >= 1, "Expected at least one batch to differ despite same seed" diff --git a/tests/test_deployment.py b/tests/test_deployment.py index 033924d4..41b859bd 100644 --- a/tests/test_deployment.py +++ b/tests/test_deployment.py @@ -13,6 +13,7 @@ from stamp.modeling.deploy import _predict, _to_prediction_df from stamp.modeling.lightning_model import LitVisionTransformer from stamp.modeling.mlp_classifier import LitMLPClassifier +from stamp.seed import Seed from stamp.types import GroundTruth, PatientId @@ -25,6 +26,7 @@ def test_predict( n_heads: int = 7, dim_input: int = 12, ) -> None: + Seed.set(42) model = LitVisionTransformer( categories=list(categories), category_weights=torch.rand(len(categories)), diff --git a/tests/test_deployment_backward_compatibility.py b/tests/test_deployment_backward_compatibility.py index b62a0923..bfaf8095 100644 --- a/tests/test_deployment_backward_compatibility.py +++ b/tests/test_deployment_backward_compatibility.py @@ -5,6 +5,7 @@ from stamp.modeling.data import PatientData, tile_bag_dataloader from stamp.modeling.deploy import _predict from stamp.modeling.lightning_model import LitVisionTransformer +from stamp.seed import Seed from stamp.types import FeaturePath, PatientId @@ -12,6 +13,7 @@ "ignore:The 'predict_dataloader' does not have many workers" ) def test_backwards_compatibility() -> None: + Seed.set(42) example_checkpoint_path = download_file( url="https://github.com/KatherLab/STAMP/releases/download/2.2.0/example-model-v2_3_0.ckpt", file_name="example-modelv2_3_0.ckpt", diff --git a/tests/test_train_deploy.py b/tests/test_train_deploy.py index 03d48c48..0b58cd10 100644 --- a/tests/test_train_deploy.py +++ b/tests/test_train_deploy.py @@ -16,6 +16,7 @@ ) from stamp.modeling.deploy import deploy_categorical_model_ from stamp.modeling.train import train_categorical_model_ +from stamp.seed import Seed @pytest.mark.slow @@ -35,9 +36,7 @@ def test_train_deploy_integration( use_alibi: bool, use_vary_precision_transform: bool, ) -> None: - random.seed(0) - torch.manual_seed(0) - np.random.seed(0) + Seed.set(42) (tmp_path / "train").mkdir() (tmp_path / "deploy").mkdir() diff --git a/uv.lock b/uv.lock index 7f1fe21c..738f2a7a 100644 --- a/uv.lock +++ b/uv.lock @@ -18,17 +18,14 @@ conflicts = [[ [[manifest.dependency-metadata]] name = "causal-conv1d" -version = "1.5.0.post8" requires-dist = ["setuptools"] [[manifest.dependency-metadata]] name = "flash-attn" -version = "2.8.2" requires-dist = ["torch", "einops"] [[manifest.dependency-metadata]] name = "mamba-ssm" -version = "2.2.4" requires-dist = ["setuptools"] [[manifest.dependency-metadata]] @@ -243,11 +240,12 @@ wheels = [ [[package]] name = "causal-conv1d" -version = "1.5.0.post8" -source = { git = "https://github.com/KatherLab/causal-conv1d.git?rev=b73d1ca0e0726ba6520c38d342bd411bb5850064#b73d1ca0e0726ba6520c38d342bd411bb5850064" } +version = "1.5.2" +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "setuptools" }, ] +sdist = { url = "https://files.pythonhosted.org/packages/03/e5/2d2b2e067234c0022ff491ff8e574ca0c67094b2deb61249a2be21789cbb/causal_conv1d-1.5.2.tar.gz", hash = "sha256:9b7d8ec8d07e3590a1dfa010e4e87d1442635c3f96d665a3c1ce3025d8cc4b84", size = 23883, upload-time = "2025-07-18T22:15:36.988Z" } [[package]] name = "certifi" @@ -366,7 +364,7 @@ wheels = [ [[package]] name = "cobra" version = "0.1.0" -source = { git = "http://github.com/KatherLab/COBRA.git?rev=c8aa71ce691e1279f2bb797f536355d6be47b6ac#c8aa71ce691e1279f2bb797f536355d6be47b6ac" } +source = { git = "http://github.com/KatherLab/COBRA.git?rev=73712e9ffa4d1bdecf9be9826d66094bd2b17534#73712e9ffa4d1bdecf9be9826d66094bd2b17534" } dependencies = [ { name = "causal-conv1d" }, { name = "einops" }, @@ -767,13 +765,13 @@ wheels = [ [[package]] name = "flash-attn" -version = "2.8.2" +version = "2.8.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "einops" }, { name = "torch" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/63/91/91bcbd7424877fa8da4e7cc04b8a777247a33037b9c1fd976a5ad426c047/flash_attn-2.8.2.tar.gz", hash = "sha256:740a5370f406cbe16155cc6d078ec543a97a137501f32cba89198295e6b80e54", size = 8167111, upload-time = "2025-07-24T16:06:45.953Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3b/b2/8d76c41ad7974ee264754709c22963447f7f8134613fd9ce80984ed0dab7/flash_attn-2.8.3.tar.gz", hash = "sha256:1e71dd64a9e0280e0447b8a0c2541bad4bf6ac65bdeaa2f90e51a9e57de0370d", size = 8447812, upload-time = "2025-08-15T08:28:12.911Z" } [[package]] name = "fonttools" @@ -1540,11 +1538,12 @@ dependencies = [ [[package]] name = "mamba-ssm" -version = "2.2.4" -source = { git = "https://github.com/KatherLab/mamba.git?rev=d0d4192621889b26f9669ea4a8e6fe79cc84e8d9#d0d4192621889b26f9669ea4a8e6fe79cc84e8d9" } +version = "2.2.5" +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "setuptools" }, ] +sdist = { url = "https://files.pythonhosted.org/packages/ba/2d/fbd909f6e6d48c491a9ed7ae68e8a890d8409aba4a6356741e2a9c6adad5/mamba_ssm-2.2.5.tar.gz", hash = "sha256:5055c8e631a22bb3cfc9958828a7a57ea14deef2ab2a98dcf425a27c87dcf6a7", size = 113753, upload-time = "2025-07-19T06:16:06.875Z" } [[package]] name = "markdown-it-py" @@ -1981,168 +1980,154 @@ wheels = [ [[package]] name = "nvidia-cublas-cu12" -version = "12.6.4.1" +version = "12.8.4.1" source = { registry = "https://pypi.org/simple" } wheels = [ - { url = "https://files.pythonhosted.org/packages/af/eb/ff4b8c503fa1f1796679dce648854d58751982426e4e4b37d6fce49d259c/nvidia_cublas_cu12-12.6.4.1-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:08ed2686e9875d01b58e3cb379c6896df8e76c75e0d4a7f7dace3d7b6d9ef8eb", size = 393138322, upload-time = "2024-11-20T17:40:25.65Z" }, - { url = "https://files.pythonhosted.org/packages/97/0d/f1f0cadbf69d5b9ef2e4f744c9466cb0a850741d08350736dfdb4aa89569/nvidia_cublas_cu12-12.6.4.1-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:235f728d6e2a409eddf1df58d5b0921cf80cfa9e72b9f2775ccb7b4a87984668", size = 390794615, upload-time = "2024-11-20T17:39:52.715Z" }, - { url = "https://files.pythonhosted.org/packages/84/f7/985e9bdbe3e0ac9298fcc8cfa51a392862a46a0ffaccbbd56939b62a9c83/nvidia_cublas_cu12-12.6.4.1-py3-none-win_amd64.whl", hash = "sha256:9e4fa264f4d8a4eb0cdbd34beadc029f453b3bafae02401e999cf3d5a5af75f8", size = 434535301, upload-time = "2024-11-20T17:50:41.681Z" }, + { url = "https://files.pythonhosted.org/packages/29/99/db44d685f0e257ff0e213ade1964fc459b4a690a73293220e98feb3307cf/nvidia_cublas_cu12-12.8.4.1-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:b86f6dd8935884615a0683b663891d43781b819ac4f2ba2b0c9604676af346d0", size = 590537124, upload-time = "2025-03-07T01:43:53.556Z" }, + { url = "https://files.pythonhosted.org/packages/dc/61/e24b560ab2e2eaeb3c839129175fb330dfcfc29e5203196e5541a4c44682/nvidia_cublas_cu12-12.8.4.1-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:8ac4e771d5a348c551b2a426eda6193c19aa630236b418086020df5ba9667142", size = 594346921, upload-time = "2025-03-07T01:44:31.254Z" }, + { url = "https://files.pythonhosted.org/packages/70/61/7d7b3c70186fb651d0fbd35b01dbfc8e755f69fd58f817f3d0f642df20c3/nvidia_cublas_cu12-12.8.4.1-py3-none-win_amd64.whl", hash = "sha256:47e9b82132fa8d2b4944e708049229601448aaad7e6f296f630f2d1a32de35af", size = 567544208, upload-time = "2025-03-07T01:53:30.535Z" }, ] [[package]] name = "nvidia-cuda-cupti-cu12" -version = "12.6.80" +version = "12.8.90" source = { registry = "https://pypi.org/simple" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e6/8b/2f6230cb715646c3a9425636e513227ce5c93c4d65823a734f4bb86d43c3/nvidia_cuda_cupti_cu12-12.6.80-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:166ee35a3ff1587f2490364f90eeeb8da06cd867bd5b701bf7f9a02b78bc63fc", size = 8236764, upload-time = "2024-11-20T17:35:41.03Z" }, - { url = "https://files.pythonhosted.org/packages/25/0f/acb326ac8fd26e13c799e0b4f3b2751543e1834f04d62e729485872198d4/nvidia_cuda_cupti_cu12-12.6.80-py3-none-manylinux2014_aarch64.whl", hash = "sha256:358b4a1d35370353d52e12f0a7d1769fc01ff74a191689d3870b2123156184c4", size = 8236756, upload-time = "2024-10-01T16:57:45.507Z" }, - { url = "https://files.pythonhosted.org/packages/49/60/7b6497946d74bcf1de852a21824d63baad12cd417db4195fc1bfe59db953/nvidia_cuda_cupti_cu12-12.6.80-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6768bad6cab4f19e8292125e5f1ac8aa7d1718704012a0e3272a6f61c4bce132", size = 8917980, upload-time = "2024-11-20T17:36:04.019Z" }, - { url = "https://files.pythonhosted.org/packages/a5/24/120ee57b218d9952c379d1e026c4479c9ece9997a4fb46303611ee48f038/nvidia_cuda_cupti_cu12-12.6.80-py3-none-manylinux2014_x86_64.whl", hash = "sha256:a3eff6cdfcc6a4c35db968a06fcadb061cbc7d6dde548609a941ff8701b98b73", size = 8917972, upload-time = "2024-10-01T16:58:06.036Z" }, - { url = "https://files.pythonhosted.org/packages/1c/81/7796f096afaf726796b1b648f3bc80cafc61fe7f77f44a483c89e6c5ef34/nvidia_cuda_cupti_cu12-12.6.80-py3-none-win_amd64.whl", hash = "sha256:bbe6ae76e83ce5251b56e8c8e61a964f757175682bbad058b170b136266ab00a", size = 5724175, upload-time = "2024-10-01T17:09:47.955Z" }, + { url = "https://files.pythonhosted.org/packages/d5/1f/b3bd73445e5cb342727fd24fe1f7b748f690b460acadc27ea22f904502c8/nvidia_cuda_cupti_cu12-12.8.90-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:4412396548808ddfed3f17a467b104ba7751e6b58678a4b840675c56d21cf7ed", size = 9533318, upload-time = "2025-03-07T01:40:10.421Z" }, + { url = "https://files.pythonhosted.org/packages/f8/02/2adcaa145158bf1a8295d83591d22e4103dbfd821bcaf6f3f53151ca4ffa/nvidia_cuda_cupti_cu12-12.8.90-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ea0cb07ebda26bb9b29ba82cda34849e73c166c18162d3913575b0c9db9a6182", size = 10248621, upload-time = "2025-03-07T01:40:21.213Z" }, + { url = "https://files.pythonhosted.org/packages/41/bc/83f5426095d93694ae39fe1311431b5d5a9bb82e48bf0dd8e19be2765942/nvidia_cuda_cupti_cu12-12.8.90-py3-none-win_amd64.whl", hash = "sha256:bb479dcdf7e6d4f8b0b01b115260399bf34154a1a2e9fe11c85c517d87efd98e", size = 7015759, upload-time = "2025-03-07T01:51:11.355Z" }, ] [[package]] name = "nvidia-cuda-nvrtc-cu12" -version = "12.6.77" +version = "12.8.93" source = { registry = "https://pypi.org/simple" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f4/2f/72df534873235983cc0a5371c3661bebef7c4682760c275590b972c7b0f9/nvidia_cuda_nvrtc_cu12-12.6.77-py3-none-manylinux2014_aarch64.whl", hash = "sha256:5847f1d6e5b757f1d2b3991a01082a44aad6f10ab3c5c0213fa3e25bddc25a13", size = 23162955, upload-time = "2024-10-01T16:59:50.922Z" }, - { url = "https://files.pythonhosted.org/packages/75/2e/46030320b5a80661e88039f59060d1790298b4718944a65a7f2aeda3d9e9/nvidia_cuda_nvrtc_cu12-12.6.77-py3-none-manylinux2014_x86_64.whl", hash = "sha256:35b0cc6ee3a9636d5409133e79273ce1f3fd087abb0532d2d2e8fff1fe9efc53", size = 23650380, upload-time = "2024-10-01T17:00:14.643Z" }, - { url = "https://files.pythonhosted.org/packages/f5/46/d3a1cdda8bb113c80f43a0a6f3a853356d487b830f3483f92d49ce87fa55/nvidia_cuda_nvrtc_cu12-12.6.77-py3-none-win_amd64.whl", hash = "sha256:f7007dbd914c56bd80ea31bc43e8e149da38f68158f423ba845fc3292684e45a", size = 39026742, upload-time = "2024-10-01T17:10:49.058Z" }, + { url = "https://files.pythonhosted.org/packages/05/6b/32f747947df2da6994e999492ab306a903659555dddc0fbdeb9d71f75e52/nvidia_cuda_nvrtc_cu12-12.8.93-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl", hash = "sha256:a7756528852ef889772a84c6cd89d41dfa74667e24cca16bb31f8f061e3e9994", size = 88040029, upload-time = "2025-03-07T01:42:13.562Z" }, + { url = "https://files.pythonhosted.org/packages/eb/d1/e50d0acaab360482034b84b6e27ee83c6738f7d32182b987f9c7a4e32962/nvidia_cuda_nvrtc_cu12-12.8.93-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fc1fec1e1637854b4c0a65fb9a8346b51dd9ee69e61ebaccc82058441f15bce8", size = 43106076, upload-time = "2025-03-07T01:41:59.817Z" }, + { url = "https://files.pythonhosted.org/packages/45/51/52a3d84baa2136cc8df15500ad731d74d3a1114d4c123e043cb608d4a32b/nvidia_cuda_nvrtc_cu12-12.8.93-py3-none-win_amd64.whl", hash = "sha256:7a4b6b2904850fe78e0bd179c4b655c404d4bb799ef03ddc60804247099ae909", size = 73586838, upload-time = "2025-03-07T01:52:13.483Z" }, ] [[package]] name = "nvidia-cuda-runtime-cu12" -version = "12.6.77" +version = "12.8.90" source = { registry = "https://pypi.org/simple" } wheels = [ - { url = "https://files.pythonhosted.org/packages/8f/ea/590b2ac00d772a8abd1c387a92b46486d2679ca6622fd25c18ff76265663/nvidia_cuda_runtime_cu12-12.6.77-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:6116fad3e049e04791c0256a9778c16237837c08b27ed8c8401e2e45de8d60cd", size = 908052, upload-time = "2024-11-20T17:35:19.905Z" }, - { url = "https://files.pythonhosted.org/packages/b7/3d/159023799677126e20c8fd580cca09eeb28d5c5a624adc7f793b9aa8bbfa/nvidia_cuda_runtime_cu12-12.6.77-py3-none-manylinux2014_aarch64.whl", hash = "sha256:d461264ecb429c84c8879a7153499ddc7b19b5f8d84c204307491989a365588e", size = 908040, upload-time = "2024-10-01T16:57:22.221Z" }, - { url = "https://files.pythonhosted.org/packages/e1/23/e717c5ac26d26cf39a27fbc076240fad2e3b817e5889d671b67f4f9f49c5/nvidia_cuda_runtime_cu12-12.6.77-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ba3b56a4f896141e25e19ab287cd71e52a6a0f4b29d0d31609f60e3b4d5219b7", size = 897690, upload-time = "2024-11-20T17:35:30.697Z" }, - { url = "https://files.pythonhosted.org/packages/f0/62/65c05e161eeddbafeca24dc461f47de550d9fa8a7e04eb213e32b55cfd99/nvidia_cuda_runtime_cu12-12.6.77-py3-none-manylinux2014_x86_64.whl", hash = "sha256:a84d15d5e1da416dd4774cb42edf5e954a3e60cc945698dc1d5be02321c44dc8", size = 897678, upload-time = "2024-10-01T16:57:33.821Z" }, - { url = "https://files.pythonhosted.org/packages/fa/76/4c80fa138333cc975743fd0687a745fccb30d167f906f13c1c7f9a85e5ea/nvidia_cuda_runtime_cu12-12.6.77-py3-none-win_amd64.whl", hash = "sha256:86c58044c824bf3c173c49a2dbc7a6c8b53cb4e4dca50068be0bf64e9dab3f7f", size = 891773, upload-time = "2024-10-01T17:09:26.362Z" }, + { url = "https://files.pythonhosted.org/packages/7c/75/f865a3b236e4647605ea34cc450900854ba123834a5f1598e160b9530c3a/nvidia_cuda_runtime_cu12-12.8.90-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:52bf7bbee900262ffefe5e9d5a2a69a30d97e2bc5bb6cc866688caa976966e3d", size = 965265, upload-time = "2025-03-07T01:39:43.533Z" }, + { url = "https://files.pythonhosted.org/packages/0d/9b/a997b638fcd068ad6e4d53b8551a7d30fe8b404d6f1804abf1df69838932/nvidia_cuda_runtime_cu12-12.8.90-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:adade8dcbd0edf427b7204d480d6066d33902cab2a4707dcfc48a2d0fd44ab90", size = 954765, upload-time = "2025-03-07T01:40:01.615Z" }, + { url = "https://files.pythonhosted.org/packages/30/a5/a515b7600ad361ea14bfa13fb4d6687abf500adc270f19e89849c0590492/nvidia_cuda_runtime_cu12-12.8.90-py3-none-win_amd64.whl", hash = "sha256:c0c6027f01505bfed6c3b21ec546f69c687689aad5f1a377554bc6ca4aa993a8", size = 944318, upload-time = "2025-03-07T01:51:01.794Z" }, ] [[package]] name = "nvidia-cudnn-cu12" -version = "9.5.1.17" +version = "9.10.2.21" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "nvidia-cublas-cu12", marker = "sys_platform == 'linux' or (extra == 'extra-5-stamp-cpu' and extra == 'extra-5-stamp-gpu')" }, + { name = "nvidia-cublas-cu12" }, ] wheels = [ - { url = "https://files.pythonhosted.org/packages/99/93/a201a12d3ec1caa8c6ac34c1c2f9eeb696b886f0c36ff23c638b46603bd0/nvidia_cudnn_cu12-9.5.1.17-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:9fd4584468533c61873e5fda8ca41bac3a38bcb2d12350830c69b0a96a7e4def", size = 570523509, upload-time = "2024-10-25T19:53:03.148Z" }, - { url = "https://files.pythonhosted.org/packages/2a/78/4535c9c7f859a64781e43c969a3a7e84c54634e319a996d43ef32ce46f83/nvidia_cudnn_cu12-9.5.1.17-py3-none-manylinux_2_28_x86_64.whl", hash = "sha256:30ac3869f6db17d170e0e556dd6cc5eee02647abc31ca856634d5a40f82c15b2", size = 570988386, upload-time = "2024-10-25T19:54:26.39Z" }, - { url = "https://files.pythonhosted.org/packages/b6/b2/3f60d15f037fa5419d9d7f788b100ef33ea913ae5315c87ca6d6fa606c35/nvidia_cudnn_cu12-9.5.1.17-py3-none-win_amd64.whl", hash = "sha256:d7af0f8a4f3b4b9dbb3122f2ef553b45694ed9c384d5a75bab197b8eefb79ab8", size = 565440743, upload-time = "2024-10-25T19:55:49.74Z" }, + { url = "https://files.pythonhosted.org/packages/fa/41/e79269ce215c857c935fd86bcfe91a451a584dfc27f1e068f568b9ad1ab7/nvidia_cudnn_cu12-9.10.2.21-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:c9132cc3f8958447b4910a1720036d9eff5928cc3179b0a51fb6d167c6cc87d8", size = 705026878, upload-time = "2025-06-06T21:52:51.348Z" }, + { url = "https://files.pythonhosted.org/packages/ba/51/e123d997aa098c61d029f76663dedbfb9bc8dcf8c60cbd6adbe42f76d049/nvidia_cudnn_cu12-9.10.2.21-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:949452be657fa16687d0930933f032835951ef0892b37d2d53824d1a84dc97a8", size = 706758467, upload-time = "2025-06-06T21:54:08.597Z" }, + { url = "https://files.pythonhosted.org/packages/3d/90/0bd6e586701b3a890fd38aa71c387dab4883d619d6e5ad912ccbd05bfd67/nvidia_cudnn_cu12-9.10.2.21-py3-none-win_amd64.whl", hash = "sha256:c6288de7d63e6cf62988f0923f96dc339cea362decb1bf5b3141883392a7d65e", size = 692992268, upload-time = "2025-06-06T21:55:18.114Z" }, ] [[package]] name = "nvidia-cufft-cu12" -version = "11.3.0.4" +version = "11.3.3.83" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "nvidia-nvjitlink-cu12", marker = "sys_platform == 'linux' or (extra == 'extra-5-stamp-cpu' and extra == 'extra-5-stamp-gpu')" }, + { name = "nvidia-nvjitlink-cu12" }, ] wheels = [ - { url = "https://files.pythonhosted.org/packages/1f/37/c50d2b2f2c07e146776389e3080f4faf70bcc4fa6e19d65bb54ca174ebc3/nvidia_cufft_cu12-11.3.0.4-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d16079550df460376455cba121db6564089176d9bac9e4f360493ca4741b22a6", size = 200164144, upload-time = "2024-11-20T17:40:58.288Z" }, - { url = "https://files.pythonhosted.org/packages/ce/f5/188566814b7339e893f8d210d3a5332352b1409815908dad6a363dcceac1/nvidia_cufft_cu12-11.3.0.4-py3-none-manylinux2014_aarch64.whl", hash = "sha256:8510990de9f96c803a051822618d42bf6cb8f069ff3f48d93a8486efdacb48fb", size = 200164135, upload-time = "2024-10-01T17:03:24.212Z" }, - { url = "https://files.pythonhosted.org/packages/8f/16/73727675941ab8e6ffd86ca3a4b7b47065edcca7a997920b831f8147c99d/nvidia_cufft_cu12-11.3.0.4-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ccba62eb9cef5559abd5e0d54ceed2d9934030f51163df018532142a8ec533e5", size = 200221632, upload-time = "2024-11-20T17:41:32.357Z" }, - { url = "https://files.pythonhosted.org/packages/60/de/99ec247a07ea40c969d904fc14f3a356b3e2a704121675b75c366b694ee1/nvidia_cufft_cu12-11.3.0.4-py3-none-manylinux2014_x86_64.whl", hash = "sha256:768160ac89f6f7b459bee747e8d175dbf53619cfe74b2a5636264163138013ca", size = 200221622, upload-time = "2024-10-01T17:03:58.79Z" }, - { url = "https://files.pythonhosted.org/packages/b4/38/36fd800cec8f6e89b7c1576edaaf8076e69ec631644cdbc1b5f2e2b5a9df/nvidia_cufft_cu12-11.3.0.4-py3-none-win_amd64.whl", hash = "sha256:6048ebddfb90d09d2707efb1fd78d4e3a77cb3ae4dc60e19aab6be0ece2ae464", size = 199356881, upload-time = "2024-10-01T17:13:01.861Z" }, + { url = "https://files.pythonhosted.org/packages/60/bc/7771846d3a0272026c416fbb7e5f4c1f146d6d80704534d0b187dd6f4800/nvidia_cufft_cu12-11.3.3.83-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:848ef7224d6305cdb2a4df928759dca7b1201874787083b6e7550dd6765ce69a", size = 193109211, upload-time = "2025-03-07T01:44:56.873Z" }, + { url = "https://files.pythonhosted.org/packages/1f/13/ee4e00f30e676b66ae65b4f08cb5bcbb8392c03f54f2d5413ea99a5d1c80/nvidia_cufft_cu12-11.3.3.83-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4d2dd21ec0b88cf61b62e6b43564355e5222e4a3fb394cac0db101f2dd0d4f74", size = 193118695, upload-time = "2025-03-07T01:45:27.821Z" }, + { url = "https://files.pythonhosted.org/packages/7d/ec/ce1629f1e478bb5ccd208986b5f9e0316a78538dd6ab1d0484f012f8e2a1/nvidia_cufft_cu12-11.3.3.83-py3-none-win_amd64.whl", hash = "sha256:7a64a98ef2a7c47f905aaf8931b69a3a43f27c55530c698bb2ed7c75c0b42cb7", size = 192216559, upload-time = "2025-03-07T01:53:57.106Z" }, ] [[package]] name = "nvidia-cufile-cu12" -version = "1.11.1.6" +version = "1.13.1.3" source = { registry = "https://pypi.org/simple" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b2/66/cc9876340ac68ae71b15c743ddb13f8b30d5244af344ec8322b449e35426/nvidia_cufile_cu12-1.11.1.6-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:cc23469d1c7e52ce6c1d55253273d32c565dd22068647f3aa59b3c6b005bf159", size = 1142103, upload-time = "2024-11-20T17:42:11.83Z" }, - { url = "https://files.pythonhosted.org/packages/17/bf/cc834147263b929229ce4aadd62869f0b195e98569d4c28b23edc72b85d9/nvidia_cufile_cu12-1.11.1.6-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:8f57a0051dcf2543f6dc2b98a98cb2719c37d3cee1baba8965d57f3bbc90d4db", size = 1066155, upload-time = "2024-11-20T17:41:49.376Z" }, + { url = "https://files.pythonhosted.org/packages/bb/fe/1bcba1dfbfb8d01be8d93f07bfc502c93fa23afa6fd5ab3fc7c1df71038a/nvidia_cufile_cu12-1.13.1.3-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1d069003be650e131b21c932ec3d8969c1715379251f8d23a1860554b1cb24fc", size = 1197834, upload-time = "2025-03-07T01:45:50.723Z" }, + { url = "https://files.pythonhosted.org/packages/1e/f5/5607710447a6fe9fd9b3283956fceeee8a06cda1d2f56ce31371f595db2a/nvidia_cufile_cu12-1.13.1.3-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:4beb6d4cce47c1a0f1013d72e02b0994730359e17801d395bdcbf20cfb3bb00a", size = 1120705, upload-time = "2025-03-07T01:45:41.434Z" }, ] [[package]] name = "nvidia-curand-cu12" -version = "10.3.7.77" +version = "10.3.9.90" source = { registry = "https://pypi.org/simple" } wheels = [ - { url = "https://files.pythonhosted.org/packages/42/ac/36543605358a355632f1a6faa3e2d5dfb91eab1e4bc7d552040e0383c335/nvidia_curand_cu12-10.3.7.77-py3-none-manylinux2014_aarch64.whl", hash = "sha256:6e82df077060ea28e37f48a3ec442a8f47690c7499bff392a5938614b56c98d8", size = 56289881, upload-time = "2024-10-01T17:04:18.981Z" }, - { url = "https://files.pythonhosted.org/packages/73/1b/44a01c4e70933637c93e6e1a8063d1e998b50213a6b65ac5a9169c47e98e/nvidia_curand_cu12-10.3.7.77-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a42cd1344297f70b9e39a1e4f467a4e1c10f1da54ff7a85c12197f6c652c8bdf", size = 56279010, upload-time = "2024-11-20T17:42:50.958Z" }, - { url = "https://files.pythonhosted.org/packages/4a/aa/2c7ff0b5ee02eaef890c0ce7d4f74bc30901871c5e45dee1ae6d0083cd80/nvidia_curand_cu12-10.3.7.77-py3-none-manylinux2014_x86_64.whl", hash = "sha256:99f1a32f1ac2bd134897fc7a203f779303261268a65762a623bf30cc9fe79117", size = 56279000, upload-time = "2024-10-01T17:04:45.274Z" }, - { url = "https://files.pythonhosted.org/packages/a6/02/5362a9396f23f7de1dd8a64369e87c85ffff8216fc8194ace0fa45ba27a5/nvidia_curand_cu12-10.3.7.77-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:7b2ed8e95595c3591d984ea3603dd66fe6ce6812b886d59049988a712ed06b6e", size = 56289882, upload-time = "2024-11-20T17:42:25.222Z" }, - { url = "https://files.pythonhosted.org/packages/a9/a8/0cd0cec757bd4b4b4ef150fca62ec064db7d08a291dced835a0be7d2c147/nvidia_curand_cu12-10.3.7.77-py3-none-win_amd64.whl", hash = "sha256:6d6d935ffba0f3d439b7cd968192ff068fafd9018dbf1b85b37261b13cfc9905", size = 55783873, upload-time = "2024-10-01T17:13:30.377Z" }, + { url = "https://files.pythonhosted.org/packages/45/5e/92aa15eca622a388b80fbf8375d4760738df6285b1e92c43d37390a33a9a/nvidia_curand_cu12-10.3.9.90-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:dfab99248034673b779bc6decafdc3404a8a6f502462201f2f31f11354204acd", size = 63625754, upload-time = "2025-03-07T01:46:10.735Z" }, + { url = "https://files.pythonhosted.org/packages/fb/aa/6584b56dc84ebe9cf93226a5cde4d99080c8e90ab40f0c27bda7a0f29aa1/nvidia_curand_cu12-10.3.9.90-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:b32331d4f4df5d6eefa0554c565b626c7216f87a06a4f56fab27c3b68a830ec9", size = 63619976, upload-time = "2025-03-07T01:46:23.323Z" }, + { url = "https://files.pythonhosted.org/packages/b9/75/70c05b2f3ed5be3bb30b7102b6eb78e100da4bbf6944fd6725c012831cab/nvidia_curand_cu12-10.3.9.90-py3-none-win_amd64.whl", hash = "sha256:f149a8ca457277da854f89cf282d6ef43176861926c7ac85b2a0fbd237c587ec", size = 62765309, upload-time = "2025-03-07T01:54:20.478Z" }, ] [[package]] name = "nvidia-cusolver-cu12" -version = "11.7.1.2" +version = "11.7.3.90" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "nvidia-cublas-cu12", marker = "sys_platform == 'linux' or (extra == 'extra-5-stamp-cpu' and extra == 'extra-5-stamp-gpu')" }, - { name = "nvidia-cusparse-cu12", marker = "sys_platform == 'linux' or (extra == 'extra-5-stamp-cpu' and extra == 'extra-5-stamp-gpu')" }, - { name = "nvidia-nvjitlink-cu12", marker = "sys_platform == 'linux' or (extra == 'extra-5-stamp-cpu' and extra == 'extra-5-stamp-gpu')" }, + { name = "nvidia-cublas-cu12" }, + { name = "nvidia-cusparse-cu12" }, + { name = "nvidia-nvjitlink-cu12" }, ] wheels = [ - { url = "https://files.pythonhosted.org/packages/93/17/dbe1aa865e4fdc7b6d4d0dd308fdd5aaab60f939abfc0ea1954eac4fb113/nvidia_cusolver_cu12-11.7.1.2-py3-none-manylinux2014_aarch64.whl", hash = "sha256:0ce237ef60acde1efc457335a2ddadfd7610b892d94efee7b776c64bb1cac9e0", size = 157833628, upload-time = "2024-10-01T17:05:05.591Z" }, - { url = "https://files.pythonhosted.org/packages/f0/6e/c2cf12c9ff8b872e92b4a5740701e51ff17689c4d726fca91875b07f655d/nvidia_cusolver_cu12-11.7.1.2-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e9e49843a7707e42022babb9bcfa33c29857a93b88020c4e4434656a655b698c", size = 158229790, upload-time = "2024-11-20T17:43:43.211Z" }, - { url = "https://files.pythonhosted.org/packages/9f/81/baba53585da791d043c10084cf9553e074548408e04ae884cfe9193bd484/nvidia_cusolver_cu12-11.7.1.2-py3-none-manylinux2014_x86_64.whl", hash = "sha256:6cf28f17f64107a0c4d7802be5ff5537b2130bfc112f25d5a30df227058ca0e6", size = 158229780, upload-time = "2024-10-01T17:05:39.875Z" }, - { url = "https://files.pythonhosted.org/packages/7c/5f/07d0ba3b7f19be5a5ec32a8679fc9384cfd9fc6c869825e93be9f28d6690/nvidia_cusolver_cu12-11.7.1.2-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:dbbe4fc38ec1289c7e5230e16248365e375c3673c9c8bac5796e2e20db07f56e", size = 157833630, upload-time = "2024-11-20T17:43:16.77Z" }, - { url = "https://files.pythonhosted.org/packages/d4/53/fff50a0808df7113d77e3bbc7c2b7eaed6f57d5eb80fbe93ead2aea1e09a/nvidia_cusolver_cu12-11.7.1.2-py3-none-win_amd64.whl", hash = "sha256:6813f9d8073f555444a8705f3ab0296d3e1cb37a16d694c5fc8b862a0d8706d7", size = 149287877, upload-time = "2024-10-01T17:13:49.804Z" }, + { url = "https://files.pythonhosted.org/packages/c8/32/f7cd6ce8a7690544d084ea21c26e910a97e077c9b7f07bf5de623ee19981/nvidia_cusolver_cu12-11.7.3.90-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:db9ed69dbef9715071232caa9b69c52ac7de3a95773c2db65bdba85916e4e5c0", size = 267229841, upload-time = "2025-03-07T01:46:54.356Z" }, + { url = "https://files.pythonhosted.org/packages/85/48/9a13d2975803e8cf2777d5ed57b87a0b6ca2cc795f9a4f59796a910bfb80/nvidia_cusolver_cu12-11.7.3.90-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:4376c11ad263152bd50ea295c05370360776f8c3427b30991df774f9fb26c450", size = 267506905, upload-time = "2025-03-07T01:47:16.273Z" }, + { url = "https://files.pythonhosted.org/packages/13/c0/76ca8551b8a84146ffa189fec81c26d04adba4bc0dbe09cd6e6fd9b7de04/nvidia_cusolver_cu12-11.7.3.90-py3-none-win_amd64.whl", hash = "sha256:4a550db115fcabc4d495eb7d39ac8b58d4ab5d8e63274d3754df1c0ad6a22d34", size = 256720438, upload-time = "2025-03-07T01:54:39.898Z" }, ] [[package]] name = "nvidia-cusparse-cu12" -version = "12.5.4.2" +version = "12.5.8.93" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "nvidia-nvjitlink-cu12", marker = "sys_platform == 'linux' or (extra == 'extra-5-stamp-cpu' and extra == 'extra-5-stamp-gpu')" }, + { name = "nvidia-nvjitlink-cu12" }, ] wheels = [ - { url = "https://files.pythonhosted.org/packages/eb/eb/6681efd0aa7df96b4f8067b3ce7246833dd36830bb4cec8896182773db7d/nvidia_cusparse_cu12-12.5.4.2-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d25b62fb18751758fe3c93a4a08eff08effedfe4edf1c6bb5afd0890fe88f887", size = 216451147, upload-time = "2024-11-20T17:44:18.055Z" }, - { url = "https://files.pythonhosted.org/packages/d3/56/3af21e43014eb40134dea004e8d0f1ef19d9596a39e4d497d5a7de01669f/nvidia_cusparse_cu12-12.5.4.2-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7aa32fa5470cf754f72d1116c7cbc300b4e638d3ae5304cfa4a638a5b87161b1", size = 216451135, upload-time = "2024-10-01T17:06:03.826Z" }, - { url = "https://files.pythonhosted.org/packages/06/1e/b8b7c2f4099a37b96af5c9bb158632ea9e5d9d27d7391d7eb8fc45236674/nvidia_cusparse_cu12-12.5.4.2-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7556d9eca156e18184b94947ade0fba5bb47d69cec46bf8660fd2c71a4b48b73", size = 216561367, upload-time = "2024-11-20T17:44:54.824Z" }, - { url = "https://files.pythonhosted.org/packages/43/ac/64c4316ba163e8217a99680c7605f779accffc6a4bcd0c778c12948d3707/nvidia_cusparse_cu12-12.5.4.2-py3-none-manylinux2014_x86_64.whl", hash = "sha256:23749a6571191a215cb74d1cdbff4a86e7b19f1200c071b3fcf844a5bea23a2f", size = 216561357, upload-time = "2024-10-01T17:06:29.861Z" }, - { url = "https://files.pythonhosted.org/packages/45/ef/876ad8e4260e1128e6d4aac803d9d51baf3791ebdb4a9b8d9b8db032b4b0/nvidia_cusparse_cu12-12.5.4.2-py3-none-win_amd64.whl", hash = "sha256:4acb8c08855a26d737398cba8fb6f8f5045d93f82612b4cfd84645a2332ccf20", size = 213712630, upload-time = "2024-10-01T17:14:23.779Z" }, + { url = "https://files.pythonhosted.org/packages/bc/f7/cd777c4109681367721b00a106f491e0d0d15cfa1fd59672ce580ce42a97/nvidia_cusparse_cu12-12.5.8.93-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:9b6c161cb130be1a07a27ea6923df8141f3c295852f4b260c65f18f3e0a091dc", size = 288117129, upload-time = "2025-03-07T01:47:40.407Z" }, + { url = "https://files.pythonhosted.org/packages/c2/f5/e1854cb2f2bcd4280c44736c93550cc300ff4b8c95ebe370d0aa7d2b473d/nvidia_cusparse_cu12-12.5.8.93-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1ec05d76bbbd8b61b06a80e1eaf8cf4959c3d4ce8e711b65ebd0443bb0ebb13b", size = 288216466, upload-time = "2025-03-07T01:48:13.779Z" }, + { url = "https://files.pythonhosted.org/packages/62/07/f3b2ad63f8e3d257a599f422ae34eb565e70c41031aecefa3d18b62cabd1/nvidia_cusparse_cu12-12.5.8.93-py3-none-win_amd64.whl", hash = "sha256:9a33604331cb2cac199f2e7f5104dfbb8a5a898c367a53dfda9ff2acb6b6b4dd", size = 284937404, upload-time = "2025-03-07T01:55:07.742Z" }, ] [[package]] name = "nvidia-cusparselt-cu12" -version = "0.6.3" +version = "0.7.1" source = { registry = "https://pypi.org/simple" } wheels = [ - { url = "https://files.pythonhosted.org/packages/62/da/4de092c61c6dea1fc9c936e69308a02531d122e12f1f649825934ad651b5/nvidia_cusparselt_cu12-0.6.3-py3-none-manylinux2014_aarch64.whl", hash = "sha256:8371549623ba601a06322af2133c4a44350575f5a3108fb75f3ef20b822ad5f1", size = 156402859, upload-time = "2024-10-16T02:23:17.184Z" }, - { url = "https://files.pythonhosted.org/packages/3b/9a/72ef35b399b0e183bc2e8f6f558036922d453c4d8237dab26c666a04244b/nvidia_cusparselt_cu12-0.6.3-py3-none-manylinux2014_x86_64.whl", hash = "sha256:e5c8a26c36445dd2e6812f1177978a24e2d37cacce7e090f297a688d1ec44f46", size = 156785796, upload-time = "2024-10-15T21:29:17.709Z" }, - { url = "https://files.pythonhosted.org/packages/46/3e/9e1e394a02a06f694be2c97bbe47288bb7c90ea84c7e9cf88f7b28afe165/nvidia_cusparselt_cu12-0.6.3-py3-none-win_amd64.whl", hash = "sha256:3b325bcbd9b754ba43df5a311488fca11a6b5dc3d11df4d190c000cf1a0765c7", size = 155595972, upload-time = "2024-10-15T22:58:35.426Z" }, + { url = "https://files.pythonhosted.org/packages/73/b9/598f6ff36faaece4b3c50d26f50e38661499ff34346f00e057760b35cc9d/nvidia_cusparselt_cu12-0.7.1-py3-none-manylinux2014_aarch64.whl", hash = "sha256:8878dce784d0fac90131b6817b607e803c36e629ba34dc5b433471382196b6a5", size = 283835557, upload-time = "2025-02-26T00:16:54.265Z" }, + { url = "https://files.pythonhosted.org/packages/56/79/12978b96bd44274fe38b5dde5cfb660b1d114f70a65ef962bcbbed99b549/nvidia_cusparselt_cu12-0.7.1-py3-none-manylinux2014_x86_64.whl", hash = "sha256:f1bb701d6b930d5a7cea44c19ceb973311500847f81b634d802b7b539dc55623", size = 287193691, upload-time = "2025-02-26T00:15:44.104Z" }, + { url = "https://files.pythonhosted.org/packages/2f/d8/a6b0d0d0c2435e9310f3e2bb0d9c9dd4c33daef86aa5f30b3681defd37ea/nvidia_cusparselt_cu12-0.7.1-py3-none-win_amd64.whl", hash = "sha256:f67fbb5831940ec829c9117b7f33807db9f9678dc2a617fbe781cac17b4e1075", size = 271020911, upload-time = "2025-02-26T00:14:47.204Z" }, ] [[package]] name = "nvidia-nccl-cu12" -version = "2.26.2" +version = "2.27.3" source = { registry = "https://pypi.org/simple" } wheels = [ - { url = "https://files.pythonhosted.org/packages/69/5b/ca2f213f637305633814ae8c36b153220e40a07ea001966dcd87391f3acb/nvidia_nccl_cu12-2.26.2-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5c196e95e832ad30fbbb50381eb3cbd1fadd5675e587a548563993609af19522", size = 291671495, upload-time = "2025-03-13T00:30:07.805Z" }, - { url = "https://files.pythonhosted.org/packages/67/ca/f42388aed0fddd64ade7493dbba36e1f534d4e6fdbdd355c6a90030ae028/nvidia_nccl_cu12-2.26.2-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:694cf3879a206553cc9d7dbda76b13efaf610fdb70a50cba303de1b0d1530ac6", size = 201319755, upload-time = "2025-03-13T00:29:55.296Z" }, + { url = "https://files.pythonhosted.org/packages/4b/7b/8354b784cf73b0ba51e566b4baba3ddd44fe8288a3d39ef1e06cd5417226/nvidia_nccl_cu12-2.27.3-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:9ddf1a245abc36c550870f26d537a9b6087fb2e2e3d6e0ef03374c6fd19d984f", size = 322397768, upload-time = "2025-06-03T21:57:30.234Z" }, + { url = "https://files.pythonhosted.org/packages/5c/5b/4e4fff7bad39adf89f735f2bc87248c81db71205b62bcc0d5ca5b606b3c3/nvidia_nccl_cu12-2.27.3-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:adf27ccf4238253e0b826bce3ff5fa532d65fc42322c8bfdfaf28024c0fbe039", size = 322364134, upload-time = "2025-06-03T21:58:04.013Z" }, ] [[package]] name = "nvidia-nvjitlink-cu12" -version = "12.6.85" +version = "12.8.93" source = { registry = "https://pypi.org/simple" } wheels = [ - { url = "https://files.pythonhosted.org/packages/9d/d7/c5383e47c7e9bf1c99d5bd2a8c935af2b6d705ad831a7ec5c97db4d82f4f/nvidia_nvjitlink_cu12-12.6.85-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl", hash = "sha256:eedc36df9e88b682efe4309aa16b5b4e78c2407eac59e8c10a6a47535164369a", size = 19744971, upload-time = "2024-11-20T17:46:53.366Z" }, - { url = "https://files.pythonhosted.org/packages/31/db/dc71113d441f208cdfe7ae10d4983884e13f464a6252450693365e166dcf/nvidia_nvjitlink_cu12-12.6.85-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cf4eaa7d4b6b543ffd69d6abfb11efdeb2db48270d94dfd3a452c24150829e41", size = 19270338, upload-time = "2024-11-20T17:46:29.758Z" }, - { url = "https://files.pythonhosted.org/packages/89/76/93c1467b1387387440a4d25102d86b7794535449b689f8e2dc22c1c8ff7f/nvidia_nvjitlink_cu12-12.6.85-py3-none-win_amd64.whl", hash = "sha256:e61120e52ed675747825cdd16febc6a0730537451d867ee58bee3853b1b13d1c", size = 161908572, upload-time = "2024-11-20T17:52:40.124Z" }, + { url = "https://files.pythonhosted.org/packages/f6/74/86a07f1d0f42998ca31312f998bd3b9a7eff7f52378f4f270c8679c77fb9/nvidia_nvjitlink_cu12-12.8.93-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl", hash = "sha256:81ff63371a7ebd6e6451970684f916be2eab07321b73c9d244dc2b4da7f73b88", size = 39254836, upload-time = "2025-03-07T01:49:55.661Z" }, + { url = "https://files.pythonhosted.org/packages/2a/a2/8cee5da30d13430e87bf99bb33455d2724d0a4a9cb5d7926d80ccb96d008/nvidia_nvjitlink_cu12-12.8.93-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:adccd7161ace7261e01bb91e44e88da350895c270d23f744f0820c818b7229e7", size = 38386204, upload-time = "2025-03-07T01:49:43.612Z" }, + { url = "https://files.pythonhosted.org/packages/ed/d7/34f02dad2e30c31b10a51f6b04e025e5dd60e5f936af9045a9b858a05383/nvidia_nvjitlink_cu12-12.8.93-py3-none-win_amd64.whl", hash = "sha256:bd93fbeeee850917903583587f4fc3a4eafa022e34572251368238ab5e6bd67f", size = 268553710, upload-time = "2025-03-07T01:56:24.13Z" }, ] [[package]] name = "nvidia-nvtx-cu12" -version = "12.6.77" +version = "12.8.90" source = { registry = "https://pypi.org/simple" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b9/93/80f8a520375af9d7ee44571a6544653a176e53c2b8ccce85b97b83c2491b/nvidia_nvtx_cu12-12.6.77-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f44f8d86bb7d5629988d61c8d3ae61dddb2015dee142740536bc7481b022fe4b", size = 90549, upload-time = "2024-11-20T17:38:17.387Z" }, - { url = "https://files.pythonhosted.org/packages/2b/53/36e2fd6c7068997169b49ffc8c12d5af5e5ff209df6e1a2c4d373b3a638f/nvidia_nvtx_cu12-12.6.77-py3-none-manylinux2014_aarch64.whl", hash = "sha256:adcaabb9d436c9761fca2b13959a2d237c5f9fd406c8e4b723c695409ff88059", size = 90539, upload-time = "2024-10-01T17:00:27.179Z" }, - { url = "https://files.pythonhosted.org/packages/56/9a/fff8376f8e3d084cd1530e1ef7b879bb7d6d265620c95c1b322725c694f4/nvidia_nvtx_cu12-12.6.77-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b90bed3df379fa79afbd21be8e04a0314336b8ae16768b58f2d34cb1d04cd7d2", size = 89276, upload-time = "2024-11-20T17:38:27.621Z" }, - { url = "https://files.pythonhosted.org/packages/9e/4e/0d0c945463719429b7bd21dece907ad0bde437a2ff12b9b12fee94722ab0/nvidia_nvtx_cu12-12.6.77-py3-none-manylinux2014_x86_64.whl", hash = "sha256:6574241a3ec5fdc9334353ab8c479fe75841dbe8f4532a8fc97ce63503330ba1", size = 89265, upload-time = "2024-10-01T17:00:38.172Z" }, - { url = "https://files.pythonhosted.org/packages/f7/cd/98a447919d4ed14d407ac82b14b0a0c9c1dbfe81099934b1fc3bfd1e6316/nvidia_nvtx_cu12-12.6.77-py3-none-win_amd64.whl", hash = "sha256:2fb11a4af04a5e6c84073e6404d26588a34afd35379f0855a99797897efa75c0", size = 56434, upload-time = "2024-10-01T17:11:13.124Z" }, + { url = "https://files.pythonhosted.org/packages/10/c0/1b303feea90d296f6176f32a2a70b5ef230f9bdeb3a72bddb0dc922dc137/nvidia_nvtx_cu12-12.8.90-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d7ad891da111ebafbf7e015d34879f7112832fc239ff0d7d776b6cb685274615", size = 91161, upload-time = "2025-03-07T01:42:23.922Z" }, + { url = "https://files.pythonhosted.org/packages/a2/eb/86626c1bbc2edb86323022371c39aa48df6fd8b0a1647bc274577f72e90b/nvidia_nvtx_cu12-12.8.90-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5b17e2001cc0d751a5bc2c6ec6d26ad95913324a4adb86788c944f8ce9ba441f", size = 89954, upload-time = "2025-03-07T01:42:44.131Z" }, + { url = "https://files.pythonhosted.org/packages/9f/99/4c9c0c329bf9fc125008c3b54c7c94c0023518d06fc025ae36431375e1fe/nvidia_nvtx_cu12-12.8.90-py3-none-win_amd64.whl", hash = "sha256:619c8304aedc69f02ea82dd244541a83c3d9d40993381b3b590f1adaed3db41e", size = 56492, upload-time = "2025-03-07T01:52:24.69Z" }, ] [[package]] @@ -3664,7 +3649,7 @@ wheels = [ [[package]] name = "stamp" -version = "2.2.0" +version = "2.3.0" source = { editable = "." } dependencies = [ { name = "beartype" }, @@ -3853,8 +3838,8 @@ dev = [ [package.metadata] requires-dist = [ { name = "beartype", specifier = ">=0.21.0" }, - { name = "causal-conv1d", marker = "extra == 'cobra'", git = "https://github.com/KatherLab/causal-conv1d.git?rev=b73d1ca0e0726ba6520c38d342bd411bb5850064" }, - { name = "cobra", marker = "extra == 'cobra'", git = "http://github.com/KatherLab/COBRA.git?rev=c8aa71ce691e1279f2bb797f536355d6be47b6ac" }, + { name = "causal-conv1d", marker = "extra == 'cobra'" }, + { name = "cobra", marker = "extra == 'cobra'", git = "http://github.com/KatherLab/COBRA.git?rev=73712e9ffa4d1bdecf9be9826d66094bd2b17534" }, { name = "conch", marker = "extra == 'conch'", git = "https://github.com/KatherLab/CONCH" }, { name = "einops", specifier = ">=0.8.1" }, { name = "einops-exts", marker = "extra == 'conch1-5-cpu'", specifier = "==0.0.4" }, @@ -3862,7 +3847,7 @@ requires-dist = [ { name = "fairscale", marker = "extra == 'gigapath'" }, { name = "fairscale", marker = "extra == 'musk-cpu'" }, { name = "fastmcp", marker = "extra == 'mcp'", specifier = ">=2.11.2" }, - { name = "flash-attn", marker = "extra == 'flash-attention'", specifier = ">=2.8.2" }, + { name = "flash-attn", marker = "extra == 'flash-attention'", specifier = ">=2.8.3" }, { name = "fvcore", marker = "extra == 'gigapath'" }, { name = "gdown", marker = "extra == 'chief-ctranspath'", specifier = ">=5.2.0" }, { name = "gdown", marker = "extra == 'ctranspath'", specifier = ">=5.2.0" }, @@ -3878,7 +3863,7 @@ requires-dist = [ { name = "lifelines", marker = "extra == 'gigapath'" }, { name = "lightning", specifier = ">=2.5.2" }, { name = "madeleine", marker = "extra == 'madeleine'", git = "https://github.com/mahmoodlab/MADELEINE.git?rev=de7c85acc2bdad352e6df8eee5694f8b6f288012" }, - { name = "mamba-ssm", marker = "extra == 'cobra'", git = "https://github.com/KatherLab/mamba.git?rev=d0d4192621889b26f9669ea4a8e6fe79cc84e8d9" }, + { name = "mamba-ssm", marker = "extra == 'cobra'" }, { name = "matplotlib", specifier = ">=3.10.5" }, { name = "monai", marker = "extra == 'gigapath'" }, { name = "musk", marker = "extra == 'musk-cpu'", git = "https://github.com/lilab-stanford/MUSK.git?rev=e1699c27687f44bbf6d4adfcbb2abe89795d347f" }, @@ -3910,11 +3895,11 @@ requires-dist = [ { name = "stamp", extras = ["plip-cpu", "flash-attention"], marker = "extra == 'plip'" }, { name = "stamp", extras = ["prism-cpu", "flash-attention"], marker = "extra == 'prism'" }, { name = "timm", specifier = ">=1.0.19" }, - { name = "torch", specifier = ">=2.7.1" }, - { name = "torch", marker = "extra == 'chief-ctranspath'", specifier = ">=2.0.0" }, - { name = "torch", marker = "extra == 'virchow2'", specifier = ">=2.0.0" }, + { name = "torch", specifier = ">=2.7.1", index = "https://download.pytorch.org/whl/cu128" }, + { name = "torch", marker = "extra == 'chief-ctranspath'", specifier = ">=2.0.0", index = "https://download.pytorch.org/whl/cu128" }, + { name = "torch", marker = "extra == 'virchow2'", specifier = ">=2.0.0", index = "https://download.pytorch.org/whl/cu128" }, { name = "torchmetrics", specifier = ">=1.6.0" }, - { name = "torchvision", specifier = ">=0.22.1" }, + { name = "torchvision", specifier = ">=0.22.1", index = "https://download.pytorch.org/whl/cu128" }, { name = "tqdm", specifier = ">=4.67.1" }, { name = "transformers", specifier = ">=4.55.0" }, { name = "transformers", marker = "extra == 'conch1-5-cpu'", specifier = ">=4.45.2" }, @@ -4042,8 +4027,8 @@ wheels = [ [[package]] name = "torch" -version = "2.7.1" -source = { registry = "https://pypi.org/simple" } +version = "2.8.0+cu128" +source = { registry = "https://download.pytorch.org/whl/cu128" } dependencies = [ { name = "filelock" }, { name = "fsspec" }, @@ -4069,22 +4054,14 @@ dependencies = [ { name = "typing-extensions" }, ] wheels = [ - { url = "https://files.pythonhosted.org/packages/11/56/2eae3494e3d375533034a8e8cf0ba163363e996d85f0629441fa9d9843fe/torch-2.7.1-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:236f501f2e383f1cb861337bdf057712182f910f10aeaf509065d54d339e49b2", size = 99093039, upload-time = "2025-06-04T17:39:06.963Z" }, - { url = "https://files.pythonhosted.org/packages/e5/94/34b80bd172d0072c9979708ccd279c2da2f55c3ef318eceec276ab9544a4/torch-2.7.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:06eea61f859436622e78dd0cdd51dbc8f8c6d76917a9cf0555a333f9eac31ec1", size = 821174704, upload-time = "2025-06-04T17:37:03.799Z" }, - { url = "https://files.pythonhosted.org/packages/50/9e/acf04ff375b0b49a45511c55d188bcea5c942da2aaf293096676110086d1/torch-2.7.1-cp311-cp311-win_amd64.whl", hash = "sha256:8273145a2e0a3c6f9fd2ac36762d6ee89c26d430e612b95a99885df083b04e52", size = 216095937, upload-time = "2025-06-04T17:39:24.83Z" }, - { url = "https://files.pythonhosted.org/packages/5b/2b/d36d57c66ff031f93b4fa432e86802f84991477e522adcdffd314454326b/torch-2.7.1-cp311-none-macosx_11_0_arm64.whl", hash = "sha256:aea4fc1bf433d12843eb2c6b2204861f43d8364597697074c8d38ae2507f8730", size = 68640034, upload-time = "2025-06-04T17:39:17.989Z" }, - { url = "https://files.pythonhosted.org/packages/87/93/fb505a5022a2e908d81fe9a5e0aa84c86c0d5f408173be71c6018836f34e/torch-2.7.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:27ea1e518df4c9de73af7e8a720770f3628e7f667280bce2be7a16292697e3fa", size = 98948276, upload-time = "2025-06-04T17:39:12.852Z" }, - { url = "https://files.pythonhosted.org/packages/56/7e/67c3fe2b8c33f40af06326a3d6ae7776b3e3a01daa8f71d125d78594d874/torch-2.7.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:c33360cfc2edd976c2633b3b66c769bdcbbf0e0b6550606d188431c81e7dd1fc", size = 821025792, upload-time = "2025-06-04T17:34:58.747Z" }, - { url = "https://files.pythonhosted.org/packages/a1/37/a37495502bc7a23bf34f89584fa5a78e25bae7b8da513bc1b8f97afb7009/torch-2.7.1-cp312-cp312-win_amd64.whl", hash = "sha256:d8bf6e1856ddd1807e79dc57e54d3335f2b62e6f316ed13ed3ecfe1fc1df3d8b", size = 216050349, upload-time = "2025-06-04T17:38:59.709Z" }, - { url = "https://files.pythonhosted.org/packages/3a/60/04b77281c730bb13460628e518c52721257814ac6c298acd25757f6a175c/torch-2.7.1-cp312-none-macosx_11_0_arm64.whl", hash = "sha256:787687087412c4bd68d315e39bc1223f08aae1d16a9e9771d95eabbb04ae98fb", size = 68645146, upload-time = "2025-06-04T17:38:52.97Z" }, - { url = "https://files.pythonhosted.org/packages/66/81/e48c9edb655ee8eb8c2a6026abdb6f8d2146abd1f150979ede807bb75dcb/torch-2.7.1-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:03563603d931e70722dce0e11999d53aa80a375a3d78e6b39b9f6805ea0a8d28", size = 98946649, upload-time = "2025-06-04T17:38:43.031Z" }, - { url = "https://files.pythonhosted.org/packages/3a/24/efe2f520d75274fc06b695c616415a1e8a1021d87a13c68ff9dce733d088/torch-2.7.1-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:d632f5417b6980f61404a125b999ca6ebd0b8b4bbdbb5fbbba44374ab619a412", size = 821033192, upload-time = "2025-06-04T17:38:09.146Z" }, - { url = "https://files.pythonhosted.org/packages/dd/d9/9c24d230333ff4e9b6807274f6f8d52a864210b52ec794c5def7925f4495/torch-2.7.1-cp313-cp313-win_amd64.whl", hash = "sha256:23660443e13995ee93e3d844786701ea4ca69f337027b05182f5ba053ce43b38", size = 216055668, upload-time = "2025-06-04T17:38:36.253Z" }, - { url = "https://files.pythonhosted.org/packages/95/bf/e086ee36ddcef9299f6e708d3b6c8487c1651787bb9ee2939eb2a7f74911/torch-2.7.1-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:0da4f4dba9f65d0d203794e619fe7ca3247a55ffdcbd17ae8fb83c8b2dc9b585", size = 68925988, upload-time = "2025-06-04T17:38:29.273Z" }, - { url = "https://files.pythonhosted.org/packages/69/6a/67090dcfe1cf9048448b31555af6efb149f7afa0a310a366adbdada32105/torch-2.7.1-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:e08d7e6f21a617fe38eeb46dd2213ded43f27c072e9165dc27300c9ef9570934", size = 99028857, upload-time = "2025-06-04T17:37:50.956Z" }, - { url = "https://files.pythonhosted.org/packages/90/1c/48b988870823d1cc381f15ec4e70ed3d65e043f43f919329b0045ae83529/torch-2.7.1-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:30207f672328a42df4f2174b8f426f354b2baa0b7cca3a0adb3d6ab5daf00dc8", size = 821098066, upload-time = "2025-06-04T17:37:33.939Z" }, - { url = "https://files.pythonhosted.org/packages/7b/eb/10050d61c9d5140c5dc04a89ed3257ef1a6b93e49dd91b95363d757071e0/torch-2.7.1-cp313-cp313t-win_amd64.whl", hash = "sha256:79042feca1c634aaf6603fe6feea8c6b30dfa140a6bbc0b973e2260c7e79a22e", size = 216336310, upload-time = "2025-06-04T17:36:09.862Z" }, - { url = "https://files.pythonhosted.org/packages/b1/29/beb45cdf5c4fc3ebe282bf5eafc8dfd925ead7299b3c97491900fe5ed844/torch-2.7.1-cp313-none-macosx_11_0_arm64.whl", hash = "sha256:988b0cbc4333618a1056d2ebad9eb10089637b659eb645434d0809d8d937b946", size = 68645708, upload-time = "2025-06-04T17:34:39.852Z" }, + { url = "https://download.pytorch.org/whl/cu128/torch-2.8.0%2Bcu128-cp311-cp311-manylinux_2_28_x86_64.whl" }, + { url = "https://download.pytorch.org/whl/cu128/torch-2.8.0%2Bcu128-cp311-cp311-win_amd64.whl" }, + { url = "https://download.pytorch.org/whl/cu128/torch-2.8.0%2Bcu128-cp312-cp312-manylinux_2_28_x86_64.whl" }, + { url = "https://download.pytorch.org/whl/cu128/torch-2.8.0%2Bcu128-cp312-cp312-win_amd64.whl" }, + { url = "https://download.pytorch.org/whl/cu128/torch-2.8.0%2Bcu128-cp313-cp313-manylinux_2_28_x86_64.whl" }, + { url = "https://download.pytorch.org/whl/cu128/torch-2.8.0%2Bcu128-cp313-cp313-win_amd64.whl" }, + { url = "https://download.pytorch.org/whl/cu128/torch-2.8.0%2Bcu128-cp313-cp313t-manylinux_2_28_x86_64.whl" }, + { url = "https://download.pytorch.org/whl/cu128/torch-2.8.0%2Bcu128-cp313-cp313t-win_amd64.whl" }, ] [[package]] @@ -4104,30 +4081,22 @@ wheels = [ [[package]] name = "torchvision" -version = "0.22.1" -source = { registry = "https://pypi.org/simple" } +version = "0.23.0+cu128" +source = { registry = "https://download.pytorch.org/whl/cu128" } dependencies = [ { name = "numpy" }, { name = "pillow" }, { name = "torch" }, ] wheels = [ - { url = "https://files.pythonhosted.org/packages/f6/00/bdab236ef19da050290abc2b5203ff9945c84a1f2c7aab73e8e9c8c85669/torchvision-0.22.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4addf626e2b57fc22fd6d329cf1346d474497672e6af8383b7b5b636fba94a53", size = 1947827, upload-time = "2025-06-04T17:43:10.84Z" }, - { url = "https://files.pythonhosted.org/packages/ac/d0/18f951b2be3cfe48c0027b349dcc6fde950e3dc95dd83e037e86f284f6fd/torchvision-0.22.1-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:8b4a53a6067d63adba0c52f2b8dd2290db649d642021674ee43c0c922f0c6a69", size = 2514021, upload-time = "2025-06-04T17:43:07.608Z" }, - { url = "https://files.pythonhosted.org/packages/c3/1a/63eb241598b36d37a0221e10af357da34bd33402ccf5c0765e389642218a/torchvision-0.22.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:b7866a3b326413e67724ac46f1ee594996735e10521ba9e6cdbe0fa3cd98c2f2", size = 7487300, upload-time = "2025-06-04T17:42:58.349Z" }, - { url = "https://files.pythonhosted.org/packages/e5/73/1b009b42fe4a7774ba19c23c26bb0f020d68525c417a348b166f1c56044f/torchvision-0.22.1-cp311-cp311-win_amd64.whl", hash = "sha256:bb3f6df6f8fd415ce38ec4fd338376ad40c62e86052d7fc706a0dd51efac1718", size = 1707989, upload-time = "2025-06-04T17:43:14.332Z" }, - { url = "https://files.pythonhosted.org/packages/02/90/f4e99a5112dc221cf68a485e853cc3d9f3f1787cb950b895f3ea26d1ea98/torchvision-0.22.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:153f1790e505bd6da123e21eee6e83e2e155df05c0fe7d56347303067d8543c5", size = 1947827, upload-time = "2025-06-04T17:43:11.945Z" }, - { url = "https://files.pythonhosted.org/packages/25/f6/53e65384cdbbe732cc2106bb04f7fb908487e4fb02ae4a1613ce6904a122/torchvision-0.22.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:964414eef19459d55a10e886e2fca50677550e243586d1678f65e3f6f6bac47a", size = 2514576, upload-time = "2025-06-04T17:43:02.707Z" }, - { url = "https://files.pythonhosted.org/packages/17/8b/155f99042f9319bd7759536779b2a5b67cbd4f89c380854670850f89a2f4/torchvision-0.22.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:699c2d70d33951187f6ed910ea05720b9b4aaac1dcc1135f53162ce7d42481d3", size = 7485962, upload-time = "2025-06-04T17:42:43.606Z" }, - { url = "https://files.pythonhosted.org/packages/05/17/e45d5cd3627efdb47587a0634179a3533593436219de3f20c743672d2a79/torchvision-0.22.1-cp312-cp312-win_amd64.whl", hash = "sha256:75e0897da7a8e43d78632f66f2bdc4f6e26da8d3f021a7c0fa83746073c2597b", size = 1707992, upload-time = "2025-06-04T17:42:53.207Z" }, - { url = "https://files.pythonhosted.org/packages/7a/30/fecdd09fb973e963da68207fe9f3d03ec6f39a935516dc2a98397bf495c6/torchvision-0.22.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9c3ae3319624c43cc8127020f46c14aa878406781f0899bb6283ae474afeafbf", size = 1947818, upload-time = "2025-06-04T17:42:51.954Z" }, - { url = "https://files.pythonhosted.org/packages/55/f4/b45f6cd92fa0acfac5e31b8e9258232f25bcdb0709a604e8b8a39d76e411/torchvision-0.22.1-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:4a614a6a408d2ed74208d0ea6c28a2fbb68290e9a7df206c5fef3f0b6865d307", size = 2471597, upload-time = "2025-06-04T17:42:48.838Z" }, - { url = "https://files.pythonhosted.org/packages/8d/b0/3cffd6a285b5ffee3fe4a31caff49e350c98c5963854474d1c4f7a51dea5/torchvision-0.22.1-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:7ee682be589bb1a002b7704f06b8ec0b89e4b9068f48e79307d2c6e937a9fdf4", size = 7485894, upload-time = "2025-06-04T17:43:01.371Z" }, - { url = "https://files.pythonhosted.org/packages/fd/1d/0ede596fedc2080d18108149921278b59f220fbb398f29619495337b0f86/torchvision-0.22.1-cp313-cp313-win_amd64.whl", hash = "sha256:2566cafcfa47ecfdbeed04bab8cef1307c8d4ef75046f7624b9e55f384880dfe", size = 1708020, upload-time = "2025-06-04T17:43:06.085Z" }, - { url = "https://files.pythonhosted.org/packages/0f/ca/e9a06bd61ee8e04fb4962a3fb524fe6ee4051662db07840b702a9f339b24/torchvision-0.22.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:043d9e35ed69c2e586aff6eb9e2887382e7863707115668ac9d140da58f42cba", size = 2137623, upload-time = "2025-06-04T17:43:05.028Z" }, - { url = "https://files.pythonhosted.org/packages/ab/c8/2ebe90f18e7ffa2120f5c3eab62aa86923185f78d2d051a455ea91461608/torchvision-0.22.1-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:27142bcc8a984227a6dcf560985e83f52b82a7d3f5fe9051af586a2ccc46ef26", size = 2476561, upload-time = "2025-06-04T17:42:59.691Z" }, - { url = "https://files.pythonhosted.org/packages/94/8b/04c6b15f8c29b39f0679589753091cec8b192ab296d4fdaf9055544c4ec9/torchvision-0.22.1-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:ef46e065502f7300ad6abc98554131c35dc4c837b978d91306658f1a65c00baa", size = 7658543, upload-time = "2025-06-04T17:42:46.064Z" }, - { url = "https://files.pythonhosted.org/packages/ab/c0/131628e6d42682b0502c63fd7f647b8b5ca4bd94088f6c85ca7225db8ac4/torchvision-0.22.1-cp313-cp313t-win_amd64.whl", hash = "sha256:7414eeacfb941fa21acddcd725f1617da5630ec822e498660a4b864d7d998075", size = 1629892, upload-time = "2025-06-04T17:42:57.156Z" }, + { url = "https://download.pytorch.org/whl/cu128/torchvision-0.23.0%2Bcu128-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:93f1b5f56b20cd6869bca40943de4fd3ca9ccc56e1b57f47c671de1cdab39cdb" }, + { url = "https://download.pytorch.org/whl/cu128/torchvision-0.23.0%2Bcu128-cp311-cp311-win_amd64.whl", hash = "sha256:70b3d8bfe04438006ec880c162b0e3aaac90c48b759aa41638dd714c732b182c" }, + { url = "https://download.pytorch.org/whl/cu128/torchvision-0.23.0%2Bcu128-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:9cb3c13997afcb44057ca10d943c6c4cba3068afde0f370965abce9c89fcffa9" }, + { url = "https://download.pytorch.org/whl/cu128/torchvision-0.23.0%2Bcu128-cp312-cp312-win_amd64.whl", hash = "sha256:20fa9c7362a006776630b00b8a01919fedcf504a202b81358d32c5aef39956fe" }, + { url = "https://download.pytorch.org/whl/cu128/torchvision-0.23.0%2Bcu128-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:c63982f1973ba677b37e6663df0e07cb5381459b6f0572c2ca95eebd8dfeb742" }, + { url = "https://download.pytorch.org/whl/cu128/torchvision-0.23.0%2Bcu128-cp313-cp313-win_amd64.whl", hash = "sha256:f69174bc69474bd4d1405bac3ebd35bb39c8267ce6b8a406070cb3149c72e3b8" }, + { url = "https://download.pytorch.org/whl/cu128/torchvision-0.23.0%2Bcu128-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:0d6ff6489eb71e4c0bb08cf7cb253298c2520458b1bd67036733652acfa87f00" }, + { url = "https://download.pytorch.org/whl/cu128/torchvision-0.23.0%2Bcu128-cp313-cp313t-win_amd64.whl", hash = "sha256:91fd897fb6fefaf25ec56897391b448eff73f28a7e2ab7660886ece85c865ec6" }, ] [[package]] @@ -4193,16 +4162,16 @@ wheels = [ [[package]] name = "triton" -version = "3.3.1" +version = "3.4.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "setuptools" }, ] wheels = [ - { url = "https://files.pythonhosted.org/packages/21/2f/3e56ea7b58f80ff68899b1dbe810ff257c9d177d288c6b0f55bf2fe4eb50/triton-3.3.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b31e3aa26f8cb3cc5bf4e187bf737cbacf17311e1112b781d4a059353dfd731b", size = 155689937, upload-time = "2025-05-29T23:39:44.182Z" }, - { url = "https://files.pythonhosted.org/packages/24/5f/950fb373bf9c01ad4eb5a8cd5eaf32cdf9e238c02f9293557a2129b9c4ac/triton-3.3.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9999e83aba21e1a78c1f36f21bce621b77bcaa530277a50484a7cb4a822f6e43", size = 155669138, upload-time = "2025-05-29T23:39:51.771Z" }, - { url = "https://files.pythonhosted.org/packages/74/1f/dfb531f90a2d367d914adfee771babbd3f1a5b26c3f5fbc458dee21daa78/triton-3.3.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b89d846b5a4198317fec27a5d3a609ea96b6d557ff44b56c23176546023c4240", size = 155673035, upload-time = "2025-05-29T23:40:02.468Z" }, - { url = "https://files.pythonhosted.org/packages/28/71/bd20ffcb7a64c753dc2463489a61bf69d531f308e390ad06390268c4ea04/triton-3.3.1-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a3198adb9d78b77818a5388bff89fa72ff36f9da0bc689db2f0a651a67ce6a42", size = 155735832, upload-time = "2025-05-29T23:40:10.522Z" }, + { url = "https://files.pythonhosted.org/packages/7d/39/43325b3b651d50187e591eefa22e236b2981afcebaefd4f2fc0ea99df191/triton-3.4.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7b70f5e6a41e52e48cfc087436c8a28c17ff98db369447bcaff3b887a3ab4467", size = 155531138, upload-time = "2025-07-30T19:58:29.908Z" }, + { url = "https://files.pythonhosted.org/packages/d0/66/b1eb52839f563623d185f0927eb3530ee4d5ffe9d377cdaf5346b306689e/triton-3.4.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:31c1d84a5c0ec2c0f8e8a072d7fd150cab84a9c239eaddc6706c081bfae4eb04", size = 155560068, upload-time = "2025-07-30T19:58:37.081Z" }, + { url = "https://files.pythonhosted.org/packages/30/7b/0a685684ed5322d2af0bddefed7906674f67974aa88b0fae6e82e3b766f6/triton-3.4.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00be2964616f4c619193cb0d1b29a99bd4b001d7dc333816073f92cf2a8ccdeb", size = 155569223, upload-time = "2025-07-30T19:58:44.017Z" }, + { url = "https://files.pythonhosted.org/packages/20/63/8cb444ad5cdb25d999b7d647abac25af0ee37d292afc009940c05b82dda0/triton-3.4.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7936b18a3499ed62059414d7df563e6c163c5e16c3773678a3ee3d417865035d", size = 155659780, upload-time = "2025-07-30T19:58:51.171Z" }, ] [[package]] @@ -4411,16 +4380,16 @@ wheels = [ [[package]] name = "xformers" -version = "0.0.31.post1" +version = "0.0.32.post2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "numpy" }, { name = "torch" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/29/e2/77fb19e49e2ee06e070c8383b286c5510c1451404440aa9639544e180e5e/xformers-0.0.31.post1.tar.gz", hash = "sha256:06a12031a00aadd56fbe543a73258b18064bccdf85fbf5de4c3e67c69e301505", size = 12110280, upload-time = "2025-07-08T15:35:49.125Z" } +sdist = { url = "https://files.pythonhosted.org/packages/47/99/68d2e7a17b65a08180d6b120d1d293d5855a0c5999cb30a79fb466b49642/xformers-0.0.32.post2.tar.gz", hash = "sha256:9538be803969c6e1ca16a3ece921e472c24f79970b10be1087a389dcb66e412a", size = 12105990, upload-time = "2025-08-15T11:48:56.584Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/84/bb/7faaaeffbb120c6d4240586f323fed6756afe13e92cfe5ad582d155bde87/xformers-0.0.31.post1-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:81ecbcaf6253f61378189bd1cc3a1e2ff994d3ecb391fe098ef88834c6ff6358", size = 117058051, upload-time = "2025-07-08T15:35:37.914Z" }, - { url = "https://files.pythonhosted.org/packages/ff/ba/e953b24cc6e1ac3798d8ac16565b0c63c050df3b8130df752e70e1ce98ed/xformers-0.0.31.post1-cp39-abi3-win_amd64.whl", hash = "sha256:294c30125442f5a84964e5b87b3cd5e83b87053896a13bbfee17c0043ee66e62", size = 100216491, upload-time = "2025-07-08T15:35:45.201Z" }, + { url = "https://files.pythonhosted.org/packages/ce/16/4ed2fbf7c20ba20565d9a1fc544c2bef39d409c8eca1949654c6ff9f8452/xformers-0.0.32.post2-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:3d1fefe0006eb00a730b3b197ff41aab085f1209b50419baab6152445f09e508", size = 117196673, upload-time = "2025-08-15T11:48:46.726Z" }, + { url = "https://files.pythonhosted.org/packages/50/19/ea64609a535f87a44cb177dc37c6d6a58f6d540adfff819d565fb0657cf7/xformers-0.0.32.post2-cp39-abi3-win_amd64.whl", hash = "sha256:87fa13f4b406ed640554cea6687d0020b496bd6b446ca17d24f9438a079e6f09", size = 100221079, upload-time = "2025-08-15T11:48:53.234Z" }, ] [[package]]