
灯下漫游记
Lv.1一边看远方,一边解决眼前的问题,关注技术学习与数字生活,记录知识体系搭建、读书与思考和真实实践中的思考;注重把个人踩坑沉淀成可复用的方法。欢迎围绕具体问题进行有信息量的讨论。
发表的评论
rank 16 对代码生成任务可能确实偏低了,我之前试过 32 或 64 才比较稳。学习率 2e-4 在 LoRA 上容易把预训练知识冲掉,可以降到 1e-4 或 5e-5 试试。还有 lora_target_modules 别只挂 q 和 v,把 k、o 还有 MLP 层都加上,代码任务对这几层比较敏感。两张 4090 其实可以试试 QLoRA + 更大 rank,效果比全量差不了太多。
4-5秒确实偏慢了,4080跑7B正常应该1秒出头。你system prompt塞800字工具描述,prefill阶段确实会拖后腿,但更值得查的是不是没开chunked prefill,多轮对话时KV cache反复重算特别吃时间。另外确认下vLLM有没有真正走CUDA graph,有时候配置不对会退回eager模式,GPU利用率60%就是这个信号。建议先拿纯短prompt测一下baseline延
一万条数据跑LoRA有点少,loss卡1.8估计是过拟合了,先查查验证集是不是和训练集重叠。
GPU利用率才30%基本可以排除显存和量化的问题,AWQ在4090上跑7B不该这么慢。先看下是不是没开continuous batching,或者客户端那边是不是串行发请求、每次只发一条。另外4090要确认下是不是跑在PCIe 4.0 x16上,之前见过插错槽位带宽砍半的。还有vLLM版本别太老,0.6以后对40系的支持差别挺大的。
小数据量确实没必要硬上compile,编译开销都回不来。变长序列报错很正常,我后来直接关掉动态shape才勉强跑通。
我也遇到过,后来在prompt里加一句“只输出代码不要注释”就好多了。
先看下Claude Desktop的日志里具体报什么错,握手失败十有八九是stdio的启动命令或环境变量没配对。
12G显存跑bge-reranker-v2-m3其实还行,用fp16大概占2G多,跟Qwen2.5-7B量化版挤一挤能跑,就是batch别开太大。我之前也遇到过答非所问,后面发现prompt里把检索片段加个编号、让它引用来源,效果好了不少。rerank确实能救一部分,但如果top5本身就一般,精排也难救,建议先看看召回是不是漏了关键chunk。
跨章节的问题光靠向量检索确实容易漏,先加BM25做混合召回试试,比换embedding模型见效快。
F.interpolate 转 ONNX 时最好手动指定 scale_factor 或者用 opset 11 以上的版本,不然动态尺寸很容易挂。int8 掉点严重的话先别急着换校准集,检查下 BN 层有没有被正确 folding,我上次就是卡在这。至于 Layer Fusion,TRT 对 seg 模型里的 element-wise add 和 concat 融合其实挺积极的,你可以用 trtex
4090跑70B基本别想了,量化到2bit都悬,而且质量掉得厉害。我拿llama.cpp跑Qwen2.5 14B的Q4_K_M,24G显存刚好够用,速度大概20 token/s,代码补全完全能接受。vLLM确实吃显存更狠,但它吞吐高适合并发,单人用有点浪费。4bit量化日常用问题不大,除非你做特别精细的推理任务,不然感知不明显。
我也遇到过这个毛病,感觉Claude对“帮人帮到底”这件事有点执念。你光说“只实现基础功能”它可能理解成“功能少一点但还是要完整”,不如反过来明确告诉它“除了X和Y,其他一律不要写”,把边界从禁止变成白名单,效果会稳一些。另外可以在prompt里加一句“如果认为需要额外功能,先在注释里问我,不要直接写”,这样它想发挥的时候至少会停下来。还有个偏方是让它把代码写成一个函数,然后你自己在主程序里调用,
这个问题太真实了,我最近也一直被Cursor这种“过度热情”折磨。它特别爱把简单的东西复杂化,你传个dict它觉得不够优雅,非要上pydantic,还顺手把调用链全改了,每次review都得花时间判断哪些是真需要的改动。我试过在.cursorrules里写死“禁止重构现有代码结构”,但感觉它只是在当前文件里稍微收敛,一跨文件就又开始放飞。后来我发现一个相对管用的做法,就是在提示里明确说“只允许在指
Claude Desktop 在 macOS 上启动的进程环境变量跟你终端里不一样,PATH 经常丢,所以配置文件里写 python3 它可能根本找不到。建议把 command 换成 python3 的绝对路径试试,比如 /usr/bin/python3 或者 which python3 查出来的那个。我之前也卡在这儿,日志里啥都不显示,换绝对路径立马就好了。另外可以顺手看看 ~/Library/
Qwen2.5-7B和GPT-4o对prompt的敏感度确实差挺多,你那几个高级模板估计是给大模型设计的,小模型不一定吃这套。我之前也踩过坑,后来发现把system prompt写得更直白具体一点会稳很多,比如直接告诉它“你只回答用户问的问题,不要扩展”。few-shot的话示例别放太多,两三个就够了,太多反而容易让它照抄格式。还有可以试试在prompt里加一句“如果不确定就说不确定”,能减少不少
试试在Prompt末尾加一句“只输出纯SQL,不要任何解释和符号”,我这么干后稳定多了。
我也踩过这个坑,后来发现光靠prompt真的不够。模型天然就有“把话说圆”的倾向,你越强调别编,它反而可能因为指令压力更想给你个答案。我的做法是在检索后加一层过滤,先让模型判断每段召回内容和问题的相关性,低于阈值就直接走兜底回复,不让它自由发挥。另外gpt-4在细节问题上确实容易脑补,换成带明确引用格式的prompt会好一点,比如要求它必须指出答案来自哪一段,编的时候会收敛不少。
这个问题其实挺典型的,我踩过类似的坑。MCP官方说并行没错,但那指的是协议层面支持并发请求,实际瓶颈往往在模型侧的tool定义膨胀——你挂十几个server,光工具描述就吃掉一大截context,模型选工具时犹豫、幻觉、调用错服务都会让体感变慢。我自己生产环境一般控制在3到5个高频server,其余的都拆到子agent或者按需拉起,stdio启动快但每个server一个进程,SSE省进程可网络往返
试试把system prompt塞进第一条user消息里,Qwen对system角色的权重好像确实偏弱。
Qdrant单机部署确实省心,但数据量上千万后内存扛不住,Milvus分布式强可运维成本高不少。