Summary
Every new export/preview ffmpeg worker spends ~2.5β3 minutes on a single CPU thread after locating the .tz3 model and before Loading filename / TensorRT engine load. During that time the GPU is idle. After that silence, the already-cached TensorRT engine loads in well under a second and rendering proceeds at normal speed.
This is not fixed by moving the model folder, running as Administrator, changing VPN/network, or reinstalling the same models. The cost repeats for every queued job with the same model and resolution, so a queue of many short clips is dominated by model prep, not by GPU work.
Environment
- App: Topaz Video 1.6.1
- Video AI runtime: 2.0.32
- AIEngine: 3.8.27
- OS: Windows 11
- GPU: NVIDIA (TensorRT path working)
- Example model:
apo-v8-fp16-576x416-ox.tz3(~239.95 MiB package; inner ONNX ~270 MB) - Persistent TRT cache: Present (
vtrtengine ~274 MB); engines write and load successfully - Post-stall TRT load: Sub-second
- Actual short-clip render after load: Normal GPU use (e.g. ~10β15 s for a short test)
Exact log sequence (representative)
Control run with Topazβs default model directory on C:\ProgramData\... (same behavior on a custom local U:\ model path):
15:52:31.744 Locate apo-v8-fp16-576x416-ox.tz: status 0
15:52:31.744 Cannot open zip ...apo-v8-fp16-576x416-ox.tz
15:52:31.744 Locate apo-v8-fp16-576x416-ox.tz3: status 1
15:52:31.744 CACHING MAY NOT WORK
[~176 seconds of worker log silence]
15:55:27.875 Loading filename apo-v8-fp16-576x416-ox.tz3
15:55:27.876 Unable to create or use .../jitRTCache/
(sometimes seen; does not explain the long gap)
15:55:28.275 Cached TensorRT engine loaded
(~0.4 s after "Loading filename")
then normal GPU render
CACHING MAY NOT WORK appears at the start of the silence. Prior staff comments indicate this is printed while checking an in-memory cache and is safe to ignore as an error string. The bug is not the message itself β it is the multi-minute work that follows in every fresh worker process.
Staff note (historical):
βββ
What the worker is doing during the silence
Measured on a fresh worker during the gap:
β’ CPU: One thread saturated
β’ GPU (nvidia-smi): ~1% util / idle power
β’ Network: No transfer (VPN on/off unchanged)
β’ Physical disk I/O on model file: Not required (often fully cache-resident)
β’ Large temp unpack file: Not observed
β’ Logical reads (process): Increase roughly linearly over the gap
β’ Working set: Bounded (hundreds of MiB order; not unbounded growth)
β’ Worker log: Silent until Loading filename
After the gap: TRT cache hit β normal GPU load β normal encode/render.
βββ
Controlled experiments (this machine)
β’ Normal restart β Custom local NTFS NVMe (U:...\models) β ~171.9 s β No improvement
β’ Run as Administrator β Same U:\ path β ~168 s β No improvement
β’ Default model directory β C:\ProgramData\Topaz Labs LLC\Topaz Video\models β 176.131 s β No improvement
β’ VPN on / off β same behavior β Not network/CDN
β’ Back-to-back same model + resolution β repeats every job β Not a one-time first-run cost
Notes:
β’ C: and U: model packages were byte-identical
β’ TRT engines write and read successfully
β’ The long delay is before the fast engine load
β’ Across packages on this machine, pre-load delay scales with package size at roughly 1.4β1.5 MiB/s (wall time vs package size)
βββ
Independent corroboration (public support logs)
Related thread:
Logs in that bundle (Topaz Video 1.6.0 / runtime 2.0.27 / AIEngine 3.8.20) show the same pattern on separate FFmpeg preview workers:
Locate .tz3 β long gap β Loading filename
Approximate pairing by package size:
β’ Iris v2 (~56.6 MiB) β ~23 s β ~2.4 MiB/s
β’ Apollo Fast v2 (~76.6 MiB) β ~30 s β ~2.5 MiB/s
β’ Apollo v8 (~240 MiB) β ~95 s β ~2.5 MiB/s
Near-linear in package size (near-zero fixed intercept). Iris runs often report loading from jitRTCache after the package gap.
During the wait, UI polling of unfinished MP4 previews produces moov atom not found / QML errors about once per second. That matches preview file not ready yet, not a separate root cause: no frames exist until model prep finishes.
βββ
What this is not
Ruled out by controls and measurements:
- Model drive / folder ACLs β same stall elevated and on default C:\ProgramData models
- Network / VPN / CDN β no transfer; VPN state irrelevant
- TensorRT engine rebuild β sub-second cached engine load right after the silence
- NVENC -rc-lookahead / encoder GOP β would scale with frames/encode path, not .tz3 size; GPU idle during gap
- moov atom not found as the cause β symptom of unfinished preview output while the worker is still in model prep
βββ
Working diagnosis (for engineering)
- Queued jobs spawn short-lived ffmpeg workers.
- Decoded / materialised model state appears process-local (consistent with βload once per processβ and with CACHING MAY NOT WORK as an in-memory check).
- On a cache miss (every new worker), the engine performs a size-proportional, single-threaded pass over the encrypted .tz3 (read / decrypt / inflate / authenticate / validate β exact routine proprietary) before consulting the persistent TRT engine cache.
- Persistent TRT caching works; it does not skip that pre-step in the current loader order.
- User-facing impact is O(number of clips) prep time even when model, resolution, and TRT engine are unchanged.
βββ
User impact
Example: many short clips (e.g. ~10 s each), all Apollo:
β’ Prep β ~3 minutes Γ N jobs with GPU idle
β’ Actual render per short clip may only be tens of seconds
A large queue becomes hours of single-core model prep wrapped around a modest amount of GPU work.
Workarounds that help users but should not be required:
β’ Concatenate many same-settings clips into one export (pay prep once)
β’ Use a smaller model when quality allows
βββ
Request to Topaz
Please treat this as a loader / worker-lifetime issue, not a disk or NVENC ticket.
Questions for engineering:
- Why is the .tz3 fully walked/materialized/validated for every new ffmpeg worker when a matching TensorRT engine is already on disk?
- Is the decoded model / package cache intentionally process-local only in runtime 2.0.32 / AIEngine 3.8.x?
- Is there a supported long-lived worker, shared model cache, or path that skips package materialization when TRT cache hits?
- What condition prints CACHING MAY NOT WORK, and is the in-memory model cache meant to be shared across queued export workers?
Ask: a build with model-loader timing, or a fix that reuses materialised model state across queued jobs (or avoids re-walking .tz3 when the TRT engine is valid).
βββ
Log sharing note
Raw *-Main.tzlog files can contain authentication tokens in auth-manager lines. For support, please use redacted extracts only:
β’ Timestamped Locate / CACHING MAY NOT WORK / Loading filename / TRT cache lines
Do not upload full unredacted main logs.
βββ
Reproduction (minimal)
- Install models locally (Apollo v8 package is a clear amplifier).
- Ensure a TRT engine for that model/resolution already exists (after one successful job).
- Queue two separate exports: same model, same resolution, short clips.
- In each worker log, compare timestamps:
Locate β¦tz3 / CACHING MAY NOT WORK β Loading filename - Expect ~minutes of CPU-bound silence and idle GPU per job, then sub-second TRT load and normal render.
Happy to provide redacted timestamp extracts and the experiment list above for support.
