草稿

LLM 推理与调度实操:使用 vLLM + Ollama + FastAPI 构建本地问答服务并部署到 Kubernetes

AI 本地化不是权宜之计,而是未来趋势。用 Ollama、vLLM 和 FastAPI,人人都能在无 GPU 环境下体验 LLM 的力量。

在无 GPU 的本地环境下,如何高效部署和调用大语言模型?本文以 Ollama、vLLM 和 FastAPI 为核心,详解本地 LLM 服务的搭建与 Kubernetes 部署实践,助力开发者低门槛体验 AI 推理。

项目背景与架构说明

在本地无 GPU 的 Mac Mini M4 上,如何通过 Orbstack 的本地 Kubernetes 环境部署一个大语言模型(LLM)问答服务?本方案选用 Ollama 作为模型加载与管理工具,FastAPI 提供 HTTP 接口,vLLM 负责推理调度。整体架构为:用户请求 → FastAPI 服务 → vLLM 推理引擎 → Ollama 本地模型 → 返回回答。

Ollama 是一款开源工具,支持本地运行多种 LLM,并提供统一的 REST API。vLLM 是高吞吐、内存高效的推理引擎,FastAPI 则以类型提示和高性能著称,适合构建 RESTful API。由于 Mac M4 不支持外接 GPU,Ollama 和 vLLM 均在 CPU 上运行,Orbstack 提供单节点 Kubernetes 开发环境。

技术选型说明

本节介绍各核心组件的技术选型及其作用。

  • Ollama(本地模型管理,Ollama): Ollama 是一款开源工具,能够在本地机器上下载、管理并运行多种开源 LLM。它简化了模型格式转换和依赖管理(如 ollama run llama3.2 可下载并启动 LLaMA 3 模型),支持 GPU 和 CPU 加速。Ollama 提供命令行和 REST API(如 /api/generate/api/chat),便于集成到其他应用。
  • vLLM(推理调度引擎,vLLM): vLLM 是伯克利开发的高吞吐率 LLM 推理引擎,专为批量推理和多用户场景优化。支持多种硬件平台(包括 Intel/AMD CPU),可在无 GPU 环境下运行。vLLM 兼容 OpenAI API,支持 FP32/FP16 数据类型,模型需提前转换为支持的精度。
  • FastAPI(接口框架,FastAPI): FastAPI 是现代、快速的 Python Web 框架,适合构建 RESTful API。基于类型提示,性能优异,支持自动生成交互文档(Swagger/OpenAPI)。

三者结合,既兼顾无 GPU 兼容性,也保证高效推理和开发便捷性。

架构图

下方为本地 LLM 服务的架构示意图,展示各组件间的交互关系。

图 1: 本地 LLM 服务架构示意
图 1: 本地 LLM 服务架构示意
  • FastAPI 接口: 接收用户 HTTP 请求(如 POST /chat),并调用后端推理服务。
  • vLLM 推理引擎: 负责调度推理任务,兼容 OpenAI API。
  • Ollama 本地模型: 运行指定 LLM 模型,通过 REST API 实现推理调用。

本地开发与测试流程

本节详细介绍本地开发与测试的具体步骤。

  1. 安装 Ollama 并加载模型

    首先需在 macOS 上安装 Ollama,可通过 Homebrew 或官网下载:

    brew install ollama
    

    安装后,使用如下命令拉取并启动模型:

    ollama run llama3.2
    

    启动后,执行 ollama serve 开启 REST API 服务(默认端口 11434)。

  2. 安装并运行 vLLM

    在 Python 环境中安装 vLLM:

    pip install vllm
    

    启动推理服务器示例:

    vllm serve Qwen/Qwen3-8B --device cpu
    

    注意根据 Mac M4 资源选择合适模型,并确保模型为 FP32/FP16 类型。

  3. 实现 FastAPI 应用

    编写 FastAPI 应用,提供如 POST /chat 接口。下方代码示例展示如何通过 HTTP 调用 Ollama 的 API:

    from fastapi import FastAPI, Body
    import requests
    
    app = FastAPI()
    
    @app.post("/chat")
    async def chat(messages: list = Body(...)):
        response = requests.post(
            "http://localhost:11434/api/chat",
            json={"model": "llama3.2", "messages": messages}
        )
        return response.json()
    

    通过上述接口即可实现本地推理。

  4. 接口测试

    启动 FastAPI 应用后,可用 curl 进行接口测试。以下为常用测试命令:

    • 调用 Ollama 接口:

      curl http://localhost:11434/api/chat -d '{"model":"llama3.2","messages":[{"role":"user","content":"你好"}]}'
      
    • 调用 FastAPI 接口:

      curl -X POST http://localhost:8000/chat \
           -H "Content-Type: application/json" \
           -d '{"messages":[{"role":"user","content":"Hello"}]}'
      
    • 调用 vLLM 的 OpenAI 接口:

      curl http://localhost:8000/v1/completions \
           -H "Content-Type: application/json" \
           -d '{
                "model": "Qwen/Qwen3-8B",
                "prompt": "Explain AI",
                "max_tokens": 100
            }'
      

    通过上述命令可验证各部分服务是否正常。

Kubernetes 部署流程

本节介绍如何将本地 LLM 服务部署到 Kubernetes 环境。

  1. 准备 Helm Chart 或 YAML

    推荐使用 Helm Chart 管理部署清单。目录结构示例:

    chart/
      Chart.yaml
      values.yaml
      templates/
        deployment.yaml
        service.yaml
    

    在 Deployment 中通过 volumeMountsvolumes 挂载模型目录,或将模型打包进镜像。

  2. 启动 OrbStack 本地 K8s

    在 Mac 上使用 OrbStack 启动单节点 Kubernetes:

    orb start k8s
    

    OrbStack 内置 kubectl,可直接管理集群。

  3. 部署服务

    使用 Helm 或 kubectl 部署应用:

    helm install llm-service ./chart
    

    kubectl apply -f deployment.yaml
    

    部署后,Kubernetes 会为服务分配 ClusterIP 或 NodePort,OrbStack 支持直接访问 NodePort 服务。

  4. 日志和调试

    部署完成后,可用如下命令查看状态和日志:

    kubectl get pods
    kubectl get svc
    kubectl logs <pod-name>
    

    如模型加载失败,可进入 Pod 内部检查模型文件及类型兼容性(vLLM 需 FP32/FP16)。

部署验证与常见问题排查

本节总结常见问题及排查方法,帮助快速定位和解决部署过程中的障碍。

  • 端口访问问题: 确认服务类型配置正确,OrbStack 的 K8s 可通过 localhost 访问 NodePort/LoadBalancer 服务。若无法访问,检查 OrbStack 设置及 Kubernetes Ingress/Service 配置。
  • 模型加载失败: 若 vLLM 报数据类型不支持,需将模型转换为 FP16 或使用 Ollama 运行。Ollama 对内存有要求,7B 需 8GB,13B 需 16GB,33B 需约 32GB。内存不足时可选用更小模型或开启量化(如 INT8)。
  • 资源占用优化: 无 GPU 环境下性能有限,可减少 max_tokens 或使用更小模型。确保 vLLM 和 Ollama 设置合理线程数,避免阻塞。
  • 调试日志: 利用 kubectl logs 查看容器输出,定位错误。FastAPI 应用日志可辅助排查请求问题。

总结

通过 Ollama、vLLM 与 FastAPI 的组合,即使在无 GPU 的本地环境下,也能高效搭建 LLM 问答服务。Ollama 简化模型管理,vLLM 提供高吞吐推理能力,FastAPI 以低开发成本暴露标准接口。该方案适合本地开发调试,也为线上部署提供一致性保障。对于希望在无 GPU 环境下探索 LLM 的开发者,这是一条清晰可行的实践路径。

参考文献

文章导航

章节内容

这是章节的内容页面。

章节概览