summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortanaka takashi <isazaka@gmail.com>2026-09-12 18:52:14 +0900
committertanaka takashi <isazaka@gmail.com>2026-09-12 18:52:14 +0900
commit34fe9ead73abfa5ce50fd2351cca8a844099df36 (patch)
tree1c61ecc55ccfe68cfe1ede96c28d302b72b78e2b
parent3e47e9bddb5c859dec28cd39732979a5eeca51b8 (diff)
feat: CUDA 13.2でgenerate_imageの実GPU生成に対応
CPU版PyTorchが選択されていた依存設定を修正し、RTX 5050上でStable Diffusion 1.5のMCP generate_imageを実行できる構成へ更新。併せてVAEとLoRAの仕様・実装・テストを明確化した。 CUDA / 依存管理: - torch 2.14.0+cu132とtorchvision 0.29.0+cu132をruntime依存へ固定 - PyTorch CUDA 13.2のexplicit indexとtool.uv.sourcesをuv設定へ追加 - uv.lockをCUDA wheelに更新し、uv sync後もCPU版へ戻らないよう修正 - RTX 5050の認識、CUDA 13.2 runtime、GPU FP16演算を確認 モデル・オフライン実行: - model.root配下のhuggingface cacheをDiffusersへ明示的に渡すよう変更 - checkpoint、外部VAE、ControlNetのsingle-file loadをlocal_files_onlyで統一 - SD 1.5 checkpointと公式pipeline構成・tokenizerによるオフラインloadを確認 - data/config.generate-image.tomlにText-to-Image用最小設定を追加 - data/MODELS.mdにモデル出典、容量、SHA-256、cache構成、検証結果を記録 - 4.27GBのcheckpoint、cache、生成画像はGit管理対象外を維持 VAE / LoRA: - Stable Diffusion pipelineではVAE componentが必須であることを仕様・設計・設定文書に明記 - model.vaeはVAEの有無ではなく外部VAE差し替えの任意設定であることを明確化 - checkpoint内蔵VAEも外部VAEもない場合はpipeline初期化を失敗させる検証を追加 - 複数LoRAを起動時にロードし各weightでset_adaptersする既存動作を文書化 - generate_imageを含む全生成ツールへ設定済みLoRAが共通適用されることを明記 - 外部VAE差し替え、VAE欠落、複数LoRA適用のunit testを追加 動作確認: - 実backendとin-process MCP Clientを使うsmoke_generate_image.pyを追加 - RTX 5050でSD 1.5、512x512、20 stepsのgenerate_imageを実行 - PNG ImageContent返却とseed、size、mode、timestamp、処理時間metadataを確認 - GPU生成時間18.313秒 - pytest: 32 passed - Ruff lint/format: passed - Pyright: 0 errors, 0 warnings - uv lock check: passed
-rw-r--r--.gitignore2
-rw-r--r--README.md18
-rw-r--r--data/MODELS.md66
-rw-r--r--data/config.generate-image.toml13
-rw-r--r--doc/Design.md7
-rw-r--r--doc/Specifications.md7
-rw-r--r--doc/config.md8
-rw-r--r--pyproject.toml12
-rw-r--r--script/smoke_generate_image.py60
-rw-r--r--src/mcp_sd15/pipeline_factory.py12
-rw-r--r--tests/test_pipeline_factory.py99
-rw-r--r--uv.lock90
12 files changed, 337 insertions, 57 deletions
diff --git a/.gitignore b/.gitignore
index 0d69e9d..e78ff7c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,4 +5,4 @@ __pycache__/
.pyright/
*.py[cod]
outputs/
-data/ \ No newline at end of file
+/data/
diff --git a/README.md b/README.md
index d88e388..1eab39c 100644
--- a/README.md
+++ b/README.md
@@ -5,11 +5,15 @@
## セットアップ
-1. `config.example.toml` をコピーし、モデルの root とファイル名を設定します。
-2. `uv sync` を実行します。
-3. `uv run mcp-sd15 --config path/to/config.toml` で起動します。
+1. NVIDIA driverがCUDA 13.2対応PyTorchを実行できることを`nvidia-smi`で確認します。
+2. `config.example.toml` をコピーし、モデルの root とファイル名を設定します。
+3. `uv sync` を実行します。PyTorchは専用indexからCUDA 13.2版が導入されます。
+4. `uv run mcp-sd15 --config path/to/config.toml` で起動します。
モデルは `<root>/checkpoints`、`vae`、`lora`、`controlnet` からだけ読み込みます。
+VAE componentは生成に常に必要です。`model.vae`を省略した場合はcheckpoint内蔵VAEを使い、
+指定した場合だけ外部VAEへ置き換えます。設定されたLoRAは起動時にすべてロードされ、3つの
+生成ツールに共通して適用されます。MCP呼び出しごとのLoRA切替には対応しません。
Depth/Openpose の annotator 重みは `controlnet_aux` のローカルキャッシュに事前配置して
ください。推論時のダウンロードは行いません。
@@ -20,3 +24,11 @@ mask は白い領域が再生成対象です。出力は PNG の画像 content ã
GPU を使わないテストは `uv run pytest`、lint は `uv run ruff check .`、型検査は
`uv run pyright` で実行できます。実モデルの smoke test は環境依存のため自動テストには
含めていません。
+
+実GPUとMCP経路を使う`generate_image` smoke testは次のように実行できます。
+
+```powershell
+uv run python script\smoke_generate_image.py `
+ --config data\config.generate-image.toml `
+ --output data\outputs\generate-image-mcp-512.png
+```
diff --git a/data/MODELS.md b/data/MODELS.md
new file mode 100644
index 0000000..443737b
--- /dev/null
+++ b/data/MODELS.md
@@ -0,0 +1,66 @@
+# generate_image test assets
+
+## Root
+
+```text
+C:\Users\isaza\src\python\ollama-web\data\mcp\sd15-mcp\data
+```
+
+## Model
+
+| Item | Value |
+|---|---|
+| Repository | `stable-diffusion-v1-5/stable-diffusion-v1-5` |
+| File | `checkpoints/v1-5-pruned-emaonly.safetensors` |
+| Size | 4,265,146,304 bytes |
+| SHA-256 | `6ce0161689b3853acaa03779ec93eafe75a02f4ced659bee03f50797806fa2fa` |
+| License | CreativeML OpenRAIL-M |
+| Source | <https://huggingface.co/stable-diffusion-v1-5/stable-diffusion-v1-5> |
+
+`generate_image`の動作確認に必要なbase checkpointだけを配置している。VAEはcheckpoint内蔵の
+ものを使用し、LoRAとControlNetは使用しない。
+
+## Supporting files
+
+`huggingface/`には、単一checkpointをDiffusersでオフラインロードするために必要な公式の
+pipeline構成、scheduler構成、component構成、CLIP tokenizerがcacheされている。
+
+サーバは`model.root/huggingface`を明示的なcache directoryとして使用し、
+`local_files_only=true`でモデルをロードする。
+
+## Configuration
+
+動作確認用設定は`config.generate-image.toml`である。
+
+```powershell
+uv run mcp-sd15 --config data\config.generate-image.toml
+```
+
+生成PNGは`outputs/`へ保存される。
+
+## Verification
+
+- configの読込とcheckpointパス検証: 成功
+- Safetensors header/tensor index読込: 成功、1,145 tensors
+- SHA-256照合: Hugging Face掲載値と一致
+- ネットワーク遮断状態でのDiffusers pipeline構築: 成功
+- CPU smoke inference: 成功
+ - prompt: `a small red cube on a white table`
+ - seed: `42`
+ - size: `64 x 64`
+ - steps: `1`
+ - output: `outputs/model-smoke-64.png`
+
+- CUDA runtime: PyTorch `2.14.0+cu132` / CUDA `13.2`
+- GPU: NVIDIA GeForce RTX 5050、8,151 MiB
+- MCP `generate_image` 512px GPU inference: 成功
+ - size: `512 x 512`
+ - steps: `20`
+ - output: `outputs/generate-image-mcp-512.png`
+ - generation elapsed: 約19秒
+
+## Safety note
+
+Diffusersのsingle-file pipelineではsafety checkerが自動ロードされず、現在のサーバ出力は
+フィルタされない。公開サービスとして提供する場合は、ライセンス条件を確認したうえで
+safety checkerまたは同等の出力制御を別途実装すること。
diff --git a/data/config.generate-image.toml b/data/config.generate-image.toml
new file mode 100644
index 0000000..f9de573
--- /dev/null
+++ b/data/config.generate-image.toml
@@ -0,0 +1,13 @@
+[model]
+root = "."
+checkpoint = "v1-5-pruned-emaonly.safetensors"
+
+[generation]
+steps = 20
+cfg_scale = 7.0
+scheduler = "dpmpp_2m"
+default_size = "square_512"
+
+[output]
+enabled = true
+directory = "./outputs"
diff --git a/doc/Design.md b/doc/Design.md
index f22c24d..fd4ac63 100644
--- a/doc/Design.md
+++ b/doc/Design.md
@@ -113,7 +113,7 @@ mcp-sd15/
| 5 | checkpoint存在確認 |
| 6 | VAE / LoRA / ControlNet存在確認 |
| 7 | Base SD1.x pipelineを構築 |
-| 8 | VAEを適用 |
+| 8 | checkpoint内蔵VAEを確認し、外部VAE指定時は差し替え |
| 9 | LoRAを順次ロード |
| 10 | GPUへ配置 |
| 11 | MCP Toolを公開 |
@@ -170,7 +170,7 @@ Pydanticは必須とせず、`tomllib + dataclass + 明示的validation`を基æœ
| 機能 | 実装方針 |
|---|---|
| Base model | SD1.x互換checkpointをロード |
-| VAE | 設定された場合のみ置換 |
+| VAE | pipeline componentとして必須。設定された外部VAEがある場合のみ置換 |
| LoRA | 複数adapterをロード |
| LoRA weight | `set_adapters`相当で適用 |
| LoRA fuse | 将来オプション。初期実装では必須としない |
@@ -349,7 +349,8 @@ GPU
| Package | 用途 |
|---|---|
| `mcp` | MCP server |
-| `torch` | CUDA / Tensor |
+| `torch` | CUDA 13.2 / Tensor |
+| `torchvision` | PyTorch画像model依存 |
| `diffusers` | SD / ControlNet |
| `transformers` | CLIP |
| `peft` | LoRA |
diff --git a/doc/Specifications.md b/doc/Specifications.md
index 3d2cd28..0fb6451 100644
--- a/doc/Specifications.md
+++ b/doc/Specifications.md
@@ -14,7 +14,7 @@ LLM側には生成意図に必要な最小限の入力のみを公開し、モãƒ
|---|---|
| 対応モデル | Stable Diffusion 1.x互換モデル |
| モデル差し替え | 対応 |
-| VAE差し替え | 対応 |
+| VAE | 常時使用。checkpoint内蔵VAEまたは外部VAEへの差し替え |
| LoRA | 複数指定・重み指定に対応 |
| ControlNet | ControlNet 1.1 Depth / Openpose / Inpaint |
| MCP経由のモデル変更 | 非対応 |
@@ -127,7 +127,8 @@ LLM側には生成意図に必要な最小限の入力のみを公開し、モãƒ
| 項目 | 仕様 |
|---|---|
| Base checkpoint | 1ファイル |
-| VAE | 0または1ファイル |
+| VAE component | 必須。通常はcheckpoint内蔵VAEを使用 |
+| 外部VAE | 0または1ファイル。指定時は内蔵VAEを差し替え |
| LoRA | 0個以上 |
| LoRA weight | LoRAごとに指定 |
| ControlNet | Depth / Openpose / Inpaintを個別設定 |
@@ -246,7 +247,7 @@ directory = "./outputs"
| ID | 完了条件 |
|---|---|
-| G1 | TOMLからcheckpoint / VAE / 複数LoRAをロードできる |
+| G1 | TOMLからcheckpoint / 任意の外部VAE / 複数LoRAをロードでき、VAE componentが常に存在する |
| G2 | `generate_image`でPNG画像を1枚生成できる |
| G3 | Depth / Openpose / Openpose Full生成が動作する |
| G4 | Inpaintが元画像+maskから動作する |
diff --git a/doc/config.md b/doc/config.md
index f200cdc..c619d2d 100644
--- a/doc/config.md
+++ b/doc/config.md
@@ -19,6 +19,8 @@ uv run mcp-sd15 --config C:\path\to\config.toml
<model.root>/
├─ checkpoints/
│ └─ <model.checkpoint>
+├─ huggingface/
+│ └─ Diffusersが使用するローカル構成cache
├─ vae/
│ └─ <model.vae>
├─ lora/
@@ -79,14 +81,20 @@ vae = "vae.safetensors"
- `<root>/checkpoints/<checkpoint>`として解決
- 起動時にファイルの存在を確認
- サーバ初期化時にSD1.x pipelineとしてロードできなければ起動失敗
+- 単一checkpointの読込に必要なDiffusers構成は`<root>/huggingface` cacheから取得
### `vae`
+- Stable Diffusion pipelineのVAE component自体は必須
- 任意のファイル名
- 指定した場合は`<root>/vae/<vae>`として解決し、base modelのVAEを置換
- 指定時は起動時にファイルの存在を確認
- 省略時はcheckpointに含まれるVAEを使用
+`model.vae`が任意なのはVAE処理を省略できるという意味ではなく、外部VAEファイルによる
+差し替えが任意という意味である。checkpoint内にもVAEが存在しない場合はpipelineを構築
+できないため起動に失敗する。
+
## 5. `[[model.lora]]`
LoRAごとにarray of tablesを追加する。0個以上指定でき、記述順にadapter名が割り当てられる。
diff --git a/pyproject.toml b/pyproject.toml
index 5b9cd71..ce5350f 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -18,7 +18,8 @@ dependencies = [
"peft>=0.13",
"pillow>=10.4",
"safetensors>=0.4",
- "torch>=2.4",
+ "torch==2.14.0+cu132",
+ "torchvision==0.29.0+cu132",
"transformers>=4.45",
]
@@ -33,6 +34,15 @@ dev = [
"ruff>=0.8",
]
+[tool.uv.sources]
+torch = { index = "pytorch-cu132" }
+torchvision = { index = "pytorch-cu132" }
+
+[[tool.uv.index]]
+name = "pytorch-cu132"
+url = "https://download.pytorch.org/whl/cu132"
+explicit = true
+
[tool.hatch.build.targets.wheel]
packages = ["src/mcp_sd15"]
diff --git a/script/smoke_generate_image.py b/script/smoke_generate_image.py
new file mode 100644
index 0000000..9b52253
--- /dev/null
+++ b/script/smoke_generate_image.py
@@ -0,0 +1,60 @@
+"""Run generate_image through an in-process MCP client with the real GPU backend."""
+
+from __future__ import annotations
+
+import argparse
+import asyncio
+import base64
+from pathlib import Path
+
+from mcp import Client
+from mcp.types import ImageContent
+
+from mcp_sd15.config import load_config
+from mcp_sd15.model_manager import ModelManager
+from mcp_sd15.server import create_server
+from mcp_sd15.service import ImageGenerationService
+
+
+def parse_args() -> argparse.Namespace:
+ parser = argparse.ArgumentParser()
+ parser.add_argument("--config", type=Path, required=True)
+ parser.add_argument("--output", type=Path, required=True)
+ parser.add_argument(
+ "--prompt",
+ default="a small red cube on a white table, studio photograph, detailed",
+ )
+ parser.add_argument("--negative-prompt", default="blurry, low quality")
+ parser.add_argument("--size", default="square_512")
+ return parser.parse_args()
+
+
+async def run(args: argparse.Namespace) -> None:
+ config = load_config(args.config)
+ backend = ModelManager(config)
+ server = create_server(ImageGenerationService(config, backend))
+ async with Client(server, raise_exceptions=True) as client:
+ result = await client.call_tool(
+ "generate_image",
+ {
+ "positive_prompt": args.prompt,
+ "negative_prompt": args.negative_prompt,
+ "size": args.size,
+ },
+ )
+ if result.is_error or len(result.content) != 1:
+ raise RuntimeError(f"generate_image failed: {result}")
+ content = result.content[0]
+ if not isinstance(content, ImageContent) or content.mime_type != "image/png":
+ raise RuntimeError(f"generate_image returned unexpected content: {content}")
+ args.output.parent.mkdir(parents=True, exist_ok=True)
+ args.output.write_bytes(base64.b64decode(content.data, validate=True))
+ print(f"generated={args.output.resolve()}")
+
+
+def main() -> None:
+ asyncio.run(run(parse_args()))
+
+
+if __name__ == "__main__":
+ main()
diff --git a/src/mcp_sd15/pipeline_factory.py b/src/mcp_sd15/pipeline_factory.py
index cd92690..12d95ba 100644
--- a/src/mcp_sd15/pipeline_factory.py
+++ b/src/mcp_sd15/pipeline_factory.py
@@ -28,11 +28,13 @@ class PipelineFactory:
def create_base(self) -> Any:
torch, diffusers = self._runtime()
+ cache_dir = str(self.config.model.root / "huggingface")
try:
pipeline = diffusers.StableDiffusionPipeline.from_single_file(
str(self.config.model.checkpoint_path()),
torch_dtype=torch.float16,
local_files_only=True,
+ cache_dir=cache_dir,
)
vae_path = self.config.model.vae_path()
if vae_path is not None:
@@ -40,6 +42,11 @@ class PipelineFactory:
str(vae_path),
torch_dtype=torch.float16,
local_files_only=True,
+ cache_dir=cache_dir,
+ )
+ if getattr(pipeline, "vae", None) is None:
+ raise ConfigError(
+ "the checkpoint does not provide a VAE and no external VAE was loaded"
)
adapter_names: list[str] = []
adapter_weights: list[float] = []
@@ -69,7 +76,10 @@ class PipelineFactory:
torch, diffusers = self._runtime()
try:
return diffusers.ControlNetModel.from_single_file(
- str(path), torch_dtype=torch.float16, local_files_only=True
+ str(path),
+ torch_dtype=torch.float16,
+ local_files_only=True,
+ cache_dir=str(self.config.model.root / "huggingface"),
).to("cuda")
except Exception as exc:
raise ConfigError(f"failed to load ControlNet model {path}: {exc}") from exc
diff --git a/tests/test_pipeline_factory.py b/tests/test_pipeline_factory.py
new file mode 100644
index 0000000..454a5b1
--- /dev/null
+++ b/tests/test_pipeline_factory.py
@@ -0,0 +1,99 @@
+from __future__ import annotations
+
+from dataclasses import replace
+from types import SimpleNamespace
+
+import pytest
+
+from mcp_sd15.config import LoRAConfig
+from mcp_sd15.errors import ConfigError
+from mcp_sd15.pipeline_factory import PipelineFactory
+
+
+class FakePipeline:
+ def __init__(self, *, with_vae: bool = True) -> None:
+ self.vae = object() if with_vae else None
+ self.scheduler = SimpleNamespace(config={})
+ self.lora_loads: list[dict[str, object]] = []
+ self.adapters: tuple[list[str], list[float]] | None = None
+ self.device: str | None = None
+
+ def load_lora_weights(self, directory: str, **kwargs: object) -> None:
+ self.lora_loads.append({"directory": directory, **kwargs})
+
+ def set_adapters(self, names: list[str], *, adapter_weights: list[float]) -> None:
+ self.adapters = (names, adapter_weights)
+
+ def set_progress_bar_config(self, *, disable: bool) -> None:
+ assert disable is True
+
+ def to(self, device: str) -> FakePipeline:
+ self.device = device
+ return self
+
+
+class FakeScheduler:
+ @classmethod
+ def from_config(cls, config: dict[str, object]) -> object:
+ return {"scheduler": cls.__name__, **config}
+
+
+def fake_diffusers(pipeline: FakePipeline, external_vae: object) -> SimpleNamespace:
+ class StableDiffusionPipeline:
+ @classmethod
+ def from_single_file(cls, path: str, **kwargs: object) -> FakePipeline:
+ pipeline.base_load = {"path": path, **kwargs} # type: ignore[attr-defined]
+ return pipeline
+
+ class AutoencoderKL:
+ @classmethod
+ def from_single_file(cls, path: str, **kwargs: object) -> object:
+ pipeline.vae_load = {"path": path, **kwargs} # type: ignore[attr-defined]
+ return external_vae
+
+ return SimpleNamespace(
+ StableDiffusionPipeline=StableDiffusionPipeline,
+ AutoencoderKL=AutoencoderKL,
+ DPMSolverMultistepScheduler=FakeScheduler,
+ DDIMScheduler=FakeScheduler,
+ EulerDiscreteScheduler=FakeScheduler,
+ EulerAncestralDiscreteScheduler=FakeScheduler,
+ )
+
+
+def test_base_pipeline_requires_vae_and_applies_all_loras(app_config, monkeypatch) -> None:
+ model = replace(
+ app_config.model,
+ vae="external.safetensors",
+ loras=(
+ LoRAConfig("detail.safetensors", 0.8),
+ LoRAConfig("style.safetensors", 0.5),
+ ),
+ )
+ factory = PipelineFactory(replace(app_config, model=model))
+ pipeline = FakePipeline()
+ external_vae = object()
+ runtime = (SimpleNamespace(float16="float16"), fake_diffusers(pipeline, external_vae))
+ monkeypatch.setattr(factory, "_runtime", lambda: runtime)
+
+ result = factory.create_base()
+
+ assert result is pipeline
+ assert pipeline.vae is external_vae
+ assert pipeline.adapters == (["configured_lora_0", "configured_lora_1"], [0.8, 0.5])
+ assert [item["weight_name"] for item in pipeline.lora_loads] == [
+ "detail.safetensors",
+ "style.safetensors",
+ ]
+ assert all(item["local_files_only"] is True for item in pipeline.lora_loads)
+ assert pipeline.device == "cuda"
+
+
+def test_checkpoint_without_vae_fails_pipeline_initialization(app_config, monkeypatch) -> None:
+ factory = PipelineFactory(app_config)
+ pipeline = FakePipeline(with_vae=False)
+ runtime = (SimpleNamespace(float16="float16"), fake_diffusers(pipeline, object()))
+ monkeypatch.setattr(factory, "_runtime", lambda: runtime)
+
+ with pytest.raises(ConfigError, match="does not provide a VAE"):
+ factory.create_base()
diff --git a/uv.lock b/uv.lock
index 73edd69..c41195a 100644
--- a/uv.lock
+++ b/uv.lock
@@ -240,10 +240,10 @@ wheels = [
[[package]]
name = "cuda-toolkit"
-version = "13.0.3.0"
+version = "13.2.1"
source = { registry = "https://pypi.org/simple" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/d1/c7/a79086a62c98befcdb8349656c6f114e2db3b8b2422f6e25c97a7f2a9a3c/cuda_toolkit-13.0.3.0-py2.py3-none-any.whl", hash = "sha256:d693caaa261214ddd7dbb60d68e71cbed884e68c2be7509778f3051da0b91c3f", size = 2512, upload-time = "2026-04-14T00:50:08.173Z" },
+ { url = "https://files.pythonhosted.org/packages/bd/6a/f79c134fa8e6d5fe028584933be063ce7961b1a85ce217f261cdda176e48/cuda_toolkit-13.2.1-py2.py3-none-any.whl", hash = "sha256:646d0e3668ce6f78f2312bb9cc0f668b9cbfcbef187eaa6a39eb2ea6dbec2a31", size = 2612, upload-time = "2026-04-14T01:10:36.163Z" },
]
[package.optional-dependencies]
@@ -601,6 +601,7 @@ dependencies = [
{ name = "pillow" },
{ name = "safetensors" },
{ name = "torch" },
+ { name = "torchvision" },
{ name = "transformers" },
]
@@ -623,7 +624,8 @@ requires-dist = [
{ name = "peft", specifier = ">=0.13" },
{ name = "pillow", specifier = ">=10.4" },
{ name = "safetensors", specifier = ">=0.4" },
- { name = "torch", specifier = ">=2.4" },
+ { name = "torch", specifier = "==2.14.0+cu132", index = "https://download.pytorch.org/whl/cu132" },
+ { name = "torchvision", specifier = "==0.29.0+cu132", index = "https://download.pytorch.org/whl/cu132" },
{ name = "transformers", specifier = ">=4.45" },
]
@@ -712,41 +714,41 @@ wheels = [
[[package]]
name = "nvidia-cublas"
-version = "13.1.1.3"
+version = "13.4.0.1"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "nvidia-cuda-nvrtc" },
]
wheels = [
- { url = "https://files.pythonhosted.org/packages/a7/a1/0bd24ee8c8d03adac032fd2909426a00c88f8c57961b1277ded97f91119f/nvidia_cublas-13.1.1.3-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:b7a210458267ac818974c53038fbec2e969d5c99f305ab15c72522fa9f001dd5", size = 542848918, upload-time = "2026-04-08T18:46:22.985Z" },
- { url = "https://files.pythonhosted.org/packages/3b/cd/154ca20c38269e05eff77c1464e6c1da89f50a6390b565e9d82e06bc11e1/nvidia_cublas-13.1.1.3-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:37936a16db8fe4ac1f065c2139360608a543a09275cb1a1af612e08cfa065436", size = 423138758, upload-time = "2026-04-08T18:46:58.655Z" },
+ { url = "https://files.pythonhosted.org/packages/d0/48/8571e55aaabbd112f06a39a71fbc3abf0b8a0d450921816a13a6d5e8fa0b/nvidia_cublas-13.4.0.1-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:705d7d214fbb20f134415ecadc488abf74f444c155a6555dec5687404afb18a9", size = 513051304, upload-time = "2026-04-13T09:49:32.758Z" },
+ { url = "https://files.pythonhosted.org/packages/3d/ec/c9b2998aebe3149dee2769e501257e048c8701de51263925f4dff76ddedc/nvidia_cublas-13.4.0.1-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:53bf22e2ccbf644db74b6cc21cea7f5efb1a52aa64515438b430abbd05af4106", size = 404872465, upload-time = "2026-04-13T09:50:12.116Z" },
]
[[package]]
name = "nvidia-cuda-cupti"
-version = "13.0.85"
+version = "13.2.75"
source = { registry = "https://pypi.org/simple" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/2a/2a/80353b103fc20ce05ef51e928daed4b6015db4aaa9162ed0997090fe2250/nvidia_cuda_cupti-13.0.85-py3-none-manylinux_2_25_aarch64.whl", hash = "sha256:796bd679890ee55fb14a94629b698b6db54bcfd833d391d5e94017dd9d7d3151", size = 10310827, upload-time = "2025-09-04T08:26:42.012Z" },
- { url = "https://files.pythonhosted.org/packages/33/6d/737d164b4837a9bbd202f5ae3078975f0525a55730fe871d8ed4e3b952b0/nvidia_cuda_cupti-13.0.85-py3-none-manylinux_2_25_x86_64.whl", hash = "sha256:4eb01c08e859bf924d222250d2e8f8b8ff6d3db4721288cf35d14252a4d933c8", size = 10715597, upload-time = "2025-09-04T08:26:51.312Z" },
+ { url = "https://files.pythonhosted.org/packages/4e/e2/b7bbe4e39781024fcc698fa3d0a788cd9559d9cba5e23fdbcff0a27783e4/nvidia_cuda_cupti-13.2.75-py3-none-manylinux_2_25_aarch64.whl", hash = "sha256:003157a0ca04d34a1f83a764dcbe36eabceda5a771e9a2cc85a461b2765888b6", size = 11759634, upload-time = "2026-04-13T09:40:35.162Z" },
+ { url = "https://files.pythonhosted.org/packages/b7/2d/cbf8f6288259c502165282fdaa2b733daae98434e3f2aee2b7952ba87c6f/nvidia_cuda_cupti-13.2.75-py3-none-manylinux_2_25_x86_64.whl", hash = "sha256:f75aca6bef89c625a4076a820302bb06764daa1d21595286f6bee5e237d3a187", size = 11986992, upload-time = "2026-04-13T09:40:54.517Z" },
]
[[package]]
name = "nvidia-cuda-nvrtc"
-version = "13.0.88"
+version = "13.2.78"
source = { registry = "https://pypi.org/simple" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/c3/68/483a78f5e8f31b08fb1bb671559968c0ca3a065ac7acabfc7cee55214fd6/nvidia_cuda_nvrtc-13.0.88-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl", hash = "sha256:ad9b6d2ead2435f11cbb6868809d2adeeee302e9bb94bcf0539c7a40d80e8575", size = 90215200, upload-time = "2025-09-04T08:28:44.204Z" },
- { url = "https://files.pythonhosted.org/packages/b7/dc/6bb80850e0b7edd6588d560758f17e0550893a1feaf436807d64d2da040f/nvidia_cuda_nvrtc-13.0.88-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d27f20a0ca67a4bb34268a5e951033496c5b74870b868bacd046b1b8e0c3267b", size = 43015449, upload-time = "2025-09-04T08:28:20.239Z" },
+ { url = "https://files.pythonhosted.org/packages/5f/96/237b40b171e06eb65905375c4ad5c96f78c2f861ac6e8ae7f650d95e1dfd/nvidia_cuda_nvrtc-13.2.78-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl", hash = "sha256:a9049031da08cbedd0c20e3470e5a978dc330af0e0326b3b05774718c665dc3e", size = 47019062, upload-time = "2026-04-13T09:45:33.875Z" },
+ { url = "https://files.pythonhosted.org/packages/af/be/8476aa006686fb264d61de43e0408a8dbd001003a702574759b25e645587/nvidia_cuda_nvrtc-13.2.78-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a50367a7e2a0bd00fb27e5648179149cc7a60e7c7811740a5ff559f06234526d", size = 44754755, upload-time = "2026-04-13T09:44:58.919Z" },
]
[[package]]
name = "nvidia-cuda-runtime"
-version = "13.0.96"
+version = "13.2.75"
source = { registry = "https://pypi.org/simple" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/87/4f/17d7b9b8e285199c58ce28e31b5c5bbaa4d8271af06a89b6405258245de2/nvidia_cuda_runtime-13.0.96-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ef9bcbe90493a2b9d810e43d249adb3d02e98dd30200d86607d8d02687c43f55", size = 2261060, upload-time = "2025-10-09T08:55:15.78Z" },
- { url = "https://files.pythonhosted.org/packages/2e/24/d1558f3b68b1d26e706813b1d10aa1d785e4698c425af8db8edc3dced472/nvidia_cuda_runtime-13.0.96-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7f82250d7782aa23b6cfe765ecc7db554bd3c2870c43f3d1821f1d18aebf0548", size = 2243632, upload-time = "2025-10-09T08:55:36.117Z" },
+ { url = "https://files.pythonhosted.org/packages/f1/40/56a70b5a4e0a2881a1b7c172fea8025ab6b3cfb2de61c743fb7974d1ded4/nvidia_cuda_runtime-13.2.75-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:36e539e8deb01568025830c1454216c26ef4b4529507220b1d8ef739bf5c6439", size = 2339755, upload-time = "2026-04-13T09:37:53.791Z" },
+ { url = "https://files.pythonhosted.org/packages/dc/74/f1493b0774c6eaf0234512bb650e1ab90ce8f61fecf0b4aaf1fb416f571e/nvidia_cuda_runtime-13.2.75-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:72bf454902da594e0b833cadeddc8b7100ce1c7cf7ed9023943931be1aa913b7", size = 2321965, upload-time = "2026-04-13T09:38:26.359Z" },
]
[[package]]
@@ -763,37 +765,37 @@ wheels = [
[[package]]
name = "nvidia-cufft"
-version = "12.0.0.61"
+version = "12.2.0.46"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "nvidia-nvjitlink" },
]
wheels = [
- { url = "https://files.pythonhosted.org/packages/8b/ae/f417a75c0259e85c1d2f83ca4e960289a5f814ed0cea74d18c353d3e989d/nvidia_cufft-12.0.0.61-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2708c852ef8cd89d1d2068bdbece0aa188813a0c934db3779b9b1faa8442e5f5", size = 214053554, upload-time = "2025-09-04T08:31:38.196Z" },
- { url = "https://files.pythonhosted.org/packages/a8/2f/7b57e29836ea8714f81e9898409196f47d772d5ddedddf1592eadb8ab743/nvidia_cufft-12.0.0.61-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6c44f692dce8fd5ffd3e3df134b6cdb9c2f72d99cf40b62c32dde45eea9ddad3", size = 214085489, upload-time = "2025-09-04T08:31:56.044Z" },
+ { url = "https://files.pythonhosted.org/packages/be/b1/6e36381739b51e692d91646298ad5685c562929b899331c2bb6e9722a176/nvidia_cufft-12.2.0.46-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2e8f3a22c2745f95327b7639ba2868ea2cbd5d3131ebe6313394e24164054f41", size = 218244743, upload-time = "2026-04-13T09:51:24.75Z" },
+ { url = "https://files.pythonhosted.org/packages/36/3e/8d717a6e1f6e27b85b64650b1104dbcf6108c9dc7e27e9e26a0d8e936cc5/nvidia_cufft-12.2.0.46-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a9667ae4d81b9e54ddbbad24a9e72334f89d4fc184566d05ef028e2760c820eb", size = 218258098, upload-time = "2026-04-13T09:52:04.915Z" },
]
[[package]]
name = "nvidia-cufile"
-version = "1.15.1.6"
+version = "1.17.1.22"
source = { registry = "https://pypi.org/simple" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/3f/70/4f193de89a48b71714e74602ee14d04e4019ad36a5a9f20c425776e72cd6/nvidia_cufile-1.15.1.6-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:08a3ecefae5a01c7f5117351c64f17c7c62efa5fffdbe24fc7d298da19cd0b44", size = 1223672, upload-time = "2025-09-04T08:32:22.779Z" },
- { url = "https://files.pythonhosted.org/packages/ab/73/cc4a14c9813a8a0d509417cf5f4bdaba76e924d58beb9864f5a7baceefbf/nvidia_cufile-1.15.1.6-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:bdc0deedc61f548bddf7733bdc216456c2fdb101d020e1ab4b88d232d5e2f6d1", size = 1136992, upload-time = "2025-09-04T08:32:14.119Z" },
+ { url = "https://files.pythonhosted.org/packages/fe/fd/4b4157512a131a51e1514d40d0199b1c5b7b10c6856db274ff22e5fe15be/nvidia_cufile-1.17.1.22-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:bec33d7f1f12691dce330275246587569c2ed90b1ce43b0f94b3e1ce9268744b", size = 1226736, upload-time = "2026-04-13T09:52:40.142Z" },
+ { url = "https://files.pythonhosted.org/packages/23/c5/661a73a9042fc5f81cdd5fe6e89f4170b3b33f7962e709987e2b5e5f1381/nvidia_cufile-1.17.1.22-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:87feaf8c3ad20d3d03a01933181801ff6892bace5c8f0b1e4b48f319d3e62d36", size = 1387670, upload-time = "2026-04-13T09:52:57.783Z" },
]
[[package]]
name = "nvidia-curand"
-version = "10.4.0.35"
+version = "10.4.2.55"
source = { registry = "https://pypi.org/simple" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/1e/72/7c2ae24fb6b63a32e6ae5d241cc65263ea18d08802aaae087d9f013335a2/nvidia_curand-10.4.0.35-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:133df5a7509c3e292aaa2b477afd0194f06ce4ea24d714d616ff36439cee349a", size = 61962106, upload-time = "2025-08-04T10:21:41.128Z" },
- { url = "https://files.pythonhosted.org/packages/a5/9f/be0a41ca4a4917abf5cb9ae0daff1a6060cc5de950aec0396de9f3b52bc5/nvidia_curand-10.4.0.35-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:1aee33a5da6e1db083fe2b90082def8915f30f3248d5896bcec36a579d941bfc", size = 59544258, upload-time = "2025-08-04T10:22:03.992Z" },
+ { url = "https://files.pythonhosted.org/packages/ee/7c/7c2042b5badc251236bc1f23627d5554cf2ecff37e92ea0a9d39dfc20a61/nvidia_curand-10.4.2.55-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:342e40ddcaedc92aedc72839e0c10064096fceea2f1d0eb57951f86d2901f8c0", size = 62372157, upload-time = "2026-04-13T09:53:32.34Z" },
+ { url = "https://files.pythonhosted.org/packages/f4/bc/f02a1d180d288e49b1a4548698b59755e9c485ee39c041fdeaf4d2cc2117/nvidia_curand-10.4.2.55-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:b4080cab49d4939f8e46b2c195c76c698d2289835c36ede558836daa40000e70", size = 59920450, upload-time = "2026-04-13T09:54:07.224Z" },
]
[[package]]
name = "nvidia-cusolver"
-version = "12.0.4.66"
+version = "12.2.0.1"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "nvidia-cublas" },
@@ -801,20 +803,20 @@ dependencies = [
{ name = "nvidia-nvjitlink" },
]
wheels = [
- { url = "https://files.pythonhosted.org/packages/c8/c3/b30c9e935fc01e3da443ec0116ed1b2a009bb867f5324d3f2d7e533e776b/nvidia_cusolver-12.0.4.66-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:02c2457eaa9e39de20f880f4bd8820e6a1cfb9f9a34f820eb12a155aa5bc92d2", size = 223467760, upload-time = "2025-09-04T08:33:04.222Z" },
- { url = "https://files.pythonhosted.org/packages/5f/67/cba3777620cdacb99102da4042883709c41c709f4b6323c10781a9c3aa34/nvidia_cusolver-12.0.4.66-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:0a759da5dea5c0ea10fd307de75cdeb59e7ea4fcb8add0924859b944babf1112", size = 200941980, upload-time = "2025-09-04T08:33:22.767Z" },
+ { url = "https://files.pythonhosted.org/packages/94/21/21e5c491a8285a6ed039cbb8c60ec13ff3aff60c669e1caa4adaeb71f997/nvidia_cusolver-12.2.0.1-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:c9def09fcf300b9465cdf800142abf10149df28c4290bdf9e7b4a700480d31d7", size = 249744985, upload-time = "2026-04-13T09:54:33.757Z" },
+ { url = "https://files.pythonhosted.org/packages/6b/97/a3c41eac54c89f6aac788d2b3ccd6642b32aa6b79650af3dedb8ee7c2bfa/nvidia_cusolver-12.2.0.1-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:4693ea3c2a5d20369da7b5a4970a41df9b40f1b6f2ef9909c95f7c8c8c5ffb4d", size = 227391570, upload-time = "2026-04-13T09:55:12.999Z" },
]
[[package]]
name = "nvidia-cusparse"
-version = "12.6.3.3"
+version = "12.7.10.1"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "nvidia-nvjitlink" },
]
wheels = [
- { url = "https://files.pythonhosted.org/packages/f8/94/5c26f33738ae35276672f12615a64bd008ed5be6d1ebcb23579285d960a9/nvidia_cusparse-12.6.3.3-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:80bcc4662f23f1054ee334a15c72b8940402975e0eab63178fc7e670aa59472c", size = 162155568, upload-time = "2025-09-04T08:33:42.864Z" },
- { url = "https://files.pythonhosted.org/packages/fa/18/623c77619c31d62efd55302939756966f3ecc8d724a14dab2b75f1508850/nvidia_cusparse-12.6.3.3-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2b3c89c88d01ee0e477cb7f82ef60a11a4bcd57b6b87c33f789350b59759360b", size = 145942937, upload-time = "2025-09-04T08:33:58.029Z" },
+ { url = "https://files.pythonhosted.org/packages/b5/09/9f1fa88dd305e838b71f2ca4e50064e7cbdf2e15cd6410d9e1b74066cc41/nvidia_cusparse-12.7.10.1-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:80cc98b38fdcf054a80bd9782fe2e63c66f90e202cac269f641357ccac5fe7e3", size = 168860233, upload-time = "2026-04-13T09:55:48.891Z" },
+ { url = "https://files.pythonhosted.org/packages/b7/bd/bad43b37bcf13167637bef26399693d517b95092d742e8749eda5f4a85f3/nvidia_cusparse-12.7.10.1-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f0d110640aa63e7182fa787cc245afa07c5fb84ac30f1c4029e4fa3012353172", size = 150855566, upload-time = "2026-04-13T09:56:29.21Z" },
]
[[package]]
@@ -855,11 +857,11 @@ wheels = [
[[package]]
name = "nvidia-nvtx"
-version = "13.0.85"
+version = "13.2.75"
source = { registry = "https://pypi.org/simple" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/c2/f3/d86c845465a2723ad7e1e5c36dcd75ddb82898b3f53be47ebd429fb2fa5d/nvidia_nvtx-13.0.85-py3-none-manylinux1_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:4936d1d6780fbe68db454f5e72a42ff64d1fd6397df9f363ae786930fd5c1cd4", size = 148047, upload-time = "2025-09-04T08:29:01.761Z" },
- { url = "https://files.pythonhosted.org/packages/a8/64/3708a90d1ebe202ffdeb7185f878a3c84d15c2b2c31858da2ce0583e2def/nvidia_nvtx-13.0.85-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cb7780edb6b14107373c835bf8b72e7a178bac7367e23da7acb108f973f157a6", size = 148878, upload-time = "2025-09-04T08:28:53.627Z" },
+ { url = "https://files.pythonhosted.org/packages/b0/cc/314eac684677dced22b913b5d1b3d03adcbe59d6c7332c5d04f864cdb079/nvidia_nvtx-13.2.75-py3-none-manylinux1_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:2d7c24fc582d841493c6dc2cf017c25e4428cf583a3bd9e9325a65f0ecc65f73", size = 153460, upload-time = "2026-04-13T09:46:23.256Z" },
+ { url = "https://files.pythonhosted.org/packages/6a/48/c02f2aa1662edaddac87e0501142a65765af8010a788b087d920a9f80fb7/nvidia_nvtx-13.2.75-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d8e1c4a14a21d6dd4bc2fc59eb1e3f42447db40edf5d0f580c0eba5f9abb606c", size = 154291, upload-time = "2026-04-13T09:45:53.009Z" },
]
[[package]]
@@ -1443,8 +1445,8 @@ wheels = [
[[package]]
name = "torch"
-version = "2.14.0"
-source = { registry = "https://pypi.org/simple" }
+version = "2.14.0+cu132"
+source = { registry = "https://download.pytorch.org/whl/cu132" }
dependencies = [
{ name = "cuda-bindings", marker = "sys_platform == 'linux'" },
{ name = "cuda-toolkit", extra = ["cublas", "cudart", "cufft", "cufile", "cupti", "curand", "cusolver", "cusparse", "nvjitlink", "nvrtc", "nvtx"], marker = "sys_platform == 'linux'" },
@@ -1462,26 +1464,24 @@ dependencies = [
{ name = "typing-extensions" },
]
wheels = [
- { url = "https://files.pythonhosted.org/packages/e6/2c/0c9757a1ea1fff8ccc4faff1d1c87e98a69542b5d4b606e50f7518f72e58/torch-2.14.0-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:ae530ddd3f3b94248b77f1fd3313c4f3405bd0d17283d505b81574816767133a", size = 127277244, upload-time = "2026-09-02T13:42:57.855Z" },
- { url = "https://files.pythonhosted.org/packages/ed/30/eb2f6cf77cb8f2d5e7ce4343882a856783521f51b557673d78d1d7bb8661/torch-2.14.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:4dbea8a10d80b10dff2be1ed467d2617b704fe6bf76bbfad4194774c8f6d886b", size = 453993896, upload-time = "2026-09-02T13:43:29.231Z" },
- { url = "https://files.pythonhosted.org/packages/8d/be/c0c8a845bf00552960d2f1f6a00b6ac9750fd312f55429c3e8c6c0e3aac4/torch-2.14.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:8d9e232b6376c62f3090237889fb1cb6887c0ece9f73e6c1052e80fc1481f999", size = 554583496, upload-time = "2026-09-02T13:44:10.199Z" },
- { url = "https://files.pythonhosted.org/packages/e3/5b/ed9d177f6a133389d5fa89e298f3e2a879b62952aa928ac6ddd04467f225/torch-2.14.0-cp311-cp311-win_amd64.whl", hash = "sha256:6981872df75eb5409c439050d36b67cb57d88b4e11080516e2aa7410f6730705", size = 124096356, upload-time = "2026-09-02T13:43:02.941Z" },
+ { url = "https://download-r2.pytorch.org/whl/cu132/torch-2.14.0%2Bcu132-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:1ddf5811c53ce6bb06b4a3bba483998e1737dc75695d2f652a1417ce9acd3623", upload-time = "2026-09-02T19:01:33Z" },
+ { url = "https://download-r2.pytorch.org/whl/cu132/torch-2.14.0%2Bcu132-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:9047b69c69b91b24e9bbbeb3c88c77a8f245e676ec3e301e5d91be67af9fa9ad", upload-time = "2026-09-02T19:01:47Z" },
+ { url = "https://download-r2.pytorch.org/whl/cu132/torch-2.14.0%2Bcu132-cp311-cp311-win_amd64.whl", hash = "sha256:7c134d64e923c48f5836f548a3b6627a8210137ec967ac89b340aac38d695b31", upload-time = "2026-09-02T19:02:20Z" },
]
[[package]]
name = "torchvision"
-version = "0.29.0"
-source = { registry = "https://pypi.org/simple" }
+version = "0.29.0+cu132"
+source = { registry = "https://download.pytorch.org/whl/cu132" }
dependencies = [
{ name = "numpy" },
{ name = "pillow" },
{ name = "torch" },
]
wheels = [
- { url = "https://files.pythonhosted.org/packages/ea/47/6b32740f7ae0ecf8772297f7e61e842b127b11de5c2c07efd9aeeaed0690/torchvision-0.29.0-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:bbe15455b59a6c9d822584fd3faaaac50ee972101d7bb7e2887da456e148a3ea", size = 1813735, upload-time = "2026-09-02T13:46:58.108Z" },
- { url = "https://files.pythonhosted.org/packages/59/0a/2c5114537cbf4ac374607a41d976911657db9f656bfa42a278470ca8d886/torchvision-0.29.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:dc5717feef9a0b430b052895db71f1d695939575b74344da981120e9f4da7620", size = 7585959, upload-time = "2026-09-02T13:46:59.536Z" },
- { url = "https://files.pythonhosted.org/packages/a6/2d/a656bfa09b98d01d4baf30114a5befca1de2f7a16133d94aae01d7cd6942/torchvision-0.29.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:85fa54bec1f7d9227b5e4e201ed4bac92247ee10fb19148d92f9836e3e91d5c3", size = 7430717, upload-time = "2026-09-02T13:47:01.281Z" },
- { url = "https://files.pythonhosted.org/packages/78/26/dc21cec3eace48d944258a437e293093c69ddb56684e9dd1b5016f7e2154/torchvision-0.29.0-cp311-cp311-win_amd64.whl", hash = "sha256:a292ca7044236a2702ec3d4664de135e01fc9fb3ae9422db3fecc819546e831c", size = 1376792, upload-time = "2026-09-02T13:47:02.645Z" },
+ { url = "https://download-r2.pytorch.org/whl/cu132/torchvision-0.29.0%2Bcu132-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:51dcff86d2fb8d8512f779ca618c7620ae7790dc89091f9819ea4b6a28a2c504", upload-time = "2026-09-02T00:28:13Z" },
+ { url = "https://download-r2.pytorch.org/whl/cu132/torchvision-0.29.0%2Bcu132-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:0257f8768edfa932576392058962aa979789c1fd1619af7209bc6c5ee66a8ffc", upload-time = "2026-09-02T00:28:13Z" },
+ { url = "https://download-r2.pytorch.org/whl/cu132/torchvision-0.29.0%2Bcu132-cp311-cp311-win_amd64.whl", hash = "sha256:59248bcdede36d6e1353e6873d6ed256474c767278dd5b65731f008221390d19", upload-time = "2026-09-02T00:28:13Z" },
]
[[package]]