gcoderw commited on
Commit
e412b76
·
verified ·
1 Parent(s): b1401d9

Add AIST-87M throughput benchmark

Browse files
README.md CHANGED
@@ -136,10 +136,22 @@ Exact-gate tradeoff against the same dual-audio local baseline:
136
  | SALT audio-text R@1 avg | 0.008 | 0.007 | flat |
137
  | SALT image-audio R@1 avg | 0.138 | 0.148 | -0.010 |
138
 
139
- These are footprint and local exact-gate measurements, not a universal latency
140
- benchmark. Wall-clock speed still depends on runtime, device, batching, and
141
- audio preprocessing, but the deployed model removes one audio encoder pass and
142
- shrinks the audio projection path.
 
 
 
 
 
 
 
 
 
 
 
 
143
 
144
  ## Architecture
145
 
@@ -175,6 +187,7 @@ The audio encoder in this artifact is the merged native checkpoint:
175
  | `parameter_breakdown.json` | Exact parameter accounting |
176
  | `aist87m_memory_slice_release_report.md` | Human-memory slice report |
177
  | `aist87m_memory_slice_release_report.json` | Machine-readable evaluation summary |
 
178
 
179
  ## Caveats
180
 
 
136
  | SALT audio-text R@1 avg | 0.008 | 0.007 | flat |
137
  | SALT image-audio R@1 avg | 0.138 | 0.148 | -0.010 |
138
 
139
+ Measured PyTorch audio-stack throughput on an NVIDIA L4, using synthetic 10s
140
+ 32 kHz CPU waveforms passed through waveform -> audio encoder -> projection ->
141
+ normalized embedding. Median wall time is over 50 timed iterations after 20
142
+ warmup iterations. This excludes audio file decode, dataset download, and MTEB
143
+ result serialization.
144
+
145
+ | Batch | AIST-87M median ms | AIST-87M throughput | AIST-95M median ms | AIST-95M throughput | Speedup |
146
+ |---:|---:|---:|---:|---:|---:|
147
+ | 1 | 5.36 | 186.7 clips/s; 1,867 audio-s/s | 10.50 | 95.2 clips/s; 952 audio-s/s | 1.96x |
148
+ | 8 | 16.46 | 486.0 clips/s; 4,860 audio-s/s | 60.29 | 132.7 clips/s; 1,327 audio-s/s | 3.66x |
149
+ | 16 | 41.19 | 388.5 clips/s; 3,885 audio-s/s | 133.95 | 119.4 clips/s; 1,194 audio-s/s | 3.25x |
150
+
151
+ Projection-only throughput at feature batch 2048 is also higher for the
152
+ single-audio path: 314k features/s for `AIST-87M` vs 282k features/s for the
153
+ dual-audio tower. Raw benchmark output is included as
154
+ `aist87m_vs_dual_audio_throughput_l4_20260504.json`.
155
 
156
  ## Architecture
157
 
 
187
  | `parameter_breakdown.json` | Exact parameter accounting |
188
  | `aist87m_memory_slice_release_report.md` | Human-memory slice report |
189
  | `aist87m_memory_slice_release_report.json` | Machine-readable evaluation summary |
190
+ | `aist87m_vs_dual_audio_throughput_l4_20260504.json` | L4 throughput benchmark vs dual-audio tower |
191
 
192
  ## Caveats
193
 
aist87m_vs_dual_audio_throughput_l4_20260504.json ADDED
@@ -0,0 +1,320 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "aist87": {
3
+ "audio_adapter_params": 0,
4
+ "audio_checkpoint": "triembed/checkpoints/mn20_native_merged_aistmix_audioheavy100k175k175k_continue_from_balanced_20260426T143137Z/latest_model.pt",
5
+ "audio_head_input_dim": 1280,
6
+ "audio_path_params": 32144280,
7
+ "audio_projection_params": 12306560,
8
+ "audio_sample_rate": 32000,
9
+ "audio_seconds": 10.0,
10
+ "checkpoint": "triembed/checkpoints/aist81m_raw1280_mn20_lora_teacher_20260502T001744Z/best_model.pt",
11
+ "config_run_name": "aist81m_raw1280_mn20_lora_teacher_20260502T001744Z",
12
+ "encoder_params": 19837720,
13
+ "name": "AIST-87M",
14
+ "projection_only": {
15
+ "batch_size": 2048,
16
+ "cuda_events": {
17
+ "max_ms": 6.870016098022461,
18
+ "mean_ms": 6.54273796081543,
19
+ "median_ms": 6.502351999282837,
20
+ "min_ms": 6.4389119148254395,
21
+ "p95_ms": 6.860799789428711
22
+ },
23
+ "features_per_sec_cuda": 313018.8022606908,
24
+ "features_per_sec_cuda_median": 314962.9549778111,
25
+ "features_per_sec_wall": 312183.5609238512,
26
+ "features_per_sec_wall_median": 314158.8298674527,
27
+ "wall": {
28
+ "max_ms": 6.898713065311313,
29
+ "mean_ms": 6.5602429350838065,
30
+ "median_ms": 6.51899550575763,
31
+ "min_ms": 6.456336006522179,
32
+ "p95_ms": 6.8806440103799105
33
+ }
34
+ },
35
+ "waveform_to_embedding": {
36
+ "1": {
37
+ "audio_seconds_per_sec_cuda": 1767.600123842052,
38
+ "audio_seconds_per_sec_cuda_median": 1872.479629331263,
39
+ "audio_seconds_per_sec_wall": 1762.1861633836697,
40
+ "audio_seconds_per_sec_wall_median": 1866.9151048991507,
41
+ "cuda_events": {
42
+ "max_ms": 6.4194560050964355,
43
+ "mean_ms": 5.657388153076172,
44
+ "median_ms": 5.340512037277222,
45
+ "min_ms": 5.30841588973999,
46
+ "p95_ms": 6.403071880340576
47
+ },
48
+ "items_per_sec_cuda": 176.7600123842052,
49
+ "items_per_sec_cuda_median": 187.2479629331263,
50
+ "items_per_sec_wall": 176.21861633836699,
51
+ "items_per_sec_wall_median": 186.69151048991506,
52
+ "wall": {
53
+ "max_ms": 6.437776144593954,
54
+ "mean_ms": 5.674769333563745,
55
+ "median_ms": 5.3564299596473575,
56
+ "min_ms": 5.324810044839978,
57
+ "p95_ms": 6.428366061300039
58
+ }
59
+ },
60
+ "16": {
61
+ "audio_seconds_per_sec_cuda": 3615.280314396054,
62
+ "audio_seconds_per_sec_cuda_median": 3886.776599612583,
63
+ "audio_seconds_per_sec_wall": 3613.4877550602714,
64
+ "audio_seconds_per_sec_wall_median": 3884.636076443369,
65
+ "cuda_events": {
66
+ "max_ms": 92.48665618896484,
67
+ "mean_ms": 44.25659591674805,
68
+ "median_ms": 41.16521644592285,
69
+ "min_ms": 40.92313766479492,
70
+ "p95_ms": 68.5506591796875
71
+ },
72
+ "items_per_sec_cuda": 361.5280314396054,
73
+ "items_per_sec_cuda_median": 388.6776599612583,
74
+ "items_per_sec_wall": 361.34877550602715,
75
+ "items_per_sec_wall_median": 388.4636076443369,
76
+ "wall": {
77
+ "max_ms": 92.50957006588578,
78
+ "mean_ms": 44.278550487942994,
79
+ "median_ms": 41.187899420037866,
80
+ "min_ms": 40.94505496323109,
81
+ "p95_ms": 68.57325998134911
82
+ }
83
+ },
84
+ "8": {
85
+ "audio_seconds_per_sec_cuda": 4831.796135966214,
86
+ "audio_seconds_per_sec_cuda_median": 4866.393306722875,
87
+ "audio_seconds_per_sec_wall": 4825.5348259899165,
88
+ "audio_seconds_per_sec_wall_median": 4859.857786409293,
89
+ "cuda_events": {
90
+ "max_ms": 18.59174346923828,
91
+ "mean_ms": 16.556989936828614,
92
+ "median_ms": 16.439279556274414,
93
+ "min_ms": 16.22015953063965,
94
+ "p95_ms": 16.830463409423828
95
+ },
96
+ "items_per_sec_cuda": 483.17961359662144,
97
+ "items_per_sec_cuda_median": 486.6393306722875,
98
+ "items_per_sec_wall": 482.5534825989917,
99
+ "items_per_sec_wall_median": 485.9857786409293,
100
+ "wall": {
101
+ "max_ms": 18.62559001892805,
102
+ "mean_ms": 16.57847324386239,
103
+ "median_ms": 16.46138704381883,
104
+ "min_ms": 16.24572789296508,
105
+ "p95_ms": 16.852295957505703
106
+ }
107
+ }
108
+ }
109
+ },
110
+ "comparison_by_batch_size": {
111
+ "1": {
112
+ "aist87_audio_seconds_per_sec_wall": 1762.1861633836697,
113
+ "aist87_audio_seconds_per_sec_wall_median": 1866.9151048991507,
114
+ "aist87_items_per_sec_cuda": 176.7600123842052,
115
+ "aist87_items_per_sec_cuda_median": 187.2479629331263,
116
+ "aist87_items_per_sec_wall": 176.21861633836699,
117
+ "aist87_items_per_sec_wall_median": 186.69151048991506,
118
+ "aist87_mean_cuda_ms": 5.657388153076172,
119
+ "aist87_mean_wall_ms": 5.674769333563745,
120
+ "aist87_median_cuda_ms": 5.340512037277222,
121
+ "aist87_median_wall_ms": 5.3564299596473575,
122
+ "dual_audio_seconds_per_sec_wall": 841.2845368070198,
123
+ "dual_audio_seconds_per_sec_wall_median": 952.2081950454711,
124
+ "dual_items_per_sec_cuda": 84.26473443749266,
125
+ "dual_items_per_sec_cuda_median": 95.38999079009756,
126
+ "dual_items_per_sec_wall": 84.12845368070198,
127
+ "dual_items_per_sec_wall_median": 95.22081950454712,
128
+ "dual_mean_cuda_ms": 11.867360725402833,
129
+ "dual_mean_wall_ms": 11.8865848146379,
130
+ "dual_median_cuda_ms": 10.483280181884766,
131
+ "dual_median_wall_ms": 10.501904995180666,
132
+ "speedup_audio_seconds_per_sec_wall": 2.094637529024135,
133
+ "speedup_audio_seconds_per_sec_wall_median": 1.960616506571863,
134
+ "speedup_items_per_sec_cuda": 2.0976748287900353,
135
+ "speedup_items_per_sec_cuda_median": 1.962972858915136,
136
+ "speedup_items_per_sec_wall": 2.094637529024135,
137
+ "speedup_items_per_sec_wall_median": 1.9606165065718626
138
+ },
139
+ "16": {
140
+ "aist87_audio_seconds_per_sec_wall": 3613.4877550602714,
141
+ "aist87_audio_seconds_per_sec_wall_median": 3884.636076443369,
142
+ "aist87_items_per_sec_cuda": 361.5280314396054,
143
+ "aist87_items_per_sec_cuda_median": 388.6776599612583,
144
+ "aist87_items_per_sec_wall": 361.34877550602715,
145
+ "aist87_items_per_sec_wall_median": 388.4636076443369,
146
+ "aist87_mean_cuda_ms": 44.25659591674805,
147
+ "aist87_mean_wall_ms": 44.278550487942994,
148
+ "aist87_median_cuda_ms": 41.16521644592285,
149
+ "aist87_median_wall_ms": 41.187899420037866,
150
+ "dual_audio_seconds_per_sec_wall": 1173.9429007331944,
151
+ "dual_audio_seconds_per_sec_wall_median": 1194.4542069368163,
152
+ "dual_items_per_sec_cuda": 117.41469647216593,
153
+ "dual_items_per_sec_cuda_median": 119.4681483517097,
154
+ "dual_items_per_sec_wall": 117.39429007331943,
155
+ "dual_items_per_sec_wall_median": 119.44542069368163,
156
+ "dual_mean_cuda_ms": 136.26914245605468,
157
+ "dual_mean_wall_ms": 136.29282983019948,
158
+ "dual_median_cuda_ms": 133.92691040039062,
159
+ "dual_median_wall_ms": 133.95239354576916,
160
+ "speedup_audio_seconds_per_sec_wall": 3.078077948087119,
161
+ "speedup_audio_seconds_per_sec_wall_median": 3.252226878086467,
162
+ "speedup_items_per_sec_cuda": 3.079069676131288,
163
+ "speedup_items_per_sec_cuda_median": 3.2533998837665585,
164
+ "speedup_items_per_sec_wall": 3.0780779480871194,
165
+ "speedup_items_per_sec_wall_median": 3.252226878086467
166
+ },
167
+ "8": {
168
+ "aist87_audio_seconds_per_sec_wall": 4825.5348259899165,
169
+ "aist87_audio_seconds_per_sec_wall_median": 4859.857786409293,
170
+ "aist87_items_per_sec_cuda": 483.17961359662144,
171
+ "aist87_items_per_sec_cuda_median": 486.6393306722875,
172
+ "aist87_items_per_sec_wall": 482.5534825989917,
173
+ "aist87_items_per_sec_wall_median": 485.9857786409293,
174
+ "aist87_mean_cuda_ms": 16.556989936828614,
175
+ "aist87_mean_wall_ms": 16.57847324386239,
176
+ "aist87_median_cuda_ms": 16.439279556274414,
177
+ "aist87_median_wall_ms": 16.46138704381883,
178
+ "dual_audio_seconds_per_sec_wall": 1304.9761567848066,
179
+ "dual_audio_seconds_per_sec_wall_median": 1326.985212046842,
180
+ "dual_items_per_sec_cuda": 130.54346670818657,
181
+ "dual_items_per_sec_cuda_median": 132.74486741223745,
182
+ "dual_items_per_sec_wall": 130.49761567848066,
183
+ "dual_items_per_sec_wall_median": 132.6985212046842,
184
+ "dual_mean_cuda_ms": 61.28227020263672,
185
+ "dual_mean_wall_ms": 61.30380205344409,
186
+ "dual_median_cuda_ms": 60.26598358154297,
187
+ "dual_median_wall_ms": 60.28703204356134,
188
+ "speedup_audio_seconds_per_sec_wall": 3.6977953971810824,
189
+ "speedup_audio_seconds_per_sec_wall_median": 3.6623300262051015,
190
+ "speedup_items_per_sec_cuda": 3.7012929546042197,
191
+ "speedup_items_per_sec_cuda_median": 3.6659747390536417,
192
+ "speedup_items_per_sec_wall": 3.697795397181083,
193
+ "speedup_items_per_sec_wall_median": 3.6623300262051015
194
+ }
195
+ },
196
+ "dual_audio_tower": {
197
+ "audio_adapter_params": 0,
198
+ "audio_head_input_dim": 2304,
199
+ "audio_path_params": 40390311,
200
+ "audio_projection_params": 14272640,
201
+ "audio_sample_rate": 32000,
202
+ "audio_seconds": 10.0,
203
+ "checkpoint": "triembed/checkpoints/wordnet_validaudio_real_mn20_whisper_wavcaps_speech150k_d2_retrieval_20260418T004617Z/best_model.pt",
204
+ "config_run_name": "wordnet_validaudio_real_mn20_whisper_wavcaps_speech150k_d2_retrieval_20260418T004617Z",
205
+ "encoder_params": 26117671,
206
+ "name": "AIST-95M dual-audio tower",
207
+ "projection_only": {
208
+ "batch_size": 2048,
209
+ "cuda_events": {
210
+ "max_ms": 7.5786237716674805,
211
+ "mean_ms": 7.27663553237915,
212
+ "median_ms": 7.247359991073608,
213
+ "min_ms": 7.027616024017334,
214
+ "p95_ms": 7.532544136047363
215
+ },
216
+ "features_per_sec_cuda": 281448.75346400525,
217
+ "features_per_sec_cuda_median": 282585.6591258707,
218
+ "features_per_sec_wall": 280732.89089042274,
219
+ "features_per_sec_wall_median": 281735.96789576364,
220
+ "wall": {
221
+ "max_ms": 7.597371004521847,
222
+ "mean_ms": 7.295190789736807,
223
+ "median_ms": 7.26921739988029,
224
+ "min_ms": 7.046802900731564,
225
+ "p95_ms": 7.553461939096451
226
+ }
227
+ },
228
+ "waveform_to_embedding": {
229
+ "1": {
230
+ "audio_seconds_per_sec_cuda": 842.6473443749267,
231
+ "audio_seconds_per_sec_cuda_median": 953.8999079009756,
232
+ "audio_seconds_per_sec_wall": 841.2845368070198,
233
+ "audio_seconds_per_sec_wall_median": 952.2081950454711,
234
+ "cuda_events": {
235
+ "max_ms": 53.797889709472656,
236
+ "mean_ms": 11.867360725402833,
237
+ "median_ms": 10.483280181884766,
238
+ "min_ms": 10.369024276733398,
239
+ "p95_ms": 10.95680046081543
240
+ },
241
+ "items_per_sec_cuda": 84.26473443749266,
242
+ "items_per_sec_cuda_median": 95.38999079009756,
243
+ "items_per_sec_wall": 84.12845368070198,
244
+ "items_per_sec_wall_median": 95.22081950454712,
245
+ "wall": {
246
+ "max_ms": 53.818747168406844,
247
+ "mean_ms": 11.8865848146379,
248
+ "median_ms": 10.501904995180666,
249
+ "min_ms": 10.387809947133064,
250
+ "p95_ms": 10.97815902903676
251
+ }
252
+ },
253
+ "16": {
254
+ "audio_seconds_per_sec_cuda": 1174.1469647216593,
255
+ "audio_seconds_per_sec_cuda_median": 1194.6814835170971,
256
+ "audio_seconds_per_sec_wall": 1173.9429007331944,
257
+ "audio_seconds_per_sec_wall_median": 1194.4542069368163,
258
+ "cuda_events": {
259
+ "max_ms": 172.75180053710938,
260
+ "mean_ms": 136.26914245605468,
261
+ "median_ms": 133.92691040039062,
262
+ "min_ms": 131.3126678466797,
263
+ "p95_ms": 163.50003051757812
264
+ },
265
+ "items_per_sec_cuda": 117.41469647216593,
266
+ "items_per_sec_cuda_median": 119.4681483517097,
267
+ "items_per_sec_wall": 117.39429007331943,
268
+ "items_per_sec_wall_median": 119.44542069368163,
269
+ "wall": {
270
+ "max_ms": 172.77729604393244,
271
+ "mean_ms": 136.29282983019948,
272
+ "median_ms": 133.95239354576916,
273
+ "min_ms": 131.3318640459329,
274
+ "p95_ms": 163.52250101044774
275
+ }
276
+ },
277
+ "8": {
278
+ "audio_seconds_per_sec_cuda": 1305.4346670818657,
279
+ "audio_seconds_per_sec_cuda_median": 1327.4486741223745,
280
+ "audio_seconds_per_sec_wall": 1304.9761567848066,
281
+ "audio_seconds_per_sec_wall_median": 1326.985212046842,
282
+ "cuda_events": {
283
+ "max_ms": 109.47174072265625,
284
+ "mean_ms": 61.28227020263672,
285
+ "median_ms": 60.26598358154297,
286
+ "min_ms": 58.52467346191406,
287
+ "p95_ms": 61.911041259765625
288
+ },
289
+ "items_per_sec_cuda": 130.54346670818657,
290
+ "items_per_sec_cuda_median": 132.74486741223745,
291
+ "items_per_sec_wall": 130.49761567848066,
292
+ "items_per_sec_wall_median": 132.6985212046842,
293
+ "wall": {
294
+ "max_ms": 109.49674621224403,
295
+ "mean_ms": 61.30380205344409,
296
+ "median_ms": 60.28703204356134,
297
+ "min_ms": 58.54333913885057,
298
+ "p95_ms": 61.929865973070264
299
+ }
300
+ }
301
+ }
302
+ },
303
+ "environment": {
304
+ "batch_sizes": [
305
+ 1,
306
+ 8,
307
+ 16
308
+ ],
309
+ "cuda_available": true,
310
+ "cuda_device_name": "NVIDIA L4",
311
+ "device": "cuda:0",
312
+ "iters": 50,
313
+ "note": "Synthetic random waveforms; excludes file decode, dataset download, and MTEB result serialization.",
314
+ "platform": "Linux-6.8.12-9-pve-x86_64-with-glibc2.39",
315
+ "python": "3.12.3",
316
+ "seed": 1234,
317
+ "torch": "2.10.0+cu126",
318
+ "warmup": 20
319
+ }
320
+ }
manifest.json CHANGED
@@ -4,9 +4,20 @@
4
  "release_type": "safetensors",
5
  "license": "apache-2.0",
6
  "parameter_count": 87118774,
7
- "modalities": ["audio", "image", "speech", "text"],
 
 
 
 
 
8
  "output_dim": 1280,
9
- "matryoshka_slices": [1280, 768, 512, 256, 128],
 
 
 
 
 
 
10
  "audio_encoder": {
11
  "name": "efficientat_mn20_as_native_merged",
12
  "checkpoint": "triembed/checkpoints/mn20_native_merged_aistmix_audioheavy100k175k175k_continue_from_balanced_20260426T143137Z/latest_model.pt",
@@ -26,7 +37,8 @@
26
  "768": 0,
27
  "512": 0
28
  },
29
- "report": "aist87m_memory_slice_release_report.json"
 
30
  },
31
  "files": [
32
  {
@@ -53,6 +65,11 @@
53
  "path": "aist87m_memory_slice_release_report.json",
54
  "size_bytes": 40579,
55
  "sha256": "6b5894bd3b8de9e8c99ccd236587fc6f4652399ac95b343ba301478fcdb7c77a"
 
 
 
 
 
56
  }
57
  ]
58
  }
 
4
  "release_type": "safetensors",
5
  "license": "apache-2.0",
6
  "parameter_count": 87118774,
7
+ "modalities": [
8
+ "audio",
9
+ "image",
10
+ "speech",
11
+ "text"
12
+ ],
13
  "output_dim": 1280,
14
+ "matryoshka_slices": [
15
+ 1280,
16
+ 768,
17
+ 512,
18
+ 256,
19
+ 128
20
+ ],
21
  "audio_encoder": {
22
  "name": "efficientat_mn20_as_native_merged",
23
  "checkpoint": "triembed/checkpoints/mn20_native_merged_aistmix_audioheavy100k175k175k_continue_from_balanced_20260426T143137Z/latest_model.pt",
 
37
  "768": 0,
38
  "512": 0
39
  },
40
+ "report": "aist87m_memory_slice_release_report.json",
41
+ "throughput_report": "aist87m_vs_dual_audio_throughput_l4_20260504.json"
42
  },
43
  "files": [
44
  {
 
65
  "path": "aist87m_memory_slice_release_report.json",
66
  "size_bytes": 40579,
67
  "sha256": "6b5894bd3b8de9e8c99ccd236587fc6f4652399ac95b343ba301478fcdb7c77a"
68
+ },
69
+ {
70
+ "path": "aist87m_vs_dual_audio_throughput_l4_20260504.json",
71
+ "size_bytes": 13261,
72
+ "sha256": "58bdf1f02d4f5a497f582f4a65978d9a9b6dc37f5ca3905250b0dcdd8ea13817"
73
  }
74
  ]
75
  }