cache-dit 0.2.2__py3-none-any.whl → 0.2.3__py3-none-any.whl

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.

Potentially problematic release.


This version of cache-dit might be problematic. Click here for more details.

cache_dit/_version.py CHANGED
@@ -17,5 +17,5 @@ __version__: str
17
17
  __version_tuple__: VERSION_TUPLE
18
18
  version_tuple: VERSION_TUPLE
19
19
 
20
- __version__ = version = '0.2.2'
21
- __version_tuple__ = version_tuple = (0, 2, 2)
20
+ __version__ = version = '0.2.3'
21
+ __version_tuple__ = version_tuple = (0, 2, 3)
@@ -1598,17 +1598,6 @@ def patch_cached_stats(
1598
1598
  if transformer is None:
1599
1599
  return
1600
1600
 
1601
- cached_transformer_blocks = getattr(transformer, "transformer_blocks", None)
1602
- if cached_transformer_blocks is None:
1603
- return
1604
-
1605
- if isinstance(cached_transformer_blocks, torch.nn.ModuleList):
1606
- cached_transformer_blocks = cached_transformer_blocks[0]
1607
- if not isinstance(
1608
- cached_transformer_blocks, DBCachedTransformerBlocks
1609
- ) or not isinstance(transformer, torch.nn.Module):
1610
- return
1611
-
1612
1601
  # TODO: Patch more cached stats to the transformer
1613
1602
  transformer._cached_steps = get_cached_steps()
1614
1603
  transformer._residual_diffs = get_residual_diffs()
@@ -92,6 +92,6 @@ def apply_db_cache_on_pipe(
92
92
  pipe.__class__._is_cached = True
93
93
 
94
94
  if not shallow_patch:
95
- apply_db_cache_on_transformer(pipe.transformer, **kwargs)
95
+ apply_db_cache_on_transformer(pipe.transformer)
96
96
 
97
97
  return pipe
@@ -55,6 +55,7 @@ class DBPPruneContext:
55
55
  default_factory=lambda: defaultdict(list),
56
56
  )
57
57
 
58
+ @torch.compiler.disable
58
59
  def get_residual_diff_threshold(self):
59
60
  residual_diff_threshold = self.residual_diff_threshold
60
61
  if self.l1_hidden_states_diff_threshold is not None:
@@ -98,19 +99,24 @@ class DBPPruneContext:
98
99
  )
99
100
  return residual_diff_threshold
100
101
 
102
+ @torch.compiler.disable
101
103
  def get_buffer(self, name):
102
104
  return self.buffers.get(name)
103
105
 
106
+ @torch.compiler.disable
104
107
  def set_buffer(self, name, buffer):
105
108
  self.buffers[name] = buffer
106
109
 
110
+ @torch.compiler.disable
107
111
  def remove_buffer(self, name):
108
112
  if name in self.buffers:
109
113
  del self.buffers[name]
110
114
 
115
+ @torch.compiler.disable
111
116
  def clear_buffers(self):
112
117
  self.buffers.clear()
113
118
 
119
+ @torch.compiler.disable
114
120
  def mark_step_begin(self):
115
121
  self.executed_steps += 1
116
122
  if self.get_current_step() == 0:
@@ -118,12 +124,15 @@ class DBPPruneContext:
118
124
  self.actual_blocks.clear()
119
125
  self.residual_diffs.clear()
120
126
 
127
+ @torch.compiler.disable
121
128
  def add_pruned_block(self, num_blocks):
122
129
  self.pruned_blocks.append(num_blocks)
123
130
 
131
+ @torch.compiler.disable
124
132
  def add_actual_block(self, num_blocks):
125
133
  self.actual_blocks.append(num_blocks)
126
134
 
135
+ @torch.compiler.disable
127
136
  def add_residual_diff(self, diff):
128
137
  if isinstance(diff, torch.Tensor):
129
138
  diff = diff.item()
@@ -141,9 +150,11 @@ class DBPPruneContext:
141
150
  f"residual diff: {diff:.6f}"
142
151
  )
143
152
 
153
+ @torch.compiler.disable
144
154
  def get_current_step(self):
145
155
  return self.executed_steps - 1
146
156
 
157
+ @torch.compiler.disable
147
158
  def is_in_warmup(self):
148
159
  return self.get_current_step() < self.warmup_steps
149
160
 
@@ -348,11 +359,19 @@ def collect_prune_kwargs(default_attrs: dict, **kwargs):
348
359
  )
349
360
  for attr in prune_attrs
350
361
  }
362
+
351
363
  # Manually set sequence fields, such as non_prune_blocks_ids
352
- prune_kwargs["non_prune_blocks_ids"] = kwargs.pop(
353
- "non_prune_blocks_ids",
354
- [],
355
- )
364
+ def _safe_set_sequence_field(
365
+ field_name: str,
366
+ default_value: Any = None,
367
+ ):
368
+ if field_name not in prune_kwargs:
369
+ prune_kwargs[field_name] = kwargs.pop(
370
+ field_name,
371
+ default_value,
372
+ )
373
+
374
+ _safe_set_sequence_field("non_prune_blocks_ids", [])
356
375
 
357
376
  assert default_attrs is not None, "default_attrs must be set before"
358
377
  for attr in prune_attrs:
@@ -627,10 +646,6 @@ class DBPrunedTransformerBlocks(torch.nn.Module):
627
646
  ]
628
647
  return sorted(non_prune_blocks_ids)
629
648
 
630
- # @torch.compile(dynamic=True)
631
- # mark this function as compile with dynamic=True will
632
- # cause precision degradate, so, we choose to disable it
633
- # now, until we find a better solution or fixed the bug.
634
649
  @torch.compiler.disable
635
650
  def _compute_single_hidden_states_residual(
636
651
  self,
@@ -667,10 +682,6 @@ class DBPrunedTransformerBlocks(torch.nn.Module):
667
682
  single_encoder_hidden_states_residual,
668
683
  )
669
684
 
670
- # @torch.compile(dynamic=True)
671
- # mark this function as compile with dynamic=True will
672
- # cause precision degradate, so, we choose to disable it
673
- # now, until we find a better solution or fixed the bug.
674
685
  @torch.compiler.disable
675
686
  def _split_single_hidden_states(
676
687
  self,
@@ -969,17 +980,6 @@ def patch_pruned_stats(
969
980
  if transformer is None:
970
981
  return
971
982
 
972
- pruned_transformer_blocks = getattr(transformer, "transformer_blocks", None)
973
- if pruned_transformer_blocks is None:
974
- return
975
-
976
- if isinstance(pruned_transformer_blocks, torch.nn.ModuleList):
977
- pruned_transformer_blocks = pruned_transformer_blocks[0]
978
- if not isinstance(
979
- pruned_transformer_blocks, DBPrunedTransformerBlocks
980
- ) or not isinstance(transformer, torch.nn.Module):
981
- return
982
-
983
983
  # TODO: Patch more pruned stats to the transformer
984
984
  transformer._pruned_blocks = get_pruned_blocks()
985
985
  transformer._pruned_steps = get_pruned_steps()
@@ -714,17 +714,6 @@ def patch_cached_stats(
714
714
  if transformer is None:
715
715
  return
716
716
 
717
- cached_transformer_blocks = getattr(transformer, "transformer_blocks", None)
718
- if cached_transformer_blocks is None:
719
- return
720
-
721
- if isinstance(cached_transformer_blocks, torch.nn.ModuleList):
722
- cached_transformer_blocks = cached_transformer_blocks[0]
723
- if not isinstance(
724
- cached_transformer_blocks, CachedTransformerBlocks
725
- ) or not isinstance(transformer, torch.nn.Module):
726
- return
727
-
728
717
  # TODO: Patch more cached stats to the transformer
729
718
  transformer._cached_steps = get_cached_steps()
730
719
  transformer._residual_diffs = get_residual_diffs()
@@ -1,4 +1,5 @@
1
1
  # Adapted from: https://github.com/chengzeyi/ParaAttention/blob/main/src/para_attn/first_block_cache/taylorseer.py
2
+ # Reference: https://github.com/Shenyi-Z/TaylorSeer/TaylorSeer-FLUX/src/flux/taylor_utils/__init__.py
2
3
  import math
3
4
  import torch
4
5
 
@@ -44,8 +45,6 @@ class TaylorSeer:
44
45
  # n-th order Taylor expansion:
45
46
  # Y(t) = Y(0) + dY(0)/dt * t + d^2Y(0)/dt^2 * t^2 / 2!
46
47
  # + ... + d^nY(0)/dt^n * t^n / n!
47
- # reference: https://github.com/Shenyi-Z/TaylorSeer
48
- # TaylorSeer-FLUX/src/flux/taylor_utils/__init__.py
49
48
  # TODO: Custom Triton/CUDA kernel for better performance,
50
49
  # especially for large n_derivatives.
51
50
  dY_current = [None] * self.ORDER
@@ -0,0 +1 @@
1
+ from cache_dit.compile.utils import set_custom_compile_configs
@@ -0,0 +1,94 @@
1
+ import os
2
+
3
+ import torch
4
+ from cache_dit.logger import init_logger, logging_rank_0
5
+
6
+ logger = init_logger(__name__)
7
+
8
+
9
+ def epilogue_prologue_fusion_enabled(**kwargs) -> bool:
10
+ mode = kwargs.get("epilogue_prologue_fusion", False)
11
+ CACHE_DIT_EPILOGUE_PROLOGUE_FUSION = bool(
12
+ int(os.environ.get("CACHE_DIT_EPILOGUE_PROLOGUE_FUSION", "0"))
13
+ )
14
+
15
+ if CACHE_DIT_EPILOGUE_PROLOGUE_FUSION:
16
+ logging_rank_0(
17
+ logger,
18
+ "CACHE_DIT_EPILOGUE_PROLOGUE_FUSION is set to 1. \n"
19
+ "Force enable epilogue and prologue fusion.",
20
+ )
21
+
22
+ return CACHE_DIT_EPILOGUE_PROLOGUE_FUSION or mode
23
+
24
+
25
+ def set_custom_compile_configs(
26
+ cuda_graphs: bool = False,
27
+ force_disable_compile_caches: bool = False,
28
+ use_fast_math: bool = False,
29
+ **kwargs, # other kwargs
30
+ ):
31
+ # Alway increase recompile_limit for dynamic shape compilation
32
+ torch._dynamo.config.recompile_limit = 96 # default is 8
33
+ torch._dynamo.config.accumulated_recompile_limit = 2048 # default is 256
34
+ # Handle compiler caches
35
+ # https://github.com/vllm-project/vllm/blob/23baa2180b0ebba5ae94073ba9b8e93f88b75486/vllm/compilation/compiler_interface.py#L270
36
+ torch._inductor.config.fx_graph_cache = True
37
+ torch._inductor.config.fx_graph_remote_cache = False
38
+ # https://github.com/pytorch/pytorch/issues/153791
39
+ torch._inductor.config.autotune_local_cache = False
40
+
41
+ FORCE_DISABLE_CUSTOM_COMPILE_CONFIG = (
42
+ os.environ.get("CACHE_DIT_FORCE_DISABLE_CUSTOM_COMPILE_CONFIG", "0")
43
+ == "1"
44
+ )
45
+ if FORCE_DISABLE_CUSTOM_COMPILE_CONFIG:
46
+ logging_rank_0(
47
+ logger,
48
+ "CACHE_DIT_FORCE_DISABLE_CUSTOM_COMPILE_CONFIG is set to 1. \n"
49
+ "Force disable custom compile config.",
50
+ )
51
+ return
52
+
53
+ # Enable compute comm overlap
54
+ torch._inductor.config.reorder_for_compute_comm_overlap = True
55
+ # L20 64 GB/s, PCIe; A100/A800 NVLink 300 GB/s.
56
+ torch._inductor.config.intra_node_bw = (
57
+ 64 if "L20" in torch.cuda.get_device_name() else 300
58
+ )
59
+
60
+ # Below are default settings for torch.compile, you can change
61
+ # them to your needs and test the performance
62
+ torch._inductor.config.max_fusion_size = 64
63
+ torch._inductor.config.max_pointwise_cat_inputs = 8
64
+ torch._inductor.config.triton.cudagraphs = cuda_graphs
65
+ torch._inductor.config.triton.use_block_ptr = False
66
+ torch._inductor.config.triton.codegen_upcast_to_fp32 = True
67
+
68
+ # Copy from https://pytorch.org/blog/accelerating-generative-ai-3/
69
+ torch._inductor.config.conv_1x1_as_mm = True
70
+ torch._inductor.config.coordinate_descent_tuning = True
71
+ torch._inductor.config.coordinate_descent_check_all_directions = True
72
+ torch._inductor.config.epilogue_fusion = False
73
+
74
+ # Enable epilogue and prologue fusion
75
+ if epilogue_prologue_fusion_enabled(**kwargs):
76
+ torch._inductor.config.epilogue_fusion = True
77
+ torch._inductor.config.prologue_fusion = True
78
+ torch._inductor.config.epilogue_fusion_first = True
79
+
80
+ # Dead code elimination
81
+ torch._inductor.config.dce = True # default is False
82
+
83
+ # May need to force disable all cache
84
+ if force_disable_compile_caches:
85
+ torch._inductor.config.force_disable_caches = True
86
+ torch._inductor.config.fx_graph_cache = False
87
+ torch._inductor.config.fx_graph_remote_cache = False
88
+ torch._inductor.config.autotune_local_cache = False # default is True
89
+
90
+ # Use fast math
91
+ if hasattr(torch._inductor.config, "use_fast_math"):
92
+ torch._inductor.config.use_fast_math = use_fast_math
93
+ if hasattr(torch._inductor.config, "cuda.use_fast_math"):
94
+ torch._inductor.config.cuda.use_fast_math = use_fast_math
File without changes
File without changes
cache_dit/logger.py CHANGED
@@ -1,6 +1,7 @@
1
1
  import logging
2
2
  import os
3
3
  import sys
4
+ import torch.distributed as dist
4
5
 
5
6
  _FORMAT = "%(levelname)s %(asctime)s [%(filename)s:%(lineno)d] %(message)s"
6
7
  _DATE_FORMAT = "%m-%d %H:%M:%S"
@@ -95,3 +96,30 @@ def init_logger(name: str):
95
96
  logger.addHandler(_inference_log_file_handler[pid])
96
97
  logger.propagate = False
97
98
  return logger
99
+
100
+
101
+ def logging_rank_0(
102
+ logger: logging.Logger, message: str, level: int = logging.INFO
103
+ ):
104
+ if not isinstance(logger, logging.Logger):
105
+ raise TypeError("logger must be an instance of logging.Logger")
106
+ if not isinstance(message, str):
107
+ raise TypeError("message must be a string")
108
+ if not isinstance(level, int):
109
+ raise TypeError("level must be an integer representing a logging level")
110
+
111
+ def _logging_msg():
112
+ if level == logging.DEBUG:
113
+ logger.debug(message)
114
+ elif level == logging.WARNING:
115
+ logger.warning(message)
116
+ elif level == logging.ERROR:
117
+ logger.error(message)
118
+ else:
119
+ logger.info(message)
120
+
121
+ if dist.is_initialized():
122
+ if dist.get_rank() == 0:
123
+ _logging_msg()
124
+ else:
125
+ _logging_msg()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cache_dit
3
- Version: 0.2.2
3
+ Version: 0.2.3
4
4
  Summary: 🤗 CacheDiT: A Training-free and Easy-to-use Cache Acceleration Toolbox for Diffusion Transformers
5
5
  Author: DefTruth, vipshop.com, etc.
6
6
  Maintainer: DefTruth, vipshop.com, etc
@@ -283,7 +283,11 @@ cache_options = {
283
283
  "warmup_steps": 3, # n_derivatives + 1
284
284
  "residual_diff_threshold": 0.12,
285
285
  }
286
- ```
286
+ ```
287
+
288
+ > [!Important]
289
+ > Please note that if you have used TaylorSeer as the calibrator for approximate hidden states, the **Bn** param of DBCache can be set to **0**. In essence, DBCache's Bn is also act as a calibrator, so you can choose either Bn > 0 or TaylorSeer. We recommend using the configuration scheme of **TaylorSeer** + **DBCache FnB0**.
290
+
287
291
  <div align="center">
288
292
  <p align="center">
289
293
  <b>DBCache F1B0 + TaylorSeer</b>, L20x1, Steps: 28, <br>"A cat holding a sign that says hello world with complex background"
@@ -1,20 +1,20 @@
1
1
  cache_dit/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- cache_dit/_version.py,sha256=OjGGK5TcHVG44Y62aAqeJH4CskkZoY9ydbHOtCDew50,511
3
- cache_dit/logger.py,sha256=dKfNe_RRk9HJwfgHGeRR1f0LbskJpKdGmISCbL9roQs,3443
2
+ cache_dit/_version.py,sha256=wD8hnA5gV5UmPkQnpT3xR6V2csgj9K5NEADogbLK79M,511
3
+ cache_dit/logger.py,sha256=0zsu42hN-3-rgGC_C29ms1IvVpV4_b4_SwJCKSenxBE,4304
4
4
  cache_dit/primitives.py,sha256=A2iG9YLot3gOsZSPp-_gyjqjLgJvWQRx8aitD4JQ23Y,3877
5
5
  cache_dit/cache_factory/__init__.py,sha256=5RNuhWakvvqrOV4vkqrEBA7d-V1LwcNSsjtW14mkqK8,5255
6
- cache_dit/cache_factory/taylorseer.py,sha256=G3Bu7tPqKP1zt4pzN4gJ1T4VJobyaktC3zNSR1MACqc,4005
6
+ cache_dit/cache_factory/taylorseer.py,sha256=LKSNo2ode69EVo9xrxjxAMEjz0yDGiGADeDYnEqddA8,3987
7
7
  cache_dit/cache_factory/utils.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
8
  cache_dit/cache_factory/dual_block_cache/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
- cache_dit/cache_factory/dual_block_cache/cache_context.py,sha256=ip3bY79lEGo2xDcGZuRxDu065q1eYabXLJUV8BsfhvM,59698
9
+ cache_dit/cache_factory/dual_block_cache/cache_context.py,sha256=EV0REfwLuXTqnkZ9vD2nFFjRceRLrXhl1b1SO5N4os8,59272
10
10
  cache_dit/cache_factory/dual_block_cache/diffusers_adapters/__init__.py,sha256=krNAICf-aS3JLmSG8vOB9tpLa04uYRcABsC8PMbVUKY,1870
11
11
  cache_dit/cache_factory/dual_block_cache/diffusers_adapters/cogvideox.py,sha256=fibkeU-FHa30BNT-uPV2Eqcd5IRli07EKb25tMDp23c,2270
12
12
  cache_dit/cache_factory/dual_block_cache/diffusers_adapters/flux.py,sha256=fddSpTHXU24COMGAY-Z21EmHHAEArZBv_-XLRFD6ADU,2625
13
13
  cache_dit/cache_factory/dual_block_cache/diffusers_adapters/hunyuan_video.py,sha256=wcZdBhjUB8WSfz40A268BtSe3nr_hRsIi2BNlg1FHRU,9965
14
14
  cache_dit/cache_factory/dual_block_cache/diffusers_adapters/mochi.py,sha256=Cmy0KHRDgwXqtmqfkrr7kw0CP6CmkSnuz29gDHcD6sQ,2262
15
- cache_dit/cache_factory/dual_block_cache/diffusers_adapters/wan.py,sha256=oOb-NNesuyBAMwpRbFDG93TCwffLO7-TXZ4bvEtvGJc,2604
15
+ cache_dit/cache_factory/dual_block_cache/diffusers_adapters/wan.py,sha256=kNoCZshNUxgwS9Di84Mz8Js1QAcs_U665x6wcSKYE2A,2594
16
16
  cache_dit/cache_factory/dynamic_block_prune/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
17
- cache_dit/cache_factory/dynamic_block_prune/prune_context.py,sha256=YRDwZ_16yjThpgVgDv6YaIB4QCE9nEkE-MOru0jOd50,35026
17
+ cache_dit/cache_factory/dynamic_block_prune/prune_context.py,sha256=so1wGdb8W0ATwrjv7E5IEZLPcobybaY1HJa6hBYlOOQ,34698
18
18
  cache_dit/cache_factory/dynamic_block_prune/diffusers_adapters/__init__.py,sha256=hVBTXj9MMGFGVezT3j8MntFRBiphSaUL4YhSOd8JtuY,1870
19
19
  cache_dit/cache_factory/dynamic_block_prune/diffusers_adapters/cogvideox.py,sha256=KP8NxtHAKzzBOoX0lhvlMgY_5dmP4Z3T5TOfwl4SSyg,2273
20
20
  cache_dit/cache_factory/dynamic_block_prune/diffusers_adapters/flux.py,sha256=kCB7lL4OIq8TZn-baMIF8D_PVPTFW60omCMVQCb8ebs,2628
@@ -22,15 +22,19 @@ cache_dit/cache_factory/dynamic_block_prune/diffusers_adapters/hunyuan_video.py,
22
22
  cache_dit/cache_factory/dynamic_block_prune/diffusers_adapters/mochi.py,sha256=zXgoRDDjus3a2WSjtNh4ERtQp20ceb6nzohHMDlo2zY,2265
23
23
  cache_dit/cache_factory/dynamic_block_prune/diffusers_adapters/wan.py,sha256=PA7nuLgfAelnaI8usQx0Kxi8XATzMapyR1WndEdFoZA,2604
24
24
  cache_dit/cache_factory/first_block_cache/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
25
- cache_dit/cache_factory/first_block_cache/cache_context.py,sha256=oeOmVDho8aJa86p8LGACAWltu6Fe4chOW2OW8aPtB5c,23643
25
+ cache_dit/cache_factory/first_block_cache/cache_context.py,sha256=NeAfDJlJVVUAL4btax5_iOLTuue1x4qeXwk0pM-QH28,23219
26
26
  cache_dit/cache_factory/first_block_cache/diffusers_adapters/__init__.py,sha256=-FFgA2MoudEo7uDacg4aWgm1KwfLZFsEDTVxatgbq9M,2146
27
27
  cache_dit/cache_factory/first_block_cache/diffusers_adapters/cogvideox.py,sha256=qO5CWyurtwW30mvOe6cxeQPTSXLDlPJcezm72zEjDq8,2375
28
28
  cache_dit/cache_factory/first_block_cache/diffusers_adapters/flux.py,sha256=Dcd4OzABCtyQCZNX2KNnUTdVoO1E1ApM7P8gcVYzcK0,2733
29
29
  cache_dit/cache_factory/first_block_cache/diffusers_adapters/hunyuan_video.py,sha256=OL7W4ukYlZz0IDmBR1zVV6XT3Mgciglj9Hqzv1wUAkQ,10092
30
30
  cache_dit/cache_factory/first_block_cache/diffusers_adapters/mochi.py,sha256=lQTClo52OwPbNEE4jiBZQhfC7hbtYqnYIABp_vbm_dk,2363
31
31
  cache_dit/cache_factory/first_block_cache/diffusers_adapters/wan.py,sha256=dBNzHBECAuTTA1a7kLdvZL20YzaKTAS3iciVLzKKEWA,2638
32
- cache_dit-0.2.2.dist-info/licenses/LICENSE,sha256=Dqb07Ik2dV41s9nIdMUbiRWEfDqo7-dQeRiY7kPO8PE,3769
33
- cache_dit-0.2.2.dist-info/METADATA,sha256=-4Sl6vCYl5bPBQVtlHGhHvEz0Nn-o3R5mYArGARsjLU,24521
34
- cache_dit-0.2.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
35
- cache_dit-0.2.2.dist-info/top_level.txt,sha256=ZJDydonLEhujzz0FOkVbO-BqfzO9d_VqRHmZU-3MOZo,10
36
- cache_dit-0.2.2.dist-info/RECORD,,
32
+ cache_dit/compile/__init__.py,sha256=DfMdPleFFGADXLsr7zXui8BTz_y9futY6rNmNdh9y7k,63
33
+ cache_dit/compile/utils.py,sha256=KU60xc474Anbj7Y_FLRFmNxEjVYLLXkhbtCLXO7o_Tc,3699
34
+ cache_dit/custom_ops/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
35
+ cache_dit/custom_ops/triton_taylorseer.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
36
+ cache_dit-0.2.3.dist-info/licenses/LICENSE,sha256=Dqb07Ik2dV41s9nIdMUbiRWEfDqo7-dQeRiY7kPO8PE,3769
37
+ cache_dit-0.2.3.dist-info/METADATA,sha256=XH7Wn7GdTRth6g0yAY5heArGqXmrrC7CflOJ8ZXH-1k,24867
38
+ cache_dit-0.2.3.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
39
+ cache_dit-0.2.3.dist-info/top_level.txt,sha256=ZJDydonLEhujzz0FOkVbO-BqfzO9d_VqRHmZU-3MOZo,10
40
+ cache_dit-0.2.3.dist-info/RECORD,,