后端API网关LLM 网关人工智能大模型本地部署【免费下载链接】llama-swapReliable model swapping for any local OpenAI/Anthropic compatible server - llama.cpp, vllm, etc项目地址https://gitcode.com/gh_mirrors/ll/llama-swap点击查看免费下载导读在 llama-swap 的 kubeswap 架构里模型是按需加载、随 TTL 或交换事件被驱逐的一个模型 Pod 今天被删除下一次请求时才被重建且可能落在另一个节点上。这决定了存放模型权重的共享缓存卷必须能被所有后端可能落脚的节点挂载——在实践中就是ReadWriteManyRWX。本文围绕 storage-options-kubernetes.md 展开讲清 RWX 的驱动选择、单节点环境下用 RWO 加节点固定node-selector的逃生方案、以及完全不使用 PVC 的 emptyDir 按需拉取方案并结合 kubeswap 源码说明它创建、采纳和校验 PVC 的完整行为。为什么共享模型缓存必须是 ReadWriteManyllama-swap 通过kubeswap serve为每个模型维护一个 Kubernetes Deployment。模型的生命周期由路由器驱动按需加载收到请求、且该模型当前没有运行中的 Pod 时kubeswap 才创建 DeploymentPod 拉起后端服务llama-server、sd-server、whisper-server、audiocpp_server 等TTL 或 swap-in 驱逐空闲超过ttl、或同组内另一个模型需要抢占资源时kubeswap 通过cmdStop即kubeswap delete ...删除 Pod下一次请求重建被驱逐的模型在下次请求时重新调度调度器可以把它放到任何满足条件的节点上。关键在于可能换节点这一环如果共享模型缓存 PVC 是ReadWriteOnceRWO它只能被一个节点挂载。被驱逐的模型重新调度到另一个节点时新 Pod 无法挂载该卷会一直卡在ContainerCreating状态并报卷错误而路由侧只能干等healthCheckTimeout超时——这既拖慢了请求也让健康检查逻辑白白空转。因此只要你的模型可能在不同节点之间漂移共享缓存就必须是ReadWriteMany让每个后端可能落脚的节点都能挂载同一份权重。提供 RWX 的存储驱动文档给出的 RWX 驱动选型表如下驱动说明Longhorn示例中的默认选项通过其 NFS/replica 模式提供 RWX适合家庭实验室homelabCephFSRook原生 RWX集群已经跑 Rook 时的自然选择Azure Files原生 RWXAKS 上的托管方案AWS EFS原生 RWXEKS 上的托管方案NFS Server通过 NFS CSI 驱动或静态 PV 提供 RWX与之相对云厂商的块存储AWS EBS、GCP Persistent Disk、Azure Managed Disks只支持ReadWriteOnce——不要为共享缓存选择它们。块存储适合单个节点独占的场景无法满足权重卷要随模型在节点间漂移的需求。存储规则与 GPU 无关CPU-only 集群同样适用这套选型规则并不依赖 GPU路由器头端head-end本身不需要 GPU不带--gpu的模型会得到一个纯 CPU 的 Pod可以调度到任意节点——kubeswap-kubernetes.md 示例中的 whisper 与 TTS 模型正是这样运行的distil-whisper-lgv3只挂--volume pvc:llama-swap-models:/models:roqwen3-tts-06b以--backend cpu运行一个 CPU 模型被驱逐后同样可能在任何 CPU 节点重建所以多 CPU 节点共享缓存同样需要 RWX只有单节点的 CPU 环境才可以用 RWO 或本地卷配合下面介绍的节点固定pin手段。RWO 逃生方案把后端 Pod 固定到单一节点如果你的集群只有一个 GPU 节点家庭实验室的常见形态RWO 块存储完全可用——前提是每个后端都必须落在那个节点上。用--node-selector把 Pod 钉死即可cmd: - kubeswap serve --listen 127.0.0.1:${PORT} --model lfm25-230m --namespace llama-swap --image ghcr.io/mostlygeek/llama-swap:unified-vulkan --gpu amd.com/gpu1 --node-selector kubernetes.io/hostnamegpu-node # every backend, same node --volume pvc:llama-swap-models:/models:ro -- --model /models/model.gguf --port 8080固定之后RWO PVCEBS、PD、Longhorn RWO在 Pod 运行的任何位置都可以挂载因为 Pod 永远只会被调度到gpu-node这一个节点。一旦去掉固定Pod 可能漂移你又回到了必须使用 RWX 的场景。从源码看--node-selector是keyvalue形式、可重复传入的 flagserve.go渲染时被直接写入 Deployment 的pod.spec.nodeSelectorobjects_test.go 中TestKubeswap_DeploymentSpecMatchesNodeSelector还验证了 node-selector 的漂移会被严格模式检测到并触发替换。零存储逃生方案emptyDir 按需拉取小模型可以完全跳过 PVC每个 Pod 在首次加载时把权重下载进自己的emptyDir。Helm chart 的默认演示配置就是这么做的——values.yaml 中模型只挂了emptydir:model-cache:/models和emptydir:slots:/slots并用-hf QuantFactory/SmolLM2-135M-Instruct-GGUF:Q4_0从 Hugging Face 拉取约 135MB 的权重--volume emptydir:model-cache:/models -- --model /models/SmolLM2-135M-Instruct-Q4_0.gguf -hf QuantFactory/SmolLM2-135M-Instruct-GGUF:Q4_0代价是每次重新加载都要重新下载对 135MB 的演示模型可以接受但对 16GB 级别的图像模型来说非常痛苦。emptyDir 的生命周期与 Pod 绑定Pod 一旦被驱逐TTL、swap-in、节点回收缓存随之消失。顺带一提kubeswap 的--volume语法支持三种卷类型pvc:name:path[:ro]、emptydir:name:path[:ro]和hostpath:nodePath:mountPath[:ro]可重复传入serve.go。其中hostpath会绕过 namespace 边界直接读写节点文件系统kubeswap 在 serve.go 中对此给出明确警告共享缓存场景下应优先使用 PVC。kubeswap 对 PVC 的处理行为结合 serve.go 与 objects.go 的实现kubeswap 对 PVC 的处理遵循三条规则1. 缺失的 PVC 由kubeswap serve自动创建当--volume pvc:name引用的 PVC 不存在时kubeswap 调用renderPVC创建它三个参数共同决定卷的形态参数默认值说明--pvc-size1Gi创建的 PVC 的容量见 serve.go--pvc-class集群默认 StorageClass创建 PVC 时使用的存储类空值即不指定交给集群默认见 serve.go--pvc-access-moderwo取rwo或rwx决定 PVC 的 accessModes见 serve.go在 objects.go 中rwo映射为ReadWriteOncerwx映射为ReadWriteMany。当你预期模型缓存要在节点间漂移时务必传--pvc-access-mode rwx——默认的rwo创建的卷无法被第二个节点挂载。2. 已存在的 PVC 原样采纳绝不重新标记如果 PVC 已经存在比如操作员预置的共享缓存kubeswap 直接采纳而不做任何 relabel也不会替换它——lifecycle_test.go 的TestKubeswap_EnsureResourcesAdoptsExistingPVC验证了这一点。因此正确的做法是把缓存 PVC 声明在 Helm chart 的extraResources下让 helm 负责跟踪详见下节。3. 读写挂载与访问模式不匹配时启动即报错采纳既有 PVC 时kubeswap 会校验其 access modes 能否支撑当前挂载方式objects.go 的pvcAllowsReadWriteReadWriteOnce、ReadWriteOncePod、ReadWriteMany均可ReadOnlyMany不可以。如果模型以读写方式挂载--volume pvc:name:/path不带:ro了一个只读的 PVCkubeswap serve会直接失败错误信息中指明 claim 名称和修复办法加:ro或改用读写 PVC而不是让 Pod 卡在ContainerCreating里。这一行为在 lifecycle_test.go 的TestKubeswap_EnsureResourcesRejectsReadOnlyPVCForWritableMount中覆盖了完整的分支ROX PVC 读写挂载报错、ROX PVC :ro挂载可用、RWO/RWOP/RWX PVC 读写挂载全部可用。:ro挂载对任何 access mode 都成立——把共享缓存以只读方式挂载把 KV slot 等可变状态放到 emptyDir 上即--volume emptydir:slots:/slots--slot-save-path /slots如 kubeswap-kubernetes.md 所示这是文档推荐的多节点部署形态。用 chart 的 extraResources 声明缓存 PVC既然 kubeswap 采纳已有 PVC 而非自行管理让 helm 跟踪它才是正统做法——PVC 作为extraResources原样渲染并纳入 helm 生命周期管理。文档给出的完整示例# extraResources in the chart values — the idiomatic home for the cache PVC extraResources: - apiVersion: v1 kind: PersistentVolumeClaim metadata: name: llama-swap-models spec: accessModes: [ReadWriteMany] storageClassName: longhorn resources: requests: storage: 35Gi配合多引擎示例配置kubeswap-kubernetes.mdllama-swap-models这个 RWX PVC 被所有模型以--volume pvc:llama-swap-models:/models:ro只读挂载35Gi 的容量足以容纳 LLM、图像模型、whisper 与 TTS 的一整套权重该示例中权重布局包括 LFM2.5-230M、krea-2-turbo、Qwen3-VL、wan/ideogram VAE、distil-large-v3、qwen3-tts 等文件。决策速览你的集群该选哪种方案多节点、模型可能漂移GPU 或 CPU 集群→ RWX 共享缓存Longhorn / CephFS / Azure Files / AWS EFS / NFSPVC 挂:roslot 状态放 emptyDir单 GPU 节点homelab→ 可以用 RWO 块存储但必须用--node-selector把所有后端固定到同一节点去掉固定即回到 RWX 需求小模型、可容忍重复下载→ 完全不建 PVC--volume emptydir:model-cache:/models-hf repo:file按需拉取135MB 级别的演示模型可接受16GB 级别不推荐任何形态都注意期望缓存跨节点移动时给创建型 PVC 传--pvc-access-mode rwx已有 PVC 放extraResources里让 helm 跟踪读写挂载与 PVC 访问模式不匹配会在启动阶段直接报错不要指望 Pod 卡住后还能自愈。延伸阅读kubeswap 多引擎完整配置示例RWX 共享缓存 四类后端引擎的可直接复制的 config.yamlkubeswap 命令参考与设计说明--volume、--pvc-*等全部 flag 的取值与默认值kubeswap Helm chart values默认 emptyDir 演示配置与extraResources、结构化配置的完整注释PVC 处理与卷渲染源码renderPVC、pvcAllowsReadWrite与renderVolumes的实现PVC 采纳与拒绝行为测试既有 PVC 采纳、ROX 拒绝、RWO/RWOP/RWX 放行等全部用例。赞分享后端API网关LLM 网关人工智能大模型本地部署【免费下载链接】llama-swapReliable model swapping for any local OpenAI/Anthropic compatible server - llama.cpp, vllm, etc项目地址https://gitcode.com/gh_mirrors/ll/llama-swap点击查看免费下载相关推荐KServe PVC 初始化用 Kubernetes Job 预下载 HuggingFace 模型权重为 LLMInferenceService 提供高性能模型存储KServe PVC 初始化用 Kubernetes Job 预下载 HuggingFace 模型权重为 LLMInferenceService 提供高性能模型推理服务云原生后端微服务MLOps人工智能Unlock Music浏览器中的音乐格式解密工具Unlock Music浏览器中的音乐格式解密工具 你是否曾经在不同音乐平台下载了歌曲却发现这些文件只能在特定应用中播放当你想在车载音响、本地播放器或其他前端音频处理Odysseus记忆与技能系统让AI代理随时间进化的持久化学习Odysseus记忆与技能系统让AI代理随时间进化的持久化学习 在当今AI技术飞速发展的时代 Odysseus记忆与技能系统 为自托管AI工作空间带来了革命人工智能AI 应用后端前端RAGAI AgentMCP 服务本地部署深度研究上一篇BusyBox跨平台编译指南从x86到ARM的完整流程下一篇HTML压缩终极指南7种配置策略对比分析创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考