文 / Yannick Assogba, 软件工程师, Google Research
随着 TensorFlow.js 越来越多地在生产环境中使用,我们团队意识到需要为在浏览器端使用 TensorFlow.js 的开发者,开发小型、对生产环境优化的小型打包工具。我们一直在为此作出努力,现在此与您分享我们的更新计划。
TensorFlow.js (阅读原文)
http://tensorflow.google.cn/js
对于即将发布的 TensorFlow.js,我们的主要目标是在保持对初学者足够友好的同时,使其更具模块化以方便后续进行的 tree shaking。为朝着这个方向发展,我们计划发布两个主要版本:TensorFlow.js 2.0 和 TensorFlow.js 3.0。我们将在两个主要版本中发布此工作,以便在进行重大更改时保持语义化版本规范。
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 等打包工具中的 Tree Shaker 能够更好地剥离无关代码并生成更小的安装包。
我们将转为动态梯度的内核注册模式,并提供工具来协助创建仅包含给定模型或 TensorFlow.js 程序内核的自定义包。
我们还将开始默认支持 ES2017。若您需要部署到仅支持早期版本的浏览器,可以转换为所需的目标版本。
作为用户,这对我意味着什么?
如果您使用联合包(即 @tensorflow/tfjs),我们预计更改将很小。为了保证 tfjs 入门的易用性,我们希望联合包的默认用法与现在保持一致。
面向生产环境且需要体积较小安装包的用户,您需要更改代码以利用 ES2015 模块,选择性导入所需的算子(和其他功能)到最终生成的安装包中。
此外,我们将提供命令行工具,启用后可进行如下构建:仅对您部署的模型/程序所使用的内核进行加载和注册。
这对我有什么好处?
生产环境中的用户将可以编写出更小巧,更优化的版本。其他用户仍然可以照常使用联合包,但与小巧的构建版本无缘。
动态梯度和内核注册将使研究人员和其他高级用户更容易实现自定义内核和梯度。
常见问题
什么时候发布这两个版本?
我们计划本月发布 TensorFlow.js 2.0。由于 Tensorflow 3.0 变更的幅度较大,我们还没有确定发布日期。由于这项升级几乎涉及到 tfjs-core 中的每个文件,因此我们也会借此机尽可能地偿还技术债。
我应该升级到 TensorFlow.js 2.x 还是等待 3.x ?
如果您正在积极开发 TensorFlow.js 项目,我们建议您升级到 TensorFlow2.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 结合我们的预训练模型集合的开发者们,我们期望这些更新不会带来任何变化。
了解更多请点击 “阅读原文” 访问官网。