记录下tensorflow的使用

在这里大致记录下我在ubuntu 14.04系统下对tensorflow使用,先挖个坑在这儿。

1. 说明和参考资料

1.1 阿里田丰谈人工智能

在等待mnist demo完成过程中,看了下阿里云的云大学,田丰谈人工智能。核心观点:

  • 生物进化与人工智能的进步都源于试错;
  • 智能设备的中控应该是语音,而不是智能路由器、客厅电脑这些,因为人都懒;
  • 莱布尼茨认为未来应该是:计算代替思考,比如会计之间的讨论就可以用数据说话;
  • 个体智能在终端上/全局智能在云端:终端计算可以有效避免长延时的网络,降低功耗;
  • 数据为书/机器为师:机器学习的书是数据,大量数据的分析;人们可能会以机器为老师;
  • AI飞轮(功能-数据-模型-用户),用户的反馈和体验是推动AI飞轮持续演进的关键;
  • 《技术的本质》:复杂迭代的进步、数据为王还是算法为王?短期内是数据重要,长远算法是关键,计算也非常重要;
  • MIT和阿里出了一本书:《科技之巅》:语音入口/万物挑战(借助网络实现机器人教机器人)/特斯拉的autopilot2.0融入了GPU/数据安全/灵巧性机器人/杭州城市大脑。

1.2 参考资料

1.3 参考文献

 

2. 安装与初步测试

2.1 针对x86系统的安装

(该方案同样适用于在阿里云ECS服务器上的安装,但需要先更新下阿里云的pip源)如下:

sudo apt-get install python-dev python-pip
export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.10.0-cp27-none-linux_x86_64.whl
sudo pip install --upgrade $TF_BINARY_URL

说明下:之所以不直接pip install tensorflow,是因为有时候pip的源里面还没有tensorflow,会报找不到tensorflow的错误。下面用官方的例子简单测试下:

qq%e6%88%aa%e5%9b%be20170211225214

嗯,至少安装是成功的,后半部分的计算,比较类似matlab了。

2.2 针对有nvidia gpu的简单系统安装

等待我们i7+GTX1080 SLI的服务器到货,再来讨论这部分,特别是SLI的GPU貌似不太容易安装。

2.3 针对x86系统从源码开始编译安装

很简单,也就几步:1)git得到源码;2)安装google自己用的build工具bazel;3)用bazel编译安装tensorflow

git clone https://github.com/tensorflow/tensorflow
sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java8-installer
echo "deb [arch=amd64] http://storage.googleapis.com/bazel-apt stable jdk1.8" | sudo tee /etc/apt/sources.list.d/bazel.list
curl https://bazel.build/bazel-release.pub.gpg | sudo apt-key add -
sudo apt-get update && sudo apt-get install bazel
sudo apt-get upgrade bazel
sudo apt-get remove bazel
mkdir bazel/
cd bazel/
wget https://github.com/bazelbuild/bazel/releases/download/0.4.4/bazel-0.4.4-installer-linux-x86_64.sh
chmod +x bazel-0.4.4-installer-linux-x86_64.sh
./bazel-0.4.4-installer-linux-x86_64.sh --user
echo "export PATH=$PATH:~/bin" > ~/.bashrc
source ~/.bashrc
sudo apt-get install python-numpy python-dev python-wheel
cd ../
cd tensorflow/
./configure
bazel build -c opt //tensorflow/tools/pip_package:build_pip_package
bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg

我在虚拟机里面安装,配置为:3核i7 6700K@4GHz,4GB内存,SSD,11:33开始configure,11:37完成配置(有error),然后开始编译,12:00左右完成,大约20分钟。12:44开始生成安装包,瞬间生成。最后安装生成的包,大约2分钟。

2.4 针对树莓派3B系统的简单安装

在树莓派3B的很多版本都可以正常安装,如下:

sudo apt-get install python-dev python-pip python-numpy
wget https://github.com/samjabrahams/tensorflow-on-raspberry-pi/releases/download/v0.11.0/tensorflow-0.11.0-cp27-none-linux_armv7l.whl
sudo pip install tensorflow-0.11.0-cp27-none-linux_armv7l.whl

2.5 针对ARM系统从源码开始编译安装

据说整个安装时间需要几个小时,暂时没有做。

2.6 在我们自己R16/R18上安装

3. 找几个例子跑一下

3.1 官方简单的手写数字识别

(跑简单例子时,上述安装都可以跑,还可以测试下性能的区别)官网接着说:可以试着跑跑几个demo model,所有的model都安装在:

/usr/local/lib/python2.7/dist-packages/tensorflow

第一个简单的demo是便是手写的数字,用到的测试集是经典的MNIST dataset。该demo在:

/usr/local/lib/python2.7/dist-packages/tensorflow/models/image/mnist/convolutional.py

简单跑跑看,直接运行python /path/to/convolutional.py

虚拟机环境(分配了3核i7 6700K,3GB的内存,虚拟化全开)。23:05开始跑,会首先自动下载一堆的训练集和测试集数据到~/data/ 目录下面,网速慢的同学要多等等(23:10分结束下载,下载了12MB左右的数据)。

qq%e6%88%aa%e5%9b%be20170211234949

然后就开始训练了,训练过程中python占了78%~260%的CPU资源,大部分时候还是78%左右。训练过程中,minibatch会不断给出minibatch error和validation error,前者变化比较大0%~3%左右,后者则长时间在2%以内,每100次迭代大约150ms。learning rate从1700次迭代后开始下降。最终在23:32完成(总计22分钟左右),最终结果如下:

yang@yang-VirtualBox:~$ python /usr/local/lib/python2.7/dist-packages/tensorflow/models/image/mnist/convolutional.py
Successfully downloaded train-images-idx3-ubyte.gz 9912422 bytes.
Successfully downloaded train-labels-idx1-ubyte.gz 28881 bytes.
Successfully downloaded t10k-images-idx3-ubyte.gz 1648877 bytes.
Successfully downloaded t10k-labels-idx1-ubyte.gz 4542 bytes.
Extracting data/train-images-idx3-ubyte.gz
Extracting data/train-labels-idx1-ubyte.gz
Extracting data/t10k-images-idx3-ubyte.gz
Extracting data/t10k-labels-idx1-ubyte.gz
Initialized!
Step 0 (epoch 0.00), 2.0 ms
Minibatch loss: 8.334, learning rate: 0.010000
Minibatch error: 85.9%
Validation error: 84.6%
Step 100 (epoch 0.12), 151.4 ms
Minibatch loss: 3.250, learning rate: 0.010000
Minibatch error: 6.2%
Validation error: 7.6%
Step 200 (epoch 0.23), 150.3 ms
Minibatch loss: 3.377, learning rate: 0.010000
Minibatch error: 12.5%
Validation error: 4.2%
==========================
Step 1800 (epoch 2.09), 149.3 ms
Minibatch loss: 2.660, learning rate: 0.009025
Minibatch error: 3.1%
Validation error: 1.3%
Step 1900 (epoch 2.21), 151.7 ms
Minibatch loss: 2.636, learning rate: 0.009025
Minibatch error: 1.6%
Validation error: 1.2%
============================
Minibatch loss: 2.130, learning rate: 0.007738
Minibatch error: 0.0%
Validation error: 1.1%
Step 4500 (epoch 5.24), 153.7 ms
Minibatch loss: 2.201, learning rate: 0.007738
Minibatch error: 4.7%
Validation error: 1.1%
==============================
Step 8400 (epoch 9.77), 147.6 ms
Minibatch loss: 1.596, learning rate: 0.006302
Minibatch error: 0.0%
Validation error: 0.8%
Step 8500 (epoch 9.89), 151.6 ms
Minibatch loss: 1.618, learning rate: 0.006302
Minibatch error: 0.0%
Validation error: 0.9%
Test error: 0.8%

基本使用部分,google说(Tensorflow的核心表达):tensorflow是把计算表示为图(图中的node就表示ops,每个ops都会对不定数目个Tensor做运算,一般来说tensor都是多维数组),然后通过Sessions去执行这些图,将数据表示为tensor,并用Variables维持状态。

3.2 davidsandberg的人脸识别

  • git源在这里(目前版本匹配Tensorflow r0.12版本):https://github.com/davidsandberg/facenet.git
  • 论文引用在这里:https://arxiv.org/abs/1503.03832

在ubuntu上直接:

git clone https://github.com/davidsandberg/facenet.git
cd facenet/

看文档感觉比较麻烦,后面再来看怎么运行。

3.3 图像识别inception应用

git clone https://github.com/tensorflow/models.git
cd models/tutorials/image/imagenet/
python classify_image.py

就开始下载训练和测试所需的data, 第二次运行就无需下载data了,可以测试下性能,如下:

time python classify_image.py

WX20170215-131913@2x.png

大约2.5s完成,这包括模型的加载、预测算法运行以及打印信息(很可能模型加载耗时很多)。下面,我们对比下同一张雨伞图片(如下)在ubuntu虚拟机和树莓派3B上运行的精度和速度:

QQ20170215-0.jpg

time python classify_image.py --image_file=QQ20170215-0.jpg

WX20170215-132507@2x.png

WX20170215-132635@2x.png

精度上不同架构运行的结果差不多,都是伞为0.99以上的score。速度上区别就大了,i7虚拟机上是2.5s左右(注意单张辨识和此前实验的16张辨识时间差不多,也就是真正辨识的开销可能非常小)。而树莓派3B上花了48s。

网上也有同学用树莓派3B测试过,他们的速度大约是50s,和我们差不多。而他们指出:很多时间是花在模型本身的加载上(估计虚拟机版本的2.x s也都是花在了模型加载上),可以通过预加载模型的方式加速(可以加速到4.2s/张识别),参考这里

WX20170215-154944@2x.png

与性能相关的问题,我们在第4节性能分析中展开讨论。

3.4 语音识别

 

 

4. 性能分析

本小节分别讨论tensorflow架构不同模型在不同架构上的运行性能,能效比较难测算,暂时不考虑(我们准备引入tensorflow的官方benchmark做测试)。

4.1 基于inception的性能比较

可以参考这里,有一个不同架构下运行tensorflow的inceptionv3的性能数据,如下:

WX20170215-165243@2x.png

从上面这张表可以看出(注意所有数据都是:成批的运行,不是单张图片的预测):

  • 上述比较包含两个大维度,即有warmup和没有warmup过程。总的来说,无论是台式机(包含/不包含GPU),还是树莓派,这两种情况的平均性能差异并不大,但worst case的差异却非常可观;
  • 相同情况下,GPU加速版本,6核i7、4核早期低功耗架构i7、4核ARM Cortex-A53的性能比大约是(warmup=10的平均值):77:12:9:1。GPU的效率非常可观,Cortex-A53比i7差距也接近10倍;
  • 从build时间来看,调用GPU的确会引入一定的开销,但相对于收益非常合算。

补充一张我们自己运行出来的数据:

qq%e6%88%aa%e5%9b%be20170215205107

4.2 官方benchmark运行

bazel build --config opt tensorflow/tools/benchmark:benchmark_model
bazel-bin/tensorflow/tools/benchmark/benchmark_model \
  --graph=tensorflow_inception_graph.pb \
  --input_layer="input:0" \
  --input_layer_shape="1,224,224,3" \
  --input_layer_type="float" \
  --output_layer="output:0"

5. 我们可以干嘛

我们最终需要在机器人身上完成至少三方面的深度学习工作,分别是:

  • 图片/视频的物理识别、人脸识别;
  • 自然语音的本地识别(还不清楚能否完成):
  • 先进运动控制。

留下评论