Linux下CPU和GPU机器学习性能对比测试
admin 于 2018年03月26日 发表在 机器学习笔记
之前写过一片关于在windows下基于CUDA的GPU和CPU进行机器学习时性能测试的博文,详细查看博文:《windows下CPU与GPU机器学习性能对比测试》
基于此,考虑将同样的内容,放在linux上进行测试,会发生何种现象?本文基于ubuntu16.04.4 x64测试,其它linux发行版,应该相差不大。
1. CUDA环境搭建
搭建cuda开发环境,请看博文《基于Ubuntu16.04下CUDA8.0开发环境》,此处不在赘述。
2. 安装spyder3
cuda环境搭建完成后,首先需要安装spyder3 ,使用pip3来安装(注:此处是pip3非pip,不要搞混了)。
sudo apt-get install python3-pip pip3 install spyder
3. 添加国内pip3源
为了加快pip3下载速度,强烈建议添加国内源。
mkdir ~/.pip gedit ~/.pip/pip.conf
添加内容,并保存:
[global] index-url =https://pypi.doubanio.com/simple
4. 不同平台tensorflow
spyder3安装成功后,接下来安装 tensorflow-gpu 或 tensorflow-cpu 版本,分别进行测试(注:tensorflow建议安装对应版本,如本文为1.4.0版本)。
(1)安装GPU版本:
pip3 install tensorflow-gpu==1.4
(2)安装CPU版本
pip3 install tensorflow==1.4
5. 安装tensorlayer
由于测试代码需要tensorlayer包支持,因此也需要安装。
pip3 install tensorlayer
6. 运行例程
打开spyder3应用程序,执行测试程序。
# -*- coding: utf-8 -*- """ Spyder Editor This is a temporary script file. """ import tensorflow as tf import tensorlayer as tl sess = tf.InteractiveSession() # 准备数据 X_train, y_train, X_val, y_val, X_test, y_test = \ tl.files.load_mnist_dataset(shape=(-1,784)) # 定义 placeholder x = tf.placeholder(tf.float32, shape=[None, 784], name='x') y_ = tf.placeholder(tf.int64, shape=[None, ], name='y_') # 定义模型 network = tl.layers.InputLayer(x, name='input_layer') network = tl.layers.DropoutLayer(network, keep=0.8, name='drop1') network = tl.layers.DenseLayer(network, n_units=800, act = tf.nn.relu, name='relu1') network = tl.layers.DropoutLayer(network, keep=0.5, name='drop2') network = tl.layers.DenseLayer(network, n_units=800, act = tf.nn.relu, name='relu2') network = tl.layers.DropoutLayer(network, keep=0.5, name='drop3') network = tl.layers.DenseLayer(network, n_units=10, act = tf.identity, name='output_layer') # 定义损失函数和衡量指标 # tl.cost.cross_entropy 在内部使用 tf.nn.sparse_softmax_cross_entropy_with_logits() 实现 softmax y = network.outputs cost = tl.cost.cross_entropy(y, y_, name = 'cost') correct_prediction = tf.equal(tf.argmax(y, 1), y_) acc = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) y_op = tf.argmax(tf.nn.softmax(y), 1) # 定义 optimizer train_params = network.all_params train_op = tf.train.AdamOptimizer(learning_rate=0.0001, beta1=0.9, beta2=0.999, epsilon=1e-08, use_locking=False).minimize(cost, var_list=train_params) # 初始化 session 中的所有参数 tl.layers.initialize_global_variables(sess) # 列出模型信息 network.print_params() network.print_layers() # 训练模型 tl.utils.fit(sess, network, train_op, cost, X_train, y_train, x, y_, acc=acc, batch_size=500, n_epoch=500, print_freq=5, X_val=X_val, y_val=y_val, eval_train=False) # 评估模型 tl.utils.test(sess, network, acc, X_test, y_test, x, y_, batch_size=None, cost=cost) # 把模型保存成 .npz 文件 tl.files.save_npz(network.all_params , name='model.npz') sess.close()
7. 对比测试
(1)CPU平台测试
(2)GPU平台测试
结论:
ubuntu16.04下基于cuda的GPU机器学习速度约为CPU速率的10倍,与windows下表现相差不大。不过发现linux下无论是CPU还是GPU总体都比windows的性能高那么一丢丢。