推理流程
string -> tokenid[T] -> embeddeding[T, d_model] -> for in embeddeding = vector -> infer -> logits[1, vocab] -> sampler[1] -> tokenid -> word
两个阶段:
- Prefill: 下一次喂入的 token 是 embeddeding 里取的
- Decode: 上一次生成的 token 作为下一次的输入
算子之间是怎么做到数据传递的
- 初始化的时候有些权重 mmap 映射到内存
- 用 Tensor 封装数据,kernel 直接从输入 Tensor 的底层 Buffer 读数据、往输出 Tensor 的底层 Buffer 写数据,模型层面再通过 runtime_tensors_ 统一管理这些中间张量和 KV cache,中间通过指针交换
改进
推理层面:
- prefill 阶段,是一个一个 tokenid 喂入的,可以改成一次性喂入,batched prefill
- kvcache 依然是固定大小,极大地限制了上下文,更先进的 kvcache 管理方法,涉及到模型架构
算子
- Add
- Embedding
- MatMul
- SwiGLU
- Argmax
- RMSNorm
- RoPE
- Softmax
- MHA