ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

大规模推理服务架构设计与性能优化实践:从部署到排查

大规模推理服务架构设计与性能优化实践:从部署到排查 大规模推理服务这个词在技术社区里出现的频率越来越高。一个模型从跑通到真正面向大规模流量提供服务中间隔着网关、队列、批处理、显存调度、监控告警和故障恢复等一整套工程系统。Gerred 这个代号在这些讨论中经常被当作大规模推理服务的典型工程目标来使用本文就以它为主线拆解一套大规模推理服务从架构设计、最小实现、性能优化到生产部署和问题排查的完整路径。这套内容适合已经在用模型 API 或自建推理服务的后端开发者、算法工程师和 SRE 阅读。读完以后你会清楚一个推理服务要达到“大规模”要求核心不是堆 GPU而是把请求链路、算力调度、资源利用率和排查手段配合起来。1. 大规模推理服务要解决的不是“模型能推理”而是“系统能撑住”1.1 单机推理和大规模推理服务差在哪里很多团队的第一版推理服务是直接把训练或测试 notebook 里的调用方式搬到 Flask 或 FastAPI 里搞一个/predict接口模型在启动时加载到内存有请求就前向推理一次。这种模式在内部演示、小流量试点阶段没有问题但它和“大规模推理服务”之间隔着一整层工程能力。差异可以归结为以下几点维度单机推理脚本在线推理服务大规模推理平台请求入口函数调用HTTP/gRPC 接口网关、鉴权、限流、多租户并发处理串行简单线程/进程并发动态批处理、队列、实例路由资源管理独占一块显存手动控制 batch自动分配、弹性伸缩、抢占恢复可观测性打印日志记录耗时吞吐、延迟分位、排队长度、GPU 指标发布变更重启进程蓝绿发布滚动发布、回滚、模型版本管理故障恢复手动重启简单重试健康检查、摘流量、自动拉起这张表不是说要一步到位而是提醒你当流量从每秒几次涨到每秒上千次模型从单个涨到多个服务从内部调用变成外部产品能力时原来“能跑”的代码会逐层暴露出问题。1.2 大规模推理服务的三个核心指标一个推理服务是否称得上“大规模”通常看三个指标。第一是吞吐单位时间能完成的请求数量常用 QPS 或 tokens/s 描述。对于大模型推理来说更关心每秒生成的 token 数因为一个生成式请求可能产生几百甚至上千个 token。第二是延迟在线服务关心的不仅是平均延迟更关键的是尾延迟。首 token 延迟TTFT和 token 间延迟TPOT对用户体感影响最大。TTFT 过长用户会觉得“半天没反应”TPOT 不均匀生成过程会一卡一卡。第三是成本包含 GPU 采购或租赁成本、显存利用率、电费和运维成本。很多场景下成本是决定架构方案上限的约束条件。一个方案在技术上可行但如果 GPU 利用率只有 20%大规模之后就很难持续。这三个指标互相制约。单纯提高并发延迟会上升单纯压低延迟batch 做不大吞吐上不去一味压缩成本可能牺牲稳定性和容错能力。架构设计本质上是在三者之间找平衡点。1.3 为什么推理服务比普通 Web 服务更难伸缩普通 Web 服务是无状态的请求来了处理完就结束水平扩容时只需要复制服务实例前面加负载均衡即可。推理服务不一样。首先模型权重常驻显存。一个 7B 参数量的模型用 FP16 加载至少需要约 14GB 显存70B 模型即使量化后也要几十 GB。实例启动不是一个轻量进程而是要把权重加载到显存这个过程可能耗时几十秒甚至几分钟。其次推理是计算密集和显存密集的。请求之间无法完全隔离同一个 GPU 上多个请求会竞争算力和显存带宽。想通过简单增加实例数来线性扩展吞吐前提是显存足够、带宽足够、批量调度算法足够高效。再次生成式推理是有状态的长交互。一个请求从进入服务到返回最后一段文本中间可能持续数百毫秒甚至更久期间服务端需要维护 KV Cache、采样状态和中间结果。这和普通请求“快速处理、快速释放”的模型完全不同。所以大规模推理服务的核心难点在于如何在长请求、显存受限、算力稀缺的条件下尽可能提高吞吐、压低延迟并保证故障可恢复。2. 大规模推理服务的架构分层每一层都有自己的职责和瓶颈2.1 接入层网关、鉴权、限流接入层是第一道关卡职责是保证外部流量以受控的方式进入系统。无论底层推理引擎多快如果没有限流突发流量会直接打穿服务。网关层通常负责以下几件事鉴权校验 API Key、身份、权限避免未授权调用。限流按用户、按 IP、按模型维度限制每秒请求数。路由根据请求中的模型名、版本号或业务类型转发到对应的推理实例。灰度通过权重或 header 将一部分流量引流到新版本模型上。限流策略不是越严越好要看业务容忍度。比如内部自动化任务可以接受排队但面向用户交互的功能必须尽快返回这时网关层可以做成“排队 快速失败”的组合先判断队列长度队列短就放行队列过长直接返回 429避免请求全部堆积在推理层。2.2 调度层队列、批处理、实例路由调度层是大规模推理服务最容易被低估的部分。模型推理能高效运行很大程度依赖调度策略是否合理。批处理是提升 GPU 利用率的关键。多个请求拼成一个 batch 一起前向计算比逐个请求执行效率高得多。但 batch 也不是越大越好batch 过大会导致单次计算时间变长单请求延迟变高。调度层还需要处理请求优先级。比如搜索类场景的短请求和文档分析类的长请求如果混在同一个队列里长请求会持续占用算力短请求可能被饿死。常见的做法是分队列隔离或者设置队列权重。实例路由层面要解决“请求该去哪个实例”的问题。如果集群里有多个模型、多个版本路由规则必须明确。最简单的是按模型名路由更复杂一点的会考虑请求长度、当前实例队列深度、是否命中 prefix cache 等因素。2.3 执行层推理引擎、模型加载、显存管理执行层运行的是真正的推理引擎。当前主流的方案包括 vLLM、TensorRT-LLM、TGI 等它们共同解决的核心问题是连续批处理和显存管理。这一层需要考虑模型加载方式启动时全部加载还是按需加载是否需要把低热度模型换出显存。显存分配给模型权重预留多少给 KV Cache 预留多少。KV Cache 预留太小并发能力受限预留太大可能 OOM。推理引擎参数如最大序列长度、batch 大小、采样参数、并行策略。多模型共存同一块 GPU 上是否放多个小模型如何避免相互干扰。执行层是性能优化的主战场后面第 4 章会展开讲。2.4 模型与数据层模型仓库、结果缓存、日志模型仓库负责管理模型文件、版本和元信息。生产环境不能每次发布都手动拷贝模型到服务器至少需要一个版本化存储发布时按版本拉取。结果缓存对推理服务非常有效。很多请求是重复或近似重复的比如内容审核、固定模板问答。对完全相同的请求做结果缓存可以显著降低算力消耗。但缓存不能无脑加要设置过期时间并考虑长尾数据的存储成本。日志和链路追踪数据也需要单独规划。推理日志量很大尤其是生成式模型每个请求的输入输出都可能很长。建议在日志采集层做裁剪只保留必要信息避免日志存储成本失控。一个比较清晰的分层请求路径是客户端请求到达网关后完成鉴权和限流网关把请求交给调度器调度器根据模型名和队列状态选择目标实例推理引擎把多个请求组成 batch 执行结果经网关返回客户端同时异步写入监控和日志系统。3. 搭建一个最小可运行的大规模推理服务参考实现3.1 环境准备在进入代码之前先确认环境满足条件。下面的示例用于说明思路实际项目要结合自己的包名、路径和版本调整。依赖用途说明Python 3.10运行服务代码推理框架普遍要求较新的 Python 版本CUDA / 驱动GPU 计算版本必须和推理框架要求对齐推理框架模型加载和推理以 vLLM 为例也可替换为 TensorRT-LLM 等FastAPI / uvicornHTTP 服务框架网关和服务端示例使用Redis限流计数学习和生产环境都可使用Locust压测用于验证吞吐和延迟如果原始材料没有给出明确版本落地前要先确认依赖版本。特别是 CUDA 和推理框架之间版本不匹配会导致启动直接报错。3.2 项目结构设计一个干净的项目结构后续部署和排查都会方便很多。gerred-inference/ ├── server.py # 推理服务入口加载模型并对外提供接口 ├── gateway.py # 网关入口处理鉴权、限流、路由 ├── requirements.txt # Python 依赖 ├── load_test.py # Locust 压测脚本 ├── config.yaml # 服务配置 └── models/ # 模型文件目录生产环境建议从模型仓库拉取这个结构把网关和推理服务分开目的是模拟生产环境的分层架构。学习阶段也可以把两者合并跑通后再拆分。3.3 推理服务代码使用 vLLM 加载模型并提供生成接口下面用 FastAPI 和 vLLM 实现一个最小推理服务。vLLM 的连续批处理机制可以让多个并发请求在同一个 GPU 上高效执行比逐个请求调用更适合大规模场景。# server.py from fastapi import FastAPI, HTTPException from pydantic import BaseModel from vllm import LLM, SamplingParams app FastAPI(titlegerred-inference) llm None class GenerateRequest(BaseModel): prompt: str max_tokens: int 256 temperature: float 0.7 top_p: float 0.9 class GenerateResponse(BaseModel): text: str usage: dict app.on_event(startup) def load_model(): global llm llm LLM( model/data/models/gerred-7b-instruct, gpu_memory_utilization0.85, max_model_len4096, ) app.post(/v1/generate, response_modelGenerateResponse) def generate(req: GenerateRequest): if llm is None: raise HTTPException(status_code503, detailmodel not ready) sampling_params SamplingParams( max_tokensreq.max_tokens, temperaturereq.temperature, top_preq.top_p, ) outputs llm.generate([req.prompt], sampling_params) text outputs[0].outputs[0].text return GenerateResponse( texttext, usage{ prompt_tokens: len(req.prompt.split()), completion_tokens: len(text.split()), }, ) app.get(/health) def health(): return {status: ok}关键点说明model参数指向模型目录实际部署时一般从模型仓库拉取到本地再启动。gpu_memory_utilization表示允许使用的显存比例示例为 0.85保留一部分余量给服务自身和异常缓冲。这个值需要根据模型大小和可用显存调整。max_model_len限制模型能处理的最大序列长度过大会占用大量显存过小会截断长文本请求。/health接口用于后续 K8s 探针检查生产环境还应该在这里暴露模型版本、显存使用量等状态。有一点要特别注意vllm.LLM的实例化非常耗时不要在每次请求时创建。启动阶段加载一次后续复用否则请求会全部卡在模型加载上。3.4 网关代码限流逻辑网关层用 FastAPI 中间件做最简单的固定窗口限流。生产环境建议使用成熟网关或 API 网关组件示例只演示思路。# gateway.py import time import redis from fastapi import FastAPI, Request from fastapi.responses import JSONResponse app FastAPI(titlegerred-gateway) r redis.Redis(hostredis, port6379, db0) RATE_LIMIT_PER_SECOND 50 app.middleware(http) async def rate_limit(request: Request, call_next): client_ip request.client.host key frate:{client_ip}:{int(time.time())} count r.incr(key) if count 1: r.expire(key, 1) if count RATE_LIMIT_PER_SECOND: return JSONResponse( status_code429, content{detail: too many requests}, ) return await call_next(request)固定窗口限流的实现简单但存在边界效应如果窗口切换瞬间来两倍流量可能全部通过。生产环境更推荐滑动窗口或令牌桶算法。这里用 Redis 保存计数可以让多个网关实例共享限流状态避免每个实例各限各的。3.5 压测验证服务启动后先用 curl 验证接口是否可用。模型路径按你自己的环境替换启动命令如下uvicorn server:app --host 0.0.0.0 --port 8000然后发送一个请求curl -X POST http://127.0.0.1:8000/v1/generate \ -H Content-Type: application/json \ -d {prompt: 用一句话介绍大规模推理服务, max_tokens: 128}正常响应应该包含模型生成的文本和 token 用量。接下来用 Locust 做简单压测。先写压测脚本# load_test.py from locust import HttpUser, task, between class InferenceUser(HttpUser): wait_time between(0.5, 2) task def generate(self): self.client.post( /v1/generate, json{prompt: 介绍一下 GPU 显存管理, max_tokens: 64}, )运行压测locust -f load_test.py --headless -u 20 -r 5 -t 60s --host http://127.0.0.1:8000压测结束后重点看三个结果请求失败率出现大量 5xx 说明服务不稳定。平均响应时间和 P95响应时间持续上升说明队列已经积压。吞吐每秒能完成多少请求记录基线数据后续优化才有对比。注意不要只验证程序能启动还要验证输入、输出、异常分支和日志是否符合预期。压测环境尽量使用足够数量的并发线程否则看不到排队现象。4. 性能优化让 GPU 利用率从 30% 到 80% 的关键手段4.1 连续批处理不要让 GPU 等请求早期大模型推理服务里常见的做法是 request-level batching攒够一批请求再一起推理或者一个请求完成后把新请求补进来。问题是生成式推理中每个请求的生成速度不一样一个 batch 里如果某个请求生成长文本其他已经完成的请求只能干等GPU 存在大量空闲。连续批处理continuous batching解决的就是这个问题。它把“批”的粒度从请求级别下放到 token 级别当一个请求生成完毕它占用的位置立刻让给新请求GPU 始终在处理有效计算。主流推理引擎如 vLLM 和 TensorRT-LLM 都已经内置这一能力。使用 vLLM 时你不需要自己实现只要保证请求并发足够框架会自动把多个请求拼成一个迭代步骤。但要注意如果请求到达不均匀批处理效果会打折扣所以上游队列和并发控制仍然重要。4.2 KV Cache 和显存管理生成式模型推理时需要缓存历史 token 的 Key 和 Value这部分被称为 KV Cache。KV Cache 大小和请求的并发数、序列长度直接相关。显存被模型权重占用后剩余部分要尽量留给 KV Cache因为它是并发能力的基础。vLLM 使用 PagedAttention 把 KV Cache 切分成固定大小的块按需分配大幅减少显存碎片。使用时有几个参数值得关注参数含义调大的影响调小的表现gpu_memory_utilization允许使用显存比例模型和 KV Cache 更容易容纳并发能力更强显存预留过少长文本或高并发时易 OOMmax_model_len模型最大序列长度长文本友好但 KV Cache 单请求占用变大可支撑更多并发但长请求会被截断block_sizeKV Cache 块大小单块占用显存更大更细粒度分配减少浪费但调度开销增加排查显存问题时先用nvidia-smi看显存使用再结合框架日志看 KV Cache 分配情况。如果发现大量out of memory优先调低gpu_memory_utilization或max_model_len。4.3 量化用精度换吞吐量化是把模型权重从 FP16 降到 INT8 或 INT4 的压缩方案。权重占用显存减少同一块 GPU 能容纳更多 KV Cachebatch 可以开更大吞吐自然上涨。代价是可能存在精度损失对生成质量敏感的任务需要先离线评估。常见的量化方式包括GPTQ需要离线量化适合部署阶段使用。AWQ针对激活值分布做量化精度损失相对可控。FP8在支持 FP8 的 GPU 上使用精度损失小但需要硬件支持。量化并不是所有场景都推荐。小模型、任务对输出准确性要求高时先跑评测集对比量化前后的效果。对于大规模在线服务INT8 是相对稳妥的起点。4.4 参数调优的优先级性能优化不要一开始就大改代码按下面顺序尝试调整gpu_memory_utilization把显存利用率提上来。提高并发请求数让连续批处理器有更多请求可以拼接。检查max_model_len是否需要裁剪长序列会显著降低吞吐。引入量化降低权重显存占用。最后才考虑多机多卡分布式推理。每次调整只改一个变量压测对比记录数据。不要同时改多个参数否则无法确认性能变化由哪个因素引起。5. 生产环境部署与可观测性不能只让服务“看起来活着”5.1 基于 K8s 的部署形态生产环境通常使用 Kubernetes 管理推理实例。GPU 资源通过 Device Plugin 调度Deployment 的副本数量决定同时运行的推理实例数。下面是一个参考 Deployment 配置。apiVersion: apps/v1 kind: Deployment metadata: name: gerred-inference spec: replicas: 3 selector: matchLabels: app: gerred-inference template: metadata: labels: app: gerred-inference spec: containers: - name: inference image: registry.example.com/gerred-inference:1.2.0 ports: - containerPort: 8000 resources: requests: nvidia.com/gpu: 1 memory: 32Gi limits: nvidia.com/gpu: 1 memory: 32Gi readinessProbe: httpGet: path: /health port: 8000 initialDelaySeconds: 60 periodSeconds: 10这里有几个部署要点镜像地址registry.example.com/gerred-inference:1.2.0是示例实际项目要替换为自己的镜像仓库和 tag。GPU 资源的 requests 和 limits 都设置为 1避免调度器把多个 GPU 任务挤到同一设备上。如果单实例需要多卡要使用相应数量的 GPU。initialDelaySeconds设得比较长因为模型加载耗时长探针太早启动会误判失败。实例数 3 只是一个示例。实际数量由吞吐目标和单个实例的压测结果决定。5.2 探针和优雅退出推理服务的探针配置比普通服务更讲究。readinessProbe的意义是只有服务真正准备好时才把流量放进来。模型正在加载时服务进程可能已经启动并监听端口但此时请求进来只会排队等待或者直接失败。因此探针不仅是“进程活着”最好能反映业务就绪状态。上面代码里的/health接口可以扩展为模型已加载、显存状态正常、队列长度在可接受范围内时返回 200否则返回 503。K8s 会把 503 视为未就绪摘掉该实例的流量。优雅退出同样重要。推理请求是长请求Pod 被删除时如果直接杀掉容器正在生成的请求会中断。需要配置preStop钩子在退出前等待一段时间让正在处理的长请求完成。lifecycle: preStop: exec: command: [sh, -c, sleep 20]这个示例只是简单等待 20 秒生产环境应该结合业务超时时间设置确保服务在优雅关闭期间不再接收新请求同时给已有请求留出完成窗口。5.3 监控指标延迟、吞吐、排队、GPU 是四个必看维度大规模推理服务至少要监控以下指标指标含义观察方法QPS每秒完成请求数按入口统计区分模型维度延迟分位P50、P95、P99延迟上涨通常早于 QPS 下降出现排队长度等待处理的请求数队列持续增长说明处理能力不足GPU 利用率算力使用情况长期低于 40% 说明 batch 策略或并发配置不合理显存使用率显存分配和剩余情况接近上限时需要注意 OOM 风险KV Cache 命中率prefix cache 命中情况命中率低说明重复请求未充分利用缓存Prometheus Grafana 是常见组合。推理引擎内部也暴露指标例如 vLLM 提供运行时指标包括 token 生成速率、队列长度、cache 使用率。把这些指标接入 Prometheus再配置告警规则比人工查看日志高效得多。5.4 配置外置与回滚推理服务的环境差异很大模型路径、GPU 利用率、并发参数、限流阈值都不应该写死在代码里。推荐把配置外置到环境变量或配置中心。以 config.yaml 为例model: path: /data/models/gerred-7b-instruct gpu_memory_utilization: 0.85 max_model_len: 4096 inference: max_concurrency: 16 timeout_ms: 30000 gateway: rate_limit_per_second: 50代码中通过环境变量读取这些配置避免每次改参数都重新构建镜像。发布时如果新模型版本出现问题应能通过镜像 tag 或配置回滚到上一版本。模型文件本身也要版本化发布记录里写清楚哪个模型版本、哪个推理引擎版本、哪个服务代码版本是一组可回滚的组合。6. 常见问题与排查链路从现象倒推根因6.1 现象响应延迟明显变高先看延迟是首次变高还是持续走高。如果首次请求慢后续正常大概率是冷启动或 cache 未命中。如果持续走高按以下顺序排查看单请求的 TTFT 和 TPOT 是否都变高。TTFT 高说明排队或 prompt 处理慢TPOT 高说明 token 生成阶段计算资源紧张。看排队长度。队列积压说明处理速度跟不上请求到达速度要么扩容要么优化 batch。看 GPU 利用率。利用率接近 100% 说明算力饱和利用率很低但延迟高说明可能在等待锁、等待数据或存在显存交换。看日志中有无超时或重试。客户端重试会放大流量导致延迟雪崩。处理优先级是先扩容或限流止血再定位瓶颈。不要在高延迟期间频繁发布新配置否则可能引入新的变量。6.2 现象显存 OOM服务反复重启推理服务的 OOM 通常和三个配置有关gpu_memory_utilization设置过高、max_model_len过长、并发请求超过显存承载能力。排查时先看nvidia-smi和容器日志。如果日志中出现类似CUDA out of memory执行以下操作调低gpu_memory_utilization例如从 0.9 降到 0.85。检查max_model_len是否明显大于业务实际需要的长度。降级并发数或在上游控制同时进入推理引擎的请求数量。确认是否存在多实例共存于同一 GPU 的情况调整 K8s 资源限制确保每个推理实例独占 GPU。OOM 的预防比修复更重要。上线前用最大序列长度和最大并发数做一次压测确认显存峰值不会超过限制。监控中设置显存使用率告警阈值建议低于实际限制 10% 以上。6.3 现象请求大量超时或返回 5xx先区分超时发生在哪一层。网关层返回 504说明下游推理没在超时时间内返回。推理服务返回 503说明模型未就绪或实例过载。常见原因包括模型文件损坏或路径错误服务启动失败。模型加载时间过长还没 ready 就开始接流量。实例数不足请求在队列中等待超过网关超时时间。后端服务发生 OOM 或崩溃K8s 正在重启。检查路径是先看网关日志找到超时请求对应的后端实例再查该实例的 K8s 事件确认是否发生重启最后看推理引擎日志里的排队和加载信息。不要跳过网关日志直接查后端否则会浪费大量时间。6.4 模型热更新失败生产环境的模型版本不会一成不变。热更新模型时常见的问题是新版本加载失败但旧版本实例已经被摘除流量导致服务不可用。安全的更新方式是采用滚动发布先启动一个新版本实例等待 readiness 探针通过再逐步摘除旧实例流量。如果新版本等待超时说明模型或配置有问题应终止发布保留旧版本继续服务。模型发布前至少检查三件事模型文件完整性使用校验和比对。推理引擎兼容性新模型是否能被当前引擎版本加载。显存容量新模型是否超出实例资源限制。以下是一张常用排查对照表问题现象常见原因检查方式处理建议延迟变高队列积压、GPU 饱和查看队列长度、GPU 利用率、延迟分位限流或扩容优化 batch 配置显存 OOMKV Cache 过大、配置过激进查看 nvidia-smi、引擎日志降低显存利用率、缩短 max_model_len请求 5xx模型未就绪、实例重启查看 K8s events、启动日志调整探针、延长优雅退出时间热更新失败模型不兼容、显存不足查看新实例启动日志回滚版本校验模型和资源7. 大规模推理服务的最佳实践清单7.1 上线前检查清单上线不是把服务部署完就算结束。下面这份清单来自实际项目的常见教训确认 GPU 驱动、CUDA、推理框架版本互相兼容。确认模型文件路径、版本、校验和正确。压测过最大序列长度和最大并发数确认显存峰值安全。配置好 readiness 和 liveness 探针区分进程活着和业务就绪。设置合理的限流阈值避免突发流量打穿服务。确认监控指标齐全QPS、延迟分位、队列长度、GPU 利用率、显存使用率。配置告警规则并通知到值班人而不是只把指标画成图表。记录发布版本号确保模型、代码、配置可以整体回滚。验证优雅退出流程模拟 Pod 删除时正在进行的请求是否安全结束。准备 runbook写清楚 OOM、高延迟、排队堆积时的处理步骤。7.2 参数选型建议配置项学习环境生产环境gpu_memory_utilization0.9 应急跑通0.8 到 0.85留出余量max_model_len使用模型默认值根据业务最大输入输出长度裁剪实例数量1 个根据压测结果计算预留冗余限流阈值不设或设大按用户配额和实例容量设置模型量化不量化任务精度可接受时用 INT8 起步这些数值不是固定答案。每个模型的显存占用、每个业务的最大序列长度都不同唯一的正确做法是记录压测数据用数据决定参数。7.3 下一步扩展方向如果最小版本已经跑通可以从这几个方向继续深入。第一个方向是多模型管理。当服务里同时存在多个模型时需要一个模型路由层按模型名和版本转发流量并管理显存中哪些模型常驻、哪些按需加载。第二个方向是分布式推理。单个 70B 以上模型无法塞进一块 GPU 时需要考虑张量并行和流水线并行。这会引入通信开销调度和容错的复杂度也会上升。第三个方向是自动伸缩。推理服务的弹性伸缩比普通 Web 服务难因为实例启动慢、请求状态长。可以基于队列长度而非 CPU 使用率做 HPA避免流量突增时扩容速度跟不上。第四个方向是成本优化。通过模型蒸馏、量化、缓存复用和低热度模型降级等手段在不明显降低服务质量的条件下降低 GPU 消耗。每一次优化都要回到吞吐、延迟、成本三角里重新衡量。Gerred 这个代号背后真正有价值的是“大规模推理服务”这一整套工程方法。它不要求你把所有组件一次搭齐但要求你在每个阶段都清楚当前系统到了什么规模瓶颈在哪一层下一步优化什么。从最小可运行服务开始逐步补齐观测、限流、弹性、容错能力比一开始就追求庞大架构要可靠得多。
返回列表