mudler/LocalAI · critical
[acestep-cpp] FATAL: silence_latent not found in %s\n
Error message
[acestep-cpp] FATAL: silence_latent not found in %s\n
What it means
acestep-cpp fatal: the DiT GGUF opened and parsed (gf_load succeeded) but contains no 'silence_latent' tensor — a [15000, 64] float blob the generator needs for masking silence. Its absence means the GGUF was produced by a converter that did not export the latent, so load_model closes the GGUF and returns 2. This is a model-artifact defect, not a runtime condition.
Source
Thrown at backend/go/acestep-cpp/cpp/goacestepcpp.cpp:93
fprintf(stderr, "[acestep-cpp] Loading DiT from %s\n", dit_model_path);
if (!dit_ggml_load(&g_dit, dit_model_path)) {
fprintf(stderr, "[acestep-cpp] FATAL: failed to load DiT from %s\n", dit_model_path);
return 1;
}
g_dit_loaded = true;
// Read DiT GGUF metadata + silence_latent
{
GGUFModel gf = {};
if (gf_load(&gf, dit_model_path)) {
g_is_turbo = gf_get_bool(gf, "acestep.is_turbo");
const void * sl_data = gf_get_data(gf, "silence_latent");
if (sl_data) {
g_silence_full.resize(15000 * 64);
memcpy(g_silence_full.data(), sl_data, 15000 * 64 * sizeof(float));
fprintf(stderr, "[acestep-cpp] silence_latent: [15000, 64] loaded\n");
} else {
fprintf(stderr, "[acestep-cpp] FATAL: silence_latent not found in %s\n", dit_model_path);
gf_close(&gf);
return 2;
}
gf_close(&gf);
} else {
fprintf(stderr, "[acestep-cpp] FATAL: cannot read GGUF metadata from %s\n", dit_model_path);
return 2;
}
}
// Load VAE model
fprintf(stderr, "[acestep-cpp] Loading VAE from %s\n", vae_model_path);
vae_ggml_load(&g_vae, vae_model_path);
g_vae_loaded = true;
fprintf(stderr, "[acestep-cpp] All models loaded successfully (turbo=%d)\n", g_is_turbo);
return 0;
}View on GitHub (pinned to 44413a9d06)
Solutions
- Re-obtain the DiT GGUF from the source/gallery entry this backend documents — official artifacts include silence_latent.
- If self-converting, use the converter version the backend README pins and verify 'silence_latent' is present (gguf-dump / gguf-py inspect) before deploying.
- Do not attempt generation with the bad file: the check is load-time for exactly this reason.
Example fix
# verify the tensor exists before deploying gguf-dump dit.gguf | grep silence_latent # before: (no output) -> FATAL at load # after: silence_latent f32 [15000, 64] -> loads ok
Defensive patterns
Strategy: validation
Validate before calling
# reject GGUFs lacking the latent before deploying
gguf-dump dit.gguf | grep -q 'silence_latent' || { echo 'dit.gguf missing silence_latent' >&2; exit 1; } Type guard
bool has_silence_latent(const GGUFModel& gf) {
return gf_get_data(gf, "silence_latent") != nullptr; // [15000, 64] f32
} Prevention
- Only use converter builds the acestep-cpp backend documents; they export aux tensors like silence_latent.
- Add a CI artifact check that gguf-dump lists silence_latent with shape [15000, 64].
- Treat this fatal as a hard artifact rejection — no runtime workaround exists.
When it happens
Trigger: Using a DiT GGUF converted with an older/modified acestep converter that skips silence_latent, or hand-merged GGUFs where the metadata tensor was dropped; gf_get_data(gf, "silence_latent") returns NULL.
Common situations: Community-converted GGUFs missing aux tensors; quantization pipelines that only keep compute tensors; version mismatch between converter and this backend revision.
Related errors
- [acestep-cpp] FATAL: failed to load DiT from %s\n
- [acestep-cpp] FATAL: cannot read GGUF metadata from %s\n
- [acestep-cpp] FATAL: failed to load BPE tokenizer\n
- [acestep-cpp] ERROR: models not loaded\n
- [acestep-cpp] ERROR: T=%d exceeds max 15000\n
AI-assisted analysis of mudler/LocalAI@44413a9d06 (2026-08-15).
Data as JSON: /api/errors/b03091bcb77aaf82.
Report an issue: GitHub.