ai-edge-torch-nightly 0.3.0.dev20250109__py3-none-any.whl → 0.3.0.dev20250112__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.
@@ -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,,