尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

FunASR OpenAI 兼容 API 的 Kubernetes 部署实战:SenseVoice CPU 与 MOSS GPU 双配方指南

FunASR OpenAI 兼容 API 的 Kubernetes 部署实战:SenseVoice CPU 与 MOSS GPU 双配方指南 FunASR OpenAI 兼容 API 的 Kubernetes 部署实战SenseVoice CPU 与 MOSS GPU 双配方指南【免费下载链接】FunASROpen-source speech recognition toolkit for training, inference, streaming ASR, VAD, punctuation, speaker diarization pipelines, and OpenAI-compatible/MCP serving.项目地址: https://gitcode.com/GitHub_Trending/fun/FunASR导读本文以 FunASR 仓库内 examples/openai_api/kubernetes/README_zh.md 为核心完整讲解如何把 FunASR 的 OpenAI 兼容语音接口部署进 Kubernetes 集群为集群内部的 Agent、Web 后端、工作流引擎或批处理 worker 提供语音能力。你将掌握镜像构建与推送、Kustomize 清单部署、内网 port-forward 冒烟验证、按集群规模调整资源配置以及 MOSS-Transcribe-Diarize GPU 配方的完整落地路径并理解探针预算、PVC 缓存、GPU 调度与安全边界等运维要点。1. 部署概览与前置条件这套 Kubernetes 模板服务于一个明确场景让集群内部的服务而非公网用户调用语音接口。典型调用方包括 Agent、Web 后端、工作流引擎如 Dify、n8n或批处理 worker。模板默认先使用 SenseVoice CPU 配方文档同时提供独立的 MOSS GPU 配方用于转写 说话人分离speaker diarization。所有命令都必须从 FunASR 仓库根目录执行包括新开终端中的命令。开始之前请确认以下前置条件齐备Docker 可用且有可推送的镜像仓库示例使用registry.example.com构建前必须替换kubectl已配置并指向目标集群当前账号有在speechnamespace 中创建资源的权限集群存在可供缓存 PVC 使用的默认 StorageClass本地 smoke 客户端需要Python 3.10 或更高版本且不需要安装任何第三方 Python 包脚本仅使用标准库见下文源码分析。1.1 安全边界ClusterIP 不是鉴权这是本指南反复强调的第一原则ClusterIP 不是鉴权。两套清单CPU 与 MOSS都没有提供 NetworkPolicy、鉴权网关、TLS 或请求限制。在允许不可信客户端访问前务必先阅读 服务安全指南。以下所有配方都通过本地port-forward访问服务不是公网入口。1.2 模板默认的保守设计从清单源码可以逐条印证模板的保守取向见 funasr-api.yaml默认ClusterIPService 类型为ClusterIP不直接暴露公网LoadBalancer默认FUNASR_DEVICEcpu与便携 CPU Dockerfile 匹配避免镜像与运行时不一致持久化模型缓存在/root/.cache挂载 20Gi 的 PVCfunasr-cache避免 Pod 重启后重复下载模型健康检查三件套startup、readiness、liveness 探针全部使用/health内存型/dev/shm挂载emptyDirmedium: Memory2Gi便于 PyTorch 和音频预处理使用共享内存。2. 仓库清单结构速览Kubernetes 目录下共 4 个文件分工清晰文件作用kustomization.yamlKustomize 入口声明资源并覆盖镜像名与 tagfunasr-api.yamlCPU/SenseVoice 配方PVC ConfigMap Deployment Servicefunasr-moss-api.yamlMOSS GPU 配方PVC Deployment ServiceREADME_zh.md本指南对应文档另有 README.md 英文版2.1 CPU 配方对象详解funasr-api.yaml包含 4 个 Kubernetes 对象PVCfunasr-cacheReadWriteOnce20Gilabel 标记为component: cacheConfigMapfunasr-api-config通过envFrom注入三个环境变量——FUNASR_PORT8000、FUNASR_DEVICEcpu、FUNASR_MODELsensevoiceDeploymentfunasr-apireplicas: 1strategy: Recreate单副本滚动避免 PVC 被多副本同时挂载容器请求cpu: 2/memory: 8Gi限制memory: 16Gi挂载cachePVC到/root/.cache、dshm内存 emptyDir到/dev/shmServicefunasr-apiClusterIPport: 8000→targetPort: http。探针参数与源码一一对应探针pathperiodSecondstimeoutSecondsfailureThresholdstartup/health10560readiness/health1053liveness/health3053其中 startup probe 的失败预算约 10 分钟周期 10s × 失败阈值 60用于覆盖模型下载与首次加载。3. 第一步构建并推送镜像保持 shell 位于仓库根目录。CPU 镜像使用 API 目录作为构建上下文docker build -f examples/openai_api/Dockerfile -t registry.example.com/speech/funasr-api:cpu-latest examples/openai_api docker push registry.example.com/speech/funasr-api:cpu-latest3.1 CPU Dockerfile 的构建语义查看 Dockerfile 可以确认几个关键事实基础镜像为python:3.10-slim安装ffmpeg、git、libsndfile1等运行时依赖通过 pip 安装funasr、fastapi、uvicorn[standard]、python-multipart——从 PyPI 安装 FunASR而不是安装当前 checkout 的 FunASR 包依赖环境也未锁定无固定版本约束ENV预设默认值FUNASR_MODELsensevoice、FUNASR_DEVICEcpu、FUNASR_PORT8000仅复制server.py到/app/server.py构建上下文小Docker 层内置HEALTHCHECKinterval 30s、start-period 60s与 Kubernetes 探针互为补充启动命令python server.py --host 0.0.0.0 --port ${FUNASR_PORT:-8000} --device ${FUNASR_DEVICE:-cpu} --model ${FUNASR_MODEL:-sensevoice}四个参数均可被环境变量覆盖。3.2 修改镜像引用与不可变部署推送完成后需要修改 kustomization.yaml 的images配置images: - name: funasr-api newName: registry.example.com/speech/funasr-api newTag: cpu-latest需要可复现部署时把示例可变 tag如cpu-latest换成镜像仓库的不可变 digest。每次 rollout 前记录镜像 digest 与清单内容便于故障时回滚。4. 第二步部署到集群依次执行三条命令kubectl create namespace speech --dry-runclient -o yaml | kubectl apply -f - kubectl -n speech apply -k examples/openai_api/kubernetes kubectl -n speech rollout status deploy/funasr-api --timeout15m说明第一条命令以幂等方式创建speechnamespacedry-run 生成 manifest 再 apply第二条命令通过 Kustomize 应用整个目录PVC、ConfigMap、Deployment、Service 一次到位第三条命令阻塞等待 Deployment 完成滚动超时 15 分钟。启动耗时预期CPU 服务在启动 HTTP 前会预加载配置的模型从 ModelScope/HuggingFace 下载权重并加载下载与首次加载可能需要几分钟。startup probe 的失败预算约 10 分钟不包含拉取镜像、调度或 PVC 绑定时间。/health成功只代表进程存活与 HTTP 就绪不代表推理验收通过——接入流量前还必须完成下面的真实音频请求。5. 第三步内网 Smoke Test建议保持服务内网私有通过port-forward验证不要直接暴露服务kubectl -n speech port-forward --address 127.0.0.1 svc/funasr-api 8000:8000保持 port-forward 运行。在另一个终端的同一仓库根目录执行python3 examples/openai_api/smoke_test.py --base-url http://127.0.0.1:8000 --model sensevoice --response-format verbose_json5.1 smoke 客户端的行为细节阅读 smoke_test.py 的源码可以明确它的实际行为纯标准库实现urllib.requestjsonuuid无需第三方依赖这也是文档要求 Python 3.10 的原因仅在当前目录不存在sample.wav时下载公开中文样本默认 URL 指向阿里云 OSS 的 BAC009 测试音频已有文件会被复用、不重复下载依次请求并打印三部分内容/health、/v1/models模型 metadata、/v1/audio/transcriptionsmultipart/form-data 上传音频并携带model与response_format字段转写结果以完整 JSON 输出支持--audio-path位置参数默认sample.wav、--base-url、--model、--response-formatjson/verbose_json、--sample-url、--timeout等参数均可通过环境变量BASE_URL、MODEL、RESPONSE_FORMAT等覆盖。必须理解验收边界退出码为零只代表 HTTP 链路通畅并不验证识别准确率、说话人标签、内存容量或并发能力。请自行核对输出的文本与时间戳。同时注意避免保留敏感音频或未脱敏输出客户端不发送Authorization安全指南中的仅转写网关会主动拒绝 metadata 路由如/v1/models因此这套 smoke 应通过本地 port-forward 运行不要直接指向该网关。5.2 集群内客户端的 base URL集群内其他 Pod 访问该服务时应使用 Kubernetes service name直接 HTTP 调用http://funasr-api.speech.svc.cluster.local:8000OpenAI SDK 调用http://funasr-api.speech.svc.cluster.local:8000/v16. 第四步根据集群调整配置配置默认值什么时候调整FUNASR_MODELsensevoice先检查目标模型的依赖与硬件要求/v1/models列出别名不证明每个模型都已就绪FUNASR_DEVICEcpu只有在镜像已适配 CUDA 且集群 GPU 调度已配置后才改成cudaPVC 大小20Gi缓存多个模型或较大模型版本时增大内存 request8Gi根据启动过程和真实音频负载观测结果调整Startup probe约 10 分钟按模型初始化情况调整镜像拉取、调度和 PVC 绑定需分别排查6.1 从 server.py 理解模型别名体系为什么FUNASR_MODEL的默认值是sensevoice查看 server.py 中的MODEL_CONFIGS字典可以找到答案。服务内置了 5 个可配置模型别名每个别名对应一组加载参数模型 ID、VAD 模型、标点模型、hub 来源等别名底层模型关键加载参数sensevoiceiic/SenseVoiceSmallvad_modelfsmn-vadvad_kwargs.max_single_segment_time30000paraformerparaformer-zh附带punc_modelct-puncparaformer-enparaformer-en附带vad_modelfsmn-vadfun-asr-nanoFunAudioLLM/Fun-ASR-Nano-2512hubhf、trust_remote_codeTruemoss-transcribe-diarizeOpenMOSS-Team/MOSS-Transcribe-Diarizehubhf、backendhf、固定model_revisionload_model()server.py在首次调用时通过funasr.AutoModel懒加载模型并缓存进MODEL_REGISTRY加载耗时会被记录到日志。这意味着修改FUNASR_MODEL前先确认目标模型的依赖与硬件要求部分模型需要 HuggingFace hub、trust_remote_code或 GPU服务启动时只预加载ConfigMap 指定的模型其他别名只有在被请求时才会现场加载换用未在MODEL_CONFIGS中的名字会得到 400 错误。7. MOSS GPU 替代方案转写 说话人分离MOSS-Transcribe-Diarize 是 OpenMOSS-Team 的模型由 FunASR 集成。这套清单运行打包后的 FunASR HTTP 适配器使用verbose_json响应格式不是原生 vLLM 或其diarized_json接口。分离标签是说话人区分结果不是经过验证的说话人身份。模型要求、输出格式、不依赖外部 VAD 的行为及其他服务后端见 MOSS 部署指南。7.1 与 CPU 配方的关键差异kustomization.yaml不包含MOSS 清单需要单独apply -fMOSS 模板请求一张 NVIDIA GPU、24Gi 内存、40Gi 缓存 PVC并配置 8Gi 内存型/dev/shm——这些是模板设置不是实测容量保证部署前先配置集群的 GPU device plugin 和调度与 CPU 镜像不同Dockerfile.moss复制并安装整个 checkoutCOPY . /opt/funasrpip install .因此构建上下文必须是仓库根目录请使用干净的 checkout不要把凭据或私有数据放入构建上下文。从 Dockerfile.moss 还可以确认基础镜像是pytorch/pytorch:2.9.1-cuda12.8-cudnn9-runtime额外安装transformers5.6,6启动命令为打包入口funasr-server --host 0.0.0.0 --port ${FUNASR_PORT:-8000} --device ${FUNASR_DEVICE:-cuda:0} --model ${FUNASR_MODEL:-moss-transcribe-diarize}。7.2 构建、推送与应用docker build -f examples/openai_api/Dockerfile.moss -t registry.example.com/speech/funasr-api:moss-local . docker push registry.example.com/speech/funasr-api:moss-local应用前将 funasr-moss-api.yaml 中 Deployment 的image: funasr-moss-api:local替换为已推送镜像的不可变 digest。如果跳过了 CPU 部署先按第 4 节创建speechnamespace。保存镜像 digest 和修改后的清单作为回滚记录。kubectl -n speech apply -f examples/openai_api/kubernetes/funasr-moss-api.yaml kubectl -n speech rollout status deploy/funasr-moss-api --timeout15m kubectl -n speech port-forward --address 127.0.0.1 svc/funasr-moss-api 8001:8000在另一个终端的仓库根目录中使用本地端口 8001与 CPU 示例的 8000 区分python3 examples/openai_api/smoke_test.py --base-url http://127.0.0.1:8001 --model moss-transcribe-diarize --response-format verbose_json7.3 MOSS 探针差异与验收边界对比两份清单可以发现MOSS 模板有 startup 和 readiness probe没有 liveness probe其/health只做存活检查不测试转写能力。因此必须对照音频检查返回的文本与分离结果。这套配方不认证具体 GPU 型号、实时性能或生产负载——它提供的是可运行的起点容量与性能需要你在真实负载下自行验证。8. GPU 资源调度说明普通 Dockerfile 默认面向 CPU单独设置FUNASR_DEVICEcuda不会使它成为受支持的 GPU 镜像。其他 GPU 模型需要额外适配依赖与调度配置。下面是字段位置的示意——resources属于 containernodeSelector属于 Pod spec不是可以整体粘贴的同层完整清单resources: limits: nvidia.com/gpu: 1 nodeSelector: nvidia.com/gpu.present: true不同 Kubernetes 发行版的 GPU label、runtime class 和 device plugin 配置并不相同请以集群实际提供的资源扩展为准。服务对外开放前先补齐鉴权、TLS、上传大小限制和限流。9. 运维检查清单排查顺序修改探针预算前先检查 PVC 绑定、镜像拉取、Pod events 和模型加载日志再检查/health、/v1/models和真实音频响应记录关键信息模型别名、设备、音频时长、响应格式、延迟和错误文本单副本起步缓存 PVC 是ReadWriteOnce建议先从 1 个副本开始横向扩容前先评估镜像、每 Pod 缓存或共享只读模型缓存方案网络隔离为预期客户端实施鉴权和 NetworkPolicy——namespace 本身不是网络隔离边界集群内调用规范Dify、n8n 或 Web 后端在同一集群内访问时应使用 Kubernetes service name如http://funasr-api.speech.svc.cluster.local:8000不要使用localhost。10. 安全与上线边界补充自服务安全指南Kubernetes 模板使用ClusterIP这本身不能阻止其他 Pod 或可达主机调用服务。在增加 Ingress 或 LoadBalancer 前建议按 SECURITY_zh.md 的 Kubernetes 注意事项完成使用 Ingress controller 或 API 网关强制 TLS、鉴权、上传大小限制和限流模型缓存卷只暴露给拥有该服务的 namespace 或 node pool使用NetworkPolicy限制可调用服务的 namespace第一次验证先kubectl port-forwardsmoke_test.py再开放路由增加 GPU 后固定调度规则并在部署说明中记录镜像 tag、CUDA runtime 和模型 alias。上线前的验收检查至少覆盖无鉴权本地 loopback 诊断、带凭据的认证上传、未认证请求必须 401 且不触发推理、非转写路由/health、/v1/models、/openapi.json、/docs等保持拒绝、大小与超时边界、以及从不可信网络确认后端不可直连。示例服务会把上传内容读入内存并写临时音频文件压缩文件的上传字节数不等于解码后的时长或内存占用容量评估必须以真实音频负载为准。11. 总结本指南完整覆盖了 FunASR OpenAI 兼容 API 在 Kubernetes 上的两条部署路径SenseVoice CPU 配方Kustomize 一键部署 20Gi 模型缓存 三探针健康检查与MOSS GPU 配方单卡调度 转写/说话人分离 40Gi 缓存。从镜像构建、命名空间创建、滚动状态确认、内网 smoke 验证到资源配置调整每一步都有对应清单源码与 server.py 实现可供查证。部署完成后集群内的 Agent、Web 后端与工作流引擎即可通过 OpenAI 兼容的/v1/audio/transcriptions接口获得语音识别能力——但请始终牢记ClusterIP 不是鉴权对外开放前务必补齐网络策略与网关防护。【免费下载链接】FunASROpen-source speech recognition toolkit for training, inference, streaming ASR, VAD, punctuation, speaker diarization pipelines, and OpenAI-compatible/MCP serving.项目地址: https://gitcode.com/GitHub_Trending/fun/FunASR创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表