☰
如何在Go中本地运行开源大语言模型:Hugot + ONNX Runtime GenAI完全实战
2026/11/5 1:50:39 网站建设 项目流程

【免费下载链接】hugot

Onnx transformer pipelines in Golang

项目地址:https://gitcode.com/gh_mirrors/hu/hugot
点击查看免费下载

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/hugot

2)下载 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/hugot

ORT 后端需要编译时打开构建标签:

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.goORT 后端会话入口与单会话互斥控制
pipelines/textGeneration.go文本生成流水线与全部生成选项
backends/后端抽象、消息与生成选项定义
options/options.go会话级配置:线程、CUDA、库路径等
downloader.goHugging 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

项目地址:https://gitcode.com/gh_mirrors/hu/hugot
点击查看免费下载
上一篇:脚本不生效、直播突然黑屏?TwitchAdSolutions调试排错完全指南
下一篇:MOSS-Image-Base 文生图组件级加载实战:from_components_pretrained 灵活组合完全指南

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询