ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

TensorFlow.js 仓库开发全指南:环境搭建、Bazel 测试、NPM 打包与提交规范实战

TensorFlow.js 仓库开发全指南:环境搭建、Bazel 测试、NPM 打包与提交规范实战 TensorFlow.js 仓库开发全指南环境搭建、Bazel 测试、NPM 打包与提交规范实战【免费下载链接】tfjsA WebGL accelerated JavaScript library for training and deploying ML models.项目地址: https://gitcode.com/gh_mirrors/tf/tfjs本文以 TensorFlow.jstfjs仓库根目录的 DEVELOPMENT.md 为骨架系统讲解该 Monorepo 的包结构、开发环境准备、提交 PR 前的测试流程yarn lint/yarn test/ Karma 浏览器测试、NPM 打包发布、Windows WSL2 开发环境以及面向仓库维护者的提交标签与自动发布说明规范。读完本文你将掌握在这个多包仓库中从零搭建环境、运行与筛选测试、本地打包验证以及按规范贡献代码的完整实操路径。仓库概览一个多包Monorepo的 NPM 工程TensorFlow.js 是一个以 Yarn 管理依赖的 Monorepo单仓库多包仓库根目录下每个子目录对应一个独立的 NPM 包。按功能可以划分为两大类API 层与后端/平台层。API 类包TensorFlow.js Core灵活的低层 API用于神经网络与数值计算是整个生态的基础入口见 tfjs-core/src/index.ts。TensorFlow.js Layers高层 API实现与 Keras 类似的功能模型层、训练循环等。TensorFlow.js Data用于加载与预处理数据的简单 API职责类似于tf.data。TensorFlow.js Converter将 TensorFlow SavedModel 导入为 TensorFlow.js 的工具集含 Python 端转换脚本见 tfjs-converter/python/tensorflowjs。TensorFlow.js Vis面向 TensorFlow.js 模型的浏览器内可视化。TensorFlow.js AutoML加载并运行 AutoML Edge 产出模型的一组 API。后端/平台类包TensorFlow.js CPU Backend纯 JavaScript 实现可运行于 Node.js 与浏览器。TensorFlow.js WebGL Backend浏览器的 WebGL 后端。TensorFlow.js WASM Backend浏览器的 WebAssembly 后端C 内核源码位于 tfjs-backend-wasm/src/cc。TensorFlow.js WebGPU浏览器的 WebGPU 后端。TensorFlow.js Node通过 TensorFlow C adapter 实现的 Node.js 平台。TensorFlow.js React Native通过 expo-gl adapter 实现的 React Native 平台。除上述包外仓库还包含 tfjs-tfdf决策森林、tfjs-tfliteTFLite 运行时、tfjs-inference、tfjs-backend-nodegl 等实验性/外围包。所有 Bazel 包目录统一记录在 scripts/bazel_packages.ts包含tfjs-core、tfjs-backend-cpu、tfjs-tfdf、tfjs-tflite、tfjs-converter、tfjs-backend-webgl、tfjs-backend-webgpu、tfjs-layers、tfjs-data、tfjs-backend-wasm共 10 个。根目录工程配置根目录 package.json 聚合了全仓库的脚本与工具链依赖从源码可以看到几个关键信息构建/测试体系基于Bazeltest即bazel test //:tests并提供test-cpubazel test //:tests_cpu与test-gpubazel test //:tests_gpu分类运行开发模式下用bazel/ibazel实现增量测试。Lint 使用 TSLintlint为tslint -p tsconfig_tslint.json并配套bazel/buildifier对.bzl/BUILD/WORKSPACE文件做格式化检查bazel:format-check。发布相关脚本release、release-tfjs、publish-npm、publish-pypi、release-notes、tag-tfjs-release等具体实现位于 scripts 目录。根目录 BUILD.bazel 定义了测试套件聚合规则tests_cpu包含tfjs-backend-cpu、tfjs-backend-wasm、tfjs-converter、tfjs-core、tfjs-data、tfjs-tfdf、tfjs-tflitetests_gpu包含tfjs-backend-webgl、tfjs-backend-webgpu、tfjs-layerstests由二者合并而成。同时它还声明了grep与headless两个 Bazel 构建标记build setting供全仓库的 Karma 测试规则读取。开发环境准备包管理器Yarn仓库统一使用 Yarn。新增或移除依赖时必须通过 Yarn 操作以保证根目录及各包的yarn.lock始终与package.json保持同步。所有包都声明了engines.yarn 1.3.2见 tfjs-core/package.json因此建议使用 Yarn 1.xClassic运行本仓库。编辑器与代码格式化官方推荐使用 Visual Studio Code 进行开发并安装两个插件配合自动格式化TSLint 的 VSCode 扩展让编辑器实时提示 lint 错误。Clang-Format 扩展配合 npm 的clang-format1.2.2 或更高版本根 package.json 中锁定为~1.2.4用于 C/TS 代码的自动格式化。仓库的 lint 规则集中在 tslint.json可以看到若干强约束例如禁止anyno-any、强制单引号quotemark、强制分号semicolon、禁止fit/fdescribe/xit等调试性 Jasmine APIban、最大行宽 80max-line-lengthimport/export与 URL 除外、禁止默认导出no-default-export等。提交前保持代码通过这些规则是 CI 的硬性要求。测试提交 PR 前的必经关卡DEVELOPMENT.md 明确要求提交 PR 之前必须确保代码通过全部测试且无 lint 错误。标准流程如下在仓库根目录执行# 在仓库根目录执行检查整个仓库的 lint $ yarn lint # 进入要测试的包目录 $ cd tfjs-core # 运行该包的测试 $ yarn test # 在包目录下也需要再跑一次 lint可能与该包自身配置相关 $ yarn lintyarn test会自动安装 yarn 依赖、构建被测包所依赖的其他 TensorFlow.js 包然后运行该包的测试。以 tfjs-core/package.json 为例其test脚本为bazel test :tests --test_outputall会依次触发 Node 测试tfjs-core_node_test、浏览器测试tfjs-core_test、异步后端测试tfjs-core_async_backends_test与代码片段测试test_snippets_test详见 tfjs-core/BUILD.bazel 中的test_suite。开发期增量测试yarn test-dev在开发过程中每次跑yarn test都会重新构建被依赖的包比较耗时。此时应改用$ yarn test-dev它对应ibazel test :tests --test_outputall由bazel/ibazel提供文件监听与增量构建能力只有发生改动的部分才会重建能显著缩短开发迭代周期。只跑部分测试--//:grep标记许多 TensorFlow.js 包使用 Karma 在浏览器中运行测试这些测试可以通过命令行参数过滤。例如只运行与multinomial相关的用例$ yarn test --//:grepmultinomial输出示例来自文档 ... Chrome 62.0.3202 (Mac OS X 10.12.6): Executed 28 of 1891 (skipped 1863) SUCCESS (6.914 secs / 0.634 secs)从源码看grep并不是某个包自定义的参数而是在 BUILD.bazel 中声明的全局 Bazel 字符串标记grep_flag(name grep)其实现位于 tools/tfjs_web_test.bzl_make_karma_config_impl读取该标记值若非空则向 Karma 追加--grepvalue参数最终注入 tools/karma_template.conf.js 的client.args由 Jasmine 据此过滤用例。因此任何使用tfjs_web_test规则的包都可以复用这一过滤能力。调试模式保持 Karma 服务器常驻默认情况下测试只运行一次随即退出。如果需要用自己熟悉的浏览器连上 Karma 服务器做交互式调试可运行# 适用于仅含浏览器测试的包 $ yarn test-debug # 适用于同时含浏览器与 Node 测试的包 $ yarn test-browser-debug以 tfjs-core 为例test-browser-debug对应bazel run :tfjs-core_test --test_outputstreamedbazel run会启动并保持 Karma 服务器然后在你的浏览器中打开地址连接测试。Node 侧对应test-node-debugbazel run :tfjs-core_node_test --configdebug。无头/有头模式--//:headless标记在大多数平台上Karma 测试默认以无头 Chromeheadless Chrome运行。如需弹出可见的浏览器窗口可以覆盖该默认值# 使用可见的浏览器窗口运行测试。 # 注意这不适合 test-dev / ibazel 等 watch 模式。 $ yarn test --//:headlessfalse对应源码层面根 BUILD.bazel 将headless声明为布尔构建标记且默认值为trueheadless_flag(name headless, build_setting_default True)。在 tools/karma_template.conf.js 中TEMPLATE_headless决定使用ChromeHeadless还是Chromelauncher// Select Chrome or ChromeHeadless based on the value of the --//:headless flag. const CHROME TEMPLATE_headless ? ChromeHeadless : Chrome;而 tools/tfjs_web_test.bzl 中headlessfalse时还会把DISPLAY环境变量透传给测试进程configuration_env_vars [] if headless else [DISPLAY]保证有头 Chrome 能找到 X display。多浏览器与 BrowserStack 测试矩阵源码级补充tools/tfjs_web_test.bzl 的tfjs_web_test规则揭示了浏览器测试的全貌本地默认浏览器为chrome_no_sandbox见 tools/karma_template.conf.js本地测试未指定 browser 时使用。规则默认的远程浏览器矩阵包含bs_chrome_mac、bs_firefox_mac、bs_safari_mac、bs_ios_12、bs_android_10、win_10_chrome对应 tools/karma_template.conf.js 中基于 BrowserStack 的CUSTOM_LAUNCHERS真实移动设备如 iPhone XS、Pixel 4 XL 等。presubmit_browsers默认只取矩阵第一个浏览器即每次 PR 预提交只跑一个浏览器完整矩阵在 nightly 构建中运行标签civsnightly。使用 BrowserStack 需要设置环境变量BROWSERSTACK_USERNAME与BROWSERSTACK_KEY否则 Karma 配置会直接退出process.exit(1)。Safari/iOS 用例还会把hostname设为bs-local.com以减少偶发的连接失败并支持通过--runs_per_test100等方式验证用例稳定性。此外仓库还内置了若干特殊 Chrome launcherchrome_with_swift_shader禁用 GPU 的软件渲染、chrome_webgpu/chrome_webgpu_linuxWebGPU 测试、chrome_debugging--remote-debugging-port9333等可用于覆盖 GPU/WebGPU 相关内核的测试场景。打包生成 NPM tarball在任意包目录下都可以构建 NPM tarball。以 tfjs-core 为例$ yarn build-npm # 产物输出到 ../dist/bin/tfjs-core/tfjs-core_pkg/ # 也可以打成 tar 包 $ yarn bazel run :tfjs-core_pkg.pack从 tfjs-core/BUILD.bazel 可以看到tfjs-core_pkg这个pkg_npm目标它由copy_bundles多种 bundle 形态tf-core、tf-core.min、tf-core.es2017.min、tf-core.fesm、tf-core.node等、copy_src_to_dist、copy_miniprogram微信小程序版 dist与copy_test_snippets组合而成最终产出完整的可发布包目录。本地安装验证拿到 tarball 后可以在目标工程中直接安装以做本地验证$ yarn add ./tensorflow-tf-core-VERSION.tgzWindows 注意以上脚本在 Windows 上需要使用 bash可通过 Git 或 WSL2 获得官方推荐使用 WSL2 以获得最佳体验。构建依赖包link-package 与 build-deps-for对于非 Bazel 包如tfjs-react-native、tfjs-vis等yarn test会先构建它们依赖的 TensorFlow.js 包。这一机制由 link-package/build_deps.ts 实现其对应的脚本是yarn build-deps-for package或yarn build-deps-for --all见根 package.json 的test-non-bazel。该脚本会解析目标包package.json中所有tensorflow/*依赖递归求传递闭包得到Bazel 图与 npm 图之间的最小构建集合findTransitiveBazelDeps对这些 Bazel 目标执行yarn bazel build //pkg:pkg_pkg将dist/bin/pkg/pkg_pkg的构建产物复制到link-package/node_modules/tensorflow/pkg下供被测包通过 Node 的模块解析机制引用。这也解释了文档中运行yarn test会构建被测包所依赖的其他 TensorFlow.js 包这一行为背后的实现。在 Windows 上开发WSL2 环境搭建Windows 平台通过运行 Debian 的 Windows Subsystem for LinuxWSL获得支持完整步骤如下安装 WSL2如尚未安装WSL1 未经测试、可能可用但官方推荐 WSL2。在 WSL2 中安装 Debian可从 Microsoft Store 获取。打开 Debian安装 node 与 yarnsudo apt update sudo apt install nodejs npm i -g yarn如需重置 Debian 的 root 密码可在 Windows 命令提示符下运行wsl -u root获得 root shell。确保 Windows 侧安装了 Chrome并找到chrome.exe的路径通常为C:\Program Files\Google\Chrome\Application\chrome.exe。配置CHROME_BIN环境变量、克隆仓库并创建自定义.bazelrc.user若chrome.exe不在默认路径需修改下面命令中的路径# Add yarn bin to the path echo export PATH$PATH:~/.yarn/bin/ ~/.bashrc # Set CHROME_BIN. Change this if your CHROME_BIN has a different path. echo export CHROME_BIN/mnt/c/Program\ Files/Google/Chrome/Application/chrome.exe ~/.bashrc source ~/.bashrc # Clone tfjs. git clone https://github.com/tensorflow/tfjs.git cd tfjs # Create the .bazelrc.user file for WSL. echo # Pass necessary WSL variables for running in Windows Subsystem for Linux. # WSLENV and WSL_DISTRO_NAME are build-in variables that are needed for running # the wslpath command, which Karma uses to resolve file paths. # DISPLAY:0 is passed to the Chrome process to make it launch in a window # since running Chrome headlessly from WSL does not seem to work. If you get # this working, please send a PR updating these docs (or open an issue :). run --test_envCHROME_BIN --test_envWSLENV --test_envWSL_DISTRO_NAME --define DISPLAY:0 test --test_envCHROME_BIN --test_envWSLENV --test_envWSL_DISTRO_NAME --define DISPLAY:0 .bazelrc.user printf \n\nDone! Try running a browser test to verify the installation worked, e.g. cd tfjs-core yarn yarn test-browser\n这里的关键点在于WSLENV与WSL_DISTRO_NAME是运行wslpath命令所需的系统内置变量而 Karma 要用wslpath解析文件路径DISPLAY:0则让 Chrome 以窗口方式启动WSL 中运行无头 Chrome 似乎不可行文档欢迎通过 PR 或 issue 反馈相关进展。从 VSCode 访问仓库遵循微软官方的 WSL VSCode 教程在 WSL 中运行 VSCode获得完整的远程开发体验。完成上述配置后可以进入tfjs-core运行yarn yarn test-browser验证浏览器测试链路是否打通。面向仓库维护者提交规范与自动发布说明Commit Tag 体系向 master 合并提交时需遵循若干约定以保证能自动生成发布说明、并保持提交历史统一Squash 合并时默认的 commit body 是开发分支上所有 commit 的集合通常价值不大应删除或用 PR 描述替换。发布说明由 commit 自动生成为此引入一组标签用于将提交归类到发布说明的不同章节标签含义FEATURE新增功能 / APIBREAKINGAPI 破坏性变更BUGBug 修复PERF性能改进DEV开发流程变更DOC文档变更SECURITY安全相关变更这些标签对应 GitHub 标签PR 描述中会自动前置对应的标签因此提交 PR 时请添加适当的标签。一个典型提交如下Subject: Add tf.toPixels. (#900) Body: FEATURE tf.toPixels is the inverse of tf.fromPixels, writing a tensor to a canvas.该提交会出现在发布说明的 Features 章节Add tf.toPixels. (#900). Thanks, externalcontributor.同一个提交也可以使用多个标签以便同时出现在两个章节标签所在行还能附加说明文字例如Subject: Improvements to matMul. (#900) Body: FEATURE Add transpose bits to matmul. PERFORMANCE Improve matMul CPU speed by 100%.会分别产出 Features 与 Performance 两条记录。标签如何变成发布说明源码级补充scripts/release_notes/release_notes.ts 就是消费这些标签的自动化工具根目录yarn release-notes通过--project参数union、vis、rn、tfdf、tflite、webgpu、automl选择为目标项目生成草稿依据git tag中tfjs-v版本形式的标签确定起始/结束版本遍历各包在版本区间内的 commitscripts/release_notes/util.ts按标签分桶归类需要 GitHub token环境变量GITHUB_TOKEN或交互输入以解析提交作者最终将草稿写入release-notes.md。配套的还有 scripts/tag-tfjs-release.tsyarn tag-tfjs-release在 lockfile 更新后为发布分支打tfjs-v版本标签并推送、scripts/release.tsyarn release与 scripts/publish-npm.tsyarn publish-npm共同构成从合并到发布说明、再到 npm 发布的完整发布链路。从源码构建 tfjs-core最后如果需要从源码构建TensorFlow.js Core API流程与所有 npm 包一致克隆仓库后进入对应目录运行yarn安装依赖即可开始开发与构建。本仓库中即对应tfjs-core目录入口 tfjs-core/src/index.ts统一入口见 tfjs-core/src/index.ts 及其带 polyfill 版本 tfjs-core/src/index_with_polyfills.ts。安装完成后yarn testBazel 全量测试、yarn test-dev增量开发测试、yarn test-browser/yarn test-node按平台分测与yarn build-npm打 tarball即可按上文介绍的方式使用。小结围绕 DEVELOPMENT.md 这条主线本文覆盖了 TensorFlow.js Monorepo 开发的全生命周期先理解包结构与根目录 package.json/BUILD.bazel 的工程布局再按 Yarn VSCode TSLint/clang-format 的标准配置搭建环境提交前用yarn lintyarn test守住质量底线开发期用yarn test-dev提效用--//:grep精确过滤用例、--//:headlessfalse切换有头调试、test-browser-debug保持 Karma 常驻其底层实现均可追溯到 tools/tfjs_web_test.bzl 与 tools/karma_template.conf.js发布侧则从build-npm打包、link-package依赖联动到 WSL2 上的 Windows 开发再到 FEATURE/BREAKING/BUG 等提交标签驱动的自动发布说明形成一条可复制的完整贡献路径。无论是首次提交 PR 的贡献者还是负责发布的仓库维护者都可以按本文步骤直接上手。【免费下载链接】tfjsA WebGL accelerated JavaScript library for training and deploying ML models.项目地址: https://gitcode.com/gh_mirrors/tf/tfjs创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表