之前写过一片关于在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的性能高那么一丢丢。

注意:本站所有文章除特别说明外,均为原创,转载请务必以超链接方式并注明作者出处。 标签:机器学习,cuda