
灯下漫游集
Lv.1把零散灵感沉淀为可复用的方法,关注技术学习与数字生活,记录知识体系搭建、学习路径整理和真实实践中的思考;习惯用项目结果检验技术判断。技术会变化,解决问题的方法值得长期积累。
发表的评论
我3060 12G跑Llama 3.1 8B的Q4_K_M大概能到20 token/s左右,你十几秒一句话不太正常,可能是没开GPU卸载或者context设太大了。Ollama直接拉模型最省事,底层就是llama.cpp,中文效果4-bit和8-bit差距没想象中大,日常用完全够。vLLM在12G卡上跑8B其实挺吃紧的,不如老老实实用Ollama或LM Studio。
这问题挺典型的,不一定是prompt姿势的问题,DeepSeek Coder v2本身在长链条逻辑上确实容易掉细节。我自己的经验是,如果一次性让它把整个脚本从读取到清洗到保存全写完,出小bug的概率特别高,尤其是变量名和异常处理这种边角料。后来我改成让它先只写一个函数、一个功能块,跑通了再拼起来,出错率低了不少。像pandas的inplace参数搞反,这个其实挺常见的,它有时候会混用新旧两种写法,
我之前把类似规模的模型从PyTorch迁到Flax,说实话jit编译那几分钟确实劝退,但编译完单步速度大概快20%到30%,只是这收益得跑够多步才回本。自定义算子和动态控制流在JAX里是真的难受,条件掩码得用lax.cond或者where绕,写起来远没有PyTorch顺手。如果团队就你一个人维护,我建议先别折腾,除非你明确要上TPU或者多机并行,不然调试成本会把省下的时间全吃掉。
长文档光调chunk_size没用,得按标题层级切。建议先加个rerank试试,基本能救回来。
我上次也卡这儿了,后来发现七成问题出在切分上,条款被切得七零八落,prompt再怎么写都救不回来。你可以先试试按条款结构切,再叠个重排模型,把top5压到top3,噪声少很多。prompt那边我一般分三层:system管身份和拒答,检索后加一步让模型先摘出相关句子再答,最后才做格式约束。口语化query确实坑,得先做一轮query改写再检索,不然“失业金”和“失业保险金”都能召出两拨东西。
我碰到过一模一样的,后来发现是LoRA的target_modules没设对,只挂了q_proj和v_proj,mlp层没动,模型容易卡在重复模式里。你试试把学习率降到1e-4或者5e-5,2e-4对LoRA微调8B确实偏高了,容易过拟合到短回复模板上。另外5000条数据跑3个epoch其实够了,重点看下训练集里有没有大量类似“好的”“是的”这种极短回答,哪怕只有几十条也会被放大。建议先加repet
表格数据在chunk切分时特别容易被拦腰截断,尤其是跨页的大表,模型拿到半截数据肯定就懵了。我一般会在切分前先把文档转成markdown,让表格结构保留下来,再按行或按表整体切,效果会好不少。另外可以试试让模型先定位表格再提取,比如分两步走,先找出所有指标所在位置,再逐个抽数值,比让它一次输出靠谱得多。
试试把长文本切块后再精排,整段塞进去模型注意力早散了。
两张4090跑7B还压8192的max_model_len,这个配置本身对KV cache就挺紧张的。nvidia-smi剩8G不代表能直接用,vLLM那边是按block粒度预分配的,碎片一多就容易报不够,实际可用远小于账面数字。gpu-memory-utilization降到0.8会更慢我一点不意外,等于把留给KV的额度又砍了一刀,调度器只能更频繁地抢。chunked prefill建议开,对p
我一般会在工具返回结果里加个source标记,提示词里明确告诉模型不同来源的数据不能混用,目前效果还行。
先别急着调索引参数,八成是embedding对中文的锅。我之前换BGE-M3做中文,召回直接涨了快20个点。
你这里有个坑挺关键的,AWQ和int8其实不是一回事,vLLM里`--quantization awq`是留给AWQ权重的,你如果只是把LoRA merge完直接导出成int8的checkpoint,那大概率是走不了AWQ kernel的,反而会用fallback路径把权重反量化回fp16再跑,显存自然下不来。还有LoRA merge后有没有把adapter彻底合进去也要确认,没合干净的话vLLM
先贴组件目录和package.json,再让它照着现有组件抄,比啥角色设定都管用。
试试限制max-model-len,history太长确实吃显存,不行就换TP两张卡跑。
先查下是不是有算子不支持动态shape被回退,固定batch当备选更省心。
检索这块儿得下功夫,光靠模型本身不够,切块和重排才是关键。
我一般先切短再抽,长对话一锅端容易漏字段,两次调用反而稳。
这问题我碰到过好多次,后来发现光在prompt里强调“完整”没用,得给它一个反面例子,比如直接说“如果文件不存在或者网络超时,请输出错误信息而不是让程序崩溃”。另外让它先写核心逻辑,再单独跑一轮“只补异常处理”的指令,成功率会高不少,你可以试试分步来。 我猜模型是把“完整”理解成功能完整了,对健壮性这种隐性要求确实不够敏感。你可以在写需求的时候,顺带把可能出错的具体场景都列出来,比如“open的
固定512切确实容易把语义切碎,试试按章节或标题来切,召回应该会准不少。
试试让模型先逐段判断有没有答案再汇总,比直接拼接全文靠谱得多。另外检索结果里加个来源标签能减少瞎编。