如何从源码构建 GPT4All TypeScript 绑定(Node.js)?
【免费下载链接】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包),就需要从 GPT4All 仓库源码出发,编译出两部分产物:Node.js 原生模块(native addon)和平台相关的后端动态库。本文按照 gpt4all-bindings/typescript/README.md 中 “Develop” 一节的构建说明,给出在 Linux / Windows / macOS 上完成这次构建的完整路径,以及如何验证构建结果。
构建前置条件
README 明确列出了构建要求,缺一不可:
- git
- node.js >= 18.0.0
- yarn
- node-gyp,及其自身的全部依赖
- Python 3
- Unix 平台:gcc 12;Windows 平台:msvc 143(可通过 Visual Studio 2022 Build Tools 获得)
- Windows 和 Linux 构建 GPT4All 需要完整的 Vulkan SDK;macOS 用户不需要 Vulkan,因为 GPT4All 在 macOS 上使用 Metal
README 对平台测试程度的说明是:Ubuntu 上完整测试通过,Windows 上工作正常,macOS 仅做过少量测试(sparse testing)。
另外注意 package.json 中的两项声明:packageManager为yarn@3.6.1,engines要求node >= 18.x.x。构建用到的prebuildify(原生模块预构建)和jest(测试)都声明在 devDependencies 里,所以构建前先按仓库声明的 yarn 版本安装好依赖。
获取源码并初始化
git clone https://github.com/nomic-ai/gpt4all.git cd gpt4all-bindings/typescript后续所有 shell 命令都假定当前工作目录是typescript目录。
gpt4all 依赖的 llama.cpp 以 git submodule 形式存在,仓库中可能缺失(未初始化)。如果gpt4all-backend/deps/llama.cpp-mainline/目录是空的,需要在 llama.cpp 的父目录中执行:
git submodule update --init --recursive执行构建
1. 构建 Node.js 原生模块
node scripts/prebuild.js这条命令通过 prebuild.js 调用prebuildify,以 N-API 方式(targets: ["18.16.0"])为当前平台构建原生模块,各平台实际构建的组合是:
- Windows(win32):
win32/x64 - Linux:
linux/x64(arm64、armv7 组合在源码中被注释掉了) - macOS(darwin):
darwin/x64与darwin/arm64
构建成功时脚本会为每个平台/架构组合打印Build succeeded for platform ... and architecture ...,全部完成后打印All builds succeeded;某个组合失败时会打印Error building for platform ...及具体错误。
2. 构建后端动态库
yarn build:backendREADME 说明该命令会构建平台相关的动态库,产物位于runtimes/(platform)/native。真正执行编译的是各平台构建脚本,它们用 CMake 构建../../gpt4all-backend并把产物拷贝到runtimes下:
- build_unix.sh(Linux / macOS):根据
uname -s选择目录,Linux 用runtimes/linux-x64、macOS 用runtimes/osx,依次执行cmake -S ../../gpt4all-backend -B "$BUILD_DIR"与cmake --build "$BUILD_DIR" -j --config Release,然后把libgptj*和libllama*两个动态库(.so/.dylib)拷入对应的native目录。副作用:脚本开头会先rm -rf掉对应的runtimes/linux-x64或runtimes/osx目录再重建,目录内已有内容会被清除。 - build_msvc.bat(Windows / MSVC):以 Release、x64 架构构建,把产物拷贝到
runtimes\win32-x64\native\,构建失败时会自动重试。副作用:脚本会删除并重建build\win-x64-msvc与runtimes\win32-x64目录。 - build_mingw.ps1(MinGW):README 明确提示该脚本仅保留备用,此包只兼容 MSVC 构建的 dll,Windows 上应使用 MSVC 路径。
验证构建结果
yarn testyarn test对应 package.json 中的jest。test/gpt4all.test.js 通过node-gyp-build从typescript目录加载刚编译出的原生模块,并覆盖以下几类用例:
- 默认路径常量:
DEFAULT_DIRECTORY应为~/.cache/gpt4all,DEFAULT_LIBRARIES_DIRECTORY应包含runtimes/<platform>-<arch>/native等查找路径 listModels:远程模型列表加载、本地文件加载、参数缺失时报错appendBinSuffixIfMissing:无后缀的文件名会被补成.gguf,.bin保持原样downloadModel:fetch 被 mock,验证下载 URL、md5 校验失败时清理临时文件等
如果测试全部通过,说明原生模块可以被 Node.js 正常加载,构建链路是通的。若想让构建产物真正跑一次推理,可以运行 spec/ 下的示例脚本(如spec/stateless.mjs),README 说明其前提是“模型和库已安装在工作目录中”(should work assuming a model and libraries are installed locally in working directory)。
构建产物与源码结构速览
理解这些文件有助于你修改后重建:
- binding.gyp:node-gyp 编译配置,target 名为
gpt4all,源码包括index.cc、prompt.cc和gpt4all-backend下的llmodel.cpp、llmodel_c.cpp,并按平台定义LIB_FILE_EXT(.so/.dll/.dylib) - index.cc:Node.js 与 C 的桥接层,即绑定本体;prompt.cc 负责以线程安全、异步的方式处理提示与推理
- src/:JavaScript 接口与原生附加组件的类型定义
prebuilds/、runtimes/:prebuild.js与build:backend的输出位置,也是package.json发布时打包的文件
已知问题与限制
README “Known Issues” 一节列出的现象与构建后使用直接相关:
- 模型输出无意义内容:通常是模型文件本身损坏,重装或从官方站点重新下载
- 调用 generate tokens 后模型挂起:可能是
nPast设置过高(README 记录于 2024-03-16,Linux Mint / Ubuntu 22.04) - Node.js 进程退出后 GPU 占用仍然偏高:必须在退出前调用
model.dispose()
另外,Version 4 包含若干破坏性变更(createEmbedding与EmbeddingModel.embed()返回EmbeddingResult对象而非 float32array、移除ModelType/ModelFile类型、移除仅用字符串路径初始化模型的方式),从源码构建后写代码时应对照这些变更。macOS 目前只有 sparse testing,构建产物在 darwin 上未经充分验证。
【免费下载链接】gpt4allGPT4All: Run Local LLMs on Any Device. Open-source and available for commercial use.项目地址: https://gitcode.com/GitHub_Trending/gp/gpt4all
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考