Accelerator tensors are copied through a fixed-size CPU buffer. We do not mmap the * cache file and we do not allocate a second graph-sized blob just to serialize * it; both would be poor fits for this very large model. */
| 23449 | false, |
| 23450 | freq_base, |
| 23451 | freq_scale, |
| 23452 | ext_factor, |
| 23453 | attn_factor, |
| 23454 | DS4_ROPE_YARN_BETA_FAST, |
| 23455 | DS4_ROPE_YARN_BETA_SLOW, |
| 23456 | DS4_RMS_EPS) != 0; |
| 23457 | } |
| 23458 | if (!decode_q_norm_rope_fused) { |
| 23459 | if (ok) ok = ds4_gpu_head_rms_norm_tensor(metal_graph_q(g), 1, tp_heads, DS4_N_HEAD_DIM, DS4_RMS_EPS) != 0; |
| 23460 | if (ok) { |
| 23461 | metal_graph_debug_dump_tensor("Qnorm", metal_graph_q(g), q_dim, il, pos); |
| 23462 | } |
| 23463 | if (ok) ok = ds4_gpu_rope_tail_tensor(metal_graph_q(g), 1, tp_heads, DS4_N_HEAD_DIM, |
| 23464 | DS4_N_ROT, pos, |
| 23465 | compressed ? (uint32_t)DS4_ROPE_ORIG_CTX : 0, |
| 23466 | false, freq_base, freq_scale, ext_factor, attn_factor, |
| 23467 | DS4_ROPE_YARN_BETA_FAST, DS4_ROPE_YARN_BETA_SLOW) != 0; |
| 23468 | } |
| 23469 | DS4_METAL_PROFILE_DECODE_STAGE("q_path"); |
| 23470 | if (ok) { |
| 23471 | metal_graph_debug_dump_tensor("Qcur", metal_graph_q(g), q_dim, il, pos); |
| 23472 | } |
| 23473 | if (!qkv_rms_fused) { |
| 23474 | if (ok) ok = metal_graph_matmul_dense_quant_tensor(metal_graph_kv_raw(g), |
no test coverage detected