nx_transformer_stack.nx
buildroot/runtime/nx_transformer_stack.nx
about
nx_transformer_stack.nx -- multi-layer transformer forward composer.
L5 brick. The missing layer between "load weights for one block"
(nx_gguf_load_block) and "run the full LLM pipeline" (nx_llm_run
v2 -- next brick).
Composes:
- Pre-allocated scratch tensors (one set, reused across layers)
- Per-layer loop that:
* loads block weights from GGUF via nx_gguf_load_block_weights
* calls nx_transformer_block_forward with the loaded bundle
- Optional final RMSNorm (output_norm.weight from load_model)
Does NOT include: embed, output_projection, sample. Those compose
in nx_llm_run v2. This brick proves multi-layer chain works.
Bits-up composition (every primitive already canonical):
nx_tensor.nx -- NxTensor + alloc
nx_rmsnorm.nx -- final norm
nx_transformer_block.nx -- per-layer forward + weight bundle
nx_gguf.nx + nx_gguf_load.nx -- header + per-tensor load
nx_gguf_load_block.nx -- 9-tensor per-layer loader
genealogy_id: standard_transformer_stack_pattern +
touvron_2023_llama_decoder
lineage_id: substrate_transformer_stack_v1_single_head
dependencies 9 imports · 2 importers
imports: nx_syscalls.nxnx_tier.nxnx_loop.nxnx_tensor.nxnx_rmsnorm.nxnx_gguf.nxnx_gguf_load.nxnx_gguf_load_block.nxnx_transformer_block.nx
imported by: nx_llm_run_v2.nxnx_transformer_stack_test.nx
structs
| none |
consts
| 58 | const NX_TS_OK: nx_int = 0 |
| 59 | const NX_TS_ERR_BAD_DIM: nx_int = 1 |
| 60 | const NX_TS_ERR_OOM: nx_int = 2 |
| 61 | const NX_TS_ERR_LAYER_LOAD: nx_int = 3 |
| 62 | const NX_TS_ERR_BLOCK_FWD: nx_int = 4 |
| 63 | const NX_TS_ERR_NORM_FAIL: nx_int = 5 |
| 64 | const NX_TS_N_VERDICTS: nx_int = 6 |
functions
| 66 | func nx_ts_verdict_is_valid(v: nx_int) -> nx_int called by 1: main |
| 73 | func _ts_alloc_2d(n_tokens: nx_int, dim: nx_int) -> *NxTensor |
| 100 | func nx_transformer_stack_forward( |