【免费下载链接】hugot
Onnx transformer pipelines in Golang
Hugot是一个用 Go 语言实现开源大语言模型本地推理的开源库:基于 ONNX 格式与 ONNX Runtime GenAI 后端,你可以在 Go 应用内直接加载并对话 Qwen、Phi、Gemma 等 LLM——无需 Python 服务、无需 REST API,模型与数据全部留在自己的机器上。本文带你在 5 个步骤内从零搭出本地大模型对话,并覆盖 GPU 加速、流式输出与工具调用等进阶玩法。
🧩 Hugot 是什么?为什么需要它?
Hugot 把 Hugging Face 风格的 Transformer 流水线(Pipelines)搬到了 Go 生态中,核心设计目标有四点:
| 特点 | 说明 |
|---|---|
| Hugging Face 兼容 | Python 侧训练的模型导出 ONNX 后,预测结果与 Python 版一致 |
| 仅支持 ONNX | 统一模型格式,PyTorch 模型可经 Optimum 一键导出 |
| 进程内推理 | 模型直接跑在你的 Go 进程里,避免 RPC/HTTP 开销 |
| 可插拔后端 | 纯 Go、ONNX Runtime(ORT)、OpenXLA 三种后端,按场景选择 |
它的后端选择逻辑可以这样理解:
- Go 后端:纯 Go 实现、零 cgo 依赖,适合小模型(如 all-MiniLM-L6-v2)和禁止 cgo 的环境,但不支持生成式流水线
- ORT 后端:通过构建标签
-tags ORT编译启用,是目前最快的推理后端,唯一支持文本生成(LLM 对话)的方式,底层使用 ONNX Runtime GenAI - XLA 后端:
-tags XLA启用,唯一支持 TPU 的后端,暂不支持生成式流水线
💡 所以本文主题"本地跑 LLM",走的就是ORT 后端 + ONNX Runtime GenAI这条路线。
第 1 步:环境准备与依赖安装
Hugot 当前在amd64 + Linux上构建和测试,需要 Go 1.27+。
1)获取代码
git clone https://gitcode.com/gh_mirrors/hu/hugot2)下载 ONNX Runtime 动态库
ORT 后端需要libonnxruntime.so。库默认从/usr/lib/libonnxruntime.so查找(路径解析逻辑见 options/options.go),你可以通过三种方式指定其他位置:
- 设置环境变量
ONNXRUNTIME_DIR - 创建会话时传
options.WithOnnxLibraryPath("/path/to/lib/dir") - 直接把库放进默认目录
仓库中的 scripts/download-onnxruntime.sh 演示了如何从 ONNX Runtime 官方发布页拉取并安装到/usr/lib(加--cuda参数则下载 GPU 版)。参考 Dockerfile 可以看到完整的生产环境依赖组合。
3)在你的 Go 项目中引入
go get github.com/knights-analytics/hugotORT 后端需要编译时打开构建标签:
go build -tags ORT第 2 步:下载 ONNX 格式的大语言模型
Hugot 内置了模型下载器,可直接从 Hugging Face 拉取 ONNX 模型,核心入口是DownloadModel,实现位于 downloader.go。它会在下载前校验模型目录中包含.onnx与 tokenizer 文件,保证只接受 ONNX 模型。
以仓库测试用例中的Qwen3-4B(int4 量化)为例,模型清单见 testcases/downloadModels.go:
modelPath, err := hugot.DownloadModel(ctx, "KnightsAnalytics/qwen3-4B-int4", "./models/", hugot.NewDownloadOptions())DownloadOptions可以指定OnnxFilePath、ExternalDataPath(大模型权重常拆成.onnx.data外部数据文件)以及AdditionalFilePaths。生成式模型通常需要额外的genai_config.json(ONNX Runtime GenAI 的配置文件),参考 testcases/downloadModels.go 中 Phi-3.5-vision 的完整示例。
⚠️ 如果你只需要核心引擎、模型已自备,可以用构建标签
-tags NODOWNLOAD编译以排除下载器。
第 3 步:创建会话与文本生成流水线
现在到了最核心的一步。会话创建逻辑见 hugot_ort.go——注意一个细节:一个进程中同一时间只能有一个原生 ORT 会话(ONNX Runtime 每进程单环境),所以长生命周期服务只需创建一个会话,复用给所有流水线。
session, err := hugot.NewORTSession(ctx) check(err) defer session.Destroy() config := hugot.TextGenerationConfig{ ModelPath: modelPath, Name: "chat", Options: []hugot.TextGenerationOption{ pipelines.WithSystemPrompt("You are a helpful assistant."), pipelines.WithMaxLength(2000), }, } pipeline, err := session.NewPipeline(config) check(err)TextGenerationPipeline由 pipelines/textGeneration.go 定义,常用选项一览:
| 选项 | 作用 |
|---|---|
WithSystemPrompt(s) | 为每轮对话预置系统提示词 |
WithMaxLength(n) | 限制生成 token 数(默认 4096) |
WithStreaming() | 开启流式输出,逐 token 返回 |
WithTemperature(t)/WithTopP(p)/WithSeed(s) | 控制采样随机性 |
WithStopSequences(ss) | 指定停止序列 |
对话通过消息(backends.Message,定义见 backends/generative.go)进行,支持多轮历史与批量输入:
inputs := [][]backends.Message{ {{Role: "user", Content: "what is the capital of the Netherlands?"}}, } output, err := pipeline.RunMessages(ctx, inputs) fmt.Println(output.Responses[0]) // "The capital of the Netherlands is Amsterdam."上面这段正是官方测试 tests/pipelines.go 的玩法:用 Qwen3-4B-int4 问答荷兰首都,断言答案包含 "Amsterdam"。完整的 ORT 文本测试入口在 tests/ort/hugot_ort_text_test.go。
流式输出:像 ChatGPT 一样逐字打印
开启WithStreaming()后,返回值不再是完整响应,而是两条 channel——TokenStream与ErrorStream(见 pipelines/textGeneration.go),用 Go 原生 channel 实现自然逐字渲染:
for token := range output.TokenStream { fmt.Print(token.Token) // 实时打印每个 token }第 4 步:进阶玩法 🚀
并发批量推理:默认逐会话生成;创建会话时加上options.WithGenerativeEngine()可启用 ONNX Runtime GenAI 的 Engine 模式,获得并发请求与推理批处理能力(仅纯文本消息),参考 tests/ort/hugot_ort_text_test.go。
CPU 吞吐调优:高并发场景下(每核一个 goroutine 共享同一流水线),建议按 README 的 Performance Tuning 章节设置WithInterOpNumThreads(1)、WithIntraOpNumThreads(1)、WithCpuMemArena(false)等选项,可大幅提升吞吐。
工具调用与约束生成:WithTools()支持 Hermes 风格工具定义 JSON,WithGuidance()支持用 Lark 语法、JSON Schema 或正则约束输出,强制模型输出合法结构(如 JSON)。官方测试 tests/pipelines.go 演示了让模型"查时间 + 查巴黎天气"并严格输出两个工具调用的完整案例。
多模态:Message结构体带ImageURLs/AudioURLs字段,结合 Phi-3.5-vision-onnx 等模型即可跑视觉问答;视觉测试见 tests/ort/hugot_ort_multimodal_test.go。
NVIDIA GPU 加速:安装 CUDA 版 ONNX Runtime 与匹配的 CUDA/cuDNN 库后,创建会话时传入options.WithCuda(map[string]string{"device_id": "0"})即可。ORT 还支持 TensorRT、CoreML、OpenVINO 等执行器。
微调训练:Hugot 已内置训练器(基于 goMLX),可对 FeatureExtraction 类模型做语义相似度微调,服务于 RAG 与语义搜索场景,示例在 tests/training/hugot_training_test.go。
常见问题速查(避坑指南)
Q1:编译时提示找不到NewORTSession?ORT 后端受构建标签保护,-tags ORT或-tags ALL才能启用;不加标签编译的是 hugot_ort_disabled.go 中的存根。
Q2:报 "another session is currently active"?ONNX Runtime 每进程只允许一个原生环境,销毁旧会话(session.Destroy())后再创建新会话,或全程复用同一个会话。
Q3:模型下载失败或想换模型来源?Hugot 只认 ONNX 格式。用 Optimum 把 PyTorch 模型导出 ONNX 后,把genai_config.json、tokenizer 等文件与模型放好,直接以本地路径传给TextGenerationConfig.ModelPath即可,跳过下载。
Q4:能用纯 Go 后端跑 LLM 吗?暂不能。生成式流水线目前仅 ORT 后端支持;纯 Go 后端面向小批量、小模型的轻量场景。
Q5:内存够吗?优先选 int4 量化模型(如本文的 Qwen3-4B-int4),4B 级别量化模型在 16GB 内存的普通服务器上即可流畅本地推理;GPU 上训练与推理都更快更省内存。
项目结构速览
| 路径 | 内容 |
|---|---|
| hugot.go | 会话核心:创建/注册/销毁流水线,统计信息 |
| hugot_ort.go | ORT 后端会话入口与单会话互斥控制 |
| pipelines/textGeneration.go | 文本生成流水线与全部生成选项 |
| backends/ | 后端抽象、消息与生成选项定义 |
| options/options.go | 会话级配置:线程、CUDA、库路径等 |
| downloader.go | Hugging Face 模型下载器 |
| tests/ort/ | 各流水线的 ORT 后端集成测试 |
| testcases/downloadModels.go | 官方测试所用模型清单 |
写在最后
Hugot 让"在 Go 中本地运行开源大语言模型"变成了一件很自然的事:NewORTSession→DownloadModel→NewPipeline→RunMessages,四步完成一次对话,模型不出内网、依赖不进 Docker 之外的生态,还顺带拿到了流式输出、工具调用与 GPU 加速这些生产级能力。如果你的生产栈是 Go,这就是把 Hugging Face 模型"平移"进 Go 的完整路径 🎯
【免费下载链接】hugot
Onnx transformer pipelines in Golang
相关推荐
开发者指南:如何用ONNX Runtime GenAI接入本地大模型Qwen2.5-Coder-1.5B-Instruct_rai_1.8.0_hybrid
开发者指南:如何用ONNX Runtime GenAI接入本地大模型Qwen2.5 Coder 1.5B Instruct_rai_1.8.0_hybrid 本
如何在Go中直接从Hugging Face获取ONNX模型:Hugot DownloadModel实战手册
如何在Go中直接从Hugging Face获取ONNX模型:Hugot DownloadModel实战手册 Hugot 是一个 Go 语言库,它把 Huggin
Gutenberg 区块编辑器数据层实战:用 Selectors 和 Actions 驾驭 core/block-editor 的五个任务域
Gutenberg 区块编辑器数据层实战:用 Selectors 和 Actions 驾驭 core/block editor 的五个任务域 你的插件想在用户删
后端前端
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考