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

  1. Re-obtain the DiT GGUF from the source/gallery entry this backend documents — official artifacts include silence_latent.
  2. If self-converting, use the converter version the backend README pins and verify 'silence_latent' is present (gguf-dump / gguf-py inspect) before deploying.
  3. 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

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


AI-assisted analysis of mudler/LocalAI@44413a9d06 (2026-08-15). Data as JSON: /api/errors/b03091bcb77aaf82. Report an issue: GitHub.