从前端智能到知识引擎的一些思考 | shadow实验室

在2020初的时候,看到微软的Blazor,使用 C# 和 HTML 在任何浏览器中不需要插件即可运行 WebAssembly 程序集。WebAssembly把C,C++和Rust带到了前端。
我就开始思考:机器学习+后端+前端,如何把这三者全部融合到前端?融合后是不是就是智能化的前端?
可以说,WebAssembly开启了前端JavaScript之外的更多可能。
再看另外一件正在发生的事情,tensorflowJS现在已经支持了众多的模型,我们可以轻松在前端实现图像分类、人脸识别、姿态评估等AI能力。
前端开启了规则之外,迈向机器学习、深度学习的更多可能。这个时候,我就在思考在前端集成自然语言和图像的embedding会有哪些可能性?
embedding,万物都是向量,都可以用embedding转换为数学问题。
关于自然语言,之前想过通过前端引入一个语言模型,直接在端上进行nlp相关的计算和应用。fasttext用来训练模型,然后导出json供前端离线使用,似乎是不错的方案。或者是使用bert、word2vec来提供计算服务,但是模型本身的容量至少在200M以上,显然,前端加载模型的压力会非常大。
而图像,最小的预训练模型Mobilenet则显得轻巧得多,大概只有十几M。曾经看到过一个应用在图像方面的AI能力:一个截图搜 Icon 的功能,用户直接对设计稿或任意图片中的图标截图,点击或拖拽或粘贴上传,就可以搜索到匹配度最高的几个图标以及对应的匹配度。
利用图像识别,提高应用便捷性。除此之外,tensorflowjs有很多图像方面的案例(查看),这里就不一一展开啦。
图像方面,经过最近teachAI的实验,已经验证其前端智能的可行性。而文本方面,前阵子也实验过知识引擎的chrome插件版本,使用的是机器学习的方式,但是也会存在随着数据增长,占用内存过大的问题;更不用说要使用深度学习的模型过来提高预测准确率了。
所以,问题在于自然语言方面,模型过大的问题。之前考虑过pwa+tensorflowjs的方案,模型加载后缓存在浏览器,但是明显无法解决首次加载模型太大的问题。所以,有了electron-tensorflowJs方向的思考。
桌面版electron,先实验通过node调用C++,来提供个更快的处理效率,经过实验尝试,tfjs-node的速度确实快很多,官方说是需要python2.7环境,实测python3也是没问题的。安装过程中注意tfjs-node跟tfjs的版本要一致。
另外,直接使用tf.node.loadSavedModel加载训练好的模型,支持tf的 SavedModel格式。这样就可以非常方便地使用nodejs来调用各种深度学习算法。
于是,我尝试了用tfjs-node封装了bert的模型,测试下来成功运行。于是想进一步集成到electron里,但是遇到了electron项目经常会遇到NODE_MODULE_VERSION的错误,tokenizers使用的是76版本,而electron是72版本。官方推荐electron-rebuild的解决方案,经过实验发现还是无法兼容(有点头疼)。
另外,还有些问题需要解决,比如部分op不支持(想使用更多的模型),需要开发tfjs的插件完成。
细心阅读的读者应该有所发现啦,我已经逐步在思考#知识引擎#应该高更适合是个桌面版,包括文本和图像的理解跟自动整理。目前来看,图像的问题不大,而文本还有待解决一些小问题。
