diff options
| -rw-r--r-- | .gitignore | 2 | ||||
| -rw-r--r-- | README.md | 18 | ||||
| -rw-r--r-- | data/MODELS.md | 66 | ||||
| -rw-r--r-- | data/config.generate-image.toml | 13 | ||||
| -rw-r--r-- | doc/Design.md | 7 | ||||
| -rw-r--r-- | doc/Specifications.md | 7 | ||||
| -rw-r--r-- | doc/config.md | 8 | ||||
| -rw-r--r-- | pyproject.toml | 12 | ||||
| -rw-r--r-- | script/smoke_generate_image.py | 60 | ||||
| -rw-r--r-- | src/mcp_sd15/pipeline_factory.py | 12 | ||||
| -rw-r--r-- | tests/test_pipeline_factory.py | 99 | ||||
| -rw-r--r-- | uv.lock | 90 |
12 files changed, 337 insertions, 57 deletions
@@ -5,4 +5,4 @@ __pycache__/ .pyright/ *.py[cod] outputs/ -data/
\ No newline at end of file +/data/ @@ -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() @@ -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]] |
