{"record":{"id":"e15ea7371b4687aa","repo":"tracel-ai/burn","slug":"todo-cubecl-backend-does-not-yet-support-adaptiv-e15ea7","errorCode":null,"errorMessage":"todo!(\"CubeCL backend does not yet support adaptive_avg_pool3d_backward.\")","messagePattern":"todo!\\(\"CubeCL backend does not yet support adaptive_avg_pool3d_backward\\.\"\\)","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/burn-cubecl/src/ops/module.rs","lineNumber":303,"sourceCode":"        kernel::pool::adaptive_avg_pool2d(x, output_size)\n    }\n\n    fn adaptive_avg_pool2d_backward(\n        x: FloatTensor<Self>,\n        grad: FloatTensor<Self>,\n    ) -> FloatTensor<Self> {\n        kernel::pool::adaptive_avg_pool2d_backward(x, grad)\n    }\n\n    fn adaptive_avg_pool3d(_x: FloatTensor<Self>, _output_size: [usize; 3]) -> FloatTensor<Self> {\n        todo!(\"CubeCL backend does not yet support adaptive_avg_pool3d.\")\n    }\n\n    fn adaptive_avg_pool3d_backward(\n        _x: FloatTensor<Self>,\n        _grad: FloatTensor<Self>,\n    ) -> FloatTensor<Self> {\n        todo!(\"CubeCL backend does not yet support adaptive_avg_pool3d_backward.\")\n    }\n\n    fn interpolate(\n        x: FloatTensor<Self>,\n        output_size: [usize; 2],\n        options: InterpolateOptions,\n    ) -> FloatTensor<Self> {\n        kernel::interpolate::interpolate(x, output_size, options, Default::default()).unwrap()\n    }\n\n    fn interpolate_backward(\n        x: FloatTensor<Self>,\n        grad: FloatTensor<Self>,\n        output_size: [usize; 2],\n        options: InterpolateOptions,\n    ) -> FloatTensor<Self> {\n        kernel::interpolate::interpolate_backward(x, grad, output_size, options)\n    }","sourceCodeStart":285,"sourceCodeEnd":321,"githubUrl":"https://github.com/tracel-ai/burn/blob/d16f7ba2ed0d41408189384044cc886fb4c8f957/crates/burn-cubecl/src/ops/module.rs#L285-L321","documentation":"Companion to 427: the CubeCL backend stubs `adaptive_avg_pool3d_backward` with `todo!`, so backpropagation through 3D adaptive average pooling panics. Even if a forward path were provided (e.g. another backend), training through this layer on CubeCL is impossible.","triggerScenarios":"Training (backward pass) a model containing an adaptive 3D average pooling layer on the CubeCL backend — autodiff calls `adaptive_avg_pool3d_backward` to compute input gradients.","commonSituations":"Fine-tuning 3D vision/video models with adaptive pooling heads on wgpu/CUDA; converting a PyTorch training loop with nn.AdaptiveAvgPool3d to burn on GPU backends.","solutions":["Use fixed-kernel `avg_pool3d` (and its backward, which is implemented) instead of adaptive 3D pooling in trained models.","Freeze/pool outside the graph: compute the pooled features on CPU (NdArray) and feed them as constants.","Replace the layer with adaptive_avg_pool2d slices if the architecture allows.","Track burn upstream for implementation of this backward op."],"exampleFix":"// before\nlet pooled = x.adaptive_avg_pool3d([2, 2, 2]); // trained end-to-end, backward panics\n// after\nlet pooled = x.avg_pool3d([4, 4, 4], [4, 4, 4], [0, 0, 0], false); // fixed pool with backward support","handlingStrategy":"fallback","validationCode":"fn trainable_on_backend<B: Backend>() -> bool {\n    // adaptive_avg_pool3d_backward unimplemented on CubeCL\n    !std::any::type_name::<B>().contains(\"CubeCl\")\n}","typeGuard":null,"tryCatchPattern":"// backward panics via todo!; avoid by not using AdaptiveAvgPool3d in trained CubeCL graphs\nif !trainable_on_backend::<B>() {\n    let pooled = x.avg_pool3d([4,4,4],[4,4,4],[0,0,0],false);\n}","preventionTips":["Never train through AdaptiveAvgPool3d on CubeCL backends.","Use fixed-size avg_pool3d in trainable 3D models.","Freeze adaptive-pool heads or compute them outside autodiff.","Track upstream burn for backward-kernel availability."],"tags":["burn","cubecl","pooling3d","backward","unimplemented"],"backgroundTag":"unimplemented-op","analyzedSha":"d16f7ba2ed0d41408189384044cc886fb4c8f957","analyzedAt":"2026-09-05T13:19:14.260Z","contentChangedAt":"2026-09-05T13:19:14.260Z","schemaVersion":2},"datasetVersion":"2026-09-12T17:17:11.597Z"}