tensorflow是谷歌推出的一款神经网络算法库,利用这个算法库可以实现深度学习。目前这个算法库已经绑定了多种开发语言,而tensorflow.js就是Javascript语言的具体实现,在tensorflow的官网上有专门的Javascript板块,地址:https://www.tensorflow.org/js。tensorflow.js的最初版本只能运行在浏览器中,借助webgl调用GPU资源实现快速运算,但是毕竟浏览器功能有限,项目中也不太可能会把一个深度学习的流程丢到前端去处理。后来官方又推出了两个node版本,一个基于CPU,另一个基于GPU。本文主要介绍这两种库的后端安装方法。
前期准备
- 确定服务器的操作系统和硬件是否符合安装要求,参考https://www.npmjs.com/package/@tensorflow/tfjs-node
- 电脑或者服务器一定要安装python2.7的环境(注意不能安装python3)
- 使用npm全局安装node-gyp这个库
- windows需要安装vs studio(需要有vcxproj编译组件),mac需要安装xcode
- gpu版本需要确认显卡是否能够支持(注:mac所有系统都不支持gpu),参考https://developer.nvidia.com/cuda-gpus
- gpu版本需要安装好显卡驱动
- gpu版本需要安装CUDA工具包,推荐10.0,网址:https://developer.nvidia.com/cuda-toolkit-archive
- gpu版本需要下载CUDNN SDK,版本必须和上一步中的CUDA工具包版本匹配,下载解压后把对应文件夹的文件覆盖到上一步的安装目录中,网址https://developer.nvidia.com/cudnn,这里下载前需要注册会员
- gpu版本需要添加CUDA、CUPTI和cuDNN到系统环境变量,windows和linux方法不同,参考https://www.tensorflow.org/install/gpu
如果安装CPU版本,只需要准备1-4步,GPU版本则需要1-9的所有步骤。
到这里,你已经完成了tensorflow服务器版本的一半安装。
安装tensorflow到node项目
接下来我们需要把@tensorflow/tfjs-node(@tensorflow/tfjs-node-gpu)安装到项目依赖中,其实只需要下面这一步:
npminstall @tensorflow/tfjs-node
或者
npminstall @tensorflow/tfjs-node-gpu
运气好的话你会看到一个很长的下载过程,一大串代码编译过程,最后安装成功!但是!
绝大多数都会遇到莫名其妙的问题,譬如卡在了下载进度上,或者报一些node-gyp的错误。一般来说,@tensorflow/tfjs-node如果安装出现问题,多装两次就行。但是@tensorflow/tfjs-node-gpu出问题的话,就需要具体问题具体分析。
GPU版本安装问题解决思路
- 卡在下载进度条的问题:
这个主要是由于gpu版本需要下载一个将近250M的libtensorflow包,而国内访问谷歌服务器又不是特别稳定,下载过程经常掉线。解决方法是可以间断性地重复执行npm rebuild @tensorflow/tfjs-node-gpu -f。或者修改node_modules/@tensorflow/tfjs-node-gpu/scripts/install.js文件,将其中的storage.googleapis.com域名修改成本地的https服务,然后用下载工具单独把libtensorflow包下载到https目录,通过本地下载实现稳定安装。另外可能有同学考虑用科学上网的方法获取稳定下载,本人亲测效果不咋地。
- node-gyp错误:
下载libtensorflow包后,tensorflow的钩子会继续执行代码编译,node-gyp会调用本地环境对下载源码进行编译。编译过程出错就会出现node-gyp的错误。
这种编译错误大多数都是本地编译环境缺失导致的,譬如windows中vs studio缺失相应的项目编译组件,这种问题一般通过下载缺失的组件就能完美解决!
CPU vs GPU
GPU版本的tensorflow一定比CPU版本的快吗?我一开始折腾安装了两个版本的tensorflow就是想看看GPU到底比CPU快了多少。实际我的项目主要运行了LSTM时序神经网络,测试跑下来的结果傻了眼,GPU速度只有CPU的2/3。为什么呢?Tensorflow的一位参与者给出了答案,地址在这里: https://github.com/tensorflow/tfjs/issues/468。大意就是:GPU版本绝大多数的运行时间都消耗在了数据传输过程,对于一些相对单一神经网络结构,速度反而会比CPU版本慢,但是像加入了池化层的这种复杂神经网络结构,GPU的速度会快得多。所以根据网络结构选择对tensorflow的版本非常重要!
结语
上面这个故事告诉我们,付出的努力不一定和结果成正比,选择大于努力。
(全文完)