工作日早上 7 点读 AI,周日早上 8 点读周报订阅邮件

METAL LAB

goccy/go-llama

40GoMIT

不依赖C语言库,纯Go代码就能跑大语言模型

go-llama把广泛使用的推理引擎llama.cpp先编译成WebAssembly,再转换成纯Go源代码,由此得到的库可以直接运行GGUF格式的模型文件,不需要cgo(Go调用C语言的机制)也不需要任何共享库,只需一个静态二进制文件。因为已经变成原生Go代码,运行时完全不需要wasm运行环境。

它做什么

  1. 项目先通过llama-wasm把llama.cpp编译成WebAssembly,再用wasm2go工具将其翻译成Go源代码,所以运行时不涉及任何wasm运行环境。
  2. 一个Llama实例内可以加载多个模型,每个模型又能创建多个上下文(各自维护独立的KV缓存),既能让一个模型同时服务多个独立对话,也能同时加载多个模型来实现推测解码——用小模型先做预测、大模型一次性验证以加速生成。
  3. 支持流式输出,生成的文本会按片段实时回调给调用者;也支持中断功能,可以从另一个goroutine(Go的轻量级线程)立即停止正在进行的生成。
  4. 提供沙箱选项,可以限制引擎能访问的目录范围并设置内存上限,让过大的模型在受限环境内失败,而不会拖垮宿主进程。
  5. 受限于wasm32架构,线性内存上限为4GiB,模型权重和所有上下文的KV缓存都要装在这个空间里,因此实际适合的规模大约是30亿参数、Q4量化的模型。

为什么重要

由于不需要cgo也不需要额外的共享库,一次Go构建就能生成可移植的二进制文件,可以交叉编译后部署到服务器、命令行工具乃至嵌入式设备等任何Go能运行的地方。这消除了在Go项目中集成大语言模型推理功能时,通常需要安装原生推理库带来的麻烦。

本仓库术语

  • cgo · Go语言中用于调用C语言库的机制
  • GGUF · llama.cpp生态中常用的一种紧凑的模型权重文件格式
  • WebAssembly(wasm) · 一种为跨环境可移植运行而设计的低级字节码格式
  • KV缓存 · 为每个对话保存此前计算结果、用于加速生成下一个词的临时存储
  • 推测解码 · 先用小模型预测多步、再用大模型一次性验证的加速生成技术

仓库简介(英文)

llama.cpp in pure Go

在 GitHub 打开

热门仓库

全部仓库 →

METAL LAB 最新报道