Skip to content

ggml-webgpu: Fix GGML_MEM_ALIGN to 8 for emscripten.#18628

Merged
reeselevine merged 2 commits intoggml-org:masterfrom
yomaytk:fix-wasm-backend
Jan 8, 2026
Merged

ggml-webgpu: Fix GGML_MEM_ALIGN to 8 for emscripten.#18628
reeselevine merged 2 commits intoggml-org:masterfrom
yomaytk:fix-wasm-backend

Conversation

@yomaytk
Copy link
Contributor

@yomaytk yomaytk commented Jan 5, 2026

Hello. When attempting to run LLM inference in the browser using WebGPU, the following error occurs.

スクリーンショット 2026-01-06 0 31 03

In Emscripten, max_align_t is 0x8(ref. emscripten-core/emscripten#10072, https://github.com/emscripten-core/emscripten/pull/14599/files), which causes GGML_ASSERT_ALIGNED to fail.
Therefore, I modified the code to set GGML_MEM_ALIGN to 8 when running in an Emscripten environment.

I have confirmed that inference works correctly with examples/simple-chat for at least the following three models:

  • Llama-3.2-1B-Instruct-Q4_1.gguf
  • Llama-3.2-3B-Instruct-UD-Q4_K_XL.gguf
  • Qwen3-4B-Thinking-2507-UD-IQ1_S.gguf

@yomaytk yomaytk requested a review from ggerganov as a code owner January 5, 2026 16:28
@ggerganov ggerganov requested a review from reeselevine January 5, 2026 17:43
@github-actions github-actions bot added the ggml changes relating to the ggml tensor library for machine learning label Jan 5, 2026
@reeselevine
Copy link
Collaborator

interesting, you see failures with simple-chat specifically? I was running test-backend-ops with the Emscripten build and didn't see any issues related to this. I also have an integration with wllama in progress here: ngxson/wllama#198, which seems to work on my Mac without errors.

I know it might be a bit of work, but is there any way to tell why I haven't run into this error yet? Is that assert you're hitting not reached in the paths wllama is taking to call the llama.cpp APIs?

@yomaytk
Copy link
Contributor Author

yomaytk commented Jan 7, 2026

Thank you for the review.

you see failures with simple-chat specifically?

This error originates from llama_init_from_model so it does not seem to be specific to simple-chat.
More specifically, the pointer created by buf_compute_meta.resize() inside llm_graph_result::reset() is passed to ggml_init(params), where it eventually triggers an assertion failure in GGML_ASSERT_ALIGNED.
Although ggml_init is called from many places, in most cases params.mem_buffer is NULL, so the pointer allocated by ggml_aligned_malloc is checked by the assertion and passes successfully (since ggml_aligned_malloc guarantees 64-byte alignment).
The following shows the logs immediately before GGML_ASSERT_ALIGNED during LLaMA model inference in the browser.
It can be seen that params.mem_buffer is NULL in all cases except for the one that results in the error.

params.mem_buffer: 0, ctx->mem_buffer: 0x0x1b3b80 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x2b8980 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x377fa40 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x3786340 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x3786340 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x3786340 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x3796680 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x3796680 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x37a69c0 (at ggml_init)
simple-chat.js:1744 ...........................................................
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x3786280 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x3786280 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0, ctx->mem_buffer: 0x0x394400 (at ggml_init)
simple-chat.html:146 params.mem_buffer: 0x238328, ctx->mem_buffer: 0x0x238328 (at ggml_init)
simple-chat.js:1744 /home/masashiyoshimura.linux/workspace/llama.cpp/ggml/src/ggml.c:1556: GGML_ASSERT(((uintptr_t) (ctx->mem_buffer))%GGML_MEM_ALIGN == 0) failed
simple-chat.js:616 Aborted()

I was running test-backend-ops with the Emscripten build and didn't see any issues related to this.

As you say, test-backend-ops works correctly in my environment regardless of this fix.
I have not examined test-backend-ops in detail yet, but it appears to be a test at the GGML layer and does not seem to involve LLM model initialization.

I also have an integration with wllama in progress here: ngxson/wllama#198, which seems to work on my Mac without errors.
I know it might be a bit of work, but is there any way to tell why I haven't run into this error yet? Is that assert you're hitting not reached in the paths wllama is taking to call the llama.cpp APIs?

I have not tested wllama yet, but I will take a look at it later.
For now, this is a summary of what I currently understand (due to my schedule, I expect to have time to continue working on this from tomorrow onward).

@reeselevine
Copy link
Collaborator

Ah, I think I might know what's happening here. We recently set llama.cpp to default to 64-bit builds here, but the wllama integration is using 32-bit builds for now, some updates are needed to support 64-bit. Then, looking at the logic around the change in this PR, it looks like align is set to 4 if the max pointer value is 32 bits long, which it would be in the 32-bit wasm build. So this error only occurs in 64-bit wasm builds.

So I think this change will actually work, because if it is a 32-bit wasm build, the first conditional will be true. Otherwise, it must be a 64-bit build, in which case the align fix makes sense. Only suggestion I would make then is to add a comment explaining this in the code.

@yomaytk
Copy link
Contributor Author

yomaytk commented Jan 8, 2026

Thank you for the analysis. As you pointed out, this appears to be an issue specific to 64-bit wasm. I’ve added a comment explaining it—could you please review it again?

@reeselevine reeselevine merged commit 480160d into ggml-org:master Jan 8, 2026
74 of 75 checks passed
@yomaytk yomaytk deleted the fix-wasm-backend branch January 9, 2026 04:08
gary149 pushed a commit to gary149/llama-agent that referenced this pull request Jan 13, 2026
* Fix GGML_MEM_ALIGN to 8 for emscripten.

* Add a comment explaining the need for GGML_MEM_ALIGN == 8 in 64-bit wasm with emscripten
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ggml changes relating to the ggml tensor library for machine learning

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants