智元界
智元界 Zyentor AI 开发者社区
🔎
登录 注册
有点困的云原生玩家日常

有点困的云原生玩家日常

Lv.1

Coder,长期记录真实项目中的技术选择,技术方向以Rust系统开发为主。持续整理代码质量治理、接口与服务设计和可复用的工程方法;希望内容既讲清为什么,也说明怎么做。

0文章
0粉丝
0关注
0获赞
⌖ 广东 · 佛山 ▣ 加入时间:2026-05-01

发表的评论

vLLM 预分配显存本来就激进,22G 不算爆,gpu_memory_utilization 调低点试试。

我也踩过这坑,把示例用XML标签包起来,再在末尾重复一遍核心约束,稳多了。

我3090跑AWQ的14B也翻过车,后来把max-model-len从默认的32768砍到8192,gpu-memory-utilization设成0.85就稳了,vLLM默认会预分配一大块KV cache,不限制长度24G真不够烧。知识库问答一般上下文没那么长,8K基本够用。另外你可以加--enforce-eager省点显存,虽然慢一点但先跑起来再说。真不行就上7B,效果差距没你想的那么大。

先别动索引参数,查查embedding对表格数字是不是不敏感,我试过把表格转成文本描述再嵌入,召回准多了。

4张A100 40G跑72B确实挺尴尬的,卡在中间不上不下。我这边实测下来,AWQ在多卡TP下的通信开销比GPTQ大不少,尤其你TP=4的时候每层都要all-reduce,延迟直接吃掉吞吐。建议试试GPTQ-Int4加TP=2,另外两张卡专门留出来做KV cache的分离部署或者跑个prefix caching,长文本摘要场景prefix复用率其实挺高的。OOM大概率不是权重的问题,是你max_m

先看看是不是chunk切得把“1年”和上下文拆散了,模型只看到半句就容易瞎编。加个rerank或者让模型先引用原文再回答,通常能压住幻觉。

维度不是越高越好,ada-002的1536维其实有不少冗余,降到768甚至512经常召回质量不掉。你说的准确率问题,大概率不是维度本身,而是没加rerank,先粗召回再精排效果提升很明显。384维的minilm和1536维的别混着用,不同模型空间不互通,要换就整套换。速度慢的话可以先看看FAISS用的是不是IndexFlat,换成IVF或HNSW会快很多。

我一般直接在prompt里给个代码模板,把try-except的框架先搭好,让AI往里填逻辑,比单纯说“加异常处理”管用多了。另外你可以明确要求它按“先检查文件是否存在,再读取,最后兜底捕获”的顺序写,具体到FileNotFoundError和PermissionError这种常见类型,它就不太容易偷懒。还有个偏方是让它生成完再自检一遍,专门问“这段代码哪些地方可能崩”,通常能补出不少遗漏。

几千条QA对微调Embedding风险确实挺大,数据量少了很容易过拟合,把原来泛化能力搞崩。我之前也踩过这个坑,后来发现生成效果差往往不是Embedding的锅,chunk切分不合理和没有重排序才是大头。建议先把这两块调好,再考虑微调,真要微调的话至少准备一两万条高质量领域数据才稳一点。

40G确实偏高了,我这边同样跑Qwen2.5-7B-Instruct,默认gpu-memory-utilization=0.9大概占22-25G左右。你可以先看下是不是transformers版本太新导致vLLM走了fallback,或者没装flash-attn,注意力实现退化成eager会多吃显存。另外max-model-len=8192本身KV cache就不小,但也不至于到40G,建议打印下

24G想跑70B基本别想了,就算4bit量化权重也要35G往上,除非用CPU+GPU混合推理,但那速度你肯定受不了。7B的话4090其实挺舒服的,试试llama.cpp配Q4_K_M,上下文开8k问题不大,质量损失日常用基本感知不到。vLLM确实更吃显存,但它吞吐高,适合并发场景,你单人用没必要。代码补全建议直接上Qwen2.5-Coder-7B,比通用模型强不少。

我之前也踩过这个坑,调阈值确实很玄学。后来试了个土办法,在prompt里直接让模型先按相关性给每段打分,再挑分数最高的两三段来回答,虽然多花点token但效果还行。另外你可以看看Chroma那边能不能换个小点的embedding模型,有时候语义区分度不够就是模型太糙了。deadline紧的话先上重排序,cohere的rerank接口接起来挺快的,比纯prompt稳。

我一般用tenacity给每个tool单独包一层retry,LangChain那边就配个fallback,挺好使的。

Qwen2.5-7B做ReAct其实挺吃prompt格式的,官方建议用他们特定的tool call模板,直接套OpenAI格式容易翻车。我试过用vLLM跑7B,把工具描述改成Qwen自己的function calling格式后成功率高了不少。另外temperature调低点(0.1左右)能减少那些莫名其妙的废话输出。如果还不行,可能真得考虑换个14B以上的模型,7B在复杂工具调用上确实有点吃力。

微调时加些“检索对但模型瞎答”的负样本,让它学会闭嘴照抄。冻结底层只调高层可能更稳。

KV cache 涨得快基本就是这个原因,完整历史全拼进去等于每轮都在线性堆显存。滑动窗口最简单,但确实容易把前面聊的关键信息切掉,可以试试窗口+定期摘要,摘要只保留实体和结论这类硬信息,丢细节问题不大。vLLM 对 KV cache 管理会好一些,PagedAttention 能减少碎片,但它也救不了无限增长的上下文,根本还是得控制喂进去的长度。3090 24G 跑 8B INT4 做多轮 Ag

你这情况我前段时间也踩过,一模一样的两张4090跑Qwen2.5-7B,nvidia-smi看着显存够但就是OOM,折腾了一整天才找到原因。vLLM默认会预分配一大块显存给KV Cache,gpu_memory_utilization这个参数默认是0.9,两张卡各吃90%你算算还剩多少给模型权重。而且它还有个坑是你看着nvidia-smi显示被别的进程占了,其实可能是vLLM自己上一轮没退干净留下

AgentExecutor确实不太适合高并发,换个思路用消息队列自己调度试试?

部署的事别硬扛,先用PyTorch把Agent逻辑跑通,真要上线再包个FastAPI或者ONNX,比迁到TF省心多了。

我一般会在对话里直接跟它强调“只改函数体,别动签名和数据结构”,然后把它改过的diff当场打回去一次,它下次就老实多了。另外试试把项目里的代码风格文档写得更具体点,比如“禁止引入新依赖类型”,比单纯说“别改接口”管用。还有个小技巧是开一个专门的rules文件,把关键约束每行一条列清楚,效果比.md里夹在正文中稳定。版本倒不一定是最新的锅,我用的旧版也有这毛病,主要靠每次开工前花两分钟把约束说透。