?)
GPT4All Node.js 退出后 GPU 占用仍然偏高是什么原因model.dispose【免费下载链接】gpt4allGPT4All: Run Local LLMs on Any Device. Open-source and available for commercial use.项目地址: https://gitcode.com/GitHub_Trending/gp/gpt4all用 GPT4All 的 Node.js 绑定npm 包gpt4all跑完一次推理Node.js 进程已经退出但任务管理器里 GPU 占用仍然偏高——这是绑定文档Known Issues一节明确列出的现象。文档给出的原因是没有调用model.dispose()导致原生模型对象没有被删除和清理GPU 资源随之滞留。这篇排障文章说明如何定位这个遗漏以及把model.dispose()放到哪些位置。确认现象属于哪一类问题GPT4All TypeScript 绑定的 README 在 Known Issues 中列出了三个常见问题先区分你遇到的是哪一个避免误诊现象文档给出的对应原因模型输出乱码spewing bull 下载的模型文件损坏重新安装或从官方站点重新下载调用generateTokens之后卡住nPast设置过高可能导致模型挂起文档记录环境Linux Mint、Ubuntu 22.0403/16/2024Node.js 退出后 GPU 占用仍然偏高Make sure to callmodel.dispose()!!!只有第三行才是本文处理的问题。如果你的症状是卡住或输出异常属于另外两条路径不要往dispose()上找。原因dispose() 是手动调用进程退出不会替你清理loadModel加载模型后返回的是InferenceModel推理模型或EmbeddingModel嵌入模型实例底层持有原生资源。这两个类都定义了dispose()API 声明文件 gpt4all.d.ts 中对其注释为/** * delete and cleanup the native model */ dispose(): void;也就是说释放 GPU 上模型占用的唯一途径是显式调用dispose()它返回void、同步执行文档中没有任何自动清理机制的说明。Node.js 进程结束时若模型对象没有被 disposeGPU 占用就不会随之归还。在哪里调用 dispose()仓库的示例代码README 的 API Examples 与 spec 目录下的脚本给出了统一的写法每个loadModel创建的模型对象在用完之后调用一次model.dispose()。基本流程以流式生成为例摘自 README Streaming responses 示例模型名替换成你实际使用的.gguf文件import { loadModel, createCompletionStream } from gpt4all; const model await loadModel(mistral-7b-openorca.gguf2.Q4_0.gguf, { device: gpu, }); const stream createCompletionStream(model, How are you?); stream.tokens.on(data, (data) { process.stdout.write(data); }); // wait till stream finishes. We cannot continue until this one is done. await stream.result; process.stdout.write(\n); model.dispose();要点device: gpu这类 GPU 推理路径下尤其不能省略dispose()——文档中该问题就是针对 GPU 占用描述的。先await生成完成stream.result或 completion 的 Promise再调用model.dispose()不要在有进行中的生成时释放模型。无聊天会话stateless用法、嵌入模型同样如此。例如 spec/streaming.mjs 与 spec/embed.mjs 的脚本末尾都调用了model.dispose()。中途切换模型时旧模型必须显式释放如果程序在一次运行中加载多个模型比如换模型继续对话spec/model-switching.mjs 展示了文档给出的模式加载并用完第一个模型后先dispose()再加载下一个结束时把第二个也释放const model1 await loadModel(Nous-Hermes-2-Mistral-7B-DPO.Q4_0.gguf, { device: gpu, nCtx: 4096, }); // ... 使用 model1 完成若干轮对话 ... model1.dispose(); const model2 await loadModel(gpt4all-falcon-newbpe-q4_0.gguf, { device: gpu, }); // ... 使用 model2 ... model2.dispose();漏掉第一个model1.dispose()时切换模型会叠加占用而不是替换占用这与退出后 GPU 占用偏高是同一个根因。验证方式文档没有给出固定的 GPU 占用数值阈值验证方式就是对照 Known Issues 中的现象描述在脚本正常结束含model.dispose()后退出 Node.js 进程观察 GPU 占用按文档的预期进程退出后占用应回到正常水平不再维持高位。如果调用dispose()后问题依旧说明不在文档已知问题的范围内——文档只把未调用model.dispose()列为该项的解决方案没有提供进一步排查步骤。此时不要再往nPast、模型文件损坏等另外两条 Known Issue 上套需要结合具体环境另行排查。环境前提Node.js 18.0.0package.json 中engines.node为 18.x.xREADME 开发要求同样标注 node.js 18.0.0通过npm install gpt4alllatest或 yarn/pnpm安装后按上述方式使用Windows 和 Linux 上构建 GPT4All 需要完整的 Vulkan SDKmacOS 使用 Metal不需要 Vulkan这只影响从源码构建的场景直接安装 npm 包不受此约束。一句话收尾dispose()不是可选项是 GPT4All Node.js 绑定的手动资源管理约定。凡是由loadModel创建的模型对象——推理模型、嵌入模型、切换过的每一个旧实例——在推理结束、进程退出前都要各调用一次GPU 占用偏高的问题就消除了。【免费下载链接】gpt4allGPT4All: Run Local LLMs on Any Device. Open-source and available for commercial use.项目地址: https://gitcode.com/GitHub_Trending/gp/gpt4all创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考