突破硬件限制:ONNX Runtime GenAI实现LLM本地CPU推理新范式

突破硬件限制:ONNX Runtime GenAI实现LLM本地CPU推理新范式

有时小模型就足够了,而且你并不总是需要 GPU。将一些“工具型”任务直接跑在 CPU 上有很多理由:有时你就是没有 GPU;或者你希望数据留在本地;又或者你只是想保持架构简单。

这就是 ONNX Runtime GenAI 的用武之地。它让你可以在想要的地方运行模型:有 GPU 就用 GPU,没有就跑 CPU,而且无需改一行代码。本文将展示它如何工作。所有示例代码都在 onnx-inference 仓库中。

从哪里开始:可移植的 ML 模型

一切始于 2017 年 9 月。行业领袖意识到 ML 工具链的碎片化正在伤害所有人,于是推出了 ONNX 作为共享标准。它的主张很简单:为模型提供一个“通用翻译器”。你可以在偏好的框架中训练,导出为通用标准,然后在各种硬件目标上高效运行该模型。

行业行动迅速。到那年年底,更多公司加入;2018 年,Microsoft 将 ONNX Runtime 开源,这是一个旨在在任何硬件上高效“运行”这些模型的引擎。2019 年,它升级为 Linux Foundation AI 项目,巩固了其作为开放标准的地位。

走向何方:可移植的 LLM

当 2023 年左右 LLM 迎来爆发时,ONNX 面临新的挑战。传统模型是无状态的:输入进入,预测输出。LLM 不一样——它们“健谈”,有记忆,会逐 token 生成文本,需要管理“KV cache”来记住对话上下文。

标准的 ONNX runtimes 并不是为这种循环而生的。

因此在 2024 年,社区发布了 onnxruntime-genai。它在核心 runtime 之外封装了 LLM 所需的专用逻辑:tokenization、generation loops、诸如 beam search 的搜索策略,以及状态管理。

快进到 2026 年,我们已经在 Hugging Face 上拥有了一个预量化 ONNX 模型库。你可以即取即用,无需训练或格式转换。

使用该库

onnxruntime-genai 的好处在于它替你处理了生成逻辑。如果用原始的 ONNX Runtime,你需要手写循环把输出 token 反馈回输入。

现在看起来是这样的:

“`python
import onnxruntime_genai as og

Load a model (this path works for CPU, GPU, or mobile automatically)

model = og.Model(‘path/to/model’)
tokenizer = og.Tokenizer(model)

Configure how you want to search

params = og.GeneratorParams(model)
params.set_search_options(max_length=256, batch_size=1)

The generation loop

generator = og.Generator(model, params)
generator.append_tokens(tokenizer.encode(prompt))
while True:
generator.generate_next_token()
if generator.is_done():
break

# Decode and print as we go
token = generator.get_next_tokens()[0]
print(tokenizer.decode(token), end='', flush=True)

“`

它在幕后做了大量工作:处理 KV cache,应用你的搜索策略(greedy、top-p 等),并将算子路由至最佳可用硬件(CUDA、CoreML 或 CPU)。

硬件、模型与量化

自 LLM 早期以来,有几件事发生了变化。处理器更快了,模型在更小规模下也具备了令人惊讶的能力。

还有就是“量化”。我们不再受限于以完整的 32 位精度运行模型。像 INT4 量化这样的技术能显著压缩权重,而对准确率的影响却出乎意料地小。

我用 onnx-inference 测试了不少模型。需要注意的是,这些小模型对结构理解不错,但并不适合知识密集型任务。

对于非常简单的任务,你可以用像 SmolLM2–135M 这样的小模型。做基础补全或分类很合适。

对于更复杂的任务,你会需要更大的模型。Qwen 3–0.6B 在参数只多几亿的情况下,能力大幅提升。

当你在 CPU 上考虑超过 5 亿参数的模型时,需要仔细权衡可接受的上下文窗口、最大生成 token 数和延迟。

构建可移植的服务端

将推理逻辑封装进一个轻量级服务端能让它通用可用。无论调用方使用什么语言,都能轻松访问。我的仓库代码提供了一个实现此目的的 FastAPI 服务。

主类是 OnnxTextGenerator,它负责处理推理逻辑:

“`python
from inference import OnnxTextGenerator

Auto-detects hardware

generator = OnnxTextGenerator()

Simple run

result = generator.generate(
prompt=”Explain quantum computing like I’m five:”,
max_new_tokens=100,
temperature=0.7
)

print(result[‘generated_text’])
“`

对于实时应用,你不可能等完整答案返回。可以改用流式生成:

python
for chunk, metadata in generator.stream_generate(
prompt="Write a haiku about Docker:",
max_new_tokens=50,
temperature=0.8
):
print(chunk, end='', flush=True)

每个函数都作为一个 FastAPI endpoint 暴露:

python
@app.post("/generate")
async def generate(request: GenerateRequest):
result = generator.generate(
prompt=request.prompt,
max_new_tokens=request.max_new_tokens,
temperature=request.temperature
)
return {
"generated_text": result["generated_text"],
"tokens_generated": result["tokens_generated"],
"finish_reason": result["finish_reason"]
}

初始化器会自动寻找最佳硬件 execution provider,以实现“开箱即用”:CUDA(NVIDIA GPU)→ CoreML(Apple Silicon)→ CPU(通用回退)。

容器化策略

对于这类小模型,一个便捷的做法是将模型“直接烘焙进镜像”。这样部署后即可用,无需等待下载。

下面是一个精简版 Dockerfile:

“`dockerfile
FROM python:3.12-slim

COPY requirements.txt .
RUN pip install -r requirements.txt

ARG MODEL_ID=onnx-community/SmolLM2-135M-Instruct-ONNX
RUN hf download ${MODEL_ID} –local-dir /app/model

COPY . /app
WORKDIR /app

CMD [“uvicorn”, “app:app”, “–host”, “0.0.0.0”, “–port”, “8080”]
“`

当加载此容器时,模型已存在于磁盘上,能够即时启动,并且在无网络环境下也能正常工作。

在 Google Cloud Run 上无服务器化

Cloud Run 非常适合部署使用小模型的应用。其空闲时可缩容至零,从而无需为闲置资源付费。由于使用的是 CPU,也无需预配 GPU 实例。

从源码部署

可以直接从源码部署。以下命令使用 Google Cloud Build 构建容器,并在一步内将其部署到 Cloud Run。

我们在此设置了几个特定参数:分配 2 个 CPU(推理是计算密集型任务)和 4Gi 内存(足以容纳小模型及其 KV 缓存)。同时将并发度设为 4,使实例能在不剧烈抖动缓存的情况下处理少量并发请求。

bash
gcloud run deploy onnx-inference
--allow-unauthenticated
--concurrency 4
--cpu 2
--labels dev-tutorial=onnx-inference
--memory 4Gi
--region us-central1
--source .

测试

部署完成后,获取新服务的 URL,并使用简单的 curl 命令进行测试。

“`bash
SERVICE_URL=$(gcloud run services describe onnx-inference
–region $REGION
–format ‘value(status.url)’)

curl -X POST “$SERVICE_URL/generate”
-H “Content-Type: application/json”
-d ‘{“prompt”: “Why is efficient AI important?”, “max_new_tokens”: 50}’
“`

故障排查

可能会遇到的一些问题:

  • 缺少 genai_config.json:并非所有 Hugging Face 上的 ONNX 模型都包含 ONNX Runtime GenAI 库所需的配置文件。示例代码会在缺失时尝试推断配置,但最好使用自带该配置的模型。
  • Execution providers:示例目前包含 CUDA、CoreML 和 CPU,但也可以轻松添加其他 provider,例如 TensorRT 或 OpenVINO。
  • 参数调整:当提高 max_new_tokens 时,KV 缓存会增大,注意力机制的计算量也会增加。需关注内存占用与延迟的变化。

总结

小模型已经取得了长足进步。借助 ONNX Runtime GenAI 和适度的量化技术,如今可以在几年前还难以想象的环境中运行能力不俗的大语言模型。

这为一类全新的应用打开了大门:完全私有的本地助手、智能边缘设备,以及几乎零维护成本的无服务器 API。

如果想进行尝试,可以在几分钟内快速开始。可以从 GitHub 上的 onnx-inference 仓库获取代码,查阅官方的 ONNX Runtime GenAI 文档了解更多细节,或浏览 Hugging Face ONNX Community 寻找合适的模型。


关注“鲸栖”小程序,掌握最新AI资讯

本文来自网络搜集,不代表鲸林向海立场,如有侵权,联系删除。转载请注明出处:https://www.itsolotime.com/archives/20724

(0)
上一篇 5天前
下一篇 5天前

相关推荐

  • 清华MARSHAL框架:通过策略游戏自博弈激发大模型的多智能体推理泛化能力

    近日,清华大学等机构的研究团队提出了 MARSHAL 框架。该框架利用强化学习,让大语言模型在策略游戏中进行自博弈(Self-Play)。实验表明,这种多轮、多智能体训练不仅提升了模型在游戏中的博弈决策水平,更将其推理能力有效泛化到了通用的多智能体系统中:在数学竞赛和专家级问答等一般推理任务中,显著提升了多智能体系统的整体表现。 论文标题:MARSHAL: …

    2026年1月9日
    10200
  • 清华联手生数开源TurboDiffusion:单卡2秒生成视频,速度提升200倍

    清华联手生数开源TurboDiffusion:单卡2秒生成视频,速度提升200倍 现在,生成一个视频可能比你刷视频还要快。 一个开源新框架,能让视频生成在保证质量的情况下,最高提速200多倍,并且仅需单张显卡即可实现。 以1.3B参数、480P分辨率的模型为例,在单张RTX 5090上生成一段5秒视频,原始方法需要约184秒。而采用新框架后,时间缩短至1.9…

    2025年12月25日
    9900
  • RAG延迟削减97%!REFRAG技术揭秘:压缩、感知、扩展三阶段实现效率飞跃

    传统RAG为何低效:冗余与延迟的根源 传统检索增强生成(RAG)流水线通常将检索到的多个文本片段直接拼接,作为上下文输入给大语言模型。然而,这些片段之间往往缺乏紧密的语义关联,导致模型在处理时需要为大量无关内容计算注意力权重。这不仅浪费了宝贵的计算资源,更关键的是,模型将大量时间耗费在了跨片段(cross-chunk)的、近乎无效的注意力计算上,效率低下。 …

    2025年11月26日
    10700
  • LLM推理优化全景图:从基础设施到模型算法的全栈工程实践

    本文基于真实的企业级AI平台研发与实践经验,首次以“系统分层、功能解耦”的架构思想,自底向上地呈现一幅完整的LLM推理优化全景图。文章详细剖析了从基础设施层(GPU集群、高速网络、存储加速)的硬件基石,到平台与调度层(Kubernetes、高级调度器、KServe)的资源管理中枢,再到服务与容器层的微观优化,以及AI网关层作为智能流量枢纽的核心能力。最终,深入探讨了推理引擎与算法层的核心优化技术,包括KV缓存管理、连续批处理、模型压缩及创新的Prefill/Decode分离架构。

    2025年10月2日
    58112
  • 阿里VLCache革新视觉语言模型推理:仅计算2%视觉token实现16倍加速,精度近无损

    关键词:VLCache、视觉语言模型(VLM)、KV缓存复用、动态重计算、推理加速、精度保留 你有没有遇到过这样的场景:用 AI 工具连续询问同一张图片的不同问题时,每次都要等待好几秒才能得到回复?明明图片没有变,模型却要重复处理整幅图像,造成大量冗余计算。 VLCACHE: Computing 2% Vision Tokens and Reusing 98…

    2026年1月8日
    13500