
一只鲸鱼会做产品
Lv.1一只认真学习、偶尔犯困的技术动物。关注产品设计与管理,主要分享业务流程拆解、产品增长与运营和日常踩坑;关注技术选择背后的成本与边界。偶尔更新生活观察,主要还是认真做事。
发表的评论
loss降不代表模型变好,看生成效果才靠谱。混点通用数据或者r调小试试,别让模型只认法条了。
我之前也踩过这个坑,R1的思考链确实太能写了,4096根本打不住。后来我干脆不用AgentExecutor了,自己写了个简单的循环,每轮检测到`</think>`就继续,没结束就把预算往上加。你也可以在prompt里让它先输出一个简短的plan,再展开推理,能省不少token。不过状态恢复那块确实烦,我现在是把每步的原始输出都存下来再手动解析。
几千条QA微调风险大,先搞chunk和重排吧,那才是瓶颈。
loss降到0.8但输出全是套话,八成是数据里那些安全回复占比太高了,模型直接学会偷懒走捷径。你翻翻训练集,是不是有很多“建议就医”这类模板答案重复出现?建议把这类通用回复筛掉或者降权,多保留有具体诊疗细节的样本。另外检查下prompt里有没有把system instruction写得太保守,模型会顺着那个调性走。
5万条数据、max length 2048,一个epoch 10小时其实不算特别离谱,但确实偏慢了。你算一下,5万条除以batch size 2再除以grad accumulation 8,差不多要跑3125个step,每个step如果3-4秒,加起来也就3小时左右,所以10小时说明单步耗时可能在10秒以上,这就有点问题了。我怀疑瓶颈不一定在算力上,可能是在数据加载那块,你可以看看dataload
千万级768维用standalone的Milvus,延迟抖动大概率不是数据库本身的锅。Milvus standalone把所有组件塞一个进程里,查询和插入抢资源,你插入数据后触发flush或者compaction,查询延迟飙到200ms+太正常了,尤其索引还没完全build好的时候。建议先看下是不是segment数量太多、没做compaction,或者nprobe设太高了,调参能救回来不少。Qdr
显存跑到第5个epoch才爆,基本能排除模型结构本身的问题,更可能是数据增强里某些操作把计算图带进来了。你可以先查查自定义Dataset的__getitem__里有没有在transform中调用需要梯度的操作,比如不小心对tensor做了in-place修改或者保留了中间变量引用。torch.cuda.memory_summary()确实不够直观,我更常用torch.cuda.memory_all
直接PyTorch吧,Keras就是TF的皮,新手跑图像分类用torch半天就能出结果。
Cursor在MCP下写Python单测挺顺的,上下文抓得准,不过它对协议的支持还得靠插件,终端里直接跑暂时别想。
固定512字符对合同类文档其实挺吃亏的,条款经常跨段甚至跨页,硬切完语义就断了。你可以先别急着换模型,拿那50个问答对做个消融实验:只改分块(比如按条款标题切、或者用语义分块),其他不动,看召回率变化。如果提升明显,那embedding和索引的锅就没那么大。bge-large-zh在专有名词上确实可能吃点亏,但ada-002也没神到哪去,合同里的公司内部术语它同样没见过,关键还是看你的query和
十几步才OOM,显存又没满,大概率是碎片化或者激活值累积的问题,不是单纯容量不够。ZeRO-2本身不切分参数,7B的权重加优化器状态两张24G确实挺紧的,offload_param在Stage 2下不生效,得Stage 3才行。你可以试试把optimizer和param都offload到CPU,或者直接上ZeRO-3加CPU offload,速度慢点但能跑起来。另外检查下有没有开activatio
TF转PyTorch是大趋势,但线上部署别硬转,用TorchServe或Triton一步到位省心多了。
先别急着换模型,我踩过这个坑。你拿几个典型问题手动去Chroma里搜一下原文,看是压根没召回还是排后面了。如果原文都搜不到,那就是chunk切碎了,500对中文来说经常把一个完整段落拦腰砍断,先试800到1000、overlap拉到100看看。要是原文能搜到但排不进top5,那才是embedding或者缺reranker的问题,加个bge-reranker比换embedding划算多了。chunk
单卡跑FSDP确实容易踩这个坑,显存不降反升大概率不是配置写错了,而是FSDP本身的开销在单卡场景下被放大了。你用的SHARD_GRAD_OP只分片梯度和优化器状态,参数本身还是全量复制的,所以模型权重那份显存一点没省,反而多了all-gather通信时的临时缓冲区。7B的LoRA虽然可训练参数少,但基座模型的fp16权重就要占14G左右,加上all-gather的峰值和之前DDP的梯度桶,冲到7
多工具串行确实容易翻车,我后来是用官方function calling模板重洗数据才稳住的,LoRA本身问题不大。
我也踩过这个坑,后来发现大概率是工具描述写得太模糊。模型判断要不要调工具,主要看 description 和当前上下文匹不匹配,注册成功不代表它知道啥时候该用。建议你把每个 tool 的用途、触发场景写具体点,最好带个例子,我改完之后调用率明显上来了。另外系统提示里明确说一句“需要读写文件时必须用工具,不要凭记忆回答”也挺管用。
我之前也踩过这个坑,后来发现跑偏多半是工具描述写得太模糊,Agent根本分不清啥时候该用哪个。建议把每个tool的description改得更具体,比如计算器就明确写“只处理数学表达式”,别让它有想象空间。中断的问题可以试试把max_iterations设小一点,配合early_stop_method="force",至少能保证它别卡死。另外输出格式不稳的话,换个支持function callin
这个现象我也遇到过,不止Qwen,Llama系也有类似情况。system prompt里加个形容词有时候会意外激活训练数据里某些特定分布,导致风格漂移。我一般会把temperature降到0.5左右试试,0.7对这种敏感模型确实容易放大随机性。另外你说的repetition_penalty调太高反而可能让模型强行换词,读起来更怪,试试1.05就够了。
A10跑7B的INT4并发一上来确实容易炸,我们之前也踩过。AWQ比GPTQ在vLLM里吞吐稳一些,你可以换AWQ权重再配gpu-memory-utilization调低点试试。另外老接口不兼容的问题,可以前面挂个FastAPI做适配层,比换模型划算。真要压成本,3B做召回+7B只兜底复杂query,效果和显存都能兼顾。
拼接历史对话直接embedding确实容易把query本身的语义冲淡,我之前也踩过这个坑。建议先把历史对话做摘要再拼,或者只把关键实体抽出来单独做query扩展,别整段塞进去。混合检索(BM25+向量)在实体匹配场景下提升挺明显的,尤其用户提到前几轮的人名、专有名词时。MCP那边可以在server里加一层query改写,把当前问题结合历史压缩成独立query再检索,比直接拼靠谱不少。