W9 · 部署 / 压测 / 性能 · 打卡清单

把 Agent 从「能跑」推到「能上线」:定契约 → 压吞吐 → 路由/缓存优化 → 拿到生产级性能数据。全部纯本地可跑,产出可写进简历的性能报告。

代码练习 · 第 9 周(M2)预估 6–7 小时含 FastAPI(可选)
完成进度
0%

本周里程碑(结束时你要能说)

Day 1API 契约设计 + FastAPI 封装文件:day1_api.py / deploy/server.py

任务

  • 跑 day1 契约回放,读明白入参/出参/错误码字段
  • 口述:为什么出参要带 model / latency / cost / tokens?
  • (可选)装 fastapi 跑 uvicorn,curl 一次 /agent 与 /health
  • 回答:什么叫「面向契约编程」,好处是什么?
✔ 自查:坏输入返回机器可读 code;正常响应含模型/耗时/成本。

运行

cd agent-learning-w9
python day1_api.py
重难点:把「先定契约」当纪律。入参 min( prompt, cacheable, model ),出参含 answer/model/latency_s/cost/tokens。固定 JSON 契约是「可并行开发 / 可压测 / 可被前端单独接」的起点,也是无状态水平扩容的前提。
Day 2并发压测:TPS / P50/P95/P99 / 错误率文件:day2_loadtest.py

任务

  • 跑压测,看懂基线 vs 优化组的数字
  • 回答:为什么 P95/P99 比「平均」更能反映长尾体验?
  • 改 concurrency,看 TPS 与 P99 怎么变(长尾拉开)
  • 口述:同步 sleep 放进 async 会发生什么?(本包踩过的坑)
✔ 自查:优化组 TPS 更高且 err=0;你能解释 concurrency 的含义。

运行

python day2_loadtest.py
重难点:三口径压测。吞吐( TPS)、延迟(P50/P95/P99)、稳定(错误率)三者都要看。P95/P99 最能暴露长尾抖动——设置超时要以 P99 为据。生产换 Locust/k6,但口径一致。坑:同步 time.sleep 会阻塞事件循环,让「并发」退化成串行——这点面试很加分。
Day 3模型路由:分档选模型省成本文件:day3_router.py / deploy/router.py

任务

  • 跑出「全走 pro-max vs 分档路由」的成本/延迟对比表
  • 说清 classify 三档规则:simple/code/hard
  • 思考:质量 0.6 的 mini 为什么对「你好」够用?
  • 把「路由省 X 成」数字记下来,作为汇报素材
✔ 自查:cost_rt < cost_pro 且 lat_rt < lat_pro;你能讲出路由的取舍。

运行

python day3_router.py
重难点:省成本的本质 = 按需求分级供给。大多数请求是 simple,把这一大头打到便宜档(fast-mini),贵模型( pro-max)只服务真正难的请求。不牺牲大多数体验,成本大头被砍——这是 LLM 降本第一板斧。
Day 4Prompt 缓存:命中率 + 省钱/省延迟文件:day4_cache.py

任务

  • 跑出命中率,对比「理论上限」与「实测」
  • 回答:为什么只缓存「确定、幂等」的查询?
  • 理解 TTL(防陈旧)与 LRU(防膨胀)各自防什么
  • 把「命中率 X%、省 ¥Y」记下来当汇报素材
✔ 自查:命中率 ≥20%(热点流量下),且你能解释命中如何 0 成本 0 延迟。

运行

python day4_cache.py
重难点:缓存是「第二个省钱板斧」。重复/热门请求直接复用结果,latency≈0、cost≈0。工程要点:命中率上限由「长尾重复度」决定;生产务必 只缓存幂等查询(不能缓存会变的数据),并加 TTL 与 LRU 防止陈旧和无限膨胀。
Day 5Docker 容器化:多阶段构建文件:day5_docker.py

任务

  • 跑出 Dockerfile,能背出两阶段的职责
  • 回答:为什么 build 和 runtime 要分开(多阶段)?
  • 理解:为什么运行用户设成非 root?
  • 回答:/health 端点除了给用户,还给谁用?
✔ 自查:validate_dockerfile 全过;你能讲 6 个 must_have 每一项的理由。

运行

python day5_docker.py
重难点:多阶段 = 又小又安全。阶段一装依赖、阶段二只拷「干净的依赖+代码」→ 镜像更小、攻击面更小。运行用户非 root = 最小权限(呼应 W8 安全)。HEALTHCHECK 是 Docker/编排/压测三方共用同一个「就绪信号」。
Day 6vLLM 自部署与参数估算文件:day6_vllm.py

任务

  • 跑估算,看懂「显存 → 单批时间 → RPS」的推导
  • 说出 SaaS vs 自部署的三条取舍依据
  • 理解 continuous batching 为何能提吞吐
  • 把「一张卡约 X RPS」的手感记下来
✔ 自查:throughput > 1 RPS;你能为「要不要自部署」给出理由。

运行

python day6_vllm.py
重难点:自部署不是缺省选项,是权衡。取舍三看重:延迟/合规/规模化成本。vLLM 的价值在吞吐——continuous batching 把多请求动态拼批,谁先产出谁先走,避免 naive 批处理的「最慢木桶」。面试能算「单卡 RPS」是加分项。
Day 7综合性能报告:基线 vs 优化文件:day7_report.py

任务

  • 跑出四象限报告,看懂每项变化原因
  • 把「提升 X% / 改善 Y% / 省 Z 成」抄进作品说明
  • 给自己模拟面试:被问「流量上来会崩吗」怎么答
  • 用 W8+W9 连成完整叙事:安全 + 上线 + 性能数据
✔ 自查:utput 多维度全优且 err=0;你能报出优化前/后关键数字。

运行

python day7_report.py
重难点:把「零件」变「谈资」。这页报告 = 你「能上线」的证据:吞吐提升、延迟改善、成本下降、稳定无错。面试被问「做过优化吗」——就答「我加路由+缓存,TPS 4.6倍、P95 降 6成、成本省 7 成」。

本周自测题(面试预热)