ai-edge-torch-nightly 0.3.0.dev20250109__py3-none-any.whl → 0.3.0.dev20250112__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
@@ -129,6 +129,7 @@ class Gemma2(nn.Module):
129
129
  tokens: torch.Tensor,
130
130
  input_pos: torch.Tensor,
131
131
  kv_cache: kv_utils.KVCache,
132
+ mask: Optional[torch.Tensor] = None,
132
133
  export_config: Optional[model_builder.ExportConfig] = None,
133
134
  ) -> dict[torch.Tensor, kv_utils.KVCache]:
134
135
  _, seq_len = tokens.size()
@@ -175,7 +176,15 @@ class Gemma2(nn.Module):
175
176
  input_embeds = input_embeds * self.config.embedding_scale
176
177
  x = input_embeds
177
178
  updated_kv_entries = []
179
+ mask_input = mask is not None
178
180
  for i, block in enumerate(self.transformer_blocks):
181
+ mask = (
182
+ mask
183
+ if mask_input
184
+ else self.get_attention_mask(
185
+ block.config.attn_config.attn_type, input_pos
186
+ )
187
+ )
179
188
  kv_entry = kv_cache.caches[i] if kv_cache else None
180
189
  x, kv_entry = block(x, rope, mask[i], input_pos, kv_entry)
181
190
  if kv_entry:
@@ -54,6 +54,7 @@ class Decoder(model_builder.DecoderOnlyModel):
54
54
  input_pos: torch.Tensor,
55
55
  kv_cache: kv_utils.KVCache,
56
56
  input_embeds: torch.Tensor = None,
57
+ mask: Optional[torch.Tensor] = None,
57
58
  export_config: Optional[model_builder.ExportConfig] = None,
58
59
  called_by_generate: bool = True,
59
60
  ) -> dict[torch.Tensor, kv_utils.KVCache]:
@@ -73,8 +74,9 @@ class Decoder(model_builder.DecoderOnlyModel):
73
74
  # The first part of input_embeds are image embeddings. Diagonal causal mask
74
75
  # doesn't work here.
75
76
  embeds_len = input_embeds.shape[1]
76
- mask = torch.zeros(embeds_len, self.config.kv_cache_max)
77
- mask[:, embeds_len:] = float("-inf")
77
+ if mask is None:
78
+ mask = torch.zeros(embeds_len, self.config.kv_cache_max)
79
+ mask[:, embeds_len:] = float("-inf")
78
80
 
79
81
  return self._forward_with_embeds(
80
82
  input_embeds, rope, mask, input_pos, kv_cache
@@ -57,6 +57,7 @@ class Decoder2(gemma2.Gemma2):
57
57
  input_pos: torch.Tensor,
58
58
  kv_cache: kv_utils.KVCache,
59
59
  input_embeds: torch.Tensor = None,
60
+ mask: Optional[torch.Tensor] = None,
60
61
  export_config: Optional[model_builder.ExportConfig] = None,
61
62
  called_by_generate: bool = True,
62
63
  ) -> dict[torch.Tensor, kv_utils.KVCache]:
@@ -73,17 +74,21 @@ class Decoder2(gemma2.Gemma2):
73
74
  repo_pos, n_elem, attn_config.head_dim, attn_config.rotary_base
74
75
  )
75
76
 
76
- if called_by_generate:
77
- # PaliGemma2 generate() use a diagonal causal mask even with image embeds.
78
- mask = [self.get_attention_mask(
79
- self.config.block_config(i).attn_config.attn_type, input_pos
80
- ) for i in range(self.config.num_layers)]
81
- else:
82
- # By default, don't mask image embeds with a diagonal causal mask.
83
- embeds_len = input_embeds.shape[1]
84
- mask = torch.zeros(embeds_len, self.config.kv_cache_max)
85
- mask[:, embeds_len:] = float("-inf")
86
- mask = [mask] * self.config.num_layers
77
+ if mask is None:
78
+ if called_by_generate:
79
+ # PaliGemma2 generate() use a diagonal causal mask even with image embeds.
80
+ mask = [
81
+ self.get_attention_mask(
82
+ self.config.block_config(i).attn_config.attn_type, input_pos
83
+ )
84
+ for i in range(self.config.num_layers)
85
+ ]
86
+ else:
87
+ # By default, don't mask image embeds with a diagonal causal mask.
88
+ embeds_len = input_embeds.shape[1]
89
+ mask = torch.zeros(embeds_len, self.config.kv_cache_max)
90
+ mask[:, embeds_len:] = float("-inf")
91
+ mask = [mask] * self.config.num_layers
87
92
 
88
93
  return self._forward_with_embeds(
89
94
  input_embeds, rope, mask, input_pos, kv_cache, export_config
@@ -70,6 +70,7 @@ class PaliGemma(nn.Module):
70
70
  tokens: torch.Tensor,
71
71
  input_pos: torch.Tensor,
72
72
  kv_cache: kv_utils.KVCache,
73
+ mask: Optional[torch.Tensor] = None,
73
74
  pixel_values: torch.Tensor = None,
74
75
  export_config: Optional[model_builder.ExportConfig] = None,
75
76
  called_by_generate: bool = True,
@@ -79,6 +80,7 @@ class PaliGemma(nn.Module):
79
80
  tokens=tokens,
80
81
  input_pos=input_pos,
81
82
  kv_cache=kv_cache,
83
+ mask=mask,
82
84
  input_embeds=None,
83
85
  export_config=export_config,
84
86
  called_by_generate=called_by_generate,
@@ -111,6 +113,7 @@ class PaliGemma(nn.Module):
111
113
  tokens=None,
112
114
  input_pos=input_pos,
113
115
  kv_cache=kv_cache,
116
+ mask=mask,
114
117
  input_embeds=input_embeds,
115
118
  export_config=export_config,
116
119
  called_by_generate=called_by_generate,
@@ -26,7 +26,7 @@ from ai_edge_torch.generative.utilities.model_builder import ExportConfig
26
26
 
27
27
  _CHECKPOINT_PATH = flags.DEFINE_string(
28
28
  'checkpoint_path',
29
- os.path.join(pathlib.Path.home(), 'Downloads/llm_data/gemma-2b'),
29
+ os.path.join(pathlib.Path.home(), 'Downloads/llm_data/phi3'),
30
30
  'The path to the model checkpoint, or directory holding the checkpoint.',
31
31
  )
32
32
  _OUTPUT_PATH = flags.DEFINE_string(
@@ -13,7 +13,7 @@
13
13
  # limitations under the License.
14
14
  # ==============================================================================
15
15
  # A toy example which has a single-layer transformer block.
16
- from typing import Tuple
16
+ from typing import Optional, Tuple
17
17
 
18
18
  from ai_edge_torch.generative.layers import builder
19
19
  from ai_edge_torch.generative.layers.attention import TransformerBlock
@@ -52,14 +52,20 @@ class ToySingleLayerModel(torch.nn.Module):
52
52
  self.config = config
53
53
 
54
54
  @torch.inference_mode
55
- def forward(self, idx: torch.Tensor, input_pos: torch.Tensor) -> torch.Tensor:
55
+ def forward(
56
+ self,
57
+ idx: torch.Tensor,
58
+ input_pos: torch.Tensor,
59
+ mask: Optional[torch.Tensor] = None,
60
+ ) -> torch.Tensor:
56
61
  x = self.tok_embedding(idx)
57
62
  cos, sin = self.rope_cache
58
63
 
59
64
  cos = cos.index_select(0, input_pos)
60
65
  sin = sin.index_select(0, input_pos)
61
- mask = self.mask_cache.index_select(2, input_pos)
62
- mask = mask[:, :, :, : self.config.max_seq_len]
66
+ if mask is None:
67
+ mask = self.mask_cache.index_select(2, input_pos)
68
+ mask = mask[:, :, :, : self.config.max_seq_len]
63
69
 
64
70
  x = self.transformer_block(x, (cos, sin), mask, input_pos)
65
71
  x = self.final_norm(x)
@@ -98,7 +104,12 @@ class ToySingleLayerModelWeightSharing(torch.nn.Module):
98
104
  self.config = config
99
105
 
100
106
  @torch.inference_mode
101
- def forward(self, idx: torch.Tensor, input_pos: torch.Tensor) -> torch.Tensor:
107
+ def forward(
108
+ self,
109
+ idx: torch.Tensor,
110
+ input_pos: torch.Tensor,
111
+ mask: Optional[torch.Tensor] = None,
112
+ ) -> torch.Tensor:
102
113
  x = self.tok_embedding(idx)
103
114
  cos, sin = self.rope_cache
104
115
 
@@ -63,14 +63,16 @@ class ToyModelWithKVCache(torch.nn.Module):
63
63
  tokens: torch.Tensor,
64
64
  input_pos: torch.Tensor,
65
65
  kv_cache: kv_utils.KVCache,
66
+ mask: Optional[torch.Tensor] = None,
66
67
  export_config: Optional[ExportConfig] = None,
67
68
  ) -> Tuple[torch.Tensor, kv_utils.KVCache]:
68
69
  x = self.tok_embedding(tokens)
69
70
  cos, sin = self.rope_cache
70
71
  cos = cos.index_select(0, input_pos)
71
72
  sin = sin.index_select(0, input_pos)
72
- mask = self.mask_cache.index_select(2, input_pos)
73
- mask = mask[:, :, :, : self.config.max_seq_len]
73
+ if mask is None:
74
+ mask = self.mask_cache.index_select(2, input_pos)
75
+ mask = mask[:, :, :, : self.config.max_seq_len]
74
76
 
75
77
  updated_kv_entries = []
76
78
  for i, block in enumerate(self.transformer_blocks):
@@ -99,6 +99,7 @@ class DecoderOnlyModel(nn.Module):
99
99
  tokens: torch.Tensor,
100
100
  input_pos: torch.Tensor,
101
101
  kv_cache: kv_utils.KVCache,
102
+ mask: Optional[torch.Tensor] = None,
102
103
  lora: Optional[lora_utils.LoRA] = None,
103
104
  export_config: Optional[ExportConfig] = None,
104
105
  ) -> dict[torch.Tensor, kv_utils.KVCache]:
@@ -122,8 +123,9 @@ class DecoderOnlyModel(nn.Module):
122
123
  # input_pos=input_pos, n_elem=n_elem, base=attn_config.rotary_base
123
124
  )
124
125
 
125
- mask = self.mask_cache.index_select(2, input_pos)
126
- mask = mask[:, :, :, : self.config.kv_cache_max]
126
+ if mask is None:
127
+ mask = self.mask_cache.index_select(2, input_pos)
128
+ mask = mask[:, :, :, : self.config.kv_cache_max]
127
129
 
128
130
  return self.forward_with_embeds(
129
131
  input_embeds, rope, mask, input_pos, kv_cache, lora, export_config
ai_edge_torch/version.py CHANGED
@@ -13,4 +13,4 @@
13
13
  # limitations under the License.
14
14
  # ==============================================================================
15
15
 
16
- __version__ = "0.3.0.dev20250109"
16
+ __version__ = "0.3.0.dev20250112"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ai-edge-torch-nightly
3
- Version: 0.3.0.dev20250109
3
+ Version: 0.3.0.dev20250112
4
4
  Summary: Supporting PyTorch models with the Google AI Edge TFLite runtime.
5
5
  Home-page: https://github.com/google-ai-edge/ai-edge-torch
6
6
  Keywords: On-Device ML,AI,Google,TFLite,PyTorch,LLMs,GenAI
@@ -3,7 +3,7 @@ ai_edge_torch/_config.py,sha256=PKtOtBOup-cM0wBdQxby6HzuhLhIC3oq-TBG8FF4znE,2161
3
3
  ai_edge_torch/conftest.py,sha256=r0GTrhMRhlmOGrrkvumHN8hkmyug6WvF60vWq8wRIBI,758
4
4
  ai_edge_torch/fx_pass_base.py,sha256=518ziQ0TUxqum2qZXqlD8qr65pHPh8ZNLnwFC6zvK3k,4253
5
5
  ai_edge_torch/model.py,sha256=N-pNpTxzhaFGhWhnSGd70lBzb9VlEhTOq5mddU7bvvI,5542
6
- ai_edge_torch/version.py,sha256=kM89dmK5VqznvQQJTvtq94oCbRtajNvkLPCCWSJxFSY,706
6
+ ai_edge_torch/version.py,sha256=N0UKfMi2gSle2AshPjQY1e9slJOyb3Pd5O2n2N4dhvI,706
7
7
  ai_edge_torch/_convert/__init__.py,sha256=hHLluseD2R0Hh4W6XZRIXY_dRQeYudjsrKGf6LZz65g,671
8
8
  ai_edge_torch/_convert/conversion.py,sha256=_PoH0E1gbbsWhLGwDRwUtW2G_IgNzNF7pKQbn9ct6-4,5778
9
9
  ai_edge_torch/_convert/conversion_utils.py,sha256=Sr8qXVcTwc-ZnZmK7yxVrIOOp1S_vNrwzC0zUvLTI2o,2160
@@ -47,7 +47,7 @@ ai_edge_torch/generative/examples/gemma/__init__.py,sha256=hHLluseD2R0Hh4W6XZRIX
47
47
  ai_edge_torch/generative/examples/gemma/convert_gemma1_to_tflite.py,sha256=8HJi0cutxPstafVNs2LfBKdUzufVucje1Vrfjw_RS_g,2527
48
48
  ai_edge_torch/generative/examples/gemma/convert_gemma2_to_tflite.py,sha256=MX8fZhJJPZ5IoMiNHX0tLkRpHYqVuh4qhW0rkeIfmYw,2529
49
49
  ai_edge_torch/generative/examples/gemma/gemma1.py,sha256=w8oWYibZzvEvCDyp39EYyAWmjgJljhzdYPyFCfAWxZA,3497
50
- ai_edge_torch/generative/examples/gemma/gemma2.py,sha256=pXilP6DHqVdcFH1TpIAtcwAQZH2_jZ6Tz41ddlXZXMs,10177
50
+ ai_edge_torch/generative/examples/gemma/gemma2.py,sha256=e9HfiHr4FkQZwVBYdDUZGzOjB5TqY2LqtVTHEzwVkQY,10428
51
51
  ai_edge_torch/generative/examples/gemma/verify_gemma1.py,sha256=ip-Gmk4CI5f0GWSdAIdrectxQWJ0t328KCsA4nfHuGg,1736
52
52
  ai_edge_torch/generative/examples/gemma/verify_gemma2.py,sha256=IoBhEMwH07-tFm5-U6F2hpCsI8xynglhq1x9tIOdaPQ,1322
53
53
  ai_edge_torch/generative/examples/gemma/verify_util.py,sha256=tR8RflXocDZqvuStyw9aFlzuiTllEC8rNnjrxms6_Is,5727
@@ -64,16 +64,16 @@ ai_edge_torch/generative/examples/openelm/openelm.py,sha256=sIJ8Ie1oxFrJM-1jvv2u
64
64
  ai_edge_torch/generative/examples/openelm/verify.py,sha256=VkigoqhAr8ew95neb3TifYv-SLOSheaWKv2AH0iKDrc,2441
65
65
  ai_edge_torch/generative/examples/paligemma/__init__.py,sha256=hHLluseD2R0Hh4W6XZRIXY_dRQeYudjsrKGf6LZz65g,671
66
66
  ai_edge_torch/generative/examples/paligemma/convert_to_tflite.py,sha256=scLsguzzuHfKYDWUd2uZkKYVRzdAbQHLd-kPam8QwvM,3004
67
- ai_edge_torch/generative/examples/paligemma/decoder.py,sha256=amN96oBMTPolOFvGa47vG92AZ-BNLm8j0bBYd-IrMvI,5407
68
- ai_edge_torch/generative/examples/paligemma/decoder2.py,sha256=0V_CX0Pn5Fj_-koOGjc_Av2KMSAaVjAlD-G8P6FBGyY,6385
67
+ ai_edge_torch/generative/examples/paligemma/decoder.py,sha256=NJGhfPxVQjHDqea_lYGffjihOBdIYiXftiFTM6ccrwM,5475
68
+ ai_edge_torch/generative/examples/paligemma/decoder2.py,sha256=L6F6KWHqxdnGQTOp9P3c8r_K1Uxet0ZCcbdvmjWtIos,6513
69
69
  ai_edge_torch/generative/examples/paligemma/image_encoder.py,sha256=yKPWG8aBp-GuzeyQntlzwTTcGBBjvUywVGRjnlNprmo,5574
70
- ai_edge_torch/generative/examples/paligemma/paligemma.py,sha256=FwGlFHl9zktGDxnoOpEtbS6NYN5RyzcOXH7lvNUCwEU,6257
70
+ ai_edge_torch/generative/examples/paligemma/paligemma.py,sha256=CEMG9gh51ev1KXPew927a6nfampiXX9bL6m-25tNYN8,6340
71
71
  ai_edge_torch/generative/examples/paligemma/verify.py,sha256=KT3Ruy40tSESxQuy-Sw01NAI3zId1BZr6Bp7FZj1wZk,5622
72
72
  ai_edge_torch/generative/examples/paligemma/verify_decoder.py,sha256=al5wMPWri4IRVWrLmCplPi6uoCzwh0vBHMGnCt-XUqo,2690
73
73
  ai_edge_torch/generative/examples/paligemma/verify_decoder2.py,sha256=tm-UfLr0YeBRVcQsWLBOMWI9JUzHmtPEbYK2vpITpqY,2534
74
74
  ai_edge_torch/generative/examples/paligemma/verify_image_encoder.py,sha256=vNm-wTT8BD6zbX6GocfP1QrVoHl0zSvuVxoXN36eeiU,3540
75
75
  ai_edge_torch/generative/examples/phi/__init__.py,sha256=hHLluseD2R0Hh4W6XZRIXY_dRQeYudjsrKGf6LZz65g,671
76
- ai_edge_torch/generative/examples/phi/convert_phi3_to_tflite.py,sha256=P2K6G7bNespSJLk72qxuCLaCcR_xAPs0Mn1dBZoByhE,2518
76
+ ai_edge_torch/generative/examples/phi/convert_phi3_to_tflite.py,sha256=CaI_-Vtd0j9FoWIDd8q5z4CFsGYUhTwEWGvMGaXICuU,2514
77
77
  ai_edge_torch/generative/examples/phi/convert_to_tflite.py,sha256=g-MvEibJT_iIhkec2VGtFFA_iP54VCq9mY4KxwAYF08,2512
78
78
  ai_edge_torch/generative/examples/phi/phi2.py,sha256=c6PYCky7yJn6MVIYOCTx8S_CH27kOPmJbRZcI95nbZs,3477
79
79
  ai_edge_torch/generative/examples/phi/phi3.py,sha256=SHvJjmi5eIch5cYIWORt6YFmSQx_oCiOk1UbKKGibtk,7119
@@ -109,8 +109,8 @@ ai_edge_torch/generative/examples/t5/t5.py,sha256=gFTmPi-xB8pcPRgoF3DJxvH_fT-KWT
109
109
  ai_edge_torch/generative/examples/t5/t5_attention.py,sha256=l01oYyJo77INzRwN4xqXquaFQPvCFBFF5zOnmGVb3Hg,8731
110
110
  ai_edge_torch/generative/examples/test_models/__init__.py,sha256=hHLluseD2R0Hh4W6XZRIXY_dRQeYudjsrKGf6LZz65g,671
111
111
  ai_edge_torch/generative/examples/test_models/convert_toy_model.py,sha256=6-WaNHckq_LlXMVTh8x90MGWeWq2bu_T_XQd3w9FnGg,3261
112
- ai_edge_torch/generative/examples/test_models/toy_model.py,sha256=4113jZK-Hu3kYop__WTc8Bq-bG6YzQtADbxHtYPEB4w,5036
113
- ai_edge_torch/generative/examples/test_models/toy_model_with_kv_cache.py,sha256=C9dzJFK3TybxKpM1vSdLjOKftkJ72DGjr8YR4H7vCe8,4664
112
+ ai_edge_torch/generative/examples/test_models/toy_model.py,sha256=Crpj-vOwSViHpblXOrRJmsIn4DrHyuB3XZ8kHifb7LA,5203
113
+ ai_edge_torch/generative/examples/test_models/toy_model_with_kv_cache.py,sha256=Ab_N9xc-4DImA-Pvevr-nnnslBXScXVo4Pw7L3_OlhI,4732
114
114
  ai_edge_torch/generative/examples/tiny_llama/__init__.py,sha256=hHLluseD2R0Hh4W6XZRIXY_dRQeYudjsrKGf6LZz65g,671
115
115
  ai_edge_torch/generative/examples/tiny_llama/convert_to_tflite.py,sha256=VU0c5pgvrUtaTboT1xuDBGjpKOM85aqtaB_hYfSBuEk,2544
116
116
  ai_edge_torch/generative/examples/tiny_llama/tiny_llama.py,sha256=mhJ18rb9sxrYRzv1YSzhbNs97oUZck99avZDcUO2oV8,2800
@@ -152,7 +152,7 @@ ai_edge_torch/generative/utilities/__init__.py,sha256=-_jxnnFnCgnTU4oTm4MnRsvL5l
152
152
  ai_edge_torch/generative/utilities/converter.py,sha256=MY8BK29yD-W4v45Xdl_ErbNilipsTlD-4-y9MyBxR5g,7620
153
153
  ai_edge_torch/generative/utilities/dynamic_update_slice.py,sha256=e2mhx-Vp8sUK4EXoPtpZLSx3TViqLAKs67EhKcXBjAQ,2121
154
154
  ai_edge_torch/generative/utilities/loader.py,sha256=A3SOjPXp--AsvoP1hqj5QKWE4sgxoFc3H5EBUz_Eogc,13531
155
- ai_edge_torch/generative/utilities/model_builder.py,sha256=yAO4VcYex21fDpuApewr0cNqgmxJljxonMd6450kblg,6710
155
+ ai_edge_torch/generative/utilities/model_builder.py,sha256=6OBKyOmbg5Sap_np1wnajpCQ1fh8P0eONqNls9eHAX4,6778
156
156
  ai_edge_torch/generative/utilities/moonshine_loader.py,sha256=_RpFabSqtGH5PHiP3_1f6QfO14qMADUxr_HGRlVDFB0,4891
157
157
  ai_edge_torch/generative/utilities/stable_diffusion_loader.py,sha256=dqPD9qRXEWtU3ombslOC-BE2l_dMwHoCNu7NsIJhsso,36158
158
158
  ai_edge_torch/generative/utilities/t5_loader.py,sha256=tEsfy8-ymzbbjOIc-oesXF3yGyyWtJgFXn2s7VOavt8,16961
@@ -206,8 +206,8 @@ ai_edge_torch/quantize/quant_config.py,sha256=U0KisSW-uZkoMJcy-ZP9W57p3tsa594fr9
206
206
  ai_edge_torch/testing/__init__.py,sha256=hHLluseD2R0Hh4W6XZRIXY_dRQeYudjsrKGf6LZz65g,671
207
207
  ai_edge_torch/testing/model_coverage/__init__.py,sha256=5P8J6Zk5YYtDvTBucFvB9NGSRI7Gw_24WnrbhXgycEE,765
208
208
  ai_edge_torch/testing/model_coverage/model_coverage.py,sha256=UPB448aMDUyC0HNYVqio2rcJPnDN0tBQMP08J6vPYew,4718
209
- ai_edge_torch_nightly-0.3.0.dev20250109.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
210
- ai_edge_torch_nightly-0.3.0.dev20250109.dist-info/METADATA,sha256=bkCouLqAI9GXCpiduHyj21ZElW42bdt0w6K5gWw1fOE,1966
211
- ai_edge_torch_nightly-0.3.0.dev20250109.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
212
- ai_edge_torch_nightly-0.3.0.dev20250109.dist-info/top_level.txt,sha256=5KXRaF2hwkApYxf7Y8y_tVb9aulGTlbOoNdbx1aKRkE,14
213
- ai_edge_torch_nightly-0.3.0.dev20250109.dist-info/RECORD,,
209
+ ai_edge_torch_nightly-0.3.0.dev20250112.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
210
+ ai_edge_torch_nightly-0.3.0.dev20250112.dist-info/METADATA,sha256=1LW-hPIYBABHsdpKZWcVFOLx0rb-z-h2oo2BUUKsp_o,1966
211
+ ai_edge_torch_nightly-0.3.0.dev20250112.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
212
+ ai_edge_torch_nightly-0.3.0.dev20250112.dist-info/top_level.txt,sha256=5KXRaF2hwkApYxf7Y8y_tVb9aulGTlbOoNdbx1aKRkE,14
213
+ ai_edge_torch_nightly-0.3.0.dev20250112.dist-info/RECORD,,