Fix ffmpeg frame check — use glob instead of hardcoded frame_0001.png (only Phase A starts at 0001)
Johnny Osbournce
1a32833
Add MP4 download button to Gradio UI
Johnny Osbournce+1: Claude Opus 4.7
1d78b62
- get_download_file() returns final MP4 or latest phase MP4
- gr.File component lets us download directly from the Space
- Fallback if HF Dataset upload fails
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Save Blender stdout to blender_{phase}.log for debugging
- Add /get_diagnostics Gradio endpoint: status, dir listing, log tail
- Helps diagnose why Phase A shows progress 0 after 20+ minutes
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Fix configure_render CPU settings override + reduce quality for practical render times
Johnny Osbournce+1: Claude Opus 4.7
1508f86
- Separate CPU/GPU settings properly (CPU was being overridden by common block)
- CPU: 4 bounces, no adaptive sampling, texture_limit 512
- GPU: 8 bounces, adaptive sampling, texture_limit 1024, OptiX/CUDA denoiser
- Reduce resolution to 480p, samples to 16 for CPU render speed
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Fix KeyError: "Emission Color" not found in Blender 3.6
Johnny Osbournce+1: Claude Opus 4.7
ff5b293
Blender 3.6 Principled BSDF uses "Emission" for the emission color
input; Blender 4.0 renamed it to "Emission Color". This KeyError
crashed scene construction on every single attempt, before rendering
could even start. All 10+ GPU/CPU debugging iterations were chasing
a material creation bug, not a rendering issue.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Smoke test blocks full render on failure
Johnny Osbournce+1: Claude Opus 4.7
af0ddcd
Status stays at smoke_failed so the Blender error output is visible
via Gradio status endpoint. Prevents Phase A from overwriting the
diagnostic failure message.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Add smoke test: 64x64, 1 sample, 1 bounce, CPU Cycles
Johnny Osbournce+1: Claude Opus 4.7
9ec1838
Strips rendering down to absolute minimum to isolate whether the
scene can render at all. If this hangs, the problem is deeper than
GPU/CPU/quality settings. The smoke test runs before any full render
and the result is uploaded to the HF Dataset for visibility.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Diagnostic: single CPU Cycles frame before full render
Johnny Osbournce+1: Claude Opus 4.7
e8ac225
Replaces EEVEE poster with Cycles CPU diagnostic frame (480p, 8
samples, frame 1). Logs full Blender output for debugging. Only
proceeds to Phase A if diagnostic succeeds. This isolates whether
CPU Cycles can render this scene at all on A100.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Switch to CPU rendering to bypass A100 GPU kernel hang
Johnny Osbournce+1: Claude Opus 4.7
2ebe6b8
GPU Cycles rendering on A100 hangs at kernel compilation in both
Blender 4.0.2 and 3.6.5 — confirmed across 10+ attempts with
animation=True, per-frame write_still, CUDA, and OptiX backends.
CPU rendering avoids PTX-to-SASS JIT entirely. Expected ~30-60s
per frame at 720p/64 samples on A100's EPYC CPU. GPU code path
preserved behind --cpu flag for future use on compatible hardware.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Switch to per-frame write_still + CUDA-preferred
Johnny Osbournce+1: Claude Opus 4.7
52d8f84
animation=True triggers GPU kernel compilation path that hangs on A100
in both Blender 4.0.2 and 3.6.5. Per-frame write_still=True uses a
simpler kernel path that works (confirmed by Docker warmup). Also
prefer CUDA over OptiX since CUDA kernels compile successfully during
warmup while OptiX may trigger the same PTX hang.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Add live-frame preview pipeline
Johnny Osbournce+1: Claude Opus 4.7
0f30926
Scene now writes each rendered frame to preview/latest_frame.png via
render_write handler with per-frame progress logging. Gradio wrapper
uploads live frames to HF Dataset every 10s in background thread.
mol-giga page polls Dataset for live frames and auto-switches to
video when MP4 becomes available.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Migrate to Blender 3.6.5 LTS for stable GPU rendering
Johnny Osbournce+1: Claude Opus 4.7
d2e7c8b
Replace Blender 4.0.2 with 3.6.5 LTS. Blender 3.6 has mature, stable
CUDA/OptiX support with pre-compiled kernels — no PTX-to-SASS JIT
compilation that hangs on A100 GPUs. Scene now guards Blender 4.0+
attributes (use_compact_bvh, bvh_type) with hasattr() for
compatibility. Restore full render quality: denoising enabled with
adaptive denoiser, 8 bounces, adaptive sampling.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
fix: use OUTPUT_DIR for poster path instead of /tmp
Johnny Osbournce+1: Claude Opus 4.7
e792583
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Render test poster frame before full render (CPU/EEVEE)
Johnny Osbournce+1: Claude Opus 4.7
2b68086
Renders Frame 500 at 480p with EEVEE CPU and uploads as poster to
HF Dataset. Gives a visual result quickly regardless of GPU status.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Simplify render: no denoising, fewer bounces, static BVH
Johnny Osbournce+1: Claude Opus 4.7
714e7a8
Reduces kernel compilation complexity to avoid A100 hang.
No denoiser kernels, 4 max bounces, STATIC BVH, no adaptive sampling.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Switch back to OptiX-preferred + animation=True
Johnny Osbournce+1: Claude Opus 4.7
4f80e75
OptiX got through 3 frames before per-frame teardown hung Frame 4.
Combined with animation=True (which keeps GPU context alive), this
should avoid the Frame 4 hang by never tearing down between frames.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Use animation=True to keep GPU context alive across frames
Johnny Osbournce+1: Claude Opus 4.7
183027a
Per-frame write_still tears down GPU state between frames, causing
kernel recompilation hangs on A100. animation=True keeps the GPU
session alive for all frames in a phase.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Add libEGL/libGLES for EEVEE headless rendering
Johnny Osbournce+1: Claude Opus 4.7
75108d3
EEVEE needs EGL for offscreen OpenGL context in headless mode.
Without libEGL.so.1, Blender segfaults during EEVEE render.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Switch to EEVEE render engine to bypass Cycles GPU kernel hang
Johnny Osbournce+1: Claude Opus 4.7
0735c09
Cycles on A100 hangs at kernel compilation on Frame 2 regardless
of CUDA/OptiX config. EEVEE uses OpenGL (software Mesa) and should
work reliably in headless mode. Lower visual quality but unblocks
the pipeline.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
fix: pre-compile CUDA kernels by rendering a scene during build
Johnny Osbournce+1: Claude Opus 4.7
a2a4058
The old warmup only called get_devices() which doesn't trigger
kernel compilation. A100 kernel JIT compilation takes minutes and
appears as a hang. Rendering a simple cube forces Cycles to compile
all CUDA kernels for the target architecture.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
fix: only enable devices matching compute backend (CUDA only)
Johnny Osbournce+1: Claude Opus 4.7
ff7e33b
Avoids potential CUDA/OptiX conflict when both device types are
enabled simultaneously. This could be causing the kernel compilation
hang on A100.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
fix: use 'in' instead of 'startswith' for log noise filter
Johnny Osbournce+1: Claude Opus 4.7
04a4555
The Blender output lines start with 'Fra:N' but contain noise markers
later in the line. 'in' check catches these.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
fix: remove --quiet flag not recognized by Blender 4.0.2
Johnny Osbournce+1: Claude Opus 4.7
6747420
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Switch to CUDA-preferred, add --quiet + log filter to suppress sync spam
Johnny Osbournce+1: Claude Opus 4.7
45726d0
CUDA is more stable than OptiX on A100 with Blender 4.0.2 — OptiX
hangs at 'Loading render kernels' on Frame 4. Also filtering per-object
sync/BVH lines so real render progress is visible in the 500-line
log window.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Fix: texture_limit must be string in Blender 4.0, not int
Johnny Osbournce+1: Claude Opus 4.7
8e7e6ab
Blender 4.0 changed scene.cycles.texture_limit from int to string enum.
1024 -> '1024' fixes TypeError: expected a string enum, not int.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Debug: embed Blender error in status, remove log redirect
Johnny Osbournce+1: Claude Opus 4.7
c51bb79
- run_blender_phase now saves detailed error to status.json
- render_all_phases no longer overwrites error with generic message
- Removed stdout redirect so Space logs are visible
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Fix: use /tmp instead of /app for output (HF Spaces non-root user)
Johnny Osbournce+1: Claude Opus 4.7
acee7fc
/app is not writable by the Space runtime user. Move output dir,
render logs, and scene output to /tmp where write access is guaranteed.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>