第 20 章 AI 推理与服务
训练大模型主要依赖 Python 与 CUDA,推理与服务却是另一类工作。模型的权重一旦冻结,剩下的就是系统问题:把数 GB 的权重装入内存,把大量并发请求高效地交给设备,再把生成的词元稳定地流式返回客户端。这些问题与 Go 擅长的领域高度重合,Ollama 的服务进程便是用 Go 编写的。本章以 Ollama、llama.cpp、vLLM 以及几个用 Go 编写的早期项目为例,讨论 Go 在这一层承担的工作。
20.1 讨论 Go 如何接入原生推理运行时:经 cgo、子进程或 purego 跨越 FFI 边界,权重与 KV 缓存为何留在 Go 堆之外、原生内存如何确定地释放,以及进程边界放在哪里如何决定系统的拓扑;20.2 讨论分词与张量:BPE 从压缩算法到子词切分的演变,字节级分词为何与 5.2 的字符串模型一致、又为何要求流式解码处理 UTF-8 编码的边界,以及张量的内存布局、cgo 的指针规则与量化格式;20.3 讨论服务本身:预填充与解码、连续批处理与分页的 KV 缓存、准入时的缓存预留、流式输出的刷新,以及如何用通道与 context 处理背压、取消与过载。