{"record":{"id":"b6c3cb893014cc0b","repo":"invoke-ai/InvokeAI","slug":"activation-chunk-size-must-be-positive","errorCode":null,"errorMessage":"activation_chunk_size must be positive","messagePattern":"activation_chunk_size must be positive","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"invokeai/backend/wan/memory_optimization.py","lineNumber":208,"sourceCode":"        )\n        output[:, start:end].copy_(output_chunk)\n\n    return output\n\n\n@contextmanager\ndef wan_memory_optimization(\n    transformer: torch.nn.Module,\n    *,\n    enabled: bool,\n    activation_chunk_size: int = WAN_ACTIVATION_CHUNK_SIZE,\n) -> Iterator[None]:\n    \"\"\"Temporarily chunk Wan transformer pointwise activations during inference.\"\"\"\n    if not enabled:\n        yield\n        return\n    if activation_chunk_size <= 0:\n        raise ValueError(\"activation_chunk_size must be positive\")\n\n    blocks: Any = getattr(transformer, \"blocks\", None)\n    if blocks is None:\n        raise TypeError(f\"Expected a Wan transformer with blocks, got {type(transformer).__name__}.\")\n    blocks = list(blocks)\n    if hasattr(transformer, \"_invokeai_original_forward\") or any(\n        hasattr(block, \"_invokeai_original_forward\") for block in blocks\n    ):\n        raise RuntimeError(\"Wan memory optimization context cannot be nested.\")\n\n    patched_blocks: list[tuple[torch.nn.Module, Any, bool]] = []\n    original_transformer_forward = transformer.forward\n    transformer_had_instance_forward = \"forward\" in transformer.__dict__\n    patch_transformer_forward = all(\n        hasattr(transformer, name)\n        for name in (\"condition_embedder\", \"patch_embedding\", \"proj_out\", \"rope\", \"scale_shift_table\")\n    )\n    try:","sourceCodeStart":190,"sourceCodeEnd":226,"githubUrl":"https://github.com/invoke-ai/InvokeAI/blob/0b6a024f2ff6a86bfb953dcdb9cc504ef7397a06/invokeai/backend/wan/memory_optimization.py#L190-L226","documentation":"wan_memory_optimization is a context manager that patches Wan transformer blocks to chunk pointwise activations in fixed-size groups, trading compute for peak memory. A non-positive activation_chunk_size (0 or negative) is meaningless for chunking and would break the internal batching logic, so the generator raises this ValueError before patching anything.","triggerScenarios":"Entering `with wan_memory_optimization(transformer, enabled=True, activation_chunk_size=0)` (or any value <= 0); e.g. chunk size loaded from config as 0 or computed as len//x when the denominator exceeds length.","commonSituations":"Config file with chunk_size: 0 intending 'auto', dividing to get zero, CLI flag defaulting to 0.","solutions":["Pass a positive activation_chunk_size (e.g. 8, 16, or 32) when enabling the optimization.","Set enabled=False instead of activation_chunk_size=0 to disable chunking.","Clamp user config: activation_chunk_size = max(1, int(cfg_value))."],"exampleFix":"// before\nwith wan_memory_optimization(transformer, enabled=True, activation_chunk_size=0):\n// after\nwith wan_memory_optimization(transformer, enabled=True, activation_chunk_size=16):","handlingStrategy":"validation","validationCode":"chunk = max(1, int(config.get(\"activation_chunk_size\", 16)))\nwith wan_memory_optimization(transformer, enabled=enable, activation_chunk_size=chunk):\n    run_diffusion(...)","typeGuard":null,"tryCatchPattern":"try:\n    with wan_memory_optimization(transformer, True, activation_chunk_size=cfg_chunk):\n        run_diffusion()\nexcept ValueError as e:\n    if \"must be positive\" in str(e):\n        run_diffusion()  # proceed without chunking","preventionTips":["Treat 0 as 'disabled' by mapping it to enabled=False instead of chunk_size=0.","Clamp config values with max(1, value).","Validate chunk-size configs at startup, not at inference time."],"tags":["python","pytorch","memory-optimization","validation","wan"],"backgroundTag":"invalid-parameter-value","analyzedSha":"0b6a024f2ff6a86bfb953dcdb9cc504ef7397a06","analyzedAt":"2026-08-29T04:46:49.967Z","schemaVersion":2},"datasetVersion":"2026-08-29T07:17:48.351Z"}