n00b001 commited on
Commit
00936a3
·
unverified ·
1 Parent(s): 98be1e8
Files changed (4) hide show
  1. app.py +168 -33
  2. pyproject.toml +3 -0
  3. requirements.txt +15 -0
  4. uv.lock +141 -0
app.py CHANGED
@@ -11,6 +11,7 @@ from transformers import (
11
  AutoConfig,
12
  AutoModel
13
  )
 
14
 
15
  # --- Helper Functions ---
16
 
@@ -18,12 +19,15 @@ from transformers import (
18
  def get_quantization_recipe(method, model_architecture):
19
  """
20
  Returns the appropriate llm-compressor recipe based on the selected method.
 
21
  """
22
  if method == "AWQ":
23
- if model_architecture != "LlamaForCausalLM":
24
  raise ValueError(
25
- f"AWQ quantization is only supported for LlamaForCausalLM architectures, got {model_architecture}"
26
  )
 
 
27
  mappings = [
28
  AWQMapping(
29
  "re:.*input_layernorm", ["re:.*q_proj", "re:.*k_proj", "re:.*v_proj"]
@@ -34,19 +38,33 @@ def get_quantization_recipe(method, model_architecture):
34
  ),
35
  AWQMapping("re:.*up_proj", ["re:.*down_proj"]),
36
  ]
37
- return [
38
- AWQModifier(
39
- ignore=["lm_head"],
40
- scheme="W4A16_ASYM",
41
- targets=["Linear"],
42
- mappings=mappings,
43
- ),
44
- ]
 
 
 
 
 
 
 
 
 
 
 
 
 
45
  elif method == "GPTQ":
46
  sequential_target_map = {
47
  "LlamaForCausalLM": "LlamaDecoderLayer",
48
  "MistralForCausalLM": "MistralDecoderLayer",
49
  "MixtralForCausalLM": "MixtralDecoderLayer",
 
50
  }
51
  sequential_target = sequential_target_map.get(model_architecture)
52
  if sequential_target is None:
@@ -56,26 +74,100 @@ def get_quantization_recipe(method, model_architecture):
56
  f"{', '.join(sequential_target_map.keys())}"
57
  )
58
 
59
- return [
60
- GPTQModifier(
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
61
  targets="Linear",
62
- scheme="W4A16",
63
- sequential_targets=[sequential_target],
64
- ignore=["re:.*lm_head"],
65
- ),
66
- ]
67
- elif method == "FP8":
68
- if model_architecture not in ["LlamaForCausalLM", "MixtralForCausalLM"]:
69
  raise ValueError(
70
- f"FP8 quantization is only supported for LlamaForCausalLM and MixtralForCausalLM architectures, got {model_architecture}"
 
71
  )
 
72
  ignore_layers = ["lm_head"]
73
  if "Mixtral" in model_architecture:
74
  ignore_layers.append("re:.*block_sparse_moe.gate")
75
 
76
  return [QuantizationModifier(
77
- scheme="FP8", targets="Linear", ignore=ignore_layers
 
 
78
  )]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
79
  else:
80
  raise ValueError(f"Unsupported quantization method: {method}")
81
 
@@ -240,17 +332,58 @@ def compress_and_upload(
240
  recipe = get_quantization_recipe(quant_method, model.config.architectures[0])
241
 
242
  # --- 3. Run Compression ---
243
- oneshot(
244
- model=model,
245
- dataset="wikitext",
246
- dataset_config_name="wikitext-2-raw-v1",
247
- split="train[:1%]",
248
- recipe=recipe,
249
- save_compressed=True,
250
- output_dir=output_dir,
251
- max_seq_length=512,
252
- num_calibration_samples=64,
253
- )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
254
 
255
  # --- 4. Create Repo and Upload ---
256
  api = HfApi(token=token)
@@ -317,7 +450,9 @@ def build_gradio_app():
317
 
318
  gr.Markdown("### 2. Choose a Quantization Method")
319
  quant_method_dropdown = gr.Dropdown(
320
- ["AWQ", "GPTQ", "FP8"], label="Quantization Method", value="AWQ"
 
 
321
  )
322
 
323
  gr.Markdown("### 3. Model Type (Auto-detected, but you can override if needed)")
 
11
  AutoConfig,
12
  AutoModel
13
  )
14
+ import torch
15
 
16
  # --- Helper Functions ---
17
 
 
19
  def get_quantization_recipe(method, model_architecture):
20
  """
21
  Returns the appropriate llm-compressor recipe based on the selected method.
22
+ Updated to support Qwen2_5_VLForConditionalGeneration architecture and more quantization methods.
23
  """
24
  if method == "AWQ":
25
+ if model_architecture not in ["LlamaForCausalLM", "Qwen2_5_VLForConditionalGeneration"]:
26
  raise ValueError(
27
+ f"AWQ quantization is only supported for LlamaForCausalLM and Qwen2_5_VLForConditionalGeneration architectures, got {model_architecture}"
28
  )
29
+
30
+ # Create AWQ mappings for both architectures
31
  mappings = [
32
  AWQMapping(
33
  "re:.*input_layernorm", ["re:.*q_proj", "re:.*k_proj", "re:.*v_proj"]
 
38
  ),
39
  AWQMapping("re:.*up_proj", ["re:.*down_proj"]),
40
  ]
41
+
42
+ if model_architecture == "Qwen2_5_VLForConditionalGeneration":
43
+ return [
44
+ AWQModifier(
45
+ ignore=["lm_head", "re:visual.*", "re:model.visual.*"],
46
+ scheme="W4A16_ASYM",
47
+ targets=["Linear"],
48
+ mappings=mappings,
49
+ sequential_targets=["Qwen2_5_VLDecoderLayer"], # Sequential onloading for Qwen2.5-VL
50
+ ),
51
+ ]
52
+ else: # LlamaForCausalLM
53
+ return [
54
+ AWQModifier(
55
+ ignore=["lm_head"],
56
+ scheme="W4A16_ASYM",
57
+ targets=["Linear"],
58
+ mappings=mappings,
59
+ ),
60
+ ]
61
+
62
  elif method == "GPTQ":
63
  sequential_target_map = {
64
  "LlamaForCausalLM": "LlamaDecoderLayer",
65
  "MistralForCausalLM": "MistralDecoderLayer",
66
  "MixtralForCausalLM": "MixtralDecoderLayer",
67
+ "Qwen2_5_VLForConditionalGeneration": "Qwen2_5_VLDecoderLayer", # Add Qwen2.5-VL support
68
  }
69
  sequential_target = sequential_target_map.get(model_architecture)
70
  if sequential_target is None:
 
74
  f"{', '.join(sequential_target_map.keys())}"
75
  )
76
 
77
+ if model_architecture == "Qwen2_5_VLForConditionalGeneration":
78
+ return [
79
+ GPTQModifier(
80
+ targets="Linear",
81
+ scheme="W4A16",
82
+ sequential_targets=[sequential_target],
83
+ ignore=["lm_head", "re:visual.*", "re:model.visual.*"], # Ignore visual components
84
+ ),
85
+ ]
86
+ else:
87
+ return [
88
+ GPTQModifier(
89
+ targets="Linear",
90
+ scheme="W4A16",
91
+ sequential_targets=[sequential_target],
92
+ ignore=["re:.*lm_head"],
93
+ ),
94
+ ]
95
+ elif method in ["W4A16", "W8A16", "W8A8_INT8", "W8A8_FP8", "FP8"]:
96
+ # All these methods use the QuantizationModifier
97
+ if model_architecture not in ["LlamaForCausalLM", "MistralForCausalLM", "MixtralForCausalLM", "Qwen2_5_VLForConditionalGeneration"]:
98
+ raise ValueError(
99
+ f"Quantization method {method} is not supported for {model_architecture} architecture. "
100
+ "Supported architectures are: LlamaForCausalLM, MistralForCausalLM, MixtralForCausalLM, Qwen2_5_VLForConditionalGeneration"
101
+ )
102
+
103
+ # Map method names to actual schemes (correct names for llmcompressor)
104
+ scheme_map = {
105
+ "W4A16": "W4A16",
106
+ "W8A16": "W8A16",
107
+ "W8A8_INT8": "W8A8", # Use the correct scheme name
108
+ "W8A8_FP8": "W8A8", # Both use W8A8 but with different dtypes
109
+ "FP8": "FP8"
110
+ }
111
+
112
+ ignore_layers = ["lm_head"]
113
+ if "Mixtral" in model_architecture:
114
+ ignore_layers.append("re:.*block_sparse_moe.gate")
115
+ elif "Qwen2_5_VL" in model_architecture:
116
+ ignore_layers.extend(["re:visual.*", "re:model.visual.*"]) # Ignore visual components for Qwen2.5-VL
117
+
118
+ # For methods that support sequential onloading for Qwen2.5-VL, we use GPTQModifier with sequential_targets
119
+ if model_architecture == "Qwen2_5_VLForConditionalGeneration" and method in ["W4A16"]:
120
+ return [
121
+ GPTQModifier(
122
+ targets="Linear",
123
+ scheme=scheme_map[method],
124
+ sequential_targets=["Qwen2_5_VLDecoderLayer"], # Sequential onloading for memory efficiency
125
+ ignore=ignore_layers,
126
+ ),
127
+ ]
128
+ else:
129
+ return [QuantizationModifier(
130
+ scheme=scheme_map[method],
131
  targets="Linear",
132
+ ignore=ignore_layers
133
+ )]
134
+
135
+ elif method == "SmoothQuant":
136
+ if model_architecture not in ["LlamaForCausalLM", "MistralForCausalLM", "MixtralForCausalLM"]:
 
 
137
  raise ValueError(
138
+ f"SmoothQuant is not supported for {model_architecture} architecture. "
139
+ "Supported architectures are: LlamaForCausalLM, MistralForCausalLM, MixtralForCausalLM"
140
  )
141
+
142
  ignore_layers = ["lm_head"]
143
  if "Mixtral" in model_architecture:
144
  ignore_layers.append("re:.*block_sparse_moe.gate")
145
 
146
  return [QuantizationModifier(
147
+ scheme="W8A8", # SmoothQuant typically uses W8A8
148
+ targets="Linear",
149
+ ignore=ignore_layers
150
  )]
151
+
152
+ elif method == "SparseGPT":
153
+ if model_architecture not in ["LlamaForCausalLM", "MistralForCausalLM", "MixtralForCausalLM"]:
154
+ raise ValueError(
155
+ f"SparseGPT is not supported for {model_architecture} architecture. "
156
+ "Supported architectures are: LlamaForCausalLM, MistralForCausalLM, MixtralForCausalLM"
157
+ )
158
+
159
+ ignore_layers = ["lm_head"]
160
+ if "Mixtral" in model_architecture:
161
+ ignore_layers.append("re:.*block_sparse_moe.gate")
162
+
163
+ return [
164
+ GPTQModifier( # SparseGPT uses GPTQ algorithm with different parameters
165
+ targets="Linear",
166
+ scheme="W4A16", # Default scheme for sparsity
167
+ ignore=ignore_layers,
168
+ )
169
+ ]
170
+
171
  else:
172
  raise ValueError(f"Unsupported quantization method: {method}")
173
 
 
332
  recipe = get_quantization_recipe(quant_method, model.config.architectures[0])
333
 
334
  # --- 3. Run Compression ---
335
+ # Determine if this is a Qwen2.5-VL model to use appropriate dataset and data collator
336
+ if model.config.architectures and "Qwen2_5_VLForConditionalGeneration" in model.config.architectures[0]:
337
+ # Use a multimodal dataset and data collator for Qwen2.5-VL models
338
+ try:
339
+ from datasets import load_dataset
340
+ # Use a small subset of flickr30k for calibration if available
341
+ ds = load_dataset("lmms-lab/flickr30k", split="test[:64]")
342
+ ds = ds.shuffle(seed=42)
343
+
344
+ # Define a data collator for multimodal inputs
345
+ def qwen2_5_vl_data_collator(batch):
346
+ assert len(batch) == 1
347
+ return {key: torch.tensor(value) if isinstance(value, (list, int, float)) else value
348
+ for key, value in batch[0].items()}
349
+
350
+ oneshot(
351
+ model=model,
352
+ dataset=ds,
353
+ recipe=recipe,
354
+ save_compressed=True,
355
+ output_dir=output_dir,
356
+ max_seq_length=2048, # Increased for multimodal models
357
+ num_calibration_samples=64,
358
+ data_collator=qwen2_5_vl_data_collator,
359
+ )
360
+ except Exception as e:
361
+ print(f"Could not load multimodal dataset, falling back to text-only: {e}")
362
+ # Fall back to text-only dataset
363
+ oneshot(
364
+ model=model,
365
+ dataset="wikitext",
366
+ dataset_config_name="wikitext-2-raw-v1",
367
+ split="train[:1%]",
368
+ recipe=recipe,
369
+ save_compressed=True,
370
+ output_dir=output_dir,
371
+ max_seq_length=512,
372
+ num_calibration_samples=64,
373
+ )
374
+ else:
375
+ # For non-multimodal models, use the original approach
376
+ oneshot(
377
+ model=model,
378
+ dataset="wikitext",
379
+ dataset_config_name="wikitext-2-raw-v1",
380
+ split="train[:1%]",
381
+ recipe=recipe,
382
+ save_compressed=True,
383
+ output_dir=output_dir,
384
+ max_seq_length=512,
385
+ num_calibration_samples=64,
386
+ )
387
 
388
  # --- 4. Create Repo and Upload ---
389
  api = HfApi(token=token)
 
450
 
451
  gr.Markdown("### 2. Choose a Quantization Method")
452
  quant_method_dropdown = gr.Dropdown(
453
+ ["W4A16", "W8A16", "W8A8_INT8", "W8A8_FP8", "AWQ", "GPTQ", "FP8", "SmoothQuant", "SparseGPT"],
454
+ label="Quantization Method",
455
+ value="W4A16"
456
  )
457
 
458
  gr.Markdown("### 3. Model Type (Auto-detected, but you can override if needed)")
pyproject.toml CHANGED
@@ -101,6 +101,7 @@ dependencies = [
101
  "python-multipart==0.0.20",
102
  "pytz==2025.2",
103
  "pyyaml==6.0.3",
 
104
  "regex==2025.11.3",
105
  "requests==2.32.5",
106
  "rich==14.2.0",
@@ -126,6 +127,8 @@ dependencies = [
126
  "tokenizers==0.22.1",
127
  "tomlkit==0.13.3",
128
  "torch==2.9.1",
 
 
129
  "tqdm==4.67.1",
130
  "tqdm-multiprocess==0.0.11",
131
  "transformers",
 
101
  "python-multipart==0.0.20",
102
  "pytz==2025.2",
103
  "pyyaml==6.0.3",
104
+ "qwen-vl-utils>=0.0.14",
105
  "regex==2025.11.3",
106
  "requests==2.32.5",
107
  "rich==14.2.0",
 
127
  "tokenizers==0.22.1",
128
  "tomlkit==0.13.3",
129
  "torch==2.9.1",
130
+ "torchaudio>=2.9.1",
131
+ "torchvision>=0.24.1",
132
  "tqdm==4.67.1",
133
  "tqdm-multiprocess==0.0.11",
134
  "transformers",
requirements.txt CHANGED
@@ -52,6 +52,8 @@ auto-round @ git+https://github.com/intel/auto-round.git@5ffe56ddc51cbc69cd6fe87
52
  # via
53
  # llm-compressor-my-repo (pyproject.toml)
54
  # llmcompressor
 
 
55
  brotli==1.2.0
56
  # via
57
  # llm-compressor-my-repo (pyproject.toml)
@@ -294,6 +296,7 @@ numpy==2.3.5
294
  # sacrebleu
295
  # scikit-learn
296
  # scipy
 
297
  # transformers
298
  nvidia-cublas-cu12==12.8.4.1
299
  # via
@@ -380,6 +383,7 @@ packaging==25.0
380
  # gradio-client
381
  # huggingface-hub
382
  # peft
 
383
  # transformers
384
  # typepy
385
  pandas==2.3.3
@@ -402,6 +406,8 @@ pillow==11.3.0
402
  # auto-round
403
  # gradio
404
  # llmcompressor
 
 
405
  portalocker==3.2.0
406
  # via
407
  # llm-compressor-my-repo (pyproject.toml)
@@ -478,6 +484,8 @@ pyyaml==6.0.3
478
  # llmcompressor
479
  # peft
480
  # transformers
 
 
481
  regex==2025.11.3
482
  # via
483
  # llm-compressor-my-repo (pyproject.toml)
@@ -490,6 +498,7 @@ requests==2.32.5
490
  # datasets
491
  # evaluate
492
  # llmcompressor
 
493
  # transformers
494
  rich==14.2.0
495
  # via
@@ -595,6 +604,12 @@ torch==2.9.1
595
  # llmcompressor
596
  # lm-eval
597
  # peft
 
 
 
 
 
 
598
  tqdm==4.67.1
599
  # via
600
  # llm-compressor-my-repo (pyproject.toml)
 
52
  # via
53
  # llm-compressor-my-repo (pyproject.toml)
54
  # llmcompressor
55
+ av==16.0.1
56
+ # via qwen-vl-utils
57
  brotli==1.2.0
58
  # via
59
  # llm-compressor-my-repo (pyproject.toml)
 
296
  # sacrebleu
297
  # scikit-learn
298
  # scipy
299
+ # torchvision
300
  # transformers
301
  nvidia-cublas-cu12==12.8.4.1
302
  # via
 
383
  # gradio-client
384
  # huggingface-hub
385
  # peft
386
+ # qwen-vl-utils
387
  # transformers
388
  # typepy
389
  pandas==2.3.3
 
406
  # auto-round
407
  # gradio
408
  # llmcompressor
409
+ # qwen-vl-utils
410
+ # torchvision
411
  portalocker==3.2.0
412
  # via
413
  # llm-compressor-my-repo (pyproject.toml)
 
484
  # llmcompressor
485
  # peft
486
  # transformers
487
+ qwen-vl-utils==0.0.14
488
+ # via llm-compressor-my-repo (pyproject.toml)
489
  regex==2025.11.3
490
  # via
491
  # llm-compressor-my-repo (pyproject.toml)
 
498
  # datasets
499
  # evaluate
500
  # llmcompressor
501
+ # qwen-vl-utils
502
  # transformers
503
  rich==14.2.0
504
  # via
 
604
  # llmcompressor
605
  # lm-eval
606
  # peft
607
+ # torchaudio
608
+ # torchvision
609
+ torchaudio==2.9.1
610
+ # via llm-compressor-my-repo (pyproject.toml)
611
+ torchvision==0.24.1
612
+ # via llm-compressor-my-repo (pyproject.toml)
613
  tqdm==4.67.1
614
  # via
615
  # llm-compressor-my-repo (pyproject.toml)
uv.lock CHANGED
@@ -294,6 +294,56 @@ dependencies = [
294
  { name = "transformers" },
295
  ]
296
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
297
  [[package]]
298
  name = "brotli"
299
  version = "1.2.0"
@@ -1139,6 +1189,7 @@ dependencies = [
1139
  { name = "python-multipart" },
1140
  { name = "pytz" },
1141
  { name = "pyyaml" },
 
1142
  { name = "regex" },
1143
  { name = "requests" },
1144
  { name = "rich" },
@@ -1164,6 +1215,8 @@ dependencies = [
1164
  { name = "tokenizers" },
1165
  { name = "tomlkit" },
1166
  { name = "torch" },
 
 
1167
  { name = "tqdm" },
1168
  { name = "tqdm-multiprocess" },
1169
  { name = "transformers" },
@@ -1283,6 +1336,7 @@ requires-dist = [
1283
  { name = "python-multipart", specifier = "==0.0.20" },
1284
  { name = "pytz", specifier = "==2025.2" },
1285
  { name = "pyyaml", specifier = "==6.0.3" },
 
1286
  { name = "regex", specifier = "==2025.11.3" },
1287
  { name = "requests", specifier = "==2.32.5" },
1288
  { name = "rich", specifier = "==14.2.0" },
@@ -1308,6 +1362,8 @@ requires-dist = [
1308
  { name = "tokenizers", specifier = "==0.22.1" },
1309
  { name = "tomlkit", specifier = "==0.13.3" },
1310
  { name = "torch", specifier = "==2.9.1" },
 
 
1311
  { name = "tqdm", specifier = "==4.67.1" },
1312
  { name = "tqdm-multiprocess", specifier = "==0.0.11" },
1313
  { name = "transformers", git = "https://github.com/huggingface/transformers.git?rev=cac0a28c83cf87b7a05495de3177099c635ba852" },
@@ -2795,6 +2851,21 @@ wheels = [
2795
  { url = "https://files.pythonhosted.org/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", size = 149341, upload-time = "2025-09-25T21:32:56.828Z" },
2796
  ]
2797
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2798
  [[package]]
2799
  name = "regex"
2800
  version = "2025.11.3"
@@ -3367,6 +3438,76 @@ wheels = [
3367
  { url = "https://files.pythonhosted.org/packages/db/2b/f7818f6ec88758dfd21da46b6cd46af9d1b3433e53ddbb19ad1e0da17f9b/torch-2.9.1-cp314-cp314t-win_amd64.whl", hash = "sha256:c88d3299ddeb2b35dcc31753305612db485ab6f1823e37fb29451c8b2732b87e", size = 111163659, upload-time = "2025-11-12T15:23:20.009Z" },
3368
  ]
3369
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3370
  [[package]]
3371
  name = "tqdm"
3372
  version = "4.67.1"
 
294
  { name = "transformers" },
295
  ]
296
 
297
+ [[package]]
298
+ name = "av"
299
+ version = "16.0.1"
300
+ source = { registry = "https://pypi.org/simple" }
301
+ sdist = { url = "https://files.pythonhosted.org/packages/15/c3/fd72a0315bc6c943ced1105aaac6e0ec1be57c70d8a616bd05acaa21ffee/av-16.0.1.tar.gz", hash = "sha256:dd2ce779fa0b5f5889a6d9e00fbbbc39f58e247e52d31044272648fe16ff1dbf", size = 3904030, upload-time = "2025-10-13T12:28:51.082Z" }
302
+ wheels = [
303
+ { url = "https://files.pythonhosted.org/packages/49/d3/f2a483c5273fccd556dfa1fce14fab3b5d6d213b46e28e54e254465a2255/av-16.0.1-cp311-cp311-macosx_11_0_x86_64.whl", hash = "sha256:e310d1fb42879df9bad2152a8db6d2ff8bf332c8c36349a09d62cc122f5070fb", size = 27191982, upload-time = "2025-10-13T12:25:10.622Z" },
304
+ { url = "https://files.pythonhosted.org/packages/e0/39/dff28bd252131b3befd09d8587992fe18c09d5125eaefc83a6434d5f56ff/av-16.0.1-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:2f4b357e5615457a84e6b6290916b22864b76b43d5079e1a73bc27581a5b9bac", size = 21760305, upload-time = "2025-10-13T12:25:14.882Z" },
305
+ { url = "https://files.pythonhosted.org/packages/4a/4d/2312d50a09c84a9b4269f7fea5de84f05dd2b7c7113dd961d31fad6c64c4/av-16.0.1-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:286665c77034c3a98080169b8b5586d5568a15da81fbcdaf8099252f2d232d7c", size = 38691616, upload-time = "2025-10-13T12:25:20.063Z" },
306
+ { url = "https://files.pythonhosted.org/packages/15/9a/3d2d30b56252f998e53fced13720e2ce809c4db477110f944034e0fa4c9f/av-16.0.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:f88de8e5b8ea29e41af4d8d61df108323d050ccfbc90f15b13ec1f99ce0e841e", size = 40216464, upload-time = "2025-10-13T12:25:24.848Z" },
307
+ { url = "https://files.pythonhosted.org/packages/98/cb/3860054794a47715b4be0006105158c7119a57be58d9e8882b72e4d4e1dd/av-16.0.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0cdb71ebe4d1b241cf700f8f0c44a7d2a6602b921e16547dd68c0842113736e1", size = 40094077, upload-time = "2025-10-13T12:25:30.238Z" },
308
+ { url = "https://files.pythonhosted.org/packages/41/58/79830fb8af0a89c015250f7864bbd427dff09c70575c97847055f8a302f7/av-16.0.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:28c27a65d40e8cf82b6db2543f8feeb8b56d36c1938f50773494cd3b073c7223", size = 41279948, upload-time = "2025-10-13T12:25:35.24Z" },
309
+ { url = "https://files.pythonhosted.org/packages/83/79/6e1463b04382f379f857113b851cf5f9d580a2f7bd794211cd75352f4e04/av-16.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:ffea39ac7574f234f5168f9b9602e8d4ecdd81853238ec4d661001f03a6d3f64", size = 32297586, upload-time = "2025-10-13T12:25:39.826Z" },
310
+ { url = "https://files.pythonhosted.org/packages/44/78/12a11d7a44fdd8b26a65e2efa1d8a5826733c8887a989a78306ec4785956/av-16.0.1-cp312-cp312-macosx_11_0_x86_64.whl", hash = "sha256:e41a8fef85dfb2c717349f9ff74f92f9560122a9f1a94b1c6c9a8a9c9462ba71", size = 27206375, upload-time = "2025-10-13T12:25:44.423Z" },
311
+ { url = "https://files.pythonhosted.org/packages/27/19/3a4d3882852a0ee136121979ce46f6d2867b974eb217a2c9a070939f55ad/av-16.0.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:6352a64b25c9f985d4f279c2902db9a92424e6f2c972161e67119616f0796cb9", size = 21752603, upload-time = "2025-10-13T12:25:49.122Z" },
312
+ { url = "https://files.pythonhosted.org/packages/cb/6e/f7abefba6e008e2f69bebb9a17ba38ce1df240c79b36a5b5fcacf8c8fcfd/av-16.0.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:5201f7b4b5ed2128118cb90c2a6d64feedb0586ca7c783176896c78ffb4bbd5c", size = 38931978, upload-time = "2025-10-13T12:25:55.021Z" },
313
+ { url = "https://files.pythonhosted.org/packages/b2/7a/1305243ab47f724fdd99ddef7309a594e669af7f0e655e11bdd2c325dfae/av-16.0.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:daecc2072b82b6a942acbdaa9a2e00c05234c61fef976b22713983c020b07992", size = 40549383, upload-time = "2025-10-13T12:26:00.897Z" },
314
+ { url = "https://files.pythonhosted.org/packages/32/b2/357cc063185043eb757b4a48782bff780826103bcad1eb40c3ddfc050b7e/av-16.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6573da96e8bebc3536860a7def108d7dbe1875c86517072431ced702447e6aea", size = 40241993, upload-time = "2025-10-13T12:26:06.993Z" },
315
+ { url = "https://files.pythonhosted.org/packages/20/bb/ced42a4588ba168bf0ef1e9d016982e3ba09fde6992f1dda586fd20dcf71/av-16.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4bc064e48a8de6c087b97dd27cf4ef8c13073f0793108fbce3ecd721201b2502", size = 41532235, upload-time = "2025-10-13T12:26:12.488Z" },
316
+ { url = "https://files.pythonhosted.org/packages/15/37/c7811eca0f318d5fd3212f7e8c3d8335f75a54907c97a89213dc580b8056/av-16.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0c669b6b6668c8ae74451c15ec6d6d8a36e4c3803dc5d9910f607a174dd18f17", size = 32296912, upload-time = "2025-10-13T12:26:19.187Z" },
317
+ { url = "https://files.pythonhosted.org/packages/86/59/972f199ccc4f8c9e51f59e0f8962a09407396b3f6d11355e2c697ba555f9/av-16.0.1-cp313-cp313-macosx_11_0_x86_64.whl", hash = "sha256:4c61c6c120f5c5d95c711caf54e2c4a9fb2f1e613ac0a9c273d895f6b2602e44", size = 27170433, upload-time = "2025-10-13T12:26:24.673Z" },
318
+ { url = "https://files.pythonhosted.org/packages/53/9d/0514cbc185fb20353ab25da54197fbd169a233e39efcbb26533c36a9dbb9/av-16.0.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:7ecc2e41320c69095f44aff93470a0d32c30892b2dbad0a08040441c81efa379", size = 21717654, upload-time = "2025-10-13T12:26:29.12Z" },
319
+ { url = "https://files.pythonhosted.org/packages/32/8c/881409dd124b4e07d909d2b70568acb21126fc747656390840a2238651c9/av-16.0.1-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:036f0554d6faef3f4a94acaeb0cedd388e3ab96eb0eb5a14ec27c17369c466c9", size = 38651601, upload-time = "2025-10-13T12:26:33.919Z" },
320
+ { url = "https://files.pythonhosted.org/packages/35/fd/867ba4cc3ab504442dc89b0c117e6a994fc62782eb634c8f31304586f93e/av-16.0.1-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:876415470a62e4a3550cc38db2fc0094c25e64eea34d7293b7454125d5958190", size = 40278604, upload-time = "2025-10-13T12:26:39.2Z" },
321
+ { url = "https://files.pythonhosted.org/packages/b3/87/63cde866c0af09a1fa9727b4f40b34d71b0535785f5665c27894306f1fbc/av-16.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:56902a06bd0828d13f13352874c370670882048267191ff5829534b611ba3956", size = 39984854, upload-time = "2025-10-13T12:26:44.581Z" },
322
+ { url = "https://files.pythonhosted.org/packages/71/3b/8f40a708bff0e6b0f957836e2ef1f4d4429041cf8d99a415a77ead8ac8a3/av-16.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fe988c2bf0fc2d952858f791f18377ea4ae4e19ba3504793799cd6c2a2562edf", size = 41270352, upload-time = "2025-10-13T12:26:50.817Z" },
323
+ { url = "https://files.pythonhosted.org/packages/1e/b5/c114292cb58a7269405ae13b7ba48c7d7bfeebbb2e4e66c8073c065a4430/av-16.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:708a66c248848029bf518f0482b81c5803846f1b597ef8013b19c014470b620f", size = 32273242, upload-time = "2025-10-13T12:26:55.788Z" },
324
+ { url = "https://files.pythonhosted.org/packages/ff/e9/a5b714bc078fdcca8b46c8a0b38484ae5c24cd81d9c1703d3e8ae2b57259/av-16.0.1-cp313-cp313t-macosx_11_0_x86_64.whl", hash = "sha256:79a77ee452537030c21a0b41139bedaf16629636bf764b634e93b99c9d5f4558", size = 27248984, upload-time = "2025-10-13T12:27:00.564Z" },
325
+ { url = "https://files.pythonhosted.org/packages/06/ef/ff777aaf1f88e3f6ce94aca4c5806a0c360e68d48f9d9f0214e42650f740/av-16.0.1-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:080823a6ff712f81e7089ae9756fb1512ca1742a138556a852ce50f58e457213", size = 21828098, upload-time = "2025-10-13T12:27:05.433Z" },
326
+ { url = "https://files.pythonhosted.org/packages/34/d7/a484358d24a42bedde97f61f5d6ee568a7dd866d9df6e33731378db92d9e/av-16.0.1-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:04e00124afa8b46a850ed48951ddda61de874407fb8307d6a875bba659d5727e", size = 40051697, upload-time = "2025-10-13T12:27:10.525Z" },
327
+ { url = "https://files.pythonhosted.org/packages/73/87/6772d6080837da5d5c810a98a95bde6977e1f5a6e2e759e8c9292af9ec69/av-16.0.1-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:bc098c1c6dc4e7080629a7e9560e67bd4b5654951e17e5ddfd2b1515cfcd37db", size = 41352596, upload-time = "2025-10-13T12:27:16.217Z" },
328
+ { url = "https://files.pythonhosted.org/packages/bd/58/fe448c60cf7f85640a0ed8936f16bac874846aa35e1baa521028949c1ea3/av-16.0.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:e6ffd3559a72c46a76aa622630751a821499ba5a780b0047ecc75105d43a6b61", size = 41183156, upload-time = "2025-10-13T12:27:21.574Z" },
329
+ { url = "https://files.pythonhosted.org/packages/85/c6/a039a0979d0c278e1bed6758d5a6186416c3ccb8081970df893fdf9a0d99/av-16.0.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:7a3f1a36b550adadd7513f4f5ee956f9e06b01a88e59f3150ef5fec6879d6f79", size = 42302331, upload-time = "2025-10-13T12:27:26.953Z" },
330
+ { url = "https://files.pythonhosted.org/packages/18/7b/2ca4a9e3609ff155436dac384e360f530919cb1e328491f7df294be0f0dc/av-16.0.1-cp313-cp313t-win_amd64.whl", hash = "sha256:c6de794abe52b8c0be55d8bb09ade05905efa74b1a5ab4860b4b9c2bfb6578bf", size = 32462194, upload-time = "2025-10-13T12:27:32.942Z" },
331
+ { url = "https://files.pythonhosted.org/packages/14/9a/6d17e379906cf53a7a44dfac9cf7e4b2e7df2082ba2dbf07126055effcc1/av-16.0.1-cp314-cp314-macosx_11_0_x86_64.whl", hash = "sha256:4b55ba69a943ae592ad7900da67129422954789de9dc384685d6b529925f542e", size = 27167101, upload-time = "2025-10-13T12:27:38.886Z" },
332
+ { url = "https://files.pythonhosted.org/packages/6c/34/891816cd82d5646cb5a51d201d20be0a578232536d083b7d939734258067/av-16.0.1-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:d4a0c47b6c9bbadad8909b82847f5fe64a608ad392f0b01704e427349bcd9a47", size = 21722708, upload-time = "2025-10-13T12:27:43.29Z" },
333
+ { url = "https://files.pythonhosted.org/packages/1d/20/c24ad34038423ab8c9728cef3301e0861727c188442dcfd70a4a10834c63/av-16.0.1-cp314-cp314-manylinux_2_28_aarch64.whl", hash = "sha256:8bba52f3035708456f6b1994d10b0371b45cfd8f917b5e84ff81aef4ec2f08bf", size = 38638842, upload-time = "2025-10-13T12:27:49.776Z" },
334
+ { url = "https://files.pythonhosted.org/packages/d7/32/034412309572ba3ad713079d07a3ffc13739263321aece54a3055d7a4f1f/av-16.0.1-cp314-cp314-manylinux_2_28_x86_64.whl", hash = "sha256:08e34c7e7b5e55e29931180bbe21095e1874ac120992bf6b8615d39574487617", size = 40197789, upload-time = "2025-10-13T12:27:55.688Z" },
335
+ { url = "https://files.pythonhosted.org/packages/fb/9c/40496298c32f9094e7df28641c5c58aa6fb07554dc232a9ac98a9894376f/av-16.0.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:0d6250ab9db80c641b299987027c987f14935ea837ea4c02c5f5182f6b69d9e5", size = 39980829, upload-time = "2025-10-13T12:28:01.507Z" },
336
+ { url = "https://files.pythonhosted.org/packages/4a/7e/5c38268ac1d424f309b13b2de4597ad28daea6039ee5af061e62918b12a8/av-16.0.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:7b621f28d8bcbb07cdcd7b18943ddc040739ad304545715ae733873b6e1b739d", size = 41205928, upload-time = "2025-10-13T12:28:08.431Z" },
337
+ { url = "https://files.pythonhosted.org/packages/e3/07/3176e02692d8753a6c4606021c60e4031341afb56292178eee633b6760a4/av-16.0.1-cp314-cp314-win_amd64.whl", hash = "sha256:92101f49082392580c9dba4ba2fe5b931b3bb0fb75a1a848bfb9a11ded68be91", size = 32272836, upload-time = "2025-10-13T12:28:13.405Z" },
338
+ { url = "https://files.pythonhosted.org/packages/8a/47/10e03b88de097385d1550cbb6d8de96159131705c13adb92bd9b7e677425/av-16.0.1-cp314-cp314t-macosx_11_0_x86_64.whl", hash = "sha256:07c464bf2bc362a154eccc82e235ef64fd3aaf8d76fc8ed63d0ae520943c6d3f", size = 27248864, upload-time = "2025-10-13T12:28:17.467Z" },
339
+ { url = "https://files.pythonhosted.org/packages/b1/60/7447f206bec3e55e81371f1989098baa2fe9adb7b46c149e6937b7e7c1ca/av-16.0.1-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:750da0673864b669c95882c7b25768cd93ece0e47010d74ebcc29dbb14d611f8", size = 21828185, upload-time = "2025-10-13T12:28:21.461Z" },
340
+ { url = "https://files.pythonhosted.org/packages/68/48/ee2680e7a01bc4911bbe902b814346911fa2528697a44f3043ee68e0f07e/av-16.0.1-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:0b7c0d060863b2e341d07cd26851cb9057b7979814148b028fb7ee5d5eb8772d", size = 40040572, upload-time = "2025-10-13T12:28:26.585Z" },
341
+ { url = "https://files.pythonhosted.org/packages/da/68/2c43d28871721ae07cde432d6e36ae2f7035197cbadb43764cc5bf3d4b33/av-16.0.1-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:e67c2eca6023ca7d76b0709c5f392b23a5defba499f4c262411f8155b1482cbd", size = 41344288, upload-time = "2025-10-13T12:28:32.512Z" },
342
+ { url = "https://files.pythonhosted.org/packages/ec/7f/1d801bff43ae1af4758c45eee2eaae64f303bbb460e79f352f08587fd179/av-16.0.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e3243d54d84986e8fbdc1946db634b0c41fe69b6de35a99fa8b763e18503d040", size = 41175142, upload-time = "2025-10-13T12:28:38.356Z" },
343
+ { url = "https://files.pythonhosted.org/packages/e4/06/bb363138687066bbf8997c1433dbd9c81762bae120955ea431fb72d69d26/av-16.0.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:a1bcf73efab5379601e6510abd7afe5f397d0f6defe69b1610c2f37a4a17996b", size = 42293932, upload-time = "2025-10-13T12:28:43.442Z" },
344
+ { url = "https://files.pythonhosted.org/packages/92/15/5e713098a085f970ccf88550194d277d244464d7b3a7365ad92acb4b6dc1/av-16.0.1-cp314-cp314t-win_amd64.whl", hash = "sha256:6368d4ff153d75469d2a3217bc403630dc870a72fe0a014d9135de550d731a86", size = 32460624, upload-time = "2025-10-13T12:28:48.767Z" },
345
+ ]
346
+
347
  [[package]]
348
  name = "brotli"
349
  version = "1.2.0"
 
1189
  { name = "python-multipart" },
1190
  { name = "pytz" },
1191
  { name = "pyyaml" },
1192
+ { name = "qwen-vl-utils" },
1193
  { name = "regex" },
1194
  { name = "requests" },
1195
  { name = "rich" },
 
1215
  { name = "tokenizers" },
1216
  { name = "tomlkit" },
1217
  { name = "torch" },
1218
+ { name = "torchaudio" },
1219
+ { name = "torchvision" },
1220
  { name = "tqdm" },
1221
  { name = "tqdm-multiprocess" },
1222
  { name = "transformers" },
 
1336
  { name = "python-multipart", specifier = "==0.0.20" },
1337
  { name = "pytz", specifier = "==2025.2" },
1338
  { name = "pyyaml", specifier = "==6.0.3" },
1339
+ { name = "qwen-vl-utils", specifier = ">=0.0.14" },
1340
  { name = "regex", specifier = "==2025.11.3" },
1341
  { name = "requests", specifier = "==2.32.5" },
1342
  { name = "rich", specifier = "==14.2.0" },
 
1362
  { name = "tokenizers", specifier = "==0.22.1" },
1363
  { name = "tomlkit", specifier = "==0.13.3" },
1364
  { name = "torch", specifier = "==2.9.1" },
1365
+ { name = "torchaudio", specifier = ">=2.9.1" },
1366
+ { name = "torchvision", specifier = ">=0.24.1" },
1367
  { name = "tqdm", specifier = "==4.67.1" },
1368
  { name = "tqdm-multiprocess", specifier = "==0.0.11" },
1369
  { name = "transformers", git = "https://github.com/huggingface/transformers.git?rev=cac0a28c83cf87b7a05495de3177099c635ba852" },
 
2851
  { url = "https://files.pythonhosted.org/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", size = 149341, upload-time = "2025-09-25T21:32:56.828Z" },
2852
  ]
2853
 
2854
+ [[package]]
2855
+ name = "qwen-vl-utils"
2856
+ version = "0.0.14"
2857
+ source = { registry = "https://pypi.org/simple" }
2858
+ dependencies = [
2859
+ { name = "av" },
2860
+ { name = "packaging" },
2861
+ { name = "pillow" },
2862
+ { name = "requests" },
2863
+ ]
2864
+ sdist = { url = "https://files.pythonhosted.org/packages/b6/b1/ad4fc2260a3badd278b38d642f3b987412f1f6682f0ef2b31b0572d5caa8/qwen_vl_utils-0.0.14.tar.gz", hash = "sha256:9c7cad5ae803b3a10f8bb7194deb12aeacdd032f92f4224e880c73587a7346ad", size = 8453, upload-time = "2025-09-23T09:38:57.532Z" }
2865
+ wheels = [
2866
+ { url = "https://files.pythonhosted.org/packages/c4/43/80f67e0336cb2fc725f8e06f7fe35c1d0fe946f4d2b8b2175e797e07349e/qwen_vl_utils-0.0.14-py3-none-any.whl", hash = "sha256:5e28657bfd031e56bd447c5901b58ddfc3835285ed100f4c56580e0ade054e96", size = 8120, upload-time = "2025-09-23T09:38:56.297Z" },
2867
+ ]
2868
+
2869
  [[package]]
2870
  name = "regex"
2871
  version = "2025.11.3"
 
3438
  { url = "https://files.pythonhosted.org/packages/db/2b/f7818f6ec88758dfd21da46b6cd46af9d1b3433e53ddbb19ad1e0da17f9b/torch-2.9.1-cp314-cp314t-win_amd64.whl", hash = "sha256:c88d3299ddeb2b35dcc31753305612db485ab6f1823e37fb29451c8b2732b87e", size = 111163659, upload-time = "2025-11-12T15:23:20.009Z" },
3439
  ]
3440
 
3441
+ [[package]]
3442
+ name = "torchaudio"
3443
+ version = "2.9.1"
3444
+ source = { registry = "https://pypi.org/simple" }
3445
+ dependencies = [
3446
+ { name = "torch" },
3447
+ ]
3448
+ wheels = [
3449
+ { url = "https://files.pythonhosted.org/packages/3f/6b/34e489fcb4adc4b571a166f2670cc7f156cbe3337867a892fade0a1a5224/torchaudio-2.9.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6e3f5943135701168d30196e2befd46290180cdbb9ee508b167730d51f43208f", size = 807349, upload-time = "2025-11-12T15:25:57.843Z" },
3450
+ { url = "https://files.pythonhosted.org/packages/a6/52/66830da8b638368bc0aef064f3307c88d28b526ff8e60a1fda681466b1b3/torchaudio-2.9.1-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:d192cf3b1b677f6666dad60caf0ce7bab66965751570c694645dd905a6c61724", size = 474291, upload-time = "2025-11-12T15:25:45.21Z" },
3451
+ { url = "https://files.pythonhosted.org/packages/cb/6f/d8f1f36c9f63ddef78f00f8f8ddb9638128ceb5f6824c28bead5af48fc63/torchaudio-2.9.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:8327e21f51dced2b6de3ac6a63f04bae9be9bc213e151f85c76164568c7ebc3d", size = 2058677, upload-time = "2025-11-12T15:25:53.09Z" },
3452
+ { url = "https://files.pythonhosted.org/packages/c3/ef/0ec42e783774bd1dda8bc2489e18b3e9c0a250384e0131cec9f35949f385/torchaudio-2.9.1-cp311-cp311-win_amd64.whl", hash = "sha256:b41339a71b186bad238d94cfb68d4c202db0033088a7b824ce5484674bf67057", size = 664681, upload-time = "2025-11-12T15:25:59.08Z" },
3453
+ { url = "https://files.pythonhosted.org/packages/f1/83/71cbadd7b66753818b5775f2088bad4f721d581de276996df4968000a626/torchaudio-2.9.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7581ef170794c599aed55918e00d0acd9e5c9a0f19400c9a9a840955180365c5", size = 808098, upload-time = "2025-11-12T15:26:01.408Z" },
3454
+ { url = "https://files.pythonhosted.org/packages/ef/2d/32e8bec360459107f9b451cc1a5b6fdd5f1d3e653e65a111502084f21e3a/torchaudio-2.9.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:742f9d24db5f1f46d8c7e29c599fe55b866d92c4a8181fcb95eab12da225ceb0", size = 474604, upload-time = "2025-11-12T15:25:49.122Z" },
3455
+ { url = "https://files.pythonhosted.org/packages/fe/0d/b5af1d55ede1ca07769a2cf71256073d8958e2a5521fc734fc19f5343283/torchaudio-2.9.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:4533fdafba73d7bcfcb5f1225b2cc8974a290ed0fe54c44638d6f440e91b8999", size = 2059899, upload-time = "2025-11-12T15:26:19.363Z" },
3456
+ { url = "https://files.pythonhosted.org/packages/2e/7c/df90eb0b337cbad59296ed91778e32be069330f5186256d4ce9ea603d324/torchaudio-2.9.1-cp312-cp312-win_amd64.whl", hash = "sha256:923dccc67be4a6cbb45c3dcc2d69ee182bda75b09b69bc88cd3bcdfc739883a2", size = 665337, upload-time = "2025-11-12T15:26:07.407Z" },
3457
+ { url = "https://files.pythonhosted.org/packages/c0/1b/3321ad6379ac2d968064704e8d015c31ccae5d1ece070f87fb44b17d90e6/torchaudio-2.9.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:bb69557484c92513a980027ec4cb314b0f43cf4442bbfd97440e66528dbad22d", size = 808136, upload-time = "2025-11-12T15:26:00.276Z" },
3458
+ { url = "https://files.pythonhosted.org/packages/76/e2/fe55b3882157fd57aa131f5bcad90f0329be90827e1c0e0c482662ddef38/torchaudio-2.9.1-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:ba2799ceec5e4373a0aa26df30d608f1eaaefd8ac4a7ae0c3446f63106f5b5a5", size = 474349, upload-time = "2025-11-12T15:26:02.78Z" },
3459
+ { url = "https://files.pythonhosted.org/packages/74/d3/0b090c03cac5a20691507e0945589a696fb10402ccd2457eea47dbf8a71b/torchaudio-2.9.1-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:bc3c8e9a240bfad8bc61f769324a4f3ce5d60eec161369d457c595c35dbb10c7", size = 2060343, upload-time = "2025-11-12T15:26:03.88Z" },
3460
+ { url = "https://files.pythonhosted.org/packages/a0/db/2555cfd428f4bf09a4df1c6f9204d0acc217c46edb35776c16e7a2a9a1c9/torchaudio-2.9.1-cp313-cp313-win_amd64.whl", hash = "sha256:13ee96ea9bbbc85e198cb671273af06f010e6981d7b912d001eef6bc74e23f4f", size = 665301, upload-time = "2025-11-12T15:26:04.952Z" },
3461
+ { url = "https://files.pythonhosted.org/packages/0c/58/e82d8b5f447abdddc950965f1395f36baef3602643dd069100c6369ba73e/torchaudio-2.9.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:9290f6a6409deb1f9113d5aef97ec646eeee6410b6bcc57ab8b57066b54da7c1", size = 813456, upload-time = "2025-11-12T15:26:13.963Z" },
3462
+ { url = "https://files.pythonhosted.org/packages/ce/45/dd9ad6af9bb595095cd98028d270f933760968b92a3497282e31289ef3b4/torchaudio-2.9.1-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:eeae7ca60b64c4bfb78fbd104a089d072b151423d5d2f90da1da00787f03b800", size = 476577, upload-time = "2025-11-12T15:26:09.54Z" },
3463
+ { url = "https://files.pythonhosted.org/packages/79/97/c49aeb01d8a9ced2b8215a38b69b8eafd1afe295a487a73b7030c6ff3396/torchaudio-2.9.1-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:5f445e896215e6f7bba497dc68aab1e6cb077ae0ab3a90095067f16df6a9bb98", size = 2062158, upload-time = "2025-11-12T15:26:10.487Z" },
3464
+ { url = "https://files.pythonhosted.org/packages/ba/70/30b2a0ecca2a0a5e6a8cee8952fdea3872854ea5bcd86fe3df369fdc2543/torchaudio-2.9.1-cp313-cp313t-win_amd64.whl", hash = "sha256:c558ba70d548f7491245ed7a35310f6310d83fc7591f073ab5fed9fd38cef987", size = 669253, upload-time = "2025-11-12T15:26:06.285Z" },
3465
+ { url = "https://files.pythonhosted.org/packages/5b/38/0dabf362f946ab5773d3db3322718d652d70ad12a82f500d54c6c8b9cc88/torchaudio-2.9.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:69a582650279ee16ff9087f99b4234fe5d766e1bf7f0be352db5f46991854c1e", size = 810496, upload-time = "2025-11-12T15:26:11.515Z" },
3466
+ { url = "https://files.pythonhosted.org/packages/05/1c/e05a32ee6868dc05463242db672f23dba5d042423fefcf294db4dac343a8/torchaudio-2.9.1-cp314-cp314-manylinux_2_28_aarch64.whl", hash = "sha256:9c0d004f784c49078017f8217fdc901df0eb9724e50fb269b3a6c99b1d4eae75", size = 474566, upload-time = "2025-11-12T15:26:08.628Z" },
3467
+ { url = "https://files.pythonhosted.org/packages/15/52/8cec1fe90f05b888f9060467e1eb8c27f9295b8729a83d443e3bd7c471d3/torchaudio-2.9.1-cp314-cp314-manylinux_2_28_x86_64.whl", hash = "sha256:d2743b28ff5538d5fdf2ff6657d392852ccdfe640ede46f566b2907ca32d8dca", size = 2060358, upload-time = "2025-11-12T15:26:12.885Z" },
3468
+ { url = "https://files.pythonhosted.org/packages/04/73/6ba396813d714f895f86c82be61b590fbe14255ebe6866f5ea5916c075a3/torchaudio-2.9.1-cp314-cp314-win_amd64.whl", hash = "sha256:234c7a9d4d0a6ed735cd37965baa9a89ca36bdbebece8a6a5ff7727acbb43026", size = 665039, upload-time = "2025-11-12T15:26:18.308Z" },
3469
+ { url = "https://files.pythonhosted.org/packages/9c/f6/237e00a04dea497a40a8567d024dfb39193abec3ca3695ad51919ad633d1/torchaudio-2.9.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:e13cb38971ac259fc4e102282a3e48f6df5f0ab00eb785ca5155e3392d1e86f1", size = 813463, upload-time = "2025-11-12T15:26:16.261Z" },
3470
+ { url = "https://files.pythonhosted.org/packages/57/99/5fcd46a80086030899badeb5a934fab337c88325b3f68c60faa0b672d4d2/torchaudio-2.9.1-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:35c96ed1011b50eaf17948da173b09450cdc5bb7f908687571adb4a4c072c05e", size = 476577, upload-time = "2025-11-12T15:26:17.355Z" },
3471
+ { url = "https://files.pythonhosted.org/packages/a4/4c/bc428f71d5ef728fba2ecb151a3a6d187e6f0b9446b76e4f87e46d2206a3/torchaudio-2.9.1-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:c220c4acf9914cce2dc81c3624d7c84008ef436dc31bcbb89e8f4416d3615a34", size = 2062170, upload-time = "2025-11-12T15:26:20.837Z" },
3472
+ { url = "https://files.pythonhosted.org/packages/07/0e/be41f412e1225bdbd9b7fd7f41a20f070c707f5274b82542eeccf6dc2b79/torchaudio-2.9.1-cp314-cp314t-win_amd64.whl", hash = "sha256:cfd12934c7b54b41d4c79dfd26fbfe88fafa9cc5cc77c074e953bb7018d9322c", size = 669265, upload-time = "2025-11-12T15:26:14.976Z" },
3473
+ ]
3474
+
3475
+ [[package]]
3476
+ name = "torchvision"
3477
+ version = "0.24.1"
3478
+ source = { registry = "https://pypi.org/simple" }
3479
+ dependencies = [
3480
+ { name = "numpy" },
3481
+ { name = "pillow" },
3482
+ { name = "torch" },
3483
+ ]
3484
+ wheels = [
3485
+ { url = "https://files.pythonhosted.org/packages/e7/69/30f5f03752aa1a7c23931d2519b31e557f3f10af5089d787cddf3b903ecf/torchvision-0.24.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:056c525dc875f18fe8e9c27079ada166a7b2755cea5a2199b0bc7f1f8364e600", size = 1891436, upload-time = "2025-11-12T15:25:04.3Z" },
3486
+ { url = "https://files.pythonhosted.org/packages/0c/69/49aae86edb75fe16460b59a191fcc0f568c2378f780bb063850db0fe007a/torchvision-0.24.1-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:1e39619de698e2821d71976c92c8a9e50cdfd1e993507dfb340f2688bfdd8283", size = 2387757, upload-time = "2025-11-12T15:25:06.795Z" },
3487
+ { url = "https://files.pythonhosted.org/packages/11/c9/1dfc3db98797b326f1d0c3f3bb61c83b167a813fc7eab6fcd2edb8c7eb9d/torchvision-0.24.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:a0f106663e60332aa4fcb1ca2159ef8c3f2ed266b0e6df88de261048a840e0df", size = 8047682, upload-time = "2025-11-12T15:25:21.125Z" },
3488
+ { url = "https://files.pythonhosted.org/packages/fa/bb/cfc6a6f6ccc84a534ed1fdf029ae5716dd6ff04e57ed9dc2dab38bf652d5/torchvision-0.24.1-cp311-cp311-win_amd64.whl", hash = "sha256:a9308cdd37d8a42e14a3e7fd9d271830c7fecb150dd929b642f3c1460514599a", size = 4037588, upload-time = "2025-11-12T15:25:14.402Z" },
3489
+ { url = "https://files.pythonhosted.org/packages/f0/af/18e2c6b9538a045f60718a0c5a058908ccb24f88fde8e6f0fc12d5ff7bd3/torchvision-0.24.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e48bf6a8ec95872eb45763f06499f87bd2fb246b9b96cb00aae260fda2f96193", size = 1891433, upload-time = "2025-11-12T15:25:03.232Z" },
3490
+ { url = "https://files.pythonhosted.org/packages/9d/43/600e5cfb0643d10d633124f5982d7abc2170dfd7ce985584ff16edab3e76/torchvision-0.24.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:7fb7590c737ebe3e1c077ad60c0e5e2e56bb26e7bccc3b9d04dbfc34fd09f050", size = 2386737, upload-time = "2025-11-12T15:25:08.288Z" },
3491
+ { url = "https://files.pythonhosted.org/packages/93/b1/db2941526ecddd84884132e2742a55c9311296a6a38627f9e2627f5ac889/torchvision-0.24.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:66a98471fc18cad9064123106d810a75f57f0838eee20edc56233fd8484b0cc7", size = 8049868, upload-time = "2025-11-12T15:25:13.058Z" },
3492
+ { url = "https://files.pythonhosted.org/packages/69/98/16e583f59f86cd59949f59d52bfa8fc286f86341a229a9d15cbe7a694f0c/torchvision-0.24.1-cp312-cp312-win_amd64.whl", hash = "sha256:4aa6cb806eb8541e92c9b313e96192c6b826e9eb0042720e2fa250d021079952", size = 4302006, upload-time = "2025-11-12T15:25:16.184Z" },
3493
+ { url = "https://files.pythonhosted.org/packages/e4/97/ab40550f482577f2788304c27220e8ba02c63313bd74cf2f8920526aac20/torchvision-0.24.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:8a6696db7fb71eadb2c6a48602106e136c785642e598eb1533e0b27744f2cce6", size = 1891435, upload-time = "2025-11-12T15:25:28.642Z" },
3494
+ { url = "https://files.pythonhosted.org/packages/30/65/ac0a3f9be6abdbe4e1d82c915d7e20de97e7fd0e9a277970508b015309f3/torchvision-0.24.1-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:db2125c46f9cb25dc740be831ce3ce99303cfe60439249a41b04fd9f373be671", size = 2338718, upload-time = "2025-11-12T15:25:26.19Z" },
3495
+ { url = "https://files.pythonhosted.org/packages/10/b5/5bba24ff9d325181508501ed7f0c3de8ed3dd2edca0784d48b144b6c5252/torchvision-0.24.1-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:f035f0cacd1f44a8ff6cb7ca3627d84c54d685055961d73a1a9fb9827a5414c8", size = 8049661, upload-time = "2025-11-12T15:25:22.558Z" },
3496
+ { url = "https://files.pythonhosted.org/packages/5c/ec/54a96ae9ab6a0dd66d4bba27771f892e36478a9c3489fa56e51c70abcc4d/torchvision-0.24.1-cp313-cp313-win_amd64.whl", hash = "sha256:16274823b93048e0a29d83415166a2e9e0bf4e1b432668357b657612a4802864", size = 4319808, upload-time = "2025-11-12T15:25:17.318Z" },
3497
+ { url = "https://files.pythonhosted.org/packages/d5/f3/a90a389a7e547f3eb8821b13f96ea7c0563cdefbbbb60a10e08dda9720ff/torchvision-0.24.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e3f96208b4bef54cd60e415545f5200346a65024e04f29a26cd0006dbf9e8e66", size = 2005342, upload-time = "2025-11-12T15:25:11.871Z" },
3498
+ { url = "https://files.pythonhosted.org/packages/a9/fe/ff27d2ed1b524078164bea1062f23d2618a5fc3208e247d6153c18c91a76/torchvision-0.24.1-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:f231f6a4f2aa6522713326d0d2563538fa72d613741ae364f9913027fa52ea35", size = 2341708, upload-time = "2025-11-12T15:25:25.08Z" },
3499
+ { url = "https://files.pythonhosted.org/packages/b1/b9/d6c903495cbdfd2533b3ef6f7b5643ff589ea062f8feb5c206ee79b9d9e5/torchvision-0.24.1-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:1540a9e7f8cf55fe17554482f5a125a7e426347b71de07327d5de6bfd8d17caa", size = 8177239, upload-time = "2025-11-12T15:25:18.554Z" },
3500
+ { url = "https://files.pythonhosted.org/packages/4f/2b/ba02e4261369c3798310483028495cf507e6cb3f394f42e4796981ecf3a7/torchvision-0.24.1-cp313-cp313t-win_amd64.whl", hash = "sha256:d83e16d70ea85d2f196d678bfb702c36be7a655b003abed84e465988b6128938", size = 4251604, upload-time = "2025-11-12T15:25:34.069Z" },
3501
+ { url = "https://files.pythonhosted.org/packages/42/84/577b2cef8f32094add5f52887867da4c2a3e6b4261538447e9b48eb25812/torchvision-0.24.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:cccf4b4fec7fdfcd3431b9ea75d1588c0a8596d0333245dafebee0462abe3388", size = 2005319, upload-time = "2025-11-12T15:25:23.827Z" },
3502
+ { url = "https://files.pythonhosted.org/packages/5f/34/ecb786bffe0159a3b49941a61caaae089853132f3cd1e8f555e3621f7e6f/torchvision-0.24.1-cp314-cp314-manylinux_2_28_aarch64.whl", hash = "sha256:1b495edd3a8f9911292424117544f0b4ab780452e998649425d1f4b2bed6695f", size = 2338844, upload-time = "2025-11-12T15:25:32.625Z" },
3503
+ { url = "https://files.pythonhosted.org/packages/51/99/a84623786a6969504c87f2dc3892200f586ee13503f519d282faab0bb4f0/torchvision-0.24.1-cp314-cp314-manylinux_2_28_x86_64.whl", hash = "sha256:ab211e1807dc3e53acf8f6638df9a7444c80c0ad050466e8d652b3e83776987b", size = 8175144, upload-time = "2025-11-12T15:25:31.355Z" },
3504
+ { url = "https://files.pythonhosted.org/packages/6d/ba/8fae3525b233e109317ce6a9c1de922ab2881737b029a7e88021f81e068f/torchvision-0.24.1-cp314-cp314-win_amd64.whl", hash = "sha256:18f9cb60e64b37b551cd605a3d62c15730c086362b40682d23e24b616a697d41", size = 4234459, upload-time = "2025-11-12T15:25:19.859Z" },
3505
+ { url = "https://files.pythonhosted.org/packages/50/33/481602c1c72d0485d4b3a6b48c9534b71c2957c9d83bf860eb837bf5a620/torchvision-0.24.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ec9d7379c519428395e4ffda4dbb99ec56be64b0a75b95989e00f9ec7ae0b2d7", size = 2005336, upload-time = "2025-11-12T15:25:27.225Z" },
3506
+ { url = "https://files.pythonhosted.org/packages/d0/7f/372de60bf3dd8f5593bd0d03f4aecf0d1fd58f5bc6943618d9d913f5e6d5/torchvision-0.24.1-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:af9201184c2712d808bd4eb656899011afdfce1e83721c7cb08000034df353fe", size = 2341704, upload-time = "2025-11-12T15:25:29.857Z" },
3507
+ { url = "https://files.pythonhosted.org/packages/36/9b/0f3b9ff3d0225ee2324ec663de0e7fb3eb855615ca958ac1875f22f1f8e5/torchvision-0.24.1-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:9ef95d819fd6df81bc7cc97b8f21a15d2c0d3ac5dbfaab5cbc2d2ce57114b19e", size = 8177422, upload-time = "2025-11-12T15:25:37.357Z" },
3508
+ { url = "https://files.pythonhosted.org/packages/d6/ab/e2bcc7c2f13d882a58f8b30ff86f794210b075736587ea50f8c545834f8a/torchvision-0.24.1-cp314-cp314t-win_amd64.whl", hash = "sha256:480b271d6edff83ac2e8d69bbb4cf2073f93366516a50d48f140ccfceedb002e", size = 4335190, upload-time = "2025-11-12T15:25:35.745Z" },
3509
+ ]
3510
+
3511
  [[package]]
3512
  name = "tqdm"
3513
  version = "4.67.1"