https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9m0dPwC7IDiHJv0Vy1Zb78pwOS0Qm71QazygBQYqvbLf5aIFw0fuxFU1ZS15NJZgcKk0O7fouu-cUx4Vj4DGKxv0CcsL8Sglk_T9hD9LnKNuKDKl0Q3nA1m57exTHtq9b_icY7F5rliw/s1600/TF_Updates_v2.png
由 Google Research 软件工程师 Yannick Assogba 发布
随着
TensorFlow.js 在生产环境中越来越广泛地使用,我们的团队认识到社区需要能够为使用 TensorFlow.js 的浏览器生成小型、针对生产环境优化的包。我们一直在为这项工作奠定基础,并想与您分享我们的未来计划。
我们对 TensorFlow.js 即将发布的版本的一个主要目标是使其更加模块化,更容易进行代码分割,同时保持初学者的易用性。为此,我们计划发布两个主要版本来推动这一方向。我们将在两个主要版本中发布这项工作,以便在进行重大更改时保持语义化版本控制。
TensorFlow.js 2.0
在 TensorFlow.js 2.x 中,唯一的重大更改是将 CPU 和 WebGL 后端从 tfjs-core 移动到它们自己的 NPM 包中(分别为 tfjs-backend-cpu 和 tfjs-backend-webgl)。虽然目前这些默认情况下包含在内,但我们希望使 tfjs-core 尽可能模块化和精简。
这对用户意味着什么?
如果您使用的是联合包(即 @tensorflow/tfjs),那么您的代码应该没有影响。如果您直接使用 @tensorflow/tfjs-core,则需要为要使用的每个后端导入一个包。
我将获得什么好处?
如果您直接使用 @tensorflow/tfjs-core,您现在可以选择省略您不想在应用程序中使用的任何后端。例如,如果您只需要 WebGL 后端,您可以通过删除 CPU 后端来节省一定的开销。您还可以根据您的构建工具/应用程序支持情况,懒加载 CPU 后端作为备用。
TensorFlow.js 3.0
在这个版本中,我们将完全模块化我们所有的操作和内核(操作背后的数学运算的后端特定实现)。这将允许像 WebPack、Rollup 和 Closure Compiler 这样的捆绑器中的代码分割器更好地进行死代码消除,并生成更小的包。
我们将转向动态梯度和内核注册方案,并提供工具来帮助创建仅包含特定模型或 TensorFlow.js 程序的内核的自定义包。
我们还将开始默认情况下发布 ES2017 包。需要部署到仅支持早期版本的浏览器的用户可以将其编译到他们想要的目标版本。
这对用户意味着什么?
如果您使用的是联合包(即 @tensorflow/tfjs),我们预计更改将是微不足道的。为了支持易于使用,我们希望联合包的默认使用方式与目前保持一致。
对于想要更小的面向生产环境的包的用户,您需要更改代码以利用 ES2015 模块,只导入您希望最终包含在包中的操作(以及其他功能)。
此外,我们将提供命令行工具来启用仅加载和注册您正在部署的模型/程序使用的内核的构建。
我将获得什么好处?
面向生产环境的用户将能够选择编写代码,从而生成更小、更优化的构建。其他用户仍然可以像往常一样使用联合包,但无法获得最小构建的优势。
动态梯度和内核注册将使研究人员和其他高级用户更容易实现自定义内核和梯度。
常见问题解答
什么时候准备就绪?
我们计划在本月发布 TensorFlow.js 2.0。由于更改幅度较大,我们还没有确定 TensorFlow 3.0 的发布时间。由于我们需要更改 tfjs-core 中几乎所有的文件,我们也借此机会清理了代码中的技术债务。
我应该升级到 TensorFlow.js 2.x 还是等到 3.x?
如果您正在积极开发 TensorFlow.js 项目,我们建议您升级到 TensorFlow 2.x。这应该是比较容易的升级,并且任何未来的错误修复都将在这个版本分支上进行。我们还没有确定 TensorFlow.js 3.x 的发布时间。
如何将我的应用程序迁移到 2.x 或 3.x?是否有教程可以参考?
在发布这些版本时,我们将发布完整的发布说明,其中包含有关如何升级的说明。此外,随着 3.x 的发布,我们将发布有关如何创建生产环境构建的指南。
为了获得更小的构建,我需要更改多少代码?
我们将在接近 3.x 发布时提供更多详细信息,但在较高层次上,我们希望利用 ES2015 模块系统让您控制哪些代码进入您的包。
一般来说,您需要执行类似
import {max, div, mul, depthToSpace} from @tensorflow/tjfs
(而不是
import * as tf from @tensorflow/tfjs
)的操作,以便我们的工具可以确定从您为部署选择的后台注册哪些内核。我们甚至正在努力使 Tensor 类上的链接 API 在针对生产环境构建时成为可选的。
这会让 TensorFlow.js 更难使用吗?
我们不希望提高使用 TensorFlow.js 的门槛,因此我们正在设计它,以便只有面向生产环境的用户才需要做额外的工作来获得优化的构建。对于使用联合包 (@tensorflow/tfjs) 从托管脚本或 NPM 以及我们预训练模型集合中开发应用程序的最终用户,预计这些更新不会带来任何变化。