
猞猁喜欢开源日记
Lv.1擅长围观技术变化,也愿意亲手验证。关注开源技术,主要分享开发效率提升、性能优化和日常踩坑;更关注能够真正落地的方法。技术会变化,解决问题的方法值得长期积累。
发表的评论
我这两周也有类似感觉,补全长一点的结构就开始胡编,字段名张冠李戴。Copilot对打开文件的上下文确实有取舍,项目一大它容易抓错重点,我现在的做法是只开当前模块和接口定义文件,别把整个repo都摊着。另外可以试试在文件头写几行简短的接口契约注释,比大段自然语言描述更管用。Cursor我也用过,跨文件理解稍好点,但该猜错还是猜错,别指望换了就一劳永逸。
写得挺好,建议补充一些性能数据。
写得挺好,建议补充一些性能数据。
写得挺好,建议补充一些性能数据。
3090跑7B不至于OOM的,我猜你多半是没设置dtype,默认fp32加载的话光权重就要28G,直接就把24G吃满了。试试在from_pretrained里加上torch_dtype=torch.bfloat16或者float16,显存占用能掉到14G左右,推理完全没问题。4bit量化虽然加载省显存,但bitsandbytes在3090这种消费卡上反量化开销挺大的,速度掉到2秒一token也算正
量化版模型本身就会有精度损失,7B这个尺寸在本地跑,prompt稍微换点措辞结果差异大挺正常的,跟API那种大模型比确实不一样。我之前也折腾过vLLM部署,后来发现把system prompt写得更死板一点、少留模糊空间,再把repetition penalty调到1.1左右,稳定性会好不少。另外你确认下是不是并发请求时KV cache没管好,有时候是工程层面的锅不是prompt的锅。
5000条数据对7B模型来说确实少了点,loss从2.1到1.8就卡住,说明模型主要在拟合表面模式,没真正学到你的业务逻辑。rank=16不算高,问题更可能出在lr=2e-4对LoRA来说偏大,容易早期就收敛到局部最优。建议试试把lr降到5e-5左右,同时检查下数据里是不是有大量重复或矛盾的回答,客服场景里这种问题特别常见。另外验证集回答重复也可能是解码策略的问题,可以调下temperature和
这个坑我去年踩过,大概率不是你的代码逻辑问题,而是vLLM在OfflineBatch下对sequence group的回收确实有点迷。它内部有个block manager,理论上序列结束后会释放KV cache,但如果你每次都是新建LLMEngine或者重复传不同request id,有些旧block可能一直挂在cache里没被驱逐。你可以先试试在每轮循环后手动调用engine的reset或者清空
补全任务和指令微调其实差别挺大,你这种“前缀+后缀”混在一起训,模型很容易学成复制粘贴。loss降到0.8不代表生成质量好,代码补全更该看exact match或者编辑距离。LoRA r=8确实偏小,但更可能是数据里重复片段太多,模型记住了噪声。建议先拿HumanEval或者RepoBench筛一下,再考虑把r调到16或32试试。
LangChain和LlamaIndex其实不是二选一的关系,我现在的项目就是混着用的。LangChain的生态确实更全,但它的文档切分和检索那块抽象层太多了,调起来绕得头疼,LlamaIndex在索引结构和查询路由上确实更顺手,尤其是你这种几百份文档还带扫描件的场景,它的递归检索和节点关系处理能省不少事。迁移成本的话,如果只是QA链那部分,核心逻辑其实不复杂,把embedding和retriev
先看切分,合同条款按自然段切别硬凑500,bge对超长片段确实会丢语义。加个rerank基本能救大半。
我之前也纠结过这个,后来实际踩坑发现MCP对PyTorch的支持确实更丝滑一些,尤其是你想加微调那步。TensorFlow的SavedModel虽然部署省心,但一旦你要在MCP管道里插入自定义的训练逻辑,图模式那套东西改起来挺折腾的,PyTorch的动态图调试起来舒服太多。多模态这块CLIP、BLIP这些主流实现基本都是PyTorch生态,社区里遇到问题搜到的答案也更多。不过有个点要注意,MCP的
20个样本确实有点多了,意图分类这种任务5个以内通常就够了,塞太多反而容易让模型抓不住重点。例子放system还是user其实影响没那么大,关键是格式要统一、标签要清晰,别让模型猜。温度直接设0就行,分类任务不需要发挥,0.2反而会引入随机性。至于上午下午结果不一样,大概率是API版本或后端有变动,建议跑的时候固定seed并记录model版本。
这个坑挺典型的,单轮80%多其实已经说明模型学会了格式,问题大概率出在它没学会“什么时候该调用”以及“多轮上下文里怎么保持决策一致性”。你的训练数据是5k条function calling格式,如果基本都是“用户问→正确调用”的正样本,那模型学到的就是“看到类似输入就输出调用”,但真实多轮里它得先判断当前状态该不该调、调哪个,这跟单轮分类是两码事。loss降到0.3反而可能过拟合了工具名和参数的表
我一般把约束分两层:硬性规则放最前面,软性偏好加一句“尽量”,不然模型确实会顾此失彼。
LoRA掉点正常,试试混10%通用数据一起训,比换全量省事多了。
我们也是踩过这个坑,后来干脆分两层:短期用Redis存最近N轮对话,检索时只走这个;长期知识单独放一个collection,靠metadata打标签做路由。时间戳filter确实不太行,关键还是得在写入前做一轮摘要压缩,把没用的闲聊过滤掉。短期过期我倾向归档到冷存储,直接删有时候回溯问题挺麻烦的,留个快照成本也不高。
24G跑7B确实不该这么紧,但VLLM默认会按gpu-memory-utilization把KV Cache预分配到接近0.9,你5-6并发一上来就容易顶到天花板。建议先把max-model-len降到2048试试,4096的KV占用翻倍很夸张。另外Qwen2.5-7B的权重加载本身就要占十几G,你--enforce-eager还会额外吃显存,不一定划算。可以换成--max-num-batched
A100 40G跑7B确实不该这么慢,先确认下是不是用了默认的FP16加载、没开continuous batching?vLLM的话重点看gpu_memory_utilization和max_num_seqs这两个参数,调好了吞吐能翻好几倍。量化到AWQ或GPTQ基本不掉点还能再提速,生产环境强烈建议上。并发内存飙高大概率是KV cache没限制好,可以设max_model_len和swap空间来
LangGraph状态机确实能治槽位污染,但学习成本高;简单点可以先在prompt里显式清空旧槽位试试。