
TensorFlow.js tfjs-layers 开发指南构建、测试与本地联调发布工作流【免费下载链接】tfjsA WebGL accelerated JavaScript library for training and deploying ML models.项目地址: https://gitcode.com/gh_mirrors/tf/tfjstfjs-layers是 TensorFlow.js 生态中实现 Keras 风格高层神经网络 API 的核心包项目描述见 tfjs-layers/package.json开发者经常需要在修改tfjs-layers源码的同时让聚合包tensorflow/tfjs立即反映这些改动以便在完整框架中验证效果。本文以 tfjs-layers/DEVELOPMENT.md 为骨架系统讲解 tfjs-layers 的本地开发流程、提交 PR 前的质量关卡、以及“改 layers → 本地发布 → 主包联调 → 构建 npm 包”的完整工作流并补充仓库源码中的底层机制佐证帮助你快速上手该包的迭代开发。一、环境准备安装全部开发依赖作为任何开发工作的第一步在仓库根目录运行yarn安装所有开发依赖yarn对于tfjs-layers包而言其声明在 tfjs-layers/package.json 中的devDependencies主要包括bazel/bazelisk驱动 Bazel 构建/测试与clang-format配合代码格式化脚本使用。由于当前仓库已整体迁移到 Bazel 构建体系可参考根目录 BAZEL_MIGRATION.mdyarn安装完成后构建与测试均通过bazel经bazelisk自动选择版本执行。二、提交 PR 前的四道质量关卡按照开发流程在提交包含改动的 Pull Request 之前必须确保以下命令全部成功。这四个命令对应四条独立的校验线编译、格式、静态检查与单元测试。1.yarn build编译项目yarn build该命令把 TypeScript 源码编译为可发布的 JavaScript 产物。在 tfjs-layers/package.json 中build脚本实现为bazel build :tfjs-layers_pkg它通过 tfjs-layers/BUILD.bazel 中定义的pkg_npm规则产出完整 npm 包。从 tfjs-layers/BUILD.bazel 的copy_bundles目标可以看到构建产物并非单一文件而是包含多种形态的 bundletf-layersUMD、tf-layers.min压缩版、tf-layers.es2017/tf-layers.es2017.min、tf-layers.fesm/tf-layers.fesm.minES Module 扁平格式以及tf-layers.nodeNode.js 版本同时还会额外复制一份dist/miniprogram/index.js用于小程序场景。这些产物由 tfjs-layers/src/BUILD.bazel 中定义的tfjs-layers_src_lib与tfjs-layers_lib两个ts_library目标编译而成——前者以tensorflow/tfjs-layers/dist模块名编译全部源码index.ts除外后者单独编译index.ts入口并以tensorflow/tfjs-layers作为模块名。2.yarn format统一代码格式yarn formattfjs-layers的format脚本指向./tools/clang_format_ts.sh即 tfjs-layers/tools/clang_format_ts.sh使用clang-format对 TypeScript 源码进行统一格式化。在提交代码前执行该命令可以避免因格式问题在代码评审或 CI 中被打回。3.yarn lint静态检查yarn lint执行 linter 检查代码风格与潜在问题。对于 tfjs 仓库lint 检查依赖仓库根目录的 tslint.json 配置配套的规则集还包含tslint-no-circular-imports这类防止循环依赖的专项检查见 tfjs/package.json 的 devDependencies确保包之间保持清晰的依赖方向。4.yarn test浏览器单元测试yarn test在 Chrome 和 Firefox 中运行单元测试并确保所有测试通过。在当前的 Bazel 实现中test脚本为bazel test :tests --test_outputall而 tfjs-layers/BUILD.bazel 中的test_suite(name tests)聚合了tfjs-layers_webgl2_test面向 WebGL2 后端浏览器矩阵包含bs_chrome_mac、bs_firefox_mac、win_10_chrome、bs_ios_17tfjs-layers_webgl1_test面向 WebGL1 后端额外覆盖bs_safari_mac。测试用例由 tfjs-layers/src/BUILD.bazel 中的enumerate_tests规则自动收集它会生成聚合所有*_test.ts入口的tests.ts文件因此新增测试文件后无需手动注册。仓库还提供了更细粒度的测试入口便于针对性调试yarn test-webgl2/yarn test-webgl1分别只跑 WebGL2 或 WebGL1 后端yarn test-webgl2-debug/yarn test-webgl1-debug以bazel run方式启动便于附加调试器yarn test-dev/yarn test-webgl2-dev使用ibazel增量 Bazel监听文件变化改动源码后自动重跑测试yarn run-browserstack在 BrowserStack 云端浏览器矩阵上执行bs_chrome_mac的 WebGL2 测试用于跨平台回归验证。CI 中的自动校验当你发送 PR 后上述命令build、format、lint、test也会在云构建服务上自动执行并以 GitHub Checks 的形式呈现在 PR 页面。如果云构建失败点击对应检查旁的Details链接即可打开构建日志定位失败原因。三、修改 tfjs-layers 并在 tfjs 主包中验证三步本地联调实际开发中一个高频场景是修改tfjs-layers的源码然后构建一个包含这些改动的tensorflow/tfjs聚合包用于验证。文档给出了一套三步初始流程。以下说明以tfjs-layers为例若需开发tfjs-core只需把命令中的tfjs-layers替换为tfjs-core即可其余步骤完全一致。第一步在 tfjs-layers 中本地发布包# 在 tfjs-layers 目录下 yarn publish-local该命令会先构建项目然后把新包发布到本地 registry。在 tfjs/package.json 中可以找到对应实现publish-local定义为yarn build-npm yalc push即先走一遍完整的 npm 构建build-npm指向 tfjs/scripts/build-npm.sh再通过yalc将包推送到本地全局缓存。仓库配套脚本 e2e/scripts/local-registry.sh 展示了另一套可选的本地 registry 方案它启动 Verdaccio默认verdaccio5.9.0监听http://127.0.0.1:4873登录后把 npm/yarn registry 切换到该地址并在测试结束后恢复原始 registry 配置——适合需要严格模拟真实 npm 发布/安装链路的场景。第二步让 tfjs 依赖本地发布的 tfjs-layers# 在 tfjs 目录下 yarn link-local tensorflow/tfjs-layers该命令使tfjs聚合包依赖第一步中本地发布的tfjs-layers版本。从 tfjs/package.json 的脚本定义看link-local当前实现为yalc link其语义正是把yalc本地发布的包软链到当前项目的node_modules中从而让主包在解析tensorflow/tfjs-layers时命中本地构建产物而不是 npm 上的远端版本。第三步在 tfjs 中构建新的 npm 包# 在 tfjs 目录下 yarn build-npm重新构建tfjs聚合包。此时构建出的 npm 包内已包含你在tfjs-layers中所做的改动可以直接用于后续验证或本地安装测试。迭代循环每次改动的重复操作此后每当你在tfjs-layers中再次做出修改只需重复执行两个命令即可让tfjs包持续保持最新# 在 tfjs-layers 目录下重新构建并发布本地包 yarn publish-local # 在 tfjs 目录下重新构建聚合 npm 包 yarn build-npm底层机制解读link-package 与依赖解析理解这套联调流程有必要了解当前仓库的依赖布局。打开 tfjs/package.json 可以看到tfjs对tensorflow/tfjs-core、tensorflow/tfjs-layers、tensorflow/tfjs-converter等核心包的依赖均以link:../link-package/node_modules/tensorflow/...形式声明即统一指向 link-package一个“仅供内部解析依赖、永不发布”的私有辅助包下的node_modules。link-package/build_deps.ts 负责这一层级的组装它会递归解析目标包如tfjs对tensorflow/*的传递依赖找出所有属于 Bazel 包的依赖集合执行bazel build构建这些包然后把构建产物位于dist/bin/pkg/pkg_pkg递归复制到link-package/node_modules/tensorflow/下。这样tfjs通过 npm/yarn 的link:协议即可解析到本地构建的各个子包——本地联调时只要某个子包如tfjs-layers经由publish-local更新了构建产物再在tfjs侧重新build-npm最终产物便会携带全部最新改动。四、运行集成测试tfjs2keras什么是 tfjs2kerastfjs2keras是一个集成测试用于验证tfjs-layers 导出的模型能否被 Python 环境下的 Keras 正确加载。这保证了 JavaScript 端构建/训练的模型在跨语言导出后依然可以被 Keras 生态识别与使用。运行方式如下yarn tfjs2keras仓库中的配套验证脚本虽然tfjs2keras这一集成测试属于e2e层面的跨语言测试但仓库中已提供与其目标一致的模型生成与转换工具链可帮助你理解测试的数据来源。例如 e2e/integration_tests/convert_predict.py 使用tf_keras构建多种模型包括Conv2D BatchNormalization ReLU的卷积栈、含PReLU的网络、Embedding GRU的序列模型以及MobileNetV2预训练模型并通过tfjs.converters.save_keras_model将模型保存为 JSON 格式对应的 e2e/integration_tests/convert_predict.ts 则在 TypeScript 侧加载这些模型并“用 Keras 的结果验证输出”。这与tfjs2keras的核心目标一致保证 tfjs-layers 的序列化/反序列化与 Python Keras 双向兼容。如果你需要为tfjs-layers自身的文档代码片段做单元级验证仓库还提供了test_snippets测试定义于 tfjs-layers/BUILD.bazel入口为 tfjs-layers/scripts/test_snippets.ts它会抽取并执行文档中的示例片段防止文档示例因 API 变更而失效。五、小结围绕 tfjs-layers/DEVELOPMENT.md 给出的开发约定本文梳理了一条完整的迭代路径准备yarn安装依赖进入可开发状态质量关卡yarn buildBazel 编译多形态 bundle、yarn formatclang-format 统一格式、yarn lint静态检查防循环依赖、yarn testChrome/Firefox 浏览器矩阵单元测试四步通过后再提交 PRCI 会以相同命令自动复检跨包联调在tfjs-layers执行yarn publish-local发布本地包在tfjs执行yarn link-local与yarn build-npm重打包之后每次改动只需重复publish-localbuild-npm两步循环跨语言验证通过yarn tfjs2keras确认 tfjs-layers 导出的模型可被 Python Keras 正确加载。这套流程不仅适用于tfjs-layers把包名替换为tfjs-core即可复用到核心包的开发中是 TensorFlow.js 多包仓库日常迭代的标准工作方式。【免费下载链接】tfjsA WebGL accelerated JavaScript library for training and deploying ML models.项目地址: https://gitcode.com/gh_mirrors/tf/tfjs创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考